From 91e4079b7e45bda3523bb67979fb41596564cd11 Mon Sep 17 00:00:00 2001 From: Gunnar Torfi Date: Sat, 15 Mar 2025 21:20:35 +0000 Subject: [PATCH] feat: e2e rapyd working --- app/actions/cart.ts | 68 + app/layout.tsx | 16 +- app/order-error/page.tsx | 3 + app/order-successful/page.tsx | 3 + components/cart/actions.ts | 67 +- components/cart/add-to-cart.tsx | 14 +- components/cart/cart-context.tsx | 256 ++-- components/cart/modal.tsx | 512 ++++---- components/layout/navbar/index.tsx | 57 +- components/price.tsx | 13 +- components/product/product-description.tsx | 14 +- lib/rapyd/checkout.ts | 8 +- lib/rapyd/make-rapyd-request.ts | 193 +++ lib/rapyd/utilities.ts | 1 + lib/store/products.ts | 8 + pnpm-lock.yaml | 1334 +++++++++++++------- 16 files changed, 1581 insertions(+), 986 deletions(-) create mode 100644 app/actions/cart.ts create mode 100644 app/order-error/page.tsx create mode 100644 app/order-successful/page.tsx create mode 100644 lib/rapyd/make-rapyd-request.ts diff --git a/app/actions/cart.ts b/app/actions/cart.ts new file mode 100644 index 000000000..181c31bbc --- /dev/null +++ b/app/actions/cart.ts @@ -0,0 +1,68 @@ +"use server"; + +import { CartState } from "@/components/cart/cart-context"; +import { getProductById } from "@/lib/store/products"; + +type StorageCartItem = { + variantId: string; + productId: string; + quantity: number; +}; + +export const calculateCartTotals = async ( + items: StorageCartItem[] +): Promise => { + const cartLines = []; + let totalQuantity = 0; + + // Fetch products and build cart lines + for (const item of items) { + const product = await getProductById({ id: item.productId }); + if (product) { + const variant = product.variants.find((v) => v.id === item.variantId); + if (variant) { + cartLines.push({ + merchandise: { + ...variant, + product, + }, + quantity: item.quantity, + }); + totalQuantity += item.quantity; + } + } + } + + // Calculate totals + const subtotalAmount = cartLines + .reduce( + (sum, item) => + sum + parseFloat(item.merchandise.price.amount) * item.quantity, + 0 + ) + .toFixed(2); + + const taxAmount = (parseFloat(subtotalAmount) * 0.1).toFixed(2); + const totalAmount = ( + parseFloat(subtotalAmount) + parseFloat(taxAmount) + ).toFixed(2); + + return { + lines: cartLines, + totalQuantity, + cost: { + subtotalAmount: { + amount: subtotalAmount, + currencyCode: "ISK", + }, + totalAmount: { + amount: totalAmount, + currencyCode: "ISK", + }, + totalTaxAmount: { + amount: taxAmount, + currencyCode: "ISK", + }, + }, + }; +}; diff --git a/app/layout.tsx b/app/layout.tsx index 325f1a8c6..bdfb26a77 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,19 +1,23 @@ +import { Navbar } from "@/components/layout/navbar"; import { CartProvider } from "components/cart/cart-context"; import { Inter } from "next/font/google"; import { ReactNode } from "react"; +import { Toaster } from "sonner"; import "./globals.css"; const inter = Inter({ subsets: ["latin"] }); -export default async function RootLayout({ - children, -}: { - children: ReactNode; -}) { +export default function RootLayout({ children }: { children: ReactNode }) { return ( - {children} + + +
+ {children} + +
+
); diff --git a/app/order-error/page.tsx b/app/order-error/page.tsx new file mode 100644 index 000000000..80a602d6d --- /dev/null +++ b/app/order-error/page.tsx @@ -0,0 +1,3 @@ +export default function OrderError() { + return
Order Error
; +} diff --git a/app/order-successful/page.tsx b/app/order-successful/page.tsx new file mode 100644 index 000000000..979136491 --- /dev/null +++ b/app/order-successful/page.tsx @@ -0,0 +1,3 @@ +export default function OrderSuccessful() { + return
Order Successful
; +} diff --git a/components/cart/actions.ts b/components/cart/actions.ts index d225fb5b9..3e8826ee0 100644 --- a/components/cart/actions.ts +++ b/components/cart/actions.ts @@ -1,46 +1,58 @@ "use server"; +import { createCheckout } from "@/lib/rapyd/checkout"; +import { getProductById } from "@/lib/store/products"; import { TAGS } from "lib/constants"; import { revalidateTag } from "next/cache"; -import { RequestCookies } from "next/dist/server/web/spec-extension/cookies"; import { cookies } from "next/headers"; +import { redirect } from "next/navigation"; + +interface Cart { + id: string; +} export interface CartItem { id: string; quantity: number; + amount: number; } const CART_COOKIE = "cart"; -const getCartFromCookie = (): CartItem[] => { - const cookieStore = cookies() as unknown as RequestCookies; +const getCartFromCookie = async (): Promise => { + const cookieStore = await cookies(); const cartCookie = cookieStore.get(CART_COOKIE)?.value; return cartCookie ? JSON.parse(cartCookie) : []; }; -const setCartCookie = (cart: CartItem[]) => { - const cookieStore = cookies() as unknown as RequestCookies; +const setCartCookie = async (cart: CartItem[]) => { + const cookieStore = await cookies(); cookieStore.set(CART_COOKIE, JSON.stringify(cart)); }; export const addToCart = async (productId: string) => { - const cart = getCartFromCookie(); + const cart = await getCartFromCookie(); + const product = await getProductById({ id: productId }); const existingItem = cart.find((item) => item.id === productId); if (existingItem) { existingItem.quantity += 1; } else { - cart.push({ id: productId, quantity: 1 }); + cart.push({ + id: productId, + quantity: 1, + amount: parseFloat(product?.variants[0]?.price.amount ?? "0"), + }); } - setCartCookie(cart); + await setCartCookie(cart); return cart; }; export const removeFromCart = async (productId: string) => { - const cart = getCartFromCookie(); + const cart = await getCartFromCookie(); const updatedCart = cart.filter((item) => item.id !== productId); - setCartCookie(updatedCart); + await setCartCookie(updatedCart); return updatedCart; }; @@ -48,7 +60,7 @@ export const updateCartItemQuantity = async ( productId: string, quantity: number ) => { - const cart = getCartFromCookie(); + const cart = await getCartFromCookie(); const item = cart.find((item) => item.id === productId); if (item) { @@ -56,7 +68,7 @@ export const updateCartItemQuantity = async ( } const updatedCart = cart.filter((item) => item.quantity > 0); - setCartCookie(updatedCart); + await setCartCookie(updatedCart); return updatedCart; }; @@ -126,3 +138,34 @@ export async function updateItemQuantity( return "Error updating item quantity"; } } + +export async function createCart() { + const cart = { + id: crypto.randomUUID(), + }; + + return cart; +} + +export async function createCartAndSetCookie() { + let cart = await createCart(); + (await cookies()).set("cartId", cart.id!); +} + +export async function redirectToCheckout() { + let cart = await getCart(); + const totalAmount = cart.reduce( + (acc, item) => acc + item.quantity * item.amount, + 0 + ); + + const checkout = await createCheckout({ + amount: totalAmount, + description: "Cart", + merchantReferenceId: crypto.randomUUID(), + completeCheckoutUrl: process.env.NEXT_PUBLIC_APP_URL + "/order-successful", + cancelCheckoutUrl: process.env.NEXT_PUBLIC_APP_URL + "/order-error", + }); + + redirect(checkout.redirect_url); +} diff --git a/components/cart/add-to-cart.tsx b/components/cart/add-to-cart.tsx index 947ffa5b9..98eb6bb9a 100644 --- a/components/cart/add-to-cart.tsx +++ b/components/cart/add-to-cart.tsx @@ -73,23 +73,17 @@ export function AddToCart({ product }: { product: Product }) { ); const defaultVariantId = variants.length === 1 ? variants[0]?.id : undefined; const selectedVariantId = variant?.id || defaultVariantId; - const addItemAction = formAction.bind(null, selectedVariantId); const finalVariant = variants.find( (variant) => variant.id === selectedVariantId )!; - console.log({ - variant, - defaultVariantId, - selectedVariantId, - product, - }); - return (
{ - addCartItem(finalVariant, product); - addItemAction(); + if (selectedVariantId) { + await addItem(selectedVariantId); + addCartItem(finalVariant, product); + } }} > (undefined); -export function CartProvider({ children }: { children: React.ReactNode }) { - const [cart, setCart] = useState({ - lines: [], - totalQuantity: 0, - cost: { - subtotalAmount: { - amount: "0", - currencyCode: "USD", - }, - totalAmount: { - amount: "0", - currencyCode: "USD", - }, - totalTaxAmount: { - amount: "0", - currencyCode: "USD", - }, +const CART_STORAGE_KEY = "cartItems"; + +// Only store minimal cart data in sessionStorage +type StorageCartItem = { + variantId: string; + productId: string; + quantity: number; +}; + +const defaultCartState: CartState = { + lines: [], + totalQuantity: 0, + cost: { + subtotalAmount: { + amount: "0", + currencyCode: "ISK", }, - }); + totalAmount: { + amount: "0", + currencyCode: "ISK", + }, + totalTaxAmount: { + amount: "0", + currencyCode: "ISK", + }, + }, +}; - const addCartItem = (variant: ProductVariant, product: Product) => { - setCart((prevCart) => { - const existingItem = prevCart.lines.find( - (item) => item.merchandise.id === variant.id - ); +export function CartProvider({ children }: { children: React.ReactNode }) { + const [cart, setCart] = useState(defaultCartState); - let newLines; - if (existingItem) { - newLines = prevCart.lines.map((item) => - item.merchandise.id === variant.id - ? { ...item, quantity: item.quantity + 1 } - : item - ); - } else { - newLines = [ - ...prevCart.lines, - { - merchandise: { - ...variant, - product, - }, - quantity: 1, - }, - ]; + // Load cart from sessionStorage and calculate totals + useEffect(() => { + const loadCart = async () => { + const savedCart = sessionStorage.getItem(CART_STORAGE_KEY); + if (savedCart) { + const storageItems: StorageCartItem[] = JSON.parse(savedCart); + const calculatedCart = await calculateCartTotals(storageItems); + setCart(calculatedCart); } + }; - const totalQuantity = newLines.reduce( - (sum, item) => sum + item.quantity, - 0 + loadCart(); + }, []); + + const addCartItem = async (variant: ProductVariant, product: Product) => { + const savedCart = sessionStorage.getItem(CART_STORAGE_KEY); + const storageItems: StorageCartItem[] = savedCart + ? JSON.parse(savedCart) + : []; + + const existingItem = storageItems.find( + (item) => item.variantId === variant.id + ); + + let newStorageItems: StorageCartItem[]; + if (existingItem) { + newStorageItems = storageItems.map((item) => + item.variantId === variant.id + ? { ...item, quantity: item.quantity + 1 } + : item ); - - const subtotalAmount = newLines - .reduce( - (sum, item) => - sum + parseFloat(item.merchandise.price.amount) * item.quantity, - 0 - ) - .toFixed(2); - - // For this example, we'll assume tax rate is 10% - const taxAmount = (parseFloat(subtotalAmount) * 0.1).toFixed(2); - const totalAmount = ( - parseFloat(subtotalAmount) + parseFloat(taxAmount) - ).toFixed(2); - - return { - lines: newLines, - totalQuantity, - cost: { - subtotalAmount: { - amount: subtotalAmount, - currencyCode: "USD", - }, - totalAmount: { - amount: totalAmount, - currencyCode: "USD", - }, - totalTaxAmount: { - amount: taxAmount, - currencyCode: "USD", - }, + } else { + newStorageItems = [ + ...storageItems, + { + variantId: variant.id, + productId: product.id, + quantity: 1, }, - }; - }); + ]; + } + + sessionStorage.setItem(CART_STORAGE_KEY, JSON.stringify(newStorageItems)); + const calculatedCart = await calculateCartTotals(newStorageItems); + setCart(calculatedCart); }; - const removeCartItem = (variantId: string) => { - setCart((prevCart) => { - const newLines = prevCart.lines.filter( - (item) => item.merchandise.id !== variantId - ); + const removeCartItem = async (variantId: string) => { + const savedCart = sessionStorage.getItem(CART_STORAGE_KEY); + if (!savedCart) return; - const totalQuantity = newLines.reduce( - (sum, item) => sum + item.quantity, - 0 - ); + const storageItems: StorageCartItem[] = JSON.parse(savedCart); + const newStorageItems = storageItems.filter( + (item) => item.variantId !== variantId + ); - const subtotalAmount = newLines - .reduce( - (sum, item) => - sum + parseFloat(item.merchandise.price.amount) * item.quantity, - 0 - ) - .toFixed(2); - - const taxAmount = (parseFloat(subtotalAmount) * 0.1).toFixed(2); - const totalAmount = ( - parseFloat(subtotalAmount) + parseFloat(taxAmount) - ).toFixed(2); - - return { - lines: newLines, - totalQuantity, - cost: { - subtotalAmount: { - amount: subtotalAmount, - currencyCode: "USD", - }, - totalAmount: { - amount: totalAmount, - currencyCode: "USD", - }, - totalTaxAmount: { - amount: taxAmount, - currencyCode: "USD", - }, - }, - }; - }); + sessionStorage.setItem(CART_STORAGE_KEY, JSON.stringify(newStorageItems)); + const calculatedCart = await calculateCartTotals(newStorageItems); + setCart(calculatedCart); }; - const updateCartItem = (variantId: string, quantity: number) => { - setCart((prevCart) => { - const newLines = prevCart.lines.map((item) => - item.merchandise.id === variantId ? { ...item, quantity } : item - ); + const updateCartItem = async (variantId: string, quantity: number) => { + const savedCart = sessionStorage.getItem(CART_STORAGE_KEY); + if (!savedCart) return; - const totalQuantity = newLines.reduce( - (sum, item) => sum + item.quantity, - 0 - ); + const storageItems: StorageCartItem[] = JSON.parse(savedCart); + const newStorageItems = + quantity > 0 + ? storageItems.map((item) => + item.variantId === variantId ? { ...item, quantity } : item + ) + : storageItems.filter((item) => item.variantId !== variantId); - const subtotalAmount = newLines - .reduce( - (sum, item) => - sum + parseFloat(item.merchandise.price.amount) * item.quantity, - 0 - ) - .toFixed(2); - - const taxAmount = (parseFloat(subtotalAmount) * 0.1).toFixed(2); - const totalAmount = ( - parseFloat(subtotalAmount) + parseFloat(taxAmount) - ).toFixed(2); - - return { - lines: newLines, - totalQuantity, - cost: { - subtotalAmount: { - amount: subtotalAmount, - currencyCode: "USD", - }, - totalAmount: { - amount: totalAmount, - currencyCode: "USD", - }, - totalTaxAmount: { - amount: taxAmount, - currencyCode: "USD", - }, - }, - }; - }); + sessionStorage.setItem(CART_STORAGE_KEY, JSON.stringify(newStorageItems)); + const calculatedCart = await calculateCartTotals(newStorageItems); + setCart(calculatedCart); }; return ( diff --git a/components/cart/modal.tsx b/components/cart/modal.tsx index b7bb80c07..d11db0ec0 100644 --- a/components/cart/modal.tsx +++ b/components/cart/modal.tsx @@ -1,310 +1,270 @@ "use client"; +import { getImageUrl } from "@/lib/utils/image"; import { Dialog, Transition } from "@headlessui/react"; import { ShoppingCartIcon, XMarkIcon } from "@heroicons/react/24/outline"; +import clsx from "clsx"; +import LoadingDots from "components/loading-dots"; import Price from "components/price"; import { DEFAULT_OPTION } from "lib/constants"; import { createUrl } from "lib/utils"; -import { getImageUrl } from "lib/utils/image"; import Image from "next/image"; import Link from "next/link"; -import { Fragment, useEffect, useRef } from "react"; +import { Fragment, useEffect, useRef, useState } from "react"; +import { useFormStatus } from "react-dom"; +import { createCartAndSetCookie, redirectToCheckout } from "./actions"; import { useCart } from "./cart-context"; +import { DeleteItemButton } from "./delete-item-button"; import { EditItemQuantityButton } from "./edit-item-quantity-button"; +import OpenCart from "./open-cart"; type MerchandiseSearchParams = { [key: string]: string; }; export default function CartModal() { - const { cart, updateCartItem, removeCartItem } = useCart(); - const quantityRef = useRef(cart.totalQuantity); - const openCart = () => {}; - const closeCart = () => {}; + const { cart, updateCartItem } = useCart(); + const [isOpen, setIsOpen] = useState(false); + const quantityRef = useRef(cart?.totalQuantity); + const openCart = () => setIsOpen(true); + const closeCart = () => setIsOpen(false); useEffect(() => { - // Open cart modal when quantity changes. - if (cart.totalQuantity !== quantityRef.current) { - // But only if it's not already open. - openCart(); + if (!cart) { + createCartAndSetCookie(); } - quantityRef.current = cart.totalQuantity; - }, [cart.totalQuantity, openCart]); + }, [cart]); + + useEffect(() => { + if ( + cart?.totalQuantity && + cart?.totalQuantity !== quantityRef.current && + cart?.totalQuantity > 0 + ) { + if (!isOpen) { + setIsOpen(true); + } + quantityRef.current = cart?.totalQuantity; + } + }, [isOpen, cart?.totalQuantity, quantityRef]); return ( <> - - + -
+
-
+ ); } + +function CloseCart({ className }: { className?: string }) { + return ( +
+ +
+ ); +} + +function CheckoutButton() { + const { pending } = useFormStatus(); + + return ( + + ); +} diff --git a/components/layout/navbar/index.tsx b/components/layout/navbar/index.tsx index c31ee77ca..f6974ca41 100644 --- a/components/layout/navbar/index.tsx +++ b/components/layout/navbar/index.tsx @@ -1,32 +1,42 @@ -import Link from "next/link"; - -import LogoSquare from "@/components/logo-square"; import { getMenu } from "@/lib/store/menu"; +import CartModal from "components/cart/modal"; +import LogoSquare from "components/logo-square"; +import Link from "next/link"; +import { Suspense } from "react"; import MobileMenu from "./mobile-menu"; -import Search from "./search"; +import Search, { SearchSkeleton } from "./search"; -export default async function Navbar() { +const { SITE_NAME } = process.env; + +export async function Navbar() { const menu = await getMenu("navbar"); return ( ); } diff --git a/components/price.tsx b/components/price.tsx index e7090148d..a4b7b557a 100644 --- a/components/price.tsx +++ b/components/price.tsx @@ -1,23 +1,20 @@ -import clsx from 'clsx'; - const Price = ({ amount, className, - currencyCode = 'USD', - currencyCodeClassName + currencyCode = "ISK", + currencyCodeClassName, }: { amount: string; className?: string; currencyCode: string; currencyCodeClassName?: string; -} & React.ComponentProps<'p'>) => ( +} & React.ComponentProps<"p">) => (

{`${new Intl.NumberFormat(undefined, { - style: 'currency', + style: "currency", currency: currencyCode, - currencyDisplay: 'narrowSymbol' + currencyDisplay: "narrowSymbol", }).format(parseFloat(amount))}`} - {`${currencyCode}`}

); diff --git a/components/product/product-description.tsx b/components/product/product-description.tsx index 805396e3c..a6f0e6b7f 100644 --- a/components/product/product-description.tsx +++ b/components/product/product-description.tsx @@ -1,10 +1,21 @@ +"use client"; + import { AddToCart } from "components/cart/add-to-cart"; import Price from "components/price"; import Prose from "components/prose"; -import { Product } from "lib/store/types"; +import { Product, ProductVariant } from "lib/store/types"; +import { useProduct } from "./product-context"; import { VariantSelector } from "./variant-selector"; export function ProductDescription({ product }: { product: Product }) { + const { updateOption } = useProduct(); + + const handleVariantChange = (variant: ProductVariant) => { + variant.selectedOptions.forEach(({ name, value }) => { + updateOption(name, value); + }); + }; + return ( <>
@@ -20,6 +31,7 @@ export function ProductDescription({ product }: { product: Product }) { options={product.options} variants={product.variants} selectedVariant={product.variants[0]!} + onVariantChange={handleVariantChange} /> {product.descriptionHtml ? ( | null; +} + +interface RapydResponse { + statusCode: number; + headers: IncomingHttpHeaders; + body: Record; +} + +const BASE_URL = process.env.RAPYD_BASE_URL; +const secretKey = process.env.RAPYD_SECRET_KEY ?? ""; +const accessKey = process.env.RAPYD_ACCESS_KEY ?? ""; + +if (!BASE_URL || !secretKey || !accessKey) { + throw new Error( + "RAPYD_BASE_URL, RAPYD_SECRET_KEY, and RAPYD_ACCESS_KEY must be set" + ); +} + +const log = false; + +const makeRequest = async ({ + method, + urlPath, + body = null, +}: RapydRequestOptions): Promise => { + try { + const httpMethod = method.toLowerCase(); + const httpBaseURL = BASE_URL.replace(/^https?:\/\//, "").replace( + /\/+$/, + "" + ); + const httpURLPath = urlPath.startsWith("/") ? urlPath : `/${urlPath}`; + const salt = generateRandomString(8); + const idempotency = new Date().getTime().toString(); + const timestamp = Math.round(new Date().getTime() / 1000); + const signature = sign({ + method: httpMethod, + urlPath: httpURLPath, + salt, + timestamp, + body, + }); + + const options = { + hostname: httpBaseURL, + port: 443, + path: httpURLPath, + method: httpMethod, + headers: { + "Content-Type": "application/json", + salt, + timestamp, + signature, + access_key: accessKey, + idempotency, + }, + }; + + return await httpRequest(options, body); + } catch (error) { + console.error("Error generating request options:", error); + throw error; + } +}; + +interface SignOptions { + method: string; + urlPath: string; + salt: string; + timestamp: number; + body: Record | null; +} + +const sign = ({ + method, + urlPath, + salt, + timestamp, + body, +}: SignOptions): string => { + try { + let bodyString = ""; + if (body) { + bodyString = JSON.stringify(body); + bodyString = bodyString === "{}" ? "" : bodyString; + } + + const toSign = + method.toLowerCase() + + urlPath + + salt + + timestamp + + accessKey + + secretKey + + bodyString; + log && console.log(`toSign: ${toSign}`); + + const hash = createHmac("sha256", secretKey); + hash.update(toSign); + const signature = Buffer.from(hash.digest("hex")).toString("base64"); + log && console.log(`signature: ${signature}`); + + return signature; + } catch (error) { + console.error("Error generating signature:", error); + throw error; + } +}; + +const generateRandomString = (size: number): string => { + try { + return randomBytes(size).toString("hex"); + } catch (error) { + console.error("Error generating salt:", error); + throw error; + } +}; + +interface HttpRequestOptions { + hostname: string; + port: number; + path: string; + method: string; + headers: Record; +} + +const httpRequest = async ( + options: HttpRequestOptions, + body: Record | null +): Promise => { + return new Promise((resolve, reject) => { + try { + const bodyString = body ? JSON.stringify(body) : ""; + + log && console.log(`httpRequest options: ${JSON.stringify(options)}`); + + const req = https.request(options, (res) => { + let responseData = ""; + const response: Omit & { body: string } = { + statusCode: res.statusCode ?? 500, + headers: res.headers, + body: "", + }; + + res.on("data", (data: Buffer) => { + responseData += data.toString(); + }); + + res.on("end", () => { + try { + const parsedBody = responseData ? JSON.parse(responseData) : {}; + const fullResponse: RapydResponse = { + ...response, + body: parsedBody, + }; + + log && + console.log( + `httpRequest response: ${JSON.stringify(fullResponse)}` + ); + + if (fullResponse.statusCode !== 200) { + return reject(fullResponse); + } + + return resolve(fullResponse); + } catch (error) { + reject(new Error("Failed to parse response body")); + } + }); + }); + + req.on("error", (error: Error) => { + reject(error); + }); + + req.write(bodyString); + req.end(); + } catch (error) { + reject(error); + } + }); +}; + +export { makeRequest, type RapydRequestOptions, type RapydResponse }; diff --git a/lib/rapyd/utilities.ts b/lib/rapyd/utilities.ts index c7ffd2846..14371a184 100644 --- a/lib/rapyd/utilities.ts +++ b/lib/rapyd/utilities.ts @@ -133,6 +133,7 @@ const makeRequest = async ({ requestConfig.body = stringifiedBody; } + console.log("requestConfig", requestConfig); const response = await fetch(url, requestConfig); if (!response.ok) { diff --git a/lib/store/products.ts b/lib/store/products.ts index 01412a89f..8604a6a5a 100644 --- a/lib/store/products.ts +++ b/lib/store/products.ts @@ -90,6 +90,14 @@ export const getProduct = ({ return Promise.resolve(products.find((p) => p.handle === handle)); }; +export const getProductById = ({ + id, +}: { + id: string; +}): Promise => { + return Promise.resolve(products.find((p) => p.id === id)); +}; + export const getProducts = ({ query, reverse, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dc97d5b45..1ea1d106a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,24 +1,23 @@ -lockfileVersion: '9.0' +lockfileVersion: "9.0" settings: autoInstallPeers: true excludeLinksFromLockfile: false overrides: - '@types/react': 19.0.10 - '@types/react-dom': 19.0.4 + "@types/react": 19.0.10 + "@types/react-dom": 19.0.4 importers: - .: dependencies: - '@headlessui/react': + "@headlessui/react": specifier: ^2.2.0 version: 2.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@heroicons/react': + "@heroicons/react": specifier: ^2.2.0 version: 2.2.0(react@19.0.0) - '@radix-ui/react-slot': + "@radix-ui/react-slot": specifier: ^1.1.2 version: 1.1.2(@types/react@19.0.10)(react@19.0.0) class-variance-authority: @@ -55,22 +54,22 @@ importers: specifier: ^3.24.2 version: 3.24.2 devDependencies: - '@tailwindcss/container-queries': + "@tailwindcss/container-queries": specifier: ^0.1.1 version: 0.1.1(tailwindcss@4.0.8) - '@tailwindcss/postcss': + "@tailwindcss/postcss": specifier: ^4.0.8 version: 4.0.8 - '@tailwindcss/typography': + "@tailwindcss/typography": specifier: ^0.5.16 version: 0.5.16(tailwindcss@4.0.8) - '@types/node': + "@types/node": specifier: 22.13.4 version: 22.13.4 - '@types/react': + "@types/react": specifier: 19.0.10 version: 19.0.10 - '@types/react-dom': + "@types/react-dom": specifier: 19.0.4 version: 19.0.4(@types/react@19.0.10) postcss: @@ -90,532 +89,840 @@ importers: version: 5.7.3 packages: + "@alloc/quick-lru@5.2.0": + resolution: + { + integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==, + } + engines: { node: ">=10" } - '@alloc/quick-lru@5.2.0': - resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} - engines: {node: '>=10'} + "@emnapi/runtime@1.3.1": + resolution: + { + integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==, + } - '@emnapi/runtime@1.3.1': - resolution: {integrity: sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==} + "@floating-ui/core@1.6.9": + resolution: + { + integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==, + } - '@floating-ui/core@1.6.9': - resolution: {integrity: sha512-uMXCuQ3BItDUbAMhIXw7UPXRfAlOAvZzdK9BWpE60MCn+Svt3aLn9jsPTi/WNGlRUu2uI0v5S7JiIUsbsvh3fw==} + "@floating-ui/dom@1.6.13": + resolution: + { + integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==, + } - '@floating-ui/dom@1.6.13': - resolution: {integrity: sha512-umqzocjDgNRGTuO7Q8CU32dkHkECqI8ZdMZ5Swb6QAM0t5rnlrN3lGo1hdpscRd3WS8T6DKYK4ephgIH9iRh3w==} - - '@floating-ui/react-dom@2.1.2': - resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} + "@floating-ui/react-dom@2.1.2": + resolution: + { + integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==, + } peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + react: ">=16.8.0" + react-dom: ">=16.8.0" - '@floating-ui/react@0.26.28': - resolution: {integrity: sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==} + "@floating-ui/react@0.26.28": + resolution: + { + integrity: sha512-yORQuuAtVpiRjpMhdc0wJj06b9JFjrYF4qp96j++v2NBpbi6SEGF7donUJ3TMieerQ6qVkAv1tgr7L4r5roTqw==, + } peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' + react: ">=16.8.0" + react-dom: ">=16.8.0" - '@floating-ui/utils@0.2.9': - resolution: {integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==} + "@floating-ui/utils@0.2.9": + resolution: + { + integrity: sha512-MDWhGtE+eHw5JW7lq4qhc5yRLS11ERl1c7Z6Xd0a58DozHES6EnNNwUWbMiG4J9Cgj053Bhk8zvlhFYKVhULwg==, + } - '@headlessui/react@2.2.0': - resolution: {integrity: sha512-RzCEg+LXsuI7mHiSomsu/gBJSjpupm6A1qIZ5sWjd7JhARNlMiSA4kKfJpCKwU9tE+zMRterhhrP74PvfJrpXQ==} - engines: {node: '>=10'} + "@headlessui/react@2.2.0": + resolution: + { + integrity: sha512-RzCEg+LXsuI7mHiSomsu/gBJSjpupm6A1qIZ5sWjd7JhARNlMiSA4kKfJpCKwU9tE+zMRterhhrP74PvfJrpXQ==, + } + engines: { node: ">=10" } peerDependencies: react: ^18 || ^19 || ^19.0.0-rc react-dom: ^18 || ^19 || ^19.0.0-rc - '@heroicons/react@2.2.0': - resolution: {integrity: sha512-LMcepvRaS9LYHJGsF0zzmgKCUim/X3N/DQKc4jepAXJ7l8QxJ1PmxJzqplF2Z3FE4PqBAIGyJAQ/w4B5dsqbtQ==} + "@heroicons/react@2.2.0": + resolution: + { + integrity: sha512-LMcepvRaS9LYHJGsF0zzmgKCUim/X3N/DQKc4jepAXJ7l8QxJ1PmxJzqplF2Z3FE4PqBAIGyJAQ/w4B5dsqbtQ==, + } peerDependencies: - react: '>= 16 || ^19.0.0-rc' + react: ">= 16 || ^19.0.0-rc" - '@img/sharp-darwin-arm64@0.33.5': - resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + "@img/sharp-darwin-arm64@0.33.5": + resolution: + { + integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [arm64] os: [darwin] - '@img/sharp-darwin-x64@0.33.5': - resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + "@img/sharp-darwin-x64@0.33.5": + resolution: + { + integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [x64] os: [darwin] - '@img/sharp-libvips-darwin-arm64@1.0.4': - resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} + "@img/sharp-libvips-darwin-arm64@1.0.4": + resolution: + { + integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==, + } cpu: [arm64] os: [darwin] - '@img/sharp-libvips-darwin-x64@1.0.4': - resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} + "@img/sharp-libvips-darwin-x64@1.0.4": + resolution: + { + integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==, + } cpu: [x64] os: [darwin] - '@img/sharp-libvips-linux-arm64@1.0.4': - resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} + "@img/sharp-libvips-linux-arm64@1.0.4": + resolution: + { + integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==, + } cpu: [arm64] os: [linux] - '@img/sharp-libvips-linux-arm@1.0.5': - resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} + "@img/sharp-libvips-linux-arm@1.0.5": + resolution: + { + integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==, + } cpu: [arm] os: [linux] - '@img/sharp-libvips-linux-s390x@1.0.4': - resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} + "@img/sharp-libvips-linux-s390x@1.0.4": + resolution: + { + integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==, + } cpu: [s390x] os: [linux] - '@img/sharp-libvips-linux-x64@1.0.4': - resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} + "@img/sharp-libvips-linux-x64@1.0.4": + resolution: + { + integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==, + } cpu: [x64] os: [linux] - '@img/sharp-libvips-linuxmusl-arm64@1.0.4': - resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} + "@img/sharp-libvips-linuxmusl-arm64@1.0.4": + resolution: + { + integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==, + } cpu: [arm64] os: [linux] - '@img/sharp-libvips-linuxmusl-x64@1.0.4': - resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} + "@img/sharp-libvips-linuxmusl-x64@1.0.4": + resolution: + { + integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==, + } cpu: [x64] os: [linux] - '@img/sharp-linux-arm64@0.33.5': - resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + "@img/sharp-linux-arm64@0.33.5": + resolution: + { + integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [arm64] os: [linux] - '@img/sharp-linux-arm@0.33.5': - resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + "@img/sharp-linux-arm@0.33.5": + resolution: + { + integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [arm] os: [linux] - '@img/sharp-linux-s390x@0.33.5': - resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + "@img/sharp-linux-s390x@0.33.5": + resolution: + { + integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [s390x] os: [linux] - '@img/sharp-linux-x64@0.33.5': - resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + "@img/sharp-linux-x64@0.33.5": + resolution: + { + integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [x64] os: [linux] - '@img/sharp-linuxmusl-arm64@0.33.5': - resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + "@img/sharp-linuxmusl-arm64@0.33.5": + resolution: + { + integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [arm64] os: [linux] - '@img/sharp-linuxmusl-x64@0.33.5': - resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + "@img/sharp-linuxmusl-x64@0.33.5": + resolution: + { + integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [x64] os: [linux] - '@img/sharp-wasm32@0.33.5': - resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + "@img/sharp-wasm32@0.33.5": + resolution: + { + integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [wasm32] - '@img/sharp-win32-ia32@0.33.5': - resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + "@img/sharp-win32-ia32@0.33.5": + resolution: + { + integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [ia32] os: [win32] - '@img/sharp-win32-x64@0.33.5': - resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + "@img/sharp-win32-x64@0.33.5": + resolution: + { + integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } cpu: [x64] os: [win32] - '@next/env@15.3.0-canary.9': - resolution: {integrity: sha512-kvABHn6GmJbyf02wozUzrC4evHdVSmc6FYV8I7Q4g3qZW1x64v6ppi3Hw1KEUzKieC1Car/maGT+r3oRalCg4Q==} + "@next/env@15.3.0-canary.9": + resolution: + { + integrity: sha512-kvABHn6GmJbyf02wozUzrC4evHdVSmc6FYV8I7Q4g3qZW1x64v6ppi3Hw1KEUzKieC1Car/maGT+r3oRalCg4Q==, + } - '@next/swc-darwin-arm64@15.3.0-canary.9': - resolution: {integrity: sha512-llJnHJGXQGux7sHJ4t0q5HbMnID+M3+s5ghvYBw79uP4QDkH5XVXRC2oQUwTvEPzHXUhWpB/kf6KUpWmOEI8xQ==} - engines: {node: '>= 10'} + "@next/swc-darwin-arm64@15.3.0-canary.9": + resolution: + { + integrity: sha512-llJnHJGXQGux7sHJ4t0q5HbMnID+M3+s5ghvYBw79uP4QDkH5XVXRC2oQUwTvEPzHXUhWpB/kf6KUpWmOEI8xQ==, + } + engines: { node: ">= 10" } cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.3.0-canary.9': - resolution: {integrity: sha512-igGqAeBB/3tJ4XLqbdcuzbgwgdNh9kRp2AFSME/Ok4jyetSPmcQFX43+C6piuMj2gQ06Q6gDWj3qib0MNf5IWw==} - engines: {node: '>= 10'} + "@next/swc-darwin-x64@15.3.0-canary.9": + resolution: + { + integrity: sha512-igGqAeBB/3tJ4XLqbdcuzbgwgdNh9kRp2AFSME/Ok4jyetSPmcQFX43+C6piuMj2gQ06Q6gDWj3qib0MNf5IWw==, + } + engines: { node: ">= 10" } cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.3.0-canary.9': - resolution: {integrity: sha512-Ym9FxqbBmQyUjoe2bW7MsDkrYV3sSR8WXCEqJQthETjAqSsG6zwUfL86dMAKe2RUetqlNzWlXDH/+FM9fdPVOw==} - engines: {node: '>= 10'} + "@next/swc-linux-arm64-gnu@15.3.0-canary.9": + resolution: + { + integrity: sha512-Ym9FxqbBmQyUjoe2bW7MsDkrYV3sSR8WXCEqJQthETjAqSsG6zwUfL86dMAKe2RUetqlNzWlXDH/+FM9fdPVOw==, + } + engines: { node: ">= 10" } cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@15.3.0-canary.9': - resolution: {integrity: sha512-aB9umTo1HHcQWRTXffWSrt6wTMvhg+fYbtZ8PR7h28gBrQaYL6Lu8Kg7BQynYEx8Ze42GqVcS0MlwVsTQrpwMw==} - engines: {node: '>= 10'} + "@next/swc-linux-arm64-musl@15.3.0-canary.9": + resolution: + { + integrity: sha512-aB9umTo1HHcQWRTXffWSrt6wTMvhg+fYbtZ8PR7h28gBrQaYL6Lu8Kg7BQynYEx8Ze42GqVcS0MlwVsTQrpwMw==, + } + engines: { node: ">= 10" } cpu: [arm64] os: [linux] - '@next/swc-linux-x64-gnu@15.3.0-canary.9': - resolution: {integrity: sha512-d+tU/H5SaPAuHcxGJ9fiqt0qzXpkOmksu1lF9JQNHd6WKtBnnJMzpYL8onLLYXThrIPaETVSLpBiv1wvwIgwFg==} - engines: {node: '>= 10'} + "@next/swc-linux-x64-gnu@15.3.0-canary.9": + resolution: + { + integrity: sha512-d+tU/H5SaPAuHcxGJ9fiqt0qzXpkOmksu1lF9JQNHd6WKtBnnJMzpYL8onLLYXThrIPaETVSLpBiv1wvwIgwFg==, + } + engines: { node: ">= 10" } cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@15.3.0-canary.9': - resolution: {integrity: sha512-b+V+36WIopplWQI2/xOIqzuRGCRGTDLVe2luhhtjcwewRqUujktGnphHW5zRcEVD9nNwwPCisxC01XLL3geggg==} - engines: {node: '>= 10'} + "@next/swc-linux-x64-musl@15.3.0-canary.9": + resolution: + { + integrity: sha512-b+V+36WIopplWQI2/xOIqzuRGCRGTDLVe2luhhtjcwewRqUujktGnphHW5zRcEVD9nNwwPCisxC01XLL3geggg==, + } + engines: { node: ">= 10" } cpu: [x64] os: [linux] - '@next/swc-win32-arm64-msvc@15.3.0-canary.9': - resolution: {integrity: sha512-6YbKTAP1Z+dnFtEoPQc4NuQ9J3VIN0vc8gHmZHBl5qfBQgF9f4DfBwcTrXMXEKIFVkQN4YMZU83v+2DSzT+7FQ==} - engines: {node: '>= 10'} + "@next/swc-win32-arm64-msvc@15.3.0-canary.9": + resolution: + { + integrity: sha512-6YbKTAP1Z+dnFtEoPQc4NuQ9J3VIN0vc8gHmZHBl5qfBQgF9f4DfBwcTrXMXEKIFVkQN4YMZU83v+2DSzT+7FQ==, + } + engines: { node: ">= 10" } cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.3.0-canary.9': - resolution: {integrity: sha512-Ujf4+i1memQV3Qk0EjY00C4bzumV6jOZze9kCdi4PnpPjzEefTj88CFGR7ACmYgu1qDHOKaZQxR08MALy/yvIw==} - engines: {node: '>= 10'} + "@next/swc-win32-x64-msvc@15.3.0-canary.9": + resolution: + { + integrity: sha512-Ujf4+i1memQV3Qk0EjY00C4bzumV6jOZze9kCdi4PnpPjzEefTj88CFGR7ACmYgu1qDHOKaZQxR08MALy/yvIw==, + } + engines: { node: ">= 10" } cpu: [x64] os: [win32] - '@radix-ui/react-compose-refs@1.1.1': - resolution: {integrity: sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==} + "@radix-ui/react-compose-refs@1.1.1": + resolution: + { + integrity: sha512-Y9VzoRDSJtgFMUCoiZBDVo084VQ5hfpXxVE+NgkdNsjiDBByiImMZKKhxMwCbdHvhlENG6a833CbFkOQvTricw==, + } peerDependencies: - '@types/react': 19.0.10 + "@types/react": 19.0.10 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: - '@types/react': + "@types/react": optional: true - '@radix-ui/react-slot@1.1.2': - resolution: {integrity: sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ==} + "@radix-ui/react-slot@1.1.2": + resolution: + { + integrity: sha512-YAKxaiGsSQJ38VzKH86/BPRC4rh+b1Jpa+JneA5LRE7skmLPNAyeG8kPJj/oo4STLvlrs8vkf/iYyc3A5stYCQ==, + } peerDependencies: - '@types/react': 19.0.10 + "@types/react": 19.0.10 react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: - '@types/react': + "@types/react": optional: true - '@react-aria/focus@3.19.1': - resolution: {integrity: sha512-bix9Bu1Ue7RPcYmjwcjhB14BMu2qzfJ3tMQLqDc9pweJA66nOw8DThy3IfVr8Z7j2PHktOLf9kcbiZpydKHqzg==} + "@react-aria/focus@3.19.1": + resolution: + { + integrity: sha512-bix9Bu1Ue7RPcYmjwcjhB14BMu2qzfJ3tMQLqDc9pweJA66nOw8DThy3IfVr8Z7j2PHktOLf9kcbiZpydKHqzg==, + } peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/interactions@3.23.0': - resolution: {integrity: sha512-0qR1atBIWrb7FzQ+Tmr3s8uH5mQdyRH78n0krYaG8tng9+u1JlSi8DGRSaC9ezKyNB84m7vHT207xnHXGeJ3Fg==} + "@react-aria/interactions@3.23.0": + resolution: + { + integrity: sha512-0qR1atBIWrb7FzQ+Tmr3s8uH5mQdyRH78n0krYaG8tng9+u1JlSi8DGRSaC9ezKyNB84m7vHT207xnHXGeJ3Fg==, + } peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/ssr@3.9.7': - resolution: {integrity: sha512-GQygZaGlmYjmYM+tiNBA5C6acmiDWF52Nqd40bBp0Znk4M4hP+LTmI0lpI1BuKMw45T8RIhrAsICIfKwZvi2Gg==} - engines: {node: '>= 12'} + "@react-aria/ssr@3.9.7": + resolution: + { + integrity: sha512-GQygZaGlmYjmYM+tiNBA5C6acmiDWF52Nqd40bBp0Znk4M4hP+LTmI0lpI1BuKMw45T8RIhrAsICIfKwZvi2Gg==, + } + engines: { node: ">= 12" } peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-aria/utils@3.27.0': - resolution: {integrity: sha512-p681OtApnKOdbeN8ITfnnYqfdHS0z7GE+4l8EXlfLnr70Rp/9xicBO6d2rU+V/B3JujDw2gPWxYKEnEeh0CGCw==} + "@react-aria/utils@3.27.0": + resolution: + { + integrity: sha512-p681OtApnKOdbeN8ITfnnYqfdHS0z7GE+4l8EXlfLnr70Rp/9xicBO6d2rU+V/B3JujDw2gPWxYKEnEeh0CGCw==, + } peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react-dom: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-stately/utils@3.10.5': - resolution: {integrity: sha512-iMQSGcpaecghDIh3mZEpZfoFH3ExBwTtuBEcvZ2XnGzCgQjeYXcMdIUwAfVQLXFTdHUHGF6Gu6/dFrYsCzySBQ==} + "@react-stately/utils@3.10.5": + resolution: + { + integrity: sha512-iMQSGcpaecghDIh3mZEpZfoFH3ExBwTtuBEcvZ2XnGzCgQjeYXcMdIUwAfVQLXFTdHUHGF6Gu6/dFrYsCzySBQ==, + } peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@react-types/shared@3.27.0': - resolution: {integrity: sha512-gvznmLhi6JPEf0bsq7SwRYTHAKKq/wcmKqFez9sRdbED+SPMUmK5omfZ6w3EwUFQHbYUa4zPBYedQ7Knv70RMw==} + "@react-types/shared@3.27.0": + resolution: + { + integrity: sha512-gvznmLhi6JPEf0bsq7SwRYTHAKKq/wcmKqFez9sRdbED+SPMUmK5omfZ6w3EwUFQHbYUa4zPBYedQ7Knv70RMw==, + } peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 - '@swc/counter@0.1.3': - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + "@swc/counter@0.1.3": + resolution: + { + integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==, + } - '@swc/helpers@0.5.15': - resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + "@swc/helpers@0.5.15": + resolution: + { + integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==, + } - '@tailwindcss/container-queries@0.1.1': - resolution: {integrity: sha512-p18dswChx6WnTSaJCSGx6lTmrGzNNvm2FtXmiO6AuA1V4U5REyoqwmT6kgAsIMdjo07QdAfYXHJ4hnMtfHzWgA==} + "@tailwindcss/container-queries@0.1.1": + resolution: + { + integrity: sha512-p18dswChx6WnTSaJCSGx6lTmrGzNNvm2FtXmiO6AuA1V4U5REyoqwmT6kgAsIMdjo07QdAfYXHJ4hnMtfHzWgA==, + } peerDependencies: - tailwindcss: '>=3.2.0' + tailwindcss: ">=3.2.0" - '@tailwindcss/node@4.0.8': - resolution: {integrity: sha512-FKArQpbrbwv08TNT0k7ejYXpF+R8knZFAatNc0acOxbgeqLzwb86r+P3LGOjIeI3Idqe9CVkZrh4GlsJLJKkkw==} + "@tailwindcss/node@4.0.8": + resolution: + { + integrity: sha512-FKArQpbrbwv08TNT0k7ejYXpF+R8knZFAatNc0acOxbgeqLzwb86r+P3LGOjIeI3Idqe9CVkZrh4GlsJLJKkkw==, + } - '@tailwindcss/oxide-android-arm64@4.0.8': - resolution: {integrity: sha512-We7K79+Sm4mwJHk26Yzu/GAj7C7myemm7PeXvpgMxyxO70SSFSL3uCcqFbz9JA5M5UPkrl7N9fkBe/Y0iazqpA==} - engines: {node: '>= 10'} + "@tailwindcss/oxide-android-arm64@4.0.8": + resolution: + { + integrity: sha512-We7K79+Sm4mwJHk26Yzu/GAj7C7myemm7PeXvpgMxyxO70SSFSL3uCcqFbz9JA5M5UPkrl7N9fkBe/Y0iazqpA==, + } + engines: { node: ">= 10" } cpu: [arm64] os: [android] - '@tailwindcss/oxide-darwin-arm64@4.0.8': - resolution: {integrity: sha512-Lv9Isi2EwkCTG1sRHNDi0uRNN1UGFdEThUAGFrydRmQZnraGLMjN8gahzg2FFnOizDl7LB2TykLUuiw833DSNg==} - engines: {node: '>= 10'} + "@tailwindcss/oxide-darwin-arm64@4.0.8": + resolution: + { + integrity: sha512-Lv9Isi2EwkCTG1sRHNDi0uRNN1UGFdEThUAGFrydRmQZnraGLMjN8gahzg2FFnOizDl7LB2TykLUuiw833DSNg==, + } + engines: { node: ">= 10" } cpu: [arm64] os: [darwin] - '@tailwindcss/oxide-darwin-x64@4.0.8': - resolution: {integrity: sha512-fWfywfYIlSWtKoqWTjukTHLWV3ARaBRjXCC2Eo0l6KVpaqGY4c2y8snUjp1xpxUtpqwMvCvFWFaleMoz1Vhzlw==} - engines: {node: '>= 10'} + "@tailwindcss/oxide-darwin-x64@4.0.8": + resolution: + { + integrity: sha512-fWfywfYIlSWtKoqWTjukTHLWV3ARaBRjXCC2Eo0l6KVpaqGY4c2y8snUjp1xpxUtpqwMvCvFWFaleMoz1Vhzlw==, + } + engines: { node: ">= 10" } cpu: [x64] os: [darwin] - '@tailwindcss/oxide-freebsd-x64@4.0.8': - resolution: {integrity: sha512-SO+dyvjJV9G94bnmq2288Ke0BIdvrbSbvtPLaQdqjqHR83v5L2fWADyFO+1oecHo9Owsk8MxcXh1agGVPIKIqw==} - engines: {node: '>= 10'} + "@tailwindcss/oxide-freebsd-x64@4.0.8": + resolution: + { + integrity: sha512-SO+dyvjJV9G94bnmq2288Ke0BIdvrbSbvtPLaQdqjqHR83v5L2fWADyFO+1oecHo9Owsk8MxcXh1agGVPIKIqw==, + } + engines: { node: ">= 10" } cpu: [x64] os: [freebsd] - '@tailwindcss/oxide-linux-arm-gnueabihf@4.0.8': - resolution: {integrity: sha512-ZSHggWiEblQNV69V0qUK5vuAtHP+I+S2eGrKGJ5lPgwgJeAd6GjLsVBN+Mqn2SPVfYM3BOpS9jX/zVg9RWQVDQ==} - engines: {node: '>= 10'} + "@tailwindcss/oxide-linux-arm-gnueabihf@4.0.8": + resolution: + { + integrity: sha512-ZSHggWiEblQNV69V0qUK5vuAtHP+I+S2eGrKGJ5lPgwgJeAd6GjLsVBN+Mqn2SPVfYM3BOpS9jX/zVg9RWQVDQ==, + } + engines: { node: ">= 10" } cpu: [arm] os: [linux] - '@tailwindcss/oxide-linux-arm64-gnu@4.0.8': - resolution: {integrity: sha512-xWpr6M0OZLDNsr7+bQz+3X7zcnDJZJ1N9gtBWCtfhkEtDjjxYEp+Lr5L5nc/yXlL4MyCHnn0uonGVXy3fhxaVA==} - engines: {node: '>= 10'} + "@tailwindcss/oxide-linux-arm64-gnu@4.0.8": + resolution: + { + integrity: sha512-xWpr6M0OZLDNsr7+bQz+3X7zcnDJZJ1N9gtBWCtfhkEtDjjxYEp+Lr5L5nc/yXlL4MyCHnn0uonGVXy3fhxaVA==, + } + engines: { node: ">= 10" } cpu: [arm64] os: [linux] - '@tailwindcss/oxide-linux-arm64-musl@4.0.8': - resolution: {integrity: sha512-5tz2IL7LN58ssGEq7h/staD7pu/izF/KeMWdlJ86WDe2Ah46LF3ET6ZGKTr5eZMrnEA0M9cVFuSPprKRHNgjeg==} - engines: {node: '>= 10'} + "@tailwindcss/oxide-linux-arm64-musl@4.0.8": + resolution: + { + integrity: sha512-5tz2IL7LN58ssGEq7h/staD7pu/izF/KeMWdlJ86WDe2Ah46LF3ET6ZGKTr5eZMrnEA0M9cVFuSPprKRHNgjeg==, + } + engines: { node: ">= 10" } cpu: [arm64] os: [linux] - '@tailwindcss/oxide-linux-x64-gnu@4.0.8': - resolution: {integrity: sha512-KSzMkhyrxAQyY2o194NKVKU9j/c+NFSoMvnHWFaNHKi3P1lb+Vq1UC19tLHrmxSkKapcMMu69D7+G1+FVGNDXQ==} - engines: {node: '>= 10'} + "@tailwindcss/oxide-linux-x64-gnu@4.0.8": + resolution: + { + integrity: sha512-KSzMkhyrxAQyY2o194NKVKU9j/c+NFSoMvnHWFaNHKi3P1lb+Vq1UC19tLHrmxSkKapcMMu69D7+G1+FVGNDXQ==, + } + engines: { node: ">= 10" } cpu: [x64] os: [linux] - '@tailwindcss/oxide-linux-x64-musl@4.0.8': - resolution: {integrity: sha512-yFYKG5UtHTRimjtqxUWXBgI4Tc6NJe3USjRIVdlTczpLRxq/SFwgzGl5JbatCxgSRDPBFwRrNPxq+ukfQFGdrw==} - engines: {node: '>= 10'} + "@tailwindcss/oxide-linux-x64-musl@4.0.8": + resolution: + { + integrity: sha512-yFYKG5UtHTRimjtqxUWXBgI4Tc6NJe3USjRIVdlTczpLRxq/SFwgzGl5JbatCxgSRDPBFwRrNPxq+ukfQFGdrw==, + } + engines: { node: ">= 10" } cpu: [x64] os: [linux] - '@tailwindcss/oxide-win32-arm64-msvc@4.0.8': - resolution: {integrity: sha512-tndGujmCSba85cRCnQzXgpA2jx5gXimyspsUYae5jlPyLRG0RjXbDshFKOheVXU4TLflo7FSG8EHCBJ0EHTKdQ==} - engines: {node: '>= 10'} + "@tailwindcss/oxide-win32-arm64-msvc@4.0.8": + resolution: + { + integrity: sha512-tndGujmCSba85cRCnQzXgpA2jx5gXimyspsUYae5jlPyLRG0RjXbDshFKOheVXU4TLflo7FSG8EHCBJ0EHTKdQ==, + } + engines: { node: ">= 10" } cpu: [arm64] os: [win32] - '@tailwindcss/oxide-win32-x64-msvc@4.0.8': - resolution: {integrity: sha512-T77jroAc0p4EHVVgTUiNeFn6Nj3jtD3IeNId2X+0k+N1XxfNipy81BEkYErpKLiOkNhpNFjPee8/ZVas29b2OQ==} - engines: {node: '>= 10'} + "@tailwindcss/oxide-win32-x64-msvc@4.0.8": + resolution: + { + integrity: sha512-T77jroAc0p4EHVVgTUiNeFn6Nj3jtD3IeNId2X+0k+N1XxfNipy81BEkYErpKLiOkNhpNFjPee8/ZVas29b2OQ==, + } + engines: { node: ">= 10" } cpu: [x64] os: [win32] - '@tailwindcss/oxide@4.0.8': - resolution: {integrity: sha512-KfMcuAu/Iw+DcV1e8twrFyr2yN8/ZDC/odIGta4wuuJOGkrkHZbvJvRNIbQNhGh7erZTYV6Ie0IeD6WC9Y8Hcw==} - engines: {node: '>= 10'} + "@tailwindcss/oxide@4.0.8": + resolution: + { + integrity: sha512-KfMcuAu/Iw+DcV1e8twrFyr2yN8/ZDC/odIGta4wuuJOGkrkHZbvJvRNIbQNhGh7erZTYV6Ie0IeD6WC9Y8Hcw==, + } + engines: { node: ">= 10" } - '@tailwindcss/postcss@4.0.8': - resolution: {integrity: sha512-SUwlrXjn1ycmUbA0o0n3Y0LqlXqxN5R8HR+ti+OBbRS79wl2seDmiypEs3xJCuQXe07ol81s1AmRMitBmPveJA==} + "@tailwindcss/postcss@4.0.8": + resolution: + { + integrity: sha512-SUwlrXjn1ycmUbA0o0n3Y0LqlXqxN5R8HR+ti+OBbRS79wl2seDmiypEs3xJCuQXe07ol81s1AmRMitBmPveJA==, + } - '@tailwindcss/typography@0.5.16': - resolution: {integrity: sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==} + "@tailwindcss/typography@0.5.16": + resolution: + { + integrity: sha512-0wDLwCVF5V3x3b1SGXPCDcdsbDHMBe+lkFzBRaHeLvNi+nrrnZ1lA18u+OTWO8iSWU2GxUOCvlXtDuqftc1oiA==, + } peerDependencies: - tailwindcss: '>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1' + tailwindcss: ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" - '@tanstack/react-virtual@3.13.0': - resolution: {integrity: sha512-CchF0NlLIowiM2GxtsoKBkXA4uqSnY2KvnXo+kyUFD4a4ll6+J0qzoRsUPMwXV/H26lRsxgJIr/YmjYum2oEjg==} + "@tanstack/react-virtual@3.13.0": + resolution: + { + integrity: sha512-CchF0NlLIowiM2GxtsoKBkXA4uqSnY2KvnXo+kyUFD4a4ll6+J0qzoRsUPMwXV/H26lRsxgJIr/YmjYum2oEjg==, + } peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - '@tanstack/virtual-core@3.13.0': - resolution: {integrity: sha512-NBKJP3OIdmZY3COJdWkSonr50FMVIi+aj5ZJ7hI/DTpEKg2RMfo/KvP8A3B/zOSpMgIe52B5E2yn7rryULzA6g==} + "@tanstack/virtual-core@3.13.0": + resolution: + { + integrity: sha512-NBKJP3OIdmZY3COJdWkSonr50FMVIi+aj5ZJ7hI/DTpEKg2RMfo/KvP8A3B/zOSpMgIe52B5E2yn7rryULzA6g==, + } - '@types/node@22.13.4': - resolution: {integrity: sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==} + "@types/node@22.13.4": + resolution: + { + integrity: sha512-ywP2X0DYtX3y08eFVx5fNIw7/uIv8hYUKgXoK8oayJlLnKcRfEYCxWMVE1XagUdVtCJlZT1AU4LXEABW+L1Peg==, + } - '@types/react-dom@19.0.4': - resolution: {integrity: sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==} + "@types/react-dom@19.0.4": + resolution: + { + integrity: sha512-4fSQ8vWFkg+TGhePfUzVmat3eC14TXYSsiiDSLI0dVLsrm9gZFABjPy/Qu6TKgl1tq1Bu1yDsuQgY3A3DOjCcg==, + } peerDependencies: - '@types/react': 19.0.10 + "@types/react": 19.0.10 - '@types/react@19.0.10': - resolution: {integrity: sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==} + "@types/react@19.0.10": + resolution: + { + integrity: sha512-JuRQ9KXLEjaUNjTWpzuR231Z2WpIwczOkBEIvbHNCzQefFIT0L8IqE6NV6ULLyC1SI/i234JnDoMkfg+RjQj2g==, + } busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} + resolution: + { + integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==, + } + engines: { node: ">=10.16.0" } caniuse-lite@1.0.30001700: - resolution: {integrity: sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==} + resolution: + { + integrity: sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==, + } class-variance-authority@0.7.1: - resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==} + resolution: + { + integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==, + } client-only@0.0.1: - resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + resolution: + { + integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==, + } clsx@2.1.1: - resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} - engines: {node: '>=6'} + 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'} + resolution: + { + integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==, + } + engines: { node: ">=7.0.0" } color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + resolution: + { + integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, + } color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + resolution: + { + integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwISKNXI3lXpuhEZkzs8p5Eg==, + } color@4.2.3: - resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} - engines: {node: '>=12.5.0'} + resolution: + { + integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==, + } + engines: { node: ">=12.5.0" } cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==, + } + engines: { node: ">=4" } hasBin: true csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + resolution: + { + integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==, + } detect-libc@1.0.3: - resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} - engines: {node: '>=0.10'} + resolution: + { + integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==, + } + engines: { node: ">=0.10" } hasBin: true detect-libc@2.0.3: - resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} - engines: {node: '>=8'} + resolution: + { + integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==, + } + engines: { node: ">=8" } enhanced-resolve@5.18.1: - resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} - engines: {node: '>=10.13.0'} + resolution: + { + integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==, + } + engines: { node: ">=10.13.0" } geist@1.3.1: - resolution: {integrity: sha512-Q4gC1pBVPN+D579pBaz0TRRnGA4p9UK6elDY/xizXdFk/g4EKR5g0I+4p/Kj6gM0SajDBZ/0FvDV9ey9ud7BWw==} + resolution: + { + integrity: sha512-Q4gC1pBVPN+D579pBaz0TRRnGA4p9UK6elDY/xizXdFk/g4EKR5g0I+4p/Kj6gM0SajDBZ/0FvDV9ey9ud7BWw==, + } peerDependencies: - next: '>=13.2.0' + next: ">=13.2.0" graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + resolution: + { + integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, + } is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + resolution: + { + integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==, + } jiti@2.4.2: - resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + resolution: + { + integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==, + } hasBin: true lightningcss-darwin-arm64@1.29.1: - resolution: {integrity: sha512-HtR5XJ5A0lvCqYAoSv2QdZZyoHNttBpa5EP9aNuzBQeKGfbyH5+UipLWvVzpP4Uml5ej4BYs5I9Lco9u1fECqw==} - engines: {node: '>= 12.0.0'} + resolution: + { + integrity: sha512-HtR5XJ5A0lvCqYAoSv2QdZZyoHNttBpa5EP9aNuzBQeKGfbyH5+UipLWvVzpP4Uml5ej4BYs5I9Lco9u1fECqw==, + } + engines: { node: ">= 12.0.0" } cpu: [arm64] os: [darwin] lightningcss-darwin-x64@1.29.1: - resolution: {integrity: sha512-k33G9IzKUpHy/J/3+9MCO4e+PzaFblsgBjSGlpAaFikeBFm8B/CkO3cKU9oI4g+fjS2KlkLM/Bza9K/aw8wsNA==} - engines: {node: '>= 12.0.0'} + resolution: + { + integrity: sha512-k33G9IzKUpHy/J/3+9MCO4e+PzaFblsgBjSGlpAaFikeBFm8B/CkO3cKU9oI4g+fjS2KlkLM/Bza9K/aw8wsNA==, + } + engines: { node: ">= 12.0.0" } cpu: [x64] os: [darwin] lightningcss-freebsd-x64@1.29.1: - resolution: {integrity: sha512-0SUW22fv/8kln2LnIdOCmSuXnxgxVC276W5KLTwoehiO0hxkacBxjHOL5EtHD8BAXg2BvuhsJPmVMasvby3LiQ==} - engines: {node: '>= 12.0.0'} + resolution: + { + integrity: sha512-0SUW22fv/8kln2LnIdOCmSuXnxgxVC276W5KLTwoehiO0hxkacBxjHOL5EtHD8BAXg2BvuhsJPmVMasvby3LiQ==, + } + engines: { node: ">= 12.0.0" } cpu: [x64] os: [freebsd] lightningcss-linux-arm-gnueabihf@1.29.1: - resolution: {integrity: sha512-sD32pFvlR0kDlqsOZmYqH/68SqUMPNj+0pucGxToXZi4XZgZmqeX/NkxNKCPsswAXU3UeYgDSpGhu05eAufjDg==} - engines: {node: '>= 12.0.0'} + resolution: + { + integrity: sha512-sD32pFvlR0kDlqsOZmYqH/68SqUMPNj+0pucGxToXZi4XZgZmqeX/NkxNKCPsswAXU3UeYgDSpGhu05eAufjDg==, + } + engines: { node: ">= 12.0.0" } cpu: [arm] os: [linux] lightningcss-linux-arm64-gnu@1.29.1: - resolution: {integrity: sha512-0+vClRIZ6mmJl/dxGuRsE197o1HDEeeRk6nzycSy2GofC2JsY4ifCRnvUWf/CUBQmlrvMzt6SMQNMSEu22csWQ==} - engines: {node: '>= 12.0.0'} + resolution: + { + integrity: sha512-0+vClRIZ6mmJl/dxGuRsE197o1HDEeeRk6nzycSy2GofC2JsY4ifCRnvUWf/CUBQmlrvMzt6SMQNMSEu22csWQ==, + } + engines: { node: ">= 12.0.0" } cpu: [arm64] os: [linux] lightningcss-linux-arm64-musl@1.29.1: - resolution: {integrity: sha512-UKMFrG4rL/uHNgelBsDwJcBqVpzNJbzsKkbI3Ja5fg00sgQnHw/VrzUTEc4jhZ+AN2BvQYz/tkHu4vt1kLuJyw==} - engines: {node: '>= 12.0.0'} + resolution: + { + integrity: sha512-UKMFrG4rL/uHNgelBsDwJcBqVpzNJbzsKkbI3Ja5fg00sgQnHw/VrzUTEc4jhZ+AN2BvQYz/tkHu4vt1kLuJyw==, + } + engines: { node: ">= 12.0.0" } cpu: [arm64] os: [linux] lightningcss-linux-x64-gnu@1.29.1: - resolution: {integrity: sha512-u1S+xdODy/eEtjADqirA774y3jLcm8RPtYztwReEXoZKdzgsHYPl0s5V52Tst+GKzqjebkULT86XMSxejzfISw==} - engines: {node: '>= 12.0.0'} + resolution: + { + integrity: sha512-u1S+xdODy/eEtjADqirA774y3jLcm8RPtYztwReEXoZKdzgsHYPl0s5V52Tst+GKzqjebkULT86XMSxejzfISw==, + } + engines: { node: ">= 12.0.0" } cpu: [x64] os: [linux] lightningcss-linux-x64-musl@1.29.1: - resolution: {integrity: sha512-L0Tx0DtaNUTzXv0lbGCLB/c/qEADanHbu4QdcNOXLIe1i8i22rZRpbT3gpWYsCh9aSL9zFujY/WmEXIatWvXbw==} - engines: {node: '>= 12.0.0'} + resolution: + { + integrity: sha512-L0Tx0DtaNUTzXv0lbGCLB/c/qEADanHbu4QdcNOXLIe1i8i22rZRpbT3gpWYsCh9aSL9zFujY/WmEXIatWvXbw==, + } + engines: { node: ">= 12.0.0" } cpu: [x64] os: [linux] lightningcss-win32-arm64-msvc@1.29.1: - resolution: {integrity: sha512-QoOVnkIEFfbW4xPi+dpdft/zAKmgLgsRHfJalEPYuJDOWf7cLQzYg0DEh8/sn737FaeMJxHZRc1oBreiwZCjog==} - engines: {node: '>= 12.0.0'} + resolution: + { + integrity: sha512-QoOVnkIEFfbW4xPi+dpdft/zAKmgLgsRHfJalEPYuJDOWf7cLQzYg0DEh8/sn737FaeMJxHZRc1oBreiwZCjog==, + } + engines: { node: ">= 12.0.0" } cpu: [arm64] os: [win32] lightningcss-win32-x64-msvc@1.29.1: - resolution: {integrity: sha512-NygcbThNBe4JElP+olyTI/doBNGJvLs3bFCRPdvuCcxZCcCZ71B858IHpdm7L1btZex0FvCmM17FK98Y9MRy1Q==} - engines: {node: '>= 12.0.0'} + resolution: + { + integrity: sha512-NygcbThNBe4JElP+olyTI/doBNGJvLs3bFCRPdvuCcxZCcCZ71B858IHpdm7L1btZex0FvCmM17FK98Y9MRy1Q==, + } + engines: { node: ">= 12.0.0" } cpu: [x64] os: [win32] lightningcss@1.29.1: - resolution: {integrity: sha512-FmGoeD4S05ewj+AkhTY+D+myDvXI6eL27FjHIjoyUkO/uw7WZD1fBVs0QxeYWa7E17CUHJaYX/RUGISCtcrG4Q==} - engines: {node: '>= 12.0.0'} + resolution: + { + integrity: sha512-FmGoeD4S05ewj+AkhTY+D+myDvXI6eL27FjHIjoyUkO/uw7WZD1fBVs0QxeYWa7E17CUHJaYX/RUGISCtcrG4Q==, + } + engines: { node: ">= 12.0.0" } lodash.castarray@4.4.0: - resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} + resolution: + { + integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==, + } lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + resolution: + { + integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==, + } lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + resolution: + { + integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==, + } lucide-react@0.482.0: - resolution: {integrity: sha512-XM8PzHzSrg8ATmmO+fzf+JyYlVVdQnJjuyLDj2p4V2zEtcKeBNAqAoJIGFv1x2HSBa7kT8gpYUxwdQ0g7nypfw==} + resolution: + { + integrity: sha512-XM8PzHzSrg8ATmmO+fzf+JyYlVVdQnJjuyLDj2p4V2zEtcKeBNAqAoJIGFv1x2HSBa7kT8gpYUxwdQ0g7nypfw==, + } peerDependencies: react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0 nanoid@3.3.8: - resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + resolution: + { + integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==, + } + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } hasBin: true next@15.3.0-canary.9: - resolution: {integrity: sha512-R9+FanTpLPN4cez/lJurj/kedcOERPCQebl/F5kevPSzCQzp8Dj/LCv6L10wTqBH3zBgqepp0eytzsVrjW8VjA==} - engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + resolution: + { + integrity: sha512-R9+FanTpLPN4cez/lJurj/kedcOERPCQebl/F5kevPSzCQzp8Dj/LCv6L10wTqBH3zBgqepp0eytzsVrjW8VjA==, + } + engines: { node: ^18.18.0 || ^19.8.0 || >= 20.0.0 } hasBin: true peerDependencies: - '@opentelemetry/api': ^1.1.0 - '@playwright/test': ^1.41.2 - babel-plugin-react-compiler: '*' + "@opentelemetry/api": ^1.1.0 + "@playwright/test": ^1.41.2 + 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': + "@opentelemetry/api": optional: true - '@playwright/test': + "@playwright/test": optional: true babel-plugin-react-compiler: optional: true @@ -623,51 +930,66 @@ packages: optional: true picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + resolution: + { + integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==, + } postcss-selector-parser@6.0.10: - resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} - engines: {node: '>=4'} + resolution: + { + integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==, + } + engines: { node: ">=4" } postcss@8.4.31: - resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} - engines: {node: ^10 || ^12 || >=14} + resolution: + { + integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==, + } + engines: { node: ^10 || ^12 || >=14 } postcss@8.5.3: - resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} - engines: {node: ^10 || ^12 || >=14} + resolution: + { + integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==, + } + engines: { node: ^10 || ^12 || >=14 } prettier-plugin-tailwindcss@0.6.11: - resolution: {integrity: sha512-YxaYSIvZPAqhrrEpRtonnrXdghZg1irNg4qrjboCXrpybLWVs55cW2N3juhspVJiO0JBvYJT8SYsJpc8OQSnsA==} - engines: {node: '>=14.21.3'} + resolution: + { + integrity: sha512-YxaYSIvZPAqhrrEpRtonnrXdghZg1irNg4qrjboCXrpybLWVs55cW2N3juhspVJiO0JBvYJT8SYsJpc8OQSnsA==, + } + engines: { node: ">=14.21.3" } peerDependencies: - '@ianvs/prettier-plugin-sort-imports': '*' - '@prettier/plugin-pug': '*' - '@shopify/prettier-plugin-liquid': '*' - '@trivago/prettier-plugin-sort-imports': '*' - '@zackad/prettier-plugin-twig': '*' + "@ianvs/prettier-plugin-sort-imports": "*" + "@prettier/plugin-pug": "*" + "@shopify/prettier-plugin-liquid": "*" + "@trivago/prettier-plugin-sort-imports": "*" + "@zackad/prettier-plugin-twig": "*" prettier: ^3.0 - prettier-plugin-astro: '*' - prettier-plugin-css-order: '*' - prettier-plugin-import-sort: '*' - prettier-plugin-jsdoc: '*' - prettier-plugin-marko: '*' - prettier-plugin-multiline-arrays: '*' - prettier-plugin-organize-attributes: '*' - prettier-plugin-organize-imports: '*' - prettier-plugin-sort-imports: '*' - prettier-plugin-style-order: '*' - prettier-plugin-svelte: '*' + prettier-plugin-astro: "*" + prettier-plugin-css-order: "*" + prettier-plugin-import-sort: "*" + prettier-plugin-jsdoc: "*" + prettier-plugin-marko: "*" + prettier-plugin-multiline-arrays: "*" + prettier-plugin-organize-attributes: "*" + prettier-plugin-organize-imports: "*" + prettier-plugin-sort-imports: "*" + prettier-plugin-style-order: "*" + prettier-plugin-svelte: "*" peerDependenciesMeta: - '@ianvs/prettier-plugin-sort-imports': + "@ianvs/prettier-plugin-sort-imports": optional: true - '@prettier/plugin-pug': + "@prettier/plugin-pug": optional: true - '@shopify/prettier-plugin-liquid': + "@shopify/prettier-plugin-liquid": optional: true - '@trivago/prettier-plugin-sort-imports': + "@trivago/prettier-plugin-sort-imports": optional: true - '@zackad/prettier-plugin-twig': + "@zackad/prettier-plugin-twig": optional: true prettier-plugin-astro: optional: true @@ -693,373 +1015,435 @@ packages: optional: true prettier@3.5.1: - resolution: {integrity: sha512-hPpFQvHwL3Qv5AdRvBFMhnKo4tYxp0ReXiPn2bxkiohEX6mBeBwEpBSQTkD458RaaDKQMYSp4hX4UtfUTA5wDw==} - engines: {node: '>=14'} + resolution: + { + integrity: sha512-hPpFQvHwL3Qv5AdRvBFMhnKo4tYxp0ReXiPn2bxkiohEX6mBeBwEpBSQTkD458RaaDKQMYSp4hX4UtfUTA5wDw==, + } + engines: { node: ">=14" } hasBin: true react-dom@19.0.0: - resolution: {integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==} + resolution: + { + integrity: sha512-4GV5sHFG0e/0AD4X+ySy6UJd3jVl1iNsNHdpad0qhABJ11twS3TTBnseqsKurKcsNqCEFeGL3uLpVChpIO3QfQ==, + } peerDependencies: react: ^19.0.0 react@19.0.0: - resolution: {integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-V8AVnmPIICiWpGfm6GLzCR/W5FXLchHop40W4nXBmdlEceh16rCN8O8LNWm5bh5XUX91fh7KpA+W0TgMKmgTpQ==, + } + engines: { node: ">=0.10.0" } scheduler@0.25.0: - resolution: {integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==} + resolution: + { + integrity: sha512-xFVuu11jh+xcO7JOAGJNOXld8/TcEHK/4CituBUeUb5hqxJLj9YuemAEuvm9gQ/+pgXYfbQuqAkiYu+u7YEsNA==, + } semver@7.7.1: - resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} - engines: {node: '>=10'} + resolution: + { + integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==, + } + engines: { node: ">=10" } hasBin: true sharp@0.33.5: - resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} - engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + resolution: + { + integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==, + } + engines: { node: ^18.17.0 || ^20.3.0 || >=21.0.0 } simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + resolution: + { + integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==, + } sonner@2.0.1: - resolution: {integrity: sha512-FRBphaehZ5tLdLcQ8g2WOIRE+Y7BCfWi5Zyd8bCvBjiW8TxxAyoWZIxS661Yz6TGPqFQ4VLzOF89WEYhfynSFQ==} + resolution: + { + integrity: sha512-FRBphaehZ5tLdLcQ8g2WOIRE+Y7BCfWi5Zyd8bCvBjiW8TxxAyoWZIxS661Yz6TGPqFQ4VLzOF89WEYhfynSFQ==, + } peerDependencies: react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-rc source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} + resolution: + { + integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+ISKybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==, + } + engines: { node: ">=0.10.0" } streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} + resolution: + { + integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==, + } + engines: { node: ">=10.0.0" } styled-jsx@5.1.6: - resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==} - engines: {node: '>= 12.0.0'} + 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' + "@babel/core": "*" + babel-plugin-macros: "*" + react: ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" peerDependenciesMeta: - '@babel/core': + "@babel/core": optional: true babel-plugin-macros: optional: true tabbable@6.2.0: - resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} + resolution: + { + integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==, + } tailwind-merge@3.0.2: - resolution: {integrity: sha512-l7z+OYZ7mu3DTqrL88RiKrKIqO3NcpEO8V/Od04bNpvk0kiIFndGEoqfuzvj4yuhRkHKjRkII2z+KS2HfPcSxw==} + resolution: + { + integrity: sha512-l7z+OYZ7mu3DTqrL88RiKrKIqO3NcpEO8V/Od04bNpvk0kiIFndGEoqfuzvj4yuhRkHKjRkII2z+KS2HfPcSxw==, + } tailwindcss-animate@1.0.7: - resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} + resolution: + { + integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==, + } peerDependencies: - tailwindcss: '>=3.0.0 || insiders' + tailwindcss: ">=3.0.0 || insiders" tailwindcss@4.0.8: - resolution: {integrity: sha512-Me7N5CKR+D2A1xdWA5t5+kjjT7bwnxZOE6/yDI/ixJdJokszsn2n++mdU5yJwrsTpqFX2B9ZNMBJDwcqk9C9lw==} + resolution: + { + integrity: sha512-Me7N5CKR+D2A1xdWA5t5+kjjT7bwnxZOE6/yDI/ixJdJokszsn2n++mdU5yJwrsTpqFX2B9ZNMBJDwcqk9C9lw==, + } tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} + resolution: + { + integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==, + } + engines: { node: ">=6" } tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + resolution: + { + integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==, + } typescript@5.7.3: - resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} - engines: {node: '>=14.17'} + resolution: + { + integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==, + } + engines: { node: ">=14.17" } hasBin: true undici-types@6.20.0: - resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + resolution: + { + integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==, + } util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + resolution: + { + integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, + } zod@3.24.2: - resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} + resolution: + { + integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==, + } snapshots: + "@alloc/quick-lru@5.2.0": {} - '@alloc/quick-lru@5.2.0': {} - - '@emnapi/runtime@1.3.1': + "@emnapi/runtime@1.3.1": dependencies: tslib: 2.8.1 optional: true - '@floating-ui/core@1.6.9': + "@floating-ui/core@1.6.9": dependencies: - '@floating-ui/utils': 0.2.9 + "@floating-ui/utils": 0.2.9 - '@floating-ui/dom@1.6.13': + "@floating-ui/dom@1.6.13": dependencies: - '@floating-ui/core': 1.6.9 - '@floating-ui/utils': 0.2.9 + "@floating-ui/core": 1.6.9 + "@floating-ui/utils": 0.2.9 - '@floating-ui/react-dom@2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + "@floating-ui/react-dom@2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)": dependencies: - '@floating-ui/dom': 1.6.13 + "@floating-ui/dom": 1.6.13 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@floating-ui/react@0.26.28(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + "@floating-ui/react@0.26.28(react-dom@19.0.0(react@19.0.0))(react@19.0.0)": dependencies: - '@floating-ui/react-dom': 2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@floating-ui/utils': 0.2.9 + "@floating-ui/react-dom": 2.1.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + "@floating-ui/utils": 0.2.9 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) tabbable: 6.2.0 - '@floating-ui/utils@0.2.9': {} + "@floating-ui/utils@0.2.9": {} - '@headlessui/react@2.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + "@headlessui/react@2.2.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)": dependencies: - '@floating-ui/react': 0.26.28(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@react-aria/focus': 3.19.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@react-aria/interactions': 3.23.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@tanstack/react-virtual': 3.13.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + "@floating-ui/react": 0.26.28(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + "@react-aria/focus": 3.19.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + "@react-aria/interactions": 3.23.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + "@tanstack/react-virtual": 3.13.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@heroicons/react@2.2.0(react@19.0.0)': + "@heroicons/react@2.2.0(react@19.0.0)": dependencies: react: 19.0.0 - '@img/sharp-darwin-arm64@0.33.5': + "@img/sharp-darwin-arm64@0.33.5": optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.0.4 + "@img/sharp-libvips-darwin-arm64": 1.0.4 optional: true - '@img/sharp-darwin-x64@0.33.5': + "@img/sharp-darwin-x64@0.33.5": optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.0.4 + "@img/sharp-libvips-darwin-x64": 1.0.4 optional: true - '@img/sharp-libvips-darwin-arm64@1.0.4': + "@img/sharp-libvips-darwin-arm64@1.0.4": optional: true - '@img/sharp-libvips-darwin-x64@1.0.4': + "@img/sharp-libvips-darwin-x64@1.0.4": optional: true - '@img/sharp-libvips-linux-arm64@1.0.4': + "@img/sharp-libvips-linux-arm64@1.0.4": optional: true - '@img/sharp-libvips-linux-arm@1.0.5': + "@img/sharp-libvips-linux-arm@1.0.5": optional: true - '@img/sharp-libvips-linux-s390x@1.0.4': + "@img/sharp-libvips-linux-s390x@1.0.4": optional: true - '@img/sharp-libvips-linux-x64@1.0.4': + "@img/sharp-libvips-linux-x64@1.0.4": optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + "@img/sharp-libvips-linuxmusl-arm64@1.0.4": optional: true - '@img/sharp-libvips-linuxmusl-x64@1.0.4': + "@img/sharp-libvips-linuxmusl-x64@1.0.4": optional: true - '@img/sharp-linux-arm64@0.33.5': + "@img/sharp-linux-arm64@0.33.5": optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.0.4 + "@img/sharp-libvips-linux-arm64": 1.0.4 optional: true - '@img/sharp-linux-arm@0.33.5': + "@img/sharp-linux-arm@0.33.5": optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.0.5 + "@img/sharp-libvips-linux-arm": 1.0.5 optional: true - '@img/sharp-linux-s390x@0.33.5': + "@img/sharp-linux-s390x@0.33.5": optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.0.4 + "@img/sharp-libvips-linux-s390x": 1.0.4 optional: true - '@img/sharp-linux-x64@0.33.5': + "@img/sharp-linux-x64@0.33.5": optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.0.4 + "@img/sharp-libvips-linux-x64": 1.0.4 optional: true - '@img/sharp-linuxmusl-arm64@0.33.5': + "@img/sharp-linuxmusl-arm64@0.33.5": optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + "@img/sharp-libvips-linuxmusl-arm64": 1.0.4 optional: true - '@img/sharp-linuxmusl-x64@0.33.5': + "@img/sharp-linuxmusl-x64@0.33.5": optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + "@img/sharp-libvips-linuxmusl-x64": 1.0.4 optional: true - '@img/sharp-wasm32@0.33.5': + "@img/sharp-wasm32@0.33.5": dependencies: - '@emnapi/runtime': 1.3.1 + "@emnapi/runtime": 1.3.1 optional: true - '@img/sharp-win32-ia32@0.33.5': + "@img/sharp-win32-ia32@0.33.5": optional: true - '@img/sharp-win32-x64@0.33.5': + "@img/sharp-win32-x64@0.33.5": optional: true - '@next/env@15.3.0-canary.9': {} + "@next/env@15.3.0-canary.9": {} - '@next/swc-darwin-arm64@15.3.0-canary.9': + "@next/swc-darwin-arm64@15.3.0-canary.9": optional: true - '@next/swc-darwin-x64@15.3.0-canary.9': + "@next/swc-darwin-x64@15.3.0-canary.9": optional: true - '@next/swc-linux-arm64-gnu@15.3.0-canary.9': + "@next/swc-linux-arm64-gnu@15.3.0-canary.9": optional: true - '@next/swc-linux-arm64-musl@15.3.0-canary.9': + "@next/swc-linux-arm64-musl@15.3.0-canary.9": optional: true - '@next/swc-linux-x64-gnu@15.3.0-canary.9': + "@next/swc-linux-x64-gnu@15.3.0-canary.9": optional: true - '@next/swc-linux-x64-musl@15.3.0-canary.9': + "@next/swc-linux-x64-musl@15.3.0-canary.9": optional: true - '@next/swc-win32-arm64-msvc@15.3.0-canary.9': + "@next/swc-win32-arm64-msvc@15.3.0-canary.9": optional: true - '@next/swc-win32-x64-msvc@15.3.0-canary.9': + "@next/swc-win32-x64-msvc@15.3.0-canary.9": optional: true - '@radix-ui/react-compose-refs@1.1.1(@types/react@19.0.10)(react@19.0.0)': + "@radix-ui/react-compose-refs@1.1.1(@types/react@19.0.10)(react@19.0.0)": dependencies: react: 19.0.0 optionalDependencies: - '@types/react': 19.0.10 + "@types/react": 19.0.10 - '@radix-ui/react-slot@1.1.2(@types/react@19.0.10)(react@19.0.0)': + "@radix-ui/react-slot@1.1.2(@types/react@19.0.10)(react@19.0.0)": dependencies: - '@radix-ui/react-compose-refs': 1.1.1(@types/react@19.0.10)(react@19.0.0) + "@radix-ui/react-compose-refs": 1.1.1(@types/react@19.0.10)(react@19.0.0) react: 19.0.0 optionalDependencies: - '@types/react': 19.0.10 + "@types/react": 19.0.10 - '@react-aria/focus@3.19.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + "@react-aria/focus@3.19.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)": dependencies: - '@react-aria/interactions': 3.23.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@react-aria/utils': 3.27.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@react-types/shared': 3.27.0(react@19.0.0) - '@swc/helpers': 0.5.15 + "@react-aria/interactions": 3.23.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + "@react-aria/utils": 3.27.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + "@react-types/shared": 3.27.0(react@19.0.0) + "@swc/helpers": 0.5.15 clsx: 2.1.1 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@react-aria/interactions@3.23.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + "@react-aria/interactions@3.23.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)": dependencies: - '@react-aria/ssr': 3.9.7(react@19.0.0) - '@react-aria/utils': 3.27.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) - '@react-types/shared': 3.27.0(react@19.0.0) - '@swc/helpers': 0.5.15 + "@react-aria/ssr": 3.9.7(react@19.0.0) + "@react-aria/utils": 3.27.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0) + "@react-types/shared": 3.27.0(react@19.0.0) + "@swc/helpers": 0.5.15 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@react-aria/ssr@3.9.7(react@19.0.0)': + "@react-aria/ssr@3.9.7(react@19.0.0)": dependencies: - '@swc/helpers': 0.5.15 + "@swc/helpers": 0.5.15 react: 19.0.0 - '@react-aria/utils@3.27.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + "@react-aria/utils@3.27.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)": dependencies: - '@react-aria/ssr': 3.9.7(react@19.0.0) - '@react-stately/utils': 3.10.5(react@19.0.0) - '@react-types/shared': 3.27.0(react@19.0.0) - '@swc/helpers': 0.5.15 + "@react-aria/ssr": 3.9.7(react@19.0.0) + "@react-stately/utils": 3.10.5(react@19.0.0) + "@react-types/shared": 3.27.0(react@19.0.0) + "@swc/helpers": 0.5.15 clsx: 2.1.1 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@react-stately/utils@3.10.5(react@19.0.0)': + "@react-stately/utils@3.10.5(react@19.0.0)": dependencies: - '@swc/helpers': 0.5.15 + "@swc/helpers": 0.5.15 react: 19.0.0 - '@react-types/shared@3.27.0(react@19.0.0)': + "@react-types/shared@3.27.0(react@19.0.0)": dependencies: react: 19.0.0 - '@swc/counter@0.1.3': {} + "@swc/counter@0.1.3": {} - '@swc/helpers@0.5.15': + "@swc/helpers@0.5.15": dependencies: tslib: 2.8.1 - '@tailwindcss/container-queries@0.1.1(tailwindcss@4.0.8)': + "@tailwindcss/container-queries@0.1.1(tailwindcss@4.0.8)": dependencies: tailwindcss: 4.0.8 - '@tailwindcss/node@4.0.8': + "@tailwindcss/node@4.0.8": dependencies: enhanced-resolve: 5.18.1 jiti: 2.4.2 tailwindcss: 4.0.8 - '@tailwindcss/oxide-android-arm64@4.0.8': + "@tailwindcss/oxide-android-arm64@4.0.8": optional: true - '@tailwindcss/oxide-darwin-arm64@4.0.8': + "@tailwindcss/oxide-darwin-arm64@4.0.8": optional: true - '@tailwindcss/oxide-darwin-x64@4.0.8': + "@tailwindcss/oxide-darwin-x64@4.0.8": optional: true - '@tailwindcss/oxide-freebsd-x64@4.0.8': + "@tailwindcss/oxide-freebsd-x64@4.0.8": optional: true - '@tailwindcss/oxide-linux-arm-gnueabihf@4.0.8': + "@tailwindcss/oxide-linux-arm-gnueabihf@4.0.8": optional: true - '@tailwindcss/oxide-linux-arm64-gnu@4.0.8': + "@tailwindcss/oxide-linux-arm64-gnu@4.0.8": optional: true - '@tailwindcss/oxide-linux-arm64-musl@4.0.8': + "@tailwindcss/oxide-linux-arm64-musl@4.0.8": optional: true - '@tailwindcss/oxide-linux-x64-gnu@4.0.8': + "@tailwindcss/oxide-linux-x64-gnu@4.0.8": optional: true - '@tailwindcss/oxide-linux-x64-musl@4.0.8': + "@tailwindcss/oxide-linux-x64-musl@4.0.8": optional: true - '@tailwindcss/oxide-win32-arm64-msvc@4.0.8': + "@tailwindcss/oxide-win32-arm64-msvc@4.0.8": optional: true - '@tailwindcss/oxide-win32-x64-msvc@4.0.8': + "@tailwindcss/oxide-win32-x64-msvc@4.0.8": optional: true - '@tailwindcss/oxide@4.0.8': + "@tailwindcss/oxide@4.0.8": optionalDependencies: - '@tailwindcss/oxide-android-arm64': 4.0.8 - '@tailwindcss/oxide-darwin-arm64': 4.0.8 - '@tailwindcss/oxide-darwin-x64': 4.0.8 - '@tailwindcss/oxide-freebsd-x64': 4.0.8 - '@tailwindcss/oxide-linux-arm-gnueabihf': 4.0.8 - '@tailwindcss/oxide-linux-arm64-gnu': 4.0.8 - '@tailwindcss/oxide-linux-arm64-musl': 4.0.8 - '@tailwindcss/oxide-linux-x64-gnu': 4.0.8 - '@tailwindcss/oxide-linux-x64-musl': 4.0.8 - '@tailwindcss/oxide-win32-arm64-msvc': 4.0.8 - '@tailwindcss/oxide-win32-x64-msvc': 4.0.8 + "@tailwindcss/oxide-android-arm64": 4.0.8 + "@tailwindcss/oxide-darwin-arm64": 4.0.8 + "@tailwindcss/oxide-darwin-x64": 4.0.8 + "@tailwindcss/oxide-freebsd-x64": 4.0.8 + "@tailwindcss/oxide-linux-arm-gnueabihf": 4.0.8 + "@tailwindcss/oxide-linux-arm64-gnu": 4.0.8 + "@tailwindcss/oxide-linux-arm64-musl": 4.0.8 + "@tailwindcss/oxide-linux-x64-gnu": 4.0.8 + "@tailwindcss/oxide-linux-x64-musl": 4.0.8 + "@tailwindcss/oxide-win32-arm64-msvc": 4.0.8 + "@tailwindcss/oxide-win32-x64-msvc": 4.0.8 - '@tailwindcss/postcss@4.0.8': + "@tailwindcss/postcss@4.0.8": dependencies: - '@alloc/quick-lru': 5.2.0 - '@tailwindcss/node': 4.0.8 - '@tailwindcss/oxide': 4.0.8 + "@alloc/quick-lru": 5.2.0 + "@tailwindcss/node": 4.0.8 + "@tailwindcss/oxide": 4.0.8 lightningcss: 1.29.1 postcss: 8.5.3 tailwindcss: 4.0.8 - '@tailwindcss/typography@0.5.16(tailwindcss@4.0.8)': + "@tailwindcss/typography@0.5.16(tailwindcss@4.0.8)": dependencies: lodash.castarray: 4.4.0 lodash.isplainobject: 4.0.6 @@ -1067,23 +1451,23 @@ snapshots: postcss-selector-parser: 6.0.10 tailwindcss: 4.0.8 - '@tanstack/react-virtual@3.13.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)': + "@tanstack/react-virtual@3.13.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)": dependencies: - '@tanstack/virtual-core': 3.13.0 + "@tanstack/virtual-core": 3.13.0 react: 19.0.0 react-dom: 19.0.0(react@19.0.0) - '@tanstack/virtual-core@3.13.0': {} + "@tanstack/virtual-core@3.13.0": {} - '@types/node@22.13.4': + "@types/node@22.13.4": dependencies: undici-types: 6.20.0 - '@types/react-dom@19.0.4(@types/react@19.0.10)': + "@types/react-dom@19.0.4(@types/react@19.0.10)": dependencies: - '@types/react': 19.0.10 + "@types/react": 19.0.10 - '@types/react@19.0.10': + "@types/react@19.0.10": dependencies: csstype: 3.1.3 @@ -1205,9 +1589,9 @@ snapshots: next@15.3.0-canary.9(react-dom@19.0.0(react@19.0.0))(react@19.0.0): dependencies: - '@next/env': 15.3.0-canary.9 - '@swc/counter': 0.1.3 - '@swc/helpers': 0.5.15 + "@next/env": 15.3.0-canary.9 + "@swc/counter": 0.1.3 + "@swc/helpers": 0.5.15 busboy: 1.6.0 caniuse-lite: 1.0.30001700 postcss: 8.4.31 @@ -1215,17 +1599,17 @@ snapshots: react-dom: 19.0.0(react@19.0.0) styled-jsx: 5.1.6(react@19.0.0) optionalDependencies: - '@next/swc-darwin-arm64': 15.3.0-canary.9 - '@next/swc-darwin-x64': 15.3.0-canary.9 - '@next/swc-linux-arm64-gnu': 15.3.0-canary.9 - '@next/swc-linux-arm64-musl': 15.3.0-canary.9 - '@next/swc-linux-x64-gnu': 15.3.0-canary.9 - '@next/swc-linux-x64-musl': 15.3.0-canary.9 - '@next/swc-win32-arm64-msvc': 15.3.0-canary.9 - '@next/swc-win32-x64-msvc': 15.3.0-canary.9 + "@next/swc-darwin-arm64": 15.3.0-canary.9 + "@next/swc-darwin-x64": 15.3.0-canary.9 + "@next/swc-linux-arm64-gnu": 15.3.0-canary.9 + "@next/swc-linux-arm64-musl": 15.3.0-canary.9 + "@next/swc-linux-x64-gnu": 15.3.0-canary.9 + "@next/swc-linux-x64-musl": 15.3.0-canary.9 + "@next/swc-win32-arm64-msvc": 15.3.0-canary.9 + "@next/swc-win32-x64-msvc": 15.3.0-canary.9 sharp: 0.33.5 transitivePeerDependencies: - - '@babel/core' + - "@babel/core" - babel-plugin-macros picocolors@1.1.1: {} @@ -1271,25 +1655,25 @@ snapshots: detect-libc: 2.0.3 semver: 7.7.1 optionalDependencies: - '@img/sharp-darwin-arm64': 0.33.5 - '@img/sharp-darwin-x64': 0.33.5 - '@img/sharp-libvips-darwin-arm64': 1.0.4 - '@img/sharp-libvips-darwin-x64': 1.0.4 - '@img/sharp-libvips-linux-arm': 1.0.5 - '@img/sharp-libvips-linux-arm64': 1.0.4 - '@img/sharp-libvips-linux-s390x': 1.0.4 - '@img/sharp-libvips-linux-x64': 1.0.4 - '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 - '@img/sharp-libvips-linuxmusl-x64': 1.0.4 - '@img/sharp-linux-arm': 0.33.5 - '@img/sharp-linux-arm64': 0.33.5 - '@img/sharp-linux-s390x': 0.33.5 - '@img/sharp-linux-x64': 0.33.5 - '@img/sharp-linuxmusl-arm64': 0.33.5 - '@img/sharp-linuxmusl-x64': 0.33.5 - '@img/sharp-wasm32': 0.33.5 - '@img/sharp-win32-ia32': 0.33.5 - '@img/sharp-win32-x64': 0.33.5 + "@img/sharp-darwin-arm64": 0.33.5 + "@img/sharp-darwin-x64": 0.33.5 + "@img/sharp-libvips-darwin-arm64": 1.0.4 + "@img/sharp-libvips-darwin-x64": 1.0.4 + "@img/sharp-libvips-linux-arm": 1.0.5 + "@img/sharp-libvips-linux-arm64": 1.0.4 + "@img/sharp-libvips-linux-s390x": 1.0.4 + "@img/sharp-libvips-linux-x64": 1.0.4 + "@img/sharp-libvips-linuxmusl-arm64": 1.0.4 + "@img/sharp-libvips-linuxmusl-x64": 1.0.4 + "@img/sharp-linux-arm": 0.33.5 + "@img/sharp-linux-arm64": 0.33.5 + "@img/sharp-linux-s390x": 0.33.5 + "@img/sharp-linux-x64": 0.33.5 + "@img/sharp-linuxmusl-arm64": 0.33.5 + "@img/sharp-linuxmusl-x64": 0.33.5 + "@img/sharp-wasm32": 0.33.5 + "@img/sharp-win32-ia32": 0.33.5 + "@img/sharp-win32-x64": 0.33.5 optional: true simple-swizzle@0.2.2: