From 041efb89fb5385f3a6f04d39d00dae8a912c96ea Mon Sep 17 00:00:00 2001 From: giancarlo Date: Thu, 28 Mar 2024 15:27:56 +0800 Subject: [PATCH] Remove team account related services and actions Removed services and actions related to team account deletion as well as updated paths within other dependent files, better reflecting their new locations. Also, added a new service titled 'AccountBillingService' for handling billing-related operations and restructured the form layout and handled translation in 'team-account-danger-zone' component. --- .../[account]/_components/app-sidebar.tsx | 4 +- .../_components/mobile-app-navigation.tsx | 12 +- ...pace.ts => load-team-account-workspace.ts} | 2 +- .../home/[account]/billing/page.tsx | 4 +- .../app/(dashboard)/home/[account]/layout.tsx | 4 +- .../home/[account]/members/page.tsx | 4 +- .../home/[account]/settings/page.tsx | 62 + .../home-sidebar-account-selector.tsx | 4 +- .../site-header-account-section.tsx | 2 - apps/web/app/layout.tsx | 7 +- apps/web/config/feature-flags.config.ts | 22 +- apps/web/package.json | 62 +- apps/web/public/locales/en/teams.json | 83 +- package.json | 9 +- packages/billing-gateway/package.json | 18 +- packages/billing-gateway/src/index.ts | 7 +- .../services/account-billing.service.ts | 68 + .../billing-event-handler.service.ts | 0 .../billing-gateway-factory.service.ts | 0 .../billing-gateway-provider-factory.ts | 0 .../billing-gateway-factory.service.ts | 0 .../billing-gateway-provider-factory.ts | 0 .../billing-gateway.service.ts | 0 packages/billing/package.json | 12 +- packages/email-templates/package.json | 8 +- packages/email-templates/src/invite.email.tsx | 14 +- packages/features/accounts/package.json | 26 +- .../src/components/account-selector.tsx | 25 +- .../mfa/multi-factor-auth-list.tsx | 25 +- .../mfa/multi-factor-auth-setup-dialog.tsx | 42 +- .../update-account-details-form-container.tsx | 10 +- .../personal-accounts-server-actions.ts | 4 +- ....ts => delete-personal-account.service.ts} | 80 +- packages/features/admin/package.json | 14 +- packages/features/auth/package.json | 15 +- packages/features/team-accounts/package.json | 25 +- .../delete-team-account-server-actions.ts | 17 - .../components/create-team-account-dialog.tsx | 61 +- .../team-accounts/src/components/index.ts | 4 +- .../invitations/account-invitations-table.tsx | 2 +- .../invitations/delete-invitation-dialog.tsx | 4 +- .../invitations/update-invitation-dialog.tsx | 4 +- .../members/account-members-table.tsx | 2 +- .../invite-members-dialog-container.tsx | 9 +- .../membership-role-selector.tsx | 0 .../members/remove-member-dialog.tsx | 6 +- .../components/{ => members}/role-badge.tsx | 0 .../members/transfer-ownership-dialog.tsx | 6 +- .../members/update-member-role-dialog.tsx | 4 +- .../settings/team-account-danger-zone.tsx | 336 ++++ .../team-account-settings-container.tsx | 82 + .../update-team-account-image-container.tsx | 141 ++ .../update-team-account-name-form.tsx} | 55 +- .../components/team-account-danger-zone.tsx | 262 --- .../create-team-account-server-actions.ts | 6 +- .../delete-team-account-server-actions.ts | 60 + .../leave-team-account-server-actions.ts | 2 +- .../actions/team-details-server-actions.ts | 39 + .../team-invitations-server-actions.ts} | 6 +- .../actions/team-members-server-actions.ts} | 0 .../services/account-invitations.service.ts | 12 +- .../services/account-members.service.ts | 0 .../services/create-team-account.service.ts | 2 +- .../services/delete-team-account.service.ts | 73 + .../services/leave-account.service.ts | 0 .../services/delete-team-account.service.ts | 14 - packages/i18n/package.json | 10 +- packages/mailers/package.json | 8 +- packages/shared/package.json | 8 +- packages/stripe/package.json | 20 +- packages/supabase/package.json | 8 +- packages/ui/package.json | 26 +- pnpm-lock.yaml | 1544 ++++++++--------- supabase/package.json | 2 +- tooling/eslint/package.json | 18 +- tooling/prettier/package.json | 10 +- tooling/tailwind/package.json | 14 +- 77 files changed, 1998 insertions(+), 1553 deletions(-) rename apps/web/app/(dashboard)/home/[account]/_lib/{load-workspace.ts => load-team-account-workspace.ts} (95%) create mode 100644 apps/web/app/(dashboard)/home/[account]/settings/page.tsx create mode 100644 packages/billing-gateway/src/server/services/account-billing.service.ts rename packages/billing-gateway/src/{ => server}/services/billing-event-handler/billing-event-handler.service.ts (100%) rename packages/billing-gateway/src/{ => server}/services/billing-event-handler/billing-gateway-factory.service.ts (100%) rename packages/billing-gateway/src/{ => server}/services/billing-event-handler/billing-gateway-provider-factory.ts (100%) rename packages/billing-gateway/src/{ => server}/services/billing-gateway/billing-gateway-factory.service.ts (100%) rename packages/billing-gateway/src/{ => server}/services/billing-gateway/billing-gateway-provider-factory.ts (100%) rename packages/billing-gateway/src/{ => server}/services/billing-gateway/billing-gateway.service.ts (100%) rename packages/features/accounts/src/server/services/{personal-accounts.service.ts => delete-personal-account.service.ts} (61%) delete mode 100644 packages/features/team-accounts/src/actions/delete-team-account-server-actions.ts rename packages/features/team-accounts/src/components/{ => members}/membership-role-selector.tsx (100%) rename packages/features/team-accounts/src/components/{ => members}/role-badge.tsx (100%) create mode 100644 packages/features/team-accounts/src/components/settings/team-account-danger-zone.tsx create mode 100644 packages/features/team-accounts/src/components/settings/team-account-settings-container.tsx create mode 100644 packages/features/team-accounts/src/components/settings/update-team-account-image-container.tsx rename packages/features/team-accounts/src/components/{update-organization-form.tsx => settings/update-team-account-name-form.tsx} (53%) delete mode 100644 packages/features/team-accounts/src/components/team-account-danger-zone.tsx rename packages/features/team-accounts/src/{ => server}/actions/create-team-account-server-actions.ts (89%) create mode 100644 packages/features/team-accounts/src/server/actions/delete-team-account-server-actions.ts rename packages/features/team-accounts/src/{ => server}/actions/leave-team-account-server-actions.ts (86%) create mode 100644 packages/features/team-accounts/src/server/actions/team-details-server-actions.ts rename packages/features/team-accounts/src/{actions/account-invitations-server-actions.ts => server/actions/team-invitations-server-actions.ts} (90%) rename packages/features/team-accounts/src/{actions/account-members-server-actions.ts => server/actions/team-members-server-actions.ts} (100%) rename packages/features/team-accounts/src/{ => server}/services/account-invitations.service.ts (92%) rename packages/features/team-accounts/src/{ => server}/services/account-members.service.ts (100%) rename packages/features/team-accounts/src/{ => server}/services/create-team-account.service.ts (92%) create mode 100644 packages/features/team-accounts/src/server/services/delete-team-account.service.ts rename packages/features/team-accounts/src/{ => server}/services/leave-account.service.ts (100%) delete mode 100644 packages/features/team-accounts/src/services/delete-team-account.service.ts diff --git a/apps/web/app/(dashboard)/home/[account]/_components/app-sidebar.tsx b/apps/web/app/(dashboard)/home/[account]/_components/app-sidebar.tsx index ef7fd5fc9..652474e27 100644 --- a/apps/web/app/(dashboard)/home/[account]/_components/app-sidebar.tsx +++ b/apps/web/app/(dashboard)/home/[account]/_components/app-sidebar.tsx @@ -30,8 +30,8 @@ type AccountModel = { }; const features = { - enableOrganizationAccounts: featureFlagsConfig.enableOrganizationAccounts, - enableOrganizationCreation: featureFlagsConfig.enableOrganizationCreation, + enableTeamAccounts: featureFlagsConfig.enableTeamAccounts, + enableTeamCreation: featureFlagsConfig.enableTeamCreation, }; export function AppSidebar(props: { diff --git a/apps/web/app/(dashboard)/home/[account]/_components/mobile-app-navigation.tsx b/apps/web/app/(dashboard)/home/[account]/_components/mobile-app-navigation.tsx index 106a8be1e..0c2b79a8d 100644 --- a/apps/web/app/(dashboard)/home/[account]/_components/mobile-app-navigation.tsx +++ b/apps/web/app/(dashboard)/home/[account]/_components/mobile-app-navigation.tsx @@ -27,6 +27,11 @@ import featureFlagsConfig from '~/config/feature-flags.config'; import { getOrganizationAccountSidebarConfig } from '~/config/organization-account-sidebar.config'; import pathsConfig from '~/config/paths.config'; +const features = { + enableTeamAccounts: featureFlagsConfig.enableTeamAccounts, + enableTeamCreation: featureFlagsConfig.enableTeamCreation, +}; + export const MobileAppNavigation = ( props: React.PropsWithChildren<{ slug: string; @@ -161,12 +166,7 @@ function OrganizationsModal() { router.replace(path); }} accounts={[]} - features={{ - enableOrganizationAccounts: - featureFlagsConfig.enableOrganizationAccounts, - enableOrganizationCreation: - featureFlagsConfig.enableOrganizationCreation, - }} + features={features} /> diff --git a/apps/web/app/(dashboard)/home/[account]/_lib/load-workspace.ts b/apps/web/app/(dashboard)/home/[account]/_lib/load-team-account-workspace.ts similarity index 95% rename from apps/web/app/(dashboard)/home/[account]/_lib/load-workspace.ts rename to apps/web/app/(dashboard)/home/[account]/_lib/load-team-account-workspace.ts index 865a5cd1e..e287e8065 100644 --- a/apps/web/app/(dashboard)/home/[account]/_lib/load-workspace.ts +++ b/apps/web/app/(dashboard)/home/[account]/_lib/load-team-account-workspace.ts @@ -17,7 +17,7 @@ import pathsConfig from '~/config/paths.config'; * * @param accountSlug */ -export const loadOrganizationWorkspace = cache(async (accountSlug: string) => { +export const loadTeamWorkspace = cache(async (accountSlug: string) => { const client = getSupabaseServerComponentClient(); const accountPromise = client.rpc('organization_account_workspace', { diff --git a/apps/web/app/(dashboard)/home/[account]/billing/page.tsx b/apps/web/app/(dashboard)/home/[account]/billing/page.tsx index 1fd600aab..75a9ac0ae 100644 --- a/apps/web/app/(dashboard)/home/[account]/billing/page.tsx +++ b/apps/web/app/(dashboard)/home/[account]/billing/page.tsx @@ -8,7 +8,7 @@ import { If } from '@kit/ui/if'; import { PageBody, PageHeader } from '@kit/ui/page'; import { Trans } from '@kit/ui/trans'; -import { loadOrganizationWorkspace } from '~/(dashboard)/home/[account]/_lib/load-workspace'; +import { loadTeamWorkspace } from '~/(dashboard)/home/[account]/_lib/load-team-account-workspace'; import { createBillingPortalSession } from '~/(dashboard)/home/[account]/billing/server-actions'; import billingConfig from '~/config/billing.config'; import { withI18n } from '~/lib/i18n/with-i18n'; @@ -22,7 +22,7 @@ interface Params { } async function OrganizationAccountBillingPage({ params }: Params) { - const workspace = await loadOrganizationWorkspace(params.account); + const workspace = await loadTeamWorkspace(params.account); const accountId = workspace.account.id; const [subscription, customerId] = await loadAccountData(accountId); diff --git a/apps/web/app/(dashboard)/home/[account]/layout.tsx b/apps/web/app/(dashboard)/home/[account]/layout.tsx index aa9f341a6..16d0c6df1 100644 --- a/apps/web/app/(dashboard)/home/[account]/layout.tsx +++ b/apps/web/app/(dashboard)/home/[account]/layout.tsx @@ -6,7 +6,7 @@ import { getSupabaseServerComponentClient } from '@kit/supabase/server-component import { Page } from '@kit/ui/page'; import { AppSidebar } from '~/(dashboard)/home/[account]/_components/app-sidebar'; -import { loadOrganizationWorkspace } from '~/(dashboard)/home/[account]/_lib/load-workspace'; +import { loadTeamWorkspace } from '~/(dashboard)/home/[account]/_lib/load-team-account-workspace'; import { withI18n } from '~/lib/i18n/with-i18n'; interface Params { @@ -20,7 +20,7 @@ function OrganizationWorkspaceLayout({ params: Params; }>) { const [data, session] = use( - Promise.all([loadOrganizationWorkspace(params.account), loadSession()]), + Promise.all([loadTeamWorkspace(params.account), loadSession()]), ); const ui = getUIStateCookies(); diff --git a/apps/web/app/(dashboard)/home/[account]/members/page.tsx b/apps/web/app/(dashboard)/home/[account]/members/page.tsx index 2ba595b87..42d73b816 100644 --- a/apps/web/app/(dashboard)/home/[account]/members/page.tsx +++ b/apps/web/app/(dashboard)/home/[account]/members/page.tsx @@ -17,7 +17,7 @@ import { import { PageBody, PageHeader } from '@kit/ui/page'; import { Trans } from '@kit/ui/trans'; -import { loadOrganizationWorkspace } from '~/(dashboard)/home/[account]/_lib/load-workspace'; +import { loadTeamWorkspace } from '~/(dashboard)/home/[account]/_lib/load-team-account-workspace'; import { withI18n } from '~/lib/i18n/with-i18n'; interface Params { @@ -60,7 +60,7 @@ async function OrganizationAccountMembersPage({ params }: Params) { const slug = params.account; const [{ account, user }, members, invitations] = await Promise.all([ - loadOrganizationWorkspace(slug), + loadTeamWorkspace(slug), loadAccountMembers(slug), loadInvitations(slug), ]); diff --git a/apps/web/app/(dashboard)/home/[account]/settings/page.tsx b/apps/web/app/(dashboard)/home/[account]/settings/page.tsx new file mode 100644 index 000000000..4d9967afc --- /dev/null +++ b/apps/web/app/(dashboard)/home/[account]/settings/page.tsx @@ -0,0 +1,62 @@ +import { TeamAccountSettingsContainer } from '@kit/team-accounts/components'; +import { PageBody, PageHeader } from '@kit/ui/page'; +import { Trans } from '@kit/ui/trans'; + +import { loadTeamWorkspace } from '~/(dashboard)/home/[account]/_lib/load-team-account-workspace'; +import pathsConfig from '~/config/paths.config'; +import { createI18nServerInstance } from '~/lib/i18n/i18n.server'; + +export const generateMetadata = async () => { + const i18n = await createI18nServerInstance(); + const title = i18n.t('accounts:settings:pageTitle'); + + return { + title, + }; +}; + +interface Props { + params: { + account: string; + }; +} + +const paths = { + teamAccountSettings: pathsConfig.app.accountSettings, +}; + +async function TeamAccountSettingsPage(props: Props) { + const data = await loadTeamWorkspace(props.params.account); + const account = { + id: data.account.id, + name: data.account.name, + pictureUrl: data.account.picture_url, + slug: data.account.slug, + primaryOwnerUserId: data.account.primary_owner_user_id, + }; + + return ( + <> + } + description={} + /> + + +
+ +
+
+ + ); +} + +export default TeamAccountSettingsPage; diff --git a/apps/web/app/(dashboard)/home/_components/home-sidebar-account-selector.tsx b/apps/web/app/(dashboard)/home/_components/home-sidebar-account-selector.tsx index 14806229c..18516bb0b 100644 --- a/apps/web/app/(dashboard)/home/_components/home-sidebar-account-selector.tsx +++ b/apps/web/app/(dashboard)/home/_components/home-sidebar-account-selector.tsx @@ -8,8 +8,8 @@ import featureFlagsConfig from '~/config/feature-flags.config'; import pathsConfig from '~/config/paths.config'; const features = { - enableOrganizationAccounts: featureFlagsConfig.enableOrganizationAccounts, - enableOrganizationCreation: featureFlagsConfig.enableOrganizationCreation, + enableTeamAccounts: featureFlagsConfig.enableTeamAccounts, + enableTeamCreation: featureFlagsConfig.enableTeamCreation, }; export function HomeSidebarAccountSelector(props: { diff --git a/apps/web/app/(marketing)/_components/site-header-account-section.tsx b/apps/web/app/(marketing)/_components/site-header-account-section.tsx index 5e1753c30..d39f04976 100644 --- a/apps/web/app/(marketing)/_components/site-header-account-section.tsx +++ b/apps/web/app/(marketing)/_components/site-header-account-section.tsx @@ -1,7 +1,5 @@ 'use client'; -import { Suspense } from 'react'; - import Link from 'next/link'; import type { Session } from '@supabase/supabase-js'; diff --git a/apps/web/app/layout.tsx b/apps/web/app/layout.tsx index 5d3db81d4..fefb88ed7 100644 --- a/apps/web/app/layout.tsx +++ b/apps/web/app/layout.tsx @@ -23,13 +23,12 @@ export default async function RootLayout({ }: { children: React.ReactNode; }) { - const i18n = await createI18nServerInstance(); - const lang = i18n.language; + const { language } = await createI18nServerInstance(); return ( - + - {children} + {children} diff --git a/apps/web/config/feature-flags.config.ts b/apps/web/config/feature-flags.config.ts index 9dde03afd..43dbbcade 100644 --- a/apps/web/config/feature-flags.config.ts +++ b/apps/web/config/feature-flags.config.ts @@ -3,11 +3,11 @@ import { z } from 'zod'; const FeatureFlagsSchema = z.object({ enableThemeSwitcher: z.boolean(), enableAccountDeletion: z.boolean(), - enableOrganizationDeletion: z.boolean(), - enableOrganizationAccounts: z.boolean(), - enableOrganizationCreation: z.boolean(), + enableTeamDeletion: z.boolean(), + enableTeamAccounts: z.boolean(), + enableTeamCreation: z.boolean(), enablePersonalAccountBilling: z.boolean(), - enableOrganizationBilling: z.boolean(), + enableTeamAccountBilling: z.boolean(), }); const featuresFlagConfig = FeatureFlagsSchema.parse({ @@ -16,23 +16,23 @@ const featuresFlagConfig = FeatureFlagsSchema.parse({ process.env.NEXT_PUBLIC_ENABLE_ACCOUNT_DELETION, false, ), - enableOrganizationDeletion: getBoolean( - process.env.NEXT_PUBLIC_ENABLE_ORGANIZATION_DELETION, + enableTeamDeletion: getBoolean( + process.env.NEXT_PUBLIC_ENABLE_TEAM_DELETION, false, ), - enableOrganizationAccounts: getBoolean( - process.env.NEXT_PUBLIC_ENABLE_ORGANIZATION_ACCOUNTS, + enableTeamAccounts: getBoolean( + process.env.NEXT_PUBLIC_ENABLE_TEAM_ACCOUNTS, true, ), - enableOrganizationCreation: getBoolean( - process.env.NEXT_PUBLIC_ENABLE_ORGANIZATION_CREATION, + enableTeamCreation: getBoolean( + process.env.NEXT_PUBLIC_ENABLE_TEAMS_CREATION, true, ), enablePersonalAccountBilling: getBoolean( process.env.NEXT_PUBLIC_ENABLE_PERSONAL_ACCOUNT_BILLING, false, ), - enableOrganizationBilling: getBoolean( + enableTeamAccountBilling: getBoolean( process.env.NEXT_PUBLIC_ENABLE_ORGANIZATION_BILLING, false, ), diff --git a/apps/web/package.json b/apps/web/package.json index af471b38c..71c7379ef 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -17,31 +17,31 @@ "dependencies": { "@epic-web/invariant": "^1.0.0", "@hookform/resolvers": "^3.3.4", - "@kit/accounts": "^0.1.0", - "@kit/admin": "^0.1.0", - "@kit/auth": "^0.1.0", - "@kit/billing": "^0.1.0", - "@kit/billing-gateway": "^0.1.0", - "@kit/email-templates": "^0.1.0", - "@kit/i18n": "^0.1.0", - "@kit/mailers": "^0.1.0", - "@kit/shared": "^0.1.0", - "@kit/supabase": "^0.1.0", - "@kit/team-accounts": "^0.1.0", - "@kit/ui": "^0.1.0", - "@next/mdx": "^14.1.0", + "@kit/accounts": "workspace:^", + "@kit/admin": "workspace:^", + "@kit/auth": "workspace:^", + "@kit/billing": "workspace:^", + "@kit/billing-gateway": "workspace:^", + "@kit/email-templates": "workspace:^", + "@kit/i18n": "workspace:^", + "@kit/mailers": "workspace:^", + "@kit/shared": "workspace:^", + "@kit/supabase": "workspace:^", + "@kit/team-accounts": "workspace:^", + "@kit/ui": "workspace:^", + "@next/mdx": "^14.1.4", "@radix-ui/react-icons": "^1.3.0", "@supabase/ssr": "^0.1.0", "@supabase/supabase-js": "^2.40.0", "@tanstack/react-query": "5.28.6", - "@tanstack/react-query-next-experimental": "^5.28.6", - "@tanstack/react-table": "^8.11.3", + "@tanstack/react-query-next-experimental": "^5.28.9", + "@tanstack/react-table": "^8.15.0", "contentlayer": "0.3.4", - "date-fns": "^3.2.0", + "date-fns": "^3.6.0", "edge-csrf": "^1.0.9", "i18next": "^23.10.1", "i18next-resources-to-backend": "^1.2.0", - "next": "14.2.0-canary.44", + "next": "14.2.0-canary.46", "next-contentlayer": "0.3.4", "next-sitemap": "^4.2.3", "next-themes": "^0.2.1", @@ -49,7 +49,7 @@ "react-dom": "18.2.0", "react-hook-form": "^7.51.2", "react-i18next": "^14.1.0", - "recharts": "^2.10.3", + "recharts": "^2.12.3", "rehype-autolink-headings": "^7.1.0", "rehype-slug": "^6.0.0", "sonner": "^1.4.41", @@ -57,21 +57,21 @@ "zod": "^3.22.4" }, "devDependencies": { - "@kit/eslint-config": "^0.2.0", - "@kit/prettier-config": "^0.1.0", - "@kit/tailwind-config": "^0.1.0", - "@kit/tsconfig": "^0.1.0", + "@kit/eslint-config": "workspace:^", + "@kit/prettier-config": "workspace:^", + "@kit/tailwind-config": "workspace:^", + "@kit/tsconfig": "workspace:^", "@next/bundle-analyzer": "14.2.0-canary.44", - "@types/mdx": "^2.0.10", - "@types/node": "^20.11.5", - "@types/react": "^18.2.48", - "@types/react-dom": "^18.2.18", - "autoprefixer": "^10.4.17", - "dotenv-cli": "^7.3.0", - "eslint": "^8.56.0", - "prettier": "^3.2.4", + "@types/mdx": "^2.0.12", + "@types/node": "^20.11.30", + "@types/react": "^18.2.73", + "@types/react-dom": "^18.2.22", + "autoprefixer": "^10.4.19", + "dotenv-cli": "^7.4.1", + "eslint": "^8.57.0", + "prettier": "^3.2.5", "tailwindcss": "3.4.1", - "typescript": "^5.3.3" + "typescript": "^5.4.3" }, "eslintConfig": { "root": true, diff --git a/apps/web/public/locales/en/teams.json b/apps/web/public/locales/en/teams.json index b9a8b8a47..67ba54d3c 100644 --- a/apps/web/public/locales/en/teams.json +++ b/apps/web/public/locales/en/teams.json @@ -1,18 +1,24 @@ { - "generalTabLabel": "General", - "generalTabLabelSubheading": "Manage your Organization", + "settings": { + "pageTitle": "Settings", + "pageDescription": "Manage your Team details" + }, + "yourTeam": "Your Teams", + "createTeam": "Create Team", "membersTabLabel": "Members", "emailSettingsTab": "Email", "membersTabSubheading": "Manage and Invite members", - "inviteMembersPageSubheading": "Invite members to your organization", - "createOrganizationModalHeading": "Create Organization", - "organizationNameLabel": "Organization Name", - "createOrganizationSubmitLabel": "Create Organization", - "createOrganizationSuccess": "Organization created successfully", - "createOrganizationError": "Organization not created. Please try again.", - "createOrganizationLoading": "Creating organization...", + "inviteMembersPageSubheading": "Invite members to your Team", + "createTeamModalHeading": "Create Team", + "createTeamModalDescription": "Create a new Team to manage your projects and members.", + "teamNameLabel": "Team Name", + "teamNameDescription": "Your team name should be unique and descriptive", + "createTeamSubmitLabel": "Create Team", + "createTeamSuccess": "Team created successfully", + "createTeamError": "Team not created. Please try again.", + "createTeamLoading": "Creating team...", "settingsPageLabel": "General", - "createOrganizationDropdownLabel": "New organization", + "createTeamDropdownLabel": "New team", "changeRole": "Change Role", "removeMember": "Remove", "inviteMembersSuccess": "Members invited successfully!", @@ -26,7 +32,7 @@ "removeMemberErrorMessage": "Sorry, we encountered an error. Please try again", "removeMemberErrorHeading": "Sorry, we couldn't remove the selected member.", "removeMemberLoadingMessage": "Removing member...", - "removeMemberSubmitLabel": "Remove User from Organization", + "removeMemberSubmitLabel": "Remove User from Team", "chooseDifferentRoleError": "Role is the same as the current one", "updateRoleLoadingMessage": "Updating role...", "updateRoleSuccessMessage": "Role updated successfully", @@ -40,20 +46,20 @@ "deleteInviteErrorMessage": "Invite not deleted. Please try again.", "deleteInviteLoadingMessage": "Deleting invite. Please wait...", "confirmDeletingMemberInvite": "You are deleting the invite to {{ email }}", - "transferOwnershipDisclaimer": "You are transferring ownership of the selected organization to {{ member }}.", + "transferOwnershipDisclaimer": "You are transferring ownership of the selected team to {{ member }}.", "transferringOwnership": "Transferring ownership...", "transferOwnershipSuccess": "Ownership successfully transferred", "transferOwnershipError": "Sorry, we could not transfer ownership to the selected member. Please try again.", "deleteInviteSubmitLabel": "Delete Invite", "youBadgeLabel": "You", - "updateOrganizationLoadingMessage": "Updating Organization...", - "updateOrganizationSuccessMessage": "Organization successfully updated", - "updateOrganizationErrorMessage": "Could not update Organization. Please try again.", + "updateTeamLoadingMessage": "Updating Team...", + "updateTeamSuccessMessage": "Team successfully updated", + "updateTeamErrorMessage": "Could not update Team. Please try again.", "updateLogoErrorMessage": "Could not update Logo. Please try again.", - "organizationNameInputLabel": "Organization Name", - "organizationLogoInputHeading": "Upload your organization's Logo", - "organizationLogoInputSubheading": "Please choose a photo to upload as your organization logo.", - "updateOrganizationSubmitLabel": "Update Organization", + "teamNameInputLabel": "Team Name", + "teamLogoInputHeading": "Upload your team's Logo", + "teamLogoInputSubheading": "Please choose a photo to upload as your team logo.", + "updateTeamSubmitLabel": "Update Team", "inviteMembersPageHeading": "Invite Members", "goBackToMembersPage": "Go back to members", "membersPageHeading": "Members", @@ -62,31 +68,32 @@ "pendingInvitesSubheading": "Manage invites not yet accepted", "noPendingInvites": "No pending invites found", "loadingMembers": "Loading members...", - "loadMembersError": "Sorry, we couldn't fetch your organization's members.", - "loadInvitedMembersError": "Sorry, we couldn't fetch your organization's invited members.", + "loadMembersError": "Sorry, we couldn't fetch your team's members.", + "loadInvitedMembersError": "Sorry, we couldn't fetch your team's invited members.", "loadingInvitedMembers": "Loading invited members...", "invitedBadge": "Invited", "duplicateInviteEmailError": "You have already entered this email address", "invitingOwnAccountError": "Hey, that's your email!", "dangerZone": "Danger Zone", - "dangerZoneSubheading": "Delete or leave your organization", - "deleteOrganization": "Delete Organization", - "deleteOrganizationDescription": "This action cannot be undone. All data associated with this organization will be deleted.", - "deletingOrganization": "Deleting organization", - "deleteOrganizationModalHeading": "Deleting Organization", - "deleteOrganizationInputField": "Type the name of the organization to confirm", - "leaveOrganization": "Leave Organization", - "leavingOrganizationModalHeading": "Leaving Organization", - "leaveOrganizationDescription": "You will no longer have access to this organization.", - "deleteOrganizationDisclaimer": "You are deleting the organization {{ organizationName }}. This action cannot be undone.", - "leaveOrganizationDisclaimer": "You are leaving the organization {{ organizationName }}. You will no longer have access to it.", - "deleteOrganizationErrorHeading": "Sorry, we couldn't delete your organization.", - "leaveOrganizationErrorHeading": "Sorry, we couldn't leave your organization.", + "dangerZoneSubheading": "Delete or leave your team", + "deleteTeam": "Delete Team", + "deleteTeamDescription": "This action cannot be undone. All data associated with this team will be deleted.", + "deletingTeam": "Deleting team", + "deleteTeamModalHeading": "Deleting Team", + "deletingTeamDescription": "You are about to delete the team {{ teamName }}. This action cannot be undone.", + "deleteTeamInputField": "Type the name of the team to confirm", + "leaveTeam": "Leave Team", + "leavingTeamModalHeading": "Leaving Team", + "leaveTeamDescription": "You will no longer have access to this team.", + "deleteTeamDisclaimer": "You are deleting the team {{ teamName }}. This action cannot be undone.", + "leaveTeamDisclaimer": "You are leaving the team {{ teamName }}. You will no longer have access to it.", + "deleteTeamErrorHeading": "Sorry, we couldn't delete your team.", + "leaveTeamErrorHeading": "Sorry, we couldn't leave your team.", "searchMembersPlaceholder": "Search members", - "createOrganizationErrorHeading": "Sorry, we couldn't create your organization.", - "createOrganizationErrorMessage": "We encountered an error creating your organization. Please try again.", - "transferOrganizationErrorHeading": "Sorry, we couldn't transfer ownership of your organization.", - "transferOrganizationErrorMessage": "We encountered an error transferring ownership of your organization. Please try again.", + "createTeamErrorHeading": "Sorry, we couldn't create your team.", + "createTeamErrorMessage": "We encountered an error creating your team. Please try again.", + "transferTeamErrorHeading": "Sorry, we couldn't transfer ownership of your team.", + "transferTeamErrorMessage": "We encountered an error transferring ownership of your team. Please try again.", "updateRoleErrorHeading": "Sorry, we couldn't update the role of the selected member.", "updateRoleErrorMessage": "We encountered an error updating the role of the selected member. Please try again." } diff --git a/package.json b/package.json index 5d07b095c..8765ea0e3 100644 --- a/package.json +++ b/package.json @@ -35,11 +35,12 @@ "supabase" ], "dependencies": { - "@manypkg/cli": "^0.21.2", - "@turbo/gen": "^1.11.3", + "@manypkg/cli": "^0.21.3", + "@turbo/gen": "^1.13.0", "cross-env": "^7.0.3", "pnpm": "^8.15.5", - "prettier": "^3.2.4", - "turbo": "^1.13.0" + "prettier": "^3.2.5", + "turbo": "^1.13.0", + "yarn": "^1.22.22" } } diff --git a/packages/billing-gateway/package.json b/packages/billing-gateway/package.json index 0fc405faa..82556995e 100644 --- a/packages/billing-gateway/package.json +++ b/packages/billing-gateway/package.json @@ -24,15 +24,15 @@ "zod": "^3.22.4" }, "devDependencies": { - "@kit/billing": "*", - "@kit/eslint-config": "0.2.0", - "@kit/prettier-config": "0.1.0", - "@kit/shared": "*", - "@kit/stripe": "*", - "@kit/supabase": "*", - "@kit/tailwind-config": "0.1.0", - "@kit/tsconfig": "0.1.0", - "@kit/ui": "*", + "@kit/billing": "^0.1.0", + "@kit/eslint-config": "workspace:*", + "@kit/prettier-config": "workspace:*", + "@kit/shared": "^0.1.0", + "@kit/stripe": "^0.1.0", + "@kit/supabase": "^0.1.0", + "@kit/tailwind-config": "workspace:*", + "@kit/tsconfig": "workspace:*", + "@kit/ui": "^0.1.0", "@supabase/supabase-js": "^2.40.0", "lucide-react": "^0.363.0", "zod": "^3.22.4" diff --git a/packages/billing-gateway/src/index.ts b/packages/billing-gateway/src/index.ts index 55fbd53d3..abb2865b6 100644 --- a/packages/billing-gateway/src/index.ts +++ b/packages/billing-gateway/src/index.ts @@ -1,3 +1,4 @@ -export * from './services/billing-gateway/billing-gateway.service'; -export * from './services/billing-gateway/billing-gateway-provider-factory'; -export * from './services/billing-event-handler/billing-gateway-provider-factory'; +export * from './server/services/billing-gateway/billing-gateway.service'; +export * from './server/services/billing-gateway/billing-gateway-provider-factory'; +export * from './server/services/billing-event-handler/billing-gateway-provider-factory'; +export * from './server/services/account-billing.service'; diff --git a/packages/billing-gateway/src/server/services/account-billing.service.ts b/packages/billing-gateway/src/server/services/account-billing.service.ts new file mode 100644 index 000000000..727e04e97 --- /dev/null +++ b/packages/billing-gateway/src/server/services/account-billing.service.ts @@ -0,0 +1,68 @@ +import { SupabaseClient } from '@supabase/supabase-js'; + +import { Logger } from '@kit/shared/logger'; +import { Database } from '@kit/supabase/database'; + +import { BillingGatewayService } from './billing-gateway/billing-gateway.service'; + +export class AccountBillingService { + private readonly namespace = 'accounts.billing'; + + constructor(private readonly client: SupabaseClient) {} + + async cancelAllAccountSubscriptions({ + accountId, + userId, + }: { + accountId: string; + userId: string; + }) { + Logger.info( + { + userId, + accountId, + name: this.namespace, + }, + 'Cancelling all subscriptions for account...', + ); + + const { data: subscriptions } = await this.client + .from('subscriptions') + .select('*') + .eq('account_id', accountId); + + const cancellationRequests = []; + + Logger.info( + { + userId, + subscriptions: subscriptions?.length ?? 0, + name: this.namespace, + }, + 'Cancelling all account subscriptions...', + ); + + for (const subscription of subscriptions ?? []) { + const gateway = new BillingGatewayService(subscription.billing_provider); + + cancellationRequests.push( + gateway.cancelSubscription({ + subscriptionId: subscription.id, + invoiceNow: true, + }), + ); + } + + // execute all cancellation requests + await Promise.all(cancellationRequests); + + Logger.info( + { + userId, + subscriptions: subscriptions?.length ?? 0, + name: this.namespace, + }, + 'Subscriptions cancelled successfully', + ); + } +} diff --git a/packages/billing-gateway/src/services/billing-event-handler/billing-event-handler.service.ts b/packages/billing-gateway/src/server/services/billing-event-handler/billing-event-handler.service.ts similarity index 100% rename from packages/billing-gateway/src/services/billing-event-handler/billing-event-handler.service.ts rename to packages/billing-gateway/src/server/services/billing-event-handler/billing-event-handler.service.ts diff --git a/packages/billing-gateway/src/services/billing-event-handler/billing-gateway-factory.service.ts b/packages/billing-gateway/src/server/services/billing-event-handler/billing-gateway-factory.service.ts similarity index 100% rename from packages/billing-gateway/src/services/billing-event-handler/billing-gateway-factory.service.ts rename to packages/billing-gateway/src/server/services/billing-event-handler/billing-gateway-factory.service.ts diff --git a/packages/billing-gateway/src/services/billing-event-handler/billing-gateway-provider-factory.ts b/packages/billing-gateway/src/server/services/billing-event-handler/billing-gateway-provider-factory.ts similarity index 100% rename from packages/billing-gateway/src/services/billing-event-handler/billing-gateway-provider-factory.ts rename to packages/billing-gateway/src/server/services/billing-event-handler/billing-gateway-provider-factory.ts diff --git a/packages/billing-gateway/src/services/billing-gateway/billing-gateway-factory.service.ts b/packages/billing-gateway/src/server/services/billing-gateway/billing-gateway-factory.service.ts similarity index 100% rename from packages/billing-gateway/src/services/billing-gateway/billing-gateway-factory.service.ts rename to packages/billing-gateway/src/server/services/billing-gateway/billing-gateway-factory.service.ts diff --git a/packages/billing-gateway/src/services/billing-gateway/billing-gateway-provider-factory.ts b/packages/billing-gateway/src/server/services/billing-gateway/billing-gateway-provider-factory.ts similarity index 100% rename from packages/billing-gateway/src/services/billing-gateway/billing-gateway-provider-factory.ts rename to packages/billing-gateway/src/server/services/billing-gateway/billing-gateway-provider-factory.ts diff --git a/packages/billing-gateway/src/services/billing-gateway/billing-gateway.service.ts b/packages/billing-gateway/src/server/services/billing-gateway/billing-gateway.service.ts similarity index 100% rename from packages/billing-gateway/src/services/billing-gateway/billing-gateway.service.ts rename to packages/billing-gateway/src/server/services/billing-gateway/billing-gateway.service.ts diff --git a/packages/billing/package.json b/packages/billing/package.json index 993c2951c..eabe42088 100644 --- a/packages/billing/package.json +++ b/packages/billing/package.json @@ -21,12 +21,12 @@ "zod": "^3.22.4" }, "devDependencies": { - "@kit/eslint-config": "0.2.0", - "@kit/prettier-config": "0.1.0", - "@kit/supabase": "0.1.0", - "@kit/tailwind-config": "0.1.0", - "@kit/tsconfig": "0.1.0", - "@kit/ui": "0.1.0", + "@kit/eslint-config": "workspace:*", + "@kit/prettier-config": "workspace:*", + "@kit/supabase": "workspace:*", + "@kit/tailwind-config": "workspace:*", + "@kit/tsconfig": "workspace:*", + "@kit/ui": "workspace:*", "lucide-react": "^0.363.0", "zod": "^3.22.4" }, diff --git a/packages/email-templates/package.json b/packages/email-templates/package.json index a6a9260c5..b2f8d195d 100644 --- a/packages/email-templates/package.json +++ b/packages/email-templates/package.json @@ -16,10 +16,10 @@ "@react-email/components": "0.0.15" }, "devDependencies": { - "@kit/eslint-config": "0.2.0", - "@kit/prettier-config": "0.1.0", - "@kit/tailwind-config": "0.1.0", - "@kit/tsconfig": "0.1.0" + "@kit/eslint-config": "workspace:*", + "@kit/prettier-config": "workspace:*", + "@kit/tailwind-config": "workspace:*", + "@kit/tsconfig": "workspace:*" }, "eslintConfig": { "root": true, diff --git a/packages/email-templates/src/invite.email.tsx b/packages/email-templates/src/invite.email.tsx index aef8586a3..a7bb74fe6 100644 --- a/packages/email-templates/src/invite.email.tsx +++ b/packages/email-templates/src/invite.email.tsx @@ -18,8 +18,8 @@ import { } from '@react-email/components'; interface Props { - organizationName: string; - organizationLogo?: string; + teamName: string; + teamLogo?: string; inviter: string | undefined; invitedUserEmail: string; link: string; @@ -38,7 +38,7 @@ export function renderInviteEmail(props: Props) { - Join {props.organizationName} on{' '} + Join {props.teamName} on{' '} {props.productName} @@ -46,16 +46,16 @@ export function renderInviteEmail(props: Props) { {props.inviter} has invited you to the{' '} - {props.organizationName} team on{' '} + {props.teamName} team on{' '} {props.productName}. - {props.organizationLogo && ( + {props.teamLogo && (
@@ -68,7 +68,7 @@ export function renderInviteEmail(props: Props) { className="rounded bg-[#000000] px-[20px] py-[12px] text-center text-[12px] font-semibold text-white no-underline" href={props.link} > - Join {props.organizationName} + Join {props.teamName}
diff --git a/packages/features/accounts/package.json b/packages/features/accounts/package.json index 442dfa2df..f1799554e 100644 --- a/packages/features/accounts/package.json +++ b/packages/features/accounts/package.json @@ -15,20 +15,23 @@ "./hooks/*": "./src/hooks/*.ts" }, "devDependencies": { - "@kit/billing-gateway": "*", - "@kit/email-templates": "*", - "@kit/mailers": "*", - "@kit/eslint-config": "0.2.0", - "@kit/prettier-config": "0.1.0", - "@kit/shared": "*", - "@kit/supabase": "*", - "@kit/tailwind-config": "0.1.0", - "@kit/tsconfig": "0.1.0", - "@kit/ui": "*", "@hookform/resolvers": "^3.3.4", + "@kit/billing-gateway": "^0.1.0", + "@kit/email-templates": "^0.1.0", + "@kit/eslint-config": "workspace:*", + "@kit/mailers": "^0.1.0", + "@kit/prettier-config": "workspace:*", + "@kit/shared": "^0.1.0", + "@kit/supabase": "^0.1.0", + "@kit/tailwind-config": "workspace:*", + "@kit/tsconfig": "workspace:*", + "@kit/ui": "^0.1.0", "@radix-ui/react-icons": "^1.3.0", + "@tanstack/react-query": "5.28.6", "lucide-react": "^0.363.0", "react-hook-form": "^7.51.2", + "react-i18next": "^14.1.0", + "sonner": "^1.4.41", "zod": "^3.22.4" }, "peerDependencies": { @@ -36,7 +39,8 @@ "@kit/supabase": "0.1.0", "@kit/ui": "0.1.0", "@radix-ui/react-icons": "^1.3.0", - "lucide-react": "^0.363.0" + "lucide-react": "^0.363.0", + "sonner": "^1.4.41" }, "prettier": "@kit/prettier-config", "eslintConfig": { diff --git a/packages/features/accounts/src/components/account-selector.tsx b/packages/features/accounts/src/components/account-selector.tsx index 3bca1663e..980ef9be4 100644 --- a/packages/features/accounts/src/components/account-selector.tsx +++ b/packages/features/accounts/src/components/account-selector.tsx @@ -17,6 +17,7 @@ import { } from '@kit/ui/command'; import { If } from '@kit/ui/if'; import { Popover, PopoverContent, PopoverTrigger } from '@kit/ui/popover'; +import { Trans } from '@kit/ui/trans'; import { cn } from '@kit/ui/utils'; import { CreateTeamAccountDialog } from '../../../team-accounts/src/components/create-team-account-dialog'; @@ -29,8 +30,8 @@ interface AccountSelectorProps { }>; features: { - enableOrganizationAccounts: boolean; - enableOrganizationCreation: boolean; + enableTeamAccounts: boolean; + enableTeamCreation: boolean; }; selectedAccount?: string; @@ -46,8 +47,8 @@ export function AccountSelector({ selectedAccount, onAccountChange, features = { - enableOrganizationAccounts: true, - enableOrganizationCreation: true, + enableTeamAccounts: true, + enableTeamCreation: true, }, collapsed = false, }: React.PropsWithChildren) { @@ -75,6 +76,10 @@ export function AccountSelector({ const selected = accounts.find((account) => account.value === value); + if (!features.enableTeamAccounts) { + return null; + } + return ( <> @@ -150,9 +155,9 @@ export function AccountSelector({ - + 0}> - + }> {(accounts ?? []).map((account) => ( - + @@ -207,7 +214,7 @@ export function AccountSelector({ - + - onUnenrollRequested(props.factorId)} - > - - + + + + - - - + onUnenrollRequested(props.factorId)} + > + + + ); diff --git a/packages/features/accounts/src/components/personal-account-settings/mfa/multi-factor-auth-setup-dialog.tsx b/packages/features/accounts/src/components/personal-account-settings/mfa/multi-factor-auth-setup-dialog.tsx index fcbf33ba3..52a30e032 100644 --- a/packages/features/accounts/src/components/personal-account-settings/mfa/multi-factor-auth-setup-dialog.tsx +++ b/packages/features/accounts/src/components/personal-account-settings/mfa/multi-factor-auth-setup-dialog.tsx @@ -212,20 +212,22 @@ function MultiFactorAuthSetupForm({ name={'verificationCode'} /> - +
+ - + +
@@ -362,13 +364,15 @@ function FactorNameForm( }} /> - +
+ - + +
diff --git a/packages/features/accounts/src/components/personal-account-settings/update-account-details-form-container.tsx b/packages/features/accounts/src/components/personal-account-settings/update-account-details-form-container.tsx index aacf92616..79b4475ba 100644 --- a/packages/features/accounts/src/components/personal-account-settings/update-account-details-form-container.tsx +++ b/packages/features/accounts/src/components/personal-account-settings/update-account-details-form-container.tsx @@ -1,5 +1,7 @@ 'use client'; +import { LoadingOverlay } from '@kit/ui/loading-overlay'; + import { usePersonalAccountData, useRevalidatePersonalAccountDataQuery, @@ -8,7 +10,11 @@ import { UpdateAccountDetailsForm } from './update-account-details-form'; export function UpdateAccountDetailsFormContainer() { const user = usePersonalAccountData(); - const invalidateUserDataQuery = useRevalidatePersonalAccountDataQuery(); + const revalidateUserDataQuery = useRevalidatePersonalAccountDataQuery(); + + if (user.isLoading) { + return ; + } if (!user.data) { return null; @@ -18,7 +24,7 @@ export function UpdateAccountDetailsFormContainer() { ); } diff --git a/packages/features/accounts/src/server/personal-accounts-server-actions.ts b/packages/features/accounts/src/server/personal-accounts-server-actions.ts index 572d0e311..e04830781 100644 --- a/packages/features/accounts/src/server/personal-accounts-server-actions.ts +++ b/packages/features/accounts/src/server/personal-accounts-server-actions.ts @@ -8,7 +8,7 @@ import { Logger } from '@kit/shared/logger'; import { requireAuth } from '@kit/supabase/require-auth'; import { getSupabaseServerActionClient } from '@kit/supabase/server-actions-client'; -import { PersonalAccountsService } from './services/personal-accounts.service'; +import { DeletePersonalAccountService } from './services/delete-personal-account.service'; const emailSettings = getEmailSettingsFromEnvironment(); @@ -41,7 +41,7 @@ export async function deletePersonalAccountAction(formData: FormData) { const userEmail = session.data.user.email ?? null; // create a new instance of the personal accounts service - const service = new PersonalAccountsService(client); + const service = new DeletePersonalAccountService(); // delete the user's account and cancel all subscriptions await service.deletePersonalAccount({ diff --git a/packages/features/accounts/src/server/services/personal-accounts.service.ts b/packages/features/accounts/src/server/services/delete-personal-account.service.ts similarity index 61% rename from packages/features/accounts/src/server/services/personal-accounts.service.ts rename to packages/features/accounts/src/server/services/delete-personal-account.service.ts index bd6244567..9bf3f22c1 100644 --- a/packages/features/accounts/src/server/services/personal-accounts.service.ts +++ b/packages/features/accounts/src/server/services/delete-personal-account.service.ts @@ -1,27 +1,28 @@ import { SupabaseClient } from '@supabase/supabase-js'; -import { BillingGatewayService } from '@kit/billing-gateway'; +import { AccountBillingService } from '@kit/billing-gateway'; import { Mailer } from '@kit/mailers'; import { Logger } from '@kit/shared/logger'; import { Database } from '@kit/supabase/database'; /** - * @name PersonalAccountsService + * @name DeletePersonalAccountService * @description Service for managing accounts in the application * @param Database - The Supabase database type to use * @example * const client = getSupabaseClient(); - * const accountsService = new AccountsService(client); + * const accountsService = new DeletePersonalAccountService(); */ -export class PersonalAccountsService { - private namespace = 'account'; - - constructor(private readonly client: SupabaseClient) {} +export class DeletePersonalAccountService { + private namespace = 'accounts.delete'; /** * @name deletePersonalAccount * Delete personal account of a user. * This will delete the user from the authentication provider and cancel all subscriptions. + * + * Permissions are not checked here, as they are checked in the server action. + * USE WITH CAUTION. THE USER MUST HAVE THE NECESSARY PERMISSIONS. */ async deletePersonalAccount(params: { adminClient: SupabaseClient; @@ -39,6 +40,11 @@ export class PersonalAccountsService { 'User requested deletion. Processing...', ); + // Cancel all user subscriptions + const billingService = new AccountBillingService(params.adminClient); + + await billingService.cancelAllAccountSubscriptions(params.userId); + // execute the deletion of the user try { await params.adminClient.auth.admin.deleteUser(params.userId); @@ -55,17 +61,6 @@ export class PersonalAccountsService { throw new Error('Error deleting user'); } - // Cancel all user subscriptions - try { - await this.cancelAllUserSubscriptions(params.userId); - } catch (error) { - Logger.error({ - userId: params.userId, - error, - name: this.namespace, - }); - } - // Send account deletion email if (params.userEmail) { try { @@ -117,53 +112,4 @@ export class PersonalAccountsService { html, }); } - - private async cancelAllUserSubscriptions(userId: string) { - Logger.info( - { - userId, - name: this.namespace, - }, - 'Cancelling all subscriptions for user...', - ); - - const { data: subscriptions } = await this.client - .from('subscriptions') - .select('*') - .eq('account_id', userId); - - const cancellationRequests = []; - - Logger.info( - { - userId, - subscriptions: subscriptions?.length ?? 0, - name: this.namespace, - }, - 'Cancelling subscriptions...', - ); - - for (const subscription of subscriptions ?? []) { - const gateway = new BillingGatewayService(subscription.billing_provider); - - cancellationRequests.push( - gateway.cancelSubscription({ - subscriptionId: subscription.id, - invoiceNow: true, - }), - ); - } - - // execute all cancellation requests - await Promise.all(cancellationRequests); - - Logger.info( - { - userId, - subscriptions: subscriptions?.length ?? 0, - name: this.namespace, - }, - 'Subscriptions cancelled successfully', - ); - } } diff --git a/packages/features/admin/package.json b/packages/features/admin/package.json index 0e416ae0b..5e7c429fd 100644 --- a/packages/features/admin/package.json +++ b/packages/features/admin/package.json @@ -13,13 +13,13 @@ "@kit/ui": "0.1.0" }, "devDependencies": { - "@kit/eslint-config": "0.2.0", - "@kit/prettier-config": "0.1.0", - "@kit/tailwind-config": "0.1.0", - "@kit/tsconfig": "0.1.0", - "@kit/ui": "*", - "@kit/supabase": "*", - "@supabase/supabase-js": "2.40.0", + "@kit/eslint-config": "workspace:*", + "@kit/prettier-config": "workspace:*", + "@kit/supabase": "^0.1.0", + "@kit/tailwind-config": "workspace:*", + "@kit/tsconfig": "workspace:*", + "@kit/ui": "^0.1.0", + "@supabase/supabase-js": "^2.40.0", "lucide-react": "^0.363.0" }, "exports": { diff --git a/packages/features/auth/package.json b/packages/features/auth/package.json index 1d470bb96..b71cc75e0 100644 --- a/packages/features/auth/package.json +++ b/packages/features/auth/package.json @@ -16,13 +16,14 @@ "./mfa": "./src/mfa.ts" }, "devDependencies": { - "@kit/eslint-config": "0.2.0", - "@kit/prettier-config": "0.1.0", - "@kit/shared": "0.1.0", - "@kit/supabase": "0.1.0", - "@kit/tailwind-config": "0.1.0", - "@kit/tsconfig": "0.1.0", - "@kit/ui": "0.1.0", + "@hookform/resolvers": "^3.3.4", + "@kit/eslint-config": "workspace:*", + "@kit/prettier-config": "workspace:*", + "@kit/shared": "workspace:*", + "@kit/supabase": "workspace:*", + "@kit/tailwind-config": "workspace:*", + "@kit/tsconfig": "workspace:*", + "@kit/ui": "workspace:*", "@radix-ui/react-icons": "^1.3.0", "@tanstack/react-query": "5.28.6", "react-i18next": "^14.1.0", diff --git a/packages/features/team-accounts/package.json b/packages/features/team-accounts/package.json index 6f1fec1bd..cc2e49e9f 100644 --- a/packages/features/team-accounts/package.json +++ b/packages/features/team-accounts/package.json @@ -12,18 +12,21 @@ "./components": "./src/components/index.ts" }, "devDependencies": { - "@kit/accounts": "*", - "@kit/email-templates": "*", - "@kit/eslint-config": "0.2.0", - "@kit/mailers": "*", - "@kit/prettier-config": "0.1.0", - "@kit/shared": "*", - "@kit/supabase": "*", - "@kit/tailwind-config": "0.1.0", - "@kit/tsconfig": "0.1.0", - "@kit/ui": "*", "@hookform/resolvers": "^3.3.4", - "lucide-react": "^0.363.0" + "@kit/accounts": "^0.1.0", + "@kit/billing-gateway": "workspace:*", + "@kit/email-templates": "^0.1.0", + "@kit/eslint-config": "workspace:*", + "@kit/mailers": "^0.1.0", + "@kit/prettier-config": "workspace:*", + "@kit/shared": "^0.1.0", + "@kit/supabase": "^0.1.0", + "@kit/tailwind-config": "workspace:*", + "@kit/tsconfig": "workspace:*", + "@kit/ui": "^0.1.0", + "@tanstack/react-query": "5.28.6", + "lucide-react": "^0.363.0", + "react-i18next": "^14.1.0" }, "peerDependencies": { "@kit/accounts": "0.1.0", diff --git a/packages/features/team-accounts/src/actions/delete-team-account-server-actions.ts b/packages/features/team-accounts/src/actions/delete-team-account-server-actions.ts deleted file mode 100644 index f3f9e1feb..000000000 --- a/packages/features/team-accounts/src/actions/delete-team-account-server-actions.ts +++ /dev/null @@ -1,17 +0,0 @@ -'use server'; - -import { getSupabaseServerActionClient } from '@kit/supabase/server-actions-client'; - -import { DeleteTeamAccountSchema } from '../schema/delete-team-account.schema'; -import { DeleteTeamAccountService } from '../services/delete-team-account.service'; - -export async function deleteTeamAccountAction(formData: FormData) { - const body = Object.fromEntries(formData.entries()); - const params = DeleteTeamAccountSchema.parse(body); - const client = getSupabaseServerActionClient(); - const service = new DeleteTeamAccountService(client); - - await service.deleteTeamAccount(params); - - return { success: true }; -} diff --git a/packages/features/team-accounts/src/components/create-team-account-dialog.tsx b/packages/features/team-accounts/src/components/create-team-account-dialog.tsx index db20ddef1..a60a81c61 100644 --- a/packages/features/team-accounts/src/components/create-team-account-dialog.tsx +++ b/packages/features/team-accounts/src/components/create-team-account-dialog.tsx @@ -6,7 +6,13 @@ import { z } from 'zod'; import { Alert, AlertDescription, AlertTitle } from '@kit/ui/alert'; import { Button } from '@kit/ui/button'; -import { Dialog, DialogContent, DialogTitle } from '@kit/ui/dialog'; +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, +} from '@kit/ui/dialog'; import { Form, FormControl, @@ -20,8 +26,8 @@ import { If } from '@kit/ui/if'; import { Input } from '@kit/ui/input'; import { Trans } from '@kit/ui/trans'; -import { createOrganizationAccountAction } from '../actions/create-team-account-server-actions'; import { CreateTeamSchema } from '../schema/create-team.schema'; +import { createOrganizationAccountAction } from '../server/actions/create-team-account-server-actions'; export function CreateTeamAccountDialog( props: React.PropsWithChildren<{ @@ -31,18 +37,27 @@ export function CreateTeamAccountDialog( ) { return ( - - - - + e.preventDefault()} + onInteractOutside={(e) => e.preventDefault()} + > + + + + - + + + + + + props.setIsOpen(false)} /> ); } -function CreateOrganizationAccountForm() { +function CreateOrganizationAccountForm(props: { onClose: () => void }) { const [error, setError] = useState(); const [pending, startTransition] = useTransition(); @@ -77,12 +92,12 @@ function CreateOrganizationAccountForm() { return ( - + - Your organization name should be unique and descriptive. + @@ -101,12 +116,20 @@ function CreateOrganizationAccountForm() { }} /> - +
+ + + +
@@ -117,11 +140,11 @@ function CreateOrganizationErrorAlert() { return ( - + - + ); diff --git a/packages/features/team-accounts/src/components/index.ts b/packages/features/team-accounts/src/components/index.ts index f59ad957f..69c53e978 100644 --- a/packages/features/team-accounts/src/components/index.ts +++ b/packages/features/team-accounts/src/components/index.ts @@ -1,5 +1,5 @@ export * from './members/account-members-table'; -export * from './update-organization-form'; export * from './members/invite-members-dialog-container'; -export * from './team-account-danger-zone'; +export * from './settings/team-account-danger-zone'; export * from './invitations/account-invitations-table'; +export * from './settings/team-account-settings-container'; diff --git a/packages/features/team-accounts/src/components/invitations/account-invitations-table.tsx b/packages/features/team-accounts/src/components/invitations/account-invitations-table.tsx index 5e34e0155..11f2d5b4e 100644 --- a/packages/features/team-accounts/src/components/invitations/account-invitations-table.tsx +++ b/packages/features/team-accounts/src/components/invitations/account-invitations-table.tsx @@ -18,7 +18,7 @@ import { If } from '@kit/ui/if'; import { Input } from '@kit/ui/input'; import { ProfileAvatar } from '@kit/ui/profile-avatar'; -import { RoleBadge } from '../role-badge'; +import { RoleBadge } from '../members/role-badge'; import { DeleteInvitationDialog } from './delete-invitation-dialog'; import { UpdateInvitationDialog } from './update-invitation-dialog'; diff --git a/packages/features/team-accounts/src/components/invitations/delete-invitation-dialog.tsx b/packages/features/team-accounts/src/components/invitations/delete-invitation-dialog.tsx index 85d85946c..a3ce69aed 100644 --- a/packages/features/team-accounts/src/components/invitations/delete-invitation-dialog.tsx +++ b/packages/features/team-accounts/src/components/invitations/delete-invitation-dialog.tsx @@ -12,7 +12,7 @@ import { import { If } from '@kit/ui/if'; import { Trans } from '@kit/ui/trans'; -import { deleteInvitationAction } from '../../actions/account-invitations-server-actions'; +import { deleteInvitationAction } from '../../server/actions/team-invitations-server-actions'; export const DeleteInvitationDialog: React.FC<{ isOpen: boolean; @@ -24,7 +24,7 @@ export const DeleteInvitationDialog: React.FC<{ - + diff --git a/packages/features/team-accounts/src/components/invitations/update-invitation-dialog.tsx b/packages/features/team-accounts/src/components/invitations/update-invitation-dialog.tsx index a25ca5e8c..cbebc3db3 100644 --- a/packages/features/team-accounts/src/components/invitations/update-invitation-dialog.tsx +++ b/packages/features/team-accounts/src/components/invitations/update-invitation-dialog.tsx @@ -25,9 +25,9 @@ import { import { If } from '@kit/ui/if'; import { Trans } from '@kit/ui/trans'; -import { updateInvitationAction } from '../../actions/account-invitations-server-actions'; import { UpdateRoleSchema } from '../../schema/update-role-schema'; -import { MembershipRoleSelector } from '../membership-role-selector'; +import { updateInvitationAction } from '../../server/actions/team-invitations-server-actions'; +import { MembershipRoleSelector } from '../members/membership-role-selector'; type Role = Database['public']['Enums']['account_role']; diff --git a/packages/features/team-accounts/src/components/members/account-members-table.tsx b/packages/features/team-accounts/src/components/members/account-members-table.tsx index ef2273db4..67d4314d2 100644 --- a/packages/features/team-accounts/src/components/members/account-members-table.tsx +++ b/packages/features/team-accounts/src/components/members/account-members-table.tsx @@ -18,8 +18,8 @@ import { If } from '@kit/ui/if'; import { Input } from '@kit/ui/input'; import { ProfileAvatar } from '@kit/ui/profile-avatar'; -import { RoleBadge } from '../role-badge'; import { RemoveMemberDialog } from './remove-member-dialog'; +import { RoleBadge } from './role-badge'; import { TransferOwnershipDialog } from './transfer-ownership-dialog'; import { UpdateMemberRoleDialog } from './update-member-role-dialog'; diff --git a/packages/features/team-accounts/src/components/members/invite-members-dialog-container.tsx b/packages/features/team-accounts/src/components/members/invite-members-dialog-container.tsx index 5bfcea71d..f3cb55035 100644 --- a/packages/features/team-accounts/src/components/members/invite-members-dialog-container.tsx +++ b/packages/features/team-accounts/src/components/members/invite-members-dialog-container.tsx @@ -33,9 +33,9 @@ import { } from '@kit/ui/tooltip'; import { Trans } from '@kit/ui/trans'; -import { createInvitationsAction } from '../../actions/account-invitations-server-actions'; import { InviteMembersSchema } from '../../schema/invite-members.schema'; -import { MembershipRoleSelector } from '../membership-role-selector'; +import { createInvitationsAction } from '../../server/actions/team-invitations-server-actions'; +import { MembershipRoleSelector } from './membership-role-selector'; type InviteModel = ReturnType; @@ -59,8 +59,7 @@ export function InviteMembersDialogContainer({ Invite Members to Organization - Invite members to your organization by entering their email and - role. + Invite members to your team by entering their email and role. @@ -89,7 +88,7 @@ function InviteMembersForm({ onSubmit: (data: { invitations: InviteModel[] }) => void; pending: boolean; }) { - const { t } = useTranslation('organization'); + const { t } = useTranslation('team'); const form = useForm({ resolver: zodResolver(InviteMembersSchema), diff --git a/packages/features/team-accounts/src/components/membership-role-selector.tsx b/packages/features/team-accounts/src/components/members/membership-role-selector.tsx similarity index 100% rename from packages/features/team-accounts/src/components/membership-role-selector.tsx rename to packages/features/team-accounts/src/components/members/membership-role-selector.tsx diff --git a/packages/features/team-accounts/src/components/members/remove-member-dialog.tsx b/packages/features/team-accounts/src/components/members/remove-member-dialog.tsx index 942b97507..1e327d77e 100644 --- a/packages/features/team-accounts/src/components/members/remove-member-dialog.tsx +++ b/packages/features/team-accounts/src/components/members/remove-member-dialog.tsx @@ -12,7 +12,7 @@ import { import { If } from '@kit/ui/if'; import { Trans } from '@kit/ui/trans'; -import { removeMemberFromAccountAction } from '../../actions/account-members-server-actions'; +import { removeMemberFromAccountAction } from '../../server/actions/team-members-server-actions'; export const RemoveMemberDialog: React.FC<{ isOpen: boolean; @@ -25,11 +25,11 @@ export const RemoveMemberDialog: React.FC<{ - + - Remove this member from the organization. + Remove this member from the team. diff --git a/packages/features/team-accounts/src/components/role-badge.tsx b/packages/features/team-accounts/src/components/members/role-badge.tsx similarity index 100% rename from packages/features/team-accounts/src/components/role-badge.tsx rename to packages/features/team-accounts/src/components/members/role-badge.tsx diff --git a/packages/features/team-accounts/src/components/members/transfer-ownership-dialog.tsx b/packages/features/team-accounts/src/components/members/transfer-ownership-dialog.tsx index 478ee4b8b..81d4ae2ad 100644 --- a/packages/features/team-accounts/src/components/members/transfer-ownership-dialog.tsx +++ b/packages/features/team-accounts/src/components/members/transfer-ownership-dialog.tsx @@ -27,8 +27,8 @@ import { If } from '@kit/ui/if'; import { Input } from '@kit/ui/input'; import { Trans } from '@kit/ui/trans'; -import { transferOwnershipAction } from '../../actions/account-members-server-actions'; import { TransferOwnershipConfirmationSchema } from '../../schema/transfer-ownership-confirmation.schema'; +import { transferOwnershipAction } from '../../server/actions/team-members-server-actions'; export const TransferOwnershipDialog: React.FC<{ isOpen: boolean; @@ -42,11 +42,11 @@ export const TransferOwnershipDialog: React.FC<{ - + - Transfer ownership of the organization to another member. + Transfer ownership of the team to another member. diff --git a/packages/features/team-accounts/src/components/members/update-member-role-dialog.tsx b/packages/features/team-accounts/src/components/members/update-member-role-dialog.tsx index d3e1c6b5a..aa417442b 100644 --- a/packages/features/team-accounts/src/components/members/update-member-role-dialog.tsx +++ b/packages/features/team-accounts/src/components/members/update-member-role-dialog.tsx @@ -25,9 +25,9 @@ import { import { If } from '@kit/ui/if'; import { Trans } from '@kit/ui/trans'; -import { updateMemberRoleAction } from '../../actions/account-members-server-actions'; import { UpdateRoleSchema } from '../../schema/update-role-schema'; -import { MembershipRoleSelector } from '../membership-role-selector'; +import { updateMemberRoleAction } from '../../server/actions/team-members-server-actions'; +import { MembershipRoleSelector } from './membership-role-selector'; type Role = Database['public']['Enums']['account_role']; diff --git a/packages/features/team-accounts/src/components/settings/team-account-danger-zone.tsx b/packages/features/team-accounts/src/components/settings/team-account-danger-zone.tsx new file mode 100644 index 000000000..5c28b0680 --- /dev/null +++ b/packages/features/team-accounts/src/components/settings/team-account-danger-zone.tsx @@ -0,0 +1,336 @@ +'use client'; + +import { useFormStatus } from 'react-dom'; + +import { zodResolver } from '@hookform/resolvers/zod'; +import { useForm } from 'react-hook-form'; +import { z } from 'zod'; + +import { Alert, AlertDescription, AlertTitle } from '@kit/ui/alert'; +import { + AlertDialog, + AlertDialogCancel, + AlertDialogContent, + AlertDialogDescription, + AlertDialogFooter, + AlertDialogHeader, + AlertDialogTitle, + AlertDialogTrigger, +} from '@kit/ui/alert-dialog'; +import { Button } from '@kit/ui/button'; +import { ErrorBoundary } from '@kit/ui/error-boundary'; +import { + Form, + FormControl, + FormDescription, + FormField, + FormItem, + FormLabel, + FormMessage, +} from '@kit/ui/form'; +import { Input } from '@kit/ui/input'; +import { Trans } from '@kit/ui/trans'; + +import { deleteTeamAccountAction } from '../../server/actions/delete-team-account-server-actions'; +import { leaveTeamAccountAction } from '../../server/actions/leave-team-account-server-actions'; + +export function TeamAccountDangerZone({ + account, + userIsPrimaryOwner, +}: React.PropsWithChildren<{ + account: { + name: string; + id: string; + }; + + userIsPrimaryOwner: boolean; +}>) { + if (userIsPrimaryOwner) { + return ; + } + + return ; +} + +function DeleteTeamContainer(props: { + account: { + name: string; + id: string; + }; +}) { + return ( +
+
+ + + + +

+ +

+
+ +
+ + + + + + e.preventDefault()}> + + + + + + + + + + + + + +
+
+ ); +} + +function DeleteTeamConfirmationForm({ + name, + id, +}: { + name: string; + id: string; +}) { + const form = useForm({ + mode: 'onChange', + reValidateMode: 'onChange', + resolver: zodResolver( + z.object({ + name: z.string().refine((value) => value === name, { + message: 'Name does not match', + path: ['name'], + }), + }), + ), + defaultValues: { + name: '', + }, + }); + + return ( + }> +
+ +
+
+
+ +
+ +
+ +
+
+ + + + ( + + + + + + + + + + + + + + + + )} + name={'confirm'} + /> +
+ + + + + + + + +
+ +
+ ); +} + +function DeleteTeamSubmitButton() { + const { pending } = useFormStatus(); + + return ( + + ); +} + +function LeaveTeamContainer(props: { + account: { + name: string; + id: string; + }; +}) { + return ( +
+

+ +

+ +
+ + + + + + + + + + + + + + + + + }> +
+ + +
+ +
+
+
+
+ + + + + + + + +
+
+
+ ); +} + +function LeaveTeamSubmitButton() { + const { pending } = useFormStatus(); + + return ( + + ); +} + +function LeaveTeamErrorAlert() { + return ( + + + + + + + + + + ); +} + +function DeleteTeamErrorAlert() { + return ( + + + + + + + + + + ); +} diff --git a/packages/features/team-accounts/src/components/settings/team-account-settings-container.tsx b/packages/features/team-accounts/src/components/settings/team-account-settings-container.tsx new file mode 100644 index 000000000..dec250a78 --- /dev/null +++ b/packages/features/team-accounts/src/components/settings/team-account-settings-container.tsx @@ -0,0 +1,82 @@ +'use client'; + +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from '@kit/ui/card'; + +import { TeamAccountDangerZone } from './team-account-danger-zone'; +import { UpdateTeamAccountImage } from './update-team-account-image-container'; +import { UpdateTeamAccountNameForm } from './update-team-account-name-form'; + +export function TeamAccountSettingsContainer(props: { + account: { + name: string; + slug: string; + id: string; + pictureUrl: string | null; + primaryOwnerUserId: string; + }; + + userId: string; + + paths: { + teamAccountSettings: string; + }; +}) { + return ( +
+ + + Team Logo + + + Update your team's logo to make it easier to identify + + + + + + + + + + + Team Account Settings + + Manage your team account settings + + + + + + + + + + Danger Zone + + + Please be careful when making changes in this section as they are + irreversible. + + + + + + + +
+ ); +} diff --git a/packages/features/team-accounts/src/components/settings/update-team-account-image-container.tsx b/packages/features/team-accounts/src/components/settings/update-team-account-image-container.tsx new file mode 100644 index 000000000..6c4e871ca --- /dev/null +++ b/packages/features/team-accounts/src/components/settings/update-team-account-image-container.tsx @@ -0,0 +1,141 @@ +'use client'; + +import { useCallback } from 'react'; + +import type { SupabaseClient } from '@supabase/supabase-js'; + +import { useTranslation } from 'react-i18next'; +import { toast } from 'sonner'; + +import { useSupabase } from '@kit/supabase/hooks/use-supabase'; +import { ImageUploader } from '@kit/ui/image-uploader'; +import { Trans } from '@kit/ui/trans'; + +const AVATARS_BUCKET = 'account_image'; + +export function UpdateTeamAccountImage(props: { + account: { + id: string; + name: string; + pictureUrl: string | null; + }; +}) { + const client = useSupabase(); + const { t } = useTranslation('teams'); + + const createToaster = useCallback( + (promise: () => Promise) => { + return toast.promise(promise, { + success: t(`updateTeamSuccessMessage`), + error: t(`updateTeamErrorMessage`), + loading: t(`updateTeamLoadingMessage`), + }); + }, + [t], + ); + + const onValueChange = useCallback( + (file: File | null) => { + const removeExistingStorageFile = () => { + if (props.account.pictureUrl) { + return ( + deleteProfilePhoto(client, props.account.pictureUrl) ?? + Promise.resolve() + ); + } + + return Promise.resolve(); + }; + + if (file) { + const promise = () => + removeExistingStorageFile().then(() => + uploadUserProfilePhoto(client, file, props.account.id).then( + (pictureUrl) => { + return client + .from('accounts') + .update({ + picture_url: pictureUrl, + }) + .eq('id', props.account.id) + .throwOnError(); + }, + ), + ); + + createToaster(promise); + } else { + const promise = () => + removeExistingStorageFile().then(() => { + return client + .from('accounts') + .update({ + picture_url: null, + }) + .eq('id', props.account.id) + .throwOnError(); + }); + + createToaster(promise); + } + }, + [client, createToaster, props], + ); + + return ( + +
+ + + + + + + +
+
+ ); +} + +function deleteProfilePhoto(client: SupabaseClient, url: string) { + const bucket = client.storage.from(AVATARS_BUCKET); + const fileName = url.split('/').pop()?.split('?')[0]; + + if (!fileName) { + return; + } + + return bucket.remove([fileName]); +} + +async function uploadUserProfilePhoto( + client: SupabaseClient, + photoFile: File, + userId: string, +) { + const bytes = await photoFile.arrayBuffer(); + const bucket = client.storage.from(AVATARS_BUCKET); + const extension = photoFile.name.split('.').pop(); + const fileName = await getAvatarFileName(userId, extension); + + const result = await bucket.upload(fileName, bytes); + + if (!result.error) { + return bucket.getPublicUrl(fileName).data.publicUrl; + } + + throw result.error; +} + +async function getAvatarFileName( + userId: string, + extension: string | undefined, +) { + const { nanoid } = await import('nanoid'); + const uniqueId = nanoid(16); + + return `${userId}.${extension}?v=${uniqueId}`; +} diff --git a/packages/features/team-accounts/src/components/update-organization-form.tsx b/packages/features/team-accounts/src/components/settings/update-team-account-name-form.tsx similarity index 53% rename from packages/features/team-accounts/src/components/update-organization-form.tsx rename to packages/features/team-accounts/src/components/settings/update-team-account-name-form.tsx index a97d29503..78f8f1f16 100644 --- a/packages/features/team-accounts/src/components/update-organization-form.tsx +++ b/packages/features/team-accounts/src/components/settings/update-team-account-name-form.tsx @@ -1,14 +1,11 @@ 'use client'; -import { useCallback } from 'react'; +import { useTransition } from 'react'; import { zodResolver } from '@hookform/resolvers/zod'; import { useForm } from 'react-hook-form'; -import { useTranslation } from 'react-i18next'; -import { toast } from 'sonner'; import { z } from 'zod'; -import { useUpdateAccountData } from '@kit/accounts/hooks/use-update-account'; import { Button } from '@kit/ui/button'; import { Form, @@ -20,44 +17,42 @@ import { import { Input } from '@kit/ui/input'; import { Trans } from '@kit/ui/trans'; +import { updateTeamAccountName } from '../../server/actions/team-details-server-actions'; + const Schema = z.object({ name: z.string().min(1).max(255), }); -export const UpdateOrganizationForm = (props: { - accountId: string; - accountName: string; +export const UpdateTeamAccountNameForm = (props: { + account: { + name: string; + slug: string; + }; + + path: string; }) => { - const updateAccountData = useUpdateAccountData(props.accountId); - const { t } = useTranslation('organization'); + const [pending, startTransition] = useTransition(); const form = useForm({ resolver: zodResolver(Schema), defaultValues: { - name: props.accountName, + name: props.account.name, }, }); - const updateOrganizationData = useCallback( - (data: { name: string }) => { - const promise = updateAccountData.mutateAsync(data); - - toast.promise(promise, { - loading: t(`updateOrganizationLoadingMessage`), - success: t(`updateOrganizationSuccessMessage`), - error: t(`updateOrganizationErrorMessage`), - }); - }, - [t, updateAccountData], - ); - return (
{ - updateOrganizationData(data); + startTransition(async () => { + await updateTeamAccountName({ + slug: props.account.slug, + name: data.name, + path: props.path, + }); + }); })} > - + ); }} - > + />
diff --git a/packages/features/team-accounts/src/components/team-account-danger-zone.tsx b/packages/features/team-accounts/src/components/team-account-danger-zone.tsx deleted file mode 100644 index b005213f5..000000000 --- a/packages/features/team-accounts/src/components/team-account-danger-zone.tsx +++ /dev/null @@ -1,262 +0,0 @@ -'use client'; - -import { useFormStatus } from 'react-dom'; - -import { Database } from '@kit/supabase/database'; -import { Alert, AlertDescription, AlertTitle } from '@kit/ui/alert'; -import { Button } from '@kit/ui/button'; -import { - Dialog, - DialogContent, - DialogHeader, - DialogTitle, - DialogTrigger, -} from '@kit/ui/dialog'; -import { ErrorBoundary } from '@kit/ui/error-boundary'; -import { Heading } from '@kit/ui/heading'; -import { Input } from '@kit/ui/input'; -import { Label } from '@kit/ui/label'; -import { Trans } from '@kit/ui/trans'; - -import { deleteTeamAccountAction } from '../actions/delete-team-account-server-actions'; -import { leaveTeamAccountAction } from '../actions/leave-team-account-server-actions'; - -type AccountData = - Database['public']['Functions']['organization_account_workspace']['Returns'][0]; - -export function TeamAccountDangerZone({ - account, - userId, -}: React.PropsWithChildren<{ - account: AccountData; - userId: string; -}>) { - const isPrimaryOwner = userId === account.primary_owner_user_id; - - if (isPrimaryOwner) { - return ; - } - - return ; -} - -function DeleteOrganizationContainer(props: { account: AccountData }) { - return ( -
-
- - - - -

- -

-
- -
- - - - - - - - - - - - - - - -
-
- ); -} - -function DeleteOrganizationForm({ name, id }: { name: string; id: string }) { - return ( - }> -
-
-
-
- -
- -
- -
-
- - - - -
- -
- -
-
-
- ); -} - -function DeleteOrganizationSubmitButton() { - const { pending } = useFormStatus(); - - return ( - - ); -} - -function LeaveOrganizationContainer(props: { account: AccountData }) { - return ( -
-

- -

- -
- - - - - - - - - - - - - }> -
- - -
-
-
- -
-
- -
- -
-
-
-
-
-
-
-
- ); -} - -function LeaveOrganizationSubmitButton() { - const { pending } = useFormStatus(); - - return ( - - ); -} - -function LeaveOrganizationErrorAlert() { - return ( - - - - - - - - - - ); -} - -function DeleteOrganizationErrorAlert() { - return ( - - - - - - - - - - ); -} diff --git a/packages/features/team-accounts/src/actions/create-team-account-server-actions.ts b/packages/features/team-accounts/src/server/actions/create-team-account-server-actions.ts similarity index 89% rename from packages/features/team-accounts/src/actions/create-team-account-server-actions.ts rename to packages/features/team-accounts/src/server/actions/create-team-account-server-actions.ts index aeee87d83..b17938f7a 100644 --- a/packages/features/team-accounts/src/actions/create-team-account-server-actions.ts +++ b/packages/features/team-accounts/src/server/actions/create-team-account-server-actions.ts @@ -8,7 +8,7 @@ import { Logger } from '@kit/shared/logger'; import { requireAuth } from '@kit/supabase/require-auth'; import { getSupabaseServerActionClient } from '@kit/supabase/server-actions-client'; -import { CreateTeamSchema } from '../schema/create-team.schema'; +import { CreateTeamSchema } from '../../schema/create-team.schema'; import { CreateTeamAccountService } from '../services/create-team-account.service'; const TEAM_ACCOUNTS_HOME_PATH = z @@ -45,10 +45,10 @@ export async function createOrganizationAccountAction( error: createAccountResponse.error, name: 'accounts', }, - `Error creating organization account`, + `Error creating team account`, ); - throw new Error('Error creating organization account'); + throw new Error('Error creating team account'); } const accountHomePath = diff --git a/packages/features/team-accounts/src/server/actions/delete-team-account-server-actions.ts b/packages/features/team-accounts/src/server/actions/delete-team-account-server-actions.ts new file mode 100644 index 000000000..6bff8cbeb --- /dev/null +++ b/packages/features/team-accounts/src/server/actions/delete-team-account-server-actions.ts @@ -0,0 +1,60 @@ +'use server'; + +import { redirect } from 'next/navigation'; + +import { SupabaseClient } from '@supabase/supabase-js'; + +import { Database } from '@kit/supabase/database'; +import { requireAuth } from '@kit/supabase/require-auth'; +import { getSupabaseServerActionClient } from '@kit/supabase/server-actions-client'; + +import { DeleteTeamAccountSchema } from '../../schema/delete-team-account.schema'; +import { DeleteTeamAccountService } from '../services/delete-team-account.service'; + +export async function deleteTeamAccountAction(formData: FormData) { + const params = DeleteTeamAccountSchema.parse( + Object.fromEntries(formData.entries()), + ); + + const client = getSupabaseServerActionClient(); + + // Check if the user has the necessary permissions to delete the team account + await assertUserPermissionsToDeleteTeamAccount(client, params.accountId); + + // Get the Supabase client and create a new service instance. + const service = new DeleteTeamAccountService(); + + // Delete the team account and all associated data. + await service.deleteTeamAccount( + getSupabaseServerActionClient({ + admin: true, + }), + params, + ); + + return redirect('/home'); +} + +async function assertUserPermissionsToDeleteTeamAccount( + client: SupabaseClient, + accountId: string, +) { + const auth = await requireAuth(client); + + if (auth.error ?? !auth.data.user.id) { + throw new Error('Authentication required'); + } + + const userId = auth.data.user.id; + + const { data, error } = await client + .from('accounts') + .select('id') + .eq('primary_owner_user_id', userId) + .eq('is_personal_account', false) + .eq('id', accountId); + + if (error ?? !data) { + throw new Error('Account not found'); + } +} diff --git a/packages/features/team-accounts/src/actions/leave-team-account-server-actions.ts b/packages/features/team-accounts/src/server/actions/leave-team-account-server-actions.ts similarity index 86% rename from packages/features/team-accounts/src/actions/leave-team-account-server-actions.ts rename to packages/features/team-accounts/src/server/actions/leave-team-account-server-actions.ts index a450b2ba4..06f53859a 100644 --- a/packages/features/team-accounts/src/actions/leave-team-account-server-actions.ts +++ b/packages/features/team-accounts/src/server/actions/leave-team-account-server-actions.ts @@ -2,7 +2,7 @@ import { getSupabaseServerActionClient } from '@kit/supabase/server-actions-client'; -import { LeaveTeamAccountSchema } from '../schema/leave-team-account.schema'; +import { LeaveTeamAccountSchema } from '../../schema/leave-team-account.schema'; import { LeaveAccountService } from '../services/leave-account.service'; export async function leaveTeamAccountAction(formData: FormData) { diff --git a/packages/features/team-accounts/src/server/actions/team-details-server-actions.ts b/packages/features/team-accounts/src/server/actions/team-details-server-actions.ts new file mode 100644 index 000000000..97bb0cfcd --- /dev/null +++ b/packages/features/team-accounts/src/server/actions/team-details-server-actions.ts @@ -0,0 +1,39 @@ +'use server'; + +import { redirect } from 'next/navigation'; + +import { getSupabaseServerComponentClient } from '@kit/supabase/server-component-client'; + +export async function updateTeamAccountName(params: { + name: string; + slug: string; + path: string; +}) { + const client = getSupabaseServerComponentClient(); + + const { error, data } = await client + .from('accounts') + .update({ + name: params.name, + slug: params.slug, + }) + .match({ + slug: params.slug, + }) + .select('slug') + .single(); + + if (error) { + throw error; + } + + const newSlug = data.slug; + + if (newSlug) { + const path = params.path.replace('[account]', newSlug); + + redirect(path); + } + + return { success: true }; +} diff --git a/packages/features/team-accounts/src/actions/account-invitations-server-actions.ts b/packages/features/team-accounts/src/server/actions/team-invitations-server-actions.ts similarity index 90% rename from packages/features/team-accounts/src/actions/account-invitations-server-actions.ts rename to packages/features/team-accounts/src/server/actions/team-invitations-server-actions.ts index 53b92655d..eacf32ce6 100644 --- a/packages/features/team-accounts/src/actions/account-invitations-server-actions.ts +++ b/packages/features/team-accounts/src/server/actions/team-invitations-server-actions.ts @@ -9,9 +9,9 @@ import { z } from 'zod'; import { Database } from '@kit/supabase/database'; import { getSupabaseServerActionClient } from '@kit/supabase/server-actions-client'; -import { DeleteInvitationSchema } from '../schema/delete-invitation.schema'; -import { InviteMembersSchema } from '../schema/invite-members.schema'; -import { UpdateInvitationSchema } from '../schema/update-invitation-schema'; +import { DeleteInvitationSchema } from '../../schema/delete-invitation.schema'; +import { InviteMembersSchema } from '../../schema/invite-members.schema'; +import { UpdateInvitationSchema } from '../../schema/update-invitation-schema'; import { AccountInvitationsService } from '../services/account-invitations.service'; /** diff --git a/packages/features/team-accounts/src/actions/account-members-server-actions.ts b/packages/features/team-accounts/src/server/actions/team-members-server-actions.ts similarity index 100% rename from packages/features/team-accounts/src/actions/account-members-server-actions.ts rename to packages/features/team-accounts/src/server/actions/team-members-server-actions.ts diff --git a/packages/features/team-accounts/src/services/account-invitations.service.ts b/packages/features/team-accounts/src/server/services/account-invitations.service.ts similarity index 92% rename from packages/features/team-accounts/src/services/account-invitations.service.ts rename to packages/features/team-accounts/src/server/services/account-invitations.service.ts index 22281c0bf..738ec9503 100644 --- a/packages/features/team-accounts/src/services/account-invitations.service.ts +++ b/packages/features/team-accounts/src/server/services/account-invitations.service.ts @@ -7,9 +7,9 @@ import { Mailer } from '@kit/mailers'; import { Logger } from '@kit/shared/logger'; import { Database } from '@kit/supabase/database'; -import { DeleteInvitationSchema } from '../schema/delete-invitation.schema'; -import { InviteMembersSchema } from '../schema/invite-members.schema'; -import { UpdateInvitationSchema } from '../schema/update-invitation-schema'; +import { DeleteInvitationSchema } from '../../schema/delete-invitation.schema'; +import { InviteMembersSchema } from '../../schema/invite-members.schema'; +import { UpdateInvitationSchema } from '../../schema/update-invitation-schema'; const invitePath = process.env.INVITATION_PAGE_PATH; const siteURL = process.env.NEXT_PUBLIC_SITE_URL; @@ -149,16 +149,14 @@ export class AccountInvitationsService { for (const invitation of responseInvitations) { const promise = async () => { try { - const { renderInviteEmail } = await import( - '../../../../email-templates' - ); + const { renderInviteEmail } = await import('@kit/email-templates'); const html = renderInviteEmail({ link: this.getInvitationLink(invitation.invite_token), invitedUserEmail: invitation.email, inviter: user.email, productName: env.productName, - organizationName: accountResponse.data.name, + teamName: accountResponse.data.name, }); await mailer.sendEmail({ diff --git a/packages/features/team-accounts/src/services/account-members.service.ts b/packages/features/team-accounts/src/server/services/account-members.service.ts similarity index 100% rename from packages/features/team-accounts/src/services/account-members.service.ts rename to packages/features/team-accounts/src/server/services/account-members.service.ts diff --git a/packages/features/team-accounts/src/services/create-team-account.service.ts b/packages/features/team-accounts/src/server/services/create-team-account.service.ts similarity index 92% rename from packages/features/team-accounts/src/services/create-team-account.service.ts rename to packages/features/team-accounts/src/server/services/create-team-account.service.ts index cf6203f77..e69f0d9f2 100644 --- a/packages/features/team-accounts/src/services/create-team-account.service.ts +++ b/packages/features/team-accounts/src/server/services/create-team-account.service.ts @@ -11,7 +11,7 @@ export class CreateTeamAccountService { createNewOrganizationAccount(params: { name: string; userId: string }) { Logger.info( { ...params, namespace: this.namespace }, - `Creating new organization account...`, + `Creating new team account...`, ); return this.client.rpc('create_account', { diff --git a/packages/features/team-accounts/src/server/services/delete-team-account.service.ts b/packages/features/team-accounts/src/server/services/delete-team-account.service.ts new file mode 100644 index 000000000..953ebe0db --- /dev/null +++ b/packages/features/team-accounts/src/server/services/delete-team-account.service.ts @@ -0,0 +1,73 @@ +import { SupabaseClient } from '@supabase/supabase-js'; + +import 'server-only'; + +import { AccountBillingService } from '@kit/billing-gateway'; +import { Logger } from '@kit/shared/logger'; +import { Database } from '@kit/supabase/database'; + +export class DeleteTeamAccountService { + private readonly namespace = 'accounts.delete'; + + /** + * Deletes a team account. Permissions are not checked here, as they are + * checked in the server action. + * + * USE WITH CAUTION. THE USER MUST HAVE THE NECESSARY PERMISSIONS. + * + * @param adminClient + * @param params + */ + async deleteTeamAccount( + adminClient: SupabaseClient, + params: { accountId: string }, + ) { + Logger.info( + { + name: this.namespace, + accountId: params.accountId, + }, + `Requested team account deletion. Processing...`, + ); + + Logger.info( + { + name: this.namespace, + accountId: params.accountId, + }, + `Deleting all account subscriptions...`, + ); + + // First - we want to cancel all Stripe active subscriptions + const billingService = new AccountBillingService(adminClient); + + await billingService.cancelAllAccountSubscriptions(params.accountId); + + // now we can use the admin client to delete the account. + const { error } = await adminClient + .from('accounts') + .delete() + .eq('id', params.accountId); + + if (error) { + Logger.error( + { + name: this.namespace, + accountId: params.accountId, + error, + }, + 'Failed to delete team account', + ); + + throw new Error('Failed to delete team account'); + } + + Logger.info( + { + name: this.namespace, + accountId: params.accountId, + }, + 'Successfully deleted team account', + ); + } +} diff --git a/packages/features/team-accounts/src/services/leave-account.service.ts b/packages/features/team-accounts/src/server/services/leave-account.service.ts similarity index 100% rename from packages/features/team-accounts/src/services/leave-account.service.ts rename to packages/features/team-accounts/src/server/services/leave-account.service.ts diff --git a/packages/features/team-accounts/src/services/delete-team-account.service.ts b/packages/features/team-accounts/src/services/delete-team-account.service.ts deleted file mode 100644 index 933126d77..000000000 --- a/packages/features/team-accounts/src/services/delete-team-account.service.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { SupabaseClient } from '@supabase/supabase-js'; - -import 'server-only'; - -import { Database } from '@kit/supabase/database'; - -export class DeleteTeamAccountService { - constructor(private readonly client: SupabaseClient) {} - - async deleteTeamAccount(params: { accountId: string }) { - // TODO - // implement this method - } -} diff --git a/packages/i18n/package.json b/packages/i18n/package.json index dab546bac..1c3f19373 100644 --- a/packages/i18n/package.json +++ b/packages/i18n/package.json @@ -16,11 +16,11 @@ "./provider": "./src/I18nProvider.tsx" }, "devDependencies": { - "@kit/eslint-config": "0.2.0", - "@kit/prettier-config": "0.1.0", - "@kit/shared": "^0.1.0", - "@kit/tailwind-config": "0.1.0", - "@kit/tsconfig": "0.1.0", + "@kit/eslint-config": "workspace:*", + "@kit/prettier-config": "workspace:*", + "@kit/shared": "workspace:^", + "@kit/tailwind-config": "workspace:*", + "@kit/tsconfig": "workspace:*", "i18next": "^23.10.1", "i18next-browser-languagedetector": "7.2.0", "i18next-resources-to-backend": "^1.2.0", diff --git a/packages/mailers/package.json b/packages/mailers/package.json index 18b4000c0..81245a992 100644 --- a/packages/mailers/package.json +++ b/packages/mailers/package.json @@ -16,10 +16,10 @@ "nodemailer": "^6.9.13" }, "devDependencies": { - "@kit/eslint-config": "0.2.0", - "@kit/prettier-config": "0.1.0", - "@kit/tailwind-config": "0.1.0", - "@kit/tsconfig": "0.1.0", + "@kit/eslint-config": "workspace:*", + "@kit/prettier-config": "workspace:*", + "@kit/tailwind-config": "workspace:*", + "@kit/tsconfig": "workspace:*", "@types/nodemailer": "6.4.14" }, "eslintConfig": { diff --git a/packages/shared/package.json b/packages/shared/package.json index 7425afcc2..71e212d6c 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -20,10 +20,10 @@ "pino": "^8.19.0" }, "devDependencies": { - "@kit/eslint-config": "0.2.0", - "@kit/prettier-config": "0.1.0", - "@kit/tailwind-config": "0.1.0", - "@kit/tsconfig": "0.1.0" + "@kit/eslint-config": "workspace:*", + "@kit/prettier-config": "workspace:*", + "@kit/tailwind-config": "workspace:*", + "@kit/tsconfig": "workspace:*" }, "eslintConfig": { "root": true, diff --git a/packages/stripe/package.json b/packages/stripe/package.json index 9444887f4..5c26ce24e 100644 --- a/packages/stripe/package.json +++ b/packages/stripe/package.json @@ -22,18 +22,18 @@ }, "dependencies": { "@stripe/react-stripe-js": "^2.6.2", - "@stripe/stripe-js": "^3.0.10", - "stripe": "^14.21.0" + "@stripe/stripe-js": "^3.1.0", + "stripe": "^14.22.0" }, "devDependencies": { - "@kit/billing": "*", - "@kit/eslint-config": "0.2.0", - "@kit/prettier-config": "0.1.0", - "@kit/shared": "*", - "@kit/supabase": "*", - "@kit/tailwind-config": "0.1.0", - "@kit/tsconfig": "0.1.0", - "@kit/ui": "*" + "@kit/billing": "^0.1.0", + "@kit/eslint-config": "workspace:*", + "@kit/prettier-config": "workspace:*", + "@kit/shared": "^0.1.0", + "@kit/supabase": "^0.1.0", + "@kit/tailwind-config": "workspace:*", + "@kit/tsconfig": "workspace:*", + "@kit/ui": "^0.1.0" }, "eslintConfig": { "root": true, diff --git a/packages/supabase/package.json b/packages/supabase/package.json index c0b6eaa54..0fe6ef807 100644 --- a/packages/supabase/package.json +++ b/packages/supabase/package.json @@ -24,10 +24,10 @@ }, "devDependencies": { "@epic-web/invariant": "^1.0.0", - "@kit/eslint-config": "0.2.0", - "@kit/prettier-config": "0.1.0", - "@kit/tailwind-config": "0.1.0", - "@kit/tsconfig": "0.1.0", + "@kit/eslint-config": "workspace:*", + "@kit/prettier-config": "workspace:*", + "@kit/tailwind-config": "workspace:*", + "@kit/tsconfig": "workspace:*", "@supabase/ssr": "^0.1.0", "@supabase/supabase-js": "^2.40.0", "@tanstack/react-query": "5.28.6" diff --git a/packages/ui/package.json b/packages/ui/package.json index 3186a8e45..62d8101ed 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -28,10 +28,10 @@ "@radix-ui/react-toast": "^1.1.5", "@radix-ui/react-tooltip": "1.0.7", "clsx": "^2.1.0", - "cmdk": "^0.2.0", + "cmdk": "1.0.0", "input-otp": "1.2.3", "react-top-loading-bar": "2.3.1", - "tailwind-merge": "^2.2.0" + "tailwind-merge": "^2.2.2" }, "peerDependencies": { "@radix-ui/react-icons": "1.3.0", @@ -45,26 +45,26 @@ "zod": "^3.22.4" }, "devDependencies": { - "@kit/eslint-config": "0.2.0", - "@kit/prettier-config": "0.1.0", - "@kit/tailwind-config": "0.1.0", - "@kit/tsconfig": "0.1.0", + "@kit/eslint-config": "workspace:*", + "@kit/prettier-config": "workspace:*", + "@kit/tailwind-config": "workspace:*", + "@kit/tsconfig": "workspace:*", "@radix-ui/react-icons": "^1.3.0", - "@tanstack/react-table": "^8.11.3", - "@types/react": "^18.2.48", - "@types/react-dom": "^18.2.18", + "@tanstack/react-table": "^8.15.0", + "@types/react": "^18.2.73", + "@types/react-dom": "^18.2.22", "class-variance-authority": "^0.7.0", - "date-fns": "^3.2.0", - "eslint": "^8.56.0", + "date-fns": "^3.6.0", + "eslint": "^8.57.0", "lucide-react": "^0.363.0", - "prettier": "^3.2.4", + "prettier": "^3.2.5", "react-day-picker": "^8.10.0", "react-hook-form": "^7.51.2", "react-i18next": "^14.1.0", "sonner": "^1.4.41", "tailwindcss": "3.4.1", "tailwindcss-animate": "^1.0.7", - "typescript": "^5.3.3", + "typescript": "^5.4.3", "zod": "^3.22.4" }, "eslintConfig": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c1693416d..440bebd0f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,10 +9,10 @@ importers: .: dependencies: '@manypkg/cli': - specifier: ^0.21.2 + specifier: ^0.21.3 version: 0.21.3 '@turbo/gen': - specifier: ^1.11.3 + specifier: ^1.13.0 version: 1.13.0(@types/node@20.11.30)(typescript@5.4.3) cross-env: specifier: ^7.0.3 @@ -21,11 +21,14 @@ importers: specifier: ^8.15.5 version: 8.15.5 prettier: - specifier: ^3.2.4 + specifier: ^3.2.5 version: 3.2.5 turbo: specifier: ^1.13.0 version: 1.13.0 + yarn: + specifier: ^1.22.22 + version: 1.22.22 apps/web: dependencies: @@ -36,43 +39,43 @@ importers: specifier: ^3.3.4 version: 3.3.4(react-hook-form@7.51.2) '@kit/accounts': - specifier: ^0.1.0 + specifier: workspace:^ version: link:../../packages/features/accounts '@kit/admin': - specifier: ^0.1.0 + specifier: workspace:^ version: link:../../packages/features/admin '@kit/auth': - specifier: ^0.1.0 + specifier: workspace:^ version: link:../../packages/features/auth '@kit/billing': - specifier: ^0.1.0 + specifier: workspace:^ version: link:../../packages/billing '@kit/billing-gateway': - specifier: ^0.1.0 + specifier: workspace:^ version: link:../../packages/billing-gateway '@kit/email-templates': - specifier: ^0.1.0 + specifier: workspace:^ version: link:../../packages/email-templates '@kit/i18n': - specifier: ^0.1.0 + specifier: workspace:^ version: link:../../packages/i18n '@kit/mailers': - specifier: ^0.1.0 + specifier: workspace:^ version: link:../../packages/mailers '@kit/shared': - specifier: ^0.1.0 + specifier: workspace:^ version: link:../../packages/shared '@kit/supabase': - specifier: ^0.1.0 + specifier: workspace:^ version: link:../../packages/supabase '@kit/team-accounts': - specifier: ^0.1.0 + specifier: workspace:^ version: link:../../packages/features/team-accounts '@kit/ui': - specifier: ^0.1.0 + specifier: workspace:^ version: link:../../packages/ui '@next/mdx': - specifier: ^14.1.0 + specifier: ^14.1.4 version: 14.1.4 '@radix-ui/react-icons': specifier: ^1.3.0 @@ -87,20 +90,20 @@ importers: specifier: 5.28.6 version: 5.28.6(react@18.2.0) '@tanstack/react-query-next-experimental': - specifier: ^5.28.6 - version: 5.28.8(@tanstack/react-query@5.28.6)(next@14.2.0-canary.44)(react@18.2.0) + specifier: ^5.28.9 + version: 5.28.9(@tanstack/react-query@5.28.6)(next@14.2.0-canary.46)(react@18.2.0) '@tanstack/react-table': - specifier: ^8.11.3 + specifier: ^8.15.0 version: 8.15.0(react-dom@18.2.0)(react@18.2.0) contentlayer: specifier: 0.3.4 version: 0.3.4(esbuild@0.20.2) date-fns: - specifier: ^3.2.0 + specifier: ^3.6.0 version: 3.6.0 edge-csrf: specifier: ^1.0.9 - version: 1.0.9(next@14.2.0-canary.44) + version: 1.0.9(next@14.2.0-canary.46) i18next: specifier: ^23.10.1 version: 23.10.1 @@ -108,17 +111,17 @@ importers: specifier: ^1.2.0 version: 1.2.0 next: - specifier: 14.2.0-canary.44 - version: 14.2.0-canary.44(@opentelemetry/api@1.8.0)(react-dom@18.2.0)(react@18.2.0) + specifier: 14.2.0-canary.46 + version: 14.2.0-canary.46(@opentelemetry/api@1.8.0)(react-dom@18.2.0)(react@18.2.0) next-contentlayer: specifier: 0.3.4 - version: 0.3.4(contentlayer@0.3.4)(esbuild@0.20.2)(next@14.2.0-canary.44)(react-dom@18.2.0)(react@18.2.0) + version: 0.3.4(contentlayer@0.3.4)(esbuild@0.20.2)(next@14.2.0-canary.46)(react-dom@18.2.0)(react@18.2.0) next-sitemap: specifier: ^4.2.3 - version: 4.2.3(next@14.2.0-canary.44) + version: 4.2.3(next@14.2.0-canary.46) next-themes: specifier: ^0.2.1 - version: 0.2.1(next@14.2.0-canary.44)(react-dom@18.2.0)(react@18.2.0) + version: 0.2.1(next@14.2.0-canary.46)(react-dom@18.2.0)(react@18.2.0) react: specifier: 18.2.0 version: 18.2.0 @@ -132,7 +135,7 @@ importers: specifier: ^14.1.0 version: 14.1.0(i18next@23.10.1)(react-dom@18.2.0)(react@18.2.0) recharts: - specifier: ^2.10.3 + specifier: ^2.12.3 version: 2.12.3(react-dom@18.2.0)(react@18.2.0) rehype-autolink-headings: specifier: ^7.1.0 @@ -151,70 +154,70 @@ importers: version: 3.22.4 devDependencies: '@kit/eslint-config': - specifier: ^0.2.0 + specifier: workspace:^ version: link:../../tooling/eslint '@kit/prettier-config': - specifier: ^0.1.0 + specifier: workspace:^ version: link:../../tooling/prettier '@kit/tailwind-config': - specifier: ^0.1.0 + specifier: workspace:^ version: link:../../tooling/tailwind '@kit/tsconfig': - specifier: ^0.1.0 + specifier: workspace:^ version: link:../../tooling/typescript '@next/bundle-analyzer': specifier: 14.2.0-canary.44 version: 14.2.0-canary.44 '@types/mdx': - specifier: ^2.0.10 + specifier: ^2.0.12 version: 2.0.12 '@types/node': - specifier: ^20.11.5 + specifier: ^20.11.30 version: 20.11.30 '@types/react': - specifier: ^18.2.48 - version: 18.2.71 + specifier: ^18.2.73 + version: 18.2.73 '@types/react-dom': - specifier: ^18.2.18 + specifier: ^18.2.22 version: 18.2.22 autoprefixer: - specifier: ^10.4.17 + specifier: ^10.4.19 version: 10.4.19(postcss@8.4.33) dotenv-cli: - specifier: ^7.3.0 + specifier: ^7.4.1 version: 7.4.1 eslint: - specifier: ^8.56.0 + specifier: ^8.57.0 version: 8.57.0 prettier: - specifier: ^3.2.4 + specifier: ^3.2.5 version: 3.2.5 tailwindcss: specifier: 3.4.1 version: 3.4.1 typescript: - specifier: ^5.3.3 + specifier: ^5.4.3 version: 5.4.3 packages/billing: devDependencies: '@kit/eslint-config': - specifier: 0.2.0 + specifier: workspace:* version: link:../../tooling/eslint '@kit/prettier-config': - specifier: 0.1.0 + specifier: workspace:* version: link:../../tooling/prettier '@kit/supabase': - specifier: 0.1.0 + specifier: workspace:* version: link:../supabase '@kit/tailwind-config': - specifier: 0.1.0 + specifier: workspace:* version: link:../../tooling/tailwind '@kit/tsconfig': - specifier: 0.1.0 + specifier: workspace:* version: link:../../tooling/typescript '@kit/ui': - specifier: 0.1.0 + specifier: workspace:* version: link:../ui lucide-react: specifier: ^0.363.0 @@ -226,31 +229,31 @@ importers: packages/billing-gateway: devDependencies: '@kit/billing': - specifier: '*' + specifier: ^0.1.0 version: link:../billing '@kit/eslint-config': - specifier: 0.2.0 + specifier: workspace:* version: link:../../tooling/eslint '@kit/prettier-config': - specifier: 0.1.0 + specifier: workspace:* version: link:../../tooling/prettier '@kit/shared': - specifier: '*' + specifier: ^0.1.0 version: link:../shared '@kit/stripe': - specifier: '*' + specifier: ^0.1.0 version: link:../stripe '@kit/supabase': - specifier: '*' + specifier: ^0.1.0 version: link:../supabase '@kit/tailwind-config': - specifier: 0.1.0 + specifier: workspace:* version: link:../../tooling/tailwind '@kit/tsconfig': - specifier: 0.1.0 + specifier: workspace:* version: link:../../tooling/typescript '@kit/ui': - specifier: '*' + specifier: ^0.1.0 version: link:../ui '@supabase/supabase-js': specifier: ^2.40.0 @@ -266,19 +269,19 @@ importers: dependencies: '@react-email/components': specifier: 0.0.15 - version: 0.0.15(@types/react@18.2.71)(react-email@2.1.0)(react@18.2.0) + version: 0.0.15(@types/react@18.2.73)(react-email@2.1.0)(react@18.2.0) devDependencies: '@kit/eslint-config': - specifier: 0.2.0 + specifier: workspace:* version: link:../../tooling/eslint '@kit/prettier-config': - specifier: 0.1.0 + specifier: workspace:* version: link:../../tooling/prettier '@kit/tailwind-config': - specifier: 0.1.0 + specifier: workspace:* version: link:../../tooling/tailwind '@kit/tsconfig': - specifier: 0.1.0 + specifier: workspace:* version: link:../../tooling/typescript packages/features/accounts: @@ -287,44 +290,53 @@ importers: specifier: ^3.3.4 version: 3.3.4(react-hook-form@7.51.2) '@kit/billing-gateway': - specifier: '*' + specifier: ^0.1.0 version: link:../../billing-gateway '@kit/email-templates': - specifier: '*' + specifier: ^0.1.0 version: link:../../email-templates '@kit/eslint-config': - specifier: 0.2.0 + specifier: workspace:* version: link:../../../tooling/eslint '@kit/mailers': - specifier: '*' + specifier: ^0.1.0 version: link:../../mailers '@kit/prettier-config': - specifier: 0.1.0 + specifier: workspace:* version: link:../../../tooling/prettier '@kit/shared': - specifier: '*' + specifier: ^0.1.0 version: link:../../shared '@kit/supabase': - specifier: '*' + specifier: ^0.1.0 version: link:../../supabase '@kit/tailwind-config': - specifier: 0.1.0 + specifier: workspace:* version: link:../../../tooling/tailwind '@kit/tsconfig': - specifier: 0.1.0 + specifier: workspace:* version: link:../../../tooling/typescript '@kit/ui': - specifier: '*' + specifier: ^0.1.0 version: link:../../ui '@radix-ui/react-icons': specifier: ^1.3.0 version: 1.3.0(react@18.2.0) + '@tanstack/react-query': + specifier: 5.28.6 + version: 5.28.6(react@18.2.0) lucide-react: specifier: ^0.363.0 version: 0.363.0(react@18.2.0) react-hook-form: specifier: ^7.51.2 version: 7.51.2(react@18.2.0) + react-i18next: + specifier: ^14.1.0 + version: 14.1.0(i18next@23.10.1)(react-dom@18.2.0)(react@18.2.0) + sonner: + specifier: ^1.4.41 + version: 1.4.41(react-dom@18.2.0)(react@18.2.0) zod: specifier: ^3.22.4 version: 3.22.4 @@ -332,25 +344,25 @@ importers: packages/features/admin: devDependencies: '@kit/eslint-config': - specifier: 0.2.0 + specifier: workspace:* version: link:../../../tooling/eslint '@kit/prettier-config': - specifier: 0.1.0 + specifier: workspace:* version: link:../../../tooling/prettier '@kit/supabase': - specifier: '*' + specifier: ^0.1.0 version: link:../../supabase '@kit/tailwind-config': - specifier: 0.1.0 + specifier: workspace:* version: link:../../../tooling/tailwind '@kit/tsconfig': - specifier: 0.1.0 + specifier: workspace:* version: link:../../../tooling/typescript '@kit/ui': - specifier: '*' + specifier: ^0.1.0 version: link:../../ui '@supabase/supabase-js': - specifier: 2.40.0 + specifier: ^2.40.0 version: 2.40.0 lucide-react: specifier: ^0.363.0 @@ -358,26 +370,29 @@ importers: packages/features/auth: devDependencies: + '@hookform/resolvers': + specifier: ^3.3.4 + version: 3.3.4(react-hook-form@7.51.2) '@kit/eslint-config': - specifier: 0.2.0 + specifier: workspace:* version: link:../../../tooling/eslint '@kit/prettier-config': - specifier: 0.1.0 + specifier: workspace:* version: link:../../../tooling/prettier '@kit/shared': - specifier: 0.1.0 + specifier: workspace:* version: link:../../shared '@kit/supabase': - specifier: 0.1.0 + specifier: workspace:* version: link:../../supabase '@kit/tailwind-config': - specifier: 0.1.0 + specifier: workspace:* version: link:../../../tooling/tailwind '@kit/tsconfig': - specifier: 0.1.0 + specifier: workspace:* version: link:../../../tooling/typescript '@kit/ui': - specifier: 0.1.0 + specifier: workspace:* version: link:../../ui '@radix-ui/react-icons': specifier: ^1.3.0 @@ -401,55 +416,64 @@ importers: specifier: ^3.3.4 version: 3.3.4(react-hook-form@7.51.2) '@kit/accounts': - specifier: '*' + specifier: ^0.1.0 version: link:../accounts + '@kit/billing-gateway': + specifier: workspace:* + version: link:../../billing-gateway '@kit/email-templates': - specifier: '*' + specifier: ^0.1.0 version: link:../../email-templates '@kit/eslint-config': - specifier: 0.2.0 + specifier: workspace:* version: link:../../../tooling/eslint '@kit/mailers': - specifier: '*' + specifier: ^0.1.0 version: link:../../mailers '@kit/prettier-config': - specifier: 0.1.0 + specifier: workspace:* version: link:../../../tooling/prettier '@kit/shared': - specifier: '*' + specifier: ^0.1.0 version: link:../../shared '@kit/supabase': - specifier: '*' + specifier: ^0.1.0 version: link:../../supabase '@kit/tailwind-config': - specifier: 0.1.0 + specifier: workspace:* version: link:../../../tooling/tailwind '@kit/tsconfig': - specifier: 0.1.0 + specifier: workspace:* version: link:../../../tooling/typescript '@kit/ui': - specifier: '*' + specifier: ^0.1.0 version: link:../../ui + '@tanstack/react-query': + specifier: 5.28.6 + version: 5.28.6(react@18.2.0) lucide-react: specifier: ^0.363.0 version: 0.363.0(react@18.2.0) + react-i18next: + specifier: ^14.1.0 + version: 14.1.0(i18next@23.10.1)(react-dom@18.2.0)(react@18.2.0) packages/i18n: devDependencies: '@kit/eslint-config': - specifier: 0.2.0 + specifier: workspace:* version: link:../../tooling/eslint '@kit/prettier-config': - specifier: 0.1.0 + specifier: workspace:* version: link:../../tooling/prettier '@kit/shared': - specifier: ^0.1.0 + specifier: workspace:^ version: link:../shared '@kit/tailwind-config': - specifier: 0.1.0 + specifier: workspace:* version: link:../../tooling/tailwind '@kit/tsconfig': - specifier: 0.1.0 + specifier: workspace:* version: link:../../tooling/typescript i18next: specifier: ^23.10.1 @@ -471,16 +495,16 @@ importers: version: 6.9.13 devDependencies: '@kit/eslint-config': - specifier: 0.2.0 + specifier: workspace:* version: link:../../tooling/eslint '@kit/prettier-config': - specifier: 0.1.0 + specifier: workspace:* version: link:../../tooling/prettier '@kit/tailwind-config': - specifier: 0.1.0 + specifier: workspace:* version: link:../../tooling/tailwind '@kit/tsconfig': - specifier: 0.1.0 + specifier: workspace:* version: link:../../tooling/typescript '@types/nodemailer': specifier: 6.4.14 @@ -493,16 +517,16 @@ importers: version: 8.19.0 devDependencies: '@kit/eslint-config': - specifier: 0.2.0 + specifier: workspace:* version: link:../../tooling/eslint '@kit/prettier-config': - specifier: 0.1.0 + specifier: workspace:* version: link:../../tooling/prettier '@kit/tailwind-config': - specifier: 0.1.0 + specifier: workspace:* version: link:../../tooling/tailwind '@kit/tsconfig': - specifier: 0.1.0 + specifier: workspace:* version: link:../../tooling/typescript packages/stripe: @@ -511,35 +535,35 @@ importers: specifier: ^2.6.2 version: 2.6.2(@stripe/stripe-js@3.1.0)(react-dom@18.2.0)(react@18.2.0) '@stripe/stripe-js': - specifier: ^3.0.10 + specifier: ^3.1.0 version: 3.1.0 stripe: - specifier: ^14.21.0 + specifier: ^14.22.0 version: 14.22.0 devDependencies: '@kit/billing': - specifier: '*' + specifier: ^0.1.0 version: link:../billing '@kit/eslint-config': - specifier: 0.2.0 + specifier: workspace:* version: link:../../tooling/eslint '@kit/prettier-config': - specifier: 0.1.0 + specifier: workspace:* version: link:../../tooling/prettier '@kit/shared': - specifier: '*' + specifier: ^0.1.0 version: link:../shared '@kit/supabase': - specifier: '*' + specifier: ^0.1.0 version: link:../supabase '@kit/tailwind-config': - specifier: 0.1.0 + specifier: workspace:* version: link:../../tooling/tailwind '@kit/tsconfig': - specifier: 0.1.0 + specifier: workspace:* version: link:../../tooling/typescript '@kit/ui': - specifier: '*' + specifier: ^0.1.0 version: link:../ui packages/supabase: @@ -548,16 +572,16 @@ importers: specifier: ^1.0.0 version: 1.0.0 '@kit/eslint-config': - specifier: 0.2.0 + specifier: workspace:* version: link:../../tooling/eslint '@kit/prettier-config': - specifier: 0.1.0 + specifier: workspace:* version: link:../../tooling/prettier '@kit/tailwind-config': - specifier: 0.1.0 + specifier: workspace:* version: link:../../tooling/tailwind '@kit/tsconfig': - specifier: 0.1.0 + specifier: workspace:* version: link:../../tooling/typescript '@supabase/ssr': specifier: ^0.1.0 @@ -576,61 +600,61 @@ importers: version: 3.3.4(react-hook-form@7.51.2) '@radix-ui/react-accordion': specifier: 1.1.2 - version: 1.1.2(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) + version: 1.1.2(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-alert-dialog': specifier: ^1.0.5 - version: 1.0.5(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.5(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-avatar': specifier: ^1.0.4 - version: 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-checkbox': specifier: ^1.0.4 - version: 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-dialog': specifier: ^1.0.5 - version: 1.0.5(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.5(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-dropdown-menu': specifier: ^2.0.6 - version: 2.0.6(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) + version: 2.0.6(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-label': specifier: ^2.0.2 - version: 2.0.2(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) + version: 2.0.2(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-navigation-menu': specifier: ^1.1.4 - version: 1.1.4(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) + version: 1.1.4(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-popover': specifier: ^1.0.7 - version: 1.0.7(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.7(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-radio-group': specifier: ^1.1.3 - version: 1.1.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) + version: 1.1.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-scroll-area': specifier: ^1.0.5 - version: 1.0.5(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.5(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-select': specifier: ^2.0.0 - version: 2.0.0(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) + version: 2.0.0(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-separator': specifier: ^1.0.3 - version: 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-slot': specifier: ^1.0.2 - version: 1.0.2(@types/react@18.2.71)(react@18.2.0) + version: 1.0.2(@types/react@18.2.73)(react@18.2.0) '@radix-ui/react-tabs': specifier: ^1.0.4 - version: 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-toast': specifier: ^1.1.5 - version: 1.1.5(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) + version: 1.1.5(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) '@radix-ui/react-tooltip': specifier: 1.0.7 - version: 1.0.7(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) + version: 1.0.7(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) clsx: specifier: ^2.1.0 version: 2.1.0 cmdk: - specifier: ^0.2.0 - version: 0.2.1(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) + specifier: 1.0.0 + version: 1.0.0(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) input-otp: specifier: 1.2.3 version: 1.2.3(react-dom@18.2.0)(react@18.2.0) @@ -638,47 +662,47 @@ importers: specifier: 2.3.1 version: 2.3.1(react@18.2.0) tailwind-merge: - specifier: ^2.2.0 + specifier: ^2.2.2 version: 2.2.2 devDependencies: '@kit/eslint-config': - specifier: 0.2.0 + specifier: workspace:* version: link:../../tooling/eslint '@kit/prettier-config': - specifier: 0.1.0 + specifier: workspace:* version: link:../../tooling/prettier '@kit/tailwind-config': - specifier: 0.1.0 + specifier: workspace:* version: link:../../tooling/tailwind '@kit/tsconfig': - specifier: 0.1.0 + specifier: workspace:* version: link:../../tooling/typescript '@radix-ui/react-icons': specifier: ^1.3.0 version: 1.3.0(react@18.2.0) '@tanstack/react-table': - specifier: ^8.11.3 + specifier: ^8.15.0 version: 8.15.0(react-dom@18.2.0)(react@18.2.0) '@types/react': - specifier: ^18.2.48 - version: 18.2.71 + specifier: ^18.2.73 + version: 18.2.73 '@types/react-dom': - specifier: ^18.2.18 + specifier: ^18.2.22 version: 18.2.22 class-variance-authority: specifier: ^0.7.0 version: 0.7.0 date-fns: - specifier: ^3.2.0 + specifier: ^3.6.0 version: 3.6.0 eslint: - specifier: ^8.56.0 + specifier: ^8.57.0 version: 8.57.0 lucide-react: specifier: ^0.363.0 version: 0.363.0(react@18.2.0) prettier: - specifier: ^3.2.4 + specifier: ^3.2.5 version: 3.2.5 react-day-picker: specifier: ^8.10.0 @@ -699,7 +723,7 @@ importers: specifier: ^1.0.7 version: 1.0.7(tailwindcss@3.4.1) typescript: - specifier: ^5.3.3 + specifier: ^5.4.3 version: 5.4.3 zod: specifier: ^3.22.4 @@ -708,31 +732,31 @@ importers: supabase: dependencies: supabase: - specifier: ^1.150.0 + specifier: ^1.151.1 version: 1.151.1 tooling/eslint: dependencies: '@next/eslint-plugin-next': - specifier: ^14.1.0 + specifier: ^14.1.4 version: 14.1.4 '@trivago/prettier-plugin-sort-imports': specifier: ^4.3.0 version: 4.3.0(prettier@3.2.5) '@types/eslint': - specifier: ^8.56.2 + specifier: ^8.56.6 version: 8.56.6 '@typescript-eslint/eslint-plugin': - specifier: ^7.3.1 + specifier: ^7.4.0 version: 7.4.0(@typescript-eslint/parser@7.4.0)(eslint@8.57.0)(typescript@5.4.3) '@typescript-eslint/parser': - specifier: ^7.3.1 + specifier: ^7.4.0 version: 7.4.0(eslint@8.57.0)(typescript@5.4.3) eslint-config-prettier: specifier: ^9.1.0 version: 9.1.0(eslint@8.57.0) eslint-config-turbo: - specifier: ^1.12.5 + specifier: ^1.13.0 version: 1.13.0(eslint@8.57.0) eslint-plugin-import: specifier: ^2.29.1 @@ -748,41 +772,41 @@ importers: version: 4.6.0(eslint@8.57.0) devDependencies: '@kit/prettier-config': - specifier: ^0.1.0 + specifier: workspace:^ version: link:../prettier '@kit/tsconfig': - specifier: ^0.1.0 + specifier: workspace:^ version: link:../typescript eslint: - specifier: ^8.56.0 + specifier: ^8.57.0 version: 8.57.0 typescript: - specifier: ^5.3.3 + specifier: ^5.4.3 version: 5.4.3 tooling/prettier: dependencies: '@ianvs/prettier-plugin-sort-imports': - specifier: ^4.1.1 + specifier: ^4.2.1 version: 4.2.1(prettier@3.2.5) prettier: - specifier: ^3.2.4 + specifier: ^3.2.5 version: 3.2.5 prettier-plugin-tailwindcss: - specifier: ^0.5.11 - version: 0.5.12(@ianvs/prettier-plugin-sort-imports@4.2.1)(prettier@3.2.5) + specifier: ^0.5.13 + version: 0.5.13(@ianvs/prettier-plugin-sort-imports@4.2.1)(prettier@3.2.5) devDependencies: '@kit/tsconfig': - specifier: ^0.1.0 + specifier: workspace:^ version: link:../typescript typescript: - specifier: ^5.3.3 + specifier: ^5.4.3 version: 5.4.3 tooling/tailwind: dependencies: autoprefixer: - specifier: ^10.4.17 + specifier: ^10.4.19 version: 10.4.19(postcss@8.4.33) postcss: specifier: 8.4.33 @@ -792,22 +816,22 @@ importers: version: 3.4.1 devDependencies: '@kit/eslint-config': - specifier: ^0.2.0 + specifier: workspace:^ version: link:../eslint '@kit/prettier-config': - specifier: ^0.1.0 + specifier: workspace:^ version: link:../prettier '@kit/tsconfig': - specifier: ^0.1.0 + specifier: workspace:^ version: link:../typescript eslint: - specifier: ^8.56.0 + specifier: ^8.57.0 version: 8.57.0 prettier: - specifier: ^3.2.4 + specifier: ^3.2.5 version: 3.2.5 typescript: - specifier: ^5.3.3 + specifier: ^5.4.3 version: 5.4.3 tooling/typescript: {} @@ -1772,16 +1796,16 @@ packages: resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} dev: false - /@grpc/grpc-js@1.10.3: - resolution: {integrity: sha512-qiO9MNgYnwbvZ8MK0YLWbnGrNX3zTcj6/Ef7UHu5ZofER3e2nF3Y35GaPo9qNJJ/UJQKa4KL+z/F4Q8Q+uCdUQ==} + /@grpc/grpc-js@1.10.4: + resolution: {integrity: sha512-MqBisuxTkYvPFnEiu+dag3xG/NBUDzSbAFAWlzfkGnQkjVZ6by3h4atbBc+Ikqup1z5BfB4BN18gKWR1YyppNw==} engines: {node: '>=12.10.0'} dependencies: - '@grpc/proto-loader': 0.7.10 + '@grpc/proto-loader': 0.7.11 '@js-sdsl/ordered-map': 4.4.2 dev: false - /@grpc/proto-loader@0.7.10: - resolution: {integrity: sha512-CAqDfoaQ8ykFd9zqBDn4k6iWT9loLAlc2ETmDFS9JCD70gDcnA4L3AFEo2iV7KyAtAAHFW9ftq1Fz+Vsgq80RQ==} + /@grpc/proto-loader@0.7.11: + resolution: {integrity: sha512-amjhSfJ+xYnTP+hncJMmkchoRtjIdi+uO3FaymGSCr07yu5xfpXFEnhZkTU1mj2lPJB3oVToau7j9YkqB+YNdg==} engines: {node: '>=6'} hasBin: true dependencies: @@ -1998,8 +2022,8 @@ packages: resolution: {integrity: sha512-Py8zIo+02ht82brwwhTg36iogzFqGLPXlRGKQw5s+qP/kMNc4MAyDeEwBKDijk6zTIbegEgu8Qy7C1LboslQAw==} dev: false - /@next/env@14.2.0-canary.44: - resolution: {integrity: sha512-I4pQqivxUD8jgAy8WomJhniJmdEUmdfNPTTXunsRUPHkWU3a6rlGc90fYrb+4+Bm/szyXEhBesFaB6n27NWjEw==} + /@next/env@14.2.0-canary.46: + resolution: {integrity: sha512-3nWvbdmdq2kdt1E5ZDB5imDHZo5EsjCcGqa0HQ1rBj9J4q1nngrkCWWGjHxkxcveBcOp+AIcXuFUNpeaBSftag==} dev: false /@next/eslint-plugin-next@14.1.4: @@ -2031,8 +2055,8 @@ packages: dev: false optional: true - /@next/swc-darwin-arm64@14.2.0-canary.44: - resolution: {integrity: sha512-P9gmEH5fSTL2E3pMVfsIB2o5qqVsdNSfpq8puNYcbMNvpvwhGP9mgx9gOybf8FdfxYSGCGnLjeit/3ja0LJIeQ==} + /@next/swc-darwin-arm64@14.2.0-canary.46: + resolution: {integrity: sha512-jd7wwdRw3MTlv6HIM8t1Tk8rlXfA967/JZNVmlcU+yFGT0J5D93AqkrwZhOXveyZoy38s0wXFiZ7YdO49dkntQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -2049,8 +2073,8 @@ packages: dev: false optional: true - /@next/swc-darwin-x64@14.2.0-canary.44: - resolution: {integrity: sha512-yiakf77DTsX6uKEW1bNcV4ST654OzR9svNdhIz3gqti17SVF2LnVhJGMZ8VcQhqIvQe6zeG4m2HXvWFsxGURuQ==} + /@next/swc-darwin-x64@14.2.0-canary.46: + resolution: {integrity: sha512-/b65qN2IhF23mUaMlytn/VDoyKhau2KT+lWfV6VdsYlK9zJ9xYdTy0RJ5TyduhBrh9TiH3DheHsvAzRceulqQA==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -2067,8 +2091,8 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-gnu@14.2.0-canary.44: - resolution: {integrity: sha512-ZdzSCApQdooLTQOc4hQdHQLiidYv3nImyjhkZF2ol1Rb3JBLtuTVx2zg3GjBN/aypUBx67kpWZoPIPbIlYcKpA==} + /@next/swc-linux-arm64-gnu@14.2.0-canary.46: + resolution: {integrity: sha512-HQcuZ2DG8yVGPFNjpRgiMGN82c2w0Kl4tB7R1DdyQXlgpmIh6fTrR2pqGrnmLZ3i3P810O3hOKvx64iQDZJ0pA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -2085,8 +2109,8 @@ packages: dev: false optional: true - /@next/swc-linux-arm64-musl@14.2.0-canary.44: - resolution: {integrity: sha512-hh1zk4yEKDRbLivQqH04Ve+bB+baivK5/mKnFSDAaP7fKiLu6RA71J7oh2lUksgDOVTLqpR2ApHKyHbnNKVCcQ==} + /@next/swc-linux-arm64-musl@14.2.0-canary.46: + resolution: {integrity: sha512-ROi5dvPxgVmDCDvw3i/IhvGkfSKtnknEthben7I57jx2tkDwAXDjuOsgf9rovEYuYVLHu4CHU29K+KWiTSfvNg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -2103,8 +2127,8 @@ packages: dev: false optional: true - /@next/swc-linux-x64-gnu@14.2.0-canary.44: - resolution: {integrity: sha512-Dt7SpIQrimsTAlWNHBzb3gwG01s4X2rVtX8RCVfO3Wqb6bqb0sFHxJQ7MWDql9CtbQLvwEPvWwRz0RPtEFK5Cg==} + /@next/swc-linux-x64-gnu@14.2.0-canary.46: + resolution: {integrity: sha512-PbOgNCVzIVN8xKvqFMzQIFwYMNmrZF/k+Rem6pxg+VYxz9T9DVpm+CnHOYgZ02RrDt2SyjiwkMP/0yGLgl7sag==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -2121,8 +2145,8 @@ packages: dev: false optional: true - /@next/swc-linux-x64-musl@14.2.0-canary.44: - resolution: {integrity: sha512-VNUjddGcYepo9Pqn6O9uENlHNdKsOV8gjqLYvGPs820NVxRUSRw4yhUUmQSzTiJT+XxYlQ1XsT8DE5aWgCoxtA==} + /@next/swc-linux-x64-musl@14.2.0-canary.46: + resolution: {integrity: sha512-LMhnxb9ePpCkS70s8Py6xlVGBzeAHjeIXzaun5K6DiefrfJ4unVKkZTD7jy6JTK/a/92BhnjxPrX+wz4/wYRbg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -2139,8 +2163,8 @@ packages: dev: false optional: true - /@next/swc-win32-arm64-msvc@14.2.0-canary.44: - resolution: {integrity: sha512-2lBxvpMqErzTsMDPdnzMw/IcRp1SYkSzL/UuScgvbE7gSDnMlur8PtAM5MMwxQFdMAEbcnefjxH4kjOuwQagyw==} + /@next/swc-win32-arm64-msvc@14.2.0-canary.46: + resolution: {integrity: sha512-RFlxKkq1vg6/ZIRQ/gOhtEkAdtoQz9iwfEHalQ4GEe3+lqxWa4tx5YAq9miNBwACaNv/z1hqp1cDl45ZS0kC/A==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] @@ -2157,8 +2181,8 @@ packages: dev: false optional: true - /@next/swc-win32-ia32-msvc@14.2.0-canary.44: - resolution: {integrity: sha512-yadLbdDfXvn5uPNPyxmXdHUNTEyBNLspF87kbGVHM1HsffTaqgZuQZy52E247aoATJ/g951fYAqi7pxA61rWwg==} + /@next/swc-win32-ia32-msvc@14.2.0-canary.46: + resolution: {integrity: sha512-DSMDxFJqgLlKFCs8Ex5HWazPjVbkCJAR7DrJe4khGq17LlvHBzPy/te77UrbPP9S27TJyaH1Q7J7DJ1gjPTP2g==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] @@ -2175,8 +2199,8 @@ packages: dev: false optional: true - /@next/swc-win32-x64-msvc@14.2.0-canary.44: - resolution: {integrity: sha512-t+0EgPaqQVDmBxrbOWEi3R+WeOg9jDhBYSqtyJO1n8Fou34xApsWzdgv9vSuRsAhU4CoMJQQkzm04FMIJReHmw==} + /@next/swc-win32-x64-msvc@14.2.0-canary.46: + resolution: {integrity: sha512-T/hNIgx1M6hZ2Q/ABHvMt/apGF0nuBX258pSXNg/tpkKo4szDGO/EULie4dAEIMWOG6asVg9nYtUPh6Q3hmrJQ==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -2253,7 +2277,7 @@ packages: peerDependencies: '@opentelemetry/api': ^1.0.0 dependencies: - '@grpc/grpc-js': 1.10.3 + '@grpc/grpc-js': 1.10.4 '@opentelemetry/api': 1.8.0 '@opentelemetry/core': 1.13.0(@opentelemetry/api@1.8.0) '@opentelemetry/otlp-grpc-exporter-base': 0.39.1(@opentelemetry/api@1.8.0) @@ -2278,7 +2302,7 @@ packages: peerDependencies: '@opentelemetry/api': ^1.0.0 dependencies: - '@grpc/grpc-js': 1.10.3 + '@grpc/grpc-js': 1.10.4 '@opentelemetry/api': 1.8.0 '@opentelemetry/core': 1.13.0(@opentelemetry/api@1.8.0) '@opentelemetry/otlp-exporter-base': 0.39.1(@opentelemetry/api@1.8.0) @@ -2500,19 +2524,13 @@ packages: '@babel/runtime': 7.24.1 dev: false - /@radix-ui/primitive@1.0.0: - resolution: {integrity: sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA==} - dependencies: - '@babel/runtime': 7.24.1 - dev: false - /@radix-ui/primitive@1.0.1: resolution: {integrity: sha512-yQ8oGX2GVsEYMWGxcovu1uGWPCxV5BFfeeYxqPmuAzUyLT9qmaMXSAhXpb0WrspIeqYzdJpkh2vHModJPgRIaw==} dependencies: '@babel/runtime': 7.24.1 dev: false - /@radix-ui/react-accordion@1.1.2(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-accordion@1.1.2(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-fDG7jcoNKVjSK6yfmuAs0EnPDro0WMXIhMtXdTBWqEioVW206ku+4Lw07e+13lUkFkpoEQ2PdeMIAGpdqEAmDg==} peerDependencies: '@types/react': '*' @@ -2527,21 +2545,21 @@ packages: dependencies: '@babel/runtime': 7.24.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collapsible': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@types/react': 18.2.71 + '@radix-ui/react-collapsible': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@types/react': 18.2.73 '@types/react-dom': 18.2.22 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-alert-dialog@1.0.5(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-alert-dialog@1.0.5(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-OrVIOcZL0tl6xibeuGt5/+UxoT2N27KCFOPjFyfXMnchxSHZ/OW7cCX2nGlIYJrbHK/fczPcFzAwvNBB6XBNMA==} peerDependencies: '@types/react': '*' @@ -2556,18 +2574,18 @@ packages: dependencies: '@babel/runtime': 7.24.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-dialog': 1.0.5(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.71)(react@18.2.0) - '@types/react': 18.2.71 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-dialog': 1.0.5(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.73)(react@18.2.0) + '@types/react': 18.2.73 '@types/react-dom': 18.2.22 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-arrow@1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-wSP+pHsB/jQRaL6voubsQ/ZlrGBHHrOjmBnr19hxYgtS0WvAFwZhK2WP/YY5yF9uKECCEEDGxuLxq1NBK51wFA==} peerDependencies: '@types/react': '*' @@ -2581,14 +2599,14 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.1 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.71 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.73 '@types/react-dom': 18.2.22 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-avatar@1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-avatar@1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-kVK2K7ZD3wwj3qhle0ElXhOjbezIgyl2hVvgwfIdexL3rN6zJmy5AqqIf+D31lxVppdzV8CjAfZ6PklkmInZLw==} peerDependencies: '@types/react': '*' @@ -2602,17 +2620,17 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.1 - '@radix-ui/react-context': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@types/react': 18.2.71 + '@radix-ui/react-context': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@types/react': 18.2.73 '@types/react-dom': 18.2.22 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-checkbox@1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-checkbox@1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-CBuGQa52aAYnADZVt/KBQzXrwx6TqnlwtcIPGtVt5JkkzQwMOLJjPukimhfKEr4GQNd43C+djUh5Ikopj8pSLg==} peerDependencies: '@types/react': '*' @@ -2627,20 +2645,20 @@ packages: dependencies: '@babel/runtime': 7.24.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@types/react': 18.2.71 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@types/react': 18.2.73 '@types/react-dom': 18.2.22 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-collapsible@1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-collapsible@1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-UBmVDkmR6IvDsloHVN+3rtx4Mi5TFvylYXpluuv0f37dtaz3H99bp8No0LGXRigVpl3UAT4l9j6bIchh42S/Gg==} peerDependencies: '@types/react': '*' @@ -2655,20 +2673,20 @@ packages: dependencies: '@babel/runtime': 7.24.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@types/react': 18.2.71 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@types/react': 18.2.73 '@types/react-dom': 18.2.22 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-collection@1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-3SzW+0PW7yBBoQlT8wNcGtaxaD0XSu0uLUFgrtHY08Acx05TaHaOmVLR73c0j/cqpDy53KBMO7s0dx2wmOIDIA==} peerDependencies: '@types/react': '*' @@ -2682,26 +2700,17 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.71)(react@18.2.0) - '@types/react': 18.2.71 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.73)(react@18.2.0) + '@types/react': 18.2.73 '@types/react-dom': 18.2.22 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-compose-refs@1.0.0(react@18.2.0): - resolution: {integrity: sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA==} - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 - dependencies: - '@babel/runtime': 7.24.1 - react: 18.2.0 - dev: false - - /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.71)(react@18.2.0): + /@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.73)(react@18.2.0): resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==} peerDependencies: '@types/react': '*' @@ -2711,20 +2720,11 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.1 - '@types/react': 18.2.71 + '@types/react': 18.2.73 react: 18.2.0 dev: false - /@radix-ui/react-context@1.0.0(react@18.2.0): - resolution: {integrity: sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg==} - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 - dependencies: - '@babel/runtime': 7.24.1 - react: 18.2.0 - dev: false - - /@radix-ui/react-context@1.0.1(@types/react@18.2.71)(react@18.2.0): + /@radix-ui/react-context@1.0.1(@types/react@18.2.73)(react@18.2.0): resolution: {integrity: sha512-ebbrdFoYTcuZ0v4wG5tedGnp9tzcV8awzsxYph7gXUyvnNLuTIcCk1q17JEbnVhXAKG9oX3KtchwiMIAYp9NLg==} peerDependencies: '@types/react': '*' @@ -2734,38 +2734,11 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.1 - '@types/react': 18.2.71 + '@types/react': 18.2.73 react: 18.2.0 dev: false - /@radix-ui/react-dialog@1.0.0(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-Yn9YU+QlHYLWwV1XfKiqnGVpWYWk6MeBVM6x/bcoyPvxgjQGoeT35482viLPctTMWoMw0PoHgqfSox7Ig+957Q==} - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - dependencies: - '@babel/runtime': 7.24.1 - '@radix-ui/primitive': 1.0.0 - '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) - '@radix-ui/react-context': 1.0.0(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.0(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.0(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.0(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.0(react@18.2.0) - '@radix-ui/react-portal': 1.0.0(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.0(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.0(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.0(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.0(react@18.2.0) - aria-hidden: 1.2.4 - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.4(@types/react@18.2.71)(react@18.2.0) - transitivePeerDependencies: - - '@types/react' - dev: false - - /@radix-ui/react-dialog@1.0.5(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-dialog@1.0.5(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-GjWJX/AUpB703eEBanuBnIWdIXg6NvJFCXcNlSZk4xdszCdhrJgBoUd1cGk67vFO+WdA2pfI/plOpqz/5GUP6Q==} peerDependencies: '@types/react': '*' @@ -2780,26 +2753,26 @@ packages: dependencies: '@babel/runtime': 7.24.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@types/react': 18.2.71 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@types/react': 18.2.73 '@types/react-dom': 18.2.22 aria-hidden: 1.2.4 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.5(@types/react@18.2.71)(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.73)(react@18.2.0) dev: false - /@radix-ui/react-direction@1.0.1(@types/react@18.2.71)(react@18.2.0): + /@radix-ui/react-direction@1.0.1(@types/react@18.2.73)(react@18.2.0): resolution: {integrity: sha512-RXcvnXgyvYvBEOhCBuddKecVkoMiI10Jcm5cTI7abJRAHYfFxeu+FBQs/DvdxSYucxR5mna0dNsL6QFlds5TMA==} peerDependencies: '@types/react': '*' @@ -2809,27 +2782,11 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.1 - '@types/react': 18.2.71 + '@types/react': 18.2.73 react: 18.2.0 dev: false - /@radix-ui/react-dismissable-layer@1.0.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-n7kDRfx+LB1zLueRDvZ1Pd0bxdJWDUZNQ/GWoxDn2prnuJKRdxsjulejX/ePkOsLi2tTm6P24mDqlMSgQpsT6g==} - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - dependencies: - '@babel/runtime': 7.24.1 - '@radix-ui/primitive': 1.0.0 - '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) - '@radix-ui/react-primitive': 1.0.0(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) - '@radix-ui/react-use-escape-keydown': 1.0.0(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-dismissable-layer@1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-7UpBa/RKMoHJYjie1gkF1DlK8l1fdU/VKDpoS3rCCo8YBJR294GwcEHyxHw72yvphJ7ld0AXEcSLAzY2F/WyCg==} peerDependencies: '@types/react': '*' @@ -2844,17 +2801,17 @@ packages: dependencies: '@babel/runtime': 7.24.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.71)(react@18.2.0) - '@types/react': 18.2.71 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.73)(react@18.2.0) + '@types/react': 18.2.73 '@types/react-dom': 18.2.22 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-dismissable-layer@1.0.5(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-aJeDjQhywg9LBu2t/At58hCvr7pEm0o2Ke1x33B+MhjNmmZ17sy4KImo0KPLgsnc/zN7GPdce8Cnn0SWvwZO7g==} peerDependencies: '@types/react': '*' @@ -2869,17 +2826,17 @@ packages: dependencies: '@babel/runtime': 7.24.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.71)(react@18.2.0) - '@types/react': 18.2.71 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-use-escape-keydown': 1.0.3(@types/react@18.2.73)(react@18.2.0) + '@types/react': 18.2.73 '@types/react-dom': 18.2.22 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-dropdown-menu@2.0.6(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-dropdown-menu@2.0.6(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-i6TuFOoWmLWq+M/eCLGd/bQ2HfAX1RJgvrBQ6AQLmzfvsLdefxbWu8G9zczcPFfcSPehz9GcpF6K9QYreFV8hA==} peerDependencies: '@types/react': '*' @@ -2894,28 +2851,19 @@ packages: dependencies: '@babel/runtime': 7.24.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-menu': 2.0.6(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@types/react': 18.2.71 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-menu': 2.0.6(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@types/react': 18.2.73 '@types/react-dom': 18.2.22 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-focus-guards@1.0.0(react@18.2.0): - resolution: {integrity: sha512-UagjDk4ijOAnGu4WMUPj9ahi7/zJJqNZ9ZAiGPp7waUWJO0O1aWXi/udPphI0IUjvrhBsZJGSN66dR2dsueLWQ==} - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 - dependencies: - '@babel/runtime': 7.24.1 - react: 18.2.0 - dev: false - - /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.71)(react@18.2.0): + /@radix-ui/react-focus-guards@1.0.1(@types/react@18.2.73)(react@18.2.0): resolution: {integrity: sha512-Rect2dWbQ8waGzhMavsIbmSVCgYxkXLxxR3ZvCX79JOglzdEy4JXMb98lq4hPxUbLr77nP0UOGf4rcMU+s1pUA==} peerDependencies: '@types/react': '*' @@ -2925,25 +2873,11 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.1 - '@types/react': 18.2.71 + '@types/react': 18.2.73 react: 18.2.0 dev: false - /@radix-ui/react-focus-scope@1.0.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-C4SWtsULLGf/2L4oGeIHlvWQx7Rf+7cX/vKOAD2dXW0A1b5QXwi3wWeaEgW+wn+SEVrraMUk05vLU9fZZz5HbQ==} - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - dependencies: - '@babel/runtime': 7.24.1 - '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) - '@radix-ui/react-primitive': 1.0.0(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@radix-ui/react-focus-scope@1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-focus-scope@1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-upXdPfqI4islj2CslyfUBNlaJCPybbqRHAi1KER7Isel9Q2AtSJ0zRBZv8mWQiFXD2nyAJ4BhC3yXgZ6kMBSrQ==} peerDependencies: '@types/react': '*' @@ -2957,16 +2891,16 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@types/react': 18.2.71 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@types/react': 18.2.73 '@types/react-dom': 18.2.22 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-focus-scope@1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-sL04Mgvf+FmyvZeYfNu1EPAaaxD+aw7cYeIB9L9Fvq8+urhltTRaEo5ysKOpHuKPclsZcSUMKlN05x4u+CINpA==} peerDependencies: '@types/react': '*' @@ -2980,10 +2914,10 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@types/react': 18.2.71 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@types/react': 18.2.73 '@types/react-dom': 18.2.22 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -2996,17 +2930,7 @@ packages: dependencies: react: 18.2.0 - /@radix-ui/react-id@1.0.0(react@18.2.0): - resolution: {integrity: sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw==} - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 - dependencies: - '@babel/runtime': 7.24.1 - '@radix-ui/react-use-layout-effect': 1.0.0(react@18.2.0) - react: 18.2.0 - dev: false - - /@radix-ui/react-id@1.0.1(@types/react@18.2.71)(react@18.2.0): + /@radix-ui/react-id@1.0.1(@types/react@18.2.73)(react@18.2.0): resolution: {integrity: sha512-tI7sT/kqYp8p96yGWY1OAnLHrqDgzHefRBKQ2YAkBS5ja7QLcZ9Z/uY7bEjPUatf8RomoXM8/1sMj1IJaE5UzQ==} peerDependencies: '@types/react': '*' @@ -3016,12 +2940,12 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.1 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@types/react': 18.2.71 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@types/react': 18.2.73 react: 18.2.0 dev: false - /@radix-ui/react-label@2.0.2(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-label@2.0.2(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-N5ehvlM7qoTLx7nWPodsPYPgMzA5WM8zZChQg8nyFJKnDO5WHdba1vv5/H6IO5LtJMfD2Q3wh1qHFGNtK0w3bQ==} peerDependencies: '@types/react': '*' @@ -3035,14 +2959,14 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.1 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.71 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.73 '@types/react-dom': 18.2.22 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-menu@2.0.6(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-menu@2.0.6(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-BVkFLS+bUC8HcImkRKPSiVumA1VPOOEC5WBMiT+QAVsPzW1FJzI9KnqgGxVDPBcql5xXrHkD3JOVoXWEXD8SYA==} peerDependencies: '@types/react': '*' @@ -3057,30 +2981,30 @@ packages: dependencies: '@babel/runtime': 7.24.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@types/react': 18.2.71 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@types/react': 18.2.73 '@types/react-dom': 18.2.22 aria-hidden: 1.2.4 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.5(@types/react@18.2.71)(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.73)(react@18.2.0) dev: false - /@radix-ui/react-navigation-menu@1.1.4(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-navigation-menu@1.1.4(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-Cc+seCS3PmWmjI51ufGG7zp1cAAIRqHVw7C9LOA2TZ+R4hG6rDvHcTqIsEEFLmZO3zNVH72jOOE7kKNy8W+RtA==} peerDependencies: '@types/react': '*' @@ -3095,26 +3019,26 @@ packages: dependencies: '@babel/runtime': 7.24.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.71 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.73 '@types/react-dom': 18.2.22 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-popover@1.0.6(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-popover@1.0.6(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-cZ4defGpkZ0qTRtlIBzJLSzL6ht7ofhhW4i1+pkemjV1IKXm0wgCRnee154qlV6r9Ttunmh2TNZhMfV2bavUyA==} peerDependencies: '@types/react': '*' @@ -3129,27 +3053,27 @@ packages: dependencies: '@babel/runtime': 7.24.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@types/react': 18.2.71 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@types/react': 18.2.73 '@types/react-dom': 18.2.22 aria-hidden: 1.2.4 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.5(@types/react@18.2.71)(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.73)(react@18.2.0) dev: false - /@radix-ui/react-popover@1.0.7(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-popover@1.0.7(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-shtvVnlsxT6faMnK/a7n0wptwBD23xc1Z5mdrtKLwVEfsEMXodS0r5s0/g5P0hX//EKYZS2sxUjqfzlg52ZSnQ==} peerDependencies: '@types/react': '*' @@ -3164,27 +3088,27 @@ packages: dependencies: '@babel/runtime': 7.24.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@types/react': 18.2.71 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@types/react': 18.2.73 '@types/react-dom': 18.2.22 aria-hidden: 1.2.4 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.5(@types/react@18.2.71)(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.73)(react@18.2.0) dev: false - /@radix-ui/react-popper@1.1.2(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-popper@1.1.2(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-1CnGGfFi/bbqtJZZ0P/NQY20xdG3E0LALJaLUEoKwPLwl6PPPfbeiCqMVQnhoFRAxjJj4RpBRJzDmUgsex2tSg==} peerDependencies: '@types/react': '*' @@ -3199,22 +3123,22 @@ packages: dependencies: '@babel/runtime': 7.24.1 '@floating-ui/react-dom': 2.0.8(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.71)(react@18.2.0) + '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/rect': 1.0.1 - '@types/react': 18.2.71 + '@types/react': 18.2.73 '@types/react-dom': 18.2.22 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-popper@1.1.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-popper@1.1.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-cKpopj/5RHZWjrbF2846jBNacjQVwkP068DfmgrNJXpvVWrOvlAmE9xSiy5OqeE+Gi8D9fP+oDhUnPqNMY8/5w==} peerDependencies: '@types/react': '*' @@ -3229,34 +3153,22 @@ packages: dependencies: '@babel/runtime': 7.24.1 '@floating-ui/react-dom': 2.0.8(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.71)(react@18.2.0) + '@radix-ui/react-arrow': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-use-rect': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.73)(react@18.2.0) '@radix-ui/rect': 1.0.1 - '@types/react': 18.2.71 + '@types/react': 18.2.73 '@types/react-dom': 18.2.22 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-portal@1.0.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-a8qyFO/Xb99d8wQdu4o7qnigNjTPG123uADNecz0eX4usnQEj7o+cG4ZX4zkqq98NYekT7UoEQIjxBNWIFuqTA==} - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - dependencies: - '@babel/runtime': 7.24.1 - '@radix-ui/react-primitive': 1.0.0(react-dom@18.2.0)(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@radix-ui/react-portal@1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-portal@1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-xLYZeHrWoPmA5mEKEfZZevoVRK/Q43GfzRXkWV6qawIWWK8t6ifIiLQdd7rmQ4Vk1bmI21XhqF9BN3jWf+phpA==} peerDependencies: '@types/react': '*' @@ -3270,14 +3182,14 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.1 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.71 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.73 '@types/react-dom': 18.2.22 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-portal@1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-portal@1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-Qki+C/EuGUVCQTOTD5vzJzJuMUlewbzuKyUy+/iHM2uwGiru9gZeBJtHAPKAEkB5KWGi9mP/CHKcY0wt1aW45Q==} peerDependencies: '@types/react': '*' @@ -3291,27 +3203,14 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.1 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.71 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.73 '@types/react-dom': 18.2.22 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-presence@1.0.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w==} - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - dependencies: - '@babel/runtime': 7.24.1 - '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.0(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-presence@1.0.1(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-UXLW4UAbIY5ZjcvzjfRFo5gxva8QirC9hF7wRE4U5gz+TP0DbRk+//qyuAQ1McDxBt1xNMBTaciFGvEmJvAZCg==} peerDependencies: '@types/react': '*' @@ -3325,27 +3224,15 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@types/react': 18.2.71 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@types/react': 18.2.73 '@types/react-dom': 18.2.22 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-primitive@1.0.0(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ==} - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - dependencies: - '@babel/runtime': 7.24.1 - '@radix-ui/react-slot': 1.0.0(react@18.2.0) - react: 18.2.0 - react-dom: 18.2.0(react@18.2.0) - dev: false - - /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-primitive@1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-yi58uVyoAcK/Nq1inRY56ZSjKypBNKTa/1mcL8qdl6oJeEaDbOldlzrGn7P6Q3Id5d+SYNGc5AJgc4vGhjs5+g==} peerDependencies: '@types/react': '*' @@ -3359,14 +3246,14 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.1 - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.71)(react@18.2.0) - '@types/react': 18.2.71 + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.73)(react@18.2.0) + '@types/react': 18.2.73 '@types/react-dom': 18.2.22 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-radio-group@1.1.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-radio-group@1.1.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-x+yELayyefNeKeTx4fjK6j99Fs6c4qKm3aY38G3swQVTN6xMpsrbigC0uHs2L//g8q4qR7qOcww8430jJmi2ag==} peerDependencies: '@types/react': '*' @@ -3381,22 +3268,22 @@ packages: dependencies: '@babel/runtime': 7.24.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@types/react': 18.2.71 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-use-size': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@types/react': 18.2.73 '@types/react-dom': 18.2.22 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-roving-focus@1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-2mUg5Mgcu001VkGy+FfzZyzbmuUWzgWkj3rvv4yu+mLw03+mTzbxZHvfcGyFp2b8EkQeMkpRQ5FiA2Vr2O6TeQ==} peerDependencies: '@types/react': '*' @@ -3411,21 +3298,21 @@ packages: dependencies: '@babel/runtime': 7.24.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@types/react': 18.2.71 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@types/react': 18.2.73 '@types/react-dom': 18.2.22 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-scroll-area@1.0.5(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-scroll-area@1.0.5(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-b6PAgH4GQf9QEn8zbT2XUHpW5z8BzqEc7Kl11TwDrvuTrxlkcjTD5qa/bxgKr+nmuXKu4L/W5UZ4mlP/VG/5Gw==} peerDependencies: '@types/react': '*' @@ -3441,20 +3328,20 @@ packages: '@babel/runtime': 7.24.1 '@radix-ui/number': 1.0.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@types/react': 18.2.71 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@types/react': 18.2.73 '@types/react-dom': 18.2.22 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-select@2.0.0(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-select@2.0.0(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-RH5b7af4oHtkcHS7pG6Sgv5rk5Wxa7XI8W5gvB1N/yiuDGZxko1ynvOiVhFM7Cis2A8zxF9bTOUVbRDzPepe6w==} peerDependencies: '@types/react': '*' @@ -3470,32 +3357,32 @@ packages: '@babel/runtime': 7.24.1 '@radix-ui/number': 1.0.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.71 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-focus-guards': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-focus-scope': 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-use-previous': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.73 '@types/react-dom': 18.2.22 aria-hidden: 1.2.4 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - react-remove-scroll: 2.5.5(@types/react@18.2.71)(react@18.2.0) + react-remove-scroll: 2.5.5(@types/react@18.2.73)(react@18.2.0) dev: false - /@radix-ui/react-separator@1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-separator@1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-itYmTy/kokS21aiV5+Z56MZB54KrhPgn6eHDKkFeOLR34HMN2s8PaN47qZZAGnvupcjxHaFZnW4pQEh0BvvVuw==} peerDependencies: '@types/react': '*' @@ -3509,24 +3396,14 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.1 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.71 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.73 '@types/react-dom': 18.2.22 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-slot@1.0.0(react@18.2.0): - resolution: {integrity: sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ==} - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 - dependencies: - '@babel/runtime': 7.24.1 - '@radix-ui/react-compose-refs': 1.0.0(react@18.2.0) - react: 18.2.0 - dev: false - - /@radix-ui/react-slot@1.0.2(@types/react@18.2.71)(react@18.2.0): + /@radix-ui/react-slot@1.0.2(@types/react@18.2.73)(react@18.2.0): resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==} peerDependencies: '@types/react': '*' @@ -3536,12 +3413,12 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@types/react': 18.2.71 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@types/react': 18.2.73 react: 18.2.0 dev: false - /@radix-ui/react-tabs@1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-tabs@1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-egZfYY/+wRNCflXNHx+dePvnz9FbmssDTJBtgRfDY7e8SE5oIo3Py2eCB1ckAbh1Q7cQ/6yJZThJ++sgbxibog==} peerDependencies: '@types/react': '*' @@ -3556,20 +3433,20 @@ packages: dependencies: '@babel/runtime': 7.24.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-context': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@types/react': 18.2.71 + '@radix-ui/react-context': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@types/react': 18.2.73 '@types/react-dom': 18.2.22 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-toast@1.1.5(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-toast@1.1.5(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-fRLn227WHIBRSzuRzGJ8W+5YALxofH23y0MlPLddaIpLpCDqdE0NZlS2NRQDRiptfxDeeCjgFIpexB1/zkxDlw==} peerDependencies: '@types/react': '*' @@ -3584,24 +3461,24 @@ packages: dependencies: '@babel/runtime': 7.24.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.71 + '@radix-ui/react-collection': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.73 '@types/react-dom': 18.2.22 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-toggle-group@1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-toggle-group@1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-Uaj/M/cMyiyT9Bx6fOZO0SAG4Cls0GptBWiBmBxofmDbNVnYYoyRWj/2M/6VCi/7qcXFWnHhRUfdfZFvvkuu8A==} peerDependencies: '@types/react': '*' @@ -3616,19 +3493,19 @@ packages: dependencies: '@babel/runtime': 7.24.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-context': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-direction': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-toggle': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@types/react': 18.2.71 + '@radix-ui/react-context': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-direction': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-roving-focus': 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-toggle': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@types/react': 18.2.73 '@types/react-dom': 18.2.22 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-toggle@1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-toggle@1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-Pkqg3+Bc98ftZGsl60CLANXQBBQ4W3mTFS9EJvNxKMZ7magklKV69/id1mlAlOFDDfHvlCms0fx8fA4CMKDJHg==} peerDependencies: '@types/react': '*' @@ -3643,15 +3520,15 @@ packages: dependencies: '@babel/runtime': 7.24.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@types/react': 18.2.71 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@types/react': 18.2.73 '@types/react-dom': 18.2.22 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-tooltip@1.0.6(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-tooltip@1.0.6(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-DmNFOiwEc2UDigsYj6clJENma58OelxD24O4IODoZ+3sQc3Zb+L8w1EP+y9laTuKCLAysPw4fD6/v0j4KNV8rg==} peerDependencies: '@types/react': '*' @@ -3666,24 +3543,24 @@ packages: dependencies: '@babel/runtime': 7.24.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.71 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-popper': 1.1.2(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.73 '@types/react-dom': 18.2.22 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-tooltip@1.0.7(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-tooltip@1.0.7(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-lPh5iKNFVQ/jav/j6ZrWq3blfDJ0OH9R6FlNUHPMqdLuQ9vwDgFsRxvl8b7Asuy5c8xmoojHUxKHQSOAvMHxyw==} peerDependencies: '@types/react': '*' @@ -3698,33 +3575,24 @@ packages: dependencies: '@babel/runtime': 7.24.1 '@radix-ui/primitive': 1.0.1 - '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-context': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-id': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.71 + '@radix-ui/react-compose-refs': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-context': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-dismissable-layer': 1.0.5(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-id': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-popper': 1.1.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-portal': 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-presence': 1.0.1(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-use-controllable-state': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-visually-hidden': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.73 '@types/react-dom': 18.2.22 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false - /@radix-ui/react-use-callback-ref@1.0.0(react@18.2.0): - resolution: {integrity: sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg==} - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 - dependencies: - '@babel/runtime': 7.24.1 - react: 18.2.0 - dev: false - - /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.71)(react@18.2.0): + /@radix-ui/react-use-callback-ref@1.0.1(@types/react@18.2.73)(react@18.2.0): resolution: {integrity: sha512-D94LjX4Sp0xJFVaoQOd3OO9k7tpBYNOXdVhkltUbGv2Qb9OXdrg/CpsjlZv7ia14Sylv398LswWBVVu5nqKzAQ==} peerDependencies: '@types/react': '*' @@ -3734,21 +3602,11 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.1 - '@types/react': 18.2.71 + '@types/react': 18.2.73 react: 18.2.0 dev: false - /@radix-ui/react-use-controllable-state@1.0.0(react@18.2.0): - resolution: {integrity: sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg==} - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 - dependencies: - '@babel/runtime': 7.24.1 - '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) - react: 18.2.0 - dev: false - - /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.71)(react@18.2.0): + /@radix-ui/react-use-controllable-state@1.0.1(@types/react@18.2.73)(react@18.2.0): resolution: {integrity: sha512-Svl5GY5FQeN758fWKrjM6Qb7asvXeiZltlT4U2gVfl8Gx5UAv2sMR0LWo8yhsIZh2oQ0eFdZ59aoOOMV7b47VA==} peerDependencies: '@types/react': '*' @@ -3758,22 +3616,12 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.1 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@types/react': 18.2.71 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@types/react': 18.2.73 react: 18.2.0 dev: false - /@radix-ui/react-use-escape-keydown@1.0.0(react@18.2.0): - resolution: {integrity: sha512-JwfBCUIfhXRxKExgIqGa4CQsiMemo1Xt0W/B4ei3fpzpvPENKpMKQ8mZSB6Acj3ebrAEgi2xiQvcI1PAAodvyg==} - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 - dependencies: - '@babel/runtime': 7.24.1 - '@radix-ui/react-use-callback-ref': 1.0.0(react@18.2.0) - react: 18.2.0 - dev: false - - /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.71)(react@18.2.0): + /@radix-ui/react-use-escape-keydown@1.0.3(@types/react@18.2.73)(react@18.2.0): resolution: {integrity: sha512-vyL82j40hcFicA+M4Ex7hVkB9vHgSse1ZWomAqV2Je3RleKGO5iM8KMOEtfoSB0PnIelMd2lATjTGMYqN5ylTg==} peerDependencies: '@types/react': '*' @@ -3783,21 +3631,12 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.1 - '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@types/react': 18.2.71 + '@radix-ui/react-use-callback-ref': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@types/react': 18.2.73 react: 18.2.0 dev: false - /@radix-ui/react-use-layout-effect@1.0.0(react@18.2.0): - resolution: {integrity: sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ==} - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 - dependencies: - '@babel/runtime': 7.24.1 - react: 18.2.0 - dev: false - - /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.71)(react@18.2.0): + /@radix-ui/react-use-layout-effect@1.0.1(@types/react@18.2.73)(react@18.2.0): resolution: {integrity: sha512-v/5RegiJWYdoCvMnITBkNNx6bCj20fiaJnWtRkU18yITptraXjffz5Qbn05uOiQnOvi+dbkznkoaMltz1GnszQ==} peerDependencies: '@types/react': '*' @@ -3807,11 +3646,11 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.1 - '@types/react': 18.2.71 + '@types/react': 18.2.73 react: 18.2.0 dev: false - /@radix-ui/react-use-previous@1.0.1(@types/react@18.2.71)(react@18.2.0): + /@radix-ui/react-use-previous@1.0.1(@types/react@18.2.73)(react@18.2.0): resolution: {integrity: sha512-cV5La9DPwiQ7S0gf/0qiD6YgNqM5Fk97Kdrlc5yBcrF3jyEZQwm7vYFqMo4IfeHgJXsRaMvLABFtd0OVEmZhDw==} peerDependencies: '@types/react': '*' @@ -3821,11 +3660,11 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.1 - '@types/react': 18.2.71 + '@types/react': 18.2.73 react: 18.2.0 dev: false - /@radix-ui/react-use-rect@1.0.1(@types/react@18.2.71)(react@18.2.0): + /@radix-ui/react-use-rect@1.0.1(@types/react@18.2.73)(react@18.2.0): resolution: {integrity: sha512-Cq5DLuSiuYVKNU8orzJMbl15TXilTnJKUCltMVQg53BQOF1/C5toAaGrowkgksdBQ9H+SRL23g0HDmg9tvmxXw==} peerDependencies: '@types/react': '*' @@ -3836,11 +3675,11 @@ packages: dependencies: '@babel/runtime': 7.24.1 '@radix-ui/rect': 1.0.1 - '@types/react': 18.2.71 + '@types/react': 18.2.73 react: 18.2.0 dev: false - /@radix-ui/react-use-size@1.0.1(@types/react@18.2.71)(react@18.2.0): + /@radix-ui/react-use-size@1.0.1(@types/react@18.2.73)(react@18.2.0): resolution: {integrity: sha512-ibay+VqrgcaI6veAojjofPATwledXiSmX+C0KrBk/xgpX9rBzPV3OsfwlhQdUOFbh+LKQorLYT+xTXW9V8yd0g==} peerDependencies: '@types/react': '*' @@ -3850,12 +3689,12 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.1 - '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.71)(react@18.2.0) - '@types/react': 18.2.71 + '@radix-ui/react-use-layout-effect': 1.0.1(@types/react@18.2.73)(react@18.2.0) + '@types/react': 18.2.73 react: 18.2.0 dev: false - /@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0): + /@radix-ui/react-visually-hidden@1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-D4w41yN5YRKtu464TLnByKzMDG/JlMPHtfZgQAu9v6mNakUqGUI9vUrfQKz8NK41VMm/xbZbh76NUTVtIYqOMA==} peerDependencies: '@types/react': '*' @@ -3869,8 +3708,8 @@ packages: optional: true dependencies: '@babel/runtime': 7.24.1 - '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@types/react': 18.2.71 + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@types/react': 18.2.73 '@types/react-dom': 18.2.22 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -3927,7 +3766,7 @@ packages: react: 18.2.0 dev: false - /@react-email/components@0.0.15(@types/react@18.2.71)(react-email@2.1.0)(react@18.2.0): + /@react-email/components@0.0.15(@types/react@18.2.73)(react-email@2.1.0)(react@18.2.0): resolution: {integrity: sha512-jXfKiuyi94JBYfPVptEUwF57nRCvhEZIfyl2LqbL53fKsMrGlcjlN921iNnx1z41GAJOqZ8LPogeix3Iid23zw==} engines: {node: '>=18.0.0'} peerDependencies: @@ -3941,7 +3780,7 @@ packages: '@react-email/container': 0.0.11(react@18.2.0) '@react-email/font': 0.0.5(react@18.2.0) '@react-email/head': 0.0.7(react@18.2.0) - '@react-email/heading': 0.0.11(@types/react@18.2.71)(react@18.2.0) + '@react-email/heading': 0.0.11(@types/react@18.2.73)(react@18.2.0) '@react-email/hr': 0.0.7(react@18.2.0) '@react-email/html': 0.0.7(react@18.2.0) '@react-email/img': 0.0.7(react@18.2.0) @@ -3985,13 +3824,13 @@ packages: react: 18.2.0 dev: false - /@react-email/heading@0.0.11(@types/react@18.2.71)(react@18.2.0): + /@react-email/heading@0.0.11(@types/react@18.2.73)(react@18.2.0): resolution: {integrity: sha512-EF5ZtRCxhHPw3m+8iibKKg0RAvAeHj1AP68sjU7s6+J+kvRgllr/E972Wi5Y8UvcIGossCvpX1WrSMDzeB4puA==} engines: {node: '>=18.0.0'} peerDependencies: react: 18.2.0 dependencies: - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.71)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.73)(react@18.2.0) react: 18.2.0 transitivePeerDependencies: - '@types/react' @@ -4341,15 +4180,15 @@ packages: /@tanstack/query-core@5.28.6: resolution: {integrity: sha512-hnhotV+DnQtvtR3jPvbQMPNMW4KEK0J4k7c609zJ8muiNknm+yoDyMHmxTWM5ZnlZpsz0zOxYFr+mzRJNHWJsA==} - /@tanstack/react-query-next-experimental@5.28.8(@tanstack/react-query@5.28.6)(next@14.2.0-canary.44)(react@18.2.0): - resolution: {integrity: sha512-1JAh1SHrqX1PPfoJtEiS8ewvz7D3lkBsIvDCpE8hWB07EF4O8hxPWQiVDf/fJ7U2g6N7iARX74335BHpCg250Q==} + /@tanstack/react-query-next-experimental@5.28.9(@tanstack/react-query@5.28.6)(next@14.2.0-canary.46)(react@18.2.0): + resolution: {integrity: sha512-cihvqAme8nX6O5jeWtk19fnMsgXTX5puHwj6ya2Gf6FZIKhcFTrXQ9npH3ACcbinmVYPcQrShk/D3XAGKR/AUg==} peerDependencies: - '@tanstack/react-query': ^5.28.8 + '@tanstack/react-query': ^5.28.9 next: ^13 || ^14 react: ^18.0.0 dependencies: '@tanstack/react-query': 5.28.6(react@18.2.0) - next: 14.2.0-canary.44(@opentelemetry/api@1.8.0)(react-dom@18.2.0)(react@18.2.0) + next: 14.2.0-canary.46(@opentelemetry/api@1.8.0)(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 dev: false @@ -4400,8 +4239,8 @@ packages: - supports-color dev: false - /@tsconfig/node10@1.0.10: - resolution: {integrity: sha512-PiaIWIoPvO6qm6t114ropMCagj6YAF24j9OkCA2mJDXFnlionEwhsBCJ8yek4aib575BI3OkART/90WsgHgLWw==} + /@tsconfig/node10@1.0.11: + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} dev: false /@tsconfig/node12@1.0.11: @@ -4636,22 +4475,18 @@ packages: /@types/react-dom@18.2.22: resolution: {integrity: sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ==} dependencies: - '@types/react': 18.2.71 + '@types/react': 18.2.73 - /@types/react@18.2.71: - resolution: {integrity: sha512-PxEsB9OjmQeYGffoWnYAd/r5FiJuUw2niFQHPc2v2idwh8wGPkkYzOHuinNJJY6NZqfoTCiOIizDOz38gYNsyw==} + /@types/react@18.2.73: + resolution: {integrity: sha512-XcGdod0Jjv84HOC7N5ziY3x+qL0AfmubvKOZ9hJjJ2yd5EE+KYjWhdOjt387e9HPheHkdggF9atTifMRtyAaRA==} dependencies: '@types/prop-types': 15.7.12 - '@types/scheduler': 0.23.0 csstype: 3.1.3 /@types/resolve@1.20.6: resolution: {integrity: sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==} dev: false - /@types/scheduler@0.23.0: - resolution: {integrity: sha512-YIoDCTH3Af6XM5VuwGG/QL/CJqga1Zm3NkU3HZ4ZHK2fRMPYP1VczsTUqtsf43PH/iJNVlPHAo2oWX7BSdB2Hw==} - /@types/semver@6.2.7: resolution: {integrity: sha512-blctEWbzUFzQx799RZjzzIdBJOXmE37YYEyDtKkx5Dg+V7o/zyyAxLPiI98A2jdTtDgxZleMdfV+7p8WbRJ1OQ==} dev: false @@ -5354,7 +5189,7 @@ packages: hasBin: true dependencies: caniuse-lite: 1.0.30001600 - electron-to-chromium: 1.4.717 + electron-to-chromium: 1.4.719 node-releases: 2.0.14 update-browserslist-db: 1.0.13(browserslist@4.23.0) @@ -5661,17 +5496,19 @@ packages: engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} dev: false - /cmdk@0.2.1(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-U6//9lQ6JvT47+6OF6Gi8BvkxYQ8SCRRSKIJkthIMsFsLZRG0cKvTtuTaefyIKMQb8rvvXy0wGdpTNq/jPtm+g==} + /cmdk@1.0.0(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-gDzVf0a09TvoJ5jnuPvygTB77+XdOSwEmJ88L6XPFPlv7T3RxbP9jgenfylrAMD0+Le1aO0nVjQUzl2g+vjz5Q==} peerDependencies: react: ^18.0.0 react-dom: ^18.0.0 dependencies: - '@radix-ui/react-dialog': 1.0.0(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-dialog': 1.0.5(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-primitive': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: - '@types/react' + - '@types/react-dom' dev: false /color-convert@1.9.3: @@ -6202,12 +6039,12 @@ packages: /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - /edge-csrf@1.0.9(next@14.2.0-canary.44): + /edge-csrf@1.0.9(next@14.2.0-canary.46): resolution: {integrity: sha512-3F89YTh42UDdISr3s9AEcgJDLi4ysgjGfnybzF0LuZGaG2W31h1ZwgWwEQBLMj04lAklcP4XHZYi7vk9o8zcbg==} peerDependencies: next: ^13.0.0 || ^14.0.0 dependencies: - next: 14.2.0-canary.44(@opentelemetry/api@1.8.0)(react-dom@18.2.0)(react@18.2.0) + next: 14.2.0-canary.46(@opentelemetry/api@1.8.0)(react-dom@18.2.0)(react@18.2.0) dev: false /editorconfig@1.0.4: @@ -6221,8 +6058,8 @@ packages: semver: 7.6.0 dev: false - /electron-to-chromium@1.4.717: - resolution: {integrity: sha512-6Fmg8QkkumNOwuZ/5mIbMU9WI3H2fmn5ajcVya64I5Yr5CcNmO7vcLt0Y7c96DCiMO5/9G+4sI2r6eEvdg1F7A==} + /electron-to-chromium@1.4.719: + resolution: {integrity: sha512-FbWy2Q2YgdFzkFUW/W5jBjE9dj+804+98E4Pup78JBPnbdb3pv6IneY2JCPKdeKLh3AOKHQeYf+KwLr7mxGh6Q==} /emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -7176,7 +7013,7 @@ packages: jackspeak: 2.3.6 minimatch: 9.0.3 minipass: 7.0.4 - path-scurry: 1.10.1 + path-scurry: 1.10.2 /glob@10.3.4: resolution: {integrity: sha512-6LFElP3A+i/Q8XQKEvZjkEWEOTgAIALR9AO2rwT8bgPhDd1anmqDJDZ6lLddI4ehxxxR1S5RIqKe1uapMQfYaQ==} @@ -7187,7 +7024,7 @@ packages: jackspeak: 2.3.6 minimatch: 9.0.3 minipass: 7.0.4 - path-scurry: 1.10.1 + path-scurry: 1.10.2 dev: false /glob@7.2.3: @@ -8959,7 +8796,7 @@ packages: engines: {node: '>= 0.4.0'} dev: false - /next-contentlayer@0.3.4(contentlayer@0.3.4)(esbuild@0.20.2)(next@14.2.0-canary.44)(react-dom@18.2.0)(react@18.2.0): + /next-contentlayer@0.3.4(contentlayer@0.3.4)(esbuild@0.20.2)(next@14.2.0-canary.46)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-UtUCwgAl159KwfhNaOwyiI7Lg6sdioyKMeh+E7jxx0CJ29JuXGxBEYmCI6+72NxFGIFZKx8lvttbbQhbnYWYSw==} peerDependencies: contentlayer: 0.3.4 @@ -8970,7 +8807,7 @@ packages: '@contentlayer/core': 0.3.4(esbuild@0.20.2) '@contentlayer/utils': 0.3.4 contentlayer: 0.3.4(esbuild@0.20.2) - next: 14.2.0-canary.44(@opentelemetry/api@1.8.0)(react-dom@18.2.0)(react@18.2.0) + next: 14.2.0-canary.46(@opentelemetry/api@1.8.0)(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) transitivePeerDependencies: @@ -8980,7 +8817,7 @@ packages: - supports-color dev: false - /next-sitemap@4.2.3(next@14.2.0-canary.44): + /next-sitemap@4.2.3(next@14.2.0-canary.46): resolution: {integrity: sha512-vjdCxeDuWDzldhCnyFCQipw5bfpl4HmZA7uoo3GAaYGjGgfL4Cxb1CiztPuWGmS+auYs7/8OekRS8C2cjdAsjQ==} engines: {node: '>=14.18'} hasBin: true @@ -8991,17 +8828,17 @@ packages: '@next/env': 13.5.6 fast-glob: 3.3.2 minimist: 1.2.8 - next: 14.2.0-canary.44(@opentelemetry/api@1.8.0)(react-dom@18.2.0)(react@18.2.0) + next: 14.2.0-canary.46(@opentelemetry/api@1.8.0)(react-dom@18.2.0)(react@18.2.0) dev: false - /next-themes@0.2.1(next@14.2.0-canary.44)(react-dom@18.2.0)(react@18.2.0): + /next-themes@0.2.1(next@14.2.0-canary.46)(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-B+AKNfYNIzh0vqQQKqQItTS8evEouKD7H5Hj3kmuPERwddR2TxvDSFZuTj6T7Jfn1oyeUyJMydPl1Bkxkh0W7A==} peerDependencies: next: '*' react: '*' react-dom: '*' dependencies: - next: 14.2.0-canary.44(@opentelemetry/api@1.8.0)(react-dom@18.2.0)(react@18.2.0) + next: 14.2.0-canary.46(@opentelemetry/api@1.8.0)(react-dom@18.2.0)(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) dev: false @@ -9045,8 +8882,8 @@ packages: - babel-plugin-macros dev: false - /next@14.2.0-canary.44(@opentelemetry/api@1.8.0)(react-dom@18.2.0)(react@18.2.0): - resolution: {integrity: sha512-/f26kB0PHbggCRt6WSre695wKCYzCVQed1K3UFp5830wD6OMLM6j/ZMBgHx0AXD/JPR3dq2T2slX6LLEyYdnVw==} + /next@14.2.0-canary.46(@opentelemetry/api@1.8.0)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-U4fpW156Er90T4AdeWSFze57Lz+ZhEwXoUkwEopiP71fWfOSJ3FN12odHJ6O13Ae4HoDEy2P6CGXrJ/0De9LnA==} engines: {node: '>=18.17.0'} hasBin: true peerDependencies: @@ -9063,7 +8900,7 @@ packages: sass: optional: true dependencies: - '@next/env': 14.2.0-canary.44 + '@next/env': 14.2.0-canary.46 '@opentelemetry/api': 1.8.0 '@swc/helpers': 0.5.5 busboy: 1.6.0 @@ -9074,15 +8911,15 @@ packages: react-dom: 18.2.0(react@18.2.0) styled-jsx: 5.1.1(react@18.2.0) optionalDependencies: - '@next/swc-darwin-arm64': 14.2.0-canary.44 - '@next/swc-darwin-x64': 14.2.0-canary.44 - '@next/swc-linux-arm64-gnu': 14.2.0-canary.44 - '@next/swc-linux-arm64-musl': 14.2.0-canary.44 - '@next/swc-linux-x64-gnu': 14.2.0-canary.44 - '@next/swc-linux-x64-musl': 14.2.0-canary.44 - '@next/swc-win32-arm64-msvc': 14.2.0-canary.44 - '@next/swc-win32-ia32-msvc': 14.2.0-canary.44 - '@next/swc-win32-x64-msvc': 14.2.0-canary.44 + '@next/swc-darwin-arm64': 14.2.0-canary.46 + '@next/swc-darwin-x64': 14.2.0-canary.46 + '@next/swc-linux-arm64-gnu': 14.2.0-canary.46 + '@next/swc-linux-arm64-musl': 14.2.0-canary.46 + '@next/swc-linux-x64-gnu': 14.2.0-canary.46 + '@next/swc-linux-x64-musl': 14.2.0-canary.46 + '@next/swc-win32-arm64-msvc': 14.2.0-canary.46 + '@next/swc-win32-ia32-msvc': 14.2.0-canary.46 + '@next/swc-win32-x64-msvc': 14.2.0-canary.46 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros @@ -9491,8 +9328,8 @@ packages: /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - /path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + /path-scurry@1.10.2: + resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==} engines: {node: '>=16 || 14 >=14.17'} dependencies: lru-cache: 10.2.0 @@ -9584,6 +9421,18 @@ packages: postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 + dev: false + + /postcss-import@15.1.0(postcss@8.4.38): + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.8 /postcss-js@4.0.1(postcss@8.4.33): resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} @@ -9593,6 +9442,16 @@ packages: dependencies: camelcase-css: 2.0.1 postcss: 8.4.33 + dev: false + + /postcss-js@4.0.1(postcss@8.4.38): + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.38 /postcss-load-config@4.0.2(postcss@8.4.33): resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} @@ -9609,6 +9468,23 @@ packages: lilconfig: 3.1.1 postcss: 8.4.33 yaml: 2.4.1 + dev: false + + /postcss-load-config@4.0.2(postcss@8.4.38): + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 3.1.1 + postcss: 8.4.38 + yaml: 2.4.1 /postcss-nested@6.0.1(postcss@8.4.33): resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} @@ -9618,6 +9494,16 @@ packages: dependencies: postcss: 8.4.33 postcss-selector-parser: 6.0.16 + dev: false + + /postcss-nested@6.0.1(postcss@8.4.38): + resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 /postcss-selector-parser@6.0.16: resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} @@ -9655,18 +9541,27 @@ packages: source-map-js: 1.2.0 dev: false + /postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.2.0 + /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - /prettier-plugin-tailwindcss@0.5.12(@ianvs/prettier-plugin-sort-imports@4.2.1)(prettier@3.2.5): - resolution: {integrity: sha512-o74kiDBVE73oHW+pdkFSluHBL3cYEvru5YgEqNkBMFF7Cjv+w1vI565lTlfoJT4VLWDe0FMtZ7FkE/7a4pMXSQ==} + /prettier-plugin-tailwindcss@0.5.13(@ianvs/prettier-plugin-sort-imports@4.2.1)(prettier@3.2.5): + resolution: {integrity: sha512-2tPWHCFNC+WRjAC4SIWQNSOdcL1NNkydXim8w7TDqlZi+/ulZYz2OouAI6qMtkggnPt7lGamboj6LcTMwcCvoQ==} engines: {node: '>=14.21.3'} peerDependencies: '@ianvs/prettier-plugin-sort-imports': '*' '@prettier/plugin-pug': '*' '@shopify/prettier-plugin-liquid': '*' '@trivago/prettier-plugin-sort-imports': '*' + '@zackad/prettier-plugin-twig-melody': '*' prettier: ^3.0 prettier-plugin-astro: '*' prettier-plugin-css-order: '*' @@ -9678,7 +9573,6 @@ packages: prettier-plugin-sort-imports: '*' prettier-plugin-style-order: '*' prettier-plugin-svelte: '*' - prettier-plugin-twig-melody: '*' peerDependenciesMeta: '@ianvs/prettier-plugin-sort-imports': optional: true @@ -9688,6 +9582,8 @@ packages: optional: true '@trivago/prettier-plugin-sort-imports': optional: true + '@zackad/prettier-plugin-twig-melody': + optional: true prettier-plugin-astro: optional: true prettier-plugin-css-order: @@ -9708,8 +9604,6 @@ packages: optional: true prettier-plugin-svelte: optional: true - prettier-plugin-twig-melody: - optional: true dependencies: '@ianvs/prettier-plugin-sort-imports': 4.2.1(prettier@3.2.5) prettier: 3.2.5 @@ -9875,15 +9769,15 @@ packages: hasBin: true dependencies: '@radix-ui/colors': 1.0.1 - '@radix-ui/react-collapsible': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-popover': 1.0.6(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-slot': 1.0.2(@types/react@18.2.71)(react@18.2.0) - '@radix-ui/react-toggle-group': 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@radix-ui/react-tooltip': 1.0.6(@types/react-dom@18.2.22)(@types/react@18.2.71)(react-dom@18.2.0)(react@18.2.0) - '@react-email/components': 0.0.15(@types/react@18.2.71)(react-email@2.1.0)(react@18.2.0) + '@radix-ui/react-collapsible': 1.0.3(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-popover': 1.0.6(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-slot': 1.0.2(@types/react@18.2.73)(react@18.2.0) + '@radix-ui/react-toggle-group': 1.0.4(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@radix-ui/react-tooltip': 1.0.6(@types/react-dom@18.2.22)(@types/react@18.2.73)(react-dom@18.2.0)(react@18.2.0) + '@react-email/components': 0.0.15(@types/react@18.2.73)(react-email@2.1.0)(react@18.2.0) '@react-email/render': 0.0.12 '@swc/core': 1.3.101 - '@types/react': 18.2.71 + '@types/react': 18.2.73 '@types/react-dom': 18.2.22 '@types/webpack': 5.28.5(@swc/core@1.3.101)(esbuild@0.19.11) autoprefixer: 10.4.14(postcss@8.4.35) @@ -9962,7 +9856,7 @@ packages: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} dev: false - /react-remove-scroll-bar@2.3.6(@types/react@18.2.71)(react@18.2.0): + /react-remove-scroll-bar@2.3.6(@types/react@18.2.73)(react@18.2.0): resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==} engines: {node: '>=10'} peerDependencies: @@ -9972,32 +9866,13 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.71 + '@types/react': 18.2.73 react: 18.2.0 - react-style-singleton: 2.2.1(@types/react@18.2.71)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.73)(react@18.2.0) tslib: 2.6.2 dev: false - /react-remove-scroll@2.5.4(@types/react@18.2.71)(react@18.2.0): - resolution: {integrity: sha512-xGVKJJr0SJGQVirVFAUZ2k1QLyO6m+2fy0l8Qawbp5Jgrv3DeLalrfMNBFSlmz5kriGGzsVBtGVnf4pTKIhhWA==} - engines: {node: '>=10'} - peerDependencies: - '@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0 - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - peerDependenciesMeta: - '@types/react': - optional: true - dependencies: - '@types/react': 18.2.71 - react: 18.2.0 - react-remove-scroll-bar: 2.3.6(@types/react@18.2.71)(react@18.2.0) - react-style-singleton: 2.2.1(@types/react@18.2.71)(react@18.2.0) - tslib: 2.6.2 - use-callback-ref: 1.3.2(@types/react@18.2.71)(react@18.2.0) - use-sidecar: 1.1.2(@types/react@18.2.71)(react@18.2.0) - dev: false - - /react-remove-scroll@2.5.5(@types/react@18.2.71)(react@18.2.0): + /react-remove-scroll@2.5.5(@types/react@18.2.73)(react@18.2.0): resolution: {integrity: sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw==} engines: {node: '>=10'} peerDependencies: @@ -10007,13 +9882,13 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.71 + '@types/react': 18.2.73 react: 18.2.0 - react-remove-scroll-bar: 2.3.6(@types/react@18.2.71)(react@18.2.0) - react-style-singleton: 2.2.1(@types/react@18.2.71)(react@18.2.0) + react-remove-scroll-bar: 2.3.6(@types/react@18.2.73)(react@18.2.0) + react-style-singleton: 2.2.1(@types/react@18.2.73)(react@18.2.0) tslib: 2.6.2 - use-callback-ref: 1.3.2(@types/react@18.2.71)(react@18.2.0) - use-sidecar: 1.1.2(@types/react@18.2.71)(react@18.2.0) + use-callback-ref: 1.3.2(@types/react@18.2.73)(react@18.2.0) + use-sidecar: 1.1.2(@types/react@18.2.73)(react@18.2.0) dev: false /react-smooth@4.0.1(react-dom@18.2.0)(react@18.2.0): @@ -10029,7 +9904,7 @@ packages: react-transition-group: 4.4.5(react-dom@18.2.0)(react@18.2.0) dev: false - /react-style-singleton@2.2.1(@types/react@18.2.71)(react@18.2.0): + /react-style-singleton@2.2.1(@types/react@18.2.73)(react@18.2.0): resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} engines: {node: '>=10'} peerDependencies: @@ -10039,7 +9914,7 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.71 + '@types/react': 18.2.73 get-nonce: 1.0.1 invariant: 2.2.4 react: 18.2.0 @@ -11072,11 +10947,11 @@ packages: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.0.0 - postcss: 8.4.33 - postcss-import: 15.1.0(postcss@8.4.33) - postcss-js: 4.0.1(postcss@8.4.33) - postcss-load-config: 4.0.2(postcss@8.4.33) - postcss-nested: 6.0.1(postcss@8.4.33) + postcss: 8.4.38 + postcss-import: 15.1.0(postcss@8.4.38) + postcss-js: 4.0.1(postcss@8.4.38) + postcss-load-config: 4.0.2(postcss@8.4.38) + postcss-nested: 6.0.1(postcss@8.4.38) postcss-selector-parser: 6.0.16 resolve: 1.22.8 sucrase: 3.35.0 @@ -11122,12 +10997,12 @@ packages: jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 - terser: 5.29.2 + terser: 5.30.0 webpack: 5.91.0(@swc/core@1.3.101)(esbuild@0.19.11) dev: false - /terser@5.29.2: - resolution: {integrity: sha512-ZiGkhUBIM+7LwkNjXYJq8svgkd+QK3UUr0wJqY4MieaezBSAIPgbSPZyIx0idM6XWK5CMzSWa8MJIzmRcB8Caw==} + /terser@5.30.0: + resolution: {integrity: sha512-Y/SblUl5kEyEFzhMAQdsxVHh+utAxd4IuRNJzKywY/4uzSogh3G219jqbDDxYu4MXO9CzY3tSEqmZvW6AoEDJw==} engines: {node: '>=10'} hasBin: true dependencies: @@ -11266,7 +11141,7 @@ packages: optional: true dependencies: '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.10 + '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 '@tsconfig/node16': 1.0.4 @@ -11625,7 +11500,7 @@ packages: dependencies: punycode: 2.3.1 - /use-callback-ref@1.3.2(@types/react@18.2.71)(react@18.2.0): + /use-callback-ref@1.3.2(@types/react@18.2.73)(react@18.2.0): resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==} engines: {node: '>=10'} peerDependencies: @@ -11635,12 +11510,12 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.71 + '@types/react': 18.2.73 react: 18.2.0 tslib: 2.6.2 dev: false - /use-sidecar@1.1.2(@types/react@18.2.71)(react@18.2.0): + /use-sidecar@1.1.2(@types/react@18.2.73)(react@18.2.0): resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==} engines: {node: '>=10'} peerDependencies: @@ -11650,7 +11525,7 @@ packages: '@types/react': optional: true dependencies: - '@types/react': 18.2.71 + '@types/react': 18.2.73 detect-node-es: 1.1.0 react: 18.2.0 tslib: 2.6.2 @@ -12059,6 +11934,13 @@ packages: yargs-parser: 21.1.1 dev: false + /yarn@1.22.22: + resolution: {integrity: sha512-prL3kGtyG7o9Z9Sv8IPfBNrWTDmXB4Qbes8A9rEzt6wkJV8mUvoirjU0Mp3GGAU06Y0XQyA3/2/RQFVuK7MTfg==} + engines: {node: '>=4.0.0'} + hasBin: true + requiresBuild: true + dev: false + /yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} engines: {node: '>=6'} diff --git a/supabase/package.json b/supabase/package.json index e3eb730d9..ffb7dd2ca 100644 --- a/supabase/package.json +++ b/supabase/package.json @@ -14,6 +14,6 @@ "typegen": "supabase gen types typescript --local > ../packages/supabase/src/database.types.ts" }, "dependencies": { - "supabase": "^1.150.0" + "supabase": "^1.151.1" } } \ No newline at end of file diff --git a/tooling/eslint/package.json b/tooling/eslint/package.json index 9c7241d3c..a99946908 100644 --- a/tooling/eslint/package.json +++ b/tooling/eslint/package.json @@ -15,23 +15,23 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "@next/eslint-plugin-next": "^14.1.0", + "@next/eslint-plugin-next": "^14.1.4", "@trivago/prettier-plugin-sort-imports": "^4.3.0", - "@types/eslint": "^8.56.2", - "@typescript-eslint/eslint-plugin": "^7.3.1", - "@typescript-eslint/parser": "^7.3.1", + "@types/eslint": "^8.56.6", + "@typescript-eslint/eslint-plugin": "^7.4.0", + "@typescript-eslint/parser": "^7.4.0", "eslint-config-prettier": "^9.1.0", - "eslint-config-turbo": "^1.12.5", + "eslint-config-turbo": "^1.13.0", "eslint-plugin-import": "^2.29.1", "eslint-plugin-jsx-a11y": "^6.8.0", "eslint-plugin-react": "^7.34.1", "eslint-plugin-react-hooks": "^4.6.0" }, "devDependencies": { - "@kit/prettier-config": "^0.1.0", - "@kit/tsconfig": "^0.1.0", - "eslint": "^8.56.0", - "typescript": "^5.3.3" + "@kit/prettier-config": "workspace:^", + "@kit/tsconfig": "workspace:^", + "eslint": "^8.57.0", + "typescript": "^5.4.3" }, "eslintConfig": { "root": true, diff --git a/tooling/prettier/package.json b/tooling/prettier/package.json index ea85b44b7..d2169db8e 100644 --- a/tooling/prettier/package.json +++ b/tooling/prettier/package.json @@ -9,13 +9,13 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "@ianvs/prettier-plugin-sort-imports": "^4.1.1", - "prettier": "^3.2.4", - "prettier-plugin-tailwindcss": "^0.5.11" + "@ianvs/prettier-plugin-sort-imports": "^4.2.1", + "prettier": "^3.2.5", + "prettier-plugin-tailwindcss": "^0.5.13" }, "devDependencies": { - "@kit/tsconfig": "^0.1.0", - "typescript": "^5.3.3" + "@kit/tsconfig": "workspace:^", + "typescript": "^5.4.3" }, "prettier": "./index.mjs" } diff --git a/tooling/tailwind/package.json b/tooling/tailwind/package.json index 8183a41d1..ac130aa04 100644 --- a/tooling/tailwind/package.json +++ b/tooling/tailwind/package.json @@ -14,17 +14,17 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "autoprefixer": "^10.4.17", + "autoprefixer": "^10.4.19", "postcss": "8.4.33", "tailwindcss": "3.4.1" }, "devDependencies": { - "@kit/eslint-config": "^0.2.0", - "@kit/prettier-config": "^0.1.0", - "@kit/tsconfig": "^0.1.0", - "eslint": "^8.56.0", - "prettier": "^3.2.4", - "typescript": "^5.3.3" + "@kit/eslint-config": "workspace:^", + "@kit/prettier-config": "workspace:^", + "@kit/tsconfig": "workspace:^", + "eslint": "^8.57.0", + "prettier": "^3.2.5", + "typescript": "^5.4.3" }, "eslintConfig": { "root": true,