diff --git a/app/components/address.tsx b/app/components/address.tsx index f741d07..313f6b5 100644 --- a/app/components/address.tsx +++ b/app/components/address.tsx @@ -1,10 +1,9 @@ "use client"; import { useAccount } from "@starknet-react/core"; import { MoreVertical } from "lucide-react"; -import DisconnectModal from "./disconnect-modal"; import { useState } from "react"; -import { createPortal } from "react-dom"; import { shortenAddress } from "../utils/helper"; +import DisconnectModal from "./ui/modals/disconnect-wallet-modal"; export default function Address() { const [isModalOpen, setIsModalOpen] = useState(false); @@ -12,11 +11,15 @@ export default function Address() { return (
- {isModalOpen && + {/* {isModalOpen && createPortal( setIsModalOpen(false)} />, document.body - )} + )} */} + setIsModalOpen((prev) => !prev)} + />
{address ? shortenAddress(address) : ""} -
diff --git a/app/components/change-autoswap-settings.tsx b/app/components/change-autoswap-settings.tsx index e282ede..bfa25a6 100644 --- a/app/components/change-autoswap-settings.tsx +++ b/app/components/change-autoswap-settings.tsx @@ -1,5 +1,4 @@ import React, { useCallback, useEffect, useState } from "react"; -import GenericModal from "./generic-modal"; import { EditIcon } from "lucide-react"; import { createSubscription, useContractWriteUtility } from "../utils/helper"; import { swappr_contract_address } from "../utils/addresses"; @@ -7,8 +6,8 @@ import { STRK_TOKEN, USDT_TOKEN } from "../utils/data"; import { ERC20_ABI } from "../abis/erc20-abi"; import { useAccount } from "@starknet-react/core"; import { useRouter } from "next/navigation"; -import { createPortal } from "react-dom"; -import GrantPermissionModal from "./grant-permission-modal"; +import GrantPermission from "./ui/modals/grant-permission-modal"; +import GenericModal from "./generic-modal"; export default function ChangeAutoswapSettings({ handleClose, @@ -62,14 +61,11 @@ export default function ChangeAutoswapSettings({ }, [writeAsync]); return ( <> - {isPermissionModalOpen && - createPortal( - setIsPermissionModalOpen(false)} - handleSubmit={handleSubscribe} - />, - document.body - )} + setIsPermissionModalOpen((prev) => !prev)} + open={isPermissionModalOpen} + handleSubmit={handleSubscribe} + />

diff --git a/app/components/connect-wallet-modal.tsx b/app/components/connect-wallet-modal.tsx deleted file mode 100644 index c5b01b8..0000000 --- a/app/components/connect-wallet-modal.tsx +++ /dev/null @@ -1,102 +0,0 @@ -"use client"; - -import { useState, useCallback } from "react"; -import { useConnect, Connector } from "@starknet-react/core"; -import Image from "next/image"; -import GenericModal from "./generic-modal"; - -interface ConnectWalletModalProps { - handleClose: () => void; -} - -const walletDetails = { - argentX: { name: "Argent", subtext: "WEBSITE", icon: "/argent.svg" }, - webwallet: { name: "Argent", subtext: "MOBILE", icon: "/argent.svg" }, - braavos: { name: "Braavos", subtext: "WEBSITE", icon: "/braavos.svg" }, -}; - -export default function ConnectWalletModal({ - handleClose, -}: ConnectWalletModalProps) { - const { connect, connectors } = useConnect(); - const [selectedConnector, setSelectedConnector] = useState( - null - ); - - const handleConnect = useCallback(() => { - if (selectedConnector) { - connect({ connector: selectedConnector }); - handleClose(); - } - }, [selectedConnector, connect, handleClose]); - - const getWalletDetails = (connector: Connector) => - walletDetails[connector.id as keyof typeof walletDetails] || { - name: connector.id, - subtext: "WEBSITE", - icon: "/assets/wallets/argent.svg", - }; - - return ( - -

- Connect Wallet -

-

- Choose a wallet you want to connect to Auto-swapper -

- - {/* Wallet Options */} -
- {connectors.map((connector) => { - const details = getWalletDetails(connector); - const isSelected = selectedConnector?.id === connector.id; - - return ( - - ); - })} - - {/* Continue Button */} - -
-
- ); -} diff --git a/app/components/disconnect-modal.tsx b/app/components/disconnect-modal.tsx deleted file mode 100644 index b0bc1e5..0000000 --- a/app/components/disconnect-modal.tsx +++ /dev/null @@ -1,61 +0,0 @@ -"use client"; -import { useAccount, useDisconnect } from "@starknet-react/core"; -import GenericModal from "./generic-modal"; -import { shortenAddress } from "../utils/helper"; -import { ExternalLink } from "lucide-react"; -import { useRouter } from "next/navigation"; -import useUnsubscribe from "../hooks/useUnsubscribe"; - -interface DisconnectWalletModalProps { - handleClose: () => void; -} - -export default function DisconnectModal({ - handleClose, -}: DisconnectWalletModalProps) { - const { disconnectAsync } = useDisconnect(); - const { address } = useAccount(); - const router = useRouter(); - const { handleUnsubscribe } = useUnsubscribe(); - - return ( - -

Wallet

- -
-

Connected with Argent X / Braavos

- -
-
- -
-

- osatuyipikin.braavos.eth -

-

- {address && shortenAddress(address)} -

-
-
-

- - View transaction history in explorer -

- - -
- ); -} diff --git a/app/components/footer.tsx b/app/components/footer.tsx index 8f164c0..d119559 100644 --- a/app/components/footer.tsx +++ b/app/components/footer.tsx @@ -1,11 +1,10 @@ import React from "react"; import Link from "next/link"; -import { IconType } from "react-icons"; import { FaTelegramPlane } from "react-icons/fa"; import { FaXTwitter } from "react-icons/fa6"; import { FiGithub } from "react-icons/fi"; -export const footerIcons: { icons: IconType; path: string }[] = [ +export const footerIcons = [ { icons: FiGithub, path: "https://github.com/BlockheaderWeb3-Community/autoswappr-dapp", @@ -28,9 +27,9 @@ export default function Footer() {

- {footerLinks.map((link, index) => ( + {footerLinks.map((link) => ( @@ -40,9 +39,9 @@ export default function Footer() {
- {footerIcons.map((icon, index) => ( + {footerIcons.map((icon) => ( diff --git a/app/components/generic-modal.tsx b/app/components/generic-modal.tsx index a96e6a5..c266e48 100644 --- a/app/components/generic-modal.tsx +++ b/app/components/generic-modal.tsx @@ -3,36 +3,36 @@ import React from "react"; import LockBodyScroll from "./lock-body-scroll"; interface GenericModalProps { - children: React.ReactNode; - handleClose: () => void; - containerClass?: string; + children: React.ReactNode; + handleClose: () => void; + containerClass?: string; } export default function GenericModal({ - children, - handleClose, - containerClass, + children, + handleClose, + containerClass, }: GenericModalProps) { - return ( - <> - -
-
e.stopPropagation()} - > - - {children} -
-
- - ); + return ( + <> + +
+
e.stopPropagation()} + > + + {children} +
+
+ + ); } diff --git a/app/components/landing-hero-section.tsx b/app/components/landing-hero-section.tsx deleted file mode 100644 index 6f8a06f..0000000 --- a/app/components/landing-hero-section.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import { useAccount } from "@starknet-react/core"; -import Image from "next/image"; -import m_Img from "../../public/M-logo.svg"; -import { useRouter } from "next/navigation"; -import React from "react"; -import { ChevronRight } from "lucide-react"; - -function LandingHeroSection({ - openConnectModal, -}: { - openConnectModal: (value: boolean) => void; -}) { - const { address } = useAccount(); - const router = useRouter(); - return ( -
- -
- Token badge -
-

- Your Tokens, Your Rules -

-

- Set up auto-swaps for multiple tokens and percentages with ease. -

- -
-
-
- ); -} - -export default LandingHeroSection; diff --git a/app/components/how-to-use-autoswappr.tsx b/app/components/layout/sections/how-to-use-autoswappr.tsx similarity index 94% rename from app/components/how-to-use-autoswappr.tsx rename to app/components/layout/sections/how-to-use-autoswappr.tsx index 0ce3386..1725fd0 100644 --- a/app/components/how-to-use-autoswappr.tsx +++ b/app/components/layout/sections/how-to-use-autoswappr.tsx @@ -75,7 +75,10 @@ export default function HowToUseAutoSwappr() {
-
diff --git a/app/components/layout/sections/landing-hero-section.tsx b/app/components/layout/sections/landing-hero-section.tsx new file mode 100644 index 0000000..4246db7 --- /dev/null +++ b/app/components/layout/sections/landing-hero-section.tsx @@ -0,0 +1,65 @@ +import { useAccount } from "@starknet-react/core"; +import Image from "next/image"; +import { useRouter } from "next/navigation"; +import React, { useState } from "react"; +import { ChevronRight } from "lucide-react"; +import { ConnectWallet } from "../../ui/modals/connect-wallet-modal"; + +function LandingHeroSection() { + const { address } = useAccount(); + const [isConnecting, setIsConnecting] = useState(false); + const router = useRouter(); + return ( + <> + {isConnecting && ( + setIsConnecting((prev) => !prev)} + /> + )} +
+ +
+ Token badge +
+

+ Your Tokens, Your Rules +

+

+ Set up auto-swaps for multiple tokens and percentages with ease. +

+ +
+
+
+ + ); +} + +export default LandingHeroSection; diff --git a/app/components/what-is-autoswappr.tsx b/app/components/layout/sections/what-is-autoswappr.tsx similarity index 94% rename from app/components/what-is-autoswappr.tsx rename to app/components/layout/sections/what-is-autoswappr.tsx index 0d74e1c..adea9cd 100644 --- a/app/components/what-is-autoswappr.tsx +++ b/app/components/layout/sections/what-is-autoswappr.tsx @@ -16,7 +16,7 @@ export default function WhatIsAutoSwapper() { your wallet.

-
+

It runs in the background, so you don't have to do anything diff --git a/app/components/why-autoswappr.tsx b/app/components/layout/sections/why-autoswappr.tsx similarity index 100% rename from app/components/why-autoswappr.tsx rename to app/components/layout/sections/why-autoswappr.tsx diff --git a/app/components/navbar.tsx b/app/components/navbar.tsx index 8881e1b..68f8524 100644 --- a/app/components/navbar.tsx +++ b/app/components/navbar.tsx @@ -10,29 +10,26 @@ import { createPortal } from "react-dom"; import Link from "next/link"; import { usePathname } from "next/navigation"; import { navLinks } from "../utils/data"; -import ConnectWalletModal from "./connect-wallet-modal"; +import { ConnectWallet } from "./ui/modals/connect-wallet-modal"; export default function Navbar() { const pathname = usePathname(); const [isMenuOpen, setIsMenuOpen] = useState(false); - const [connectModalIsOpen, setConnectModalIsOpen] = useState(false); + const [isConnecting, setIsConnecting] = useState(false); const { address } = useAccount(); return ( -

+// +// ); +// }; -export default SubscribeForm; +// export default SubscribeForm; diff --git a/app/components/subscribe-form.tsx b/app/components/subscribe-form.tsx index 3afc5a8..7b98faf 100644 --- a/app/components/subscribe-form.tsx +++ b/app/components/subscribe-form.tsx @@ -1,7 +1,5 @@ "use client"; import React, { useCallback, useEffect, useState } from "react"; -import { createPortal } from "react-dom"; -import GrantPermissionModal from "./grant-permission-modal"; import { TokenPair } from "../utils/types"; import { STRK_TOKEN, USDT_TOKEN } from "../utils/data"; import { createSubscription, useContractWriteUtility } from "../utils/helper"; @@ -11,6 +9,7 @@ import { useRouter } from "next/navigation"; import { EditIcon } from "@/svgs/EditIcon"; import { ArrowRight, X } from "lucide-react"; import { useAccount } from "@starknet-react/core"; +import GrantPermission from "./ui/modals/grant-permission-modal"; interface SelectTokenProps { tokenPair?: TokenPair | undefined; @@ -70,17 +69,15 @@ const SubscribeForm = ({ return ( <> - {isPermissionModalOpen && - createPortal( - setIsPermissionModalOpen(false)} - handleSubmit={handleSubscribe} - />, - document.body - )} + setIsPermissionModalOpen((prev) => !prev)} + open={isPermissionModalOpen} + handleSubmit={handleSubscribe} + />
{hasCloseButton && ( + ); + })} + + + + + + ); +} diff --git a/app/components/ui/modals/disconnect-wallet-modal.tsx b/app/components/ui/modals/disconnect-wallet-modal.tsx new file mode 100644 index 0000000..d10b76d --- /dev/null +++ b/app/components/ui/modals/disconnect-wallet-modal.tsx @@ -0,0 +1,76 @@ +"use client"; +import { useAccount, useDisconnect } from "@starknet-react/core"; +import { ExternalLink } from "lucide-react"; +import { useRouter } from "next/navigation"; + +import { Dialog, DialogContent, DialogHeader, DialogTitle } from "../dialog"; +import useUnsubscribe from "@/app/hooks/useUnsubscribe"; +import { shortenAddress } from "@/app/utils/helper"; + +interface DisconnectWalletModalProps { + open: boolean; + onOpenChange: () => void; +} + +export default function DisconnectModal({ + open, + onOpenChange, +}: DisconnectWalletModalProps) { + const { disconnectAsync } = useDisconnect(); + const { address } = useAccount(); + const router = useRouter(); + const { handleUnsubscribe } = useUnsubscribe(); + + return ( + + + + + Wallet + + + +
+
+

Connected with Argent X / Braavos

+ +
+
+ +
+

+ osatuyipikin.braavos.eth +

+

+ {address && shortenAddress(address)} +

+
+
+

+ + View transaction history in explorer +

+ + +
+
+
+ ); +} diff --git a/app/components/ui/modals/grant-permission-modal.tsx b/app/components/ui/modals/grant-permission-modal.tsx new file mode 100644 index 0000000..f63436d --- /dev/null +++ b/app/components/ui/modals/grant-permission-modal.tsx @@ -0,0 +1,50 @@ +import React from "react"; +import { Dialog, DialogContent, DialogHeader, DialogTitle } from "../dialog"; + +interface GrantPermissionProps { + open: boolean; + onOpenChange: () => void; + handleSubmit: () => void; +} + +export default function GrantPermission({ + open, + onOpenChange, + handleSubmit, +}: GrantPermissionProps) { + return ( + + + + + Give Autoswappr Permission + + +
+

+ By clicking the 'Continue' button, you are giving + Autoswappr access to spend your tokens as soon as they get into your + wallet, so they can automatically be swapped to your preferred + stable base token. Do you wish to continue? +

+
+ + +
+
+
+
+ ); +} diff --git a/app/components/ui/modals/index.tsx b/app/components/ui/modals/index.tsx new file mode 100644 index 0000000..322a57c --- /dev/null +++ b/app/components/ui/modals/index.tsx @@ -0,0 +1,33 @@ +import { Drawer, DrawerContent } from "../drawer"; +import { Dialog, DialogContent, type ModalProps } from "../dialog"; +import { useMediaQuery } from "@/app/hooks/useMediaQuery"; +export function ModalView({ + open, + children, + + ...props +}: { + open: boolean; + children: React.ReactNode; +} & ModalProps) { + const isDesktop = useMediaQuery("(min-width: 768px)"); + + if (isDesktop) { + return ( + null}> + + {children} + + + ); + } + + return ( + null}> + {/* Open */} + +
{children}
+
+
+ ); +} diff --git a/app/hooks/useMediaQuery.ts b/app/hooks/useMediaQuery.ts new file mode 100644 index 0000000..759911f --- /dev/null +++ b/app/hooks/useMediaQuery.ts @@ -0,0 +1,29 @@ +"use client"; +import { useState, useEffect } from "react"; + +export function useMediaQuery(query: string) { + const [matches, setMatches] = useState(false); + + useEffect(() => { + const mediaQuery = window.matchMedia(query); + + // Function to handle media query changes + // @ts-expect-error/ban-ts-comment + const handleMediaQueryChange = (event) => { + setMatches(event.matches); + }; + + // Initial setup + handleMediaQueryChange(mediaQuery); + + // Attach the handler to respond to changes in the media query + mediaQuery.addEventListener("change", handleMediaQueryChange); + + // Clean up the listener when the component unmounts + return () => { + mediaQuery.removeEventListener("change", handleMediaQueryChange); + }; + }, [query]); + + return matches; +} diff --git a/app/hooks/useUnsubscribe.tsx b/app/hooks/useUnsubscribe.ts similarity index 100% rename from app/hooks/useUnsubscribe.tsx rename to app/hooks/useUnsubscribe.ts diff --git a/app/page.tsx b/app/page.tsx index 624a57c..c2b7891 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,25 +1,12 @@ "use client"; -import React, { useState } from "react"; -import LockBodyScroll from "./components/lock-body-scroll"; -import { createPortal } from "react-dom"; -import ConnectWalletModal from "./components/connect-wallet-modal"; -import WhatIsAutoSwapper from "./components/what-is-autoswappr"; -import LandingHeroSection from "./components/landing-hero-section"; -import WhyAutoSwappr from "./components/why-autoswappr"; -import HowToUseAutoSwappr from "./components/how-to-use-autoswappr"; - +import WhatIsAutoSwapper from "./components/layout/sections/what-is-autoswappr"; +import LandingHeroSection from "./components/layout/sections/landing-hero-section"; +import WhyAutoSwappr from "./components/layout/sections/why-autoswappr"; +import HowToUseAutoSwappr from "./components/layout/sections/how-to-use-autoswappr"; export default function Home() { - const [isModalOpen, setIsModalOpen] = useState(false); - return (
- - {isModalOpen && - createPortal( - setIsModalOpen(false)} />, - document.body - )} - + diff --git a/app/utils/data.ts b/app/utils/data.ts index 85b7c67..077295c 100644 --- a/app/utils/data.ts +++ b/app/utils/data.ts @@ -92,3 +92,9 @@ export const USDT_TOKEN: Coin = { contractAddress: usdt_token_contract_address, decimals: 18, }; + +export const walletDetails = { + argentX: { name: "Argent X", subtext: "WEBSITE", icon: "/argent.svg" }, + webwallet: { name: "Argent", subtext: "MOBILE", icon: "/argent.svg" }, + braavos: { name: "Braavos", subtext: "WEBSITE", icon: "/braavos.svg" }, +}; diff --git a/app/utils/helper.ts b/app/utils/helper.ts index 9d21add..ab5a8a0 100644 --- a/app/utils/helper.ts +++ b/app/utils/helper.ts @@ -6,6 +6,12 @@ import { useTransactionReceipt, } from "@starknet-react/core"; import { useMemo } from "react"; +import { clsx, type ClassValue } from "clsx"; +import { twMerge } from "tailwind-merge"; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} export function shortenAddress(address: string) { return `${address.slice(0, 6)}...${address.slice(-4)}`; diff --git a/package.json b/package.json index 5389b2e..0ad9e12 100644 --- a/package.json +++ b/package.json @@ -15,8 +15,11 @@ "@cartridge/connector": "0.3.46", "@headlessui/react": "2.2.0", "@nextui-org/react": "2.4.8", + "@radix-ui/react-dialog": "^1.1.13", "@starknet-react/chains": "3.0.0", "@starknet-react/core": "3.6.0", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", "framer-motion": "11.11.17", "get-starknet": "3.3.3", "get-starknet-core": "3.3.4", @@ -27,7 +30,9 @@ "react-dom": "18.0.0", "react-icons": "^5.4.0", "starknet": "6.11.0", - "tailwind-scrollbar-hide": "^1.1.7" + "tailwind-merge": "^3.3.0", + "tailwind-scrollbar-hide": "^1.1.7", + "vaul": "^1.1.2" }, "devDependencies": { "@commitlint/cli": "^19.5.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4e99797..ce94ce6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,12 +17,21 @@ importers: '@nextui-org/react': specifier: 2.4.8 version: 2.4.8(@types/react@18.3.12)(framer-motion@11.11.17(react-dom@18.0.0(react@18.0.0))(react@18.0.0))(react-dom@18.0.0(react@18.0.0))(react@18.0.0)(tailwindcss@3.4.15) + '@radix-ui/react-dialog': + specifier: ^1.1.13 + version: 1.1.13(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.0.0(react@18.0.0))(react@18.0.0) '@starknet-react/chains': specifier: 3.0.0 version: 3.0.0 '@starknet-react/core': specifier: 3.6.0 version: 3.6.0(get-starknet-core@3.3.4(starknet@6.11.0))(react@18.0.0)(starknet@6.11.0)(typescript@5.6.3) + class-variance-authority: + specifier: ^0.7.1 + version: 0.7.1 + clsx: + specifier: ^2.1.1 + version: 2.1.1 framer-motion: specifier: 11.11.17 version: 11.11.17(react-dom@18.0.0(react@18.0.0))(react@18.0.0) @@ -53,9 +62,15 @@ importers: starknet: specifier: 6.11.0 version: 6.11.0 + tailwind-merge: + specifier: ^3.3.0 + version: 3.3.0 tailwind-scrollbar-hide: specifier: ^1.1.7 version: 1.1.7 + vaul: + specifier: ^1.1.2 + version: 1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.0.0(react@18.0.0))(react@18.0.0) devDependencies: '@commitlint/cli': specifier: ^19.5.0 @@ -1054,6 +1069,177 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} + '@radix-ui/primitive@1.1.2': + resolution: {integrity: sha512-XnbHrrprsNqZKQhStrSwgRUQzoCI1glLzdw79xiZPoofhGICeZRSQ3dIxAKH1gb3OHfNf4d6f+vAv3kil2eggA==} + + '@radix-ui/react-compose-refs@1.1.2': + resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-context@1.1.2': + resolution: {integrity: sha512-jCi/QKUM2r1Ju5a3J64TH2A5SpKAgh0LpknyqdQ4m6DCV0xJ2HG1xARRwNGPQfi1SLdLWZ1OJz6F4OMBBNiGJA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-dialog@1.1.13': + resolution: {integrity: sha512-ARFmqUyhIVS3+riWzwGTe7JLjqwqgnODBUZdqpWar/z1WFs9z76fuOs/2BOWCR+YboRn4/WN9aoaGVwqNRr8VA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-dismissable-layer@1.1.9': + resolution: {integrity: sha512-way197PiTvNp+WBP7svMJasHl+vibhWGQDb6Mgf5mhEWJkgb85z7Lfl9TUdkqpWsf8GRNmoopx9ZxCyDzmgRMQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-focus-guards@1.1.2': + resolution: {integrity: sha512-fyjAACV62oPV925xFCrH8DR5xWhg9KYtJT4s3u54jxp+L/hbpTY2kIeEFFbFe+a/HCE94zGQMZLIpVTPVZDhaA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-focus-scope@1.1.6': + resolution: {integrity: sha512-r9zpYNUQY+2jWHWZGyddQLL9YHkM/XvSFHVcWs7bdVuxMAnCwTAuy6Pf47Z4nw7dYcUou1vg/VgjjrrH03VeBw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-id@1.1.1': + resolution: {integrity: sha512-kGkGegYIdQsOb4XjsfM97rXsiHaBwco+hFI66oO4s9LU+PLAC5oJ7khdOVFxkhsmlbpUqDAvXw11CluXP+jkHg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-portal@1.1.8': + resolution: {integrity: sha512-hQsTUIn7p7fxCPvao/q6wpbxmCwgLrlz+nOrJgC+RwfZqWY/WN+UMqkXzrtKbPrF82P43eCTl3ekeKuyAQbFeg==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-presence@1.1.4': + resolution: {integrity: sha512-ueDqRbdc4/bkaQT3GIpLQssRlFgWaL/U2z/S31qRwwLWoxHLgry3SIfCwhxeQNbirEUXFa+lq3RL3oBYXtcmIA==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-primitive@2.1.2': + resolution: {integrity: sha512-uHa+l/lKfxuDD2zjN/0peM/RhhSmRjr5YWdk/37EnSv1nJ88uvG85DPexSm8HdFQROd2VdERJ6ynXbkCFi+APw==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slot@1.2.2': + resolution: {integrity: sha512-y7TBO4xN4Y94FvcWIOIh18fM4R1A8S4q1jhoz4PNzOoHsFcN8pogcFmZrTYAm4F9VRUrWP/Mw7xSKybIeRI+CQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-callback-ref@1.1.1': + resolution: {integrity: sha512-FkBMwD+qbGQeMu1cOHnuGB6x4yzPjho8ap5WtbEJ26umhgqVXbhekKUQO+hZEL1vU92a3wHwdp0HAcqAUF5iDg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-controllable-state@1.2.2': + resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-effect-event@0.0.2': + resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-escape-keydown@1.1.1': + resolution: {integrity: sha512-Il0+boE7w/XebUHyBjroE+DbByORGR9KKmITzbR7MyQ4akpORYP/ZmbhAr0DG7RmmBqoOnZdy2QlvajJ2QA59g==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.1.1': + resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@react-aria/breadcrumbs@3.5.13': resolution: {integrity: sha512-G1Gqf/P6kVdfs94ovwP18fTWuIxadIQgHsXS08JEVcFVYMjb9YjqnEBaohUxD1tq2WldMbYw53ahQblT4NTG+g==} peerDependencies: @@ -1842,6 +2028,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.2: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} @@ -1962,6 +2152,9 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + class-variance-authority@0.7.1: + resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} @@ -3104,6 +3297,16 @@ packages: '@types/react': optional: true + react-remove-scroll-bar@2.3.8: + resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + react-remove-scroll@2.6.0: resolution: {integrity: sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ==} engines: {node: '>=10'} @@ -3114,6 +3317,16 @@ packages: '@types/react': optional: true + react-remove-scroll@2.6.3: + resolution: {integrity: sha512-pnAi91oOk8g8ABQKGF5/M9qxmmOPxaAnopyTHYfqYEwJhyFrbbBtHuSgtKEoH0jpcxx5o3hXqH1mNd9/Oi+8iQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + react-style-singleton@2.2.1: resolution: {integrity: sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==} engines: {node: '>=10'} @@ -3124,6 +3337,16 @@ packages: '@types/react': optional: true + react-style-singleton@2.2.3: + resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + react-textarea-autosize@8.5.6: resolution: {integrity: sha512-aT3ioKXMa8f6zHYGebhbdMD2L00tKeRX1zuVuDx9YQK/JLLRSaSxq3ugECEmUB9z2kvk6bFSIoRHLkkUv0RJiw==} engines: {node: '>=10'} @@ -3350,6 +3573,9 @@ packages: tailwind-merge@1.14.0: resolution: {integrity: sha512-3mFKyCo/MBcgyOTlrY8T7odzZFx+w+qKSMAmdFzRvqBfLlSigU6TZnlFHK0lkMwj9Bj8OYU+9yW9lmGuS0QEnQ==} + tailwind-merge@3.3.0: + resolution: {integrity: sha512-fyW/pEfcQSiigd5SNn0nApUOxx0zB/dm6UDU/rEwc2c3sX2smWUNbapHv+QRqLGVp9GWX3THIa7MUGPo+YkDzQ==} + tailwind-scrollbar-hide@1.1.7: resolution: {integrity: sha512-X324n9OtpTmOMqEgDUEA/RgLrNfBF/jwJdctaPZDzB3mppxJk7TLIDmOreEDm1Bq4R9LSPu4Epf8VSdovNU+iA==} @@ -3476,6 +3702,16 @@ packages: '@types/react': optional: true + use-callback-ref@1.3.3: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + use-composed-ref@1.4.0: resolution: {integrity: sha512-djviaxuOOh7wkj0paeO1Q/4wMZ8Zrnag5H6yBvzN7AKKe8beOaED9SF5/ByLqsku8NP4zQqsvM2u3ew/tJK8/w==} peerDependencies: @@ -3513,9 +3749,25 @@ packages: '@types/react': optional: true + use-sidecar@1.1.3: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + util-deprecate@1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + vaul@1.1.2: + resolution: {integrity: sha512-ZFkClGpWyI2WUQjdLJ/BaGuV6AVQiJ3uELGk3OYtP+B6yCO7Cmn9vPFXVJkRaGkOJu3m8bQMgtyzNHixULceQA==} + peerDependencies: + react: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0.0 || ^19.0.0-rc + viem@2.21.55: resolution: {integrity: sha512-PgXew7C11cAuEtOSgRyQx2kJxEOPUwIwZA9dMglRByqJuFVA7wSGZZOOo/93iylAA8E15bEdqy9xulU3oKZ70Q==} peerDependencies: @@ -5053,6 +5305,149 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true + '@radix-ui/primitive@1.1.2': {} + + '@radix-ui/react-compose-refs@1.1.2(@types/react@18.3.12)(react@18.0.0)': + dependencies: + react: 18.0.0 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-context@1.1.2(@types/react@18.3.12)(react@18.0.0)': + dependencies: + react: 18.0.0 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-dialog@1.1.13(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.0.0(react@18.0.0))(react@18.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@18.0.0) + '@radix-ui/react-context': 1.1.2(@types/react@18.3.12)(react@18.0.0) + '@radix-ui/react-dismissable-layer': 1.1.9(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.0.0(react@18.0.0))(react@18.0.0) + '@radix-ui/react-focus-guards': 1.1.2(@types/react@18.3.12)(react@18.0.0) + '@radix-ui/react-focus-scope': 1.1.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.0.0(react@18.0.0))(react@18.0.0) + '@radix-ui/react-id': 1.1.1(@types/react@18.3.12)(react@18.0.0) + '@radix-ui/react-portal': 1.1.8(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.0.0(react@18.0.0))(react@18.0.0) + '@radix-ui/react-presence': 1.1.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.0.0(react@18.0.0))(react@18.0.0) + '@radix-ui/react-primitive': 2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.0.0(react@18.0.0))(react@18.0.0) + '@radix-ui/react-slot': 1.2.2(@types/react@18.3.12)(react@18.0.0) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@18.3.12)(react@18.0.0) + aria-hidden: 1.2.4 + react: 18.0.0 + react-dom: 18.0.0(react@18.0.0) + react-remove-scroll: 2.6.3(@types/react@18.3.12)(react@18.0.0) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-dismissable-layer@1.1.9(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.0.0(react@18.0.0))(react@18.0.0)': + dependencies: + '@radix-ui/primitive': 1.1.2 + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@18.0.0) + '@radix-ui/react-primitive': 2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.0.0(react@18.0.0))(react@18.0.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.12)(react@18.0.0) + '@radix-ui/react-use-escape-keydown': 1.1.1(@types/react@18.3.12)(react@18.0.0) + react: 18.0.0 + react-dom: 18.0.0(react@18.0.0) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-focus-guards@1.1.2(@types/react@18.3.12)(react@18.0.0)': + dependencies: + react: 18.0.0 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-focus-scope@1.1.6(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.0.0(react@18.0.0))(react@18.0.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@18.0.0) + '@radix-ui/react-primitive': 2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.0.0(react@18.0.0))(react@18.0.0) + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.12)(react@18.0.0) + react: 18.0.0 + react-dom: 18.0.0(react@18.0.0) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-id@1.1.1(@types/react@18.3.12)(react@18.0.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.12)(react@18.0.0) + react: 18.0.0 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-portal@1.1.8(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.0.0(react@18.0.0))(react@18.0.0)': + dependencies: + '@radix-ui/react-primitive': 2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.0.0(react@18.0.0))(react@18.0.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.12)(react@18.0.0) + react: 18.0.0 + react-dom: 18.0.0(react@18.0.0) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-presence@1.1.4(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.0.0(react@18.0.0))(react@18.0.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@18.0.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.12)(react@18.0.0) + react: 18.0.0 + react-dom: 18.0.0(react@18.0.0) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-primitive@2.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.0.0(react@18.0.0))(react@18.0.0)': + dependencies: + '@radix-ui/react-slot': 1.2.2(@types/react@18.3.12)(react@18.0.0) + react: 18.0.0 + react-dom: 18.0.0(react@18.0.0) + optionalDependencies: + '@types/react': 18.3.12 + '@types/react-dom': 18.3.1 + + '@radix-ui/react-slot@1.2.2(@types/react@18.3.12)(react@18.0.0)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@18.3.12)(react@18.0.0) + react: 18.0.0 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-use-callback-ref@1.1.1(@types/react@18.3.12)(react@18.0.0)': + dependencies: + react: 18.0.0 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@18.3.12)(react@18.0.0)': + dependencies: + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@18.3.12)(react@18.0.0) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.12)(react@18.0.0) + react: 18.0.0 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-use-effect-event@0.0.2(@types/react@18.3.12)(react@18.0.0)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.12)(react@18.0.0) + react: 18.0.0 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-use-escape-keydown@1.1.1(@types/react@18.3.12)(react@18.0.0)': + dependencies: + '@radix-ui/react-use-callback-ref': 1.1.1(@types/react@18.3.12)(react@18.0.0) + react: 18.0.0 + optionalDependencies: + '@types/react': 18.3.12 + + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@18.3.12)(react@18.0.0)': + dependencies: + react: 18.0.0 + optionalDependencies: + '@types/react': 18.3.12 + '@react-aria/breadcrumbs@3.5.13(react@18.0.0)': dependencies: '@react-aria/i18n': 3.12.4(react@18.0.0) @@ -6261,6 +6656,10 @@ snapshots: argparse@2.0.1: {} + aria-hidden@1.2.4: + dependencies: + tslib: 2.8.1 + aria-query@5.3.2: {} array-buffer-byte-length@1.0.1: @@ -6419,6 +6818,10 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + class-variance-authority@0.7.1: + dependencies: + clsx: 2.1.1 + client-only@0.0.1: {} cliui@8.0.1: @@ -7640,6 +8043,14 @@ snapshots: optionalDependencies: '@types/react': 18.3.12 + react-remove-scroll-bar@2.3.8(@types/react@18.3.12)(react@18.0.0): + dependencies: + react: 18.0.0 + react-style-singleton: 2.2.3(@types/react@18.3.12)(react@18.0.0) + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.12 + react-remove-scroll@2.6.0(@types/react@18.3.12)(react@18.0.0): dependencies: react: 18.0.0 @@ -7651,6 +8062,17 @@ snapshots: optionalDependencies: '@types/react': 18.3.12 + react-remove-scroll@2.6.3(@types/react@18.3.12)(react@18.0.0): + dependencies: + react: 18.0.0 + react-remove-scroll-bar: 2.3.8(@types/react@18.3.12)(react@18.0.0) + react-style-singleton: 2.2.3(@types/react@18.3.12)(react@18.0.0) + tslib: 2.8.1 + use-callback-ref: 1.3.3(@types/react@18.3.12)(react@18.0.0) + use-sidecar: 1.1.3(@types/react@18.3.12)(react@18.0.0) + optionalDependencies: + '@types/react': 18.3.12 + react-style-singleton@2.2.1(@types/react@18.3.12)(react@18.0.0): dependencies: get-nonce: 1.0.1 @@ -7660,6 +8082,14 @@ snapshots: optionalDependencies: '@types/react': 18.3.12 + react-style-singleton@2.2.3(@types/react@18.3.12)(react@18.0.0): + dependencies: + get-nonce: 1.0.1 + react: 18.0.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.12 + react-textarea-autosize@8.5.6(@types/react@18.3.12)(react@18.0.0): dependencies: '@babel/runtime': 7.26.0 @@ -7945,6 +8375,8 @@ snapshots: tailwind-merge@1.14.0: {} + tailwind-merge@3.3.0: {} + tailwind-scrollbar-hide@1.1.7: {} tailwind-variants@0.1.20(tailwindcss@3.4.15): @@ -8096,6 +8528,13 @@ snapshots: optionalDependencies: '@types/react': 18.3.12 + use-callback-ref@1.3.3(@types/react@18.3.12)(react@18.0.0): + dependencies: + react: 18.0.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.12 + use-composed-ref@1.4.0(@types/react@18.3.12)(react@18.0.0): dependencies: react: 18.0.0 @@ -8123,8 +8562,25 @@ snapshots: optionalDependencies: '@types/react': 18.3.12 + use-sidecar@1.1.3(@types/react@18.3.12)(react@18.0.0): + dependencies: + detect-node-es: 1.1.0 + react: 18.0.0 + tslib: 2.8.1 + optionalDependencies: + '@types/react': 18.3.12 + util-deprecate@1.0.2: {} + vaul@1.1.2(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.0.0(react@18.0.0))(react@18.0.0): + dependencies: + '@radix-ui/react-dialog': 1.1.13(@types/react-dom@18.3.1)(@types/react@18.3.12)(react-dom@18.0.0(react@18.0.0))(react@18.0.0) + react: 18.0.0 + react-dom: 18.0.0(react@18.0.0) + transitivePeerDependencies: + - '@types/react' + - '@types/react-dom' + viem@2.21.55(typescript@5.6.3)(zod@3.23.8): dependencies: '@noble/curves': 1.7.0 @@ -8235,4 +8691,4 @@ snapshots: yocto-queue@1.1.1: {} - zod@3.23.8: {} \ No newline at end of file + zod@3.23.8: {}