@godaddy/gd-commerce-storefront 0.9.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +29 -4
- package/dist/index.d.ts +48 -9
- package/dist/index.js +543 -186
- package/dist/messages/fr-FR.d.ts +7 -0
- package/dist/messages/fr-FR.js +143 -0
- package/dist/messages-CHl-bWx9.d.ts +152 -0
- package/dist/styles.css +3 -0
- package/package.json +13 -1
package/README.md
CHANGED
|
@@ -57,6 +57,7 @@ Use the providers your application already has; do not create another router or
|
|
|
57
57
|
| `onItemAdded` | unset | Called with `{ name, quantity, isSample }` after each add, live or sample; use it to confirm adds on a site with a cart page instead of a drawer |
|
|
58
58
|
| `onEvent` | unset | Called with a [`CommerceEvent`](#events) for every cart change and failure, such as for analytics |
|
|
59
59
|
| `locale` | `en-US` | BCP 47 locale for formatting prices, such as `de-DE`; an invalid tag falls back to `en-US` with a development warning. It never selects UI text |
|
|
60
|
+
| `messages` | English | The package's text, such as `frFR`. Keys left out stay English. See [translations](#translations) |
|
|
60
61
|
| `theme` | inherited text and transparent wrappers; neutral control palette | CSS custom properties applied to storefront surfaces and the portalled drawer |
|
|
61
62
|
| `getSwatch` | unset | Swatches for attribute values, such as colors. Returns a CSS `background` for a value, or nothing. See [swatches](#swatches) |
|
|
62
63
|
|
|
@@ -92,7 +93,7 @@ The stylesheet includes all required utilities and scopes them to the package's
|
|
|
92
93
|
|
|
93
94
|
By default, `.commerce-storefront` wrappers do not paint a background and inherit the host's text color. Set page and section backgrounds on the host application's layout elements. Muted text, hairlines, image placeholders and the quieter outlined buttons (cart button, product card actions, pagination) derive from the inherited text color, so they read on a light or dark page without configuration. `--commerce-surface` colors form inputs and the opaque cart drawer, paired with `--commerce-text`; it does not color component wrappers. Error and warning messages bring their own light background. The Sale badge fills with `--commerce-sale` behind `--commerce-on-sale` text, so it reads over an image and on any page; sale prices keep the surrounding text color, with the compare-at price struck through beside them. Images have square corners; `--commerce-radius` rounds buttons, inputs and option buttons. Primary buttons use `--commerce-accent` and are ringed in it on focus, so choose an accent that contrasts with the page. Set `--commerce-surface` and `--commerce-text` together to adapt controls and the drawer to a dark theme. Avoid setting wrapper backgrounds through CSS or the `theme` prop's `background`, `backgroundColor`, or `backgroundImage` properties, which can still override the transparent default. Descendants inherit the surface text and body font instead of global heading styles. Keep text, controls and focus indicators accessible when changing colors. Internal utility class names and markup are not a customization API; use the [product](#custom-product-layouts), [catalog](#custom-catalog-layouts) and [cart](#custom-cart-layouts) parts to change a layout, and the [styling hooks](#styling-hooks) to style inside a part.
|
|
94
95
|
|
|
95
|
-
Prices follow the provider's `locale`, which defaults to `en-US`. UI text is English
|
|
96
|
+
Prices follow the provider's `locale`, which defaults to `en-US`. UI text is English unless the site sets [`messages`](#translations).
|
|
96
97
|
|
|
97
98
|
## Compatibility
|
|
98
99
|
|
|
@@ -117,7 +118,8 @@ The repository example uses React Router 7. Follow each router version's own Rea
|
|
|
117
118
|
| `AddToCartButton` | Adds a verified `sku`, `name`, and optional integer `quantity`; while disabled, its accessible description says why. Its children replace the label |
|
|
118
119
|
| `CommerceStatus` | Connection progress/error/retry for custom layouts |
|
|
119
120
|
| `useCommerce` | Cart, connection, pending/error state and serialized cart actions |
|
|
120
|
-
| `useMoney` | Formats minor units in the provider's `locale`, like the package's own prices, for custom parts |
|
|
121
|
+
| `useMoney` | Formats minor units in the provider's `locale`, like the package's own prices, for custom parts. `useMoneyRange` formats a range |
|
|
122
|
+
| `useMessage` | The provider's [text](#translations) by key, for custom parts |
|
|
121
123
|
| `ProductImage` | A product image with the package's placeholder for a missing or broken image, for custom parts |
|
|
122
124
|
| `CommerceProvider` | Lower-level composition when the recommended wrapper does not fit, such as a custom drawer; mount it once |
|
|
123
125
|
|
|
@@ -433,7 +435,30 @@ Parts whose wording a site often changes take replacement content as children. T
|
|
|
433
435
|
| `ProductCardAction` | `{ action, busy, soldOut }` |
|
|
434
436
|
| `ProductDetailsBackLink` | Content only |
|
|
435
437
|
|
|
436
|
-
A replaced label stays the start of the control's accessible name, so voice control users can say what they see. Where the package adds the product name for screen readers, it follows as visually hidden text: `<CartItemRemove>Delete</CartItemRemove>` is named "Delete Mug". Controls without replacement text, such as "Increase quantity of Mug",
|
|
438
|
+
A replaced label stays the start of the control's accessible name, so voice control users can say what they see. Where the package adds the product name for screen readers, it follows as visually hidden text: `<CartItemRemove>Delete</CartItemRemove>` is named "Delete Mug". Controls without replacement text, such as "Increase quantity of Mug", take their names from [`messages`](#translations).
|
|
439
|
+
|
|
440
|
+
## Translations
|
|
441
|
+
|
|
442
|
+
The package's text comes from the provider's `messages`. Set it with `locale` for a translated store; the two are separate, so a site that sets `locale` for prices never gets new wording.
|
|
443
|
+
|
|
444
|
+
```tsx
|
|
445
|
+
import { CommerceStorefront } from '@godaddy/gd-commerce-storefront';
|
|
446
|
+
import { frFR } from '@godaddy/gd-commerce-storefront/messages/fr-FR';
|
|
447
|
+
|
|
448
|
+
<CommerceStorefront locale='fr-FR' messages={frFR}>
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
French is its own import, so English-only sites do not load it. Pass only the keys to change, and the rest stay as they were, English by default: `messages={{ ...frFR, checkout: 'Commander' }}`. The `StorefrontMessages` type lists every key, and `enUS` has the English text. New keys may be added in minor releases and stay English until translated, so type a translation of your own as `Partial<StorefrontMessages>`.
|
|
452
|
+
|
|
453
|
+
Messages are plain data, so they can come from JSON, a translation service, or a server component. `{name}` placeholders are filled in, and numbers in them are formatted for the messages' `locale`. A message with a count can have plural forms, chosen by the language's rules; French counts 0 as singular:
|
|
454
|
+
|
|
455
|
+
```ts
|
|
456
|
+
{ productCount: { one: '{count} produit affiché', other: '{count} produits affichés' } }
|
|
457
|
+
```
|
|
458
|
+
|
|
459
|
+
The server's failure messages are English. With English text the storefront shows them as they are; with any other language it shows the text in `errorCodes` for the response's `code`, such as `scope_mismatch`, or the generic `requestFailed`. Product names, descriptions and attribute names come from the catalog as the merchant entered them, and are not translated. Sample prices stay in USD.
|
|
460
|
+
|
|
461
|
+
[Replacement text](#replacing-text) and props such as `CatalogHeader`'s `title` take priority over `messages`. For custom parts, `useMessage()` returns the provider's text by key, `useMoney()` formats prices, and `useMoneyRange()` formats a range the way the `locale` writes it, such as `$20.00 – $25.00` or `20,00–25,00 €`.
|
|
437
462
|
|
|
438
463
|
## Styling hooks
|
|
439
464
|
|
|
@@ -458,7 +483,7 @@ Every part's outer element has a `data-commerce-part` attribute with the part's
|
|
|
458
483
|
| `item-removed` | `itemId`, `isSample` |
|
|
459
484
|
| `discount-applied` | `code` |
|
|
460
485
|
| `checkout-started` | `cartId`; sent just before the browser leaves for checkout, so use `navigator.sendBeacon` or a keepalive request |
|
|
461
|
-
| `error` | `operation` (`add`, `change-quantity`, `remove`, `discount`, `refresh` or `checkout`)
|
|
486
|
+
| `error` | `operation` (`add`, `change-quantity`, `remove`, `discount`, `refresh` or `checkout`), the `message` the cart shows in the provider's language at the time of the failure, and the server's `code`, such as `scope_mismatch`, when it sent one. The cart's own notice follows a later change of `messages`; the event's text does not, so log `code` to group failures |
|
|
462
487
|
|
|
463
488
|
New event types may be added in minor releases, so ignore types you do not handle. A callback that throws or returns a rejected promise, including `onItemAdded`, is logged to the console and does not fail the cart operation. Async callbacks are not awaited, so a slow analytics call never delays the cart.
|
|
464
489
|
|
package/dist/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { a as StorefrontMessages, i as StorefrontMessageKey, n as MessageValues, o as enUS, r as StorefrontMessage, s as formatMessage, t as CommerceErrorCode } from "./messages-CHl-bWx9.js";
|
|
1
2
|
import { CSSProperties, ReactElement, ReactNode } from "react";
|
|
2
3
|
import * as react_jsx_runtime0 from "react/jsx-runtime";
|
|
3
4
|
|
|
@@ -11,10 +12,25 @@ interface StorefrontConfig {
|
|
|
11
12
|
}
|
|
12
13
|
declare class ApiError extends Error {
|
|
13
14
|
readonly status: number;
|
|
14
|
-
|
|
15
|
+
/** The failure response's `code`, such as `not_found`, when the server sent one. */
|
|
16
|
+
readonly code: string | undefined;
|
|
17
|
+
/** Package text to show in place of `message`, for failures the package describes itself. */
|
|
18
|
+
readonly text: {
|
|
19
|
+
key: StorefrontMessageKey;
|
|
20
|
+
values?: MessageValues;
|
|
21
|
+
} | undefined;
|
|
22
|
+
constructor(message: string, status: number, options?: ErrorOptions & {
|
|
23
|
+
code?: string;
|
|
24
|
+
text?: {
|
|
25
|
+
key: StorefrontMessageKey;
|
|
26
|
+
values?: MessageValues;
|
|
27
|
+
};
|
|
28
|
+
});
|
|
15
29
|
}
|
|
16
30
|
/** Formats minor units, such as cents, as currency. Inside the provider, prefer `useMoney`, which follows its `locale`. */
|
|
17
31
|
declare function money(value: number, currency: string, locale?: string): string;
|
|
32
|
+
/** Formats a range of minor units the way `locale` writes ranges, such as `$20.00 – $25.00` or `20,00–25,00 €`. */
|
|
33
|
+
declare function moneyRange(min: number, max: number, currency: string, locale?: string): string;
|
|
18
34
|
//#endregion
|
|
19
35
|
//#region src/cart-model.d.ts
|
|
20
36
|
interface Money {
|
|
@@ -150,7 +166,8 @@ interface CartSummaryTotals {
|
|
|
150
166
|
declare function addToCart(cartId: string | null, item: AddToCartItemInput, fetchFn?: typeof globalThis.fetch): Promise<{
|
|
151
167
|
cart: CartOrder | null;
|
|
152
168
|
}>;
|
|
153
|
-
|
|
169
|
+
/** The cart's totals in minor units. `currencyCode` is the cart's, or `fallbackCurrency`, such as the store's. */
|
|
170
|
+
declare function getCartSummaryTotals(order: CartOrder | null | undefined, fallbackCurrency?: string): CartSummaryTotals;
|
|
154
171
|
//#endregion
|
|
155
172
|
//#region src/catalog-model.d.ts
|
|
156
173
|
interface PageInfo {
|
|
@@ -580,8 +597,10 @@ declare function CatalogRoot({
|
|
|
580
597
|
urlState
|
|
581
598
|
}: CatalogRootProps): ReactElement;
|
|
582
599
|
interface CatalogHeaderProps extends CatalogPartProps {
|
|
583
|
-
|
|
584
|
-
|
|
600
|
+
/** Defaults to the provider's `catalogTitle` message. `null` leaves the heading out. */
|
|
601
|
+
title?: string | null;
|
|
602
|
+
/** Defaults to the provider's `catalogDescription` message. `null` leaves it out. */
|
|
603
|
+
description?: string | null;
|
|
585
604
|
}
|
|
586
605
|
/** The catalog title as the page's H1, with a description. */
|
|
587
606
|
declare function CatalogHeader({
|
|
@@ -655,6 +674,8 @@ interface CommerceContextValue {
|
|
|
655
674
|
config: StorefrontConfig;
|
|
656
675
|
/** The BCP 47 locale that prices are formatted in, such as `en-US`. */
|
|
657
676
|
locale: string;
|
|
677
|
+
/** The package's text: English, with the provider's `messages` over it. */
|
|
678
|
+
messages: StorefrontMessages;
|
|
658
679
|
cart: CartOrder | null;
|
|
659
680
|
/** Whether the cart drawer is open. Always `false` when no `CartDrawer` or `CartDrawerRoot` is mounted. */
|
|
660
681
|
open: boolean;
|
|
@@ -680,6 +701,13 @@ declare function useCommerce(): CommerceContextValue;
|
|
|
680
701
|
* store's currency unless `currency` is given.
|
|
681
702
|
*/
|
|
682
703
|
declare function useMoney(): (value: number, currency?: string) => string;
|
|
704
|
+
/** `useMoney` for a range, such as `$20.00 – $25.00`, written the way the provider's `locale` writes ranges. */
|
|
705
|
+
declare function useMoneyRange(): (min: number, max: number, currency?: string) => string;
|
|
706
|
+
/**
|
|
707
|
+
* The provider's text for `key`, with `{placeholders}` filled from `values`, the way the package's own parts read
|
|
708
|
+
* it. For custom parts that should match the package's language. English outside a provider.
|
|
709
|
+
*/
|
|
710
|
+
declare function useMessage(): (key: StorefrontMessageKey, values?: MessageValues) => string;
|
|
683
711
|
type StorefrontTheme = CSSProperties & {
|
|
684
712
|
'--commerce-accent'?: string;
|
|
685
713
|
'--commerce-accent-hover'?: string;
|
|
@@ -718,9 +746,15 @@ interface CommerceProviderProps {
|
|
|
718
746
|
checkoutSuccessPath?: string;
|
|
719
747
|
/**
|
|
720
748
|
* The BCP 47 locale for formatting prices, such as `de-DE`. Defaults to `en-US`; an invalid tag falls back to it.
|
|
721
|
-
* It never selects UI text
|
|
749
|
+
* It never selects UI text; set `messages` for that.
|
|
722
750
|
*/
|
|
723
751
|
locale?: string;
|
|
752
|
+
/**
|
|
753
|
+
* The package's text, such as `frFR` from `@godaddy/gd-commerce-storefront/messages/fr-FR`. Keys left out use
|
|
754
|
+
* English. Independent of `locale`, so set both for a translated store. Part `children` and props such as
|
|
755
|
+
* `CatalogHeader`'s `title` still replace the text where given.
|
|
756
|
+
*/
|
|
757
|
+
messages?: Partial<StorefrontMessages>;
|
|
724
758
|
/**
|
|
725
759
|
* Called after an item is added, live or sample. With a drawer mounted, the drawer also opens. Without one, such as
|
|
726
760
|
* on a site with a cart page, use it to confirm the add.
|
|
@@ -759,10 +793,14 @@ type CommerceEvent = {
|
|
|
759
793
|
readonly type: 'checkout-started';
|
|
760
794
|
readonly cartId: string;
|
|
761
795
|
}
|
|
762
|
-
/**
|
|
796
|
+
/**
|
|
797
|
+
* `message` is the one the cart shows, in the provider's language. `code` is the server's failure code, such as
|
|
798
|
+
* `scope_mismatch`, when it sent one.
|
|
799
|
+
*/ | {
|
|
763
800
|
readonly type: 'error';
|
|
764
801
|
readonly operation: CommerceOperation;
|
|
765
802
|
readonly message: string;
|
|
803
|
+
readonly code?: string;
|
|
766
804
|
};
|
|
767
805
|
/** The item passed to `onItemAdded`. */
|
|
768
806
|
interface AddedCartItem {
|
|
@@ -779,6 +817,7 @@ declare function CommerceProvider({
|
|
|
779
817
|
theme,
|
|
780
818
|
getSwatch,
|
|
781
819
|
locale,
|
|
820
|
+
messages,
|
|
782
821
|
onItemAdded,
|
|
783
822
|
onEvent
|
|
784
823
|
}: CommerceProviderProps): ReactElement;
|
|
@@ -976,7 +1015,7 @@ declare function ProductDetailsRoot({
|
|
|
976
1015
|
/** The packaged product page for `${productPath}/:productId`. Compose the parts for a custom layout. */
|
|
977
1016
|
declare function ProductDetails(): ReactElement;
|
|
978
1017
|
interface ProductDetailsBackLinkProps extends ProductDetailsPartProps {
|
|
979
|
-
/** Replaces the chevron and
|
|
1018
|
+
/** Replaces the chevron and the `backToShop` message. */
|
|
980
1019
|
children?: ReactNode;
|
|
981
1020
|
}
|
|
982
1021
|
/** A link to the catalog. */
|
|
@@ -1068,7 +1107,7 @@ declare function ProductDetailsAddToCart({
|
|
|
1068
1107
|
interface RelatedProductsProps {
|
|
1069
1108
|
/** The product to leave out. Defaults to the route's `:productId` parameter. */
|
|
1070
1109
|
productId?: string;
|
|
1071
|
-
/** The H2. Defaults to "You may also like". */
|
|
1110
|
+
/** The H2. Defaults to "You may also like", or the provider's `relatedTitle` message. `null` leaves it out. */
|
|
1072
1111
|
title?: ReactNode;
|
|
1073
1112
|
/** The most products to show, a whole number from 1 to 24. Defaults to 4. */
|
|
1074
1113
|
limit?: number;
|
|
@@ -1094,4 +1133,4 @@ declare function RelatedProducts({
|
|
|
1094
1133
|
//#region src/storefront-surface.d.ts
|
|
1095
1134
|
declare function CommerceStatus(): ReactElement | null;
|
|
1096
1135
|
//#endregion
|
|
1097
|
-
export { AddToCartButton, type AddToCartButtonProps, AddToCartItemInput, type AddToCartLabelState, type AddedCartItem, ApiError, type CartActionPartProps, CartAddress, CartButton, type CartButtonProps, CartCheckout, CartCheckoutNote, CartClose, CartContinueShopping, CartDescription, CartDiscount, CartDrawer, CartDrawerRoot, type CartDrawerRootProps, CartEmpty, type CartEmptyProps, CartItemImage, CartItemName, CartItemOptions, CartItemPrice, CartItemQuantity, CartItemRemove, CartItemRoot, type CartItemRootProps, type CartItemState, CartItems, type CartItemsProps, CartLineItem, CartLineItemDetails, CartNote, CartNotices, CartOrder, type CartPartProps, CartRoot, type CartRootProps, CartSelectedAddon, CartSelectedAddonValue, CartSelectedOption, CartShippingInfo, type CartState, CartSubtotal, CartSummary, type CartSummaryProps, CartSummaryTotals, CartTax, type CartTextPartProps, CartTitle, Catalog, CatalogEmpty, type CatalogEmptyProps, CatalogHeader, type CatalogHeaderProps, CatalogPagination, type CatalogPartProps, CatalogProducts, type CatalogProductsProps, type CatalogProps, CatalogRoot, type CatalogRootProps, CatalogSummary, type CommerceContextValue, type CommerceEvent, type CommerceOperation, CommerceProvider, type CommerceProviderProps, CommerceStatus, CommerceStorefront, Connection, ConnectionEdge, DraftOrderContext, type GetSwatch, InventoryCount, LabelFilter, LineItemTotals, MediaObject, Money, OrderTotals, PageInfo, type PartLabel, PriceRange, ProductCard, ProductCardAction, type ProductCardActionLabelState, type ProductCardActionProps, ProductCardBadge, ProductCardDescription, ProductCardImage, type ProductCardPartProps, ProductCardPrice, type ProductCardProps, ProductCardRoot, type ProductCardRootProps, type ProductCardState, ProductCardSwatches, ProductCardTitle, ProductDetails, ProductDetailsAddToCart, type ProductDetailsAddToCartProps, ProductDetailsAvailability, ProductDetailsBackLink, type ProductDetailsBackLinkProps, ProductDetailsBadge, ProductDetailsDescription, type ProductDetailsErrorState, ProductDetailsGallery, ProductDetailsOption, type ProductDetailsOptionProps, type ProductDetailsOptionState, type ProductDetailsOptionValueState, ProductDetailsOptions, type ProductDetailsPartProps, ProductDetailsPrice, ProductDetailsPurchase, ProductDetailsPurchaseStatus, ProductDetailsQuantity, ProductDetailsRoot, type ProductDetailsRootProps, type ProductDetailsState, type ProductDetailsStatus, ProductDetailsTitle, ProductDetailsVariablesInput, ProductGridVariablesInput, ProductImage, type ProductImageProps, RelatedProducts, type RelatedProductsProps, SKU, SKUAttributeValue, SKUGroup, SKUGroupAttribute, SKUGroupAttributeValue, SKUGroupSKU, SKUPrice, SkuGroupResult, SkuGroupVariables, SkuGroupsResult, SkuGroupsVariables, SkuResult, SkuVariables, type StorefrontConfig, StorefrontProductAttribute, StorefrontProductAttributeValue, type StorefrontTheme, StringInFilter, type SwatchValue, addToCart, getAvailableInventoryQuantity, getCartSummaryTotals, getImageUrls, getLabeledSkuOptions, getPrimaryImageUrl, getProductAttributes, getProductName, getSingleMatchedSku, getSingleMatchedSkuId, getSkuAttributeValueNames, getStartingCompareAt, inSentence, isOnSale, isProductOnSale, money, useCart, useCartItem, useCommerce, useMoney, useProductCard, useProductDetails, useProductDetailsOption };
|
|
1136
|
+
export { AddToCartButton, type AddToCartButtonProps, AddToCartItemInput, type AddToCartLabelState, type AddedCartItem, ApiError, type CartActionPartProps, CartAddress, CartButton, type CartButtonProps, CartCheckout, CartCheckoutNote, CartClose, CartContinueShopping, CartDescription, CartDiscount, CartDrawer, CartDrawerRoot, type CartDrawerRootProps, CartEmpty, type CartEmptyProps, CartItemImage, CartItemName, CartItemOptions, CartItemPrice, CartItemQuantity, CartItemRemove, CartItemRoot, type CartItemRootProps, type CartItemState, CartItems, type CartItemsProps, CartLineItem, CartLineItemDetails, CartNote, CartNotices, CartOrder, type CartPartProps, CartRoot, type CartRootProps, CartSelectedAddon, CartSelectedAddonValue, CartSelectedOption, CartShippingInfo, type CartState, CartSubtotal, CartSummary, type CartSummaryProps, CartSummaryTotals, CartTax, type CartTextPartProps, CartTitle, Catalog, CatalogEmpty, type CatalogEmptyProps, CatalogHeader, type CatalogHeaderProps, CatalogPagination, type CatalogPartProps, CatalogProducts, type CatalogProductsProps, type CatalogProps, CatalogRoot, type CatalogRootProps, CatalogSummary, type CommerceContextValue, type CommerceErrorCode, type CommerceEvent, type CommerceOperation, CommerceProvider, type CommerceProviderProps, CommerceStatus, CommerceStorefront, Connection, ConnectionEdge, DraftOrderContext, type GetSwatch, InventoryCount, LabelFilter, LineItemTotals, MediaObject, type MessageValues, Money, OrderTotals, PageInfo, type PartLabel, PriceRange, ProductCard, ProductCardAction, type ProductCardActionLabelState, type ProductCardActionProps, ProductCardBadge, ProductCardDescription, ProductCardImage, type ProductCardPartProps, ProductCardPrice, type ProductCardProps, ProductCardRoot, type ProductCardRootProps, type ProductCardState, ProductCardSwatches, ProductCardTitle, ProductDetails, ProductDetailsAddToCart, type ProductDetailsAddToCartProps, ProductDetailsAvailability, ProductDetailsBackLink, type ProductDetailsBackLinkProps, ProductDetailsBadge, ProductDetailsDescription, type ProductDetailsErrorState, ProductDetailsGallery, ProductDetailsOption, type ProductDetailsOptionProps, type ProductDetailsOptionState, type ProductDetailsOptionValueState, ProductDetailsOptions, type ProductDetailsPartProps, ProductDetailsPrice, ProductDetailsPurchase, ProductDetailsPurchaseStatus, ProductDetailsQuantity, ProductDetailsRoot, type ProductDetailsRootProps, type ProductDetailsState, type ProductDetailsStatus, ProductDetailsTitle, ProductDetailsVariablesInput, ProductGridVariablesInput, ProductImage, type ProductImageProps, RelatedProducts, type RelatedProductsProps, SKU, SKUAttributeValue, SKUGroup, SKUGroupAttribute, SKUGroupAttributeValue, SKUGroupSKU, SKUPrice, SkuGroupResult, SkuGroupVariables, SkuGroupsResult, SkuGroupsVariables, SkuResult, SkuVariables, type StorefrontConfig, type StorefrontMessage, type StorefrontMessageKey, type StorefrontMessages, StorefrontProductAttribute, StorefrontProductAttributeValue, type StorefrontTheme, StringInFilter, type SwatchValue, addToCart, enUS, formatMessage, getAvailableInventoryQuantity, getCartSummaryTotals, getImageUrls, getLabeledSkuOptions, getPrimaryImageUrl, getProductAttributes, getProductName, getSingleMatchedSku, getSingleMatchedSkuId, getSkuAttributeValueNames, getStartingCompareAt, inSentence, isOnSale, isProductOnSale, money, moneyRange, useCart, useCartItem, useCommerce, useMessage, useMoney, useMoneyRange, useProductCard, useProductDetails, useProductDetailsOption };
|