diff --git a/app/account/layout.tsx b/app/account/layout.tsx deleted file mode 100644 index db15d4d52..000000000 --- a/app/account/layout.tsx +++ /dev/null @@ -1,3 +0,0 @@ -export default function Layout({ children }: { children: React.ReactNode }) { - return
{children}
; -} diff --git a/app/account/loading.tsx b/app/account/loading.tsx index c932332d5..be8eaafe1 100644 --- a/app/account/loading.tsx +++ b/app/account/loading.tsx @@ -1,32 +1,14 @@ -import Divider from 'components/divider'; -import Heading from 'components/ui/heading'; -import Skeleton from 'components/ui/skeleton'; +import OrdersHeader from 'components/orders/orders-header'; -export default function Loading() { +export default function OrdersLoadingPage() { return ( -
- - Orders - -
-
-
-
-
- - -
-
-
- -
-
- - -
- -
- +
+ +
+
+
+
+
diff --git a/app/account/orders/[id]/page.tsx b/app/account/orders/[id]/page.tsx index 634f39754..5088165d6 100644 --- a/app/account/orders/[id]/page.tsx +++ b/app/account/orders/[id]/page.tsx @@ -10,17 +10,10 @@ import Label from 'components/ui/label'; import Text from 'components/ui/text'; import { getCustomerOrder } from 'lib/shopify'; import { Fulfillment, Order } from 'lib/shopify/types'; +import { toPrintDate } from 'lib/utils'; import Image from 'next/image'; import Link from 'next/link'; -function toPrintDate(date: string) { - return new Date(date).toLocaleDateString('en-US', { - year: 'numeric', - month: 'long', - day: 'numeric' - }); -} - function Unfulfilled({ order }: { order: Order }) { // Build a map of line item IDs to quantities fulfilled const fulfilledLineItems = order.fulfillments.reduce>((acc, fulfillment) => { diff --git a/app/account/page.tsx b/app/account/page.tsx index d25dac246..1ec80cc1d 100644 --- a/app/account/page.tsx +++ b/app/account/page.tsx @@ -1,12 +1,10 @@ -import { Button } from 'components/button'; -import Divider from 'components/divider'; +import { InformationCircleIcon } from '@heroicons/react/24/outline'; +import ActivateWarranty from 'components/orders/activate-warranty'; +import MobileOrderActions from 'components/orders/mobile-order-actions'; +import OrdersHeader from 'components/orders/orders-header'; import Price from 'components/price'; -import Badge from 'components/ui/badge'; -import { Card } from 'components/ui/card'; -import Heading from 'components/ui/heading'; -import Label from 'components/ui/label'; -import Text from 'components/ui/text'; import { getCustomerOrders } from 'lib/shopify'; +import { toPrintDate } from 'lib/utils'; import Image from 'next/image'; import Link from 'next/link'; @@ -14,55 +12,99 @@ export default async function AccountPage() { const orders = await getCustomerOrders(); return ( -
- - Orders - -
- {orders.map((order, index) => ( -
- - -
- {order.lineItems.map((lineItem, index) => ( -
-
- - {lineItem?.image?.altText} - - {lineItem.title} +
+ +
+

Recent orders

+
+
+ {orders.map((order) => ( +
+

+ Order placed on +

+
+
+
+
Order
+
{order.name}
+
+
Date placed
+
+ +
+
+ {order.totalPrice && ( +
+
Total amount
+ +
+ )} +
+ + + +
+ + View Order + {order.normalizedId} + +
- ))} -
- -
-
- - {order.lineItems.length} item{order.lineItems.length > 1 && 's'} - -
- + +

Items

+
    + {order.lineItems.map((item) => ( +
  • +
    +
    + {item.image ? ( + {item.image.altText + ) : ( +
    + +
    + )} +
    +
    +
    +
    {item.title}
    + {item.price && } +
    +

    + {item.variantTitle} +

    +
    +
    +
  • + ))} +
- - + ))}
- ))} +
); diff --git a/components/form/file-input.tsx b/components/form/file-input.tsx new file mode 100644 index 000000000..7c1ab6aa5 --- /dev/null +++ b/components/form/file-input.tsx @@ -0,0 +1,33 @@ +import { PhotoIcon } from '@heroicons/react/24/outline'; +import { useId } from 'react'; + +type FileInputProps = { + name: string; + label: string; +}; + +const FileInput = ({ name, label }: FileInputProps) => { + const id = useId(); + return ( +
+ +
+
+
+
+
+ ); +}; + +export default FileInput; diff --git a/components/form/input.tsx b/components/form/input.tsx new file mode 100644 index 000000000..55dfe1204 --- /dev/null +++ b/components/form/input.tsx @@ -0,0 +1,20 @@ +import { Field, Input as HeadlessInput, Label } from '@headlessui/react'; +import { InputHTMLAttributes } from 'react'; + +type InputProps = InputHTMLAttributes & { + label: string; +}; + +const Input = ({ label, ...props }: InputProps) => { + return ( + + + + + ); +}; + +export default Input; diff --git a/components/orders/activate-warranty-modal.tsx b/components/orders/activate-warranty-modal.tsx new file mode 100644 index 000000000..9ac74abfc --- /dev/null +++ b/components/orders/activate-warranty-modal.tsx @@ -0,0 +1,57 @@ +'use client'; + +import { Dialog, DialogBackdrop, DialogPanel, DialogTitle } from '@headlessui/react'; +import FileInput from 'components/form/file-input'; +import Input from 'components/form/input'; + +type ActivateWarrantyModalProps = { + isOpen: boolean; + onClose: () => void; +}; + +function ActivateWarrantyModal({ onClose, isOpen }: ActivateWarrantyModalProps) { + return ( + + {/* The backdrop, rendered as a fixed sibling to the panel container */} + + + {/* Full-screen container to center the panel */} +
+ {/* The actual dialog panel */} + + Activate Warranty +
+
+ + + + +
+
+
+ + +
+
+
+
+ ); +} + +export default ActivateWarrantyModal; diff --git a/components/orders/activate-warranty.tsx b/components/orders/activate-warranty.tsx new file mode 100644 index 000000000..8ba7c7c9c --- /dev/null +++ b/components/orders/activate-warranty.tsx @@ -0,0 +1,25 @@ +'use client'; + +import { useState } from 'react'; +import ActivateWarrantyModal from './activate-warranty-modal'; + +type ActivateWarrantyModalProps = { + orderId: string; +}; + +const ActivateWarranty = ({ orderId }: ActivateWarrantyModalProps) => { + const [isOpen, setIsOpen] = useState(false); + return ( + <> + + setIsOpen(false)} /> + + ); +}; + +export default ActivateWarranty; diff --git a/components/orders/mobile-order-actions.tsx b/components/orders/mobile-order-actions.tsx new file mode 100644 index 000000000..5b8ced240 --- /dev/null +++ b/components/orders/mobile-order-actions.tsx @@ -0,0 +1,62 @@ +'use client'; + +import { Button, Menu, MenuButton, MenuItem, MenuItems } from '@headlessui/react'; +import { EllipsisVerticalIcon } from '@heroicons/react/24/solid'; +import clsx from 'clsx'; +import { Order } from 'lib/shopify/types'; +import Link from 'next/link'; +import { useState } from 'react'; +import ActivateWarrantyModal from './activate-warranty-modal'; + +const MobileOrderActions = ({ order }: { order: Order }) => { + const [isOpen, setIsOpen] = useState(false); + + return ( + <> + +
+ + Options for order {order.name} + +
+ + +
+ + {({ focus }) => ( + + View + + )} + + + {({ focus }) => ( + + )} + +
+
+
+ setIsOpen(false)} /> + + ); +}; + +export default MobileOrderActions; diff --git a/components/orders/order-summary.tsx b/components/orders/order-summary.tsx index 25aa81a51..4510d0562 100644 --- a/components/orders/order-summary.tsx +++ b/components/orders/order-summary.tsx @@ -1,10 +1,11 @@ -import Image from 'next/image'; +import { InformationCircleIcon } from '@heroicons/react/24/outline'; import Price from 'components/price'; import Badge from 'components/ui/badge'; import Heading from 'components/ui/heading'; import Label from 'components/ui/label'; import Text from 'components/ui/text'; import { Order } from 'lib/shopify/types'; +import Image from 'next/image'; export default function OrderSummary({ order }: { order: Order }) { return ( @@ -12,19 +13,32 @@ export default function OrderSummary({ order }: { order: Order }) { Order Summary
{order.lineItems.map((lineItem, index) => ( -
- - {lineItem.image.altText} - -
- {lineItem.title} - +
+
+ +
+ {lineItem.image ? ( + {lineItem.image.altText} + ) : ( +
+ +
+ )} +
+
+
+ {lineItem.title} + +
{ + return ( +
+
+

+ Order history +

+

+ Check the status of recent orders, manage returns, and discover similar products. +

+
+
+ ); +}; + +export default OrdersHeader; diff --git a/components/price.tsx b/components/price.tsx index af096fd09..510b427de 100644 --- a/components/price.tsx +++ b/components/price.tsx @@ -1,16 +1,17 @@ import clsx from 'clsx'; +import { JSXElementConstructor } from 'react'; const Price = ({ amount, className, - as, + as: Component = 'p', currencyCode = 'USD', currencyCodeClassName, showCurrency = false, prefix }: { amount: string; - as?: 'p' | 'span'; + as?: keyof JSX.IntrinsicElements | JSXElementConstructor; className?: string; currencyCode: string; currencyCodeClassName?: string; @@ -25,7 +26,6 @@ const Price = ({ return

Included

; } - const Component = as || 'p'; // Otherwise, format and display the price return ( diff --git a/lib/constants.ts b/lib/constants.ts index eeaf84cfb..2d246a218 100644 --- a/lib/constants.ts +++ b/lib/constants.ts @@ -35,6 +35,7 @@ export const TAGS = { export const HIDDEN_PRODUCT_TAG = 'nextjs-frontend-hidden'; export const DEFAULT_OPTION = 'Default Title'; export const SHOPIFY_GRAPHQL_API_ENDPOINT = '/api/2024-04/graphql.json'; +export const SHOPIFY_GRAPHQL_CUSTOMER_API_ENDPOINT = '/account/customer/api/2024-07/graphql'; export const CORE_WAIVER = 'core-waiver'; export const CORE_VARIANT_ID_KEY = 'coreVariantId'; diff --git a/lib/shopify/fragments/line-item.ts b/lib/shopify/fragments/line-item.ts new file mode 100644 index 000000000..fb151bf65 --- /dev/null +++ b/lib/shopify/fragments/line-item.ts @@ -0,0 +1,25 @@ +const lineItemFragment = /* GraphQL */ ` + fragment LineItem on LineItem { + title + image { + altText + height + url + width + } + price { + amount + currencyCode + } + quantity + sku + totalPrice { + amount + currencyCode + } + variantTitle + id + } +`; + +export default lineItemFragment; diff --git a/lib/shopify/fragments/order-card.ts b/lib/shopify/fragments/order-card.ts index a7e87671b..4d8dc81b9 100644 --- a/lib/shopify/fragments/order-card.ts +++ b/lib/shopify/fragments/order-card.ts @@ -1,9 +1,12 @@ +import lineItemFragment from './line-item'; + const orderCard = /* GraphQL */ ` fragment OrderCard on Order { id number name processedAt + createdAt financialStatus fulfillments(first: 1) { edges { @@ -17,20 +20,12 @@ const orderCard = /* GraphQL */ ` currencyCode } lineItems(first: 20) { - edges { - node { - title - quantity - image { - altText - height - url - width - } - } + nodes { + ...LineItem } } } + ${lineItemFragment} `; export default orderCard; diff --git a/lib/shopify/index.ts b/lib/shopify/index.ts index 9678e596c..e4b3c864e 100644 --- a/lib/shopify/index.ts +++ b/lib/shopify/index.ts @@ -7,6 +7,7 @@ import { PRICE_FILTER_ID, PRODUCT_METAFIELD_PREFIX, SHOPIFY_GRAPHQL_API_ENDPOINT, + SHOPIFY_GRAPHQL_CUSTOMER_API_ENDPOINT, TAGS, VARIANT_METAFIELD_PREFIX, YEAR_FILTER_ID @@ -29,9 +30,12 @@ import { getCollectionQuery, getCollectionsQuery } from './queries/collection'; +import { getCustomerQuery } from './queries/customer'; import { getMenuQuery } from './queries/menu'; import { getMetaobjectQuery, getMetaobjectsQuery } from './queries/metaobject'; import { getImageQuery, getMetaobjectsByIdsQuery } from './queries/node'; +import { getCustomerOrderQuery } from './queries/order'; +import { getCustomerOrdersQuery } from './queries/orders'; import { getPageQuery, getPagesQuery } from './queries/page'; import { getProductQuery, @@ -46,18 +50,19 @@ import { Connection, Customer, Filter, + Fulfillment, Image, + LineItem, Menu, Metaobject, Money, Order, - Fulfillment, - Transaction, Page, PageInfo, Product, ProductVariant, ShopifyAddToCartOperation, + ShopifyAddress, ShopifyCart, ShopifyCartOperation, ShopifyCollection, @@ -65,6 +70,7 @@ import { ShopifyCollectionProductsOperation, ShopifyCollectionsOperation, ShopifyCreateCartOperation, + ShopifyCustomer, ShopifyCustomerOperation, ShopifyCustomerOrderOperation, ShopifyCustomerOrdersOperation, @@ -73,6 +79,8 @@ import { ShopifyMenuOperation, ShopifyMetaobject, ShopifyMetaobjectsOperation, + ShopifyMoneyV2, + ShopifyOrder, ShopifyPage, ShopifyPageOperation, ShopifyPagesOperation, @@ -84,26 +92,18 @@ import { ShopifyRemoveFromCartOperation, ShopifySetCartAttributesOperation, ShopifyUpdateCartOperation, - TransmissionType, - ShopifyCustomer, - ShopifyOrder, - ShopifyAddress, - ShopifyMoneyV2, - LineItem + Transaction, + TransmissionType } from './types'; -import { getCustomerQuery } from './queries/customer'; -import { getCustomerOrdersQuery } from './queries/orders'; -import { getCustomerOrderQuery } from './queries/order'; const domain = process.env.SHOPIFY_STORE_DOMAIN ? ensureStartsWith(process.env.SHOPIFY_STORE_DOMAIN, 'https://') : ''; const customerApiUrl = process.env.SHOPIFY_CUSTOMER_ACCOUNT_API_URL; -const customerApiVersion = process.env.SHOPIFY_CUSTOMER_API_VERSION; const storefrontEndpoint = `${domain}${SHOPIFY_GRAPHQL_API_ENDPOINT}`; -const customerEndpoint = `${customerApiUrl}/account/customer/api/${customerApiVersion}/graphql`; +const customerEndpoint = `${customerApiUrl}/${SHOPIFY_GRAPHQL_CUSTOMER_API_ENDPOINT}`; const userAgent = '*'; const placeholderProductImage = @@ -528,24 +528,15 @@ function reshapeOrder(shopifyOrder: ShopifyOrder): Order { })); const orderLineItems: LineItem[] = - shopifyOrder.lineItems?.edges.map((edge) => ({ - id: edge.node.id, - title: edge.node.title, - quantity: edge.node.quantity, - image: { - url: edge.node.image?.url || placeholderProductImage, - altText: edge.node.image?.altText || edge.node.title, - width: 62, - height: 62 - }, - price: reshapeMoney(edge.node.price), - totalPrice: reshapeMoney(edge.node.totalPrice), - variantTitle: edge.node.variantTitle, - sku: edge.node.sku + shopifyOrder.lineItems?.nodes?.map((item) => ({ + ...item, + price: reshapeMoney(item.price), + totalPrice: reshapeMoney(item.totalPrice) })) || []; const order: Order = { - id: shopifyOrder.id.replace('gid://shopify/Order/', ''), + id: shopifyOrder.id, + normalizedId: shopifyOrder.id.replace('gid://shopify/Order/', ''), name: shopifyOrder.name, processedAt: shopifyOrder.processedAt, fulfillments: orderFulfillments, @@ -556,7 +547,8 @@ function reshapeOrder(shopifyOrder: ShopifyOrder): Order { subtotal: reshapeMoney(shopifyOrder.subtotal), totalShipping: reshapeMoney(shopifyOrder.totalShipping), totalTax: reshapeMoney(shopifyOrder.totalTax), - totalPrice: reshapeMoney(shopifyOrder.totalPrice) + totalPrice: reshapeMoney(shopifyOrder.totalPrice), + createdAt: shopifyOrder.createdAt }; if (shopifyOrder.customer) { diff --git a/lib/shopify/queries/order.ts b/lib/shopify/queries/order.ts index cc8e7d5f8..826479f27 100644 --- a/lib/shopify/queries/order.ts +++ b/lib/shopify/queries/order.ts @@ -1,3 +1,5 @@ +import lineItemFragment from '../fragments/line-item'; + // NOTE: https://shopify.dev/docs/api/customer/latest/queries/customer export const getCustomerOrderQuery = /* GraphQL */ ` query getCustomerOrderQuery($orderId: ID!) { @@ -55,11 +57,9 @@ export const getCustomerOrderQuery = /* GraphQL */ ` } } lineItems(first: 50) { - edges { - node { - id - ...LineItem - } + nodes { + id + ...LineItem } } totalPrice { @@ -194,25 +194,6 @@ export const getCustomerOrderQuery = /* GraphQL */ ` happenedAt } - fragment LineItem on LineItem { - title - image { - altText - height - url - width - } - price { - ...Price - } - quantity - sku - totalPrice { - ...Price - } - variantTitle - } - fragment OrderPaymentInformation on OrderPaymentInformation { paymentStatus totalPaidAmount { @@ -237,4 +218,5 @@ export const getCustomerOrderQuery = /* GraphQL */ ` } } } + ${lineItemFragment} `; diff --git a/lib/shopify/types.ts b/lib/shopify/types.ts index 466dec33d..ce7fede25 100644 --- a/lib/shopify/types.ts +++ b/lib/shopify/types.ts @@ -121,7 +121,7 @@ export type Address = { export type LineItem = { id: string; title: string; - image: Image; + image: Image | null; price?: Money; quantity?: number; sku?: string; @@ -131,9 +131,11 @@ export type LineItem = { export type Order = { id: string; + normalizedId: string; name: string; customer?: Customer; processedAt: string; + createdAt: string; fulfillments: Fulfillment[]; transactions: Transaction[]; lineItems: LineItem[]; @@ -156,13 +158,16 @@ export type ShopifyOrder = { confirmationNumber: string; customer: ShopifyCustomer; processedAt: string; + createdAt: string; cancelledAt: string | null; currencyCode: string; transactions: ShopifyOrderTransaction[]; billingAddress: ShopifyAddress; shippingAddress: ShopifyAddress; fulfillments: Connection; - lineItems: Connection; + lineItems: { + nodes: ShopifyLineItem[]; + }; totalPrice: ShopifyMoneyV2; subtotal: ShopifyMoneyV2; totalShipping: ShopifyMoneyV2; @@ -269,7 +274,7 @@ type ShopifyFulfillmentLineItem = { type ShopifyLineItem = { id: string; title: string; - image: ShopifyImage; + image: Image | null; price: ShopifyMoneyV2; quantity: number; sku: string; @@ -277,13 +282,6 @@ type ShopifyLineItem = { variantTitle: string; }; -type ShopifyImage = { - altText: string; - height: number; - url: string; - width: number; -}; - type ShopifyFulfillmentEvent = { status: string; happenedAt: string; diff --git a/lib/utils.ts b/lib/utils.ts index ef06cf8e8..1233b5c99 100644 --- a/lib/utils.ts +++ b/lib/utils.ts @@ -87,3 +87,11 @@ export function parseJSON(json: any) { function noproto(k: string, v: string) { if (k !== '__proto__') return v; } + +export function toPrintDate(date: string) { + return new Date(date).toLocaleDateString('en-US', { + year: 'numeric', + month: 'long', + day: 'numeric' + }); +} diff --git a/package.json b/package.json index 976bad353..96a421952 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,7 @@ "*": "prettier --write --ignore-unknown" }, "dependencies": { - "@headlessui/react": "^2.0.1", + "@headlessui/react": "^2.1.0", "@heroicons/react": "^2.1.3", "@hookform/resolvers": "^3.6.0", "@radix-ui/react-checkbox": "^1.0.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a8d1f95f5..f3b233c26 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@headlessui/react': - specifier: ^2.0.1 - version: 2.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + specifier: ^2.1.0 + version: 2.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@heroicons/react': specifier: ^2.1.3 version: 2.1.3(react@18.2.0) @@ -180,14 +180,14 @@ packages: '@floating-ui/dom@1.6.3': resolution: {integrity: sha512-RnDthu3mzPlQ31Ss/BTwQ1zjzIhr3lk1gZB1OC56h/1vEtaXkESrOqL5fQVMfXpwGtRwX+YsZBdyHtJMQnkArw==} - '@floating-ui/react-dom@2.0.9': - resolution: {integrity: sha512-q0umO0+LQK4+p6aGyvzASqKbKOJcAHJ7ycE9CuUvfx3s9zTHWmGJTPOIlM/hmSBfUfg/XfY5YhLBLR/LHwShQQ==} + '@floating-ui/react-dom@2.1.0': + resolution: {integrity: sha512-lNzj5EQmEKn5FFKc04+zasr09h/uX8RtJRNj5gUXsSQIXHVWTVh+hVAg1vOMCexkX8EgvemMvIFpQfkosnVNyA==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' - '@floating-ui/react@0.26.13': - resolution: {integrity: sha512-kBa9wntpugzrZ8t/4yWelvSmEKZdeTXTJzrxqyrLmcU/n1SM4nvse8yQh2e1b37rJGvtu0EplV9+IkBrCJ1vkw==} + '@floating-ui/react@0.26.17': + resolution: {integrity: sha512-ESD+jYWwqwVzaIgIhExrArdsCL1rOAzryG/Sjlu8yaD3Mtqi3uVyhbE2V7jD58Mo52qbzKz2eUY/Xgh5I86FCQ==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' @@ -195,8 +195,8 @@ packages: '@floating-ui/utils@0.2.1': resolution: {integrity: sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==} - '@headlessui/react@2.0.1': - resolution: {integrity: sha512-GxFvHHk27AYELf0WIMa0LgSeVqJ0SOvIwg7USTptMFbtLz31jNGQoolHiQPnvsI/IMmEeJ4ybzQlqV69/uvQ8A==} + '@headlessui/react@2.1.0': + resolution: {integrity: sha512-/MizQk2xqR5ELkmCI1xWy3VgJULvR8gcAXtZhcK7sY53TNRCPeMdeODEXKSv9LPSSRlEAyzW1+NGJiaXq6dLRw==} engines: {node: '>=10'} peerDependencies: react: ^18 @@ -435,34 +435,34 @@ packages: '@types/react': optional: true - '@react-aria/focus@3.17.0': - resolution: {integrity: sha512-aRzBw1WTUkcIV3xFrqPA6aB8ZVt3XyGpTaSHAypU0Pgoy2wRq9YeJYpbunsKj9CJmskuffvTqXwAjTcaQish1Q==} + '@react-aria/focus@3.17.1': + resolution: {integrity: sha512-FLTySoSNqX++u0nWZJPPN5etXY0WBxaIe/YuL/GTEeuqUIuC/2bJSaw5hlsM6T2yjy6Y/VAxBcKSdAFUlU6njQ==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - '@react-aria/interactions@3.21.2': - resolution: {integrity: sha512-Ju706DtoEmI/2vsfu9DCEIjDqsRBVLm/wmt2fr0xKbBca7PtmK8daajxFWz+eTq+EJakvYfLr7gWgLau9HyWXg==} + '@react-aria/interactions@3.21.3': + resolution: {integrity: sha512-BWIuf4qCs5FreDJ9AguawLVS0lV9UU+sK4CCnbCNNmYqOWY+1+gRXCsnOM32K+oMESBxilAjdHW5n1hsMqYMpA==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - '@react-aria/ssr@3.9.3': - resolution: {integrity: sha512-5bUZ93dmvHFcmfUcEN7qzYe8yQQ8JY+nHN6m9/iSDCQ/QmCiE0kWXYwhurjw5ch6I8WokQzx66xKIMHBAa4NNA==} + '@react-aria/ssr@3.9.4': + resolution: {integrity: sha512-4jmAigVq409qcJvQyuorsmBR4+9r3+JEC60wC+Y0MZV0HCtTmm8D9guYXlJMdx0SSkgj0hHAyFm/HvPNFofCoQ==} engines: {node: '>= 12'} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - '@react-aria/utils@3.24.0': - resolution: {integrity: sha512-JAxkPhK5fCvFVNY2YG3TW3m1nTzwRcbz7iyTSkUzLFat4N4LZ7Kzh7NMHsgeE/oMOxd8zLY+XsUxMu/E/2GujA==} + '@react-aria/utils@3.24.1': + resolution: {integrity: sha512-O3s9qhPMd6n42x9sKeJ3lhu5V1Tlnzhu6Yk8QOvDuXf7UGuUjXf9mzfHJt1dYzID4l9Fwm8toczBzPM9t0jc8Q==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - '@react-stately/utils@3.10.0': - resolution: {integrity: sha512-nji2i9fTYg65ZWx/3r11zR1F2tGya+mBubRCbMTwHyRnsSLFZaeq/W6lmrOyIy1uMJKBNKLJpqfmpT4x7rw6pg==} + '@react-stately/utils@3.10.1': + resolution: {integrity: sha512-VS/EHRyicef25zDZcM/ClpzYMC5i2YGN6uegOeQawmgfGjb02yaCX0F0zR69Pod9m2Hr3wunTbtpgVXvYbZItg==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 - '@react-types/shared@3.23.0': - resolution: {integrity: sha512-GQm/iPiii3ikcaMNR4WdVkJ4w0mKtV3mLqeSfSqzdqbPr6vONkqXbh3RhPlPmAJs1b4QHnexd/wZQP3U9DHOwQ==} + '@react-types/shared@3.23.1': + resolution: {integrity: sha512-5d+3HbFDxGZjhbMBeFHRQhexMFt4pUce3okyRtUVKbbedQFUrtXSBg9VszgF2RTeQDKDkMCIQDtz5ccP/Lk1gw==} peerDependencies: react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 @@ -472,9 +472,6 @@ packages: '@swc/counter@0.1.3': resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@swc/helpers@0.5.2': - resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} - '@swc/helpers@0.5.5': resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} @@ -2344,15 +2341,15 @@ snapshots: '@floating-ui/core': 1.6.0 '@floating-ui/utils': 0.2.1 - '@floating-ui/react-dom@2.0.9(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@floating-ui/react-dom@2.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: '@floating-ui/dom': 1.6.3 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) - '@floating-ui/react@0.26.13(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@floating-ui/react@0.26.17(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@floating-ui/react-dom': 2.0.9(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@floating-ui/react-dom': 2.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) '@floating-ui/utils': 0.2.1 react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -2360,11 +2357,11 @@ snapshots: '@floating-ui/utils@0.2.1': {} - '@headlessui/react@2.0.1(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': + '@headlessui/react@2.1.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0)': dependencies: - '@floating-ui/react': 0.26.13(react-dom@18.2.0(react@18.2.0))(react@18.2.0) - '@react-aria/focus': 3.17.0(react@18.2.0) - '@react-aria/interactions': 3.21.2(react@18.2.0) + '@floating-ui/react': 0.26.17(react-dom@18.2.0(react@18.2.0))(react@18.2.0) + '@react-aria/focus': 3.17.1(react@18.2.0) + '@react-aria/interactions': 3.21.3(react@18.2.0) '@tanstack/react-virtual': 3.5.0(react-dom@18.2.0(react@18.2.0))(react@18.2.0) react: 18.2.0 react-dom: 18.2.0(react@18.2.0) @@ -2564,43 +2561,43 @@ snapshots: optionalDependencies: '@types/react': 18.2.72 - '@react-aria/focus@3.17.0(react@18.2.0)': + '@react-aria/focus@3.17.1(react@18.2.0)': dependencies: - '@react-aria/interactions': 3.21.2(react@18.2.0) - '@react-aria/utils': 3.24.0(react@18.2.0) - '@react-types/shared': 3.23.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@react-aria/interactions': 3.21.3(react@18.2.0) + '@react-aria/utils': 3.24.1(react@18.2.0) + '@react-types/shared': 3.23.1(react@18.2.0) + '@swc/helpers': 0.5.5 clsx: 2.1.0 react: 18.2.0 - '@react-aria/interactions@3.21.2(react@18.2.0)': + '@react-aria/interactions@3.21.3(react@18.2.0)': dependencies: - '@react-aria/ssr': 3.9.3(react@18.2.0) - '@react-aria/utils': 3.24.0(react@18.2.0) - '@react-types/shared': 3.23.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@react-aria/ssr': 3.9.4(react@18.2.0) + '@react-aria/utils': 3.24.1(react@18.2.0) + '@react-types/shared': 3.23.1(react@18.2.0) + '@swc/helpers': 0.5.5 react: 18.2.0 - '@react-aria/ssr@3.9.3(react@18.2.0)': + '@react-aria/ssr@3.9.4(react@18.2.0)': dependencies: - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.5 react: 18.2.0 - '@react-aria/utils@3.24.0(react@18.2.0)': + '@react-aria/utils@3.24.1(react@18.2.0)': dependencies: - '@react-aria/ssr': 3.9.3(react@18.2.0) - '@react-stately/utils': 3.10.0(react@18.2.0) - '@react-types/shared': 3.23.0(react@18.2.0) - '@swc/helpers': 0.5.2 + '@react-aria/ssr': 3.9.4(react@18.2.0) + '@react-stately/utils': 3.10.1(react@18.2.0) + '@react-types/shared': 3.23.1(react@18.2.0) + '@swc/helpers': 0.5.5 clsx: 2.1.0 react: 18.2.0 - '@react-stately/utils@3.10.0(react@18.2.0)': + '@react-stately/utils@3.10.1(react@18.2.0)': dependencies: - '@swc/helpers': 0.5.2 + '@swc/helpers': 0.5.5 react: 18.2.0 - '@react-types/shared@3.23.0(react@18.2.0)': + '@react-types/shared@3.23.1(react@18.2.0)': dependencies: react: 18.2.0 @@ -2608,10 +2605,6 @@ snapshots: '@swc/counter@0.1.3': {} - '@swc/helpers@0.5.2': - dependencies: - tslib: 2.6.2 - '@swc/helpers@0.5.5': dependencies: '@swc/counter': 0.1.3