diff --git a/packages/push-to-card/checkout/README.md b/packages/push-to-card/checkout/README.md index b4547b3..f9a37a9 100644 --- a/packages/push-to-card/checkout/README.md +++ b/packages/push-to-card/checkout/README.md @@ -49,10 +49,9 @@ The only third-party requirement for card capture is the **Flow** component and 4. **Start the Development Server**: Run `pnpm dev` to start the Next.js application at `http://localhost:3000`. 5. **Test the Flow**: Follow the UI steps in the application: - - **Step 1**: Enter customer details (name and email) to create a Dwolla Customer - - **Step 2**: Complete payment details (amount and billing address) - - **Step 3**: Enter card information in the Flow component - - **Step 4**: Submit to create the card funding source and initiate the payout + - **Step 1 – Create customer**: Enter name and email to create a Dwolla Customer, then continue to Add a debit card. + - **Step 2 – Add a debit card**: Click Start to create an exchange session and load the card capture form. Enter your card in the Flow component; then enter cardholder name and billing address and click “Create funding source.” + - **Step 3 – Send a payout**: Go to Send a payout, enter the amount, and click “Send payout.” Settlement and card resolution run in the background; the events log shows API activity. ## Test Cards (Sandbox) @@ -89,14 +88,12 @@ For more test card scenarios, refer to the [Card payout test cards](https://www. ``` src/ ├── app/ -│ ├── create-customer/ # Customer creation form and logic +│ ├── add-card/ # Add a debit card: exchange session, Flow, Exchange, funding source +│ │ └── page.tsx +│ ├── create-customer/ # Customer creation form and logic +│ │ └── page.tsx +│ ├── send-payout/ # Send a payout │ │ └── page.tsx -│ ├── send-payout/ # Card capture and payout initiation -│ │ ├── page.tsx # Main payout page with Flow component -│ │ ├── success/ # Success callback page -│ │ │ └── page.tsx -│ │ └── failure/ # Failure callback page -│ │ └── page.tsx │ ├── layout.tsx # Root layout with MUI theme │ └── page.tsx # Landing page with navigation ├── integrations/ diff --git a/packages/push-to-card/checkout/src/app/add-card/page.tsx b/packages/push-to-card/checkout/src/app/add-card/page.tsx new file mode 100644 index 0000000..63faa19 --- /dev/null +++ b/packages/push-to-card/checkout/src/app/add-card/page.tsx @@ -0,0 +1,537 @@ +"use client"; + +import { useCallback, useEffect, useState } from "react"; +import Link from "next/link"; +import { useRouter } from "next/navigation"; +import { LoadingButton } from "@mui/lab"; +import { + Box, + Card, + CardContent, + CardHeader, + TextField, + Alert, + Typography, + IconButton, + Tooltip, + Stepper, + Step, + StepLabel, + Chip, + Button, +} from "@mui/material"; +import ContentCopyIcon from "@mui/icons-material/ContentCopy"; +import Grid from "@mui/material/Grid2"; +import { + type ExternalProviderSessionData, + createCardFundingSource, + createExchange, + createExchangeSession, + getExchangeSession, +} from "@/integrations/dwolla"; + +declare global { + interface Window { + CheckoutWebComponents?: any; + } +} + +/** + * Add a debit card page. + * Steps: + * (1) Create and retrieve exchange session, + * (2) Mount Checkout.com Flow, + * (3) Create Exchange in Dwolla, + * (4) Create funding source in Dwolla. + * On success, stores lastAddedFundingSource in sessionStorage and links to send-payout. + */ +export default function AddCardPage() { + const [paymentSession, setPaymentSession] = useState(null); + const [status, setStatus] = useState(null); + const [events, setEvents] = useState< + Array<{ id: string; message: string; severity: "info" | "success" | "error"; timestamp: string }> + >([]); + const [cardFundingSource, setCardFundingSource] = useState(null); + const [exchangeUrl, setExchangeUrl] = useState(null); + const [fundingSourceName, setFundingSourceName] = useState("My Visa Debit Card"); + const [firstName, setFirstName] = useState("Jane"); + const [lastName, setLastName] = useState("Doe"); + const [billing, setBilling] = useState({ + address1: "123 Main St", + city: "Des Moines", + stateProvinceRegion: "IA", + country: "US", + postalCode: "50301", + }); + const [formReady, setFormReady] = useState(false); + const [fundingSourceLoading, setFundingSourceLoading] = useState(false); + const [storedCustomerId, setStoredCustomerId] = useState(null); + const router = useRouter(); + + const handleStartOver = useCallback(() => { + sessionStorage.removeItem("customerId"); + sessionStorage.removeItem("lastAddedFundingSource"); + router.push("/"); + }, [router]); + + const logEvent = useCallback( + (message: string, severity: "info" | "success" | "error" = "info") => { + const timestamp = new Date().toISOString(); + setStatus(message); + setEvents((prev) => [ + ...prev, + { id: `${timestamp}-${prev.length}`, message, severity, timestamp }, + ]); + }, + [] + ); + + // Customer ID is required; set by create-customer page and stored in sessionStorage. + useEffect(() => { + const id = sessionStorage.getItem("customerId"); + setStoredCustomerId(id); + }, []); + + // Step 2: Mount Flow with session data. Step 3 runs inside onPaymentCompleted (create Exchange). + const loadFlow = useCallback( + async (session: ExternalProviderSessionData) => { + if (!window.CheckoutWebComponents) { + await loadScript("https://checkout-web-components.checkout.com/index.js"); + } + + const checkout = await window.CheckoutWebComponents({ + publicKey: process.env.NEXT_PUBLIC_CKO_PUBLIC_KEY || "", + environment: process.env.NEXT_PUBLIC_CKO_ENV || "sandbox", + paymentSession: session, + componentOptions: { + card: { displayCardholderName: "hidden" }, + }, + locale: "en-US", + translations: { + "en-US": { + "pay_button.pay": "Connect Card", + "pay_button.payment_processing": "Connecting card...", + "pay_button.payment_complete": "Card connected", + "pay_button.payment_failed": "Connection failed, please try again" + } + }, + onPaymentCompleted: async (_component: any, paymentResponse: any) => { + // Step 3: Create Dwolla Exchange using the payment id from Flow; exchange URL is needed for step 4. + logEvent("Creating Dwolla exchange..."); + const exchangeResult = await createExchange(storedCustomerId ?? "", paymentResponse.id); + if (!exchangeResult.success || !exchangeResult.resource) { + logEvent(exchangeResult.message ?? "Failed to create exchange", "error"); + return; + } + setExchangeUrl(exchangeResult.resource); + const exchangeId = exchangeResult.resource.split("/").filter(Boolean).pop(); + logEvent(`Exchange created (ID: ${exchangeId ?? "—"}). Enter cardholder name and billing below.`, "success"); + }, + onError: (_component: any, error: unknown) => { + console.error("Flow error", error); + logEvent("Flow error", "error"); + }, + }); + + const flowComponent = checkout.create("flow"); + flowComponent.mount(document.getElementById("card-capture-container")); + }, + [storedCustomerId, logEvent] + ); + + // Step 1: Create exchange session, then fetch session to get externalProviderSessionData for Flow. + useEffect(() => { + if (!formReady || paymentSession || !storedCustomerId) return; + + (async () => { + logEvent("Creating exchange session..."); + const createResult = await createExchangeSession(storedCustomerId); + if (!createResult.success || !createResult.resource) { + logEvent(createResult.message ?? "Failed to create exchange session", "error"); + return; + } + const exchangeSessionId = createResult.resource.split("/").filter(Boolean).pop(); + if (!exchangeSessionId) { + logEvent("Invalid exchange-session Location", "error"); + return; + } + logEvent("Retrieving exchange session..."); + const result = await getExchangeSession(exchangeSessionId); + if (!result.success) { + logEvent(result.message ?? "Failed to get payment session", "error"); + return; + } + if (!result.resource) { + logEvent("Failed to get payment session", "error"); + return; + } + setPaymentSession(result.resource); + logEvent("Session ready."); + await loadFlow(result.resource); + })(); + }, [formReady, paymentSession, storedCustomerId, loadFlow, logEvent]); + + function loadScript(src: string) { + return new Promise((resolve, reject) => { + const tag = document.createElement("script"); + tag.src = src; + tag.async = true; + tag.onload = () => resolve(); + tag.onerror = reject; + document.body.appendChild(tag); + }); + } + + const steps = [ + { label: "Create and retrieve exchange session", owner: "Dwolla API" }, + { label: "Mount Checkout.com Flow", owner: "Checkout Flow" }, + { label: "Create Exchange in Dwolla", owner: "Dwolla API" }, + { label: "Create funding source in Dwolla", owner: "Dwolla API" }, + ]; + + const nextYearTwoDigit = String(new Date().getFullYear() + 1).slice(-2); + const exampleExpiry = `12/${nextYearTwoDigit}`; + + const getActiveStep = () => { + if (cardFundingSource || status?.includes("Card funding source created")) return 4; + if (status?.includes("Creating Dwolla card funding source")) return 3; + if (exchangeUrl || status?.includes("Exchange created")) return 3; + if (paymentSession || status?.includes("Session ready")) return 1; + return 0; + }; + + // Step 4: Create card funding source in Dwolla (exchange URL from step 3). Persist ID for payout. + const handleCreateFundingSource = async () => { + if (!exchangeUrl || !storedCustomerId) return; + setFundingSourceLoading(true); + logEvent("Creating Dwolla card funding source..."); + const fundingSourceResult = await createCardFundingSource( + storedCustomerId, + exchangeUrl, + fundingSourceName, + { firstName, lastName, billingAddress: billing } + ); + setFundingSourceLoading(false); + setCardFundingSource(fundingSourceResult.resource ?? null); + if (!fundingSourceResult.success || !fundingSourceResult.resource) { + logEvent(fundingSourceResult.message ?? "Failed to create funding source", "error"); + return; + } + logEvent("Card funding source created", "success"); + sessionStorage.setItem("lastAddedFundingSource", fundingSourceResult.resource); + }; + + return ( +
+

