address order confirmation change requests

This commit is contained in:
tedraykov 2024-07-03 00:30:51 +03:00
parent 4673120ddc
commit 020b21892d
16 changed files with 141 additions and 794 deletions

View File

@ -1,17 +1,15 @@
import { InformationCircleIcon } from '@heroicons/react/24/outline';
import ActivateWarranty from 'components/orders/activate-warranty';
import MobileOrderActions from 'components/orders/mobile-order-actions';
import OrderConfirmation from 'components/orders/order-confirmation';
import OrdersHeader from 'components/orders/orders-header';
import Price from 'components/price';
import { Button } from 'components/ui';
import { getCustomerOrders } from 'lib/shopify';
import { toPrintDate } from 'lib/utils';
import dynamic from 'next/dynamic';
import Image from 'next/image';
import Link from 'next/link';
const OrderConfirmation = dynamic(() => import('components/orders/order-confirmation'));
export default async function AccountPage() {
const orders = await getCustomerOrders();
@ -65,7 +63,7 @@ export default async function AccountPage() {
</Button>
</Link>
<ActivateWarranty order={order} />
{!order.orderConfirmation && <OrderConfirmation order={order} />}
<OrderConfirmation order={order} />
</div>
</div>

View File

@ -1,7 +0,0 @@
import { getOrderConfirmationContent } from 'lib/shopify';
export async function GET() {
const data = await getOrderConfirmationContent();
return Response.json({ ...data });
}

View File

@ -1,13 +1,37 @@
import clsx from 'clsx';
import { VariantProps, tv } from 'tailwind-variants';
const dots = 'mx-[1px] inline-block h-1 w-1 animate-blink rounded-md';
const loadingDots = tv({
slots: {
root: 'mx-2 inline-flex items-center',
dots: 'bg-content inline-block animate-blink rounded-full'
},
variants: {
size: {
md: {
dots: 'h-1 w-1 mx-[1px]'
},
lg: {
dots: 'h-2 w-2 mx-[2px]'
}
}
},
defaultVariants: {
size: 'md'
}
});
const LoadingDots = ({ className }: { className: string }) => {
const LoadingDots = ({
rootClassName,
className,
size
}: { className?: string; rootClassName?: string } & VariantProps<typeof loadingDots>) => {
const { root, dots } = loadingDots({ size });
return (
<span className="mx-2 inline-flex items-center">
<span className={clsx(dots, className)} />
<span className={clsx(dots, 'animation-delay-[200ms]', className)} />
<span className={clsx(dots, 'animation-delay-[400ms]', className)} />
<span className={root({ className: rootClassName })}>
<span className={dots({ className })} />
<span className={clsx(dots({ className }), 'animation-delay-[200ms]')} />
<span className={clsx(dots({ className }), 'animation-delay-[400ms]')} />
</span>
);
};

View File

@ -4,7 +4,7 @@ import { renderToBuffer } from '@react-pdf/renderer';
import OrderConfirmationPdf from 'components/orders/order-confirmation-pdf';
import { handleUploadFile } from 'components/form/file-input/actions';
import { TAGS } from 'lib/constants';
import { updateOrderMetafields } from 'lib/shopify';
import { getOrderConfirmationContent, updateOrderMetafields } from 'lib/shopify';
import {
Order,
OrderConfirmationContent,
@ -12,6 +12,7 @@ import {
UpdateOrderMetafieldInput
} from 'lib/shopify/types';
import { revalidateTag } from 'next/cache';
import { cache } from 'react';
const getMetafieldValue = (
key: keyof ShopifyOrderMetafield,
@ -115,6 +116,10 @@ async function generateOrderConfirmationPDF(
);
}
export const fetchOrderConfirmationContent = cache(async () => {
return getOrderConfirmationContent();
});
type ConfirmOrderOptions = {
order: Order;
content: OrderConfirmationContent;

View File

@ -1,5 +1,5 @@
import Image from 'next/image';
import { Dialog, DialogBackdrop, DialogPanel } from '@headlessui/react';
import { Dialog, DialogBackdrop, DialogPanel, DialogTitle } from '@headlessui/react';
import { toPrintDate } from 'lib/utils';
import PaymentsDetails from './payment-details';
import Price from 'components/price';
@ -7,8 +7,9 @@ import Divider from 'components/divider';
import Markdown from 'markdown-to-jsx';
import { Order, OrderConfirmationContent } from 'lib/shopify/types';
import { FormEventHandler, useEffect, useRef, useState, useTransition } from 'react';
import { confirmOrder } from 'components/orders/actions';
import { Button, Heading, Text, Label, Skeleton, InputLabel, Input } from 'components/ui';
import { confirmOrder, fetchOrderConfirmationContent } from 'components/orders/actions';
import { Button, Heading, Text, Label, Input, Skeleton } from 'components/ui';
import LoadingDots from 'components/loading-dots';
function OrderConfirmationDetails({
content,
@ -188,31 +189,28 @@ export default function OrderConfirmationModal({
onClose: () => void;
}) {
const [loading, setLoading] = useState(true);
const [submitting, setSubmitting] = useState(false);
const [orderConfirmationContent, setOrderConfirmationContent] =
useState<OrderConfirmationContent>();
const [, startTransition] = useTransition();
const formRef = useRef<HTMLFormElement>(null);
useEffect(() => {
const fetchOrderConfirmationContent = async () => {
const res = await fetch('/api/orders/confirmation');
const data = await res.json();
setOrderConfirmationContent(data);
setLoading(false);
};
// If the order has already been confirmed, don't fetch the content
if (order.orderConfirmation) return;
fetchOrderConfirmationContent();
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);
if (!isOpen) return;
(async () => {
const data = await fetchOrderConfirmationContent();
setOrderConfirmationContent(data);
setLoading(false);
})();
}, [isOpen, order.orderConfirmation]);
const handleSubmit: FormEventHandler<HTMLFormElement> = (event) => {
event.preventDefault();
setLoading(true);
setSubmitting(true);
const form = formRef.current;
if (!form) return;
const formData = new FormData(form);
@ -223,7 +221,6 @@ export default function OrderConfirmationModal({
content: orderConfirmationContent!,
formData
});
form.reset();
});
};
@ -239,46 +236,39 @@ export default function OrderConfirmationModal({
<div className="flex min-h-full items-center justify-center">
<DialogPanel
transition
className="max-w-3xl space-y-4 rounded bg-white p-12 duration-300 ease-out data-[closed]:scale-95 data-[closed]:opacity-0"
className="w-full max-w-3xl space-y-4 rounded bg-white p-5 duration-300 ease-out data-[closed]:scale-95 data-[closed]:opacity-0"
>
<DialogTitle className="mb-2 font-bold">Confirm Order</DialogTitle>
{loading ? (
<Skeleton />
<LoadingDots size="lg" rootClassName="flex justify-center" />
) : (
<OrderConfirmationDetails content={orderConfirmationContent!} order={order} />
)}
<form onSubmit={handleSubmit} ref={formRef} className="space-y-4">
<div className="space-y-2">
<InputLabel htmlFor="date">Today&apos;s date</InputLabel>
<form onSubmit={handleSubmit} ref={formRef}>
<div className="max-w-md space-y-4">
<Input
type="date"
id="date"
name="date"
readOnly
label="Date"
value={new Date().toLocaleDateString('en-CA', {
year: 'numeric',
month: '2-digit',
day: '2-digit'
})}
/>
</div>
<div className="space-y-2">
<InputLabel htmlFor="signature1">Print your name to sign</InputLabel>
<Input id="signature1" name="signature1" required />
</div>
<div className="space-y-2">
<InputLabel htmlFor="signature2">
Credit card holder&apos;s electronic signature
</InputLabel>
<Input id="signature2" name="signature2" required />
<Input required label="Print your name to sign" />
<Input required label="Credit card holder's electronic signature" />
</div>
<div className="flex justify-end gap-2">
<Button variant="text">Cancel</Button>
<Button variant="text" onClick={onClose}>
Cancel
</Button>
<Button
type="submit"
variant="solid"
color="primary"
disabled={loading}
isLoading={loading}
disabled={submitting || loading}
isLoading={submitting}
>
Submit
</Button>

View File

@ -1,10 +1,8 @@
'use client';
import { Button } from 'components/ui';
import { Order } from 'lib/shopify/types';
import dynamic from 'next/dynamic';
import { useState } from 'react';
const OrderConfirmationModal = dynamic(() => import('./order-confirmation-modal'));
import OrderConfirmationModal from './order-confirmation-modal';
export default function OrderConfirmation({ order }: { order: Order }) {
const [isOpen, setIsOpen] = useState(false);
@ -12,13 +10,8 @@ export default function OrderConfirmation({ order }: { order: Order }) {
if (order.orderConfirmation) return null;
return (
<>
<Button variant="outlined" onClick={() => setIsOpen(true)}>
Confirm Order
</Button>
{isOpen && (
<OrderConfirmationModal isOpen={isOpen} onClose={() => setIsOpen(false)} order={order} />
)}
<Button onClick={() => setIsOpen(true)}>Confirm Order</Button>
<OrderConfirmationModal isOpen={isOpen} onClose={() => setIsOpen(false)} order={order} />
</>
);
}

View File

@ -3,7 +3,7 @@ import React from 'react';
import { Button as ButtonBase, ButtonProps as ButtonBaseProps } from '@headlessui/react';
import { tv, type VariantProps } from 'tailwind-variants';
import clsx from 'clsx';
import LoadingDots from './loading-dots';
import LoadingDots from 'components/loading-dots';
import { focusInput } from 'lib/utils';
const buttonVariants = tv({
@ -183,7 +183,7 @@ const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(
>
{isLoading ? (
<span className={loading()}>
<LoadingDots />
<LoadingDots className="bg-white" />
<span className="sr-only">{loadingText}</span>
<span>{loadingText}</span>
</span>

View File

@ -1,28 +0,0 @@
'use client';
import { CheckIcon } from '@heroicons/react/24/outline';
import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
import { cn } from 'lib/utils';
import { forwardRef } from 'react';
const Checkbox = forwardRef<
React.ElementRef<typeof CheckboxPrimitive.Root>,
React.ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>
>(({ className, ...props }, ref) => (
<CheckboxPrimitive.Root
ref={ref}
className={cn(
'ring-offset-background focus-visible:ring-ring peer h-4 w-4 shrink-0 rounded-sm border border-dark focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-offset-2 disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-dark data-[state=checked]:text-white',
className
)}
{...props}
>
<CheckboxPrimitive.Indicator className={cn('flex items-center justify-center text-current')}>
<CheckIcon className="h-4 w-4" />
</CheckboxPrimitive.Indicator>
</CheckboxPrimitive.Root>
));
Checkbox.displayName = CheckboxPrimitive.Root.displayName;
export default Checkbox;

View File

@ -4,10 +4,8 @@ export { default as Button } from './button';
export * from './button';
export { default as Card } from './card';
export * from './card';
export { default as Checkbox } from './checkbox';
export { default as Heading } from './heading';
export { default as InputLabel } from './input-label';
export * from './input-label';
export * from './heading';
export { default as Input } from './input';
export * from './input';
export { default as Label } from './label';

View File

@ -1,33 +0,0 @@
import React from 'react';
import * as LabelPrimitives from '@radix-ui/react-label';
import { cx } from 'lib/utils';
export interface InputLabelProps
extends React.ComponentPropsWithoutRef<typeof LabelPrimitives.Root> {
disabled?: boolean;
}
const InputLabel = React.forwardRef<React.ElementRef<typeof LabelPrimitives.Root>, InputLabelProps>(
({ className, disabled, ...props }, forwardedRef) => (
<LabelPrimitives.Root
ref={forwardedRef}
className={cx(
// base
'text-sm leading-none',
// text color
'text-gray-900 dark:text-gray-50',
// disabled
{
'text-gray-400 dark:text-gray-600': disabled
},
className
)}
aria-disabled={disabled}
{...props}
/>
)
);
InputLabel.displayName = 'InputLabel';
export default InputLabel;

View File

@ -1,70 +1,83 @@
import React from 'react';
import { tv, type VariantProps } from 'tailwind-variants';
'use client';
import { cx, focusInput, hasErrorInput } from 'lib/utils';
import React from 'react';
import { tv, VariantProps } from 'tailwind-variants';
import {
Field,
Input as HeadlessInput,
InputProps as HeadlessInputProps,
Label
} from '@headlessui/react';
import { focusInput, hasErrorInput } from 'lib/utils';
const inputStyles = tv({
base: [
// base
'relative block w-full appearance-none rounded-md border px-2.5 py-1.5 shadow-sm outline-none transition sm:text-sm',
// border color
'border-gray-300 dark:border-gray-800',
// text color
'text-gray-900 dark:text-gray-50',
// placeholder color
'placeholder-gray-400 dark:placeholder-gray-500',
// background color
'bg-white dark:bg-gray-950',
// disabled
'disabled:border-gray-300 disabled:bg-gray-100 disabled:text-gray-400',
'disabled:dark:border-gray-700 disabled:dark:bg-gray-800 disabled:dark:text-gray-500',
// file
[
'file:-my-1.5 file:-ml-2.5 file:h-[36px] file:cursor-pointer file:rounded-l-md file:rounded-r-none file:border-0 file:px-3 file:py-1.5 file:outline-none focus:outline-none disabled:pointer-events-none file:disabled:pointer-events-none',
'file:border-solid file:border-gray-300 file:bg-gray-50 file:text-gray-500 file:hover:bg-gray-100 file:dark:border-gray-800 file:dark:bg-gray-950 file:hover:dark:bg-gray-900/20 file:disabled:dark:border-gray-700',
'file:[border-inline-end-width:1px] file:[margin-inline-end:0.75rem]',
'file:disabled:bg-gray-100 file:disabled:text-gray-500 file:disabled:dark:bg-gray-800'
slots: {
root: '',
label: [
// base
'text-sm leading-none',
// text color
'text-content-strong font-medium',
// disabled
'data-[disabled]-text-gray-400'
],
// focus
focusInput,
// invalid
'aria-[invalid=true]:dark:ring-red-400/20 aria-[invalid=true]:ring-2 aria-[invalid=true]:ring-red-200 aria-[invalid=true]:border-red-500 invalid:ring-2 invalid:ring-red-200 invalid:border-red-500'
],
input: [
// base
'w-full relative block rounded-md border-0 shadow-sm outline-none transition sm:text-sm sm:leading-6',
'mt-2 px-2.5 py-1.5',
// border color
'border-gray-300',
// text color
'text-gray-900',
// ring
'ring-1 ring-inset ring-gray-300',
// placeholder color
'placeholder-gray-400',
// background color
'bg-white',
// disabled
'data-[disabled]:border-gray-300 data-[disabled]:bg-gray-100 data-[disabled]:text-gray-400',
// focus
focusInput,
// invalid
'data-[invalid]:ring-2 data-[invalid]:ring-red-200 data-[invalid]:border-red-500'
]
},
variants: {
hasError: {
true: hasErrorInput
},
// number input
enableStepper: {
true: '[appearance:textfield] [&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none'
}
}
});
export interface InputProps
extends React.InputHTMLAttributes<HTMLInputElement>,
VariantProps<typeof inputStyles> {
export interface InputProps extends HeadlessInputProps, VariantProps<typeof inputStyles> {
label?: string;
className?: string;
labelClassName?: string;
inputClassName?: string;
}
const Input = React.forwardRef<HTMLInputElement, InputProps>(
(
{ className, inputClassName, hasError, enableStepper, type, ...props }: InputProps,
forwardedRef
) => {
return (
<div className={cx('relative w-full', className)}>
<input
ref={forwardedRef}
type={type}
className={cx(inputStyles({ hasError, enableStepper }), inputClassName)}
{...props}
/>
</div>
);
}
);
Input.displayName = 'Input';
function Input({
className,
label,
labelClassName,
inputClassName,
hasError,
disabled,
...props
}: InputProps) {
const { root, label: labelStyles, input } = inputStyles({ hasError });
return (
<Field disabled={disabled} className={root({ className })}>
{label && <Label className={labelStyles({ className: labelClassName })}>{label}</Label>}
<HeadlessInput
disabled={disabled}
className={input({ className: inputClassName })}
{...props}
/>
</Field>
);
}
export default Input;

View File

@ -1,15 +0,0 @@
import clsx from 'clsx';
const dots = 'mx-[1px] inline-block h-1 w-1 animate-blink rounded-md';
const LoadingDots = ({ className }: { className?: string }) => {
return (
<span className="mx-2 inline-flex items-center">
<span className={clsx(dots, className)} />
<span className={clsx(dots, 'animation-delay-[200ms]', className)} />
<span className={clsx(dots, 'animation-delay-[400ms]', className)} />
</span>
);
};
export default LoadingDots;

View File

@ -244,7 +244,6 @@ export async function checkExpires({
//this will return success: true or success: false - depending on result of refresh
return { ranRefresh: isExpired, refresh };
}
console.log('is expired is false - just sending back success', isExpired);
return { ranRefresh: isExpired, success: true };
}
@ -355,7 +354,6 @@ export async function isLoggedIn(request: NextRequest, origin: string) {
expiresAt: expiresTokenValue,
origin: origin
});
console.log('is Expired?', isExpired);
//only execute the code below to reset the cookies if it was expired!
if (isExpired.ranRefresh) {
const isSuccess = isExpired?.refresh?.success;
@ -390,7 +388,6 @@ export async function isLoggedIn(request: NextRequest, origin: string) {
}
newHeaders.set('x-shop-customer-token', `${customerTokenValue}`);
console.log('Customer Token', customerTokenValue);
return NextResponse.next({
request: {
// New request headers
@ -402,7 +399,6 @@ export async function isLoggedIn(request: NextRequest, origin: string) {
//when we are running on the production website we just get the origin from the request.nextUrl
export function getOrigin(request: NextRequest) {
const nextOrigin = request.nextUrl.origin;
console.log('Current Origin', nextOrigin);
//when running localhost, we want to use fake origin otherwise we use the real origin
let newOrigin = nextOrigin;
if (nextOrigin === 'https://localhost:3000' || nextOrigin === 'http://localhost:3000') {
@ -410,7 +406,6 @@ export function getOrigin(request: NextRequest) {
} else {
newOrigin = nextOrigin;
}
console.log('New Origin', newOrigin);
return newOrigin;
}

View File

@ -6,7 +6,6 @@ const URL_PREFIXES = ['/transmissions', '/engines', '/transfer-cases', '/remanuf
// This function can be marked `async` if using `await` inside
export async function middleware(request: NextRequest) {
if (request.nextUrl.pathname.startsWith('/account')) {
console.log('Running Account middleware');
const origin = getOrigin(request);
return await isLoggedIn(request, origin);

View File

@ -25,9 +25,6 @@
"@headlessui/react": "^2.1.0",
"@heroicons/react": "^2.1.3",
"@hookform/resolvers": "^3.6.0",
"@radix-ui/react-checkbox": "^1.0.4",
"@radix-ui/react-label": "^2.1.0",
"@radix-ui/react-popover": "^1.1.1",
"@radix-ui/react-slot": "^1.0.2",
"@react-pdf/renderer": "^3.4.4",
"clsx": "^2.1.0",

588
pnpm-lock.yaml generated
View File

@ -17,15 +17,6 @@ importers:
'@hookform/resolvers':
specifier: ^3.6.0
version: 3.6.0(react-hook-form@7.51.5(react@18.2.0))
'@radix-ui/react-checkbox':
specifier: ^1.0.4
version: 1.1.1(@types/react-dom@18.2.22)(@types/react@18.2.72)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
'@radix-ui/react-label':
specifier: ^2.1.0
version: 2.1.0(@types/react-dom@18.2.22)(@types/react@18.2.72)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
'@radix-ui/react-popover':
specifier: ^1.1.1
version: 1.1.1(@types/react-dom@18.2.22)(@types/react@18.2.72)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
'@radix-ui/react-slot':
specifier: ^1.0.2
version: 1.0.2(@types/react@18.2.72)(react@18.2.0)
@ -333,35 +324,6 @@ packages:
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
engines: {node: '>=14'}
'@radix-ui/primitive@1.1.0':
resolution: {integrity: sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==}
'@radix-ui/react-arrow@1.1.0':
resolution: {integrity: sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==}
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-checkbox@1.1.1':
resolution: {integrity: sha512-0i/EKJ222Afa1FE0C6pNJxDq1itzcl3HChE9DwskA4th4KRse8ojx8a1nVcOjwJdbpDLcz7uol77yYnQNMHdKw==}
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.0.1':
resolution: {integrity: sha512-fDSBgd44FKHa1FRMU59qBMPFcl2PZE+2nmqunj+BWFyYYjnhIDWL2ItDs3rrbJDQOtzt5nIebLCQc4QRfz6LJw==}
peerDependencies:
@ -371,146 +333,6 @@ packages:
'@types/react':
optional: true
'@radix-ui/react-compose-refs@1.1.0':
resolution: {integrity: sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==}
peerDependencies:
'@types/react': '*'
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
peerDependenciesMeta:
'@types/react':
optional: true
'@radix-ui/react-context@1.1.0':
resolution: {integrity: sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==}
peerDependencies:
'@types/react': '*'
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
peerDependenciesMeta:
'@types/react':
optional: true
'@radix-ui/react-dismissable-layer@1.1.0':
resolution: {integrity: sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==}
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-focus-guards@1.1.0':
resolution: {integrity: sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==}
peerDependencies:
'@types/react': '*'
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
peerDependenciesMeta:
'@types/react':
optional: true
'@radix-ui/react-focus-scope@1.1.0':
resolution: {integrity: sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==}
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-id@1.1.0':
resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==}
peerDependencies:
'@types/react': '*'
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
peerDependenciesMeta:
'@types/react':
optional: true
'@radix-ui/react-label@2.1.0':
resolution: {integrity: sha512-peLblDlFw/ngk3UWq0VnYaOLy6agTZZ+MUO/WhVfm14vJGML+xH4FAl2XQGLqdefjNb7ApRg6Yn7U42ZhmYXdw==}
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-popover@1.1.1':
resolution: {integrity: sha512-3y1A3isulwnWhvTTwmIreiB8CF4L+qRjZnK1wYLO7pplddzXKby/GnZ2M7OZY3qgnl6p9AodUIHRYGXNah8Y7g==}
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-popper@1.2.0':
resolution: {integrity: sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==}
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-portal@1.1.1':
resolution: {integrity: sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==}
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.0':
resolution: {integrity: sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==}
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.0':
resolution: {integrity: sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==}
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-slot@1.0.2':
resolution: {integrity: sha512-YeTpuq4deV+6DusvVUW4ivBgnkHwECUu0BiN43L5UCDFgdhsRUWAghhTF5MbvNTPzmiFOx90asDSUjWuCNapwg==}
peerDependencies:
@ -520,81 +342,6 @@ packages:
'@types/react':
optional: true
'@radix-ui/react-slot@1.1.0':
resolution: {integrity: sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==}
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-callback-ref@1.1.0':
resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==}
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-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-escape-keydown@1.1.0':
resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==}
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:
'@types/react': '*'
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
peerDependenciesMeta:
'@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-rect@1.1.0':
resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==}
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
'@radix-ui/rect@1.1.0':
resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==}
'@react-aria/focus@3.17.1':
resolution: {integrity: sha512-FLTySoSNqX++u0nWZJPPN5etXY0WBxaIe/YuL/GTEeuqUIuC/2bJSaw5hlsM6T2yjy6Y/VAxBcKSdAFUlU6njQ==}
peerDependencies:
@ -828,10 +575,6 @@ packages:
argparse@2.0.1:
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
aria-hidden@1.2.4:
resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==}
engines: {node: '>=10'}
aria-query@5.3.0:
resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==}
@ -1095,9 +838,6 @@ packages:
resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
engines: {node: '>=6'}
detect-node-es@1.1.0:
resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==}
dfa@1.2.0:
resolution: {integrity: sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==}
@ -1391,10 +1131,6 @@ packages:
resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==}
engines: {node: '>= 0.4'}
get-nonce@1.0.1:
resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==}
engines: {node: '>=6'}
get-stream@8.0.1:
resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==}
engines: {node: '>=16'}
@ -1515,9 +1251,6 @@ packages:
resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==}
engines: {node: '>= 0.4'}
invariant@2.2.4:
resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==}
is-array-buffer@3.0.4:
resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==}
engines: {node: '>= 0.4'}
@ -2185,36 +1918,6 @@ packages:
react-is@16.13.1:
resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
react-remove-scroll-bar@2.3.6:
resolution: {integrity: sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==}
engines: {node: '>=10'}
peerDependencies:
'@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0
react: ^16.8.0 || ^17.0.0 || ^18.0.0
peerDependenciesMeta:
'@types/react':
optional: true
react-remove-scroll@2.5.7:
resolution: {integrity: sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==}
engines: {node: '>=10'}
peerDependencies:
'@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0
react: ^16.8.0 || ^17.0.0 || ^18.0.0
peerDependenciesMeta:
'@types/react':
optional: true
react-style-singleton@2.2.1:
resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==}
engines: {node: '>=10'}
peerDependencies:
'@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0
react: ^16.8.0 || ^17.0.0 || ^18.0.0
peerDependenciesMeta:
'@types/react':
optional: true
react-tooltip@5.26.3:
resolution: {integrity: sha512-MpYAws8CEHUd/RC4GaDCdoceph/T4KHM5vS5Dbk8FOmLMvvIht2ymP2htWdrke7K6lqPO8rz8+bnwWUIXeDlzg==}
peerDependencies:
@ -2596,26 +2299,6 @@ packages:
uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
use-callback-ref@1.3.2:
resolution: {integrity: sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==}
engines: {node: '>=10'}
peerDependencies:
'@types/react': ^16.8.0 || ^17.0.0 || ^18.0.0
react: ^16.8.0 || ^17.0.0 || ^18.0.0
peerDependenciesMeta:
'@types/react':
optional: true
use-sidecar@1.1.2:
resolution: {integrity: sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==}
engines: {node: '>=10'}
peerDependencies:
'@types/react': ^16.9.0 || ^17.0.0 || ^18.0.0
react: ^16.8.0 || ^17.0.0 || ^18.0.0
peerDependenciesMeta:
'@types/react':
optional: true
util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
@ -2864,33 +2547,6 @@ snapshots:
'@pkgjs/parseargs@0.11.0':
optional: true
'@radix-ui/primitive@1.1.0': {}
'@radix-ui/react-arrow@1.1.0(@types/react-dom@18.2.22)(@types/react@18.2.72)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
dependencies:
'@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.22)(@types/react@18.2.72)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
optionalDependencies:
'@types/react': 18.2.72
'@types/react-dom': 18.2.22
'@radix-ui/react-checkbox@1.1.1(@types/react-dom@18.2.22)(@types/react@18.2.72)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
dependencies:
'@radix-ui/primitive': 1.1.0
'@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.72)(react@18.2.0)
'@radix-ui/react-context': 1.1.0(@types/react@18.2.72)(react@18.2.0)
'@radix-ui/react-presence': 1.1.0(@types/react-dom@18.2.22)(@types/react@18.2.72)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
'@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.22)(@types/react@18.2.72)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
'@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.2.72)(react@18.2.0)
'@radix-ui/react-use-previous': 1.1.0(@types/react@18.2.72)(react@18.2.0)
'@radix-ui/react-use-size': 1.1.0(@types/react@18.2.72)(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
optionalDependencies:
'@types/react': 18.2.72
'@types/react-dom': 18.2.22
'@radix-ui/react-compose-refs@1.0.1(@types/react@18.2.72)(react@18.2.0)':
dependencies:
'@babel/runtime': 7.24.1
@ -2898,134 +2554,6 @@ snapshots:
optionalDependencies:
'@types/react': 18.2.72
'@radix-ui/react-compose-refs@1.1.0(@types/react@18.2.72)(react@18.2.0)':
dependencies:
react: 18.2.0
optionalDependencies:
'@types/react': 18.2.72
'@radix-ui/react-context@1.1.0(@types/react@18.2.72)(react@18.2.0)':
dependencies:
react: 18.2.0
optionalDependencies:
'@types/react': 18.2.72
'@radix-ui/react-dismissable-layer@1.1.0(@types/react-dom@18.2.22)(@types/react@18.2.72)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
dependencies:
'@radix-ui/primitive': 1.1.0
'@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.72)(react@18.2.0)
'@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.22)(@types/react@18.2.72)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
'@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.2.72)(react@18.2.0)
'@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.2.72)(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
optionalDependencies:
'@types/react': 18.2.72
'@types/react-dom': 18.2.22
'@radix-ui/react-focus-guards@1.1.0(@types/react@18.2.72)(react@18.2.0)':
dependencies:
react: 18.2.0
optionalDependencies:
'@types/react': 18.2.72
'@radix-ui/react-focus-scope@1.1.0(@types/react-dom@18.2.22)(@types/react@18.2.72)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
dependencies:
'@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.72)(react@18.2.0)
'@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.22)(@types/react@18.2.72)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
'@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.2.72)(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
optionalDependencies:
'@types/react': 18.2.72
'@types/react-dom': 18.2.22
'@radix-ui/react-id@1.1.0(@types/react@18.2.72)(react@18.2.0)':
dependencies:
'@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.2.72)(react@18.2.0)
react: 18.2.0
optionalDependencies:
'@types/react': 18.2.72
'@radix-ui/react-label@2.1.0(@types/react-dom@18.2.22)(@types/react@18.2.72)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
dependencies:
'@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.22)(@types/react@18.2.72)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
optionalDependencies:
'@types/react': 18.2.72
'@types/react-dom': 18.2.22
'@radix-ui/react-popover@1.1.1(@types/react-dom@18.2.22)(@types/react@18.2.72)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
dependencies:
'@radix-ui/primitive': 1.1.0
'@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.72)(react@18.2.0)
'@radix-ui/react-context': 1.1.0(@types/react@18.2.72)(react@18.2.0)
'@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.2.22)(@types/react@18.2.72)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
'@radix-ui/react-focus-guards': 1.1.0(@types/react@18.2.72)(react@18.2.0)
'@radix-ui/react-focus-scope': 1.1.0(@types/react-dom@18.2.22)(@types/react@18.2.72)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
'@radix-ui/react-id': 1.1.0(@types/react@18.2.72)(react@18.2.0)
'@radix-ui/react-popper': 1.2.0(@types/react-dom@18.2.22)(@types/react@18.2.72)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
'@radix-ui/react-portal': 1.1.1(@types/react-dom@18.2.22)(@types/react@18.2.72)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
'@radix-ui/react-presence': 1.1.0(@types/react-dom@18.2.22)(@types/react@18.2.72)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
'@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.22)(@types/react@18.2.72)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
'@radix-ui/react-slot': 1.1.0(@types/react@18.2.72)(react@18.2.0)
'@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.2.72)(react@18.2.0)
aria-hidden: 1.2.4
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
react-remove-scroll: 2.5.7(@types/react@18.2.72)(react@18.2.0)
optionalDependencies:
'@types/react': 18.2.72
'@types/react-dom': 18.2.22
'@radix-ui/react-popper@1.2.0(@types/react-dom@18.2.22)(@types/react@18.2.72)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
dependencies:
'@floating-ui/react-dom': 2.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
'@radix-ui/react-arrow': 1.1.0(@types/react-dom@18.2.22)(@types/react@18.2.72)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
'@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.72)(react@18.2.0)
'@radix-ui/react-context': 1.1.0(@types/react@18.2.72)(react@18.2.0)
'@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.22)(@types/react@18.2.72)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
'@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.2.72)(react@18.2.0)
'@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.2.72)(react@18.2.0)
'@radix-ui/react-use-rect': 1.1.0(@types/react@18.2.72)(react@18.2.0)
'@radix-ui/react-use-size': 1.1.0(@types/react@18.2.72)(react@18.2.0)
'@radix-ui/rect': 1.1.0
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
optionalDependencies:
'@types/react': 18.2.72
'@types/react-dom': 18.2.22
'@radix-ui/react-portal@1.1.1(@types/react-dom@18.2.22)(@types/react@18.2.72)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
dependencies:
'@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.2.22)(@types/react@18.2.72)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)
'@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.2.72)(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
optionalDependencies:
'@types/react': 18.2.72
'@types/react-dom': 18.2.22
'@radix-ui/react-presence@1.1.0(@types/react-dom@18.2.22)(@types/react@18.2.72)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
dependencies:
'@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.72)(react@18.2.0)
'@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.2.72)(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
optionalDependencies:
'@types/react': 18.2.72
'@types/react-dom': 18.2.22
'@radix-ui/react-primitive@2.0.0(@types/react-dom@18.2.22)(@types/react@18.2.72)(react-dom@18.2.0(react@18.2.0))(react@18.2.0)':
dependencies:
'@radix-ui/react-slot': 1.1.0(@types/react@18.2.72)(react@18.2.0)
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
optionalDependencies:
'@types/react': 18.2.72
'@types/react-dom': 18.2.22
'@radix-ui/react-slot@1.0.2(@types/react@18.2.72)(react@18.2.0)':
dependencies:
'@babel/runtime': 7.24.1
@ -3034,61 +2562,6 @@ snapshots:
optionalDependencies:
'@types/react': 18.2.72
'@radix-ui/react-slot@1.1.0(@types/react@18.2.72)(react@18.2.0)':
dependencies:
'@radix-ui/react-compose-refs': 1.1.0(@types/react@18.2.72)(react@18.2.0)
react: 18.2.0
optionalDependencies:
'@types/react': 18.2.72
'@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.2.72)(react@18.2.0)':
dependencies:
react: 18.2.0
optionalDependencies:
'@types/react': 18.2.72
'@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.2.72)(react@18.2.0)':
dependencies:
'@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.2.72)(react@18.2.0)
react: 18.2.0
optionalDependencies:
'@types/react': 18.2.72
'@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.2.72)(react@18.2.0)':
dependencies:
'@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.2.72)(react@18.2.0)
react: 18.2.0
optionalDependencies:
'@types/react': 18.2.72
'@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.2.72)(react@18.2.0)':
dependencies:
react: 18.2.0
optionalDependencies:
'@types/react': 18.2.72
'@radix-ui/react-use-previous@1.1.0(@types/react@18.2.72)(react@18.2.0)':
dependencies:
react: 18.2.0
optionalDependencies:
'@types/react': 18.2.72
'@radix-ui/react-use-rect@1.1.0(@types/react@18.2.72)(react@18.2.0)':
dependencies:
'@radix-ui/rect': 1.1.0
react: 18.2.0
optionalDependencies:
'@types/react': 18.2.72
'@radix-ui/react-use-size@1.1.0(@types/react@18.2.72)(react@18.2.0)':
dependencies:
'@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.2.72)(react@18.2.0)
react: 18.2.0
optionalDependencies:
'@types/react': 18.2.72
'@radix-ui/rect@1.1.0': {}
'@react-aria/focus@3.17.1(react@18.2.0)':
dependencies:
'@react-aria/interactions': 3.21.3(react@18.2.0)
@ -3402,10 +2875,6 @@ snapshots:
argparse@2.0.1: {}
aria-hidden@1.2.4:
dependencies:
tslib: 2.6.2
aria-query@5.3.0:
dependencies:
dequal: 2.0.3
@ -3703,8 +3172,6 @@ snapshots:
dequal@2.0.3: {}
detect-node-es@1.1.0: {}
dfa@1.2.0: {}
didyoumean@1.2.2: {}
@ -3848,7 +3315,7 @@ snapshots:
eslint: 8.57.0
eslint-import-resolver-node: 0.3.9
eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0)
eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.3))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0)
eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0)
eslint-plugin-jsx-a11y: 6.8.0(eslint@8.57.0)
eslint-plugin-react: 7.34.1(eslint@8.57.0)
eslint-plugin-react-hooks: 4.6.0(eslint@8.57.0)
@ -3876,7 +3343,7 @@ snapshots:
enhanced-resolve: 5.16.0
eslint: 8.57.0
eslint-module-utils: 2.8.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0)
eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.3))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0)
eslint-plugin-import: 2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0)
fast-glob: 3.3.2
get-tsconfig: 4.7.3
is-core-module: 2.13.1
@ -3898,7 +3365,7 @@ snapshots:
transitivePeerDependencies:
- supports-color
eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.3))(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.29.1(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0):
eslint-plugin-import@2.29.1(@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.3))(eslint-import-resolver-typescript@3.6.1)(eslint@8.57.0):
dependencies:
array-includes: 3.1.8
array.prototype.findlastindex: 1.2.5
@ -4174,8 +3641,6 @@ snapshots:
has-symbols: 1.0.3
hasown: 2.0.2
get-nonce@1.0.1: {}
get-stream@8.0.1: {}
get-symbol-description@1.0.2:
@ -4296,10 +3761,6 @@ snapshots:
hasown: 2.0.2
side-channel: 1.0.6
invariant@2.2.4:
dependencies:
loose-envify: 1.4.0
is-array-buffer@3.0.4:
dependencies:
call-bind: 1.0.7
@ -4868,34 +4329,6 @@ snapshots:
react-is@16.13.1: {}
react-remove-scroll-bar@2.3.6(@types/react@18.2.72)(react@18.2.0):
dependencies:
react: 18.2.0
react-style-singleton: 2.2.1(@types/react@18.2.72)(react@18.2.0)
tslib: 2.6.2
optionalDependencies:
'@types/react': 18.2.72
react-remove-scroll@2.5.7(@types/react@18.2.72)(react@18.2.0):
dependencies:
react: 18.2.0
react-remove-scroll-bar: 2.3.6(@types/react@18.2.72)(react@18.2.0)
react-style-singleton: 2.2.1(@types/react@18.2.72)(react@18.2.0)
tslib: 2.6.2
use-callback-ref: 1.3.2(@types/react@18.2.72)(react@18.2.0)
use-sidecar: 1.1.2(@types/react@18.2.72)(react@18.2.0)
optionalDependencies:
'@types/react': 18.2.72
react-style-singleton@2.2.1(@types/react@18.2.72)(react@18.2.0):
dependencies:
get-nonce: 1.0.1
invariant: 2.2.4
react: 18.2.0
tslib: 2.6.2
optionalDependencies:
'@types/react': 18.2.72
react-tooltip@5.26.3(react-dom@18.2.0(react@18.2.0))(react@18.2.0):
dependencies:
'@floating-ui/dom': 1.6.3
@ -5338,21 +4771,6 @@ snapshots:
dependencies:
punycode: 2.3.1
use-callback-ref@1.3.2(@types/react@18.2.72)(react@18.2.0):
dependencies:
react: 18.2.0
tslib: 2.6.2
optionalDependencies:
'@types/react': 18.2.72
use-sidecar@1.1.2(@types/react@18.2.72)(react@18.2.0):
dependencies:
detect-node-es: 1.1.0
react: 18.2.0
tslib: 2.6.2
optionalDependencies:
'@types/react': 18.2.72
util-deprecate@1.0.2: {}
validate-npm-package-license@3.0.4: