diff --git a/libs/shared/ui/shadcn/.babelrc b/libs/shared/ui/shadcn/.babelrc
new file mode 100644
index 000000000..1ea870ead
--- /dev/null
+++ b/libs/shared/ui/shadcn/.babelrc
@@ -0,0 +1,12 @@
+{
+ "presets": [
+ [
+ "@nx/react/babel",
+ {
+ "runtime": "automatic",
+ "useBuiltIns": "usage"
+ }
+ ]
+ ],
+ "plugins": []
+}
diff --git a/libs/shared/ui/shadcn/eslint.config.mjs b/libs/shared/ui/shadcn/eslint.config.mjs
new file mode 100644
index 000000000..eb4fca226
--- /dev/null
+++ b/libs/shared/ui/shadcn/eslint.config.mjs
@@ -0,0 +1,13 @@
+import nx from '@nx/eslint-plugin';
+
+import baseConfig from '../../../../eslint.config.mjs';
+
+export default [
+ ...baseConfig,
+ ...nx.configs['flat/react'],
+ {
+ files: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx'],
+ // Override or add rules here
+ rules: {}
+ }
+];
diff --git a/libs/shared/ui/shadcn/project.json b/libs/shared/ui/shadcn/project.json
new file mode 100644
index 000000000..78c97a1e9
--- /dev/null
+++ b/libs/shared/ui/shadcn/project.json
@@ -0,0 +1,9 @@
+{
+ "name": "shared-ui-shadcn",
+ "$schema": "../../../../node_modules/nx/schemas/project-schema.json",
+ "sourceRoot": "libs/shared/ui/shadcn/src",
+ "projectType": "library",
+ "tags": ["scope:shared", "type:ui"],
+ "// targets": "to see all targets run: nx show project shadcn --web",
+ "targets": {}
+}
diff --git a/libs/shared/ui/shadcn/src/index.ts b/libs/shared/ui/shadcn/src/index.ts
new file mode 100644
index 000000000..ae17c9e76
--- /dev/null
+++ b/libs/shared/ui/shadcn/src/index.ts
@@ -0,0 +1,15 @@
+export * from './lib/components/button';
+export * from './lib/components/card';
+export * from './lib/components/checkbox';
+export * from './lib/components/dialog';
+export * from './lib/components/dropdown-menu';
+export * from './lib/components/form';
+export * from './lib/components/input';
+export * from './lib/components/label';
+export * from './lib/components/menubar';
+export * from './lib/components/radio-group';
+export * from './lib/components/select';
+export * from './lib/components/sonner';
+export * from './lib/components/textarea';
+
+export * from './lib/utils/cn';
diff --git a/libs/shared/ui/shadcn/src/lib/components/button.tsx b/libs/shared/ui/shadcn/src/lib/components/button.tsx
new file mode 100644
index 000000000..492be9b2c
--- /dev/null
+++ b/libs/shared/ui/shadcn/src/lib/components/button.tsx
@@ -0,0 +1,56 @@
+import { Slot } from '@radix-ui/react-slot';
+import { type VariantProps, cva } from 'class-variance-authority';
+import * as React from 'react';
+
+import { cn } from '../utils/cn';
+
+const buttonVariants = cva(
+ 'inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0',
+ {
+ variants: {
+ variant: {
+ default: 'bg-primary text-primary-foreground hover:bg-primary/90',
+ destructive:
+ 'bg-destructive text-destructive-foreground hover:bg-destructive/90',
+ outline:
+ 'border border-input bg-background hover:bg-accent hover:text-accent-foreground',
+ secondary:
+ 'bg-secondary text-secondary-foreground hover:bg-secondary/80',
+ ghost: 'hover:bg-accent hover:text-accent-foreground',
+ link: 'text-primary underline-offset-4 hover:underline'
+ },
+ size: {
+ default: 'h-10 px-4 py-2',
+ sm: 'h-9 rounded-md px-3',
+ lg: 'h-11 rounded-md px-8',
+ icon: 'h-10 w-10'
+ }
+ },
+ defaultVariants: {
+ variant: 'default',
+ size: 'default'
+ }
+ }
+);
+
+export interface ButtonProps
+ extends React.ButtonHTMLAttributes
,
+ VariantProps {
+ asChild?: boolean;
+}
+
+const Button = React.forwardRef(
+ ({ className, variant, size, asChild = false, ...props }, ref) => {
+ const Comp = asChild ? Slot : 'button';
+ return (
+
+ );
+ }
+);
+Button.displayName = 'Button';
+
+export { Button, buttonVariants };
diff --git a/libs/shared/ui/shadcn/src/lib/components/card.tsx b/libs/shared/ui/shadcn/src/lib/components/card.tsx
new file mode 100644
index 000000000..840de8cc0
--- /dev/null
+++ b/libs/shared/ui/shadcn/src/lib/components/card.tsx
@@ -0,0 +1,86 @@
+import * as React from 'react';
+
+import { cn } from '../utils/cn';
+
+const Card = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+));
+Card.displayName = 'Card';
+
+const CardHeader = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+));
+CardHeader.displayName = 'CardHeader';
+
+const CardTitle = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+));
+CardTitle.displayName = 'CardTitle';
+
+const CardDescription = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+));
+CardDescription.displayName = 'CardDescription';
+
+const CardContent = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+));
+CardContent.displayName = 'CardContent';
+
+const CardFooter = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+));
+CardFooter.displayName = 'CardFooter';
+
+export {
+ Card,
+ CardHeader,
+ CardFooter,
+ CardTitle,
+ CardDescription,
+ CardContent
+};
diff --git a/libs/shared/ui/shadcn/src/lib/components/checkbox.tsx b/libs/shared/ui/shadcn/src/lib/components/checkbox.tsx
new file mode 100644
index 000000000..6e72006c9
--- /dev/null
+++ b/libs/shared/ui/shadcn/src/lib/components/checkbox.tsx
@@ -0,0 +1,28 @@
+import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
+import { Check } from 'lucide-react';
+import * as React from 'react';
+
+import { cn } from '../utils/cn';
+
+const Checkbox = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+
+
+));
+Checkbox.displayName = CheckboxPrimitive.Root.displayName;
+
+export { Checkbox };
diff --git a/libs/shared/ui/shadcn/src/lib/components/dialog.tsx b/libs/shared/ui/shadcn/src/lib/components/dialog.tsx
new file mode 100644
index 000000000..995fcf141
--- /dev/null
+++ b/libs/shared/ui/shadcn/src/lib/components/dialog.tsx
@@ -0,0 +1,120 @@
+import * as DialogPrimitive from '@radix-ui/react-dialog';
+import { X } from 'lucide-react';
+import * as React from 'react';
+
+import { cn } from '../utils/cn';
+
+const Dialog = DialogPrimitive.Root;
+
+const DialogTrigger = DialogPrimitive.Trigger;
+
+const DialogPortal = DialogPrimitive.Portal;
+
+const DialogClose = DialogPrimitive.Close;
+
+const DialogOverlay = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
+
+const DialogContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+
+
+ {children}
+
+
+ Close
+
+
+
+));
+DialogContent.displayName = DialogPrimitive.Content.displayName;
+
+const DialogHeader = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => (
+
+);
+DialogHeader.displayName = 'DialogHeader';
+
+const DialogFooter = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => (
+
+);
+DialogFooter.displayName = 'DialogFooter';
+
+const DialogTitle = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+DialogTitle.displayName = DialogPrimitive.Title.displayName;
+
+const DialogDescription = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+DialogDescription.displayName = DialogPrimitive.Description.displayName;
+
+export {
+ Dialog,
+ DialogPortal,
+ DialogOverlay,
+ DialogClose,
+ DialogTrigger,
+ DialogContent,
+ DialogHeader,
+ DialogFooter,
+ DialogTitle,
+ DialogDescription
+};
diff --git a/libs/shared/ui/shadcn/src/lib/components/dropdown-menu.tsx b/libs/shared/ui/shadcn/src/lib/components/dropdown-menu.tsx
new file mode 100644
index 000000000..4147ff702
--- /dev/null
+++ b/libs/shared/ui/shadcn/src/lib/components/dropdown-menu.tsx
@@ -0,0 +1,198 @@
+import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
+import { Check, ChevronRight, Circle } from 'lucide-react';
+import * as React from 'react';
+
+import { cn } from '../utils/cn';
+
+const DropdownMenu = DropdownMenuPrimitive.Root;
+
+const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;
+
+const DropdownMenuGroup = DropdownMenuPrimitive.Group;
+
+const DropdownMenuPortal = DropdownMenuPrimitive.Portal;
+
+const DropdownMenuSub = DropdownMenuPrimitive.Sub;
+
+const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;
+
+const DropdownMenuSubTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean;
+ }
+>(({ className, inset, children, ...props }, ref) => (
+
+ {children}
+
+
+));
+DropdownMenuSubTrigger.displayName =
+ DropdownMenuPrimitive.SubTrigger.displayName;
+
+const DropdownMenuSubContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+DropdownMenuSubContent.displayName =
+ DropdownMenuPrimitive.SubContent.displayName;
+
+const DropdownMenuContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, sideOffset = 4, ...props }, ref) => (
+
+
+
+));
+DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;
+
+const DropdownMenuItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean;
+ }
+>(({ className, inset, ...props }, ref) => (
+
+));
+DropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;
+
+const DropdownMenuCheckboxItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, checked, ...props }, ref) => (
+
+
+
+
+
+
+ {children}
+
+));
+DropdownMenuCheckboxItem.displayName =
+ DropdownMenuPrimitive.CheckboxItem.displayName;
+
+const DropdownMenuRadioItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+
+
+
+
+
+ {children}
+
+));
+DropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;
+
+const DropdownMenuLabel = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean;
+ }
+>(({ className, inset, ...props }, ref) => (
+
+));
+DropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;
+
+const DropdownMenuSeparator = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+DropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;
+
+const DropdownMenuShortcut = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => {
+ return (
+
+ );
+};
+DropdownMenuShortcut.displayName = 'DropdownMenuShortcut';
+
+export {
+ DropdownMenu,
+ DropdownMenuTrigger,
+ DropdownMenuContent,
+ DropdownMenuItem,
+ DropdownMenuCheckboxItem,
+ DropdownMenuRadioItem,
+ DropdownMenuLabel,
+ DropdownMenuSeparator,
+ DropdownMenuShortcut,
+ DropdownMenuGroup,
+ DropdownMenuPortal,
+ DropdownMenuSub,
+ DropdownMenuSubContent,
+ DropdownMenuSubTrigger,
+ DropdownMenuRadioGroup
+};
diff --git a/libs/shared/ui/shadcn/src/lib/components/form.tsx b/libs/shared/ui/shadcn/src/lib/components/form.tsx
new file mode 100644
index 000000000..282866b5e
--- /dev/null
+++ b/libs/shared/ui/shadcn/src/lib/components/form.tsx
@@ -0,0 +1,178 @@
+import * as LabelPrimitive from '@radix-ui/react-label';
+import { Slot } from '@radix-ui/react-slot';
+import * as React from 'react';
+import {
+ Controller,
+ type ControllerProps,
+ type FieldPath,
+ type FieldValues,
+ FormProvider,
+ useFormContext
+} from 'react-hook-form';
+
+import { cn } from '../utils/cn';
+
+import { Label } from './label';
+
+const Form = FormProvider;
+
+type FormFieldContextValue<
+ TFieldValues extends FieldValues = FieldValues,
+ TName extends FieldPath = FieldPath
+> = {
+ name: TName;
+};
+
+const FormFieldContext = React.createContext(
+ {} as FormFieldContextValue
+);
+
+const FormField = <
+ TFieldValues extends FieldValues = FieldValues,
+ TName extends FieldPath = FieldPath
+>({
+ ...props
+}: ControllerProps) => {
+ return (
+
+
+
+ );
+};
+
+const useFormField = () => {
+ const fieldContext = React.useContext(FormFieldContext);
+ const itemContext = React.useContext(FormItemContext);
+ const { getFieldState, formState } = useFormContext();
+
+ const fieldState = getFieldState(fieldContext.name, formState);
+
+ if (!fieldContext) {
+ throw new Error('useFormField should be used within ');
+ }
+
+ const { id } = itemContext;
+
+ return {
+ id,
+ name: fieldContext.name,
+ formItemId: `${id}-form-item`,
+ formDescriptionId: `${id}-form-item-description`,
+ formMessageId: `${id}-form-item-message`,
+ ...fieldState
+ };
+};
+
+type FormItemContextValue = {
+ id: string;
+};
+
+const FormItemContext = React.createContext(
+ {} as FormItemContextValue
+);
+
+const FormItem = React.forwardRef<
+ HTMLDivElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => {
+ const id = React.useId();
+
+ return (
+
+
+
+ );
+});
+FormItem.displayName = 'FormItem';
+
+const FormLabel = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => {
+ const { error, formItemId } = useFormField();
+
+ return (
+
+ );
+});
+FormLabel.displayName = 'FormLabel';
+
+const FormControl = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ ...props }, ref) => {
+ const { error, formItemId, formDescriptionId, formMessageId } =
+ useFormField();
+
+ return (
+
+ );
+});
+FormControl.displayName = 'FormControl';
+
+const FormDescription = React.forwardRef<
+ HTMLParagraphElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => {
+ const { formDescriptionId } = useFormField();
+
+ return (
+
+ );
+});
+FormDescription.displayName = 'FormDescription';
+
+const FormMessage = React.forwardRef<
+ HTMLParagraphElement,
+ React.HTMLAttributes
+>(({ className, children, ...props }, ref) => {
+ const { error, formMessageId } = useFormField();
+ const body = error ? String(error?.message ?? '') : children;
+
+ if (!body) {
+ return null;
+ }
+
+ return (
+
+ {body}
+
+ );
+});
+FormMessage.displayName = 'FormMessage';
+
+export {
+ useFormField,
+ Form,
+ FormItem,
+ FormLabel,
+ FormControl,
+ FormDescription,
+ FormMessage,
+ FormField
+};
diff --git a/libs/shared/ui/shadcn/src/lib/components/input.tsx b/libs/shared/ui/shadcn/src/lib/components/input.tsx
new file mode 100644
index 000000000..4c5ba6828
--- /dev/null
+++ b/libs/shared/ui/shadcn/src/lib/components/input.tsx
@@ -0,0 +1,22 @@
+import * as React from 'react';
+
+import { cn } from '../utils/cn';
+
+const Input = React.forwardRef>(
+ ({ className, type, ...props }, ref) => {
+ return (
+
+ );
+ }
+);
+Input.displayName = 'Input';
+
+export { Input };
diff --git a/libs/shared/ui/shadcn/src/lib/components/label.tsx b/libs/shared/ui/shadcn/src/lib/components/label.tsx
new file mode 100644
index 000000000..551a52f2e
--- /dev/null
+++ b/libs/shared/ui/shadcn/src/lib/components/label.tsx
@@ -0,0 +1,24 @@
+import * as LabelPrimitive from '@radix-ui/react-label';
+import { type VariantProps, cva } from 'class-variance-authority';
+import * as React from 'react';
+
+import { cn } from '../utils/cn';
+
+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/libs/shared/ui/shadcn/src/lib/components/menubar.tsx b/libs/shared/ui/shadcn/src/lib/components/menubar.tsx
new file mode 100644
index 000000000..d3463dd73
--- /dev/null
+++ b/libs/shared/ui/shadcn/src/lib/components/menubar.tsx
@@ -0,0 +1,254 @@
+import * as MenubarPrimitive from '@radix-ui/react-menubar';
+import { Check, ChevronRight, Circle } from 'lucide-react';
+import * as React from 'react';
+
+import { cn } from '../utils/cn';
+
+function MenubarMenu({
+ ...props
+}: React.ComponentProps) {
+ return ;
+}
+
+function MenubarGroup({
+ ...props
+}: React.ComponentProps) {
+ return ;
+}
+
+function MenubarPortal({
+ ...props
+}: React.ComponentProps) {
+ return ;
+}
+
+function MenubarRadioGroup({
+ ...props
+}: React.ComponentProps) {
+ return ;
+}
+
+function MenubarSub({
+ ...props
+}: React.ComponentProps) {
+ return ;
+}
+
+const Menubar = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+Menubar.displayName = MenubarPrimitive.Root.displayName;
+
+const MenubarTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+MenubarTrigger.displayName = MenubarPrimitive.Trigger.displayName;
+
+const MenubarSubTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean;
+ }
+>(({ className, inset, children, ...props }, ref) => (
+
+ {children}
+
+
+));
+MenubarSubTrigger.displayName = MenubarPrimitive.SubTrigger.displayName;
+
+const MenubarSubContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+MenubarSubContent.displayName = MenubarPrimitive.SubContent.displayName;
+
+const MenubarContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(
+ (
+ { className, align = 'start', alignOffset = -4, sideOffset = 8, ...props },
+ ref
+ ) => (
+
+
+
+ )
+);
+MenubarContent.displayName = MenubarPrimitive.Content.displayName;
+
+const MenubarItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean;
+ }
+>(({ className, inset, ...props }, ref) => (
+
+));
+MenubarItem.displayName = MenubarPrimitive.Item.displayName;
+
+const MenubarCheckboxItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, checked, ...props }, ref) => (
+
+
+
+
+
+
+ {children}
+
+));
+MenubarCheckboxItem.displayName = MenubarPrimitive.CheckboxItem.displayName;
+
+const MenubarRadioItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+
+
+
+
+
+ {children}
+
+));
+MenubarRadioItem.displayName = MenubarPrimitive.RadioItem.displayName;
+
+const MenubarLabel = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef & {
+ inset?: boolean;
+ }
+>(({ className, inset, ...props }, ref) => (
+
+));
+MenubarLabel.displayName = MenubarPrimitive.Label.displayName;
+
+const MenubarSeparator = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+MenubarSeparator.displayName = MenubarPrimitive.Separator.displayName;
+
+const MenubarShortcut = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => {
+ return (
+
+ );
+};
+MenubarShortcut.displayname = 'MenubarShortcut';
+
+export {
+ Menubar,
+ MenubarMenu,
+ MenubarTrigger,
+ MenubarContent,
+ MenubarItem,
+ MenubarSeparator,
+ MenubarLabel,
+ MenubarCheckboxItem,
+ MenubarRadioGroup,
+ MenubarRadioItem,
+ MenubarPortal,
+ MenubarSubContent,
+ MenubarSubTrigger,
+ MenubarGroup,
+ MenubarSub,
+ MenubarShortcut
+};
diff --git a/libs/shared/ui/shadcn/src/lib/components/radio-group.tsx b/libs/shared/ui/shadcn/src/lib/components/radio-group.tsx
new file mode 100644
index 000000000..a792f5f41
--- /dev/null
+++ b/libs/shared/ui/shadcn/src/lib/components/radio-group.tsx
@@ -0,0 +1,42 @@
+import * as RadioGroupPrimitive from '@radix-ui/react-radio-group';
+import { Circle } from 'lucide-react';
+import * as React from 'react';
+
+import { cn } from '../utils/cn';
+
+const RadioGroup = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => {
+ return (
+
+ );
+});
+RadioGroup.displayName = RadioGroupPrimitive.Root.displayName;
+
+const RadioGroupItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => {
+ return (
+
+
+
+
+
+ );
+});
+RadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName;
+
+export { RadioGroup, RadioGroupItem };
diff --git a/libs/shared/ui/shadcn/src/lib/components/select.tsx b/libs/shared/ui/shadcn/src/lib/components/select.tsx
new file mode 100644
index 000000000..e7de81ed9
--- /dev/null
+++ b/libs/shared/ui/shadcn/src/lib/components/select.tsx
@@ -0,0 +1,158 @@
+import * as SelectPrimitive from '@radix-ui/react-select';
+import { Check, ChevronDown, ChevronUp } from 'lucide-react';
+import * as React from 'react';
+
+import { cn } from '../utils/cn';
+
+const Select = SelectPrimitive.Root;
+
+const SelectGroup = SelectPrimitive.Group;
+
+const SelectValue = SelectPrimitive.Value;
+
+const SelectTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+ span]:line-clamp-1',
+ className
+ )}
+ {...props}
+ >
+ {children}
+
+
+
+
+));
+SelectTrigger.displayName = SelectPrimitive.Trigger.displayName;
+
+const SelectScrollUpButton = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+));
+SelectScrollUpButton.displayName = SelectPrimitive.ScrollUpButton.displayName;
+
+const SelectScrollDownButton = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+));
+SelectScrollDownButton.displayName =
+ SelectPrimitive.ScrollDownButton.displayName;
+
+const SelectContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, position = 'popper', ...props }, ref) => (
+
+
+
+
+ {children}
+
+
+
+
+));
+SelectContent.displayName = SelectPrimitive.Content.displayName;
+
+const SelectLabel = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+SelectLabel.displayName = SelectPrimitive.Label.displayName;
+
+const SelectItem = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, children, ...props }, ref) => (
+
+
+
+
+
+
+
+ {children}
+
+));
+SelectItem.displayName = SelectPrimitive.Item.displayName;
+
+const SelectSeparator = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+SelectSeparator.displayName = SelectPrimitive.Separator.displayName;
+
+export {
+ Select,
+ SelectGroup,
+ SelectValue,
+ SelectTrigger,
+ SelectContent,
+ SelectLabel,
+ SelectItem,
+ SelectSeparator,
+ SelectScrollUpButton,
+ SelectScrollDownButton
+};
diff --git a/libs/shared/ui/shadcn/src/lib/components/sonner.tsx b/libs/shared/ui/shadcn/src/lib/components/sonner.tsx
new file mode 100644
index 000000000..4eacd4f34
--- /dev/null
+++ b/libs/shared/ui/shadcn/src/lib/components/sonner.tsx
@@ -0,0 +1,29 @@
+import { useTheme } from 'next-themes';
+import { Toaster as Sonner } from 'sonner';
+
+type ToasterProps = React.ComponentProps;
+
+const Toaster = ({ ...props }: ToasterProps) => {
+ const { theme = 'system' } = useTheme();
+
+ return (
+
+ );
+};
+
+export { Toaster };
diff --git a/libs/shared/ui/shadcn/src/lib/components/textarea.tsx b/libs/shared/ui/shadcn/src/lib/components/textarea.tsx
new file mode 100644
index 000000000..fdc64af1e
--- /dev/null
+++ b/libs/shared/ui/shadcn/src/lib/components/textarea.tsx
@@ -0,0 +1,22 @@
+import * as React from 'react';
+
+import { cn } from '../utils/cn';
+
+const Textarea = React.forwardRef<
+ HTMLTextAreaElement,
+ React.ComponentProps<'textarea'>
+>(({ className, ...props }, ref) => {
+ return (
+
+ );
+});
+Textarea.displayName = 'Textarea';
+
+export { Textarea };
diff --git a/libs/shared/ui/shadcn/src/lib/hooks/.gitkeep b/libs/shared/ui/shadcn/src/lib/hooks/.gitkeep
new file mode 100644
index 000000000..e69de29bb
diff --git a/libs/shared/ui/shadcn/src/lib/utils/cn.ts b/libs/shared/ui/shadcn/src/lib/utils/cn.ts
new file mode 100644
index 000000000..231e5e90d
--- /dev/null
+++ b/libs/shared/ui/shadcn/src/lib/utils/cn.ts
@@ -0,0 +1,6 @@
+import { type ClassValue, clsx } from 'clsx';
+import { twMerge } from 'tailwind-merge';
+
+export const cn = function cn(...inputs: ClassValue[]) {
+ return twMerge(clsx(inputs));
+};
diff --git a/libs/shared/ui/shadcn/tsconfig.json b/libs/shared/ui/shadcn/tsconfig.json
new file mode 100644
index 000000000..96633ee5a
--- /dev/null
+++ b/libs/shared/ui/shadcn/tsconfig.json
@@ -0,0 +1,20 @@
+{
+ "extends": "../../../../tsconfig.base.json",
+ "compilerOptions": {
+ "jsx": "react-jsx",
+ "allowJs": false,
+ "esModuleInterop": false,
+ "allowSyntheticDefaultImports": true,
+ "strict": true
+ },
+ "files": [],
+ "include": [],
+ "references": [
+ {
+ "path": "./tsconfig.lib.json"
+ },
+ {
+ "path": "./tsconfig.spec.json"
+ }
+ ]
+}
diff --git a/libs/shared/ui/shadcn/tsconfig.lib.json b/libs/shared/ui/shadcn/tsconfig.lib.json
new file mode 100644
index 000000000..daece2e9b
--- /dev/null
+++ b/libs/shared/ui/shadcn/tsconfig.lib.json
@@ -0,0 +1,23 @@
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "outDir": "../../../../dist/out-tsc",
+ "types": [
+ "node",
+ "@nx/react/typings/cssmodule.d.ts",
+ "@nx/react/typings/image.d.ts"
+ ]
+ },
+ "exclude": [
+ "**/*.spec.ts",
+ "**/*.spec.tsx",
+ "**/*.test.tsx",
+ "vite.config.ts",
+ "vite.config.mts",
+ "vitest.config.ts",
+ "vitest.config.mts",
+ "src/**/*.spec.ts",
+ "src/**/*.spec.tsx"
+ ],
+ "include": ["src/**/*.ts", "src/**/*.tsx"]
+}
diff --git a/libs/shared/ui/shadcn/tsconfig.spec.json b/libs/shared/ui/shadcn/tsconfig.spec.json
new file mode 100644
index 000000000..a10e2fb63
--- /dev/null
+++ b/libs/shared/ui/shadcn/tsconfig.spec.json
@@ -0,0 +1,22 @@
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "outDir": "../../../../dist/out-tsc",
+ "types": [
+ "vitest/globals",
+ "vitest/importMeta",
+ "vite/client",
+ "node",
+ "vitest"
+ ]
+ },
+ "include": [
+ "vite.config.ts",
+ "vite.config.mts",
+ "vitest.config.ts",
+ "vitest.config.mts",
+ "src/**/*.spec.ts",
+ "src/**/*.spec.tsx",
+ "src/**/*.d.ts"
+ ]
+}
diff --git a/libs/shared/ui/shadcn/vite.config.mts b/libs/shared/ui/shadcn/vite.config.mts
new file mode 100644
index 000000000..eee1acc24
--- /dev/null
+++ b/libs/shared/ui/shadcn/vite.config.mts
@@ -0,0 +1,22 @@
+import { nxViteTsPaths } from '@nx/vite/plugins/nx-tsconfig-paths.plugin';
+import react from '@vitejs/plugin-react';
+import { defineConfig } from 'vite';
+
+export default defineConfig({
+ root: __dirname,
+ cacheDir: '../../../../node_modules/.vite/libs/shared/ui/shadcn',
+ plugins: [react(), nxViteTsPaths()],
+ test: {
+ name: 'shared-ui-shadcn',
+ watch: false,
+ globals: true,
+ environment: 'jsdom',
+ include: ['src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
+ reporters: ['default'],
+ coverage: {
+ reportsDirectory: '../../../../coverage/libs/shared/ui/shadcn',
+ provider: 'v8'
+ },
+ passWithNoTests: true
+ }
+});
diff --git a/libs/shared/util/payload-api/src/index.ts b/libs/shared/util/payload-api/src/index.ts
index 15128775f..3af2bd65b 100644
--- a/libs/shared/util/payload-api/src/index.ts
+++ b/libs/shared/util/payload-api/src/index.ts
@@ -1,4 +1,12 @@
-export { apiKeyPrefix, authorizationHeader } from './lib/definitions';
+export {
+ apiKeyPrefix,
+ authorizationHeader,
+ type RequestMethod
+} from './lib/utils/definitions';
+export type {
+ MethodOptions,
+ RequestBaseOptions
+} from './lib/utils/invoke-request';
export { findBySlug } from './lib/find-by-slug';
export { getShallow } from './lib/get-shallow';
-export type { RequestOptions } from './lib/invoke-request';
+export { post } from './lib/post';
diff --git a/libs/shared/util/payload-api/src/lib/create-request-init.ts b/libs/shared/util/payload-api/src/lib/create-request-init.ts
deleted file mode 100644
index 69c83d576..000000000
--- a/libs/shared/util/payload-api/src/lib/create-request-init.ts
+++ /dev/null
@@ -1,87 +0,0 @@
-import { generateSignature } from '@codeware/shared/util/signature';
-
-import { apiKeyPrefix, authorizationHeader } from './definitions';
-
-export type RequestInitOptions = {
- request: Request;
-
- /**
- * Whether to allow HTTP-only cookies depending on client and server domains.
- *
- * When the client is on a different domain than the Payload API and `useSignature` is provided,
- * the value should be set to `'include'`.
- *
- * @default undefined
- */
- requestCredentials?: RequestCredentials;
-
- /**
- * Provide the signature configuration
- * to enable signature verification for the request.
- */
- useSignature?: {
- deployEnv: string;
- deviceId: string;
- secret: string;
- tenantId: string;
- };
- /**
- * Provide the tenant API key to enable API key authorization
- * for the request.
- */
- tenantApiKey?: string;
-};
-
-/**
- * Create request configuration for `fetch` requests.
- */
-export const createRequestInit = (
- method: 'GET',
- options: RequestInitOptions
-): RequestInit => {
- const { request, requestCredentials, useSignature, tenantApiKey } = options;
-
- let initHeaders: HeadersInit = request.headers;
-
- // Return early when there is no tenant API key
- if (!tenantApiKey) {
- return {
- headers: initHeaders,
- method
- };
- }
-
- // Apply API key authorization header
- initHeaders = {
- ...initHeaders,
- [authorizationHeader]: `${apiKeyPrefix} ${tenantApiKey}`
- };
-
- // Generate signature verification headers if useSignature is provided
- let signature: Record = {};
- if (useSignature) {
- const { deviceId, secret, tenantId, deployEnv } = useSignature;
-
- const reqUserAgent = `${request.headers.get('User-Agent')}`;
- const userAgent = `${reqUserAgent} ${tenantId} web/todo:version (${deployEnv})`;
-
- try {
- signature = generateSignature({
- deviceId,
- secret,
- userAgent
- });
- } catch (error) {
- console.error('Failed to generate signature', error);
- }
- }
-
- return {
- credentials: requestCredentials,
- headers: {
- ...initHeaders,
- ...signature
- },
- method
- };
-};
diff --git a/libs/shared/util/payload-api/src/lib/find-by-slug.ts b/libs/shared/util/payload-api/src/lib/find-by-slug.ts
index f41fd37a9..e9a0340ee 100644
--- a/libs/shared/util/payload-api/src/lib/find-by-slug.ts
+++ b/libs/shared/util/payload-api/src/lib/find-by-slug.ts
@@ -1,6 +1,9 @@
-import type { CollectionSlug } from '@codeware/shared/util/payload-types';
+import type {
+ CollectionSlug,
+ CollectionWithoutPayload
+} from '@codeware/shared/util/payload-types';
-import { type RequestOptions, invokeRequest } from './invoke-request';
+import { type RequestBaseOptions, invokeRequest } from './utils/invoke-request';
/**
* Find a document by the slug field.
@@ -9,15 +12,16 @@ import { type RequestOptions, invokeRequest } from './invoke-request';
* @param slug - The slug of the document to find.
* @param options - The options to find the document with.
* @returns The document for the slug or `null` if the document is not found.
- * @throws An error when the request fails.
+ * @throws A formatted error message when the request fails.
*/
export const findBySlug = async (
collection: T,
slug: string,
- options: RequestOptions
-) => {
+ options: RequestBaseOptions
+): Promise => {
const response = await invokeRequest(collection, {
...options,
+ method: 'GET',
query: `where[slug][equals]=${slug}`
});
diff --git a/libs/shared/util/payload-api/src/lib/get-shallow.ts b/libs/shared/util/payload-api/src/lib/get-shallow.ts
index f974462ad..90e194c28 100644
--- a/libs/shared/util/payload-api/src/lib/get-shallow.ts
+++ b/libs/shared/util/payload-api/src/lib/get-shallow.ts
@@ -1,21 +1,31 @@
-import type { CollectionSlug } from '@codeware/shared/util/payload-types';
+import type {
+ CollectionSlug,
+ CollectionWithoutPayload
+} from '@codeware/shared/util/payload-types';
-import { type RequestOptions, invokeRequest } from './invoke-request';
+import {
+ type MethodOptions,
+ type RequestBaseOptions,
+ invokeRequest
+} from './utils/invoke-request';
/**
- * Get documents shallow from a collection.
+ * Get documents shallow (hence depth 0) from a collection.
+ *
+ * Defaults to a limit of 100 documents.
*
* @param collection - The collection to get.
* @param options - The options to get the collection with.
* @returns The collection documents.
- * @throws An error when the request fails.
+ * @throws A formatted error message when the request fails.
*/
export const getShallow = async (
collection: T,
- options: RequestOptions
-) => {
+ options: RequestBaseOptions & MethodOptions<'GET'>
+): Promise> => {
const response = await invokeRequest(collection, {
...options,
+ method: 'GET',
depth: 0,
limit: 100
});
diff --git a/libs/shared/util/payload-api/src/lib/invoke-request.ts b/libs/shared/util/payload-api/src/lib/invoke-request.ts
deleted file mode 100644
index 12b8d38d6..000000000
--- a/libs/shared/util/payload-api/src/lib/invoke-request.ts
+++ /dev/null
@@ -1,99 +0,0 @@
-import type {
- CollectionSlug,
- CollectionWithoutPayload
-} from '@codeware/shared/util/payload-types';
-
-import { createRequestInit } from './create-request-init';
-import type { RequestInitOptions } from './create-request-init';
-
-type GETResponse = {
- docs: Array;
-};
-
-export type RequestOptions = RequestInitOptions & {
- /**
- * The URL of the Payload CMS API host.
- * @example 'https://payload-cms.com'
- */
- apiUrl: string;
- /**
- * Whether to enable debug logging on requests.
- * @default false
- */
- debug?: boolean;
- /**
- * The depth of the request.
- * @default 2
- */
- depth?: number;
- /**
- * The limit of the request, must be greater than 0 when provided.
- */
- limit?: number;
- /**
- * The query to invoke the request with.
- * @example 'where[slug][equals]=home'
- */
- query?: string;
-};
-
-const collectionApiUrl = (apiUrl: string, collection: CollectionSlug) =>
- `${apiUrl}/api/${collection}`;
-
-/**
- * Invoke a GET request to the Payload API with optional
- * API key authorization and signature verification.
- *
- * @param collection - The collection to invoke the request on.
- * @param query - The query to invoke the request with.
- * @param initOptions - The options to invoke the request with.
- * @returns The response from the request or an error description.
- */
-export const invokeRequest = async (
- collection: T,
- { apiUrl, depth = 2, limit = 0, query, ...initOptions }: RequestOptions
-): Promise<
- | {
- data: Array | null;
- }
- | {
- error: string;
- }
-> => {
- const init = createRequestInit('GET', initOptions);
-
- const queryParams = [query, `depth=${depth}`, limit ? `limit=${limit}` : '']
- .filter(Boolean)
- .join('&');
-
- const requestUrl = `${collectionApiUrl(apiUrl, collection)}${queryParams ? `?${queryParams}` : ''}`;
-
- if (initOptions.debug) {
- console.log(`[PAYLOAD REQUEST] ${requestUrl}`, init);
- }
-
- const response = await fetch(requestUrl, init);
-
- if (initOptions.debug) {
- const responseHeaders: Record = {};
- response.headers.forEach((value, key) => {
- responseHeaders[key] = value;
- });
- console.log(
- `[PAYLOAD RESPONSE] ${response.status} ${response.statusText} | ${requestUrl}`,
- responseHeaders
- );
- }
-
- if (!response.ok) {
- return {
- error: `${response.statusText} (${response.status})`
- };
- }
-
- const res: GETResponse = await response.json();
-
- return {
- data: res?.docs ?? null
- };
-};
diff --git a/libs/shared/util/payload-api/src/lib/post.ts b/libs/shared/util/payload-api/src/lib/post.ts
new file mode 100644
index 000000000..756d6e547
--- /dev/null
+++ b/libs/shared/util/payload-api/src/lib/post.ts
@@ -0,0 +1,34 @@
+import type {
+ CollectionSlug,
+ CollectionWithoutPayload
+} from '@codeware/shared/util/payload-types';
+
+import {
+ type MethodOptions,
+ type RequestBaseOptions,
+ invokeRequest
+} from './utils/invoke-request';
+
+/**
+ * Create a document in a collection.
+ *
+ * @param collection - The collection to create the document in.
+ * @param options - The options to create the document with.
+ * @returns The created document.
+ * @throws A formatted error message when the request fails.
+ */
+export const post = async (
+ collection: T,
+ options: RequestBaseOptions & MethodOptions<'POST'>
+): Promise => {
+ const response = await invokeRequest(collection, {
+ ...options,
+ method: 'POST'
+ });
+
+ if ('error' in response) {
+ throw new Error(`Error posting to '${collection}': ${response.error}`);
+ }
+
+ return response.data[0];
+};
diff --git a/libs/shared/util/payload-api/src/lib/utils/create-request-init.ts b/libs/shared/util/payload-api/src/lib/utils/create-request-init.ts
new file mode 100644
index 000000000..c0de4ff4b
--- /dev/null
+++ b/libs/shared/util/payload-api/src/lib/utils/create-request-init.ts
@@ -0,0 +1,121 @@
+import { generateSignature } from '@codeware/shared/util/signature';
+
+import {
+ type RequestMethod,
+ apiKeyPrefix,
+ authorizationHeader
+} from './definitions';
+
+export type RequestInitOptions = {
+ /**
+ * Optional headers to include in the request.
+ *
+ * @default undefined
+ */
+ headers?: HeadersInit;
+
+ /**
+ * Whether to allow HTTP-only cookies depending on client and server domains.
+ *
+ * When the client is on a different domain than the Payload API and `useSignature` is provided,
+ * the value should be set to `'include'`.
+ *
+ * @default undefined
+ */
+ requestCredentials?: RequestCredentials;
+
+ /**
+ * Enable signature verification for the request
+ * by providing the required application details.
+ *
+ * @default undefined
+ */
+ signatureVertification?: {
+ deployEnv: string;
+ deviceId: string;
+ secret: string;
+ tenantId: string;
+ /**
+ * Browser user agent to include in the signature.
+ *
+ * Set to `null` when the request is invoked from a server-side context
+ * without access to the request object.
+ * The user agent will be set to `'SSR'` in this case.
+ *
+ * @example
+ * ```ts
+ * const userAgent = request.headers.get('User-Agent')
+ * ```
+ */
+ userAgent: string | null;
+ };
+
+ /**
+ * Enable API key authorization for the request
+ * by providing the tenant API key for the application.
+ *
+ * @default undefined
+ */
+ tenantApiKey?: string;
+};
+
+/**
+ * Create request configuration for `fetch` requests.
+ *
+ * Defaults to `'application/json'` content type when not provided in the `headers` option.
+ */
+export const createRequestInit = (
+ method: RequestMethod,
+ options: RequestInitOptions
+): RequestInit => {
+ const { headers, requestCredentials, signatureVertification, tenantApiKey } =
+ options;
+
+ let initHeaders: HeadersInit = {
+ 'Content-Type': 'application/json',
+ ...(headers ?? {})
+ };
+
+ // Return early when there is no tenant API key
+ if (!tenantApiKey) {
+ return {
+ headers: initHeaders,
+ method
+ };
+ }
+
+ // Apply API key authorization header
+ initHeaders = {
+ ...initHeaders,
+ [authorizationHeader]: `${apiKeyPrefix} ${tenantApiKey}`
+ };
+
+ // Generate signature verification headers if useSignature is provided
+ let signature: Record = {};
+ if (signatureVertification) {
+ const { deployEnv, deviceId, secret, tenantId, userAgent } =
+ signatureVertification;
+
+ const reqUserAgent = userAgent ?? 'SSR';
+ const computedUserAgent = `${reqUserAgent} ${tenantId} web/todo:version (${deployEnv})`;
+
+ try {
+ signature = generateSignature({
+ deviceId,
+ secret,
+ userAgent: computedUserAgent
+ });
+ } catch (error) {
+ console.error('Failed to generate signature', error);
+ }
+ }
+
+ return {
+ credentials: requestCredentials,
+ headers: {
+ ...initHeaders,
+ ...signature
+ },
+ method
+ };
+};
diff --git a/libs/shared/util/payload-api/src/lib/definitions.ts b/libs/shared/util/payload-api/src/lib/utils/definitions.ts
similarity index 75%
rename from libs/shared/util/payload-api/src/lib/definitions.ts
rename to libs/shared/util/payload-api/src/lib/utils/definitions.ts
index 48a568d69..230df0d2e 100644
--- a/libs/shared/util/payload-api/src/lib/definitions.ts
+++ b/libs/shared/util/payload-api/src/lib/utils/definitions.ts
@@ -9,3 +9,8 @@ export const authorizationHeader = 'Authorization';
* @example 'tenants API-Key '
*/
export const apiKeyPrefix = 'tenants API-Key';
+
+/**
+ * The method for the request.
+ */
+export type RequestMethod = 'GET' | 'POST';
diff --git a/libs/shared/util/payload-api/src/lib/utils/invoke-request.ts b/libs/shared/util/payload-api/src/lib/utils/invoke-request.ts
new file mode 100644
index 000000000..94fd6276b
--- /dev/null
+++ b/libs/shared/util/payload-api/src/lib/utils/invoke-request.ts
@@ -0,0 +1,158 @@
+import type {
+ CollectionSlug,
+ CollectionWithoutPayload
+} from '@codeware/shared/util/payload-types';
+
+import { createRequestInit } from './create-request-init';
+import type { RequestInitOptions } from './create-request-init';
+import type { RequestMethod } from './definitions';
+
+type FetchResponse<
+ T extends RequestMethod,
+ C extends CollectionSlug
+> = T extends 'GET'
+ ? {
+ docs: Array;
+ }
+ : CollectionWithoutPayload[C];
+
+export type MethodOptions = T extends 'GET'
+ ? {
+ /**
+ * The depth of the request.
+ * @default 2
+ */
+ depth?: number;
+ /**
+ * The limit of the request, must be greater than 0 when provided.
+ */
+ limit?: number;
+ /**
+ * The query to invoke the request with.
+ * @example 'where[slug][equals]=home'
+ */
+ query?: string;
+ }
+ : {
+ body: Record;
+ };
+
+export type RequestBaseOptions = RequestInitOptions & {
+ /**
+ * The URL of the Payload CMS API host.
+ * @example 'https://payload-cms.com'
+ */
+ apiUrl: string;
+ /**
+ * Whether to enable debug logging on requests.
+ * @default false
+ */
+ debug?: boolean;
+};
+
+type RequestOptions = RequestBaseOptions &
+ (
+ | ({ method: 'GET' } & MethodOptions<'GET'>)
+ | ({ method: 'POST' } & MethodOptions<'POST'>)
+ );
+
+const collectionApiUrl = (apiUrl: string, collection: CollectionSlug) =>
+ `${apiUrl}/api/${collection}`;
+
+/**
+ * Invoke a Payload REST API request with optional
+ * API key authorization and signature verification.
+ *
+ * @param collection - The collection to invoke the request on.
+ * @param options - The options to invoke the request with.
+ * @returns The response from the request or an error description.
+ */
+export async function invokeRequest(
+ collection: TCollection,
+ options: RequestOptions
+): Promise<
+ | {
+ data: Array;
+ status: number;
+ }
+ | {
+ error: string;
+ status: number;
+ }
+> {
+ const {
+ apiUrl,
+ debug,
+ headers,
+ method,
+ requestCredentials,
+ signatureVertification,
+ tenantApiKey
+ } = options;
+
+ const requestInit = createRequestInit(method, {
+ headers,
+ requestCredentials,
+ signatureVertification,
+ tenantApiKey
+ });
+
+ // Build GET query params
+ const queryParams =
+ method === 'GET'
+ ? [
+ options.query,
+ `depth=${options.depth ?? 2}`,
+ options.limit ? `limit=${options.limit ?? 0}` : ''
+ ]
+ .filter(Boolean)
+ .join('&')
+ : '';
+
+ const requestUrl = `${collectionApiUrl(apiUrl, collection)}${queryParams ? `?${queryParams}` : ''}`;
+
+ // Apply POST body to request init
+ requestInit.body =
+ method === 'POST' ? JSON.stringify(options.body) : undefined;
+
+ if (debug) {
+ console.log(`[PAYLOAD REQUEST] ${requestUrl}`, requestInit);
+ }
+
+ const response = await fetch(requestUrl, requestInit);
+
+ if (debug) {
+ const responseHeaders: Record = {};
+ response.headers.forEach((value, key) => {
+ responseHeaders[key] = value;
+ });
+ console.log(
+ `[PAYLOAD RESPONSE] ${response.status} ${response.statusText} | ${requestUrl}`,
+ responseHeaders
+ );
+ }
+
+ if (!response.ok) {
+ return {
+ error: response.statusText,
+ status: response.status
+ };
+ }
+
+ const res = await response.json();
+
+ // GET response
+ if (method === 'GET') {
+ const { docs } = res as FetchResponse<'GET', TCollection>;
+ return {
+ data: docs ?? null,
+ status: response.status
+ };
+ }
+
+ // POST response
+ return {
+ data: [res as FetchResponse<'POST', TCollection>],
+ status: response.status
+ };
+}
diff --git a/libs/shared/util/payload-types/src/lib/custom-types.ts b/libs/shared/util/payload-types/src/lib/custom-types.ts
index 6f937e162..e56b0946e 100644
--- a/libs/shared/util/payload-types/src/lib/custom-types.ts
+++ b/libs/shared/util/payload-types/src/lib/custom-types.ts
@@ -4,6 +4,8 @@ import type {
User as CollectionUser,
Config,
ContentBlock,
+ Form,
+ FormSubmission,
Tenant,
TenantsArrayField
} from './payload-types';
@@ -40,7 +42,28 @@ export type TenantRole = NonNullable[number]['role'];
/** User type that can be any of the user types defined by Payload */
export type UserAny = ClientUser | CollectionUser | User;
+/** Block type */
+export type BlockSlug = keyof Config['blocks'];
+
/** Content block column size */
export type ContentBlockSize = NonNullable<
NonNullable[number]>['size']
>;
+
+/** Form block type */
+export type FormBlockType = NonNullable<
+ NonNullable[number]>['blockType']
+>;
+
+/** Form field type */
+export type FormField = NonNullable[number]>;
+
+/** Form field for a specific block type */
+export type FormFieldForBlockType = FormField & {
+ blockType: T;
+};
+
+/** Form submission data */
+export type FormSubmissionData = NonNullable<
+ NonNullable
+>;
diff --git a/libs/shared/util/payload-types/src/lib/payload-types.ts b/libs/shared/util/payload-types/src/lib/payload-types.ts
index 58cdad352..90b3c9c58 100644
--- a/libs/shared/util/payload-types/src/lib/payload-types.ts
+++ b/libs/shared/util/payload-types/src/lib/payload-types.ts
@@ -22,6 +22,15 @@ export type TenantsArrayField =
id?: string | null;
}[]
| null;
+/**
+ * Set the width of the field in the 12 column grid layout.
+ *
+ * This interface was referenced by `Config`'s JSON-Schema
+ * via the `definition` "FieldWidth".
+ */
+export type FieldWidth =
+ | ('1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | '10' | '11' | '12')
+ | null;
/**
* Supported timezones in IANA format.
*
@@ -84,6 +93,7 @@ export interface Config {
blocks: {
code: CodeBlock;
content: ContentBlock;
+ form: FormBlock;
media: MediaBlock;
};
collections: {
@@ -93,6 +103,8 @@ export interface Config {
posts: Post;
tenants: Tenant;
users: User;
+ forms: Form;
+ 'form-submissions': FormSubmission;
'payload-locked-documents': PayloadLockedDocument;
'payload-preferences': PayloadPreference;
'payload-migrations': PayloadMigration;
@@ -119,6 +131,10 @@ export interface Config {
posts: PostsSelect | PostsSelect;
tenants: TenantsSelect | TenantsSelect;
users: UsersSelect | UsersSelect;
+ forms: FormsSelect | FormsSelect;
+ 'form-submissions':
+ | FormSubmissionsSelect
+ | FormSubmissionsSelect;
'payload-locked-documents':
| PayloadLockedDocumentsSelect
| PayloadLockedDocumentsSelect;
@@ -233,31 +249,156 @@ export interface ContentBlock {
}
/**
* This interface was referenced by `Config`'s JSON-Schema
- * via the `definition` "MediaBlock".
+ * via the `definition` "FormBlock".
*/
-export interface MediaBlock {
- media: number | Media;
+export interface FormBlock {
+ form: number | Form;
+ enableIntro?: boolean | null;
+ introContent?: {
+ root: {
+ type: string;
+ children: {
+ type: string;
+ version: number;
+ [k: string]: unknown;
+ }[];
+ direction: ('ltr' | 'rtl') | null;
+ format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
+ indent: number;
+ version: number;
+ };
+ [k: string]: unknown;
+ } | null;
id?: string | null;
blockName?: string | null;
- blockType: 'media';
+ blockType: 'form';
}
/**
- * Media files currently only support images and can be used in posts and pages.
- *
* This interface was referenced by `Config`'s JSON-Schema
- * via the `definition` "media".
+ * via the `definition` "forms".
*/
-export interface Media {
+export interface Form {
id: number;
tenant?: (number | null) | Tenant;
+ title: string;
+ fields?:
+ | (
+ | {
+ name: string;
+ label?: string | null;
+ width?: FieldWidth;
+ required?: boolean | null;
+ defaultValue?: boolean | null;
+ id?: string | null;
+ blockName?: string | null;
+ blockType: 'checkbox';
+ }
+ | {
+ name: string;
+ label?: string | null;
+ placeholder?: string | null;
+ width?: FieldWidth;
+ required?: boolean | null;
+ id?: string | null;
+ blockName?: string | null;
+ blockType: 'country';
+ }
+ | {
+ name: string;
+ label?: string | null;
+ placeholder?: string | null;
+ width?: FieldWidth;
+ required?: boolean | null;
+ id?: string | null;
+ blockName?: string | null;
+ blockType: 'email';
+ }
+ | {
+ message?: {
+ root: {
+ type: string;
+ children: {
+ type: string;
+ version: number;
+ [k: string]: unknown;
+ }[];
+ direction: ('ltr' | 'rtl') | null;
+ format:
+ | 'left'
+ | 'start'
+ | 'center'
+ | 'right'
+ | 'end'
+ | 'justify'
+ | '';
+ indent: number;
+ version: number;
+ };
+ [k: string]: unknown;
+ } | null;
+ id?: string | null;
+ blockName?: string | null;
+ blockType: 'message';
+ }
+ | {
+ name: string;
+ label?: string | null;
+ placeholder?: string | null;
+ width?: FieldWidth;
+ defaultValue?: number | null;
+ required?: boolean | null;
+ id?: string | null;
+ blockName?: string | null;
+ blockType: 'number';
+ }
+ | {
+ name: string;
+ label?: string | null;
+ placeholder?: string | null;
+ width?: FieldWidth;
+ defaultValue?: string | null;
+ options?:
+ | {
+ label: string;
+ value: string;
+ id?: string | null;
+ }[]
+ | null;
+ required?: boolean | null;
+ id?: string | null;
+ blockName?: string | null;
+ blockType: 'select';
+ }
+ | {
+ name: string;
+ label?: string | null;
+ placeholder?: string | null;
+ width?: FieldWidth;
+ defaultValue?: string | null;
+ required?: boolean | null;
+ id?: string | null;
+ blockName?: string | null;
+ blockType: 'text';
+ }
+ | {
+ name: string;
+ label?: string | null;
+ placeholder?: string | null;
+ width?: FieldWidth;
+ defaultValue?: string | null;
+ required?: boolean | null;
+ id?: string | null;
+ blockName?: string | null;
+ blockType: 'textarea';
+ }
+ )[]
+ | null;
+ submitButtonLabel?: string | null;
/**
- * The alternative text for the media.
- */
- alt?: string | null;
- /**
- * The caption for the media.
+ * Choose whether to display an on-page message or redirect to a different page after they submit the form.
*/
- caption?: {
+ confirmationType?: ('message' | 'redirect') | null;
+ confirmationMessage?: {
root: {
type: string;
children: {
@@ -272,81 +413,55 @@ export interface Media {
};
[k: string]: unknown;
} | null;
- relatedPosts?: {
- docs?: (number | Post)[];
- hasNextPage?: boolean;
- totalDocs?: number;
+ redirect?: {
+ type?: ('reference' | 'custom') | null;
+ reference?: {
+ relationTo: 'pages';
+ value: number | Page;
+ } | null;
+ url?: string | null;
};
- prefix?: string | null;
+ /**
+ * Send custom emails when the form submits. Use comma separated lists to send the same email to multiple recipients. To reference a value from this form, wrap that field's name with double curly brackets, i.e. {{firstName}}. You can use a wildcard {{*}} to output all data and {{*:table}} to format it as an HTML table in the email.
+ */
+ emails?:
+ | {
+ emailTo?: string | null;
+ cc?: string | null;
+ bcc?: string | null;
+ replyTo?: string | null;
+ emailFrom?: string | null;
+ subject: string;
+ /**
+ * Enter the message that should be sent in this email.
+ */
+ message?: {
+ root: {
+ type: string;
+ children: {
+ type: string;
+ version: number;
+ [k: string]: unknown;
+ }[];
+ direction: ('ltr' | 'rtl') | null;
+ format:
+ | 'left'
+ | 'start'
+ | 'center'
+ | 'right'
+ | 'end'
+ | 'justify'
+ | '';
+ indent: number;
+ version: number;
+ };
+ [k: string]: unknown;
+ } | null;
+ id?: string | null;
+ }[]
+ | null;
updatedAt: string;
createdAt: string;
- url?: string | null;
- thumbnailURL?: string | null;
- filename?: string | null;
- mimeType?: string | null;
- filesize?: number | null;
- width?: number | null;
- height?: number | null;
- focalX?: number | null;
- focalY?: number | null;
- sizes?: {
- thumbnail?: {
- url?: string | null;
- width?: number | null;
- height?: number | null;
- mimeType?: string | null;
- filesize?: number | null;
- filename?: string | null;
- };
- square?: {
- url?: string | null;
- width?: number | null;
- height?: number | null;
- mimeType?: string | null;
- filesize?: number | null;
- filename?: string | null;
- };
- small?: {
- url?: string | null;
- width?: number | null;
- height?: number | null;
- mimeType?: string | null;
- filesize?: number | null;
- filename?: string | null;
- };
- medium?: {
- url?: string | null;
- width?: number | null;
- height?: number | null;
- mimeType?: string | null;
- filesize?: number | null;
- filename?: string | null;
- };
- large?: {
- url?: string | null;
- width?: number | null;
- height?: number | null;
- mimeType?: string | null;
- filesize?: number | null;
- filename?: string | null;
- };
- xlarge?: {
- url?: string | null;
- width?: number | null;
- height?: number | null;
- mimeType?: string | null;
- filesize?: number | null;
- filename?: string | null;
- };
- og?: {
- url?: string | null;
- width?: number | null;
- height?: number | null;
- mimeType?: string | null;
- filesize?: number | null;
- filename?: string | null;
- };
- };
}
/**
* A workspace is like an organization or a company and is often called a "tenant". The content is scoped to the members of the workspace.
@@ -447,7 +562,7 @@ export interface Page {
/**
* Build the page content by adding the layout blocks you need.
*/
- layout: (ContentBlock | MediaBlock | CodeBlock)[];
+ layout: (ContentBlock | FormBlock | MediaBlock | CodeBlock)[];
meta?: {
title?: string | null;
/**
@@ -467,6 +582,123 @@ export interface Page {
updatedAt: string;
createdAt: string;
}
+/**
+ * This interface was referenced by `Config`'s JSON-Schema
+ * via the `definition` "MediaBlock".
+ */
+export interface MediaBlock {
+ media: number | Media;
+ id?: string | null;
+ blockName?: string | null;
+ blockType: 'media';
+}
+/**
+ * Media files currently only support images and can be used in posts and pages.
+ *
+ * This interface was referenced by `Config`'s JSON-Schema
+ * via the `definition` "media".
+ */
+export interface Media {
+ id: number;
+ tenant?: (number | null) | Tenant;
+ /**
+ * The alternative text for the media.
+ */
+ alt?: string | null;
+ /**
+ * The caption for the media.
+ */
+ caption?: {
+ root: {
+ type: string;
+ children: {
+ type: string;
+ version: number;
+ [k: string]: unknown;
+ }[];
+ direction: ('ltr' | 'rtl') | null;
+ format: 'left' | 'start' | 'center' | 'right' | 'end' | 'justify' | '';
+ indent: number;
+ version: number;
+ };
+ [k: string]: unknown;
+ } | null;
+ relatedPosts?: {
+ docs?: (number | Post)[];
+ hasNextPage?: boolean;
+ totalDocs?: number;
+ };
+ prefix?: string | null;
+ updatedAt: string;
+ createdAt: string;
+ url?: string | null;
+ thumbnailURL?: string | null;
+ filename?: string | null;
+ mimeType?: string | null;
+ filesize?: number | null;
+ width?: number | null;
+ height?: number | null;
+ focalX?: number | null;
+ focalY?: number | null;
+ sizes?: {
+ thumbnail?: {
+ url?: string | null;
+ width?: number | null;
+ height?: number | null;
+ mimeType?: string | null;
+ filesize?: number | null;
+ filename?: string | null;
+ };
+ square?: {
+ url?: string | null;
+ width?: number | null;
+ height?: number | null;
+ mimeType?: string | null;
+ filesize?: number | null;
+ filename?: string | null;
+ };
+ small?: {
+ url?: string | null;
+ width?: number | null;
+ height?: number | null;
+ mimeType?: string | null;
+ filesize?: number | null;
+ filename?: string | null;
+ };
+ medium?: {
+ url?: string | null;
+ width?: number | null;
+ height?: number | null;
+ mimeType?: string | null;
+ filesize?: number | null;
+ filename?: string | null;
+ };
+ large?: {
+ url?: string | null;
+ width?: number | null;
+ height?: number | null;
+ mimeType?: string | null;
+ filesize?: number | null;
+ filename?: string | null;
+ };
+ xlarge?: {
+ url?: string | null;
+ width?: number | null;
+ height?: number | null;
+ mimeType?: string | null;
+ filesize?: number | null;
+ filename?: string | null;
+ };
+ og?: {
+ url?: string | null;
+ width?: number | null;
+ height?: number | null;
+ mimeType?: string | null;
+ filesize?: number | null;
+ filename?: string | null;
+ };
+ };
+}
/**
* Posts are standalone pages such as articles or blog posts and can be categorized.
*
@@ -544,6 +776,24 @@ export interface Category {
updatedAt: string;
createdAt: string;
}
+/**
+ * This interface was referenced by `Config`'s JSON-Schema
+ * via the `definition` "form-submissions".
+ */
+export interface FormSubmission {
+ id: number;
+ tenant?: (number | null) | Tenant;
+ form: number | Form;
+ submissionData?:
+ | {
+ field: string;
+ value: string;
+ id?: string | null;
+ }[]
+ | null;
+ updatedAt: string;
+ createdAt: string;
+}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "payload-locked-documents".
@@ -574,6 +824,14 @@ export interface PayloadLockedDocument {
| ({
relationTo: 'users';
value: number | User;
+ } | null)
+ | ({
+ relationTo: 'forms';
+ value: number | Form;
+ } | null)
+ | ({
+ relationTo: 'form-submissions';
+ value: number | FormSubmission;
} | null);
globalSlug?: string | null;
user:
@@ -834,6 +1092,154 @@ export interface TenantsArrayFieldSelect {
role?: T;
id?: T;
}
+/**
+ * This interface was referenced by `Config`'s JSON-Schema
+ * via the `definition` "forms_select".
+ */
+export interface FormsSelect {
+ tenant?: T;
+ title?: T;
+ fields?:
+ | T
+ | {
+ checkbox?:
+ | T
+ | {
+ name?: T;
+ label?: T;
+ width?: T;
+ required?: T;
+ defaultValue?: T;
+ id?: T;
+ blockName?: T;
+ };
+ country?:
+ | T
+ | {
+ name?: T;
+ label?: T;
+ placeholder?: T;
+ width?: T;
+ required?: T;
+ id?: T;
+ blockName?: T;
+ };
+ email?:
+ | T
+ | {
+ name?: T;
+ label?: T;
+ placeholder?: T;
+ width?: T;
+ required?: T;
+ id?: T;
+ blockName?: T;
+ };
+ message?:
+ | T
+ | {
+ message?: T;
+ id?: T;
+ blockName?: T;
+ };
+ number?:
+ | T
+ | {
+ name?: T;
+ label?: T;
+ placeholder?: T;
+ width?: T;
+ defaultValue?: T;
+ required?: T;
+ id?: T;
+ blockName?: T;
+ };
+ select?:
+ | T
+ | {
+ name?: T;
+ label?: T;
+ placeholder?: T;
+ width?: T;
+ defaultValue?: T;
+ options?:
+ | T
+ | {
+ label?: T;
+ value?: T;
+ id?: T;
+ };
+ required?: T;
+ id?: T;
+ blockName?: T;
+ };
+ text?:
+ | T
+ | {
+ name?: T;
+ label?: T;
+ placeholder?: T;
+ width?: T;
+ defaultValue?: T;
+ required?: T;
+ id?: T;
+ blockName?: T;
+ };
+ textarea?:
+ | T
+ | {
+ name?: T;
+ label?: T;
+ placeholder?: T;
+ width?: T;
+ defaultValue?: T;
+ required?: T;
+ id?: T;
+ blockName?: T;
+ };
+ };
+ submitButtonLabel?: T;
+ confirmationType?: T;
+ confirmationMessage?: T;
+ redirect?:
+ | T
+ | {
+ type?: T;
+ reference?: T;
+ url?: T;
+ };
+ emails?:
+ | T
+ | {
+ emailTo?: T;
+ cc?: T;
+ bcc?: T;
+ replyTo?: T;
+ emailFrom?: T;
+ subject?: T;
+ message?: T;
+ id?: T;
+ };
+ updatedAt?: T;
+ createdAt?: T;
+}
+/**
+ * This interface was referenced by `Config`'s JSON-Schema
+ * via the `definition` "form-submissions_select".
+ */
+export interface FormSubmissionsSelect {
+ tenant?: T;
+ form?: T;
+ submissionData?:
+ | T
+ | {
+ field?: T;
+ value?: T;
+ id?: T;
+ };
+ updatedAt?: T;
+ createdAt?: T;
+}
/**
* This interface was referenced by `Config`'s JSON-Schema
* via the `definition` "payload-locked-documents_select".
diff --git a/package.json b/package.json
index 0a3209e34..1d22d2e76 100644
--- a/package.json
+++ b/package.json
@@ -19,40 +19,59 @@
"@headlessui/react": "^2.2.0",
"@heroicons/react": "^2.2.0",
"@hono/node-server": "^1.13.7",
+ "@hookform/resolvers": "^4.1.3",
"@infisical/sdk": "^3.0.4",
"@ngneat/falso": "^7.3.0",
"@octokit/request-error": "^5.0.1",
- "@payloadcms/db-mongodb": "^3.23.0",
- "@payloadcms/db-postgres": "^3.23.0",
- "@payloadcms/next": "^3.23.0",
- "@payloadcms/plugin-multi-tenant": "^3.23.0",
- "@payloadcms/plugin-seo": "^3.23.0",
- "@payloadcms/richtext-lexical": "^3.23.0",
- "@payloadcms/storage-s3": "^3.23.0",
- "@payloadcms/ui": "^3.23.0",
+ "@payloadcms/db-mongodb": "~3.28.0",
+ "@payloadcms/db-postgres": "~3.28.0",
+ "@payloadcms/email-nodemailer": "~3.28.0",
+ "@payloadcms/next": "~3.28.0",
+ "@payloadcms/plugin-form-builder": "~3.28.0",
+ "@payloadcms/plugin-multi-tenant": "~3.28.0",
+ "@payloadcms/plugin-seo": "~3.28.0",
+ "@payloadcms/richtext-lexical": "~3.28.0",
+ "@payloadcms/storage-s3": "~3.28.0",
+ "@payloadcms/ui": "~3.28.0",
+ "@radix-ui/react-checkbox": "^1.1.4",
+ "@radix-ui/react-dialog": "^1.1.6",
+ "@radix-ui/react-dropdown-menu": "^2.1.6",
+ "@radix-ui/react-label": "^2.1.2",
+ "@radix-ui/react-menubar": "^1.1.6",
+ "@radix-ui/react-radio-group": "^1.2.3",
+ "@radix-ui/react-select": "^2.1.6",
+ "@radix-ui/react-slot": "^1.1.2",
"@remix-run/node": "^2.16.0",
"@remix-run/react": "^2.16.0",
"@tailwindcss/typography": "^0.5.15",
"axios": "^1.6.0",
+ "class-variance-authority": "^0.7.0",
"clsx": "^2.1.1",
"fast-glob": "^3.3.2",
"graphql": "^16.10.0",
"hono": "^4.6.10",
"http-status-codes": "^2.3.0",
"isbot": "^4.4.0",
+ "lucide-react": "^0.395.0",
"next": "15.1.7",
- "payload": "^3.23.0",
+ "next-themes": "^0.4.6",
+ "nodemailer": "^6.10.0",
+ "nodemailer-sendgrid": "^1.0.3",
+ "payload": "~3.28.0",
"prism-react-renderer": "^2.4.1",
"react": "19.0.0",
"react-dom": "19.0.0",
+ "react-hook-form": "^7.54.2",
"react-router-dom": "6.11.2",
"remix-hono": "^0.0.16",
"remix-utils": "^8.4.0",
"replace-in-file": "^7.2.0",
"sharp": "^0.33.5",
"simple-git": "^3.27.0",
+ "sonner": "^2.0.1",
+ "tailwind-merge": "^2.3.0",
"tailwindcss-animate": "^1.0.7",
- "zod": "^3.23.8"
+ "zod": "^3.24.2"
},
"devDependencies": {
"@babel/core": "^7.14.5",
@@ -89,7 +108,7 @@
"@octokit/plugin-rest-endpoint-methods": "^13.2.6",
"@octokit/types": "^13.6.1",
"@octokit/webhooks-types": "^7.6.1",
- "@payloadcms/graphql": "^3.23.0",
+ "@payloadcms/graphql": "~3.28.0",
"@playwright/test": "^1.36.0",
"@pmmmwh/react-refresh-webpack-plugin": "^0.5.7",
"@remix-run/dev": "^2.14.0",
@@ -107,6 +126,8 @@
"@types/jest": "^29.5.12",
"@types/kill-port": "^2.0.3",
"@types/node": "22.13.2",
+ "@types/nodemailer": "^6.4.17",
+ "@types/nodemailer-sendgrid": "^1.0.3",
"@types/npm-whoami": "^1.1.2",
"@types/react": "19.0.0",
"@types/react-dom": "19.0.0",
@@ -120,6 +141,7 @@
"autoprefixer": "10.4.20",
"babel-jest": "^29.7.0",
"chalk": "^4.1.0",
+ "concurrently": "^9.1.2",
"create-nx-workspace": "20.4.5",
"cz-git": "^1.8.0",
"czg": "^1.8.0",
@@ -142,6 +164,7 @@
"jsdom": "~26.0.0",
"kill-port": "^2.0.1",
"memfs": "^4.14.0",
+ "nodemon": "^3.1.9",
"npm-whoami": "^1.1.4",
"nx": "20.4.5",
"nx-cloud": "19.1.0",
@@ -149,6 +172,7 @@
"prettier": "^3.0.0",
"react-refresh": "^0.14.0",
"rimraf": "latest",
+ "shadcn": "~2.3.0",
"supertest": "^7.0.0",
"tailwindcss": "3.4.17",
"tcp-port-used": "^1.0.2",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 7074b51be..017e6c018 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -39,6 +39,9 @@ importers:
'@hono/node-server':
specifier: ^1.13.7
version: 1.13.8(hono@4.7.4)
+ '@hookform/resolvers':
+ specifier: ^4.1.3
+ version: 4.1.3(react-hook-form@7.54.2(react@19.0.0))
'@infisical/sdk':
specifier: ^3.0.4
version: 3.0.6
@@ -49,29 +52,59 @@ importers:
specifier: ^5.0.1
version: 5.1.1
'@payloadcms/db-mongodb':
- specifier: ^3.23.0
+ specifier: ~3.28.0
version: 3.28.1(payload@3.28.1(graphql@16.10.0)(typescript@5.7.3))
'@payloadcms/db-postgres':
- specifier: ^3.23.0
+ specifier: ~3.28.0
version: 3.28.1(@types/react@19.0.0)(payload@3.28.1(graphql@16.10.0)(typescript@5.7.3))(react@19.0.0)
+ '@payloadcms/email-nodemailer':
+ specifier: ~3.28.0
+ version: 3.28.1(payload@3.28.1(graphql@16.10.0)(typescript@5.7.3))
'@payloadcms/next':
- specifier: ^3.23.0
+ specifier: ~3.28.0
version: 3.28.1(@types/react@19.0.0)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.1.7(@babel/core@7.26.10)(@playwright/test@1.51.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(payload@3.28.1(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)
+ '@payloadcms/plugin-form-builder':
+ specifier: ~3.28.0
+ version: 3.28.1(@types/react@19.0.0)(monaco-editor@0.52.2)(next@15.1.7(@babel/core@7.26.10)(@playwright/test@1.51.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(payload@3.28.1(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)
'@payloadcms/plugin-multi-tenant':
- specifier: ^3.23.0
+ specifier: ~3.28.0
version: 3.28.1(@payloadcms/ui@3.28.1(@types/react@19.0.0)(monaco-editor@0.52.2)(next@15.1.7(@babel/core@7.26.10)(@playwright/test@1.51.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(payload@3.28.1(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(next@15.1.7(@babel/core@7.26.10)(@playwright/test@1.51.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(payload@3.28.1(graphql@16.10.0)(typescript@5.7.3))
'@payloadcms/plugin-seo':
- specifier: ^3.23.0
+ specifier: ~3.28.0
version: 3.28.1(@types/react@19.0.0)(monaco-editor@0.52.2)(next@15.1.7(@babel/core@7.26.10)(@playwright/test@1.51.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(payload@3.28.1(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)
'@payloadcms/richtext-lexical':
- specifier: ^3.23.0
+ specifier: ~3.28.0
version: 3.28.1(@faceless-ui/modal@3.0.0-beta.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@faceless-ui/scroll-info@2.0.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(@payloadcms/next@3.28.1(@types/react@19.0.0)(graphql@16.10.0)(monaco-editor@0.52.2)(next@15.1.7(@babel/core@7.26.10)(@playwright/test@1.51.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(payload@3.28.1(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(@types/react@19.0.0)(monaco-editor@0.52.2)(next@15.1.7(@babel/core@7.26.10)(@playwright/test@1.51.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(payload@3.28.1(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)(yjs@13.6.24)
'@payloadcms/storage-s3':
- specifier: ^3.23.0
+ specifier: ~3.28.0
version: 3.28.1(@types/react@19.0.0)(monaco-editor@0.52.2)(next@15.1.7(@babel/core@7.26.10)(@playwright/test@1.51.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(payload@3.28.1(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)
'@payloadcms/ui':
- specifier: ^3.23.0
+ specifier: ~3.28.0
version: 3.28.1(@types/react@19.0.0)(monaco-editor@0.52.2)(next@15.1.7(@babel/core@7.26.10)(@playwright/test@1.51.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(payload@3.28.1(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)
+ '@radix-ui/react-checkbox':
+ specifier: ^1.1.4
+ version: 1.1.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-dialog':
+ specifier: ^1.1.6
+ version: 1.1.6(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-dropdown-menu':
+ specifier: ^2.1.6
+ version: 2.1.6(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-label':
+ specifier: ^2.1.2
+ version: 2.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-menubar':
+ specifier: ^1.1.6
+ version: 1.1.6(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-radio-group':
+ specifier: ^1.2.3
+ version: 1.2.3(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-select':
+ specifier: ^2.1.6
+ version: 2.1.6(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-slot':
+ specifier: ^1.1.2
+ version: 1.1.2(@types/react@19.0.0)(react@19.0.0)
'@remix-run/node':
specifier: ^2.16.0
version: 2.16.0(typescript@5.7.3)
@@ -84,6 +117,9 @@ importers:
axios:
specifier: ^1.6.0
version: 1.8.3
+ class-variance-authority:
+ specifier: ^0.7.0
+ version: 0.7.0
clsx:
specifier: ^2.1.1
version: 2.1.1
@@ -102,11 +138,23 @@ importers:
isbot:
specifier: ^4.4.0
version: 4.4.0
+ lucide-react:
+ specifier: ^0.395.0
+ version: 0.395.0(react@19.0.0)
next:
specifier: 15.1.7
version: 15.1.7(@babel/core@7.26.10)(@playwright/test@1.51.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1)
+ next-themes:
+ specifier: ^0.4.6
+ version: 0.4.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ nodemailer:
+ specifier: ^6.10.0
+ version: 6.10.0
+ nodemailer-sendgrid:
+ specifier: ^1.0.3
+ version: 1.0.3
payload:
- specifier: ^3.23.0
+ specifier: ~3.28.0
version: 3.28.1(graphql@16.10.0)(typescript@5.7.3)
prism-react-renderer:
specifier: ^2.4.1
@@ -117,6 +165,9 @@ importers:
react-dom:
specifier: 19.0.0
version: 19.0.0(react@19.0.0)
+ react-hook-form:
+ specifier: ^7.54.2
+ version: 7.54.2(react@19.0.0)
react-router-dom:
specifier: 6.11.2
version: 6.11.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
@@ -135,11 +186,17 @@ importers:
simple-git:
specifier: ^3.27.0
version: 3.27.0
+ sonner:
+ specifier: ^2.0.1
+ version: 2.0.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ tailwind-merge:
+ specifier: ^2.3.0
+ version: 2.5.4
tailwindcss-animate:
specifier: ^1.0.7
version: 1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.2)(typescript@5.7.3)))
zod:
- specifier: ^3.23.8
+ specifier: ^3.24.2
version: 3.24.2
devDependencies:
'@babel/core':
@@ -245,7 +302,7 @@ importers:
specifier: ^7.6.1
version: 7.6.1
'@payloadcms/graphql':
- specifier: ^3.23.0
+ specifier: ~3.28.0
version: 3.28.1(graphql@16.10.0)(payload@3.28.1(graphql@16.10.0)(typescript@5.7.3))(typescript@5.7.3)
'@playwright/test':
specifier: ^1.36.0
@@ -298,6 +355,12 @@ importers:
'@types/node':
specifier: 22.13.2
version: 22.13.2
+ '@types/nodemailer':
+ specifier: ^6.4.17
+ version: 6.4.17
+ '@types/nodemailer-sendgrid':
+ specifier: ^1.0.3
+ version: 1.0.3
'@types/npm-whoami':
specifier: ^1.1.2
version: 1.1.2
@@ -337,6 +400,9 @@ importers:
chalk:
specifier: ^4.1.0
version: 4.1.2
+ concurrently:
+ specifier: ^9.1.2
+ version: 9.1.2
create-nx-workspace:
specifier: 20.4.5
version: 20.4.5
@@ -403,6 +469,9 @@ importers:
memfs:
specifier: ^4.14.0
version: 4.17.0
+ nodemon:
+ specifier: ^3.1.9
+ version: 3.1.9
npm-whoami:
specifier: ^1.1.4
version: 1.1.4
@@ -424,6 +493,9 @@ importers:
rimraf:
specifier: latest
version: 6.0.1
+ shadcn:
+ specifier: ~2.3.0
+ version: 2.3.0(typescript@5.7.3)
supertest:
specifier: ^7.0.0
version: 7.0.0
@@ -504,6 +576,10 @@ packages:
resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
engines: {node: '>=6.0.0'}
+ '@antfu/ni@0.21.12':
+ resolution: {integrity: sha512-2aDL3WUv8hMJb2L3r/PIQWsTLyq7RQr3v9xD16fiz6O8ys1xEyLhhTOv8gxtZvJiTzjTF5pHoArvRdesGL1DMQ==}
+ hasBin: true
+
'@apidevtools/json-schema-ref-parser@11.9.3':
resolution: {integrity: sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==}
engines: {node: '>= 16'}
@@ -2637,6 +2713,11 @@ packages:
peerDependencies:
hono: ^4
+ '@hookform/resolvers@4.1.3':
+ resolution: {integrity: sha512-Jsv6UOWYTrEFJ/01ZrnwVXs7KDvP8XIo115i++5PWvNkNvkrsTfGiLS6w+eJ57CYtUtDQalUWovCZDHFJ8u1VQ==}
+ peerDependencies:
+ react-hook-form: ^7.0.0
+
'@humanfs/core@0.19.1':
resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==}
engines: {node: '>=18.18.0'}
@@ -3787,6 +3868,12 @@ packages:
peerDependencies:
payload: 3.28.1
+ '@payloadcms/email-nodemailer@3.28.1':
+ resolution: {integrity: sha512-JMTQALZS5Z6JP0wyPtnXUU8lCkJZFoF0K++hMS1PvoTDO/oxA7fucL+owAJdF/bWkPS6jTvT/pIhpJC7VLlwlQ==}
+ engines: {node: ^18.20.2 || >=20.9.0}
+ peerDependencies:
+ payload: 3.28.1
+
'@payloadcms/graphql@3.28.1':
resolution: {integrity: sha512-TFwxCFOMGOHq6dIdTX8nYY0pqEhv8gckyVkuMXaJJb+kM+aCq6981UgNPc7pvBeCm41fb+gE/E21TchOsEfXTA==}
hasBin: true
@@ -3809,6 +3896,13 @@ packages:
react: 19.0.0
react-dom: 19.0.0
+ '@payloadcms/plugin-form-builder@3.28.1':
+ resolution: {integrity: sha512-jpk4vKSCciF5bMt+eAYbhlW9NsxfwLztOyn6hN5VjAHuTZ+WZSxRzJmN+PEwXLCXX5t2ZE5TluziDKQb3VDlug==}
+ peerDependencies:
+ payload: 3.28.1
+ react: 19.0.0
+ react-dom: 19.0.0
+
'@payloadcms/plugin-multi-tenant@3.28.1':
resolution: {integrity: sha512-7pKqFVUk+17HQ5C8aoefffQqqOWKQrvaxrKnWWSfh2xEBliDglGWsVEqK4harbK+l1gdtJ/H2Hmeyw09s3Bz5Q==}
peerDependencies:
@@ -3895,6 +3989,366 @@ packages:
'@polka/url@1.0.0-next.28':
resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==}
+ '@radix-ui/number@1.1.0':
+ resolution: {integrity: sha512-V3gRzhVNU1ldS5XhAPTom1fOIo4ccrjjJgmE+LI2h/WaFpHmx0MQApT+KZHnx8abG6Avtfcz4WoEciMnpFT3HQ==}
+
+ '@radix-ui/primitive@1.1.1':
+ resolution: {integrity: sha512-SJ31y+Q/zAyShtXJc8x83i9TYdbAfHZ++tUZnvjJJqFjzsdUnKsxPL6IEtBlxKkU7yzer//GQtZSV4GbldL3YA==}
+
+ '@radix-ui/react-arrow@1.1.2':
+ resolution: {integrity: sha512-G+KcpzXHq24iH0uGG/pF8LyzpFJYGD4RfLjCIBfGdSLXvjLHST31RUiRVrupIBMvIppMgSzQ6l66iAxl03tdlg==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: 19.0.0
+ react-dom: 19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-checkbox@1.1.4':
+ resolution: {integrity: sha512-wP0CPAHq+P5I4INKe3hJrIa1WoNqqrejzW+zoU0rOvo1b9gDEJJFl2rYfO1PYJUQCc2H1WZxIJmyv9BS8i5fLw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: 19.0.0
+ react-dom: 19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-collection@1.1.2':
+ resolution: {integrity: sha512-9z54IEKRxIa9VityapoEYMuByaG42iSy1ZXlY2KcuLSEtq8x4987/N6m15ppoMffgZX72gER2uHe1D9Y6Unlcw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: 19.0.0
+ react-dom: 19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-compose-refs@1.1.1':
+ resolution: {integrity: sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: 19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-context@1.1.1':
+ resolution: {integrity: sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==}
+ peerDependencies:
+ '@types/react': '*'
+ react: 19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-dialog@1.1.6':
+ resolution: {integrity: sha512-/IVhJV5AceX620DUJ4uYVMymzsipdKBzo3edo+omeskCKGm9FRHM0ebIdbPnlQVJqyuHbuBltQUOG2mOTq2IYw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: 19.0.0
+ react-dom: 19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-direction@1.1.0':
+ resolution: {integrity: sha512-BUuBvgThEiAXh2DWu93XsT+a3aWrGqolGlqqw5VU1kG7p/ZH2cuDlM1sRLNnY3QcBS69UIz2mcKhMxDsdewhjg==}
+ peerDependencies:
+ '@types/react': '*'
+ react: 19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-dismissable-layer@1.1.5':
+ resolution: {integrity: sha512-E4TywXY6UsXNRhFrECa5HAvE5/4BFcGyfTyK36gP+pAW1ed7UTK4vKwdr53gAJYwqbfCWC6ATvJa3J3R/9+Qrg==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: 19.0.0
+ react-dom: 19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-dropdown-menu@2.1.6':
+ resolution: {integrity: sha512-no3X7V5fD487wab/ZYSHXq3H37u4NVeLDKI/Ks724X/eEFSSEFYZxWgsIlr1UBeEyDaM29HM5x9p1Nv8DuTYPA==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: 19.0.0
+ react-dom: 19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-focus-guards@1.1.1':
+ resolution: {integrity: sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==}
+ peerDependencies:
+ '@types/react': '*'
+ react: 19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-focus-scope@1.1.2':
+ resolution: {integrity: sha512-zxwE80FCU7lcXUGWkdt6XpTTCKPitG1XKOwViTxHVKIJhZl9MvIl2dVHeZENCWD9+EdWv05wlaEkRXUykU27RA==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: 19.0.0
+ react-dom: 19.0.0
+ 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: 19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-label@2.1.2':
+ resolution: {integrity: sha512-zo1uGMTaNlHehDyFQcDZXRJhUPDuukcnHz0/jnrup0JA6qL+AFpAnty+7VKa9esuU5xTblAZzTGYJKSKaBxBhw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: 19.0.0
+ react-dom: 19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-menu@2.1.6':
+ resolution: {integrity: sha512-tBBb5CXDJW3t2mo9WlO7r6GTmWV0F0uzHZVFmlRmYpiSK1CDU5IKojP1pm7oknpBOrFZx/YgBRW9oorPO2S/Lg==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: 19.0.0
+ react-dom: 19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-menubar@1.1.6':
+ resolution: {integrity: sha512-FHq7+3DlXwh/7FOM4i0G4bC4vPjiq89VEEvNF4VMLchGnaUuUbE5uKXMUCjdKaOghEEMeiKa5XCa2Pk4kteWmg==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: 19.0.0
+ react-dom: 19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-popper@1.2.2':
+ resolution: {integrity: sha512-Rvqc3nOpwseCyj/rgjlJDYAgyfw7OC1tTkKn2ivhaMGcYt8FSBlahHOZak2i3QwkRXUXgGgzeEe2RuqeEHuHgA==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: 19.0.0
+ react-dom: 19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-portal@1.1.4':
+ resolution: {integrity: sha512-sn2O9k1rPFYVyKd5LAJfo96JlSGVFpa1fS6UuBJfrZadudiw5tAmru+n1x7aMRQ84qDM71Zh1+SzK5QwU0tJfA==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: 19.0.0
+ react-dom: 19.0.0
+ 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: 19.0.0
+ react-dom: 19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-primitive@2.0.2':
+ resolution: {integrity: sha512-Ec/0d38EIuvDF+GZjcMU/Ze6MxntVJYO/fRlCPhCaVUyPY9WTalHJw54tp9sXeJo3tlShWpy41vQRgLRGOuz+w==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: 19.0.0
+ react-dom: 19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-radio-group@1.2.3':
+ resolution: {integrity: sha512-xtCsqt8Rp09FK50ItqEqTJ7Sxanz8EM8dnkVIhJrc/wkMMomSmXHvYbhv3E7Zx4oXh98aaLt9W679SUYXg4IDA==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: 19.0.0
+ react-dom: 19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-roving-focus@1.1.2':
+ resolution: {integrity: sha512-zgMQWkNO169GtGqRvYrzb0Zf8NhMHS2DuEB/TiEmVnpr5OqPU3i8lfbxaAmC2J/KYuIQxyoQQ6DxepyXp61/xw==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: 19.0.0
+ react-dom: 19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-select@2.1.6':
+ resolution: {integrity: sha512-T6ajELxRvTuAMWH0YmRJ1qez+x4/7Nq7QIx7zJ0VK3qaEWdnWpNbEDnmWldG1zBDwqrLy5aLMUWcoGirVj5kMg==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: 19.0.0
+ react-dom: 19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/react-slot@1.1.2':
+ resolution: {integrity: sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ==}
+ peerDependencies:
+ '@types/react': '*'
+ react: 19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-callback-ref@1.1.0':
+ resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: 19.0.0
+ 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: 19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-escape-keydown@1.1.0':
+ resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: 19.0.0
+ 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: 19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-previous@1.1.0':
+ resolution: {integrity: sha512-Z/e78qg2YFnnXcW88A4JmTtm4ADckLno6F7OXotmkQfeuCVaKuYzqAATPhVzl3delXE7CxIV8shofPn3jPc5Og==}
+ peerDependencies:
+ '@types/react': '*'
+ react: 19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-rect@1.1.0':
+ resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==}
+ peerDependencies:
+ '@types/react': '*'
+ react: 19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-size@1.1.0':
+ resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: 19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-visually-hidden@1.1.2':
+ resolution: {integrity: sha512-1SzA4ns2M1aRlvxErqhLHsBHoS5eI5UUcI2awAMgGUp4LoaoWOKYmvqDY2s/tltuPkh3Yk77YF/r3IRj+Amx4Q==}
+ peerDependencies:
+ '@types/react': '*'
+ '@types/react-dom': '*'
+ react: 19.0.0
+ react-dom: 19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+ '@types/react-dom':
+ optional: true
+
+ '@radix-ui/rect@1.1.0':
+ resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==}
+
'@react-aria/focus@3.20.1':
resolution: {integrity: sha512-lgYs+sQ1TtBrAXnAdRBQrBo0/7o5H6IrfDxec1j+VRpcXL0xyk0xPq+m3lZp8typzIghqDgpnKkJ5Jf4OrzPIw==}
peerDependencies:
@@ -4186,6 +4640,18 @@ packages:
'@sec-ant/readable-stream@0.4.1':
resolution: {integrity: sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==}
+ '@sendgrid/client@6.5.5':
+ resolution: {integrity: sha512-Nbfgo94gbWSL8PIgJfuHoifyOJJepvV8NQkkglctAEfb1hyozKhrzE6v1kPG/z4j0RodaTtXD5LJj/t0q/VhLA==}
+ engines: {node: '>=6.0.0'}
+
+ '@sendgrid/helpers@6.5.5':
+ resolution: {integrity: sha512-uRFEanalfss5hDsuzVXZ1wm7i7eEXHh1py80piOXjobiQ+MxmtR19EU+gDSXZ+uMcEehBGhxnb7QDNN0q65qig==}
+ engines: {node: '>= 6.0.0'}
+
+ '@sendgrid/mail@6.5.5':
+ resolution: {integrity: sha512-DSu8oTPI0BJFH60jMOG9gM+oeNMoRALFmdAYg2PIXpL+Zbxd7L2GzQZtmf1jLy/8UBImkbB3D74TjiOBiLRK1w==}
+ engines: {node: '>=6.0.0'}
+
'@sinclair/typebox@0.27.8':
resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==}
@@ -4411,6 +4877,9 @@ packages:
resolution: {integrity: sha512-piUTHyp2Axx3p/kc2CIJkYSv0BAaheBQmbACZgQSSfWUumWNW+R1lL+H9PDBxKJkvOeEX+hKYEFiwO8xagL8AQ==}
engines: {node: '>=18.0.0'}
+ '@standard-schema/utils@0.3.0':
+ resolution: {integrity: sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==}
+
'@svgr/babel-plugin-add-jsx-attribute@8.0.0':
resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==}
engines: {node: '>=14'}
@@ -4658,6 +5127,9 @@ packages:
resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==}
engines: {node: '>=10.13.0'}
+ '@ts-morph/common@0.19.0':
+ resolution: {integrity: sha512-Unz/WHmd4pGax91rdIKWi51wnVUW11QttMEPpBiBgIewnc9UQIX7UDLxr5vRlqeByXCwhkF6VabSsI0raWcyAQ==}
+
'@tsconfig/node10@1.0.11':
resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==}
@@ -4703,6 +5175,9 @@ packages:
'@types/busboy@1.5.4':
resolution: {integrity: sha512-kG7WrUuAKK0NoyxfQHsVE6j1m01s6kMma64E+OZenQABMQyTJop1DumUWcLwAQ2JzpefU7PDYoRDKl8uZosFjw==}
+ '@types/caseless@0.12.5':
+ resolution: {integrity: sha512-hWtVTC2q7hc7xZ/RLbxapMvDMgUnDvKvMOpKal4DrMyfGBUfB1oKaZlIRr6mJL+If3bAP6sV/QneGzF6tJjZDg==}
+
'@types/connect-history-api-fallback@1.5.4':
resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==}
@@ -4814,6 +5289,12 @@ packages:
'@types/node@22.13.2':
resolution: {integrity: sha512-Z+r8y3XL9ZpI2EY52YYygAFmo2/oWfNSj4BCpAXE2McAexDk8VcnBMGC9Djn9gTKt4d2T/hhXqmPzo4hfIXtTg==}
+ '@types/nodemailer-sendgrid@1.0.3':
+ resolution: {integrity: sha512-UpLLUyrXjcs8PIwhfY0/CqXAoJ5CcDNUs6hia9QT9+kcotCFK6siVC5dHUGpTAsodwteX2JoiQ3Na7ZbDkijgw==}
+
+ '@types/nodemailer@6.4.17':
+ resolution: {integrity: sha512-I9CCaIp6DTldEg7vyUTZi8+9Vo0hi1/T8gv3C89yk1rSAAzoKQ8H8ki/jBYJSFoH/BisgLP8tkZMlQ91CIquww==}
+
'@types/npm-whoami@1.1.2':
resolution: {integrity: sha512-VDsGWTBHn0lR86lnoZk/O6a0d01Vbw+aEXmwrw72xJPOvbMAiOIKYDjQqqAH/RICARGGGhW3gIOUeR+X2Vs4vQ==}
@@ -4843,6 +5324,9 @@ packages:
'@types/react@19.0.0':
resolution: {integrity: sha512-MY3oPudxvMYyesqs/kW1Bh8y9VqSmf+tzqw3ae8a9DZW68pUe3zAdHeI1jc6iAysuRdACnVknHP8AhwD4/dxtg==}
+ '@types/request@2.48.12':
+ resolution: {integrity: sha512-G3sY+NpsA9jnwm0ixhAFQSJ3Q9JkpLZpJbI3GMv0mIAT0y3mRabYeINzal5WOChIiaTEGQYlHOKgkaM9EisWHw==}
+
'@types/retry@0.12.2':
resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==}
@@ -5309,6 +5793,10 @@ packages:
resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==}
engines: {node: '>=12'}
+ ansi-styles@3.2.1:
+ resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
+ engines: {node: '>=4'}
+
ansi-styles@4.3.0:
resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
engines: {node: '>=8'}
@@ -5347,6 +5835,10 @@ 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==}
@@ -5416,6 +5908,10 @@ packages:
ast-types-flow@0.0.8:
resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==}
+ ast-types@0.16.1:
+ resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==}
+ engines: {node: '>=4'}
+
astring@1.9.0:
resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==}
hasBin: true
@@ -5590,6 +6086,9 @@ packages:
bl@4.1.0:
resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
+ bl@5.1.0:
+ resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==}
+
body-parser@1.20.3:
resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==}
engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
@@ -5744,6 +6243,10 @@ packages:
resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==}
engines: {node: '>=4'}
+ chalk@2.4.2:
+ resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
+ engines: {node: '>=4'}
+
chalk@3.0.0:
resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==}
engines: {node: '>=8'}
@@ -5808,6 +6311,9 @@ packages:
cjs-module-lexer@1.4.3:
resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==}
+ class-variance-authority@0.7.0:
+ resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==}
+
classnames@2.5.1:
resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==}
@@ -5819,6 +6325,10 @@ packages:
resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==}
engines: {node: '>=8'}
+ cli-cursor@4.0.0:
+ resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
cli-spinners@2.6.1:
resolution: {integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==}
engines: {node: '>=6'}
@@ -5850,6 +6360,10 @@ packages:
resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==}
engines: {node: '>=0.8'}
+ clsx@2.0.0:
+ resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==}
+ engines: {node: '>=6'}
+
clsx@2.1.1:
resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
engines: {node: '>=6'}
@@ -5858,13 +6372,22 @@ packages:
resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==}
engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'}
+ code-block-writer@12.0.0:
+ resolution: {integrity: sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==}
+
collect-v8-coverage@1.0.2:
resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==}
+ color-convert@1.9.3:
+ resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
+
color-convert@2.0.1:
resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
engines: {node: '>=7.0.0'}
+ color-name@1.1.3:
+ resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
+
color-name@1.1.4:
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
@@ -5892,6 +6415,10 @@ packages:
comma-separated-tokens@2.0.3:
resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
+ commander@10.0.1:
+ resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==}
+ engines: {node: '>=14'}
+
commander@2.20.3:
resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
@@ -5935,6 +6462,11 @@ packages:
concat-map@0.0.1:
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+ concurrently@9.1.2:
+ resolution: {integrity: sha512-H9MWcoPsYddwbOGM6difjVwVZHl63nwMEwDJG/L7VGtuaJhb12h2caPG2tVPWs7emuYix252iGfqOyrz1GczTQ==}
+ engines: {node: '>=18'}
+ hasBin: true
+
confbox@0.1.8:
resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
@@ -6437,6 +6969,9 @@ packages:
resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==}
engines: {node: '>=8'}
+ detect-node-es@1.1.0:
+ resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==}
+
detect-node@2.1.0:
resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==}
@@ -7032,6 +7567,10 @@ packages:
resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
engines: {node: '>=10'}
+ execa@7.2.0:
+ resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==}
+ engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0}
+
execa@8.0.1:
resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==}
engines: {node: '>=16.17'}
@@ -7289,6 +7828,14 @@ packages:
resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==}
engines: {node: '>= 14.17'}
+ form-data@2.3.3:
+ resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==}
+ engines: {node: '>= 0.12'}
+
+ form-data@2.5.3:
+ resolution: {integrity: sha512-XHIrMD0NpDrNM/Ckf7XJiBbLl57KEhT3+i3yY+eWm+cqYZJQTZrKo8Y8AWKnuV5GT4scfuUGt9LzNoIx3dU1nQ==}
+ engines: {node: '>= 0.12'}
+
form-data@4.0.2:
resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==}
engines: {node: '>= 6'}
@@ -7389,6 +7936,14 @@ packages:
resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
engines: {node: '>= 0.4'}
+ get-nonce@1.0.1:
+ resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==}
+ engines: {node: '>=6'}
+
+ get-own-enumerable-keys@1.0.0:
+ resolution: {integrity: sha512-PKsK2FSrQCyxcGHsGrLDcK0lx+0Ke+6e8KFFozA9/fIQLhQzPaRvJFdcz7+Axg3jUH/Mq+NI4xa5u/UT2tQskA==}
+ engines: {node: '>=14.16'}
+
get-package-type@0.1.0:
resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==}
engines: {node: '>=8.0.0'}
@@ -7587,6 +8142,15 @@ packages:
engines: {node: '>=0.4.7'}
hasBin: true
+ har-schema@2.0.0:
+ resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==}
+ engines: {node: '>=4'}
+
+ har-validator@5.1.5:
+ resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==}
+ engines: {node: '>=6'}
+ deprecated: this library is no longer supported
+
harmony-reflect@1.6.2:
resolution: {integrity: sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==}
@@ -7594,6 +8158,10 @@ packages:
resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==}
engines: {node: '>= 0.4'}
+ has-flag@3.0.0:
+ resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
+ engines: {node: '>=4'}
+
has-flag@4.0.0:
resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
engines: {node: '>=8'}
@@ -7725,6 +8293,10 @@ packages:
engines: {node: '>=12'}
hasBin: true
+ http-signature@1.2.0:
+ resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==}
+ engines: {node: '>=0.8', npm: '>=1.3.7'}
+
http-signature@1.4.0:
resolution: {integrity: sha512-G5akfn7eKbpDN+8nPS/cb57YeA1jLTVxjpCj7tmm3QKPdyDy7T+qSC40e9ptydSWvkwjSXw1VbkpyEm39ukeAg==}
engines: {node: '>=0.10'}
@@ -7747,6 +8319,10 @@ packages:
resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==}
engines: {node: '>= 6'}
+ https-proxy-agent@6.2.1:
+ resolution: {integrity: sha512-ONsE3+yfZF2caH5+bJlcddtWqNI3Gvs5A38+ngvljxaBiRXRswym2c7yf8UAeFpRFKjFNHIFEHqR/OLAWJzyiA==}
+ engines: {node: '>= 14'}
+
https-proxy-agent@7.0.6:
resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==}
engines: {node: '>= 14'}
@@ -7755,6 +8331,10 @@ packages:
resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
engines: {node: '>=10.17.0'}
+ human-signals@4.3.1:
+ resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==}
+ engines: {node: '>=14.18.0'}
+
human-signals@5.0.0:
resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==}
engines: {node: '>=16.17.0'}
@@ -7787,6 +8367,9 @@ packages:
ieee754@1.2.1:
resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
+ ignore-by-default@1.0.1:
+ resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==}
+
ignore@5.3.2:
resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
engines: {node: '>= 4'}
@@ -7988,6 +8571,10 @@ packages:
resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==}
engines: {node: '>=8'}
+ is-interactive@2.0.0:
+ resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==}
+ engines: {node: '>=12'}
+
is-map@2.0.3:
resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
engines: {node: '>= 0.4'}
@@ -8008,6 +8595,10 @@ packages:
resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==}
engines: {node: '>=8'}
+ is-obj@3.0.0:
+ resolution: {integrity: sha512-IlsXEHOjtKhpN8r/tRFj2nDyTmHvcfNeu/nrRIcXE17ROeatXchkojffa1SpdqW4cr/Fj6QkEf/Gn4zf6KKvEQ==}
+ engines: {node: '>=12'}
+
is-plain-obj@1.1.0:
resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==}
engines: {node: '>=0.10.0'}
@@ -8041,6 +8632,10 @@ packages:
resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==}
engines: {node: '>= 0.4'}
+ is-regexp@3.1.0:
+ resolution: {integrity: sha512-rbku49cWloU5bSMI+zaRaXdQHXnthP6DZ/vLnfdSKyL4zUzuWnomtOEiZZOd+ioQ+avFo/qau3KPTc7Fjy1uPA==}
+ engines: {node: '>=12'}
+
is-set@2.0.3:
resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==}
engines: {node: '>= 0.4'}
@@ -8084,6 +8679,10 @@ packages:
resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==}
engines: {node: '>=10'}
+ is-unicode-supported@1.3.0:
+ resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==}
+ engines: {node: '>=12'}
+
is-url@1.2.4:
resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==}
@@ -8474,6 +9073,10 @@ packages:
resolution: {integrity: sha512-9Ag50tKhpTwS6r5wh3MJSAvpSof0UBr39Pto8OnzFT32Z/pAbxAsKHzyvsyMEHVslELvHyO/4/jaQELHk8wDcw==}
hasBin: true
+ jsprim@1.4.2:
+ resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==}
+ engines: {node: '>=0.6.0'}
+
jsprim@2.0.2:
resolution: {integrity: sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==}
engines: {'0': node >=0.6.0}
@@ -8690,6 +9293,10 @@ packages:
resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
engines: {node: '>=10'}
+ log-symbols@5.1.0:
+ resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==}
+ engines: {node: '>=12'}
+
log4js@6.9.1:
resolution: {integrity: sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==}
engines: {node: '>=8.0'}
@@ -8732,6 +9339,11 @@ packages:
resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==}
engines: {node: '>=12'}
+ lucide-react@0.395.0:
+ resolution: {integrity: sha512-6hzdNH5723A4FLaYZWpK50iyZH8iS2Jq5zuPRRotOFkhu6kxxJiebVdJ72tCR5XkiIeYFOU5NUawFZOac+VeYw==}
+ peerDependencies:
+ react: 19.0.0
+
luxon@3.5.0:
resolution: {integrity: sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==}
engines: {node: '>=12'}
@@ -9161,6 +9773,11 @@ packages:
engines: {node: '>=10'}
hasBin: true
+ mkdirp@2.1.6:
+ resolution: {integrity: sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==}
+ engines: {node: '>=10'}
+ hasBin: true
+
mlly@1.7.4:
resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==}
@@ -9286,6 +9903,12 @@ packages:
neo-async@2.6.2:
resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
+ next-themes@0.4.6:
+ resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==}
+ peerDependencies:
+ react: 19.0.0
+ react-dom: 19.0.0
+
next@15.1.7:
resolution: {integrity: sha512-GNeINPGS9c6OZKCvKypbL8GTsT5GhWPp4DM0fzkXJuXMilOO2EeFxuAY6JZbtk6XIl6Ws10ag3xRINDjSO5+wg==}
engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0}
@@ -9366,6 +9989,22 @@ packages:
nodeify-ts@1.0.6:
resolution: {integrity: sha512-jq+8sqVG1aLqy5maMTceL8NUJ1CvarWztlxvrYh3G0aao9BsVeoVmVedUnrUSBLetP7oLIAJrPrw4+iIo7v3GA==}
+ nodemailer-sendgrid@1.0.3:
+ resolution: {integrity: sha512-To/veO2M4evjtv1XrY7BUgE+LDypgs/FBx4wOHb2UNTpvZhiARtvMaBI0685Yxkho0lIPJc4jS0cUE7v+XGNgg==}
+
+ nodemailer@6.10.0:
+ resolution: {integrity: sha512-SQ3wZCExjeSatLE/HBaXS5vqUOQk6GtBdIIKxiFdmm01mOQZX/POJkO3SUX1wDiYcwUOJwT23scFSC9fY2H8IA==}
+ engines: {node: '>=6.0.0'}
+
+ nodemailer@6.9.16:
+ resolution: {integrity: sha512-psAuZdTIRN08HKVd/E8ObdV6NO7NTBY3KsC30F7M4H1OnmLCUNaS56FpYxyb26zWLSyYF9Ozch9KYHhHegsiOQ==}
+ engines: {node: '>=6.0.0'}
+
+ nodemon@3.1.9:
+ resolution: {integrity: sha512-hdr1oIb2p6ZSxu3PB2JWWYS7ZQ0qvaZsc3hK8DR8f02kRzc8rjYmxAIvdz+aYC+8F2IjNaB7HMcSDg8nQpJxyg==}
+ engines: {node: '>=10'}
+ hasBin: true
+
normalize-package-data@5.0.0:
resolution: {integrity: sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
@@ -9440,6 +10079,9 @@ packages:
'@swc/core':
optional: true
+ oauth-sign@0.9.0:
+ resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==}
+
object-assign@4.1.1:
resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
engines: {node: '>=0.10.0'}
@@ -9535,6 +10177,10 @@ packages:
resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==}
engines: {node: '>=10'}
+ ora@6.3.1:
+ resolution: {integrity: sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
outdent@0.8.0:
resolution: {integrity: sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==}
@@ -9631,6 +10277,9 @@ packages:
resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
engines: {node: '>= 0.8'}
+ path-browserify@1.0.1:
+ resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
+
path-exists@4.0.0:
resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
engines: {node: '>=8'}
@@ -10255,6 +10904,9 @@ packages:
psl@1.15.0:
resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==}
+ pstree.remy@1.1.8:
+ resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==}
+
pump@2.0.1:
resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==}
@@ -10286,6 +10938,10 @@ packages:
resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==}
engines: {node: '>=0.6'}
+ qs@6.5.3:
+ resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==}
+ engines: {node: '>=0.6'}
+
quansync@0.2.8:
resolution: {integrity: sha512-4+saucphJMazjt7iOM27mbFCk+D9dd/zmgMDCzRZ8MEoBfYp7lAvoN38et/phRQF6wOPMy/OROBGgoWeSKyluA==}
@@ -10357,6 +11013,12 @@ packages:
peerDependencies:
react: 19.0.0
+ react-hook-form@7.54.2:
+ resolution: {integrity: sha512-eHpAUgUjWbZocoQYUHposymRb4ZP6d0uwUnooL2uOybA9/3tPUvoAKqEWK1WaSiTxxOfTpffNZP7QwlnM3/gEg==}
+ engines: {node: '>=18.0.0'}
+ peerDependencies:
+ react: 19.0.0
+
react-image-crop@10.1.8:
resolution: {integrity: sha512-4rb8XtXNx7ZaOZarKKnckgz4xLMvds/YrU6mpJfGhGAsy2Mg4mIw1x+DCCGngVGq2soTBVVOxx2s/C6mTX9+pA==}
peerDependencies:
@@ -10375,6 +11037,26 @@ packages:
resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==}
engines: {node: '>=0.10.0'}
+ react-remove-scroll-bar@2.3.8:
+ resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': '*'
+ react: 19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ react-remove-scroll@2.6.3:
+ resolution: {integrity: sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': '*'
+ react: 19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
react-router-dom@6.11.2:
resolution: {integrity: sha512-JNbKtAeh1VSJQnH6RvBDNhxNwemRj7KxCzc5jb7zvDSKRnPWIFj9pO+eXqjM69gQJ0r46hSz1x4l9y0651DKWw==}
engines: {node: '>=14'}
@@ -10407,6 +11089,16 @@ packages:
react: 19.0.0
react-dom: 19.0.0
+ react-style-singleton@2.2.3:
+ resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': '*'
+ react: 19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
react-transition-group@4.4.5:
resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==}
peerDependencies:
@@ -10447,6 +11139,10 @@ packages:
resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==}
engines: {node: '>= 12.13.0'}
+ recast@0.23.11:
+ resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==}
+ engines: {node: '>= 4'}
+
redent@3.0.0:
resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==}
engines: {node: '>=8'}
@@ -10557,6 +11253,11 @@ packages:
engines: {node: '>=10'}
hasBin: true
+ request@2.88.2:
+ resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==}
+ engines: {node: '>= 6'}
+ deprecated: request has been deprecated, see https://github.com/request/request/issues/3142
+
require-directory@2.1.1:
resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
engines: {node: '>=0.10.0'}
@@ -10618,6 +11319,10 @@ packages:
resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==}
engines: {node: '>=8'}
+ restore-cursor@4.0.0:
+ resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
retry@0.12.0:
resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==}
engines: {node: '>= 4'}
@@ -10828,6 +11533,10 @@ packages:
setprototypeof@1.2.0:
resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
+ shadcn@2.3.0:
+ resolution: {integrity: sha512-Q/ra8/r2wb5W0DX0LKuPpsT6/0vtgwW/DR9uunJ6/3lXMOBo2UyUeCQ2m9/XAlALHhyGnzHngf8s8NrW1kcg5Q==}
+ hasBin: true
+
shallow-clone@3.0.1:
resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==}
engines: {node: '>=8'}
@@ -10896,6 +11605,10 @@ packages:
simple-swizzle@0.2.2:
resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==}
+ simple-update-notifier@2.0.0:
+ resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==}
+ engines: {node: '>=10'}
+
simple-wcswidth@1.0.1:
resolution: {integrity: sha512-xMO/8eNREtaROt7tJvWJqHBDTMFN4eiQ5I4JRMuilwfnFcV5W9u7RUkueNkdw0jPqGMX36iCywelS5yilTuOxg==}
@@ -10938,6 +11651,12 @@ packages:
react: 19.0.0
react-dom: 19.0.0
+ sonner@2.0.1:
+ resolution: {integrity: sha512-FRBphaehZ5tLdLcQ8g2WOIRE+Y7BCfWi5Zyd8bCvBjiW8TxxAyoWZIxS661Yz6TGPqFQ4VLzOF89WEYhfynSFQ==}
+ peerDependencies:
+ react: 19.0.0
+ react-dom: 19.0.0
+
sort-keys-length@1.0.1:
resolution: {integrity: sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==}
engines: {node: '>=0.10.0'}
@@ -11048,6 +11767,10 @@ packages:
std-env@3.8.1:
resolution: {integrity: sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==}
+ stdin-discarder@0.1.0:
+ resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
steno@0.4.4:
resolution: {integrity: sha512-EEHMVYHNXFHfGtgjNITnka0aHhiAlo93F7z2/Pwd+g0teG9CnM3JIINM7hVVB5/rhw9voufD7Wukwgtw2uqh6w==}
@@ -11121,6 +11844,10 @@ packages:
stringify-entities@4.0.4:
resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==}
+ stringify-object@5.0.0:
+ resolution: {integrity: sha512-zaJYxz2FtcMb4f+g60KsRNFOpVMUyuJgA51Zi5Z1DOTC3S59+OQiVOzE9GZt0x72uBGWKsQIuBKeF9iusmKFsg==}
+ engines: {node: '>=14.16'}
+
strip-ansi@6.0.1:
resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
engines: {node: '>=8'}
@@ -11230,6 +11957,10 @@ packages:
resolution: {integrity: sha512-qlsr7fIC0lSddmA3tzojvzubYxvlGtzumcdHgPwbFWMISQwL22MhM2Y3LNt+6w9Yyx7559VW5ab70dgphm8qQA==}
engines: {node: '>=14.18.0'}
+ supports-color@5.5.0:
+ resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
+ engines: {node: '>=4'}
+
supports-color@7.2.0:
resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
engines: {node: '>=8'}
@@ -11260,6 +11991,9 @@ packages:
tabbable@6.2.0:
resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==}
+ tailwind-merge@2.5.4:
+ resolution: {integrity: sha512-0q8cfZHMu9nuYP/b5Shb7Y7Sh1B7Nnl5GqNr1U+n2p6+mybvRtayrQ+0042Z5byvTA8ihjlP8Odo8/VnHbZu4Q==}
+
tailwindcss-animate@1.0.7:
resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==}
peerDependencies:
@@ -11425,6 +12159,14 @@ packages:
resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
engines: {node: '>=6'}
+ touch@3.1.1:
+ resolution: {integrity: sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==}
+ hasBin: true
+
+ tough-cookie@2.5.0:
+ resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==}
+ engines: {node: '>=0.8'}
+
tough-cookie@4.1.4:
resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==}
engines: {node: '>=6'}
@@ -11511,6 +12253,9 @@ packages:
typescript: '*'
webpack: ^5.0.0
+ ts-morph@18.0.0:
+ resolution: {integrity: sha512-Kg5u0mk19PIIe4islUI/HWRvm9bC1lHejK4S0oh1zaZ77TMZAEmQC0sHQYiu2RgCQFZKXz1fMVi/7nOOeirznA==}
+
ts-node@10.9.1:
resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==}
hasBin: true
@@ -11661,6 +12406,9 @@ packages:
unbzip2-stream@1.4.3:
resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==}
+ undefsafe@2.0.5:
+ resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==}
+
undici-types@6.20.0:
resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==}
@@ -11800,6 +12548,16 @@ packages:
urlpattern-polyfill@10.0.0:
resolution: {integrity: sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==}
+ use-callback-ref@1.3.3:
+ resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': '*'
+ react: 19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
use-context-selector@2.0.0:
resolution: {integrity: sha512-owfuSmUNd3eNp3J9CdDl0kMgfidV+MkDvHPpvthN5ThqM+ibMccNE0k+Iq7TWC6JPFvGZqanqiGCuQx6DyV24g==}
peerDependencies:
@@ -11815,6 +12573,16 @@ packages:
'@types/react':
optional: true
+ use-sidecar@1.1.3:
+ resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': '*'
+ react: 19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
utf8-byte-length@1.0.5:
resolution: {integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==}
@@ -11832,6 +12600,11 @@ packages:
resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==}
hasBin: true
+ uuid@3.4.0:
+ resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==}
+ deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.
+ hasBin: true
+
uuid@8.0.0:
resolution: {integrity: sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==}
hasBin: true
@@ -12316,6 +13089,8 @@ snapshots:
'@jridgewell/gen-mapping': 0.3.8
'@jridgewell/trace-mapping': 0.3.25
+ '@antfu/ni@0.21.12': {}
+
'@apidevtools/json-schema-ref-parser@11.9.3':
dependencies:
'@jsdevtools/ono': 7.1.3
@@ -12838,7 +13613,7 @@ snapshots:
'@babel/traverse': 7.26.10
'@babel/types': 7.26.10
convert-source-map: 2.0.0
- debug: 4.4.0
+ debug: 4.4.0(supports-color@5.5.0)
gensync: 1.0.0-beta.2
json5: 2.2.3
semver: 6.3.1
@@ -12890,7 +13665,7 @@ snapshots:
'@babel/core': 7.26.10
'@babel/helper-compilation-targets': 7.26.5
'@babel/helper-plugin-utils': 7.26.5
- debug: 4.4.0
+ debug: 4.4.0(supports-color@5.5.0)
lodash.debounce: 4.0.8
resolve: 1.22.10
transitivePeerDependencies:
@@ -13630,7 +14405,7 @@ snapshots:
'@babel/parser': 7.26.10
'@babel/template': 7.26.9
'@babel/types': 7.26.10
- debug: 4.4.0
+ debug: 4.4.0(supports-color@5.5.0)
globals: 11.12.0
transitivePeerDependencies:
- supports-color
@@ -14410,7 +15185,7 @@ snapshots:
'@eslint/config-array@0.19.2':
dependencies:
'@eslint/object-schema': 2.1.6
- debug: 4.4.0
+ debug: 4.4.0(supports-color@5.5.0)
minimatch: 3.1.2
transitivePeerDependencies:
- supports-color
@@ -14426,7 +15201,7 @@ snapshots:
'@eslint/eslintrc@2.1.4':
dependencies:
ajv: 6.12.6
- debug: 4.4.0
+ debug: 4.4.0(supports-color@5.5.0)
espree: 9.6.1
globals: 13.24.0
ignore: 5.3.2
@@ -14440,7 +15215,7 @@ snapshots:
'@eslint/eslintrc@3.3.0':
dependencies:
ajv: 6.12.6
- debug: 4.4.0
+ debug: 4.4.0(supports-color@5.5.0)
espree: 10.3.0
globals: 14.0.0
ignore: 5.3.2
@@ -14707,6 +15482,11 @@ snapshots:
dependencies:
hono: 4.7.4
+ '@hookform/resolvers@4.1.3(react-hook-form@7.54.2(react@19.0.0))':
+ dependencies:
+ '@standard-schema/utils': 0.3.0
+ react-hook-form: 7.54.2(react@19.0.0)
+
'@humanfs/core@0.19.1': {}
'@humanfs/node@0.16.6':
@@ -15038,7 +15818,7 @@ snapshots:
'@kwsites/file-exists@1.1.1':
dependencies:
- debug: 4.4.0
+ debug: 4.4.0(supports-color@5.5.0)
transitivePeerDependencies:
- supports-color
@@ -16617,6 +17397,11 @@ snapshots:
- sql.js
- sqlite3
+ '@payloadcms/email-nodemailer@3.28.1(payload@3.28.1(graphql@16.10.0)(typescript@5.7.3))':
+ dependencies:
+ nodemailer: 6.9.16
+ payload: 3.28.1(graphql@16.10.0)(typescript@5.7.3)
+
'@payloadcms/graphql@3.28.1(graphql@16.10.0)(payload@3.28.1(graphql@16.10.0)(typescript@5.7.3))(typescript@5.7.3)':
dependencies:
graphql: 16.10.0
@@ -16671,6 +17456,20 @@ snapshots:
- supports-color
- typescript
+ '@payloadcms/plugin-form-builder@3.28.1(@types/react@19.0.0)(monaco-editor@0.52.2)(next@15.1.7(@babel/core@7.26.10)(@playwright/test@1.51.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(payload@3.28.1(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)':
+ dependencies:
+ '@payloadcms/ui': 3.28.1(@types/react@19.0.0)(monaco-editor@0.52.2)(next@15.1.7(@babel/core@7.26.10)(@playwright/test@1.51.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(payload@3.28.1(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)
+ escape-html: 1.0.3
+ payload: 3.28.1(graphql@16.10.0)(typescript@5.7.3)
+ react: 19.0.0
+ react-dom: 19.0.0(react@19.0.0)
+ transitivePeerDependencies:
+ - '@types/react'
+ - monaco-editor
+ - next
+ - supports-color
+ - typescript
+
'@payloadcms/plugin-multi-tenant@3.28.1(@payloadcms/ui@3.28.1(@types/react@19.0.0)(monaco-editor@0.52.2)(next@15.1.7(@babel/core@7.26.10)(@playwright/test@1.51.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(payload@3.28.1(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3))(next@15.1.7(@babel/core@7.26.10)(@playwright/test@1.51.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(payload@3.28.1(graphql@16.10.0)(typescript@5.7.3))':
dependencies:
'@payloadcms/ui': 3.28.1(@types/react@19.0.0)(monaco-editor@0.52.2)(next@15.1.7(@babel/core@7.26.10)(@playwright/test@1.51.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1))(payload@3.28.1(graphql@16.10.0)(typescript@5.7.3))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(typescript@5.7.3)
@@ -16802,20 +17601,381 @@ snapshots:
'@pmmmwh/react-refresh-webpack-plugin@0.5.15(react-refresh@0.14.2)(type-fest@4.37.0)(webpack-dev-server@5.2.0(webpack@5.98.0(@swc/core@1.10.18(@swc/helpers@0.5.15))(esbuild@0.19.12)))(webpack@5.98.0(@swc/core@1.10.18(@swc/helpers@0.5.15))(esbuild@0.19.12))':
dependencies:
- ansi-html: 0.0.9
- core-js-pure: 3.41.0
- error-stack-parser: 2.1.4
- html-entities: 2.5.2
- loader-utils: 2.0.4
- react-refresh: 0.14.2
- schema-utils: 4.3.0
- source-map: 0.7.4
- webpack: 5.98.0(@swc/core@1.10.18(@swc/helpers@0.5.15))(esbuild@0.19.12)
+ ansi-html: 0.0.9
+ core-js-pure: 3.41.0
+ error-stack-parser: 2.1.4
+ html-entities: 2.5.2
+ loader-utils: 2.0.4
+ react-refresh: 0.14.2
+ schema-utils: 4.3.0
+ source-map: 0.7.4
+ webpack: 5.98.0(@swc/core@1.10.18(@swc/helpers@0.5.15))(esbuild@0.19.12)
+ optionalDependencies:
+ type-fest: 4.37.0
+ webpack-dev-server: 5.2.0(webpack@5.98.0(@swc/core@1.10.18(@swc/helpers@0.5.15))(esbuild@0.19.12))
+
+ '@polka/url@1.0.0-next.28': {}
+
+ '@radix-ui/number@1.1.0': {}
+
+ '@radix-ui/primitive@1.1.1': {}
+
+ '@radix-ui/react-arrow@1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+ dependencies:
+ '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(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.0
+ '@types/react-dom': 19.0.0
+
+ '@radix-ui/react-checkbox@1.1.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(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.0)(react@19.0.0)
+ '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(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.0)(react@19.0.0)
+ '@radix-ui/react-use-previous': 1.1.0(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-use-size': 1.1.0(@types/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.0
+ '@types/react-dom': 19.0.0
+
+ '@radix-ui/react-collection@1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(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.0)(react@19.0.0)
+ '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-slot': 1.1.2(@types/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.0
+ '@types/react-dom': 19.0.0
+
+ '@radix-ui/react-compose-refs@1.1.1(@types/react@19.0.0)(react@19.0.0)':
+ dependencies:
+ react: 19.0.0
+ optionalDependencies:
+ '@types/react': 19.0.0
+
+ '@radix-ui/react-context@1.1.1(@types/react@19.0.0)(react@19.0.0)':
+ dependencies:
+ react: 19.0.0
+ optionalDependencies:
+ '@types/react': 19.0.0
+
+ '@radix-ui/react-dialog@1.1.6(@types/react-dom@19.0.0)(@types/react@19.0.0)(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.0)(react@19.0.0)
+ '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-focus-guards': 1.1.1(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-focus-scope': 1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-id': 1.1.0(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-portal': 1.1.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-slot': 1.1.2(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.0)(react@19.0.0)
+ aria-hidden: 1.2.4
+ react: 19.0.0
+ react-dom: 19.0.0(react@19.0.0)
+ react-remove-scroll: 2.6.3(@types/react@19.0.0)(react@19.0.0)
+ optionalDependencies:
+ '@types/react': 19.0.0
+ '@types/react-dom': 19.0.0
+
+ '@radix-ui/react-direction@1.1.0(@types/react@19.0.0)(react@19.0.0)':
+ dependencies:
+ react: 19.0.0
+ optionalDependencies:
+ '@types/react': 19.0.0
+
+ '@radix-ui/react-dismissable-layer@1.1.5(@types/react-dom@19.0.0)(@types/react@19.0.0)(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.0)(react@19.0.0)
+ '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-use-escape-keydown': 1.1.0(@types/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.0
+ '@types/react-dom': 19.0.0
+
+ '@radix-ui/react-dropdown-menu@2.1.6(@types/react-dom@19.0.0)(@types/react@19.0.0)(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.0)(react@19.0.0)
+ '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-id': 1.1.0(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-menu': 2.1.6(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(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.0)(react@19.0.0)
+ react: 19.0.0
+ react-dom: 19.0.0(react@19.0.0)
+ optionalDependencies:
+ '@types/react': 19.0.0
+ '@types/react-dom': 19.0.0
+
+ '@radix-ui/react-focus-guards@1.1.1(@types/react@19.0.0)(react@19.0.0)':
+ dependencies:
+ react: 19.0.0
+ optionalDependencies:
+ '@types/react': 19.0.0
+
+ '@radix-ui/react-focus-scope@1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(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.0)(react@19.0.0)
+ '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/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.0
+ '@types/react-dom': 19.0.0
+
+ '@radix-ui/react-id@1.1.0(@types/react@19.0.0)(react@19.0.0)':
+ dependencies:
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.0)(react@19.0.0)
+ react: 19.0.0
+ optionalDependencies:
+ '@types/react': 19.0.0
+
+ '@radix-ui/react-label@2.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+ dependencies:
+ '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(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.0
+ '@types/react-dom': 19.0.0
+
+ '@radix-ui/react-menu@2.1.6(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.1
+ '@radix-ui/react-collection': 1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-direction': 1.1.0(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-focus-guards': 1.1.1(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-focus-scope': 1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-id': 1.1.0(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-popper': 1.2.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-portal': 1.1.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-roving-focus': 1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-slot': 1.1.2(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.0)(react@19.0.0)
+ aria-hidden: 1.2.4
+ react: 19.0.0
+ react-dom: 19.0.0(react@19.0.0)
+ react-remove-scroll: 2.6.3(@types/react@19.0.0)(react@19.0.0)
+ optionalDependencies:
+ '@types/react': 19.0.0
+ '@types/react-dom': 19.0.0
+
+ '@radix-ui/react-menubar@1.1.6(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.1
+ '@radix-ui/react-collection': 1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-direction': 1.1.0(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-id': 1.1.0(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-menu': 2.1.6(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-roving-focus': 1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(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.0)(react@19.0.0)
+ react: 19.0.0
+ react-dom: 19.0.0(react@19.0.0)
+ optionalDependencies:
+ '@types/react': 19.0.0
+ '@types/react-dom': 19.0.0
+
+ '@radix-ui/react-popper@1.2.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+ dependencies:
+ '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-arrow': 1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-use-rect': 1.1.0(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-use-size': 1.1.0(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/rect': 1.1.0
+ react: 19.0.0
+ react-dom: 19.0.0(react@19.0.0)
+ optionalDependencies:
+ '@types/react': 19.0.0
+ '@types/react-dom': 19.0.0
+
+ '@radix-ui/react-portal@1.1.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+ dependencies:
+ '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/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.0
+ '@types/react-dom': 19.0.0
+
+ '@radix-ui/react-presence@1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(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.0)(react@19.0.0)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/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.0
+ '@types/react-dom': 19.0.0
+
+ '@radix-ui/react-primitive@2.0.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+ dependencies:
+ '@radix-ui/react-slot': 1.1.2(@types/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.0
+ '@types/react-dom': 19.0.0
+
+ '@radix-ui/react-radio-group@1.2.3(@types/react-dom@19.0.0)(@types/react@19.0.0)(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.0)(react@19.0.0)
+ '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-direction': 1.1.0(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-presence': 1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-roving-focus': 1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(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.0)(react@19.0.0)
+ '@radix-ui/react-use-previous': 1.1.0(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-use-size': 1.1.0(@types/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.0
+ '@types/react-dom': 19.0.0
+
+ '@radix-ui/react-roving-focus@1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+ dependencies:
+ '@radix-ui/primitive': 1.1.1
+ '@radix-ui/react-collection': 1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-direction': 1.1.0(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-id': 1.1.0(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/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.0
+ '@types/react-dom': 19.0.0
+
+ '@radix-ui/react-select@2.1.6(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+ dependencies:
+ '@radix-ui/number': 1.1.0
+ '@radix-ui/primitive': 1.1.1
+ '@radix-ui/react-collection': 1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-context': 1.1.1(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-direction': 1.1.0(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-focus-guards': 1.1.1(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-focus-scope': 1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-id': 1.1.0(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-popper': 1.2.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-portal': 1.1.4(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@radix-ui/react-slot': 1.1.2(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-use-previous': 1.1.0(@types/react@19.0.0)(react@19.0.0)
+ '@radix-ui/react-visually-hidden': 1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ aria-hidden: 1.2.4
+ react: 19.0.0
+ react-dom: 19.0.0(react@19.0.0)
+ react-remove-scroll: 2.6.3(@types/react@19.0.0)(react@19.0.0)
+ optionalDependencies:
+ '@types/react': 19.0.0
+ '@types/react-dom': 19.0.0
+
+ '@radix-ui/react-slot@1.1.2(@types/react@19.0.0)(react@19.0.0)':
+ dependencies:
+ '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.0)(react@19.0.0)
+ react: 19.0.0
+ optionalDependencies:
+ '@types/react': 19.0.0
+
+ '@radix-ui/react-use-callback-ref@1.1.0(@types/react@19.0.0)(react@19.0.0)':
+ dependencies:
+ react: 19.0.0
+ optionalDependencies:
+ '@types/react': 19.0.0
+
+ '@radix-ui/react-use-controllable-state@1.1.0(@types/react@19.0.0)(react@19.0.0)':
+ dependencies:
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.0)(react@19.0.0)
+ react: 19.0.0
+ optionalDependencies:
+ '@types/react': 19.0.0
+
+ '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@19.0.0)(react@19.0.0)':
+ dependencies:
+ '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@19.0.0)(react@19.0.0)
+ react: 19.0.0
+ optionalDependencies:
+ '@types/react': 19.0.0
+
+ '@radix-ui/react-use-layout-effect@1.1.0(@types/react@19.0.0)(react@19.0.0)':
+ dependencies:
+ react: 19.0.0
+ optionalDependencies:
+ '@types/react': 19.0.0
+
+ '@radix-ui/react-use-previous@1.1.0(@types/react@19.0.0)(react@19.0.0)':
+ dependencies:
+ react: 19.0.0
+ optionalDependencies:
+ '@types/react': 19.0.0
+
+ '@radix-ui/react-use-rect@1.1.0(@types/react@19.0.0)(react@19.0.0)':
+ dependencies:
+ '@radix-ui/rect': 1.1.0
+ react: 19.0.0
+ optionalDependencies:
+ '@types/react': 19.0.0
+
+ '@radix-ui/react-use-size@1.1.0(@types/react@19.0.0)(react@19.0.0)':
+ dependencies:
+ '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@19.0.0)(react@19.0.0)
+ react: 19.0.0
+ optionalDependencies:
+ '@types/react': 19.0.0
+
+ '@radix-ui/react-visually-hidden@1.1.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+ dependencies:
+ '@radix-ui/react-primitive': 2.0.2(@types/react-dom@19.0.0)(@types/react@19.0.0)(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:
- type-fest: 4.37.0
- webpack-dev-server: 5.2.0(webpack@5.98.0(@swc/core@1.10.18(@swc/helpers@0.5.15))(esbuild@0.19.12))
+ '@types/react': 19.0.0
+ '@types/react-dom': 19.0.0
- '@polka/url@1.0.0-next.28': {}
+ '@radix-ui/rect@1.1.0': {}
'@react-aria/focus@3.20.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
dependencies:
@@ -17139,6 +18299,22 @@ snapshots:
'@sec-ant/readable-stream@0.4.1': {}
+ '@sendgrid/client@6.5.5':
+ dependencies:
+ '@sendgrid/helpers': 6.5.5
+ '@types/request': 2.48.12
+ request: 2.88.2
+
+ '@sendgrid/helpers@6.5.5':
+ dependencies:
+ chalk: 2.4.2
+ deepmerge: 4.3.1
+
+ '@sendgrid/mail@6.5.5':
+ dependencies:
+ '@sendgrid/client': 6.5.5
+ '@sendgrid/helpers': 6.5.5
+
'@sinclair/typebox@0.27.8': {}
'@sindresorhus/is@5.6.0': {}
@@ -17482,6 +18658,8 @@ snapshots:
'@smithy/types': 4.1.0
tslib: 2.8.1
+ '@standard-schema/utils@0.3.0': {}
+
'@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.26.10)':
dependencies:
'@babel/core': 7.26.10
@@ -17586,7 +18764,7 @@ snapshots:
'@swc-node/sourcemap-support': 0.5.1
'@swc/core': 1.10.18(@swc/helpers@0.5.15)
colorette: 2.0.20
- debug: 4.4.0
+ debug: 4.4.0(supports-color@5.5.0)
oxc-resolver: 5.0.0
pirates: 4.0.6
tslib: 2.8.1
@@ -17740,6 +18918,13 @@ snapshots:
'@trysound/sax@0.2.0': {}
+ '@ts-morph/common@0.19.0':
+ dependencies:
+ fast-glob: 3.3.3
+ minimatch: 7.4.6
+ mkdirp: 2.1.6
+ path-browserify: 1.0.1
+
'@tsconfig/node10@1.0.11': {}
'@tsconfig/node12@1.0.11': {}
@@ -17797,6 +18982,8 @@ snapshots:
dependencies:
'@types/node': 22.13.2
+ '@types/caseless@0.12.5': {}
+
'@types/connect-history-api-fallback@1.5.4':
dependencies:
'@types/express-serve-static-core': 5.0.6
@@ -17933,6 +19120,14 @@ snapshots:
dependencies:
undici-types: 6.20.0
+ '@types/nodemailer-sendgrid@1.0.3':
+ dependencies:
+ '@types/nodemailer': 6.4.17
+
+ '@types/nodemailer@6.4.17':
+ dependencies:
+ '@types/node': 22.13.2
+
'@types/npm-whoami@1.1.2': {}
'@types/parse-json@4.0.2': {}
@@ -17961,6 +19156,13 @@ snapshots:
dependencies:
csstype: 3.1.3
+ '@types/request@2.48.12':
+ dependencies:
+ '@types/caseless': 0.12.5
+ '@types/node': 22.13.2
+ '@types/tough-cookie': 4.0.5
+ form-data: 2.5.3
+
'@types/retry@0.12.2': {}
'@types/semver@7.5.8': {}
@@ -18053,7 +19255,7 @@ snapshots:
'@typescript-eslint/types': 8.26.1
'@typescript-eslint/typescript-estree': 8.26.1(typescript@5.7.3)
'@typescript-eslint/visitor-keys': 8.26.1
- debug: 4.4.0
+ debug: 4.4.0(supports-color@5.5.0)
eslint: 9.20.1(jiti@2.4.2)
typescript: 5.7.3
transitivePeerDependencies:
@@ -18068,7 +19270,7 @@ snapshots:
dependencies:
'@typescript-eslint/typescript-estree': 8.26.1(typescript@5.7.3)
'@typescript-eslint/utils': 8.26.1(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3)
- debug: 4.4.0
+ debug: 4.4.0(supports-color@5.5.0)
eslint: 9.20.1(jiti@2.4.2)
ts-api-utils: 2.0.1(typescript@5.7.3)
typescript: 5.7.3
@@ -18081,7 +19283,7 @@ snapshots:
dependencies:
'@typescript-eslint/types': 8.26.1
'@typescript-eslint/visitor-keys': 8.26.1
- debug: 4.4.0
+ debug: 4.4.0(supports-color@5.5.0)
fast-glob: 3.3.3
is-glob: 4.0.3
minimatch: 9.0.5
@@ -18336,7 +19538,7 @@ snapshots:
dependencies:
'@ampproject/remapping': 2.3.0
'@bcoe/v8-coverage': 0.2.3
- debug: 4.4.0
+ debug: 4.4.0(supports-color@5.5.0)
istanbul-lib-coverage: 3.2.2
istanbul-lib-report: 3.0.1
istanbul-lib-source-maps: 5.0.6
@@ -18615,7 +19817,7 @@ snapshots:
agent-base@6.0.2:
dependencies:
- debug: 4.4.0
+ debug: 4.4.0(supports-color@5.5.0)
transitivePeerDependencies:
- supports-color
@@ -18667,6 +19869,10 @@ snapshots:
ansi-regex@6.1.0: {}
+ ansi-styles@3.2.1:
+ dependencies:
+ color-convert: 1.9.3
+
ansi-styles@4.3.0:
dependencies:
color-convert: 2.0.1
@@ -18696,6 +19902,10 @@ snapshots:
argparse@2.0.1: {}
+ aria-hidden@1.2.4:
+ dependencies:
+ tslib: 2.8.1
+
aria-query@5.3.0:
dependencies:
dequal: 2.0.3
@@ -18786,6 +19996,10 @@ snapshots:
ast-types-flow@0.0.8: {}
+ ast-types@0.16.1:
+ dependencies:
+ tslib: 2.8.1
+
astring@1.9.0: {}
async-function@1.0.0: {}
@@ -18999,6 +20213,12 @@ snapshots:
inherits: 2.0.4
readable-stream: 3.6.2
+ bl@5.1.0:
+ dependencies:
+ buffer: 6.0.3
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+
body-parser@1.20.3:
dependencies:
bytes: 3.1.2
@@ -19186,6 +20406,12 @@ snapshots:
pathval: 1.1.1
type-detect: 4.1.0
+ chalk@2.4.2:
+ dependencies:
+ ansi-styles: 3.2.1
+ escape-string-regexp: 1.0.5
+ supports-color: 5.5.0
+
chalk@3.0.0:
dependencies:
ansi-styles: 4.3.0
@@ -19242,6 +20468,10 @@ snapshots:
cjs-module-lexer@1.4.3: {}
+ class-variance-authority@0.7.0:
+ dependencies:
+ clsx: 2.0.0
+
classnames@2.5.1: {}
clean-stack@2.2.0: {}
@@ -19250,6 +20480,10 @@ snapshots:
dependencies:
restore-cursor: 3.1.0
+ cli-cursor@4.0.0:
+ dependencies:
+ restore-cursor: 4.0.0
+
cli-spinners@2.6.1: {}
cli-spinners@2.9.2: {}
@@ -19280,16 +20514,26 @@ snapshots:
clone@1.0.4: {}
+ clsx@2.0.0: {}
+
clsx@2.1.1: {}
co@4.6.0: {}
+ code-block-writer@12.0.0: {}
+
collect-v8-coverage@1.0.2: {}
+ color-convert@1.9.3:
+ dependencies:
+ color-name: 1.1.3
+
color-convert@2.0.1:
dependencies:
color-name: 1.1.4
+ color-name@1.1.3: {}
+
color-name@1.1.4: {}
color-string@1.9.1:
@@ -19317,6 +20561,8 @@ snapshots:
comma-separated-tokens@2.0.3: {}
+ commander@10.0.1: {}
+
commander@2.20.3: {}
commander@4.1.1: {}
@@ -19366,6 +20612,16 @@ snapshots:
concat-map@0.0.1: {}
+ concurrently@9.1.2:
+ dependencies:
+ chalk: 4.1.2
+ lodash: 4.17.21
+ rxjs: 7.8.2
+ shell-quote: 1.8.2
+ supports-color: 8.1.1
+ tree-kill: 1.2.2
+ yargs: 17.7.2
+
confbox@0.1.8: {}
confbox@0.2.1: {}
@@ -19728,9 +20984,11 @@ snapshots:
dependencies:
ms: 2.1.3
- debug@4.4.0:
+ debug@4.4.0(supports-color@5.5.0):
dependencies:
ms: 2.1.3
+ optionalDependencies:
+ supports-color: 5.5.0
decimal.js@10.5.0: {}
@@ -19814,12 +21072,14 @@ snapshots:
detect-newline@3.1.0: {}
+ detect-node-es@1.1.0: {}
+
detect-node@2.1.0: {}
detect-port@1.6.1:
dependencies:
address: 1.2.2
- debug: 4.4.0
+ debug: 4.4.0(supports-color@5.5.0)
transitivePeerDependencies:
- supports-color
@@ -20135,7 +21395,7 @@ snapshots:
esbuild-register@3.6.0(esbuild@0.19.12):
dependencies:
- debug: 4.4.0
+ debug: 4.4.0(supports-color@5.5.0)
esbuild: 0.19.12
transitivePeerDependencies:
- supports-color
@@ -20350,7 +21610,7 @@ snapshots:
eslint-import-resolver-typescript@3.8.7(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.26.1(eslint@9.20.1(jiti@2.4.2))(typescript@5.7.3))(eslint@9.20.1(jiti@2.4.2)))(eslint@9.20.1(jiti@2.4.2)):
dependencies:
'@nolyfill/is-core-module': 1.0.39
- debug: 4.4.0
+ debug: 4.4.0(supports-color@5.5.0)
enhanced-resolve: 5.18.1
eslint: 9.20.1(jiti@2.4.2)
get-tsconfig: 4.10.0
@@ -20483,7 +21743,7 @@ snapshots:
ajv: 6.12.6
chalk: 4.1.2
cross-spawn: 7.0.6
- debug: 4.4.0
+ debug: 4.4.0(supports-color@5.5.0)
escape-string-regexp: 4.0.0
eslint-scope: 8.3.0
eslint-visitor-keys: 4.2.0
@@ -20602,6 +21862,18 @@ snapshots:
signal-exit: 3.0.7
strip-final-newline: 2.0.0
+ execa@7.2.0:
+ dependencies:
+ cross-spawn: 7.0.6
+ get-stream: 6.0.1
+ human-signals: 4.3.1
+ is-stream: 3.0.0
+ merge-stream: 2.0.0
+ npm-run-path: 5.3.0
+ onetime: 6.0.0
+ signal-exit: 3.0.7
+ strip-final-newline: 3.0.0
+
execa@8.0.1:
dependencies:
cross-spawn: 7.0.6
@@ -20942,7 +22214,7 @@ snapshots:
follow-redirects@1.15.9(debug@4.4.0):
optionalDependencies:
- debug: 4.4.0
+ debug: 4.4.0(supports-color@5.5.0)
for-each@0.3.5:
dependencies:
@@ -20974,6 +22246,20 @@ snapshots:
form-data-encoder@2.1.4: {}
+ form-data@2.3.3:
+ dependencies:
+ asynckit: 0.4.0
+ combined-stream: 1.0.8
+ mime-types: 2.1.35
+
+ form-data@2.5.3:
+ dependencies:
+ asynckit: 0.4.0
+ combined-stream: 1.0.8
+ es-set-tostringtag: 2.1.0
+ mime-types: 2.1.35
+ safe-buffer: 5.2.1
+
form-data@4.0.2:
dependencies:
asynckit: 0.4.0
@@ -21084,6 +22370,10 @@ snapshots:
hasown: 2.0.2
math-intrinsics: 1.1.0
+ get-nonce@1.0.1: {}
+
+ get-own-enumerable-keys@1.0.0: {}
+
get-package-type@0.1.0: {}
get-port@5.1.1: {}
@@ -21322,10 +22612,19 @@ snapshots:
optionalDependencies:
uglify-js: 3.19.3
+ har-schema@2.0.0: {}
+
+ har-validator@5.1.5:
+ dependencies:
+ ajv: 6.12.6
+ har-schema: 2.0.0
+
harmony-reflect@1.6.2: {}
has-bigints@1.1.0: {}
+ has-flag@3.0.0: {}
+
has-flag@4.0.0: {}
has-property-descriptors@1.0.2:
@@ -21449,14 +22748,14 @@ snapshots:
dependencies:
'@tootallnate/once': 2.0.0
agent-base: 6.0.2
- debug: 4.4.0
+ debug: 4.4.0(supports-color@5.5.0)
transitivePeerDependencies:
- supports-color
http-proxy-agent@7.0.2:
dependencies:
agent-base: 7.1.3
- debug: 4.4.0
+ debug: 4.4.0(supports-color@5.5.0)
transitivePeerDependencies:
- supports-color
@@ -21475,7 +22774,7 @@ snapshots:
http-proxy-middleware@3.0.3:
dependencies:
'@types/http-proxy': 1.17.16
- debug: 4.4.0
+ debug: 4.4.0(supports-color@5.5.0)
http-proxy: 1.18.1(debug@4.4.0)
is-glob: 4.0.3
is-plain-object: 5.0.0
@@ -21510,6 +22809,12 @@ snapshots:
- debug
- supports-color
+ http-signature@1.2.0:
+ dependencies:
+ assert-plus: 1.0.0
+ jsprim: 1.4.2
+ sshpk: 1.18.0
+
http-signature@1.4.0:
dependencies:
assert-plus: 1.0.0
@@ -21530,19 +22835,28 @@ snapshots:
https-proxy-agent@5.0.1:
dependencies:
agent-base: 6.0.2
- debug: 4.4.0
+ debug: 4.4.0(supports-color@5.5.0)
+ transitivePeerDependencies:
+ - supports-color
+
+ https-proxy-agent@6.2.1:
+ dependencies:
+ agent-base: 7.1.3
+ debug: 4.4.0(supports-color@5.5.0)
transitivePeerDependencies:
- supports-color
https-proxy-agent@7.0.6:
dependencies:
agent-base: 7.1.3
- debug: 4.4.0
+ debug: 4.4.0(supports-color@5.5.0)
transitivePeerDependencies:
- supports-color
human-signals@2.1.0: {}
+ human-signals@4.3.1: {}
+
human-signals@5.0.0: {}
hyperdyperid@1.2.0: {}
@@ -21567,6 +22881,8 @@ snapshots:
ieee754@1.2.1: {}
+ ignore-by-default@1.0.1: {}
+
ignore@5.3.2: {}
image-size@0.5.5:
@@ -21736,6 +23052,8 @@ snapshots:
is-interactive@1.0.0: {}
+ is-interactive@2.0.0: {}
+
is-map@2.0.3: {}
is-network-error@1.1.0: {}
@@ -21749,6 +23067,8 @@ snapshots:
is-obj@2.0.0: {}
+ is-obj@3.0.0: {}
+
is-plain-obj@1.1.0: {}
is-plain-obj@3.0.0: {}
@@ -21776,6 +23096,8 @@ snapshots:
has-tostringtag: 1.0.2
hasown: 2.0.2
+ is-regexp@3.1.0: {}
+
is-set@2.0.3: {}
is-shared-array-buffer@1.0.4:
@@ -21811,6 +23133,8 @@ snapshots:
is-unicode-supported@0.1.0: {}
+ is-unicode-supported@1.3.0: {}
+
is-url@1.2.4: {}
is-weakmap@2.0.2: {}
@@ -21898,7 +23222,7 @@ snapshots:
istanbul-lib-source-maps@4.0.1:
dependencies:
- debug: 4.4.0
+ debug: 4.4.0(supports-color@5.5.0)
istanbul-lib-coverage: 3.2.2
source-map: 0.6.1
transitivePeerDependencies:
@@ -21907,7 +23231,7 @@ snapshots:
istanbul-lib-source-maps@5.0.6:
dependencies:
'@jridgewell/trace-mapping': 0.3.25
- debug: 4.4.0
+ debug: 4.4.0(supports-color@5.5.0)
istanbul-lib-coverage: 3.2.2
transitivePeerDependencies:
- supports-color
@@ -22433,10 +23757,17 @@ snapshots:
lodash.isstring: 4.0.1
lodash.once: 4.1.1
ms: 2.1.3
- semver: 7.6.3
+ semver: 7.7.1
jsox@1.2.121: {}
+ jsprim@1.4.2:
+ dependencies:
+ assert-plus: 1.0.0
+ extsprintf: 1.3.0
+ json-schema: 0.4.0
+ verror: 1.10.0
+
jsprim@2.0.2:
dependencies:
assert-plus: 1.0.0
@@ -22499,7 +23830,7 @@ snapshots:
content-disposition: 0.5.4
content-type: 1.0.5
cookies: 0.9.1
- debug: 4.4.0
+ debug: 4.4.0(supports-color@5.5.0)
delegates: 1.0.0
depd: 2.0.0
destroy: 1.2.0
@@ -22527,7 +23858,7 @@ snapshots:
content-disposition: 0.5.4
content-type: 1.0.5
cookies: 0.9.1
- debug: 4.4.0
+ debug: 4.4.0(supports-color@5.5.0)
delegates: 1.0.0
depd: 2.0.0
destroy: 1.2.0
@@ -22686,10 +24017,15 @@ snapshots:
chalk: 4.1.2
is-unicode-supported: 0.1.0
+ log-symbols@5.1.0:
+ dependencies:
+ chalk: 5.4.1
+ is-unicode-supported: 1.3.0
+
log4js@6.9.1:
dependencies:
date-format: 4.0.14
- debug: 4.4.0
+ debug: 4.4.0(supports-color@5.5.0)
flatted: 3.3.3
rfdc: 1.4.1
streamroller: 3.1.5
@@ -22732,6 +24068,10 @@ snapshots:
lru-cache@7.18.3: {}
+ lucide-react@0.395.0(react@19.0.0):
+ dependencies:
+ react: 19.0.0
+
luxon@3.5.0: {}
lz-string@1.5.0: {}
@@ -23317,7 +24657,7 @@ snapshots:
micromark@3.2.0:
dependencies:
'@types/debug': 4.1.12
- debug: 4.4.0
+ debug: 4.4.0(supports-color@5.5.0)
decode-named-character-reference: 1.1.0
micromark-core-commonmark: 1.1.0
micromark-factory-space: 1.1.0
@@ -23339,7 +24679,7 @@ snapshots:
micromark@4.0.2:
dependencies:
'@types/debug': 4.1.12
- debug: 4.4.0
+ debug: 4.4.0(supports-color@5.5.0)
decode-named-character-reference: 1.1.0
devlop: 1.1.0
micromark-core-commonmark: 2.0.3
@@ -23453,6 +24793,8 @@ snapshots:
mkdirp@1.0.4: {}
+ mkdirp@2.1.6: {}
+
mlly@1.7.4:
dependencies:
acorn: 8.14.1
@@ -23510,7 +24852,7 @@ snapshots:
mquery@5.0.0:
dependencies:
- debug: 4.4.0
+ debug: 4.4.0(supports-color@5.5.0)
transitivePeerDependencies:
- supports-color
@@ -23565,6 +24907,11 @@ snapshots:
neo-async@2.6.2: {}
+ next-themes@0.4.6(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.7(@babel/core@7.26.10)(@playwright/test@1.51.0)(babel-plugin-macros@3.1.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(sass@1.85.1):
dependencies:
'@next/env': 15.1.7
@@ -23642,6 +24989,27 @@ snapshots:
nodeify-ts@1.0.6: {}
+ nodemailer-sendgrid@1.0.3:
+ dependencies:
+ '@sendgrid/mail': 6.5.5
+
+ nodemailer@6.10.0: {}
+
+ nodemailer@6.9.16: {}
+
+ nodemon@3.1.9:
+ dependencies:
+ chokidar: 3.6.0
+ debug: 4.4.0(supports-color@5.5.0)
+ ignore-by-default: 1.0.1
+ minimatch: 3.1.2
+ pstree.remy: 1.1.8
+ semver: 7.7.1
+ simple-update-notifier: 2.0.0
+ supports-color: 5.5.0
+ touch: 3.1.1
+ undefsafe: 2.0.5
+
normalize-package-data@5.0.0:
dependencies:
hosted-git-info: 6.1.3
@@ -23771,6 +25139,8 @@ snapshots:
transitivePeerDependencies:
- debug
+ oauth-sign@0.9.0: {}
+
object-assign@4.1.1: {}
object-hash@3.0.0: {}
@@ -23889,6 +25259,18 @@ snapshots:
strip-ansi: 6.0.1
wcwidth: 1.0.1
+ ora@6.3.1:
+ dependencies:
+ chalk: 5.4.1
+ cli-cursor: 4.0.0
+ cli-spinners: 2.9.2
+ is-interactive: 2.0.0
+ is-unicode-supported: 1.3.0
+ log-symbols: 5.1.0
+ stdin-discarder: 0.1.0
+ strip-ansi: 7.1.0
+ wcwidth: 1.0.1
+
outdent@0.8.0: {}
own-keys@1.0.1:
@@ -23994,6 +25376,8 @@ snapshots:
parseurl@1.3.3: {}
+ path-browserify@1.0.1: {}
+
path-exists@4.0.0: {}
path-exists@5.0.0: {}
@@ -24268,7 +25652,7 @@ snapshots:
portfinder@1.0.35:
dependencies:
async: 3.2.6
- debug: 4.4.0
+ debug: 4.4.0(supports-color@5.5.0)
transitivePeerDependencies:
- supports-color
@@ -24644,6 +26028,8 @@ snapshots:
dependencies:
punycode: 2.3.1
+ pstree.remy@1.1.8: {}
+
pump@2.0.1:
dependencies:
end-of-stream: 1.4.4
@@ -24676,6 +26062,8 @@ snapshots:
dependencies:
side-channel: 1.1.0
+ qs@6.5.3: {}
+
quansync@0.2.8: {}
querystring@0.2.0: {}
@@ -24750,6 +26138,10 @@ snapshots:
'@babel/runtime': 7.26.10
react: 19.0.0
+ react-hook-form@7.54.2(react@19.0.0):
+ dependencies:
+ react: 19.0.0
+
react-image-crop@10.1.8(react@19.0.0):
dependencies:
react: 19.0.0
@@ -24762,6 +26154,25 @@ snapshots:
react-refresh@0.14.2: {}
+ react-remove-scroll-bar@2.3.8(@types/react@19.0.0)(react@19.0.0):
+ dependencies:
+ react: 19.0.0
+ react-style-singleton: 2.2.3(@types/react@19.0.0)(react@19.0.0)
+ tslib: 2.8.1
+ optionalDependencies:
+ '@types/react': 19.0.0
+
+ react-remove-scroll@2.6.3(@types/react@19.0.0)(react@19.0.0):
+ dependencies:
+ react: 19.0.0
+ react-remove-scroll-bar: 2.3.8(@types/react@19.0.0)(react@19.0.0)
+ react-style-singleton: 2.2.3(@types/react@19.0.0)(react@19.0.0)
+ tslib: 2.8.1
+ use-callback-ref: 1.3.3(@types/react@19.0.0)(react@19.0.0)
+ use-sidecar: 1.1.3(@types/react@19.0.0)(react@19.0.0)
+ optionalDependencies:
+ '@types/react': 19.0.0
+
react-router-dom@6.11.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
dependencies:
'@remix-run/router': 1.6.2
@@ -24803,6 +26214,14 @@ snapshots:
- '@types/react'
- supports-color
+ react-style-singleton@2.2.3(@types/react@19.0.0)(react@19.0.0):
+ dependencies:
+ get-nonce: 1.0.1
+ react: 19.0.0
+ tslib: 2.8.1
+ optionalDependencies:
+ '@types/react': 19.0.0
+
react-transition-group@4.4.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
dependencies:
'@babel/runtime': 7.26.10
@@ -24852,6 +26271,14 @@ snapshots:
real-require@0.2.0: {}
+ recast@0.23.11:
+ dependencies:
+ ast-types: 0.16.1
+ esprima: 4.0.1
+ source-map: 0.6.1
+ tiny-invariant: 1.3.3
+ tslib: 2.8.1
+
redent@3.0.0:
dependencies:
indent-string: 4.0.0
@@ -24965,6 +26392,29 @@ snapshots:
glob: 8.1.0
yargs: 17.7.2
+ request@2.88.2:
+ dependencies:
+ aws-sign2: 0.7.0
+ aws4: 1.13.2
+ caseless: 0.12.0
+ combined-stream: 1.0.8
+ extend: 3.0.2
+ forever-agent: 0.6.1
+ form-data: 2.3.3
+ har-validator: 5.1.5
+ http-signature: 1.2.0
+ is-typedarray: 1.0.0
+ isstream: 0.1.2
+ json-stringify-safe: 5.0.1
+ mime-types: 2.1.35
+ oauth-sign: 0.9.0
+ performance-now: 2.1.0
+ qs: 6.5.3
+ safe-buffer: 5.2.1
+ tough-cookie: 2.5.0
+ tunnel-agent: 0.6.0
+ uuid: 3.4.0
+
require-directory@2.1.1: {}
require-from-string@2.0.2: {}
@@ -25019,6 +26469,11 @@ snapshots:
onetime: 5.1.2
signal-exit: 3.0.7
+ restore-cursor@4.0.0:
+ dependencies:
+ onetime: 5.1.2
+ signal-exit: 3.0.7
+
retry@0.12.0: {}
retry@0.13.1: {}
@@ -25258,6 +26713,34 @@ snapshots:
setprototypeof@1.2.0: {}
+ shadcn@2.3.0(typescript@5.7.3):
+ dependencies:
+ '@antfu/ni': 0.21.12
+ '@babel/core': 7.26.10
+ '@babel/parser': 7.26.10
+ '@babel/plugin-transform-typescript': 7.26.8(@babel/core@7.26.10)
+ commander: 10.0.1
+ cosmiconfig: 8.3.6(typescript@5.7.3)
+ deepmerge: 4.3.1
+ diff: 5.2.0
+ execa: 7.2.0
+ fast-glob: 3.3.3
+ fs-extra: 11.3.0
+ https-proxy-agent: 6.2.1
+ kleur: 4.1.5
+ node-fetch: 3.3.2
+ ora: 6.3.1
+ postcss: 8.5.2
+ prompts: 2.4.2
+ recast: 0.23.11
+ stringify-object: 5.0.0
+ ts-morph: 18.0.0
+ tsconfig-paths: 4.2.0
+ zod: 3.24.2
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+
shallow-clone@3.0.1:
dependencies:
kind-of: 6.0.3
@@ -25348,7 +26831,7 @@ snapshots:
dependencies:
'@kwsites/file-exists': 1.1.1
'@kwsites/promise-deferred': 1.1.1
- debug: 4.4.0
+ debug: 4.4.0(supports-color@5.5.0)
transitivePeerDependencies:
- supports-color
@@ -25356,6 +26839,10 @@ snapshots:
dependencies:
is-arrayish: 0.3.2
+ simple-update-notifier@2.0.0:
+ dependencies:
+ semver: 7.7.1
+
simple-wcswidth@1.0.1: {}
sirv@2.0.4:
@@ -25402,6 +26889,11 @@ snapshots:
react: 19.0.0
react-dom: 19.0.0(react@19.0.0)
+ sonner@2.0.1(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)
+
sort-keys-length@1.0.1:
dependencies:
sort-keys: 1.1.2
@@ -25463,7 +26955,7 @@ snapshots:
spdy-transport@3.0.0:
dependencies:
- debug: 4.4.0
+ debug: 4.4.0(supports-color@5.5.0)
detect-node: 2.1.0
hpack.js: 2.1.6
obuf: 1.1.2
@@ -25474,7 +26966,7 @@ snapshots:
spdy@4.0.2:
dependencies:
- debug: 4.4.0
+ debug: 4.4.0(supports-color@5.5.0)
handle-thing: 2.0.1
http-deceiver: 1.2.7
select-hose: 2.0.0
@@ -25520,6 +27012,10 @@ snapshots:
std-env@3.8.1: {}
+ stdin-discarder@0.1.0:
+ dependencies:
+ bl: 5.1.0
+
steno@0.4.4:
dependencies:
graceful-fs: 4.2.11
@@ -25536,7 +27032,7 @@ snapshots:
streamroller@3.1.5:
dependencies:
date-format: 4.0.14
- debug: 4.4.0
+ debug: 4.4.0(supports-color@5.5.0)
fs-extra: 8.1.0
transitivePeerDependencies:
- supports-color
@@ -25634,6 +27130,12 @@ snapshots:
character-entities-html4: 2.1.0
character-entities-legacy: 3.0.0
+ stringify-object@5.0.0:
+ dependencies:
+ get-own-enumerable-keys: 1.0.0
+ is-obj: 3.0.0
+ is-regexp: 3.1.0
+
strip-ansi@6.0.1:
dependencies:
ansi-regex: 5.0.1
@@ -25713,7 +27215,7 @@ snapshots:
stylus@0.64.0:
dependencies:
'@adobe/css-tools': 4.3.3
- debug: 4.4.0
+ debug: 4.4.0(supports-color@5.5.0)
glob: 10.4.5
sax: 1.4.1
source-map: 0.7.4
@@ -25734,7 +27236,7 @@ snapshots:
dependencies:
component-emitter: 1.3.1
cookiejar: 2.1.4
- debug: 4.4.0
+ debug: 4.4.0(supports-color@5.5.0)
fast-safe-stringify: 2.1.1
form-data: 4.0.2
formidable: 3.5.2
@@ -25751,6 +27253,10 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ supports-color@5.5.0:
+ dependencies:
+ has-flag: 3.0.0
+
supports-color@7.2.0:
dependencies:
has-flag: 4.0.0
@@ -25783,6 +27289,8 @@ snapshots:
tabbable@6.2.0: {}
+ tailwind-merge@2.5.4: {}
+
tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.2)(typescript@5.7.3))):
dependencies:
tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.2)(typescript@5.7.3))
@@ -25971,6 +27479,13 @@ snapshots:
totalist@3.0.1: {}
+ touch@3.1.1: {}
+
+ tough-cookie@2.5.0:
+ dependencies:
+ psl: 1.15.0
+ punycode: 2.3.1
+
tough-cookie@4.1.4:
dependencies:
psl: 1.15.0
@@ -26046,6 +27561,11 @@ snapshots:
typescript: 5.7.3
webpack: 5.98.0(@swc/core@1.10.18(@swc/helpers@0.5.15))(esbuild@0.19.12)
+ ts-morph@18.0.0:
+ dependencies:
+ '@ts-morph/common': 0.19.0
+ code-block-writer: 12.0.0
+
ts-node@10.9.1(@swc/core@1.10.18(@swc/helpers@0.5.15))(@types/node@22.13.2)(typescript@5.7.3):
dependencies:
'@cspotcode/source-map-support': 0.8.1
@@ -26220,6 +27740,8 @@ snapshots:
buffer: 5.7.1
through: 2.3.8
+ undefsafe@2.0.5: {}
+
undici-types@6.20.0: {}
undici@5.28.5:
@@ -26364,6 +27886,13 @@ snapshots:
urlpattern-polyfill@10.0.0: {}
+ use-callback-ref@1.3.3(@types/react@19.0.0)(react@19.0.0):
+ dependencies:
+ react: 19.0.0
+ tslib: 2.8.1
+ optionalDependencies:
+ '@types/react': 19.0.0
+
use-context-selector@2.0.0(react@19.0.0)(scheduler@0.25.0):
dependencies:
react: 19.0.0
@@ -26375,6 +27904,14 @@ snapshots:
optionalDependencies:
'@types/react': 19.0.0
+ use-sidecar@1.1.3(@types/react@19.0.0)(react@19.0.0):
+ dependencies:
+ detect-node-es: 1.1.0
+ react: 19.0.0
+ tslib: 2.8.1
+ optionalDependencies:
+ '@types/react': 19.0.0
+
utf8-byte-length@1.0.5: {}
util-deprecate@1.0.2: {}
@@ -26391,6 +27928,8 @@ snapshots:
uuid@10.0.0: {}
+ uuid@3.4.0: {}
+
uuid@8.0.0: {}
uuid@8.3.2: {}
@@ -26474,7 +28013,7 @@ snapshots:
clipanion: 4.0.0-rc.4(typanion@3.14.0)
compression: 1.7.5
cors: 2.8.5
- debug: 4.4.0
+ debug: 4.4.0(supports-color@5.5.0)
envinfo: 7.14.0
express: 4.21.1
express-rate-limit: 5.5.1
@@ -26524,7 +28063,7 @@ snapshots:
vite-node@1.6.1(@types/node@22.13.2)(less@4.1.3)(sass@1.85.1)(stylus@0.64.0)(terser@5.39.0):
dependencies:
cac: 6.7.14
- debug: 4.4.0
+ debug: 4.4.0(supports-color@5.5.0)
pathe: 1.1.2
picocolors: 1.1.1
vite: 5.4.14(@types/node@22.13.2)(less@4.1.3)(sass@1.85.1)(stylus@0.64.0)(terser@5.39.0)
@@ -26542,7 +28081,7 @@ snapshots:
vite-node@3.0.0-beta.2(@types/node@22.13.2)(less@4.1.3)(sass@1.85.1)(stylus@0.64.0)(terser@5.39.0):
dependencies:
cac: 6.7.14
- debug: 4.4.0
+ debug: 4.4.0(supports-color@5.5.0)
es-module-lexer: 1.6.0
pathe: 1.1.2
vite: 5.4.14(@types/node@22.13.2)(less@4.1.3)(sass@1.85.1)(stylus@0.64.0)(terser@5.39.0)
@@ -26579,7 +28118,7 @@ snapshots:
'@vitest/utils': 1.6.1
acorn-walk: 8.3.4
chai: 4.5.0
- debug: 4.4.0
+ debug: 4.4.0(supports-color@5.5.0)
execa: 8.0.1
local-pkg: 0.5.1
magic-string: 0.30.17
diff --git a/project.json b/project.json
index 4ce9b60ba..46fb31938 100644
--- a/project.json
+++ b/project.json
@@ -67,6 +67,30 @@
"description": "Generate a new TypeScript ESBuild package"
},
"command": "test -z '{args.name}' && echo Error: Argument --name required || pnpm nx g @nx/js:lib {args.name} --directory packages/{args.name} --importPath @codeware/{args.name} --dry-run={args.dry-run}"
+ },
+ "shadcn:info": {
+ "executor": "nx:run-commands",
+ "metadata": {
+ "description": "Print Shadcn information"
+ },
+ "options": {
+ "command": "pnpm shadcn info",
+ "env": {
+ "TS_NODE_PROJECT": "tsconfig.base.json"
+ }
+ }
+ },
+ "shadcn:add": {
+ "executor": "nx:run-commands",
+ "metadata": {
+ "description": "Generate a new Shadcn UI component"
+ },
+ "options": {
+ "command": "pnpm shadcn add",
+ "env": {
+ "TS_NODE_PROJECT": "tsconfig.base.json"
+ }
+ }
}
}
}
diff --git a/tsconfig.base.json b/tsconfig.base.json
index 197f1a667..e6c3c98e5 100644
--- a/tsconfig.base.json
+++ b/tsconfig.base.json
@@ -39,6 +39,7 @@
"@codeware/app-cms/util/definitions": [
"libs/app-cms/util/definitions/src/index.ts"
],
+ "@codeware/app-cms/util/email": ["libs/app-cms/util/email/src/index.ts"],
"@codeware/app-cms/util/env-schema": [
"libs/app-cms/util/env-schema/src/index.ts"
],
@@ -80,6 +81,8 @@
"@codeware/shared/ui/react-components": [
"libs/shared/ui/react-components/src/index.ts"
],
+ "@codeware/shared/ui/shadcn": ["libs/shared/ui/shadcn/src/index.ts"],
+ "@codeware/shared/ui/shadcn/*": ["libs/shared/ui/shadcn/src/lib/*"],
"@codeware/shared/util/node": ["libs/shared/util/node/src/index.ts"],
"@codeware/shared/util/payload-api": [
"libs/shared/util/payload-api/src/index.ts"