Add a debit card

+ + {storedCustomerId ? ( + <> + + Card will be linked to Customer: + + navigator.clipboard.writeText(storedCustomerId)} + onDelete={() => navigator.clipboard.writeText(storedCustomerId)} + deleteIcon={} + sx={{ cursor: "pointer" }} + variant="outlined" + /> + + ) : ( + + Customer ID missing. Please create a customer first. + + )} + + + + {steps.map(({ label, owner }) => ( + + + + {label} + + + {owner} + + + + ))} + + + + {!formReady ? ( + + + setFormReady(true)} + > + Start + + + + ) : !paymentSession ? ( + + + + Loading… + + + + ) : exchangeUrl && !cardFundingSource ? ( + + + + + + Required to create the Dwolla funding source for the card you just entered. + + + + setFundingSourceName(e.target.value)} + fullWidth + sx={{ mb: 2 }} + /> + + Cardholder name + + + + setFirstName(e.target.value)} + required + fullWidth + /> + + + setLastName(e.target.value)} + required + fullWidth + /> + + + + Billing address + + setBilling({ ...billing, address1: e.target.value })} + required + fullWidth + sx={{ mb: 2 }} + /> + + + setBilling({ ...billing, city: e.target.value })} + required + fullWidth + /> + + + setBilling({ ...billing, stateProvinceRegion: e.target.value })} + required + fullWidth + /> + + + + + setBilling({ ...billing, country: e.target.value })} + required + fullWidth + /> + + + setBilling({ ...billing, postalCode: e.target.value })} + required + fullWidth + /> + + + !v) + } + size="large" + variant="contained" + onClick={handleCreateFundingSource} + sx={{ mt: 2 }} + > + Create funding source + + + + + ) : cardFundingSource ? ( + + + + + + Card added successfully + + + Funding source ID: {cardFundingSource.split("/").pop()} + + + + + + ) : ( + + + + + + Test cards + + + + 4024 7644 4997 1519 + + + navigator.clipboard.writeText("4024764449971519")} + sx={{ p: 0.5 }} + > + + + + + Visa + + + + + 5318 7730 1249 0080 + + + navigator.clipboard.writeText("5318773012490080")} + sx={{ p: 0.5 }} + > + + + + + Mastercard + + + + Exp: any future date (e.g. {exampleExpiry}) + + + CVV: any 3 digits (e.g. 123) + + + + + + + +
+ + + + )} + + + + + Events log + + {events.length > 0 ? ( + + {events.map(({ id, message, severity, timestamp }) => ( + + + {new Date(timestamp).toLocaleTimeString()} + + {message} + + ))} + + ) : ( + + Events will appear here as you progress. + + )} + + +
+ ); +} diff --git a/packages/push-to-card/checkout/src/app/create-customer/page.tsx b/packages/push-to-card/checkout/src/app/create-customer/page.tsx index 83926b2..bb7e499 100644 --- a/packages/push-to-card/checkout/src/app/create-customer/page.tsx +++ b/packages/push-to-card/checkout/src/app/create-customer/page.tsx @@ -13,10 +13,10 @@ import { createCustomer } from "../../integrations/dwolla"; type FormState = Partial; /** - * Create Customer Component + * Create Customer page. * - * Renders a form, allowing users to enter name and email to create a Dwolla Customer account. - * This component manages widget setup, event handling, and lifecycle operations. + * Integration step: Call Dwolla API to create a customer (firstName, lastName, email). + * Store the returned customer ID (e.g. in sessionStorage) and redirect to add-card so the user can add a debit card. */ export default function Page() { const router = useRouter(); @@ -87,7 +87,7 @@ export default function Page() { // After customer creation, move to the Add Card flow, which will create a Checkout // payment session and mount Flow to capture the card. - router.push("/send-payout"); + router.push("/add-card"); }; return ( diff --git a/packages/push-to-card/checkout/src/app/send-payout/failure/page.tsx b/packages/push-to-card/checkout/src/app/send-payout/failure/page.tsx deleted file mode 100644 index 16807f2..0000000 --- a/packages/push-to-card/checkout/src/app/send-payout/failure/page.tsx +++ /dev/null @@ -1,55 +0,0 @@ -import { Box, Card, CardContent, Typography, Button } from "@mui/material"; -import ErrorIcon from '@mui/icons-material/Error'; - -/** - * Placeholder page for failed payment redirects from Checkout.com. - * - * Note: This route is required by the Checkout.com API (failure_url) to create a payment-session - * - * This page serves as a fallback for edge cases like: - * - 3D Secure authentication failures - * - Browser issues preventing callback execution - * - User closes/refreshes during payment - * - * TODO: Implement redirect-based error handling if needed for your use case. - */ -export default function PayoutFailurePage() { - return ( -
- - - - - - Payment Failed - - - The payment could not be processed. - - - This could be due to insufficient funds, an incorrect card number, or a network issue. - - - - - -
- ); -} - diff --git a/packages/push-to-card/checkout/src/app/send-payout/page.tsx b/packages/push-to-card/checkout/src/app/send-payout/page.tsx index 71de387..b679c73 100644 --- a/packages/push-to-card/checkout/src/app/send-payout/page.tsx +++ b/packages/push-to-card/checkout/src/app/send-payout/page.tsx @@ -1,309 +1,138 @@ "use client"; import { useCallback, useEffect, useState } from "react"; +import Link from "next/link"; +import { useRouter } from "next/navigation"; import { LoadingButton } from "@mui/lab"; -import { Box, Card, CardContent, CardHeader, TextField, Alert, Typography, IconButton, Tooltip, Stepper, Step, StepLabel, Chip, Table, TableBody, TableRow, TableCell, Divider, Button } from "@mui/material"; -import ContentCopyIcon from "@mui/icons-material/ContentCopy"; -import KeyboardArrowDownIcon from "@mui/icons-material/KeyboardArrowDown"; -import Grid from "@mui/material/Grid2"; import { - type ExternalProviderSessionData, - createCardFundingSource, - createExchange, - createExchangeSession, - getExchangeSession, - sendPayout -} from "@/integrations/dwolla"; - -/** - * Type declaration for Checkout.com Web Components SDK. - * The SDK is loaded dynamically from a CDN to maintain PCI compliance. - */ -declare global { - interface Window { - CheckoutWebComponents?: any; - } -} - -/** - * Add Card and Send Payout Page - * - * This is the main page of the Push to Card flow where users: - * 1. Enter payout amount and billing address - * 2. Submit card details through Checkout.com Flow component - * 3. Automatically create a Dwolla card funding source - * 4. Automatically initiate a Push to Card transfer - * - * The page handles the complete end-to-end flow: - * - Creating a Checkout.com payment session (server-side) - * - Loading and mounting the Flow component (client-side) - * - Processing the payment completion callback - * - Exchanging the payment ID for a card token - * - Creating the Dwolla card funding source - * - Initiating the Push to Card transfer - * - * Flow Component Integration: - * The Checkout.com Flow component is loaded from their CDN for PCI compliance. - * It handles secure card capture without sensitive data touching our servers. - * - */ + Box, + Card, + CardContent, + CardHeader, + TextField, + Alert, + Typography, + Chip, + Table, + TableBody, + TableRow, + TableCell, + Divider, + Button, +} from "@mui/material"; +import ContentCopyIcon from "@mui/icons-material/ContentCopy"; +import { getSettlementFundingSource, sendPayout } from "@/integrations/dwolla"; /** - * Wrapper that strips the `last` prop before rendering Box. - * A parent (e.g. layout or Stepper) may inject `last` for styling; Box forwards unknown props - * to the DOM, which triggers "Received `true` for a non-boolean attribute `last`" since - * `last` is not a valid HTML attribute. We strip it here so it never reaches the DOM. + * Send a payout page. + * Collects amount for payout; settlement and card retrieval run in the background. + * Events log tracks server-side API calls. Requires lastAddedFundingSource in sessionStorage (set by add-card page). */ -function StripLastBox(props: React.ComponentProps & { last?: boolean }) { - const { last: _last, ...rest } = props; - void _last; - return ; -} - -export default function AddCardPage() { - // Payment session from Dwolla exchange-session (externalProviderSessionData) for Flow - const [paymentSession, setPaymentSession] = useState(null); - - // Current status message to display to the user - const [status, setStatus] = useState(null); - - // Timeline of key events shown in the event log +export default function SendPayoutPage() { + const [storedCustomerId, setStoredCustomerId] = useState(null); + const [lastAddedFundingSource, setLastAddedFundingSource] = useState(null); + const [settlementLoading, setSettlementLoading] = useState(true); + const [amount, setAmount] = useState("100.00"); + const [sending, setSending] = useState(false); + const [transfer, setTransfer] = useState(null); const [events, setEvents] = useState< Array<{ id: string; message: string; severity: "info" | "success" | "error"; timestamp: string }> >([]); - /** - * Record a status update and add it to the event log. - */ + const router = useRouter(); + + const handleStartOver = useCallback(() => { + sessionStorage.removeItem("customerId"); + sessionStorage.removeItem("lastAddedFundingSource"); + router.push("/"); + }, [router]); + const logEvent = useCallback( (message: string, severity: "info" | "success" | "error" = "info") => { const timestamp = new Date().toISOString(); - setStatus(message); setEvents((prev) => [ ...prev, - { - id: `${timestamp}-${prev.length}`, - message, - severity, - timestamp, - }, + { id: `${timestamp}-${prev.length}`, message, severity, timestamp }, ]); }, [] ); - - // URL of the created Dwolla card funding source - const [cardFundingSource, setCardFundingSource] = useState(null); - - // URL of the created Dwolla transfer (Location header from create transfer) - const [transfer, setTransfer] = useState(null); - - // Payout amount in USD (default: $100.00) - const [amount, setAmount] = useState("100.00"); - - // Cardholder name (required for funding source creation) - const [firstName, setFirstName] = useState("Jane"); - const [lastName, setLastName] = useState("Doe"); - - // Billing address for the card (required by Dwolla) - const [billing, setBilling] = useState({ - address1: "123 Main St", - city: "Des Moines", - stateProvinceRegion: "IA", - country: "US", - postalCode: "50301" - }); - - // Flag indicating whether the user has clicked "Start checkout" - const [formReady, setFormReady] = useState(false); - - /** - * Retrieve the Dwolla Customer ID from session storage. - * This ID was stored in the previous step (create-customer page). - * - * Note: we load this in an effect to avoid SSR/client markup mismatches. - */ - const [storedCustomerId, setStoredCustomerId] = useState(null); + // Card funding source (payout destination) is set by add-card and stored in sessionStorage. useEffect(() => { - // Defer sessionStorage access to the client to keep hydration stable. - const id = sessionStorage.getItem("customerId"); - setStoredCustomerId(id); + const customerId = sessionStorage.getItem("customerId"); + const fundingSource = sessionStorage.getItem("lastAddedFundingSource"); + setStoredCustomerId(customerId); + setLastAddedFundingSource(fundingSource); }, []); - - /** - * Loads and initializes the Checkout.com Flow component. - * - * This function: - * 1. Loads the Checkout.com Web Components SDK from their CDN (if not already loaded) - * 2. Initializes the SDK with the payment session and public key - * 3. Configures callbacks for payment completion and errors - * 4. Mounts the Flow component to the DOM - * - * The onPaymentCompleted callback orchestrates the complete Push to Card flow: - * - Exchange payment ID for card token from Checkout.com - * - Create Dwolla card funding source with the token - * - Initiate Push to Card transfer from settlement account to card - * - * @param session - The payment session object from Checkout.com - */ - const loadFlow = useCallback(async (session: ExternalProviderSessionData) => { - // Load the Checkout.com Web Components SDK if not already loaded. - // This script provides the Flow component for secure card capture. - if (!window.CheckoutWebComponents) { - await loadScript("https://checkout-web-components.checkout.com/index.js"); - } - - // Initialize the Checkout.com SDK. API returns externalProviderSessionData in the shape Flow expects; pass through. - const checkout = await window.CheckoutWebComponents({ - // Public key - safe to expose client-side - publicKey: process.env.NEXT_PUBLIC_CKO_PUBLIC_KEY || "", - // Environment - "sandbox" for testing, "production" for live - environment: process.env.NEXT_PUBLIC_CKO_ENV || "sandbox", - // Payment session created server-side - paymentSession: session, - componentOptions: { - card: { - displayCardholderName: "hidden" - } - }, - onPaymentCompleted: async (_component: any, paymentResponse: any) => { - // Use the payment ID (pay_xxx) from Flow directly when creating the Exchange - logEvent("Creating Dwolla exchange..."); - const exchangeResult = await createExchange(storedCustomerId ?? "", paymentResponse.id); - if (!exchangeResult.success || !exchangeResult.resource) { - logEvent(exchangeResult.message ?? "Failed to create exchange", "error"); - return; - } - - logEvent("Creating Dwolla card funding source..."); - const fundingSourceResult = await createCardFundingSource( - storedCustomerId ?? "", - exchangeResult.resource, - "My Visa Debit Card", - { firstName, lastName, billingAddress: billing } - ); - setCardFundingSource(fundingSourceResult.resource ?? null); - if (!fundingSourceResult.success || !fundingSourceResult.resource) { - logEvent(fundingSourceResult.message ?? "Failed to create funding source", "error"); - return; - } - logEvent("Card funding source created", "success"); - - logEvent("Sending payout..."); - const fd = new FormData(); - fd.set("amount", amount); - const transferResponse = await sendPayout(fundingSourceResult.resource, fd); - if (!transferResponse.success) { - logEvent("An error occurred while sending the payout", "error"); - return; - } - setTransfer(transferResponse.resource ?? null); - logEvent("Transfer created successfully ✅", "success"); - }, - - /** - * onError - Called if there's an error in the Flow component - * - * This could be triggered by: - * - Card validation errors - * - Network issues - * - Checkout.com API errors - */ - onError: (_component: any, error: unknown) => { - console.error("Flow error", error); - logEvent("Flow error", "error"); - } - }); - - // Create the Flow component and mount it to the DOM - const flowComponent = checkout.create("flow"); - flowComponent.mount(document.getElementById("card-capture-container")); - }, [amount, billing, firstName, lastName, storedCustomerId, logEvent]); - - /** - * Effect to initialize the payment session and load Flow when user clicks "Start checkout". - * - * This effect runs when formReady changes from false to true, triggering the sequence: - * 1. Create a payment session on the server - * 2. Load and mount the Checkout.com Flow component with the session - */ + // Settlement funding source = source of funds for the transfer (e.g. your platform's Dwolla balance). useEffect(() => { - // Only run if the form is ready and we haven't already created a session - if (!formReady || paymentSession || !storedCustomerId) return; - + if (!lastAddedFundingSource) { + setSettlementLoading(false); + return; + } + let cancelled = false; (async () => { - logEvent("Creating exchange session..."); - const createResult = await createExchangeSession(storedCustomerId); - if (!createResult.success || !createResult.resource) { - const msg = createResult.success ? "Failed to create exchange session" : (createResult.message ?? "Failed to create exchange session"); - logEvent(msg, "error"); - return; - } - const exchangeSessionId = createResult.resource.split("/").filter(Boolean).pop(); - if (!exchangeSessionId) { - logEvent("Invalid exchange-session Location", "error"); - return; - } - logEvent("Retrieving exchange session..."); - const result = await getExchangeSession(exchangeSessionId); - if (!result.success || !result.resource) { - const msg = result.success ? "Failed to get payment session" : (result.message ?? "Failed to get payment session"); - logEvent(msg, "error"); - return; + setSettlementLoading(true); + logEvent("Retrieving settlement account…"); + const result = await getSettlementFundingSource(); + if (cancelled) return; + setSettlementLoading(false); + if (result.success && result.resource) { + logEvent("Settlement account ready", "success"); + } else { + logEvent(result.message ?? "Failed to get settlement funding source", "error"); } - setPaymentSession(result.resource); - logEvent("Session ready."); - await loadFlow(result.resource); })(); - }, [formReady, paymentSession, storedCustomerId, loadFlow, logEvent]); + return () => { + cancelled = true; + }; + }, [lastAddedFundingSource, logEvent]); + + // Transfer: destination = card funding source, amount from form. Source (settlement) is resolved in API. + const handleSendPayout = async () => { + if (!lastAddedFundingSource || !amount || Number(amount) <= 0) return; + setSending(true); + logEvent("Sending payout..."); + const fd = new FormData(); + fd.set("amount", amount); + const result = await sendPayout(lastAddedFundingSource, fd); + setSending(false); + if (result.success && result.resource) { + setTransfer(result.resource); + logEvent("Transfer created successfully", "success"); + } else { + logEvent(result.message ?? "Failed to send payout", "error"); + } + }; - /** - * Dynamically loads a JavaScript file from a CDN. - * - * This is used to load the Checkout.com Web Components SDK, which must be - * loaded from their CDN for PCI compliance (never self-host payment SDKs). - * - * @param src - The URL of the script to load - * @returns Promise that resolves when the script is loaded - */ - function loadScript(src: string) { - return new Promise((resolve, reject) => { - const tag = document.createElement("script"); - tag.src = src; - tag.async = true; - tag.onload = resolve; - tag.onerror = reject; - document.body.appendChild(tag); - }); + if (!lastAddedFundingSource && !settlementLoading) { + return ( +
+

Send a payout

+ + + + + + No card funding source found. Add a debit card first; the card is then used as the + destination for the payout. + + + +
+ ); } - const steps = [ - { label: "Create exchange session", owner: "Dwolla API" }, - { label: "Capture card in Flow", owner: "Checkout Flow" }, - { label: "Create Dwolla exchange", owner: "Dwolla API" }, - { label: "Create Dwolla funding source", owner: "Dwolla API" }, - { label: "Send payout", owner: "Dwolla API" }, - ]; - - const nextYearTwoDigit = String(new Date().getFullYear() + 1).slice(-2); - const exampleExpiry = `12/${nextYearTwoDigit}`; - - const getActiveStep = () => { - if (transfer || status?.includes("Transfer created")) return 4; - if (status?.includes("Sending payout")) return 4; - if (cardFundingSource || status?.includes("Card funding source created")) return 3; - if (status?.includes("Creating Dwolla card funding source")) return 3; - if (status?.includes("Creating Dwolla exchange")) return 2; - if (paymentSession || status?.includes("Session ready")) return 1; - return 0; - }; - return (
-

Add debit card and send payout

- +

Send a payout

+ {storedCustomerId ? ( <> @@ -321,291 +150,47 @@ export default function AddCardPage() { ) : ( - Customer ID missing. Please create a customer first. + Customer ID missing. Create a customer and add a card first. )} + - - {steps.map(({ label, owner }) => ( - - - - {label} - - - {owner} - - - - ))} - - {(events.length > 0 || cardFundingSource || transfer) && ( - - } - label={events.length > 0 ? `View events log (${events.length})` : "View events log"} - onClick={() => document.getElementById("events-log")?.scrollIntoView({ behavior: "smooth", block: "start" })} - variant="outlined" - sx={{ cursor: "pointer" }} - /> - - )} - - {formReady && ( - - - - - Test cards - - - - 4024 7644 4997 1519 - - - navigator.clipboard.writeText("4024764449971519")} - sx={{ p: 0.5 }} - > - - - - - Visa - - - - - 5318 7730 1249 0080 - - - navigator.clipboard.writeText("5318773012490080")} - sx={{ p: 0.5 }} - > - - - - - Mastercard - - - - Exp: any future date (e.g. {exampleExpiry}) - - - CVV: any 3 digits (e.g. 123) - - - - - )} - - - + + + - - - The exchange session (step 1) only needs your Dwolla customer. Amount, cardholder name, and billing address are used in later steps — funding source creation and payout - not for creating the session. - - - - setAmount(e.target.value)} - required - fullWidth - inputProps={{ min: "0.01", step: "0.01" }} - sx={{ mb: 3 }} - /> - - - Cardholder name - - - - setFirstName(e.target.value)} - required - fullWidth - /> - - - setLastName(e.target.value)} - required - fullWidth - /> - - - - - Billing address - - setBilling({ ...billing, address1: e.target.value })} - required - fullWidth - sx={{ mb: 2 }} - /> - - - - setBilling({ ...billing, city: e.target.value })} - required - fullWidth - /> - - - - setBilling({ ...billing, stateProvinceRegion: e.target.value }) - } - required - fullWidth - /> - - - - - - setBilling({ ...billing, country: e.target.value })} - required - fullWidth - /> - - - setBilling({ ...billing, postalCode: e.target.value })} - required - fullWidth - /> - - - - !v) || - formReady - } - size="large" - variant="contained" - onClick={() => { - setFormReady(true); - }} - sx={{ mt: 2 }} - > - Add card and send payout - - + setAmount(e.target.value)} + required + fullWidth + inputProps={{ min: "0.01", step: "0.01" }} + sx={{ mb: 2 }} + /> + + Send payout + - - - - {!formReady ? ( - - - 💳 - - - Complete payment details to begin card capture - - - ) : ( -
- )} - - - - - - {/* Events log */} - {(events.length > 0 || cardFundingSource || transfer) && ( - + Events log - - {events.length > 0 && ( + {events.length > 0 ? ( {events.map(({ id, message, severity, timestamp }) => ( @@ -616,19 +201,16 @@ export default function AddCardPage() { ))} + ) : ( + + Events will appear here as you progress. + )} - {transfer && ( - + - ✅ Payout initiated successfully + Payout initiated successfully @@ -643,7 +225,7 @@ export default function AddCardPage() { Funding source - {cardFundingSource?.split("/").pop() ?? "—"} + {lastAddedFundingSource?.split("/").pop() ?? "—"}
@@ -661,8 +243,7 @@ export default function AddCardPage() {
)}
- )} +
); } - diff --git a/packages/push-to-card/checkout/src/app/send-payout/success/page.tsx b/packages/push-to-card/checkout/src/app/send-payout/success/page.tsx deleted file mode 100644 index 08af06d..0000000 --- a/packages/push-to-card/checkout/src/app/send-payout/success/page.tsx +++ /dev/null @@ -1,48 +0,0 @@ -import { Box, Card, CardContent, Typography } from "@mui/material"; -import CheckCircleIcon from '@mui/icons-material/CheckCircle'; -/** - * Placeholder page for successful payment redirects from Checkout.com. - * - * Note: This route is required by the Checkout.com API (success_url) to create a payment-session - * - * This page serves as a fallback for edge cases like: - * - 3D Secure authentication redirects - * - Browser issues preventing callback execution - * - User closes/refreshes during payment - * - * TODO: Implement redirect-based payment completion if needed for your use case. - */ -export default function PayoutSuccessPage() { - return ( -
- - - - - - Payment Successful - - - Your payment was processed successfully. - - - - Return to home page - - - - - -
- ); -} - diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 161ffd8..20d6147 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -36,8 +36,156 @@ importers: specifier: ^4.7.4 version: 4.9.5 + packages/push-to-card/checkout: + dependencies: + '@checkout.com/checkout-web-components': + specifier: ^1.7.1 + version: 1.7.1 + '@emotion/react': + specifier: ^11.13.5 + version: 11.14.0(@types/react@18.3.28)(react@18.3.1) + '@emotion/styled': + specifier: ^11.13.5 + version: 11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1) + '@mui/icons-material': + specifier: ^7.3.7 + version: 7.3.9(@mui/material@6.5.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.28)(react@18.3.1) + '@mui/lab': + specifier: 6.0.0-beta.16 + version: 6.0.0-beta.16(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@mui/material@6.5.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/material': + specifier: ^6.1.8 + version: 6.5.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + dwolla: + specifier: ^1.1.1 + version: 1.1.1 + next: + specifier: ^15.0.3 + version: 15.5.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: + specifier: ^18.3.1 + version: 18.3.1 + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + devDependencies: + '@types/node': + specifier: 22.9.1 + version: 22.9.1 + '@types/react': + specifier: ^18.3.12 + version: 18.3.28 + typescript: + specifier: ^5.6.3 + version: 5.9.3 + packages: + '@babel/code-frame@7.29.0': + resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} + engines: {node: '>=6.9.0'} + + '@babel/generator@7.29.1': + resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-globals@7.28.0': + resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.28.6': + resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.0': + resolution: {integrity: sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/runtime@7.28.6': + resolution: {integrity: sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.28.6': + resolution: {integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.29.0': + resolution: {integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + engines: {node: '>=6.9.0'} + + '@checkout.com/checkout-web-components@1.7.1': + resolution: {integrity: sha512-w3l3qqT/mVOJUgcLV2swbRg6kmxE5fHoBikLImUzs7jkYOgGV3GTATZILP9XCAkq7fF3JR501AR4bpInxmqh6w==} + + '@emnapi/runtime@1.8.1': + resolution: {integrity: sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg==} + + '@emotion/babel-plugin@11.13.5': + resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} + + '@emotion/cache@11.14.0': + resolution: {integrity: sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==} + + '@emotion/hash@0.9.2': + resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} + + '@emotion/is-prop-valid@1.4.0': + resolution: {integrity: sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==} + + '@emotion/memoize@0.9.0': + resolution: {integrity: sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==} + + '@emotion/react@11.14.0': + resolution: {integrity: sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==} + peerDependencies: + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/serialize@1.3.3': + resolution: {integrity: sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==} + + '@emotion/sheet@1.4.0': + resolution: {integrity: sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==} + + '@emotion/styled@11.14.1': + resolution: {integrity: sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==} + peerDependencies: + '@emotion/react': ^11.0.0-rc.0 + '@types/react': '*' + react: '>=16.8.0' + peerDependenciesMeta: + '@types/react': + optional: true + + '@emotion/unitless@0.10.0': + resolution: {integrity: sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==} + + '@emotion/use-insertion-effect-with-fallbacks@1.2.0': + resolution: {integrity: sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==} + peerDependencies: + react: '>=16.8.0' + + '@emotion/utils@1.4.2': + resolution: {integrity: sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==} + + '@emotion/weak-memoize@0.4.0': + resolution: {integrity: sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==} + '@eslint-community/eslint-utils@4.9.1': resolution: {integrity: sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -56,6 +204,21 @@ packages: resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@floating-ui/core@1.7.5': + resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} + + '@floating-ui/dom@1.7.6': + resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==} + + '@floating-ui/react-dom@2.1.8': + resolution: {integrity: sha512-cC52bHwM/n/CxS87FH0yWdngEZrjdtLW/qVruo68qg+prK7ZQ4YGdut2GyDVpoGeAYe/h899rVeOVm6Oi40k2A==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + + '@floating-ui/utils@0.2.11': + resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} + '@humanwhocodes/config-array@0.13.0': resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} engines: {node: '>=10.10.0'} @@ -69,9 +232,310 @@ packages: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead + '@img/colour@1.1.0': + resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==} + engines: {node: '>=18'} + + '@img/sharp-darwin-arm64@0.34.5': + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + + '@img/sharp-darwin-x64@0.34.5': + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-darwin-arm64@1.2.4': + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} + cpu: [arm64] + os: [darwin] + + '@img/sharp-libvips-darwin-x64@1.2.4': + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} + cpu: [x64] + os: [darwin] + + '@img/sharp-libvips-linux-arm64@1.2.4': + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-arm@1.2.4': + resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-ppc64@1.2.4': + resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-riscv64@1.2.4': + resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-s390x@1.2.4': + resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-x64@1.2.4': + resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@img/sharp-linux-arm64@0.34.5': + resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-arm@0.34.5': + resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-ppc64@0.34.5': + resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-riscv64@0.34.5': + resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-s390x@0.34.5': + resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-x64@0.34.5': + resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@img/sharp-linuxmusl-arm64@0.34.5': + resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@img/sharp-linuxmusl-x64@0.34.5': + resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@img/sharp-wasm32@0.34.5': + resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.34.5': + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + + '@img/sharp-win32-ia32@0.34.5': + resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + + '@img/sharp-win32-x64@0.34.5': + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + + '@mui/base@5.0.0-beta.62': + resolution: {integrity: sha512-TzJLCNlrMkSU4bTCdTT+TVUiGx4sjZLhH673UV6YN+rNNP8wJpkWfRSvjDB5HcbH2T0lUamnz643ZnV+8IiMjw==} + engines: {node: '>=14.0.0'} + deprecated: This package has been replaced by @base-ui/react + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 + react: ^17.0.0 || ^18.0.0 + react-dom: ^17.0.0 || ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/core-downloads-tracker@6.5.0': + resolution: {integrity: sha512-LGb8t8i6M2ZtS3Drn3GbTI1DVhDY6FJ9crEey2lZ0aN2EMZo8IZBZj9wRf4vqbZHaWjsYgtbOnJw5V8UWbmK2Q==} + + '@mui/icons-material@7.3.9': + resolution: {integrity: sha512-BT+zPJXss8Hg/oEMRmHl17Q97bPACG4ufFSfGEdhiE96jOyR5Dz1ty7ZWt1fVGR0y1p+sSgEwQT/MNZQmoWDCw==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@mui/material': ^7.3.9 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/lab@6.0.0-beta.16': + resolution: {integrity: sha512-YFeKREMMCiUhp4dGXd6Y/7N3BLepys9bM6xi4aF0WTZOvfl1ksDXPzuXPGiiiIuMgQFJeyN5iUnS1iPu3wH+kQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@mui/material': ^6.1.8 + '@mui/material-pigment-css': ^6.1.8 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@mui/material-pigment-css': + optional: true + '@types/react': + optional: true + + '@mui/material@6.5.0': + resolution: {integrity: sha512-yjvtXoFcrPLGtgKRxFaH6OQPtcLPhkloC0BML6rBG5UeldR0nPULR/2E2BfXdo5JNV7j7lOzrrLX2Qf/iSidow==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@mui/material-pigment-css': ^6.5.0 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@mui/material-pigment-css': + optional: true + '@types/react': + optional: true + + '@mui/private-theming@6.4.9': + resolution: {integrity: sha512-LktcVmI5X17/Q5SkwjCcdOLBzt1hXuc14jYa7NPShog0GBDCDvKtcnP0V7a2s6EiVRlv7BzbWEJzH6+l/zaCxw==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/styled-engine@6.5.0': + resolution: {integrity: sha512-8woC2zAqF4qUDSPIBZ8v3sakj+WgweolpyM/FXf8jAx6FMls+IE4Y8VDZc+zS805J7PRz31vz73n2SovKGaYgw==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@emotion/react': ^11.4.1 + '@emotion/styled': ^11.3.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + + '@mui/system@6.5.0': + resolution: {integrity: sha512-XcbBYxDS+h/lgsoGe78ExXFZXtuIlSBpn/KsZq8PtZcIkUNJInkuDqcLd2rVBQrDC1u+rvVovdaWPf2FHKJf3w==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@emotion/react': ^11.5.0 + '@emotion/styled': ^11.3.0 + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/react': + optional: true + '@emotion/styled': + optional: true + '@types/react': + optional: true + + '@mui/types@7.2.24': + resolution: {integrity: sha512-3c8tRt/CbWZ+pEg7QpSwbdxOk36EfmhbKf6AGZsD1EcLDLTSZoxxJ86FVtcjxvjuhdyBiWKSTGZFaXCnidO2kw==} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/types@7.4.12': + resolution: {integrity: sha512-iKNAF2u9PzSIj40CjvKJWxFXJo122jXVdrmdh0hMYd+FR+NuJMkr/L88XwWLCRiJ5P1j+uyac25+Kp6YC4hu6w==} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@mui/utils@6.4.9': + resolution: {integrity: sha512-Y12Q9hbK9g+ZY0T3Rxrx9m2m10gaphDuUMgWxyV5kNJevVxXYCLclYUCC9vXaIk1/NdNDTcW2Yfr2OGvNFNmHg==} + engines: {node: '>=14.0.0'} + peerDependencies: + '@types/react': ^17.0.0 || ^18.0.0 || ^19.0.0 + react: ^17.0.0 || ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + '@next/env@12.3.7': resolution: {integrity: sha512-gCw4sTeHoNr0EUO+Nk9Ll21OzF3PnmM0GlHaKgsY2AWQSqQlMgECvB0YI4k21M9iGy+tQ5RMyXQuoIMpzhtxww==} + '@next/env@15.5.12': + resolution: {integrity: sha512-pUvdJN1on574wQHjaBfNGDt9Mz5utDSZFsIIQkMzPgNS8ZvT4H2mwOrOIClwsQOb6EGx5M76/CZr6G8i6pSpLg==} + '@next/eslint-plugin-next@12.3.7': resolution: {integrity: sha512-L3WEJJBd1CUUsuxSEThheAV5Nh6/mzCagwj4LHaYlANBkW8Hmg8Ne8l/Vx/sPyfyE7FjuKyiNYWbSVpXRvrmaw==} @@ -93,12 +557,24 @@ packages: cpu: [arm64] os: [darwin] + '@next/swc-darwin-arm64@15.5.12': + resolution: {integrity: sha512-RnRjBtH8S8eXCpUNkQ+543DUc7ys8y15VxmFU9HRqlo9BG3CcBUiwNtF8SNoi2xvGCVJq1vl2yYq+3oISBS0Zg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + '@next/swc-darwin-x64@12.3.4': resolution: {integrity: sha512-PPF7tbWD4k0dJ2EcUSnOsaOJ5rhT3rlEt/3LhZUGiYNL8KvoqczFrETlUx0cUYaXe11dRA3F80Hpt727QIwByQ==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] + '@next/swc-darwin-x64@15.5.12': + resolution: {integrity: sha512-nqa9/7iQlboF1EFtNhWxQA0rQstmYRSBGxSM6g3GxvxHxcoeqVXfGNr9stJOme674m2V7r4E3+jEhhGvSQhJRA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + '@next/swc-freebsd-x64@12.3.4': resolution: {integrity: sha512-KM9JXRXi/U2PUM928z7l4tnfQ9u8bTco/jb939pdFUHqc28V43Ohd31MmZD1QzEK4aFlMRaIBQOWQZh4D/E5lQ==} engines: {node: '>= 10'} @@ -118,6 +594,13 @@ packages: os: [linux] libc: [glibc] + '@next/swc-linux-arm64-gnu@15.5.12': + resolution: {integrity: sha512-dCzAjqhDHwmoB2M4eYfVKqXs99QdQxNQVpftvP1eGVppamXh/OkDAwV737Zr0KPXEqRUMN4uCjh6mjO+XtF3Mw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@next/swc-linux-arm64-musl@12.3.4': resolution: {integrity: sha512-EETZPa1juczrKLWk5okoW2hv7D7WvonU+Cf2CgsSoxgsYbUCZ1voOpL4JZTOb6IbKMDo6ja+SbY0vzXZBUMvkQ==} engines: {node: '>= 10'} @@ -125,6 +608,13 @@ packages: os: [linux] libc: [musl] + '@next/swc-linux-arm64-musl@15.5.12': + resolution: {integrity: sha512-+fpGWvQiITgf7PUtbWY1H7qUSnBZsPPLyyq03QuAKpVoTy/QUx1JptEDTQMVvQhvizCEuNLEeghrQUyXQOekuw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + libc: [musl] + '@next/swc-linux-x64-gnu@12.3.4': resolution: {integrity: sha512-4csPbRbfZbuWOk3ATyWcvVFdD9/Rsdq5YHKvRuEni68OCLkfy4f+4I9OBpyK1SKJ00Cih16NJbHE+k+ljPPpag==} engines: {node: '>= 10'} @@ -132,6 +622,13 @@ packages: os: [linux] libc: [glibc] + '@next/swc-linux-x64-gnu@15.5.12': + resolution: {integrity: sha512-jSLvgdRRL/hrFAPqEjJf1fFguC719kmcptjNVDJl26BnJIpjL3KH5h6mzR4mAweociLQaqvt4UyzfbFjgAdDcw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [glibc] + '@next/swc-linux-x64-musl@12.3.4': resolution: {integrity: sha512-YeBmI+63Ro75SUiL/QXEVXQ19T++58aI/IINOyhpsRL1LKdyfK/35iilraZEFz9bLQrwy1LYAR5lK200A9Gjbg==} engines: {node: '>= 10'} @@ -139,12 +636,25 @@ packages: os: [linux] libc: [musl] + '@next/swc-linux-x64-musl@15.5.12': + resolution: {integrity: sha512-/uaF0WfmYqQgLfPmN6BvULwxY0dufI2mlN2JbOKqqceZh1G4hjREyi7pg03zjfyS6eqNemHAZPSoP84x17vo6w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + libc: [musl] + '@next/swc-win32-arm64-msvc@12.3.4': resolution: {integrity: sha512-Sd0qFUJv8Tj0PukAYbCCDbmXcMkbIuhnTeHm9m4ZGjCf6kt7E/RMs55Pd3R5ePjOkN7dJEuxYBehawTR/aPDSQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] + '@next/swc-win32-arm64-msvc@15.5.12': + resolution: {integrity: sha512-xhsL1OvQSfGmlL5RbOmU+FV120urrgFpYLq+6U8C6KIym32gZT6XF/SDE92jKzzlPWskkbjOKCpqk5m4i8PEfg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + '@next/swc-win32-ia32-msvc@12.3.4': resolution: {integrity: sha512-rt/vv/vg/ZGGkrkKcuJ0LyliRdbskQU+91bje+PgoYmxTZf/tYs6IfbmgudBJk6gH3QnjHWbkphDdRQrseRefQ==} engines: {node: '>= 10'} @@ -157,6 +667,12 @@ packages: cpu: [x64] os: [win32] + '@next/swc-win32-x64-msvc@15.5.12': + resolution: {integrity: sha512-Z1Dh6lhFkxvBDH1FoW6OU/L6prYwPSlwjLiZkExIAh8fbP6iI/M7iGTQAJPYJ9YFlWobCZ1PHbchFhFYb2ADkw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -169,6 +685,9 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@popperjs/core@2.11.8': + resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} + '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} @@ -178,12 +697,32 @@ packages: '@swc/helpers@0.4.11': resolution: {integrity: sha512-rEUrBSGIoSFuYxwBYtlUFMlE2CwGhmW+w9355/5oduSw8e5h2+Tj4UrAGNNgP9915++wj5vkQo0UuOBqOAq4nw==} + '@swc/helpers@0.5.15': + resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} '@types/json5@0.0.29': resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + '@types/node@22.9.1': + resolution: {integrity: sha512-p8Yy/8sw1caA8CdRIQBG5tiLHmxtQKObCijiAa9Ez+d4+PRffM4054xbju0msf+cvhJpnFEeNjxmVT/0ipktrg==} + + '@types/parse-json@4.0.2': + resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + + '@types/prop-types@15.7.15': + resolution: {integrity: sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==} + + '@types/react-transition-group@4.4.12': + resolution: {integrity: sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==} + peerDependencies: + '@types/react': '*' + + '@types/react@18.3.28': + resolution: {integrity: sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==} + '@types/semver@7.7.1': resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} @@ -331,6 +870,10 @@ packages: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} + babel-plugin-macros@3.1.0: + resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} + engines: {node: '>=10', npm: '>=6'} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -364,6 +907,13 @@ packages: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -374,10 +924,20 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + + cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} @@ -421,6 +981,10 @@ packages: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} @@ -433,13 +997,22 @@ packages: resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} engines: {node: '>=6.0.0'} + dom-helpers@5.2.1: + resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} + dwolla@1.1.1: + resolution: {integrity: sha512-FAeJIcxwVAbly5BiAOhp836ILRKnvUrxWDTuXpknTCKPHJZJC7PdsrPTB9xfydukHW50egvDDCzAltmmCe5h7w==} + emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + error-ex@1.3.4: + resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} + es-abstract@1.24.1: resolution: {integrity: sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw==} engines: {node: '>= 0.4'} @@ -616,6 +1189,9 @@ packages: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} + find-root@1.1.0: + resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + find-up@5.0.0: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} @@ -722,6 +1298,9 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + hoist-non-react-statics@3.3.2: + resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -749,6 +1328,9 @@ packages: resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==} engines: {node: '>= 0.4'} + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + is-async-function@2.1.1: resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} engines: {node: '>= 0.4'} @@ -866,9 +1448,17 @@ packages: resolution: {integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==} hasBin: true + jsesc@3.1.0: + resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} + engines: {node: '>=6'} + hasBin: true + json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} @@ -897,6 +1487,9 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -958,6 +1551,27 @@ packages: sass: optional: true + next@15.5.12: + resolution: {integrity: sha512-Fi/wQ4Etlrn60rz78bebG1i1SR20QxvV8tVp6iJspjLUSHcZoeUXCt+vmWoEcza85ElZzExK/jJ/F6SvtGktjA==} + engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.51.1 + babel-plugin-react-compiler: '*' + react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + babel-plugin-react-compiler: + optional: true + sass: + optional: true + node-exports-info@1.6.0: resolution: {integrity: sha512-pyFS63ptit/P5WqUkt+UUfe+4oevH+bFeIiPPdfb0pFeYEu/1ELnJu5l+5EcTKYL5M7zaAa7S8ddywgXypqKCw==} engines: {node: '>= 0.4'} @@ -1017,6 +1631,10 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -1051,6 +1669,10 @@ packages: resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==} engines: {node: ^10 || ^12 || >=14} + postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} @@ -1078,6 +1700,15 @@ packages: react-is@16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + react-is@19.2.4: + resolution: {integrity: sha512-W+EWGn2v0ApPKgKKCy/7s7WHXkboGcsrXE+2joLyVxkbyVQfO3MUEaUQDHoSmb8TFFrSKYa9mw64WZHNHSDzYA==} + + react-transition-group@4.4.5: + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} + peerDependencies: + react: '>=16.6.0' + react-dom: '>=16.6.0' + react@18.3.1: resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} engines: {node: '>=0.10.0'} @@ -1152,6 +1783,10 @@ packages: resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==} engines: {node: '>= 0.4'} + sharp@0.34.5: + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -1184,6 +1819,10 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map@0.5.7: + resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==} + engines: {node: '>=0.10.0'} + stop-iteration-iterator@1.1.0: resolution: {integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==} engines: {node: '>= 0.4'} @@ -1236,6 +1875,22 @@ packages: babel-plugin-macros: optional: true + styled-jsx@5.1.6: + resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + + stylis@4.2.0: + resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} + supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -1295,51 +1950,212 @@ packages: engines: {node: '>=4.2.0'} hasBin: true + typescript@5.9.3: + resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} + engines: {node: '>=14.17'} + hasBin: true + unbox-primitive@1.1.0: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} + undici-types@6.19.8: + resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - use-sync-external-store@1.2.0: - resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} - peerDependencies: - react: ^16.8.0 || ^17.0.0 || ^18.0.0 + use-sync-external-store@1.2.0: + resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 + + which-boxed-primitive@1.1.1: + resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} + engines: {node: '>= 0.4'} + + which-builtin-type@1.2.1: + resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-typed-array@1.1.20: + resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} + engines: {node: '>= 0.4'} + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + zod@4.3.6: + resolution: {integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==} + +snapshots: + + '@babel/code-frame@7.29.0': + dependencies: + '@babel/helper-validator-identifier': 7.28.5 + js-tokens: 4.0.0 + picocolors: 1.1.1 + + '@babel/generator@7.29.1': + dependencies: + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + jsesc: 3.1.0 + + '@babel/helper-globals@7.28.0': {} + + '@babel/helper-module-imports@7.28.6': + dependencies: + '@babel/traverse': 7.29.0 + '@babel/types': 7.29.0 + transitivePeerDependencies: + - supports-color + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/parser@7.29.0': + dependencies: + '@babel/types': 7.29.0 + + '@babel/runtime@7.28.6': {} + + '@babel/template@7.28.6': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/parser': 7.29.0 + '@babel/types': 7.29.0 + + '@babel/traverse@7.29.0': + dependencies: + '@babel/code-frame': 7.29.0 + '@babel/generator': 7.29.1 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.29.0 + '@babel/template': 7.28.6 + '@babel/types': 7.29.0 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.29.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@checkout.com/checkout-web-components@1.7.1': {} + + '@emnapi/runtime@1.8.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@emotion/babel-plugin@11.13.5': + dependencies: + '@babel/helper-module-imports': 7.28.6 + '@babel/runtime': 7.28.6 + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/serialize': 1.3.3 + babel-plugin-macros: 3.1.0 + convert-source-map: 1.9.0 + escape-string-regexp: 4.0.0 + find-root: 1.1.0 + source-map: 0.5.7 + stylis: 4.2.0 + transitivePeerDependencies: + - supports-color + + '@emotion/cache@11.14.0': + dependencies: + '@emotion/memoize': 0.9.0 + '@emotion/sheet': 1.4.0 + '@emotion/utils': 1.4.2 + '@emotion/weak-memoize': 0.4.0 + stylis: 4.2.0 + + '@emotion/hash@0.9.2': {} + + '@emotion/is-prop-valid@1.4.0': + dependencies: + '@emotion/memoize': 0.9.0 - which-boxed-primitive@1.1.1: - resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} - engines: {node: '>= 0.4'} + '@emotion/memoize@0.9.0': {} - which-builtin-type@1.2.1: - resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==} - engines: {node: '>= 0.4'} + '@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.28.6 + '@emotion/babel-plugin': 11.13.5 + '@emotion/cache': 11.14.0 + '@emotion/serialize': 1.3.3 + '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@18.3.1) + '@emotion/utils': 1.4.2 + '@emotion/weak-memoize': 0.4.0 + hoist-non-react-statics: 3.3.2 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.28 + transitivePeerDependencies: + - supports-color - which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} + '@emotion/serialize@1.3.3': + dependencies: + '@emotion/hash': 0.9.2 + '@emotion/memoize': 0.9.0 + '@emotion/unitless': 0.10.0 + '@emotion/utils': 1.4.2 + csstype: 3.2.3 - which-typed-array@1.1.20: - resolution: {integrity: sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg==} - engines: {node: '>= 0.4'} + '@emotion/sheet@1.4.0': {} - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true + '@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.28.6 + '@emotion/babel-plugin': 11.13.5 + '@emotion/is-prop-valid': 1.4.0 + '@emotion/react': 11.14.0(@types/react@18.3.28)(react@18.3.1) + '@emotion/serialize': 1.3.3 + '@emotion/use-insertion-effect-with-fallbacks': 1.2.0(react@18.3.1) + '@emotion/utils': 1.4.2 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.28 + transitivePeerDependencies: + - supports-color - word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} + '@emotion/unitless@0.10.0': {} - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + '@emotion/use-insertion-effect-with-fallbacks@1.2.0(react@18.3.1)': + dependencies: + react: 18.3.1 - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} + '@emotion/utils@1.4.2': {} -snapshots: + '@emotion/weak-memoize@0.4.0': {} '@eslint-community/eslint-utils@4.9.1(eslint@8.57.1)': dependencies: @@ -1364,6 +2180,23 @@ snapshots: '@eslint/js@8.57.1': {} + '@floating-ui/core@1.7.5': + dependencies: + '@floating-ui/utils': 0.2.11 + + '@floating-ui/dom@1.7.6': + dependencies: + '@floating-ui/core': 1.7.5 + '@floating-ui/utils': 0.2.11 + + '@floating-ui/react-dom@2.1.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@floating-ui/dom': 1.7.6 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + + '@floating-ui/utils@0.2.11': {} + '@humanwhocodes/config-array@0.13.0': dependencies: '@humanwhocodes/object-schema': 2.0.3 @@ -1376,8 +2209,243 @@ snapshots: '@humanwhocodes/object-schema@2.0.3': {} + '@img/colour@1.1.0': + optional: true + + '@img/sharp-darwin-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.4 + optional: true + + '@img/sharp-darwin-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.4 + optional: true + + '@img/sharp-libvips-darwin-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-darwin-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-arm@1.2.4': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-riscv64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-s390x@1.2.4': + optional: true + + '@img/sharp-libvips-linux-x64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + optional: true + + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + optional: true + + '@img/sharp-linux-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.4 + optional: true + + '@img/sharp-linux-arm@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.4 + optional: true + + '@img/sharp-linux-ppc64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.4 + optional: true + + '@img/sharp-linux-riscv64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-riscv64': 1.2.4 + optional: true + + '@img/sharp-linux-s390x@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.4 + optional: true + + '@img/sharp-linux-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + optional: true + + '@img/sharp-linuxmusl-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + optional: true + + '@img/sharp-wasm32@0.34.5': + dependencies: + '@emnapi/runtime': 1.8.1 + optional: true + + '@img/sharp-win32-arm64@0.34.5': + optional: true + + '@img/sharp-win32-ia32@0.34.5': + optional: true + + '@img/sharp-win32-x64@0.34.5': + optional: true + + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + + '@mui/base@5.0.0-beta.62(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.28.6 + '@floating-ui/react-dom': 2.1.8(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/types': 7.4.12(@types/react@18.3.28) + '@mui/utils': 6.4.9(@types/react@18.3.28)(react@18.3.1) + '@popperjs/core': 2.11.8 + clsx: 2.1.1 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.28 + + '@mui/core-downloads-tracker@6.5.0': {} + + '@mui/icons-material@7.3.9(@mui/material@6.5.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.28)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.28.6 + '@mui/material': 6.5.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.28 + + '@mui/lab@6.0.0-beta.16(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@mui/material@6.5.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.28.6 + '@mui/base': 5.0.0-beta.62(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/material': 6.5.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@mui/system': 6.5.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1) + '@mui/types': 7.4.12(@types/react@18.3.28) + '@mui/utils': 6.4.9(@types/react@18.3.28)(react@18.3.1) + clsx: 2.1.1 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@emotion/react': 11.14.0(@types/react@18.3.28)(react@18.3.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1) + '@types/react': 18.3.28 + + '@mui/material@6.5.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.28.6 + '@mui/core-downloads-tracker': 6.5.0 + '@mui/system': 6.5.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1) + '@mui/types': 7.2.24(@types/react@18.3.28) + '@mui/utils': 6.4.9(@types/react@18.3.28)(react@18.3.1) + '@popperjs/core': 2.11.8 + '@types/react-transition-group': 4.4.12(@types/react@18.3.28) + clsx: 2.1.1 + csstype: 3.2.3 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-is: 19.2.4 + react-transition-group: 4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + optionalDependencies: + '@emotion/react': 11.14.0(@types/react@18.3.28)(react@18.3.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1) + '@types/react': 18.3.28 + + '@mui/private-theming@6.4.9(@types/react@18.3.28)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.28.6 + '@mui/utils': 6.4.9(@types/react@18.3.28)(react@18.3.1) + prop-types: 15.8.1 + react: 18.3.1 + optionalDependencies: + '@types/react': 18.3.28 + + '@mui/styled-engine@6.5.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.28.6 + '@emotion/cache': 11.14.0 + '@emotion/serialize': 1.3.3 + '@emotion/sheet': 1.4.0 + csstype: 3.2.3 + prop-types: 15.8.1 + react: 18.3.1 + optionalDependencies: + '@emotion/react': 11.14.0(@types/react@18.3.28)(react@18.3.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1) + + '@mui/system@6.5.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.28.6 + '@mui/private-theming': 6.4.9(@types/react@18.3.28)(react@18.3.1) + '@mui/styled-engine': 6.5.0(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@emotion/styled@11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1))(react@18.3.1) + '@mui/types': 7.2.24(@types/react@18.3.28) + '@mui/utils': 6.4.9(@types/react@18.3.28)(react@18.3.1) + clsx: 2.1.1 + csstype: 3.2.3 + prop-types: 15.8.1 + react: 18.3.1 + optionalDependencies: + '@emotion/react': 11.14.0(@types/react@18.3.28)(react@18.3.1) + '@emotion/styled': 11.14.1(@emotion/react@11.14.0(@types/react@18.3.28)(react@18.3.1))(@types/react@18.3.28)(react@18.3.1) + '@types/react': 18.3.28 + + '@mui/types@7.2.24(@types/react@18.3.28)': + optionalDependencies: + '@types/react': 18.3.28 + + '@mui/types@7.4.12(@types/react@18.3.28)': + dependencies: + '@babel/runtime': 7.28.6 + optionalDependencies: + '@types/react': 18.3.28 + + '@mui/utils@6.4.9(@types/react@18.3.28)(react@18.3.1)': + dependencies: + '@babel/runtime': 7.28.6 + '@mui/types': 7.2.24(@types/react@18.3.28) + '@types/prop-types': 15.7.15 + clsx: 2.1.1 + prop-types: 15.8.1 + react: 18.3.1 + react-is: 19.2.4 + optionalDependencies: + '@types/react': 18.3.28 + '@next/env@12.3.7': {} + '@next/env@15.5.12': {} + '@next/eslint-plugin-next@12.3.7': dependencies: glob: 7.1.7 @@ -1391,9 +2459,15 @@ snapshots: '@next/swc-darwin-arm64@12.3.4': optional: true + '@next/swc-darwin-arm64@15.5.12': + optional: true + '@next/swc-darwin-x64@12.3.4': optional: true + '@next/swc-darwin-x64@15.5.12': + optional: true + '@next/swc-freebsd-x64@12.3.4': optional: true @@ -1403,24 +2477,42 @@ snapshots: '@next/swc-linux-arm64-gnu@12.3.4': optional: true + '@next/swc-linux-arm64-gnu@15.5.12': + optional: true + '@next/swc-linux-arm64-musl@12.3.4': optional: true + '@next/swc-linux-arm64-musl@15.5.12': + optional: true + '@next/swc-linux-x64-gnu@12.3.4': optional: true + '@next/swc-linux-x64-gnu@15.5.12': + optional: true + '@next/swc-linux-x64-musl@12.3.4': optional: true + '@next/swc-linux-x64-musl@15.5.12': + optional: true + '@next/swc-win32-arm64-msvc@12.3.4': optional: true + '@next/swc-win32-arm64-msvc@15.5.12': + optional: true + '@next/swc-win32-ia32-msvc@12.3.4': optional: true '@next/swc-win32-x64-msvc@12.3.4': optional: true + '@next/swc-win32-x64-msvc@15.5.12': + optional: true + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -1433,6 +2525,8 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 + '@popperjs/core@2.11.8': {} + '@rtsao/scc@1.1.0': {} '@rushstack/eslint-patch@1.16.1': {} @@ -1441,10 +2535,31 @@ snapshots: dependencies: tslib: 2.8.1 + '@swc/helpers@0.5.15': + dependencies: + tslib: 2.8.1 + '@types/json-schema@7.0.15': {} '@types/json5@0.0.29': {} + '@types/node@22.9.1': + dependencies: + undici-types: 6.19.8 + + '@types/parse-json@4.0.2': {} + + '@types/prop-types@15.7.15': {} + + '@types/react-transition-group@4.4.12(@types/react@18.3.28)': + dependencies: + '@types/react': 18.3.28 + + '@types/react@18.3.28': + dependencies: + '@types/prop-types': 15.7.15 + csstype: 3.2.3 + '@types/semver@7.7.1': {} '@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@4.9.5))(eslint@8.57.1)(typescript@4.9.5)': @@ -1637,6 +2752,12 @@ snapshots: axobject-query@4.1.0: {} + babel-plugin-macros@3.1.0: + dependencies: + '@babel/runtime': 7.28.6 + cosmiconfig: 7.1.0 + resolve: 1.22.11 + balanced-match@1.0.2: {} brace-expansion@1.1.12: @@ -1674,6 +2795,10 @@ snapshots: ansi-styles: 4.3.0 supports-color: 7.2.0 + client-only@0.0.1: {} + + clsx@2.1.1: {} + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -1682,12 +2807,24 @@ snapshots: concat-map@0.0.1: {} + convert-source-map@1.9.0: {} + + cosmiconfig@7.1.0: + dependencies: + '@types/parse-json': 4.0.2 + import-fresh: 3.3.1 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 + csstype@3.2.3: {} + damerau-levenshtein@1.0.8: {} data-view-buffer@1.0.2: @@ -1730,6 +2867,9 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 + detect-libc@2.1.2: + optional: true + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -1742,14 +2882,27 @@ snapshots: dependencies: esutils: 2.0.3 + dom-helpers@5.2.1: + dependencies: + '@babel/runtime': 7.28.6 + csstype: 3.2.3 + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 es-errors: 1.3.0 gopd: 1.2.0 + dwolla@1.1.1: + dependencies: + zod: 4.3.6 + emoji-regex@9.2.2: {} + error-ex@1.3.4: + dependencies: + is-arrayish: 0.2.1 + es-abstract@1.24.1: dependencies: array-buffer-byte-length: 1.0.2 @@ -2081,6 +3234,8 @@ snapshots: dependencies: to-regex-range: 5.0.1 + find-root@1.1.0: {} + find-up@5.0.0: dependencies: locate-path: 6.0.0 @@ -2209,6 +3364,10 @@ snapshots: dependencies: function-bind: 1.1.2 + hoist-non-react-statics@3.3.2: + dependencies: + react-is: 16.13.1 + ignore@5.3.2: {} import-fresh@3.3.1: @@ -2237,6 +3396,8 @@ snapshots: call-bound: 1.0.4 get-intrinsic: 1.3.0 + is-arrayish@0.2.1: {} + is-async-function@2.1.1: dependencies: async-function: 1.0.0 @@ -2360,8 +3521,12 @@ snapshots: dependencies: argparse: 2.0.1 + jsesc@3.1.0: {} + json-buffer@3.0.1: {} + json-parse-even-better-errors@2.3.1: {} + json-schema-traverse@0.4.1: {} json-stable-stringify-without-jsonify@1.0.1: {} @@ -2392,6 +3557,8 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + lines-and-columns@1.2.4: {} + locate-path@6.0.0: dependencies: p-locate: 5.0.0 @@ -2453,6 +3620,29 @@ snapshots: - '@babel/core' - babel-plugin-macros + next@15.5.12(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@next/env': 15.5.12 + '@swc/helpers': 0.5.15 + caniuse-lite: 1.0.30001776 + postcss: 8.4.31 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + styled-jsx: 5.1.6(react@18.3.1) + optionalDependencies: + '@next/swc-darwin-arm64': 15.5.12 + '@next/swc-darwin-x64': 15.5.12 + '@next/swc-linux-arm64-gnu': 15.5.12 + '@next/swc-linux-arm64-musl': 15.5.12 + '@next/swc-linux-x64-gnu': 15.5.12 + '@next/swc-linux-x64-musl': 15.5.12 + '@next/swc-win32-arm64-msvc': 15.5.12 + '@next/swc-win32-x64-msvc': 15.5.12 + sharp: 0.34.5 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + node-exports-info@1.6.0: dependencies: array.prototype.flatmap: 1.3.3 @@ -2533,6 +3723,13 @@ snapshots: dependencies: callsites: 3.1.0 + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.29.0 + error-ex: 1.3.4 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + path-exists@4.0.0: {} path-is-absolute@1.0.1: {} @@ -2555,6 +3752,12 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postcss@8.4.31: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + prelude-ls@1.2.1: {} prettier@2.8.8: {} @@ -2577,6 +3780,17 @@ snapshots: react-is@16.13.1: {} + react-is@19.2.4: {} + + react-transition-group@4.4.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@babel/runtime': 7.28.6 + dom-helpers: 5.2.1 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react@18.3.1: dependencies: loose-envify: 1.4.0 @@ -2677,6 +3891,38 @@ snapshots: es-errors: 1.3.0 es-object-atoms: 1.1.1 + sharp@0.34.5: + dependencies: + '@img/colour': 1.1.0 + detect-libc: 2.1.2 + semver: 7.7.4 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.5 + '@img/sharp-darwin-x64': 0.34.5 + '@img/sharp-libvips-darwin-arm64': 1.2.4 + '@img/sharp-libvips-darwin-x64': 1.2.4 + '@img/sharp-libvips-linux-arm': 1.2.4 + '@img/sharp-libvips-linux-arm64': 1.2.4 + '@img/sharp-libvips-linux-ppc64': 1.2.4 + '@img/sharp-libvips-linux-riscv64': 1.2.4 + '@img/sharp-libvips-linux-s390x': 1.2.4 + '@img/sharp-libvips-linux-x64': 1.2.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + '@img/sharp-linux-arm': 0.34.5 + '@img/sharp-linux-arm64': 0.34.5 + '@img/sharp-linux-ppc64': 0.34.5 + '@img/sharp-linux-riscv64': 0.34.5 + '@img/sharp-linux-s390x': 0.34.5 + '@img/sharp-linux-x64': 0.34.5 + '@img/sharp-linuxmusl-arm64': 0.34.5 + '@img/sharp-linuxmusl-x64': 0.34.5 + '@img/sharp-wasm32': 0.34.5 + '@img/sharp-win32-arm64': 0.34.5 + '@img/sharp-win32-ia32': 0.34.5 + '@img/sharp-win32-x64': 0.34.5 + optional: true + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -2715,6 +3961,8 @@ snapshots: source-map-js@1.2.1: {} + source-map@0.5.7: {} + stop-iteration-iterator@1.1.0: dependencies: es-errors: 1.3.0 @@ -2782,6 +4030,13 @@ snapshots: dependencies: react: 18.3.1 + styled-jsx@5.1.6(react@18.3.1): + dependencies: + client-only: 0.0.1 + react: 18.3.1 + + stylis@4.2.0: {} + supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -2851,6 +4106,8 @@ snapshots: typescript@4.9.5: {} + typescript@5.9.3: {} + unbox-primitive@1.1.0: dependencies: call-bound: 1.0.4 @@ -2858,6 +4115,8 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 + undici-types@6.19.8: {} + uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -2915,4 +4174,8 @@ snapshots: wrappy@1.0.2: {} + yaml@1.10.2: {} + yocto-queue@0.1.0: {} + + zod@4.3.6: {}