From 8736b4bd02104cf4393f24209367ac9b6c16e41e Mon Sep 17 00:00:00 2001 From: pandeymangg Date: Tue, 16 Dec 2025 22:59:45 +0530 Subject: [PATCH] feat: email package --- .../components/preview-email-template.tsx | 12 +- apps/web/modules/email/index.tsx | 65 +- .../modules/survey/follow-ups/lib/email.ts | 85 +- apps/web/package.json | 2 +- packages/email/.eslintrc.cjs | 4 + packages/email/README.md | 45 + .../emails/auth/forgot-password-email.tsx | 33 + .../emails/auth/new-email-verification.tsx | 40 + .../auth/password-reset-notify-email.tsx | 30 + .../email/emails/auth/verification-email.tsx | 47 + .../email-customization-preview-email.tsx | 32 + .../emails/invite/invite-accepted-email.tsx | 39 + packages/email/emails/invite/invite-email.tsx | 43 + .../survey/embed-survey-preview-email.tsx | 42 + .../email/emails/survey/follow-up-email.tsx | 135 ++ .../email/emails/survey/link-survey-email.tsx | 42 + .../emails/survey/response-finished-email.tsx | 189 ++ packages/email/package.json | 27 + .../email/src/components/email-button.tsx | 16 + .../src/components/email-element-header.tsx | 29 + .../email/src/components/email-footer.tsx | 15 + .../email/src/components/email-template.tsx | 59 + packages/email/src/index.ts | 52 + packages/email/src/lib/email-utils.tsx | 82 + packages/email/src/lib/example-data.ts | 150 ++ packages/email/src/lib/mock-translate.ts | 110 ++ packages/email/src/lib/render.ts | 118 ++ packages/email/tsconfig.json | 13 + pnpm-lock.yaml | 1603 ++++++++++++----- 29 files changed, 2608 insertions(+), 551 deletions(-) create mode 100644 packages/email/.eslintrc.cjs create mode 100644 packages/email/README.md create mode 100644 packages/email/emails/auth/forgot-password-email.tsx create mode 100644 packages/email/emails/auth/new-email-verification.tsx create mode 100644 packages/email/emails/auth/password-reset-notify-email.tsx create mode 100644 packages/email/emails/auth/verification-email.tsx create mode 100644 packages/email/emails/general/email-customization-preview-email.tsx create mode 100644 packages/email/emails/invite/invite-accepted-email.tsx create mode 100644 packages/email/emails/invite/invite-email.tsx create mode 100644 packages/email/emails/survey/embed-survey-preview-email.tsx create mode 100644 packages/email/emails/survey/follow-up-email.tsx create mode 100644 packages/email/emails/survey/link-survey-email.tsx create mode 100644 packages/email/emails/survey/response-finished-email.tsx create mode 100644 packages/email/package.json create mode 100644 packages/email/src/components/email-button.tsx create mode 100644 packages/email/src/components/email-element-header.tsx create mode 100644 packages/email/src/components/email-footer.tsx create mode 100644 packages/email/src/components/email-template.tsx create mode 100644 packages/email/src/index.ts create mode 100644 packages/email/src/lib/email-utils.tsx create mode 100644 packages/email/src/lib/example-data.ts create mode 100644 packages/email/src/lib/mock-translate.ts create mode 100644 packages/email/src/lib/render.ts create mode 100644 packages/email/tsconfig.json diff --git a/apps/web/modules/email/components/preview-email-template.tsx b/apps/web/modules/email/components/preview-email-template.tsx index 567f64f233..1b2e8d843f 100644 --- a/apps/web/modules/email/components/preview-email-template.tsx +++ b/apps/web/modules/email/components/preview-email-template.tsx @@ -1,6 +1,10 @@ +import { TFunction } from "i18next"; +import { CalendarDaysIcon, ExternalLinkIcon, UploadIcon } from "lucide-react"; +import React from "react"; import { Column, Container, + ElementHeader, Button as EmailButton, Img, Link, @@ -8,11 +12,8 @@ import { Section, Tailwind, Text, -} from "@react-email/components"; -import { render } from "@react-email/render"; -import { TFunction } from "i18next"; -import { CalendarDaysIcon, ExternalLinkIcon, UploadIcon } from "lucide-react"; -import React from "react"; + render, +} from "@formbricks/email"; import { TSurveyCTAElement, TSurveyElementTypeEnum } from "@formbricks/types/surveys/elements"; import { type TSurvey, type TSurveyStyling } from "@formbricks/types/surveys/types"; import { cn } from "@/lib/cn"; @@ -24,7 +25,6 @@ import { isLight, mixColor } from "@/lib/utils/colors"; import { parseRecallInfo } from "@/lib/utils/recall"; import { RatingSmiley } from "@/modules/analysis/components/RatingSmiley"; import { getNPSOptionColor, getRatingNumberOptionColor } from "../lib/utils"; -import { ElementHeader } from "./email-element-header"; interface PreviewEmailTemplateProps { survey: TSurvey; diff --git a/apps/web/modules/email/index.tsx b/apps/web/modules/email/index.tsx index 8abe2ef2a8..800f6c4b60 100644 --- a/apps/web/modules/email/index.tsx +++ b/apps/web/modules/email/index.tsx @@ -1,6 +1,17 @@ -import { render } from "@react-email/render"; import { createTransport } from "nodemailer"; import type SMTPTransport from "nodemailer/lib/smtp-transport"; +import { + renderEmailCustomizationPreviewEmail, + renderEmbedSurveyPreviewEmail, + renderForgotPasswordEmail, + renderInviteAcceptedEmail, + renderInviteEmail, + renderLinkSurveyEmail, + renderNewEmailVerification, + renderPasswordResetNotifyEmail, + renderResponseFinishedEmail, + renderVerificationEmail, +} from "@formbricks/email"; import { logger } from "@formbricks/logger"; import type { TLinkSurveyEmailData } from "@formbricks/types/email"; import { InvalidInputError } from "@formbricks/types/errors"; @@ -23,17 +34,8 @@ import { import { getPublicDomain } from "@/lib/getPublicUrl"; import { createEmailChangeToken, createInviteToken, createToken, createTokenForLinkSurvey } from "@/lib/jwt"; import { getOrganizationByEnvironmentId } from "@/lib/organization/service"; +import { getElementResponseMapping } from "@/lib/responses"; import { getTranslate } from "@/lingodotdev/server"; -import NewEmailVerification from "@/modules/email/emails/auth/new-email-verification"; -import { EmailCustomizationPreviewEmail } from "@/modules/email/emails/general/email-customization-preview-email"; -import { ForgotPasswordEmail } from "./emails/auth/forgot-password-email"; -import { PasswordResetNotifyEmail } from "./emails/auth/password-reset-notify-email"; -import { VerificationEmail } from "./emails/auth/verification-email"; -import { InviteAcceptedEmail } from "./emails/invite/invite-accepted-email"; -import { InviteEmail } from "./emails/invite/invite-email"; -import { EmbedSurveyPreviewEmail } from "./emails/survey/embed-survey-preview-email"; -import { LinkSurveyEmail } from "./emails/survey/link-survey-email"; -import { ResponseFinishedEmail } from "./emails/survey/response-finished-email"; export const IS_SMTP_CONFIGURED = Boolean(SMTP_HOST && SMTP_PORT); @@ -89,7 +91,7 @@ export const sendVerificationNewEmail = async (id: string, email: string): Promi const token = createEmailChangeToken(id, email); const verifyLink = `${WEBAPP_URL}/verify-email-change?token=${encodeURIComponent(token)}`; - const html = await render(await NewEmailVerification({ verifyLink })); + const html = await renderNewEmailVerification({ verifyLink, t }); return await sendEmail({ to: email, @@ -117,7 +119,7 @@ export const sendVerificationEmail = async ({ const verifyLink = `${WEBAPP_URL}/auth/verify?token=${encodeURIComponent(token)}`; const verificationRequestLink = `${WEBAPP_URL}/auth/verification-requested?token=${encodeURIComponent(token)}`; - const html = await render(await VerificationEmail({ verificationRequestLink, verifyLink })); + const html = await renderVerificationEmail({ verificationRequestLink, verifyLink, t }); return await sendEmail({ to: email, @@ -140,7 +142,7 @@ export const sendForgotPasswordEmail = async (user: { expiresIn: "1d", }); const verifyLink = `${WEBAPP_URL}/auth/forgot-password/reset?token=${encodeURIComponent(token)}`; - const html = await render(await ForgotPasswordEmail({ verifyLink })); + const html = await renderForgotPasswordEmail({ verifyLink, t }); return await sendEmail({ to: user.email, subject: t("emails.forgot_password_email_subject"), @@ -150,7 +152,7 @@ export const sendForgotPasswordEmail = async (user: { export const sendPasswordResetNotifyEmail = async (user: { email: string }): Promise => { const t = await getTranslate(); - const html = await render(await PasswordResetNotifyEmail()); + const html = await renderPasswordResetNotifyEmail({ t }); return await sendEmail({ to: user.email, subject: t("emails.password_reset_notify_email_subject"), @@ -171,7 +173,7 @@ export const sendInviteMemberEmail = async ( const verifyLink = `${WEBAPP_URL}/invite?token=${encodeURIComponent(token)}`; - const html = await render(await InviteEmail({ inviteeName, inviterName, verifyLink })); + const html = await renderInviteEmail({ inviteeName, inviterName, verifyLink, t }); return await sendEmail({ to: email, subject: t("emails.invite_member_email_subject"), @@ -185,7 +187,7 @@ export const sendInviteAcceptedEmail = async ( email: string ): Promise => { const t = await getTranslate(); - const html = await render(await InviteAcceptedEmail({ inviteeName, inviterName })); + const html = await renderInviteAcceptedEmail({ inviteeName, inviterName, t }); await sendEmail({ to: email, subject: t("emails.invite_accepted_email_subject"), @@ -208,16 +210,19 @@ export const sendResponseFinishedEmail = async ( throw new Error("Organization not found"); } - const html = await render( - await ResponseFinishedEmail({ - survey, - responseCount, - response, - WEBAPP_URL, - environmentId, - organization, - }) - ); + // Pre-process the element response mapping before passing to email + const elements = getElementResponseMapping(survey, response); + + const html = await renderResponseFinishedEmail({ + survey, + responseCount, + response, + WEBAPP_URL, + environmentId, + organization, + elements, + t, + }); await sendEmail({ to: email, @@ -241,7 +246,7 @@ export const sendEmbedSurveyPreviewEmail = async ( logoUrl?: string ): Promise => { const t = await getTranslate(); - const html = await render(await EmbedSurveyPreviewEmail({ html: innerHtml, environmentId, logoUrl })); + const html = await renderEmbedSurveyPreviewEmail({ html: innerHtml, environmentId, logoUrl, t }); return await sendEmail({ to, subject: t("emails.embed_survey_preview_email_subject"), @@ -255,7 +260,7 @@ export const sendEmailCustomizationPreviewEmail = async ( logoUrl?: string ): Promise => { const t = await getTranslate(); - const emailHtmlBody = await render(await EmailCustomizationPreviewEmail({ userName, logoUrl })); + const emailHtmlBody = await renderEmailCustomizationPreviewEmail({ userName, logoUrl, t }); return await sendEmail({ to, @@ -280,7 +285,7 @@ export const sendLinkSurveyToVerifiedEmail = async (data: TLinkSurveyEmailData): }; const surveyLink = getSurveyLink(); - const html = await render(await LinkSurveyEmail({ surveyName, surveyLink, logoUrl })); + const html = await renderLinkSurveyEmail({ surveyName, surveyLink, logoUrl, t }); return await sendEmail({ to: data.email, subject: t("emails.verified_link_survey_email_subject"), diff --git a/apps/web/modules/survey/follow-ups/lib/email.ts b/apps/web/modules/survey/follow-ups/lib/email.ts index 123621134d..55c1eb7c65 100644 --- a/apps/web/modules/survey/follow-ups/lib/email.ts +++ b/apps/web/modules/survey/follow-ups/lib/email.ts @@ -1,9 +1,17 @@ -import { render } from "@react-email/components"; +import dompurify from "isomorphic-dompurify"; import { TSurveyFollowUp } from "@formbricks/database/types/survey-follow-up"; +import { + ProcessedHiddenField, + ProcessedResponseElement, + ProcessedVariable, + renderFollowUpEmail, +} from "@formbricks/email"; import { TResponse } from "@formbricks/types/responses"; import { TSurvey } from "@formbricks/types/surveys/types"; +import { getElementResponseMapping } from "@/lib/responses"; +import { parseRecallInfo } from "@/lib/utils/recall"; +import { getTranslate } from "@/lingodotdev/server"; import { sendEmail } from "@/modules/email"; -import { FollowUpEmail } from "@/modules/survey/follow-ups/components/follow-up-email"; export const sendFollowUpEmail = async ({ followUp, @@ -28,21 +36,70 @@ export const sendFollowUpEmail = async ({ }): Promise => { const { action: { - properties: { subject }, + properties: { subject, body }, }, } = followUp; - const emailHtmlBody = await render( - await FollowUpEmail({ - followUp, - logoUrl, - attachResponseData, - includeVariables, - includeHiddenFields, - survey, - response, - }) - ); + const t = await getTranslate(); + + // Process body: parse recall tags and sanitize HTML + const processedBody = dompurify.sanitize(parseRecallInfo(body, response.data, response.variables), { + ALLOWED_TAGS: ["p", "span", "b", "strong", "i", "em", "a", "br"], + ALLOWED_ATTR: ["href", "rel", "dir", "class"], + ALLOWED_URI_REGEXP: /^https?:\/\//, // Only allow safe URLs + ADD_ATTR: ["target"], // Allow 'target' attribute for links + }); + + // Process response data + const responseData: ProcessedResponseElement[] = attachResponseData + ? getElementResponseMapping(survey, response).map((e) => ({ + element: e.element, + response: e.response, + type: e.type, + })) + : []; + + // Process variables + const variables: ProcessedVariable[] = + attachResponseData && includeVariables + ? survey.variables + .filter((variable) => { + const variableResponse = response.variables[variable.id]; + return ( + (typeof variableResponse === "string" || typeof variableResponse === "number") && + variableResponse !== undefined + ); + }) + .map((variable) => ({ + id: variable.id, + name: variable.name, + type: variable.type, + value: response.variables[variable.id] as string | number, + })) + : []; + + // Process hidden fields + const hiddenFields: ProcessedHiddenField[] = + attachResponseData && includeHiddenFields + ? (survey.hiddenFields.fieldIds + ?.filter((hiddenFieldId) => { + const hiddenFieldResponse = response.data[hiddenFieldId]; + return hiddenFieldResponse && typeof hiddenFieldResponse === "string"; + }) + .map((hiddenFieldId) => ({ + id: hiddenFieldId, + value: response.data[hiddenFieldId] as string, + })) ?? []) + : []; + + const emailHtmlBody = await renderFollowUpEmail({ + body: processedBody, + responseData, + variables, + hiddenFields, + logoUrl, + t, + }); await sendEmail({ to, diff --git a/apps/web/package.json b/apps/web/package.json index eb31d6dc5c..e572a27841 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -29,6 +29,7 @@ "@dnd-kit/utilities": "3.2.2", "@formbricks/cache": "workspace:*", "@formbricks/database": "workspace:*", + "@formbricks/email": "workspace:*", "@formbricks/i18n-utils": "workspace:*", "@formbricks/js-core": "workspace:*", "@formbricks/logger": "workspace:*", @@ -71,7 +72,6 @@ "@radix-ui/react-toggle": "1.1.8", "@radix-ui/react-toggle-group": "1.1.9", "@radix-ui/react-tooltip": "1.2.6", - "@react-email/components": "0.0.38", "@sentry/nextjs": "10.5.0", "@t3-oss/env-nextjs": "0.13.4", "@tailwindcss/forms": "0.5.10", diff --git a/packages/email/.eslintrc.cjs b/packages/email/.eslintrc.cjs new file mode 100644 index 0000000000..e7209435ab --- /dev/null +++ b/packages/email/.eslintrc.cjs @@ -0,0 +1,4 @@ +module.exports = { + extends: ["@formbricks/eslint-config/legacy-react.js"], + parser: "@typescript-eslint/parser", +}; diff --git a/packages/email/README.md b/packages/email/README.md new file mode 100644 index 0000000000..a123fdfbb9 --- /dev/null +++ b/packages/email/README.md @@ -0,0 +1,45 @@ +# @formbricks/emails + +Email templates for Formbricks with React Email preview server. + +## Purpose + +This package provides email templates for visual QA and preview. It includes: + +- Email templates (auth, invite, survey, general) +- Shared email UI components +- Mock translation utilities for preview +- Example data for template rendering + +## Development + +Run the React Email preview server: + +```bash +pnpm dev +``` + +Visit `localhost:3456` to preview all email templates with mock data. + +## Usage in Production + +The web app imports templates from this package: + +```typescript +import { VerificationEmail } from "@formbricks/emails"; + +// Pass real translation function and data +const html = await render( + await VerificationEmail({ + verifyLink, + verificationRequestLink, + t, // Real i18n function + }) +); +``` + +## Architecture + +- **Preview Mode**: Templates use mock `t()` function and example data +- **Production Mode**: Web app passes real `t()` function and actual data +- **No Business Logic**: SMTP, i18n, JWT, and database logic remain in web app diff --git a/packages/email/emails/auth/forgot-password-email.tsx b/packages/email/emails/auth/forgot-password-email.tsx new file mode 100644 index 0000000000..70b054088b --- /dev/null +++ b/packages/email/emails/auth/forgot-password-email.tsx @@ -0,0 +1,33 @@ +import { Container, Heading, Text } from "@react-email/components"; +import { EmailButton } from "@/src/components/email-button"; +import { EmailFooter } from "@/src/components/email-footer"; +import { EmailTemplate } from "@/src/components/email-template"; +import { exampleData } from "@/src/lib/example-data"; +import { t as mockT } from "@/src/lib/mock-translate"; + +type TFunction = (key: string, replacements?: Record) => string; + +interface ForgotPasswordEmailProps { + verifyLink: string; + t?: TFunction; +} + +export function ForgotPasswordEmail({ verifyLink, t = mockT }: ForgotPasswordEmailProps): React.JSX.Element { + return ( + + + {t("emails.forgot_password_email_heading")} + {t("emails.forgot_password_email_text")} + + {t("emails.forgot_password_email_link_valid_for_24_hours")} + {t("emails.forgot_password_email_did_not_request")} + + + + ); +} + +// Default export for preview server +export default function ForgotPasswordEmailPreview(): React.JSX.Element { + return ; +} diff --git a/packages/email/emails/auth/new-email-verification.tsx b/packages/email/emails/auth/new-email-verification.tsx new file mode 100644 index 0000000000..0179c615ae --- /dev/null +++ b/packages/email/emails/auth/new-email-verification.tsx @@ -0,0 +1,40 @@ +import { Container, Heading, Link, Text } from "@react-email/components"; +import { EmailButton } from "@/src/components/email-button"; +import { EmailFooter } from "@/src/components/email-footer"; +import { EmailTemplate } from "@/src/components/email-template"; +import { exampleData } from "@/src/lib/example-data"; +import { t as mockT } from "@/src/lib/mock-translate"; + +type TFunction = (key: string, replacements?: Record) => string; + +interface NewEmailVerificationProps { + readonly verifyLink: string; + readonly t?: TFunction; +} + +export function NewEmailVerification({ + verifyLink, + t = mockT, +}: NewEmailVerificationProps): React.JSX.Element { + return ( + + + {t("emails.verification_email_heading")} + {t("emails.new_email_verification_text")} + {t("emails.verification_security_notice")} + + {t("emails.verification_email_click_on_this_link")} + + {verifyLink} + + {t("emails.verification_email_link_valid_for_24_hours")} + + + + ); +} + +// Default export for preview server +export default function NewEmailVerificationPreview(): React.JSX.Element { + return ; +} diff --git a/packages/email/emails/auth/password-reset-notify-email.tsx b/packages/email/emails/auth/password-reset-notify-email.tsx new file mode 100644 index 0000000000..a7142ca700 --- /dev/null +++ b/packages/email/emails/auth/password-reset-notify-email.tsx @@ -0,0 +1,30 @@ +import { Container, Heading, Text } from "@react-email/components"; +import { EmailFooter } from "@/src/components/email-footer"; +import { EmailTemplate } from "@/src/components/email-template"; +import { exampleData } from "@/src/lib/example-data"; +import { t as mockT } from "@/src/lib/mock-translate"; + +type TFunction = (key: string, replacements?: Record) => string; + +interface PasswordResetNotifyEmailProps { + readonly t?: TFunction; +} + +export function PasswordResetNotifyEmail({ + t = mockT, +}: PasswordResetNotifyEmailProps = {}): React.JSX.Element { + return ( + + + {t("emails.password_changed_email_heading")} + {t("emails.password_changed_email_text")} + + + + ); +} + +// Default export for preview server +export default function PasswordResetNotifyEmailPreview(): React.JSX.Element { + return ; +} diff --git a/packages/email/emails/auth/verification-email.tsx b/packages/email/emails/auth/verification-email.tsx new file mode 100644 index 0000000000..9eb9118c2a --- /dev/null +++ b/packages/email/emails/auth/verification-email.tsx @@ -0,0 +1,47 @@ +import { Container, Heading, Link, Text } from "@react-email/components"; +import { EmailButton } from "@/src/components/email-button"; +import { EmailFooter } from "@/src/components/email-footer"; +import { EmailTemplate } from "@/src/components/email-template"; +import { exampleData } from "@/src/lib/example-data"; +import { t as mockT } from "@/src/lib/mock-translate"; + +type TFunction = (key: string, replacements?: Record) => string; + +interface VerificationEmailProps { + verifyLink: string; + verificationRequestLink: string; + t?: TFunction; +} + +export function VerificationEmail({ + verifyLink, + verificationRequestLink, + t = mockT, +}: VerificationEmailProps): React.JSX.Element { + return ( + + + {t("emails.verification_email_heading")} + {t("emails.verification_email_text")} + + {t("emails.verification_email_click_on_this_link")} + + {verifyLink} + + {t("emails.verification_email_link_valid_for_24_hours")} + + {t("emails.verification_email_if_expired_request_new_token")} + + {t("emails.verification_email_request_new_verification")} + + + + + + ); +} + +// Default export for preview server +export default function VerificationEmailPreview(): React.JSX.Element { + return ; +} diff --git a/packages/email/emails/general/email-customization-preview-email.tsx b/packages/email/emails/general/email-customization-preview-email.tsx new file mode 100644 index 0000000000..210cb20779 --- /dev/null +++ b/packages/email/emails/general/email-customization-preview-email.tsx @@ -0,0 +1,32 @@ +import { Container, Heading, Text } from "@react-email/components"; +import { EmailTemplate } from "@/src/components/email-template"; +import { exampleData } from "@/src/lib/example-data"; +import { t as mockT } from "@/src/lib/mock-translate"; + +type TFunction = (key: string, replacements?: Record) => string; + +interface EmailCustomizationPreviewEmailProps { + userName: string; + logoUrl?: string; + t?: TFunction; +} + +export function EmailCustomizationPreviewEmail({ + userName, + logoUrl, + t = mockT, +}: EmailCustomizationPreviewEmailProps): React.JSX.Element { + return ( + + + {t("emails.email_customization_preview_email_heading", { userName })} + {t("emails.email_customization_preview_email_text")} + + + ); +} + +// Default export for preview server +export default function EmailCustomizationPreviewEmailPreview(): React.JSX.Element { + return ; +} diff --git a/packages/email/emails/invite/invite-accepted-email.tsx b/packages/email/emails/invite/invite-accepted-email.tsx new file mode 100644 index 0000000000..93938027dd --- /dev/null +++ b/packages/email/emails/invite/invite-accepted-email.tsx @@ -0,0 +1,39 @@ +import { Container, Heading, Text } from "@react-email/components"; +import { EmailFooter } from "@/src/components/email-footer"; +import { EmailTemplate } from "@/src/components/email-template"; +import { exampleData } from "@/src/lib/example-data"; +import { t as mockT } from "@/src/lib/mock-translate"; + +type TFunction = (key: string, replacements?: Record) => string; + +interface InviteAcceptedEmailProps { + inviterName: string; + inviteeName: string; + t?: TFunction; +} + +export function InviteAcceptedEmail({ + inviterName, + inviteeName, + t = mockT, +}: InviteAcceptedEmailProps): React.JSX.Element { + return ( + + + + {t("emails.invite_accepted_email_heading", { inviterName })} {inviterName} + + + {t("emails.invite_accepted_email_text_par1", { inviteeName })} {inviteeName}{" "} + {t("emails.invite_accepted_email_text_par2")} + + + + + ); +} + +// Default export for preview server +export default function InviteAcceptedEmailPreview(): React.JSX.Element { + return ; +} diff --git a/packages/email/emails/invite/invite-email.tsx b/packages/email/emails/invite/invite-email.tsx new file mode 100644 index 0000000000..f7780cb710 --- /dev/null +++ b/packages/email/emails/invite/invite-email.tsx @@ -0,0 +1,43 @@ +import { Container, Heading, Text } from "@react-email/components"; +import { EmailButton } from "@/src/components/email-button"; +import { EmailFooter } from "@/src/components/email-footer"; +import { EmailTemplate } from "@/src/components/email-template"; +import { exampleData } from "@/src/lib/example-data"; +import { t as mockT } from "@/src/lib/mock-translate"; + +type TFunction = (key: string, replacements?: Record) => string; + +interface InviteEmailProps { + inviteeName: string; + inviterName: string; + verifyLink: string; + t?: TFunction; +} + +export function InviteEmail({ + inviteeName, + inviterName, + verifyLink, + t = mockT, +}: InviteEmailProps): React.JSX.Element { + return ( + + + + {t("emails.invite_email_heading", { inviteeName })} {inviteeName} + + + {t("emails.invite_email_text_par1", { inviterName })} {inviterName}{" "} + {t("emails.invite_email_text_par2")} + + + + + + ); +} + +// Default export for preview server +export default function InviteEmailPreview(): React.JSX.Element { + return ; +} diff --git a/packages/email/emails/survey/embed-survey-preview-email.tsx b/packages/email/emails/survey/embed-survey-preview-email.tsx new file mode 100644 index 0000000000..3619925fad --- /dev/null +++ b/packages/email/emails/survey/embed-survey-preview-email.tsx @@ -0,0 +1,42 @@ +import { Container, Heading, Text } from "@react-email/components"; +import { EmailTemplate } from "@/src/components/email-template"; +import { exampleData } from "@/src/lib/example-data"; +import { t as mockT } from "@/src/lib/mock-translate"; + +type TFunction = (key: string, replacements?: Record) => string; + +interface EmbedSurveyPreviewEmailProps { + html: string; + environmentId: string; + logoUrl?: string; + t?: TFunction; +} + +export function EmbedSurveyPreviewEmail({ + html, + environmentId, + logoUrl, + t = mockT, +}: EmbedSurveyPreviewEmailProps): React.JSX.Element { + return ( + + + {t("emails.embed_survey_preview_email_heading")} + {t("emails.embed_survey_preview_email_text")} + + {t("emails.embed_survey_preview_email_didnt_request")}{" "} + {t("emails.embed_survey_preview_email_fight_spam")} + +
+ + {t("emails.embed_survey_preview_email_environment_id")}: {environmentId} + + + + ); +} + +// Default export for preview server +export default function EmbedSurveyPreviewEmailPreview(): React.JSX.Element { + return ; +} diff --git a/packages/email/emails/survey/follow-up-email.tsx b/packages/email/emails/survey/follow-up-email.tsx new file mode 100644 index 0000000000..91e93d3fcb --- /dev/null +++ b/packages/email/emails/survey/follow-up-email.tsx @@ -0,0 +1,135 @@ +import { Column, Hr, Row, Text } from "@react-email/components"; +import { TSurveyElementTypeEnum } from "@formbricks/types/surveys/elements"; +import { EmailTemplate } from "@/src/components/email-template"; +import { renderEmailResponseValue } from "@/src/lib/email-utils"; +import { t as mockT } from "@/src/lib/mock-translate"; + +type TFunction = (key: string, replacements?: Record) => string; + +// Processed data types - web app does all the processing +interface ProcessedResponseElement { + element: string; + response: string | string[]; + type: TSurveyElementTypeEnum; +} + +interface ProcessedVariable { + id: string; + name: string; + type: "text" | "number"; + value: string | number; +} + +interface ProcessedHiddenField { + id: string; + value: string; +} + +export interface FollowUpEmailProps { + readonly body: string; // Already processed HTML with recall tags replaced + readonly responseData?: ProcessedResponseElement[]; // Already mapped elements + readonly variables?: ProcessedVariable[]; // Already filtered variables + readonly hiddenFields?: ProcessedHiddenField[]; // Already filtered hidden fields + readonly logoUrl?: string; + readonly t?: TFunction; +} + +export function FollowUpEmail({ + body, + responseData = [], + variables = [], + hiddenFields = [], + logoUrl, + t = mockT, +}: FollowUpEmailProps): React.JSX.Element { + return ( + + <> +
+ + {responseData.length > 0 ? ( + <> +
+ {t("emails.response_data")} + + ) : null} + + {responseData.map((e) => { + if (!e.response) return null; + return ( + + + {e.element} + {renderEmailResponseValue(e.response, e.type, t, true)} + + + ); + })} + + {variables.map((variable) => ( + + + + {variable.type === "number" + ? `${t("emails.number_variable")}: ${variable.name}` + : `${t("emails.text_variable")}: ${variable.name}`} + + + {variable.value} + + + + ))} + + {hiddenFields.map((hiddenField) => ( + + + + {t("emails.hidden_field")}: {hiddenField.id} + + + {hiddenField.value} + + + + ))} + + + ); +} + +// Default export for preview server with example data +export default function FollowUpEmailPreview(): React.JSX.Element { + return ( + + ); +} diff --git a/packages/email/emails/survey/link-survey-email.tsx b/packages/email/emails/survey/link-survey-email.tsx new file mode 100644 index 0000000000..a6036309c5 --- /dev/null +++ b/packages/email/emails/survey/link-survey-email.tsx @@ -0,0 +1,42 @@ +import { Container, Heading, Text } from "@react-email/components"; +import { EmailButton } from "@/src/components/email-button"; +import { EmailFooter } from "@/src/components/email-footer"; +import { EmailTemplate } from "@/src/components/email-template"; +import { exampleData } from "@/src/lib/example-data"; +import { t as mockT } from "@/src/lib/mock-translate"; + +type TFunction = (key: string, replacements?: Record) => string; + +interface LinkSurveyEmailProps { + surveyName: string; + surveyLink: string; + logoUrl: string; + t?: TFunction; +} + +export function LinkSurveyEmail({ + surveyName, + surveyLink, + logoUrl, + t = mockT, +}: LinkSurveyEmailProps): React.JSX.Element { + return ( + + + {t("emails.verification_email_hey")} + {t("emails.verification_email_thanks")} + {t("emails.verification_email_to_fill_survey")} + + + {t("emails.verification_email_survey_name")}: {surveyName} + + + + + ); +} + +// Default export for preview server +export default function LinkSurveyEmailPreview(): React.JSX.Element { + return ; +} diff --git a/packages/email/emails/survey/response-finished-email.tsx b/packages/email/emails/survey/response-finished-email.tsx new file mode 100644 index 0000000000..32dbfebd50 --- /dev/null +++ b/packages/email/emails/survey/response-finished-email.tsx @@ -0,0 +1,189 @@ +import { Column, Container, Heading, Hr, Link, Row, Section, Text } from "@react-email/components"; +import { FileDigitIcon, FileType2Icon } from "lucide-react"; +import type { TOrganization } from "@formbricks/types/organizations"; +import type { TResponse } from "@formbricks/types/responses"; +import { TSurveyElementTypeEnum } from "@formbricks/types/surveys/elements"; +import type { TSurvey } from "@formbricks/types/surveys/types"; +import { EmailButton } from "@/src/components/email-button"; +import { EmailTemplate } from "@/src/components/email-template"; +import { renderEmailResponseValue } from "@/src/lib/email-utils"; +import { exampleData } from "@/src/lib/example-data"; +import { t as mockT } from "@/src/lib/mock-translate"; + +type TFunction = (key: string, replacements?: Record) => string; + +export interface MappedElement { + element: string; + response: string | string[]; + type: TSurveyElementTypeEnum; +} + +export interface ResponseFinishedEmailProps { + survey: TSurvey; + responseCount: number; + response: TResponse; + WEBAPP_URL: string; + environmentId: string; + organization: TOrganization; + elements: MappedElement[]; // Pre-processed data, not a function + t?: TFunction; +} + +// Helper function to get element response mapping (simplified) +const mockGetElementResponseMapping = (survey: TSurvey, response: TResponse) => { + // For preview, just return the response data as elements + return Object.entries(response.data) + .filter(([key]) => !survey.hiddenFields.fieldIds?.includes(key)) + .map(([key, value]) => ({ + element: key, + response: value as string | string[], + type: TSurveyElementTypeEnum.OpenText, // Default type for preview + })); +}; + +export function ResponseFinishedEmail({ + survey, + responseCount, + response, + WEBAPP_URL, + environmentId, + organization, + elements, + t = mockT, +}: ResponseFinishedEmailProps): React.JSX.Element { + return ( + + + + + {t("emails.survey_response_finished_email_hey")} + + {t("emails.survey_response_finished_email_congrats", { + surveyName: survey.name, + })} + +
+ {elements.map((e) => { + if (!e.response) return null; + return ( + + + {e.element} + {renderEmailResponseValue(e.response, e.type, t)} + + + ); + })} + {survey.variables + .filter((variable) => { + const variableResponse = response.variables[variable.id]; + if (typeof variableResponse !== "string" && typeof variableResponse !== "number") { + return false; + } + return variableResponse !== undefined; + }) + .map((variable) => { + const variableResponse = response.variables[variable.id]; + return ( + + + + {variable.type === "number" ? ( + + ) : ( + + )} + {variable.name} + + + {variableResponse} + + + + ); + })} + {survey.hiddenFields.fieldIds + ?.filter((hiddenFieldId) => { + const hiddenFieldResponse = response.data[hiddenFieldId]; + return hiddenFieldResponse && typeof hiddenFieldResponse === "string"; + }) + .map((hiddenFieldId) => { + const hiddenFieldResponse = response.data[hiddenFieldId] as string; + return ( + + + + {hiddenFieldId} + + + {hiddenFieldResponse} + + + + ); + })} + 1 + ? t("emails.survey_response_finished_email_view_more_responses", { + responseCount: String(responseCount - 1), + }) + : t("emails.survey_response_finished_email_view_survey_summary") + } + /> +
+
+ + {t("emails.survey_response_finished_email_dont_want_notifications")} + + + + {t("emails.survey_response_finished_email_turn_off_notifications_for_this_form")} + + + + + {t("emails.survey_response_finished_email_turn_off_notifications_for_all_new_forms")} + + +
+
+
+
+
+ ); +} + +function EyeOffIcon(): React.JSX.Element { + return ( + + + + + + + ); +} + +// Default export for preview server +export default function ResponseFinishedEmailPreview(): React.JSX.Element { + const { survey, response, ...rest } = exampleData.responseFinishedEmail; + const elements = mockGetElementResponseMapping(survey, response); + + return ; +} diff --git a/packages/email/package.json b/packages/email/package.json new file mode 100644 index 0000000000..6581fe8221 --- /dev/null +++ b/packages/email/package.json @@ -0,0 +1,27 @@ +{ + "name": "@formbricks/email", + "version": "1.0.0", + "private": true, + "description": "Email templates for Formbricks with React Email preview server", + "type": "module", + "main": "src/index.ts", + "types": "src/index.ts", + "scripts": { + "dev": "email dev --port 3456", + "build": "tsc --noEmit", + "lint": "eslint src --fix --ext .ts,.tsx", + "clean": "rimraf .turbo node_modules dist" + }, + "dependencies": { + "@react-email/components": "1.0.1", + "react": "19.1.2", + "react-dom": "19.1.2", + "react-email": "5.0.8" + }, + "devDependencies": { + "@formbricks/config-typescript": "workspace:*", + "@formbricks/eslint-config": "workspace:*", + "@formbricks/types": "workspace:*", + "@react-email/preview-server": "5.0.8" + } +} diff --git a/packages/email/src/components/email-button.tsx b/packages/email/src/components/email-button.tsx new file mode 100644 index 0000000000..703004f2be --- /dev/null +++ b/packages/email/src/components/email-button.tsx @@ -0,0 +1,16 @@ +import { Button } from "@react-email/components"; + +interface EmailButtonProps { + label: string; + href: string; +} + +export function EmailButton({ label, href }: EmailButtonProps): React.JSX.Element { + return ( + + ); +} + +export default EmailButton; diff --git a/packages/email/src/components/email-element-header.tsx b/packages/email/src/components/email-element-header.tsx new file mode 100644 index 0000000000..0049aa22a8 --- /dev/null +++ b/packages/email/src/components/email-element-header.tsx @@ -0,0 +1,29 @@ +import { Container } from "@react-email/components"; + +interface ElementHeaderProps { + headline: string; + subheader?: string; + className?: string; +} + +// Simple cn utility for className merging +const cn = (...classes: (string | undefined)[]) => { + return classes.filter(Boolean).join(" "); +}; + +export function ElementHeader({ headline, subheader, className }: ElementHeaderProps): React.JSX.Element { + return ( + <> + +
+ + {subheader && ( + +
+ + )} + + ); +} + +export default ElementHeader; diff --git a/packages/email/src/components/email-footer.tsx b/packages/email/src/components/email-footer.tsx new file mode 100644 index 0000000000..f83c0ddc3e --- /dev/null +++ b/packages/email/src/components/email-footer.tsx @@ -0,0 +1,15 @@ +import { Text } from "@react-email/components"; + +type TFunction = (key: string, replacements?: Record) => string; + +export function EmailFooter({ t }: { t: TFunction }): React.JSX.Element { + return ( + + {t("emails.email_footer_text_1")} +
+ {t("emails.email_footer_text_2")} +
+ ); +} + +export default EmailFooter; diff --git a/packages/email/src/components/email-template.tsx b/packages/email/src/components/email-template.tsx new file mode 100644 index 0000000000..52b41fcf92 --- /dev/null +++ b/packages/email/src/components/email-template.tsx @@ -0,0 +1,59 @@ +import { Body, Container, Html, Img, Link, Section, Tailwind } from "@react-email/components"; + +type TFunction = (key: string, replacements?: Record) => string; + +const fbLogoUrl = + "https://s3.eu-central-1.amazonaws.com/listmonk-formbricks/Formbricks-Light-transparent.png"; +const logoLink = "https://formbricks.com?utm_source=email_header&utm_medium=email"; + +interface EmailTemplateProps { + readonly children: React.ReactNode; + readonly logoUrl?: string; + readonly t: TFunction; +} + +export function EmailTemplate({ children, logoUrl, t }: EmailTemplateProps): React.JSX.Element { + const isDefaultLogo = !logoUrl || logoUrl === fbLogoUrl; + + return ( + + + +
+ {isDefaultLogo ? ( + + Logo + + ) : ( + Logo + )} +
+ + {children} + + +
+ + {t("emails.email_template_text_1")} + +
+ +
+ + ); +} + +export default EmailTemplate; diff --git a/packages/email/src/index.ts b/packages/email/src/index.ts new file mode 100644 index 0000000000..3e8a835804 --- /dev/null +++ b/packages/email/src/index.ts @@ -0,0 +1,52 @@ +export { VerificationEmail } from "@/emails/auth/verification-email"; +export { ForgotPasswordEmail } from "@/emails/auth/forgot-password-email"; +export { NewEmailVerification } from "@/emails/auth/new-email-verification"; +export { PasswordResetNotifyEmail } from "@/emails/auth/password-reset-notify-email"; +export { InviteEmail } from "@/emails/invite/invite-email"; +export { InviteAcceptedEmail } from "@/emails/invite/invite-accepted-email"; +export { LinkSurveyEmail } from "@/emails/survey/link-survey-email"; +export { EmbedSurveyPreviewEmail } from "@/emails/survey/embed-survey-preview-email"; +export { ResponseFinishedEmail } from "@/emails/survey/response-finished-email"; +export { EmailCustomizationPreviewEmail } from "@/emails/general/email-customization-preview-email"; +export { FollowUpEmail } from "@/emails/survey/follow-up-email"; + +export { EmailButton } from "./components/email-button"; +export { EmailFooter } from "./components/email-footer"; +export { EmailTemplate } from "./components/email-template"; +export { ElementHeader } from "./components/email-element-header"; + +export { + renderVerificationEmail, + renderForgotPasswordEmail, + renderNewEmailVerification, + renderPasswordResetNotifyEmail, + renderInviteEmail, + renderInviteAcceptedEmail, + renderLinkSurveyEmail, + renderEmbedSurveyPreviewEmail, + renderResponseFinishedEmail, + renderEmailCustomizationPreviewEmail, + renderFollowUpEmail, +} from "./lib/render"; + +export { render } from "@react-email/render"; + +export { + Body, + Button, + Column, + Container, + Head, + Heading, + Hr, + Html, + Img, + Link, + Preview, + Row, + Section, + Tailwind, + Text, +} from "@react-email/components"; + +export type { ProcessedResponseElement, ProcessedVariable, ProcessedHiddenField } from "./lib/render"; diff --git a/packages/email/src/lib/email-utils.tsx b/packages/email/src/lib/email-utils.tsx new file mode 100644 index 0000000000..e40d6b923b --- /dev/null +++ b/packages/email/src/lib/email-utils.tsx @@ -0,0 +1,82 @@ +import { Column, Container, Img, Link, Row, Text } from "@react-email/components"; +import { FileIcon } from "lucide-react"; +import { TSurveyElementTypeEnum } from "@formbricks/types/surveys/elements"; + +type TFunction = (key: string, replacements?: Record) => string; + +// Simplified version - just get the filename from URL +const getOriginalFileNameFromUrl = (url: string): string => { + try { + const urlObj = new URL(url); + const pathname = urlObj.pathname; + const filename = pathname.split("/").pop() || "file"; + return decodeURIComponent(filename); + } catch { + return url.split("/").pop() || "file"; + } +}; + +export const renderEmailResponseValue = ( + response: string | string[], + questionType: TSurveyElementTypeEnum, + t: TFunction, + overrideFileUploadResponse = false +): React.JSX.Element => { + switch (questionType) { + case TSurveyElementTypeEnum.FileUpload: + return ( + + {overrideFileUploadResponse ? ( + + {t("emails.render_email_response_value_file_upload_response_link_not_included")} + + ) : ( + Array.isArray(response) && + response.map((responseItem) => ( + + + + {getOriginalFileNameFromUrl(responseItem)} + + + )) + )} + + ); + + case TSurveyElementTypeEnum.PictureSelection: + return ( + + + {Array.isArray(response) && + response.map((responseItem) => ( + + {responseItem.split("/").pop()} + + ))} + + + ); + + case TSurveyElementTypeEnum.Ranking: + return ( + + + {Array.isArray(response) && + response.filter(Boolean).map((item, index) => ( + + #{index + 1} + {item} + + ))} + + + ); + + default: + return {response as string}; + } +}; diff --git a/packages/email/src/lib/example-data.ts b/packages/email/src/lib/example-data.ts new file mode 100644 index 0000000000..411943d43e --- /dev/null +++ b/packages/email/src/lib/example-data.ts @@ -0,0 +1,150 @@ +// Mock data for email templates to use in React Email preview server +import { TOrganization } from "@formbricks/types/organizations"; +import { TResponse } from "@formbricks/types/responses"; +import { TSurvey } from "@formbricks/types/surveys/types"; + +export const exampleData = { + verificationEmail: { + verifyLink: "https://app.formbricks.com/auth/verify?token=example-verification-token", + verificationRequestLink: "https://app.formbricks.com/auth/verification-requested", + }, + + forgotPasswordEmail: { + verifyLink: "https://app.formbricks.com/auth/forgot-password/reset?token=example-reset-token", + }, + + newEmailVerification: { + verifyLink: "https://app.formbricks.com/verify-email-change?token=example-email-change-token", + }, + + passwordResetNotifyEmail: { + // No props needed + }, + + inviteEmail: { + inviteeName: "Jane Smith", + inviterName: "John Doe", + verifyLink: "https://app.formbricks.com/invite?token=example-invite-token", + }, + + inviteAcceptedEmail: { + inviterName: "John Doe", + inviteeName: "Jane Smith", + }, + + linkSurveyEmail: { + surveyName: "Customer Satisfaction Survey", + surveyLink: + "https://app.formbricks.com/s/example-survey-id?verify=example-token&suId=example-single-use-id", + logoUrl: "https://app.formbricks.com/logo.png", + }, + + embedSurveyPreviewEmail: { + html: '

Example Survey Embed

This is a preview of how your survey will look when embedded in an email.

', + environmentId: "clxyz123456789", + logoUrl: "https://app.formbricks.com/logo.png", + }, + + responseFinishedEmail: { + survey: { + id: "survey-123", + name: "Customer Feedback Survey", + variables: [ + { + id: "var-1", + name: "Customer ID", + type: "text" as const, + }, + ], + hiddenFields: { + enabled: true, + fieldIds: ["userId"], + }, + welcomeCard: { + enabled: false, + }, + questions: [ + { + id: "q1", + type: "openText" as const, + headline: { default: "What did you like most?" }, + required: true, + inputType: "text" as const, + }, + { + id: "q2", + type: "rating" as const, + headline: { default: "How would you rate your experience?" }, + required: true, + scale: "number" as const, + range: 5, + }, + ], + endings: [], + styling: {}, + createdBy: null, + } as unknown as TSurvey, + responseCount: 15, + response: { + id: "response-123", + createdAt: new Date(), + updatedAt: new Date(), + surveyId: "survey-123", + finished: true, + data: { + q1: "The customer service was excellent!", + q2: 5, + userId: "user-abc-123", + }, + variables: { + "var-1": "CUST-456", + }, + contactAttributes: { + email: "customer@example.com", + }, + meta: { + userAgent: {}, + url: "https://example.com", + }, + tags: [], + notes: [], + ttc: {}, + singleUseId: null, + language: "default", + displayId: null, + } as unknown as TResponse, + WEBAPP_URL: "https://app.formbricks.com", + environmentId: "env-123", + organization: { + id: "org-123", + name: "Acme Corporation", + createdAt: new Date(), + updatedAt: new Date(), + billing: { + stripeCustomerId: null, + subscriptionStatus: null, + features: { + inAppSurvey: { status: "active" as const, unlimited: true }, + linkSurvey: { status: "active" as const, unlimited: true }, + userTargeting: { status: "active" as const, unlimited: true }, + }, + limits: { + monthly: { + responses: 1000, + miu: 10000, + }, + }, + }, + isAIEnabled: false, + } as unknown as TOrganization, + }, + + emailCustomizationPreviewEmail: { + userName: "Alex Johnson", + logoUrl: "https://app.formbricks.com/logo.png", + }, +}; + +// Type exports for use in templates +export type ExampleDataKeys = keyof typeof exampleData; +export type ExampleData = (typeof exampleData)[K]; diff --git a/packages/email/src/lib/mock-translate.ts b/packages/email/src/lib/mock-translate.ts new file mode 100644 index 0000000000..2fb3b814c3 --- /dev/null +++ b/packages/email/src/lib/mock-translate.ts @@ -0,0 +1,110 @@ +// Mock translation function for React Email preview server +// Returns English strings extracted from apps/web/locales/en-US.json + +type TranslationKey = string; +type TranslationValue = string; + +const translations: Record = { + "emails.accept": "Accept", + "emails.click_or_drag_to_upload_files": "Click or drag to upload files.", + "emails.email_customization_preview_email_heading": "Hey {userName}", + "emails.email_customization_preview_email_subject": "Formbricks Email Customization Preview", + "emails.email_customization_preview_email_text": + "This is an email preview to show you which logo will be rendered in the emails.", + "emails.email_footer_text_1": "Have a great day!", + "emails.email_footer_text_2": "The Formbricks Team", + "emails.email_template_text_1": "This email was sent via Formbricks.", + "emails.embed_survey_preview_email_didnt_request": "Didn't request this?", + "emails.embed_survey_preview_email_environment_id": "Environment ID", + "emails.embed_survey_preview_email_fight_spam": + "Help us fight spam and forward this mail to hola@formbricks.com", + "emails.embed_survey_preview_email_heading": "Preview Email Embed", + "emails.embed_survey_preview_email_subject": "Formbricks Email Survey Preview", + "emails.embed_survey_preview_email_text": "This is how the code snippet looks embedded into an email:", + "emails.forgot_password_email_change_password": "Change password", + "emails.forgot_password_email_did_not_request": "If you didn't request this, please ignore this email.", + "emails.forgot_password_email_heading": "Change password", + "emails.forgot_password_email_link_valid_for_24_hours": "The link is valid for 24 hours.", + "emails.forgot_password_email_subject": "Reset your Formbricks password", + "emails.forgot_password_email_text": + "You have requested a link to change your password. You can do this by clicking the link below:", + "emails.hidden_field": "Hidden field", + "emails.imprint": "Imprint", + "emails.invite_accepted_email_heading": "Hey", + "emails.invite_accepted_email_subject": "You've got a new organization member!", + "emails.invite_accepted_email_text_par1": "Just letting you know that", + "emails.invite_accepted_email_text_par2": "accepted your invitation. Have fun collaborating!", + "emails.invite_email_button_label": "Join organization", + "emails.invite_email_heading": "Hey", + "emails.invite_email_text_par1": "Your colleague", + "emails.invite_email_text_par2": + "invited you to join them at Formbricks. To accept the invitation, please click the link below:", + "emails.invite_member_email_subject": "You're invited to collaborate on Formbricks!", + "emails.new_email_verification_text": "To verify your new email address, please click the button below:", + "emails.number_variable": "Number variable", + "emails.password_changed_email_heading": "Password changed", + "emails.password_changed_email_text": "Your password has been changed successfully.", + "emails.password_reset_notify_email_subject": "Your Formbricks password has been changed", + "emails.privacy_policy": "Privacy Policy", + "emails.reject": "Reject", + "emails.render_email_response_value_file_upload_response_link_not_included": + "Link to uploaded file is not included for data privacy reasons", + "emails.response_data": "Response data", + "emails.response_finished_email_subject": "A response for {surveyName} was completed ✅", + "emails.response_finished_email_subject_with_email": + "{personEmail} just completed your {surveyName} survey ✅", + "emails.schedule_your_meeting": "Schedule your meeting", + "emails.select_a_date": "Select a date", + "emails.survey_response_finished_email_congrats": + "Congrats, you received a new response to your survey! Someone just completed your survey: {surveyName}", + "emails.survey_response_finished_email_dont_want_notifications": "Don't want to get these notifications?", + "emails.survey_response_finished_email_hey": "Hey 👋", + "emails.survey_response_finished_email_turn_off_notifications_for_all_new_forms": + "Turn off notifications for all newly created forms", + "emails.survey_response_finished_email_turn_off_notifications_for_this_form": + "Turn off notifications for this form", + "emails.survey_response_finished_email_view_more_responses": "View {responseCount} more responses", + "emails.survey_response_finished_email_view_survey_summary": "View survey summary", + "emails.text_variable": "Text variable", + "emails.verification_email_click_on_this_link": "You can also click on this link:", + "emails.verification_email_heading": "Almost there!", + "emails.verification_email_hey": "Hey 👋", + "emails.verification_email_if_expired_request_new_token": + "If it has expired please request a new token here:", + "emails.verification_email_link_valid_for_24_hours": "The link is valid for 24 hours.", + "emails.verification_email_request_new_verification": "Request new verification", + "emails.verification_email_subject": "Please verify your email to use Formbricks", + "emails.verification_email_survey_name": "Survey name", + "emails.verification_email_take_survey": "Take survey", + "emails.verification_email_text": "To start using Formbricks please verify your email below:", + "emails.verification_email_thanks": "Thanks for validating your email!", + "emails.verification_email_to_fill_survey": "To fill out the survey please click on the button below:", + "emails.verification_email_verify_email": "Verify email", + "emails.verification_new_email_subject": "Email change verification", + "emails.verification_security_notice": + "If you did not request this email change, please ignore this email or contact support immediately.", + "emails.verified_link_survey_email_subject": "Your survey is ready to be filled out.", +}; + +// Simple string replacement for placeholders like {userName}, {surveyName}, etc. +const replacePlaceholders = (text: string, replacements?: Record): string => { + if (!replacements) return text; + + let result = text; + Object.entries(replacements).forEach(([key, value]) => { + result = result.replace(new RegExp(`\\{${key}\\}`, "g"), value); + }); + + return result; +}; + +/** + * Mock translation function for preview server + * @param key - Translation key (e.g., "emails.forgot_password_email_heading") + * @param replacements - Optional object with placeholder replacements + * @returns Translated string with placeholders replaced + */ +export const t = (key: string, replacements?: Record): string => { + const translation = translations[key] || key; + return replacePlaceholders(translation, replacements); +}; diff --git a/packages/email/src/lib/render.ts b/packages/email/src/lib/render.ts new file mode 100644 index 0000000000..0313be0a78 --- /dev/null +++ b/packages/email/src/lib/render.ts @@ -0,0 +1,118 @@ +import { render } from "@react-email/render"; +import { TSurveyElementTypeEnum } from "@formbricks/types/surveys/elements"; +import { FollowUpEmailProps } from "@/emails/survey/follow-up-email"; +import { ResponseFinishedEmailProps } from "@/emails/survey/response-finished-email"; +import { + EmailCustomizationPreviewEmail, + EmbedSurveyPreviewEmail, + FollowUpEmail, + ForgotPasswordEmail, + InviteAcceptedEmail, + InviteEmail, + LinkSurveyEmail, + NewEmailVerification, + PasswordResetNotifyEmail, + ResponseFinishedEmail, + VerificationEmail, +} from "@/src/index"; + +type TFunction = (key: string, replacements?: Record) => string; + +// Render helper functions that convert React email components to HTML strings +// These are used by the web app to send emails without needing to import react-email + +export async function renderVerificationEmail(props: { + verifyLink: string; + verificationRequestLink: string; + t: TFunction; +}): Promise { + return await render(VerificationEmail(props)); +} + +export async function renderForgotPasswordEmail(props: { + verifyLink: string; + t: TFunction; +}): Promise { + return await render(ForgotPasswordEmail(props)); +} + +export async function renderNewEmailVerification(props: { + verifyLink: string; + t: TFunction; +}): Promise { + return await render(NewEmailVerification(props)); +} + +export async function renderPasswordResetNotifyEmail(props: { t: TFunction }): Promise { + return await render(PasswordResetNotifyEmail(props)); +} + +export async function renderInviteEmail(props: { + inviteeName: string; + inviterName: string; + verifyLink: string; + t: TFunction; +}): Promise { + return await render(InviteEmail(props)); +} + +export async function renderInviteAcceptedEmail(props: { + inviterName: string; + inviteeName: string; + t: TFunction; +}): Promise { + return await render(InviteAcceptedEmail(props)); +} + +export async function renderLinkSurveyEmail(props: { + surveyName: string; + surveyLink: string; + logoUrl: string; + t: TFunction; +}): Promise { + return await render(LinkSurveyEmail(props)); +} + +export async function renderEmbedSurveyPreviewEmail(props: { + html: string; + environmentId: string; + logoUrl?: string; + t: TFunction; +}): Promise { + return await render(EmbedSurveyPreviewEmail(props)); +} + +export async function renderResponseFinishedEmail(props: ResponseFinishedEmailProps): Promise { + return await render(ResponseFinishedEmail(props)); +} + +export async function renderEmailCustomizationPreviewEmail(props: { + userName: string; + logoUrl?: string; + t: TFunction; +}): Promise { + return await render(EmailCustomizationPreviewEmail(props)); +} + +// Follow-up email types - exported for web app use +export interface ProcessedResponseElement { + element: string; + response: string | string[]; + type: TSurveyElementTypeEnum; +} + +export interface ProcessedVariable { + id: string; + name: string; + type: "text" | "number"; + value: string | number; +} + +export interface ProcessedHiddenField { + id: string; + value: string; +} + +export async function renderFollowUpEmail(props: FollowUpEmailProps): Promise { + return await render(FollowUpEmail(props)); +} diff --git a/packages/email/tsconfig.json b/packages/email/tsconfig.json new file mode 100644 index 0000000000..1b54c529ef --- /dev/null +++ b/packages/email/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "outDir": "dist", + "paths": { + "@/*": ["./*"] + }, + "rootDir": "." + }, + "exclude": ["node_modules", "dist"], + "extends": "@formbricks/config-typescript/react-library.json", + "include": ["src/**/*", "emails/**/*"] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 072e458600..3b5cfc8425 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -125,22 +125,25 @@ importers: version: 1.52.2(socks@2.8.7)(ts-node@10.9.2(@types/node@22.15.18)(typescript@5.8.3)) '@dnd-kit/core': specifier: 6.3.1 - version: 6.3.1(react-dom@19.1.2(react@19.1.2))(react@19.1.2) + version: 6.3.1(react-dom@19.1.2(react@19.1.2))(react@19.2.3) '@dnd-kit/modifiers': specifier: 9.0.0 - version: 9.0.0(@dnd-kit/core@6.3.1(react-dom@19.1.2(react@19.1.2))(react@19.1.2))(react@19.1.2) + version: 9.0.0(@dnd-kit/core@6.3.1(react-dom@19.1.2(react@19.1.2))(react@19.2.3))(react@19.2.3) '@dnd-kit/sortable': specifier: 10.0.0 - version: 10.0.0(@dnd-kit/core@6.3.1(react-dom@19.1.2(react@19.1.2))(react@19.1.2))(react@19.1.2) + version: 10.0.0(@dnd-kit/core@6.3.1(react-dom@19.1.2(react@19.1.2))(react@19.2.3))(react@19.2.3) '@dnd-kit/utilities': specifier: 3.2.2 - version: 3.2.2(react@19.1.2) + version: 3.2.2(react@19.2.3) '@formbricks/cache': specifier: workspace:* version: link:../../packages/cache '@formbricks/database': specifier: workspace:* version: link:../../packages/database + '@formbricks/email': + specifier: workspace:* + version: link:../../packages/email '@formbricks/i18n-utils': specifier: workspace:* version: link:../../packages/i18n-utils @@ -161,7 +164,7 @@ importers: version: link:../../packages/types '@hookform/resolvers': specifier: 5.0.1 - version: 5.0.1(react-hook-form@7.56.2(react@19.1.2)) + version: 5.0.1(react-hook-form@7.56.2(react@19.2.3)) '@intercom/messenger-js-sdk': specifier: 0.0.14 version: 0.0.14 @@ -182,7 +185,7 @@ importers: version: 0.36.2 '@lexical/react': specifier: 0.36.2 - version: 0.36.2(react-dom@19.1.2(react@19.1.2))(react@19.1.2)(yjs@13.6.27) + version: 0.36.2(react-dom@19.1.2(react@19.1.2))(react@19.2.3)(yjs@13.6.27) '@lexical/rich-text': specifier: 0.36.2 version: 0.36.2 @@ -218,61 +221,58 @@ importers: version: 6.14.0(prisma@6.14.0(magicast@0.3.5)(typescript@5.8.3))(typescript@5.8.3) '@radix-ui/react-accordion': specifier: 1.2.10 - version: 1.2.10(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) + version: 1.2.10(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) '@radix-ui/react-checkbox': specifier: 1.3.1 - version: 1.3.1(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) + version: 1.3.1(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) '@radix-ui/react-collapsible': specifier: 1.1.10 - version: 1.1.10(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) + version: 1.1.10(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) '@radix-ui/react-dialog': specifier: 1.1.13 - version: 1.1.13(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) + version: 1.1.13(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) '@radix-ui/react-dropdown-menu': specifier: 2.1.14 - version: 2.1.14(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) + version: 2.1.14(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) '@radix-ui/react-label': specifier: 2.1.6 - version: 2.1.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) + version: 2.1.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) '@radix-ui/react-popover': specifier: 1.1.13 - version: 1.1.13(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) + version: 1.1.13(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) '@radix-ui/react-radio-group': specifier: 1.3.6 - version: 1.3.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) + version: 1.3.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) '@radix-ui/react-select': specifier: 2.2.4 - version: 2.2.4(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) + version: 2.2.4(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) '@radix-ui/react-separator': specifier: 1.1.6 - version: 1.1.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) + version: 1.1.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) '@radix-ui/react-slider': specifier: 1.3.4 - version: 1.3.4(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) + version: 1.3.4(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) '@radix-ui/react-slot': specifier: 1.2.2 - version: 1.2.2(@types/react@19.1.4)(react@19.1.2) + version: 1.2.2(@types/react@19.1.4)(react@19.2.3) '@radix-ui/react-switch': specifier: 1.2.4 - version: 1.2.4(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) + version: 1.2.4(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) '@radix-ui/react-tabs': specifier: 1.1.11 - version: 1.1.11(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) + version: 1.1.11(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) '@radix-ui/react-toggle': specifier: 1.1.8 - version: 1.1.8(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) + version: 1.1.8(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) '@radix-ui/react-toggle-group': specifier: 1.1.9 - version: 1.1.9(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) + version: 1.1.9(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) '@radix-ui/react-tooltip': specifier: 1.2.6 - version: 1.2.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@react-email/components': - specifier: 0.0.38 - version: 0.0.38(react-dom@19.1.2(react@19.1.2))(react@19.1.2) + version: 1.2.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) '@sentry/nextjs': specifier: 10.5.0 - version: 10.5.0(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.1.2(react@19.1.2))(react@19.1.2))(react@19.1.2)(webpack@5.99.8(esbuild@0.25.10)) + version: 10.5.0(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.1.2(react@19.1.2))(react@19.2.3))(react@19.2.3)(webpack@5.99.8(esbuild@0.25.10)) '@t3-oss/env-nextjs': specifier: 0.13.4 version: 0.13.4(arktype@2.1.25)(typescript@5.8.3)(zod@3.24.4) @@ -284,7 +284,7 @@ importers: version: 0.5.16(tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.15.18)(typescript@5.8.3))) '@tanstack/react-table': specifier: 8.21.3 - version: 8.21.3(react-dom@19.1.2(react@19.1.2))(react@19.1.2) + version: 8.21.3(react-dom@19.1.2(react@19.1.2))(react@19.2.3) '@ungap/structured-clone': specifier: 1.3.0 version: 1.3.0 @@ -299,7 +299,7 @@ importers: version: 3.0.2 boring-avatars: specifier: 2.0.1 - version: 2.0.1(react-dom@19.1.2(react@19.1.2))(react@19.1.2) + version: 2.0.1(react-dom@19.1.2(react@19.1.2))(react@19.2.3) class-variance-authority: specifier: 0.7.1 version: 0.7.1 @@ -308,7 +308,7 @@ importers: version: 2.1.1 cmdk: specifier: 1.1.1 - version: 1.1.1(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) + version: 1.1.1(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) csv-parse: specifier: 5.6.0 version: 5.6.0 @@ -320,7 +320,7 @@ importers: version: 6.2.0(webpack@5.99.8(esbuild@0.25.10)) framer-motion: specifier: 12.10.0 - version: 12.10.0(react-dom@19.1.2(react@19.1.2))(react@19.1.2) + version: 12.10.0(react-dom@19.1.2(react@19.1.2))(react@19.2.3) googleapis: specifier: 148.0.0 version: 148.0.0(encoding@0.1.13) @@ -353,7 +353,7 @@ importers: version: 4.17.21 lucide-react: specifier: 0.507.0 - version: 0.507.0(react@19.1.2) + version: 0.507.0(react@19.2.3) markdown-it: specifier: 14.1.0 version: 14.1.0 @@ -362,13 +362,13 @@ importers: version: 3.0.1 next: specifier: 15.5.9 - version: 15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) + version: 15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) next-auth: specifier: 4.24.12 - version: 4.24.12(patch_hash=bdy3m55bopfzpysceipfxj5eei)(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.1.2(react@19.1.2))(react@19.1.2))(nodemailer@7.0.11)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) + version: 4.24.12(patch_hash=bdy3m55bopfzpysceipfxj5eei)(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.1.2(react@19.1.2))(react@19.2.3))(nodemailer@7.0.11)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) next-safe-action: specifier: 7.10.8 - version: 7.10.8(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.1.2(react@19.1.2))(react@19.1.2))(react-dom@19.1.2(react@19.1.2))(react@19.1.2)(zod@3.24.4) + version: 7.10.8(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.1.2(react@19.1.2))(react@19.2.3))(react-dom@19.1.2(react@19.1.2))(react@19.2.3)(zod@3.24.4) node-fetch: specifier: 3.3.2 version: 3.3.2 @@ -392,28 +392,28 @@ importers: version: 1.5.4 react-colorful: specifier: 5.6.1 - version: 5.6.1(react-dom@19.1.2(react@19.1.2))(react@19.1.2) + version: 5.6.1(react-dom@19.1.2(react@19.1.2))(react@19.2.3) react-confetti: specifier: 6.4.0 - version: 6.4.0(react@19.1.2) + version: 6.4.0(react@19.2.3) react-day-picker: specifier: 9.6.7 - version: 9.6.7(react@19.1.2) + version: 9.6.7(react@19.2.3) react-hook-form: specifier: 7.56.2 - version: 7.56.2(react@19.1.2) + version: 7.56.2(react@19.2.3) react-hot-toast: specifier: 2.5.2 - version: 2.5.2(react-dom@19.1.2(react@19.1.2))(react@19.1.2) + version: 2.5.2(react-dom@19.1.2(react@19.1.2))(react@19.2.3) react-i18next: specifier: 15.7.3 - version: 15.7.3(i18next@25.5.2(typescript@5.8.3))(react-dom@19.1.2(react@19.1.2))(react@19.1.2)(typescript@5.8.3) + version: 15.7.3(i18next@25.5.2(typescript@5.8.3))(react-dom@19.1.2(react@19.1.2))(react@19.2.3)(typescript@5.8.3) react-turnstile: specifier: 1.1.4 - version: 1.1.4(react-dom@19.1.2(react@19.1.2))(react@19.1.2) + version: 1.1.4(react-dom@19.1.2(react@19.1.2))(react@19.2.3) react-use: specifier: 17.6.0 - version: 17.6.0(react-dom@19.1.2(react@19.1.2))(react@19.1.2) + version: 17.6.0(react-dom@19.1.2(react@19.1.2))(react@19.2.3) redis: specifier: 4.7.0 version: 4.7.0 @@ -465,7 +465,7 @@ importers: version: 6.6.3 '@testing-library/react': specifier: 16.3.0 - version: 16.3.0(@testing-library/dom@8.20.1)(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) + version: 16.3.0(@testing-library/dom@8.20.1)(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) '@types/bcryptjs': specifier: 2.4.6 version: 2.4.6 @@ -495,7 +495,7 @@ importers: version: 1.5.5 '@types/testing-library__react': specifier: 10.2.0 - version: 10.2.0(@testing-library/dom@8.20.1)(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) + version: 10.2.0(@testing-library/dom@8.20.1)(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) '@types/ungap__structured-clone': specifier: 1.2.0 version: 1.2.0 @@ -679,6 +679,34 @@ importers: specifier: 4.5.3 version: 4.5.3(@types/node@22.15.18)(rollup@4.52.5)(typescript@5.8.3)(vite@6.4.1(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.1)) + packages/email: + dependencies: + '@react-email/components': + specifier: 1.0.1 + version: 1.0.1(react-dom@19.1.2(react@19.1.2))(react@19.1.2) + react: + specifier: 19.1.2 + version: 19.1.2 + react-dom: + specifier: 19.1.2 + version: 19.1.2(react@19.1.2) + react-email: + specifier: 5.0.8 + version: 5.0.8 + devDependencies: + '@formbricks/config-typescript': + specifier: workspace:* + version: link:../config-typescript + '@formbricks/eslint-config': + specifier: workspace:* + version: link:../config-eslint + '@formbricks/types': + specifier: workspace:* + version: link:../types + '@react-email/preview-server': + specifier: 5.0.8 + version: 5.0.8(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) + packages/i18n-utils: dependencies: glob: @@ -818,13 +846,13 @@ importers: version: 10.26.6 react-calendar: specifier: 5.1.0 - version: 5.1.0(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) + version: 5.1.0(@types/react@19.1.4)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react-date-picker: specifier: 11.0.0 - version: 11.0.0(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) + version: 11.0.0(@types/react@19.1.4)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) react-i18next: specifier: 15.7.3 - version: 15.7.3(i18next@25.5.2(typescript@5.8.3))(react-dom@19.1.2(react@19.1.2))(react@19.1.2)(typescript@5.8.3) + version: 15.7.3(i18next@25.5.2(typescript@5.8.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.8.3) devDependencies: '@formbricks/config-typescript': specifier: workspace:* @@ -2439,6 +2467,9 @@ packages: '@next/env@15.5.9': resolution: {integrity: sha512-4GlTZ+EJM7WaW2HEZcyU317tIQDjkQIyENDLxYJfSWlfqguN+dHkZgyQTV/7ykvobU7yEH5gKvreNrH4B6QgIg==} + '@next/env@16.0.9': + resolution: {integrity: sha512-6284pl8c8n9PQidN63qjPVEu1uXXKjnmbmaLebOzIfTrSXdGiAPsIMRi4pk/+v/ezqweE1/B8bFqiAAfC6lMXg==} + '@next/eslint-plugin-next@15.3.2': resolution: {integrity: sha512-ijVRTXBgnHT33aWnDtmlG+LJD+5vhc9AKTJPquGG5NKXjpKNjc62woIhFtrAcWdBobt8kqjCoaJ0q6sDQoX7aQ==} @@ -2448,48 +2479,96 @@ packages: cpu: [arm64] os: [darwin] + '@next/swc-darwin-arm64@16.0.9': + resolution: {integrity: sha512-j06fWg/gPqiWjK+sEpCDsh5gX+Bdy9gnPYjFqMBvBEOIcCFy1/ecF6pY6XAce7WyCJAbBPVb+6GvpmUZKNq0oQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + '@next/swc-darwin-x64@15.5.7': resolution: {integrity: sha512-UP6CaDBcqaCBuiq/gfCEJw7sPEoX1aIjZHnBWN9v9qYHQdMKvCKcAVs4OX1vIjeE+tC5EIuwDTVIoXpUes29lg==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] + '@next/swc-darwin-x64@16.0.9': + resolution: {integrity: sha512-FRYYz5GSKUkfvDSjd5hgHME2LgYjfOLBmhRVltbs3oRNQQf9n5UTQMmIu/u5vpkjJFV4L2tqo8duGqDxdQOFwg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + '@next/swc-linux-arm64-gnu@15.5.7': resolution: {integrity: sha512-NCslw3GrNIw7OgmRBxHtdWFQYhexoUCq+0oS2ccjyYLtcn1SzGzeM54jpTFonIMUjNbHmpKpziXnpxhSWLcmBA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + '@next/swc-linux-arm64-gnu@16.0.9': + resolution: {integrity: sha512-EI2klFVL8tOyEIX5J1gXXpm1YuChmDy4R+tHoNjkCHUmBJqXioYErX/O2go4pEhjxkAxHp2i8y5aJcRz2m5NqQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + '@next/swc-linux-arm64-musl@15.5.7': resolution: {integrity: sha512-nfymt+SE5cvtTrG9u1wdoxBr9bVB7mtKTcj0ltRn6gkP/2Nu1zM5ei8rwP9qKQP0Y//umK+TtkKgNtfboBxRrw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + '@next/swc-linux-arm64-musl@16.0.9': + resolution: {integrity: sha512-vq/5HeGvowhDPMrpp/KP4GjPVhIXnwNeDPF5D6XK6ta96UIt+C0HwJwuHYlwmn0SWyNANqx1Mp6qSVDXwbFKsw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + '@next/swc-linux-x64-gnu@15.5.7': resolution: {integrity: sha512-hvXcZvCaaEbCZcVzcY7E1uXN9xWZfFvkNHwbe/n4OkRhFWrs1J1QV+4U1BN06tXLdaS4DazEGXwgqnu/VMcmqw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + '@next/swc-linux-x64-gnu@16.0.9': + resolution: {integrity: sha512-GlUdJwy2leA/HnyRYxJ1ZJLCJH+BxZfqV4E0iYLrJipDKxWejWpPtZUdccPmCfIEY9gNBO7bPfbG6IIgkt0qXg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + '@next/swc-linux-x64-musl@15.5.7': resolution: {integrity: sha512-4IUO539b8FmF0odY6/SqANJdgwn1xs1GkPO5doZugwZ3ETF6JUdckk7RGmsfSf7ws8Qb2YB5It33mvNL/0acqA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + '@next/swc-linux-x64-musl@16.0.9': + resolution: {integrity: sha512-UCtOVx4N8AHF434VPwg4L0KkFLAd7pgJShzlX/hhv9+FDrT7/xCuVdlBsCXH7l9yCA/wHl3OqhMbIkgUluriWA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + '@next/swc-win32-arm64-msvc@15.5.7': resolution: {integrity: sha512-CpJVTkYI3ZajQkC5vajM7/ApKJUOlm6uP4BknM3XKvJ7VXAvCqSjSLmM0LKdYzn6nBJVSjdclx8nYJSa3xlTgQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] + '@next/swc-win32-arm64-msvc@16.0.9': + resolution: {integrity: sha512-tQjtDGtv63mV3n/cZ4TH8BgUvKTSFlrF06yT5DyRmgQuj5WEjBUDy0W3myIW5kTRYMPrLn42H3VfCNwBH6YYiA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + '@next/swc-win32-x64-msvc@15.5.7': resolution: {integrity: sha512-gMzgBX164I6DN+9/PGA+9dQiwmTkE4TloBNx8Kv9UiGARsr9Nba7IpcBRA1iTV9vwlYnrE3Uy6I7Aj6qLjQuqw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] + '@next/swc-win32-x64-msvc@16.0.9': + resolution: {integrity: sha512-y9AGACHTBwnWFLq5B5Fiv3FEbXBusdPb60pgoerB04CV/pwjY1xQNdoTNxAv7eUhU2k1CKnkN4XWVuiK07uOqA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} @@ -3492,20 +3571,20 @@ packages: '@radix-ui/rect@1.1.1': resolution: {integrity: sha512-HPwpGIzkl28mWyZqG52jiqDJ12waP11Pa1lGoiyUkIEuMLBP0oeK/C89esbXrxsky5we7dfd8U58nm0SgAWpVw==} - '@react-email/body@0.0.11': - resolution: {integrity: sha512-ZSD2SxVSgUjHGrB0Wi+4tu3MEpB4fYSbezsFNEJk2xCWDBkFiOeEsjTmR5dvi+CxTK691hQTQlHv0XWuP7ENTg==} + '@react-email/body@0.2.0': + resolution: {integrity: sha512-9GCWmVmKUAoRfloboCd+RKm6X17xn7eGL7HnpAZUnjBXBilWCxsKnLMTC/ixSHDKS/A/057M1Tx6ZUXd89sVBw==} peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc - '@react-email/button@0.0.19': - resolution: {integrity: sha512-HYHrhyVGt7rdM/ls6FuuD6XE7fa7bjZTJqB2byn6/oGsfiEZaogY77OtoLL/mrQHjHjZiJadtAMSik9XLcm7+A==} + '@react-email/button@0.2.0': + resolution: {integrity: sha512-8i+v6cMxr2emz4ihCrRiYJPp2/sdYsNNsBzXStlcA+/B9Umpm5Jj3WJKYpgTPM+aeyiqlG/MMI1AucnBm4f1oQ==} engines: {node: '>=18.0.0'} peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc - '@react-email/code-block@0.0.13': - resolution: {integrity: sha512-4DE4yPSgKEOnZMzcrDvRuD6mxsNxOex0hCYEG9F9q23geYgb2WCCeGBvIUXVzK69l703Dg4Vzrd5qUjl+JfcwA==} - engines: {node: '>=18.0.0'} + '@react-email/code-block@0.2.0': + resolution: {integrity: sha512-eIrPW9PIFgDopQU0e/OPpwCW2QWQDtNZDSsiN4sJO8KdMnWWnXJicnRfzrit5rHwFo+Y98i+w/Y5ScnBAFr1dQ==} + engines: {node: '>=22.0.0'} peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc @@ -3521,9 +3600,9 @@ packages: peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc - '@react-email/components@0.0.38': - resolution: {integrity: sha512-2cjMBZsSPjD1Iyur/MzGrgW/n5A6ONOJQ97pNaVOClxz/EaqNZTo1lFmKdH7p54P7LG9ZxRXxoTe2075VCCGQA==} - engines: {node: '>=18.0.0'} + '@react-email/components@1.0.1': + resolution: {integrity: sha512-HnL0Y/up61sOBQT2cQg9N/kCoW0bP727gDs2MkFWQYELg6+iIHidMDvENXFC0f1ZE6hTB+4t7sszptvTcJWsDA==} + engines: {node: '>=22.0.0'} peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc @@ -3574,21 +3653,24 @@ packages: peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc - '@react-email/markdown@0.0.15': - resolution: {integrity: sha512-UQA9pVm5sbflgtg3EX3FquUP4aMBzmLReLbGJ6DZQZnAskBF36aI56cRykDq1o+1jT+CKIK1CducPYziaXliag==} + '@react-email/markdown@0.0.17': + resolution: {integrity: sha512-6op3AfsBC9BJKkhG+eoMFRFWlr0/f3FYbtQrK+VhGzJocEAY0WINIFN+W8xzXr//3IL0K/aKtnH3FtpIuescQQ==} + engines: {node: '>=22.0.0'} + peerDependencies: + react: ^18.0 || ^19.0 || ^19.0.0-rc + + '@react-email/preview-server@5.0.8': + resolution: {integrity: sha512-TyAxXLFSgMDRwUEkCVvazkRYST9LZmYZMkJVv/K1221cMXa7r00R+S0R65lb4EULx397PRULXVWqJAwxyp/wcA==} + + '@react-email/preview@0.0.13': + resolution: {integrity: sha512-F7j9FJ0JN/A4d7yr+aw28p4uX7VLWs7hTHtLo7WRyw4G+Lit6Zucq4UWKRxJC8lpsUdzVmG7aBJnKOT+urqs/w==} engines: {node: '>=18.0.0'} peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc - '@react-email/preview@0.0.12': - resolution: {integrity: sha512-g/H5fa9PQPDK6WUEG7iTlC19sAktI23qyoiJtMLqQiXFCfWeQMhqjLGKeLSKkfzszqmfJCjZtpSiKtBoOdxp3Q==} - engines: {node: '>=18.0.0'} - peerDependencies: - react: ^18.0 || ^19.0 || ^19.0.0-rc - - '@react-email/render@1.1.0': - resolution: {integrity: sha512-X4CsHvXi5X7kTn5NgXNGg8Y5U1VtVJmlpNLlTc2E8RVHKFS3bpr+o/ZXhEPN4yRkdY+ZYN5eqVTV922Hujqsxw==} - engines: {node: '>=18.0.0'} + '@react-email/render@2.0.0': + resolution: {integrity: sha512-rdjNj6iVzv8kRKDPFas+47nnoe6B40+nwukuXwY4FCwM7XBg6tmYr+chQryCuavUj2J65MMf6fztk1bxOUiSVA==} + engines: {node: '>=22.0.0'} peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc react-dom: ^18.0 || ^19.0 || ^19.0.0-rc @@ -3605,14 +3687,46 @@ packages: peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc - '@react-email/tailwind@1.0.5': - resolution: {integrity: sha512-BH00cZSeFfP9HiDASl+sPHi7Hh77W5nzDgdnxtsVr/m3uQD9g180UwxcE3PhOfx0vRdLzQUU8PtmvvDfbztKQg==} - engines: {node: '>=18.0.0'} + '@react-email/tailwind@2.0.1': + resolution: {integrity: sha512-/xq0IDYVY7863xPY7cdI45Xoz7M6CnIQBJcQvbqN7MNVpopfH9f+mhjayV1JGfKaxlGWuxfLKhgi9T2shsnEFg==} + engines: {node: '>=22.0.0'} peerDependencies: + '@react-email/body': 0.2.0 + '@react-email/button': 0.2.0 + '@react-email/code-block': 0.2.0 + '@react-email/code-inline': 0.0.5 + '@react-email/container': 0.0.15 + '@react-email/heading': 0.0.15 + '@react-email/hr': 0.0.11 + '@react-email/img': 0.0.11 + '@react-email/link': 0.0.12 + '@react-email/preview': 0.0.13 + '@react-email/text': 0.1.5 react: ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@react-email/body': + optional: true + '@react-email/button': + optional: true + '@react-email/code-block': + optional: true + '@react-email/code-inline': + optional: true + '@react-email/container': + optional: true + '@react-email/heading': + optional: true + '@react-email/hr': + optional: true + '@react-email/img': + optional: true + '@react-email/link': + optional: true + '@react-email/preview': + optional: true - '@react-email/text@0.1.3': - resolution: {integrity: sha512-H22KR54MXUg29a+1/lTfg9oCQA65V8+TL4v19OzV7RsOxnEnzGOc287XKh8vc+v7ENewrMV97BzUPOnKz3bqkA==} + '@react-email/text@0.1.5': + resolution: {integrity: sha512-o5PNHFSE085VMXayxH+SJ1LSOtGsTv+RpNKnTiJDrJUwoBu77G3PlKOsZZQHCNyD28WsQpl9v2WcJLbQudqwPg==} engines: {node: '>=18.0.0'} peerDependencies: react: ^18.0 || ^19.0 || ^19.0.0-rc @@ -4202,6 +4316,9 @@ packages: resolution: {integrity: sha512-4aUIteuyxtBUhVdiQqcDhKFitwfd9hqoSDYY2KRXiWtgoWJ9Bmise+KfEPDiVHWeJepvF8xJO9/9+WDIciMFFw==} engines: {node: '>=18.0.0'} + '@socket.io/component-emitter@3.1.2': + resolution: {integrity: sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==} + '@sqltools/formatter@1.2.5': resolution: {integrity: sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==} @@ -4440,6 +4557,9 @@ packages: '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + '@types/cors@2.8.19': + resolution: {integrity: sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==} + '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} @@ -5090,6 +5210,10 @@ packages: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + acorn-import-attributes@1.9.5: resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} peerDependencies: @@ -5316,6 +5440,9 @@ packages: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} + atomically@2.1.0: + resolution: {integrity: sha512-+gDffFXRW6sl/HCwbta7zK4uNqbPjv4YJEAdz7Vu+FLQHe77eZ4bvbJGi4hE0QPeJlMYMA3piXEr1UL3dAwx7Q==} + autoprefixer@10.4.21: resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} engines: {node: ^10 || ^12 || >=14} @@ -5357,6 +5484,10 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + base64id@2.0.0: + resolution: {integrity: sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==} + engines: {node: ^4.5.0 || >= 5.9} + baseline-browser-mapping@2.8.21: resolution: {integrity: sha512-JU0h5APyQNsHOlAM7HnQnPToSDQoEBZqzu/YBlqDnEeymPnZDREeXJA3KBMQee+dKteAxZ2AtvQEvVYdZf241Q==} hasBin: true @@ -5568,6 +5699,10 @@ packages: resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} engines: {node: '>=18'} + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + cli-truncate@4.0.0: resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==} engines: {node: '>=18'} @@ -5656,6 +5791,10 @@ packages: engines: {node: '>=18'} hasBin: true + conf@15.0.2: + resolution: {integrity: sha512-JBSrutapCafTrddF9dH3lc7+T2tBycGF4uPkI4Js+g4vLLEhG6RZcFi3aJd5zntdf5tQxAejJt8dihkoQ/eSJw==} + engines: {node: '>=20'} + confbox@0.1.8: resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} @@ -5689,6 +5828,10 @@ packages: core-util-is@1.0.3: resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} @@ -5788,6 +5931,14 @@ packages: de-indent@1.0.2: resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + debounce-fn@6.0.0: + resolution: {integrity: sha512-rBMW+F2TXryBwB54Q0d8drNEI+TfoS9JpNTAoVpukbWEhjXQq4rySFYLaqXMFXwdv61Zb2OHtj5bviSoimqxRQ==} + engines: {node: '>=18'} + + debounce@2.2.0: + resolution: {integrity: sha512-Xks6RUDLZFdz8LIdR6q0MTH44k7FikOmnh5xkSjMig6ch45afc8sjTjRQf3P6ax8dMgcQrYO/AR2RGWURrruqw==} + engines: {node: '>=18'} + debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -5796,6 +5947,15 @@ packages: supports-color: optional: true + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + debug@4.4.3: resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} engines: {node: '>=6.0'} @@ -5960,6 +6120,10 @@ packages: domutils@3.2.2: resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + dot-prop@10.1.0: + resolution: {integrity: sha512-MVUtAugQMOff5RnBy2d9N31iG0lNwg1qAoAOn7pOK5wf94WIaE3My2p3uwTQuvS2AcqchkcR3bHByjaM0mmi7Q==} + engines: {node: '>=20'} + dotenv-cli@8.0.0: resolution: {integrity: sha512-aLqYbK7xKOiTMIRf1lDPbI+Y+Ip/wo5k3eyp6ePysVaSqbyxjyK3dK35BTxG+rmd7djf5q2UPs4noPNH+cj0Qw==} hasBin: true @@ -6023,6 +6187,14 @@ packages: end-of-stream@1.4.5: resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + engine.io-parser@5.2.3: + resolution: {integrity: sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==} + engines: {node: '>=10.0.0'} + + engine.io@6.6.4: + resolution: {integrity: sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==} + engines: {node: '>=10.2.0'} + enhanced-resolve@5.18.3: resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} engines: {node: '>=10.13.0'} @@ -6039,6 +6211,10 @@ packages: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} + env-paths@3.0.0: + resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + environment@1.1.0: resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} engines: {node: '>=18'} @@ -6398,9 +6574,6 @@ packages: fast-copy@3.0.2: resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} - fast-deep-equal@2.0.1: - resolution: {integrity: sha512-bCK/2Z4zLidyB4ReuIsvALH6w31YfAQDmXMqMx6FyfHqvBxtjC0eRumeSu4Bs3XtXwpyIywtSTrVT99BxY1f9w==} - fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -7021,6 +7194,10 @@ packages: engines: {node: '>=14.16'} hasBin: true + is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + is-lambda@1.0.1: resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} @@ -7088,6 +7265,14 @@ packages: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + + is-unicode-supported@2.1.0: + resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} + engines: {node: '>=18'} + is-weakmap@2.0.2: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} @@ -7241,6 +7426,9 @@ packages: json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-schema-typed@8.0.2: + resolution: {integrity: sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==} + json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -7279,6 +7467,10 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + kolorist@1.8.0: resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} @@ -7391,6 +7583,14 @@ packages: resolution: {integrity: sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==} engines: {node: '>=4'} + log-symbols@6.0.0: + resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} + engines: {node: '>=18'} + + log-symbols@7.0.1: + resolution: {integrity: sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg==} + engines: {node: '>=18'} + log-update@6.1.0: resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} engines: {node: '>=18'} @@ -7468,20 +7668,15 @@ packages: resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} hasBin: true - marked@7.0.4: - resolution: {integrity: sha512-t8eP0dXRJMtMvBojtkcsA7n48BkauktUKzfkPSCq85ZMTJ0v76Rke4DYz01omYpPTUh4p/f7HePgRo3ebG8+QQ==} - engines: {node: '>= 16'} + marked@15.0.12: + resolution: {integrity: sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==} + engines: {node: '>= 18'} hasBin: true math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} - md-to-react-email@5.0.5: - resolution: {integrity: sha512-OvAXqwq57uOk+WZqFFNCMZz8yDp8BD3WazW1wAKHUrPbbdr89K9DWS6JXY09vd9xNdPNeurI8DU/X4flcfaD8A==} - peerDependencies: - react: ^18.0 || ^19.0 - mdn-data@2.0.14: resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==} @@ -7712,6 +7907,10 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + negotiator@0.6.4: resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} engines: {node: '>= 0.6'} @@ -7776,6 +7975,28 @@ packages: sass: optional: true + next@16.0.9: + resolution: {integrity: sha512-Xk5x/wEk6ADIAtQECLo1uyE5OagbQCiZ+gW4XEv24FjQ3O2PdSkvgsn22aaseSXC7xg84oONvQjFbSTX5YsMhQ==} + engines: {node: '>=20.9.0'} + deprecated: This version has a security vulnerability. Please upgrade to a patched version. See https://nextjs.org/blog/security-update-2025-12-11 for more details. + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.51.1 + babel-plugin-react-compiler: '*' + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + node-abi@3.79.0: resolution: {integrity: sha512-Pr/5KdBQGG8TirdkS0qN3B+f3eo8zTOfZQWAxHoJqopMz2/uvRnG+S4fWu/6AZxKei2CP2p/psdQ5HFC2Ap5BA==} engines: {node: '>=10'} @@ -7853,6 +8074,11 @@ packages: nwsapi@2.2.22: resolution: {integrity: sha512-ujSMe1OWVn55euT1ihwCI1ZcAaAU3nxUiDwfDQldc51ZXaB9m2AyOn6/jh1BLe2t/G8xd6uKG1UBF2aZJeg2SQ==} + nypm@0.6.0: + resolution: {integrity: sha512-mn8wBFV9G9+UFHIrq+pZ2r2zL4aPau/by3kJb3cM7+5tQHMt6HGQB8FDIeKFYp8o0D2pnH6nVsO88N4AmUxIWg==} + engines: {node: ^14.16.0 || >=16.10.0} + hasBin: true + nypm@0.6.2: resolution: {integrity: sha512-7eM+hpOtrKrBDCh7Ypu2lJ9Z7PNZBdi/8AT3AX8xoCj43BBVHD0hPSTEvMtkMpfs8FCqBGhxB+uToIQimA111g==} engines: {node: ^14.16.0 || >=16.10.0} @@ -7947,6 +8173,10 @@ packages: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + ora@8.2.0: + resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} + engines: {node: '>=18'} + otplib@12.0.1: resolution: {integrity: sha512-xDGvUOQjop7RDgxTQ+o4pOol0/3xSZzawTiPKRrHnQWAy0WjhNs/5HdIDJCrqC4MBynmjXgULc6YfioaxZeFgg==} @@ -8386,6 +8616,10 @@ packages: resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} engines: {node: '>=10'} + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} @@ -8502,6 +8736,16 @@ packages: peerDependencies: react: ^19.1.2 + react-dom@19.2.3: + resolution: {integrity: sha512-yELu4WmLPw5Mr/lmeEpox5rw3RETacE++JgHqQzd2dg+YbJuat3jH4ingc+WPZhxaoFzdv9y33G+F7Nl5O0GBg==} + peerDependencies: + react: ^19.2.3 + + react-email@5.0.8: + resolution: {integrity: sha512-JyhnOiFRfO1q1olkZ1lXawPUF01BSsi9Zg7SNpnxUnnlZHVxwVl7WV2U6QP/NPbIJx/VOSjGfNOeQWyqQIZJGA==} + engines: {node: '>=20.0.0'} + hasBin: true + react-error-boundary@6.0.0: resolution: {integrity: sha512-gdlJjD7NWr0IfkPlaREN2d9uUZUlksrfOx7SX62VRerwXbMY6ftGCIZua1VG1aXFNOimhISsTq+Owp725b9SiA==} peerDependencies: @@ -8555,9 +8799,6 @@ packages: react-is@17.0.2: resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} - react-promise-suspense@0.3.4: - resolution: {integrity: sha512-I42jl7L3Ze6kZaq+7zXWSunBa3b1on5yfvUW6Eo/3fFOj6dZ5Bqmcd264nJbTK/gn1HjjILAjSwnZbV4RpSaNQ==} - react-refresh@0.17.0: resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} engines: {node: '>=0.10.0'} @@ -8618,6 +8859,10 @@ packages: resolution: {integrity: sha512-MdWVitvLbQULD+4DP8GYjZUrepGW7d+GQkNVqJEzNxE+e9WIa4egVFE/RDfVb1u9u/Jw7dNMmPB4IqxzbFYJ0w==} engines: {node: '>=0.10.0'} + react@19.2.3: + resolution: {integrity: sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==} + engines: {node: '>=0.10.0'} + read-cache@1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} @@ -8815,6 +9060,9 @@ packages: scheduler@0.26.0: resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} + scheduler@0.27.0: + resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==} + schema-utils@3.3.0: resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} engines: {node: '>= 10.13.0'} @@ -8945,6 +9193,9 @@ packages: simple-swizzle@0.2.4: resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==} + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -8964,6 +9215,17 @@ packages: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + socket.io-adapter@2.5.5: + resolution: {integrity: sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==} + + socket.io-parser@4.2.4: + resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} + engines: {node: '>=10.0.0'} + + socket.io@4.8.1: + resolution: {integrity: sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==} + engines: {node: '>=10.2.0'} + socks-proxy-agent@6.2.1: resolution: {integrity: sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==} engines: {node: '>= 10'} @@ -9071,6 +9333,10 @@ packages: std-env@3.10.0: resolution: {integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg==} + stdin-discarder@0.2.2: + resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} + engines: {node: '>=18'} + stop-iteration-iterator@1.1.0: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} @@ -9174,6 +9440,12 @@ packages: strnum@2.1.1: resolution: {integrity: sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==} + stubborn-fs@2.0.0: + resolution: {integrity: sha512-Y0AvSwDw8y+nlSNFXMm2g6L51rBGdAQT20J3YSOqxC53Lo3bjWRtr2BKcfYoAf352WYpsZSTURrA0tqhfgudPA==} + + stubborn-utils@1.0.2: + resolution: {integrity: sha512-zOh9jPYI+xrNOyisSelgym4tolKTJCQd5GBhK0+0xJvcYDcwlOoxF/rnFKQ2KRZknXSG9jWAp66fwP6AxN9STg==} + styled-jsx@5.1.6: resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} engines: {node: '>= 12.0.0'} @@ -9231,6 +9503,10 @@ packages: tabbable@6.3.0: resolution: {integrity: sha512-EIHvdY5bPLuWForiR/AN2Bxngzpuwn1is4asboytXtpTgsArc+WmSJKVLlhdh71u7jFcryDqB2A8lQvj78MkyQ==} + tagged-tag@1.0.0: + resolution: {integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng==} + engines: {node: '>=20'} + tailwind-merge@3.2.0: resolution: {integrity: sha512-FQT/OVqCD+7edmmJpsgCsY820RTD5AkBryuG5IUqR5YQZSdj5xlH5nLgH7YPths7WsLPSpSBNneJdM8aS8aeFA==} @@ -9239,6 +9515,9 @@ packages: engines: {node: '>=14.0.0'} hasBin: true + tailwindcss@4.1.18: + resolution: {integrity: sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==} + tapable@2.3.0: resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} @@ -9514,6 +9793,10 @@ packages: resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} engines: {node: '>=8'} + type-fest@5.3.1: + resolution: {integrity: sha512-VCn+LMHbd4t6sF3wfU/+HKT63C9OoyrSIf4b+vtWHpt2U7/4InZG467YDNMFMR70DdHjAdpPWmw2lzRdg0Xqqg==} + engines: {node: '>=20'} + typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} @@ -9609,6 +9892,10 @@ packages: ufo@1.6.1: resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} + uint8array-extras@1.5.0: + resolution: {integrity: sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==} + engines: {node: '>=18'} + unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} @@ -9699,6 +9986,10 @@ packages: validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + vite-node@3.1.3: resolution: {integrity: sha512-uHV4plJ2IxCl4u1up1FQRrqclylKAogbtBfOTwcuJ28xFi+89PZ57BRh+naIRvH70HPwxy5QHYzg1OrEaC7AbA==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -9864,6 +10155,9 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + when-exit@2.1.5: + resolution: {integrity: sha512-VGkKJ564kzt6Ms1dbgPP/yuIoQCrsFAnRbptpC5wOEsDaNsbCB2bnfnaA8i/vRs5tjUSEOtIuvl9/MyVsvQZCg==} + which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} @@ -9919,6 +10213,18 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + ws@8.17.1: + resolution: {integrity: sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + ws@8.18.3: resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} engines: {node: '>=10.0.0'} @@ -10029,6 +10335,10 @@ packages: resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} engines: {node: '>=12.20'} + yoctocolors@2.1.2: + resolution: {integrity: sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==} + engines: {node: '>=18'} + yoga-layout@3.2.1: resolution: {integrity: sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==} @@ -11752,36 +12062,36 @@ snapshots: '@date-fns/tz@1.2.0': {} - '@dnd-kit/accessibility@3.1.1(react@19.1.2)': + '@dnd-kit/accessibility@3.1.1(react@19.2.3)': dependencies: - react: 19.1.2 + react: 19.2.3 tslib: 2.8.1 - '@dnd-kit/core@6.3.1(react-dom@19.1.2(react@19.1.2))(react@19.1.2)': + '@dnd-kit/core@6.3.1(react-dom@19.1.2(react@19.1.2))(react@19.2.3)': dependencies: - '@dnd-kit/accessibility': 3.1.1(react@19.1.2) - '@dnd-kit/utilities': 3.2.2(react@19.1.2) - react: 19.1.2 + '@dnd-kit/accessibility': 3.1.1(react@19.2.3) + '@dnd-kit/utilities': 3.2.2(react@19.2.3) + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) tslib: 2.8.1 - '@dnd-kit/modifiers@9.0.0(@dnd-kit/core@6.3.1(react-dom@19.1.2(react@19.1.2))(react@19.1.2))(react@19.1.2)': + '@dnd-kit/modifiers@9.0.0(@dnd-kit/core@6.3.1(react-dom@19.1.2(react@19.1.2))(react@19.2.3))(react@19.2.3)': dependencies: - '@dnd-kit/core': 6.3.1(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@dnd-kit/utilities': 3.2.2(react@19.1.2) - react: 19.1.2 + '@dnd-kit/core': 6.3.1(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@dnd-kit/utilities': 3.2.2(react@19.2.3) + react: 19.2.3 tslib: 2.8.1 - '@dnd-kit/sortable@10.0.0(@dnd-kit/core@6.3.1(react-dom@19.1.2(react@19.1.2))(react@19.1.2))(react@19.1.2)': + '@dnd-kit/sortable@10.0.0(@dnd-kit/core@6.3.1(react-dom@19.1.2(react@19.1.2))(react@19.2.3))(react@19.2.3)': dependencies: - '@dnd-kit/core': 6.3.1(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@dnd-kit/utilities': 3.2.2(react@19.1.2) - react: 19.1.2 + '@dnd-kit/core': 6.3.1(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@dnd-kit/utilities': 3.2.2(react@19.2.3) + react: 19.2.3 tslib: 2.8.1 - '@dnd-kit/utilities@3.2.2(react@19.1.2)': + '@dnd-kit/utilities@3.2.2(react@19.2.3)': dependencies: - react: 19.1.2 + react: 19.2.3 tslib: 2.8.1 '@emnapi/core@1.6.0': @@ -11992,17 +12302,17 @@ snapshots: '@floating-ui/core': 1.7.3 '@floating-ui/utils': 0.2.10 - '@floating-ui/react-dom@2.1.6(react-dom@19.1.2(react@19.1.2))(react@19.1.2)': + '@floating-ui/react-dom@2.1.6(react-dom@19.1.2(react@19.1.2))(react@19.2.3)': dependencies: '@floating-ui/dom': 1.7.4 - react: 19.1.2 + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) - '@floating-ui/react@0.27.16(react-dom@19.1.2(react@19.1.2))(react@19.1.2)': + '@floating-ui/react@0.27.16(react-dom@19.1.2(react@19.1.2))(react@19.2.3)': dependencies: - '@floating-ui/react-dom': 2.1.6(react-dom@19.1.2(react@19.1.2))(react@19.1.2) + '@floating-ui/react-dom': 2.1.6(react-dom@19.1.2(react@19.1.2))(react@19.2.3) '@floating-ui/utils': 0.2.10 - react: 19.1.2 + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) tabbable: 6.3.0 @@ -12058,10 +12368,10 @@ snapshots: protobufjs: 7.5.4 yargs: 17.7.2 - '@hookform/resolvers@5.0.1(react-hook-form@7.56.2(react@19.1.2))': + '@hookform/resolvers@5.0.1(react-hook-form@7.56.2(react@19.2.3))': dependencies: '@standard-schema/utils': 0.3.0 - react-hook-form: 7.56.2(react@19.1.2) + react-hook-form: 7.56.2(react@19.2.3) '@humanwhocodes/config-array@0.11.14': dependencies: @@ -12336,7 +12646,7 @@ snapshots: lexical: 0.36.2 prismjs: 1.30.0 - '@lexical/devtools-core@0.36.2(react-dom@19.1.2(react@19.1.2))(react@19.1.2)': + '@lexical/devtools-core@0.36.2(react-dom@19.1.2(react@19.1.2))(react@19.2.3)': dependencies: '@lexical/html': 0.36.2 '@lexical/link': 0.36.2 @@ -12344,7 +12654,7 @@ snapshots: '@lexical/table': 0.36.2 '@lexical/utils': 0.36.2 lexical: 0.36.2 - react: 19.1.2 + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) '@lexical/dragon@0.36.2': @@ -12420,10 +12730,10 @@ snapshots: '@lexical/utils': 0.36.2 lexical: 0.36.2 - '@lexical/react@0.36.2(react-dom@19.1.2(react@19.1.2))(react@19.1.2)(yjs@13.6.27)': + '@lexical/react@0.36.2(react-dom@19.1.2(react@19.1.2))(react@19.2.3)(yjs@13.6.27)': dependencies: - '@floating-ui/react': 0.27.16(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@lexical/devtools-core': 0.36.2(react-dom@19.1.2(react@19.1.2))(react@19.1.2) + '@floating-ui/react': 0.27.16(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@lexical/devtools-core': 0.36.2(react-dom@19.1.2(react@19.1.2))(react@19.2.3) '@lexical/dragon': 0.36.2 '@lexical/extension': 0.36.2 '@lexical/hashtag': 0.36.2 @@ -12440,9 +12750,9 @@ snapshots: '@lexical/utils': 0.36.2 '@lexical/yjs': 0.36.2(yjs@13.6.27) lexical: 0.36.2 - react: 19.1.2 + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) - react-error-boundary: 6.0.0(react@19.1.2) + react-error-boundary: 6.0.0(react@19.2.3) transitivePeerDependencies: - yjs @@ -12581,6 +12891,8 @@ snapshots: '@next/env@15.5.9': {} + '@next/env@16.0.9': {} + '@next/eslint-plugin-next@15.3.2': dependencies: fast-glob: 3.3.1 @@ -12588,27 +12900,51 @@ snapshots: '@next/swc-darwin-arm64@15.5.7': optional: true + '@next/swc-darwin-arm64@16.0.9': + optional: true + '@next/swc-darwin-x64@15.5.7': optional: true + '@next/swc-darwin-x64@16.0.9': + optional: true + '@next/swc-linux-arm64-gnu@15.5.7': optional: true + '@next/swc-linux-arm64-gnu@16.0.9': + optional: true + '@next/swc-linux-arm64-musl@15.5.7': optional: true + '@next/swc-linux-arm64-musl@16.0.9': + optional: true + '@next/swc-linux-x64-gnu@15.5.7': optional: true + '@next/swc-linux-x64-gnu@16.0.9': + optional: true + '@next/swc-linux-x64-musl@15.5.7': optional: true + '@next/swc-linux-x64-musl@16.0.9': + optional: true + '@next/swc-win32-arm64-msvc@15.5.7': optional: true + '@next/swc-win32-arm64-msvc@16.0.9': + optional: true + '@next/swc-win32-x64-msvc@15.5.7': optional: true + '@next/swc-win32-x64-msvc@16.0.9': + optional: true + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': dependencies: eslint-scope: 5.1.1 @@ -13195,523 +13531,523 @@ snapshots: '@radix-ui/primitive@1.1.2': {} - '@radix-ui/react-accordion@1.2.10(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2)': + '@radix-ui/react-accordion@1.2.10(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3)': dependencies: '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-collapsible': 1.1.10(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-collection': 1.1.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.4)(react@19.1.2) - react: 19.1.2 + '@radix-ui/react-collapsible': 1.1.10(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-collection': 1.1.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.4)(react@19.2.3) + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) optionalDependencies: '@types/react': 19.1.4 '@types/react-dom': 19.1.5(@types/react@19.1.4) - '@radix-ui/react-arrow@1.1.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2)': + '@radix-ui/react-arrow@1.1.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3)': dependencies: - '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - react: 19.1.2 + '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) optionalDependencies: '@types/react': 19.1.4 '@types/react-dom': 19.1.5(@types/react@19.1.4) - '@radix-ui/react-checkbox@1.3.1(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2)': + '@radix-ui/react-checkbox@1.3.1(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3)': dependencies: '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.4)(react@19.1.2) - react: 19.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.4)(react@19.2.3) + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) optionalDependencies: '@types/react': 19.1.4 '@types/react-dom': 19.1.5(@types/react@19.1.4) - '@radix-ui/react-collapsible@1.1.10(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2)': + '@radix-ui/react-collapsible@1.1.10(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3)': dependencies: '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.4)(react@19.1.2) - react: 19.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.4)(react@19.2.3) + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) optionalDependencies: '@types/react': 19.1.4 '@types/react-dom': 19.1.5(@types/react@19.1.4) - '@radix-ui/react-collection@1.1.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2)': + '@radix-ui/react-collection@1.1.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-slot': 1.2.2(@types/react@19.1.4)(react@19.1.2) - react: 19.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-slot': 1.2.2(@types/react@19.1.4)(react@19.2.3) + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) optionalDependencies: '@types/react': 19.1.4 '@types/react-dom': 19.1.5(@types/react@19.1.4) - '@radix-ui/react-compose-refs@1.1.2(@types/react@19.1.4)(react@19.1.2)': + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.1.4)(react@19.2.3)': dependencies: - react: 19.1.2 + react: 19.2.3 optionalDependencies: '@types/react': 19.1.4 - '@radix-ui/react-context@1.1.2(@types/react@19.1.4)(react@19.1.2)': + '@radix-ui/react-context@1.1.2(@types/react@19.1.4)(react@19.2.3)': dependencies: - react: 19.1.2 + react: 19.2.3 optionalDependencies: '@types/react': 19.1.4 - '@radix-ui/react-dialog@1.1.13(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2)': + '@radix-ui/react-dialog@1.1.13(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3)': dependencies: '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-dismissable-layer': 1.1.9(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-focus-scope': 1.1.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-portal': 1.1.8(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-slot': 1.2.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.4)(react@19.1.2) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-dismissable-layer': 1.1.9(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-focus-scope': 1.1.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-portal': 1.1.8(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-slot': 1.2.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.4)(react@19.2.3) aria-hidden: 1.2.6 - react: 19.1.2 + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) - react-remove-scroll: 2.7.1(@types/react@19.1.4)(react@19.1.2) + react-remove-scroll: 2.7.1(@types/react@19.1.4)(react@19.2.3) optionalDependencies: '@types/react': 19.1.4 '@types/react-dom': 19.1.5(@types/react@19.1.4) - '@radix-ui/react-direction@1.1.1(@types/react@19.1.4)(react@19.1.2)': + '@radix-ui/react-direction@1.1.1(@types/react@19.1.4)(react@19.2.3)': dependencies: - react: 19.1.2 + react: 19.2.3 optionalDependencies: '@types/react': 19.1.4 - '@radix-ui/react-dismissable-layer@1.1.9(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2)': + '@radix-ui/react-dismissable-layer@1.1.9(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3)': dependencies: '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.1.4)(react@19.1.2) - react: 19.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@19.1.4)(react@19.2.3) + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) optionalDependencies: '@types/react': 19.1.4 '@types/react-dom': 19.1.5(@types/react@19.1.4) - '@radix-ui/react-dropdown-menu@2.1.14(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2)': + '@radix-ui/react-dropdown-menu@2.1.14(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3)': dependencies: '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-menu': 2.1.14(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.4)(react@19.1.2) - react: 19.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-menu': 2.1.14(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.4)(react@19.2.3) + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) optionalDependencies: '@types/react': 19.1.4 '@types/react-dom': 19.1.5(@types/react@19.1.4) - '@radix-ui/react-focus-guards@1.1.2(@types/react@19.1.4)(react@19.1.2)': + '@radix-ui/react-focus-guards@1.1.2(@types/react@19.1.4)(react@19.2.3)': dependencies: - react: 19.1.2 + react: 19.2.3 optionalDependencies: '@types/react': 19.1.4 - '@radix-ui/react-focus-scope@1.1.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2)': + '@radix-ui/react-focus-scope@1.1.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.4)(react@19.1.2) - react: 19.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.4)(react@19.2.3) + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) optionalDependencies: '@types/react': 19.1.4 '@types/react-dom': 19.1.5(@types/react@19.1.4) - '@radix-ui/react-id@1.1.1(@types/react@19.1.4)(react@19.1.2)': + '@radix-ui/react-id@1.1.1(@types/react@19.1.4)(react@19.2.3)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.4)(react@19.1.2) - react: 19.1.2 + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.4)(react@19.2.3) + react: 19.2.3 optionalDependencies: '@types/react': 19.1.4 - '@radix-ui/react-label@2.1.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2)': + '@radix-ui/react-label@2.1.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3)': dependencies: - '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - react: 19.1.2 + '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) optionalDependencies: '@types/react': 19.1.4 '@types/react-dom': 19.1.5(@types/react@19.1.4) - '@radix-ui/react-menu@2.1.14(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2)': + '@radix-ui/react-menu@2.1.14(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3)': dependencies: '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-collection': 1.1.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-dismissable-layer': 1.1.9(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-focus-scope': 1.1.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-popper': 1.2.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-portal': 1.1.8(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-roving-focus': 1.1.9(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-slot': 1.2.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.4)(react@19.1.2) + '@radix-ui/react-collection': 1.1.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-dismissable-layer': 1.1.9(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-focus-scope': 1.1.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-popper': 1.2.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-portal': 1.1.8(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-roving-focus': 1.1.9(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-slot': 1.2.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.4)(react@19.2.3) aria-hidden: 1.2.6 - react: 19.1.2 + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) - react-remove-scroll: 2.7.1(@types/react@19.1.4)(react@19.1.2) + react-remove-scroll: 2.7.1(@types/react@19.1.4)(react@19.2.3) optionalDependencies: '@types/react': 19.1.4 '@types/react-dom': 19.1.5(@types/react@19.1.4) - '@radix-ui/react-popover@1.1.13(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2)': + '@radix-ui/react-popover@1.1.13(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3)': dependencies: '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-dismissable-layer': 1.1.9(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-focus-scope': 1.1.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-popper': 1.2.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-portal': 1.1.8(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-slot': 1.2.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.4)(react@19.1.2) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-dismissable-layer': 1.1.9(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-focus-scope': 1.1.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-popper': 1.2.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-portal': 1.1.8(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-slot': 1.2.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.4)(react@19.2.3) aria-hidden: 1.2.6 - react: 19.1.2 + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) - react-remove-scroll: 2.7.1(@types/react@19.1.4)(react@19.1.2) + react-remove-scroll: 2.7.1(@types/react@19.1.4)(react@19.2.3) optionalDependencies: '@types/react': 19.1.4 '@types/react-dom': 19.1.5(@types/react@19.1.4) - '@radix-ui/react-popper@1.2.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2)': + '@radix-ui/react-popper@1.2.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3)': dependencies: - '@floating-ui/react-dom': 2.1.6(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-arrow': 1.1.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-use-rect': 1.1.1(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.4)(react@19.1.2) + '@floating-ui/react-dom': 2.1.6(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-arrow': 1.1.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-use-rect': 1.1.1(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.4)(react@19.2.3) '@radix-ui/rect': 1.1.1 - react: 19.1.2 + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) optionalDependencies: '@types/react': 19.1.4 '@types/react-dom': 19.1.5(@types/react@19.1.4) - '@radix-ui/react-portal@1.1.8(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2)': + '@radix-ui/react-portal@1.1.8(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3)': dependencies: - '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.4)(react@19.1.2) - react: 19.1.2 + '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.4)(react@19.2.3) + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) optionalDependencies: '@types/react': 19.1.4 '@types/react-dom': 19.1.5(@types/react@19.1.4) - '@radix-ui/react-presence@1.1.4(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2)': + '@radix-ui/react-presence@1.1.4(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.4)(react@19.1.2) - react: 19.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.4)(react@19.2.3) + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) optionalDependencies: '@types/react': 19.1.4 '@types/react-dom': 19.1.5(@types/react@19.1.4) - '@radix-ui/react-primitive@2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2)': + '@radix-ui/react-primitive@2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3)': dependencies: - '@radix-ui/react-slot': 1.2.2(@types/react@19.1.4)(react@19.1.2) - react: 19.1.2 + '@radix-ui/react-slot': 1.2.2(@types/react@19.1.4)(react@19.2.3) + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) optionalDependencies: '@types/react': 19.1.4 '@types/react-dom': 19.1.5(@types/react@19.1.4) - '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2)': + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3)': dependencies: - '@radix-ui/react-slot': 1.2.3(@types/react@19.1.4)(react@19.1.2) - react: 19.1.2 + '@radix-ui/react-slot': 1.2.3(@types/react@19.1.4)(react@19.2.3) + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) optionalDependencies: '@types/react': 19.1.4 '@types/react-dom': 19.1.5(@types/react@19.1.4) - '@radix-ui/react-radio-group@1.3.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2)': + '@radix-ui/react-radio-group@1.3.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3)': dependencies: '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-roving-focus': 1.1.9(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.4)(react@19.1.2) - react: 19.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-roving-focus': 1.1.9(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.4)(react@19.2.3) + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) optionalDependencies: '@types/react': 19.1.4 '@types/react-dom': 19.1.5(@types/react@19.1.4) - '@radix-ui/react-roving-focus@1.1.9(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2)': + '@radix-ui/react-roving-focus@1.1.9(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3)': dependencies: '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-collection': 1.1.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.4)(react@19.1.2) - react: 19.1.2 + '@radix-ui/react-collection': 1.1.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.4)(react@19.2.3) + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) optionalDependencies: '@types/react': 19.1.4 '@types/react-dom': 19.1.5(@types/react@19.1.4) - '@radix-ui/react-select@2.2.4(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2)': + '@radix-ui/react-select@2.2.4(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3)': dependencies: '@radix-ui/number': 1.1.1 '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-collection': 1.1.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-dismissable-layer': 1.1.9(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-focus-scope': 1.1.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-popper': 1.2.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-portal': 1.1.8(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-slot': 1.2.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-visually-hidden': 1.2.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) + '@radix-ui/react-collection': 1.1.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-dismissable-layer': 1.1.9(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-focus-guards': 1.1.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-focus-scope': 1.1.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-popper': 1.2.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-portal': 1.1.8(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-slot': 1.2.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-visually-hidden': 1.2.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) aria-hidden: 1.2.6 - react: 19.1.2 + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) - react-remove-scroll: 2.7.1(@types/react@19.1.4)(react@19.1.2) + react-remove-scroll: 2.7.1(@types/react@19.1.4)(react@19.2.3) optionalDependencies: '@types/react': 19.1.4 '@types/react-dom': 19.1.5(@types/react@19.1.4) - '@radix-ui/react-separator@1.1.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2)': + '@radix-ui/react-separator@1.1.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3)': dependencies: - '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - react: 19.1.2 + '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) optionalDependencies: '@types/react': 19.1.4 '@types/react-dom': 19.1.5(@types/react@19.1.4) - '@radix-ui/react-slider@1.3.4(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2)': + '@radix-ui/react-slider@1.3.4(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3)': dependencies: '@radix-ui/number': 1.1.1 '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-collection': 1.1.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.4)(react@19.1.2) - react: 19.1.2 + '@radix-ui/react-collection': 1.1.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.4)(react@19.2.3) + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) optionalDependencies: '@types/react': 19.1.4 '@types/react-dom': 19.1.5(@types/react@19.1.4) - '@radix-ui/react-slot@1.2.2(@types/react@19.1.4)(react@19.1.2)': + '@radix-ui/react-slot@1.2.2(@types/react@19.1.4)(react@19.2.3)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.1.2) - react: 19.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.2.3) + react: 19.2.3 optionalDependencies: '@types/react': 19.1.4 - '@radix-ui/react-slot@1.2.3(@types/react@19.1.4)(react@19.1.2)': + '@radix-ui/react-slot@1.2.3(@types/react@19.1.4)(react@19.2.3)': dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.1.2) - react: 19.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.2.3) + react: 19.2.3 optionalDependencies: '@types/react': 19.1.4 - '@radix-ui/react-switch@1.2.4(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2)': + '@radix-ui/react-switch@1.2.4(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3)': dependencies: '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.4)(react@19.1.2) - react: 19.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-use-previous': 1.1.1(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-use-size': 1.1.1(@types/react@19.1.4)(react@19.2.3) + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) optionalDependencies: '@types/react': 19.1.4 '@types/react-dom': 19.1.5(@types/react@19.1.4) - '@radix-ui/react-tabs@1.1.11(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2)': + '@radix-ui/react-tabs@1.1.11(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3)': dependencies: '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-context': 1.1.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-roving-focus': 1.1.9(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.4)(react@19.1.2) - react: 19.1.2 + '@radix-ui/react-context': 1.1.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-roving-focus': 1.1.9(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.4)(react@19.2.3) + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) optionalDependencies: '@types/react': 19.1.4 '@types/react-dom': 19.1.5(@types/react@19.1.4) - '@radix-ui/react-toggle-group@1.1.9(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2)': + '@radix-ui/react-toggle-group@1.1.9(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3)': dependencies: '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-context': 1.1.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-direction': 1.1.1(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-roving-focus': 1.1.9(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-toggle': 1.1.8(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.4)(react@19.1.2) - react: 19.1.2 + '@radix-ui/react-context': 1.1.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-direction': 1.1.1(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-roving-focus': 1.1.9(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-toggle': 1.1.8(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.4)(react@19.2.3) + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) optionalDependencies: '@types/react': 19.1.4 '@types/react-dom': 19.1.5(@types/react@19.1.4) - '@radix-ui/react-toggle@1.1.8(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2)': + '@radix-ui/react-toggle@1.1.8(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3)': dependencies: '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.4)(react@19.1.2) - react: 19.1.2 + '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.4)(react@19.2.3) + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) optionalDependencies: '@types/react': 19.1.4 '@types/react-dom': 19.1.5(@types/react@19.1.4) - '@radix-ui/react-tooltip@1.2.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2)': + '@radix-ui/react-tooltip@1.2.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3)': dependencies: '@radix-ui/primitive': 1.1.2 - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-context': 1.1.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-dismissable-layer': 1.1.9(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-popper': 1.2.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-portal': 1.1.8(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-slot': 1.2.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-visually-hidden': 1.2.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - react: 19.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-context': 1.1.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-dismissable-layer': 1.1.9(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-popper': 1.2.6(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-portal': 1.1.8(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-slot': 1.2.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-visually-hidden': 1.2.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) optionalDependencies: '@types/react': 19.1.4 '@types/react-dom': 19.1.5(@types/react@19.1.4) - '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.1.4)(react@19.1.2)': + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@19.1.4)(react@19.2.3)': dependencies: - react: 19.1.2 + react: 19.2.3 optionalDependencies: '@types/react': 19.1.4 - '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.1.4)(react@19.1.2)': + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.1.4)(react@19.2.3)': dependencies: - '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.4)(react@19.1.2) - react: 19.1.2 + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.4)(react@19.2.3) + react: 19.2.3 optionalDependencies: '@types/react': 19.1.4 - '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.1.4)(react@19.1.2)': + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.1.4)(react@19.2.3)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.4)(react@19.1.2) - react: 19.1.2 + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.4)(react@19.2.3) + react: 19.2.3 optionalDependencies: '@types/react': 19.1.4 - '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.1.4)(react@19.1.2)': + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@19.1.4)(react@19.2.3)': dependencies: - '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.4)(react@19.1.2) - react: 19.1.2 + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@19.1.4)(react@19.2.3) + react: 19.2.3 optionalDependencies: '@types/react': 19.1.4 - '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.1.4)(react@19.1.2)': + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.1.4)(react@19.2.3)': dependencies: - react: 19.1.2 + react: 19.2.3 optionalDependencies: '@types/react': 19.1.4 - '@radix-ui/react-use-previous@1.1.1(@types/react@19.1.4)(react@19.1.2)': + '@radix-ui/react-use-previous@1.1.1(@types/react@19.1.4)(react@19.2.3)': dependencies: - react: 19.1.2 + react: 19.2.3 optionalDependencies: '@types/react': 19.1.4 - '@radix-ui/react-use-rect@1.1.1(@types/react@19.1.4)(react@19.1.2)': + '@radix-ui/react-use-rect@1.1.1(@types/react@19.1.4)(react@19.2.3)': dependencies: '@radix-ui/rect': 1.1.1 - react: 19.1.2 + react: 19.2.3 optionalDependencies: '@types/react': 19.1.4 - '@radix-ui/react-use-size@1.1.1(@types/react@19.1.4)(react@19.1.2)': + '@radix-ui/react-use-size@1.1.1(@types/react@19.1.4)(react@19.2.3)': dependencies: - '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.4)(react@19.1.2) - react: 19.1.2 + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.1.4)(react@19.2.3) + react: 19.2.3 optionalDependencies: '@types/react': 19.1.4 - '@radix-ui/react-visually-hidden@1.2.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2)': + '@radix-ui/react-visually-hidden@1.2.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3)': dependencies: - '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - react: 19.1.2 + '@radix-ui/react-primitive': 2.1.2(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) optionalDependencies: '@types/react': 19.1.4 @@ -13719,15 +14055,15 @@ snapshots: '@radix-ui/rect@1.1.1': {} - '@react-email/body@0.0.11(react@19.1.2)': + '@react-email/body@0.2.0(react@19.1.2)': dependencies: react: 19.1.2 - '@react-email/button@0.0.19(react@19.1.2)': + '@react-email/button@0.2.0(react@19.1.2)': dependencies: react: 19.1.2 - '@react-email/code-block@0.0.13(react@19.1.2)': + '@react-email/code-block@0.2.0(react@19.1.2)': dependencies: prismjs: 1.30.0 react: 19.1.2 @@ -13740,11 +14076,11 @@ snapshots: dependencies: react: 19.1.2 - '@react-email/components@0.0.38(react-dom@19.1.2(react@19.1.2))(react@19.1.2)': + '@react-email/components@1.0.1(react-dom@19.1.2(react@19.1.2))(react@19.1.2)': dependencies: - '@react-email/body': 0.0.11(react@19.1.2) - '@react-email/button': 0.0.19(react@19.1.2) - '@react-email/code-block': 0.0.13(react@19.1.2) + '@react-email/body': 0.2.0(react@19.1.2) + '@react-email/button': 0.2.0(react@19.1.2) + '@react-email/code-block': 0.2.0(react@19.1.2) '@react-email/code-inline': 0.0.5(react@19.1.2) '@react-email/column': 0.0.13(react@19.1.2) '@react-email/container': 0.0.15(react@19.1.2) @@ -13755,13 +14091,13 @@ snapshots: '@react-email/html': 0.0.11(react@19.1.2) '@react-email/img': 0.0.11(react@19.1.2) '@react-email/link': 0.0.12(react@19.1.2) - '@react-email/markdown': 0.0.15(react@19.1.2) - '@react-email/preview': 0.0.12(react@19.1.2) - '@react-email/render': 1.1.0(react-dom@19.1.2(react@19.1.2))(react@19.1.2) + '@react-email/markdown': 0.0.17(react@19.1.2) + '@react-email/preview': 0.0.13(react@19.1.2) + '@react-email/render': 2.0.0(react-dom@19.1.2(react@19.1.2))(react@19.1.2) '@react-email/row': 0.0.12(react@19.1.2) '@react-email/section': 0.0.16(react@19.1.2) - '@react-email/tailwind': 1.0.5(react@19.1.2) - '@react-email/text': 0.1.3(react@19.1.2) + '@react-email/tailwind': 2.0.1(@react-email/body@0.2.0(react@19.1.2))(@react-email/button@0.2.0(react@19.1.2))(@react-email/code-block@0.2.0(react@19.1.2))(@react-email/code-inline@0.0.5(react@19.1.2))(@react-email/container@0.0.15(react@19.1.2))(@react-email/heading@0.0.15(react@19.1.2))(@react-email/hr@0.0.11(react@19.1.2))(@react-email/img@0.0.11(react@19.1.2))(@react-email/link@0.0.12(react@19.1.2))(@react-email/preview@0.0.13(react@19.1.2))(@react-email/text@0.1.5(react@19.1.2))(react@19.1.2) + '@react-email/text': 0.1.5(react@19.1.2) react: 19.1.2 transitivePeerDependencies: - react-dom @@ -13798,22 +14134,34 @@ snapshots: dependencies: react: 19.1.2 - '@react-email/markdown@0.0.15(react@19.1.2)': + '@react-email/markdown@0.0.17(react@19.1.2)': dependencies: - md-to-react-email: 5.0.5(react@19.1.2) + marked: 15.0.12 react: 19.1.2 - '@react-email/preview@0.0.12(react@19.1.2)': + '@react-email/preview-server@5.0.8(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.1.2(react@19.1.2))(react@19.1.2)': + dependencies: + next: 16.0.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) + transitivePeerDependencies: + - '@babel/core' + - '@opentelemetry/api' + - '@playwright/test' + - babel-plugin-macros + - babel-plugin-react-compiler + - react + - react-dom + - sass + + '@react-email/preview@0.0.13(react@19.1.2)': dependencies: react: 19.1.2 - '@react-email/render@1.1.0(react-dom@19.1.2(react@19.1.2))(react@19.1.2)': + '@react-email/render@2.0.0(react-dom@19.1.2(react@19.1.2))(react@19.1.2)': dependencies: html-to-text: 9.0.5 prettier: 3.5.3 react: 19.1.2 react-dom: 19.1.2(react@19.1.2) - react-promise-suspense: 0.3.4 '@react-email/row@0.0.12(react@19.1.2)': dependencies: @@ -13823,11 +14171,24 @@ snapshots: dependencies: react: 19.1.2 - '@react-email/tailwind@1.0.5(react@19.1.2)': + '@react-email/tailwind@2.0.1(@react-email/body@0.2.0(react@19.1.2))(@react-email/button@0.2.0(react@19.1.2))(@react-email/code-block@0.2.0(react@19.1.2))(@react-email/code-inline@0.0.5(react@19.1.2))(@react-email/container@0.0.15(react@19.1.2))(@react-email/heading@0.0.15(react@19.1.2))(@react-email/hr@0.0.11(react@19.1.2))(@react-email/img@0.0.11(react@19.1.2))(@react-email/link@0.0.12(react@19.1.2))(@react-email/preview@0.0.13(react@19.1.2))(@react-email/text@0.1.5(react@19.1.2))(react@19.1.2)': dependencies: + '@react-email/text': 0.1.5(react@19.1.2) react: 19.1.2 + tailwindcss: 4.1.18 + optionalDependencies: + '@react-email/body': 0.2.0(react@19.1.2) + '@react-email/button': 0.2.0(react@19.1.2) + '@react-email/code-block': 0.2.0(react@19.1.2) + '@react-email/code-inline': 0.0.5(react@19.1.2) + '@react-email/container': 0.0.15(react@19.1.2) + '@react-email/heading': 0.0.15(react@19.1.2) + '@react-email/hr': 0.0.11(react@19.1.2) + '@react-email/img': 0.0.11(react@19.1.2) + '@react-email/link': 0.0.12(react@19.1.2) + '@react-email/preview': 0.0.13(react@19.1.2) - '@react-email/text@0.1.3(react@19.1.2)': + '@react-email/text@0.1.5(react@19.1.2)': dependencies: react: 19.1.2 @@ -14106,7 +14467,7 @@ snapshots: '@sentry/core@10.5.0': {} - '@sentry/nextjs@10.5.0(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.1.2(react@19.1.2))(react@19.1.2))(react@19.1.2)(webpack@5.99.8(esbuild@0.25.10))': + '@sentry/nextjs@10.5.0(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(encoding@0.1.13)(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.1.2(react@19.1.2))(react@19.2.3))(react@19.2.3)(webpack@5.99.8(esbuild@0.25.10))': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.37.0 @@ -14115,11 +14476,11 @@ snapshots: '@sentry/core': 10.5.0 '@sentry/node': 10.5.0 '@sentry/opentelemetry': 10.5.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0) - '@sentry/react': 10.5.0(react@19.1.2) + '@sentry/react': 10.5.0(react@19.2.3) '@sentry/vercel-edge': 10.5.0 '@sentry/webpack-plugin': 4.6.0(encoding@0.1.13)(webpack@5.99.8(esbuild@0.25.10)) chalk: 3.0.0 - next: 15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) + next: 15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) resolve: 1.22.8 rollup: 4.52.5 stacktrace-parser: 0.1.11 @@ -14194,12 +14555,12 @@ snapshots: '@opentelemetry/semantic-conventions': 1.37.0 '@sentry/core': 10.5.0 - '@sentry/react@10.5.0(react@19.1.2)': + '@sentry/react@10.5.0(react@19.2.3)': dependencies: '@sentry/browser': 10.5.0 '@sentry/core': 10.5.0 hoist-non-react-statics: 3.3.2 - react: 19.1.2 + react: 19.2.3 '@sentry/vercel-edge@10.5.0': dependencies: @@ -14560,6 +14921,8 @@ snapshots: dependencies: tslib: 2.8.1 + '@socket.io/component-emitter@3.1.2': {} + '@sqltools/formatter@1.2.5': {} '@standard-schema/spec@1.0.0': {} @@ -14686,10 +15049,10 @@ snapshots: postcss-selector-parser: 6.0.10 tailwindcss: 3.4.17(ts-node@10.9.2(@types/node@22.15.18)(typescript@5.8.3)) - '@tanstack/react-table@8.21.3(react-dom@19.1.2(react@19.1.2))(react@19.1.2)': + '@tanstack/react-table@8.21.3(react-dom@19.1.2(react@19.1.2))(react@19.2.3)': dependencies: '@tanstack/table-core': 8.21.3 - react: 19.1.2 + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) '@tanstack/table-core@8.21.3': {} @@ -14722,11 +15085,11 @@ snapshots: '@testing-library/dom': 8.20.1 preact: 10.26.6 - '@testing-library/react@16.3.0(@testing-library/dom@8.20.1)(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2)': + '@testing-library/react@16.3.0(@testing-library/dom@8.20.1)(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3)': dependencies: '@babel/runtime': 7.28.4 '@testing-library/dom': 8.20.1 - react: 19.1.2 + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) optionalDependencies: '@types/react': 19.1.4 @@ -14800,6 +15163,10 @@ snapshots: dependencies: '@types/node': 22.15.18 + '@types/cors@2.8.19': + dependencies: + '@types/node': 22.15.18 + '@types/deep-eql@4.0.2': {} '@types/doctrine@0.0.9': {} @@ -14908,9 +15275,9 @@ snapshots: dependencies: '@types/node': 22.15.18 - '@types/testing-library__react@10.2.0(@testing-library/dom@8.20.1)(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2)': + '@types/testing-library__react@10.2.0(@testing-library/dom@8.20.1)(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3)': dependencies: - '@testing-library/react': 16.3.0(@testing-library/dom@8.20.1)(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) + '@testing-library/react': 16.3.0(@testing-library/dom@8.20.1)(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) transitivePeerDependencies: - '@testing-library/dom' - '@types/react' @@ -15620,6 +15987,11 @@ snapshots: dependencies: event-target-shim: 5.0.1 + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + acorn-import-attributes@1.9.5(acorn@8.15.0): dependencies: acorn: 8.15.0 @@ -15665,6 +16037,10 @@ snapshots: optionalDependencies: ajv: 8.13.0 + ajv-formats@3.0.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + ajv-keywords@3.5.2(ajv@6.12.6): dependencies: ajv: 6.12.6 @@ -15859,6 +16235,11 @@ snapshots: atomic-sleep@1.0.0: {} + atomically@2.1.0: + dependencies: + stubborn-fs: 2.0.0 + when-exit: 2.1.5 + autoprefixer@10.4.21(postcss@8.5.3): dependencies: browserslist: 4.27.0 @@ -15897,6 +16278,8 @@ snapshots: base64-js@1.5.1: {} + base64id@2.0.0: {} + baseline-browser-mapping@2.8.21: {} bcryptjs@3.0.2: {} @@ -15930,9 +16313,9 @@ snapshots: boolbase@1.0.0: {} - boring-avatars@2.0.1(react-dom@19.1.2(react@19.1.2))(react@19.1.2): + boring-avatars@2.0.1(react-dom@19.1.2(react@19.1.2))(react@19.2.3): dependencies: - react: 19.1.2 + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) bowser@2.12.1: {} @@ -16127,6 +16510,8 @@ snapshots: dependencies: restore-cursor: 5.1.0 + cli-spinners@2.9.2: {} + cli-truncate@4.0.0: dependencies: slice-ansi: 5.0.0 @@ -16150,13 +16535,13 @@ snapshots: cluster-key-slot@1.1.2: {} - cmdk@1.1.1(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2): + cmdk@1.1.1(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3): dependencies: - '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-dialog': 1.1.13(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - '@radix-ui/react-id': 1.1.1(@types/react@19.1.4)(react@19.1.2) - '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - react: 19.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-dialog': 1.1.13(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + '@radix-ui/react-id': 1.1.1(@types/react@19.1.4)(react@19.2.3) + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.1.5(@types/react@19.1.4))(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) transitivePeerDependencies: - '@types/react' @@ -16217,6 +16602,18 @@ snapshots: tree-kill: 1.2.2 yargs: 17.7.2 + conf@15.0.2: + dependencies: + ajv: 8.17.1 + ajv-formats: 3.0.1(ajv@8.17.1) + atomically: 2.1.0 + debounce-fn: 6.0.0 + dot-prop: 10.1.0 + env-paths: 3.0.0 + json-schema-typed: 8.0.2 + semver: 7.7.3 + uint8array-extras: 1.5.0 + confbox@0.1.8: {} confbox@0.2.2: {} @@ -16244,6 +16641,11 @@ snapshots: core-util-is@1.0.3: {} + cors@2.8.5: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + create-require@1.1.1: {} cross-env@10.0.0: @@ -16340,10 +16742,20 @@ snapshots: de-indent@1.0.2: {} + debounce-fn@6.0.0: + dependencies: + mimic-function: 5.0.1 + + debounce@2.2.0: {} + debug@3.2.7: dependencies: ms: 2.1.3 + debug@4.3.7: + dependencies: + ms: 2.1.3 + debug@4.4.3: dependencies: ms: 2.1.3 @@ -16483,6 +16895,10 @@ snapshots: domelementtype: 2.3.0 domhandler: 5.0.3 + dot-prop@10.1.0: + dependencies: + type-fest: 5.3.1 + dotenv-cli@8.0.0: dependencies: cross-spawn: 7.0.6 @@ -16537,6 +16953,24 @@ snapshots: dependencies: once: 1.4.0 + engine.io-parser@5.2.3: {} + + engine.io@6.6.4: + dependencies: + '@types/cors': 2.8.19 + '@types/node': 22.15.18 + accepts: 1.3.8 + base64id: 2.0.0 + cookie: 0.7.2 + cors: 2.8.5 + debug: 4.3.7 + engine.io-parser: 5.2.3 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + enhanced-resolve@5.18.3: dependencies: graceful-fs: 4.2.11 @@ -16549,6 +16983,8 @@ snapshots: env-paths@2.2.1: optional: true + env-paths@3.0.0: {} + environment@1.1.0: {} err-code@2.0.3: @@ -17147,8 +17583,6 @@ snapshots: fast-copy@3.0.2: {} - fast-deep-equal@2.0.1: {} - fast-deep-equal@3.1.3: {} fast-glob@3.3.1: @@ -17271,13 +17705,13 @@ snapshots: fraction.js@4.3.7: {} - framer-motion@12.10.0(react-dom@19.1.2(react@19.1.2))(react@19.1.2): + framer-motion@12.10.0(react-dom@19.1.2(react@19.1.2))(react@19.2.3): dependencies: motion-dom: 12.23.23 motion-utils: 12.23.6 tslib: 2.8.1 optionalDependencies: - react: 19.1.2 + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) fs-constants@1.0.0: {} @@ -17827,6 +18261,8 @@ snapshots: dependencies: is-docker: 3.0.0 + is-interactive@2.0.0: {} + is-lambda@1.0.1: optional: true @@ -17885,6 +18321,10 @@ snapshots: dependencies: which-typed-array: 1.1.19 + is-unicode-supported@1.3.0: {} + + is-unicode-supported@2.1.0: {} + is-weakmap@2.0.2: {} is-weakref@1.1.1: @@ -18050,6 +18490,8 @@ snapshots: json-schema-traverse@1.0.0: {} + json-schema-typed@8.0.2: {} + json-stable-stringify-without-jsonify@1.0.1: {} json5@1.0.2: @@ -18110,6 +18552,8 @@ snapshots: dependencies: json-buffer: 3.0.1 + kleur@3.0.3: {} + kolorist@1.8.0: {} language-subtag-registry@0.3.23: {} @@ -18222,6 +18666,16 @@ snapshots: dependencies: chalk: 2.4.2 + log-symbols@6.0.0: + dependencies: + chalk: 5.6.2 + is-unicode-supported: 1.3.0 + + log-symbols@7.0.1: + dependencies: + is-unicode-supported: 2.1.0 + yoctocolors: 2.1.2 + log-update@6.1.0: dependencies: ansi-escapes: 7.1.1 @@ -18254,9 +18708,9 @@ snapshots: lru.min@1.1.2: {} - lucide-react@0.507.0(react@19.1.2): + lucide-react@0.507.0(react@19.2.3): dependencies: - react: 19.1.2 + react: 19.2.3 lz-string@1.5.0: {} @@ -18318,15 +18772,10 @@ snapshots: punycode.js: 2.3.1 uc.micro: 2.1.0 - marked@7.0.4: {} + marked@15.0.12: {} math-intrinsics@1.1.0: {} - md-to-react-email@5.0.5(react@19.1.2): - dependencies: - marked: 7.0.4 - react: 19.1.2 - mdn-data@2.0.14: {} mdurl@2.0.0: {} @@ -18515,14 +18964,14 @@ snapshots: dependencies: lru-cache: 7.18.3 - nano-css@5.6.2(react-dom@19.1.2(react@19.1.2))(react@19.1.2): + nano-css@5.6.2(react-dom@19.1.2(react@19.1.2))(react@19.2.3): dependencies: '@jridgewell/sourcemap-codec': 1.5.5 css-tree: 1.1.3 csstype: 3.1.3 fastest-stable-stringify: 2.0.2 inline-style-prefixer: 7.0.1 - react: 19.1.2 + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) rtl-css-js: 1.16.1 stacktrace-js: 2.0.2 @@ -18540,45 +18989,47 @@ snapshots: natural-compare@1.4.0: {} + negotiator@0.6.3: {} + negotiator@0.6.4: optional: true neo-async@2.6.2: {} - next-auth@4.24.12(patch_hash=bdy3m55bopfzpysceipfxj5eei)(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.1.2(react@19.1.2))(react@19.1.2))(nodemailer@7.0.11)(react-dom@19.1.2(react@19.1.2))(react@19.1.2): + next-auth@4.24.12(patch_hash=bdy3m55bopfzpysceipfxj5eei)(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.1.2(react@19.1.2))(react@19.2.3))(nodemailer@7.0.11)(react-dom@19.1.2(react@19.1.2))(react@19.2.3): dependencies: '@babel/runtime': 7.28.4 '@panva/hkdf': 1.2.1 cookie: 0.7.2 jose: 4.15.9 - next: 15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) + next: 15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) oauth: 0.9.15 openid-client: 5.7.1 preact: 10.26.6 preact-render-to-string: 5.2.6(preact@10.26.6) - react: 19.1.2 + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) uuid: 8.3.2 optionalDependencies: nodemailer: 7.0.11 - next-safe-action@7.10.8(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.1.2(react@19.1.2))(react@19.1.2))(react-dom@19.1.2(react@19.1.2))(react@19.1.2)(zod@3.24.4): + next-safe-action@7.10.8(next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.1.2(react@19.1.2))(react@19.2.3))(react-dom@19.1.2(react@19.1.2))(react@19.2.3)(zod@3.24.4): dependencies: - next: 15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - react: 19.1.2 + next: 15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) optionalDependencies: zod: 3.24.4 - next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.1.2(react@19.1.2))(react@19.1.2): + next@15.5.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.1.2(react@19.1.2))(react@19.2.3): dependencies: '@next/env': 15.5.9 '@swc/helpers': 0.5.15 caniuse-lite: 1.0.30001760 postcss: 8.4.31 - react: 19.1.2 + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) - styled-jsx: 5.1.6(react@19.1.2) + styled-jsx: 5.1.6(react@19.2.3) optionalDependencies: '@next/swc-darwin-arm64': 15.5.7 '@next/swc-darwin-x64': 15.5.7 @@ -18595,6 +19046,31 @@ snapshots: - '@babel/core' - babel-plugin-macros + next@16.0.9(@opentelemetry/api@1.9.0)(@playwright/test@1.56.1)(react-dom@19.1.2(react@19.1.2))(react@19.1.2): + dependencies: + '@next/env': 16.0.9 + '@swc/helpers': 0.5.15 + caniuse-lite: 1.0.30001760 + postcss: 8.4.31 + react: 19.1.2 + react-dom: 19.1.2(react@19.1.2) + styled-jsx: 5.1.6(react@19.1.2) + optionalDependencies: + '@next/swc-darwin-arm64': 16.0.9 + '@next/swc-darwin-x64': 16.0.9 + '@next/swc-linux-arm64-gnu': 16.0.9 + '@next/swc-linux-arm64-musl': 16.0.9 + '@next/swc-linux-x64-gnu': 16.0.9 + '@next/swc-linux-x64-musl': 16.0.9 + '@next/swc-win32-arm64-msvc': 16.0.9 + '@next/swc-win32-x64-msvc': 16.0.9 + '@opentelemetry/api': 1.9.0 + '@playwright/test': 1.56.1 + sharp: 0.34.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + node-abi@3.79.0: dependencies: semver: 7.7.3 @@ -18680,6 +19156,14 @@ snapshots: nwsapi@2.2.22: {} + nypm@0.6.0: + dependencies: + citty: 0.1.6 + consola: 3.4.2 + pathe: 2.0.3 + pkg-types: 2.3.0 + tinyexec: 0.3.2 + nypm@0.6.2: dependencies: citty: 0.1.6 @@ -18793,6 +19277,18 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + ora@8.2.0: + dependencies: + chalk: 5.6.2 + cli-cursor: 5.0.0 + cli-spinners: 2.9.2 + is-interactive: 2.0.0 + is-unicode-supported: 2.1.0 + log-symbols: 6.0.0 + stdin-discarder: 0.2.2 + string-width: 7.2.0 + strip-ansi: 7.1.2 + otplib@12.0.1: dependencies: '@otplib/core': 12.0.1 @@ -19168,6 +19664,11 @@ snapshots: retry: 0.12.0 optional: true + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 @@ -19240,49 +19741,49 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-calendar@5.1.0(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2): + react-calendar@5.1.0(@types/react@19.1.4)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: '@wojtekmaj/date-utils': 1.5.1 clsx: 2.1.1 get-user-locale: 2.3.2 - react: 19.1.2 - react-dom: 19.1.2(react@19.1.2) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) warning: 4.0.3 optionalDependencies: '@types/react': 19.1.4 - react-colorful@5.6.1(react-dom@19.1.2(react@19.1.2))(react@19.1.2): + react-colorful@5.6.1(react-dom@19.1.2(react@19.1.2))(react@19.2.3): dependencies: - react: 19.1.2 + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) - react-confetti@6.4.0(react@19.1.2): + react-confetti@6.4.0(react@19.2.3): dependencies: - react: 19.1.2 + react: 19.2.3 tween-functions: 1.2.0 - react-date-picker@11.0.0(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2): + react-date-picker@11.0.0(@types/react@19.1.4)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: '@wojtekmaj/date-utils': 1.5.1 clsx: 2.1.1 get-user-locale: 2.3.2 make-event-props: 1.6.2 - react: 19.1.2 - react-calendar: 5.1.0(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - react-dom: 19.1.2(react@19.1.2) - react-fit: 2.0.1(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2) + react: 19.2.3 + react-calendar: 5.1.0(@types/react@19.1.4)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + react-dom: 19.2.3(react@19.2.3) + react-fit: 2.0.1(@types/react@19.1.4)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) update-input-width: 1.4.2 optionalDependencies: '@types/react': 19.1.4 transitivePeerDependencies: - '@types/react-dom' - react-day-picker@9.6.7(react@19.1.2): + react-day-picker@9.6.7(react@19.2.3): dependencies: '@date-fns/tz': 1.2.0 date-fns: 4.1.0 date-fns-jalali: 4.1.0-0 - react: 19.1.2 + react: 19.2.3 react-docgen-typescript@2.4.0(typescript@5.8.3): dependencies: @@ -19313,89 +19814,124 @@ snapshots: react: 19.1.2 scheduler: 0.26.0 - react-error-boundary@6.0.0(react@19.1.2): + react-dom@19.2.3(react@19.2.3): + dependencies: + react: 19.2.3 + scheduler: 0.27.0 + + react-email@5.0.8: + dependencies: + '@babel/parser': 7.28.5 + '@babel/traverse': 7.28.5 + chokidar: 4.0.3 + commander: 13.1.0 + conf: 15.0.2 + debounce: 2.2.0 + esbuild: 0.25.10 + glob: 11.1.0 + jiti: 2.4.2 + log-symbols: 7.0.1 + mime-types: 3.0.1 + normalize-path: 3.0.0 + nypm: 0.6.0 + ora: 8.2.0 + prompts: 2.4.2 + socket.io: 4.8.1 + tsconfig-paths: 4.2.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + react-error-boundary@6.0.0(react@19.2.3): dependencies: '@babel/runtime': 7.28.4 - react: 19.1.2 + react: 19.2.3 - react-fit@2.0.1(@types/react@19.1.4)(react-dom@19.1.2(react@19.1.2))(react@19.1.2): + react-fit@2.0.1(@types/react@19.1.4)(react-dom@19.2.3(react@19.2.3))(react@19.2.3): dependencies: detect-element-overflow: 1.4.2 - react: 19.1.2 - react-dom: 19.1.2(react@19.1.2) + react: 19.2.3 + react-dom: 19.2.3(react@19.2.3) warning: 4.0.3 optionalDependencies: '@types/react': 19.1.4 - react-hook-form@7.56.2(react@19.1.2): + react-hook-form@7.56.2(react@19.2.3): dependencies: - react: 19.1.2 + react: 19.2.3 - react-hot-toast@2.5.2(react-dom@19.1.2(react@19.1.2))(react@19.1.2): + react-hot-toast@2.5.2(react-dom@19.1.2(react@19.1.2))(react@19.2.3): dependencies: csstype: 3.1.3 goober: 2.1.18(csstype@3.1.3) - react: 19.1.2 + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) - react-i18next@15.7.3(i18next@25.5.2(typescript@5.8.3))(react-dom@19.1.2(react@19.1.2))(react@19.1.2)(typescript@5.8.3): + react-i18next@15.7.3(i18next@25.5.2(typescript@5.8.3))(react-dom@19.1.2(react@19.1.2))(react@19.2.3)(typescript@5.8.3): dependencies: '@babel/runtime': 7.28.4 html-parse-stringify: 3.0.1 i18next: 25.5.2(typescript@5.8.3) - react: 19.1.2 + react: 19.2.3 optionalDependencies: react-dom: 19.1.2(react@19.1.2) typescript: 5.8.3 + react-i18next@15.7.3(i18next@25.5.2(typescript@5.8.3))(react-dom@19.2.3(react@19.2.3))(react@19.2.3)(typescript@5.8.3): + dependencies: + '@babel/runtime': 7.28.4 + html-parse-stringify: 3.0.1 + i18next: 25.5.2(typescript@5.8.3) + react: 19.2.3 + optionalDependencies: + react-dom: 19.2.3(react@19.2.3) + typescript: 5.8.3 + react-is@16.13.1: {} react-is@17.0.2: {} - react-promise-suspense@0.3.4: - dependencies: - fast-deep-equal: 2.0.1 - react-refresh@0.17.0: {} - react-remove-scroll-bar@2.3.8(@types/react@19.1.4)(react@19.1.2): + react-remove-scroll-bar@2.3.8(@types/react@19.1.4)(react@19.2.3): dependencies: - react: 19.1.2 - react-style-singleton: 2.2.3(@types/react@19.1.4)(react@19.1.2) + react: 19.2.3 + react-style-singleton: 2.2.3(@types/react@19.1.4)(react@19.2.3) tslib: 2.8.1 optionalDependencies: '@types/react': 19.1.4 - react-remove-scroll@2.7.1(@types/react@19.1.4)(react@19.1.2): + react-remove-scroll@2.7.1(@types/react@19.1.4)(react@19.2.3): dependencies: - react: 19.1.2 - react-remove-scroll-bar: 2.3.8(@types/react@19.1.4)(react@19.1.2) - react-style-singleton: 2.2.3(@types/react@19.1.4)(react@19.1.2) + react: 19.2.3 + react-remove-scroll-bar: 2.3.8(@types/react@19.1.4)(react@19.2.3) + react-style-singleton: 2.2.3(@types/react@19.1.4)(react@19.2.3) tslib: 2.8.1 - use-callback-ref: 1.3.3(@types/react@19.1.4)(react@19.1.2) - use-sidecar: 1.1.3(@types/react@19.1.4)(react@19.1.2) + use-callback-ref: 1.3.3(@types/react@19.1.4)(react@19.2.3) + use-sidecar: 1.1.3(@types/react@19.1.4)(react@19.2.3) optionalDependencies: '@types/react': 19.1.4 - react-style-singleton@2.2.3(@types/react@19.1.4)(react@19.1.2): + react-style-singleton@2.2.3(@types/react@19.1.4)(react@19.2.3): dependencies: get-nonce: 1.0.1 - react: 19.1.2 + react: 19.2.3 tslib: 2.8.1 optionalDependencies: '@types/react': 19.1.4 - react-turnstile@1.1.4(react-dom@19.1.2(react@19.1.2))(react@19.1.2): + react-turnstile@1.1.4(react-dom@19.1.2(react@19.1.2))(react@19.2.3): dependencies: - react: 19.1.2 + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) - react-universal-interface@0.6.2(react@19.1.2)(tslib@2.8.1): + react-universal-interface@0.6.2(react@19.2.3)(tslib@2.8.1): dependencies: - react: 19.1.2 + react: 19.2.3 tslib: 2.8.1 - react-use@17.6.0(react-dom@19.1.2(react@19.1.2))(react@19.1.2): + react-use@17.6.0(react-dom@19.1.2(react@19.1.2))(react@19.2.3): dependencies: '@types/js-cookie': 2.2.7 '@xobotyi/scrollbar-width': 1.9.5 @@ -19403,10 +19939,10 @@ snapshots: fast-deep-equal: 3.1.3 fast-shallow-equal: 1.0.0 js-cookie: 2.2.1 - nano-css: 5.6.2(react-dom@19.1.2(react@19.1.2))(react@19.1.2) - react: 19.1.2 + nano-css: 5.6.2(react-dom@19.1.2(react@19.1.2))(react@19.2.3) + react: 19.2.3 react-dom: 19.1.2(react@19.1.2) - react-universal-interface: 0.6.2(react@19.1.2)(tslib@2.8.1) + react-universal-interface: 0.6.2(react@19.2.3)(tslib@2.8.1) resize-observer-polyfill: 1.5.1 screenfull: 5.2.0 set-harmonic-interval: 1.0.1 @@ -19418,6 +19954,8 @@ snapshots: react@19.1.2: {} + react@19.2.3: {} + read-cache@1.0.0: dependencies: pify: 2.3.0 @@ -19687,6 +20225,8 @@ snapshots: scheduler@0.26.0: {} + scheduler@0.27.0: {} + schema-utils@3.3.0: dependencies: '@types/json-schema': 7.0.15 @@ -19878,6 +20418,8 @@ snapshots: dependencies: is-arrayish: 0.3.4 + sisteransi@1.0.5: {} + slash@3.0.0: {} slice-ansi@5.0.0: @@ -19895,6 +20437,36 @@ snapshots: smart-buffer@4.2.0: optional: true + socket.io-adapter@2.5.5: + dependencies: + debug: 4.3.7 + ws: 8.17.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + socket.io-parser@4.2.4: + dependencies: + '@socket.io/component-emitter': 3.1.2 + debug: 4.3.7 + transitivePeerDependencies: + - supports-color + + socket.io@4.8.1: + dependencies: + accepts: 1.3.8 + base64id: 2.0.0 + cors: 2.8.5 + debug: 4.3.7 + engine.io: 6.6.4 + socket.io-adapter: 2.5.5 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + socks-proxy-agent@6.2.1: dependencies: agent-base: 6.0.2 @@ -20013,6 +20585,8 @@ snapshots: std-env@3.10.0: {} + stdin-discarder@0.2.2: {} + stop-iteration-iterator@1.1.0: dependencies: es-errors: 1.3.0 @@ -20150,11 +20724,22 @@ snapshots: strnum@2.1.1: {} + stubborn-fs@2.0.0: + dependencies: + stubborn-utils: 1.0.2 + + stubborn-utils@1.0.2: {} + styled-jsx@5.1.6(react@19.1.2): dependencies: client-only: 0.0.1 react: 19.1.2 + styled-jsx@5.1.6(react@19.2.3): + dependencies: + client-only: 0.0.1 + react: 19.2.3 + stylis@4.3.6: {} sucrase@3.35.0: @@ -20195,6 +20780,8 @@ snapshots: tabbable@6.3.0: {} + tagged-tag@1.0.0: {} + tailwind-merge@3.2.0: {} tailwindcss@3.4.17(ts-node@10.9.2(@types/node@22.15.18)(typescript@5.8.3)): @@ -20224,6 +20811,8 @@ snapshots: transitivePeerDependencies: - ts-node + tailwindcss@4.1.18: {} + tapable@2.3.0: {} tar-fs@2.1.4: @@ -20476,6 +21065,10 @@ snapshots: type-fest@0.8.1: {} + type-fest@5.3.1: + dependencies: + tagged-tag: 1.0.0 + typed-array-buffer@1.0.3: dependencies: call-bound: 1.0.4 @@ -20558,6 +21151,8 @@ snapshots: ufo@1.6.1: {} + uint8array-extras@1.5.0: {} + unbox-primitive@1.1.0: dependencies: call-bound: 1.0.4 @@ -20636,17 +21231,17 @@ snapshots: url-template@2.0.8: {} - use-callback-ref@1.3.3(@types/react@19.1.4)(react@19.1.2): + use-callback-ref@1.3.3(@types/react@19.1.4)(react@19.2.3): dependencies: - react: 19.1.2 + react: 19.2.3 tslib: 2.8.1 optionalDependencies: '@types/react': 19.1.4 - use-sidecar@1.1.3(@types/react@19.1.4)(react@19.1.2): + use-sidecar@1.1.3(@types/react@19.1.4)(react@19.2.3): dependencies: detect-node-es: 1.1.0 - react: 19.1.2 + react: 19.2.3 tslib: 2.8.1 optionalDependencies: '@types/react': 19.1.4 @@ -20666,6 +21261,8 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 + vary@1.1.2: {} + vite-node@3.1.3(@types/node@22.15.18)(jiti@2.4.2)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.1): dependencies: cac: 6.7.14 @@ -20865,6 +21462,8 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 + when-exit@2.1.5: {} + which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 @@ -20950,6 +21549,8 @@ snapshots: wrappy@1.0.2: {} + ws@8.17.1: {} + ws@8.18.3: {} wsl-utils@0.1.0: @@ -21040,6 +21641,8 @@ snapshots: yocto-queue@1.2.1: {} + yoctocolors@2.1.2: {} + yoga-layout@3.2.1: {} zod-openapi@4.2.4(zod@3.24.4):