diff --git a/packages/ui/app/_components/DynamicSubNav.tsx b/packages/ui/app/_components/DynamicSubNav.tsx
index 16cd33c0d4..c53b8e811e 100644
--- a/packages/ui/app/_components/DynamicSubNav.tsx
+++ b/packages/ui/app/_components/DynamicSubNav.tsx
@@ -32,19 +32,16 @@ function DynamicSubNav() {
);
}
return (
- router.push('/points')}
- href="https://jumper.exchange/superfest/"
- target="_blank"
+ }`} absolute w-full z-20 top-full left-0 text-center text-sm font-medium `}
>
{clone()}
{clone()}
-
+
);
}
diff --git a/packages/ui/app/_components/dashboards/CollateralSwapPopup.tsx b/packages/ui/app/_components/dashboards/CollateralSwapPopup.tsx
index 29b3e6f2c8..333f02fd62 100644
--- a/packages/ui/app/_components/dashboards/CollateralSwapPopup.tsx
+++ b/packages/ui/app/_components/dashboards/CollateralSwapPopup.tsx
@@ -45,7 +45,6 @@ import type { MarketData } from '@ui/types/TokensDataMap';
import MaxDeposit from './MaxDeposit';
import SwapTo from './SwapTo';
-import { SlippageDropdown } from '../SlippageDropdown';
import { collateralSwapAbi } from '@ionicprotocol/sdk/src';
@@ -78,6 +77,30 @@ ChartJS.register(
Legend
);
+// Replace the SlippageDropdown import with a simpler dropdown implementation
+const SlippageSelector = ({
+ onSlippageChange
+}: {
+ onSlippageChange: (value: number) => void;
+}) => {
+ return (
+
+ SLIPPAGE TOLERANCE
+
+
+ );
+};
+
export default function CollateralSwapPopup({
swapRef,
toggler,
@@ -564,7 +587,7 @@ export default function CollateralSwapPopup({
-
+
diff --git a/packages/ui/components.json b/packages/ui/components.json
index 3cce526aeb..3ee972de93 100644
--- a/packages/ui/components.json
+++ b/packages/ui/components.json
@@ -13,4 +13,4 @@
"components": "@ui/components",
"utils": "@ui/lib/utils"
}
-}
\ No newline at end of file
+}
diff --git a/packages/ui/components/ui/calendar.tsx b/packages/ui/components/ui/calendar.tsx
new file mode 100644
index 0000000000..a09d62c5c2
--- /dev/null
+++ b/packages/ui/components/ui/calendar.tsx
@@ -0,0 +1,63 @@
+'use client';
+
+import * as React from 'react';
+
+import { ChevronLeft, ChevronRight } from 'lucide-react';
+import { DayPicker } from 'react-day-picker';
+
+import { buttonVariants } from '@ui/components/ui/button';
+import { cn } from '@ui/lib/utils';
+
+export type CalendarProps = React.ComponentProps
;
+
+function Calendar({
+ className,
+ classNames,
+ showOutsideDays = true,
+ ...props
+}: CalendarProps) {
+ return (
+ ,
+ IconRight: () =>
+ }}
+ {...props}
+ />
+ );
+}
+Calendar.displayName = 'Calendar';
+
+export { Calendar };
diff --git a/packages/ui/components/ui/card.tsx b/packages/ui/components/ui/card.tsx
new file mode 100644
index 0000000000..73e6df45b3
--- /dev/null
+++ b/packages/ui/components/ui/card.tsx
@@ -0,0 +1,90 @@
+import * as React from 'react';
+
+import { cn } from '@ui/lib/utils';
+
+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<
+ HTMLParagraphElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+));
+CardTitle.displayName = 'CardTitle';
+
+const CardDescription = React.forwardRef<
+ HTMLParagraphElement,
+ 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/packages/ui/components/ui/checkbox.tsx b/packages/ui/components/ui/checkbox.tsx
new file mode 100644
index 0000000000..3fc46881ff
--- /dev/null
+++ b/packages/ui/components/ui/checkbox.tsx
@@ -0,0 +1,31 @@
+'use client';
+
+import * as React from 'react';
+
+import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
+import { Check } from 'lucide-react';
+
+import { cn } from '@ui/lib/utils';
+
+const Checkbox = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+
+
+));
+Checkbox.displayName = CheckboxPrimitive.Root.displayName;
+
+export { Checkbox };
diff --git a/packages/ui/components/ui/dialog.tsx b/packages/ui/components/ui/dialog.tsx
new file mode 100644
index 0000000000..2f97eada37
--- /dev/null
+++ b/packages/ui/components/ui/dialog.tsx
@@ -0,0 +1,126 @@
+import * as React from 'react';
+
+import * as DialogPrimitive from '@radix-ui/react-dialog';
+import { X } from 'lucide-react';
+
+import { cn } from '@ui/lib/utils';
+
+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;
+
+interface DialogContentProps
+ extends React.ComponentPropsWithoutRef {
+ hideCloseButton?: boolean;
+}
+
+const DialogContent = React.forwardRef<
+ React.ElementRef,
+ DialogContentProps
+>(({ className, children, hideCloseButton = false, ...props }, ref) => (
+
+
+
+ {children}
+ {!hideCloseButton && (
+
+
+ Close
+
+ )}
+
+
+));
+DialogContent.displayName = DialogPrimitive.Content.displayName;
+
+const DialogHeader = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => (
+
+);
+DialogHeader.displayName = 'DialogHeader';
+
+const DialogTitle = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+DialogTitle.displayName = DialogPrimitive.Title.displayName;
+
+// Rest of the components remain unchanged
+const DialogFooter = ({
+ className,
+ ...props
+}: React.HTMLAttributes) => (
+
+);
+DialogFooter.displayName = 'DialogFooter';
+
+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/packages/ui/components/ui/dropdown-menu.tsx b/packages/ui/components/ui/dropdown-menu.tsx
new file mode 100644
index 0000000000..1d39fe8199
--- /dev/null
+++ b/packages/ui/components/ui/dropdown-menu.tsx
@@ -0,0 +1,201 @@
+'use client';
+
+import * as React from 'react';
+
+import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
+import { Check, ChevronRight, Circle } from 'lucide-react';
+
+import { cn } from '@ui/lib/utils';
+
+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/packages/ui/components/ui/input.tsx b/packages/ui/components/ui/input.tsx
new file mode 100644
index 0000000000..73df7ed8fa
--- /dev/null
+++ b/packages/ui/components/ui/input.tsx
@@ -0,0 +1,53 @@
+import * as React from 'react';
+
+import { cn } from '@ui/lib/utils';
+
+export interface InputProps
+ extends React.InputHTMLAttributes {}
+
+const Input = React.forwardRef(
+ ({ className, type, min, max, onChange, ...props }, ref) => {
+ const handleChange = React.useCallback(
+ (e: React.ChangeEvent) => {
+ if (type === 'number') {
+ const value = parseFloat(e.target.value);
+ if (!isNaN(value)) {
+ if (max != null) {
+ const maxValue = typeof max === 'string' ? parseFloat(max) : max;
+ if (value > maxValue) {
+ e.target.value = maxValue.toString();
+ }
+ }
+ if (min != null) {
+ const minValue = typeof min === 'string' ? parseFloat(min) : min;
+ if (value < minValue) {
+ e.target.value = minValue.toString();
+ }
+ }
+ }
+ }
+ onChange?.(e);
+ },
+ [type, min, max, onChange]
+ );
+
+ return (
+
+ );
+ }
+);
+
+Input.displayName = 'Input';
+
+export { Input };
diff --git a/packages/ui/components/ui/popover.tsx b/packages/ui/components/ui/popover.tsx
new file mode 100644
index 0000000000..b411f6f736
--- /dev/null
+++ b/packages/ui/components/ui/popover.tsx
@@ -0,0 +1,32 @@
+'use client';
+
+import * as React from 'react';
+
+import * as PopoverPrimitive from '@radix-ui/react-popover';
+
+import { cn } from '@ui/lib/utils';
+
+const Popover = PopoverPrimitive.Root;
+
+const PopoverTrigger = PopoverPrimitive.Trigger;
+
+const PopoverContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, align = 'center', sideOffset = 4, ...props }, ref) => (
+
+
+
+));
+PopoverContent.displayName = PopoverPrimitive.Content.displayName;
+
+export { Popover, PopoverTrigger, PopoverContent };
diff --git a/packages/ui/components/ui/popoverDialog.tsx b/packages/ui/components/ui/popoverDialog.tsx
new file mode 100644
index 0000000000..ce2ec03334
--- /dev/null
+++ b/packages/ui/components/ui/popoverDialog.tsx
@@ -0,0 +1,30 @@
+'use client';
+
+import * as React from 'react';
+
+import * as PopoverPrimitive from '@radix-ui/react-popover';
+
+import { cn } from '@ui/lib/utils';
+
+const Popover = PopoverPrimitive.Root;
+
+const PopoverTrigger = PopoverPrimitive.Trigger;
+
+const PopoverContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, align = 'center', sideOffset = 4, ...props }, ref) => (
+
+));
+PopoverContent.displayName = PopoverPrimitive.Content.displayName;
+
+export { Popover, PopoverTrigger, PopoverContent };
diff --git a/packages/ui/components/ui/progress.tsx b/packages/ui/components/ui/progress.tsx
new file mode 100644
index 0000000000..1a585ae9d4
--- /dev/null
+++ b/packages/ui/components/ui/progress.tsx
@@ -0,0 +1,29 @@
+'use client';
+
+import * as React from 'react';
+
+import * as ProgressPrimitive from '@radix-ui/react-progress';
+
+import { cn } from '@ui/lib/utils';
+
+const Progress = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, value, ...props }, ref) => (
+
+
+
+));
+Progress.displayName = ProgressPrimitive.Root.displayName;
+
+export { Progress };
diff --git a/packages/ui/components/ui/select.tsx b/packages/ui/components/ui/select.tsx
new file mode 100644
index 0000000000..e984b510e9
--- /dev/null
+++ b/packages/ui/components/ui/select.tsx
@@ -0,0 +1,161 @@
+'use client';
+
+import * as React from 'react';
+
+import * as SelectPrimitive from '@radix-ui/react-select';
+import { Check, ChevronDown, ChevronUp } from 'lucide-react';
+
+import { cn } from '@ui/lib/utils';
+
+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/packages/ui/components/ui/separator.tsx b/packages/ui/components/ui/separator.tsx
new file mode 100644
index 0000000000..82d54a8bff
--- /dev/null
+++ b/packages/ui/components/ui/separator.tsx
@@ -0,0 +1,32 @@
+'use client';
+
+import * as React from 'react';
+
+import * as SeparatorPrimitive from '@radix-ui/react-separator';
+
+import { cn } from '@ui/lib/utils';
+
+const Separator = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(
+ (
+ { className, orientation = 'horizontal', decorative = true, ...props },
+ ref
+ ) => (
+
+ )
+);
+Separator.displayName = SeparatorPrimitive.Root.displayName;
+
+export { Separator };
diff --git a/packages/ui/components/ui/slider.tsx b/packages/ui/components/ui/slider.tsx
new file mode 100644
index 0000000000..46f7c3cc7f
--- /dev/null
+++ b/packages/ui/components/ui/slider.tsx
@@ -0,0 +1,29 @@
+'use client';
+
+import * as React from 'react';
+
+import * as SliderPrimitive from '@radix-ui/react-slider';
+
+import { cn } from '@ui/lib/utils';
+
+const Slider = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+
+
+
+));
+Slider.displayName = SliderPrimitive.Root.displayName;
+
+export { Slider };
diff --git a/packages/ui/components/ui/switch.tsx b/packages/ui/components/ui/switch.tsx
new file mode 100644
index 0000000000..c1450f98f8
--- /dev/null
+++ b/packages/ui/components/ui/switch.tsx
@@ -0,0 +1,30 @@
+'use client';
+
+import * as React from 'react';
+
+import * as SwitchPrimitives from '@radix-ui/react-switch';
+
+import { cn } from '@ui/lib/utils';
+
+const Switch = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+));
+Switch.displayName = SwitchPrimitives.Root.displayName;
+
+export { Switch };
diff --git a/packages/ui/components/ui/table.tsx b/packages/ui/components/ui/table.tsx
new file mode 100644
index 0000000000..ebbdafdc01
--- /dev/null
+++ b/packages/ui/components/ui/table.tsx
@@ -0,0 +1,150 @@
+import * as React from 'react';
+
+import { cn } from '@ui/lib/utils';
+
+const TableContext = React.createContext<{ compact?: boolean }>({});
+
+const Table = React.forwardRef<
+ HTMLTableElement,
+ React.HTMLAttributes & { compact?: boolean }
+>(({ className, compact = false, ...props }, ref) => (
+
+
+
+));
+
+const TableHeader = React.forwardRef<
+ HTMLTableSectionElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+));
+TableHeader.displayName = 'TableHeader';
+
+const TableBody = React.forwardRef<
+ HTMLTableSectionElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => {
+ const { compact } = React.useContext(TableContext);
+
+ return (
+
+ );
+});
+TableBody.displayName = 'TableBody';
+
+const TableFooter = React.forwardRef<
+ HTMLTableSectionElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+));
+TableFooter.displayName = 'TableFooter';
+
+const TableRow = React.forwardRef<
+ HTMLTableRowElement,
+ React.HTMLAttributes & {
+ transparent?: boolean;
+ }
+>(({ className, transparent = false, ...props }, ref) => {
+ const { compact } = React.useContext(TableContext);
+
+ return (
+
+ );
+});
+
+const TableHead = React.forwardRef<
+ HTMLTableCellElement,
+ React.ThHTMLAttributes
+>(({ className, ...props }, ref) => (
+ |
+));
+TableHead.displayName = 'TableHead';
+
+const TableCell = React.forwardRef<
+ HTMLTableCellElement,
+ React.TdHTMLAttributes
+>(({ className, ...props }, ref) => {
+ const { compact } = React.useContext(TableContext);
+
+ return (
+ |
+ );
+});
+
+const TableCaption = React.forwardRef<
+ HTMLTableCaptionElement,
+ React.HTMLAttributes
+>(({ className, ...props }, ref) => (
+
+));
+TableCaption.displayName = 'TableCaption';
+
+export {
+ Table,
+ TableHeader,
+ TableBody,
+ TableFooter,
+ TableHead,
+ TableRow,
+ TableCell,
+ TableCaption
+};
diff --git a/packages/ui/components/ui/tabs.tsx b/packages/ui/components/ui/tabs.tsx
new file mode 100644
index 0000000000..97a291a48b
--- /dev/null
+++ b/packages/ui/components/ui/tabs.tsx
@@ -0,0 +1,56 @@
+'use client';
+
+import * as React from 'react';
+
+import * as TabsPrimitive from '@radix-ui/react-tabs';
+
+import { cn } from '@ui/lib/utils';
+
+const Tabs = TabsPrimitive.Root;
+
+const TabsList = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+TabsList.displayName = TabsPrimitive.List.displayName;
+
+const TabsTrigger = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+TabsTrigger.displayName = TabsPrimitive.Trigger.displayName;
+
+const TabsContent = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+TabsContent.displayName = TabsPrimitive.Content.displayName;
+
+export { Tabs, TabsList, TabsTrigger, TabsContent };
diff --git a/packages/ui/components/ui/toast.tsx b/packages/ui/components/ui/toast.tsx
new file mode 100644
index 0000000000..b22d3aa0cb
--- /dev/null
+++ b/packages/ui/components/ui/toast.tsx
@@ -0,0 +1,130 @@
+'use client';
+
+import * as React from 'react';
+
+import * as ToastPrimitives from '@radix-ui/react-toast';
+import { cva, type VariantProps } from 'class-variance-authority';
+import { X } from 'lucide-react';
+
+import { cn } from '@ui/lib/utils';
+
+const ToastProvider = ToastPrimitives.Provider;
+
+const ToastViewport = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+ToastViewport.displayName = ToastPrimitives.Viewport.displayName;
+
+const toastVariants = cva(
+ 'group pointer-events-auto relative flex w-full items-center justify-between space-x-4 overflow-hidden rounded-md border p-6 pr-8 shadow-lg transition-all data-[swipe=cancel]:translate-x-0 data-[swipe=end]:translate-x-[var(--radix-toast-swipe-end-x)] data-[swipe=move]:translate-x-[var(--radix-toast-swipe-move-x)] data-[swipe=move]:transition-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[swipe=end]:animate-out data-[state=closed]:fade-out-80 data-[state=closed]:slide-out-to-right-full data-[state=open]:slide-in-from-top-full data-[state=open]:sm:slide-in-from-bottom-full',
+ {
+ variants: {
+ variant: {
+ default: 'border bg-background text-foreground',
+ destructive:
+ 'destructive group border-destructive bg-destructive text-destructive-foreground'
+ }
+ },
+ defaultVariants: {
+ variant: 'default'
+ }
+ }
+);
+
+const Toast = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef &
+ VariantProps
+>(({ className, variant, ...props }, ref) => {
+ return (
+
+ );
+});
+Toast.displayName = ToastPrimitives.Root.displayName;
+
+const ToastAction = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+ToastAction.displayName = ToastPrimitives.Action.displayName;
+
+const ToastClose = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+
+
+));
+ToastClose.displayName = ToastPrimitives.Close.displayName;
+
+const ToastTitle = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+ToastTitle.displayName = ToastPrimitives.Title.displayName;
+
+const ToastDescription = React.forwardRef<
+ React.ElementRef,
+ React.ComponentPropsWithoutRef
+>(({ className, ...props }, ref) => (
+
+));
+ToastDescription.displayName = ToastPrimitives.Description.displayName;
+
+type ToastProps = React.ComponentPropsWithoutRef;
+
+type ToastActionElement = React.ReactElement;
+
+export {
+ type ToastProps,
+ type ToastActionElement,
+ ToastProvider,
+ ToastViewport,
+ Toast,
+ ToastTitle,
+ ToastDescription,
+ ToastClose,
+ ToastAction
+};
diff --git a/packages/ui/components/ui/toaster.tsx b/packages/ui/components/ui/toaster.tsx
new file mode 100644
index 0000000000..5666ba5cda
--- /dev/null
+++ b/packages/ui/components/ui/toaster.tsx
@@ -0,0 +1,38 @@
+'use client';
+
+import {
+ Toast,
+ ToastClose,
+ ToastDescription,
+ ToastProvider,
+ ToastTitle,
+ ToastViewport
+} from '@ui/components/ui/toast';
+import { useToast } from '@ui/hooks/use-toast';
+
+export function Toaster() {
+ const { toasts } = useToast();
+
+ return (
+
+ {toasts.map(function ({ id, title, description, action, ...props }) {
+ return (
+
+
+ {title && {title}}
+ {description && (
+ {description}
+ )}
+
+ {action}
+
+
+ );
+ })}
+
+
+ );
+}
diff --git a/packages/ui/hooks/use-toast.ts b/packages/ui/hooks/use-toast.ts
new file mode 100644
index 0000000000..e4e26f151a
--- /dev/null
+++ b/packages/ui/hooks/use-toast.ts
@@ -0,0 +1,191 @@
+'use client';
+
+// Inspired by react-hot-toast library
+import * as React from 'react';
+
+import type { ToastActionElement, ToastProps } from '@ui/components/ui/toast';
+
+const TOAST_LIMIT = 1;
+const TOAST_REMOVE_DELAY = 1000000;
+
+type ToasterToast = ToastProps & {
+ id: string;
+ title?: React.ReactNode;
+ description?: React.ReactNode;
+ action?: ToastActionElement;
+};
+
+const actionTypes = {
+ ADD_TOAST: 'ADD_TOAST',
+ UPDATE_TOAST: 'UPDATE_TOAST',
+ DISMISS_TOAST: 'DISMISS_TOAST',
+ REMOVE_TOAST: 'REMOVE_TOAST'
+} as const;
+
+let count = 0;
+
+function genId() {
+ count = (count + 1) % Number.MAX_SAFE_INTEGER;
+ return count.toString();
+}
+
+type ActionType = typeof actionTypes;
+
+type Action =
+ | {
+ type: ActionType['ADD_TOAST'];
+ toast: ToasterToast;
+ }
+ | {
+ type: ActionType['DISMISS_TOAST'];
+ toastId?: ToasterToast['id'];
+ }
+ | {
+ type: ActionType['REMOVE_TOAST'];
+ toastId?: ToasterToast['id'];
+ }
+ | {
+ type: ActionType['UPDATE_TOAST'];
+ toast: Partial;
+ };
+
+interface State {
+ toasts: ToasterToast[];
+}
+
+const toastTimeouts = new Map>();
+
+const addToRemoveQueue = (toastId: string) => {
+ if (toastTimeouts.has(toastId)) {
+ return;
+ }
+
+ const timeout = setTimeout(() => {
+ toastTimeouts.delete(toastId);
+ dispatch({
+ type: 'REMOVE_TOAST',
+ toastId: toastId
+ });
+ }, TOAST_REMOVE_DELAY);
+
+ toastTimeouts.set(toastId, timeout);
+};
+
+export const reducer = (state: State, action: Action): State => {
+ switch (action.type) {
+ case 'ADD_TOAST':
+ return {
+ ...state,
+ toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT)
+ };
+
+ case 'UPDATE_TOAST':
+ return {
+ ...state,
+ toasts: state.toasts.map((t) =>
+ t.id === action.toast.id ? { ...t, ...action.toast } : t
+ )
+ };
+
+ case 'DISMISS_TOAST': {
+ const { toastId } = action;
+
+ // ! Side effects ! - This could be extracted into a dismissToast() action,
+ // but I'll keep it here for simplicity
+ if (toastId) {
+ addToRemoveQueue(toastId);
+ } else {
+ state.toasts.forEach((toast) => {
+ addToRemoveQueue(toast.id);
+ });
+ }
+
+ return {
+ ...state,
+ toasts: state.toasts.map((t) =>
+ t.id === toastId || toastId === undefined
+ ? {
+ ...t,
+ open: false
+ }
+ : t
+ )
+ };
+ }
+ case 'REMOVE_TOAST':
+ if (action.toastId === undefined) {
+ return {
+ ...state,
+ toasts: []
+ };
+ }
+ return {
+ ...state,
+ toasts: state.toasts.filter((t) => t.id !== action.toastId)
+ };
+ }
+};
+
+const listeners: Array<(state: State) => void> = [];
+
+let memoryState: State = { toasts: [] };
+
+function dispatch(action: Action) {
+ memoryState = reducer(memoryState, action);
+ listeners.forEach((listener) => {
+ listener(memoryState);
+ });
+}
+
+type Toast = Omit;
+
+function toast({ ...props }: Toast) {
+ const id = genId();
+
+ const update = (props: ToasterToast) =>
+ dispatch({
+ type: 'UPDATE_TOAST',
+ toast: { ...props, id }
+ });
+ const dismiss = () => dispatch({ type: 'DISMISS_TOAST', toastId: id });
+
+ dispatch({
+ type: 'ADD_TOAST',
+ toast: {
+ ...props,
+ id,
+ open: true,
+ onOpenChange: (open) => {
+ if (!open) dismiss();
+ }
+ }
+ });
+
+ return {
+ id: id,
+ dismiss,
+ update
+ };
+}
+
+function useToast() {
+ const [state, setState] = React.useState(memoryState);
+
+ React.useEffect(() => {
+ listeners.push(setState);
+ return () => {
+ const index = listeners.indexOf(setState);
+ if (index > -1) {
+ listeners.splice(index, 1);
+ }
+ };
+ }, [state]);
+
+ return {
+ ...state,
+ toast,
+ dismiss: (toastId?: string) => dispatch({ type: 'DISMISS_TOAST', toastId })
+ };
+}
+
+export { useToast, toast };
diff --git a/packages/ui/package.json b/packages/ui/package.json
index 7761b0814d..cda16a3b31 100644
--- a/packages/ui/package.json
+++ b/packages/ui/package.json
@@ -3,10 +3,10 @@
"version": "0.1.0",
"private": true,
"scripts": {
- "dev": "next dev",
"build": "next build",
- "start": "next start",
- "lint": "next lint"
+ "dev": "next dev",
+ "lint": "next lint",
+ "start": "next start"
},
"dependencies": {
"@gasbot/widget": "^0.4.7",
@@ -16,17 +16,31 @@
"@lifi/sdk": "^3.4.1",
"@lifi/widget": "^3.11.0",
"@netlify/plugin-nextjs": "^5.8.1",
+ "@radix-ui/react-checkbox": "^1.1.2",
+ "@radix-ui/react-dialog": "^1.1.2",
+ "@radix-ui/react-dropdown-menu": "^2.1.2",
+ "@radix-ui/react-icons": "^1.3.0",
+ "@radix-ui/react-popover": "^1.1.2",
+ "@radix-ui/react-progress": "^1.1.0",
+ "@radix-ui/react-select": "^2.1.2",
+ "@radix-ui/react-separator": "^1.1.0",
+ "@radix-ui/react-slider": "^1.2.1",
"@radix-ui/react-slot": "^1.1.0",
+ "@radix-ui/react-switch": "^1.1.1",
+ "@radix-ui/react-tabs": "^1.1.1",
+ "@radix-ui/react-toast": "^1.2.2",
"@radix-ui/react-tooltip": "^1.1.3",
"@reown/appkit": "^1.2.0",
"@reown/appkit-adapter-wagmi": "^1.2.0",
"@sentry/nextjs": "^8.35.0",
"@supabase/supabase-js": "^2.45.6",
"@tanstack/react-query": "^5.59.16",
+ "@tanstack/react-table": "^8.20.5",
"@wagmi/connectors": "^5.3.3",
"chart.js": "^4.4.3",
"class-variance-authority": "^0.7.0",
"clsx": "^2.1.1",
+ "date-fns": "^4.1.0",
"lucide-react": "^0.454.0",
"mathjs": "^13.2.0",
"millify": "^6.1.0",
@@ -36,6 +50,7 @@
"react": "^18.3.1",
"react-chartjs-2": "^5.2.0",
"react-confetti": "^6.1.0",
+ "react-day-picker": "8.10.1",
"react-dom": "^18.3.1",
"react-hot-toast": "^2.4.1",
"react-loader-spinner": "^6.1.6",
diff --git a/packages/ui/utils/multipliers.ts b/packages/ui/utils/multipliers.ts
index c4bf73b684..2851d6434e 100644
--- a/packages/ui/utils/multipliers.ts
+++ b/packages/ui/utils/multipliers.ts
@@ -592,7 +592,9 @@ export const multipliers: Record<
ionic: 0,
turtle: false,
ionAPR: true,
- flywheel: true
+ flywheel: true,
+ underlyingAPR: 15,
+ anzen: 5
}
}
}
diff --git a/yarn.lock b/yarn.lock
index dd88c910b3..a8d0dd3c55 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2193,13 +2193,26 @@ __metadata:
"@lifi/sdk": "npm:^3.4.1"
"@lifi/widget": "npm:^3.11.0"
"@netlify/plugin-nextjs": "npm:^5.8.1"
+ "@radix-ui/react-checkbox": "npm:^1.1.2"
+ "@radix-ui/react-dialog": "npm:^1.1.2"
+ "@radix-ui/react-dropdown-menu": "npm:^2.1.2"
+ "@radix-ui/react-icons": "npm:^1.3.0"
+ "@radix-ui/react-popover": "npm:^1.1.2"
+ "@radix-ui/react-progress": "npm:^1.1.0"
+ "@radix-ui/react-select": "npm:^2.1.2"
+ "@radix-ui/react-separator": "npm:^1.1.0"
+ "@radix-ui/react-slider": "npm:^1.2.1"
"@radix-ui/react-slot": "npm:^1.1.0"
+ "@radix-ui/react-switch": "npm:^1.1.1"
+ "@radix-ui/react-tabs": "npm:^1.1.1"
+ "@radix-ui/react-toast": "npm:^1.2.2"
"@radix-ui/react-tooltip": "npm:^1.1.3"
"@reown/appkit": "npm:^1.2.0"
"@reown/appkit-adapter-wagmi": "npm:^1.2.0"
"@sentry/nextjs": "npm:^8.35.0"
"@supabase/supabase-js": "npm:^2.45.6"
"@tanstack/react-query": "npm:^5.59.16"
+ "@tanstack/react-table": "npm:^8.20.5"
"@types/node": "npm:^20"
"@types/react": "npm:^18"
"@types/react-dom": "npm:^18"
@@ -2208,6 +2221,7 @@ __metadata:
chart.js: "npm:^4.4.3"
class-variance-authority: "npm:^0.7.0"
clsx: "npm:^2.1.1"
+ date-fns: "npm:^4.1.0"
eslint: "npm:^8"
eslint-config-next: "npm:^14.1.4"
eslint-config-prettier: "npm:^9.0.0"
@@ -2228,6 +2242,7 @@ __metadata:
react: "npm:^18.3.1"
react-chartjs-2: "npm:^5.2.0"
react-confetti: "npm:^6.1.0"
+ react-day-picker: "npm:8.10.1"
react-dom: "npm:^18.3.1"
react-hot-toast: "npm:^2.4.1"
react-loader-spinner: "npm:^6.1.6"
@@ -5115,6 +5130,32 @@ __metadata:
languageName: node
linkType: hard
+"@radix-ui/react-checkbox@npm:^1.1.2":
+ version: 1.1.2
+ resolution: "@radix-ui/react-checkbox@npm:1.1.2"
+ dependencies:
+ "@radix-ui/primitive": "npm:1.1.0"
+ "@radix-ui/react-compose-refs": "npm:1.1.0"
+ "@radix-ui/react-context": "npm:1.1.1"
+ "@radix-ui/react-presence": "npm:1.1.1"
+ "@radix-ui/react-primitive": "npm:2.0.0"
+ "@radix-ui/react-use-controllable-state": "npm:1.1.0"
+ "@radix-ui/react-use-previous": "npm:1.1.0"
+ "@radix-ui/react-use-size": "npm:1.1.0"
+ peerDependencies:
+ "@types/react": "*"
+ "@types/react-dom": "*"
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ "@types/react":
+ optional: true
+ "@types/react-dom":
+ optional: true
+ checksum: 10/0c68e2bd5fde9b0658cf211de6c83573e81609b1fcdcd6bfb328026f7585c83ba8d7a9f426378d0fb23d7dfc19998d8b4928a294b1da0c62dd8a2f6e2a76c39d
+ languageName: node
+ linkType: hard
+
"@radix-ui/react-collection@npm:1.1.0":
version: 1.1.0
resolution: "@radix-ui/react-collection@npm:1.1.0"
@@ -5208,6 +5249,38 @@ __metadata:
languageName: node
linkType: hard
+"@radix-ui/react-dialog@npm:^1.1.2":
+ version: 1.1.2
+ resolution: "@radix-ui/react-dialog@npm:1.1.2"
+ dependencies:
+ "@radix-ui/primitive": "npm:1.1.0"
+ "@radix-ui/react-compose-refs": "npm:1.1.0"
+ "@radix-ui/react-context": "npm:1.1.1"
+ "@radix-ui/react-dismissable-layer": "npm:1.1.1"
+ "@radix-ui/react-focus-guards": "npm:1.1.1"
+ "@radix-ui/react-focus-scope": "npm:1.1.0"
+ "@radix-ui/react-id": "npm:1.1.0"
+ "@radix-ui/react-portal": "npm:1.1.2"
+ "@radix-ui/react-presence": "npm:1.1.1"
+ "@radix-ui/react-primitive": "npm:2.0.0"
+ "@radix-ui/react-slot": "npm:1.1.0"
+ "@radix-ui/react-use-controllable-state": "npm:1.1.0"
+ aria-hidden: "npm:^1.1.1"
+ react-remove-scroll: "npm:2.6.0"
+ peerDependencies:
+ "@types/react": "*"
+ "@types/react-dom": "*"
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ "@types/react":
+ optional: true
+ "@types/react-dom":
+ optional: true
+ checksum: 10/9ed653e8e29443331d8dda8174f3c47194104e8b6e7bdd8f56998860fd8bf5e5a8867863bc93b089f8f7e37964375341eec2965e2f35ec26ee2cf2dd175bb503
+ languageName: node
+ linkType: hard
+
"@radix-ui/react-direction@npm:1.1.0":
version: 1.1.0
resolution: "@radix-ui/react-direction@npm:1.1.0"
@@ -5267,6 +5340,31 @@ __metadata:
languageName: node
linkType: hard
+"@radix-ui/react-dropdown-menu@npm:^2.1.2":
+ version: 2.1.2
+ resolution: "@radix-ui/react-dropdown-menu@npm:2.1.2"
+ dependencies:
+ "@radix-ui/primitive": "npm:1.1.0"
+ "@radix-ui/react-compose-refs": "npm:1.1.0"
+ "@radix-ui/react-context": "npm:1.1.1"
+ "@radix-ui/react-id": "npm:1.1.0"
+ "@radix-ui/react-menu": "npm:2.1.2"
+ "@radix-ui/react-primitive": "npm:2.0.0"
+ "@radix-ui/react-use-controllable-state": "npm:1.1.0"
+ peerDependencies:
+ "@types/react": "*"
+ "@types/react-dom": "*"
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ "@types/react":
+ optional: true
+ "@types/react-dom":
+ optional: true
+ checksum: 10/09c7a1807475432a7adeb57b245e1e512098ce96392111d75e38fa4be71fe8f9b35818f1d2fc3f4246651247818f95e9a435e68e6fd2cd522620a292e2e74d55
+ languageName: node
+ linkType: hard
+
"@radix-ui/react-focus-guards@npm:1.1.0":
version: 1.1.0
resolution: "@radix-ui/react-focus-guards@npm:1.1.0"
@@ -5280,6 +5378,19 @@ __metadata:
languageName: node
linkType: hard
+"@radix-ui/react-focus-guards@npm:1.1.1":
+ version: 1.1.1
+ resolution: "@radix-ui/react-focus-guards@npm:1.1.1"
+ peerDependencies:
+ "@types/react": "*"
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ "@types/react":
+ optional: true
+ checksum: 10/ac8dd31f48fa0500bafd9368f2f06c5a06918dccefa89fa5dc77ca218dc931a094a81ca57f6b181138029822f7acdd5280dceccf5ba4d9263c754fb8f7961879
+ languageName: node
+ linkType: hard
+
"@radix-ui/react-focus-scope@npm:1.1.0":
version: 1.1.0
resolution: "@radix-ui/react-focus-scope@npm:1.1.0"
@@ -5301,6 +5412,15 @@ __metadata:
languageName: node
linkType: hard
+"@radix-ui/react-icons@npm:^1.3.0":
+ version: 1.3.1
+ resolution: "@radix-ui/react-icons@npm:1.3.1"
+ peerDependencies:
+ react: ^16.x || ^17.x || ^18.x || ^19.x
+ checksum: 10/efc787c777616caf903c69ff479c128c8c05852083a27703bda2f74aaf4f3a2a3949a7f26b21b6ea4ac6c25f59c993bbafe6e482e196f0e0af660e5a6a81ceb4
+ languageName: node
+ linkType: hard
+
"@radix-ui/react-id@npm:1.1.0":
version: 1.1.0
resolution: "@radix-ui/react-id@npm:1.1.0"
@@ -5316,6 +5436,42 @@ __metadata:
languageName: node
linkType: hard
+"@radix-ui/react-menu@npm:2.1.2":
+ version: 2.1.2
+ resolution: "@radix-ui/react-menu@npm:2.1.2"
+ dependencies:
+ "@radix-ui/primitive": "npm:1.1.0"
+ "@radix-ui/react-collection": "npm:1.1.0"
+ "@radix-ui/react-compose-refs": "npm:1.1.0"
+ "@radix-ui/react-context": "npm:1.1.1"
+ "@radix-ui/react-direction": "npm:1.1.0"
+ "@radix-ui/react-dismissable-layer": "npm:1.1.1"
+ "@radix-ui/react-focus-guards": "npm:1.1.1"
+ "@radix-ui/react-focus-scope": "npm:1.1.0"
+ "@radix-ui/react-id": "npm:1.1.0"
+ "@radix-ui/react-popper": "npm:1.2.0"
+ "@radix-ui/react-portal": "npm:1.1.2"
+ "@radix-ui/react-presence": "npm:1.1.1"
+ "@radix-ui/react-primitive": "npm:2.0.0"
+ "@radix-ui/react-roving-focus": "npm:1.1.0"
+ "@radix-ui/react-slot": "npm:1.1.0"
+ "@radix-ui/react-use-callback-ref": "npm:1.1.0"
+ aria-hidden: "npm:^1.1.1"
+ react-remove-scroll: "npm:2.6.0"
+ peerDependencies:
+ "@types/react": "*"
+ "@types/react-dom": "*"
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ "@types/react":
+ optional: true
+ "@types/react-dom":
+ optional: true
+ checksum: 10/62d17d75fac27f86a1eb450ee6cb627f4f21854b7568f0bc4210b2b127d15d33444939be9af893fdc5db1d82fdfbde45e29f9e783155efa4c9af30def68777a2
+ languageName: node
+ linkType: hard
+
"@radix-ui/react-popover@npm:^1.0.7":
version: 1.1.1
resolution: "@radix-ui/react-popover@npm:1.1.1"
@@ -5349,6 +5505,39 @@ __metadata:
languageName: node
linkType: hard
+"@radix-ui/react-popover@npm:^1.1.2":
+ version: 1.1.2
+ resolution: "@radix-ui/react-popover@npm:1.1.2"
+ dependencies:
+ "@radix-ui/primitive": "npm:1.1.0"
+ "@radix-ui/react-compose-refs": "npm:1.1.0"
+ "@radix-ui/react-context": "npm:1.1.1"
+ "@radix-ui/react-dismissable-layer": "npm:1.1.1"
+ "@radix-ui/react-focus-guards": "npm:1.1.1"
+ "@radix-ui/react-focus-scope": "npm:1.1.0"
+ "@radix-ui/react-id": "npm:1.1.0"
+ "@radix-ui/react-popper": "npm:1.2.0"
+ "@radix-ui/react-portal": "npm:1.1.2"
+ "@radix-ui/react-presence": "npm:1.1.1"
+ "@radix-ui/react-primitive": "npm:2.0.0"
+ "@radix-ui/react-slot": "npm:1.1.0"
+ "@radix-ui/react-use-controllable-state": "npm:1.1.0"
+ aria-hidden: "npm:^1.1.1"
+ react-remove-scroll: "npm:2.6.0"
+ peerDependencies:
+ "@types/react": "*"
+ "@types/react-dom": "*"
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ "@types/react":
+ optional: true
+ "@types/react-dom":
+ optional: true
+ checksum: 10/e8390e144516a016ade2a2a8fdf6b3c2f281d67cdbbcc46478d63366498c4af6946bafef8ecc496d37350d287e05adacc22da5e286298843ac49c285ce69bfdd
+ languageName: node
+ linkType: hard
+
"@radix-ui/react-popper@npm:1.2.0":
version: 1.2.0
resolution: "@radix-ui/react-popper@npm:1.2.0"
@@ -5476,6 +5665,26 @@ __metadata:
languageName: node
linkType: hard
+"@radix-ui/react-progress@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "@radix-ui/react-progress@npm:1.1.0"
+ dependencies:
+ "@radix-ui/react-context": "npm:1.1.0"
+ "@radix-ui/react-primitive": "npm:2.0.0"
+ peerDependencies:
+ "@types/react": "*"
+ "@types/react-dom": "*"
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ "@types/react":
+ optional: true
+ "@types/react-dom":
+ optional: true
+ checksum: 10/bd33a2fce8f7bdda9bcef372db806840248f61db333893f4ed047ea3998649e8350accef2d7369ff7146398337cf9fcb353c4055577069de79648f3d96e50dbc
+ languageName: node
+ linkType: hard
+
"@radix-ui/react-roving-focus@npm:1.1.0":
version: 1.1.0
resolution: "@radix-ui/react-roving-focus@npm:1.1.0"
@@ -5569,6 +5778,93 @@ __metadata:
languageName: node
linkType: hard
+"@radix-ui/react-select@npm:^2.1.2":
+ version: 2.1.2
+ resolution: "@radix-ui/react-select@npm:2.1.2"
+ dependencies:
+ "@radix-ui/number": "npm:1.1.0"
+ "@radix-ui/primitive": "npm:1.1.0"
+ "@radix-ui/react-collection": "npm:1.1.0"
+ "@radix-ui/react-compose-refs": "npm:1.1.0"
+ "@radix-ui/react-context": "npm:1.1.1"
+ "@radix-ui/react-direction": "npm:1.1.0"
+ "@radix-ui/react-dismissable-layer": "npm:1.1.1"
+ "@radix-ui/react-focus-guards": "npm:1.1.1"
+ "@radix-ui/react-focus-scope": "npm:1.1.0"
+ "@radix-ui/react-id": "npm:1.1.0"
+ "@radix-ui/react-popper": "npm:1.2.0"
+ "@radix-ui/react-portal": "npm:1.1.2"
+ "@radix-ui/react-primitive": "npm:2.0.0"
+ "@radix-ui/react-slot": "npm:1.1.0"
+ "@radix-ui/react-use-callback-ref": "npm:1.1.0"
+ "@radix-ui/react-use-controllable-state": "npm:1.1.0"
+ "@radix-ui/react-use-layout-effect": "npm:1.1.0"
+ "@radix-ui/react-use-previous": "npm:1.1.0"
+ "@radix-ui/react-visually-hidden": "npm:1.1.0"
+ aria-hidden: "npm:^1.1.1"
+ react-remove-scroll: "npm:2.6.0"
+ peerDependencies:
+ "@types/react": "*"
+ "@types/react-dom": "*"
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ "@types/react":
+ optional: true
+ "@types/react-dom":
+ optional: true
+ checksum: 10/b9b6e34680bd0d9b161af1ef93560b84b398f7c710adb82e3676a724600698653682aa7873aa7f5198370182bd2bec9a79e7b651b80379ba3df99140c76813e5
+ languageName: node
+ linkType: hard
+
+"@radix-ui/react-separator@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "@radix-ui/react-separator@npm:1.1.0"
+ dependencies:
+ "@radix-ui/react-primitive": "npm:2.0.0"
+ peerDependencies:
+ "@types/react": "*"
+ "@types/react-dom": "*"
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ "@types/react":
+ optional: true
+ "@types/react-dom":
+ optional: true
+ checksum: 10/a7c3445603a45075dcf3559eb8f2f2e8545afeae253e67d0bde736c66b293c601974a1d6f9d7be1802d83869933dc120a7389ab98189ceb9a24659737dde0162
+ languageName: node
+ linkType: hard
+
+"@radix-ui/react-slider@npm:^1.2.1":
+ version: 1.2.1
+ resolution: "@radix-ui/react-slider@npm:1.2.1"
+ dependencies:
+ "@radix-ui/number": "npm:1.1.0"
+ "@radix-ui/primitive": "npm:1.1.0"
+ "@radix-ui/react-collection": "npm:1.1.0"
+ "@radix-ui/react-compose-refs": "npm:1.1.0"
+ "@radix-ui/react-context": "npm:1.1.1"
+ "@radix-ui/react-direction": "npm:1.1.0"
+ "@radix-ui/react-primitive": "npm:2.0.0"
+ "@radix-ui/react-use-controllable-state": "npm:1.1.0"
+ "@radix-ui/react-use-layout-effect": "npm:1.1.0"
+ "@radix-ui/react-use-previous": "npm:1.1.0"
+ "@radix-ui/react-use-size": "npm:1.1.0"
+ peerDependencies:
+ "@types/react": "*"
+ "@types/react-dom": "*"
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ "@types/react":
+ optional: true
+ "@types/react-dom":
+ optional: true
+ checksum: 10/704ce9a53daf62c070ab2881d8f2e01cd6216d25bed7fde4e18b336e33c127b5a19985ebed468ddba2e45064550d49c24134e2441427c280d498e01abdc43c80
+ languageName: node
+ linkType: hard
+
"@radix-ui/react-slot@npm:1.1.0, @radix-ui/react-slot@npm:^1.1.0":
version: 1.1.0
resolution: "@radix-ui/react-slot@npm:1.1.0"
@@ -5584,6 +5880,31 @@ __metadata:
languageName: node
linkType: hard
+"@radix-ui/react-switch@npm:^1.1.1":
+ version: 1.1.1
+ resolution: "@radix-ui/react-switch@npm:1.1.1"
+ dependencies:
+ "@radix-ui/primitive": "npm:1.1.0"
+ "@radix-ui/react-compose-refs": "npm:1.1.0"
+ "@radix-ui/react-context": "npm:1.1.1"
+ "@radix-ui/react-primitive": "npm:2.0.0"
+ "@radix-ui/react-use-controllable-state": "npm:1.1.0"
+ "@radix-ui/react-use-previous": "npm:1.1.0"
+ "@radix-ui/react-use-size": "npm:1.1.0"
+ peerDependencies:
+ "@types/react": "*"
+ "@types/react-dom": "*"
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ "@types/react":
+ optional: true
+ "@types/react-dom":
+ optional: true
+ checksum: 10/7dd7369b3563818088bd28f0c683e8b44c6834119ed42084fd55b685708f222f7b063082924600c11aa48f8187240e169c84a6e173874bb81b6fa4d112df0416
+ languageName: node
+ linkType: hard
+
"@radix-ui/react-tabs@npm:^1.0.4":
version: 1.1.0
resolution: "@radix-ui/react-tabs@npm:1.1.0"
@@ -5610,6 +5931,62 @@ __metadata:
languageName: node
linkType: hard
+"@radix-ui/react-tabs@npm:^1.1.1":
+ version: 1.1.1
+ resolution: "@radix-ui/react-tabs@npm:1.1.1"
+ dependencies:
+ "@radix-ui/primitive": "npm:1.1.0"
+ "@radix-ui/react-context": "npm:1.1.1"
+ "@radix-ui/react-direction": "npm:1.1.0"
+ "@radix-ui/react-id": "npm:1.1.0"
+ "@radix-ui/react-presence": "npm:1.1.1"
+ "@radix-ui/react-primitive": "npm:2.0.0"
+ "@radix-ui/react-roving-focus": "npm:1.1.0"
+ "@radix-ui/react-use-controllable-state": "npm:1.1.0"
+ peerDependencies:
+ "@types/react": "*"
+ "@types/react-dom": "*"
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ "@types/react":
+ optional: true
+ "@types/react-dom":
+ optional: true
+ checksum: 10/9ec6f6749360c5d77a6ab785995f4e7851ac36debcbcf6aef787aedf565d4e3f19bfd3122b43d71e086cdfe7745ca5d683a79b1744af4787ac0830fdf390d421
+ languageName: node
+ linkType: hard
+
+"@radix-ui/react-toast@npm:^1.2.2":
+ version: 1.2.2
+ resolution: "@radix-ui/react-toast@npm:1.2.2"
+ dependencies:
+ "@radix-ui/primitive": "npm:1.1.0"
+ "@radix-ui/react-collection": "npm:1.1.0"
+ "@radix-ui/react-compose-refs": "npm:1.1.0"
+ "@radix-ui/react-context": "npm:1.1.1"
+ "@radix-ui/react-dismissable-layer": "npm:1.1.1"
+ "@radix-ui/react-portal": "npm:1.1.2"
+ "@radix-ui/react-presence": "npm:1.1.1"
+ "@radix-ui/react-primitive": "npm:2.0.0"
+ "@radix-ui/react-use-callback-ref": "npm:1.1.0"
+ "@radix-ui/react-use-controllable-state": "npm:1.1.0"
+ "@radix-ui/react-use-layout-effect": "npm:1.1.0"
+ "@radix-ui/react-visually-hidden": "npm:1.1.0"
+ peerDependencies:
+ "@types/react": "*"
+ "@types/react-dom": "*"
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ "@types/react":
+ optional: true
+ "@types/react-dom":
+ optional: true
+ checksum: 10/aaf0bc39cd010487f20df5c933177479c0381fa0edd8cbf6a4780762956abdb1868774e5468f960d147febf9012deab1be300ac075bbe7e19a31364942eae9a1
+ languageName: node
+ linkType: hard
+
"@radix-ui/react-tooltip@npm:^1.0.7":
version: 1.1.2
resolution: "@radix-ui/react-tooltip@npm:1.1.2"
@@ -7447,6 +7824,18 @@ __metadata:
languageName: node
linkType: hard
+"@tanstack/react-table@npm:^8.20.5":
+ version: 8.20.5
+ resolution: "@tanstack/react-table@npm:8.20.5"
+ dependencies:
+ "@tanstack/table-core": "npm:8.20.5"
+ peerDependencies:
+ react: ">=16.8"
+ react-dom: ">=16.8"
+ checksum: 10/df67094795a0b7e4b34f73abe346443c2e806c572fea31b58759aa8ec5274f613e5e6941090eb16f861bda10d3088731bc6e7f15e5f90326db273bc55b9141ce
+ languageName: node
+ linkType: hard
+
"@tanstack/react-virtual@npm:^3.10.8":
version: 3.10.8
resolution: "@tanstack/react-virtual@npm:3.10.8"
@@ -7459,6 +7848,13 @@ __metadata:
languageName: node
linkType: hard
+"@tanstack/table-core@npm:8.20.5":
+ version: 8.20.5
+ resolution: "@tanstack/table-core@npm:8.20.5"
+ checksum: 10/5408237920d5796951e925278edbbe76f71006627a4e3da248a810970256f75d973538fe7ae75a32155d4a25a95abc4fffaea337b5120f7940d7e664dc9da87f
+ languageName: node
+ linkType: hard
+
"@tanstack/virtual-core@npm:3.10.8":
version: 3.10.8
resolution: "@tanstack/virtual-core@npm:3.10.8"
@@ -11848,6 +12244,13 @@ __metadata:
languageName: node
linkType: hard
+"date-fns@npm:^4.1.0":
+ version: 4.1.0
+ resolution: "date-fns@npm:4.1.0"
+ checksum: 10/d5f6e9de5bbc52310f786099e18609289ed5e30af60a71e0646784c8185ddd1d0eebcf7c96b7faaaefc4a8366f3a3a4244d099b6d0866ee2bec80d1361e64342
+ languageName: node
+ linkType: hard
+
"date-time@npm:^3.1.0":
version: 3.1.0
resolution: "date-time@npm:3.1.0"
@@ -21704,6 +22107,16 @@ __metadata:
languageName: node
linkType: hard
+"react-day-picker@npm:8.10.1":
+ version: 8.10.1
+ resolution: "react-day-picker@npm:8.10.1"
+ peerDependencies:
+ date-fns: ^2.28.0 || ^3.0.0
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ checksum: 10/374056dca7fed70a154a3b0e98c6c746c26b4fc868548fa8f285ef3cab9679537e84c0c21ba7b6db67b3f7f54cc562f5d83efba2c7f2c7bd3705ac8992869607
+ languageName: node
+ linkType: hard
+
"react-dom@npm:^18.3.1":
version: 18.3.1
resolution: "react-dom@npm:18.3.1"
@@ -21806,7 +22219,7 @@ __metadata:
languageName: node
linkType: hard
-"react-remove-scroll-bar@npm:^2.3.4":
+"react-remove-scroll-bar@npm:^2.3.4, react-remove-scroll-bar@npm:^2.3.6":
version: 2.3.6
resolution: "react-remove-scroll-bar@npm:2.3.6"
dependencies:
@@ -21841,6 +22254,25 @@ __metadata:
languageName: node
linkType: hard
+"react-remove-scroll@npm:2.6.0":
+ version: 2.6.0
+ resolution: "react-remove-scroll@npm:2.6.0"
+ dependencies:
+ react-remove-scroll-bar: "npm:^2.3.6"
+ react-style-singleton: "npm:^2.2.1"
+ tslib: "npm:^2.1.0"
+ use-callback-ref: "npm:^1.3.0"
+ use-sidecar: "npm:^1.1.2"
+ peerDependencies:
+ "@types/react": ^16.8.0 || ^17.0.0 || ^18.0.0
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0
+ peerDependenciesMeta:
+ "@types/react":
+ optional: true
+ checksum: 10/9fac79e1c2ed2c85729bfe82f61ef4ae5ce51f478736a13892a9a11e05cbd4e9599f9f0e012cb5fc0719e18dc1dd687ab61f516193228615df636db8b851245e
+ languageName: node
+ linkType: hard
+
"react-router-dom@npm:^6.27.0":
version: 6.27.0
resolution: "react-router-dom@npm:6.27.0"