diff --git a/apps/web/actions/profile.ts b/apps/web/actions/profile.ts new file mode 100644 index 0000000..93bd5f4 --- /dev/null +++ b/apps/web/actions/profile.ts @@ -0,0 +1,44 @@ +'use server'; +import { authOptions } from '@/config/auth'; +import { getCustomer, updateCustomerProfile } from '@repo/graphql/api'; +import { type CustomerInput, type Enum_Customer_Role } from '@repo/graphql/types'; +import { getServerSession } from 'next-auth/next'; +import { revalidatePath } from 'next/cache'; + +export async function updateProfile(input: CustomerInput) { + const session = await getServerSession(authOptions); + + if (session) { + const { user } = session; + const getCustomerResponse = await getCustomer({ telegramId: user?.telegramId }); + const customer = getCustomerResponse.data.customers.at(0); + if (customer) { + await updateCustomerProfile({ + data: input, + documentId: customer.documentId, + }); + } + } + + revalidatePath('/profile'); +} + +export async function updateRole(role: Enum_Customer_Role) { + const session = await getServerSession(authOptions); + + if (session) { + const { user } = session; + const getCustomerResponse = await getCustomer({ telegramId: user?.telegramId }); + const customer = getCustomerResponse.data.customers.at(0); + if (customer) { + await updateCustomerProfile({ + data: { + role, + }, + documentId: customer.documentId, + }); + } + } + + revalidatePath('/profile'); +} diff --git a/apps/web/app/(auth)/browser/page.tsx b/apps/web/app/(auth)/browser/page.tsx new file mode 100644 index 0000000..a989110 --- /dev/null +++ b/apps/web/app/(auth)/browser/page.tsx @@ -0,0 +1,31 @@ +/* eslint-disable promise/prefer-await-to-then */ +'use client'; +import { getTelegramUser } from '@/mocks/get-telegram-user'; +import { LoadingSpinner } from '@repo/ui/components/ui/spinner'; +import { signIn, useSession } from 'next-auth/react'; +import { useTheme } from 'next-themes'; +import { redirect } from 'next/navigation'; +import { useEffect } from 'react'; + +export default function Auth() { + const { status } = useSession(); + useTheme(); + + useEffect(() => { + if (status === 'authenticated') { + redirect('/profile'); + } + + if (status === 'unauthenticated' && process.env.NODE_ENV === 'development') { + getTelegramUser().then((user) => { + signIn('telegram', { + callbackUrl: '/profile', + redirect: false, + telegramId: String(user?.id), + }); + }); + } + }, [status]); + + return ; +} diff --git a/apps/web/app/(auth)/page.tsx b/apps/web/app/(auth)/page.tsx index 32d357a..82767ed 100644 --- a/apps/web/app/(auth)/page.tsx +++ b/apps/web/app/(auth)/page.tsx @@ -1,42 +1,12 @@ 'use client'; -import { initData, isMiniAppDark, useSignal } from '@telegram-apps/sdk-react'; -import { signIn, useSession } from 'next-auth/react'; +import { useClientOnce } from '@/hooks/telegram'; +import { isTMA } from '@telegram-apps/sdk-react'; import { redirect } from 'next/navigation'; -import { useEffect } from 'react'; -export default function Auth() { - const initDataState = useSignal(initData.state); - const isDark = isMiniAppDark(); - const { data: session, status } = useSession(); +export default function Page() { + useClientOnce(() => { + const isTG = isTMA('simple'); - useEffect(() => { - if (status === 'authenticated') { - redirect('/profile'); - } - - if (status === 'unauthenticated' && initDataState?.user?.id) { - signIn('telegram', { - callbackUrl: '/profile', - redirect: false, - telegramId: String(initDataState.user.id), - }); - } - }, [initDataState, status]); - - if (status === 'loading') { - return
Loading Auth...
; - } - - return ( -
- {session ? ( -
- Hello, {JSON.stringify(session)}
- Dark: {JSON.stringify(isDark)} -
- ) : ( -
Not authenticated
- )} -
- ); + redirect(isTG ? '/telegram' : '/browser'); + }); } diff --git a/apps/web/app/(auth)/layout.tsx b/apps/web/app/(auth)/telegram/layout.tsx similarity index 64% rename from apps/web/app/(auth)/layout.tsx rename to apps/web/app/(auth)/telegram/layout.tsx index 6225cd2..eed2cc2 100644 --- a/apps/web/app/(auth)/layout.tsx +++ b/apps/web/app/(auth)/telegram/layout.tsx @@ -1,6 +1,6 @@ import { TelegramProvider } from '@/providers'; import { type PropsWithChildren } from 'react'; -export default async function RootLayout({ children }: Readonly) { +export default async function Layout({ children }: Readonly) { return {children}; } diff --git a/apps/web/app/(auth)/telegram/page.tsx b/apps/web/app/(auth)/telegram/page.tsx new file mode 100644 index 0000000..3ac0030 --- /dev/null +++ b/apps/web/app/(auth)/telegram/page.tsx @@ -0,0 +1,32 @@ +'use client'; +import { LoadingSpinner } from '@repo/ui/components/ui/spinner'; +import { initData, isMiniAppDark, useSignal } from '@telegram-apps/sdk-react'; +import { signIn, useSession } from 'next-auth/react'; +import { useTheme } from 'next-themes'; +import { redirect } from 'next/navigation'; +import { useEffect } from 'react'; + +export default function Auth() { + const initDataUser = useSignal(initData.user); + const isDark = isMiniAppDark(); + const { status } = useSession(); + const { setTheme } = useTheme(); + + useEffect(() => { + setTheme(isDark ? 'dark' : 'light'); + + if (status === 'authenticated') { + redirect('/profile'); + } + + if (status === 'unauthenticated' && initDataUser?.id) { + signIn('telegram', { + callbackUrl: '/profile', + redirect: false, + telegramId: String(initDataUser.id), + }); + } + }, [initDataUser, isDark, setTheme, status]); + + return ; +} diff --git a/apps/web/app/(main)/layout.tsx b/apps/web/app/(main)/layout.tsx index 96bb536..038c98f 100644 --- a/apps/web/app/(main)/layout.tsx +++ b/apps/web/app/(main)/layout.tsx @@ -1,11 +1,9 @@ -import { Header } from '@/components/header'; import { BottomNav } from '@/components/navigation'; import { type PropsWithChildren } from 'react'; export default async function Layout({ children }: Readonly) { return (
-
{children}
diff --git a/apps/web/app/(main)/profile/page.tsx b/apps/web/app/(main)/profile/page.tsx index 2e9ea4f..cf1567c 100644 --- a/apps/web/app/(main)/profile/page.tsx +++ b/apps/web/app/(main)/profile/page.tsx @@ -1,8 +1,47 @@ +import { updateProfile, updateRole } from '@/actions/profile'; +import { CheckboxWithText } from '@/components/profile/checkbox-with-text'; +import { ProfileField } from '@/components/profile/profile-field'; import { authOptions } from '@/config/auth'; +import { getCustomer } from '@repo/graphql/api'; +import { Avatar, AvatarFallback, AvatarImage } from '@repo/ui/components/ui/avatar'; +import { Card, CardContent, CardHeader } from '@repo/ui/components/ui/card'; import { getServerSession } from 'next-auth/next'; export default async function ProfilePage() { const session = await getServerSession(authOptions); + const { data } = await getCustomer({ telegramId: session?.user?.telegramId }); + const user = data.customers.at(0); + const photoUrl = user?.photoUrl ?? 'https://github.com/shadcn.png'; - return
{JSON.stringify(session, null, 2)}
; + if (!user) return 'Профиль не найден'; + + return ( +
+ + + + + {user?.name.charAt(0)} + +

{user?.name}

+
+ + + + + +
+
+ ); } diff --git a/apps/web/app/layout.tsx b/apps/web/app/layout.tsx index bcd7dac..def6cb2 100644 --- a/apps/web/app/layout.tsx +++ b/apps/web/app/layout.tsx @@ -1,7 +1,8 @@ import { AuthProvider } from '@/providers'; +import { ThemeProvider } from '@/providers/theme-provider'; import { I18nProvider } from '@/utils/i18n/provider'; -import { type Metadata } from 'next'; import '@repo/ui/globals.css'; +import { type Metadata } from 'next'; import { getLocale } from 'next-intl/server'; import { type PropsWithChildren } from 'react'; @@ -14,9 +15,11 @@ export default async function RootLayout({ children }: Readonly - + - {children} + + {children} + diff --git a/apps/web/components/header/index.tsx b/apps/web/components/header/index.tsx deleted file mode 100644 index 17a4bbd..0000000 --- a/apps/web/components/header/index.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { Profile } from './profile'; - -export function Header() { - return ( -
-
- -
- ); -} diff --git a/apps/web/components/header/profile.tsx b/apps/web/components/header/profile.tsx deleted file mode 100644 index cf1931f..0000000 --- a/apps/web/components/header/profile.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import { Avatar, AvatarFallback, AvatarImage } from '@repo/ui/components/ui/avatar'; - -type Props = { - readonly fallback: string; - readonly src: string; - readonly username: string; -}; - -export function Profile({ fallback, src, username }: Props) { - return ( -
- {username} - - - {fallback} - -
- ); -} diff --git a/apps/web/components/profile/checkbox-with-text.tsx b/apps/web/components/profile/checkbox-with-text.tsx new file mode 100644 index 0000000..91ac194 --- /dev/null +++ b/apps/web/components/profile/checkbox-with-text.tsx @@ -0,0 +1,63 @@ +/* eslint-disable canonical/id-match */ +/* eslint-disable promise/prefer-await-to-then */ +'use client'; +import { Enum_Customer_Role } from '@repo/graphql/types'; +import { Checkbox, type CheckboxProps } from '@repo/ui/components/ui/checkbox'; +import { useState } from 'react'; +import { useDebouncedCallback } from 'use-debounce'; + +type Props = Pick & { + readonly description?: string; + readonly onChange?: (value: Enum_Customer_Role) => Promise | void; + readonly text: string; +}; + +export function CheckboxWithText({ checked: initialValue, description, onChange, text }: Props) { + const [checked, setChecked] = useState(initialValue); + const { debouncedCallback, isPending } = useDebouncedOnChangeCallback(onChange); + + const handleChange = () => { + const newValue = !checked; + setChecked(newValue); + debouncedCallback(newValue); + }; + + return ( +
+ +
+ + {description ?

{description}

: false} +
+
+ ); +} + +function useDebouncedOnChangeCallback( + callback: ((value: Enum_Customer_Role) => Promise | void) | undefined, +) { + const [isPending, setIsPending] = useState(false); + + const debouncedCallback = useDebouncedCallback((checked: boolean) => { + if (!callback) return; + + setIsPending(true); + const result = callback(checked ? Enum_Customer_Role.Master : Enum_Customer_Role.Client); + + if (result instanceof Promise) { + result.finally(() => setIsPending(false)); + } else { + setIsPending(false); + } + }, 300); + + return { + debouncedCallback, + isPending, + }; +} diff --git a/apps/web/components/profile/profile-field.tsx b/apps/web/components/profile/profile-field.tsx new file mode 100644 index 0000000..89d385e --- /dev/null +++ b/apps/web/components/profile/profile-field.tsx @@ -0,0 +1,85 @@ +/* eslint-disable promise/prefer-await-to-then */ +'use client'; +import { type CustomerInput } from '@repo/graphql/types'; +import { Input } from '@repo/ui/components/ui/input'; +import { Label } from '@repo/ui/components/ui/label'; +import { type ChangeEvent, useEffect, useRef, useState } from 'react'; +import { useDebouncedCallback } from 'use-debounce'; + +type ProfileFieldProps = { + readonly disabled?: boolean; + readonly fieldName?: keyof CustomerInput; + readonly id: string; + readonly label: string; + readonly onChange?: (value: CustomerInput) => Promise | void; + readonly value: string; +}; + +export function ProfileField({ + disabled = false, + fieldName, + id, + label, + onChange, + value: initialValue, +}: ProfileFieldProps) { + const [value, setValue] = useState(initialValue); + const { debouncedCallback, isPending } = useDebouncedOnChangeCallback(onChange, fieldName); + const inputRef = useFocus(isPending); + + const handleChange = (event: ChangeEvent) => { + const newValue = event.target.value; + setValue(newValue); + debouncedCallback(newValue); + }; + + return ( +
+ + +
+ ); +} + +function useDebouncedOnChangeCallback( + callback: ((value: CustomerInput) => Promise | void) | undefined, + fieldName: string | undefined, +) { + const [isPending, setIsPending] = useState(false); + + const debouncedCallback = useDebouncedCallback((newValue: string) => { + if (!callback || !fieldName) return; + + setIsPending(true); + const result = callback({ [fieldName]: newValue }); + + if (result instanceof Promise) { + result.finally(() => setIsPending(false)); + } else { + setIsPending(false); + } + }, 300); + + return { + debouncedCallback, + isPending, + }; +} + +function useFocus(isPending: boolean) { + const inputRef = useRef(null); + + useEffect(() => { + if (inputRef.current) { + inputRef.current.focus(); + } + }, [isPending]); + return inputRef; +} diff --git a/apps/web/config/env.ts b/apps/web/config/env.ts index c3ccf3b..4c88620 100644 --- a/apps/web/config/env.ts +++ b/apps/web/config/env.ts @@ -2,7 +2,6 @@ import { z } from 'zod'; export const envSchema = z.object({ - NEXTAUTH_SECRET: z.string(), + __DEV_TELEGRAM_ID: z.string(), }); - export const env = envSchema.parse(process.env); diff --git a/apps/web/mocks/get-telegram-user.ts b/apps/web/mocks/get-telegram-user.ts new file mode 100644 index 0000000..1516fd5 --- /dev/null +++ b/apps/web/mocks/get-telegram-user.ts @@ -0,0 +1,12 @@ +'use server'; + +import { env } from '@/config/env'; + +export async function getTelegramUser() { + if (process.env.NODE_ENV !== 'production') + return { + id: env.__DEV_TELEGRAM_ID, + }; + + return null; +} diff --git a/apps/web/package.json b/apps/web/package.json index cb7f982..18a219a 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -21,8 +21,10 @@ "next": "catalog:", "next-auth": "^4.24.11", "next-intl": "catalog:", + "next-themes": "^0.4.4", "react": "catalog:", "react-dom": "catalog:", + "use-debounce": "^10.0.4", "zod": "catalog:" }, "devDependencies": { diff --git a/apps/web/providers/theme-provider.tsx b/apps/web/providers/theme-provider.tsx new file mode 100644 index 0000000..dd140f5 --- /dev/null +++ b/apps/web/providers/theme-provider.tsx @@ -0,0 +1,34 @@ +'use client'; +import { ThemeProvider as NextThemesProvider } from 'next-themes'; +import { type ComponentProps, useEffect, useState } from 'react'; + +/** + * mouted - fix for Next.js 15 Hydration Failed + */ +export function ThemeProvider({ + children, + ...props +}: Readonly>) { + const [mounted, setMounted] = useState(false); + + useEffect(() => { + setMounted(true); + }, []); + + if (!mounted) { + // eslint-disable-next-line react/jsx-no-useless-fragment + return <>; + } + + return ( + + {children} + + ); +} diff --git a/apps/web/types/next-auth.d.ts b/apps/web/types/next-auth.d.ts index 0152d68..9bf0e89 100644 --- a/apps/web/types/next-auth.d.ts +++ b/apps/web/types/next-auth.d.ts @@ -7,4 +7,8 @@ declare module 'next-auth' { telegramId?: null | string; }; } + + interface User extends DefaultUser { + telegramId?: null | string; + } } diff --git a/packages/graphql/api/customer.ts b/packages/graphql/api/customer.ts index 2206662..a0bd9cb 100644 --- a/packages/graphql/api/customer.ts +++ b/packages/graphql/api/customer.ts @@ -1,3 +1,4 @@ +'use server'; import { getClientWithToken } from '../apollo/client'; import * as GQL from '../types'; @@ -18,3 +19,12 @@ export async function getCustomer(variables: GQL.GetCustomerQueryVariables) { variables, }); } + +export async function updateCustomerProfile(variables: GQL.UpdateCustomerProfileMutationVariables) { + const { mutate } = await getClientWithToken(); + + return mutate({ + mutation: GQL.UpdateCustomerProfileDocument, + variables, + }); +} diff --git a/packages/graphql/graphql.config.cjs b/packages/graphql/graphql.config.cjs index a9c2fad..c1d69b9 100644 --- a/packages/graphql/graphql.config.cjs +++ b/packages/graphql/graphql.config.cjs @@ -4,9 +4,10 @@ module.exports = { generates: { './types/operations.generated.ts': { config: { - avoidOptionals: true, + avoidOptionals: false, onlyOperationTypes: true, useTypeImports: true, + maybeValue: 'T | null | undefined' }, plugins: ['typescript', 'typescript-operations', 'typed-document-node'], }, diff --git a/packages/graphql/operations/customer.graphql b/packages/graphql/operations/customer.graphql index f438738..d6e9f15 100644 --- a/packages/graphql/operations/customer.graphql +++ b/packages/graphql/operations/customer.graphql @@ -1,19 +1,27 @@ +fragment CustomerProfile on Customer { + active + documentId + name + phone + photoUrl + role + telegramId +} + mutation CreateCustomer($name: String!, $telegramId: Long!, $phone: String!) { createCustomer(data: { name: $name, telegramId: $telegramId, phone: $phone, role: client }) { - documentId - name - telegramId - phone - role - active - createdAt - updatedAt - publishedAt + ...CustomerProfile } } query GetCustomer($telegramId: Long!) { customers(filters: { telegramId: { eq: $telegramId } }) { - name + ...CustomerProfile + } +} + +mutation UpdateCustomerProfile($documentId: ID!, $data: CustomerInput!) { + updateCustomer(documentId: $documentId, data: $data) { + ...CustomerProfile } } diff --git a/packages/graphql/types/operations.generated.ts b/packages/graphql/types/operations.generated.ts index 47bf8b9..caec0c5 100644 --- a/packages/graphql/types/operations.generated.ts +++ b/packages/graphql/types/operations.generated.ts @@ -1,6 +1,6 @@ import type { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core'; -export type Maybe = T | null; -export type InputMaybe = Maybe; +export type Maybe = T | null | undefined; +export type InputMaybe = T | null | undefined; export type Exact = { [K in keyof T]: T[K] }; export type MakeOptional = Omit & { [SubKey in K]?: Maybe }; export type MakeMaybe = Omit & { [SubKey in K]: Maybe }; @@ -19,119 +19,121 @@ export type Scalars = { }; export type BlockFiltersInput = { - and: InputMaybe>>; - client: InputMaybe; - createdAt: InputMaybe; - dateend: InputMaybe; - datestart: InputMaybe; - documentId: InputMaybe; - master: InputMaybe; - not: InputMaybe; - or: InputMaybe>>; - orders: InputMaybe; - publishedAt: InputMaybe; - sessionsCompleted: InputMaybe; - sessionsTotal: InputMaybe; - state: InputMaybe; - updatedAt: InputMaybe; + and?: InputMaybe>>; + client?: InputMaybe; + createdAt?: InputMaybe; + dateend?: InputMaybe; + datestart?: InputMaybe; + documentId?: InputMaybe; + master?: InputMaybe; + not?: InputMaybe; + or?: InputMaybe>>; + orders?: InputMaybe; + publishedAt?: InputMaybe; + sessionsCompleted?: InputMaybe; + sessionsTotal?: InputMaybe; + state?: InputMaybe; + updatedAt?: InputMaybe; }; export type BlockInput = { - client: InputMaybe; - dateend: InputMaybe; - datestart: InputMaybe; - master: InputMaybe; - orders: InputMaybe>>; - publishedAt: InputMaybe; - sessionsCompleted: InputMaybe; - sessionsTotal: InputMaybe; - state: InputMaybe; + client?: InputMaybe; + dateend?: InputMaybe; + datestart?: InputMaybe; + master?: InputMaybe; + orders?: InputMaybe>>; + publishedAt?: InputMaybe; + sessionsCompleted?: InputMaybe; + sessionsTotal?: InputMaybe; + state?: InputMaybe; }; export type BooleanFilterInput = { - and: InputMaybe>>; - between: InputMaybe>>; - contains: InputMaybe; - containsi: InputMaybe; - endsWith: InputMaybe; - eq: InputMaybe; - eqi: InputMaybe; - gt: InputMaybe; - gte: InputMaybe; - in: InputMaybe>>; - lt: InputMaybe; - lte: InputMaybe; - ne: InputMaybe; - nei: InputMaybe; - not: InputMaybe; - notContains: InputMaybe; - notContainsi: InputMaybe; - notIn: InputMaybe>>; - notNull: InputMaybe; - null: InputMaybe; - or: InputMaybe>>; - startsWith: InputMaybe; + and?: InputMaybe>>; + between?: InputMaybe>>; + contains?: InputMaybe; + containsi?: InputMaybe; + endsWith?: InputMaybe; + eq?: InputMaybe; + eqi?: InputMaybe; + gt?: InputMaybe; + gte?: InputMaybe; + in?: InputMaybe>>; + lt?: InputMaybe; + lte?: InputMaybe; + ne?: InputMaybe; + nei?: InputMaybe; + not?: InputMaybe; + notContains?: InputMaybe; + notContainsi?: InputMaybe; + notIn?: InputMaybe>>; + notNull?: InputMaybe; + null?: InputMaybe; + or?: InputMaybe>>; + startsWith?: InputMaybe; }; export type CustomerFiltersInput = { - active: InputMaybe; - and: InputMaybe>>; - blocks: InputMaybe; - clients: InputMaybe; - createdAt: InputMaybe; - documentId: InputMaybe; - masters: InputMaybe; - name: InputMaybe; - not: InputMaybe; - or: InputMaybe>>; - orders: InputMaybe; - phone: InputMaybe; - publishedAt: InputMaybe; - role: InputMaybe; - setting: InputMaybe; - slots: InputMaybe; - telegramId: InputMaybe; - updatedAt: InputMaybe; + active?: InputMaybe; + and?: InputMaybe>>; + blocks?: InputMaybe; + clients?: InputMaybe; + createdAt?: InputMaybe; + documentId?: InputMaybe; + masters?: InputMaybe; + name?: InputMaybe; + not?: InputMaybe; + or?: InputMaybe>>; + orders?: InputMaybe; + phone?: InputMaybe; + photoUrl?: InputMaybe; + publishedAt?: InputMaybe; + role?: InputMaybe; + setting?: InputMaybe; + slots?: InputMaybe; + telegramId?: InputMaybe; + updatedAt?: InputMaybe; }; export type CustomerInput = { - active: InputMaybe; - blocks: InputMaybe>>; - clients: InputMaybe>>; - masters: InputMaybe>>; - name: InputMaybe; - orders: InputMaybe>>; - phone: InputMaybe; - publishedAt: InputMaybe; - role: InputMaybe; - setting: InputMaybe; - slots: InputMaybe>>; - telegramId: InputMaybe; + active?: InputMaybe; + blocks?: InputMaybe>>; + clients?: InputMaybe>>; + masters?: InputMaybe>>; + name?: InputMaybe; + orders?: InputMaybe>>; + phone?: InputMaybe; + photoUrl?: InputMaybe; + publishedAt?: InputMaybe; + role?: InputMaybe; + setting?: InputMaybe; + slots?: InputMaybe>>; + telegramId?: InputMaybe; }; export type DateTimeFilterInput = { - and: InputMaybe>>; - between: InputMaybe>>; - contains: InputMaybe; - containsi: InputMaybe; - endsWith: InputMaybe; - eq: InputMaybe; - eqi: InputMaybe; - gt: InputMaybe; - gte: InputMaybe; - in: InputMaybe>>; - lt: InputMaybe; - lte: InputMaybe; - ne: InputMaybe; - nei: InputMaybe; - not: InputMaybe; - notContains: InputMaybe; - notContainsi: InputMaybe; - notIn: InputMaybe>>; - notNull: InputMaybe; - null: InputMaybe; - or: InputMaybe>>; - startsWith: InputMaybe; + and?: InputMaybe>>; + between?: InputMaybe>>; + contains?: InputMaybe; + containsi?: InputMaybe; + endsWith?: InputMaybe; + eq?: InputMaybe; + eqi?: InputMaybe; + gt?: InputMaybe; + gte?: InputMaybe; + in?: InputMaybe>>; + lt?: InputMaybe; + lte?: InputMaybe; + ne?: InputMaybe; + nei?: InputMaybe; + not?: InputMaybe; + notContains?: InputMaybe; + notContainsi?: InputMaybe; + notIn?: InputMaybe>>; + notNull?: InputMaybe; + null?: InputMaybe; + or?: InputMaybe>>; + startsWith?: InputMaybe; }; export enum Enum_Block_State { @@ -160,179 +162,179 @@ export enum Enum_Slot_State { } export type FileInfoInput = { - alternativeText: InputMaybe; - caption: InputMaybe; - name: InputMaybe; + alternativeText?: InputMaybe; + caption?: InputMaybe; + name?: InputMaybe; }; export type FloatFilterInput = { - and: InputMaybe>>; - between: InputMaybe>>; - contains: InputMaybe; - containsi: InputMaybe; - endsWith: InputMaybe; - eq: InputMaybe; - eqi: InputMaybe; - gt: InputMaybe; - gte: InputMaybe; - in: InputMaybe>>; - lt: InputMaybe; - lte: InputMaybe; - ne: InputMaybe; - nei: InputMaybe; - not: InputMaybe; - notContains: InputMaybe; - notContainsi: InputMaybe; - notIn: InputMaybe>>; - notNull: InputMaybe; - null: InputMaybe; - or: InputMaybe>>; - startsWith: InputMaybe; + and?: InputMaybe>>; + between?: InputMaybe>>; + contains?: InputMaybe; + containsi?: InputMaybe; + endsWith?: InputMaybe; + eq?: InputMaybe; + eqi?: InputMaybe; + gt?: InputMaybe; + gte?: InputMaybe; + in?: InputMaybe>>; + lt?: InputMaybe; + lte?: InputMaybe; + ne?: InputMaybe; + nei?: InputMaybe; + not?: InputMaybe; + notContains?: InputMaybe; + notContainsi?: InputMaybe; + notIn?: InputMaybe>>; + notNull?: InputMaybe; + null?: InputMaybe; + or?: InputMaybe>>; + startsWith?: InputMaybe; }; export type I18NLocaleFiltersInput = { - and: InputMaybe>>; - code: InputMaybe; - createdAt: InputMaybe; - documentId: InputMaybe; - name: InputMaybe; - not: InputMaybe; - or: InputMaybe>>; - publishedAt: InputMaybe; - updatedAt: InputMaybe; + and?: InputMaybe>>; + code?: InputMaybe; + createdAt?: InputMaybe; + documentId?: InputMaybe; + name?: InputMaybe; + not?: InputMaybe; + or?: InputMaybe>>; + publishedAt?: InputMaybe; + updatedAt?: InputMaybe; }; export type IdFilterInput = { - and: InputMaybe>>; - between: InputMaybe>>; - contains: InputMaybe; - containsi: InputMaybe; - endsWith: InputMaybe; - eq: InputMaybe; - eqi: InputMaybe; - gt: InputMaybe; - gte: InputMaybe; - in: InputMaybe>>; - lt: InputMaybe; - lte: InputMaybe; - ne: InputMaybe; - nei: InputMaybe; - not: InputMaybe; - notContains: InputMaybe; - notContainsi: InputMaybe; - notIn: InputMaybe>>; - notNull: InputMaybe; - null: InputMaybe; - or: InputMaybe>>; - startsWith: InputMaybe; + and?: InputMaybe>>; + between?: InputMaybe>>; + contains?: InputMaybe; + containsi?: InputMaybe; + endsWith?: InputMaybe; + eq?: InputMaybe; + eqi?: InputMaybe; + gt?: InputMaybe; + gte?: InputMaybe; + in?: InputMaybe>>; + lt?: InputMaybe; + lte?: InputMaybe; + ne?: InputMaybe; + nei?: InputMaybe; + not?: InputMaybe; + notContains?: InputMaybe; + notContainsi?: InputMaybe; + notIn?: InputMaybe>>; + notNull?: InputMaybe; + null?: InputMaybe; + or?: InputMaybe>>; + startsWith?: InputMaybe; }; export type IntFilterInput = { - and: InputMaybe>>; - between: InputMaybe>>; - contains: InputMaybe; - containsi: InputMaybe; - endsWith: InputMaybe; - eq: InputMaybe; - eqi: InputMaybe; - gt: InputMaybe; - gte: InputMaybe; - in: InputMaybe>>; - lt: InputMaybe; - lte: InputMaybe; - ne: InputMaybe; - nei: InputMaybe; - not: InputMaybe; - notContains: InputMaybe; - notContainsi: InputMaybe; - notIn: InputMaybe>>; - notNull: InputMaybe; - null: InputMaybe; - or: InputMaybe>>; - startsWith: InputMaybe; + and?: InputMaybe>>; + between?: InputMaybe>>; + contains?: InputMaybe; + containsi?: InputMaybe; + endsWith?: InputMaybe; + eq?: InputMaybe; + eqi?: InputMaybe; + gt?: InputMaybe; + gte?: InputMaybe; + in?: InputMaybe>>; + lt?: InputMaybe; + lte?: InputMaybe; + ne?: InputMaybe; + nei?: InputMaybe; + not?: InputMaybe; + notContains?: InputMaybe; + notContainsi?: InputMaybe; + notIn?: InputMaybe>>; + notNull?: InputMaybe; + null?: InputMaybe; + or?: InputMaybe>>; + startsWith?: InputMaybe; }; export type JsonFilterInput = { - and: InputMaybe>>; - between: InputMaybe>>; - contains: InputMaybe; - containsi: InputMaybe; - endsWith: InputMaybe; - eq: InputMaybe; - eqi: InputMaybe; - gt: InputMaybe; - gte: InputMaybe; - in: InputMaybe>>; - lt: InputMaybe; - lte: InputMaybe; - ne: InputMaybe; - nei: InputMaybe; - not: InputMaybe; - notContains: InputMaybe; - notContainsi: InputMaybe; - notIn: InputMaybe>>; - notNull: InputMaybe; - null: InputMaybe; - or: InputMaybe>>; - startsWith: InputMaybe; + and?: InputMaybe>>; + between?: InputMaybe>>; + contains?: InputMaybe; + containsi?: InputMaybe; + endsWith?: InputMaybe; + eq?: InputMaybe; + eqi?: InputMaybe; + gt?: InputMaybe; + gte?: InputMaybe; + in?: InputMaybe>>; + lt?: InputMaybe; + lte?: InputMaybe; + ne?: InputMaybe; + nei?: InputMaybe; + not?: InputMaybe; + notContains?: InputMaybe; + notContainsi?: InputMaybe; + notIn?: InputMaybe>>; + notNull?: InputMaybe; + null?: InputMaybe; + or?: InputMaybe>>; + startsWith?: InputMaybe; }; export type LongFilterInput = { - and: InputMaybe>>; - between: InputMaybe>>; - contains: InputMaybe; - containsi: InputMaybe; - endsWith: InputMaybe; - eq: InputMaybe; - eqi: InputMaybe; - gt: InputMaybe; - gte: InputMaybe; - in: InputMaybe>>; - lt: InputMaybe; - lte: InputMaybe; - ne: InputMaybe; - nei: InputMaybe; - not: InputMaybe; - notContains: InputMaybe; - notContainsi: InputMaybe; - notIn: InputMaybe>>; - notNull: InputMaybe; - null: InputMaybe; - or: InputMaybe>>; - startsWith: InputMaybe; + and?: InputMaybe>>; + between?: InputMaybe>>; + contains?: InputMaybe; + containsi?: InputMaybe; + endsWith?: InputMaybe; + eq?: InputMaybe; + eqi?: InputMaybe; + gt?: InputMaybe; + gte?: InputMaybe; + in?: InputMaybe>>; + lt?: InputMaybe; + lte?: InputMaybe; + ne?: InputMaybe; + nei?: InputMaybe; + not?: InputMaybe; + notContains?: InputMaybe; + notContainsi?: InputMaybe; + notIn?: InputMaybe>>; + notNull?: InputMaybe; + null?: InputMaybe; + or?: InputMaybe>>; + startsWith?: InputMaybe; }; export type OrderFiltersInput = { - and: InputMaybe>>; - block: InputMaybe; - client: InputMaybe; - createdAt: InputMaybe; - documentId: InputMaybe; - not: InputMaybe; - or: InputMaybe>>; - price: InputMaybe; - publishedAt: InputMaybe; - service: InputMaybe; - slot: InputMaybe; - state: InputMaybe; - updatedAt: InputMaybe; + and?: InputMaybe>>; + block?: InputMaybe; + client?: InputMaybe; + createdAt?: InputMaybe; + documentId?: InputMaybe; + not?: InputMaybe; + or?: InputMaybe>>; + price?: InputMaybe; + publishedAt?: InputMaybe; + service?: InputMaybe; + slot?: InputMaybe; + state?: InputMaybe; + updatedAt?: InputMaybe; }; export type OrderInput = { - block: InputMaybe; - client: InputMaybe; - price: InputMaybe; - publishedAt: InputMaybe; - service: InputMaybe; - slot: InputMaybe; - state: InputMaybe; + block?: InputMaybe; + client?: InputMaybe; + price?: InputMaybe; + publishedAt?: InputMaybe; + service?: InputMaybe; + slot?: InputMaybe; + state?: InputMaybe; }; export type PaginationArg = { - limit: InputMaybe; - page: InputMaybe; - pageSize: InputMaybe; - start: InputMaybe; + limit?: InputMaybe; + page?: InputMaybe; + pageSize?: InputMaybe; + start?: InputMaybe; }; export enum PublicationStatus { @@ -341,154 +343,154 @@ export enum PublicationStatus { } export type ReviewWorkflowsWorkflowFiltersInput = { - and: InputMaybe>>; - contentTypes: InputMaybe; - createdAt: InputMaybe; - documentId: InputMaybe; - name: InputMaybe; - not: InputMaybe; - or: InputMaybe>>; - publishedAt: InputMaybe; - stageRequiredToPublish: InputMaybe; - stages: InputMaybe; - updatedAt: InputMaybe; + and?: InputMaybe>>; + contentTypes?: InputMaybe; + createdAt?: InputMaybe; + documentId?: InputMaybe; + name?: InputMaybe; + not?: InputMaybe; + or?: InputMaybe>>; + publishedAt?: InputMaybe; + stageRequiredToPublish?: InputMaybe; + stages?: InputMaybe; + updatedAt?: InputMaybe; }; export type ReviewWorkflowsWorkflowInput = { - contentTypes: InputMaybe; - name: InputMaybe; - publishedAt: InputMaybe; - stageRequiredToPublish: InputMaybe; - stages: InputMaybe>>; + contentTypes?: InputMaybe; + name?: InputMaybe; + publishedAt?: InputMaybe; + stageRequiredToPublish?: InputMaybe; + stages?: InputMaybe>>; }; export type ReviewWorkflowsWorkflowStageFiltersInput = { - and: InputMaybe>>; - color: InputMaybe; - createdAt: InputMaybe; - documentId: InputMaybe; - name: InputMaybe; - not: InputMaybe; - or: InputMaybe>>; - publishedAt: InputMaybe; - updatedAt: InputMaybe; - workflow: InputMaybe; + and?: InputMaybe>>; + color?: InputMaybe; + createdAt?: InputMaybe; + documentId?: InputMaybe; + name?: InputMaybe; + not?: InputMaybe; + or?: InputMaybe>>; + publishedAt?: InputMaybe; + updatedAt?: InputMaybe; + workflow?: InputMaybe; }; export type ReviewWorkflowsWorkflowStageInput = { - color: InputMaybe; - name: InputMaybe; - publishedAt: InputMaybe; - workflow: InputMaybe; + color?: InputMaybe; + name?: InputMaybe; + publishedAt?: InputMaybe; + workflow?: InputMaybe; }; export type SettingFiltersInput = { - and: InputMaybe>>; - createdAt: InputMaybe; - customer: InputMaybe; - documentId: InputMaybe; - not: InputMaybe; - or: InputMaybe>>; - publishedAt: InputMaybe; - recordingByBlocks: InputMaybe; - updatedAt: InputMaybe; + and?: InputMaybe>>; + createdAt?: InputMaybe; + customer?: InputMaybe; + documentId?: InputMaybe; + not?: InputMaybe; + or?: InputMaybe>>; + publishedAt?: InputMaybe; + recordingByBlocks?: InputMaybe; + updatedAt?: InputMaybe; }; export type SettingInput = { - customer: InputMaybe; - publishedAt: InputMaybe; - recordingByBlocks: InputMaybe; + customer?: InputMaybe; + publishedAt?: InputMaybe; + recordingByBlocks?: InputMaybe; }; export type SlotFiltersInput = { - and: InputMaybe>>; - createdAt: InputMaybe; - dateend: InputMaybe; - datestart: InputMaybe; - documentId: InputMaybe; - master: InputMaybe; - not: InputMaybe; - or: InputMaybe>>; - orders: InputMaybe; - publishedAt: InputMaybe; - state: InputMaybe; - updatedAt: InputMaybe; + and?: InputMaybe>>; + createdAt?: InputMaybe; + dateend?: InputMaybe; + datestart?: InputMaybe; + documentId?: InputMaybe; + master?: InputMaybe; + not?: InputMaybe; + or?: InputMaybe>>; + orders?: InputMaybe; + publishedAt?: InputMaybe; + state?: InputMaybe; + updatedAt?: InputMaybe; }; export type SlotInput = { - dateend: InputMaybe; - datestart: InputMaybe; - master: InputMaybe; - orders: InputMaybe; - publishedAt: InputMaybe; - state: InputMaybe; + dateend?: InputMaybe; + datestart?: InputMaybe; + master?: InputMaybe; + orders?: InputMaybe; + publishedAt?: InputMaybe; + state?: InputMaybe; }; export type StringFilterInput = { - and: InputMaybe>>; - between: InputMaybe>>; - contains: InputMaybe; - containsi: InputMaybe; - endsWith: InputMaybe; - eq: InputMaybe; - eqi: InputMaybe; - gt: InputMaybe; - gte: InputMaybe; - in: InputMaybe>>; - lt: InputMaybe; - lte: InputMaybe; - ne: InputMaybe; - nei: InputMaybe; - not: InputMaybe; - notContains: InputMaybe; - notContainsi: InputMaybe; - notIn: InputMaybe>>; - notNull: InputMaybe; - null: InputMaybe; - or: InputMaybe>>; - startsWith: InputMaybe; + and?: InputMaybe>>; + between?: InputMaybe>>; + contains?: InputMaybe; + containsi?: InputMaybe; + endsWith?: InputMaybe; + eq?: InputMaybe; + eqi?: InputMaybe; + gt?: InputMaybe; + gte?: InputMaybe; + in?: InputMaybe>>; + lt?: InputMaybe; + lte?: InputMaybe; + ne?: InputMaybe; + nei?: InputMaybe; + not?: InputMaybe; + notContains?: InputMaybe; + notContainsi?: InputMaybe; + notIn?: InputMaybe>>; + notNull?: InputMaybe; + null?: InputMaybe; + or?: InputMaybe>>; + startsWith?: InputMaybe; }; export type UploadFileFiltersInput = { - alternativeText: InputMaybe; - and: InputMaybe>>; - caption: InputMaybe; - createdAt: InputMaybe; - documentId: InputMaybe; - ext: InputMaybe; - formats: InputMaybe; - hash: InputMaybe; - height: InputMaybe; - mime: InputMaybe; - name: InputMaybe; - not: InputMaybe; - or: InputMaybe>>; - previewUrl: InputMaybe; - provider: InputMaybe; - provider_metadata: InputMaybe; - publishedAt: InputMaybe; - size: InputMaybe; - updatedAt: InputMaybe; - url: InputMaybe; - width: InputMaybe; + alternativeText?: InputMaybe; + and?: InputMaybe>>; + caption?: InputMaybe; + createdAt?: InputMaybe; + documentId?: InputMaybe; + ext?: InputMaybe; + formats?: InputMaybe; + hash?: InputMaybe; + height?: InputMaybe; + mime?: InputMaybe; + name?: InputMaybe; + not?: InputMaybe; + or?: InputMaybe>>; + previewUrl?: InputMaybe; + provider?: InputMaybe; + provider_metadata?: InputMaybe; + publishedAt?: InputMaybe; + size?: InputMaybe; + updatedAt?: InputMaybe; + url?: InputMaybe; + width?: InputMaybe; }; export type UsersPermissionsLoginInput = { identifier: Scalars['String']['input']; password: Scalars['String']['input']; - provider: Scalars['String']['input']; + provider?: Scalars['String']['input']; }; export type UsersPermissionsPermissionFiltersInput = { - action: InputMaybe; - and: InputMaybe>>; - createdAt: InputMaybe; - documentId: InputMaybe; - not: InputMaybe; - or: InputMaybe>>; - publishedAt: InputMaybe; - role: InputMaybe; - updatedAt: InputMaybe; + action?: InputMaybe; + and?: InputMaybe>>; + createdAt?: InputMaybe; + documentId?: InputMaybe; + not?: InputMaybe; + or?: InputMaybe>>; + publishedAt?: InputMaybe; + role?: InputMaybe; + updatedAt?: InputMaybe; }; export type UsersPermissionsRegisterInput = { @@ -498,54 +500,54 @@ export type UsersPermissionsRegisterInput = { }; export type UsersPermissionsRoleFiltersInput = { - and: InputMaybe>>; - createdAt: InputMaybe; - description: InputMaybe; - documentId: InputMaybe; - name: InputMaybe; - not: InputMaybe; - or: InputMaybe>>; - permissions: InputMaybe; - publishedAt: InputMaybe; - type: InputMaybe; - updatedAt: InputMaybe; - users: InputMaybe; + and?: InputMaybe>>; + createdAt?: InputMaybe; + description?: InputMaybe; + documentId?: InputMaybe; + name?: InputMaybe; + not?: InputMaybe; + or?: InputMaybe>>; + permissions?: InputMaybe; + publishedAt?: InputMaybe; + type?: InputMaybe; + updatedAt?: InputMaybe; + users?: InputMaybe; }; export type UsersPermissionsRoleInput = { - description: InputMaybe; - name: InputMaybe; - permissions: InputMaybe>>; - publishedAt: InputMaybe; - type: InputMaybe; - users: InputMaybe>>; + description?: InputMaybe; + name?: InputMaybe; + permissions?: InputMaybe>>; + publishedAt?: InputMaybe; + type?: InputMaybe; + users?: InputMaybe>>; }; export type UsersPermissionsUserFiltersInput = { - and: InputMaybe>>; - blocked: InputMaybe; - confirmed: InputMaybe; - createdAt: InputMaybe; - documentId: InputMaybe; - email: InputMaybe; - not: InputMaybe; - or: InputMaybe>>; - provider: InputMaybe; - publishedAt: InputMaybe; - role: InputMaybe; - updatedAt: InputMaybe; - username: InputMaybe; + and?: InputMaybe>>; + blocked?: InputMaybe; + confirmed?: InputMaybe; + createdAt?: InputMaybe; + documentId?: InputMaybe; + email?: InputMaybe; + not?: InputMaybe; + or?: InputMaybe>>; + provider?: InputMaybe; + publishedAt?: InputMaybe; + role?: InputMaybe; + updatedAt?: InputMaybe; + username?: InputMaybe; }; export type UsersPermissionsUserInput = { - blocked: InputMaybe; - confirmed: InputMaybe; - email: InputMaybe; - password: InputMaybe; - provider: InputMaybe; - publishedAt: InputMaybe; - role: InputMaybe; - username: InputMaybe; + blocked?: InputMaybe; + confirmed?: InputMaybe; + email?: InputMaybe; + password?: InputMaybe; + provider?: InputMaybe; + publishedAt?: InputMaybe; + role?: InputMaybe; + username?: InputMaybe; }; export type RegisterMutationVariables = Exact<{ @@ -555,7 +557,7 @@ export type RegisterMutationVariables = Exact<{ }>; -export type RegisterMutation = { __typename?: 'Mutation', register: { __typename?: 'UsersPermissionsLoginPayload', jwt: string | null, user: { __typename?: 'UsersPermissionsMe', username: string } } }; +export type RegisterMutation = { __typename?: 'Mutation', register: { __typename?: 'UsersPermissionsLoginPayload', jwt?: string | null | undefined, user: { __typename?: 'UsersPermissionsMe', username: string } } }; export type LoginMutationVariables = Exact<{ identifier: Scalars['String']['input']; @@ -563,7 +565,9 @@ export type LoginMutationVariables = Exact<{ }>; -export type LoginMutation = { __typename?: 'Mutation', login: { __typename?: 'UsersPermissionsLoginPayload', jwt: string | null } }; +export type LoginMutation = { __typename?: 'Mutation', login: { __typename?: 'UsersPermissionsLoginPayload', jwt?: string | null | undefined } }; + +export type CustomerProfileFragment = { __typename?: 'Customer', active?: boolean | null | undefined, documentId: string, name: string, phone: string, photoUrl?: string | null | undefined, role: Enum_Customer_Role, telegramId?: any | null | undefined }; export type CreateCustomerMutationVariables = Exact<{ name: Scalars['String']['input']; @@ -572,17 +576,26 @@ export type CreateCustomerMutationVariables = Exact<{ }>; -export type CreateCustomerMutation = { __typename?: 'Mutation', createCustomer: { __typename?: 'Customer', documentId: string, name: string, telegramId: any | null, phone: string, role: Enum_Customer_Role, active: boolean | null, createdAt: any | null, updatedAt: any | null, publishedAt: any | null } | null }; +export type CreateCustomerMutation = { __typename?: 'Mutation', createCustomer?: { __typename?: 'Customer', active?: boolean | null | undefined, documentId: string, name: string, phone: string, photoUrl?: string | null | undefined, role: Enum_Customer_Role, telegramId?: any | null | undefined } | null | undefined }; export type GetCustomerQueryVariables = Exact<{ telegramId: Scalars['Long']['input']; }>; -export type GetCustomerQuery = { __typename?: 'Query', customers: Array<{ __typename?: 'Customer', name: string } | null> }; +export type GetCustomerQuery = { __typename?: 'Query', customers: Array<{ __typename?: 'Customer', active?: boolean | null | undefined, documentId: string, name: string, phone: string, photoUrl?: string | null | undefined, role: Enum_Customer_Role, telegramId?: any | null | undefined } | null | undefined> }; + +export type UpdateCustomerProfileMutationVariables = Exact<{ + documentId: Scalars['ID']['input']; + data: CustomerInput; +}>; +export type UpdateCustomerProfileMutation = { __typename?: 'Mutation', updateCustomer?: { __typename?: 'Customer', active?: boolean | null | undefined, documentId: string, name: string, phone: string, photoUrl?: string | null | undefined, role: Enum_Customer_Role, telegramId?: any | null | undefined } | null | undefined }; + +export const CustomerProfileFragmentDoc = {"kind":"Document","definitions":[{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CustomerProfile"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Customer"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"active"}},{"kind":"Field","name":{"kind":"Name","value":"documentId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"phone"}},{"kind":"Field","name":{"kind":"Name","value":"photoUrl"}},{"kind":"Field","name":{"kind":"Name","value":"role"}},{"kind":"Field","name":{"kind":"Name","value":"telegramId"}}]}}]} as unknown as DocumentNode; export const RegisterDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"Register"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"identifier"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"password"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"email"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"register"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"username"},"value":{"kind":"Variable","name":{"kind":"Name","value":"identifier"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"password"},"value":{"kind":"Variable","name":{"kind":"Name","value":"password"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"email"},"value":{"kind":"Variable","name":{"kind":"Name","value":"email"}}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"jwt"}},{"kind":"Field","name":{"kind":"Name","value":"user"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"username"}}]}}]}}]}}]} as unknown as DocumentNode; export const LoginDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"Login"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"identifier"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"password"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"login"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"identifier"},"value":{"kind":"Variable","name":{"kind":"Name","value":"identifier"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"password"},"value":{"kind":"Variable","name":{"kind":"Name","value":"password"}}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"jwt"}}]}}]}}]} as unknown as DocumentNode; -export const CreateCustomerDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"CreateCustomer"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"name"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"telegramId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Long"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"phone"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"createCustomer"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"data"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"name"},"value":{"kind":"Variable","name":{"kind":"Name","value":"name"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"telegramId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"telegramId"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"phone"},"value":{"kind":"Variable","name":{"kind":"Name","value":"phone"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"role"},"value":{"kind":"EnumValue","value":"client"}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"documentId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"telegramId"}},{"kind":"Field","name":{"kind":"Name","value":"phone"}},{"kind":"Field","name":{"kind":"Name","value":"role"}},{"kind":"Field","name":{"kind":"Name","value":"active"}},{"kind":"Field","name":{"kind":"Name","value":"createdAt"}},{"kind":"Field","name":{"kind":"Name","value":"updatedAt"}},{"kind":"Field","name":{"kind":"Name","value":"publishedAt"}}]}}]}}]} as unknown as DocumentNode; -export const GetCustomerDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetCustomer"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"telegramId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Long"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"customers"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"filters"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"telegramId"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"telegramId"}}}]}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"name"}}]}}]}}]} as unknown as DocumentNode; \ No newline at end of file +export const CreateCustomerDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"CreateCustomer"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"name"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"telegramId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Long"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"phone"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"createCustomer"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"data"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"name"},"value":{"kind":"Variable","name":{"kind":"Name","value":"name"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"telegramId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"telegramId"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"phone"},"value":{"kind":"Variable","name":{"kind":"Name","value":"phone"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"role"},"value":{"kind":"EnumValue","value":"client"}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CustomerProfile"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CustomerProfile"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Customer"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"active"}},{"kind":"Field","name":{"kind":"Name","value":"documentId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"phone"}},{"kind":"Field","name":{"kind":"Name","value":"photoUrl"}},{"kind":"Field","name":{"kind":"Name","value":"role"}},{"kind":"Field","name":{"kind":"Name","value":"telegramId"}}]}}]} as unknown as DocumentNode; +export const GetCustomerDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"GetCustomer"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"telegramId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"Long"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"customers"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"filters"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"telegramId"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"eq"},"value":{"kind":"Variable","name":{"kind":"Name","value":"telegramId"}}}]}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CustomerProfile"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CustomerProfile"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Customer"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"active"}},{"kind":"Field","name":{"kind":"Name","value":"documentId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"phone"}},{"kind":"Field","name":{"kind":"Name","value":"photoUrl"}},{"kind":"Field","name":{"kind":"Name","value":"role"}},{"kind":"Field","name":{"kind":"Name","value":"telegramId"}}]}}]} as unknown as DocumentNode; +export const UpdateCustomerProfileDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"UpdateCustomerProfile"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"documentId"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"ID"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"data"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"CustomerInput"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"updateCustomer"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"documentId"},"value":{"kind":"Variable","name":{"kind":"Name","value":"documentId"}}},{"kind":"Argument","name":{"kind":"Name","value":"data"},"value":{"kind":"Variable","name":{"kind":"Name","value":"data"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"FragmentSpread","name":{"kind":"Name","value":"CustomerProfile"}}]}}]}},{"kind":"FragmentDefinition","name":{"kind":"Name","value":"CustomerProfile"},"typeCondition":{"kind":"NamedType","name":{"kind":"Name","value":"Customer"}},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"active"}},{"kind":"Field","name":{"kind":"Name","value":"documentId"}},{"kind":"Field","name":{"kind":"Name","value":"name"}},{"kind":"Field","name":{"kind":"Name","value":"phone"}},{"kind":"Field","name":{"kind":"Name","value":"photoUrl"}},{"kind":"Field","name":{"kind":"Name","value":"role"}},{"kind":"Field","name":{"kind":"Name","value":"telegramId"}}]}}]} as unknown as DocumentNode; \ No newline at end of file diff --git a/packages/ui/package.json b/packages/ui/package.json index 9c62584..2d2feb2 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -45,6 +45,8 @@ }, "dependencies": { "@radix-ui/react-avatar": "catalog:", + "@radix-ui/react-checkbox": "^1.1.3", + "@radix-ui/react-label": "^2.1.1", "react": "catalog:", "react-dom": "catalog:" } diff --git a/packages/ui/src/components/ui/card.tsx b/packages/ui/src/components/ui/card.tsx new file mode 100644 index 0000000..e5b0b1b --- /dev/null +++ b/packages/ui/src/components/ui/card.tsx @@ -0,0 +1,54 @@ +import { cn } from '@repo/ui/lib/utils'; +import * as React from 'react'; + +const Card = React.forwardRef>( + ({ className, ...props }, ref) => ( +
+ ), +); +Card.displayName = 'Card'; + +const CardHeader = React.forwardRef>( + ({ className, ...props }, ref) => ( +
+ ), +); +CardHeader.displayName = 'CardHeader'; + +const CardTitle = React.forwardRef>( + ({ className, ...props }, ref) => ( +
+ ), +); +CardTitle.displayName = 'CardTitle'; + +const CardDescription = React.forwardRef>( + ({ className, ...props }, ref) => ( +
+ ), +); +CardDescription.displayName = 'CardDescription'; + +const CardContent = React.forwardRef>( + ({ className, ...props }, ref) => ( +
+ ), +); +CardContent.displayName = 'CardContent'; + +const CardFooter = React.forwardRef>( + ({ className, ...props }, ref) => ( +
+ ), +); +CardFooter.displayName = 'CardFooter'; + +export { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle }; diff --git a/packages/ui/src/components/ui/checkbox.tsx b/packages/ui/src/components/ui/checkbox.tsx new file mode 100644 index 0000000..1aa3ef5 --- /dev/null +++ b/packages/ui/src/components/ui/checkbox.tsx @@ -0,0 +1,29 @@ +'use client'; + +import * as CheckboxPrimitive from '@radix-ui/react-checkbox'; +import { cn } from '@repo/ui/lib/utils'; +import { Check } from 'lucide-react'; +import * as React from 'react'; + +const Checkbox = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + + + +)); +Checkbox.displayName = CheckboxPrimitive.Root.displayName; + +export { Checkbox }; + +export { type CheckboxProps } from '@radix-ui/react-checkbox'; diff --git a/packages/ui/src/components/ui/input.tsx b/packages/ui/src/components/ui/input.tsx new file mode 100644 index 0000000..c0bba43 --- /dev/null +++ b/packages/ui/src/components/ui/input.tsx @@ -0,0 +1,21 @@ +import { cn } from '@repo/ui/lib/utils'; +import * as React from 'react'; + +const Input = React.forwardRef>( + ({ className, type, ...props }, ref) => { + return ( + + ); + }, +); +Input.displayName = 'Input'; + +export { Input }; diff --git a/packages/ui/src/components/ui/label.tsx b/packages/ui/src/components/ui/label.tsx new file mode 100644 index 0000000..a311364 --- /dev/null +++ b/packages/ui/src/components/ui/label.tsx @@ -0,0 +1,20 @@ +'use client'; + +import * as LabelPrimitive from '@radix-ui/react-label'; +import { cn } from '@repo/ui/lib/utils'; +import { cva, type VariantProps } from 'class-variance-authority'; +import * as React from 'react'; + +const labelVariants = cva( + 'text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70', +); + +const Label = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef & VariantProps +>(({ className, ...props }, ref) => ( + +)); +Label.displayName = LabelPrimitive.Root.displayName; + +export { Label }; diff --git a/packages/ui/src/components/ui/spinner.tsx b/packages/ui/src/components/ui/spinner.tsx new file mode 100644 index 0000000..dbb582f --- /dev/null +++ b/packages/ui/src/components/ui/spinner.tsx @@ -0,0 +1,21 @@ +import { cn } from '@repo/ui/lib/utils'; +import { Loader2 } from 'lucide-react'; + +type LoadingSpinnerProps = React.HTMLAttributes & { + readonly size?: 'lg' | 'md' | 'sm'; +}; + +export function LoadingSpinner({ className, size = 'md', ...props }: LoadingSpinnerProps) { + return ( +
+ + Loading... +
+ ); +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ae02257..c3cdf04 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -234,12 +234,18 @@ importers: next-intl: specifier: 'catalog:' version: 3.26.0(next@15.1.0(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0) + next-themes: + specifier: ^0.4.4 + version: 0.4.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: specifier: 'catalog:' version: 19.0.0 react-dom: specifier: 'catalog:' version: 19.0.0(react@19.0.0) + use-debounce: + specifier: ^10.0.4 + version: 10.0.4(react@19.0.0) zod: specifier: 'catalog:' version: 3.24.1 @@ -303,13 +309,13 @@ importers: version: 5.1.4(typescript@5.7.2)(vite@5.4.11(@types/node@20.17.8)) vitest: specifier: 'catalog:' - version: 2.1.8(@types/node@20.17.8)(jsdom@25.0.1) + version: 2.1.8(@types/node@20.17.8)(jsdom@25.0.1)(msw@2.7.0(@types/node@20.17.8)(typescript@5.7.2)) packages/eslint-config: devDependencies: '@vchikalkin/eslint-config-awesome': specifier: 'catalog:' - version: 2.0.6(@babel/core@7.26.0)(@next/eslint-plugin-next@15.0.3)(@types/node@20.17.8)(eslint-plugin-canonical@5.0.0(@typescript-eslint/parser@8.16.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint-plugin-import-x@4.5.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint-plugin-import-x@4.5.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint-plugin-import-x@4.5.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2)(vitest@2.1.8(@types/node@20.17.8)(jsdom@25.0.1)) + version: 2.0.6(@babel/core@7.26.0)(@next/eslint-plugin-next@15.0.3)(@types/node@20.17.8)(eslint-plugin-canonical@5.0.0(@typescript-eslint/parser@8.16.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint-plugin-import-x@4.5.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint-plugin-import-x@4.5.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint-plugin-import-x@4.5.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2)(vitest@2.1.8(@types/node@20.17.8)(jsdom@25.0.1)(msw@2.7.0(@types/node@20.17.8)(typescript@5.7.2))) eslint: specifier: 'catalog:' version: 9.15.0(jiti@2.4.1) @@ -361,7 +367,7 @@ importers: version: 5.1.4(typescript@5.7.2)(vite@5.4.11(@types/node@20.17.8)) vitest: specifier: 'catalog:' - version: 2.1.8(@types/node@20.17.8)(jsdom@25.0.1) + version: 2.1.8(@types/node@20.17.8)(jsdom@25.0.1)(msw@2.7.0(@types/node@20.17.8)(typescript@5.7.2)) packages/lint-staged-config: {} @@ -372,6 +378,12 @@ importers: '@radix-ui/react-avatar': specifier: 'catalog:' version: 1.1.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-checkbox': + specifier: ^1.1.3 + version: 1.1.3(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-label': + specifier: ^2.1.1 + version: 2.1.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: specifier: 'catalog:' version: 19.0.0 @@ -1072,6 +1084,15 @@ packages: resolution: {integrity: sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==} engines: {node: '>=6.9.0'} + '@bundled-es-modules/cookie@2.0.1': + resolution: {integrity: sha512-8o+5fRPLNbjbdGRRmJj3h6Hh1AQJf2dk3qQ/5ZFb+PXkRNiSoMGGUKlsgLfrxneb72axVJyIYji64E2+nNfYyw==} + + '@bundled-es-modules/statuses@1.0.1': + resolution: {integrity: sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==} + + '@bundled-es-modules/tough-cookie@0.1.6': + resolution: {integrity: sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==} + '@emnapi/runtime@1.3.1': resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} @@ -1843,6 +1864,26 @@ packages: cpu: [x64] os: [win32] + '@inquirer/confirm@5.1.1': + resolution: {integrity: sha512-vVLSbGci+IKQvDOtzpPTCOiEJCNidHcAq9JYVoWTW0svb5FiwSLotkM+JXNXejfjnzVYV9n0DTBythl9+XgTxg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + + '@inquirer/core@10.1.2': + resolution: {integrity: sha512-bHd96F3ezHg1mf/J0Rb4CV8ndCN0v28kUlrHqP7+ECm1C/A+paB7Xh2lbMk6x+kweQC+rZOxM/YeKikzxco8bQ==} + engines: {node: '>=18'} + + '@inquirer/figures@1.0.9': + resolution: {integrity: sha512-BXvGj0ehzrngHTPTDqUoDT3NXL8U0RxUk2zJm2A66RhCEIWdtU1v6GuUqNAgArW4PQ9CinqIWyHdQgdwOj06zQ==} + engines: {node: '>=18'} + + '@inquirer/type@3.0.2': + resolution: {integrity: sha512-ZhQ4TvhwHZF+lGhQ2O/rsjo80XoZR5/5qhOY3t6FJuX5XBg5Be8YzYTvaUGJnc12AUGI2nr4QSUE4PhKSigx7g==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -1868,6 +1909,10 @@ packages: '@kamilkisiela/fast-url-parser@1.1.4': resolution: {integrity: sha512-gbkePEBupNydxCelHCESvFSFM8XPh1Zs/OAVRW/rKpEqPAl5PbOM90Si8mv9bvnR53uPD2s/FiRxdvSejpRJew==} + '@mswjs/interceptors@0.37.3': + resolution: {integrity: sha512-USvgCL/uOGFtVa6SVyRrC8kIAedzRohxIXN5LISlg5C5vLZCn7dgMFVSNhSF9cuBEFrm/O2spDWEZeMnw4ZXYg==} + engines: {node: '>=18'} + '@next/env@15.1.0': resolution: {integrity: sha512-UcCO481cROsqJuszPPXJnb7GGuLq617ve4xuAyyNG4VSSocJNtMU5Fsx+Lp6mlN8c7W58aZLc5y6D/2xNmaK+w==} @@ -1944,6 +1989,15 @@ packages: resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} engines: {node: '>=12.4.0'} + '@open-draft/deferred-promise@2.2.0': + resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} + + '@open-draft/logger@0.3.0': + resolution: {integrity: sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==} + + '@open-draft/until@2.1.0': + resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} + '@panva/hkdf@1.2.1': resolution: {integrity: sha512-6oclG6Y3PiDFcoyk8srjLfVKyMfVCKJ27JwNPViuXziFpmdz+MZnZN/aKY0JGXgYuO/VghU0jcOAZgWXZ1Dmrw==} @@ -1971,6 +2025,9 @@ packages: engines: {node: '>=18'} hasBin: true + '@radix-ui/primitive@1.1.1': + resolution: {integrity: sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==} + '@radix-ui/react-avatar@1.1.2': resolution: {integrity: sha512-GaC7bXQZ5VgZvVvsJ5mu/AEbjYLnhhkoidOboC50Z6FFlLA03wG2ianUoH+zgDQ31/9gCF59bE4+2bBgTyMiig==} peerDependencies: @@ -1984,6 +2041,19 @@ packages: '@types/react-dom': optional: true + '@radix-ui/react-checkbox@1.1.3': + resolution: {integrity: sha512-HD7/ocp8f1B3e6OHygH0n7ZKjONkhciy1Nh0yuBgObqThc3oyx+vuMfFHKAknXRHHWVE9XvXStxJFyjUmB8PIw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-compose-refs@1.1.1': resolution: {integrity: sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==} peerDependencies: @@ -2002,6 +2072,32 @@ packages: '@types/react': optional: true + '@radix-ui/react-label@2.1.1': + resolution: {integrity: sha512-UUw5E4e/2+4kFMH7+YxORXGWggtY6sM8WIwh5RZchhLuUg2H1hc98Py+pr8HMz6rdaYrK2t296ZEjYLOCO5uUw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-presence@1.1.2': + resolution: {integrity: sha512-18TFr80t5EVgL9x1SwF/YGtfG+l0BS0PRAlCWBDoBEiDQjeKgnNZRVJp/oVBl24sr3Gbfwc/Qpj4OcWTQMsAEg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + '@radix-ui/react-primitive@2.0.1': resolution: {integrity: sha512-sHCWTtxwNn3L3fH8qAfnF3WbUZycW93SM1j3NFDzXBiz8D6F5UTTy8G1+WFEaiCdvCVRJWj6N2R4Xq6HdiHmDg==} peerDependencies: @@ -2033,6 +2129,15 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-controllable-state@1.1.0': + resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@radix-ui/react-use-layout-effect@1.1.0': resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==} peerDependencies: @@ -2042,6 +2147,24 @@ packages: '@types/react': optional: true + '@radix-ui/react-use-previous@1.1.0': + resolution: {integrity: sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-size@1.1.0': + resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@repeaterjs/repeater@3.0.4': resolution: {integrity: sha512-AW8PKd6iX3vAZ0vA43nOUOnbq/X5ihgU+mSXXqunMkeQADGiqw/PY0JNeYtD5sr0PAy51YPgAPbDoeapv9r8WA==} @@ -2222,6 +2345,9 @@ packages: '@types/babel__traverse@7.20.6': resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + '@types/cookie@0.6.0': + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} @@ -2249,6 +2375,12 @@ packages: '@types/react@19.0.1': resolution: {integrity: sha512-YW6614BDhqbpR5KtUYzTA+zlA7nayzJRA9ljz9CQoxthR0sDisYZLuvSMsil36t4EH/uAt8T52Xb4sVw17G+SQ==} + '@types/statuses@2.0.5': + resolution: {integrity: sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==} + + '@types/tough-cookie@4.0.5': + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + '@types/ws@8.5.13': resolution: {integrity: sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==} @@ -2804,6 +2936,10 @@ packages: resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} engines: {node: '>= 10'} + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} @@ -3794,6 +3930,9 @@ packages: header-case@2.0.4: resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} + headers-polyfill@4.0.3: + resolution: {integrity: sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==} + hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} @@ -3982,6 +4121,9 @@ packages: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} + is-node-process@1.2.0: + resolution: {integrity: sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==} + is-number-object@1.0.7: resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} engines: {node: '>= 0.4'} @@ -4402,9 +4544,23 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + msw@2.7.0: + resolution: {integrity: sha512-BIodwZ19RWfCbYTxWTUfTXc+sg4OwjCAgxU1ZsgmggX/7S3LdUifsbUPJs61j0rWb19CZRGY5if77duhc0uXzw==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + typescript: '>= 4.8.x' + peerDependenciesMeta: + typescript: + optional: true + mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + mute-stream@2.0.0: + resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} + engines: {node: ^18.17.0 || >=20.5.0} + mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} @@ -4444,6 +4600,12 @@ packages: next: ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 react: ^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0 + next-themes@0.4.4: + resolution: {integrity: sha512-LDQ2qIOJF0VnuVrrMSMLrWGjRMkq+0mpgl6e0juCLqdJ+oo8Q84JRWT6Wh11VDQKkMMe+dVzDKLWs5n87T+PkQ==} + peerDependencies: + react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc + react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc + next@15.1.0: resolution: {integrity: sha512-QKhzt6Y8rgLNlj30izdMbxAwjHMFANnLwDwZ+WQh5sMhyt4lEBqDK9QpvWHtIM4rINKPoJ8aiRZKg5ULSybVHw==} engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} @@ -4588,6 +4750,9 @@ packages: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} + outvariant@1.4.3: + resolution: {integrity: sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==} + p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -4682,6 +4847,9 @@ packages: resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} engines: {node: 20 || >=22} + path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -4845,6 +5013,9 @@ packages: resolution: {integrity: sha512-2yma2tog9VaRZY2mn3Wq51uiSW4NcPYT1cQdBagwyrznrilKSZwIZ0UG3ZPL/mx+axEns0hE35T5ufOYZXEnBQ==} engines: {node: '>=4'} + psl@1.15.0: + resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} + punycode@1.4.1: resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} @@ -4859,6 +5030,9 @@ packages: resolution: {integrity: sha512-pMpnA0qRdFp32b1sJl1wOJNxZLQ2cbQx+k6tjNtZ8CpvVhNqEPRgivZ2WOUev2YMajecdH7ctUPDvEe87nariQ==} engines: {node: '>=6.0.0'} + querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -4996,6 +5170,9 @@ packages: resolution: {integrity: sha512-LBnkqsDE7BZKvqylbmn7lTIVdpx4K/QCduRATpO5R+wtPmky/a8pN1bO2D6wXppn1497AJF9mNjqAXr6bdl9jg==} engines: {node: '>=0.10.5'} + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -5227,6 +5404,10 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + std-env@3.8.0: resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} @@ -5234,6 +5415,9 @@ packages: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} + strict-event-emitter@0.5.1: + resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==} + string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} @@ -5417,6 +5601,10 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} + tough-cookie@4.1.4: + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} + engines: {node: '>=6'} + tough-cookie@5.0.0: resolution: {integrity: sha512-FRKsF7cz96xIIeMZ82ehjC3xW2E+O2+v11udrDYewUbszngYhsGa8z6YUMMzO9QJZzzyd0nGGXnML/TReX6W8Q==} engines: {node: '>=16'} @@ -5528,6 +5716,10 @@ packages: resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} engines: {node: '>=8'} + type-fest@4.30.2: + resolution: {integrity: sha512-UJShLPYi1aWqCdq9HycOL/gwsuqda1OISdBO3t8RlXQC4QvtuIz4b5FCfe2dQIWEpmlRExKmcTBfP1r9bhY7ig==} + engines: {node: '>=16'} + typed-array-buffer@1.0.2: resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} engines: {node: '>= 0.4'} @@ -5579,6 +5771,10 @@ packages: resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} engines: {node: '>=4'} + universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + unixify@1.0.0: resolution: {integrity: sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==} engines: {node: '>=0.10.0'} @@ -5598,12 +5794,21 @@ packages: uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + urlpattern-polyfill@10.0.0: resolution: {integrity: sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==} urlpattern-polyfill@8.0.2: resolution: {integrity: sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==} + use-debounce@10.0.4: + resolution: {integrity: sha512-6Cf7Yr7Wk7Kdv77nnJMf6de4HuDE4dTxKij+RqE9rufDsI6zsbjyAxcH5y2ueJCQAnfgKbzXbZHYlkFwmBlWkw==} + engines: {node: '>= 16.0.0'} + peerDependencies: + react: '*' + use-intl@3.26.0: resolution: {integrity: sha512-HGXmpjGlbEv1uFZPfm557LK8p/hv0pKF9UwnrJeHUTxQx6bUGzMgpmPRLCVY3zkr7hfjy4LPwQJfk4Fhnn+dIg==} peerDependencies: @@ -5863,6 +6068,10 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + yoctocolors-cjs@2.1.2: + resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} + engines: {node: '>=18'} + zen-observable-ts@1.2.5: resolution: {integrity: sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg==} @@ -6720,6 +6929,22 @@ snapshots: '@babel/helper-string-parser': 7.25.9 '@babel/helper-validator-identifier': 7.25.9 + '@bundled-es-modules/cookie@2.0.1': + dependencies: + cookie: 0.7.2 + optional: true + + '@bundled-es-modules/statuses@1.0.1': + dependencies: + statuses: 2.0.1 + optional: true + + '@bundled-es-modules/tough-cookie@0.1.6': + dependencies: + '@types/tough-cookie': 4.0.5 + tough-cookie: 4.1.4 + optional: true + '@emnapi/runtime@1.3.1': dependencies: tslib: 2.8.1 @@ -7650,6 +7875,36 @@ snapshots: '@img/sharp-win32-x64@0.33.5': optional: true + '@inquirer/confirm@5.1.1(@types/node@20.17.8)': + dependencies: + '@inquirer/core': 10.1.2(@types/node@20.17.8) + '@inquirer/type': 3.0.2(@types/node@20.17.8) + '@types/node': 20.17.8 + optional: true + + '@inquirer/core@10.1.2(@types/node@20.17.8)': + dependencies: + '@inquirer/figures': 1.0.9 + '@inquirer/type': 3.0.2(@types/node@20.17.8) + ansi-escapes: 4.3.2 + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.2 + transitivePeerDependencies: + - '@types/node' + optional: true + + '@inquirer/figures@1.0.9': + optional: true + + '@inquirer/type@3.0.2(@types/node@20.17.8)': + dependencies: + '@types/node': 20.17.8 + optional: true + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -7678,6 +7933,16 @@ snapshots: '@kamilkisiela/fast-url-parser@1.1.4': {} + '@mswjs/interceptors@0.37.3': + dependencies: + '@open-draft/deferred-promise': 2.2.0 + '@open-draft/logger': 0.3.0 + '@open-draft/until': 2.1.0 + is-node-process: 1.2.0 + outvariant: 1.4.3 + strict-event-emitter: 0.5.1 + optional: true + '@next/env@15.1.0': {} '@next/eslint-plugin-next@14.2.18': @@ -7730,6 +7995,18 @@ snapshots: '@nolyfill/is-core-module@1.0.39': {} + '@open-draft/deferred-promise@2.2.0': + optional: true + + '@open-draft/logger@0.3.0': + dependencies: + is-node-process: 1.2.0 + outvariant: 1.4.3 + optional: true + + '@open-draft/until@2.1.0': + optional: true + '@panva/hkdf@1.2.1': {} '@peculiar/asn1-schema@2.3.13': @@ -7759,6 +8036,8 @@ snapshots: dependencies: playwright: 1.49.1 + '@radix-ui/primitive@1.1.1': {} + '@radix-ui/react-avatar@1.1.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/react-context': 1.1.1(@types/react@19.0.1)(react@19.0.0) @@ -7771,6 +8050,22 @@ snapshots: '@types/react': 19.0.1 '@types/react-dom': 19.0.1 + '@radix-ui/react-checkbox@1.1.3(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.1 + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-context': 1.1.1(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-use-previous': 1.1.0(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-use-size': 1.1.0(@types/react@19.0.1)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.1 + '@types/react-dom': 19.0.1 + '@radix-ui/react-compose-refs@1.1.1(@types/react@19.0.1)(react@19.0.0)': dependencies: react: 19.0.0 @@ -7783,6 +8078,25 @@ snapshots: optionalDependencies: '@types/react': 19.0.1 + '@radix-ui/react-label@2.1.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-primitive': 2.0.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.1 + '@types/react-dom': 19.0.1 + + '@radix-ui/react-presence@1.1.2(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.1)(react@19.0.0) + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.1)(react@19.0.0) + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + optionalDependencies: + '@types/react': 19.0.1 + '@types/react-dom': 19.0.1 + '@radix-ui/react-primitive@2.0.1(@types/react-dom@19.0.1)(@types/react@19.0.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': dependencies: '@radix-ui/react-slot': 1.1.1(@types/react@19.0.1)(react@19.0.0) @@ -7805,12 +8119,32 @@ snapshots: optionalDependencies: '@types/react': 19.0.1 + '@radix-ui/react-use-controllable-state@1.1.0(@types/react@19.0.1)(react@19.0.0)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.1)(react@19.0.0) + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.1 + '@radix-ui/react-use-layout-effect@1.1.0(@types/react@19.0.1)(react@19.0.0)': dependencies: react: 19.0.0 optionalDependencies: '@types/react': 19.0.1 + '@radix-ui/react-use-previous@1.1.0(@types/react@19.0.1)(react@19.0.0)': + dependencies: + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.1 + + '@radix-ui/react-use-size@1.1.0(@types/react@19.0.1)(react@19.0.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.1)(react@19.0.0) + react: 19.0.0 + optionalDependencies: + '@types/react': 19.0.1 + '@repeaterjs/repeater@3.0.4': {} '@repeaterjs/repeater@3.0.6': {} @@ -7975,6 +8309,9 @@ snapshots: dependencies: '@babel/types': 7.26.0 + '@types/cookie@0.6.0': + optional: true + '@types/estree@1.0.6': {} '@types/js-yaml@4.0.9': {} @@ -8001,6 +8338,12 @@ snapshots: dependencies: csstype: 3.1.3 + '@types/statuses@2.0.5': + optional: true + + '@types/tough-cookie@4.0.5': + optional: true + '@types/ws@8.5.13': dependencies: '@types/node': 20.17.8 @@ -8164,10 +8507,10 @@ snapshots: '@typescript-eslint/types': 8.17.0 eslint-visitor-keys: 4.2.0 - '@vchikalkin/eslint-config-awesome@2.0.6(@babel/core@7.26.0)(@next/eslint-plugin-next@15.0.3)(@types/node@20.17.8)(eslint-plugin-canonical@5.0.0(@typescript-eslint/parser@8.16.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint-plugin-import-x@4.5.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint-plugin-import-x@4.5.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint-plugin-import-x@4.5.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2)(vitest@2.1.8(@types/node@20.17.8)(jsdom@25.0.1))': + '@vchikalkin/eslint-config-awesome@2.0.6(@babel/core@7.26.0)(@next/eslint-plugin-next@15.0.3)(@types/node@20.17.8)(eslint-plugin-canonical@5.0.0(@typescript-eslint/parser@8.16.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint-plugin-import-x@4.5.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint-plugin-import-x@4.5.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint-plugin-import-x@4.5.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2)(vitest@2.1.8(@types/node@20.17.8)(jsdom@25.0.1)(msw@2.7.0(@types/node@20.17.8)(typescript@5.7.2)))': dependencies: '@next/eslint-plugin-next': 15.0.3 - eslint-config-canonical: 44.3.33(@babel/core@7.26.0)(@types/node@20.17.8)(eslint-plugin-import-x@4.5.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2)(vitest@2.1.8(@types/node@20.17.8)(jsdom@25.0.1)) + eslint-config-canonical: 44.3.33(@babel/core@7.26.0)(@types/node@20.17.8)(eslint-plugin-import-x@4.5.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2)(vitest@2.1.8(@types/node@20.17.8)(jsdom@25.0.1)(msw@2.7.0(@types/node@20.17.8)(typescript@5.7.2))) eslint-plugin-canonical: 5.0.0(@typescript-eslint/parser@8.16.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint-plugin-import-x@4.5.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint-plugin-import-x@4.5.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2) eslint-plugin-sonarjs: 3.0.1(eslint@9.15.0(jiti@2.4.1)) transitivePeerDependencies: @@ -8206,12 +8549,13 @@ snapshots: chai: 5.1.2 tinyrainbow: 1.2.0 - '@vitest/mocker@2.1.8(vite@5.4.11(@types/node@20.17.8))': + '@vitest/mocker@2.1.8(msw@2.7.0(@types/node@20.17.8)(typescript@5.7.2))(vite@5.4.11(@types/node@20.17.8))': dependencies: '@vitest/spy': 2.1.8 estree-walker: 3.0.3 magic-string: 0.30.15 optionalDependencies: + msw: 2.7.0(@types/node@20.17.8)(typescript@5.7.2) vite: 5.4.11(@types/node@20.17.8) '@vitest/pretty-format@2.1.8': @@ -8710,6 +9054,9 @@ snapshots: cli-width@3.0.0: {} + cli-width@4.1.0: + optional: true + client-only@0.0.1: {} cliui@6.0.0: @@ -9138,7 +9485,7 @@ snapshots: eslint: 9.15.0(jiti@2.4.1) semver: 7.6.3 - eslint-config-canonical@44.3.33(@babel/core@7.26.0)(@types/node@20.17.8)(eslint-plugin-import-x@4.5.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2)(vitest@2.1.8(@types/node@20.17.8)(jsdom@25.0.1)): + eslint-config-canonical@44.3.33(@babel/core@7.26.0)(@types/node@20.17.8)(eslint-plugin-import-x@4.5.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2)(vitest@2.1.8(@types/node@20.17.8)(jsdom@25.0.1)(msw@2.7.0(@types/node@20.17.8)(typescript@5.7.2))): dependencies: '@graphql-eslint/eslint-plugin': 3.20.1(@babel/core@7.26.0)(@types/node@20.17.8)(graphql@16.9.0) '@next/eslint-plugin-next': 14.2.18 @@ -9169,7 +9516,7 @@ snapshots: eslint-plugin-react-hooks: 5.1.0-rc-fb9a90fa48-20240614(eslint@9.15.0(jiti@2.4.1)) eslint-plugin-regexp: 2.7.0(eslint@9.15.0(jiti@2.4.1)) eslint-plugin-unicorn: 56.0.1(eslint@9.15.0(jiti@2.4.1)) - eslint-plugin-vitest: 0.5.4(@typescript-eslint/eslint-plugin@8.16.0(@typescript-eslint/parser@8.16.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2)(vitest@2.1.8(@types/node@20.17.8)(jsdom@25.0.1)) + eslint-plugin-vitest: 0.5.4(@typescript-eslint/eslint-plugin@8.16.0(@typescript-eslint/parser@8.16.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2)(vitest@2.1.8(@types/node@20.17.8)(jsdom@25.0.1)(msw@2.7.0(@types/node@20.17.8)(typescript@5.7.2))) eslint-plugin-yml: 1.16.0(eslint@9.15.0(jiti@2.4.1)) eslint-plugin-zod: 1.4.0(eslint@9.15.0(jiti@2.4.1)) globals: 15.12.0 @@ -9526,13 +9873,13 @@ snapshots: semver: 7.6.3 strip-indent: 3.0.0 - eslint-plugin-vitest@0.5.4(@typescript-eslint/eslint-plugin@8.16.0(@typescript-eslint/parser@8.16.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2)(vitest@2.1.8(@types/node@20.17.8)(jsdom@25.0.1)): + eslint-plugin-vitest@0.5.4(@typescript-eslint/eslint-plugin@8.16.0(@typescript-eslint/parser@8.16.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2)(vitest@2.1.8(@types/node@20.17.8)(jsdom@25.0.1)(msw@2.7.0(@types/node@20.17.8)(typescript@5.7.2))): dependencies: '@typescript-eslint/utils': 7.18.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2) eslint: 9.15.0(jiti@2.4.1) optionalDependencies: '@typescript-eslint/eslint-plugin': 8.16.0(@typescript-eslint/parser@8.16.0(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2))(eslint@9.15.0(jiti@2.4.1))(typescript@5.7.2) - vitest: 2.1.8(@types/node@20.17.8)(jsdom@25.0.1) + vitest: 2.1.8(@types/node@20.17.8)(jsdom@25.0.1)(msw@2.7.0(@types/node@20.17.8)(typescript@5.7.2)) transitivePeerDependencies: - supports-color - typescript @@ -9991,6 +10338,9 @@ snapshots: capital-case: 1.0.4 tslib: 2.8.1 + headers-polyfill@4.0.3: + optional: true + hoist-non-react-statics@3.3.2: dependencies: react-is: 16.13.1 @@ -10183,6 +10533,9 @@ snapshots: is-negative-zero@2.0.3: {} + is-node-process@1.2.0: + optional: true + is-number-object@1.0.7: dependencies: has-tostringtag: 1.0.2 @@ -10597,8 +10950,37 @@ snapshots: ms@2.1.3: {} + msw@2.7.0(@types/node@20.17.8)(typescript@5.7.2): + dependencies: + '@bundled-es-modules/cookie': 2.0.1 + '@bundled-es-modules/statuses': 1.0.1 + '@bundled-es-modules/tough-cookie': 0.1.6 + '@inquirer/confirm': 5.1.1(@types/node@20.17.8) + '@mswjs/interceptors': 0.37.3 + '@open-draft/deferred-promise': 2.2.0 + '@open-draft/until': 2.1.0 + '@types/cookie': 0.6.0 + '@types/statuses': 2.0.5 + graphql: 16.9.0 + headers-polyfill: 4.0.3 + is-node-process: 1.2.0 + outvariant: 1.4.3 + path-to-regexp: 6.3.0 + picocolors: 1.1.1 + strict-event-emitter: 0.5.1 + type-fest: 4.30.2 + yargs: 17.7.2 + optionalDependencies: + typescript: 5.7.2 + transitivePeerDependencies: + - '@types/node' + optional: true + mute-stream@0.0.8: {} + mute-stream@2.0.0: + optional: true + mz@2.7.0: dependencies: any-promise: 1.3.0 @@ -10636,6 +11018,11 @@ snapshots: react: 19.0.0 use-intl: 3.26.0(react@19.0.0) + next-themes@0.4.4(react-dom@19.0.0(react@19.0.0))(react@19.0.0): + dependencies: + react: 19.0.0 + react-dom: 19.0.0(react@19.0.0) + next@15.1.0(@babel/core@7.26.0)(@playwright/test@1.49.1)(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: '@next/env': 15.1.0 @@ -10793,6 +11180,9 @@ snapshots: os-tmpdir@1.0.2: {} + outvariant@1.4.3: + optional: true + p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -10886,6 +11276,9 @@ snapshots: lru-cache: 11.0.2 minipass: 7.1.2 + path-to-regexp@6.3.0: + optional: true + path-type@4.0.0: {} pathe@1.1.2: {} @@ -11009,6 +11402,11 @@ snapshots: proto-props@2.0.0: {} + psl@1.15.0: + dependencies: + punycode: 2.3.1 + optional: true + punycode@1.4.1: {} punycode@2.3.1: {} @@ -11019,6 +11417,9 @@ snapshots: pvutils@1.1.3: {} + querystringify@2.2.0: + optional: true + queue-microtask@1.2.3: {} rambda@7.5.0: {} @@ -11159,6 +11560,9 @@ snapshots: requireindex@1.1.0: {} + requires-port@1.0.0: + optional: true + resolve-from@4.0.0: {} resolve-from@5.0.0: {} @@ -11431,10 +11835,16 @@ snapshots: stackback@0.0.2: {} + statuses@2.0.1: + optional: true + std-env@3.8.0: {} streamsearch@1.1.0: {} + strict-event-emitter@0.5.1: + optional: true + string-argv@0.3.2: {} string-env-interpolation@1.0.1: {} @@ -11653,6 +12063,14 @@ snapshots: dependencies: is-number: 7.0.0 + tough-cookie@4.1.4: + dependencies: + psl: 1.15.0 + punycode: 2.3.1 + universalify: 0.2.0 + url-parse: 1.5.10 + optional: true + tough-cookie@5.0.0: dependencies: tldts: 6.1.66 @@ -11742,6 +12160,9 @@ snapshots: type-fest@0.8.1: {} + type-fest@4.30.2: + optional: true + typed-array-buffer@1.0.2: dependencies: call-bind: 1.0.7 @@ -11801,6 +12222,9 @@ snapshots: unicode-property-aliases-ecmascript@2.1.0: {} + universalify@0.2.0: + optional: true + unixify@1.0.0: dependencies: normalize-path: 2.1.1 @@ -11823,10 +12247,20 @@ snapshots: dependencies: punycode: 2.3.1 + url-parse@1.5.10: + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + optional: true + urlpattern-polyfill@10.0.0: {} urlpattern-polyfill@8.0.2: {} + use-debounce@10.0.4(react@19.0.0): + dependencies: + react: 19.0.0 + use-intl@3.26.0(react@19.0.0): dependencies: '@formatjs/fast-memoize': 2.2.5 @@ -11882,10 +12316,10 @@ snapshots: '@types/node': 20.17.8 fsevents: 2.3.3 - vitest@2.1.8(@types/node@20.17.8)(jsdom@25.0.1): + vitest@2.1.8(@types/node@20.17.8)(jsdom@25.0.1)(msw@2.7.0(@types/node@20.17.8)(typescript@5.7.2)): dependencies: '@vitest/expect': 2.1.8 - '@vitest/mocker': 2.1.8(vite@5.4.11(@types/node@20.17.8)) + '@vitest/mocker': 2.1.8(msw@2.7.0(@types/node@20.17.8)(typescript@5.7.2))(vite@5.4.11(@types/node@20.17.8)) '@vitest/pretty-format': 2.1.8 '@vitest/runner': 2.1.8 '@vitest/snapshot': 2.1.8 @@ -12099,6 +12533,9 @@ snapshots: yocto-queue@0.1.0: {} + yoctocolors-cjs@2.1.2: + optional: true + zen-observable-ts@1.2.5: dependencies: zen-observable: 0.8.15