@@ -567,8 +572,8 @@ const Publisher = ({
})}
>
0n && {
actions: (
0n && {
actions: (
(
{name}
-
+
{children}
diff --git a/apps/staking/src/components/Root/index.tsx b/apps/staking/src/components/Root/index.tsx
index fa327abe95..a9badcc16f 100644
--- a/apps/staking/src/components/Root/index.tsx
+++ b/apps/staking/src/components/Root/index.tsx
@@ -19,6 +19,7 @@ import { Footer } from "../Footer";
import { Header } from "../Header";
import { MaxWidth } from "../MaxWidth";
import { ReportAccessibility } from "../ReportAccessibility";
+import { RouterProvider } from "../RouterProvider";
import { WalletProvider } from "../WalletProvider";
const redHatText = Red_Hat_Text({
@@ -36,32 +37,36 @@ type Props = {
};
export const Root = ({ children }: Props) => (
-
-
-
-
-
-
- {children}
-
-
- {GOOGLE_ANALYTICS_ID && (
-
- )}
- {AMPLITUDE_API_KEY && }
- {!IS_PRODUCTION_SERVER && }
-
-
-
-
+
+
+
+
+
+
+
+ {children}
+
+
+ {GOOGLE_ANALYTICS_ID && (
+
+ )}
+ {AMPLITUDE_API_KEY && }
+ {!IS_PRODUCTION_SERVER && }
+
+
+
+
+
);
diff --git a/apps/staking/src/components/RouterProvider/index.tsx b/apps/staking/src/components/RouterProvider/index.tsx
new file mode 100644
index 0000000000..b5ec660ae4
--- /dev/null
+++ b/apps/staking/src/components/RouterProvider/index.tsx
@@ -0,0 +1,19 @@
+"use client";
+
+import { useRouter } from "next/navigation";
+import { type ComponentProps, useCallback } from "react";
+import { RouterProvider as ReactAriaRouterProvider } from "react-aria-components";
+
+export const RouterProvider = (
+ props: Omit , "navigate">,
+) => {
+ const router = useRouter();
+ const navigate = useCallback(
+ (...params: Parameters) => {
+ router.push(...params);
+ },
+ [router],
+ );
+
+ return ;
+};
diff --git a/apps/staking/src/components/TransferButton/index.tsx b/apps/staking/src/components/TransferButton/index.tsx
index a94afc1bae..67ba4e0059 100644
--- a/apps/staking/src/components/TransferButton/index.tsx
+++ b/apps/staking/src/components/TransferButton/index.tsx
@@ -1,24 +1,30 @@
-import { Field, Input, Label } from "@headlessui/react";
import type { PythStakingClient } from "@pythnetwork/staking-sdk";
import type { PublicKey } from "@solana/web3.js";
import {
- type ChangeEvent,
type ComponentProps,
type ReactNode,
+ type FormEvent,
useCallback,
useMemo,
useState,
} from "react";
+import {
+ DialogTrigger,
+ TextField,
+ Label,
+ Input,
+ Form,
+ Group,
+} from "react-aria-components";
-import { useLogger } from "../../hooks/use-logger";
import { StateType, useTransfer } from "../../hooks/use-transfer";
import { stringToTokens, tokensToString } from "../../tokens";
import { Button } from "../Button";
-import { Modal, ModalButton, ModalPanel } from "../Modal";
+import { ModalDialog } from "../ModalDialog";
import { Tokens } from "../Tokens";
import PythTokensIcon from "../Tokens/pyth.svg";
-type Props = {
+type Props = Omit, "children"> & {
actionName: string;
actionDescription: string;
title?: string | undefined;
@@ -34,10 +40,6 @@ type Props = {
stakingAccount: PublicKey,
amount: bigint,
) => Promise;
- className?: string | undefined;
- secondary?: boolean | undefined;
- small?: boolean | undefined;
- disabled?: boolean | undefined;
};
export const TransferButton = ({
@@ -48,128 +50,54 @@ export const TransferButton = ({
max,
transfer,
children,
- className,
- secondary,
- small,
- disabled,
+ ...props
}: Props) => {
- const { amountInput, setAmount, updateAmount, resetAmount, amount } =
- useAmountInput(max);
- const doTransfer = useCallback(
- (client: PythStakingClient, stakingAccount: PublicKey) =>
- amount.type === AmountType.Valid
- ? transfer(client, stakingAccount, amount.amount)
- : Promise.reject(new InvalidAmountError()),
- [amount, transfer],
- );
- const setMax = useCallback(() => {
- setAmount(tokensToString(max));
- }, [setAmount, max]);
-
- const { state, execute } = useTransfer(doTransfer);
- const isSubmitting = state.type === StateType.Submitting;
+ const [closeDisabled, setCloseDisabled] = useState(false);
return (
-
-
- {actionName}
-
-
+
+
- {(close) => (
- <>
-
-
-
-
- {max}
- Max
-
-
-
- {state.type === StateType.Error && (
-
- Uh oh, an error occurred! Please try again
-
- )}
-
- {children && (
- <>
- {typeof children === "function" ? children(amount) : children}
- >
- )}
-
- {submitButtonText ?? actionName}
-
- >
+ {({ close }) => (
+
+ {children}
+
)}
-
-
+
+
);
};
-type ExecuteButtonProps = Omit<
- ComponentProps,
- "onClick" | "disabled" | "children"
-> & {
- children: ReactNode | ReactNode[];
- amount: Amount;
- execute: () => Promise;
+type DialogContentsProps = {
+ max: bigint;
+ children: Props["children"];
+ transfer: Props["transfer"];
+ setCloseDisabled: (value: boolean) => void;
+ submitButtonText: string;
close: () => void;
};
-const ExecuteButton = ({
- amount,
- execute,
- close,
+const DialogContents = ({
+ max,
+ transfer,
children,
- ...props
-}: ExecuteButtonProps) => {
- const logger = useLogger();
- const handleClick = useCallback(async () => {
- try {
- await execute();
- close();
- } catch (error: unknown) {
- logger.error(error);
- }
- }, [execute, close, logger]);
- const contents = useMemo(() => {
+ submitButtonText,
+ setCloseDisabled,
+ close,
+}: DialogContentsProps) => {
+ const { amount, setAmount, setMax, stringValue } = useAmountInput(max);
+
+ const validationError = useMemo(() => {
switch (amount.type) {
case AmountType.Empty: {
return "Enter an amount";
@@ -184,46 +112,114 @@ const ExecuteButton = ({
return "Enter a valid amount";
}
case AmountType.Valid: {
- return children;
+ return;
}
}
- }, [amount, children]);
+ }, [amount]);
+
+ const doTransfer = useCallback(
+ (client: PythStakingClient, stakingAccount: PublicKey) =>
+ amount.type === AmountType.Valid
+ ? transfer(client, stakingAccount, amount.amount)
+ : Promise.reject(new InvalidAmountError()),
+ [amount, transfer],
+ );
+
+ const { execute, state } = useTransfer(doTransfer);
+
+ const handleSubmit = useCallback(
+ (e: FormEvent) => {
+ e.preventDefault();
+ setCloseDisabled(true);
+ execute()
+ .then(() => {
+ close();
+ })
+ .catch(() => {
+ /* no-op since this is already handled in the UI using `state` and is logged in useTransfer */
+ })
+ .finally(() => {
+ setCloseDisabled(false);
+ });
+ },
+ [execute, close, setCloseDisabled],
+ );
return (
-
+
);
};
const useAmountInput = (max: bigint) => {
- const [amountInput, setAmountInput] = useState("");
+ const [stringValue, setAmount] = useState("");
return {
- amountInput,
-
- setAmount: setAmountInput,
+ stringValue,
- updateAmount: useCallback(
- (event: ChangeEvent) => {
- setAmountInput(event.target.value);
- },
- [setAmountInput],
- ),
+ setAmount,
- resetAmount: useCallback(() => {
- setAmountInput("");
- }, [setAmountInput]),
+ setMax: useCallback(() => {
+ setAmount(tokensToString(max));
+ }, [setAmount, max]),
amount: useMemo((): Amount => {
- if (amountInput === "") {
+ if (stringValue === "") {
return Amount.Empty();
} else {
- const amountAsTokens = stringToTokens(amountInput);
+ const amountAsTokens = stringToTokens(stringValue);
if (amountAsTokens === undefined) {
return Amount.Invalid();
} else if (amountAsTokens > max) {
@@ -234,7 +230,7 @@ const useAmountInput = (max: bigint) => {
return Amount.Valid(amountAsTokens);
}
}
- }, [amountInput, max]),
+ }, [stringValue, max]),
};
};
diff --git a/apps/staking/src/components/WalletButton/index.tsx b/apps/staking/src/components/WalletButton/index.tsx
index 7040325d31..df788065c3 100644
--- a/apps/staking/src/components/WalletButton/index.tsx
+++ b/apps/staking/src/components/WalletButton/index.tsx
@@ -1,17 +1,5 @@
"use client";
-import {
- Menu,
- MenuButton,
- MenuItem,
- MenuItems,
- MenuSection,
- MenuSeparator,
- Listbox,
- ListboxButton,
- ListboxOptions,
- ListboxOption,
-} from "@headlessui/react";
import {
WalletIcon,
ArrowsRightLeftIcon,
@@ -20,6 +8,7 @@ import {
TableCellsIcon,
BanknotesIcon,
ChevronRightIcon,
+ CheckIcon,
} from "@heroicons/react/24/outline";
import { useWallet } from "@solana/wallet-adapter-react";
import { useWalletModal } from "@solana/wallet-adapter-react-ui";
@@ -30,19 +19,26 @@ import {
type ComponentType,
type SVGAttributes,
type ReactNode,
- type ElementType,
- type Ref,
useCallback,
useMemo,
useState,
- forwardRef,
} from "react";
+import {
+ Menu,
+ MenuItem,
+ MenuTrigger,
+ Popover,
+ Separator,
+ Section,
+ SubmenuTrigger,
+} from "react-aria-components";
+import { useLogger } from "../../hooks/use-logger";
import { usePrimaryDomain } from "../../hooks/use-primary-domain";
import { StateType, useStakeAccount } from "../../hooks/use-stake-account";
import { AccountHistory } from "../AccountHistory";
import { Button } from "../Button";
-import { RawModal } from "../Modal";
+import { ModalDialog } from "../ModalDialog";
type Props = Omit, "onClick" | "children">;
@@ -56,113 +52,129 @@ export const WalletButton = (props: Props) => {
);
};
-const ConnectedButton = (props: Props) => {
+const ConnectedButton = ({ className, ...props }: Props) => {
const [accountHistoryOpen, setAccountHistoryOpen] = useState(false);
- const openAccountHistory = useCallback(
- () =>
- setTimeout(() => {
- setAccountHistoryOpen(true);
- }, 300),
- [setAccountHistoryOpen],
- );
- const closeAccountHistory = useCallback(() => {
- setAccountHistoryOpen(false);
+ const openAccountHistory = useCallback(() => {
+ setAccountHistoryOpen(true);
}, [setAccountHistoryOpen]);
-
- const wallet = useWallet();
const modal = useWalletModal();
const showModal = useCallback(() => {
modal.setVisible(true);
}, [modal]);
const stakeAccountState = useStakeAccount();
+ const wallet = useWallet();
+ const logger = useLogger();
+ const disconnectWallet = useCallback(() => {
+ wallet.disconnect().catch((error: unknown) => {
+ logger.error(error);
+ });
+ }, [wallet, logger]);
return (
<>
-
-
-
-
+ Select stake account
+
+
+ ({
+ account,
+ id: account.address.toBase58(),
+ }))}
+ >
+ {(item) => (
+ {
+ stakeAccountState.selectAccount(item.account);
+ }}
+ className={clsx({
+ "font-semibold":
+ item.account === stakeAccountState.account,
+ })}
+ isDisabled={item.account === stakeAccountState.account}
+ >
+
+
+ {item.account.address}
+
+
+ )}
+
+
+
+
+ >
+ )}
+
+
+ Change wallet
+
+
+ Disconnect
+
+
+
+
+ {stakeAccountState.type === StateType.Loaded && (
+
+
+
+ )}
>
);
};
+const StyledMenu = ({
+ className,
+ ...props
+}: ComponentProps>) => (
+
+
+
+);
+
const ButtonContent = () => {
const wallet = useWallet();
const primaryDomain = usePrimaryDomain();
@@ -185,34 +197,30 @@ const TruncatedKey = ({ children }: { children: PublicKey | `0x${string}` }) =>
return asString.slice(0, isHex ? 6 : 4) + ".." + asString.slice(-4);
}, [children]);
-type WalletMenuItemProps = Omit<
- ComponentProps,
- "as" | "icon"
-> & {
- as?: T;
+type WalletMenuItemProps = Omit, "children"> & {
icon?: ComponentType>;
+ children: ReactNode;
};
-const WalletMenuItemImpl = (
- { as, children, icon: Icon, className, ...props }: WalletMenuItemProps,
- ref: Ref,
-) => {
- const Component = as ?? "button";
- return (
-
- {Icon && }
- {children}
-
- );
-};
-const WalletMenuItem = forwardRef(WalletMenuItemImpl);
+const WalletMenuItem = ({
+ children,
+ icon: Icon,
+ className,
+ textValue,
+ ...props
+}: WalletMenuItemProps) => (
+
+);
const DisconnectedButton = (props: Props) => {
const modal = useWalletModal();
@@ -221,17 +229,13 @@ const DisconnectedButton = (props: Props) => {
}, [modal]);
return (
-
+
Connect wallet
);
};
-type ButtonComponentProps = Omit<
- ComponentProps,
- "children" | "className"
-> & {
- className?: string | undefined;
+type ButtonComponentProps = Omit, "children"> & {
children: ReactNode | ReactNode[];
};
diff --git a/apps/staking/src/hooks/use-transfer.ts b/apps/staking/src/hooks/use-transfer.ts
index d73db5a1b8..7ff240efe6 100644
--- a/apps/staking/src/hooks/use-transfer.ts
+++ b/apps/staking/src/hooks/use-transfer.ts
@@ -5,6 +5,7 @@ import { useSWRConfig } from "swr";
import { getCacheKey as getAccountHistoryCacheKey } from "./use-account-history";
import { getCacheKey as getDashboardDataCacheKey } from "./use-dashboard-data";
+import { useLogger } from "./use-logger";
import { useSelectedStakeAccount } from "./use-stake-account";
export const useTransfer = (
@@ -14,6 +15,7 @@ export const useTransfer = (
) => Promise,
) => {
const { client, account } = useSelectedStakeAccount();
+ const logger = useLogger();
const [state, setState] = useState(State.Base());
const { mutate } = useSWRConfig();
@@ -33,10 +35,11 @@ export const useTransfer = (
]);
setState(State.Complete());
} catch (error: unknown) {
+ logger.error(error);
setState(State.ErrorState(error));
throw error;
}
- }, [state, client, account.address, transfer, setState, mutate]);
+ }, [state, client, account.address, transfer, setState, mutate, logger]);
return { state, execute };
};
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 94ee032771..6355639e7a 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -111,7 +111,7 @@ importers:
version: 4.9.1
'@cprussin/eslint-config':
specifier: ^3.0.0
- version: 3.0.0(@typescript-eslint/eslint-plugin@7.13.1(@typescript-eslint/parser@7.13.1(eslint@9.5.0)(typescript@5.5.2))(eslint@9.5.0)(typescript@5.5.2))(@typescript-eslint/parser@7.13.1(eslint@9.5.0)(typescript@5.5.2))(jest@29.7.0(@types/node@20.14.7)(ts-node@10.9.2(@types/node@20.14.7)(typescript@5.5.2)))(ts-node@10.9.2(@types/node@20.14.7)(typescript@5.5.2))(typescript@5.5.2)
+ version: 3.0.0(@typescript-eslint/eslint-plugin@7.13.1(eslint@9.5.0)(typescript@5.5.2))(jest@29.7.0(@types/node@20.14.7)(ts-node@10.9.2(@types/node@20.14.7)(typescript@5.5.2)))(ts-node@10.9.2(@types/node@20.14.7)(typescript@5.5.2))(typescript@5.5.2)
'@cprussin/jest-config':
specifier: ^1.4.1
version: 1.4.1(@babel/core@7.24.7)(@jest/globals@29.7.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(@types/jest@29.5.12)(@types/node@20.14.7)(babel-jest@29.7.0(@babel/core@7.24.7))(bufferutil@4.0.8)(eslint@9.5.0)(ts-node@10.9.2(@types/node@20.14.7)(typescript@5.5.2))(utf-8-validate@5.0.10)
@@ -327,9 +327,6 @@ importers:
'@bonfida/spl-name-service':
specifier: ^3.0.0
version: 3.0.1(@solana/web3.js@1.92.3(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(encoding@0.1.13)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10)
- '@headlessui/react':
- specifier: ^2.1.2
- version: 2.1.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@heroicons/react':
specifier: ^2.1.4
version: 2.1.4(react@18.3.1)
@@ -384,16 +381,13 @@ importers:
swr:
specifier: ^2.2.5
version: 2.2.5(react@18.3.1)
- zod:
- specifier: ^3.23.8
- version: 3.23.8
devDependencies:
'@axe-core/react':
specifier: ^4.9.1
version: 4.9.1
'@cprussin/eslint-config':
specifier: ^3.0.0
- version: 3.0.0(@typescript-eslint/eslint-plugin@7.13.1(eslint@9.9.0(jiti@1.21.0))(typescript@5.5.4))(jest@29.7.0(@types/node@22.2.0)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4)))(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)
+ version: 3.0.0(@typescript-eslint/eslint-plugin@7.13.1(@typescript-eslint/parser@7.13.1(eslint@9.5.0)(typescript@5.5.4))(eslint@9.9.0(jiti@1.21.0))(typescript@5.5.4))(@typescript-eslint/parser@7.13.1(eslint@9.5.0)(typescript@5.5.4))(jest@29.7.0(@types/node@22.2.0)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4)))(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)
'@cprussin/jest-config':
specifier: ^1.4.1
version: 1.4.1(@babel/core@7.24.7)(@jest/globals@29.7.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(@types/jest@29.5.12)(@types/node@22.2.0)(babel-jest@29.7.0(@babel/core@7.24.7))(bufferutil@4.0.8)(eslint@9.9.0(jiti@1.21.0))(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(utf-8-validate@5.0.10)
@@ -4360,13 +4354,6 @@ packages:
react: ^18
react-dom: ^18
- '@headlessui/react@2.1.3':
- resolution: {integrity: sha512-Nt+NlnQbVvMHVZ/QsST6DNyfG8VWqjOYY3eZpp0PrRKpmZw+pzhwQ1F6wtNaW4jnudeC2a5MJC70vbGVcETNIg==}
- engines: {node: '>=10'}
- peerDependencies:
- react: ^18
- react-dom: ^18
-
'@heroicons/react@2.1.4':
resolution: {integrity: sha512-ju0wj0wwrUTMQ2Yceyrma7TKuI3BpSjp+qKqV81K9KGcUHdvTMdiwfRc2cwXBp3uXtKuDZkh0v03nWOQnJFv2Q==}
peerDependencies:
@@ -7806,12 +7793,6 @@ packages:
react: '>=16'
react-dom: '>=16'
- '@tanstack/react-virtual@3.10.4':
- resolution: {integrity: sha512-Y2y1QJN3e5gNTG4wlZcoW2IAFrVCuho80oyeODKKFVSbAhJAXmkDNH3ZztM6EQij5ueqpqgz5FlsgKP9TGjImA==}
- peerDependencies:
- react: ^16.8.0 || ^17.0.0 || ^18.0.0
- react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
-
'@tanstack/react-virtual@3.5.0':
resolution: {integrity: sha512-rtvo7KwuIvqK9zb0VZ5IL7fiJAEnG+0EiFZz8FUOs+2mhGqdGmjKIaT1XU7Zq0eFqL0jonLlhbayJI/J2SA/Bw==}
peerDependencies:
@@ -7822,9 +7803,6 @@ packages:
resolution: {integrity: sha512-OvKx7v0qJTyPkMhqsWzVPZnARiqdGvDvEg8tZ/GSQs7t0Vb2sdtkGg7cdzUZ67sIg9o5/gSwvvT84ouSaP8euA==}
engines: {node: '>=12'}
- '@tanstack/virtual-core@3.10.4':
- resolution: {integrity: sha512-yHyli4RHVsI+eJ0RjmOsjA9RpHp3/Zah9t+iRjmFa72dq00TeG/NwuLYuCV6CB4RkWD4i5RD421j1eb6BdKgvQ==}
-
'@tanstack/virtual-core@3.5.0':
resolution: {integrity: sha512-KnPRCkQTyqhanNC0K63GBG3wA8I+D1fQuVnAvcBF8f13akOKeQp1gSbu6f77zCxhEk727iV5oQnbHLYzHrECLg==}
@@ -24343,7 +24321,7 @@ snapshots:
transitivePeerDependencies:
- debug
- '@cprussin/eslint-config@3.0.0(@typescript-eslint/eslint-plugin@7.13.1(@typescript-eslint/parser@7.13.1(eslint@9.5.0)(typescript@5.5.2))(eslint@9.5.0)(typescript@5.5.2))(@typescript-eslint/parser@7.13.1(eslint@9.5.0)(typescript@5.5.2))(jest@29.7.0(@types/node@20.14.7)(ts-node@10.9.2(@types/node@20.14.7)(typescript@5.5.2)))(ts-node@10.9.2(@types/node@20.14.7)(typescript@5.5.2))(typescript@5.5.2)':
+ '@cprussin/eslint-config@3.0.0(@typescript-eslint/eslint-plugin@7.13.1(@typescript-eslint/parser@7.13.1(eslint@9.5.0)(typescript@5.5.4))(eslint@9.9.0(jiti@1.21.0))(typescript@5.5.4))(@typescript-eslint/parser@7.13.1(eslint@9.5.0)(typescript@5.5.4))(jest@29.7.0(@types/node@22.2.0)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4)))(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)':
dependencies:
'@babel/core': 7.24.7
'@babel/eslint-parser': 7.24.7(@babel/core@7.24.7)(eslint@9.5.0)
@@ -24355,22 +24333,22 @@ snapshots:
eslint: 9.5.0
eslint-config-prettier: 9.1.0(eslint@9.5.0)
eslint-config-turbo: 1.13.4(eslint@9.5.0)
- eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.13.1(eslint@9.5.0)(typescript@5.5.2))(eslint@9.5.0)
- eslint-plugin-jest: 28.6.0(@typescript-eslint/eslint-plugin@7.13.1(@typescript-eslint/parser@7.13.1(eslint@9.5.0)(typescript@5.5.2))(eslint@9.5.0)(typescript@5.5.2))(eslint@9.5.0)(jest@29.7.0(@types/node@20.14.7)(ts-node@10.9.2(@types/node@20.14.7)(typescript@5.5.2)))(typescript@5.5.2)
+ eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.13.1(eslint@9.5.0)(typescript@5.5.4))(eslint@9.5.0)
+ eslint-plugin-jest: 28.6.0(@typescript-eslint/eslint-plugin@7.13.1(@typescript-eslint/parser@7.13.1(eslint@9.5.0)(typescript@5.5.4))(eslint@9.9.0(jiti@1.21.0))(typescript@5.5.4))(eslint@9.5.0)(jest@29.7.0(@types/node@22.2.0)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4)))(typescript@5.5.4)
eslint-plugin-jest-dom: 5.4.0(eslint@9.5.0)
eslint-plugin-jsonc: 2.16.0(eslint@9.5.0)
eslint-plugin-jsx-a11y: 6.8.0(eslint@9.5.0)
eslint-plugin-n: 17.9.0(eslint@9.5.0)
eslint-plugin-react: 7.34.2(eslint@9.5.0)
eslint-plugin-react-hooks: 4.6.2(eslint@9.5.0)
- eslint-plugin-storybook: 0.8.0(eslint@9.5.0)(typescript@5.5.2)
- eslint-plugin-tailwindcss: 3.17.3(tailwindcss@3.4.4(ts-node@10.9.2(@types/node@20.14.7)(typescript@5.5.2)))
- eslint-plugin-testing-library: 6.2.2(eslint@9.5.0)(typescript@5.5.2)
+ eslint-plugin-storybook: 0.8.0(eslint@9.5.0)(typescript@5.5.4)
+ eslint-plugin-tailwindcss: 3.17.3(tailwindcss@3.4.4(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4)))
+ eslint-plugin-testing-library: 6.2.2(eslint@9.5.0)(typescript@5.5.4)
eslint-plugin-tsdoc: 0.3.0
eslint-plugin-unicorn: 53.0.0(eslint@9.5.0)
globals: 15.6.0
- tailwindcss: 3.4.4(ts-node@10.9.2(@types/node@20.14.7)(typescript@5.5.2))
- typescript-eslint: 7.13.1(eslint@9.5.0)(typescript@5.5.2)
+ tailwindcss: 3.4.4(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))
+ typescript-eslint: 7.13.1(eslint@9.5.0)(typescript@5.5.4)
transitivePeerDependencies:
- '@testing-library/dom'
- '@typescript-eslint/eslint-plugin'
@@ -24421,7 +24399,7 @@ snapshots:
- ts-node
- typescript
- '@cprussin/eslint-config@3.0.0(@typescript-eslint/eslint-plugin@7.13.1(eslint@9.9.0(jiti@1.21.0))(typescript@5.5.4))(jest@29.7.0(@types/node@22.2.0)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4)))(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))(typescript@5.5.4)':
+ '@cprussin/eslint-config@3.0.0(@typescript-eslint/eslint-plugin@7.13.1(eslint@9.5.0)(typescript@5.5.2))(jest@29.7.0(@types/node@20.14.7)(ts-node@10.9.2(@types/node@20.14.7)(typescript@5.5.2)))(ts-node@10.9.2(@types/node@20.14.7)(typescript@5.5.2))(typescript@5.5.2)':
dependencies:
'@babel/core': 7.24.7
'@babel/eslint-parser': 7.24.7(@babel/core@7.24.7)(eslint@9.5.0)
@@ -24433,22 +24411,22 @@ snapshots:
eslint: 9.5.0
eslint-config-prettier: 9.1.0(eslint@9.5.0)
eslint-config-turbo: 1.13.4(eslint@9.5.0)
- eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.13.1(eslint@9.5.0)(typescript@5.5.2))(eslint@9.5.0)
- eslint-plugin-jest: 28.6.0(@typescript-eslint/eslint-plugin@7.13.1(@typescript-eslint/parser@8.3.0(eslint@9.9.0(jiti@1.21.0))(typescript@5.5.4))(eslint@9.9.0(jiti@1.21.0))(typescript@5.5.4))(eslint@9.5.0)(jest@29.7.0(@types/node@22.2.0)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4)))(typescript@5.5.4)
+ eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.13.1(eslint@9.5.0)(typescript@5.5.4))(eslint@9.5.0)
+ eslint-plugin-jest: 28.6.0(@typescript-eslint/eslint-plugin@7.13.1(eslint@9.5.0)(typescript@5.5.2))(eslint@9.5.0)(jest@29.7.0(@types/node@20.14.7)(ts-node@10.9.2(@types/node@20.14.7)(typescript@5.5.2)))(typescript@5.5.2)
eslint-plugin-jest-dom: 5.4.0(eslint@9.5.0)
eslint-plugin-jsonc: 2.16.0(eslint@9.5.0)
eslint-plugin-jsx-a11y: 6.8.0(eslint@9.5.0)
eslint-plugin-n: 17.9.0(eslint@9.5.0)
eslint-plugin-react: 7.34.2(eslint@9.5.0)
eslint-plugin-react-hooks: 4.6.2(eslint@9.5.0)
- eslint-plugin-storybook: 0.8.0(eslint@9.5.0)(typescript@5.5.4)
- eslint-plugin-tailwindcss: 3.17.3(tailwindcss@3.4.4(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4)))
- eslint-plugin-testing-library: 6.2.2(eslint@9.5.0)(typescript@5.5.4)
+ eslint-plugin-storybook: 0.8.0(eslint@9.5.0)(typescript@5.5.2)
+ eslint-plugin-tailwindcss: 3.17.3(tailwindcss@3.4.4(ts-node@10.9.2(@types/node@20.14.7)(typescript@5.5.2)))
+ eslint-plugin-testing-library: 6.2.2(eslint@9.5.0)(typescript@5.5.2)
eslint-plugin-tsdoc: 0.3.0
eslint-plugin-unicorn: 53.0.0(eslint@9.5.0)
globals: 15.6.0
- tailwindcss: 3.4.4(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))
- typescript-eslint: 7.13.1(eslint@9.5.0)(typescript@5.5.4)
+ tailwindcss: 3.4.4(ts-node@10.9.2(@types/node@20.14.7)(typescript@5.5.2))
+ typescript-eslint: 7.13.1(eslint@9.5.0)(typescript@5.5.2)
transitivePeerDependencies:
- '@testing-library/dom'
- '@typescript-eslint/eslint-plugin'
@@ -25758,15 +25736,6 @@ snapshots:
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
- '@headlessui/react@2.1.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@floating-ui/react': 0.26.17(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@react-aria/focus': 3.17.1(react@18.3.1)
- '@react-aria/interactions': 3.21.3(react@18.3.1)
- '@tanstack/react-virtual': 3.10.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
-
'@heroicons/react@2.1.4(react@18.3.1)':
dependencies:
react: 18.3.1
@@ -32734,12 +32703,6 @@ snapshots:
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
- '@tanstack/react-virtual@3.10.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@tanstack/virtual-core': 3.10.4
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
-
'@tanstack/react-virtual@3.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
'@tanstack/virtual-core': 3.5.0
@@ -32748,8 +32711,6 @@ snapshots:
'@tanstack/table-core@8.7.8': {}
- '@tanstack/virtual-core@3.10.4': {}
-
'@tanstack/virtual-core@3.5.0': {}
'@terra-money/terra.js@3.1.10':
@@ -34006,7 +33967,7 @@ snapshots:
'@typescript-eslint/eslint-plugin@7.13.1(@typescript-eslint/parser@7.13.1(eslint@9.5.0)(typescript@5.5.4))(eslint@9.5.0)(typescript@5.5.4)':
dependencies:
'@eslint-community/regexpp': 4.10.0
- '@typescript-eslint/parser': 7.13.1(eslint@9.5.0)(typescript@5.5.4)
+ '@typescript-eslint/parser': 7.13.1(eslint@9.9.0(jiti@1.21.0))(typescript@5.5.4)
'@typescript-eslint/scope-manager': 7.13.1
'@typescript-eslint/type-utils': 7.13.1(eslint@9.5.0)(typescript@5.5.4)
'@typescript-eslint/utils': 7.13.1(eslint@9.5.0)(typescript@5.5.4)
@@ -34021,6 +33982,25 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@typescript-eslint/eslint-plugin@7.13.1(@typescript-eslint/parser@7.13.1(eslint@9.5.0)(typescript@5.5.4))(eslint@9.9.0(jiti@1.21.0))(typescript@5.5.4)':
+ dependencies:
+ '@eslint-community/regexpp': 4.10.0
+ '@typescript-eslint/parser': 7.13.1(eslint@9.9.0(jiti@1.21.0))(typescript@5.5.4)
+ '@typescript-eslint/scope-manager': 7.13.1
+ '@typescript-eslint/type-utils': 7.13.1(eslint@9.9.0(jiti@1.21.0))(typescript@5.5.4)
+ '@typescript-eslint/utils': 7.13.1(eslint@9.9.0(jiti@1.21.0))(typescript@5.5.4)
+ '@typescript-eslint/visitor-keys': 7.13.1
+ eslint: 9.9.0(jiti@1.21.0)
+ graphemer: 1.4.0
+ ignore: 5.3.1
+ natural-compare: 1.4.0
+ ts-api-utils: 1.3.0(typescript@5.5.4)
+ optionalDependencies:
+ typescript: 5.5.4
+ transitivePeerDependencies:
+ - supports-color
+ optional: true
+
'@typescript-eslint/eslint-plugin@7.13.1(@typescript-eslint/parser@8.3.0(eslint@9.9.0(jiti@1.21.0))(typescript@5.5.4))(eslint@9.9.0(jiti@1.21.0))(typescript@5.5.4)':
dependencies:
'@eslint-community/regexpp': 4.10.0
@@ -34169,14 +34149,14 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/parser@7.13.1(eslint@9.5.0)(typescript@5.5.4)':
+ '@typescript-eslint/parser@7.13.1(eslint@9.9.0(jiti@1.21.0))(typescript@5.5.4)':
dependencies:
'@typescript-eslint/scope-manager': 7.13.1
'@typescript-eslint/types': 7.13.1
'@typescript-eslint/typescript-estree': 7.13.1(typescript@5.5.4)
'@typescript-eslint/visitor-keys': 7.13.1
debug: 4.3.5
- eslint: 9.5.0
+ eslint: 9.9.0(jiti@1.21.0)
optionalDependencies:
typescript: 5.5.4
transitivePeerDependencies:
@@ -39528,11 +39508,11 @@ snapshots:
transitivePeerDependencies:
- supports-color
- eslint-module-utils@2.8.1(@typescript-eslint/parser@7.13.1(eslint@9.5.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint@9.5.0):
+ eslint-module-utils@2.8.1(@typescript-eslint/parser@7.13.1(eslint@9.5.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint@9.5.0):
dependencies:
debug: 3.2.7
optionalDependencies:
- '@typescript-eslint/parser': 7.13.1(eslint@9.5.0)(typescript@5.5.2)
+ '@typescript-eslint/parser': 7.13.1(eslint@9.9.0(jiti@1.21.0))(typescript@5.5.4)
eslint: 9.5.0
eslint-import-resolver-node: 0.3.9
transitivePeerDependencies:
@@ -39555,7 +39535,7 @@ snapshots:
eslint: 9.5.0
eslint-compat-utils: 0.5.1(eslint@9.5.0)
- eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.13.1(eslint@9.5.0)(typescript@5.5.2))(eslint@9.5.0):
+ eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.13.1(eslint@9.5.0)(typescript@5.5.4))(eslint@9.5.0):
dependencies:
array-includes: 3.1.8
array.prototype.findlastindex: 1.2.5
@@ -39565,7 +39545,7 @@ snapshots:
doctrine: 2.1.0
eslint: 9.5.0
eslint-import-resolver-node: 0.3.9
- eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.13.1(eslint@9.5.0)(typescript@5.5.2))(eslint-import-resolver-node@0.3.9)(eslint@9.5.0)
+ eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.13.1(eslint@9.5.0)(typescript@5.5.4))(eslint-import-resolver-node@0.3.9)(eslint@9.5.0)
hasown: 2.0.2
is-core-module: 2.13.1
is-glob: 4.0.3
@@ -39576,7 +39556,7 @@ snapshots:
semver: 6.3.1
tsconfig-paths: 3.15.0
optionalDependencies:
- '@typescript-eslint/parser': 7.13.1(eslint@9.5.0)(typescript@5.5.2)
+ '@typescript-eslint/parser': 7.13.1(eslint@9.9.0(jiti@1.21.0))(typescript@5.5.4)
transitivePeerDependencies:
- eslint-import-resolver-typescript
- eslint-import-resolver-webpack
@@ -39642,13 +39622,13 @@ snapshots:
eslint: 9.5.0
requireindex: 1.2.0
- eslint-plugin-jest@28.6.0(@typescript-eslint/eslint-plugin@7.13.1(@typescript-eslint/parser@7.13.1(eslint@9.5.0)(typescript@5.5.2))(eslint@9.5.0)(typescript@5.5.2))(eslint@9.5.0)(jest@29.7.0(@types/node@20.14.7)(ts-node@10.9.2(@types/node@20.14.7)(typescript@5.5.2)))(typescript@5.5.2):
+ eslint-plugin-jest@28.6.0(@typescript-eslint/eslint-plugin@7.13.1(@typescript-eslint/parser@7.13.1(eslint@9.5.0)(typescript@5.5.4))(eslint@9.9.0(jiti@1.21.0))(typescript@5.5.4))(eslint@9.5.0)(jest@29.7.0(@types/node@22.2.0)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4)))(typescript@5.5.4):
dependencies:
- '@typescript-eslint/utils': 7.7.1(eslint@9.5.0)(typescript@5.5.2)
+ '@typescript-eslint/utils': 7.7.1(eslint@9.5.0)(typescript@5.5.4)
eslint: 9.5.0
optionalDependencies:
- '@typescript-eslint/eslint-plugin': 7.13.1(@typescript-eslint/parser@7.13.1(eslint@9.5.0)(typescript@5.5.2))(eslint@9.5.0)(typescript@5.5.2)
- jest: 29.7.0(@types/node@20.14.7)(ts-node@10.9.2(@types/node@20.14.7)(typescript@5.5.2))
+ '@typescript-eslint/eslint-plugin': 7.13.1(@typescript-eslint/parser@7.13.1(eslint@9.5.0)(typescript@5.5.4))(eslint@9.9.0(jiti@1.21.0))(typescript@5.5.4)
+ jest: 29.7.0(@types/node@22.2.0)(ts-node@10.9.2(@types/node@22.2.0)(typescript@5.5.4))
transitivePeerDependencies:
- supports-color
- typescript
@@ -39664,6 +39644,17 @@ snapshots:
- supports-color
- typescript
+ eslint-plugin-jest@28.6.0(@typescript-eslint/eslint-plugin@7.13.1(eslint@9.5.0)(typescript@5.5.2))(eslint@9.5.0)(jest@29.7.0(@types/node@20.14.7)(ts-node@10.9.2(@types/node@20.14.7)(typescript@5.5.2)))(typescript@5.5.2):
+ dependencies:
+ '@typescript-eslint/utils': 7.7.1(eslint@9.5.0)(typescript@5.5.2)
+ eslint: 9.5.0
+ optionalDependencies:
+ '@typescript-eslint/eslint-plugin': 7.13.1(@typescript-eslint/parser@7.13.1(eslint@9.5.0)(typescript@5.5.2))(eslint@9.5.0)(typescript@5.5.2)
+ jest: 29.7.0(@types/node@20.14.7)(ts-node@10.9.2(@types/node@20.14.7)(typescript@5.5.2))
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+
eslint-plugin-jsonc@2.16.0(eslint@9.5.0):
dependencies:
'@eslint-community/eslint-utils': 4.4.0(eslint@9.5.0)
@@ -50896,7 +50887,7 @@ snapshots:
typescript-eslint@7.13.1(eslint@9.5.0)(typescript@5.5.4):
dependencies:
'@typescript-eslint/eslint-plugin': 7.13.1(@typescript-eslint/parser@7.13.1(eslint@9.5.0)(typescript@5.5.4))(eslint@9.5.0)(typescript@5.5.4)
- '@typescript-eslint/parser': 7.13.1(eslint@9.5.0)(typescript@5.5.4)
+ '@typescript-eslint/parser': 7.13.1(eslint@9.9.0(jiti@1.21.0))(typescript@5.5.4)
'@typescript-eslint/utils': 7.13.1(eslint@9.5.0)(typescript@5.5.4)
eslint: 9.5.0
optionalDependencies:
|