diff --git a/.github/workflows/bump_publish.yml b/.github/workflows/bump_publish.yml index c8e5c0255..84304b5a4 100644 --- a/.github/workflows/bump_publish.yml +++ b/.github/workflows/bump_publish.yml @@ -82,21 +82,21 @@ jobs: - name: Publish canary if: ${{ (github.event.inputs.mode == 'bump_and_publish' || github.event.inputs.mode == 'publish') && github.event.inputs.release == 'canary' }} - run: pnpm publish --filter create-vitnode-app --filter @vitnode/core --filter @vitnode/config --filter @vitnode/blog --tag canary --no-git-checks --access public + run: pnpm publish --filter create-vitnode-app --filter @vitnode/core --filter @vitnode/config --filter @vitnode/blog --filter @vitnode/nodemailer --filter @vitnode/resend --filter @vitnode/node-cron --tag canary --no-git-checks --access public env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} NPM_CONFIG_PROVENANCE: true - name: Publish release candidate if: ${{ (github.event.inputs.mode == 'bump_and_publish' || github.event.inputs.mode == 'publish') && github.event.inputs.release == 'release-candidate' }} - run: pnpm publish --filter create-vitnode-app --filter @vitnode/core --filter @vitnode/config --filter @vitnode/blog --tag rc --no-git-checks --access public + run: pnpm publish --filter create-vitnode-app --filter @vitnode/core --filter @vitnode/config --filter @vitnode/blog --filter @vitnode/nodemailer --filter @vitnode/resend --filter @vitnode/node-cron --tag rc --no-git-checks --access public env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} NPM_CONFIG_PROVENANCE: true - name: Publish stable if: ${{ (github.event.inputs.mode == 'bump_and_publish' || github.event.inputs.mode == 'publish') && github.event.inputs.release == 'stable' }} - run: pnpm publish --filter create-vitnode-app --filter @vitnode/core --filter @vitnode/config --filter @vitnode/blog --tag latest --no-git-checks --access public + run: pnpm publish --filter create-vitnode-app --filter @vitnode/core --filter @vitnode/config --filter @vitnode/blog --filter @vitnode/nodemailer --filter @vitnode/resend --filter @vitnode/node-cron --tag latest --no-git-checks --access public env: NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} NPM_CONFIG_PROVENANCE: true diff --git a/apps/api/package.json b/apps/api/package.json index 7c4099122..3d2e54ae8 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -1,6 +1,6 @@ { "name": "api", - "version": "1.2.0-canary.60", + "version": "1.2.0-canary.68", "private": true, "type": "module", "scripts": { @@ -19,20 +19,21 @@ "@vitnode/core": "workspace:*", "drizzle-kit": "^0.31.6", "drizzle-orm": "^0.44.7", - "hono": "^4.10.4", - "next-intl": "^4.5.0", + "hono": "^4.10.5", + "next-intl": "^4.5.1", "react": "^19.2.0", "react-dom": "^19.2.0", - "use-intl": "^4.5.0", + "use-intl": "^4.5.1", "zod": "^4.1.12" }, "devDependencies": { "@hono/node-server": "^1.19.6", "@react-email/components": "^1.0.0", "@types/node": "^24.10.0", - "@types/react": "^19.2.2", + "@types/react": "^19.2.3", "@types/react-dom": "^19.2.2", "@vitnode/config": "workspace:*", + "@vitnode/nodemailer": "workspace:*", "dotenv": "^17.2.3", "eslint": "^9.39.1", "react-email": "^5.0.1", diff --git a/apps/api/src/vitnode.api.config.ts b/apps/api/src/vitnode.api.config.ts index 533a84faf..29274f43b 100644 --- a/apps/api/src/vitnode.api.config.ts +++ b/apps/api/src/vitnode.api.config.ts @@ -1,5 +1,5 @@ -import { NodemailerEmailAdapter } from "@vitnode/core/api/adapters/email/nodemailer"; import { buildApiConfig } from "@vitnode/core/vitnode.config"; +import { NodemailerEmailAdapter } from "@vitnode/nodemailer"; import { config } from "dotenv"; import { drizzle } from "drizzle-orm/postgres-js"; diff --git a/apps/docs/content/docs/dev/captcha/captcha_preview.png b/apps/docs/content/docs/dev/captcha/captcha_preview.png new file mode 100644 index 000000000..b7d68a5ab Binary files /dev/null and b/apps/docs/content/docs/dev/captcha/captcha_preview.png differ diff --git a/apps/docs/content/docs/dev/captcha/custom-adapter.mdx b/apps/docs/content/docs/dev/captcha/custom-adapter.mdx new file mode 100644 index 000000000..0cc0e0f74 --- /dev/null +++ b/apps/docs/content/docs/dev/captcha/custom-adapter.mdx @@ -0,0 +1,116 @@ +--- +title: Custom Adapter +description: Create your own custom captcha adapter for VitNode. +--- + +If you want to use captcha in your custom form or somewhere else, follow these steps. + +## Usage + + + + +### Activate captcha in route + +```ts title="plugins/{plugin_name}/src/routes/example.ts" +import { buildRoute } from "@vitnode/core/api/lib/route"; + +export const exampleRoute = buildRoute({ + pluginId: CONFIG_PLUGIN.pluginId, + route: { + method: "post", + description: "Create a new user", + path: "/sign_up", + withCaptcha: true, // [!code ++] + }, + handler: async c => {}, +}); +``` + + + + +### Get config from middleware API + +```tsx title="plugins/{plugin_name}/src/app/sing_up/page.tsx" +import { getMiddlewareApi } from "@vitnode/core/lib/api/get-middleware-api"; // [!code ++] + +export const SignUpView = async () => { + const { captcha } = await getMiddlewareApi(); // [!code ++] + + return ; +}; +``` + + + + +### Use `useCaptcha` hook + +Inside your client component, use the `useCaptcha` hook to handle captcha rendering and validation. Remember to add `div` with `id="vitnode_captcha"` where you want the captcha widget to appear. + +```tsx title="plugins/{plugin_name}/src/components/form/sign-up/sign-up.tsx" +"use client"; + +import { AutoForm } from "@vitnode/core/components/form/auto-form"; + +export const FormSignUp = ({ + captcha, // [!code ++] +}: { + captcha: z.infer["captcha"]; // [!code ++] +}) => { + // [!code ++] + const { isReady, getToken, onReset } = useCaptcha(captcha); + + const onSubmit = async () => { + await mutationApi({ + // ...other values, + captchaToken: await getToken(), // [!code ++] + }); + + // Handle success or error + // [!code ++] + onReset(); // Reset captcha after submission + }; + + return ( +
+ {/* Render captcha widget */} + {/* [!code ++] */} +
+ + + + ); +}; +``` + + + + +### Submit form with captcha + +```tsx title="plugins/{plugin_name}/src/components/form/sign-up/mutation-api.ts" +"use server"; + +import type { z } from "zod"; + +import { fetcher } from "@vitnode/core/lib/fetcher"; + +export const mutationApi = async ({ + captchaToken, // [!code ++] +}: { + // [!code ++] + captchaToken; +}) => { + await fetcher(usersModule, { + path: "/test", + method: "post", + module: "blog", + captchaToken, // [!code ++] + }); +}; +``` + + + diff --git a/apps/docs/content/docs/dev/captcha/index.mdx b/apps/docs/content/docs/dev/captcha/index.mdx index 0967d5b84..8841d9655 100644 --- a/apps/docs/content/docs/dev/captcha/index.mdx +++ b/apps/docs/content/docs/dev/captcha/index.mdx @@ -3,7 +3,13 @@ title: Captcha description: Protect your forms and API call with captcha validation. --- -## Support +import captchaPreview from "./captcha_preview.png"; + +import { ImgDocs } from "@/components/fumadocs/img"; + + + +## Providers VitNode supports multiple captcha providers. You can choose the one that fits your needs. Currently, we support: @@ -13,7 +19,11 @@ VitNode supports multiple captcha providers. You can choose the one that fits yo description="By Cloudflare" href="/docs/guides/captcha/cloudflare" /> - + If you need more providers, feel free to open a **Feature Request** on our [GitHub repository](https://github.com/aXenDeveloper/vitnode/issues) :) @@ -38,9 +48,9 @@ export const exampleRoute = buildRoute({ method: "post", description: "Create a new user", path: "/sign_up", - withCaptcha: true // [!code ++] + withCaptcha: true, // [!code ++] }, - handler: async (c) => {} + handler: async c => {}, }); ``` @@ -74,7 +84,7 @@ Get the `captcha` config from the props and pass it to the `AutoForm` component. import { AutoForm } from "@vitnode/core/components/form/auto-form"; export const FormSignUp = ({ - captcha // [!code ++] + captcha, // [!code ++] }: { captcha: z.infer["captcha"]; // [!code ++] }) => { @@ -106,23 +116,23 @@ In your form submission handler, you can get the `captchaToken` from the form su import { AutoForm, - type AutoFormOnSubmit // [!code ++] + type AutoFormOnSubmit, // [!code ++] } from "@vitnode/core/components/form/auto-form"; export const FormSignUp = ({ - captcha + captcha, }: { captcha: z.infer["captcha"]; }) => { const onSubmit: AutoFormOnSubmit = async ( values, form, - { captchaToken } // [!code ++] + { captchaToken }, // [!code ++] ) => { // Call your mutation API with captcha token await mutationApi({ ...values, - captchaToken // [!code ++] + captchaToken, // [!code ++] }); // Handle success or error @@ -159,8 +169,8 @@ z.infer & { captchaToken: string }) => { module: "users", captchaToken, // [!code ++] args: { - body: input - } + body: input, + }, }); if (res.status !== 201) { @@ -175,115 +185,3 @@ z.infer & { captchaToken: string }) => { - -## Custom Usage - -If you want to use captcha in your custom form or somewhere else, follow these steps. - - - - -### Activate captcha in route - -```ts title="plugins/{plugin_name}/src/routes/example.ts" -import { buildRoute } from "@vitnode/core/api/lib/route"; - -export const exampleRoute = buildRoute({ - pluginId: CONFIG_PLUGIN.pluginId, - route: { - method: "post", - description: "Create a new user", - path: "/sign_up", - withCaptcha: true // [!code ++] - }, - handler: async (c) => {} -}); -``` - - - - -### Get config from middleware API - -```tsx title="plugins/{plugin_name}/src/app/sing_up/page.tsx" -import { getMiddlewareApi } from "@vitnode/core/lib/api/get-middleware-api"; // [!code ++] - -export const SignUpView = async () => { - const { captcha } = await getMiddlewareApi(); // [!code ++] - - return ; -}; -``` - - - - -### Use `useCaptcha` hook - -Inside your client component, use the `useCaptcha` hook to handle captcha rendering and validation. Remember to add `div` with `id="vitnode_captcha"` where you want the captcha widget to appear. - -```tsx title="plugins/{plugin_name}/src/components/form/sign-up/sign-up.tsx" -"use client"; - -import { AutoForm } from "@vitnode/core/components/form/auto-form"; - -export const FormSignUp = ({ - captcha // [!code ++] -}: { - captcha: z.infer["captcha"]; // [!code ++] -}) => { - // [!code ++] - const { isReady, getToken, onReset } = useCaptcha(captcha); - - const onSubmit = async () => { - await mutationApi({ - // ...other values, - captchaToken: await getToken() // [!code ++] - }); - - // Handle success or error - // [!code ++] - onReset(); // Reset captcha after submission - }; - - return ( -
- {/* Render captcha widget */} - {/* [!code ++] */} -
- - - - ); -}; -``` - - - - -### Submit form with captcha - -```tsx title="plugins/{plugin_name}/src/components/form/sign-up/mutation-api.ts" -"use server"; - -import type { z } from "zod"; - -import { fetcher } from "@vitnode/core/lib/fetcher"; - -export const mutationApi = async ({ - captchaToken // [!code ++] -}: { - // [!code ++] - captchaToken; -}) => { - await fetcher(usersModule, { - path: "/test", - method: "post", - module: "blog", - captchaToken // [!code ++] - }); -}; -``` - - - diff --git a/apps/docs/content/docs/dev/captcha/meta.json b/apps/docs/content/docs/dev/captcha/meta.json new file mode 100644 index 000000000..f9977456b --- /dev/null +++ b/apps/docs/content/docs/dev/captcha/meta.json @@ -0,0 +1,4 @@ +{ + "title": "Captcha", + "pages": ["...", "custom-adapter"] +} diff --git a/apps/docs/content/docs/dev/cron/custom-adapter.mdx b/apps/docs/content/docs/dev/cron/custom-adapter.mdx new file mode 100644 index 000000000..14c461303 --- /dev/null +++ b/apps/docs/content/docs/dev/cron/custom-adapter.mdx @@ -0,0 +1,83 @@ +--- +title: Custom Adapter +description: Create your own custom cron adapter for VitNode. +--- + +VitNode supports custom cron adapters, allowing you to integrate with various scheduling libraries or services. + +## Usage + + + + +### Create your custom adapter + +As an example we will create a custom adapter using the popular `node-cron` library. + +```ts +import { schedule } from "node-cron"; +import { type CronAdapter, handleCronJobs } from "@/api/lib/cron"; + +export const NodeCronAdapter = (): CronAdapter => { + return { + schedule() { + schedule("*/1 * * * *", async () => { + await handleCronJobs(); // [!code ++] + }); + }, + }; +}; +``` + + + + + +### Integrate the adapter into your application + +```ts title="src/vitnode.api.config.ts" +import { NodeCronAdapter } from "./path/to/your/custom/node-cron.adapter"; + +export const vitNodeApiConfig = buildApiConfig({ + cronAdapter: NodeCronAdapter(), +}); +``` + + + + + +### Restart server + +After making these changes, stop your server (if it's running) and restart it to apply the new configuration. + +import { Tab, Tabs } from "fumadocs-ui/components/tabs"; + + + +```bash tab="bun" +bun dev +``` + +```bash tab="pnpm" +pnpm dev +``` + +```bash tab="npm" +npm run dev +``` + + + +That's it — your app now has a built-in task scheduler, ready to handle cron jobs with standard cron expressions. + + + + +### Check Your Cron Jobs + +You can check your cron jobs in AdminCP under `Core` => `Advanced` => `Cron Jobs`. + + + + diff --git a/apps/docs/content/docs/dev/cron/index.mdx b/apps/docs/content/docs/dev/cron/index.mdx index 5be6d1c73..8b0dacb25 100644 --- a/apps/docs/content/docs/dev/cron/index.mdx +++ b/apps/docs/content/docs/dev/cron/index.mdx @@ -20,80 +20,52 @@ Before you can use cron functionality, you need to provide an adapter to your ap /> -## Custom adapter - -VitNode supports custom cron adapters, allowing you to integrate with various scheduling libraries or services. +## Usage - -### Create your custom adapter - -As an example we will create a custom adapter using the popular `node-cron` library. - -```ts -import { schedule } from "node-cron"; -import { type CronAdapter, handleCronJobs } from "@/api/lib/cron"; - -export const NodeCronAdapter = (): CronAdapter => { - return { - schedule() { - schedule("*/1 * * * *", async () => { - await handleCronJobs(); // [!code ++] - }); - } - }; -}; -``` - - - - - -### Integrate the adapter into your application - -```ts title="src/vitnode.api.config.ts" -import { NodeCronAdapter } from "./path/to/your/custom/node-cron.adapter"; - -export const vitNodeApiConfig = buildApiConfig({ - cronAdapter: NodeCronAdapter() +### Create CRON file + +```ts title="cron/clean.cron.ts" +import { buildCron } from "@vitnode/core/api/lib/cron"; + +export const cleanCron = buildCron({ + name: "clean", + description: "Clean up expired sessions and tokens", + // Run every 1 hour + schedule: "0 * * * *", + handler: async c => { + console.log("Running cleanup cron job..."); + }, }); ``` - +### Register CRON in module -## Restart server - -After making these changes, stop your server (if it's running) and restart it to apply the new configuration. +```ts title="modules/clean/clean.module.ts" +import { buildModule } from "@vitnode/core/api/lib/module"; +import { CONFIG_PLUGIN } from "@/config"; -import { Tab, Tabs } from "fumadocs-ui/components/tabs"; - - - -```bash tab="bun" -bun dev -``` +// [!code ++] +import { cleanCron } from "./cron/clean.cron"; -```bash tab="pnpm" -pnpm dev -``` - -```bash tab="npm" -npm run dev +export const cronModule = buildModule({ + pluginId: CONFIG_PLUGIN.pluginId, + name: "clean", + routes: [], + // [!code ++] + cronJobs: [cleanCron], +}); ``` - - -That's it — your app now has a built-in task scheduler, ready to handle cron jobs with standard cron expressions. - -## Check Your Cron Jobs +### Check Your Cron Job -You can check your cron jobs in AdminCP under **Core => Advanced => Cron Jobs**. +When your CRON job will run first time, you should see your job in AdminCP under `Core` => `Advanced` => `Cron Jobs`. diff --git a/apps/docs/content/docs/dev/cron/meta.json b/apps/docs/content/docs/dev/cron/meta.json index f5df12b36..42ae35c6f 100644 --- a/apps/docs/content/docs/dev/cron/meta.json +++ b/apps/docs/content/docs/dev/cron/meta.json @@ -1,4 +1,4 @@ { "title": "CRON Jobs", - "pages": ["rest-api", "..."] + "pages": ["rest-api", "...", "custom-adapter"] } diff --git a/apps/docs/content/docs/dev/cron/node-cron.mdx b/apps/docs/content/docs/dev/cron/node-cron.mdx index cfe76f380..2a5f75706 100644 --- a/apps/docs/content/docs/dev/cron/node-cron.mdx +++ b/apps/docs/content/docs/dev/cron/node-cron.mdx @@ -5,10 +5,9 @@ description: In-memory tiny task scheduler in pure JavaScript for node.js based This adapter lets you run scheduled jobs directly inside your Node.js app. It's simple, lightweight, and doesn't require any external services — great for when you just need cron tasks running locally or in memory. - - This documentation is for self-hosted VitNode instances only. You cannot use this if you are - planning to deploy your application to the cloud. - +| Cloud | Self-Hosted | Links | +| ---------------- | ------------ | ------------------------------------------------------ | +| ❌ Not Supported | ✅ Supported | [NPM Package](https://www.npmjs.com/package/node-cron) | @@ -16,18 +15,18 @@ This adapter lets you run scheduled jobs directly inside your Node.js app. It's import { Tab, Tabs } from "fumadocs-ui/components/tabs"; - + ```bash tab="bun" -bun i node-cron +bun i @vitnode/node-cron -D ``` ```bash tab="pnpm" -pnpm i node-cron +pnpm i @vitnode/node-cron -D ``` ```bash tab="npm" -npm i node-cron +npm i @vitnode/node-cron -D ``` @@ -37,12 +36,13 @@ npm i node-cron ## Usage ```ts title="src/vitnode.api.config.ts" -import { NodeCronAdapter } from "@vitnode/core/api/adapters/cron/node-cron.adapter"; -``` +// [!code ++] +import { NodeCronAdapter } from "@vitnode/node-cron"; +import { buildApiConfig } from "@vitnode/core/vitnode.config"; -```ts title="src/vitnode.api.config.ts" export const vitNodeApiConfig = buildApiConfig({ - cronAdapter: NodeCronAdapter() + // [!code ++] + cronAdapter: NodeCronAdapter(), }); ``` @@ -54,7 +54,7 @@ export const vitNodeApiConfig = buildApiConfig({ After making these changes, stop your server (if it's running) and restart it to apply the new configuration. - + ```bash tab="bun" bun dev @@ -77,7 +77,7 @@ That's it — your app now has a built-in task scheduler, ready to handle cron j ## Check Your Cron Jobs -You can check your cron jobs in AdminCP under **Core => Advanced => Cron Jobs**. +You can check your cron jobs in AdminCP under `Core` => `Advanced` => `Cron Jobs`. diff --git a/apps/docs/content/docs/dev/cron/rest-api.mdx b/apps/docs/content/docs/dev/cron/rest-api.mdx index e4d6e1b95..515e9041b 100644 --- a/apps/docs/content/docs/dev/cron/rest-api.mdx +++ b/apps/docs/content/docs/dev/cron/rest-api.mdx @@ -5,6 +5,10 @@ description: Run cron jobs by triggering REST API endpoints from an external sch This method lets you use external services to manage and run your cron jobs through simple HTTP requests. It's flexible and works with many providers, so you can pick the scheduling tool that best fits your infrastructure. +| Cloud | Self-Hosted | +| ------------ | ------------ | +| ✅ Supported | ✅ Supported | + ## Add a Secret Key @@ -18,7 +22,8 @@ CRON_SECRET=your_secret_key ``` - We recommend using a random string of at least **16 characters** for better security. + We recommend using a random string of at least **16 characters** for better + security. @@ -34,11 +39,16 @@ Next, configure a scheduler that will send HTTP requests to your cron endpoint. - [Google Cloud Functions with Cloud Scheduler](https://cloud.google.com/scheduler/docs/tut-pub-sub) - [EasyCron](https://www.easycron.com/) - - You need to set schedule for every minute to ensure that your cron jobs are executed on time. - -Make sure to include the `Authorization` header with the value `Bearer {your_key}` in your requests, where `{your_key}` is the value of the `CRON_SECRET` variable you set in your `.env` file. + + You need to set schedule for every minute to ensure that your cron jobs are + executed on time. Some schedulers may have limitations on minimum intervals, + so choose one that fits your needs. + + + Make sure to include the `Authorization` header with the value `Bearer{" "} + {your_key}` in your requests, where `{your_key}` is the value of the + `CRON_SECRET` variable you set in your `.env` file. @@ -61,7 +71,7 @@ Replace `https://your-domain.com/api/cron` with your actual domain and `{{your_k ## Check Your Cron Jobs -You can check your cron jobs in AdminCP under **Core => Advanced => Cron Jobs**. +You can check your cron jobs in AdminCP under `Core` => `Advanced` => `Cron Jobs`. diff --git a/apps/docs/content/docs/dev/email/custom-adapter.mdx b/apps/docs/content/docs/dev/email/custom-adapter.mdx new file mode 100644 index 000000000..109eabe40 --- /dev/null +++ b/apps/docs/content/docs/dev/email/custom-adapter.mdx @@ -0,0 +1,95 @@ +--- +title: Custom Adapter +description: Create your own custom email adapter for VitNode. +--- + +Want to create your own email adapter? You can do it by implementing the `EmailApiPlugin` interface. This allows you to define how emails are sent in your application. + +## Usage + + + +### Create adapter + +Here is your template for a custom email adapter. + +```ts title="src/utils/email/mailer.ts" +import type { EmailApiPlugin } from "@vitnode/core/api/models/email"; + +export const MailerEmailAdapter = (): EmailApiPlugin => {}; +``` + + + + +### Add config + +If you want to provide config for you adapter, you can do it like this: + +```ts title="src/utils/email/mailer.ts" +import type { EmailApiPlugin } from "@vitnode/core/api/models/email"; + +export const MailerEmailAdapter = ({ + // [!code ++:13] + host = "", + port = 587, + secure = false, + user = "", + password = "", + from = "", +}: { + from: string | undefined; + host: string | undefined; + password: string | undefined; + port?: number; + secure?: boolean; + user: string | undefined; +}): EmailApiPlugin => {}; +``` + + + + + +### Add `sendEmail()` method + +Implement the `sendEmail()` method to send emails using your custom logic. You can use any email sending library or service. + +```ts title="src/utils/email/mailer.ts" +import type { EmailApiPlugin } from "@vitnode/core/api/models/email"; + +export const MailerEmailAdapter = ({ + host = "", + port = 587, + secure = false, + user = "", + password = "", + from = "", +}: { + from: string | undefined; + host: string | undefined; + password: string | undefined; + port?: number; + secure?: boolean; + user: string | undefined; +}): EmailApiPlugin => { + // [!code ++:3] + return { + sendEmail: async ({ metadata, to, subject, html, replyTo, text }) => {}, + }; +}; +``` + + + + +## Publish to NPM + +If you want to share your custom adapter with the community, you can publish it as an NPM package. + +Example source code for NPM packages: + +- [Resend Adapter](https://github.com/aXenDeveloper/vitnode/tree/canary/packages/resend), +- [Nodemailer Adapter](https://github.com/aXenDeveloper/vitnode/tree/canary/packages/nodemailer) + +Make sure to follow best practices for package development and include proper documentation. diff --git a/apps/docs/content/docs/dev/email/index.mdx b/apps/docs/content/docs/dev/email/index.mdx index b63e75607..7e132717c 100644 --- a/apps/docs/content/docs/dev/email/index.mdx +++ b/apps/docs/content/docs/dev/email/index.mdx @@ -9,10 +9,10 @@ Before you can use email functionality, you need to provide an adapter to your a - + -or create your own [custom email adapter](/docs/dev/email/overview#custom-email-adapter)... +or create your own [custom email adapter](/docs/dev/email/custom-adapter). ## Usage @@ -24,10 +24,10 @@ import { buildRoute } from "@vitnode/core/api/lib/route"; import { UserModel } from "@vitnode/core/api/models/user"; export const testRoute = buildRoute({ - handler: async (c) => { + handler: async c => { const user = await new UserModel().getUserById({ id: 3, - c + c, }); if (!user) throw new Error("User not found"); @@ -36,11 +36,11 @@ export const testRoute = buildRoute({ await c.get("email").send({ subject: "Test Email", content: () => "This is a test email.", - user + user, }); return c.text("test"); - } + }, }); ``` @@ -51,96 +51,16 @@ import { z } from "zod"; import { buildRoute } from "@vitnode/core/api/lib/route"; export const testRoute = buildRoute({ - handler: async (c) => { + handler: async c => { // [!code ++:6] await c.get("email").send({ to: "test@test.com", subject: "Test Email", content: () => "This is a test email.", - locale: "en" + locale: "en", }); return c.text("test"); - } + }, }); ``` - -## Custom Email Adapter - -Want to create your own email adapter? You can do it by implementing the `EmailApiPlugin` interface. This allows you to define how emails are sent in your application. - - - -### Create adapter - -Here is your template for a custom email adapter. - -```ts title="src/utils/email/mailer.ts" -import type { EmailApiPlugin } from "@vitnode/core/api/models/email"; - -export const MailerEmailAdapter = (): EmailApiPlugin => {}; -``` - - - - -### Add config - -If you want to provide config for you adapter, you can do it like this: - -```ts title="src/utils/email/mailer.ts" -import type { EmailApiPlugin } from "@vitnode/core/api/models/email"; - -export const MailerEmailAdapter = ({ - // [!code ++:13] - host = "", - port = 587, - secure = false, - user = "", - password = "", - from = "" -}: { - from: string | undefined; - host: string | undefined; - password: string | undefined; - port?: number; - secure?: boolean; - user: string | undefined; -}): EmailApiPlugin => {}; -``` - - - - - -### Add `sendEmail()` method - -Implement the `sendEmail()` method to send emails using your custom logic. You can use any email sending library or service. - -```ts title="src/utils/email/mailer.ts" -import type { EmailApiPlugin } from "@vitnode/core/api/models/email"; - -export const MailerEmailAdapter = ({ - host = "", - port = 587, - secure = false, - user = "", - password = "", - from = "" -}: { - from: string | undefined; - host: string | undefined; - password: string | undefined; - port?: number; - secure?: boolean; - user: string | undefined; -}): EmailApiPlugin => { - // [!code ++:3] - return { - sendEmail: async ({ metadata, to, subject, html, replyTo, text }) => {} - }; -}; -``` - - - diff --git a/apps/docs/content/docs/dev/email/meta.json b/apps/docs/content/docs/dev/email/meta.json index 7d2940a6b..a0d3641b4 100644 --- a/apps/docs/content/docs/dev/email/meta.json +++ b/apps/docs/content/docs/dev/email/meta.json @@ -1,4 +1,10 @@ { "title": "Email", - "pages": ["templates", "components", "---Adapters---", "..."] + "pages": [ + "templates", + "components", + "---Adapters---", + "...", + "custom-adapter" + ] } diff --git a/apps/docs/content/docs/dev/email/nodemailer.mdx b/apps/docs/content/docs/dev/email/nodemailer.mdx new file mode 100644 index 000000000..5cb348ad7 --- /dev/null +++ b/apps/docs/content/docs/dev/email/nodemailer.mdx @@ -0,0 +1,71 @@ +--- +title: Nodemailer (SMTP) +description: Send emails using SMTP with the Nodemailer adapter. +--- + +| Cloud | Self-Hosted | Links | +| ---------------- | ------------ | ------------------------------------------------------- | +| ❌ Not Supported | ✅ Supported | [NPM Package](https://www.npmjs.com/package/nodemailer) | + +## Usage + + + +### Installation + +import { Tab, Tabs } from "fumadocs-ui/components/tabs"; + + + +```bash tab="bun" +bun i @vitnode/nodemailer -D +``` + +```bash tab="pnpm" +pnpm i @vitnode/nodemailer -D +``` + +```bash tab="npm" +npm i @vitnode/nodemailer -D +``` + + + + + +### Import the adapter + +```ts title="vitnode.api.config.ts" +// [!code ++] +import { NodemailerEmailAdapter } from "@vitnode/nodemailer"; +import { buildApiConfig } from "@vitnode/core/vitnode.config"; + +export const vitNodeApiConfig = buildApiConfig({ + email: { + // [!code ++:6] + adapter: NodemailerEmailAdapter({ + from: process.env.NODE_MAILER_FROM, + host: process.env.NODE_MAILER_HOST, + password: process.env.NODE_MAILER_PASSWORD, + user: process.env.NOD_EMAILER_USER, + }), + }, +}); +``` + + + + +### Environment Variables + +Add the following environment variables to your `.env` file: + +```bash title=".env" +NODE_MAILER_FROM=your_verified_email +NODE_MAILER_HOST=smtp.your-email-provider.com +NODE_MAILER_PASSWORD=your_email_password +NOD_EMAILER_USER=your_email_username +``` + + + diff --git a/apps/docs/content/docs/dev/email/resend.mdx b/apps/docs/content/docs/dev/email/resend.mdx index 2355f7c04..abe8a3b84 100644 --- a/apps/docs/content/docs/dev/email/resend.mdx +++ b/apps/docs/content/docs/dev/email/resend.mdx @@ -1,8 +1,67 @@ --- title: Resend -description: How to use Resend for sending emails in your application. +description: Send emails using Resend with the Resend adapter. --- - - We're working hard to bring you the best documentation experience. - +| Cloud | Self-Hosted | Links | +| ------------ | ------------ | --------------------------------------------------- | +| ✅ Supported | ✅ Supported | [NPM Package](https://www.npmjs.com/package/resend) | + +## Usage + + + +### Installation + +import { Tab, Tabs } from "fumadocs-ui/components/tabs"; + + + +```bash tab="bun" +bun i @vitnode/resend -D +``` + +```bash tab="pnpm" +pnpm i @vitnode/resend -D +``` + +```bash tab="npm" +npm i @vitnode/resend -D +``` + + + + + +### Import the adapter + +```ts title="vitnode.api.config.ts" +// [!code ++] +import { ResendEmailAdapter } from "@vitnode/resend"; +import { buildApiConfig } from "@vitnode/core/vitnode.config"; + +export const vitNodeApiConfig = buildApiConfig({ + email: { + // [!code ++:4] + adapter: ResendEmailAdapter({ + apiKey: process.env.RESEND_API_KEY, + from: process.env.RESEND_FROM_EMAIL, + }), + }, +}); +``` + + + + +### Environment Variables + +Add the following environment variables to your `.env` file: + +```bash title=".env" +RESEND_API_KEY=your_resend_api_key +RESEND_FROM_EMAIL=your_verified_resend_email +``` + + + diff --git a/apps/docs/content/docs/dev/email/smtp.mdx b/apps/docs/content/docs/dev/email/smtp.mdx deleted file mode 100644 index a1386ec4a..000000000 --- a/apps/docs/content/docs/dev/email/smtp.mdx +++ /dev/null @@ -1,13 +0,0 @@ ---- -title: SMTP -description: SMTP configuration for sending emails ---- - - - This documentation is for self-hosted VitNode instances only. You cannot use - this if you are planning to deploy your application to the cloud. - - - - We're working hard to bring you the best documentation experience. - diff --git a/apps/docs/content/docs/dev/sso/custom-adapter.mdx b/apps/docs/content/docs/dev/sso/custom-adapter.mdx new file mode 100644 index 000000000..45a8feeb3 --- /dev/null +++ b/apps/docs/content/docs/dev/sso/custom-adapter.mdx @@ -0,0 +1,352 @@ +--- +title: Custom Adapter +description: Create your own custom SSO adapter for VitNode. +--- + +Want to let your users sign in with their favorite services? Let's build a custom SSO adapter! We'll use Discord as an example, but you can adapt this guide for any OAuth2 provider. + +## Usage + +import { Callout } from "fumadocs-ui/components/callout"; + + + + ### Create Your SSO Plugin + +Let's start with the basics. Create a new file for your SSO provider: + +```ts title="src/utils/sso/discord_api.ts" +import { SSOApiPlugin, getRedirectUri } from "@vitnode/core/api/models/sso"; + +export const DiscordSSOApiPlugin = ({ + clientId, + clientSecret, +}: { + clientId: string; + clientSecret: string; +}): SSOApiPlugin => { + const id = "discord"; + const redirectUri = getRedirectUri(id); + + return { id, name: "Discord" }; +}; +``` + +This is like creating a blueprint for your SSO provider. The `id` will be used in URLs and the `name` is what users will see. + + + + +### Add Authentication URL Generator + +Now let's add the magic that sends users to Discord for login: + +```ts title="src/utils/sso/discord_api.ts" +import { SSOApiPlugin, getRedirectUri } from "@vitnode/core/api/models/sso"; + +export const DiscordSSOApiPlugin = ({ + clientId, + clientSecret, +}: { + clientId: string; + clientSecret: string; +}): SSOApiPlugin => { + const id = "discord"; + const redirectUri = getRedirectUri(id); + + return { + id, + name: "Discord", + // [!code ++] + getUrl: ({ state }) => { + // [!code ++] + const url = new URL("https://discord.com/oauth2/authorize"); + // [!code ++] + url.searchParams.set("client_id", clientId); + // [!code ++] + url.searchParams.set("redirect_uri", redirectUri); + // [!code ++] + url.searchParams.set("response_type", "code"); + // [!code ++] + url.searchParams.set("scope", "identify email"); + // [!code ++] + url.searchParams.set("state", state); + // [!code ++] + return url.toString(); + // [!code ++] + }, + }; +}; +``` + + + Always include the `state` parameter - it's your security guard against CSRF + attacks. Don't worry, VitNode handles this automatically! + + + + + + +### Handle Token Exchange + +After the user approves access, Discord sends us a code. Let's exchange it for an access token: + +```ts title="src/utils/sso/discord_api.ts" +import { SSOApiPlugin, getRedirectUri } from "@vitnode/core/api/models/sso"; +import { HTTPException } from "hono/http-exception"; +import { ContentfulStatusCode } from "hono/utils/http-status"; +import { z } from "zod"; + +const tokenSchema = z.object({ + access_token: z.string(), + token_type: z.string(), +}); + +export const DiscordSSOApiPlugin = ({ + clientId, + clientSecret, +}: { + clientId: string; + clientSecret: string; +}): SSOApiPlugin => { + const id = "discord"; + const redirectUri = getRedirectUri(id); + + return { + id, + name: "Discord", + // [!code ++] + fetchToken: async code => { + // [!code ++] + const res = await fetch("https://discord.com/api/oauth2/token", { + // [!code ++] + method: "POST", + // [!code ++] + headers: { + // [!code ++] + "Content-Type": "application/x-www-form-urlencoded", + // [!code ++] + Accept: "application/json", + // [!code ++] + }, + // [!code ++] + body: new URLSearchParams({ + // [!code ++] + code, + // [!code ++] + redirect_uri: redirectUri, + // [!code ++] + grant_type: "authorization_code", + // [!code ++] + client_id: clientId, + // [!code ++] + client_secret: clientSecret, + // [!code ++] + }), + // [!code ++] + }); + + // [!code ++] + if (!res.ok) { + // [!code ++] + throw new HTTPException( + // [!code ++] + +res.status.toString() as ContentfulStatusCode, + // [!code ++] + { + // [!code ++] + message: "Internal error requesting token", + // [!code ++] + }, + // [!code ++] + ); + // [!code ++] + } + + // [!code ++] + const { data, error } = tokenSchema.safeParse(await res.json()); + // [!code ++] + if (error ?? !data) { + // [!code ++] + throw new HTTPException(400, { + // [!code ++] + message: "Invalid token response", + // [!code ++] + }); + // [!code ++] + } + + // [!code ++] + return data; + // [!code ++] + }, + getUrl: ({ state }) => { + const url = new URL("https://discord.com/oauth2/authorize"); + url.searchParams.set("client_id", clientId); + url.searchParams.set("redirect_uri", redirectUri); + url.searchParams.set("response_type", "code"); + url.searchParams.set("scope", "identify email"); + url.searchParams.set("state", state); + + return url.toString(); + }, + }; +}; +``` + + + + + +### Get User Information + +Finally, let's get the user's profile data using our shiny new access token: + +```ts title="src/utils/sso/discord_api.ts" +import { SSOApiPlugin, getRedirectUri } from "@vitnode/core/api/models/sso"; +import { HTTPException } from "hono/http-exception"; +import { ContentfulStatusCode } from "hono/utils/http-status"; +import { z } from "zod"; + +const userSchema = z.object({ + id: z.number(), + email: z.string(), + username: z.string(), +}); + +export const DiscordSSOApiPlugin = ({ + clientId, + clientSecret, +}: { + clientId: string; + clientSecret: string; +}): SSOApiPlugin => { + const id = "discord"; + const redirectUri = getRedirectUri(id); + + return { + id, + name: "Discord", + // [!code ++] + fetchUser: async ({ token_type, access_token }) => { + // [!code ++] + const res = await fetch("https://discord.com/api/users/@me", { + // [!code ++] + headers: { + // [!code ++] + Authorization: `${token_type} ${access_token}`, + // [!code ++] + }, + // [!code ++] + }); + + // [!code ++] + const { data, error } = userSchema.safeParse(await res.json()); + // [!code ++] + if (error ?? !data) { + // [!code ++] + throw new HTTPException(400, { + // [!code ++] + message: "Invalid user response", + // [!code ++] + }); + // [!code ++] + } + + // [!code ++] + return data; + // [!code ++] + }, + fetchToken: async code => { + const res = await fetch("https://discord.com/api/oauth2/token", { + method: "POST", + headers: { + "Content-Type": "application/x-www-form-urlencoded", + Accept: "application/json", + }, + body: new URLSearchParams({ + code, + redirect_uri: redirectUri, + grant_type: "authorization_code", + client_id: clientId, + client_secret: clientSecret, + }), + }); + + if (!res.ok) { + throw new HTTPException( + +res.status.toString() as ContentfulStatusCode, + { + message: "Internal error requesting token", + }, + ); + } + + const { data, error } = tokenSchema.safeParse(await res.json()); + if (error ?? !data) { + throw new HTTPException(400, { + message: "Invalid token response", + }); + } + + return data; + }, + getUrl: ({ state }) => { + const url = new URL("https://discord.com/oauth2/authorize"); + url.searchParams.set("client_id", clientId); + url.searchParams.set("redirect_uri", redirectUri); + url.searchParams.set("response_type", "code"); + url.searchParams.set("scope", "identify email"); + url.searchParams.set("state", state); + + return url.toString(); + }, + }; +}; +``` + + + Pro tip: Some OAuth providers might return unverified email addresses. If your + provider gives you an email verification status, add it to your validation to + keep things secure! + + + + + + +## Connect Everything Together + +Last step! Let's plug your new SSO provider into your app: + +```ts title="src/app/api/[...route]/route.ts" +import { OpenAPIHono } from "@hono/zod-openapi"; +import { handle } from "hono/vercel"; +import { VitNodeAPI } from "@vitnode/core/api/config"; +import { DiscordSSOApiPlugin } from "@/utils/sso/discord_api"; + +const app = new OpenAPIHono().basePath("/api"); +VitNodeAPI({ + app, + plugins: [], + authorization: { + // [!code ++] + ssoAdapters: [ + // [!code ++] + DiscordSSOApiPlugin({ + // [!code ++] + clientId: process.env.DISCORD_CLIENT_ID, + // [!code ++] + clientSecret: process.env.DISCORD_CLIENT_SECRET, + // [!code ++] + }), + // [!code ++] + ], + }, +}); +``` + + + + diff --git a/apps/docs/content/docs/dev/sso/index.mdx b/apps/docs/content/docs/dev/sso/index.mdx index 4c2fa1875..5372ccb1e 100644 --- a/apps/docs/content/docs/dev/sso/index.mdx +++ b/apps/docs/content/docs/dev/sso/index.mdx @@ -22,347 +22,3 @@ Before you can use SSO, you need to provide an adapter to your application. or create your own custom SSO adapter... - -## Custom SSO Adapter - -Want to let your users sign in with their favorite services? Let's build a custom SSO adapter! We'll use Discord as an example, but you can adapt this guide for any OAuth2 provider. - -import { Callout } from "fumadocs-ui/components/callout"; - - - - ### Create Your SSO Plugin - -Let's start with the basics. Create a new file for your SSO provider: - -```ts title="src/utils/sso/discord_api.ts" -import { SSOApiPlugin, getRedirectUri } from "@vitnode/core/api/models/sso"; - -export const DiscordSSOApiPlugin = ({ - clientId, - clientSecret, -}: { - clientId: string; - clientSecret: string; -}): SSOApiPlugin => { - const id = "discord"; - const redirectUri = getRedirectUri(id); - - return { id, name: "Discord" }; -}; -``` - -This is like creating a blueprint for your SSO provider. The `id` will be used in URLs and the `name` is what users will see. - - - - -### Add Authentication URL Generator - -Now let's add the magic that sends users to Discord for login: - -```ts title="src/utils/sso/discord_api.ts" -import { SSOApiPlugin, getRedirectUri } from "@vitnode/core/api/models/sso"; - -export const DiscordSSOApiPlugin = ({ - clientId, - clientSecret, -}: { - clientId: string; - clientSecret: string; -}): SSOApiPlugin => { - const id = "discord"; - const redirectUri = getRedirectUri(id); - - return { - id, - name: "Discord", - // [!code ++] - getUrl: ({ state }) => { - // [!code ++] - const url = new URL("https://discord.com/oauth2/authorize"); - // [!code ++] - url.searchParams.set("client_id", clientId); - // [!code ++] - url.searchParams.set("redirect_uri", redirectUri); - // [!code ++] - url.searchParams.set("response_type", "code"); - // [!code ++] - url.searchParams.set("scope", "identify email"); - // [!code ++] - url.searchParams.set("state", state); - // [!code ++] - return url.toString(); - // [!code ++] - }, - }; -}; -``` - - - Always include the `state` parameter - it's your security guard against CSRF - attacks. Don't worry, VitNode handles this automatically! - - - - - - -### Handle Token Exchange - -After the user approves access, Discord sends us a code. Let's exchange it for an access token: - -```ts title="src/utils/sso/discord_api.ts" -import { SSOApiPlugin, getRedirectUri } from "@vitnode/core/api/models/sso"; -import { HTTPException } from "hono/http-exception"; -import { ContentfulStatusCode } from "hono/utils/http-status"; -import { z } from "zod"; - -const tokenSchema = z.object({ - access_token: z.string(), - token_type: z.string(), -}); - -export const DiscordSSOApiPlugin = ({ - clientId, - clientSecret, -}: { - clientId: string; - clientSecret: string; -}): SSOApiPlugin => { - const id = "discord"; - const redirectUri = getRedirectUri(id); - - return { - id, - name: "Discord", - // [!code ++] - fetchToken: async code => { - // [!code ++] - const res = await fetch("https://discord.com/api/oauth2/token", { - // [!code ++] - method: "POST", - // [!code ++] - headers: { - // [!code ++] - "Content-Type": "application/x-www-form-urlencoded", - // [!code ++] - Accept: "application/json", - // [!code ++] - }, - // [!code ++] - body: new URLSearchParams({ - // [!code ++] - code, - // [!code ++] - redirect_uri: redirectUri, - // [!code ++] - grant_type: "authorization_code", - // [!code ++] - client_id: clientId, - // [!code ++] - client_secret: clientSecret, - // [!code ++] - }), - // [!code ++] - }); - - // [!code ++] - if (!res.ok) { - // [!code ++] - throw new HTTPException( - // [!code ++] - +res.status.toString() as ContentfulStatusCode, - // [!code ++] - { - // [!code ++] - message: "Internal error requesting token", - // [!code ++] - }, - // [!code ++] - ); - // [!code ++] - } - - // [!code ++] - const { data, error } = tokenSchema.safeParse(await res.json()); - // [!code ++] - if (error ?? !data) { - // [!code ++] - throw new HTTPException(400, { - // [!code ++] - message: "Invalid token response", - // [!code ++] - }); - // [!code ++] - } - - // [!code ++] - return data; - // [!code ++] - }, - getUrl: ({ state }) => { - const url = new URL("https://discord.com/oauth2/authorize"); - url.searchParams.set("client_id", clientId); - url.searchParams.set("redirect_uri", redirectUri); - url.searchParams.set("response_type", "code"); - url.searchParams.set("scope", "identify email"); - url.searchParams.set("state", state); - - return url.toString(); - }, - }; -}; -``` - - - - - -### Get User Information - -Finally, let's get the user's profile data using our shiny new access token: - -```ts title="src/utils/sso/discord_api.ts" -import { SSOApiPlugin, getRedirectUri } from "@vitnode/core/api/models/sso"; -import { HTTPException } from "hono/http-exception"; -import { ContentfulStatusCode } from "hono/utils/http-status"; -import { z } from "zod"; - -const userSchema = z.object({ - id: z.number(), - email: z.string(), - username: z.string(), -}); - -export const DiscordSSOApiPlugin = ({ - clientId, - clientSecret, -}: { - clientId: string; - clientSecret: string; -}): SSOApiPlugin => { - const id = "discord"; - const redirectUri = getRedirectUri(id); - - return { - id, - name: "Discord", - // [!code ++] - fetchUser: async ({ token_type, access_token }) => { - // [!code ++] - const res = await fetch("https://discord.com/api/users/@me", { - // [!code ++] - headers: { - // [!code ++] - Authorization: `${token_type} ${access_token}`, - // [!code ++] - }, - // [!code ++] - }); - - // [!code ++] - const { data, error } = userSchema.safeParse(await res.json()); - // [!code ++] - if (error ?? !data) { - // [!code ++] - throw new HTTPException(400, { - // [!code ++] - message: "Invalid user response", - // [!code ++] - }); - // [!code ++] - } - - // [!code ++] - return data; - // [!code ++] - }, - fetchToken: async code => { - const res = await fetch("https://discord.com/api/oauth2/token", { - method: "POST", - headers: { - "Content-Type": "application/x-www-form-urlencoded", - Accept: "application/json", - }, - body: new URLSearchParams({ - code, - redirect_uri: redirectUri, - grant_type: "authorization_code", - client_id: clientId, - client_secret: clientSecret, - }), - }); - - if (!res.ok) { - throw new HTTPException( - +res.status.toString() as ContentfulStatusCode, - { - message: "Internal error requesting token", - }, - ); - } - - const { data, error } = tokenSchema.safeParse(await res.json()); - if (error ?? !data) { - throw new HTTPException(400, { - message: "Invalid token response", - }); - } - - return data; - }, - getUrl: ({ state }) => { - const url = new URL("https://discord.com/oauth2/authorize"); - url.searchParams.set("client_id", clientId); - url.searchParams.set("redirect_uri", redirectUri); - url.searchParams.set("response_type", "code"); - url.searchParams.set("scope", "identify email"); - url.searchParams.set("state", state); - - return url.toString(); - }, - }; -}; -``` - - - Pro tip: Some OAuth providers might return unverified email addresses. If your - provider gives you an email verification status, add it to your validation to - keep things secure! - - - - - - -## Connect Everything Together - -Last step! Let's plug your new SSO provider into your app: - -```ts title="src/app/api/[...route]/route.ts" -import { OpenAPIHono } from "@hono/zod-openapi"; -import { handle } from "hono/vercel"; -import { VitNodeAPI } from "@vitnode/core/api/config"; -import { DiscordSSOApiPlugin } from "@/utils/sso/discord_api"; - -const app = new OpenAPIHono().basePath("/api"); -VitNodeAPI({ - app, - plugins: [], - authorization: { - // [!code ++] - ssoAdapters: [ - // [!code ++] - DiscordSSOApiPlugin({ - // [!code ++] - clientId: process.env.DISCORD_CLIENT_ID, - // [!code ++] - clientSecret: process.env.DISCORD_CLIENT_SECRET, - // [!code ++] - }), - // [!code ++] - ], - }, -}); -``` diff --git a/apps/docs/content/docs/dev/sso/meta.json b/apps/docs/content/docs/dev/sso/meta.json new file mode 100644 index 000000000..c4b976e82 --- /dev/null +++ b/apps/docs/content/docs/dev/sso/meta.json @@ -0,0 +1,4 @@ +{ + "title": "Single Sign-On (SSO)", + "pages": ["...", "custom-adapter"] +} diff --git a/apps/docs/eslint.config.mjs b/apps/docs/eslint.config.mjs index ca0cefa60..d190aca3c 100644 --- a/apps/docs/eslint.config.mjs +++ b/apps/docs/eslint.config.mjs @@ -1,4 +1,5 @@ import eslintVitNode from "@vitnode/config/eslint"; +import eslintVitNodeReact from "@vitnode/config/eslint.react"; import { fileURLToPath } from "node:url"; import { dirname } from "node:path"; @@ -6,6 +7,7 @@ const __dirname = dirname(fileURLToPath(import.meta.url)); export default [ ...eslintVitNode, + ...eslintVitNodeReact, { ignores: [".source"], }, diff --git a/apps/docs/next.config.ts b/apps/docs/next.config.ts index a7954fecc..d2a506bcc 100644 --- a/apps/docs/next.config.ts +++ b/apps/docs/next.config.ts @@ -9,6 +9,8 @@ const withBundleAnalyzer = nextAnalyzer({ enabled: process.env.ANALYZE === "true", }); -const nextConfig: NextConfig = {}; +const nextConfig: NextConfig = { + reactCompiler: true, +}; export default withBundleAnalyzer(withMDX(vitNodeNextConfig(nextConfig))); diff --git a/apps/docs/package.json b/apps/docs/package.json index 4beccb768..45875a602 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -1,6 +1,6 @@ { "name": "docs", - "version": "1.2.0-canary.60", + "version": "1.2.0-canary.68", "type": "module", "private": true, "scripts": { @@ -28,14 +28,14 @@ "@vitnode/core": "workspace:*", "drizzle-kit": "^0.31.6", "drizzle-orm": "^0.44.7", - "fumadocs-core": "^16.0.8", - "fumadocs-mdx": "^13.0.5", - "fumadocs-ui": "^16.0.8", - "hono": "^4.10.4", + "fumadocs-core": "^16.0.10", + "fumadocs-mdx": "^13.0.7", + "fumadocs-ui": "^16.0.10", + "hono": "^4.10.5", "lucide-react": "^0.553.0", "motion": "^12.23.24", "next": "^16.0.1", - "next-intl": "^4.5.0", + "next-intl": "^4.5.1", "node-cron": "^4.2.1", "react": "^19.2.0", "react-dom": "^19.2.0", @@ -50,9 +50,13 @@ "@tailwindcss/postcss": "^4.1.17", "@types/mdx": "^2.0.13", "@types/node": "^24.10.0", - "@types/react": "^19.2.2", + "@types/react": "^19.2.3", "@types/react-dom": "^19.2.2", "@vitnode/config": "workspace:*", + "@vitnode/node-cron": "workspace:*", + "@vitnode/nodemailer": "workspace:*", + "@vitnode/resend": "workspace:*", + "babel-plugin-react-compiler": "^1.0.0", "class-variance-authority": "^0.7.1", "eslint": "^9.39.1", "postcss": "^8.5.6", @@ -61,7 +65,7 @@ "tailwindcss": "^4.1.17", "tw-animate-css": "^1.4.0", "typescript": "^5.9.3", - "use-intl": "^4.5.0", + "use-intl": "^4.5.1", "zod": "^4.1.12" } } diff --git a/apps/docs/src/app/layout.tsx b/apps/docs/src/app/layout.tsx index 0e88c6de1..ef3b6627d 100644 --- a/apps/docs/src/app/layout.tsx +++ b/apps/docs/src/app/layout.tsx @@ -1,7 +1,5 @@ import "./global.css"; -export const experimental_ppr = true; - export default async function RootLayout({ children, }: { diff --git a/apps/docs/src/vitnode.api.config.ts b/apps/docs/src/vitnode.api.config.ts index 1b654bc54..49cb91b54 100644 --- a/apps/docs/src/vitnode.api.config.ts +++ b/apps/docs/src/vitnode.api.config.ts @@ -1,10 +1,11 @@ import { blogApiPlugin } from "@vitnode/blog/config.api"; -import { NodeCronAdapter } from "@vitnode/core/api/adapters/cron/node-cron.adapter"; -import { NodemailerEmailAdapter } from "@vitnode/core/api/adapters/email/nodemailer"; import { DiscordSSOApiPlugin } from "@vitnode/core/api/adapters/sso/discord"; +// import { ResendEmailAdapter } from "@vitnode/resend"; import { FacebookSSOApiPlugin } from "@vitnode/core/api/adapters/sso/facebook"; import { GoogleSSOApiPlugin } from "@vitnode/core/api/adapters/sso/google"; import { buildApiConfig } from "@vitnode/core/vitnode.config"; +import { NodeCronAdapter } from "@vitnode/node-cron"; +import { NodemailerEmailAdapter } from "@vitnode/nodemailer"; import { drizzle } from "drizzle-orm/postgres-js"; export const POSTGRES_URL = @@ -38,6 +39,10 @@ export const vitNodeApiConfig = buildApiConfig({ password: process.env.NODE_MAILER_PASSWORD, user: process.env.NOD_EMAILER_USER, }), + // adapter: ResendEmailAdapter({ + // apiKey: process.env.RESEND_API_KEY, + // from: process.env.RESEND_FROM_EMAIL, + // }), logo: { text: "VitNode Email Test", src: "http://localhost:3000/logo_vitnode_dark.png", diff --git a/package.json b/package.json index 2735bbe21..00b6843ec 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "prettier": "^3.6.2", "prettier-plugin-tailwindcss": "^0.7.1", "tsx": "^4.20.6", - "turbo": "^2.6.0", + "turbo": "^2.6.1", "typescript": "^5.9.3", "zod": "^4.1.12" }, diff --git a/packages/config/eslint.config.mjs b/packages/config/eslint.config.mjs index b5db2b41d..119f92706 100644 --- a/packages/config/eslint.config.mjs +++ b/packages/config/eslint.config.mjs @@ -1,21 +1,11 @@ // @ts-check -import { dirname } from "node:path"; -import { fileURLToPath } from "node:url"; import eslint from "@eslint/js"; -import eslintReact from "@eslint-react/eslint-plugin"; -import jsxA11y from "eslint-plugin-jsx-a11y"; import perfectionist from "eslint-plugin-perfectionist"; import eslintPluginPrettierRecommended from "eslint-plugin-prettier/recommended"; -import reactPlugin from "eslint-plugin-react"; -import hooksPlugin from "eslint-plugin-react-hooks"; import tsEslint from "typescript-eslint"; -import reactYouMightNotNeedAnEffect from "eslint-plugin-react-you-might-not-need-an-effect"; - -const __dirname = dirname(fileURLToPath(import.meta.url)); export default [ - reactYouMightNotNeedAnEffect.configs.recommended, { ignores: [ "next-env.d.ts", @@ -36,43 +26,13 @@ export default [ ], }, eslint.configs.recommended, - eslintReact.configs.recommended, ...tsEslint.configs.stylisticTypeChecked, ...tsEslint.configs.strictTypeChecked, eslintPluginPrettierRecommended, - jsxA11y.flatConfigs.recommended, - reactPlugin.configs.flat.recommended, perfectionist.configs["recommended-natural"], - { - files: ["**/*.{js,mjs,cjs,ts,jsx,tsx}"], - settings: { - react: { - version: "detect", - }, - }, - languageOptions: { - parserOptions: { - ecmaFeatures: { - jsx: true, - }, - }, - }, - }, - { - plugins: { - "react-hooks": hooksPlugin, - }, - rules: { - "react/react-in-jsx-scope": "off", - ...hooksPlugin.configs.recommended.rules, - }, - }, { files: ["**/*.{js,mjs,cjs,jsx,mjsx,ts,tsx,mtsx}"] }, { rules: { - "react-hooks/exhaustive-deps": "off", - "@eslint-react/no-context-provider": "off", - "@eslint-react/no-unstable-default-props": "off", "perfectionist/sort-array-includes": "warn", "@typescript-eslint/consistent-type-imports": "error", "@typescript-eslint/no-confusing-void-expression": "off", @@ -143,30 +103,10 @@ export default [ "newline-before-return": "warn", "no-restricted-imports": [ "error", - { - name: "next/link", - message: "Please import from `vitnode-frontend/navigation` instead.", - }, { name: "drizzle-orm/mysql-core", message: "Please import from `drizzle-orm/pg-core` instead.", }, - { - name: "next/navigation", - importNames: [ - "redirect", - "permanentRedirect", - "useRouter", - "usePathname", - ], - message: "Please import from `vitnode-frontend/navigation` instead.", - }, - { - name: "next/router", - importNames: ["useRouter"], - message: - "This import is from Page router. Please import from `vitnode-frontend/navigation` instead.", - }, ], }, }, diff --git a/packages/config/eslint.react.config.mjs b/packages/config/eslint.react.config.mjs new file mode 100644 index 000000000..330937bad --- /dev/null +++ b/packages/config/eslint.react.config.mjs @@ -0,0 +1,67 @@ +// @ts-check + +import eslintReact from "@eslint-react/eslint-plugin"; +import reactPlugin from "eslint-plugin-react"; +import hooksPlugin from "eslint-plugin-react-hooks"; +import reactYouMightNotNeedAnEffect from "eslint-plugin-react-you-might-not-need-an-effect"; + +export default [ + reactYouMightNotNeedAnEffect.configs.recommended, + eslintReact.configs.recommended, + reactPlugin.configs.flat.recommended, + { + files: ["**/*.{js,mjs,cjs,ts,jsx,tsx}"], + settings: { + react: { + version: "detect", + }, + }, + languageOptions: { + parserOptions: { + ecmaFeatures: { + jsx: true, + }, + }, + }, + }, + { + plugins: { + "react-hooks": hooksPlugin, + }, + rules: { + "react/react-in-jsx-scope": "off", + ...hooksPlugin.configs.recommended.rules, + }, + }, + { files: ["**/*.{js,mjs,cjs,jsx,mjsx,ts,tsx,mtsx}"] }, + { + rules: { + "react-hooks/exhaustive-deps": "off", + "@eslint-react/no-context-provider": "off", + "@eslint-react/no-unstable-default-props": "off", + "no-restricted-imports": [ + "error", + { + name: "next/link", + message: "Please import from `vitnode-frontend/navigation` instead.", + }, + { + name: "next/navigation", + importNames: [ + "redirect", + "permanentRedirect", + "useRouter", + "usePathname", + ], + message: "Please import from `vitnode-frontend/navigation` instead.", + }, + { + name: "next/router", + importNames: ["useRouter"], + message: + "This import is from Page router. Please import from `vitnode-frontend/navigation` instead.", + }, + ], + }, + }, +]; diff --git a/packages/config/package.json b/packages/config/package.json index 144bbc12e..fcb0c9b79 100644 --- a/packages/config/package.json +++ b/packages/config/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/config", - "version": "1.2.0-canary.60", + "version": "1.2.0-canary.68", "description": "ESLint, Prettier, TypeScript (TSConfig) config for VitNode", "author": "VitNode Team", "license": "MIT", @@ -23,6 +23,10 @@ "import": "./eslint.config.mjs", "default": "./eslint.config.mjs" }, + "./eslint.react": { + "import": "./eslint.react.config.mjs", + "default": "./eslint.react.config.mjs" + }, "./tsconfig": { "import": "./tsconfig.json", "default": "./tsconfig.json" @@ -41,7 +45,7 @@ "typescript": "^5.9.3" }, "dependencies": { - "@eslint-react/eslint-plugin": "^2.3.1", + "@eslint-react/eslint-plugin": "^2.3.4", "@eslint/js": "^9.39.1", "eslint-config-prettier": "^10.1.8", "eslint-plugin-jsx-a11y": "^6.10.2", @@ -51,6 +55,6 @@ "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-you-might-not-need-an-effect": "^0.7.0", "prettier-plugin-tailwindcss": "^0.7.1", - "typescript-eslint": "^8.46.3" + "typescript-eslint": "^8.46.4" } } diff --git a/packages/create-vitnode-app/copy-of-vitnode-app/eslint-react/eslint.config.mjs b/packages/create-vitnode-app/copy-of-vitnode-app/eslint-react/eslint.config.mjs new file mode 100644 index 000000000..b1ce26beb --- /dev/null +++ b/packages/create-vitnode-app/copy-of-vitnode-app/eslint-react/eslint.config.mjs @@ -0,0 +1,19 @@ +import eslintVitNode from "@vitnode/config/eslint"; +import eslintVitNodeReact from "@vitnode/config/eslint.react"; +import { fileURLToPath } from "node:url"; +import { dirname } from "node:path"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); + +export default [ + ...eslintVitNode, + ...eslintVitNodeReact, + { + languageOptions: { + parserOptions: { + project: "./tsconfig.json", + tsconfigRootDir: __dirname, + }, + }, + }, +]; diff --git a/packages/create-vitnode-app/copy-of-vitnode-app/eslint/eslint.config.mjs b/packages/create-vitnode-app/copy-of-vitnode-app/eslint/eslint.config.mjs index 8c0f6171d..b1ce26beb 100644 --- a/packages/create-vitnode-app/copy-of-vitnode-app/eslint/eslint.config.mjs +++ b/packages/create-vitnode-app/copy-of-vitnode-app/eslint/eslint.config.mjs @@ -1,4 +1,5 @@ import eslintVitNode from "@vitnode/config/eslint"; +import eslintVitNodeReact from "@vitnode/config/eslint.react"; import { fileURLToPath } from "node:url"; import { dirname } from "node:path"; @@ -6,6 +7,7 @@ const __dirname = dirname(fileURLToPath(import.meta.url)); export default [ ...eslintVitNode, + ...eslintVitNodeReact, { languageOptions: { parserOptions: { diff --git a/packages/create-vitnode-app/copy-of-vitnode-app/root/next.config.ts b/packages/create-vitnode-app/copy-of-vitnode-app/root/next.config.ts index 41f04fdd0..d8063ae7f 100644 --- a/packages/create-vitnode-app/copy-of-vitnode-app/root/next.config.ts +++ b/packages/create-vitnode-app/copy-of-vitnode-app/root/next.config.ts @@ -2,10 +2,7 @@ import { vitNodeNextConfig } from "@vitnode/core/config/next.config"; import type { NextConfig } from "next"; const nextConfig: NextConfig = { - experimental: { - inlineCss: true, - ppr: "incremental", - }, + reactCompiler: true, }; export default vitNodeNextConfig(nextConfig); diff --git a/packages/create-vitnode-app/copy-of-vitnode-plugin/root/.swcrc b/packages/create-vitnode-app/copy-of-vitnode-plugin/root/.swcrc new file mode 100644 index 000000000..eba97079c --- /dev/null +++ b/packages/create-vitnode-app/copy-of-vitnode-plugin/root/.swcrc @@ -0,0 +1,25 @@ +{ + "$schema": "https://swc.rs/schema.json", + "minify": true, + "jsc": { + "baseUrl": "./", + "target": "esnext", + "paths": { + "@/*": ["./src/*"] + }, + "parser": { + "syntax": "typescript", + "tsx": true + }, + "transform": { + "react": { + "runtime": "automatic" + } + } + }, + "module": { + "type": "nodenext", + "strict": true, + "resolveFully": true + } +} diff --git a/packages/create-vitnode-app/copy-of-vitnode-plugin/root/global.d.ts b/packages/create-vitnode-app/copy-of-vitnode-plugin/root/global.d.ts new file mode 100644 index 000000000..a57ec4757 --- /dev/null +++ b/packages/create-vitnode-app/copy-of-vitnode-plugin/root/global.d.ts @@ -0,0 +1,10 @@ +/// + +import core from "@vitnode/core/locales/en.json" with { type: "json" }; +import plugin from "./src/locales/en.json" with { type: "json" }; + +declare module "next-intl" { + interface AppConfig { + Messages: typeof plugin & typeof core; + } +} diff --git a/packages/create-vitnode-app/copy-of-vitnode-plugin/root/npmignore.template b/packages/create-vitnode-app/copy-of-vitnode-plugin/root/npmignore.template new file mode 100644 index 000000000..af72c3549 --- /dev/null +++ b/packages/create-vitnode-app/copy-of-vitnode-plugin/root/npmignore.template @@ -0,0 +1,19 @@ +/src/* +!/src/app +!/src/app/** +!/src/app_admin +!/src/app_admin/** +!/src/locales +!/src/locales/** + +/node_modules +/.turbo +/tsconfig.json +/.swcrc +/components.json +/global.d.ts +/tsup.config.ts +/vitest.config.ts +/tsconfig.json +/scripts +/config diff --git a/packages/create-vitnode-app/copy-of-vitnode-plugin/root/tsconfig.json b/packages/create-vitnode-app/copy-of-vitnode-plugin/root/tsconfig.json new file mode 100644 index 000000000..7ee719d7a --- /dev/null +++ b/packages/create-vitnode-app/copy-of-vitnode-plugin/root/tsconfig.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "@vitnode/config/tsconfig", + "compilerOptions": { + "target": "ESNext", + "module": "esnext", + "moduleResolution": "bundler", + "rootDir": "./", + "outDir": "./dist", + "jsx": "react-jsx", + "emitDeclarationOnly": true, + "declaration": true, + "declarationMap": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": ["./src/*"] + } + }, + "exclude": ["node_modules"], + "include": ["src", "global.d.ts"] +} diff --git a/packages/create-vitnode-app/eslint.config.mjs b/packages/create-vitnode-app/eslint.config.mjs index 609e6ba68..eafa42383 100644 --- a/packages/create-vitnode-app/eslint.config.mjs +++ b/packages/create-vitnode-app/eslint.config.mjs @@ -12,7 +12,7 @@ export default [ }, }, { - ignores: ["copy-of-vitnode-app"], + ignores: ["copy-of-vitnode-app", "copy-of-vitnode-plugin"], }, { languageOptions: { diff --git a/packages/create-vitnode-app/package.json b/packages/create-vitnode-app/package.json index 2892579ae..dfa90766e 100644 --- a/packages/create-vitnode-app/package.json +++ b/packages/create-vitnode-app/package.json @@ -1,6 +1,6 @@ { "name": "create-vitnode-app", - "version": "1.2.0-canary.60", + "version": "1.2.0-canary.68", "description": "Create a new VitNode app in seconds.", "author": "VitNode Team", "license": "MIT", @@ -14,6 +14,14 @@ "bin": { "create-vitnode-app": "dist/src/index.js" }, + "files": [ + "dist", + "copy-of-vitnode-app", + "copy-of-vitnode-plugin", + "README.md", + "eslint", + "eslint-react" + ], "scripts": { "build:scripts": "tsc && node dist/src/prepare/prepare.js", "start:scripts": "node dist/src/index.js", diff --git a/packages/create-vitnode-app/src/create/create-package-json.ts b/packages/create-vitnode-app/src/create/create-package-json.ts index 32d3097f3..ded8bdf35 100644 --- a/packages/create-vitnode-app/src/create/create-package-json.ts +++ b/packages/create-vitnode-app/src/create/create-package-json.ts @@ -1,14 +1,13 @@ -import { readFile, writeFile } from "fs/promises"; -import { dirname, join } from "path"; -import { fileURLToPath } from "url"; +import { writeFile } from "fs/promises"; +import { join } from "path"; import type { PackageJSON } from "../helpers/packages-json.js"; import type { CreateCliReturn } from "../questions.js"; import { getAvailablePackageManagers } from "../helpers/get-available-package-managers.js"; - -const __filename = fileURLToPath(import.meta.url); -const __dirname = dirname(__filename); +import { getVitnodePackageVersion } from "../helpers/get-vitnode-package-version.js"; +import { withIf } from "../helpers/with-If.js"; +import { versionsPackageJson } from "./package-versions.js"; type Mode = CreateCliReturn["mode"]; @@ -21,52 +20,6 @@ const paths = (root: string) => ({ web: join(root, "apps", "web"), }); -const withIf = >(cond: boolean, obj: T) => - (cond ? obj : {}) as Partial; - -const versions = { - typesNode: "^24", - typesReact: "^19.2", - typesReactDom: "^19.2", - typesBun: "latest", - - turbo: "^2.5", - typescript: "^5.9", - tsx: "^4.20.6", - tscAlias: "^1.8.16", - eslint: "^9.39.1", - prettier: "^3.6.2", - prettierTailwind: "^0.6.14", - tailwind: "^4.1.17", - tailwindPostcss: "^4.1.17", - postcss: "^8.5.6", - twAnimateCss: "^1.4.0", - - react: "^19.2", - reactDom: "^19.2", - nextSingle: "^16.0.1", - nextWebInMonorepo: "^15.4.6", - nextIntl: "^4.5.0", - useIntl: "^4.5.0", - rhf: "^7.66.0", - rhfResolvers: "^5.1.1", - lucide: "^0.553.0", - sonner: "^2.0.7", - dotenv: "^17.2.2", - - drizzleKit: "^0.31.6", - drizzleOrm: "^0.44.7", - - hono: "^4.10.4", - honoZodOpenapi: "^1.1.4", - honoZodValidator: "^0.7.4", - reactEmail: "^5.0.1", - reactEmailComponents: "^1.0.0", - zod: "^4.1.12", - - cva: "^0.7.1", -}; - /** * Shared blocks */ @@ -148,120 +101,122 @@ const webScripts = (eslint: boolean) => ({ * Dependency builders */ const baseDevDeps = (eslint: boolean, includePrettier: boolean) => ({ - "@types/node": versions.typesNode, + "@types/node": versionsPackageJson.typesNode, "@vitnode/config": "", // filled with local version dynamically ...withIf(eslint, { - eslint: versions.eslint, + eslint: versionsPackageJson.eslint, ...withIf(includePrettier, { - prettier: versions.prettier, - "prettier-plugin-tailwindcss": versions.prettierTailwind, + prettier: versionsPackageJson.prettier, + "prettier-plugin-tailwindcss": versionsPackageJson.prettierTailwind, }), }), }); const rootDevDeps = (eslint: boolean) => ({ ...baseDevDeps(eslint, true), - turbo: versions.turbo, - typescript: versions.typescript, - zod: versions.zod, + turbo: versionsPackageJson.turbo, + typescript: versionsPackageJson.typescript, + zod: versionsPackageJson.zod, }); const apiDeps = { - "@hono/zod-openapi": versions.honoZodOpenapi, - "@hono/zod-validator": versions.honoZodValidator, - "@react-email/components": versions.reactEmailComponents, + "@hono/zod-openapi": versionsPackageJson.honoZodOpenapi, + "@hono/zod-validator": versionsPackageJson.honoZodValidator, + "@react-email/components": versionsPackageJson.reactEmailComponents, "@vitnode/core": "", // filled dynamically - "drizzle-kit": versions.drizzleKit, - "drizzle-orm": versions.drizzleOrm, - hono: versions.hono, - "next-intl": versions.nextIntl, - react: versions.react, - "react-dom": versions.reactDom, - "use-intl": versions.useIntl, - zod: versions.zod, + "drizzle-kit": versionsPackageJson.drizzleKit, + "drizzle-orm": versionsPackageJson.drizzleOrm, + hono: versionsPackageJson.hono, + "next-intl": versionsPackageJson.nextIntl, + react: versionsPackageJson.react, + "react-dom": versionsPackageJson.reactDom, + "use-intl": versionsPackageJson.useIntl, + zod: versionsPackageJson.zod, }; const apiDevDeps = (pm: string, eslint: boolean) => ({ "@hono/node-server": "^1.19", - ...(pm === "bun" ? { "@types/bun": versions.typesBun } : {}), - "@types/node": versions.typesNode, - "@types/react": versions.typesReact, - "@types/react-dom": versions.typesReactDom, + ...(pm === "bun" ? { "@types/bun": versionsPackageJson.typesBun } : {}), + "@types/node": versionsPackageJson.typesNode, + "@types/react": versionsPackageJson.typesReact, + "@types/react-dom": versionsPackageJson.typesReactDom, "@vitnode/config": "", - dotenv: versions.dotenv, + dotenv: versionsPackageJson.dotenv, ...withIf(eslint, { - eslint: versions.eslint, + eslint: versionsPackageJson.eslint, // Prettier in API only when onlyApi + eslint in original code – we'll preserve by passing include later if needed }), - "react-email": versions.reactEmail, - "tsc-alias": versions.tscAlias, - tsx: versions.tsx, - typescript: versions.typescript, + "react-email": versionsPackageJson.reactEmail, + "tsc-alias": versionsPackageJson.tscAlias, + tsx: versionsPackageJson.tsx, + typescript: versionsPackageJson.typescript, }); const singleAppDeps = { - "@hono/zod-openapi": versions.honoZodOpenapi, - "@hono/zod-validator": versions.honoZodValidator, - "@hookform/resolvers": versions.rhfResolvers, - "@react-email/components": versions.reactEmailComponents, + "@hono/zod-openapi": versionsPackageJson.honoZodOpenapi, + "@hono/zod-validator": versionsPackageJson.honoZodValidator, + "@hookform/resolvers": versionsPackageJson.rhfResolvers, + "@react-email/components": versionsPackageJson.reactEmailComponents, "@vitnode/core": "", - "drizzle-kit": versions.drizzleKit, - "drizzle-orm": versions.drizzleOrm, - hono: versions.hono, - "lucide-react": versions.lucide, - next: versions.nextSingle, - "next-intl": versions.nextIntl, - react: versions.react, - "react-dom": versions.reactDom, - "react-hook-form": versions.rhf, - sonner: versions.sonner, - "use-intl": versions.useIntl, - zod: versions.zod, + "drizzle-kit": versionsPackageJson.drizzleKit, + "drizzle-orm": versionsPackageJson.drizzleOrm, + hono: versionsPackageJson.hono, + "lucide-react": versionsPackageJson.lucide, + next: versionsPackageJson.nextSingle, + "next-intl": versionsPackageJson.nextIntl, + react: versionsPackageJson.react, + "react-dom": versionsPackageJson.reactDom, + "react-hook-form": versionsPackageJson.rhf, + sonner: versionsPackageJson.sonner, + "use-intl": versionsPackageJson.useIntl, + zod: versionsPackageJson.zod, }; const singleAppDevDeps = (eslint: boolean) => ({ - "@tailwindcss/postcss": versions.tailwindPostcss, - "@types/node": versions.typesNode, - "@types/react": versions.typesReact, - "@types/react-dom": versions.typesReactDom, + "@tailwindcss/postcss": versionsPackageJson.tailwindPostcss, + "@types/node": versionsPackageJson.typesNode, + "@types/react": versionsPackageJson.typesReact, + "@types/react-dom": versionsPackageJson.typesReactDom, "@vitnode/config": "", + "babel-plugin-react-compiler": versionsPackageJson.babelPluginReactCompiler, ...withIf(eslint, { - eslint: versions.eslint, - prettier: versions.prettier, - "prettier-plugin-tailwindcss": versions.prettierTailwind, + eslint: versionsPackageJson.eslint, + prettier: versionsPackageJson.prettier, + "prettier-plugin-tailwindcss": versionsPackageJson.prettierTailwind, }), - "react-email": versions.reactEmail, - turbo: versions.turbo, - tailwindcss: versions.tailwind, - "tw-animate-css": versions.twAnimateCss, - typescript: versions.typescript, + "react-email": versionsPackageJson.reactEmail, + turbo: versionsPackageJson.turbo, + tailwindcss: versionsPackageJson.tailwind, + "tw-animate-css": versionsPackageJson.twAnimateCss, + typescript: versionsPackageJson.typescript, }); const webDeps = { "@vitnode/core": "", - "lucide-react": versions.lucide, - next: versions.nextWebInMonorepo, - "next-intl": versions.nextIntl, - react: versions.react, - "react-dom": versions.reactDom, - "react-hook-form": versions.rhf, - sonner: versions.sonner, + "lucide-react": versionsPackageJson.lucide, + next: versionsPackageJson.nextWebInMonorepo, + "next-intl": versionsPackageJson.nextIntl, + react: versionsPackageJson.react, + "react-dom": versionsPackageJson.reactDom, + "react-hook-form": versionsPackageJson.rhf, + sonner: versionsPackageJson.sonner, }; const webDevDeps = (eslint: boolean) => ({ - "@hookform/resolvers": versions.rhfResolvers, - "@tailwindcss/postcss": versions.tailwindPostcss, - "@types/node": versions.typesNode, - "@types/react": versions.typesReact, - "@types/react-dom": versions.typesReactDom, + "@hookform/resolvers": versionsPackageJson.rhfResolvers, + "@tailwindcss/postcss": versionsPackageJson.tailwindPostcss, + "@types/node": versionsPackageJson.typesNode, + "@types/react": versionsPackageJson.typesReact, + "@types/react-dom": versionsPackageJson.typesReactDom, "@vitnode/config": "", - "class-variance-authority": versions.cva, - ...withIf(eslint, { eslint: versions.eslint }), - postcss: versions.postcss, - tailwindcss: versions.tailwind, - "tw-animate-css": versions.twAnimateCss, - typescript: versions.typescript, - zod: versions.zod, + "babel-plugin-react-compiler": versionsPackageJson.babelPluginReactCompiler, + "class-variance-authority": versionsPackageJson.cva, + ...withIf(eslint, { eslint: versionsPackageJson.eslint }), + postcss: versionsPackageJson.postcss, + tailwindcss: versionsPackageJson.tailwind, + "tw-animate-css": versionsPackageJson.twAnimateCss, + typescript: versionsPackageJson.typescript, + zod: versionsPackageJson.zod, }); /** @@ -284,12 +239,7 @@ export const createPackageJSON = async ({ packageManager: string; root: string; }) => { - // Resolve local version of @vitnode/* based on this CLI's package.json - const cliPkg: PackageJSON = JSON.parse( - await readFile(join(__dirname, "..", "..", "..", "package.json"), "utf-8"), - ); - const vitnodeVersionRange = `^${cliPkg.version}`; - + const vitnodeVersionRange = await getVitnodePackageVersion(); const pmVersions = await getAvailablePackageManagers(); const pmSpec = `${packageManager}@${pmVersions[packageManager]}`; const p = paths(root); @@ -337,8 +287,8 @@ export const createPackageJSON = async ({ "@vitnode/config": vitnodeVersionRange, ...(eslint && mode === "onlyApi" ? { - prettier: versions.prettier, - "prettier-plugin-tailwindcss": versions.prettierTailwind, + prettier: versionsPackageJson.prettier, + "prettier-plugin-tailwindcss": versionsPackageJson.prettierTailwind, } : {}), // TS pipeline pieces when not using Bun for dev diff --git a/packages/create-vitnode-app/src/create/package-versions.ts b/packages/create-vitnode-app/src/create/package-versions.ts new file mode 100644 index 000000000..1b6d96738 --- /dev/null +++ b/packages/create-vitnode-app/src/create/package-versions.ts @@ -0,0 +1,47 @@ +export const versionsPackageJson = { + typesNode: "^24", + typesReact: "^19.2", + typesReactDom: "^19.2", + typesBun: "latest", + + turbo: "^2.6", + typescript: "^5.9", + tsx: "^4.20.6", + tscAlias: "^1.8.16", + eslint: "^9.39.1", + prettier: "^3.6.2", + prettierTailwind: "^0.6.14", + tailwind: "^4.1.17", + tailwindPostcss: "^4.1.17", + postcss: "^8.5.6", + twAnimateCss: "^1.4.0", + + react: "^19.2", + reactDom: "^19.2", + nextSingle: "^16.0.1", + nextWebInMonorepo: "^15.4.6", + nextIntl: "^4.5", + useIntl: "^4.5", + rhf: "^7.66.0", + rhfResolvers: "^5.1.1", + lucide: "^0.553.0", + sonner: "^2.0.7", + dotenv: "^17.2.2", + + drizzleKit: "^0.31.6", + drizzleOrm: "^0.44.7", + + hono: "^4.10", + honoZodOpenapi: "^1.1.4", + honoZodValidator: "^0.7.4", + reactEmail: "^5.0.1", + reactEmailComponents: "^1.0.0", + zod: "^4.1.12", + + cva: "^0.7.1", + babelPluginReactCompiler: "^1.0.0", + + swcCli: "^0.7.9", + swcCore: "^1.15.1", + concurrently: "^9.2.1", +}; diff --git a/packages/create-vitnode-app/src/helpers/get-vitnode-package-version.ts b/packages/create-vitnode-app/src/helpers/get-vitnode-package-version.ts new file mode 100644 index 000000000..209d756a9 --- /dev/null +++ b/packages/create-vitnode-app/src/helpers/get-vitnode-package-version.ts @@ -0,0 +1,17 @@ +import { readFile } from "fs/promises"; +import { dirname, join } from "path"; +import { fileURLToPath } from "url"; + +import type { PackageJSON } from "./packages-json.js"; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +export const getVitnodePackageVersion = async () => { + // Resolve local version of @vitnode/* based on this CLI's package.json + const cliPkg: PackageJSON = JSON.parse( + await readFile(join(__dirname, "..", "..", "..", "package.json"), "utf-8"), + ); + + return `^${cliPkg.version}`; +}; diff --git a/packages/create-vitnode-app/src/helpers/with-If.ts b/packages/create-vitnode-app/src/helpers/with-If.ts new file mode 100644 index 000000000..5d6c0af57 --- /dev/null +++ b/packages/create-vitnode-app/src/helpers/with-If.ts @@ -0,0 +1,4 @@ +export const withIf = >( + cond: boolean, + obj: T, +) => (cond ? obj : {}) as Partial; diff --git a/packages/create-vitnode-app/src/plugin/create/add-plugin-to-workspace.ts b/packages/create-vitnode-app/src/plugin/create/add-plugin-to-workspace.ts new file mode 100644 index 000000000..079989df1 --- /dev/null +++ b/packages/create-vitnode-app/src/plugin/create/add-plugin-to-workspace.ts @@ -0,0 +1,144 @@ +import { readdir, readFile, writeFile } from "fs/promises"; +import { dirname, join } from "path"; + +import type { PackageJSON } from "../../helpers/packages-json.js"; + +const writeJson = async (path: string, data: unknown) => + writeFile(path, JSON.stringify(data, null, 2) + "\n"); + +interface AddPluginToWorkspaceArgs { + packageManager: string; + pluginName: string; + pluginPath: string; + rootPath: string; +} + +/** + * Recursively find all package.json files in a directory + * @param dir - The directory to search in + * @param results - Array to accumulate results (used internally) + * @returns Array of absolute paths to package.json files + */ +const findPackageJsonFiles = async ( + dir: string, + results: string[] = [], +): Promise => { + try { + const entries = await readdir(dir, { withFileTypes: true }); + + for (const entry of entries) { + const fullPath = join(dir, entry.name); + + // Skip node_modules and dist folders + if (entry.name === "node_modules" || entry.name === "dist") { + continue; + } + + if (entry.isDirectory()) { + await findPackageJsonFiles(fullPath, results); + } else if (entry.name === "package.json") { + results.push(fullPath); + } + } + } catch { + // Ignore permission errors or inaccessible directories + } + + return results; +}; + +/** + * Adds the newly created plugin to all workspace packages that depend on @vitnode/core. + * This function: + * 1. Finds all package.json files in the workspace (excluding node_modules and dist) + * 2. Identifies packages that have @vitnode/core as a dependency + * 3. Adds the new plugin as a dependency with the appropriate workspace reference + * 4. Skips other packages in the same parent directory as the plugin (e.g., other plugins) + * 5. Works with any folder structure (apps/, applications/, sandbox/, etc.) + * 6. Respects the package manager's workspace protocol + * + * @param packageManager - The package manager being used (pnpm, npm, yarn, bun) + * @param pluginName - The name of the plugin to add (e.g., "@my-org/my-plugin") + * @param pluginPath - The absolute path to the plugin directory + * @param rootPath - The absolute path to the monorepo root (where turbo.json is located) + */ + +export const addPluginToWorkspace = async ({ + packageManager, + pluginName, + pluginPath, + rootPath, +}: AddPluginToWorkspaceArgs) => { + // Find all package.json files in the workspace + const packageJsonFiles = await findPackageJsonFiles(rootPath); + + // Get the parent directory of the plugin (e.g., "plugins", "packages", etc.) + const pluginParentDir = dirname(pluginPath); + + for (const packageJsonPath of packageJsonFiles) { + // Skip if this is the plugin's own package.json + if (packageJsonPath === join(pluginPath, "package.json")) { + continue; + } + + // Skip other packages in the same parent directory as the plugin + // (e.g., if plugin is in "plugins/my-plugin", skip "plugins/other-plugin") + const packageDir = dirname(dirname(packageJsonPath)); // Get parent of package folder + if (packageDir === pluginParentDir) { + continue; + } + + try { + const content = await readFile(packageJsonPath, "utf-8"); + const pkg: PackageJSON = JSON.parse(content); + + // Check if this package has @vitnode/core + const hasVitnodeCore = + pkg.dependencies?.["@vitnode/core"] ?? + pkg.devDependencies?.["@vitnode/core"]; + + if (!hasVitnodeCore) { + continue; + } + + // Determine the workspace reference based on package manager + let workspaceReference: string; + + switch (packageManager) { + case "bun": + workspaceReference = "workspace:*"; + break; + case "npm": + workspaceReference = "*"; + break; + case "pnpm": + workspaceReference = "workspace:*"; + break; + case "yarn": + workspaceReference = "workspace:*"; + break; + default: + workspaceReference = "workspace:*"; + } + + // Add the plugin to dependencies + pkg.dependencies ??= {}; + + pkg.dependencies[pluginName] = workspaceReference; + + // Sort dependencies alphabetically + pkg.dependencies = Object.keys(pkg.dependencies) + .sort() + .reduce>((acc, key) => { + acc[key] = pkg.dependencies?.[key] ?? ""; + + return acc; + }, {}); + + await writeJson(packageJsonPath, pkg); + } catch { + // Skip files that can't be read or parsed + continue; + } + } +}; diff --git a/packages/create-vitnode-app/src/plugin/create/create-package-json.ts b/packages/create-vitnode-app/src/plugin/create/create-package-json.ts new file mode 100644 index 000000000..ace3ac1b2 --- /dev/null +++ b/packages/create-vitnode-app/src/plugin/create/create-package-json.ts @@ -0,0 +1,79 @@ +import { writeFile } from "fs/promises"; + +import type { PackageJSON } from "../../helpers/packages-json.js"; + +import { versionsPackageJson } from "../../create/package-versions.js"; +import { getVitnodePackageVersion } from "../../helpers/get-vitnode-package-version.js"; +import { withIf } from "../../helpers/with-If.js"; + +const writeJson = async (path: string, data: unknown) => + writeFile(path, JSON.stringify(data, null, 2)); + +export const createPluginPackageJSON = async ({ + pluginName, + pluginPath, + eslint, +}: { + eslint: boolean; + pluginName: string; + pluginPath: string; +}) => { + const vitnodeVersionRange = await getVitnodePackageVersion(); + + const pluginPkg: PackageJSON = { + name: pluginName, + version: "0.1.0", + private: true, + type: "module", + scripts: { + "build:plugins": + "tsc && swc src -d dist --config-file .swcrc && tsc-alias -p tsconfig.json", + dev: 'concurrently "tsc -w --preserveWatchOutput" "swc src -d dist --config-file .swcrc -w" "tsc-alias -w" "vitnode plugin --w"', + "dev:email": "email dev --dir src/emails", + ...withIf(eslint, { + lint: "turbo lint", + "lint:fix": "turbo lint:fix", + }), + }, + exports: { + "./*": { + import: "./dist/src/*.js", + types: "./dist/src/*.d.ts", + default: "./dist/src/*.js", + }, + }, + dependencies: { + "@hono/zod-openapi": versionsPackageJson.honoZodOpenapi, + "@vitnode/core": vitnodeVersionRange, + "drizzle-kit": versionsPackageJson.drizzleKit, + "drizzle-orm": versionsPackageJson.drizzleOrm, + hono: versionsPackageJson.hono, + "lucide-react": versionsPackageJson.lucide, + next: versionsPackageJson.nextSingle, + "next-intl": versionsPackageJson.nextIntl, + react: versionsPackageJson.react, + "react-dom": versionsPackageJson.reactDom, + "react-email": versionsPackageJson.reactEmail, + "react-hook-form": versionsPackageJson.rhf, + sonner: versionsPackageJson.sonner, + "use-intl": versionsPackageJson.useIntl, + zod: versionsPackageJson.zod, + }, + devDependencies: { + "@react-email/components": versionsPackageJson.reactEmailComponents, + "@swc/cli": versionsPackageJson.swcCli, + "@swc/core": versionsPackageJson.swcCore, + "@types/react": versionsPackageJson.typesReact, + "@types/react-dom": versionsPackageJson.typesReactDom, + "@vitnode/config": vitnodeVersionRange, + concurrently: versionsPackageJson.concurrently, + ...withIf(eslint, { + eslint: versionsPackageJson.eslint, + }), + "tsc-alias": versionsPackageJson.tscAlias, + typescript: versionsPackageJson.typescript, + }, + }; + + await writeJson(`${pluginPath}/package.json`, pluginPkg); +}; diff --git a/packages/create-vitnode-app/src/plugin/create/create-plugin-vitnode.ts b/packages/create-vitnode-app/src/plugin/create/create-plugin-vitnode.ts index 89dc3f3b5..dfd223048 100644 --- a/packages/create-vitnode-app/src/plugin/create/create-plugin-vitnode.ts +++ b/packages/create-vitnode-app/src/plugin/create/create-plugin-vitnode.ts @@ -1,5 +1,5 @@ import { existsSync } from "fs"; -import { mkdir } from "fs/promises"; +import { cp, mkdir, rename } from "fs/promises"; import ora from "ora"; import { dirname, join } from "path"; import color from "picocolors"; @@ -10,16 +10,18 @@ import type { CreatePluginCliReturn } from "../questions.js"; import { getPackageManagerFromRoot } from "../../helpers/get-package-manager-from-root.js"; import { installDependencies } from "../../helpers/install-dependencies.js"; import { isFolderEmpty } from "../../helpers/is-folder-empty.js"; +import { addPluginToWorkspace } from "./add-plugin-to-workspace.js"; +import { createPluginPackageJSON } from "./create-package-json.js"; export const createPluginVitNode = async ({ pluginPath, pluginName, install, - root, + eslint, }: CreatePluginCliReturn & { + eslint: boolean; pluginName: string; pluginPath: string; - root: string; }) => { const packageManager = getPackageManagerFromRoot(process.cwd()); @@ -34,7 +36,9 @@ export const createPluginVitNode = async ({ "..", "..", "..", + "..", "copy-of-vitnode-plugin", + "root", ); if (!existsSync(templatePath)) { spinner.fail( @@ -50,15 +54,70 @@ export const createPluginVitNode = async ({ } spinner.text = "Preparing the plugin structure..."; + await cp(templatePath, pluginPath, { recursive: true }); + + // Rename template npmignore to .npmignore in the generated plugin + const npmIgnoreTemplatePath = join(pluginPath, "npmignore.template"); + const dotNpmIgnorePath = join(pluginPath, ".npmignore"); + if (existsSync(npmIgnoreTemplatePath)) { + await rename(npmIgnoreTemplatePath, dotNpmIgnorePath); + } spinner.text = "Creating package.json..."; - // Create package.json for the plugin + await createPluginPackageJSON({ + pluginName, + pluginPath, + eslint, + }); + + if (eslint) { + spinner.text = "Setting up ESLint..."; + const templateEslintPath = join( + __dirname, + "..", + "..", + "..", + "..", + "copy-of-vitnode-app", + "eslint-react", + ); + + if (!existsSync(templateEslintPath)) { + spinner.fail( + `\n${color.red("Error!")} ESLint template path ${color.cyan( + templateEslintPath, + )} does not exist.`, + ); + process.exit(1); + } + + await cp(templateEslintPath, pluginPath, { recursive: true }); + } + + // Find the root of the monorepo (where turbo.json is located) + let rootPath = process.cwd(); + let currentDir = rootPath; + while (currentDir !== dirname(currentDir)) { + if (existsSync(join(currentDir, "turbo.json"))) { + rootPath = currentDir; + break; + } + currentDir = dirname(currentDir); + } + + spinner.text = "Adding plugin to workspace packages..."; + await addPluginToWorkspace({ + packageManager, + pluginName, + pluginPath, + rootPath, + }); if (install) { spinner.text = "Installing dependencies..."; await installDependencies({ packageManager, - cwd: root, + cwd: pluginPath, }); } diff --git a/packages/create-vitnode-app/src/plugin/index.ts b/packages/create-vitnode-app/src/plugin/index.ts index 3651c606a..d2e4ca81b 100644 --- a/packages/create-vitnode-app/src/plugin/index.ts +++ b/packages/create-vitnode-app/src/plugin/index.ts @@ -29,12 +29,13 @@ export const createPlugin = async ({ }); } - const { pluginName, pluginPath } = await validationProjectForPlugin(name); + const { pluginName, pluginPath, eslint } = + await validationProjectForPlugin(name); const options = await createPluginQuestionsCli(program); await createPluginVitNode({ pluginName, pluginPath, - root: projectPath, + eslint, ...options, }); }; diff --git a/packages/create-vitnode-app/src/plugin/validation.ts b/packages/create-vitnode-app/src/plugin/validation.ts index 479faa44f..77e2ea44b 100644 --- a/packages/create-vitnode-app/src/plugin/validation.ts +++ b/packages/create-vitnode-app/src/plugin/validation.ts @@ -53,6 +53,8 @@ export const validationProjectForPlugin = async (projectPath: string) => { process.exit(1); } + let eslint = false; + try { const packageJson: PackageJSON = JSON.parse( await readFile(packageJsonPath, "utf-8"), @@ -70,6 +72,12 @@ export const validationProjectForPlugin = async (projectPath: string) => { ); process.exit(1); } + + eslint = !!( + packageJson.dependencies?.eslint ?? + packageJson.devDependencies?.eslint ?? + false + ); } catch (error) { console.error( `${color.red("Error:")} Failed to read or parse ${color.cyan("package.json")}.`, @@ -124,5 +132,5 @@ export const validationProjectForPlugin = async (projectPath: string) => { process.exit(1); } - return { pluginName, pluginPath }; + return { pluginName, pluginPath, eslint }; }; diff --git a/packages/create-vitnode-app/src/prepare/prepare.ts b/packages/create-vitnode-app/src/prepare/prepare.ts index b5cf406d8..38271ea9b 100644 --- a/packages/create-vitnode-app/src/prepare/prepare.ts +++ b/packages/create-vitnode-app/src/prepare/prepare.ts @@ -3,10 +3,16 @@ import { mkdir } from "node:fs/promises"; import { join } from "node:path"; const prepare = async () => { - const toRootPath = join(process.cwd(), "copy-of-vitnode-app"); - if (!existsSync(toRootPath)) { - await mkdir(toRootPath); - } + const toRootPaths = ["copy-of-vitnode-app", "copy-of-vitnode-plugin"]; + await Promise.all( + toRootPaths.map(async path => { + const toRootPath = join(process.cwd(), path); + if (!existsSync(toRootPath)) { + await mkdir(toRootPath); + } + }), + ); + const fromRootPath = join(process.cwd(), "..", "..", "apps", "docs"); if (!existsSync(fromRootPath)) { console.error( diff --git a/packages/node-cron/.npmignore b/packages/node-cron/.npmignore new file mode 100644 index 000000000..10004b73c --- /dev/null +++ b/packages/node-cron/.npmignore @@ -0,0 +1,6 @@ +/.turbo +/src +/node_modules +/tsconfig.json +/.swcrc +/eslint.config.mjs \ No newline at end of file diff --git a/packages/node-cron/.swcrc b/packages/node-cron/.swcrc new file mode 100644 index 000000000..eba97079c --- /dev/null +++ b/packages/node-cron/.swcrc @@ -0,0 +1,25 @@ +{ + "$schema": "https://swc.rs/schema.json", + "minify": true, + "jsc": { + "baseUrl": "./", + "target": "esnext", + "paths": { + "@/*": ["./src/*"] + }, + "parser": { + "syntax": "typescript", + "tsx": true + }, + "transform": { + "react": { + "runtime": "automatic" + } + } + }, + "module": { + "type": "nodenext", + "strict": true, + "resolveFully": true + } +} diff --git a/packages/node-cron/README.md b/packages/node-cron/README.md new file mode 100644 index 000000000..a68ff4bab --- /dev/null +++ b/packages/node-cron/README.md @@ -0,0 +1,20 @@ +# (VitNode) Node-cron Adapter + +This package provides the Node-cron adapter for VitNode, enabling cron job scheduling and management within your VitNode applications. + +

+
+ + + + + VitNode Logo + + +
+
+

+ +| Cloud | Self-Hosted | Links | Documentation | +| ---------------- | ------------ | ------------------------------------------------------ | --------------------------------------------------- | +| ❌ Not Supported | ✅ Supported | [NPM Package](https://www.npmjs.com/package/node-cron) | [Docs](https://vitnode.com/docs/dev/cron/node-cron) | diff --git a/packages/node-cron/eslint.config.mjs b/packages/node-cron/eslint.config.mjs new file mode 100644 index 000000000..8c0f6171d --- /dev/null +++ b/packages/node-cron/eslint.config.mjs @@ -0,0 +1,17 @@ +import eslintVitNode from "@vitnode/config/eslint"; +import { fileURLToPath } from "node:url"; +import { dirname } from "node:path"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); + +export default [ + ...eslintVitNode, + { + languageOptions: { + parserOptions: { + project: "./tsconfig.json", + tsconfigRootDir: __dirname, + }, + }, + }, +]; diff --git a/packages/node-cron/package.json b/packages/node-cron/package.json new file mode 100644 index 000000000..962571251 --- /dev/null +++ b/packages/node-cron/package.json @@ -0,0 +1,46 @@ +{ + "name": "@vitnode/node-cron", + "version": "1.2.0-canary.68", + "description": "Node-cron adapter for VitNode, enabling cron job scheduling and management.", + "author": "VitNode Team", + "license": "MIT", + "homepage": "https://vitnode.com", + "repository": { + "type": "git", + "url": "git+https://github.com/aXenDeveloper/vitnode.git", + "directory": "packages/node-cron" + }, + "keywords": [ + "vitnode", + "node-cron", + "cron", + "scheduler" + ], + "type": "module", + "exports": { + ".": { + "import": "./dist/src/index.js", + "types": "./dist/src/index.d.ts", + "default": "./dist/src/index.js" + } + }, + "scripts": { + "build:plugins": "tsc && swc src -d dist --config-file .swcrc && tsc-alias -p tsconfig.json", + "dev:plugins": "concurrently \"tsc -w --preserveWatchOutput\" \"swc src -d dist --config-file .swcrc -w\" \"tsc-alias -w\"", + "lint": "eslint .", + "lint:fix": "eslint . --fix" + }, + "dependencies": { + "node-cron": "^4.2.1" + }, + "devDependencies": { + "@swc/cli": "^0.7.9", + "@swc/core": "^1.15.1", + "@vitnode/config": "workspace:*", + "@vitnode/core": "workspace:*", + "concurrently": "^9.2.1", + "eslint": "^9.39.1", + "tsc-alias": "^1.8.16", + "typescript": "^5.9.3" + } +} diff --git a/packages/vitnode/src/api/adapters/cron/node-cron.adapter.ts b/packages/node-cron/src/index.ts similarity index 73% rename from packages/vitnode/src/api/adapters/cron/node-cron.adapter.ts rename to packages/node-cron/src/index.ts index de2606ecb..d51d24d85 100644 --- a/packages/vitnode/src/api/adapters/cron/node-cron.adapter.ts +++ b/packages/node-cron/src/index.ts @@ -1,7 +1,6 @@ +import { type CronAdapter, handleCronJobs } from "@vitnode/core/api/lib/cron"; import { schedule } from "node-cron"; -import { type CronAdapter, handleCronJobs } from "@/api/lib/cron"; - export const NodeCronAdapter = (): CronAdapter => { return { schedule() { diff --git a/packages/node-cron/tsconfig.json b/packages/node-cron/tsconfig.json new file mode 100644 index 000000000..7593a944f --- /dev/null +++ b/packages/node-cron/tsconfig.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "@vitnode/config/tsconfig", + "compilerOptions": { + "target": "ESNext", + "module": "esnext", + "moduleResolution": "bundler", + "rootDir": "./", + "outDir": "./dist", + "emitDeclarationOnly": true, + "declaration": true, + "declarationMap": true, + "paths": { + "@/*": ["./src/*"] + } + }, + "exclude": ["node_modules"], + "include": ["src"] +} diff --git a/packages/nodemailer/.npmignore b/packages/nodemailer/.npmignore new file mode 100644 index 000000000..10004b73c --- /dev/null +++ b/packages/nodemailer/.npmignore @@ -0,0 +1,6 @@ +/.turbo +/src +/node_modules +/tsconfig.json +/.swcrc +/eslint.config.mjs \ No newline at end of file diff --git a/packages/nodemailer/.swcrc b/packages/nodemailer/.swcrc new file mode 100644 index 000000000..eba97079c --- /dev/null +++ b/packages/nodemailer/.swcrc @@ -0,0 +1,25 @@ +{ + "$schema": "https://swc.rs/schema.json", + "minify": true, + "jsc": { + "baseUrl": "./", + "target": "esnext", + "paths": { + "@/*": ["./src/*"] + }, + "parser": { + "syntax": "typescript", + "tsx": true + }, + "transform": { + "react": { + "runtime": "automatic" + } + } + }, + "module": { + "type": "nodenext", + "strict": true, + "resolveFully": true + } +} diff --git a/packages/nodemailer/README.md b/packages/nodemailer/README.md new file mode 100644 index 000000000..57add38dc --- /dev/null +++ b/packages/nodemailer/README.md @@ -0,0 +1,20 @@ +# (VitNode) Nodemailer (SMTP) Adapter + +This package provides a Nodemailer email adapter for VitNode, enabling email sending capabilities using SMTP. + +

+
+ + + + + VitNode Logo + + +
+
+

+ +| Cloud | Self-Hosted | Links | Documentation | +| ---------------- | ------------ | ------------------------------------------------------- | ----------------------------------------------------- | +| ❌ Not Supported | ✅ Supported | [NPM Package](https://www.npmjs.com/package/nodemailer) | [Docs](https://vitnode.com/docs/dev/email/nodemailer) | diff --git a/packages/nodemailer/eslint.config.mjs b/packages/nodemailer/eslint.config.mjs new file mode 100644 index 000000000..8c0f6171d --- /dev/null +++ b/packages/nodemailer/eslint.config.mjs @@ -0,0 +1,17 @@ +import eslintVitNode from "@vitnode/config/eslint"; +import { fileURLToPath } from "node:url"; +import { dirname } from "node:path"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); + +export default [ + ...eslintVitNode, + { + languageOptions: { + parserOptions: { + project: "./tsconfig.json", + tsconfigRootDir: __dirname, + }, + }, + }, +]; diff --git a/packages/nodemailer/package.json b/packages/nodemailer/package.json new file mode 100644 index 000000000..be41a69f6 --- /dev/null +++ b/packages/nodemailer/package.json @@ -0,0 +1,46 @@ +{ + "name": "@vitnode/nodemailer", + "version": "1.2.0-canary.68", + "description": "Nodemailer integration package for VitNode, enabling email functionalities.", + "author": "VitNode Team", + "license": "MIT", + "homepage": "https://vitnode.com", + "repository": { + "type": "git", + "url": "git+https://github.com/aXenDeveloper/vitnode.git", + "directory": "packages/nodemailer" + }, + "keywords": [ + "vitnode", + "nodemailer", + "smtp" + ], + "type": "module", + "exports": { + ".": { + "import": "./dist/src/index.js", + "types": "./dist/src/index.d.ts", + "default": "./dist/src/index.js" + } + }, + "scripts": { + "build:plugins": "tsc && swc src -d dist --config-file .swcrc && tsc-alias -p tsconfig.json", + "dev:plugins": "concurrently \"tsc -w --preserveWatchOutput\" \"swc src -d dist --config-file .swcrc -w\" \"tsc-alias -w\"", + "lint": "eslint .", + "lint:fix": "eslint . --fix" + }, + "dependencies": { + "nodemailer": "^7.0.10" + }, + "devDependencies": { + "@swc/cli": "^0.7.9", + "@swc/core": "^1.15.1", + "@types/nodemailer": "^7.0.3", + "@vitnode/config": "workspace:*", + "@vitnode/core": "workspace:*", + "concurrently": "^9.2.1", + "eslint": "^9.39.1", + "tsc-alias": "^1.8.16", + "typescript": "^5.9.3" + } +} diff --git a/packages/vitnode/src/api/adapters/email/nodemailer.ts b/packages/nodemailer/src/index.ts similarity index 93% rename from packages/vitnode/src/api/adapters/email/nodemailer.ts rename to packages/nodemailer/src/index.ts index 7f00ecfec..1a218d18e 100644 --- a/packages/vitnode/src/api/adapters/email/nodemailer.ts +++ b/packages/nodemailer/src/index.ts @@ -1,6 +1,6 @@ -import { createTransport } from "nodemailer"; +import type { EmailApiPlugin } from "@vitnode/core/api/models/email"; -import type { EmailApiPlugin } from "@/api/models/email"; +import { createTransport } from "nodemailer"; export const NodemailerEmailAdapter = ({ host = "", diff --git a/packages/nodemailer/tsconfig.json b/packages/nodemailer/tsconfig.json new file mode 100644 index 000000000..7593a944f --- /dev/null +++ b/packages/nodemailer/tsconfig.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "@vitnode/config/tsconfig", + "compilerOptions": { + "target": "ESNext", + "module": "esnext", + "moduleResolution": "bundler", + "rootDir": "./", + "outDir": "./dist", + "emitDeclarationOnly": true, + "declaration": true, + "declarationMap": true, + "paths": { + "@/*": ["./src/*"] + } + }, + "exclude": ["node_modules"], + "include": ["src"] +} diff --git a/packages/resend/.npmignore b/packages/resend/.npmignore new file mode 100644 index 000000000..10004b73c --- /dev/null +++ b/packages/resend/.npmignore @@ -0,0 +1,6 @@ +/.turbo +/src +/node_modules +/tsconfig.json +/.swcrc +/eslint.config.mjs \ No newline at end of file diff --git a/packages/resend/.swcrc b/packages/resend/.swcrc new file mode 100644 index 000000000..eba97079c --- /dev/null +++ b/packages/resend/.swcrc @@ -0,0 +1,25 @@ +{ + "$schema": "https://swc.rs/schema.json", + "minify": true, + "jsc": { + "baseUrl": "./", + "target": "esnext", + "paths": { + "@/*": ["./src/*"] + }, + "parser": { + "syntax": "typescript", + "tsx": true + }, + "transform": { + "react": { + "runtime": "automatic" + } + } + }, + "module": { + "type": "nodenext", + "strict": true, + "resolveFully": true + } +} diff --git a/packages/resend/README.md b/packages/resend/README.md new file mode 100644 index 000000000..8fdbcee2c --- /dev/null +++ b/packages/resend/README.md @@ -0,0 +1,20 @@ +# (VitNode) Resend Adapter + +This package provides an adapter for integrating Resend email services into VitNode applications, enabling seamless email sending capabilities. + +

+
+ + + + + VitNode Logo + + +
+
+

+ +| Cloud | Self-Hosted | Links | Documentation | +| ------------ | ------------ | --------------------------------------------------- | ------------------------------------------------- | +| ✅ Supported | ✅ Supported | [NPM Package](https://www.npmjs.com/package/resend) | [Docs](https://vitnode.com/docs/dev/email/resend) | diff --git a/packages/resend/eslint.config.mjs b/packages/resend/eslint.config.mjs new file mode 100644 index 000000000..8c0f6171d --- /dev/null +++ b/packages/resend/eslint.config.mjs @@ -0,0 +1,17 @@ +import eslintVitNode from "@vitnode/config/eslint"; +import { fileURLToPath } from "node:url"; +import { dirname } from "node:path"; + +const __dirname = dirname(fileURLToPath(import.meta.url)); + +export default [ + ...eslintVitNode, + { + languageOptions: { + parserOptions: { + project: "./tsconfig.json", + tsconfigRootDir: __dirname, + }, + }, + }, +]; diff --git a/packages/resend/package.json b/packages/resend/package.json new file mode 100644 index 000000000..ed45660e7 --- /dev/null +++ b/packages/resend/package.json @@ -0,0 +1,44 @@ +{ + "name": "@vitnode/resend", + "version": "1.2.0-canary.68", + "description": "Resend adapter for VitNode, enabling email sending capabilities through the Resend service.", + "author": "VitNode Team", + "license": "MIT", + "homepage": "https://vitnode.com", + "repository": { + "type": "git", + "url": "git+https://github.com/aXenDeveloper/vitnode.git", + "directory": "packages/resend" + }, + "keywords": [ + "vitnode", + "resend" + ], + "type": "module", + "exports": { + ".": { + "import": "./dist/src/index.js", + "types": "./dist/src/index.d.ts", + "default": "./dist/src/index.js" + } + }, + "scripts": { + "build:plugins": "tsc && swc src -d dist --config-file .swcrc && tsc-alias -p tsconfig.json", + "dev:plugins": "concurrently \"tsc -w --preserveWatchOutput\" \"swc src -d dist --config-file .swcrc -w\" \"tsc-alias -w\"", + "lint": "eslint .", + "lint:fix": "eslint . --fix" + }, + "dependencies": { + "resend": "^6.4.2" + }, + "devDependencies": { + "@swc/cli": "^0.7.9", + "@swc/core": "^1.15.1", + "@vitnode/config": "workspace:*", + "@vitnode/core": "workspace:*", + "concurrently": "^9.2.1", + "eslint": "^9.39.1", + "tsc-alias": "^1.8.16", + "typescript": "^5.9.3" + } +} diff --git a/packages/vitnode/src/api/adapters/email/resend.ts b/packages/resend/src/index.ts similarity index 90% rename from packages/vitnode/src/api/adapters/email/resend.ts rename to packages/resend/src/index.ts index 8c2f3cf3a..9ecadf5d6 100644 --- a/packages/vitnode/src/api/adapters/email/resend.ts +++ b/packages/resend/src/index.ts @@ -1,6 +1,6 @@ -import { Resend } from "resend"; +import type { EmailApiPlugin } from "@vitnode/core/api/models/email"; -import type { EmailApiPlugin } from "@/api/models/email"; +import { Resend } from "resend"; export const ResendEmailAdapter = ({ apiKey, diff --git a/packages/resend/tsconfig.json b/packages/resend/tsconfig.json new file mode 100644 index 000000000..7593a944f --- /dev/null +++ b/packages/resend/tsconfig.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "@vitnode/config/tsconfig", + "compilerOptions": { + "target": "ESNext", + "module": "esnext", + "moduleResolution": "bundler", + "rootDir": "./", + "outDir": "./dist", + "emitDeclarationOnly": true, + "declaration": true, + "declarationMap": true, + "paths": { + "@/*": ["./src/*"] + } + }, + "exclude": ["node_modules"], + "include": ["src"] +} diff --git a/packages/vitnode/.swcrc b/packages/vitnode/.swcrc index c9903f975..eba97079c 100644 --- a/packages/vitnode/.swcrc +++ b/packages/vitnode/.swcrc @@ -1,6 +1,6 @@ { "$schema": "https://swc.rs/schema.json", - "minify": false, + "minify": true, "jsc": { "baseUrl": "./", "target": "esnext", diff --git a/packages/vitnode/eslint.config.mjs b/packages/vitnode/eslint.config.mjs index 8c0f6171d..b1ce26beb 100644 --- a/packages/vitnode/eslint.config.mjs +++ b/packages/vitnode/eslint.config.mjs @@ -1,4 +1,5 @@ import eslintVitNode from "@vitnode/config/eslint"; +import eslintVitNodeReact from "@vitnode/config/eslint.react"; import { fileURLToPath } from "node:url"; import { dirname } from "node:path"; @@ -6,6 +7,7 @@ const __dirname = dirname(fileURLToPath(import.meta.url)); export default [ ...eslintVitNode, + ...eslintVitNodeReact, { languageOptions: { parserOptions: { diff --git a/packages/vitnode/package.json b/packages/vitnode/package.json index 97d58edee..51fcf3479 100644 --- a/packages/vitnode/package.json +++ b/packages/vitnode/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/core", - "version": "1.2.0-canary.60", + "version": "1.2.0-canary.68", "description": "Core package for VitNode, providing essential functionalities and configurations.", "author": "VitNode Team", "license": "MIT", @@ -20,8 +20,8 @@ ], "peerDependencies": { "@hono/zod-openapi": "^1.0.x", - "@swc/cli": "0.6.x", - "@swc/core": "1.12.x", + "@swc/cli": "0.7.x", + "@swc/core": "1.x.x", "@types/react": "^19.1.x", "@types/react-dom": "^19.1.x", "drizzle-kit": "^0.31.x", @@ -41,29 +41,26 @@ "@hono/zod-validator": "^0.7.4", "@hookform/resolvers": "^5.2.2", "@react-email/components": "^1.0.0", - "@swc/cli": "0.6.0", - "@swc/core": "^1.13.5", + "@swc/cli": "^0.7.9", + "@swc/core": "^1.15.1", "@testing-library/dom": "^10.4.1", "@testing-library/react": "^16.3.0", "@types/node": "^24.10.0", - "@types/nodemailer": "^7.0.3", - "@types/react": "^19.2.2", + "@types/react": "^19.2.3", "@types/react-dom": "^19.2.2", "@vitejs/plugin-react": "^5.1.0", "@vitest/coverage-v8": "^4.0.8", "@vitnode/config": "workspace:*", "chokidar": "^4.0.3", "concurrently": "^9.2.1", - "dotenv": "^17.2.3", "drizzle-kit": "^0.31.6", "drizzle-orm": "^0.44.7", "eslint": "^9.39.1", - "hono": "^4.10.4", + "hono": "^4.10.5", "jsdom": "^27.1.0", "lucide-react": "^0.553.0", "next": "^16.0.1", - "next-intl": "^4.5.0", - "node-cron": "^4.2.1", + "next-intl": "^4.5.1", "react": "^19.2.0", "react-dom": "^19.2.0", "react-email": "^5.0.1", @@ -115,26 +112,25 @@ "@hono/swagger-ui": "^0.5.2", "@react-email/preview-server": "^5.0.1", "@tanstack/react-query": "^5.90.7", - "@tiptap/extension-text-align": "^3.10.4", - "@tiptap/pm": "^3.10.4", - "@tiptap/react": "^3.10.4", - "@tiptap/starter-kit": "^3.10.4", + "@tiptap/extension-text-align": "^3.10.5", + "@tiptap/pm": "^3.10.5", + "@tiptap/react": "^3.10.5", + "@tiptap/starter-kit": "^3.10.5", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "cmdk": "^1.1.1", "cron-parser": "^5.4.0", + "dotenv": "^17.2.3", "input-otp": "^1.4.2", "motion": "^12.23.24", "next-themes": "^0.4.6", - "nodemailer": "^7.0.10", "postgres": "^3.4.7", "radix-ui": "^1.4.3", "rate-limiter-flexible": "^8.2.0", "react-scan": "^0.4.3", - "resend": "^6.4.2", "tailwind-merge": "^3.4.0", "use-debounce": "^10.0.6", - "use-intl": "^4.5.0", + "use-intl": "^4.5.1", "vaul": "^1.1.2" } } diff --git a/packages/vitnode/scripts/get-config.ts b/packages/vitnode/scripts/get-config.ts index a8618c850..3de8fbed6 100644 --- a/packages/vitnode/scripts/get-config.ts +++ b/packages/vitnode/scripts/get-config.ts @@ -2,7 +2,7 @@ import { join } from "node:path"; import { pathToFileURL } from "node:url"; -import type { VitNodeApiConfig, VitNodeConfig } from "../src/vitnode.config"; +import type { VitNodeApiConfig, VitNodeConfig } from "../src/vitnode.config.js"; type ConfigType = T extends "config" ? VitNodeConfig diff --git a/packages/vitnode/scripts/plugin.ts b/packages/vitnode/scripts/plugin.ts index cc74a107f..45cf35518 100644 --- a/packages/vitnode/scripts/plugin.ts +++ b/packages/vitnode/scripts/plugin.ts @@ -18,7 +18,7 @@ import { isDirectoryEmpty, routeKey, type SourceConfig, -} from "./shared/file-utils"; +} from "./shared/file-utils.js"; /** * Helper: detect if an app path is web, api, or null diff --git a/packages/vitnode/scripts/prepare-plugins-files.ts b/packages/vitnode/scripts/prepare-plugins-files.ts index 7da8b0840..f7768bbd3 100644 --- a/packages/vitnode/scripts/prepare-plugins-files.ts +++ b/packages/vitnode/scripts/prepare-plugins-files.ts @@ -3,7 +3,7 @@ import { existsSync, readdirSync } from "node:fs"; import { readFile } from "node:fs/promises"; import { join, relative } from "node:path"; -import { getConfig } from "./get-config"; +import { getConfig } from "./get-config.js"; import { buildInitialRouteMap, copyDirectoryRecursive, @@ -11,7 +11,7 @@ import { findRepoRoot, isDirectoryEmpty, type SourceConfig, -} from "./shared/file-utils"; +} from "./shared/file-utils.js"; export const preparePluginsFiles = async (flag?: string) => { // Detect which config file to load based on flag or auto-detection diff --git a/packages/vitnode/src/api/modules/cron/helpers/process-cron-jobs.ts b/packages/vitnode/src/api/modules/cron/helpers/process-cron-jobs.ts index 6d2ef8ffd..c7916f627 100644 --- a/packages/vitnode/src/api/modules/cron/helpers/process-cron-jobs.ts +++ b/packages/vitnode/src/api/modules/cron/helpers/process-cron-jobs.ts @@ -1,12 +1,12 @@ import type { drizzle } from "drizzle-orm/postgres-js"; import { eq, inArray } from "drizzle-orm"; -import { validate } from "node-cron"; import type { CronJobConfig } from "@/api/lib/cron"; import { core_cron } from "@/database/cron"; import { shouldCronJobRun } from "@/lib/api/should-cron-job-run"; +import { validateCronSchedule } from "@/lib/api/validate-cron-schedule"; interface CronJobFromDb { createdAt: Date; @@ -82,7 +82,7 @@ export function processCronJobs( ); for (const job of cronJobs) { - if (!validate(job.schedule)) { + if (!validateCronSchedule(job.schedule)) { // eslint-disable-next-line no-console console.warn( `\x1b[34m[VitNode]\x1b[0m \x1b[33mInvalid cron schedule for job "${job.pluginId}:${job.module}:${job.name}"\x1b[0m: ${job.schedule}`, diff --git a/packages/vitnode/src/lib/api/validate-cron-schedule.test.ts b/packages/vitnode/src/lib/api/validate-cron-schedule.test.ts new file mode 100644 index 000000000..d944b6d73 --- /dev/null +++ b/packages/vitnode/src/lib/api/validate-cron-schedule.test.ts @@ -0,0 +1,171 @@ +import { describe, expect, it } from "vitest"; + +import { validateCronSchedule } from "./validate-cron-schedule"; + +describe("validateCronSchedule", () => { + describe("valid 5-field cron expressions", () => { + it("should validate wildcard expression", () => { + expect(validateCronSchedule("* * * * *")).toBe(true); + }); + + it("should validate specific time expressions", () => { + expect(validateCronSchedule("0 0 * * *")).toBe(true); // Daily at midnight + expect(validateCronSchedule("30 14 * * 1")).toBe(true); // Every Monday at 14:30 + expect(validateCronSchedule("0 0 1 * *")).toBe(true); // First day of month at midnight + expect(validateCronSchedule("0 0 1 1 *")).toBe(true); // January 1st at midnight + expect(validateCronSchedule("15 10 * * 5")).toBe(true); // Every Friday at 10:15 + }); + + it("should validate step expressions", () => { + expect(validateCronSchedule("*/5 * * * *")).toBe(true); // Every 5 minutes + expect(validateCronSchedule("*/15 * * * *")).toBe(true); // Every 15 minutes + expect(validateCronSchedule("0 */2 * * *")).toBe(true); // Every 2 hours + expect(validateCronSchedule("0 0 */3 * *")).toBe(true); // Every 3 days + expect(validateCronSchedule("0-30/5 * * * *")).toBe(true); // Every 5 minutes from 0 to 30 + }); + + it("should validate range expressions", () => { + expect(validateCronSchedule("0 9-17 * * *")).toBe(true); // Every hour from 9am to 5pm + expect(validateCronSchedule("0 0 1-15 * *")).toBe(true); // First 15 days of month + expect(validateCronSchedule("0 0 * 1-6 *")).toBe(true); // First 6 months + expect(validateCronSchedule("0 0 * * 1-5")).toBe(true); // Monday to Friday + }); + + it("should validate list expressions", () => { + expect(validateCronSchedule("0 0,12 * * *")).toBe(true); // At midnight and noon + expect(validateCronSchedule("0 0 1,15 * *")).toBe(true); // 1st and 15th of month + expect(validateCronSchedule("0 0 * * 1,3,5")).toBe(true); // Monday, Wednesday, Friday + expect(validateCronSchedule("0 9,12,15 * * *")).toBe(true); // At 9am, noon, 3pm + }); + + it("should validate complex expressions", () => { + expect(validateCronSchedule("0-30/5 9-17 * * 1-5")).toBe(true); // Every 5 minutes from 0-30, 9am-5pm, Monday-Friday + expect(validateCronSchedule("0 0,12 1,15 * *")).toBe(true); // Midnight and noon on 1st and 15th + expect(validateCronSchedule("*/10 */2 * * *")).toBe(true); // Every 10 minutes, every 2 hours + }); + + it("should validate weekday 0 and 7 (both Sunday)", () => { + expect(validateCronSchedule("0 0 * * 0")).toBe(true); // Sunday + expect(validateCronSchedule("0 0 * * 7")).toBe(true); // Sunday (alternative) + }); + + it("should validate edge cases", () => { + expect(validateCronSchedule("59 23 31 12 7")).toBe(true); // Max values + expect(validateCronSchedule("0 0 1 1 0")).toBe(true); // Min values (except minute/hour) + }); + }); + + describe("valid 6-field cron expressions (with seconds)", () => { + it("should validate wildcard expression with seconds", () => { + expect(validateCronSchedule("* * * * * *")).toBe(true); + }); + + it("should validate specific time expressions with seconds", () => { + expect(validateCronSchedule("0 0 0 * * *")).toBe(true); // Daily at midnight + expect(validateCronSchedule("30 30 14 * * 1")).toBe(true); // Every Monday at 14:30:30 + expect(validateCronSchedule("0 0 0 1 * *")).toBe(true); // First day of month at midnight + }); + + it("should validate step expressions with seconds", () => { + expect(validateCronSchedule("*/5 * * * * *")).toBe(true); // Every 5 seconds + expect(validateCronSchedule("0 */5 * * * *")).toBe(true); // Every 5 minutes + expect(validateCronSchedule("*/30 0 * * * *")).toBe(true); // Every 30 seconds at minute 0 + }); + + it("should validate range expressions with seconds", () => { + expect(validateCronSchedule("0-30 0 9-17 * * *")).toBe(true); // Seconds 0-30, minute 0, 9am-5pm + }); + + it("should validate list expressions with seconds", () => { + expect(validateCronSchedule("0,30 0 0,12 * * *")).toBe(true); // At 0 and 30 seconds, midnight and noon + }); + }); + + describe("invalid cron expressions", () => { + it("should reject empty or non-string input", () => { + expect(validateCronSchedule("")).toBe(false); + expect(validateCronSchedule(" ")).toBe(false); + // @ts-expect-error - Testing invalid input + expect(validateCronSchedule(null)).toBe(false); + // @ts-expect-error - Testing invalid input + expect(validateCronSchedule(undefined)).toBe(false); + // @ts-expect-error - Testing invalid input + expect(validateCronSchedule(123)).toBe(false); + }); + + it("should reject wrong number of fields", () => { + expect(validateCronSchedule("* * *")).toBe(false); // Too few + expect(validateCronSchedule("* * * *")).toBe(false); // Too few + expect(validateCronSchedule("* * * * * * *")).toBe(false); // Too many + expect(validateCronSchedule("* * * * * * * *")).toBe(false); // Too many + }); + + it("should reject invalid characters", () => { + expect(validateCronSchedule("a * * * *")).toBe(false); + expect(validateCronSchedule("* b * * *")).toBe(false); + expect(validateCronSchedule("* * c * *")).toBe(false); + expect(validateCronSchedule("@ # $ % ^")).toBe(false); + expect(validateCronSchedule("invalid cron")).toBe(false); + }); + + it("should reject out-of-range values", () => { + expect(validateCronSchedule("60 * * * *")).toBe(false); // Minute > 59 + expect(validateCronSchedule("* 24 * * *")).toBe(false); // Hour > 23 + expect(validateCronSchedule("* * 32 * *")).toBe(false); // Day > 31 + expect(validateCronSchedule("* * 0 * *")).toBe(false); // Day < 1 + expect(validateCronSchedule("* * * 13 *")).toBe(false); // Month > 12 + expect(validateCronSchedule("* * * 0 *")).toBe(false); // Month < 1 + expect(validateCronSchedule("* * * * 8")).toBe(false); // Weekday > 7 + expect(validateCronSchedule("-1 * * * *")).toBe(false); // Negative minute + }); + + it("should reject out-of-range values in 6-field format", () => { + expect(validateCronSchedule("60 * * * * *")).toBe(false); // Second > 59 + expect(validateCronSchedule("-1 * * * * *")).toBe(false); // Negative second + }); + + it("should reject invalid ranges", () => { + expect(validateCronSchedule("10-5 * * * *")).toBe(false); // Start > end + expect(validateCronSchedule("* 20-10 * * *")).toBe(false); // Start > end + expect(validateCronSchedule("* * 60-70 * *")).toBe(false); // Out of range + expect(validateCronSchedule("0-60 * * * *")).toBe(false); // End out of range + }); + + it("should reject invalid steps", () => { + expect(validateCronSchedule("*/0 * * * *")).toBe(false); // Step of 0 + expect(validateCronSchedule("*/-1 * * * *")).toBe(false); // Negative step + expect(validateCronSchedule("*/60 * * * *")).toBe(false); // Step > max + expect(validateCronSchedule("*/abc * * * *")).toBe(false); // Non-numeric step + expect(validateCronSchedule("* */25 * * *")).toBe(false); // Step > max for hour + }); + + it("should reject invalid lists", () => { + expect(validateCronSchedule("0,60 * * * *")).toBe(false); // Out of range in list + expect(validateCronSchedule("* 0,24 * * *")).toBe(false); // Out of range in list + expect(validateCronSchedule("a,b,c * * * *")).toBe(false); // Non-numeric list + expect(validateCronSchedule(",, * * * *")).toBe(false); // Empty list items + }); + + it("should reject malformed expressions", () => { + expect(validateCronSchedule("1--5 * * * *")).toBe(false); // Double dash + expect(validateCronSchedule("1//5 * * * *")).toBe(false); // Double slash + expect(validateCronSchedule("1- * * * *")).toBe(false); // Incomplete range + expect(validateCronSchedule("-5 * * * *")).toBe(false); // Invalid start + expect(validateCronSchedule("1/ * * * *")).toBe(false); // Incomplete step + expect(validateCronSchedule("/5 * * * *")).toBe(false); // Missing base for step + }); + }); + + describe("edge cases", () => { + it("should handle extra whitespace", () => { + expect(validateCronSchedule(" * * * * * ")).toBe(true); + expect(validateCronSchedule("0 0 * * *")).toBe(true); + }); + + it("should reject mixed valid and invalid fields", () => { + expect(validateCronSchedule("0 0 * * invalid")).toBe(false); + expect(validateCronSchedule("0 25 * * *")).toBe(false); // Invalid hour + expect(validateCronSchedule("* * * * * 60")).toBe(false); // Invalid second in 6-field + }); + }); +}); diff --git a/packages/vitnode/src/lib/api/validate-cron-schedule.ts b/packages/vitnode/src/lib/api/validate-cron-schedule.ts new file mode 100644 index 000000000..d0655bb5c --- /dev/null +++ b/packages/vitnode/src/lib/api/validate-cron-schedule.ts @@ -0,0 +1,128 @@ +/** + * Validates a cron schedule expression + * Supports standard cron format: minute hour day month weekday + * Also supports extended format with seconds (6 fields): second minute hour day month weekday + * + * @param schedule - The cron schedule string to validate + * @returns true if the schedule is valid, false otherwise + * + * @example + * ```typescript + * validateCronSchedule("0 0 * * *") // true - runs at midnight every day + * validateCronSchedule("*\/5 * * * *") // true - runs every 5 minutes + * validateCronSchedule("0 0 1 * *") // true - runs at midnight on the first day of each month + * validateCronSchedule("invalid") // false + * ``` + */ +export function validateCronSchedule(schedule: string): boolean { + if (!schedule || typeof schedule !== "string") { + return false; + } + + const trimmedSchedule = schedule.trim(); + if (!trimmedSchedule) { + return false; + } + + const parts = trimmedSchedule.split(/\s+/); + + // Support both 5-field (minute hour day month weekday) and 6-field (second minute hour day month weekday) formats + if (parts.length !== 5 && parts.length !== 6) { + return false; + } + + // Define field configurations + const fieldConfigs = + parts.length === 6 + ? [ + { name: "second", min: 0, max: 59 }, + { name: "minute", min: 0, max: 59 }, + { name: "hour", min: 0, max: 23 }, + { name: "day", min: 1, max: 31 }, + { name: "month", min: 1, max: 12 }, + { name: "weekday", min: 0, max: 7 }, // 0 and 7 both represent Sunday + ] + : [ + { name: "minute", min: 0, max: 59 }, + { name: "hour", min: 0, max: 23 }, + { name: "day", min: 1, max: 31 }, + { name: "month", min: 1, max: 12 }, + { name: "weekday", min: 0, max: 7 }, // 0 and 7 both represent Sunday + ]; + + // Validate each field + for (let i = 0; i < parts.length; i++) { + const part = parts[i]; + const config = fieldConfigs[i]; + + if (!validateCronField(part, config.min, config.max)) { + return false; + } + } + + return true; +} + +/** + * Validates a single cron field + * Supports: asterisk, numbers, ranges (1-5), steps (star/5, 1-10/2), and lists (1,2,3) + */ +function validateCronField(field: string, min: number, max: number): boolean { + if (field === "*") { + return true; + } + + // Handle lists (e.g., "1,2,3,5") + if (field.includes(",")) { + const listItems = field.split(","); + + return listItems.every(item => validateCronField(item.trim(), min, max)); + } + + // Handle steps (e.g., "*/5" or "1-10/2") + if (field.includes("/")) { + const [range, step] = field.split("/"); + const stepNum = parseInt(step, 10); + + if (isNaN(stepNum) || stepNum <= 0 || stepNum > max) { + return false; + } + + // If range is "*", it's valid + if (range === "*") { + return true; + } + + // Otherwise, validate the range part + return validateCronField(range, min, max); + } + + // Handle ranges (e.g., "1-5") + if (field.includes("-")) { + const [start, end] = field.split("-"); + const startNum = parseInt(start, 10); + const endNum = parseInt(end, 10); + + if ( + isNaN(startNum) || + isNaN(endNum) || + startNum < min || + startNum > max || + endNum < min || + endNum > max || + startNum > endNum + ) { + return false; + } + + return true; + } + + // Handle single numbers + const num = parseInt(field, 10); + if (isNaN(num) || num < min || num > max) { + return false; + } + + return true; +} diff --git a/packages/vitnode/tsconfig.json b/packages/vitnode/tsconfig.json index ad865484f..de0976d61 100644 --- a/packages/vitnode/tsconfig.json +++ b/packages/vitnode/tsconfig.json @@ -8,7 +8,7 @@ "rootDir": "./", "outDir": "./dist", "jsx": "react-jsx", - "emitDeclarationOnly": true, + "emitDeclarationOnly": false, "declaration": true, "declarationMap": true, "plugins": [ diff --git a/packages/vitnode/vitest.config.ts b/packages/vitnode/vitest.config.ts index 3a3574d48..237c1132e 100644 --- a/packages/vitnode/vitest.config.ts +++ b/packages/vitnode/vitest.config.ts @@ -9,6 +9,20 @@ export default defineConfig({ globals: true, environment: "jsdom", setupFiles: ["./src/tests/setup.ts"], + exclude: [ + "**/node_modules/**", + "**/dist/**", + "**/build/**", + "**/.next/**", + "**/.turbo/**", + "**/coverage/**", + "**/src/tests/**", // Assuming setup files aren't tests + "**/src/emails/**", + "**/config/**", + "**/scripts/**", + "**/*.config.*", + "**/*.d.ts", + ], coverage: { provider: "v8", reporter: ["text", "json", "html"], diff --git a/plugins/blog/eslint.config.mjs b/plugins/blog/eslint.config.mjs index 8c0f6171d..b1ce26beb 100644 --- a/plugins/blog/eslint.config.mjs +++ b/plugins/blog/eslint.config.mjs @@ -1,4 +1,5 @@ import eslintVitNode from "@vitnode/config/eslint"; +import eslintVitNodeReact from "@vitnode/config/eslint.react"; import { fileURLToPath } from "node:url"; import { dirname } from "node:path"; @@ -6,6 +7,7 @@ const __dirname = dirname(fileURLToPath(import.meta.url)); export default [ ...eslintVitNode, + ...eslintVitNodeReact, { languageOptions: { parserOptions: { diff --git a/plugins/blog/package.json b/plugins/blog/package.json index e56bb0252..fb4d340ae 100644 --- a/plugins/blog/package.json +++ b/plugins/blog/package.json @@ -1,6 +1,6 @@ { "name": "@vitnode/blog", - "version": "1.2.0-canary.60", + "version": "1.2.0-canary.68", "description": "Blog plugin for VitNode, providing a blogging platform with Next.js and Hono.js.", "author": "VitNode Team", "license": "MIT", @@ -38,23 +38,23 @@ "@vitnode/core": "workspace:*", "drizzle-kit": "^0.31.6", "drizzle-orm": "^0.44.7", - "hono": "^4.10.4", + "hono": "^4.10.5", "lucide-react": "^0.553.0", "next": "^16.0.1", - "next-intl": "^4.5.0", + "next-intl": "^4.5.1", "react": "^19.2.0", "react-dom": "^19.2.0", "react-email": "^5.0.1", "react-hook-form": "^7.66.0", "sonner": "^2.0.7", - "use-intl": "^4.5.0", + "use-intl": "^4.5.1", "zod": "^4.1.12" }, "devDependencies": { "@react-email/components": "^1.0.0", - "@swc/cli": "0.6.0", + "@swc/cli": "^0.7.9", "@swc/core": "^1.15.1", - "@types/react": "^19.2.2", + "@types/react": "^19.2.3", "@types/react-dom": "^19.2.2", "@vitnode/config": "workspace:*", "concurrently": "^9.2.1", diff --git a/plugins/blog/src/api/modules/categories/test.route.ts b/plugins/blog/src/api/modules/categories/test.route.ts index d3260901b..be8151267 100644 --- a/plugins/blog/src/api/modules/categories/test.route.ts +++ b/plugins/blog/src/api/modules/categories/test.route.ts @@ -32,7 +32,7 @@ export const testRoute = buildRoute({ }, handler: async c => { const user = await new UserModel().getUserById({ - id: 3, + id: 2, c, }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 81059afa8..9aee26b08 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -24,8 +24,8 @@ importers: specifier: ^4.20.6 version: 4.20.6 turbo: - specifier: ^2.6.0 - version: 2.6.0 + specifier: ^2.6.1 + version: 2.6.1 typescript: specifier: ^5.9.3 version: 5.9.3 @@ -37,10 +37,10 @@ importers: dependencies: '@hono/zod-openapi': specifier: ^1.1.4 - version: 1.1.4(hono@4.10.4)(zod@4.1.12) + version: 1.1.4(hono@4.10.5)(zod@4.1.12) '@hono/zod-validator': specifier: ^0.7.4 - version: 0.7.4(hono@4.10.4)(zod@4.1.12) + version: 0.7.4(hono@4.10.5)(zod@4.1.12) '@vitnode/core': specifier: workspace:* version: link:../../packages/vitnode @@ -51,11 +51,11 @@ importers: specifier: ^0.44.7 version: 0.44.7(@neondatabase/serverless@0.10.4)(@types/pg@8.11.10)(gel@2.1.0)(pg@8.13.1)(postgres@3.4.7) hono: - specifier: ^4.10.4 - version: 4.10.4 + specifier: ^4.10.5 + version: 4.10.5 next-intl: - specifier: ^4.5.0 - version: 4.5.0(next@16.0.1(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + specifier: ^4.5.1 + version: 4.5.1(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.9.3) react: specifier: ^19.2.0 version: 19.2.0 @@ -63,15 +63,15 @@ importers: specifier: ^19.2.0 version: 19.2.0(react@19.2.0) use-intl: - specifier: ^4.5.0 - version: 4.5.0(react@19.2.0) + specifier: ^4.5.1 + version: 4.5.1(react@19.2.0) zod: specifier: ^4.1.12 version: 4.1.12 devDependencies: '@hono/node-server': specifier: ^1.19.6 - version: 1.19.6(hono@4.10.4) + version: 1.19.6(hono@4.10.5) '@react-email/components': specifier: ^1.0.0 version: 1.0.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -79,14 +79,17 @@ importers: specifier: ^24.10.0 version: 24.10.0 '@types/react': - specifier: ^19.2.2 - version: 19.2.2 + specifier: ^19.2.3 + version: 19.2.3 '@types/react-dom': specifier: ^19.2.2 - version: 19.2.2(@types/react@19.2.2) + version: 19.2.2(@types/react@19.2.3) '@vitnode/config': specifier: workspace:* version: link:../../packages/config + '@vitnode/nodemailer': + specifier: workspace:* + version: link:../../packages/nodemailer dotenv: specifier: ^17.2.3 version: 17.2.3 @@ -110,10 +113,10 @@ importers: dependencies: '@hono/zod-openapi': specifier: ^1.1.4 - version: 1.1.4(hono@4.10.4)(zod@4.1.12) + version: 1.1.4(hono@4.10.5)(zod@4.1.12) '@hono/zod-validator': specifier: ^0.7.4 - version: 0.7.4(hono@4.10.4)(zod@4.1.12) + version: 0.7.4(hono@4.10.5)(zod@4.1.12) '@vitnode/blog': specifier: workspace:* version: link:../../plugins/blog @@ -127,17 +130,17 @@ importers: specifier: ^0.44.7 version: 0.44.7(@neondatabase/serverless@0.10.4)(@types/pg@8.11.10)(gel@2.1.0)(pg@8.13.1)(postgres@3.4.7) fumadocs-core: - specifier: ^16.0.8 - version: 16.0.8(@types/react@19.2.2)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + specifier: ^16.0.10 + version: 16.0.10(@types/react@19.2.3)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) fumadocs-mdx: - specifier: ^13.0.5 - version: 13.0.5(fumadocs-core@16.0.8(@types/react@19.2.2)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) + specifier: ^13.0.7 + version: 13.0.7(fumadocs-core@16.0.10(@types/react@19.2.3)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) fumadocs-ui: - specifier: ^16.0.8 - version: 16.0.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(tailwindcss@4.1.17) + specifier: ^16.0.10 + version: 16.0.10(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(tailwindcss@4.1.17) hono: - specifier: ^4.10.4 - version: 4.10.4 + specifier: ^4.10.5 + version: 4.10.5 lucide-react: specifier: ^0.553.0 version: 0.553.0(react@19.2.0) @@ -146,10 +149,10 @@ importers: version: 12.23.24(react-dom@19.2.0(react@19.2.0))(react@19.2.0) next: specifier: ^16.0.1 - version: 16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) next-intl: - specifier: ^4.5.0 - version: 4.5.0(next@16.0.1(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + specifier: ^4.5.1 + version: 4.5.1(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.9.3) node-cron: specifier: ^4.2.1 version: 4.2.1 @@ -188,14 +191,26 @@ importers: specifier: ^24.10.0 version: 24.10.0 '@types/react': - specifier: ^19.2.2 - version: 19.2.2 + specifier: ^19.2.3 + version: 19.2.3 '@types/react-dom': specifier: ^19.2.2 - version: 19.2.2(@types/react@19.2.2) + version: 19.2.2(@types/react@19.2.3) '@vitnode/config': specifier: workspace:* version: link:../../packages/config + '@vitnode/node-cron': + specifier: workspace:* + version: link:../../packages/node-cron + '@vitnode/nodemailer': + specifier: workspace:* + version: link:../../packages/nodemailer + '@vitnode/resend': + specifier: workspace:* + version: link:../../packages/resend + babel-plugin-react-compiler: + specifier: ^1.0.0 + version: 1.0.0 class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -221,8 +236,8 @@ importers: specifier: ^5.9.3 version: 5.9.3 use-intl: - specifier: ^4.5.0 - version: 4.5.0(react@19.2.0) + specifier: ^4.5.1 + version: 4.5.1(react@19.2.0) zod: specifier: ^4.1.12 version: 4.1.12 @@ -230,8 +245,8 @@ importers: packages/config: dependencies: '@eslint-react/eslint-plugin': - specifier: ^2.3.1 - version: 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + specifier: ^2.3.4 + version: 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@eslint/js': specifier: ^9.39.1 version: 9.39.1 @@ -266,8 +281,8 @@ importers: specifier: ^0.7.1 version: 0.7.1(prettier@3.6.2) typescript-eslint: - specifier: ^8.46.3 - version: 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + specifier: ^8.46.4 + version: 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) devDependencies: typescript: specifier: ^5.9.3 @@ -310,6 +325,102 @@ importers: specifier: ^5.9.3 version: 5.9.3 + packages/node-cron: + dependencies: + node-cron: + specifier: ^4.2.1 + version: 4.2.1 + devDependencies: + '@swc/cli': + specifier: ^0.7.9 + version: 0.7.9(@swc/core@1.15.1)(chokidar@4.0.3) + '@swc/core': + specifier: ^1.15.1 + version: 1.15.1 + '@vitnode/config': + specifier: workspace:* + version: link:../config + '@vitnode/core': + specifier: workspace:* + version: link:../vitnode + concurrently: + specifier: ^9.2.1 + version: 9.2.1 + eslint: + specifier: ^9.39.1 + version: 9.39.1(jiti@2.6.1) + tsc-alias: + specifier: ^1.8.16 + version: 1.8.16 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + + packages/nodemailer: + dependencies: + nodemailer: + specifier: ^7.0.10 + version: 7.0.10 + devDependencies: + '@swc/cli': + specifier: ^0.7.9 + version: 0.7.9(@swc/core@1.15.1)(chokidar@4.0.3) + '@swc/core': + specifier: ^1.15.1 + version: 1.15.1 + '@types/nodemailer': + specifier: ^7.0.3 + version: 7.0.3 + '@vitnode/config': + specifier: workspace:* + version: link:../config + '@vitnode/core': + specifier: workspace:* + version: link:../vitnode + concurrently: + specifier: ^9.2.1 + version: 9.2.1 + eslint: + specifier: ^9.39.1 + version: 9.39.1(jiti@2.6.1) + tsc-alias: + specifier: ^1.8.16 + version: 1.8.16 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + + packages/resend: + dependencies: + resend: + specifier: ^6.4.2 + version: 6.4.2(@react-email/render@2.0.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)) + devDependencies: + '@swc/cli': + specifier: ^0.7.9 + version: 0.7.9(@swc/core@1.15.1)(chokidar@4.0.3) + '@swc/core': + specifier: ^1.15.1 + version: 1.15.1 + '@vitnode/config': + specifier: workspace:* + version: link:../config + '@vitnode/core': + specifier: workspace:* + version: link:../vitnode + concurrently: + specifier: ^9.2.1 + version: 9.2.1 + eslint: + specifier: ^9.39.1 + version: 9.39.1(jiti@2.6.1) + tsc-alias: + specifier: ^1.8.16 + version: 1.8.16 + typescript: + specifier: ^5.9.3 + version: 5.9.3 + packages/vitnode: dependencies: '@dnd-kit/core': @@ -317,25 +428,25 @@ importers: version: 6.3.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@hono/swagger-ui': specifier: ^0.5.2 - version: 0.5.2(hono@4.10.4) + version: 0.5.2(hono@4.10.5) '@react-email/preview-server': specifier: ^5.0.1 - version: 5.0.1(@playwright/test@1.56.1)(@react-email/body@0.2.0(react@19.2.0))(@react-email/button@0.2.0(react@19.2.0))(@react-email/code-block@0.2.0(react@19.2.0))(@react-email/code-inline@0.0.5(react@19.2.0))(@react-email/container@0.0.15(react@19.2.0))(@react-email/heading@0.0.15(react@19.2.0))(@react-email/hr@0.0.11(react@19.2.0))(@react-email/img@0.0.11(react@19.2.0))(@react-email/link@0.0.12(react@19.2.0))(@react-email/preview@0.0.13(react@19.2.0))(@react-email/render@2.0.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@react-email/text@0.1.5(react@19.2.0))(@swc/core@1.15.1)(postcss@8.5.6) + version: 5.0.1(@playwright/test@1.56.1)(@react-email/body@0.2.0(react@19.2.0))(@react-email/button@0.2.0(react@19.2.0))(@react-email/code-block@0.2.0(react@19.2.0))(@react-email/code-inline@0.0.5(react@19.2.0))(@react-email/container@0.0.15(react@19.2.0))(@react-email/heading@0.0.15(react@19.2.0))(@react-email/hr@0.0.11(react@19.2.0))(@react-email/img@0.0.11(react@19.2.0))(@react-email/link@0.0.12(react@19.2.0))(@react-email/preview@0.0.13(react@19.2.0))(@react-email/render@2.0.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@react-email/text@0.1.5(react@19.2.0))(@swc/core@1.15.1)(babel-plugin-react-compiler@1.0.0)(postcss@8.5.6) '@tanstack/react-query': specifier: ^5.90.7 version: 5.90.7(react@19.2.0) '@tiptap/extension-text-align': - specifier: ^3.10.4 - version: 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4)) + specifier: ^3.10.5 + version: 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5)) '@tiptap/pm': - specifier: ^3.10.4 - version: 3.10.4 + specifier: ^3.10.5 + version: 3.10.5 '@tiptap/react': - specifier: ^3.10.4 - version: 3.10.4(@floating-ui/dom@1.7.4)(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4)(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + specifier: ^3.10.5 + version: 3.10.5(@floating-ui/dom@1.7.4)(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5)(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@tiptap/starter-kit': - specifier: ^3.10.4 - version: 3.10.4 + specifier: ^3.10.5 + version: 3.10.5 class-variance-authority: specifier: ^0.7.1 version: 0.7.1 @@ -344,10 +455,13 @@ importers: version: 2.1.1 cmdk: specifier: ^1.1.1 - version: 1.1.1(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 1.1.1(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) cron-parser: specifier: ^5.4.0 version: 5.4.0 + dotenv: + specifier: ^17.2.3 + version: 17.2.3 input-otp: specifier: ^1.4.2 version: 1.4.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) @@ -357,24 +471,18 @@ importers: next-themes: specifier: ^0.4.6 version: 0.4.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - nodemailer: - specifier: ^7.0.10 - version: 7.0.10 postgres: specifier: ^3.4.7 version: 3.4.7 radix-ui: specifier: ^1.4.3 - version: 1.4.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 1.4.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) rate-limiter-flexible: specifier: ^8.2.0 version: 8.2.0 react-scan: specifier: ^0.4.3 - version: 0.4.3(@types/react@19.2.2)(next@16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(rollup@4.53.1) - resend: - specifier: ^6.4.2 - version: 6.4.2(@react-email/render@2.0.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0)) + version: 0.4.3(@types/react@19.2.3)(next@16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(rollup@4.53.2) tailwind-merge: specifier: ^3.4.0 version: 3.4.0 @@ -382,18 +490,18 @@ importers: specifier: ^10.0.6 version: 10.0.6(react@19.2.0) use-intl: - specifier: ^4.5.0 - version: 4.5.0(react@19.2.0) + specifier: ^4.5.1 + version: 4.5.1(react@19.2.0) vaul: specifier: ^1.1.2 - version: 1.1.2(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 1.1.2(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) devDependencies: '@hono/zod-openapi': specifier: ^1.1.4 - version: 1.1.4(hono@4.10.4)(zod@4.1.12) + version: 1.1.4(hono@4.10.5)(zod@4.1.12) '@hono/zod-validator': specifier: ^0.7.4 - version: 0.7.4(hono@4.10.4)(zod@4.1.12) + version: 0.7.4(hono@4.10.5)(zod@4.1.12) '@hookform/resolvers': specifier: ^5.2.2 version: 5.2.2(react-hook-form@7.66.0(react@19.2.0)) @@ -401,29 +509,26 @@ importers: specifier: ^1.0.0 version: 1.0.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@swc/cli': - specifier: 0.6.0 - version: 0.6.0(@swc/core@1.15.1)(chokidar@4.0.3) + specifier: ^0.7.9 + version: 0.7.9(@swc/core@1.15.1)(chokidar@4.0.3) '@swc/core': - specifier: ^1.13.5 + specifier: ^1.15.1 version: 1.15.1 '@testing-library/dom': specifier: ^10.4.1 version: 10.4.1 '@testing-library/react': specifier: ^16.3.0 - version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@types/node': specifier: ^24.10.0 version: 24.10.0 - '@types/nodemailer': - specifier: ^7.0.3 - version: 7.0.3 '@types/react': - specifier: ^19.2.2 - version: 19.2.2 + specifier: ^19.2.3 + version: 19.2.3 '@types/react-dom': specifier: ^19.2.2 - version: 19.2.2(@types/react@19.2.2) + version: 19.2.2(@types/react@19.2.3) '@vitejs/plugin-react': specifier: ^5.1.0 version: 5.1.0(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)) @@ -439,9 +544,6 @@ importers: concurrently: specifier: ^9.2.1 version: 9.2.1 - dotenv: - specifier: ^17.2.3 - version: 17.2.3 drizzle-kit: specifier: ^0.31.6 version: 0.31.6 @@ -452,8 +554,8 @@ importers: specifier: ^9.39.1 version: 9.39.1(jiti@2.6.1) hono: - specifier: ^4.10.4 - version: 4.10.4 + specifier: ^4.10.5 + version: 4.10.5 jsdom: specifier: ^27.1.0 version: 27.1.0 @@ -462,13 +564,10 @@ importers: version: 0.553.0(react@19.2.0) next: specifier: ^16.0.1 - version: 16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) next-intl: - specifier: ^4.5.0 - version: 4.5.0(next@16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.9.3) - node-cron: - specifier: ^4.2.1 - version: 4.2.1 + specifier: ^4.5.1 + version: 4.5.1(next@16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.9.3) react: specifier: ^19.2.0 version: 19.2.0 @@ -516,7 +615,7 @@ importers: dependencies: '@hono/zod-openapi': specifier: ^1.1.4 - version: 1.1.4(hono@4.10.4)(zod@4.1.12) + version: 1.1.4(hono@4.10.5)(zod@4.1.12) '@vitnode/core': specifier: workspace:* version: link:../../packages/vitnode @@ -527,17 +626,17 @@ importers: specifier: ^0.44.7 version: 0.44.7(@neondatabase/serverless@0.10.4)(@types/pg@8.11.10)(gel@2.1.0)(pg@8.13.1)(postgres@3.4.7) hono: - specifier: ^4.10.4 - version: 4.10.4 + specifier: ^4.10.5 + version: 4.10.5 lucide-react: specifier: ^0.553.0 version: 0.553.0(react@19.2.0) next: specifier: ^16.0.1 - version: 16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) next-intl: - specifier: ^4.5.0 - version: 4.5.0(next@16.0.1(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + specifier: ^4.5.1 + version: 4.5.1(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.9.3) react: specifier: ^19.2.0 version: 19.2.0 @@ -554,8 +653,8 @@ importers: specifier: ^2.0.7 version: 2.0.7(react-dom@19.2.0(react@19.2.0))(react@19.2.0) use-intl: - specifier: ^4.5.0 - version: 4.5.0(react@19.2.0) + specifier: ^4.5.1 + version: 4.5.1(react@19.2.0) zod: specifier: ^4.1.12 version: 4.1.12 @@ -564,17 +663,17 @@ importers: specifier: ^1.0.0 version: 1.0.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@swc/cli': - specifier: 0.6.0 - version: 0.6.0(@swc/core@1.15.1)(chokidar@4.0.3) + specifier: ^0.7.9 + version: 0.7.9(@swc/core@1.15.1)(chokidar@4.0.3) '@swc/core': specifier: ^1.15.1 version: 1.15.1 '@types/react': - specifier: ^19.2.2 - version: 19.2.2 + specifier: ^19.2.3 + version: 19.2.3 '@types/react-dom': specifier: ^19.2.2 - version: 19.2.2(@types/react@19.2.2) + version: 19.2.2(@types/react@19.2.3) '@vitnode/config': specifier: workspace:* version: link:../../packages/config @@ -880,8 +979,8 @@ packages: peerDependencies: '@csstools/css-tokenizer': ^3.0.4 - '@csstools/css-syntax-patches-for-csstree@1.0.15': - resolution: {integrity: sha512-q0p6zkVq2lJnmzZVPR33doA51G7YOja+FBvRdp5ISIthL0MtFCgYHHhR563z9WFGxcOn0WfjSkPDJ5Qig3H3Sw==} + '@csstools/css-syntax-patches-for-csstree@1.0.16': + resolution: {integrity: sha512-2SpS4/UaWQaGpBINyG5ZuCHnUDeVByOhvbkARwfmnfxDvTaj80yOI1cD8Tw93ICV5Fx4fnyDKWQZI1CDtcWyUg==} engines: {node: '>=18'} '@csstools/css-tokenizer@3.0.4': @@ -1376,31 +1475,31 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint-react/ast@2.3.1': - resolution: {integrity: sha512-jB/P72HVbZcC7DtUvjna8tjPSageAS6L9x5muMsBRQxEXkfv2J6CPX47sSpaPu1mMJn1Zzpn9m5z4aTPbfV6Ug==} + '@eslint-react/ast@2.3.4': + resolution: {integrity: sha512-wueu2vBRwKqnrgOuz1JmEefhn5dgfa1NgvFtDMfefePfICTYFtwkTuOJNGJI77TUnqV9inp9ZNDB1nyAMmlZMg==} engines: {node: '>=20.19.0'} - '@eslint-react/core@2.3.1': - resolution: {integrity: sha512-R0gXjIqHqqYSeHxNMbXblnlwzmZ2gD32aVPmrJB+SrLP0rItzo/WgVSvstjOK5+N5KExdM87hopFcqnlZS3ONg==} + '@eslint-react/core@2.3.4': + resolution: {integrity: sha512-1ve3pSjAhd4PKcTpZd0bQwkAgWOAJjfgAixTfOvJ7QhWi3gPKq0Wn0vi78XcFO8K0IL3EcOfX2g2JhZJzSRnWQ==} engines: {node: '>=20.19.0'} - '@eslint-react/eff@2.3.1': - resolution: {integrity: sha512-k58lxHmhzatRZXVFzWdLZwfRwPgI5Thhf7BNVJ9F+NI2G1fFypclSVFRPqjGmI5jQ8bqB+5UVt9Rh49rZGZPzw==} + '@eslint-react/eff@2.3.4': + resolution: {integrity: sha512-/SXI23DpQCutSXPdAPdSvErfsBFYwaqbgQy5dLmnde4wHivk/eD9O/rA/Xu1c4j9tLJG/sZBQ9DzN/UXHizjag==} engines: {node: '>=20.19.0'} - '@eslint-react/eslint-plugin@2.3.1': - resolution: {integrity: sha512-ThWx+AWI3Tl/6g+L1Cq/kTQrrZ4NXWMxRN92iBswYMW7bPaolh/8WBdiLAVZldqnlm+l6LZriia89jyr0CeTHA==} + '@eslint-react/eslint-plugin@2.3.4': + resolution: {integrity: sha512-fcLZNQRbzjBK510a2oqLcsvdCSMK169x3CGfi1E3JvdMPyLICM+KZ8wNnhULZPey7BnEFVWC7dQfz5Dct60C7g==} engines: {node: '>=20.19.0'} peerDependencies: eslint: ^9.38.0 typescript: ^5.9.3 - '@eslint-react/shared@2.3.1': - resolution: {integrity: sha512-UiTbPi1i7UPdsIT2Z7mKZ3zzrgAm1GLeexkKe4QwvZJ1LLeEJmgMwHUw852+VzlDeV8stcQmZ9zWqFX2L0CmGg==} + '@eslint-react/shared@2.3.4': + resolution: {integrity: sha512-FN3X4jA0kksFO9cjXwRaFHA6wbc7AgHjYkczdfwm0dOr/uUVv3Sc/F3kUNJ6KFOSoDCfNGybRCICu9DZbanhWA==} engines: {node: '>=20.19.0'} - '@eslint-react/var@2.3.1': - resolution: {integrity: sha512-1rC9dbuKKMq77pPoODGT91VTA3ReivIAfdFJePEjscPSRAUhCy7QPA/yK8MPe9nTsG89IDV+hilCGKiLZW8vNQ==} + '@eslint-react/var@2.3.4': + resolution: {integrity: sha512-hT2TvusBcEfFLFGfwZRstkQv9lp+079DEba5F6Dr53g3f+gBvLNDcayb5zDgwNP5+hQRd8lY8goEOfA8PWyaJQ==} engines: {node: '>=20.19.0'} '@eslint/config-array@0.21.1': @@ -3046,113 +3145,113 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.53.1': - resolution: {integrity: sha512-bxZtughE4VNVJlL1RdoSE545kc4JxL7op57KKoi59/gwuU5rV6jLWFXXc8jwgFoT6vtj+ZjO+Z2C5nrY0Cl6wA==} + '@rollup/rollup-android-arm-eabi@4.53.2': + resolution: {integrity: sha512-yDPzwsgiFO26RJA4nZo8I+xqzh7sJTZIWQOxn+/XOdPE31lAvLIYCKqjV+lNH/vxE2L2iH3plKxDCRK6i+CwhA==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.53.1': - resolution: {integrity: sha512-44a1hreb02cAAfAKmZfXVercPFaDjqXCK+iKeVOlJ9ltvnO6QqsBHgKVPTu+MJHSLLeMEUbeG2qiDYgbFPU48g==} + '@rollup/rollup-android-arm64@4.53.2': + resolution: {integrity: sha512-k8FontTxIE7b0/OGKeSN5B6j25EuppBcWM33Z19JoVT7UTXFSo3D9CdU39wGTeb29NO3XxpMNauh09B+Ibw+9g==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.53.1': - resolution: {integrity: sha512-usmzIgD0rf1syoOZ2WZvy8YpXK5G1V3btm3QZddoGSa6mOgfXWkkv+642bfUUldomgrbiLQGrPryb7DXLovPWQ==} + '@rollup/rollup-darwin-arm64@4.53.2': + resolution: {integrity: sha512-A6s4gJpomNBtJ2yioj8bflM2oogDwzUiMl2yNJ2v9E7++sHrSrsQ29fOfn5DM/iCzpWcebNYEdXpaK4tr2RhfQ==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.53.1': - resolution: {integrity: sha512-is3r/k4vig2Gt8mKtTlzzyaSQ+hd87kDxiN3uDSDwggJLUV56Umli6OoL+/YZa/KvtdrdyNfMKHzL/P4siOOmg==} + '@rollup/rollup-darwin-x64@4.53.2': + resolution: {integrity: sha512-e6XqVmXlHrBlG56obu9gDRPW3O3hLxpwHpLsBJvuI8qqnsrtSZ9ERoWUXtPOkY8c78WghyPHZdmPhHLWNdAGEw==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.53.1': - resolution: {integrity: sha512-QJ1ksgp/bDJkZB4daldVmHaEQkG4r8PUXitCOC2WRmRaSaHx5RwPoI3DHVfXKwDkB+Sk6auFI/+JHacTekPRSw==} + '@rollup/rollup-freebsd-arm64@4.53.2': + resolution: {integrity: sha512-v0E9lJW8VsrwPux5Qe5CwmH/CF/2mQs6xU1MF3nmUxmZUCHazCjLgYvToOk+YuuUqLQBio1qkkREhxhc656ViA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.53.1': - resolution: {integrity: sha512-J6ma5xgAzvqsnU6a0+jgGX/gvoGokqpkx6zY4cWizRrm0ffhHDpJKQgC8dtDb3+MqfZDIqs64REbfHDMzxLMqQ==} + '@rollup/rollup-freebsd-x64@4.53.2': + resolution: {integrity: sha512-ClAmAPx3ZCHtp6ysl4XEhWU69GUB1D+s7G9YjHGhIGCSrsg00nEGRRZHmINYxkdoJehde8VIsDC5t9C0gb6yqA==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.53.1': - resolution: {integrity: sha512-JzWRR41o2U3/KMNKRuZNsDUAcAVUYhsPuMlx5RUldw0E4lvSIXFUwejtYz1HJXohUmqs/M6BBJAUBzKXZVddbg==} + '@rollup/rollup-linux-arm-gnueabihf@4.53.2': + resolution: {integrity: sha512-EPlb95nUsz6Dd9Qy13fI5kUPXNSljaG9FiJ4YUGU1O/Q77i5DYFW5KR8g1OzTcdZUqQQ1KdDqsTohdFVwCwjqg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.53.1': - resolution: {integrity: sha512-L8kRIrnfMrEoHLHtHn+4uYA52fiLDEDyezgxZtGUTiII/yb04Krq+vk3P2Try+Vya9LeCE9ZHU8CXD6J9EhzHQ==} + '@rollup/rollup-linux-arm-musleabihf@4.53.2': + resolution: {integrity: sha512-BOmnVW+khAUX+YZvNfa0tGTEMVVEerOxN0pDk2E6N6DsEIa2Ctj48FOMfNDdrwinocKaC7YXUZ1pHlKpnkja/Q==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.53.1': - resolution: {integrity: sha512-ysAc0MFRV+WtQ8li8hi3EoFi7us6d1UzaS/+Dp7FYZfg3NdDljGMoVyiIp6Ucz7uhlYDBZ/zt6XI0YEZbUO11Q==} + '@rollup/rollup-linux-arm64-gnu@4.53.2': + resolution: {integrity: sha512-Xt2byDZ+6OVNuREgBXr4+CZDJtrVso5woFtpKdGPhpTPHcNG7D8YXeQzpNbFRxzTVqJf7kvPMCub/pcGUWgBjA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.53.1': - resolution: {integrity: sha512-UV6l9MJpDbDZZ/fJvqNcvO1PcivGEf1AvKuTcHoLjVZVFeAMygnamCTDikCVMRnA+qJe+B3pSbgX2+lBMqgBhA==} + '@rollup/rollup-linux-arm64-musl@4.53.2': + resolution: {integrity: sha512-+LdZSldy/I9N8+klim/Y1HsKbJ3BbInHav5qE9Iy77dtHC/pibw1SR/fXlWyAk0ThnpRKoODwnAuSjqxFRDHUQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loong64-gnu@4.53.1': - resolution: {integrity: sha512-UDUtelEprkA85g95Q+nj3Xf0M4hHa4DiJ+3P3h4BuGliY4NReYYqwlc0Y8ICLjN4+uIgCEvaygYlpf0hUj90Yg==} + '@rollup/rollup-linux-loong64-gnu@4.53.2': + resolution: {integrity: sha512-8ms8sjmyc1jWJS6WdNSA23rEfdjWB30LH8Wqj0Cqvv7qSHnvw6kgMMXRdop6hkmGPlyYBdRPkjJnj3KCUHV/uQ==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.53.1': - resolution: {integrity: sha512-vrRn+BYhEtNOte/zbc2wAUQReJXxEx2URfTol6OEfY2zFEUK92pkFBSXRylDM7aHi+YqEPJt9/ABYzmcrS4SgQ==} + '@rollup/rollup-linux-ppc64-gnu@4.53.2': + resolution: {integrity: sha512-3HRQLUQbpBDMmzoxPJYd3W6vrVHOo2cVW8RUo87Xz0JPJcBLBr5kZ1pGcQAhdZgX9VV7NbGNipah1omKKe23/g==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.53.1': - resolution: {integrity: sha512-gto/1CxHyi4A7YqZZNznQYrVlPSaodOBPKM+6xcDSCMVZN/Fzb4K+AIkNz/1yAYz9h3Ng+e2fY9H6bgawVq17w==} + '@rollup/rollup-linux-riscv64-gnu@4.53.2': + resolution: {integrity: sha512-fMjKi+ojnmIvhk34gZP94vjogXNNUKMEYs+EDaB/5TG/wUkoeua7p7VCHnE6T2Tx+iaghAqQX8teQzcvrYpaQA==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.53.1': - resolution: {integrity: sha512-KZ6Vx7jAw3aLNjFR8eYVcQVdFa/cvBzDNRFM3z7XhNNunWjA03eUrEwJYPk0G8V7Gs08IThFKcAPS4WY/ybIrQ==} + '@rollup/rollup-linux-riscv64-musl@4.53.2': + resolution: {integrity: sha512-XuGFGU+VwUUV5kLvoAdi0Wz5Xbh2SrjIxCtZj6Wq8MDp4bflb/+ThZsVxokM7n0pcbkEr2h5/pzqzDYI7cCgLQ==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.53.1': - resolution: {integrity: sha512-HvEixy2s/rWNgpwyKpXJcHmE7om1M89hxBTBi9Fs6zVuLU4gOrEMQNbNsN/tBVIMbLyysz/iwNiGtMOpLAOlvA==} + '@rollup/rollup-linux-s390x-gnu@4.53.2': + resolution: {integrity: sha512-w6yjZF0P+NGzWR3AXWX9zc0DNEGdtvykB03uhonSHMRa+oWA6novflo2WaJr6JZakG2ucsyb+rvhrKac6NIy+w==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.53.1': - resolution: {integrity: sha512-E/n8x2MSjAQgjj9IixO4UeEUeqXLtiA7pyoXCFYLuXpBA/t2hnbIdxHfA7kK9BFsYAoNU4st1rHYdldl8dTqGA==} + '@rollup/rollup-linux-x64-gnu@4.53.2': + resolution: {integrity: sha512-yo8d6tdfdeBArzC7T/PnHd7OypfI9cbuZzPnzLJIyKYFhAQ8SvlkKtKBMbXDxe1h03Rcr7u++nFS7tqXz87Gtw==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.53.1': - resolution: {integrity: sha512-IhJ087PbLOQXCN6Ui/3FUkI9pWNZe/Z7rEIVOzMsOs1/HSAECCvSZ7PkIbkNqL/AZn6WbZvnoVZw/qwqYMo4/w==} + '@rollup/rollup-linux-x64-musl@4.53.2': + resolution: {integrity: sha512-ah59c1YkCxKExPP8O9PwOvs+XRLKwh/mV+3YdKqQ5AMQ0r4M4ZDuOrpWkUaqO7fzAHdINzV9tEVu8vNw48z0lA==} cpu: [x64] os: [linux] - '@rollup/rollup-openharmony-arm64@4.53.1': - resolution: {integrity: sha512-0++oPNgLJHBblreu0SFM7b3mAsBJBTY0Ksrmu9N6ZVrPiTkRgda52mWR7TKhHAsUb9noCjFvAw9l6ZO1yzaVbA==} + '@rollup/rollup-openharmony-arm64@4.53.2': + resolution: {integrity: sha512-4VEd19Wmhr+Zy7hbUsFZ6YXEiP48hE//KPLCSVNY5RMGX2/7HZ+QkN55a3atM1C/BZCGIgqN+xrVgtdak2S9+A==} cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.53.1': - resolution: {integrity: sha512-VJXivz61c5uVdbmitLkDlbcTk9Or43YC2QVLRkqp86QoeFSqI81bNgjhttqhKNMKnQMWnecOCm7lZz4s+WLGpQ==} + '@rollup/rollup-win32-arm64-msvc@4.53.2': + resolution: {integrity: sha512-IlbHFYc/pQCgew/d5fslcy1KEaYVCJ44G8pajugd8VoOEI8ODhtb/j8XMhLpwHCMB3yk2J07ctup10gpw2nyMA==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.53.1': - resolution: {integrity: sha512-NmZPVTUOitCXUH6erJDzTQ/jotYw4CnkMDjCYRxNHVD9bNyfrGoIse684F9okwzKCV4AIHRbUkeTBc9F2OOH5Q==} + '@rollup/rollup-win32-ia32-msvc@4.53.2': + resolution: {integrity: sha512-lNlPEGgdUfSzdCWU176ku/dQRnA7W+Gp8d+cWv73jYrb8uT7HTVVxq62DUYxjbaByuf1Yk0RIIAbDzp+CnOTFg==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-gnu@4.53.1': - resolution: {integrity: sha512-2SNj7COIdAf6yliSpLdLG8BEsp5lgzRehgfkP0Av8zKfQFKku6JcvbobvHASPJu4f3BFxej5g+HuQPvqPhHvpQ==} + '@rollup/rollup-win32-x64-gnu@4.53.2': + resolution: {integrity: sha512-S6YojNVrHybQis2lYov1sd+uj7K0Q05NxHcGktuMMdIQ2VixGwAfbJ23NnlvvVV1bdpR2m5MsNBViHJKcA4ADw==} cpu: [x64] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.53.1': - resolution: {integrity: sha512-rLarc1Ofcs3DHtgSzFO31pZsCh8g05R2azN1q3fF+H423Co87My0R+tazOEvYVKXSLh8C4LerMK41/K7wlklcg==} + '@rollup/rollup-win32-x64-msvc@4.53.2': + resolution: {integrity: sha512-k+/Rkcyx//P6fetPoLMb8pBeqJBNGx81uuf7iljX9++yNBVRDQgD04L+SVXmXmh5ZP4/WOp4mWF0kmi06PW2tA==} cpu: [x64] os: [win32] @@ -3377,8 +3476,8 @@ packages: '@standard-schema/utils@0.3.0': resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==} - '@swc/cli@0.6.0': - resolution: {integrity: sha512-Q5FsI3Cw0fGMXhmsg7c08i4EmXCrcl+WnAxb6LYOLHw4JFFC3yzmx9LaXZ7QMbA+JZXbigU2TirI7RAfO0Qlnw==} + '@swc/cli@0.7.9': + resolution: {integrity: sha512-AFQu3ZZ9IcdClTknxbug08S9ed/q8F3aYkO5NoZ+6IjQ5UEo1s2HN1GRKNvUslYx2EoVYxd+6xGcp6C7wwtxyQ==} engines: {node: '>= 16.14.0'} hasBin: true peerDependencies: @@ -3585,159 +3684,159 @@ packages: '@types/react-dom': optional: true - '@tiptap/core@3.10.4': - resolution: {integrity: sha512-/jT0NAOvNPHn9x2TmJE2lWe81qTOE4wdRD+OEE+NJUsOtRPEvEP/CEPpT3cT9/mfPBC/U80EvVeUn7bjc2USOw==} + '@tiptap/core@3.10.5': + resolution: {integrity: sha512-JvvgWrQMP+yEhw20Q2+N62k+G8tspko7oLQxBktnN3PLlP67nKb1qOBzcrnEGsaiASjSu25myUmxY+ZpOmP+MQ==} peerDependencies: - '@tiptap/pm': ^3.10.4 + '@tiptap/pm': ^3.10.5 - '@tiptap/extension-blockquote@3.10.4': - resolution: {integrity: sha512-YCKObg614/y4YsMMU/AjZ+YrdpnCpW1Ym75540mrB3DllmImj22F3xsAAgCHyYIQvtwDM6f6ilqfx5FD8tPEmw==} + '@tiptap/extension-blockquote@3.10.5': + resolution: {integrity: sha512-vuqqnFgbcKK0pXIASDpiZV33cZho9eq3TMBpIFQ1Kcfmy1DVsfq++AvukiPY/eSa9ciVRNApPp99+v8PDg8RmA==} peerDependencies: - '@tiptap/core': ^3.10.4 + '@tiptap/core': ^3.10.5 - '@tiptap/extension-bold@3.10.4': - resolution: {integrity: sha512-fgyfmY3bTsCLOyQo8YZGX0qioJ0+DzCdlmrXx8sFkhcdCeOCr9PI0+XKyWW0MY6A8VV17tdKRgODp3n1Ru7R3A==} + '@tiptap/extension-bold@3.10.5': + resolution: {integrity: sha512-YvslsSF4oSwBXMc9tDAUfqr8VmmQ8W/TJVdfdai+gwHSkCWtaqsojUmnAFSiMIyHg5ACVPYMdoThP3aqScNrWQ==} peerDependencies: - '@tiptap/core': ^3.10.4 + '@tiptap/core': ^3.10.5 - '@tiptap/extension-bubble-menu@3.10.4': - resolution: {integrity: sha512-Ougck8UgMRziy2wq/6S39q5WqkmcMxg3K0dIOxkOQqe9oSRcwA/fWA0Gq4VZd69SMCNzAOgjwIl6znZDxBoXiA==} + '@tiptap/extension-bubble-menu@3.10.5': + resolution: {integrity: sha512-Kc71uAonSNCYoY+0oxLkxqk846ZgDYy8D28iKUp8Fc+0s6efpwbXLNVma5ooLlOKEz8vKeZNYVOKphTg/0xdZw==} peerDependencies: - '@tiptap/core': ^3.10.4 - '@tiptap/pm': ^3.10.4 + '@tiptap/core': ^3.10.5 + '@tiptap/pm': ^3.10.5 - '@tiptap/extension-bullet-list@3.10.4': - resolution: {integrity: sha512-7Di4QLW4Ri5xDD4sYNXI1gmM8wIALRlIBP8fOL7veBTenT1CVqawVl/wZuPLnoXsj3j8wtzop3fwFiyv8jEnAA==} + '@tiptap/extension-bullet-list@3.10.5': + resolution: {integrity: sha512-ohysgT2p17h8ARyzB7z0nX/Pk7Lyilr/ruT0n5JXNO4pbgw9r6WYFyyiNJCkeFIjJEu7a4C3HBPH/r1EhDu6YA==} peerDependencies: - '@tiptap/extension-list': ^3.10.4 + '@tiptap/extension-list': ^3.10.5 - '@tiptap/extension-code-block@3.10.4': - resolution: {integrity: sha512-dkqeZRGhwDobKfrZmRXojU/8s11gaMj+Bb5oUjhzmnWoS2Y3UwesdrAUcBwZd+fgV7/hAud5rt7oX4hJqCjgtw==} + '@tiptap/extension-code-block@3.10.5': + resolution: {integrity: sha512-6YEyASCT7UhzkWDfJ3Snajgy2XzYV7lPZxx9En2G9F/dqorGw1Kr45Gv3T6r46mJHXayGyb6OAN9AamVlOyk/Q==} peerDependencies: - '@tiptap/core': ^3.10.4 - '@tiptap/pm': ^3.10.4 + '@tiptap/core': ^3.10.5 + '@tiptap/pm': ^3.10.5 - '@tiptap/extension-code@3.10.4': - resolution: {integrity: sha512-33L3HlD2fb+LqwUKndbwf2IRiGR8P3EzkcDwpHysE0C5VY13Fb0YkeIXV8CyWShrzIYCOK8btjIeNf0T0HSphg==} + '@tiptap/extension-code@3.10.5': + resolution: {integrity: sha512-zt7w+AQ5El5rERY8QsiDlpCmaw951hLORUeI6p7HjgnA6KQoBJXxz750W8bfqEYnLFJ9uOXQka/Ds37/IyijGA==} peerDependencies: - '@tiptap/core': ^3.10.4 + '@tiptap/core': ^3.10.5 - '@tiptap/extension-document@3.10.4': - resolution: {integrity: sha512-w1ZNDyafoq+J6cmerVisDTiD9imKfVpvNqxz5D8PvVo1vvNqtLxzMbkGjGedewQIZzwxAPu46czyVAk7Jxp7Cg==} + '@tiptap/extension-document@3.10.5': + resolution: {integrity: sha512-5Q/BSc9BubVSQFqPvn6fJ/0KFzt6FgyEIeXAEGKhvEwvFJlHRKS+afypi0DWLVFBQ7lona9vJmhEX18XMIHMrw==} peerDependencies: - '@tiptap/core': ^3.10.4 + '@tiptap/core': ^3.10.5 - '@tiptap/extension-dropcursor@3.10.4': - resolution: {integrity: sha512-9llL60Gl+ExEuSPlwh4/kd3ivMoKnbXOC1ac5gZfbxz4wY3me5Ql2kqZrtn7ibeZcocjA2DG9febNBgY0VVQ4g==} + '@tiptap/extension-dropcursor@3.10.5': + resolution: {integrity: sha512-39VkdbWwD2yDVYDeeQKfGINouhViK4n465CDR5etFfBNG3lj28dHDvFmZn81SfwcYlpUOVS7GdczNVLHVjqrfA==} peerDependencies: - '@tiptap/extensions': ^3.10.4 + '@tiptap/extensions': ^3.10.5 - '@tiptap/extension-floating-menu@3.10.4': - resolution: {integrity: sha512-bmSolrXs0xeOwJzSaclayR8sTnsdsA1gNM52KpsUIM6uJoklX6OVsPcgUv6qPGNsUaDI0XVn5xONeXcuzaFVHg==} + '@tiptap/extension-floating-menu@3.10.5': + resolution: {integrity: sha512-N9qxP37s+gpOCBBrwoVaK1e61wuYY/KnEkhhodmYxMS/zuRHQ79ics7i1B18CJFfcT6+USHB6HzNxLLrlmpt4w==} peerDependencies: '@floating-ui/dom': ^1.0.0 - '@tiptap/core': ^3.10.4 - '@tiptap/pm': ^3.10.4 + '@tiptap/core': ^3.10.5 + '@tiptap/pm': ^3.10.5 - '@tiptap/extension-gapcursor@3.10.4': - resolution: {integrity: sha512-IS9aFIpU6fODfya/q7lDjJRRpmpF1aqkuqjltlBXa2tzg2rdJNNJWiySamijj12DG2D6K2r/Kwt7FxCjsbQl2w==} + '@tiptap/extension-gapcursor@3.10.5': + resolution: {integrity: sha512-/C13mvMGmQ3/8T9jg5KiT1/kMM9rFOXzsI2x0KO6IImTMBke6v259qEJyUCfG+Q90ttf95Muymp4I5FbFqJPww==} peerDependencies: - '@tiptap/extensions': ^3.10.4 + '@tiptap/extensions': ^3.10.5 - '@tiptap/extension-hard-break@3.10.4': - resolution: {integrity: sha512-2fTSe5F0NuWTOSaShcjA871GODVec4ieKK9RHpHmrl98D0FJ6rJKE/6hUe+RFizW8S0j//fjnTTkcSu+YrNcMg==} + '@tiptap/extension-hard-break@3.10.5': + resolution: {integrity: sha512-qYouFEvxmWQ5258IHt0D2AmI66gpY5b3zCTgc+EMv/Vj+O2ViJ0/3Sq/fwxqmGRAM5o3R/aEr5Ctk2M/qUjz1A==} peerDependencies: - '@tiptap/core': ^3.10.4 + '@tiptap/core': ^3.10.5 - '@tiptap/extension-heading@3.10.4': - resolution: {integrity: sha512-DT3kuQbVquZccM8s7H9FFSYtafb/LmmhfNzCLFxBHHHdZQNSWs1nExxlSiCX7NkQSkcnUeqHfEsbOmREnbqUqg==} + '@tiptap/extension-heading@3.10.5': + resolution: {integrity: sha512-sJBdtoCUcB9xmiAhg+OztrfQi1FpB9DUQO2IpbedYPixextK3cX8ntQ4NJelT7kBsdOrW3jmWccbjzvK0wZ7Eg==} peerDependencies: - '@tiptap/core': ^3.10.4 + '@tiptap/core': ^3.10.5 - '@tiptap/extension-horizontal-rule@3.10.4': - resolution: {integrity: sha512-AaO+teMVWHec3XRaC5Jj5iZzMjas+bx+MHPfXTw0KIcn+4wlHV/0bkcWH31E+fbSswH4MnVFET6RmTkzXpEGhw==} + '@tiptap/extension-horizontal-rule@3.10.5': + resolution: {integrity: sha512-okzBJVm68QMb9mwYM74az5bzHuXV6NSuoSb32dRwt3zx8zVdNUK0z585SxlQGDJ3ksB+1UR5tGlcst6sT05esw==} peerDependencies: - '@tiptap/core': ^3.10.4 - '@tiptap/pm': ^3.10.4 + '@tiptap/core': ^3.10.5 + '@tiptap/pm': ^3.10.5 - '@tiptap/extension-italic@3.10.4': - resolution: {integrity: sha512-SlvKzL/oUxZ0s+1idv4ZdKmr4tS6m8jbXZYVZlzlRHxSfmt85SqUa2hMxmeNXySrHxURQNP6F+KyI6Z26ddFzA==} + '@tiptap/extension-italic@3.10.5': + resolution: {integrity: sha512-f4RI0KGmtkZgVQlthrSm0dEIwx6Vw1ppbQevJecaaXLQTBoS9jAhqRrZbWkqWnof2fTyO2KK23wAMHAjXOKvmg==} peerDependencies: - '@tiptap/core': ^3.10.4 + '@tiptap/core': ^3.10.5 - '@tiptap/extension-link@3.10.4': - resolution: {integrity: sha512-ccwROcKdqFnDDSKw1hsp06kDZCjjjnThIDg7Mku9RnXAYcJw7nmjCkIdzPYjggpzlpxZPsfhmX4No1sG3G3J9g==} + '@tiptap/extension-link@3.10.5': + resolution: {integrity: sha512-6lb8SZSi2+N37/BzkOwFaHHSbloZ3CG5OT0J+h9MULdH0/X8d8fvK/Kxtfa0NgxYWP446u62HJkjvAk234k/Jw==} peerDependencies: - '@tiptap/core': ^3.10.4 - '@tiptap/pm': ^3.10.4 + '@tiptap/core': ^3.10.5 + '@tiptap/pm': ^3.10.5 - '@tiptap/extension-list-item@3.10.4': - resolution: {integrity: sha512-Q2sQvo5NJcEMEI+IVeAlBM4ArBCJBUhH0Gyex6rJPxwiZYVK2VMezLHCQXNVoQMXCDEZuB37E54U/QapDVlBEg==} + '@tiptap/extension-list-item@3.10.5': + resolution: {integrity: sha512-BklqZIig3c/PiQoivmqXd25lqyC8VbRLMMDkAeJlOljG7oAielYIbFV76lnaoiGsEt4sK7z75qpZ/E6sbXDQMw==} peerDependencies: - '@tiptap/extension-list': ^3.10.4 + '@tiptap/extension-list': ^3.10.5 - '@tiptap/extension-list-keymap@3.10.4': - resolution: {integrity: sha512-t8PYkgp5avFRZaeOxO+UMGDZPnUrLzLaTVbmrMobO1UVnVEmsT6PlTt0klKVziE12OzDOMCYHwpfZwVnCIBxPw==} + '@tiptap/extension-list-keymap@3.10.5': + resolution: {integrity: sha512-FdGwnULYnuH+F+2u9OElBTky2kRA6S9P9w2Pi4i0FHuB9rMb10R5rIjwunjrkYvAQfnsTEdwJo8YWaPvz+TJIA==} peerDependencies: - '@tiptap/extension-list': ^3.10.4 + '@tiptap/extension-list': ^3.10.5 - '@tiptap/extension-list@3.10.4': - resolution: {integrity: sha512-4e4vX0co9qDZ9TFpm/zDzQAFrX43XUGeNvQMJzfHz+QINjUj4fKUPTQnTfYp8ce3w0VgFnHgQ8lriE9tVxElbA==} + '@tiptap/extension-list@3.10.5': + resolution: {integrity: sha512-0aW7gIiho0DpJyG0bT/RL0ZofH89Og0sIGgJG4SQqzgsba1EYfcPlaauugA473G8SnN5FslG5D0k9ZC+TYXNpw==} peerDependencies: - '@tiptap/core': ^3.10.4 - '@tiptap/pm': ^3.10.4 + '@tiptap/core': ^3.10.5 + '@tiptap/pm': ^3.10.5 - '@tiptap/extension-ordered-list@3.10.4': - resolution: {integrity: sha512-qdOGKsUMniyfbglJZMSDCPqwlbk5h0jSHfrLAz/dYdhLUAK6NgBXxNdIeZhfdTHbkog/7lcajYU0zzpsuoMCfA==} + '@tiptap/extension-ordered-list@3.10.5': + resolution: {integrity: sha512-sqhA6IzcS/mlcABEUeYX0ZD+jtb5ga01ATz+b5xYAqOQlB7xHRQ5TdZTB/rKwJxaKxdevFXCenAwJA3d1B5O1g==} peerDependencies: - '@tiptap/extension-list': ^3.10.4 + '@tiptap/extension-list': ^3.10.5 - '@tiptap/extension-paragraph@3.10.4': - resolution: {integrity: sha512-N3Y54hUcwMdrIWIxSEtrGLJRCtRe2FpbIVY3eIsEf/FysLZKgtLLifQg4Xf7oWSMP5Rxkr8sCx7ajG1skvg36w==} + '@tiptap/extension-paragraph@3.10.5': + resolution: {integrity: sha512-YCXFJiWC2w3Q62Q+nAf0SYWNysbQYpBA+fNyczaz+9vJYUBPcuu1WB0kdIGg/07RsUsg0U0txBnx+GuDuWXh2A==} peerDependencies: - '@tiptap/core': ^3.10.4 + '@tiptap/core': ^3.10.5 - '@tiptap/extension-strike@3.10.4': - resolution: {integrity: sha512-Y+M2TrlQKAIbP4XR8TQ1ZUpfnEWVKCFvVvh740MTgJRiAtLPdQz37XeT0pIWGkY0XRyFRssKYgiozJGuxU2TpQ==} + '@tiptap/extension-strike@3.10.5': + resolution: {integrity: sha512-tyJs3ArYGaYi/cy79NWKfkb7nIcWocFmou3JW229mZ+lFH1jNy9jGnIITN8BG8aizC6QkXBaeEy8+uBUJ+5Tkw==} peerDependencies: - '@tiptap/core': ^3.10.4 + '@tiptap/core': ^3.10.5 - '@tiptap/extension-text-align@3.10.4': - resolution: {integrity: sha512-GR8+50U4usFGofk/tpCMQcilcG4P9cWCOCW1+0PGAQrc9Q2hnzmzPDDQCmCaWEZ/LeQaOeIms+hRCbLO5uwf2g==} + '@tiptap/extension-text-align@3.10.5': + resolution: {integrity: sha512-TX888f1SPnAFYxPF7HGjU55RopaTZwdIviqVF+/jfUc59KXWwXbGZph3HexHl1rKVYiVrCazOr6eqx7LBkXtyQ==} peerDependencies: - '@tiptap/core': ^3.10.4 + '@tiptap/core': ^3.10.5 - '@tiptap/extension-text@3.10.4': - resolution: {integrity: sha512-5HCdDPzyjBljfSitP5AEScAiovt3m8OyMBmqOW64ZnJwBkZW7BUh/DpLYpYireLspu76kDNNhJ4/2Ca+l795dw==} + '@tiptap/extension-text@3.10.5': + resolution: {integrity: sha512-anLb/bJ9TfjVjOAdqQGQTDYsvI5Tgid1RgRokpK6vOxVhukBW7q8RnIsyWYj/uV6UefS6YtVOl5H9DAnpCVfvg==} peerDependencies: - '@tiptap/core': ^3.10.4 + '@tiptap/core': ^3.10.5 - '@tiptap/extension-underline@3.10.4': - resolution: {integrity: sha512-FlDxgTr8NSPOYJFB5jD+WzLUn1fGhZumm8q9fvYJqYvZ62pRBacsU4pilHbG+Wf8DFl+4zjmNq4yWmTnqSCwCQ==} + '@tiptap/extension-underline@3.10.5': + resolution: {integrity: sha512-2SUQTsD5CYwTAdEFIifGHW/N363B9x5qxdzz2wrzn1mbJB4yG6QKyYY0uAGHmSOeC8iHS8scWDFiU09NlAhoew==} peerDependencies: - '@tiptap/core': ^3.10.4 + '@tiptap/core': ^3.10.5 - '@tiptap/extensions@3.10.4': - resolution: {integrity: sha512-DO/72X2AVhuVbcghBRvHNwb9tHmKQvERax1XKX9D9AuJyL/s8x9F0CXbbuBjdSkEeIFrFxQMLxH0NBak3upW4A==} + '@tiptap/extensions@3.10.5': + resolution: {integrity: sha512-odZ9tXRBOj1PdpoMILBZ1DoTgXb+30jR0HMLtML5E8JqE3sDRSh1PgUAVXKmzRX/IytRabiKnhP4L8ZwrJAFaA==} peerDependencies: - '@tiptap/core': ^3.10.4 - '@tiptap/pm': ^3.10.4 + '@tiptap/core': ^3.10.5 + '@tiptap/pm': ^3.10.5 - '@tiptap/pm@3.10.4': - resolution: {integrity: sha512-tNGAXSLq5l/G72EPTBUNRHkRmiQoU2ODpIvqXZWFjymaW+8x1nzU3oZwinfvCdwNPrsZJv4x7pfX5EA6pbnW8w==} + '@tiptap/pm@3.10.5': + resolution: {integrity: sha512-yILFuY8nyZbfbJQh1aZfwT/E4o5dHrKXnWsGDiljdr+6NryaU+hcmlwlbz6Q+0550Ik0B2oQoRxAnhzz7qH3Hg==} - '@tiptap/react@3.10.4': - resolution: {integrity: sha512-F/5mGXgd9Cer9QZibE4XJ+ooCDqfIk1kGLvsmrKLdnIVWWvZBDuqRD7jqIzKgIWLKc8BTjbi2gqp7cu8v1USzA==} + '@tiptap/react@3.10.5': + resolution: {integrity: sha512-HP5qn4tMNlAGieTO4ChzbJ/QrGZPrEvF31vRqDQYMre0aSwIHsClQ0fOhOs2YM2wYQgX5dKwymoE7n+9MxJ6Pw==} peerDependencies: - '@tiptap/core': ^3.10.4 - '@tiptap/pm': ^3.10.4 + '@tiptap/core': ^3.10.5 + '@tiptap/pm': ^3.10.5 '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 '@types/react-dom': ^17.0.0 || ^18.0.0 || ^19.0.0 react: ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tiptap/starter-kit@3.10.4': - resolution: {integrity: sha512-4Re887ExOwVz51UsBES/qTpLmiUiFKD/KOtzLMUDz+08Ikc5XLD47H9GaqYrf1yCgSXHCCfpf7FxGk6BwKerfQ==} + '@tiptap/starter-kit@3.10.5': + resolution: {integrity: sha512-CdFlqKGboxKgFHLqLkvtUtvavfxXpWKq7o5i9P9xntaooFq1nucB6ME/axJgua6lJamltrQ90ddS1/pMwAmfrg==} '@tokenizer/inflate@0.2.7': resolution: {integrity: sha512-MADQgmZT1eKjp06jpI2yozxaU9uVs4GzzgSL+uEq7bVcJ9V1ZXQkeGNql1fsSI0gMy1vhvNTNbUqrx+pZfJVmg==} @@ -3863,8 +3962,8 @@ packages: '@types/react@19.0.10': resolution: {integrity: sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==} - '@types/react@19.2.2': - resolution: {integrity: sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==} + '@types/react@19.2.3': + resolution: {integrity: sha512-k5dJVszUiNr1DSe8Cs+knKR6IrqhqdhpUwzqhkS8ecQTSf3THNtbfIp/umqHMpX2bv+9dkx3fwDv/86LcSfvSg==} '@types/unist@2.0.11': resolution: {integrity: sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==} @@ -3881,63 +3980,63 @@ packages: '@types/webpack@5.28.5': resolution: {integrity: sha512-wR87cgvxj3p6D0Crt1r5avwqffqPXUkNlnQ1mjU93G7gCuFjufZR4I6j8cz5g1F1tTYpfOOFvly+cmIQwL9wvw==} - '@typescript-eslint/eslint-plugin@8.46.3': - resolution: {integrity: sha512-sbaQ27XBUopBkRiuY/P9sWGOWUW4rl8fDoHIUmLpZd8uldsTyB4/Zg6bWTegPoTLnKj9Hqgn3QD6cjPNB32Odw==} + '@typescript-eslint/eslint-plugin@8.46.4': + resolution: {integrity: sha512-R48VhmTJqplNyDxCyqqVkFSZIx1qX6PzwqgcXn1olLrzxcSBDlOsbtcnQuQhNtnNiJ4Xe5gREI1foajYaYU2Vg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.46.3 + '@typescript-eslint/parser': ^8.46.4 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/parser@8.46.3': - resolution: {integrity: sha512-6m1I5RmHBGTnUGS113G04DMu3CpSdxCAU/UvtjNWL4Nuf3MW9tQhiJqRlHzChIkhy6kZSAQmc+I1bcGjE3yNKg==} + '@typescript-eslint/parser@8.46.4': + resolution: {integrity: sha512-tK3GPFWbirvNgsNKto+UmB/cRtn6TZfyw0D6IKrW55n6Vbs7KJoZtI//kpTKzE/DUmmnAFD8/Ca46s7Obs92/w==} 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/project-service@8.46.3': - resolution: {integrity: sha512-Fz8yFXsp2wDFeUElO88S9n4w1I4CWDTXDqDr9gYvZgUpwXQqmZBr9+NTTql5R3J7+hrJZPdpiWaB9VNhAKYLuQ==} + '@typescript-eslint/project-service@8.46.4': + resolution: {integrity: sha512-nPiRSKuvtTN+no/2N1kt2tUh/HoFzeEgOm9fQ6XQk4/ApGqjx0zFIIaLJ6wooR1HIoozvj2j6vTi/1fgAz7UYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/scope-manager@8.46.3': - resolution: {integrity: sha512-FCi7Y1zgrmxp3DfWfr+3m9ansUUFoy8dkEdeQSgA9gbm8DaHYvZCdkFRQrtKiedFf3Ha6VmoqoAaP68+i+22kg==} + '@typescript-eslint/scope-manager@8.46.4': + resolution: {integrity: sha512-tMDbLGXb1wC+McN1M6QeDx7P7c0UWO5z9CXqp7J8E+xGcJuUuevWKxuG8j41FoweS3+L41SkyKKkia16jpX7CA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/tsconfig-utils@8.46.3': - resolution: {integrity: sha512-GLupljMniHNIROP0zE7nCcybptolcH8QZfXOpCfhQDAdwJ/ZTlcaBOYebSOZotpti/3HrHSw7D3PZm75gYFsOA==} + '@typescript-eslint/tsconfig-utils@8.46.4': + resolution: {integrity: sha512-+/XqaZPIAk6Cjg7NWgSGe27X4zMGqrFqZ8atJsX3CWxH/jACqWnrWI68h7nHQld0y+k9eTTjb9r+KU4twLoo9A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/type-utils@8.46.3': - resolution: {integrity: sha512-ZPCADbr+qfz3aiTTYNNkCbUt+cjNwI/5McyANNrFBpVxPt7GqpEYz5ZfdwuFyGUnJ9FdDXbGODUu6iRCI6XRXw==} + '@typescript-eslint/type-utils@8.46.4': + resolution: {integrity: sha512-V4QC8h3fdT5Wro6vANk6eojqfbv5bpwHuMsBcJUJkqs2z5XnYhJzyz9Y02eUmF9u3PgXEUiOt4w4KHR3P+z0PQ==} 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/types@8.46.3': - resolution: {integrity: sha512-G7Ok9WN/ggW7e/tOf8TQYMaxgID3Iujn231hfi0Pc7ZheztIJVpO44ekY00b7akqc6nZcvregk0Jpah3kep6hA==} + '@typescript-eslint/types@8.46.4': + resolution: {integrity: sha512-USjyxm3gQEePdUwJBFjjGNG18xY9A2grDVGuk7/9AkjIF1L+ZrVnwR5VAU5JXtUnBL/Nwt3H31KlRDaksnM7/w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.46.3': - resolution: {integrity: sha512-f/NvtRjOm80BtNM5OQtlaBdM5BRFUv7gf381j9wygDNL+qOYSNOgtQ/DCndiYi80iIOv76QqaTmp4fa9hwI0OA==} + '@typescript-eslint/typescript-estree@8.46.4': + resolution: {integrity: sha512-7oV2qEOr1d4NWNmpXLR35LvCfOkTNymY9oyW+lUHkmCno7aOmIf/hMaydnJBUTBMRCOGZh8YjkFOc8dadEoNGA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' - '@typescript-eslint/utils@8.46.3': - resolution: {integrity: sha512-VXw7qmdkucEx9WkmR3ld/u6VhRyKeiF1uxWwCy/iuNfokjJ7VhsgLSOTjsol8BunSw190zABzpwdNsze2Kpo4g==} + '@typescript-eslint/utils@8.46.4': + resolution: {integrity: sha512-AbSv11fklGXV6T28dp2Me04Uw90R2iJ30g2bgLz529Koehrmkbs1r7paFqr1vPCZi7hHwYxYtxfyQMRC8QaVSg==} 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.46.3': - resolution: {integrity: sha512-uk574k8IU0rOF/AjniX8qbLSGURJVUCeM5e4MIMKBFFi8weeiLrG1fyQejyLXQpRZbU/1BuQasleV/RfHC3hHg==} + '@typescript-eslint/visitor-keys@8.46.4': + resolution: {integrity: sha512-/++5CYLQqsO9HFGLI7APrxBJYo+5OCMpViuhV8q5/Qa3o5mMrF//eQHks+PXcsAVaLdn817fMuS7zqoXNNZGaw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@ungap/structured-clone@1.3.0': @@ -4263,6 +4362,9 @@ packages: react-native-b4a: optional: true + babel-plugin-react-compiler@1.0.0: + resolution: {integrity: sha512-Ixm8tFfoKKIPYdCCKYTsqv+Fd4IJ0DQqMyEimo+pxUOMUR9cVPlwTrFt9Avu+3cb6Zp3mAzl+t1MrG2fxxKsxw==} + bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -4284,8 +4386,8 @@ packages: resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} engines: {node: ^4.5.0 || >= 5.9} - baseline-browser-mapping@2.8.25: - resolution: {integrity: sha512-2NovHVesVF5TXefsGX1yzx1xgr7+m9JQenvz6FQY3qd+YXkKkYiv+vTCc7OriP9mcDZpTC5mAOYN4ocd29+erA==} + baseline-browser-mapping@2.8.26: + resolution: {integrity: sha512-73lC1ugzwoaWCLJ1LvOgrR5xsMLTqSKIEoMHVtL9E/HNk0PXtTM76ZIm84856/SF7Nv8mPZxKoBsgpm0tR1u1Q==} hasBin: true bidi-js@1.0.3: @@ -4330,8 +4432,8 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.27.0: - resolution: {integrity: sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==} + browserslist@4.28.0: + resolution: {integrity: sha512-tbydkR/CxfMwelN0vwdP/pLkDwyAASZ+VfWm4EOwlB6SWhx1sYnWLqo8N5j0rAzPfzfRaxt0mM/4wPU/Su84RQ==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true @@ -4388,8 +4490,8 @@ packages: ccount@2.0.1: resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - chai@6.2.0: - resolution: {integrity: sha512-aUTnJc/JipRzJrNADXVvpVqi6CO0dn3nx4EVPxijri+fj3LUUDyZQOgVeW54Ob3Y1Xh9Iz8f+CgaCl8v0mn9bA==} + chai@6.2.1: + resolution: {integrity: sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg==} engines: {node: '>=18'} chalk@4.1.2: @@ -4850,8 +4952,8 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - electron-to-chromium@1.5.249: - resolution: {integrity: sha512-5vcfL3BBe++qZ5kuFhD/p8WOM1N9m3nwvJPULJx+4xf2usSlZFJ0qoNYO2fOX4hi3ocuDcmDobtA+5SFr4OmBg==} + electron-to-chromium@1.5.250: + resolution: {integrity: sha512-/5UMj9IiGDMOFBnN4i7/Ry5onJrAGSbOGo3s9FEKmwobGq6xw832ccET0CE3CkkMBZ8GJSlUIesZofpyurqDXw==} emoji-regex@10.6.0: resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} @@ -5000,15 +5102,15 @@ packages: eslint-config-prettier: optional: true - eslint-plugin-react-dom@2.3.1: - resolution: {integrity: sha512-Zuvb8iDYRbi8s7mYzvjHKD+i+loHjF6TKJiLGYM/t9F42OWU7V7b4sjIM7pXueukl0o8BSJXDVrQ+9sHOOmxBA==} + eslint-plugin-react-dom@2.3.4: + resolution: {integrity: sha512-xAetOWwrfYnqU0Vd6LjEQi1paAwU7Tgoa+jHUb7QCKxdILDV618yPrMigWpY+438cg6oXTYE/awFI/Rv+dOFCw==} engines: {node: '>=20.19.0'} peerDependencies: eslint: ^9.38.0 typescript: ^5.9.3 - eslint-plugin-react-hooks-extra@2.3.1: - resolution: {integrity: sha512-2t4xQYhUEgPNq1SDQJEXuH3doT+h5spVmerX4rPnBFx0zG2sYfaJV1Gz6z40pI1L3CtBrZag5nFJ44AF/BEg0w==} + eslint-plugin-react-hooks-extra@2.3.4: + resolution: {integrity: sha512-widwgbMP3cC3sjmHidryg2McYqnzoIWcpsQ4JYnaXmRMMTem+Sp7a3+fkWvAUfWQBQIbigPT9O2+VhlvC+xlPg==} engines: {node: '>=20.0.0'} peerDependencies: eslint: ^9.38.0 @@ -5020,22 +5122,22 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - eslint-plugin-react-naming-convention@2.3.1: - resolution: {integrity: sha512-Ghh1o++3XDk3zNKF7DXy3kIN1kJYFiH7wvl4aJF5m9LytQGFrJKTA5kygAaWgR7iL8o4mjk5Ty6Be3OKskpHwA==} + eslint-plugin-react-naming-convention@2.3.4: + resolution: {integrity: sha512-KP6d3WxiLmTnm245VK1lLI4Pzu/tkJLNOsmAetDm0kPfamD71msZMerp4VYFsFtqk0km9rbRKE7Cdd27tL43Ow==} engines: {node: '>=20.19.0'} peerDependencies: eslint: ^9.38.0 typescript: ^5.9.3 - eslint-plugin-react-web-api@2.3.1: - resolution: {integrity: sha512-rb7AYR9SCJkCDkFdqnD6JHNLKF1o29o6tZLSaPdzA1Ssxh7/VKgJ8GpTrgl3Rv+Gnyn+w+3w4XE14d7T1Db9nA==} + eslint-plugin-react-web-api@2.3.4: + resolution: {integrity: sha512-NQMVDVIOiU+vJ98hkrIZeNdIwmO54UOjB8EfiHkgDWk69QBJrBtrn5AguFBuUlBUdZR/9vp4yKdQFtzBbRcDTw==} engines: {node: '>=20.19.0'} peerDependencies: eslint: ^9.38.0 typescript: ^5.9.3 - eslint-plugin-react-x@2.3.1: - resolution: {integrity: sha512-7zfi297NfkoEtqaz2W953gdK4J9nJD5okVhJVxgrcrP+9FVertkGqpbWtMZLpQuWJ216FncY8P6t1U+af8KNOA==} + eslint-plugin-react-x@2.3.4: + resolution: {integrity: sha512-6rW/CALxGCO9M2wuIUMNKuepSf5uW+Sg+AaQtLpsfs+B6fmDVHFrxIgg9wYk2aRrI6MMQcjDUMEYPUX9eOg2wQ==} engines: {node: '>=20.19.0'} peerDependencies: eslint: ^9.38.0 @@ -5155,8 +5257,8 @@ packages: resolution: {integrity: sha512-JhFGDVJ7tmDJItKhYgJCGLOWjuK9vPxiXoUFLwLDc99NlmklilbiQJwoctZtt13+xMw91MCk/REan6MWHqDjyA==} engines: {node: '>=12.0.0'} - exsolve@1.0.7: - resolution: {integrity: sha512-VO5fQUzZtI6C+vx4w/4BWJpg3s/5l+6pRQEHzFRM8WFi4XffSP1Z+4qi7GbjWbvRQEbdIco5mIMq+zX4rPuLrw==} + exsolve@1.0.8: + resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} ext-list@2.2.2: resolution: {integrity: sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==} @@ -5310,8 +5412,8 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] - fumadocs-core@16.0.8: - resolution: {integrity: sha512-nWWwEfcHxn4tmx/knvDlbRUUkbGc6ChNEpLymV5cmQCSAazG0FkgksF5aOxoDq1wPG0THoEMBVD320spe4QWHw==} + fumadocs-core@16.0.10: + resolution: {integrity: sha512-6DQLpJ7ETvSuGZ4TnK6z1wGwnbqht0lK8BcKc3ergWjc8u2XTsPZP3i3tMgOUsKCG0cr9s8fLYz3FGEMOkDuFw==} peerDependencies: '@mixedbread/sdk': ^0.19.0 '@orama/core': 1.x.x @@ -5348,8 +5450,8 @@ packages: waku: optional: true - fumadocs-mdx@13.0.5: - resolution: {integrity: sha512-ERhPxQzoTwEdtuel5dN5OmUItOhGGXTLR1uCjiGPABYeVkc57vAexyTRQSYZMxGlcfjkJaYqt3qY1p5j7i4g7A==} + fumadocs-mdx@13.0.7: + resolution: {integrity: sha512-sbGbqOgfPVZdDWCiSgLXy7gBbu4hXHH+r53Faq6oreXI5QMbKp8/xfEiuqwEldUqD1em1fGvwfhpYrR264Q72Q==} hasBin: true peerDependencies: '@fumadocs/mdx-remote': ^1.4.0 @@ -5367,8 +5469,8 @@ packages: vite: optional: true - fumadocs-ui@16.0.8: - resolution: {integrity: sha512-NyqAiYJnseXYy6ah/rI67Luy5mssSOwOMv03Xy2SHaDrH588Xjtbx84DwnaJXDlu2L/evHMJ+Bvt5/WIdBQbWQ==} + fumadocs-ui@16.0.10: + resolution: {integrity: sha512-XqQU1vFcbl7i3QiRKqRAWGDAmkKTwSSJSSKOoBNk0HGvk1s4wmNJiEH66YwGJFWrvWwGrrSleyuvVS9i3q3seg==} peerDependencies: '@types/react': '*' next: 16.x.x @@ -5547,8 +5649,8 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true - hono@4.10.4: - resolution: {integrity: sha512-YG/fo7zlU3KwrBL5vDpWKisLYiM+nVstBQqfr7gCPbSYURnNEP9BDxEMz8KfsDR9JX0lJWDRNc6nXX31v7ZEyg==} + hono@4.10.5: + resolution: {integrity: sha512-h/MXuTkoAK8NG1EfDp0jI1YLf6yGdDnfkebRO2pwEh5+hE3RAJFXkCsnD0vamSiARK4ZrB6MY+o3E/hCnOyHrQ==} engines: {node: '>=16.9.0'} html-encoding-sniffer@4.0.0: @@ -6430,8 +6532,8 @@ packages: neo-async@2.6.2: resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - next-intl@4.5.0: - resolution: {integrity: sha512-XglGmbs38smaN/QedFVzsypdI4l5tRMpjdU3UL2TtZ3d412oLmmM6enSnHSn0/P59b0ksIp+HlgoLjvHREj1EQ==} + next-intl@4.5.1: + resolution: {integrity: sha512-irtCL71cYJrnleHFpELhlYqb7LIqNiXBssijNVjxUU7hShUFuLYDvYFMbQA0Ocy1WTwSasgmysUHo/bWuKXpRA==} peerDependencies: next: ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0 @@ -7003,8 +7105,8 @@ packages: prosemirror-state: ^1.4.2 prosemirror-view: ^1.33.8 - prosemirror-transform@1.10.4: - resolution: {integrity: sha512-pwDy22nAnGqNR1feOQKHxoFkkUtepoFAd3r2hbEDsnf4wp57kKA36hXsB3njA9FtONBEwSDnDeCiJe+ItD+ykw==} + prosemirror-transform@1.10.5: + resolution: {integrity: sha512-RPDQCxIDhIBb1o36xxwsaeAvivO8VLJcgBtzmOwQ64bMtsVFh5SSuJ6dWSxO1UsHTiTXPCgQm3PDJt7p6IOLbw==} prosemirror-view@1.41.3: resolution: {integrity: sha512-SqMiYMUQNNBP9kfPhLO8WXEk/fon47vc52FQsUiJzTBuyjKgEcoAwMyF04eQ4WZ2ArMn7+ReypYL60aKngbACQ==} @@ -7295,8 +7397,8 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.53.1: - resolution: {integrity: sha512-n2I0V0lN3E9cxxMqBCT3opWOiQBzRN7UG60z/WDKqdX2zHUS/39lezBcsckZFsV6fUTSnfqI7kHf60jDAPGKug==} + rollup@4.53.2: + resolution: {integrity: sha512-MHngMYwGJVi6Fmnk6ISmnk7JAHRNF0UkuucA0CUW3N3a4KnONPEZz+vUanQP/ZC/iY1Qkf3bwPWzyY84wEks1g==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -7882,38 +7984,38 @@ packages: engines: {node: '>=18.0.0'} hasBin: true - turbo-darwin-64@2.6.0: - resolution: {integrity: sha512-6vHnLAubHj8Ib45Knu+oY0ZVCLO7WcibzAvt5b1E72YHqAs4y8meMAGMZM0jLqWPh/9maHDc16/qBCMxtW4pXg==} + turbo-darwin-64@2.6.1: + resolution: {integrity: sha512-Dm0HwhyZF4J0uLqkhUyCVJvKM9Rw7M03v3J9A7drHDQW0qAbIGBrUijQ8g4Q9Cciw/BXRRd8Uzkc3oue+qn+ZQ==} cpu: [x64] os: [darwin] - turbo-darwin-arm64@2.6.0: - resolution: {integrity: sha512-IU+gWMEXNBw8H0pxvE7nPEa5p6yahxbN8g/Q4Bf0AHymsAFqsScgV0peeNbWybdmY9jk1LPbALOsF2kY1I7ZiQ==} + turbo-darwin-arm64@2.6.1: + resolution: {integrity: sha512-U0PIPTPyxdLsrC3jN7jaJUwgzX5sVUBsKLO7+6AL+OASaa1NbT1pPdiZoTkblBAALLP76FM0LlnsVQOnmjYhyw==} cpu: [arm64] os: [darwin] - turbo-linux-64@2.6.0: - resolution: {integrity: sha512-CKoiJ2ZFJLCDsWdRlZg+ew1BkGn8iCEGdePhISVpjsGwkJwSVhVu49z2zKdBeL1IhcSKS2YALwp9ellNZANJxw==} + turbo-linux-64@2.6.1: + resolution: {integrity: sha512-eM1uLWgzv89bxlK29qwQEr9xYWBhmO/EGiH22UGfq+uXr+QW1OvNKKMogSN65Ry8lElMH4LZh0aX2DEc7eC0Mw==} cpu: [x64] os: [linux] - turbo-linux-arm64@2.6.0: - resolution: {integrity: sha512-WroVCdCvJbrhNxNdw7XB7wHAfPPJPV+IXY+ZKNed+9VdfBu/2mQNfKnvqTuFTH7n+Pdpv8to9qwhXRTJe26upg==} + turbo-linux-arm64@2.6.1: + resolution: {integrity: sha512-MFFh7AxAQAycXKuZDrbeutfWM5Ep0CEZ9u7zs4Hn2FvOViTCzIfEhmuJou3/a5+q5VX1zTxQrKGy+4Lf5cdpsA==} cpu: [arm64] os: [linux] - turbo-windows-64@2.6.0: - resolution: {integrity: sha512-7pZo5aGQPR+A7RMtWCZHusarJ6y15LQ+o3jOmpMxTic/W6Bad+jSeqo07TWNIseIWjCVzrSv27+0odiYRYtQdA==} + turbo-windows-64@2.6.1: + resolution: {integrity: sha512-buq7/VAN7KOjMYi4tSZT5m+jpqyhbRU2EUTTvp6V0Ii8dAkY2tAAjQN1q5q2ByflYWKecbQNTqxmVploE0LVwQ==} cpu: [x64] os: [win32] - turbo-windows-arm64@2.6.0: - resolution: {integrity: sha512-1Ty+NwIksQY7AtFUCPrTpcKQE7zmd/f7aRjdT+qkqGFQjIjFYctEtN7qo4vpQPBgCfS1U3ka83A2u/9CfJQ3wQ==} + turbo-windows-arm64@2.6.1: + resolution: {integrity: sha512-7w+AD5vJp3R+FB0YOj1YJcNcOOvBior7bcHTodqp90S3x3bLgpr7tE6xOea1e8JkP7GK6ciKVUpQvV7psiwU5Q==} cpu: [arm64] os: [win32] - turbo@2.6.0: - resolution: {integrity: sha512-kC5VJqOXo50k0/0jnJDDjibLAXalqT9j7PQ56so0pN+81VR4Fwb2QgIE9dTzT3phqOTQuEXkPh3sCpnv5Isz2g==} + turbo@2.6.1: + resolution: {integrity: sha512-qBwXXuDT3rA53kbNafGbT5r++BrhRgx3sAo0cHoDAeG9g1ItTmUMgltz3Hy7Hazy1ODqNpR+C7QwqL6DYB52yA==} hasBin: true tw-animate-css@1.4.0: @@ -7947,8 +8049,8 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typescript-eslint@8.46.3: - resolution: {integrity: sha512-bAfgMavTuGo+8n6/QQDVQz4tZ4f7Soqg53RbrlZQEoAltYop/XR4RAts/I0BrO3TTClTSTFJ0wYbla+P8cEWJA==} + typescript-eslint@8.46.4: + resolution: {integrity: sha512-KALyxkpYV5Ix7UhvjTwJXZv76VWsHG+NjNlt/z+a17SOQSiOcBdUXdbJdyXi7RPxrBFECtFOiPwUJQusJuCqrg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -8044,8 +8146,8 @@ packages: peerDependencies: react: '*' - use-intl@4.5.0: - resolution: {integrity: sha512-H0w/sWilzbd1y0+fve2o6EnJ8B7bDwpI+pd1o/zjO717FVSi1clYe6dCmIyPc8NEKOS9BGm1IK9ipSY7OZAqZg==} + use-intl@4.5.1: + resolution: {integrity: sha512-a9wVAuIofJuoD3wQazNuCr2B04rStdgUzILHNXHuogyOx2h0RabnfrRfFlGJnmrZDwN6JtPqD2aHLh4Naa8M0Q==} peerDependencies: react: ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0 @@ -8808,9 +8910,9 @@ snapshots: '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-module-transforms': 7.28.3(@babel/core@7.26.10) '@babel/helpers': 7.28.4 - '@babel/parser': 7.28.5 + '@babel/parser': 7.27.0 '@babel/template': 7.27.2 - '@babel/traverse': 7.28.5 + '@babel/traverse': 7.27.0 '@babel/types': 7.28.5 convert-source-map: 2.0.0 debug: 4.4.3 @@ -8852,7 +8954,7 @@ snapshots: dependencies: '@babel/compat-data': 7.28.5 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.27.0 + browserslist: 4.28.0 lru-cache: 5.1.1 semver: 6.3.1 @@ -8926,7 +9028,7 @@ snapshots: dependencies: '@babel/code-frame': 7.27.1 '@babel/generator': 7.28.5 - '@babel/parser': 7.28.5 + '@babel/parser': 7.27.0 '@babel/template': 7.27.2 '@babel/types': 7.28.5 debug: 4.4.3 @@ -8984,7 +9086,7 @@ snapshots: dependencies: '@csstools/css-tokenizer': 3.0.4 - '@csstools/css-syntax-patches-for-csstree@1.0.15': {} + '@csstools/css-syntax-patches-for-csstree@1.0.16': {} '@csstools/css-tokenizer@3.0.4': {} @@ -9254,27 +9356,27 @@ snapshots: '@eslint-community/regexpp@4.12.2': {} - '@eslint-react/ast@2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + '@eslint-react/ast@2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-react/eff': 2.3.1 - '@typescript-eslint/types': 8.46.3 - '@typescript-eslint/typescript-estree': 8.46.3(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.3.4 + '@typescript-eslint/types': 8.46.4 + '@typescript-eslint/typescript-estree': 8.46.4(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) string-ts: 2.2.1 transitivePeerDependencies: - eslint - supports-color - typescript - '@eslint-react/core@2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + '@eslint-react/core@2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-react/ast': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/eff': 2.3.1 - '@eslint-react/shared': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/var': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.46.3 - '@typescript-eslint/types': 8.46.3 - '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/ast': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.3.4 + '@eslint-react/shared': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/var': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.46.4 + '@typescript-eslint/types': 8.46.4 + '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) birecord: 0.1.1 ts-pattern: 5.9.0 transitivePeerDependencies: @@ -9282,31 +9384,31 @@ snapshots: - supports-color - typescript - '@eslint-react/eff@2.3.1': {} + '@eslint-react/eff@2.3.4': {} - '@eslint-react/eslint-plugin@2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + '@eslint-react/eslint-plugin@2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-react/eff': 2.3.1 - '@eslint-react/shared': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.46.3 - '@typescript-eslint/type-utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/types': 8.46.3 - '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.3.4 + '@eslint-react/shared': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.46.4 + '@typescript-eslint/type-utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.46.4 + '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.1(jiti@2.6.1) - eslint-plugin-react-dom: 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - eslint-plugin-react-hooks-extra: 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - eslint-plugin-react-naming-convention: 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - eslint-plugin-react-web-api: 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - eslint-plugin-react-x: 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-react-dom: 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-react-hooks-extra: 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-react-naming-convention: 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-react-web-api: 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-react-x: 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) ts-api-utils: 2.1.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@eslint-react/shared@2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + '@eslint-react/shared@2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-react/eff': 2.3.1 - '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.3.4 + '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) ts-pattern: 5.9.0 zod: 4.1.12 transitivePeerDependencies: @@ -9314,13 +9416,13 @@ snapshots: - supports-color - typescript - '@eslint-react/var@2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + '@eslint-react/var@2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-react/ast': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/eff': 2.3.1 - '@typescript-eslint/scope-manager': 8.46.3 - '@typescript-eslint/types': 8.46.3 - '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/ast': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.3.4 + '@typescript-eslint/scope-manager': 8.46.4 + '@typescript-eslint/types': 8.46.4 + '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) ts-pattern: 5.9.0 transitivePeerDependencies: - eslint @@ -9419,25 +9521,25 @@ snapshots: dependencies: tslib: 2.8.1 - '@hono/node-server@1.19.6(hono@4.10.4)': + '@hono/node-server@1.19.6(hono@4.10.5)': dependencies: - hono: 4.10.4 + hono: 4.10.5 - '@hono/swagger-ui@0.5.2(hono@4.10.4)': + '@hono/swagger-ui@0.5.2(hono@4.10.5)': dependencies: - hono: 4.10.4 + hono: 4.10.5 - '@hono/zod-openapi@1.1.4(hono@4.10.4)(zod@4.1.12)': + '@hono/zod-openapi@1.1.4(hono@4.10.5)(zod@4.1.12)': dependencies: '@asteasolutions/zod-to-openapi': 8.1.0(zod@4.1.12) - '@hono/zod-validator': 0.7.4(hono@4.10.4)(zod@4.1.12) - hono: 4.10.4 + '@hono/zod-validator': 0.7.4(hono@4.10.5)(zod@4.1.12) + hono: 4.10.5 openapi3-ts: 4.5.0 zod: 4.1.12 - '@hono/zod-validator@0.7.4(hono@4.10.4)(zod@4.1.12)': + '@hono/zod-validator@0.7.4(hono@4.10.5)(zod@4.1.12)': dependencies: - hono: 4.10.4 + hono: 4.10.5 zod: 4.1.12 '@hookform/resolvers@5.2.2(react-hook-form@7.66.0(react@19.2.0))': @@ -9995,45 +10097,45 @@ snapshots: '@radix-ui/primitive@1.1.3': {} - '@radix-ui/react-accessible-icon@1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-accessible-icon@1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) - '@radix-ui/react-accordion@1.2.12(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-accordion@1.2.12(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) - '@radix-ui/react-alert-dialog@1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-alert-dialog@1.1.15(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: @@ -10044,52 +10146,52 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-arrow@1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) - '@radix-ui/react-aspect-ratio@1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-aspect-ratio@1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) - '@radix-ui/react-avatar@1.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-avatar@1.1.10(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) - '@radix-ui/react-checkbox@1.3.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-checkbox@1.3.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-collapsible@1.1.12(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: @@ -10107,21 +10209,21 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-collapsible@1.1.12(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-collapsible@1.1.12(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-collection@1.1.7(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: @@ -10135,17 +10237,17 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-collection@1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-compose-refs@1.1.2(@types/react@19.0.10)(react@19.0.0)': dependencies: @@ -10153,25 +10255,25 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 - '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.3)(react@19.2.0)': dependencies: react: 19.2.0 optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 - '@radix-ui/react-context-menu@2.2.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-context-menu@2.2.16(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-context@1.1.2(@types/react@19.0.10)(react@19.0.0)': dependencies: @@ -10179,33 +10281,33 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 - '@radix-ui/react-context@1.1.2(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-context@1.1.2(@types/react@19.2.3)(react@19.2.0)': dependencies: react: 19.2.0 optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 - '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-dialog@1.1.15(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) aria-hidden: 1.2.6 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - react-remove-scroll: 2.7.1(@types/react@19.2.2)(react@19.2.0) + react-remove-scroll: 2.7.1(@types/react@19.2.3)(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-direction@1.1.1(@types/react@19.0.10)(react@19.0.0)': dependencies: @@ -10213,11 +10315,11 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 - '@radix-ui/react-direction@1.1.1(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-direction@1.1.1(@types/react@19.2.3)(react@19.2.0)': dependencies: react: 19.2.0 optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: @@ -10232,18 +10334,18 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-dismissable-layer@1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: @@ -10260,20 +10362,20 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-dropdown-menu@2.1.16(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-focus-guards@1.1.3(@types/react@19.0.10)(react@19.0.0)': dependencies: @@ -10281,11 +10383,11 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 - '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-focus-guards@1.1.3(@types/react@19.2.3)(react@19.2.0)': dependencies: react: 19.2.0 optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: @@ -10298,47 +10400,47 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-focus-scope@1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) - '@radix-ui/react-form@0.1.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-form@0.1.8(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-label': 2.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-label': 2.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) - '@radix-ui/react-hover-card@1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-hover-card@1.1.15(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-id@1.1.1(@types/react@19.0.10)(react@19.0.0)': dependencies: @@ -10347,21 +10449,21 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 - '@radix-ui/react-id@1.1.1(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-id@1.1.1(@types/react@19.2.3)(react@19.2.0)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 - '@radix-ui/react-label@2.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-label@2.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-menu@2.1.16(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: @@ -10389,107 +10491,107 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-menu@2.1.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-menu@2.1.16(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.3)(react@19.2.0) aria-hidden: 1.2.6 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - react-remove-scroll: 2.7.1(@types/react@19.2.2)(react@19.2.0) + react-remove-scroll: 2.7.1(@types/react@19.2.3)(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) - '@radix-ui/react-menubar@1.1.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-menubar@1.1.16(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) - '@radix-ui/react-navigation-menu@1.2.14(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-navigation-menu@1.2.14(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) - '@radix-ui/react-one-time-password-field@0.1.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-one-time-password-field@0.1.8(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/number': 1.1.1 '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) - '@radix-ui/react-password-toggle-field@0.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-password-toggle-field@0.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-popover@1.1.15(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: @@ -10514,28 +10616,28 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-popover@1.1.15(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) aria-hidden: 1.2.6 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - react-remove-scroll: 2.7.1(@types/react@19.2.2)(react@19.2.0) + react-remove-scroll: 2.7.1(@types/react@19.2.3)(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-popper@1.2.8(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: @@ -10555,23 +10657,23 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-popper@1.2.8(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@floating-ui/react-dom': 2.1.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.3)(react@19.2.0) '@radix-ui/rect': 1.1.1 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-portal@1.1.9(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: @@ -10583,15 +10685,15 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-portal@1.1.9(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-presence@1.1.5(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: @@ -10603,15 +10705,15 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-presence@1.1.5(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: @@ -10622,51 +10724,51 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) - '@radix-ui/react-primitive@2.1.4(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-primitive@2.1.4(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-slot': 1.2.4(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-slot': 1.2.4(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) - '@radix-ui/react-progress@1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-progress@1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) - '@radix-ui/react-radio-group@1.3.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-radio-group@1.3.8(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: @@ -10685,96 +10787,96 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-roving-focus@1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) - '@radix-ui/react-scroll-area@1.2.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-scroll-area@1.2.10(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/number': 1.1.1 '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) - '@radix-ui/react-select@2.2.6(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-select@2.2.6(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/number': 1.1.1 '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) aria-hidden: 1.2.6 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - react-remove-scroll: 2.7.1(@types/react@19.2.2)(react@19.2.0) + react-remove-scroll: 2.7.1(@types/react@19.2.3)(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) - '@radix-ui/react-separator@1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-separator@1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) - '@radix-ui/react-slider@1.3.6(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-slider@1.3.6(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/number': 1.1.1 '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-slot@1.2.3(@types/react@19.0.10)(react@19.0.0)': dependencies: @@ -10783,34 +10885,34 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 - '@radix-ui/react-slot@1.2.3(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-slot@1.2.3(@types/react@19.2.3)(react@19.2.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 - '@radix-ui/react-slot@1.2.4(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-slot@1.2.4(@types/react@19.2.3)(react@19.2.0)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 - '@radix-ui/react-switch@1.2.6(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-switch@1.2.6(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: @@ -10828,41 +10930,41 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-tabs@1.1.13(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) - '@radix-ui/react-toast@1.2.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-toast@1.2.15(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-toggle-group@1.1.11(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: @@ -10879,20 +10981,20 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-toggle-group@1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-toggle-group@1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-toggle@1.1.10(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: @@ -10905,31 +11007,31 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-toggle@1.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-toggle@1.1.10(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) - '@radix-ui/react-toolbar@1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-toolbar@1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-separator': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-toggle-group': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-separator': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-toggle-group': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-tooltip@1.2.8(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: @@ -10951,25 +11053,25 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-tooltip@1.2.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-tooltip@1.2.8(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.0.10)(react@19.0.0)': dependencies: @@ -10977,11 +11079,11 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 - '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.2.3)(react@19.2.0)': dependencies: react: 19.2.0 optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.0.10)(react@19.0.0)': dependencies: @@ -10991,13 +11093,13 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 - '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.3)(react@19.2.0)': dependencies: - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.0.10)(react@19.0.0)': dependencies: @@ -11006,12 +11108,12 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 - '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.3)(react@19.2.0)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.0.10)(react@19.0.0)': dependencies: @@ -11020,19 +11122,19 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 - '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.2.3)(react@19.2.0)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 - '@radix-ui/react-use-is-hydrated@0.1.0(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-use-is-hydrated@0.1.0(@types/react@19.2.3)(react@19.2.0)': dependencies: react: 19.2.0 use-sync-external-store: 1.6.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.0.10)(react@19.0.0)': dependencies: @@ -11040,17 +11142,17 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 - '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.3)(react@19.2.0)': dependencies: react: 19.2.0 optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 - '@radix-ui/react-use-previous@1.1.1(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-use-previous@1.1.1(@types/react@19.2.3)(react@19.2.0)': dependencies: react: 19.2.0 optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 '@radix-ui/react-use-rect@1.1.1(@types/react@19.0.10)(react@19.0.0)': dependencies: @@ -11059,12 +11161,12 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 - '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-use-rect@1.1.1(@types/react@19.2.3)(react@19.2.0)': dependencies: '@radix-ui/rect': 1.1.1 react: 19.2.0 optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 '@radix-ui/react-use-size@1.1.1(@types/react@19.0.10)(react@19.0.0)': dependencies: @@ -11073,12 +11175,12 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 - '@radix-ui/react-use-size@1.1.1(@types/react@19.2.2)(react@19.2.0)': + '@radix-ui/react-use-size@1.1.1(@types/react@19.2.3)(react@19.2.0)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.3)(react@19.2.0) react: 19.2.0 optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.0.4(@types/react@19.0.10))(@types/react@19.0.10)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: @@ -11089,14 +11191,14 @@ snapshots: '@types/react': 19.0.10 '@types/react-dom': 19.0.4(@types/react@19.0.10) - '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@radix-ui/react-visually-hidden@1.2.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@radix-ui/rect@1.1.1': {} @@ -11184,7 +11286,7 @@ snapshots: marked: 15.0.12 react: 19.2.0 - '@react-email/preview-server@5.0.1(@playwright/test@1.56.1)(@react-email/body@0.2.0(react@19.2.0))(@react-email/button@0.2.0(react@19.2.0))(@react-email/code-block@0.2.0(react@19.2.0))(@react-email/code-inline@0.0.5(react@19.2.0))(@react-email/container@0.0.15(react@19.2.0))(@react-email/heading@0.0.15(react@19.2.0))(@react-email/hr@0.0.11(react@19.2.0))(@react-email/img@0.0.11(react@19.2.0))(@react-email/link@0.0.12(react@19.2.0))(@react-email/preview@0.0.13(react@19.2.0))(@react-email/render@2.0.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@react-email/text@0.1.5(react@19.2.0))(@swc/core@1.15.1)(postcss@8.5.6)': + '@react-email/preview-server@5.0.1(@playwright/test@1.56.1)(@react-email/body@0.2.0(react@19.2.0))(@react-email/button@0.2.0(react@19.2.0))(@react-email/code-block@0.2.0(react@19.2.0))(@react-email/code-inline@0.0.5(react@19.2.0))(@react-email/container@0.0.15(react@19.2.0))(@react-email/heading@0.0.15(react@19.2.0))(@react-email/hr@0.0.11(react@19.2.0))(@react-email/img@0.0.11(react@19.2.0))(@react-email/link@0.0.12(react@19.2.0))(@react-email/preview@0.0.13(react@19.2.0))(@react-email/render@2.0.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(@react-email/text@0.1.5(react@19.2.0))(@swc/core@1.15.1)(babel-plugin-react-compiler@1.0.0)(postcss@8.5.6)': dependencies: '@babel/core': 7.26.10 '@babel/parser': 7.27.0 @@ -11213,8 +11315,8 @@ snapshots: json5: 2.2.3 log-symbols: 4.1.0 module-punycode: punycode@2.3.1 - next: 16.0.1(@babel/core@7.26.10)(@playwright/test@1.56.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - next-safe-action: 8.0.11(next@16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + next: 16.0.1(@babel/core@7.26.10)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + next-safe-action: 8.0.11(next@16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0) node-html-parser: 7.0.1 ora: 5.4.1 pretty-bytes: 6.1.1 @@ -11321,78 +11423,78 @@ snapshots: '@rolldown/pluginutils@1.0.0-beta.43': {} - '@rollup/pluginutils@5.3.0(rollup@4.53.1)': + '@rollup/pluginutils@5.3.0(rollup@4.53.2)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: - rollup: 4.53.1 + rollup: 4.53.2 - '@rollup/rollup-android-arm-eabi@4.53.1': + '@rollup/rollup-android-arm-eabi@4.53.2': optional: true - '@rollup/rollup-android-arm64@4.53.1': + '@rollup/rollup-android-arm64@4.53.2': optional: true - '@rollup/rollup-darwin-arm64@4.53.1': + '@rollup/rollup-darwin-arm64@4.53.2': optional: true - '@rollup/rollup-darwin-x64@4.53.1': + '@rollup/rollup-darwin-x64@4.53.2': optional: true - '@rollup/rollup-freebsd-arm64@4.53.1': + '@rollup/rollup-freebsd-arm64@4.53.2': optional: true - '@rollup/rollup-freebsd-x64@4.53.1': + '@rollup/rollup-freebsd-x64@4.53.2': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.53.1': + '@rollup/rollup-linux-arm-gnueabihf@4.53.2': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.53.1': + '@rollup/rollup-linux-arm-musleabihf@4.53.2': optional: true - '@rollup/rollup-linux-arm64-gnu@4.53.1': + '@rollup/rollup-linux-arm64-gnu@4.53.2': optional: true - '@rollup/rollup-linux-arm64-musl@4.53.1': + '@rollup/rollup-linux-arm64-musl@4.53.2': optional: true - '@rollup/rollup-linux-loong64-gnu@4.53.1': + '@rollup/rollup-linux-loong64-gnu@4.53.2': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.53.1': + '@rollup/rollup-linux-ppc64-gnu@4.53.2': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.53.1': + '@rollup/rollup-linux-riscv64-gnu@4.53.2': optional: true - '@rollup/rollup-linux-riscv64-musl@4.53.1': + '@rollup/rollup-linux-riscv64-musl@4.53.2': optional: true - '@rollup/rollup-linux-s390x-gnu@4.53.1': + '@rollup/rollup-linux-s390x-gnu@4.53.2': optional: true - '@rollup/rollup-linux-x64-gnu@4.53.1': + '@rollup/rollup-linux-x64-gnu@4.53.2': optional: true - '@rollup/rollup-linux-x64-musl@4.53.1': + '@rollup/rollup-linux-x64-musl@4.53.2': optional: true - '@rollup/rollup-openharmony-arm64@4.53.1': + '@rollup/rollup-openharmony-arm64@4.53.2': optional: true - '@rollup/rollup-win32-arm64-msvc@4.53.1': + '@rollup/rollup-win32-arm64-msvc@4.53.2': optional: true - '@rollup/rollup-win32-ia32-msvc@4.53.1': + '@rollup/rollup-win32-ia32-msvc@4.53.2': optional: true - '@rollup/rollup-win32-x64-gnu@4.53.1': + '@rollup/rollup-win32-x64-gnu@4.53.2': optional: true - '@rollup/rollup-win32-x64-msvc@4.53.1': + '@rollup/rollup-win32-x64-msvc@4.53.2': optional: true '@schummar/icu-type-parser@1.21.5': {} @@ -11733,18 +11835,18 @@ snapshots: '@standard-schema/utils@0.3.0': {} - '@swc/cli@0.6.0(@swc/core@1.15.1)(chokidar@4.0.3)': + '@swc/cli@0.7.9(@swc/core@1.15.1)(chokidar@4.0.3)': dependencies: '@swc/core': 1.15.1 '@swc/counter': 0.1.3 '@xhmikosr/bin-wrapper': 13.2.0 commander: 8.3.0 - fast-glob: 3.3.3 minimatch: 9.0.5 piscina: 4.9.2 semver: 7.7.3 slash: 3.0.0 source-map: 0.7.6 + tinyglobby: 0.2.15 optionalDependencies: chokidar: 4.0.3 transitivePeerDependencies: @@ -11899,133 +12001,133 @@ snapshots: picocolors: 1.1.1 pretty-format: 27.5.1 - '@testing-library/react@16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@testing-library/react@16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@babel/runtime': 7.28.4 '@testing-library/dom': 10.4.1 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) - '@tiptap/core@3.10.4(@tiptap/pm@3.10.4)': + '@tiptap/core@3.10.5(@tiptap/pm@3.10.5)': dependencies: - '@tiptap/pm': 3.10.4 + '@tiptap/pm': 3.10.5 - '@tiptap/extension-blockquote@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))': + '@tiptap/extension-blockquote@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))': dependencies: - '@tiptap/core': 3.10.4(@tiptap/pm@3.10.4) + '@tiptap/core': 3.10.5(@tiptap/pm@3.10.5) - '@tiptap/extension-bold@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))': + '@tiptap/extension-bold@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))': dependencies: - '@tiptap/core': 3.10.4(@tiptap/pm@3.10.4) + '@tiptap/core': 3.10.5(@tiptap/pm@3.10.5) - '@tiptap/extension-bubble-menu@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4)': + '@tiptap/extension-bubble-menu@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5)': dependencies: '@floating-ui/dom': 1.7.4 - '@tiptap/core': 3.10.4(@tiptap/pm@3.10.4) - '@tiptap/pm': 3.10.4 + '@tiptap/core': 3.10.5(@tiptap/pm@3.10.5) + '@tiptap/pm': 3.10.5 optional: true - '@tiptap/extension-bullet-list@3.10.4(@tiptap/extension-list@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4))': + '@tiptap/extension-bullet-list@3.10.5(@tiptap/extension-list@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5))': dependencies: - '@tiptap/extension-list': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4) + '@tiptap/extension-list': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5) - '@tiptap/extension-code-block@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4)': + '@tiptap/extension-code-block@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5)': dependencies: - '@tiptap/core': 3.10.4(@tiptap/pm@3.10.4) - '@tiptap/pm': 3.10.4 + '@tiptap/core': 3.10.5(@tiptap/pm@3.10.5) + '@tiptap/pm': 3.10.5 - '@tiptap/extension-code@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))': + '@tiptap/extension-code@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))': dependencies: - '@tiptap/core': 3.10.4(@tiptap/pm@3.10.4) + '@tiptap/core': 3.10.5(@tiptap/pm@3.10.5) - '@tiptap/extension-document@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))': + '@tiptap/extension-document@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))': dependencies: - '@tiptap/core': 3.10.4(@tiptap/pm@3.10.4) + '@tiptap/core': 3.10.5(@tiptap/pm@3.10.5) - '@tiptap/extension-dropcursor@3.10.4(@tiptap/extensions@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4))': + '@tiptap/extension-dropcursor@3.10.5(@tiptap/extensions@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5))': dependencies: - '@tiptap/extensions': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4) + '@tiptap/extensions': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5) - '@tiptap/extension-floating-menu@3.10.4(@floating-ui/dom@1.7.4)(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4)': + '@tiptap/extension-floating-menu@3.10.5(@floating-ui/dom@1.7.4)(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5)': dependencies: '@floating-ui/dom': 1.7.4 - '@tiptap/core': 3.10.4(@tiptap/pm@3.10.4) - '@tiptap/pm': 3.10.4 + '@tiptap/core': 3.10.5(@tiptap/pm@3.10.5) + '@tiptap/pm': 3.10.5 optional: true - '@tiptap/extension-gapcursor@3.10.4(@tiptap/extensions@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4))': + '@tiptap/extension-gapcursor@3.10.5(@tiptap/extensions@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5))': dependencies: - '@tiptap/extensions': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4) + '@tiptap/extensions': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5) - '@tiptap/extension-hard-break@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))': + '@tiptap/extension-hard-break@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))': dependencies: - '@tiptap/core': 3.10.4(@tiptap/pm@3.10.4) + '@tiptap/core': 3.10.5(@tiptap/pm@3.10.5) - '@tiptap/extension-heading@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))': + '@tiptap/extension-heading@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))': dependencies: - '@tiptap/core': 3.10.4(@tiptap/pm@3.10.4) + '@tiptap/core': 3.10.5(@tiptap/pm@3.10.5) - '@tiptap/extension-horizontal-rule@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4)': + '@tiptap/extension-horizontal-rule@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5)': dependencies: - '@tiptap/core': 3.10.4(@tiptap/pm@3.10.4) - '@tiptap/pm': 3.10.4 + '@tiptap/core': 3.10.5(@tiptap/pm@3.10.5) + '@tiptap/pm': 3.10.5 - '@tiptap/extension-italic@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))': + '@tiptap/extension-italic@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))': dependencies: - '@tiptap/core': 3.10.4(@tiptap/pm@3.10.4) + '@tiptap/core': 3.10.5(@tiptap/pm@3.10.5) - '@tiptap/extension-link@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4)': + '@tiptap/extension-link@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5)': dependencies: - '@tiptap/core': 3.10.4(@tiptap/pm@3.10.4) - '@tiptap/pm': 3.10.4 + '@tiptap/core': 3.10.5(@tiptap/pm@3.10.5) + '@tiptap/pm': 3.10.5 linkifyjs: 4.3.2 - '@tiptap/extension-list-item@3.10.4(@tiptap/extension-list@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4))': + '@tiptap/extension-list-item@3.10.5(@tiptap/extension-list@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5))': dependencies: - '@tiptap/extension-list': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4) + '@tiptap/extension-list': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5) - '@tiptap/extension-list-keymap@3.10.4(@tiptap/extension-list@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4))': + '@tiptap/extension-list-keymap@3.10.5(@tiptap/extension-list@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5))': dependencies: - '@tiptap/extension-list': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4) + '@tiptap/extension-list': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5) - '@tiptap/extension-list@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4)': + '@tiptap/extension-list@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5)': dependencies: - '@tiptap/core': 3.10.4(@tiptap/pm@3.10.4) - '@tiptap/pm': 3.10.4 + '@tiptap/core': 3.10.5(@tiptap/pm@3.10.5) + '@tiptap/pm': 3.10.5 - '@tiptap/extension-ordered-list@3.10.4(@tiptap/extension-list@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4))': + '@tiptap/extension-ordered-list@3.10.5(@tiptap/extension-list@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5))': dependencies: - '@tiptap/extension-list': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4) + '@tiptap/extension-list': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5) - '@tiptap/extension-paragraph@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))': + '@tiptap/extension-paragraph@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))': dependencies: - '@tiptap/core': 3.10.4(@tiptap/pm@3.10.4) + '@tiptap/core': 3.10.5(@tiptap/pm@3.10.5) - '@tiptap/extension-strike@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))': + '@tiptap/extension-strike@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))': dependencies: - '@tiptap/core': 3.10.4(@tiptap/pm@3.10.4) + '@tiptap/core': 3.10.5(@tiptap/pm@3.10.5) - '@tiptap/extension-text-align@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))': + '@tiptap/extension-text-align@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))': dependencies: - '@tiptap/core': 3.10.4(@tiptap/pm@3.10.4) + '@tiptap/core': 3.10.5(@tiptap/pm@3.10.5) - '@tiptap/extension-text@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))': + '@tiptap/extension-text@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))': dependencies: - '@tiptap/core': 3.10.4(@tiptap/pm@3.10.4) + '@tiptap/core': 3.10.5(@tiptap/pm@3.10.5) - '@tiptap/extension-underline@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))': + '@tiptap/extension-underline@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))': dependencies: - '@tiptap/core': 3.10.4(@tiptap/pm@3.10.4) + '@tiptap/core': 3.10.5(@tiptap/pm@3.10.5) - '@tiptap/extensions@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4)': + '@tiptap/extensions@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5)': dependencies: - '@tiptap/core': 3.10.4(@tiptap/pm@3.10.4) - '@tiptap/pm': 3.10.4 + '@tiptap/core': 3.10.5(@tiptap/pm@3.10.5) + '@tiptap/pm': 3.10.5 - '@tiptap/pm@3.10.4': + '@tiptap/pm@3.10.5': dependencies: prosemirror-changeset: 2.3.1 prosemirror-collab: 1.3.1 @@ -12043,52 +12145,52 @@ snapshots: prosemirror-state: 1.4.4 prosemirror-tables: 1.8.1 prosemirror-trailing-node: 3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.3) - prosemirror-transform: 1.10.4 + prosemirror-transform: 1.10.5 prosemirror-view: 1.41.3 - '@tiptap/react@3.10.4(@floating-ui/dom@1.7.4)(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4)(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@tiptap/react@3.10.5(@floating-ui/dom@1.7.4)(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5)(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: - '@tiptap/core': 3.10.4(@tiptap/pm@3.10.4) - '@tiptap/pm': 3.10.4 - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@tiptap/core': 3.10.5(@tiptap/pm@3.10.5) + '@tiptap/pm': 3.10.5 + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) '@types/use-sync-external-store': 0.0.6 fast-deep-equal: 3.1.3 react: 19.2.0 react-dom: 19.2.0(react@19.2.0) use-sync-external-store: 1.6.0(react@19.2.0) optionalDependencies: - '@tiptap/extension-bubble-menu': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4) - '@tiptap/extension-floating-menu': 3.10.4(@floating-ui/dom@1.7.4)(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4) + '@tiptap/extension-bubble-menu': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5) + '@tiptap/extension-floating-menu': 3.10.5(@floating-ui/dom@1.7.4)(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5) transitivePeerDependencies: - '@floating-ui/dom' - '@tiptap/starter-kit@3.10.4': - dependencies: - '@tiptap/core': 3.10.4(@tiptap/pm@3.10.4) - '@tiptap/extension-blockquote': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4)) - '@tiptap/extension-bold': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4)) - '@tiptap/extension-bullet-list': 3.10.4(@tiptap/extension-list@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4)) - '@tiptap/extension-code': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4)) - '@tiptap/extension-code-block': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4) - '@tiptap/extension-document': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4)) - '@tiptap/extension-dropcursor': 3.10.4(@tiptap/extensions@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4)) - '@tiptap/extension-gapcursor': 3.10.4(@tiptap/extensions@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4)) - '@tiptap/extension-hard-break': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4)) - '@tiptap/extension-heading': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4)) - '@tiptap/extension-horizontal-rule': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4) - '@tiptap/extension-italic': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4)) - '@tiptap/extension-link': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4) - '@tiptap/extension-list': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4) - '@tiptap/extension-list-item': 3.10.4(@tiptap/extension-list@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4)) - '@tiptap/extension-list-keymap': 3.10.4(@tiptap/extension-list@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4)) - '@tiptap/extension-ordered-list': 3.10.4(@tiptap/extension-list@3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4)) - '@tiptap/extension-paragraph': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4)) - '@tiptap/extension-strike': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4)) - '@tiptap/extension-text': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4)) - '@tiptap/extension-underline': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4)) - '@tiptap/extensions': 3.10.4(@tiptap/core@3.10.4(@tiptap/pm@3.10.4))(@tiptap/pm@3.10.4) - '@tiptap/pm': 3.10.4 + '@tiptap/starter-kit@3.10.5': + dependencies: + '@tiptap/core': 3.10.5(@tiptap/pm@3.10.5) + '@tiptap/extension-blockquote': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5)) + '@tiptap/extension-bold': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5)) + '@tiptap/extension-bullet-list': 3.10.5(@tiptap/extension-list@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5)) + '@tiptap/extension-code': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5)) + '@tiptap/extension-code-block': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5) + '@tiptap/extension-document': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5)) + '@tiptap/extension-dropcursor': 3.10.5(@tiptap/extensions@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5)) + '@tiptap/extension-gapcursor': 3.10.5(@tiptap/extensions@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5)) + '@tiptap/extension-hard-break': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5)) + '@tiptap/extension-heading': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5)) + '@tiptap/extension-horizontal-rule': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5) + '@tiptap/extension-italic': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5)) + '@tiptap/extension-link': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5) + '@tiptap/extension-list': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5) + '@tiptap/extension-list-item': 3.10.5(@tiptap/extension-list@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5)) + '@tiptap/extension-list-keymap': 3.10.5(@tiptap/extension-list@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5)) + '@tiptap/extension-ordered-list': 3.10.5(@tiptap/extension-list@3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5)) + '@tiptap/extension-paragraph': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5)) + '@tiptap/extension-strike': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5)) + '@tiptap/extension-text': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5)) + '@tiptap/extension-underline': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5)) + '@tiptap/extensions': 3.10.5(@tiptap/core@3.10.5(@tiptap/pm@3.10.5))(@tiptap/pm@3.10.5) + '@tiptap/pm': 3.10.5 '@tokenizer/inflate@0.2.7': dependencies: @@ -12231,19 +12333,19 @@ snapshots: dependencies: '@types/react': 19.0.10 - '@types/react-dom@19.2.2(@types/react@19.2.2)': + '@types/react-dom@19.2.2(@types/react@19.2.3)': dependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 - '@types/react-reconciler@0.28.9(@types/react@19.2.2)': + '@types/react-reconciler@0.28.9(@types/react@19.2.3)': dependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 '@types/react@19.0.10': dependencies: csstype: 3.1.3 - '@types/react@19.2.2': + '@types/react@19.2.3': dependencies: csstype: 3.1.3 @@ -12266,14 +12368,14 @@ snapshots: - uglify-js - webpack-cli - '@typescript-eslint/eslint-plugin@8.46.3(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.46.4(@typescript-eslint/parser@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.46.3 - '@typescript-eslint/type-utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.46.3 + '@typescript-eslint/parser': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.46.4 + '@typescript-eslint/type-utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.46.4 eslint: 9.39.1(jiti@2.6.1) graphemer: 1.4.0 ignore: 7.0.5 @@ -12283,41 +12385,41 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/parser@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/scope-manager': 8.46.3 - '@typescript-eslint/types': 8.46.3 - '@typescript-eslint/typescript-estree': 8.46.3(typescript@5.9.3) - '@typescript-eslint/visitor-keys': 8.46.3 + '@typescript-eslint/scope-manager': 8.46.4 + '@typescript-eslint/types': 8.46.4 + '@typescript-eslint/typescript-estree': 8.46.4(typescript@5.9.3) + '@typescript-eslint/visitor-keys': 8.46.4 debug: 4.4.3 eslint: 9.39.1(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.46.3(typescript@5.9.3)': + '@typescript-eslint/project-service@8.46.4(typescript@5.9.3)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.46.3(typescript@5.9.3) - '@typescript-eslint/types': 8.46.3 + '@typescript-eslint/tsconfig-utils': 8.46.4(typescript@5.9.3) + '@typescript-eslint/types': 8.46.4 debug: 4.4.3 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.46.3': + '@typescript-eslint/scope-manager@8.46.4': dependencies: - '@typescript-eslint/types': 8.46.3 - '@typescript-eslint/visitor-keys': 8.46.3 + '@typescript-eslint/types': 8.46.4 + '@typescript-eslint/visitor-keys': 8.46.4 - '@typescript-eslint/tsconfig-utils@8.46.3(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.46.4(typescript@5.9.3)': dependencies: typescript: 5.9.3 - '@typescript-eslint/type-utils@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@typescript-eslint/types': 8.46.3 - '@typescript-eslint/typescript-estree': 8.46.3(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.46.4 + '@typescript-eslint/typescript-estree': 8.46.4(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) debug: 4.4.3 eslint: 9.39.1(jiti@2.6.1) ts-api-utils: 2.1.0(typescript@5.9.3) @@ -12325,14 +12427,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.46.3': {} + '@typescript-eslint/types@8.46.4': {} - '@typescript-eslint/typescript-estree@8.46.3(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.46.4(typescript@5.9.3)': dependencies: - '@typescript-eslint/project-service': 8.46.3(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.46.3(typescript@5.9.3) - '@typescript-eslint/types': 8.46.3 - '@typescript-eslint/visitor-keys': 8.46.3 + '@typescript-eslint/project-service': 8.46.4(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.46.4(typescript@5.9.3) + '@typescript-eslint/types': 8.46.4 + '@typescript-eslint/visitor-keys': 8.46.4 debug: 4.4.3 fast-glob: 3.3.3 is-glob: 4.0.3 @@ -12343,20 +12445,20 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/utils@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) - '@typescript-eslint/scope-manager': 8.46.3 - '@typescript-eslint/types': 8.46.3 - '@typescript-eslint/typescript-estree': 8.46.3(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.46.4 + '@typescript-eslint/types': 8.46.4 + '@typescript-eslint/typescript-estree': 8.46.4(typescript@5.9.3) eslint: 9.39.1(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/visitor-keys@8.46.3': + '@typescript-eslint/visitor-keys@8.46.4': dependencies: - '@typescript-eslint/types': 8.46.3 + '@typescript-eslint/types': 8.46.4 eslint-visitor-keys: 4.2.1 '@ungap/structured-clone@1.3.0': {} @@ -12396,7 +12498,7 @@ snapshots: '@types/chai': 5.2.3 '@vitest/spy': 4.0.8 '@vitest/utils': 4.0.8 - chai: 6.2.0 + chai: 6.2.1 tinyrainbow: 3.0.3 '@vitest/mocker@4.0.8(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1))': @@ -12769,7 +12871,7 @@ snapshots: autoprefixer@10.4.21(postcss@8.5.6): dependencies: - browserslist: 4.27.0 + browserslist: 4.28.0 caniuse-lite: 1.0.30001754 fraction.js: 4.3.7 normalize-range: 0.1.2 @@ -12787,6 +12889,10 @@ snapshots: b4a@1.7.3: {} + babel-plugin-react-compiler@1.0.0: + dependencies: + '@babel/types': 7.28.5 + bail@2.0.2: {} balanced-match@1.0.2: {} @@ -12797,7 +12903,7 @@ snapshots: base64id@2.0.0: {} - baseline-browser-mapping@2.8.25: {} + baseline-browser-mapping@2.8.26: {} bidi-js@1.0.3: dependencies: @@ -12816,9 +12922,9 @@ snapshots: binary-extensions@2.3.0: {} - bippy@0.3.34(@types/react@19.2.2)(react@19.2.0): + bippy@0.3.34(@types/react@19.2.3)(react@19.2.0): dependencies: - '@types/react-reconciler': 0.28.9(@types/react@19.2.2) + '@types/react-reconciler': 0.28.9(@types/react@19.2.3) react: 19.2.0 transitivePeerDependencies: - '@types/react' @@ -12848,13 +12954,13 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.27.0: + browserslist@4.28.0: dependencies: - baseline-browser-mapping: 2.8.25 + baseline-browser-mapping: 2.8.26 caniuse-lite: 1.0.30001754 - electron-to-chromium: 1.5.249 + electron-to-chromium: 1.5.250 node-releases: 2.0.27 - update-browserslist-db: 1.1.4(browserslist@4.27.0) + update-browserslist-db: 1.1.4(browserslist@4.28.0) buffer-crc32@0.2.13: {} @@ -12909,7 +13015,7 @@ snapshots: ccount@2.0.1: {} - chai@6.2.0: {} + chai@6.2.1: {} chalk@4.1.2: dependencies: @@ -12980,12 +13086,12 @@ snapshots: clsx@2.1.1: {} - cmdk@1.1.1(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + cmdk@1.1.1(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-id': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-id': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-primitive': 2.1.4(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) transitivePeerDependencies: @@ -13111,7 +13217,7 @@ snapshots: cssstyle@5.3.3: dependencies: '@asamuzakjp/css-color': 4.0.5 - '@csstools/css-syntax-patches-for-csstree': 1.0.15 + '@csstools/css-syntax-patches-for-csstree': 1.0.16 css-tree: 3.1.0 csstype@3.1.3: {} @@ -13266,7 +13372,7 @@ snapshots: eastasianwidth@0.2.0: {} - electron-to-chromium@1.5.249: {} + electron-to-chromium@1.5.250: {} emoji-regex@10.6.0: {} @@ -13559,8 +13665,8 @@ snapshots: eslint-plugin-perfectionist@4.15.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@typescript-eslint/types': 8.46.3 - '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.46.4 + '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.1(jiti@2.6.1) natural-orderby: 5.0.0 transitivePeerDependencies: @@ -13577,16 +13683,16 @@ snapshots: '@types/eslint': 9.6.1 eslint-config-prettier: 10.1.8(eslint@9.39.1(jiti@2.6.1)) - eslint-plugin-react-dom@2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): + eslint-plugin-react-dom@2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@eslint-react/ast': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/core': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/eff': 2.3.1 - '@eslint-react/shared': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/var': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.46.3 - '@typescript-eslint/types': 8.46.3 - '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/ast': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/core': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.3.4 + '@eslint-react/shared': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/var': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.46.4 + '@typescript-eslint/types': 8.46.4 + '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) compare-versions: 6.1.1 eslint: 9.39.1(jiti@2.6.1) string-ts: 2.2.1 @@ -13595,17 +13701,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks-extra@2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): - dependencies: - '@eslint-react/ast': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/core': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/eff': 2.3.1 - '@eslint-react/shared': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/var': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.46.3 - '@typescript-eslint/type-utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/types': 8.46.3 - '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-react-hooks-extra@2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): + dependencies: + '@eslint-react/ast': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/core': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.3.4 + '@eslint-react/shared': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/var': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.46.4 + '@typescript-eslint/type-utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.46.4 + '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.1(jiti@2.6.1) string-ts: 2.2.1 ts-pattern: 5.9.0 @@ -13617,17 +13723,17 @@ snapshots: dependencies: eslint: 9.39.1(jiti@2.6.1) - eslint-plugin-react-naming-convention@2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): - dependencies: - '@eslint-react/ast': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/core': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/eff': 2.3.1 - '@eslint-react/shared': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/var': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.46.3 - '@typescript-eslint/type-utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/types': 8.46.3 - '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-react-naming-convention@2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): + dependencies: + '@eslint-react/ast': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/core': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.3.4 + '@eslint-react/shared': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/var': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.46.4 + '@typescript-eslint/type-utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.46.4 + '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.1(jiti@2.6.1) string-ts: 2.2.1 ts-pattern: 5.9.0 @@ -13635,16 +13741,16 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-web-api@2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): + eslint-plugin-react-web-api@2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@eslint-react/ast': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/core': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/eff': 2.3.1 - '@eslint-react/shared': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/var': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.46.3 - '@typescript-eslint/types': 8.46.3 - '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/ast': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/core': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.3.4 + '@eslint-react/shared': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/var': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.46.4 + '@typescript-eslint/types': 8.46.4 + '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.1(jiti@2.6.1) string-ts: 2.2.1 ts-pattern: 5.9.0 @@ -13652,17 +13758,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-x@2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): - dependencies: - '@eslint-react/ast': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/core': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/eff': 2.3.1 - '@eslint-react/shared': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/var': 2.3.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.46.3 - '@typescript-eslint/type-utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/types': 8.46.3 - '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-react-x@2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): + dependencies: + '@eslint-react/ast': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/core': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.3.4 + '@eslint-react/shared': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/var': 2.3.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.46.4 + '@typescript-eslint/type-utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.46.4 + '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) compare-versions: 6.1.1 eslint: 9.39.1(jiti@2.6.1) is-immutable-type: 5.0.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) @@ -13844,7 +13950,7 @@ snapshots: expect-type@1.2.2: {} - exsolve@1.0.7: {} + exsolve@1.0.8: {} ext-list@2.2.2: dependencies: @@ -13933,7 +14039,7 @@ snapshots: dependencies: magic-string: 0.30.21 mlly: 1.8.0 - rollup: 4.53.1 + rollup: 4.53.2 flat-cache@4.0.1: dependencies: @@ -13979,7 +14085,7 @@ snapshots: fsevents@2.3.3: optional: true - fumadocs-core@16.0.8(@types/react@19.2.2)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + fumadocs-core@16.0.10(@types/react@19.2.3)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: '@formatjs/intl-localematcher': 0.6.2 '@orama/orama': 3.1.16 @@ -14000,22 +14106,22 @@ snapshots: shiki: 3.15.0 unist-util-visit: 5.0.0 optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 lucide-react: 0.553.0(react@19.2.0) - next: 16.0.1(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + next: 16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) transitivePeerDependencies: - supports-color - fumadocs-mdx@13.0.5(fumadocs-core@16.0.8(@types/react@19.2.2)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)): + fumadocs-mdx@13.0.7(fumadocs-core@16.0.10(@types/react@19.2.3)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(vite@7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1)): dependencies: '@mdx-js/mdx': 3.1.1 '@standard-schema/spec': 1.0.0 chokidar: 4.0.3 esbuild: 0.25.12 estree-util-value-to-estree: 3.5.0 - fumadocs-core: 16.0.8(@types/react@19.2.2)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + fumadocs-core: 16.0.10(@types/react@19.2.3)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) js-yaml: 4.1.0 lru-cache: 11.2.2 mdast-util-to-markdown: 2.1.2 @@ -14029,26 +14135,26 @@ snapshots: unist-util-visit: 5.0.0 zod: 4.1.12 optionalDependencies: - next: 16.0.1(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + next: 16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 vite: 7.2.2(@types/node@24.10.0)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.20.6)(yaml@2.8.1) transitivePeerDependencies: - supports-color - fumadocs-ui@16.0.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(tailwindcss@4.1.17): - dependencies: - '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-navigation-menu': 1.2.14(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-popover': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-scroll-area': 1.2.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-slot': 1.2.4(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + fumadocs-ui@16.0.10(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(tailwindcss@4.1.17): + dependencies: + '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-navigation-menu': 1.2.14(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-popover': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-scroll-area': 1.2.10(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.2.4(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) class-variance-authority: 0.7.1 - fumadocs-core: 16.0.8(@types/react@19.2.2)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + fumadocs-core: 16.0.10(@types/react@19.2.3)(lucide-react@0.553.0(react@19.2.0))(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0) lodash.merge: 4.6.2 next-themes: 0.4.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) postcss-selector-parser: 7.1.0 @@ -14058,8 +14164,8 @@ snapshots: scroll-into-view-if-needed: 3.1.0 tailwind-merge: 3.4.0 optionalDependencies: - '@types/react': 19.2.2 - next: 16.0.1(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@types/react': 19.2.3 + next: 16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) tailwindcss: 4.1.17 transitivePeerDependencies: - '@mixedbread/sdk' @@ -14300,7 +14406,7 @@ snapshots: he@1.2.0: {} - hono@4.10.4: {} + hono@4.10.5: {} html-encoding-sniffer@4.0.0: dependencies: @@ -14480,7 +14586,7 @@ snapshots: is-immutable-type@5.0.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@typescript-eslint/type-utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.1(jiti@2.6.1) ts-api-utils: 2.1.0(typescript@5.9.3) ts-declaration-location: 1.0.7(typescript@5.9.3) @@ -15385,35 +15491,35 @@ snapshots: neo-async@2.6.2: {} - next-intl@4.5.0(next@16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.9.3): + next-intl@4.5.1(next@16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.9.3): dependencies: '@formatjs/intl-localematcher': 0.5.10 '@swc/core': 1.15.1 negotiator: 1.0.0 - next: 16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + next: 16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 - use-intl: 4.5.0(react@19.2.0) + use-intl: 4.5.1(react@19.2.0) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - '@swc/helpers' - next-intl@4.5.0(next@16.0.1(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.9.3): + next-intl@4.5.1(next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react@19.2.0)(typescript@5.9.3): dependencies: '@formatjs/intl-localematcher': 0.5.10 '@swc/core': 1.15.1 negotiator: 1.0.0 - next: 16.0.1(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + next: 16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 - use-intl: 4.5.0(react@19.2.0) + use-intl: 4.5.1(react@19.2.0) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - '@swc/helpers' - next-safe-action@8.0.11(next@16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + next-safe-action@8.0.11(next@16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - next: 16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + next: 16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) @@ -15422,7 +15528,7 @@ snapshots: react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - next@16.0.1(@babel/core@7.26.10)(@playwright/test@1.56.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + next@16.0.1(@babel/core@7.26.10)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: '@next/env': 16.0.1 '@swc/helpers': 0.5.15 @@ -15441,12 +15547,13 @@ snapshots: '@next/swc-win32-arm64-msvc': 16.0.1 '@next/swc-win32-x64-msvc': 16.0.1 '@playwright/test': 1.56.1 + babel-plugin-react-compiler: 1.0.0 sharp: 0.34.5 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - next@16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + next@16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: '@next/env': 16.0.1 '@swc/helpers': 0.5.15 @@ -15465,12 +15572,13 @@ snapshots: '@next/swc-win32-arm64-msvc': 16.0.1 '@next/swc-win32-x64-msvc': 16.0.1 '@playwright/test': 1.56.1 + babel-plugin-react-compiler: 1.0.0 sharp: 0.34.5 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - next@16.0.1(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + next@16.0.1(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: '@next/env': 16.0.1 '@swc/helpers': 0.5.15 @@ -15489,6 +15597,7 @@ snapshots: '@next/swc-win32-arm64-msvc': 16.0.1 '@next/swc-win32-x64-msvc': 16.0.1 '@playwright/test': 1.56.1 + babel-plugin-react-compiler: 1.0.0 sharp: 0.34.5 transitivePeerDependencies: - '@babel/core' @@ -15785,7 +15894,7 @@ snapshots: pkg-types@2.3.0: dependencies: confbox: 0.2.2 - exsolve: 1.0.7 + exsolve: 1.0.8 pathe: 2.0.3 playwright-core@1.56.1: {} @@ -15937,7 +16046,7 @@ snapshots: prosemirror-changeset@2.3.1: dependencies: - prosemirror-transform: 1.10.4 + prosemirror-transform: 1.10.5 prosemirror-collab@1.3.1: dependencies: @@ -15947,12 +16056,12 @@ snapshots: dependencies: prosemirror-model: 1.25.4 prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.4 + prosemirror-transform: 1.10.5 prosemirror-dropcursor@1.8.2: dependencies: prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.4 + prosemirror-transform: 1.10.5 prosemirror-view: 1.41.3 prosemirror-gapcursor@1.4.0: @@ -15965,14 +16074,14 @@ snapshots: prosemirror-history@1.4.1: dependencies: prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.4 + prosemirror-transform: 1.10.5 prosemirror-view: 1.41.3 rope-sequence: 1.3.4 prosemirror-inputrules@1.5.1: dependencies: prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.4 + prosemirror-transform: 1.10.5 prosemirror-keymap@1.2.3: dependencies: @@ -16004,12 +16113,12 @@ snapshots: dependencies: prosemirror-model: 1.25.4 prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.4 + prosemirror-transform: 1.10.5 prosemirror-state@1.4.4: dependencies: prosemirror-model: 1.25.4 - prosemirror-transform: 1.10.4 + prosemirror-transform: 1.10.5 prosemirror-view: 1.41.3 prosemirror-tables@1.8.1: @@ -16017,7 +16126,7 @@ snapshots: prosemirror-keymap: 1.2.3 prosemirror-model: 1.25.4 prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.4 + prosemirror-transform: 1.10.5 prosemirror-view: 1.41.3 prosemirror-trailing-node@3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.3): @@ -16028,7 +16137,7 @@ snapshots: prosemirror-state: 1.4.4 prosemirror-view: 1.41.3 - prosemirror-transform@1.10.4: + prosemirror-transform@1.10.5: dependencies: prosemirror-model: 1.25.4 @@ -16036,7 +16145,7 @@ snapshots: dependencies: prosemirror-model: 1.25.4 prosemirror-state: 1.4.4 - prosemirror-transform: 1.10.4 + prosemirror-transform: 1.10.5 punycode.js@2.3.1: {} @@ -16050,68 +16159,68 @@ snapshots: quick-lru@5.1.1: {} - radix-ui@1.4.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + radix-ui@1.4.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: '@radix-ui/primitive': 1.1.3 - '@radix-ui/react-accessible-icon': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-alert-dialog': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-aspect-ratio': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-avatar': 1.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-checkbox': 1.3.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context': 1.1.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-context-menu': 2.2.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-direction': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-dropdown-menu': 2.1.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-form': 0.1.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-hover-card': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-label': 2.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-menubar': 1.1.16(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-navigation-menu': 1.2.14(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-one-time-password-field': 0.1.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-password-toggle-field': 0.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-popover': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-progress': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-radio-group': 1.3.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-scroll-area': 1.2.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-select': 2.2.6(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-separator': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-slider': 1.3.6(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-slot': 1.2.3(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-switch': 1.2.6(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-toast': 1.2.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-toggle-group': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-toolbar': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-tooltip': 1.2.8(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.2)(react@19.2.0) - '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-accessible-icon': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-accordion': 1.2.12(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-alert-dialog': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-arrow': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-aspect-ratio': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-avatar': 1.1.10(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-checkbox': 1.3.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-collapsible': 1.1.12(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-collection': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context': 1.1.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-context-menu': 2.2.16(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-direction': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-dismissable-layer': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-dropdown-menu': 2.1.16(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-focus-guards': 1.1.3(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-focus-scope': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-form': 0.1.8(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-hover-card': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-label': 2.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-menu': 2.1.16(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-menubar': 1.1.16(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-navigation-menu': 1.2.14(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-one-time-password-field': 0.1.8(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-password-toggle-field': 0.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-popover': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-popper': 1.2.8(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-portal': 1.1.9(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-presence': 1.1.5(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-progress': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-radio-group': 1.3.8(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-roving-focus': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-scroll-area': 1.2.10(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-select': 2.2.6(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-separator': 1.1.7(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slider': 1.3.6(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-switch': 1.2.6(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-tabs': 1.1.13(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-toast': 1.2.15(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-toggle-group': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-toolbar': 1.1.11(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-tooltip': 1.2.8(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-is-hydrated': 0.1.0(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.2.3)(react@19.2.0) + '@radix-ui/react-visually-hidden': 1.2.3(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 - '@types/react-dom': 19.2.2(@types/react@19.2.2) + '@types/react': 19.2.3 + '@types/react-dom': 19.2.2(@types/react@19.2.3) randombytes@2.1.0: dependencies: @@ -16176,13 +16285,13 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 - react-remove-scroll-bar@2.3.8(@types/react@19.2.2)(react@19.2.0): + react-remove-scroll-bar@2.3.8(@types/react@19.2.3)(react@19.2.0): dependencies: react: 19.2.0 - react-style-singleton: 2.2.3(@types/react@19.2.2)(react@19.2.0) + react-style-singleton: 2.2.3(@types/react@19.2.3)(react@19.2.0) tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 react-remove-scroll@2.7.1(@types/react@19.0.10)(react@19.0.0): dependencies: @@ -16195,18 +16304,18 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 - react-remove-scroll@2.7.1(@types/react@19.2.2)(react@19.2.0): + react-remove-scroll@2.7.1(@types/react@19.2.3)(react@19.2.0): dependencies: react: 19.2.0 - react-remove-scroll-bar: 2.3.8(@types/react@19.2.2)(react@19.2.0) - react-style-singleton: 2.2.3(@types/react@19.2.2)(react@19.2.0) + react-remove-scroll-bar: 2.3.8(@types/react@19.2.3)(react@19.2.0) + react-style-singleton: 2.2.3(@types/react@19.2.3)(react@19.2.0) tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@19.2.2)(react@19.2.0) - use-sidecar: 1.1.3(@types/react@19.2.2)(react@19.2.0) + use-callback-ref: 1.3.3(@types/react@19.2.3)(react@19.2.0) + use-sidecar: 1.1.3(@types/react@19.2.3)(react@19.2.0) optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 - react-scan@0.4.3(@types/react@19.2.2)(next@16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(rollup@4.53.1): + react-scan@0.4.3(@types/react@19.2.3)(next@16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(rollup@4.53.2): dependencies: '@babel/core': 7.28.5 '@babel/generator': 7.28.5 @@ -16215,9 +16324,9 @@ snapshots: '@clack/prompts': 0.8.2 '@pivanov/utils': 0.0.2(react-dom@19.2.0(react@19.2.0))(react@19.2.0) '@preact/signals': 1.3.2(preact@10.27.2) - '@rollup/pluginutils': 5.3.0(rollup@4.53.1) + '@rollup/pluginutils': 5.3.0(rollup@4.53.2) '@types/node': 20.19.24 - bippy: 0.3.34(@types/react@19.2.2)(react@19.2.0) + bippy: 0.3.34(@types/react@19.2.3)(react@19.2.0) esbuild: 0.25.12 estree-walker: 3.0.3 kleur: 4.1.5 @@ -16228,7 +16337,7 @@ snapshots: react-dom: 19.2.0(react@19.2.0) tsx: 4.20.6 optionalDependencies: - next: 16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + next: 16.0.1(@babel/core@7.28.5)(@playwright/test@1.56.1)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) unplugin: 2.1.0 transitivePeerDependencies: - '@types/react' @@ -16243,13 +16352,13 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 - react-style-singleton@2.2.3(@types/react@19.2.2)(react@19.2.0): + react-style-singleton@2.2.3(@types/react@19.2.3)(react@19.2.0): dependencies: get-nonce: 1.0.1 react: 19.2.0 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 react-universal-interface@0.6.2(react@19.2.0)(tslib@2.8.1): dependencies: @@ -16468,32 +16577,32 @@ snapshots: reusify@1.1.0: {} - rollup@4.53.1: + rollup@4.53.2: dependencies: '@types/estree': 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.53.1 - '@rollup/rollup-android-arm64': 4.53.1 - '@rollup/rollup-darwin-arm64': 4.53.1 - '@rollup/rollup-darwin-x64': 4.53.1 - '@rollup/rollup-freebsd-arm64': 4.53.1 - '@rollup/rollup-freebsd-x64': 4.53.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.53.1 - '@rollup/rollup-linux-arm-musleabihf': 4.53.1 - '@rollup/rollup-linux-arm64-gnu': 4.53.1 - '@rollup/rollup-linux-arm64-musl': 4.53.1 - '@rollup/rollup-linux-loong64-gnu': 4.53.1 - '@rollup/rollup-linux-ppc64-gnu': 4.53.1 - '@rollup/rollup-linux-riscv64-gnu': 4.53.1 - '@rollup/rollup-linux-riscv64-musl': 4.53.1 - '@rollup/rollup-linux-s390x-gnu': 4.53.1 - '@rollup/rollup-linux-x64-gnu': 4.53.1 - '@rollup/rollup-linux-x64-musl': 4.53.1 - '@rollup/rollup-openharmony-arm64': 4.53.1 - '@rollup/rollup-win32-arm64-msvc': 4.53.1 - '@rollup/rollup-win32-ia32-msvc': 4.53.1 - '@rollup/rollup-win32-x64-gnu': 4.53.1 - '@rollup/rollup-win32-x64-msvc': 4.53.1 + '@rollup/rollup-android-arm-eabi': 4.53.2 + '@rollup/rollup-android-arm64': 4.53.2 + '@rollup/rollup-darwin-arm64': 4.53.2 + '@rollup/rollup-darwin-x64': 4.53.2 + '@rollup/rollup-freebsd-arm64': 4.53.2 + '@rollup/rollup-freebsd-x64': 4.53.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.53.2 + '@rollup/rollup-linux-arm-musleabihf': 4.53.2 + '@rollup/rollup-linux-arm64-gnu': 4.53.2 + '@rollup/rollup-linux-arm64-musl': 4.53.2 + '@rollup/rollup-linux-loong64-gnu': 4.53.2 + '@rollup/rollup-linux-ppc64-gnu': 4.53.2 + '@rollup/rollup-linux-riscv64-gnu': 4.53.2 + '@rollup/rollup-linux-riscv64-musl': 4.53.2 + '@rollup/rollup-linux-s390x-gnu': 4.53.2 + '@rollup/rollup-linux-x64-gnu': 4.53.2 + '@rollup/rollup-linux-x64-musl': 4.53.2 + '@rollup/rollup-openharmony-arm64': 4.53.2 + '@rollup/rollup-win32-arm64-msvc': 4.53.2 + '@rollup/rollup-win32-ia32-msvc': 4.53.2 + '@rollup/rollup-win32-x64-gnu': 4.53.2 + '@rollup/rollup-win32-x64-msvc': 4.53.2 fsevents: 2.3.3 rope-sequence@1.3.4: {} @@ -17208,7 +17317,7 @@ snapshots: picocolors: 1.1.1 postcss-load-config: 6.0.1(jiti@2.6.1)(postcss@8.5.6)(tsx@4.20.6)(yaml@2.8.1) resolve-from: 5.0.0 - rollup: 4.53.1 + rollup: 4.53.2 source-map: 0.8.0-beta.0 sucrase: 3.35.0 tinyexec: 0.3.2 @@ -17231,32 +17340,32 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - turbo-darwin-64@2.6.0: + turbo-darwin-64@2.6.1: optional: true - turbo-darwin-arm64@2.6.0: + turbo-darwin-arm64@2.6.1: optional: true - turbo-linux-64@2.6.0: + turbo-linux-64@2.6.1: optional: true - turbo-linux-arm64@2.6.0: + turbo-linux-arm64@2.6.1: optional: true - turbo-windows-64@2.6.0: + turbo-windows-64@2.6.1: optional: true - turbo-windows-arm64@2.6.0: + turbo-windows-arm64@2.6.1: optional: true - turbo@2.6.0: + turbo@2.6.1: optionalDependencies: - turbo-darwin-64: 2.6.0 - turbo-darwin-arm64: 2.6.0 - turbo-linux-64: 2.6.0 - turbo-linux-arm64: 2.6.0 - turbo-windows-64: 2.6.0 - turbo-windows-arm64: 2.6.0 + turbo-darwin-64: 2.6.1 + turbo-darwin-arm64: 2.6.1 + turbo-linux-64: 2.6.1 + turbo-linux-arm64: 2.6.1 + turbo-windows-64: 2.6.1 + turbo-windows-arm64: 2.6.1 tw-animate-css@1.4.0: {} @@ -17303,12 +17412,12 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): + typescript-eslint@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.46.3(@typescript-eslint/parser@8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/parser': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.46.3(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.3(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.46.4(@typescript-eslint/parser@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.46.4(typescript@5.9.3) + '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.1(jiti@2.6.1) typescript: 5.9.3 transitivePeerDependencies: @@ -17386,9 +17495,9 @@ snapshots: webpack-virtual-modules: 0.6.2 optional: true - update-browserslist-db@1.1.4(browserslist@4.27.0): + update-browserslist-db@1.1.4(browserslist@4.28.0): dependencies: - browserslist: 4.27.0 + browserslist: 4.28.0 escalade: 3.2.0 picocolors: 1.1.1 @@ -17408,12 +17517,12 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 - use-callback-ref@1.3.3(@types/react@19.2.2)(react@19.2.0): + use-callback-ref@1.3.3(@types/react@19.2.3)(react@19.2.0): dependencies: react: 19.2.0 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 use-debounce@10.0.4(react@19.0.0): dependencies: @@ -17423,7 +17532,7 @@ snapshots: dependencies: react: 19.2.0 - use-intl@4.5.0(react@19.2.0): + use-intl@4.5.1(react@19.2.0): dependencies: '@formatjs/fast-memoize': 2.2.7 '@schummar/icu-type-parser': 1.21.5 @@ -17438,13 +17547,13 @@ snapshots: optionalDependencies: '@types/react': 19.0.10 - use-sidecar@1.1.3(@types/react@19.2.2)(react@19.2.0): + use-sidecar@1.1.3(@types/react@19.2.3)(react@19.2.0): dependencies: detect-node-es: 1.1.0 react: 19.2.0 tslib: 2.8.1 optionalDependencies: - '@types/react': 19.2.2 + '@types/react': 19.2.3 use-sync-external-store@1.6.0(react@19.2.0): dependencies: @@ -17458,9 +17567,9 @@ snapshots: vary@1.1.2: {} - vaul@1.1.2(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): + vaul@1.1.2(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): dependencies: - '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.2))(@types/react@19.2.2)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@radix-ui/react-dialog': 1.1.15(@types/react-dom@19.2.2(@types/react@19.2.3))(@types/react@19.2.3)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) transitivePeerDependencies: @@ -17494,7 +17603,7 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 - rollup: 4.53.1 + rollup: 4.53.2 tinyglobby: 0.2.15 optionalDependencies: '@types/node': 24.10.0 @@ -17598,7 +17707,7 @@ snapshots: '@webassemblyjs/wasm-parser': 1.14.1 acorn: 8.15.0 acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.27.0 + browserslist: 4.28.0 chrome-trace-event: 1.0.4 enhanced-resolve: 5.18.3 es-module-lexer: 1.7.0 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 1882b9677..9b30c1038 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -5,4 +5,5 @@ packages: ignoredBuiltDependencies: - '@swc/core' + - esbuild - sharp