@godaddy/gd-commerce-storefront 0.6.0 → 0.8.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/dist/index.d.ts CHANGED
@@ -304,6 +304,23 @@ declare function getPrimaryImageUrl(item: MediaObjectContainer | null | undefine
304
304
  declare function getProductAttributes(skuGroup: SKUGroup | null | undefined): StorefrontProductAttribute[];
305
305
  /** The product's display name: its label, then its name. */
306
306
  declare function getProductName(skuGroup: SKUGroup): string;
307
+ /** Lowercases a label for use mid-sentence, leaving acronyms alone: "Size" becomes "size", "US Size" stays. */
308
+ declare const inSentence: (label: string) => string;
309
+ /** Whether `compareAt` is above `price`, so the price is a sale price. */
310
+ declare function isOnSale(price: number | null | undefined, compareAt: number | null | undefined): boolean;
311
+ /**
312
+ * Whether some SKU's compare-at price is above that SKU's own price. Without every SKU's price, only a product whose
313
+ * lowest compare-at price is above its highest price is certainly on sale, so other products show no badge.
314
+ */
315
+ declare function isProductOnSale(product: SKUGroup | null | undefined): boolean;
316
+ /**
317
+ * The compare-at price that belongs with the product's starting price, so a struck-through price never pairs one
318
+ * SKU's price with another SKU's compare-at price. With every SKU and its price loaded, the cheapest SKUs must share
319
+ * one compare-at price above their price. Otherwise the product needs a single price and a single compare-at price.
320
+ */
321
+ declare function getStartingCompareAt(product: SKUGroup | null | undefined): number | null;
322
+ /** The SKU's attribute value names, or `null` when the response does not include them. */
323
+ declare function getSkuAttributeValueNames(sku: SKU | null | undefined): string[] | null;
307
324
  //#endregion
308
325
  //#region src/part.d.ts
309
326
  /** Replacement content for a part's text: content, or a function of the part's state. */
@@ -311,12 +328,18 @@ type PartLabel<State> = ReactNode | ((state: State) => ReactNode);
311
328
  //#endregion
312
329
  //#region src/cart.d.ts
313
330
  interface CartButtonProps {
314
- /** Replaces the label and count. A function receives the item count. Keep the count in the label. */
331
+ /**
332
+ * Replaces the bag icon and count badge with a visible label. A function receives the item count. Keep the count in
333
+ * the label.
334
+ */
315
335
  children?: PartLabel<{
316
336
  itemCount: number;
317
337
  }>;
318
338
  }
319
- /** Opens the cart drawer and shows the item count. */
339
+ /**
340
+ * Opens the cart drawer: a bag icon with a count badge that pops when the count changes. Its accessible name is
341
+ * "Cart, 2 items". With `children`, a labeled button instead.
342
+ */
320
343
  declare function CartButton({
321
344
  children
322
345
  }?: CartButtonProps): ReactElement;
@@ -334,12 +357,7 @@ interface AddToCartButtonProps {
334
357
  /** Replaces the label. A function receives `busy` and `soldOut`; the button keeps its rules either way. */
335
358
  children?: PartLabel<AddToCartLabelState>;
336
359
  }
337
- declare function AddToCartButton({
338
- sku,
339
- name,
340
- quantity,
341
- children
342
- }: AddToCartButtonProps): ReactElement;
360
+ declare function AddToCartButton(props: AddToCartButtonProps): ReactElement;
343
361
  //#endregion
344
362
  //#region src/cart-state.d.ts
345
363
  /** One cart line, for custom cart parts. */
@@ -417,7 +435,10 @@ declare function CartDrawerRoot({
417
435
  children,
418
436
  className
419
437
  }: CartDrawerRootProps): ReactElement;
420
- /** "Your cart", or "Sample cart" before a store is connected, as an H2. In the drawer it names the dialog. */
438
+ /**
439
+ * "Your cart", or "Sample cart" before a store is connected, as an H2, with the item count once there are items.
440
+ * In the drawer it names the dialog.
441
+ */
421
442
  declare function CartTitle({
422
443
  className,
423
444
  children
@@ -467,7 +488,7 @@ declare function CartItemImage({
467
488
  declare function CartItemName({
468
489
  className
469
490
  }: CartPartProps): ReactElement;
470
- /** The selected options, one per line, such as "Color: Blue". Renders nothing without options. */
491
+ /** The selected options on one line, such as "Color: Blue · Size: M". Renders nothing without options. */
471
492
  declare function CartItemOptions({
472
493
  className
473
494
  }: CartPartProps): ReactElement | null;
@@ -506,7 +527,7 @@ declare function CartSubtotal({
506
527
  className
507
528
  }: CartPartProps): ReactElement | null;
508
529
  /**
509
- * "Shipping, taxes, and discounts are calculated at checkout." Has the stable
530
+ * A row under the subtotal: "Shipping, taxes & discounts", "Calculated at checkout". Has the stable
510
531
  * `commerce-cart-checkout-adjustments-note` class. Renders nothing for samples or an empty cart.
511
532
  */
512
533
  declare function CartCheckoutNote({
@@ -520,6 +541,14 @@ declare function CartCheckout({
520
541
  className,
521
542
  children
522
543
  }: CartActionPartProps): ReactElement | null;
544
+ /**
545
+ * "Continue shopping": closes the drawer, or on a cart page links to the catalog. Renders nothing for an empty cart,
546
+ * whose `CartEmpty` links to the catalog.
547
+ */
548
+ declare function CartContinueShopping({
549
+ className,
550
+ children
551
+ }: CartTextPartProps): ReactElement | null;
523
552
  /** The packaged cart drawer. Compose `CartDrawerRoot` and the cart parts for a custom drawer. */
524
553
  declare function CartDrawer(): ReactElement;
525
554
  //#endregion
@@ -588,7 +617,9 @@ declare function CatalogEmpty({
588
617
  className,
589
618
  children
590
619
  }: CatalogEmptyProps): ReactElement | null;
591
- /** First-page and next-page buttons. Renders nothing for samples, which have one page. */
620
+ /**
621
+ * First-page and next-page buttons. Renders nothing when there is only one page, including for samples.
622
+ */
592
623
  declare function CatalogPagination({
593
624
  className
594
625
  }: CatalogPartProps): ReactElement | null;
@@ -619,6 +650,8 @@ interface CommerceContextValue {
619
650
  connectionError: string | null;
620
651
  retryConnection: () => void;
621
652
  theme: StorefrontTheme;
653
+ /** The host's swatch lookup, or `undefined` when options render as buttons. */
654
+ getSwatch: GetSwatch | undefined;
622
655
  config: StorefrontConfig;
623
656
  /** The BCP 47 locale that prices are formatted in, such as `en-US`. */
624
657
  locale: string;
@@ -654,13 +687,33 @@ type StorefrontTheme = CSSProperties & {
654
687
  '--commerce-surface'?: string;
655
688
  '--commerce-text'?: string;
656
689
  '--commerce-radius'?: string;
690
+ /** Fills the Sale badge. Defaults to a red that white text reads on. */
691
+ '--commerce-sale'?: string;
692
+ /** Text on the Sale badge. Defaults to white. */
693
+ '--commerce-on-sale'?: string;
657
694
  };
695
+ /** The attribute value a host can give a swatch, such as `{ attribute: 'color', name: 'forest', label: 'Forest' }`. */
696
+ interface SwatchValue {
697
+ readonly attribute: string;
698
+ readonly name: string;
699
+ readonly label: string;
700
+ }
701
+ /**
702
+ * Returns a CSS `background` for a value, such as `'#3f6352'` or `'url(/swatches/linen.png) center / cover'`, or
703
+ * nothing for no swatch. An attribute shows swatches only when every value has one.
704
+ */
705
+ type GetSwatch = (value: SwatchValue) => string | null | undefined;
658
706
  interface CommerceProviderProps {
659
707
  children: ReactNode;
660
708
  catalogPath?: string;
661
709
  productPath?: string;
662
710
  /** Applied to storefront surfaces and the portalled cart drawer. */
663
711
  theme?: StorefrontTheme;
712
+ /**
713
+ * Swatches for attribute values, off by default. Attributes whose values all have a swatch render as swatches on
714
+ * the product page, and cards show them as dots. See `GetSwatch`.
715
+ */
716
+ getSwatch?: GetSwatch;
664
717
  /** Set only when your server has enabled checkout and this return route exists. */
665
718
  checkoutSuccessPath?: string;
666
719
  /**
@@ -724,6 +777,7 @@ declare function CommerceProvider({
724
777
  productPath,
725
778
  checkoutSuccessPath,
726
779
  theme,
780
+ getSwatch,
727
781
  locale,
728
782
  onItemAdded,
729
783
  onEvent
@@ -796,10 +850,24 @@ declare function ProductCardTitle({
796
850
  declare function ProductCardDescription({
797
851
  className
798
852
  }: ProductCardPartProps): ReactElement | null;
799
- /** The product's price, or its price range when variants differ. */
853
+ /**
854
+ * "Sale" when some SKU's compare-at price is above that SKU's price. Without SKU prices, as in the catalog list, only
855
+ * when the lowest compare-at price is above the highest price. Renders nothing otherwise, or for samples.
856
+ */
857
+ declare function ProductCardBadge({
858
+ className
859
+ }: ProductCardPartProps): ReactElement | null;
860
+ /** The product's price, or its price range when variants differ. A single price on sale shows its compare-at price. */
800
861
  declare function ProductCardPrice({
801
862
  className
802
863
  }: ProductCardPartProps): ReactElement;
864
+ /**
865
+ * Dots for the first attribute whose values all have a swatch from the provider's `getSwatch`, such as colors.
866
+ * Renders nothing without `getSwatch`, for samples, or when no attribute has swatches.
867
+ */
868
+ declare function ProductCardSwatches({
869
+ className
870
+ }: ProductCardPartProps): ReactElement | null;
803
871
  /** What a card action label can depend on. Only `add` can be busy or sold out. */
804
872
  interface ProductCardActionLabelState extends AddToCartLabelState {
805
873
  /** `add` adds directly; `choose-options` and `view-product` link to the product page. */
@@ -850,11 +918,20 @@ interface ProductDetailsOptionValueState {
850
918
  readonly name: string;
851
919
  readonly label: string;
852
920
  readonly selected: boolean;
921
+ /**
922
+ * Every SKU with this value and the other selected values has tracked stock used up. `false` when that is not
923
+ * known, such as for a product with more SKUs than the page loads.
924
+ */
925
+ readonly soldOut: boolean;
926
+ /** The CSS background from the provider's `getSwatch`, or `null`. */
927
+ readonly swatch: string | null;
853
928
  }
854
929
  interface ProductDetailsOptionState {
855
930
  readonly name: string;
856
931
  readonly label: string;
857
932
  readonly selected: string | null;
933
+ /** Nothing is selected and the shopper pressed add, so the control should show an error. */
934
+ readonly missing: boolean;
858
935
  readonly values: readonly ProductDetailsOptionValueState[];
859
936
  /** Accepts only this attribute's own value names, or `null` to clear. Other values are ignored. */
860
937
  readonly select: (value: string | null) => void;
@@ -899,7 +976,7 @@ declare function ProductDetailsRoot({
899
976
  /** The packaged product page for `${productPath}/:productId`. Compose the parts for a custom layout. */
900
977
  declare function ProductDetails(): ReactElement;
901
978
  interface ProductDetailsBackLinkProps extends ProductDetailsPartProps {
902
- /** Replaces "← Back to shop". */
979
+ /** Replaces the chevron and "Back to shop". */
903
980
  children?: ReactNode;
904
981
  }
905
982
  /** A link to the catalog. */
@@ -911,11 +988,21 @@ declare function ProductDetailsBackLink({
911
988
  declare function ProductDetailsGallery({
912
989
  className
913
990
  }: ProductDetailsPartProps): ReactElement;
991
+ /**
992
+ * "Sale" when the verified SKU's compare-at price is above its price, or, before then, when some SKU's is. Renders
993
+ * nothing otherwise.
994
+ */
995
+ declare function ProductDetailsBadge({
996
+ className
997
+ }: ProductDetailsPartProps): ReactElement | null;
914
998
  /** The product name as the page's H1. */
915
999
  declare function ProductDetailsTitle({
916
1000
  className
917
1001
  }: ProductDetailsPartProps): ReactElement;
918
- /** The verified SKU's price and compare-at price, or the product's starting price. */
1002
+ /**
1003
+ * The verified SKU's price and compare-at price, or the product's starting price. Before a SKU is verified, the
1004
+ * compare-at price shows only when it belongs to the cheapest SKUs, so it never pairs prices from different SKUs.
1005
+ */
919
1006
  declare function ProductDetailsPrice({
920
1007
  className
921
1008
  }: ProductDetailsPartProps): ReactElement;
@@ -925,11 +1012,11 @@ declare function ProductDetailsDescription({
925
1012
  }: ProductDetailsPartProps): ReactElement;
926
1013
  //#endregion
927
1014
  //#region src/product-purchase.d.ts
928
- /** The packaged purchase area: options, status, availability, quantity, and add to cart. */
1015
+ /** The packaged purchase area: options, status, quantity, add to cart, and availability. */
929
1016
  declare function ProductDetailsPurchase({
930
1017
  className
931
1018
  }: ProductDetailsPartProps): ReactElement;
932
- /** A select for every product attribute, or the SKU list for products without attributes. */
1019
+ /** A control for every product attribute, or the SKU list for products without attributes. */
933
1020
  declare function ProductDetailsOptions({
934
1021
  className
935
1022
  }: ProductDetailsPartProps): ReactElement | null;
@@ -937,12 +1024,18 @@ interface ProductDetailsOptionProps extends ProductDetailsPartProps {
937
1024
  /** The attribute `name`, such as `color`. Renders nothing when the product has no such attribute. */
938
1025
  attribute: string;
939
1026
  }
940
- /** A select for one product attribute. Use `useProductDetailsOption` for swatches or other custom controls. */
1027
+ /**
1028
+ * One product attribute: buttons, swatches when the provider's `getSwatch` gives every value one, or a select for
1029
+ * more than eight values. Use `useProductDetailsOption` for other custom controls.
1030
+ */
941
1031
  declare function ProductDetailsOption({
942
1032
  attribute,
943
1033
  className
944
1034
  }: ProductDetailsOptionProps): ReactElement | null;
945
- /** The single message explaining why the selection is not yet purchasable. Renders nothing when ready. */
1035
+ /**
1036
+ * The single message explaining why the selection is not purchasable. Renders nothing when ready, or before every
1037
+ * option is chosen, when the add button names the next one.
1038
+ */
946
1039
  declare function ProductDetailsPurchaseStatus({
947
1040
  className
948
1041
  }: ProductDetailsPartProps): ReactElement | null;
@@ -950,21 +1043,55 @@ declare function ProductDetailsPurchaseStatus({
950
1043
  declare function ProductDetailsAvailability({
951
1044
  className
952
1045
  }: ProductDetailsPartProps): ReactElement | null;
953
- /** Quantity for the verified SKU, with a message when it cannot be added. Renders nothing until a SKU is verified. */
1046
+ /**
1047
+ * A quantity stepper, capped at the verified SKU's stock, with a message when a typed quantity cannot be added.
1048
+ * Disabled while the verified SKU is sold out.
1049
+ */
954
1050
  declare function ProductDetailsQuantity({
955
1051
  className
956
- }: ProductDetailsPartProps): ReactElement | null;
1052
+ }: ProductDetailsPartProps): ReactElement;
957
1053
  interface ProductDetailsAddToCartProps extends ProductDetailsPartProps {
958
1054
  /** Replaces the button label. A function receives `busy` and `soldOut`; the button keeps its rules either way. */
959
1055
  children?: PartLabel<AddToCartLabelState>;
960
1056
  }
961
- /** Adds the verified SKU and quantity. While disabled, its accessible description says why. */
1057
+ /**
1058
+ * Adds the verified SKU and quantity, labeled with the total, such as "Add to cart · $64.00". Until every option is
1059
+ * chosen it names the next one, such as "Select size", and pressing it marks the missing options and focuses the
1060
+ * first. While the selection is checked or unavailable it is disabled, and its accessible description says why.
1061
+ */
962
1062
  declare function ProductDetailsAddToCart({
963
1063
  className,
964
1064
  children
965
1065
  }: ProductDetailsAddToCartProps): ReactElement;
966
1066
  //#endregion
1067
+ //#region src/related-products.d.ts
1068
+ interface RelatedProductsProps {
1069
+ /** The product to leave out. Defaults to the route's `:productId` parameter. */
1070
+ productId?: string;
1071
+ /** The H2. Defaults to "You may also like". */
1072
+ title?: ReactNode;
1073
+ /** The most products to show, a whole number from 1 to 24. Defaults to 4. */
1074
+ limit?: number;
1075
+ /** Added to the root `<section>`. */
1076
+ className?: string;
1077
+ /** One card, rendered for every product. Defaults to the packaged card. */
1078
+ children?: ReactNode;
1079
+ }
1080
+ /**
1081
+ * Other products from the catalog's first page, leaving out the current one. Optional and separate from
1082
+ * `ProductDetails`: place it wherever it fits, such as after the product page. There is no related-products API, so
1083
+ * the products are the catalog's first ones. Renders nothing until they load, when none are left, if the request
1084
+ * fails, or while no store is connected.
1085
+ */
1086
+ declare function RelatedProducts({
1087
+ productId: productIdProp,
1088
+ title,
1089
+ limit,
1090
+ className,
1091
+ children
1092
+ }: RelatedProductsProps): ReactElement | null;
1093
+ //#endregion
967
1094
  //#region src/storefront-surface.d.ts
968
1095
  declare function CommerceStatus(): ReactElement | null;
969
1096
  //#endregion
970
- export { AddToCartButton, type AddToCartButtonProps, AddToCartItemInput, type AddToCartLabelState, type AddedCartItem, ApiError, type CartActionPartProps, CartAddress, CartButton, type CartButtonProps, CartCheckout, CartCheckoutNote, CartClose, 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, InventoryCount, LabelFilter, LineItemTotals, MediaObject, Money, OrderTotals, PageInfo, type PartLabel, PriceRange, ProductCard, ProductCardAction, type ProductCardActionLabelState, type ProductCardActionProps, ProductCardDescription, ProductCardImage, type ProductCardPartProps, ProductCardPrice, type ProductCardProps, ProductCardRoot, type ProductCardRootProps, type ProductCardState, ProductCardTitle, ProductDetails, ProductDetailsAddToCart, type ProductDetailsAddToCartProps, ProductDetailsAvailability, ProductDetailsBackLink, type ProductDetailsBackLinkProps, 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, SKU, SKUAttributeValue, SKUGroup, SKUGroupAttribute, SKUGroupAttributeValue, SKUGroupSKU, SKUPrice, SkuGroupResult, SkuGroupVariables, SkuGroupsResult, SkuGroupsVariables, SkuResult, SkuVariables, type StorefrontConfig, StorefrontProductAttribute, StorefrontProductAttributeValue, type StorefrontTheme, StringInFilter, addToCart, getAvailableInventoryQuantity, getCartSummaryTotals, getImageUrls, getLabeledSkuOptions, getPrimaryImageUrl, getProductAttributes, getProductName, getSingleMatchedSku, getSingleMatchedSkuId, money, useCart, useCartItem, useCommerce, useMoney, useProductCard, useProductDetails, useProductDetailsOption };
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 };