@gfed-medusa/sf-lib-common 1.1.1 → 2.0.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.
Files changed (72) hide show
  1. package/dist/components/breadcrumbs/index.d.ts +4 -6
  2. package/dist/components/breadcrumbs/index.d.ts.map +1 -1
  3. package/dist/components/breadcrumbs/index.js.map +1 -1
  4. package/dist/components/cart-button/index.d.ts +2 -2
  5. package/dist/components/cart-dropdown/index.d.ts +2 -2
  6. package/dist/components/cart-dropdown/index.js +0 -1
  7. package/dist/components/cart-dropdown/index.js.map +1 -1
  8. package/dist/components/cart-mismatch-banner/index.d.ts +2 -2
  9. package/dist/components/delete-button/index.d.ts +2 -2
  10. package/dist/components/delete-button/index.d.ts.map +1 -1
  11. package/dist/components/error-message/index.d.ts +2 -2
  12. package/dist/components/footer/index.d.ts +2 -2
  13. package/dist/components/free-shipping-price-nudge/index.d.ts +2 -2
  14. package/dist/components/interactive-link/index.d.ts +2 -2
  15. package/dist/components/layout-country-select/index.d.ts +2 -2
  16. package/dist/components/line-item-options/index.d.ts +2 -2
  17. package/dist/components/line-item-options/index.d.ts.map +1 -1
  18. package/dist/components/line-item-price/index.d.ts +2 -2
  19. package/dist/components/line-item-price/index.d.ts.map +1 -1
  20. package/dist/components/localized-client-link/index.d.ts +5 -12
  21. package/dist/components/localized-client-link/index.d.ts.map +1 -1
  22. package/dist/components/localized-client-link/index.js +2 -4
  23. package/dist/components/localized-client-link/index.js.map +1 -1
  24. package/dist/components/modal/index.d.ts +2 -2
  25. package/dist/components/modal/index.d.ts.map +1 -1
  26. package/dist/components/nav/index.d.ts +2 -2
  27. package/dist/components/portable-text/index.d.ts +2 -2
  28. package/dist/components/preview-price/index.d.ts +2 -2
  29. package/dist/components/preview-price/index.d.ts.map +1 -1
  30. package/dist/components/product-card/index.d.ts +2 -2
  31. package/dist/components/product-card/index.d.ts.map +1 -1
  32. package/dist/components/product-card/index.js +3 -4
  33. package/dist/components/product-card/index.js.map +1 -1
  34. package/dist/components/product-preview/index.d.ts +2 -2
  35. package/dist/components/product-preview/index.d.ts.map +1 -1
  36. package/dist/components/search-modal/index.d.ts +2 -2
  37. package/dist/components/search-modal/index.d.ts.map +1 -1
  38. package/dist/components/search-modal/index.js +1 -2
  39. package/dist/components/search-modal/index.js.map +1 -1
  40. package/dist/components/side-menu/index.d.ts +2 -2
  41. package/dist/components/side-menu/index.d.ts.map +1 -1
  42. package/dist/components/submit-button/index.d.ts +2 -2
  43. package/dist/components/submit-button/index.d.ts.map +1 -1
  44. package/dist/lib/context/apollo-context.d.ts +2 -2
  45. package/dist/lib/context/modal-context.d.ts +2 -2
  46. package/dist/lib/data/cart.d.ts.map +1 -1
  47. package/dist/lib/data/cookies.d.ts +2 -1
  48. package/dist/lib/data/cookies.d.ts.map +1 -1
  49. package/dist/lib/data/cookies.js +9 -1
  50. package/dist/lib/data/cookies.js.map +1 -1
  51. package/dist/lib/gql/apollo-client.js +2 -1
  52. package/dist/lib/gql/apollo-client.js.map +1 -1
  53. package/dist/lib/gql/fragments/cart.d.ts +9 -9
  54. package/dist/lib/gql/fragments/cart.d.ts.map +1 -1
  55. package/dist/lib/gql/fragments/customer.d.ts +3 -3
  56. package/dist/lib/gql/fragments/customer.d.ts.map +1 -1
  57. package/dist/lib/gql/fragments/product.d.ts +8 -8
  58. package/dist/lib/gql/fragments/product.d.ts.map +1 -1
  59. package/dist/lib/gql/queries/cart.d.ts +2 -2
  60. package/dist/lib/gql/queries/collections.d.ts +2 -2
  61. package/dist/lib/gql/queries/collections.d.ts.map +1 -1
  62. package/dist/lib/gql/queries/customer.d.ts +2 -2
  63. package/dist/lib/gql/queries/footer.d.ts +2 -2
  64. package/dist/lib/gql/queries/footer.d.ts.map +1 -1
  65. package/dist/lib/gql/queries/footer.js +1 -55
  66. package/dist/lib/gql/queries/footer.js.map +1 -1
  67. package/dist/lib/gql/queries/product.d.ts +3 -3
  68. package/dist/lib/gql/queries/product.d.ts.map +1 -1
  69. package/dist/lib/utils/env.js +1 -1
  70. package/dist/lib/utils/env.js.map +1 -1
  71. package/dist/types/graphql.d.ts.map +1 -1
  72. package/package.json +2 -2
@@ -1,12 +1,10 @@
1
- import * as react0 from "react";
2
- import * as lucide_react0 from "lucide-react";
3
1
  import * as react_jsx_runtime0 from "react/jsx-runtime";
4
2
 
5
3
  //#region src/components/breadcrumbs/index.d.ts
6
- declare const SEPARATOR_ICONS: {
7
- readonly verticalLine: react0.ForwardRefExoticComponent<Omit<lucide_react0.LucideProps, "ref"> & react0.RefAttributes<SVGSVGElement>>;
8
- readonly slash: react0.ForwardRefExoticComponent<Omit<lucide_react0.LucideProps, "ref"> & react0.RefAttributes<SVGSVGElement>>;
9
- };
4
+ declare const SEPARATOR_ICONS: Record<string, React.ComponentType<{
5
+ size?: number;
6
+ className?: string;
7
+ }>>;
10
8
  interface BreadcrumbsProps {
11
9
  separatorIcon?: keyof typeof SEPARATOR_ICONS;
12
10
  iconSize?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/components/breadcrumbs/index.tsx"],"sourcesContent":[],"mappings":";;;;;cAiBM;+DAGI,aAAA,CAAA,WAAA;;;UAEA,gBAAA;EALJ,aAAA,CAAA,EAAA,MAGI,OAGqB,eAHrB;EAAA,QAAA,CAAA,EAAA,MAAA;;;iBAiCD,WAAA;;;;GAIN,mBAAgB,kBAAA,CAAA,GAAA,CAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/components/breadcrumbs/index.tsx"],"sourcesContent":[],"mappings":";;;cAiBM,iBAAiB,eAAe,KAAA,CAAM;;;AAwCzB,CAAA,CAAA,CAAA;AAxCU,UAKnB,gBAAA,CAAgB;EA+BjB,aAAA,CAAW,EAAA,MAAA,OA9BW,eA8BX;EAClB,QAAA,CAAA,EAAA,MAAA;EACA,aAAA,CAAA,EAAA,MAAA;;iBAFO,WAAA,CAIN;EAAA,aAAA;EAAA,QAAA;EAAA;AAAA,CAAA,EAAA,gBAAA,CAAA,EAAgB,kBAAA,CAAA,GAAA,CAAA,OAAhB"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["segments: string[]"],"sources":["../../../src/components/breadcrumbs/index.tsx"],"sourcesContent":["'use client';\n\nimport { Fragment } from 'react';\n\nimport { usePathname } from 'next/navigation';\n\nimport { SlashIcon, Tally1 } from 'lucide-react';\n\nimport {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from '@gfed-medusa/sf-lib-ui/components/breadcrumb';\n\nconst SEPARATOR_ICONS = {\n verticalLine: Tally1,\n slash: SlashIcon,\n} as const;\n\ninterface BreadcrumbsProps {\n separatorIcon?: keyof typeof SEPARATOR_ICONS;\n iconSize?: number;\n iconClassName?: string;\n}\n\nconst formatSegmentLabel = (segment: string): string =>\n segment.charAt(0).toUpperCase() + segment.slice(1).replace(/-/g, ' ');\n\nconst createBreadcrumbItems = (segments: string[]) => [\n { label: 'Home', href: '/' },\n ...segments.map((segment, index) => ({\n href: '/' + segments.slice(0, index + 1).join('/'),\n label: formatSegmentLabel(segment),\n })),\n];\n\n// Helper function to check if a string is a locale code (e.g., 'en', 'en-US')\nconst isLocaleCode = (segment: string): boolean =>\n /^[a-zA-Z]{2}(-[a-zA-Z]{2})?$/.test(segment);\n\nconst getPathSegments = (pathname: string): string[] => {\n const segments: string[] = pathname.split('/').filter(Boolean);\n\n if (segments.length > 0 && isLocaleCode(segments[0] ?? '')) {\n segments.shift();\n }\n\n return segments;\n};\n\nfunction Breadcrumbs({\n iconClassName,\n iconSize,\n separatorIcon,\n}: BreadcrumbsProps) {\n const pathname = usePathname();\n const pathSegments = getPathSegments(pathname);\n const breadcrumbItems = createBreadcrumbItems(pathSegments);\n const SeparatorIcon = separatorIcon ? SEPARATOR_ICONS[separatorIcon] : null;\n\n return (\n <Breadcrumb className=\"mt-3\">\n <BreadcrumbList className=\"lg:gap-6\">\n {breadcrumbItems.map((item, index) => {\n const isLast = index === breadcrumbItems.length - 1;\n\n return (\n <Fragment key={item.href}>\n <BreadcrumbItem className=\"text-sm\">\n {isLast ? (\n <BreadcrumbPage>{item.label}</BreadcrumbPage>\n ) : (\n <BreadcrumbLink href={item.href}>{item.label}</BreadcrumbLink>\n )}\n </BreadcrumbItem>\n {!isLast && (\n <BreadcrumbSeparator>\n {SeparatorIcon && (\n <SeparatorIcon size={iconSize} className={iconClassName} />\n )}\n </BreadcrumbSeparator>\n )}\n </Fragment>\n );\n })}\n </BreadcrumbList>\n </Breadcrumb>\n );\n}\n\nexport { Breadcrumbs };\n"],"mappings":";;;;;;;;;AAiBA,MAAM,kBAAkB;CACtB,cAAc;CACd,OAAO;CACR;AAQD,MAAM,sBAAsB,YAC1B,QAAQ,OAAO,EAAE,CAAC,aAAa,GAAG,QAAQ,MAAM,EAAE,CAAC,QAAQ,MAAM,IAAI;AAEvE,MAAM,yBAAyB,aAAuB,CACpD;CAAE,OAAO;CAAQ,MAAM;CAAK,EAC5B,GAAG,SAAS,KAAK,SAAS,WAAW;CACnC,MAAM,MAAM,SAAS,MAAM,GAAG,QAAQ,EAAE,CAAC,KAAK,IAAI;CAClD,OAAO,mBAAmB,QAAQ;CACnC,EAAE,CACJ;AAGD,MAAM,gBAAgB,YACpB,+BAA+B,KAAK,QAAQ;AAE9C,MAAM,mBAAmB,aAA+B;CACtD,MAAMA,WAAqB,SAAS,MAAM,IAAI,CAAC,OAAO,QAAQ;AAE9D,KAAI,SAAS,SAAS,KAAK,aAAa,SAAS,MAAM,GAAG,CACxD,UAAS,OAAO;AAGlB,QAAO;;AAGT,SAAS,YAAY,EACnB,eACA,UACA,iBACmB;CAGnB,MAAM,kBAAkB,sBADH,gBADJ,aAAa,CACgB,CACa;CAC3D,MAAM,gBAAgB,gBAAgB,gBAAgB,iBAAiB;AAEvE,QACE,oBAAC;EAAW,WAAU;YACpB,oBAAC;GAAe,WAAU;aACvB,gBAAgB,KAAK,MAAM,UAAU;IACpC,MAAM,SAAS,UAAU,gBAAgB,SAAS;AAElD,WACE,qBAAC,uBACC,oBAAC;KAAe,WAAU;eACvB,SACC,oBAAC,4BAAgB,KAAK,QAAuB,GAE7C,oBAAC;MAAe,MAAM,KAAK;gBAAO,KAAK;OAAuB;MAEjD,EAChB,CAAC,UACA,oBAAC,iCACE,iBACC,oBAAC;KAAc,MAAM;KAAU,WAAW;MAAiB,GAEzC,KAbX,KAAK,KAeT;KAEb;IACa;GACN"}
1
+ {"version":3,"file":"index.js","names":["SEPARATOR_ICONS: Record<string, React.ComponentType<{ size?: number; className?: string }>>","segments: string[]"],"sources":["../../../src/components/breadcrumbs/index.tsx"],"sourcesContent":["'use client';\n\nimport { Fragment } from 'react';\n\nimport { usePathname } from 'next/navigation';\n\nimport { SlashIcon, Tally1 } from 'lucide-react';\n\nimport {\n Breadcrumb,\n BreadcrumbItem,\n BreadcrumbLink,\n BreadcrumbList,\n BreadcrumbPage,\n BreadcrumbSeparator,\n} from '@gfed-medusa/sf-lib-ui/components/breadcrumb';\n\nconst SEPARATOR_ICONS: Record<string, React.ComponentType<{ size?: number; className?: string }>> = {\n verticalLine: Tally1,\n slash: SlashIcon,\n};\n\ninterface BreadcrumbsProps {\n separatorIcon?: keyof typeof SEPARATOR_ICONS;\n iconSize?: number;\n iconClassName?: string;\n}\n\nconst formatSegmentLabel = (segment: string): string =>\n segment.charAt(0).toUpperCase() + segment.slice(1).replace(/-/g, ' ');\n\nconst createBreadcrumbItems = (segments: string[]) => [\n { label: 'Home', href: '/' },\n ...segments.map((segment, index) => ({\n href: '/' + segments.slice(0, index + 1).join('/'),\n label: formatSegmentLabel(segment),\n })),\n];\n\n// Helper function to check if a string is a locale code (e.g., 'en', 'en-US')\nconst isLocaleCode = (segment: string): boolean =>\n /^[a-zA-Z]{2}(-[a-zA-Z]{2})?$/.test(segment);\n\nconst getPathSegments = (pathname: string): string[] => {\n const segments: string[] = pathname.split('/').filter(Boolean);\n\n if (segments.length > 0 && isLocaleCode(segments[0] ?? '')) {\n segments.shift();\n }\n\n return segments;\n};\n\nfunction Breadcrumbs({\n iconClassName,\n iconSize,\n separatorIcon,\n}: BreadcrumbsProps) {\n const pathname = usePathname();\n const pathSegments = getPathSegments(pathname);\n const breadcrumbItems = createBreadcrumbItems(pathSegments);\n const SeparatorIcon = separatorIcon ? SEPARATOR_ICONS[separatorIcon] : null;\n\n return (\n <Breadcrumb className=\"mt-3\">\n <BreadcrumbList className=\"lg:gap-6\">\n {breadcrumbItems.map((item, index) => {\n const isLast = index === breadcrumbItems.length - 1;\n\n return (\n <Fragment key={item.href}>\n <BreadcrumbItem className=\"text-sm\">\n {isLast ? (\n <BreadcrumbPage>{item.label}</BreadcrumbPage>\n ) : (\n <BreadcrumbLink href={item.href}>{item.label}</BreadcrumbLink>\n )}\n </BreadcrumbItem>\n {!isLast && (\n <BreadcrumbSeparator>\n {SeparatorIcon && (\n <SeparatorIcon size={iconSize} className={iconClassName} />\n )}\n </BreadcrumbSeparator>\n )}\n </Fragment>\n );\n })}\n </BreadcrumbList>\n </Breadcrumb>\n );\n}\n\nexport { Breadcrumbs };\n"],"mappings":";;;;;;;;;AAiBA,MAAMA,kBAA8F;CAClG,cAAc;CACd,OAAO;CACR;AAQD,MAAM,sBAAsB,YAC1B,QAAQ,OAAO,EAAE,CAAC,aAAa,GAAG,QAAQ,MAAM,EAAE,CAAC,QAAQ,MAAM,IAAI;AAEvE,MAAM,yBAAyB,aAAuB,CACpD;CAAE,OAAO;CAAQ,MAAM;CAAK,EAC5B,GAAG,SAAS,KAAK,SAAS,WAAW;CACnC,MAAM,MAAM,SAAS,MAAM,GAAG,QAAQ,EAAE,CAAC,KAAK,IAAI;CAClD,OAAO,mBAAmB,QAAQ;CACnC,EAAE,CACJ;AAGD,MAAM,gBAAgB,YACpB,+BAA+B,KAAK,QAAQ;AAE9C,MAAM,mBAAmB,aAA+B;CACtD,MAAMC,WAAqB,SAAS,MAAM,IAAI,CAAC,OAAO,QAAQ;AAE9D,KAAI,SAAS,SAAS,KAAK,aAAa,SAAS,MAAM,GAAG,CACxD,UAAS,OAAO;AAGlB,QAAO;;AAGT,SAAS,YAAY,EACnB,eACA,UACA,iBACmB;CAGnB,MAAM,kBAAkB,sBADH,gBADJ,aAAa,CACgB,CACa;CAC3D,MAAM,gBAAgB,gBAAgB,gBAAgB,iBAAiB;AAEvE,QACE,oBAAC;EAAW,WAAU;YACpB,oBAAC;GAAe,WAAU;aACvB,gBAAgB,KAAK,MAAM,UAAU;IACpC,MAAM,SAAS,UAAU,gBAAgB,SAAS;AAElD,WACE,qBAAC,uBACC,oBAAC;KAAe,WAAU;eACvB,SACC,oBAAC,4BAAgB,KAAK,QAAuB,GAE7C,oBAAC;MAAe,MAAM,KAAK;gBAAO,KAAK;OAAuB;MAEjD,EAChB,CAAC,UACA,oBAAC,iCACE,iBACC,oBAAC;KAAc,MAAM;KAAU,WAAW;MAAiB,GAEzC,KAbX,KAAK,KAeT;KAEb;IACa;GACN"}
@@ -1,7 +1,7 @@
1
- import * as react_jsx_runtime8 from "react/jsx-runtime";
1
+ import * as react_jsx_runtime1 from "react/jsx-runtime";
2
2
 
3
3
  //#region src/components/cart-button/index.d.ts
4
- declare function CartButton(): Promise<react_jsx_runtime8.JSX.Element>;
4
+ declare function CartButton(): Promise<react_jsx_runtime1.JSX.Element>;
5
5
  //#endregion
6
6
  export { CartButton };
7
7
  //# sourceMappingURL=index.d.ts.map
@@ -1,12 +1,12 @@
1
1
  import { Cart } from "../../types/graphql.js";
2
- import * as react_jsx_runtime0 from "react/jsx-runtime";
2
+ import * as react_jsx_runtime2 from "react/jsx-runtime";
3
3
 
4
4
  //#region src/components/cart-dropdown/index.d.ts
5
5
  declare const CartDropdown: ({
6
6
  cart: cartState
7
7
  }: {
8
8
  cart?: Cart | null;
9
- }) => react_jsx_runtime0.JSX.Element;
9
+ }) => react_jsx_runtime2.JSX.Element;
10
10
  //#endregion
11
11
  export { CartDropdown };
12
12
  //# sourceMappingURL=index.d.ts.map
@@ -158,7 +158,6 @@ const CartDropdown = ({ cart: cartState }) => {
158
158
  })]
159
159
  }), /* @__PURE__ */ jsx(LocalizedClientLink, {
160
160
  href: "/cart",
161
- passHref: true,
162
161
  children: /* @__PURE__ */ jsx(Button, {
163
162
  className: "w-full",
164
163
  size: "large",
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/components/cart-dropdown/index.tsx"],"sourcesContent":["'use client';\n\nimport { Fragment, useEffect, useRef, useState } from 'react';\n\nimport { usePathname } from 'next/navigation';\n\nimport {\n Popover,\n PopoverButton,\n PopoverPanel,\n Transition,\n} from '@headlessui/react';\nimport { Button } from '@medusajs/ui';\n\nimport { convertToLocale } from '@/lib/utils/money';\nimport { Cart } from '@/types/graphql';\n\nimport { DeleteButton } from '../delete-button';\nimport { LineItemOptions } from '../line-item-options';\nimport { LineItemPrice } from '../line-item-price';\nimport { LocalizedClientLink } from '../localized-client-link';\nimport { Thumbnail } from '../thumbnail';\n\nconst CartDropdown = ({ cart: cartState }: { cart?: Cart | null }) => {\n const [activeTimer, setActiveTimer] = useState<NodeJS.Timeout | undefined>(\n undefined\n );\n const [cartDropdownOpen, setCartDropdownOpen] = useState(false);\n\n const open = () => setCartDropdownOpen(true);\n const close = () => setCartDropdownOpen(false);\n\n const totalItems =\n cartState?.items?.reduce((acc, item) => {\n return acc + item.quantity;\n }, 0) || 0;\n\n const subtotal = cartState?.subtotal ?? 0;\n const itemRef = useRef<number>(totalItems || 0);\n\n const timedOpen = () => {\n open();\n\n const timer = setTimeout(close, 5000);\n\n setActiveTimer(timer);\n };\n\n const openAndCancel = () => {\n if (activeTimer) {\n clearTimeout(activeTimer);\n }\n\n open();\n };\n\n // Clean up the timer when the component unmounts\n useEffect(() => {\n return () => {\n if (activeTimer) {\n clearTimeout(activeTimer);\n }\n };\n }, [activeTimer]);\n\n const pathname = usePathname();\n\n // open cart dropdown when modifying the cart items, but only if we're not on the cart page\n useEffect(() => {\n if (itemRef.current !== totalItems && !pathname.includes('/cart')) {\n timedOpen();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [totalItems, itemRef.current]);\n\n return (\n <div\n className=\"z-50 h-full\"\n onMouseEnter={openAndCancel}\n onMouseLeave={close}\n >\n <Popover className=\"relative h-full\">\n <PopoverButton className=\"h-full\">\n <LocalizedClientLink\n className=\"hover:text-ui-fg-base\"\n href=\"/cart\"\n data-testid=\"nav-cart-link\"\n >{`Cart (${totalItems})`}</LocalizedClientLink>\n </PopoverButton>\n <Transition\n show={cartDropdownOpen}\n as={Fragment}\n enter=\"transition ease-out duration-200\"\n enterFrom=\"opacity-0 translate-y-1\"\n enterTo=\"opacity-100 translate-y-0\"\n leave=\"transition ease-in duration-150\"\n leaveFrom=\"opacity-100 translate-y-0\"\n leaveTo=\"opacity-0 translate-y-1\"\n >\n <PopoverPanel\n static\n className=\"text-ui-fg-base small:block absolute top-[calc(100%+1px)] right-0 hidden w-[420px] border-x border-b border-gray-200 bg-white\"\n data-testid=\"nav-cart-dropdown\"\n >\n <div className=\"flex items-center justify-center p-4\">\n <h3 className=\"text-large-semi\">Cart</h3>\n </div>\n {cartState && cartState.items?.length ? (\n <>\n <div className=\"no-scrollbar grid max-h-[402px] grid-cols-1 gap-y-8 overflow-y-scroll p-px px-4\">\n {cartState.items\n .sort((a, b) => {\n return (a.createdAt ?? '') > (b.createdAt ?? '') ? -1 : 1;\n })\n .map((item) => (\n <div\n className=\"grid grid-cols-[122px_1fr] gap-x-4\"\n key={item.id}\n data-testid=\"cart-item\"\n >\n <LocalizedClientLink\n href={`/products/${item.productHandle}`}\n className=\"w-24\"\n >\n <Thumbnail\n thumbnail={item.thumbnail}\n images={item.variant?.product?.images}\n size=\"square\"\n />\n </LocalizedClientLink>\n <div className=\"flex flex-1 flex-col justify-between\">\n <div className=\"flex flex-1 flex-col\">\n <div className=\"flex items-start justify-between\">\n <div className=\"mr-4 flex w-[180px] flex-col overflow-ellipsis whitespace-nowrap\">\n <h3 className=\"text-base-regular overflow-hidden text-ellipsis\">\n <LocalizedClientLink\n href={`/products/${item.productHandle}`}\n data-testid=\"product-link\"\n >\n {item.title}\n </LocalizedClientLink>\n </h3>\n <LineItemOptions\n variant={item.variant}\n data-testid=\"cart-item-variant\"\n data-value={item.variant}\n />\n <span\n data-testid=\"cart-item-quantity\"\n data-value={item.quantity}\n >\n Quantity: {item.quantity}\n </span>\n </div>\n <div className=\"flex justify-end\">\n <LineItemPrice\n item={item}\n style=\"tight\"\n currencyCode={cartState.currencyCode}\n />\n </div>\n </div>\n </div>\n <DeleteButton\n id={item.id}\n className=\"mt-1\"\n data-testid=\"cart-item-remove-button\"\n >\n Remove\n </DeleteButton>\n </div>\n </div>\n ))}\n </div>\n <div className=\"text-small-regular flex flex-col gap-y-4 p-4\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-ui-fg-base font-semibold\">\n Subtotal{' '}\n <span className=\"font-normal\">(excl. taxes)</span>\n </span>\n <span\n className=\"text-large-semi\"\n data-testid=\"cart-subtotal\"\n data-value={subtotal}\n >\n {convertToLocale({\n amount: subtotal,\n currency_code: cartState.currencyCode,\n })}\n </span>\n </div>\n <LocalizedClientLink href=\"/cart\" passHref>\n <Button\n className=\"w-full\"\n size=\"large\"\n data-testid=\"go-to-cart-button\"\n >\n Go to cart\n </Button>\n </LocalizedClientLink>\n </div>\n </>\n ) : (\n <div>\n <div className=\"flex flex-col items-center justify-center gap-y-4 py-16\">\n <div className=\"text-small-regular flex h-6 w-6 items-center justify-center rounded-full bg-gray-900 text-white\">\n <span>0</span>\n </div>\n <span>Your shopping bag is empty.</span>\n <div>\n <LocalizedClientLink href=\"/store\">\n <>\n <span className=\"sr-only\">Go to all products page</span>\n <Button onClick={close}>Explore products</Button>\n </>\n </LocalizedClientLink>\n </div>\n </div>\n </div>\n )}\n </PopoverPanel>\n </Transition>\n </Popover>\n </div>\n );\n};\n\nexport { CartDropdown };\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/components/cart-dropdown/index.tsx"],"sourcesContent":["'use client';\n\nimport { Fragment, useEffect, useRef, useState } from 'react';\n\nimport { usePathname } from 'next/navigation';\n\nimport {\n Popover,\n PopoverButton,\n PopoverPanel,\n Transition,\n} from '@headlessui/react';\nimport { Button } from '@medusajs/ui';\n\nimport { convertToLocale } from '@/lib/utils/money';\nimport { Cart } from '@/types/graphql';\n\nimport { DeleteButton } from '../delete-button';\nimport { LineItemOptions } from '../line-item-options';\nimport { LineItemPrice } from '../line-item-price';\nimport { LocalizedClientLink } from '../localized-client-link';\nimport { Thumbnail } from '../thumbnail';\n\nconst CartDropdown = ({ cart: cartState }: { cart?: Cart | null }) => {\n const [activeTimer, setActiveTimer] = useState<NodeJS.Timeout | undefined>(\n undefined\n );\n const [cartDropdownOpen, setCartDropdownOpen] = useState(false);\n\n const open = () => setCartDropdownOpen(true);\n const close = () => setCartDropdownOpen(false);\n\n const totalItems =\n cartState?.items?.reduce((acc, item) => {\n return acc + item.quantity;\n }, 0) || 0;\n\n const subtotal = cartState?.subtotal ?? 0;\n const itemRef = useRef<number>(totalItems || 0);\n\n const timedOpen = () => {\n open();\n\n const timer = setTimeout(close, 5000);\n\n setActiveTimer(timer);\n };\n\n const openAndCancel = () => {\n if (activeTimer) {\n clearTimeout(activeTimer);\n }\n\n open();\n };\n\n // Clean up the timer when the component unmounts\n useEffect(() => {\n return () => {\n if (activeTimer) {\n clearTimeout(activeTimer);\n }\n };\n }, [activeTimer]);\n\n const pathname = usePathname();\n\n // open cart dropdown when modifying the cart items, but only if we're not on the cart page\n useEffect(() => {\n if (itemRef.current !== totalItems && !pathname.includes('/cart')) {\n timedOpen();\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [totalItems, itemRef.current]);\n\n return (\n <div\n className=\"z-50 h-full\"\n onMouseEnter={openAndCancel}\n onMouseLeave={close}\n >\n <Popover className=\"relative h-full\">\n <PopoverButton className=\"h-full\">\n <LocalizedClientLink\n className=\"hover:text-ui-fg-base\"\n href=\"/cart\"\n data-testid=\"nav-cart-link\"\n >{`Cart (${totalItems})`}</LocalizedClientLink>\n </PopoverButton>\n <Transition\n show={cartDropdownOpen}\n as={Fragment}\n enter=\"transition ease-out duration-200\"\n enterFrom=\"opacity-0 translate-y-1\"\n enterTo=\"opacity-100 translate-y-0\"\n leave=\"transition ease-in duration-150\"\n leaveFrom=\"opacity-100 translate-y-0\"\n leaveTo=\"opacity-0 translate-y-1\"\n >\n <PopoverPanel\n static\n className=\"text-ui-fg-base small:block absolute top-[calc(100%+1px)] right-0 hidden w-[420px] border-x border-b border-gray-200 bg-white\"\n data-testid=\"nav-cart-dropdown\"\n >\n <div className=\"flex items-center justify-center p-4\">\n <h3 className=\"text-large-semi\">Cart</h3>\n </div>\n {cartState && cartState.items?.length ? (\n <>\n <div className=\"no-scrollbar grid max-h-[402px] grid-cols-1 gap-y-8 overflow-y-scroll p-px px-4\">\n {cartState.items\n .sort((a, b) => {\n return (a.createdAt ?? '') > (b.createdAt ?? '') ? -1 : 1;\n })\n .map((item) => (\n <div\n className=\"grid grid-cols-[122px_1fr] gap-x-4\"\n key={item.id}\n data-testid=\"cart-item\"\n >\n <LocalizedClientLink\n href={`/products/${item.productHandle}`}\n className=\"w-24\"\n >\n <Thumbnail\n thumbnail={item.thumbnail}\n images={item.variant?.product?.images}\n size=\"square\"\n />\n </LocalizedClientLink>\n <div className=\"flex flex-1 flex-col justify-between\">\n <div className=\"flex flex-1 flex-col\">\n <div className=\"flex items-start justify-between\">\n <div className=\"mr-4 flex w-[180px] flex-col overflow-ellipsis whitespace-nowrap\">\n <h3 className=\"text-base-regular overflow-hidden text-ellipsis\">\n <LocalizedClientLink\n href={`/products/${item.productHandle}`}\n data-testid=\"product-link\"\n >\n {item.title}\n </LocalizedClientLink>\n </h3>\n <LineItemOptions\n variant={item.variant}\n data-testid=\"cart-item-variant\"\n data-value={item.variant}\n />\n <span\n data-testid=\"cart-item-quantity\"\n data-value={item.quantity}\n >\n Quantity: {item.quantity}\n </span>\n </div>\n <div className=\"flex justify-end\">\n <LineItemPrice\n item={item}\n style=\"tight\"\n currencyCode={cartState.currencyCode}\n />\n </div>\n </div>\n </div>\n <DeleteButton\n id={item.id}\n className=\"mt-1\"\n data-testid=\"cart-item-remove-button\"\n >\n Remove\n </DeleteButton>\n </div>\n </div>\n ))}\n </div>\n <div className=\"text-small-regular flex flex-col gap-y-4 p-4\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-ui-fg-base font-semibold\">\n Subtotal{' '}\n <span className=\"font-normal\">(excl. taxes)</span>\n </span>\n <span\n className=\"text-large-semi\"\n data-testid=\"cart-subtotal\"\n data-value={subtotal}\n >\n {convertToLocale({\n amount: subtotal,\n currency_code: cartState.currencyCode,\n })}\n </span>\n </div>\n <LocalizedClientLink href=\"/cart\">\n <Button\n className=\"w-full\"\n size=\"large\"\n data-testid=\"go-to-cart-button\"\n >\n Go to cart\n </Button>\n </LocalizedClientLink>\n </div>\n </>\n ) : (\n <div>\n <div className=\"flex flex-col items-center justify-center gap-y-4 py-16\">\n <div className=\"text-small-regular flex h-6 w-6 items-center justify-center rounded-full bg-gray-900 text-white\">\n <span>0</span>\n </div>\n <span>Your shopping bag is empty.</span>\n <div>\n <LocalizedClientLink href=\"/store\">\n <>\n <span className=\"sr-only\">Go to all products page</span>\n <Button onClick={close}>Explore products</Button>\n </>\n </LocalizedClientLink>\n </div>\n </div>\n </div>\n )}\n </PopoverPanel>\n </Transition>\n </Popover>\n </div>\n );\n};\n\nexport { CartDropdown };\n"],"mappings":"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"}
@@ -1,11 +1,11 @@
1
1
  import { Cart, Customer } from "../../types/graphql.js";
2
- import * as react_jsx_runtime5 from "react/jsx-runtime";
2
+ import * as react_jsx_runtime3 from "react/jsx-runtime";
3
3
 
4
4
  //#region src/components/cart-mismatch-banner/index.d.ts
5
5
  declare function CartMismatchBanner(props: {
6
6
  customer: Customer;
7
7
  cart: Cart;
8
- }): react_jsx_runtime5.JSX.Element | undefined;
8
+ }): react_jsx_runtime3.JSX.Element | undefined;
9
9
  //#endregion
10
10
  export { CartMismatchBanner };
11
11
  //# sourceMappingURL=index.d.ts.map
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime13 from "react/jsx-runtime";
1
+ import * as react_jsx_runtime4 from "react/jsx-runtime";
2
2
 
3
3
  //#region src/components/delete-button/index.d.ts
4
4
  declare const DeleteButton: ({
@@ -9,7 +9,7 @@ declare const DeleteButton: ({
9
9
  id: string;
10
10
  children?: React.ReactNode;
11
11
  className?: string;
12
- }) => react_jsx_runtime13.JSX.Element;
12
+ }) => react_jsx_runtime4.JSX.Element;
13
13
  //#endregion
14
14
  export { DeleteButton };
15
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/components/delete-button/index.tsx"],"sourcesContent":[],"mappings":";;;cAOM;;;;;;aAMO,KAAA,CAAM;EANb,SAAA,CAAA,EAAA,MAkCL;CAlCqB,EAAA,GAQrB,mBAAA,CAAA,GAAA,CAAA,OARqB"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/components/delete-button/index.tsx"],"sourcesContent":[],"mappings":";;;cAOM;;;;;;aAMO,KAAA,CAAM;EANb,SAAA,CAAA,EAAA,MAkCL;CAlCqB,EAAA,GAQrB,kBAAA,CAAA,GAAA,CAAA,OARqB"}
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime19 from "react/jsx-runtime";
1
+ import * as react_jsx_runtime21 from "react/jsx-runtime";
2
2
 
3
3
  //#region src/components/error-message/index.d.ts
4
4
  declare const ErrorMessage: ({
@@ -7,7 +7,7 @@ declare const ErrorMessage: ({
7
7
  }: {
8
8
  error?: string | null;
9
9
  "data-testid"?: string;
10
- }) => react_jsx_runtime19.JSX.Element | null;
10
+ }) => react_jsx_runtime21.JSX.Element | null;
11
11
  //#endregion
12
12
  export { ErrorMessage };
13
13
  //# sourceMappingURL=index.d.ts.map
@@ -1,7 +1,7 @@
1
- import * as react_jsx_runtime21 from "react/jsx-runtime";
1
+ import * as react_jsx_runtime17 from "react/jsx-runtime";
2
2
 
3
3
  //#region src/components/footer/index.d.ts
4
- declare function Footer(): Promise<react_jsx_runtime21.JSX.Element>;
4
+ declare function Footer(): Promise<react_jsx_runtime17.JSX.Element>;
5
5
  //#endregion
6
6
  export { Footer as default };
7
7
  //# sourceMappingURL=index.d.ts.map
@@ -1,5 +1,5 @@
1
1
  import { Cart } from "../../types/graphql.js";
2
- import * as react_jsx_runtime20 from "react/jsx-runtime";
2
+ import * as react_jsx_runtime22 from "react/jsx-runtime";
3
3
  import { StoreCartShippingOption } from "@medusajs/types";
4
4
 
5
5
  //#region src/components/free-shipping-price-nudge/index.d.ts
@@ -11,7 +11,7 @@ declare function ShippingPriceNudge({
11
11
  variant?: 'popup' | 'inline';
12
12
  cart: Cart;
13
13
  shippingOptions: StoreCartShippingOption[];
14
- }): react_jsx_runtime20.JSX.Element | undefined;
14
+ }): react_jsx_runtime22.JSX.Element | undefined;
15
15
  //#endregion
16
16
  export { ShippingPriceNudge };
17
17
  //# sourceMappingURL=index.d.ts.map
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime18 from "react/jsx-runtime";
1
+ import * as react_jsx_runtime15 from "react/jsx-runtime";
2
2
 
3
3
  //#region src/components/interactive-link/index.d.ts
4
4
  type InteractiveLinkProps = {
@@ -11,7 +11,7 @@ declare const InteractiveLink: ({
11
11
  children,
12
12
  onClick,
13
13
  ...props
14
- }: InteractiveLinkProps) => react_jsx_runtime18.JSX.Element;
14
+ }: InteractiveLinkProps) => react_jsx_runtime15.JSX.Element;
15
15
  //#endregion
16
16
  export { InteractiveLink };
17
17
  //# sourceMappingURL=index.d.ts.map
@@ -1,6 +1,6 @@
1
1
  import { Region } from "../../types/graphql.js";
2
2
  import { StateType } from "../../lib/hooks/use-toggle-state.js";
3
- import * as react_jsx_runtime10 from "react/jsx-runtime";
3
+ import * as react_jsx_runtime19 from "react/jsx-runtime";
4
4
 
5
5
  //#region src/components/layout-country-select/index.d.ts
6
6
  type CountrySelectProps = {
@@ -10,7 +10,7 @@ type CountrySelectProps = {
10
10
  declare const LayoutCountrySelect: ({
11
11
  toggleState,
12
12
  regions
13
- }: CountrySelectProps) => react_jsx_runtime10.JSX.Element;
13
+ }: CountrySelectProps) => react_jsx_runtime19.JSX.Element;
14
14
  //#endregion
15
15
  export { LayoutCountrySelect };
16
16
  //# sourceMappingURL=index.d.ts.map
@@ -1,5 +1,5 @@
1
1
  import { Maybe, ProductVariant } from "../../types/graphql.js";
2
- import * as react_jsx_runtime6 from "react/jsx-runtime";
2
+ import * as react_jsx_runtime18 from "react/jsx-runtime";
3
3
 
4
4
  //#region src/components/line-item-options/index.d.ts
5
5
  type LineItemOptionsProps = {
@@ -11,7 +11,7 @@ declare const LineItemOptions: ({
11
11
  variant,
12
12
  "data-testid": dataTestid,
13
13
  "data-value": dataValue
14
- }: LineItemOptionsProps) => react_jsx_runtime6.JSX.Element;
14
+ }: LineItemOptionsProps) => react_jsx_runtime18.JSX.Element;
15
15
  //#endregion
16
16
  export { LineItemOptions };
17
17
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/components/line-item-options/index.tsx"],"sourcesContent":[],"mappings":";;;;KAIK,oBAAA;YACO,MAAM;;EADb,YAAA,CAAA,EAGY,KAHZ,CAGkB,cAHE,CAAA;CACP;cAKZ,eALM,EAAA,CAAA;EAAA,OAAA;EAAA,aAAA,EAKa,UALb;EAAA,YAAA,EAKa;AALb,CAAA,EAST,oBATS,EAAA,GASW,kBAAA,CAAA,GAAA,CAAA,OATX"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/components/line-item-options/index.tsx"],"sourcesContent":[],"mappings":";;;;KAIK,oBAAA;YACO,MAAM;;EADb,YAAA,CAAA,EAGY,KAHZ,CAGkB,cAHE,CAAA;CACP;cAKZ,eALM,EAAA,CAAA;EAAA,OAAA;EAAA,aAAA,EAKa,UALb;EAAA,YAAA,EAKa;AALb,CAAA,EAST,oBATS,EAAA,GASW,mBAAA,CAAA,GAAA,CAAA,OATX"}
@@ -1,5 +1,5 @@
1
1
  import { LineItem } from "../../types/graphql.js";
2
- import * as react_jsx_runtime9 from "react/jsx-runtime";
2
+ import * as react_jsx_runtime20 from "react/jsx-runtime";
3
3
 
4
4
  //#region src/components/line-item-price/index.d.ts
5
5
  type LineItemPriceProps = {
@@ -11,7 +11,7 @@ declare const LineItemPrice: ({
11
11
  item,
12
12
  style,
13
13
  currencyCode
14
- }: LineItemPriceProps) => react_jsx_runtime9.JSX.Element;
14
+ }: LineItemPriceProps) => react_jsx_runtime20.JSX.Element;
15
15
  //#endregion
16
16
  export { LineItemPrice };
17
17
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/components/line-item-price/index.tsx"],"sourcesContent":[],"mappings":";;;;KAMK,kBAAA;QACG;;EADH,YAAA,EAAA,MAAA;AACW,CAAA;cAKV,aAAiB,EAAA,CAAA;EAAA,IAAA;EAAA,KAAA;EAAA;AAAA,CAAA,EAIpB,kBAJoB,EAAA,GAIF,kBAAA,CAAA,GAAA,CAAA,OAJE"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/components/line-item-price/index.tsx"],"sourcesContent":[],"mappings":";;;;KAMK,kBAAA;QACG;;EADH,YAAA,EAAA,MAAA;AACW,CAAA;cAKV,aAAiB,EAAA,CAAA;EAAA,IAAA;EAAA,KAAA;EAAA;AAAA,CAAA,EAIpB,kBAJoB,EAAA,GAIF,mBAAA,CAAA,GAAA,CAAA,OAJE"}
@@ -1,24 +1,17 @@
1
- import React from "react";
2
- import * as react_jsx_runtime14 from "react/jsx-runtime";
1
+ import { AnchorHTMLAttributes, DetailedHTMLProps } from "react";
2
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
3
3
 
4
4
  //#region src/components/localized-client-link/index.d.ts
5
-
5
+ type LocalizedClientLinkProps = DetailedHTMLProps<AnchorHTMLAttributes<HTMLAnchorElement>, HTMLAnchorElement>;
6
6
  /**
7
- * Use this component to create a Next.js `<Link />` that persists the current country code in the url,
7
+ * Use this component to create an anchor link that persists the current country code in the url,
8
8
  * without having to explicitly pass it as a prop.
9
9
  */
10
10
  declare const LocalizedClientLink: ({
11
11
  children,
12
12
  href,
13
13
  ...props
14
- }: {
15
- children?: React.ReactNode;
16
- href: string;
17
- className?: string;
18
- onClick?: () => void;
19
- passHref?: true;
20
- [x: string]: any;
21
- }) => react_jsx_runtime14.JSX.Element;
14
+ }: LocalizedClientLinkProps) => react_jsx_runtime0.JSX.Element;
22
15
  //#endregion
23
16
  export { LocalizedClientLink };
24
17
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/components/localized-client-link/index.tsx"],"sourcesContent":[],"mappings":";;;;;;;;AAE0B;cASpB,mBAAuB,EAAA,CAAA;EAAA,QAAA;EAAA,IAAA;EAAA,GAAA;CAAA,EAAA;EAAA,QAAA,CAAA,EAKhB,KAAA,CAAM,SALU;EAKhB,IAAM,EAAA,MAAA;EAMlB,SAAA,CAAA,EAAA,MAAA;EAQA,OAAA,CAAA,EAAA,GAAA,GAAA,IAAA;;;MARA,mBAAA,CAAA,GAAA,CAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/components/localized-client-link/index.tsx"],"sourcesContent":[],"mappings":";;;;KAMK,wBAAA,GAA2B,kBAC9B,qBAAqB,oBACrB;;;AAN8D;;cAa1D,mBARJ,EAAA,CAAA;EAAA,QAAA;EAAA,IAAA;EAAA,GAAA;AAAA,CAAA,EAYC,wBAZD,EAAA,GAYyB,kBAAA,CAAA,GAAA,CAAA,OAZzB"}
@@ -1,18 +1,16 @@
1
1
  'use client';
2
2
 
3
- import React from "react";
4
3
  import { useParams } from "next/navigation";
5
4
  import { jsx } from "react/jsx-runtime";
6
- import Link from "next/link";
7
5
 
8
6
  //#region src/components/localized-client-link/index.tsx
9
7
  /**
10
- * Use this component to create a Next.js `<Link />` that persists the current country code in the url,
8
+ * Use this component to create an anchor link that persists the current country code in the url,
11
9
  * without having to explicitly pass it as a prop.
12
10
  */
13
11
  const LocalizedClientLink = ({ children, href, ...props }) => {
14
12
  const { countryCode } = useParams();
15
- return /* @__PURE__ */ jsx(Link, {
13
+ return /* @__PURE__ */ jsx("a", {
16
14
  href: `/${countryCode}${href}`,
17
15
  ...props,
18
16
  children
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/components/localized-client-link/index.tsx"],"sourcesContent":["'use client';\n\nimport React from 'react';\n\nimport Link from 'next/link';\nimport { useParams } from 'next/navigation';\n\n/**\n * Use this component to create a Next.js `<Link />` that persists the current country code in the url,\n * without having to explicitly pass it as a prop.\n */\nconst LocalizedClientLink = ({\n children,\n href,\n ...props\n}: {\n children?: React.ReactNode;\n href: string;\n className?: string;\n onClick?: () => void;\n passHref?: true;\n [x: string]: any;\n}) => {\n const { countryCode } = useParams();\n\n return (\n <Link href={`/${countryCode}${href}`} {...props}>\n {children}\n </Link>\n );\n};\n\nexport { LocalizedClientLink };\n"],"mappings":";;;;;;;;;;;;AAWA,MAAM,uBAAuB,EAC3B,UACA,MACA,GAAG,YAQC;CACJ,MAAM,EAAE,gBAAgB,WAAW;AAEnC,QACE,oBAAC;EAAK,MAAM,IAAI,cAAc;EAAQ,GAAI;EACvC;GACI"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/components/localized-client-link/index.tsx"],"sourcesContent":["'use client';\n\nimport { AnchorHTMLAttributes, DetailedHTMLProps } from 'react';\n\nimport { useParams } from 'next/navigation';\n\ntype LocalizedClientLinkProps = DetailedHTMLProps<\n AnchorHTMLAttributes<HTMLAnchorElement>,\n HTMLAnchorElement\n>;\n\n/**\n * Use this component to create an anchor link that persists the current country code in the url,\n * without having to explicitly pass it as a prop.\n */\nconst LocalizedClientLink = ({\n children,\n href,\n ...props\n}: LocalizedClientLinkProps) => {\n const { countryCode } = useParams();\n\n return (\n <a href={`/${countryCode}${href}`} {...props}>\n {children}\n </a>\n );\n};\n\nexport { LocalizedClientLink };\n"],"mappings":";;;;;;;;;;AAeA,MAAM,uBAAuB,EAC3B,UACA,MACA,GAAG,YAC2B;CAC9B,MAAM,EAAE,gBAAgB,WAAW;AAEnC,QACE,oBAAC;EAAE,MAAM,IAAI,cAAc;EAAQ,GAAI;EACpC;GACC"}
@@ -1,5 +1,5 @@
1
1
  import React from "react";
2
- import * as react_jsx_runtime7 from "react/jsx-runtime";
2
+ import * as react_jsx_runtime5 from "react/jsx-runtime";
3
3
 
4
4
  //#region src/components/modal/index.d.ts
5
5
  type ModalProps = {
@@ -20,7 +20,7 @@ declare const Modal: {
20
20
  children,
21
21
  "data-testid": dataTestId,
22
22
  "aria-label": ariaLabel
23
- }: ModalProps): react_jsx_runtime7.JSX.Element;
23
+ }: ModalProps): react_jsx_runtime5.JSX.Element;
24
24
  Title: React.FC<{
25
25
  children: React.ReactNode;
26
26
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/components/modal/index.tsx"],"sourcesContent":[],"mappings":";;;;KAQK,UAAA;;;EAAA,IAAA,CAAA,EAAA,OAAU,GAAA,QAKH,GAAA,OAAM;EAKZ,MAAA,CAAA,EAqEL,OAAA;YA1EW,KAAA,CAAM;;;;cAKZ;;;;;;;;;KAQH,aAAU,kBAAA,CAAA,GAAA,CAAA;;IAAV,QAAA,EA+D+B,KAAA,CAAM,SA/DrC;EAAU,CAAA,CAAA;EA+DqB,WAAM,UAAA,CAAA;cAeA,KAAA,CAAM;EAAN,CAAA,CAAA;;IAQD,QAAA,EAAN,KAAA,CAAM,SAAA;;EAIJ,MAAM,UAAA,CAAA;cAAN,KAAA,CAAM"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/components/modal/index.tsx"],"sourcesContent":[],"mappings":";;;;KAQK,UAAA;;;EAAA,IAAA,CAAA,EAAA,OAAU,GAAA,QAAA,GAKH,OAAM;EAKZ,MAAA,CAAA,EAqEL,OAAA;YA1EW,KAAA,CAAM;;;;cAKZ;;;;;;;;;KAQH,aAAU,kBAAA,CAAA,GAAA,CAAA;;IAAV,QAAA,EA+D+B,KAAA,CAAM,SA/DrC;EAAU,CAAA,CAAA;EA+DqB,WAAM,UAAA,CAAA;cAeA,KAAA,CAAM;EAAN,CAAA,CAAA;;IAQD,QAAA,EAAN,KAAA,CAAM,SAAA;;EAIJ,MAAM,UAAA,CAAA;cAAN,KAAA,CAAM"}
@@ -1,7 +1,7 @@
1
- import * as react_jsx_runtime2 from "react/jsx-runtime";
1
+ import * as react_jsx_runtime6 from "react/jsx-runtime";
2
2
 
3
3
  //#region src/components/nav/index.d.ts
4
- declare function Nav(): Promise<react_jsx_runtime2.JSX.Element>;
4
+ declare function Nav(): Promise<react_jsx_runtime6.JSX.Element>;
5
5
  //#endregion
6
6
  export { Nav };
7
7
  //# sourceMappingURL=index.d.ts.map
@@ -1,5 +1,5 @@
1
1
  import { RichTextBlock } from "../../types/graphql.js";
2
- import * as react_jsx_runtime3 from "react/jsx-runtime";
2
+ import * as react_jsx_runtime8 from "react/jsx-runtime";
3
3
 
4
4
  //#region src/components/portable-text/index.d.ts
5
5
  type PortableTextProps = {
@@ -7,7 +7,7 @@ type PortableTextProps = {
7
7
  };
8
8
  declare const PortableText: ({
9
9
  value
10
- }: PortableTextProps) => react_jsx_runtime3.JSX.Element | null;
10
+ }: PortableTextProps) => react_jsx_runtime8.JSX.Element | null;
11
11
  //#endregion
12
12
  export { PortableText };
13
13
  //# sourceMappingURL=index.d.ts.map
@@ -1,12 +1,12 @@
1
1
  import { VariantPrice } from "../../types/prices.js";
2
- import * as react_jsx_runtime11 from "react/jsx-runtime";
2
+ import * as react_jsx_runtime9 from "react/jsx-runtime";
3
3
 
4
4
  //#region src/components/preview-price/index.d.ts
5
5
  declare function PreviewPrice({
6
6
  price
7
7
  }: {
8
8
  price: VariantPrice;
9
- }): react_jsx_runtime11.JSX.Element | null;
9
+ }): react_jsx_runtime9.JSX.Element | null;
10
10
  //#endregion
11
11
  export { PreviewPrice };
12
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/components/preview-price/index.tsx"],"sourcesContent":[],"mappings":";;;;iBAIS,YAAA;;;SAAiC;IAAc,mBAAA,CAAA,GAAA,CAAA,OAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/components/preview-price/index.tsx"],"sourcesContent":[],"mappings":";;;;iBAIS,YAAA;;;SAAiC;IAAc,kBAAA,CAAA,GAAA,CAAA,OAAA"}
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime16 from "react/jsx-runtime";
1
+ import * as react_jsx_runtime10 from "react/jsx-runtime";
2
2
  import { VariantProps } from "class-variance-authority";
3
3
  import * as class_variance_authority_types0 from "class-variance-authority/types";
4
4
 
@@ -59,7 +59,7 @@ declare function ProductCard({
59
59
  variant,
60
60
  size,
61
61
  className
62
- }: ProductCardProps): react_jsx_runtime16.JSX.Element;
62
+ }: ProductCardProps): react_jsx_runtime10.JSX.Element;
63
63
  //#endregion
64
64
  export { ProductCard };
65
65
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/components/product-card/index.tsx"],"sourcesContent":[],"mappings":";;;;;cAaM;;;IAoBL,+BAAA,CAAA;AA5BiE,UA8BxD,KAAA,CAtBJ;EAsBI,OAAA,EAAK,MAAA;EAKL,GAAA,CAAA,EAAA,MAAO;AAYH;UAZJ,OAAA,CAe6C;EAC5C,EAAA,EAAA,MAAA;EADwB,KAAA,EAAA;IAAY,GAAA,EAAA,MAAA;IAuC/B,GAAA,CAAA,EAAA,MAAW;EACzB,CAAA;EACA,QAAA,CAAA,EAAA;IACA,QAAA,EAAA,MAAA;IACA,MAAA,EAAA,MAAA;EACA,CAAA;EACA,KAAA,EAAA,MAAA;EACA,IAAA,CAAA,EAAA,MAAA;EACC,KAAA,EAlDM,KAkDN;;UA/CO,gBAAA,SAAyB,YA+ChB,CAAA,OA/CoC,mBA+CpC,CAAA,CAAA;WA9CR;;;;;;;;;;;;;;;;;;;;;;;;;iBAsCK,WAAA;;;;;;;;GAQb,mBAAgB,mBAAA,CAAA,GAAA,CAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/components/product-card/index.tsx"],"sourcesContent":[],"mappings":";;;;;cAYM;;;IAoBL,+BAAA,CAAA;AA5BiE,UA8BxD,KAAA,CAtBJ;EAsBI,OAAA,EAAK,MAAA;EAKL,GAAA,CAAA,EAAA,MAAO;AAYH;UAZJ,OAAA,CAe6C;EAC5C,EAAA,EAAA,MAAA;EADwB,KAAA,EAAA;IAAY,GAAA,EAAA,MAAA;IAuC/B,GAAA,CAAA,EAAA,MAAW;EACzB,CAAA;EACA,QAAA,CAAA,EAAA;IACA,QAAA,EAAA,MAAA;IACA,MAAA,EAAA,MAAA;EACA,CAAA;EACA,KAAA,EAAA,MAAA;EACA,IAAA,CAAA,EAAA,MAAA;EACC,KAAA,EAlDM,KAkDN;;UA/CO,gBAAA,SAAyB,YA+ChB,CAAA,OA/CoC,mBA+CpC,CAAA,CAAA;WA9CR;;;;;;;;;;;;;;;;;;;;;;;;;iBAsCK,WAAA;;;;;;;;GAQb,mBAAgB,mBAAA,CAAA,GAAA,CAAA"}
@@ -1,7 +1,6 @@
1
1
  'use client';
2
2
 
3
3
  import { jsx, jsxs } from "react/jsx-runtime";
4
- import Link from "next/link";
5
4
  import Image from "next/image";
6
5
  import { cn } from "@gfed-medusa/sf-lib-ui/lib/utils";
7
6
  import { cva } from "class-variance-authority";
@@ -60,7 +59,7 @@ function ProductCard({ product, rating, badge, variants, variant, size, classNam
60
59
  className: "flex items-center justify-between",
61
60
  children: [/* @__PURE__ */ jsx("h3", {
62
61
  className: "truncate text-base font-medium",
63
- children: product.href ? /* @__PURE__ */ jsx(Link, {
62
+ children: product.href ? /* @__PURE__ */ jsx("a", {
64
63
  href: product.href,
65
64
  className: "hover:underline",
66
65
  children: product.title
@@ -89,7 +88,7 @@ function ProductCard({ product, rating, badge, variants, variant, size, classNam
89
88
  height: 500,
90
89
  className: cn("w-full object-cover")
91
90
  }), badge && /* @__PURE__ */ jsx("div", {
92
- className: "absolute left-2 top-2",
91
+ className: "absolute top-2 left-2",
93
92
  children: /* @__PURE__ */ jsx(Badge, {
94
93
  variant: "default",
95
94
  children: badge.label
@@ -100,7 +99,7 @@ function ProductCard({ product, rating, badge, variants, variant, size, classNam
100
99
  children: [
101
100
  /* @__PURE__ */ jsx("h3", {
102
101
  className: "truncate text-base font-medium",
103
- children: product.href ? /* @__PURE__ */ jsx(Link, {
102
+ children: product.href ? /* @__PURE__ */ jsx("a", {
104
103
  href: product.href,
105
104
  className: "hover:underline",
106
105
  children: product.title
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../src/components/product-card/index.tsx"],"sourcesContent":["'use client';\n\nimport Image from 'next/image';\nimport Link from 'next/link';\n\nimport { type VariantProps, cva } from 'class-variance-authority';\n\nimport { Badge } from '@gfed-medusa/sf-lib-ui/components/badge';\nimport { Button } from '@gfed-medusa/sf-lib-ui/components/button';\nimport { RatingCount } from '@gfed-medusa/sf-lib-ui/components/rating-count';\nimport { VariantSelector } from '@gfed-medusa/sf-lib-ui/components/variant-selector';\nimport { cn } from '@gfed-medusa/sf-lib-ui/lib/utils';\n\nconst productCardVariants = cva(\n 'rounded-2xl border overflow-hidden transition',\n {\n variants: {\n variant: {\n default: 'flex flex-col shadow-sm hover:shadow-md',\n withAddToCart: 'flex flex-col shadow-sm hover:shadow-md',\n minimal: 'flex flex-col hover:shadow hover:border-muted-foreground/30',\n },\n size: {\n sm: 'w-48',\n md: 'w-64',\n lg: 'w-80',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'md',\n },\n }\n);\n\ninterface Price {\n current: string;\n old?: string;\n}\n\ninterface Product {\n id: string;\n image: {\n src: string;\n alt?: string;\n };\n localize?: {\n currency: string;\n locale: string;\n };\n title: string;\n href?: string;\n price: Price;\n}\n\ninterface ProductCardProps extends VariantProps<typeof productCardVariants> {\n product: Product;\n rating?: {\n average: number;\n count?: number;\n };\n badge?: {\n label: string;\n variant?: 'default' | 'sale' | 'new' | 'limited';\n };\n variants?: {\n options: {\n value: string;\n label?: string;\n imageSrc?: string;\n color?: string;\n }[];\n value: string;\n onChange: (value: string) => void;\n };\n quantity?: {\n value: number;\n onChange: (value: number) => void;\n };\n className?: string;\n}\n\nconst formatPrice = (price: Price, locale = 'en-GB', currency = 'GBP') => {\n const formatter = new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n });\n\n return {\n currentPrice: formatter.format(Number(price.current)),\n oldPrice: price.old ? formatter.format(Number(price.old)) : undefined,\n };\n};\n\nexport function ProductCard({\n product,\n rating,\n badge,\n variants,\n variant,\n size,\n className,\n}: ProductCardProps) {\n const { currentPrice, oldPrice } = formatPrice(\n product.price,\n product.localize?.locale,\n product.localize?.currency\n );\n\n switch (variant) {\n case 'minimal':\n return (\n <div\n className={cn(\n productCardVariants({ variant, size }),\n 'w-60 overflow-hidden rounded-2xl border p-0 shadow-sm'\n )}\n >\n <div className=\"h-72 w-full overflow-hidden\">\n {/* eslint-disable-next-line @next/next/no-img-element -- needed for minimal variant */}\n <img\n src={product.image.src}\n alt={product.image.alt ?? product.title}\n className=\"h-full w-full object-cover\"\n />\n </div>\n\n <div className=\"flex flex-col gap-1 p-3\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"truncate text-base font-medium\">\n {product.href ? (\n <Link href={product.href} className=\"hover:underline\">\n {product.title}\n </Link>\n ) : (\n product.title\n )}\n </h3>\n <p className=\"mt-0 text-lg font-semibold text-gray-900\">\n {currentPrice}\n </p>\n </div>\n <p className=\"text-xs text-gray-500\">7 colors</p>\n </div>\n </div>\n );\n default:\n return (\n <div className={cn(productCardVariants({ variant, size }), className)}>\n {/* Image */}\n <div className=\"relative\">\n <Image\n src={product.image.src || '/assets/images/missing-img.webp'}\n alt={product.image.alt ?? product.title}\n width={500}\n height={500}\n className={cn('w-full object-cover')}\n />\n {badge && (\n <div className=\"absolute left-2 top-2\">\n <Badge variant=\"default\">{badge.label}</Badge>\n </div>\n )}\n </div>\n\n {/* Content */}\n <div className=\"flex flex-col gap-2 p-3\">\n <h3 className=\"truncate text-base font-medium\">\n {product.href ? (\n <Link href={product.href} className=\"hover:underline\">\n {product.title}\n </Link>\n ) : (\n product.title\n )}\n </h3>\n\n {/* Price */}\n <div className=\"flex items-center gap-2\">\n <p className=\"text-lg font-semibold\">{currentPrice}</p>\n {oldPrice && (\n <p className=\"text-muted-foreground text-sm line-through\">\n {oldPrice}\n </p>\n )}\n </div>\n\n {/* Rating */}\n {rating !== undefined && (\n <div\n data-testid=\"product-card-rating\"\n className=\"flex items-center gap-2\"\n >\n <RatingCount\n average={rating.average}\n ratingCount={rating.count}\n />\n </div>\n )}\n\n {/* Variant Selector */}\n {variants && (\n <VariantSelector\n options={variants.options}\n value={variants.value ?? ''}\n onChange={variants.onChange}\n type=\"color\"\n />\n )}\n\n {/* Add to Cart button */}\n {variant === 'withAddToCart' && (\n <Button variant=\"default\" className=\"w-full cursor-pointer\">\n Add to Cart\n </Button>\n )}\n </div>\n </div>\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;;AAaA,MAAM,sBAAsB,IAC1B,iDACA;CACE,UAAU;EACR,SAAS;GACP,SAAS;GACT,eAAe;GACf,SAAS;GACV;EACD,MAAM;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACL;EACF;CACD,iBAAiB;EACf,SAAS;EACT,MAAM;EACP;CACF,CACF;AAiDD,MAAM,eAAe,OAAc,SAAS,SAAS,WAAW,UAAU;CACxE,MAAM,YAAY,IAAI,KAAK,aAAa,QAAQ;EAC9C,OAAO;EACP;EACD,CAAC;AAEF,QAAO;EACL,cAAc,UAAU,OAAO,OAAO,MAAM,QAAQ,CAAC;EACrD,UAAU,MAAM,MAAM,UAAU,OAAO,OAAO,MAAM,IAAI,CAAC,GAAG;EAC7D;;AAGH,SAAgB,YAAY,EAC1B,SACA,QACA,OACA,UACA,SACA,MACA,aACmB;CACnB,MAAM,EAAE,cAAc,aAAa,YACjC,QAAQ,OACR,QAAQ,UAAU,QAClB,QAAQ,UAAU,SACnB;AAED,SAAQ,SAAR;EACE,KAAK,UACH,QACE,qBAAC;GACC,WAAW,GACT,oBAAoB;IAAE;IAAS;IAAM,CAAC,EACtC,wDACD;cAED,oBAAC;IAAI,WAAU;cAEb,oBAAC;KACC,KAAK,QAAQ,MAAM;KACnB,KAAK,QAAQ,MAAM,OAAO,QAAQ;KAClC,WAAU;MACV;KACE,EAEN,qBAAC;IAAI,WAAU;eACb,qBAAC;KAAI,WAAU;gBACb,oBAAC;MAAG,WAAU;gBACX,QAAQ,OACP,oBAAC;OAAK,MAAM,QAAQ;OAAM,WAAU;iBACjC,QAAQ;QACJ,GAEP,QAAQ;OAEP,EACL,oBAAC;MAAE,WAAU;gBACV;OACC;MACA,EACN,oBAAC;KAAE,WAAU;eAAwB;MAAY;KAC7C;IACF;EAEV,QACE,QACE,qBAAC;GAAI,WAAW,GAAG,oBAAoB;IAAE;IAAS;IAAM,CAAC,EAAE,UAAU;cAEnE,qBAAC;IAAI,WAAU;eACb,oBAAC;KACC,KAAK,QAAQ,MAAM,OAAO;KAC1B,KAAK,QAAQ,MAAM,OAAO,QAAQ;KAClC,OAAO;KACP,QAAQ;KACR,WAAW,GAAG,sBAAsB;MACpC,EACD,SACC,oBAAC;KAAI,WAAU;eACb,oBAAC;MAAM,SAAQ;gBAAW,MAAM;OAAc;MAC1C;KAEJ,EAGN,qBAAC;IAAI,WAAU;;KACb,oBAAC;MAAG,WAAU;gBACX,QAAQ,OACP,oBAAC;OAAK,MAAM,QAAQ;OAAM,WAAU;iBACjC,QAAQ;QACJ,GAEP,QAAQ;OAEP;KAGL,qBAAC;MAAI,WAAU;iBACb,oBAAC;OAAE,WAAU;iBAAyB;QAAiB,EACtD,YACC,oBAAC;OAAE,WAAU;iBACV;QACC;OAEF;KAGL,WAAW,UACV,oBAAC;MACC,eAAY;MACZ,WAAU;gBAEV,oBAAC;OACC,SAAS,OAAO;OAChB,aAAa,OAAO;QACpB;OACE;KAIP,YACC,oBAAC;MACC,SAAS,SAAS;MAClB,OAAO,SAAS,SAAS;MACzB,UAAU,SAAS;MACnB,MAAK;OACL;KAIH,YAAY,mBACX,oBAAC;MAAO,SAAQ;MAAU,WAAU;gBAAwB;OAEnD;;KAEP;IACF"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/components/product-card/index.tsx"],"sourcesContent":["'use client';\n\nimport Image from 'next/image';\n\nimport { type VariantProps, cva } from 'class-variance-authority';\n\nimport { Badge } from '@gfed-medusa/sf-lib-ui/components/badge';\nimport { Button } from '@gfed-medusa/sf-lib-ui/components/button';\nimport { RatingCount } from '@gfed-medusa/sf-lib-ui/components/rating-count';\nimport { VariantSelector } from '@gfed-medusa/sf-lib-ui/components/variant-selector';\nimport { cn } from '@gfed-medusa/sf-lib-ui/lib/utils';\n\nconst productCardVariants = cva(\n 'rounded-2xl border overflow-hidden transition',\n {\n variants: {\n variant: {\n default: 'flex flex-col shadow-sm hover:shadow-md',\n withAddToCart: 'flex flex-col shadow-sm hover:shadow-md',\n minimal: 'flex flex-col hover:shadow hover:border-muted-foreground/30',\n },\n size: {\n sm: 'w-48',\n md: 'w-64',\n lg: 'w-80',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'md',\n },\n }\n);\n\ninterface Price {\n current: string;\n old?: string;\n}\n\ninterface Product {\n id: string;\n image: {\n src: string;\n alt?: string;\n };\n localize?: {\n currency: string;\n locale: string;\n };\n title: string;\n href?: string;\n price: Price;\n}\n\ninterface ProductCardProps extends VariantProps<typeof productCardVariants> {\n product: Product;\n rating?: {\n average: number;\n count?: number;\n };\n badge?: {\n label: string;\n variant?: 'default' | 'sale' | 'new' | 'limited';\n };\n variants?: {\n options: {\n value: string;\n label?: string;\n imageSrc?: string;\n color?: string;\n }[];\n value: string;\n onChange: (value: string) => void;\n };\n quantity?: {\n value: number;\n onChange: (value: number) => void;\n };\n className?: string;\n}\n\nconst formatPrice = (price: Price, locale = 'en-GB', currency = 'GBP') => {\n const formatter = new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n });\n\n return {\n currentPrice: formatter.format(Number(price.current)),\n oldPrice: price.old ? formatter.format(Number(price.old)) : undefined,\n };\n};\n\nexport function ProductCard({\n product,\n rating,\n badge,\n variants,\n variant,\n size,\n className,\n}: ProductCardProps) {\n const { currentPrice, oldPrice } = formatPrice(\n product.price,\n product.localize?.locale,\n product.localize?.currency\n );\n\n switch (variant) {\n case 'minimal':\n return (\n <div\n className={cn(\n productCardVariants({ variant, size }),\n 'w-60 overflow-hidden rounded-2xl border p-0 shadow-sm'\n )}\n >\n <div className=\"h-72 w-full overflow-hidden\">\n {/* eslint-disable-next-line @next/next/no-img-element -- needed for minimal variant */}\n <img\n src={product.image.src}\n alt={product.image.alt ?? product.title}\n className=\"h-full w-full object-cover\"\n />\n </div>\n\n <div className=\"flex flex-col gap-1 p-3\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"truncate text-base font-medium\">\n {product.href ? (\n <a href={product.href} className=\"hover:underline\">\n {product.title}\n </a>\n ) : (\n product.title\n )}\n </h3>\n <p className=\"mt-0 text-lg font-semibold text-gray-900\">\n {currentPrice}\n </p>\n </div>\n <p className=\"text-xs text-gray-500\">7 colors</p>\n </div>\n </div>\n );\n default:\n return (\n <div className={cn(productCardVariants({ variant, size }), className)}>\n {/* Image */}\n <div className=\"relative\">\n <Image\n src={product.image.src || '/assets/images/missing-img.webp'}\n alt={product.image.alt ?? product.title}\n width={500}\n height={500}\n className={cn('w-full object-cover')}\n />\n {badge && (\n <div className=\"absolute top-2 left-2\">\n <Badge variant=\"default\">{badge.label}</Badge>\n </div>\n )}\n </div>\n\n {/* Content */}\n <div className=\"flex flex-col gap-2 p-3\">\n <h3 className=\"truncate text-base font-medium\">\n {product.href ? (\n <a href={product.href} className=\"hover:underline\">\n {product.title}\n </a>\n ) : (\n product.title\n )}\n </h3>\n\n {/* Price */}\n <div className=\"flex items-center gap-2\">\n <p className=\"text-lg font-semibold\">{currentPrice}</p>\n {oldPrice && (\n <p className=\"text-muted-foreground text-sm line-through\">\n {oldPrice}\n </p>\n )}\n </div>\n\n {/* Rating */}\n {rating !== undefined && (\n <div\n data-testid=\"product-card-rating\"\n className=\"flex items-center gap-2\"\n >\n <RatingCount\n average={rating.average}\n ratingCount={rating.count}\n />\n </div>\n )}\n\n {/* Variant Selector */}\n {variants && (\n <VariantSelector\n options={variants.options}\n value={variants.value ?? ''}\n onChange={variants.onChange}\n type=\"color\"\n />\n )}\n\n {/* Add to Cart button */}\n {variant === 'withAddToCart' && (\n <Button variant=\"default\" className=\"w-full cursor-pointer\">\n Add to Cart\n </Button>\n )}\n </div>\n </div>\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;AAYA,MAAM,sBAAsB,IAC1B,iDACA;CACE,UAAU;EACR,SAAS;GACP,SAAS;GACT,eAAe;GACf,SAAS;GACV;EACD,MAAM;GACJ,IAAI;GACJ,IAAI;GACJ,IAAI;GACL;EACF;CACD,iBAAiB;EACf,SAAS;EACT,MAAM;EACP;CACF,CACF;AAiDD,MAAM,eAAe,OAAc,SAAS,SAAS,WAAW,UAAU;CACxE,MAAM,YAAY,IAAI,KAAK,aAAa,QAAQ;EAC9C,OAAO;EACP;EACD,CAAC;AAEF,QAAO;EACL,cAAc,UAAU,OAAO,OAAO,MAAM,QAAQ,CAAC;EACrD,UAAU,MAAM,MAAM,UAAU,OAAO,OAAO,MAAM,IAAI,CAAC,GAAG;EAC7D;;AAGH,SAAgB,YAAY,EAC1B,SACA,QACA,OACA,UACA,SACA,MACA,aACmB;CACnB,MAAM,EAAE,cAAc,aAAa,YACjC,QAAQ,OACR,QAAQ,UAAU,QAClB,QAAQ,UAAU,SACnB;AAED,SAAQ,SAAR;EACE,KAAK,UACH,QACE,qBAAC;GACC,WAAW,GACT,oBAAoB;IAAE;IAAS;IAAM,CAAC,EACtC,wDACD;cAED,oBAAC;IAAI,WAAU;cAEb,oBAAC;KACC,KAAK,QAAQ,MAAM;KACnB,KAAK,QAAQ,MAAM,OAAO,QAAQ;KAClC,WAAU;MACV;KACE,EAEN,qBAAC;IAAI,WAAU;eACb,qBAAC;KAAI,WAAU;gBACb,oBAAC;MAAG,WAAU;gBACX,QAAQ,OACP,oBAAC;OAAE,MAAM,QAAQ;OAAM,WAAU;iBAC9B,QAAQ;QACP,GAEJ,QAAQ;OAEP,EACL,oBAAC;MAAE,WAAU;gBACV;OACC;MACA,EACN,oBAAC;KAAE,WAAU;eAAwB;MAAY;KAC7C;IACF;EAEV,QACE,QACE,qBAAC;GAAI,WAAW,GAAG,oBAAoB;IAAE;IAAS;IAAM,CAAC,EAAE,UAAU;cAEnE,qBAAC;IAAI,WAAU;eACb,oBAAC;KACC,KAAK,QAAQ,MAAM,OAAO;KAC1B,KAAK,QAAQ,MAAM,OAAO,QAAQ;KAClC,OAAO;KACP,QAAQ;KACR,WAAW,GAAG,sBAAsB;MACpC,EACD,SACC,oBAAC;KAAI,WAAU;eACb,oBAAC;MAAM,SAAQ;gBAAW,MAAM;OAAc;MAC1C;KAEJ,EAGN,qBAAC;IAAI,WAAU;;KACb,oBAAC;MAAG,WAAU;gBACX,QAAQ,OACP,oBAAC;OAAE,MAAM,QAAQ;OAAM,WAAU;iBAC9B,QAAQ;QACP,GAEJ,QAAQ;OAEP;KAGL,qBAAC;MAAI,WAAU;iBACb,oBAAC;OAAE,WAAU;iBAAyB;QAAiB,EACtD,YACC,oBAAC;OAAE,WAAU;iBACV;QACC;OAEF;KAGL,WAAW,UACV,oBAAC;MACC,eAAY;MACZ,WAAU;gBAEV,oBAAC;OACC,SAAS,OAAO;OAChB,aAAa,OAAO;QACpB;OACE;KAIP,YACC,oBAAC;MACC,SAAS,SAAS;MAClB,OAAO,SAAS,SAAS;MACzB,UAAU,SAAS;MACnB,MAAK;OACL;KAIH,YAAY,mBACX,oBAAC;MAAO,SAAQ;MAAU,WAAU;gBAAwB;OAEnD;;KAEP;IACF"}
@@ -1,5 +1,5 @@
1
1
  import { Product } from "../../types/graphql.js";
2
- import * as react_jsx_runtime17 from "react/jsx-runtime";
2
+ import * as react_jsx_runtime7 from "react/jsx-runtime";
3
3
 
4
4
  //#region src/components/product-preview/index.d.ts
5
5
  type ProductPreviewProps = {
@@ -9,7 +9,7 @@ type ProductPreviewProps = {
9
9
  declare function ProductPreview({
10
10
  product,
11
11
  isFeatured
12
- }: ProductPreviewProps): react_jsx_runtime17.JSX.Element;
12
+ }: ProductPreviewProps): react_jsx_runtime7.JSX.Element;
13
13
  //#endregion
14
14
  export { ProductPreview, ProductPreviewProps };
15
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/components/product-preview/index.tsx"],"sourcesContent":[],"mappings":";;;;KASY,mBAAA;WACD;;AADX,CAAA;AAGE,iBAEO,cAAA,CAAc;EAAA,OAAA;EAAA;AAAA,CAAA,EAA0B,mBAA1B,CAAA,EAA6C,mBAAA,CAAA,GAAA,CAAA,OAA7C"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/components/product-preview/index.tsx"],"sourcesContent":[],"mappings":";;;;KASY,mBAAA;WACD;;AADX,CAAA;AAGE,iBAEO,cAAA,CAAc;EAAA,OAAA;EAAA;AAAA,CAAA,EAA0B,mBAA1B,CAAA,EAA6C,kBAAA,CAAA,GAAA,CAAA,OAA7C"}
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime15 from "react/jsx-runtime";
1
+ import * as react_jsx_runtime11 from "react/jsx-runtime";
2
2
 
3
3
  //#region src/components/search-modal/index.d.ts
4
4
  type SearchModalProps = {
@@ -6,7 +6,7 @@ type SearchModalProps = {
6
6
  };
7
7
  declare function SearchModal({
8
8
  buttonClassName
9
- }: SearchModalProps): react_jsx_runtime15.JSX.Element;
9
+ }: SearchModalProps): react_jsx_runtime11.JSX.Element;
10
10
  //#endregion
11
11
  export { SearchModal };
12
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/components/search-modal/index.tsx"],"sourcesContent":[],"mappings":";;;KAmBK,gBAAA;;;AAIqD,iBAAjD,WAAA,CAJY;EAAA;AAAA,CAAA,EAIqB,gBAJrB,CAAA,EAIqC,mBAAA,CAAA,GAAA,CAAA,OAJrC"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/components/search-modal/index.tsx"],"sourcesContent":[],"mappings":";;;KAkBK,gBAAA;;;AAIqD,iBAAjD,WAAA,CAJY;EAAA;AAAA,CAAA,EAIqB,gBAJrB,CAAA,EAIqC,mBAAA,CAAA,GAAA,CAAA,OAJrC"}
@@ -6,7 +6,6 @@ import { useEffect, useRef, useState } from "react";
6
6
  import { usePathname } from "next/navigation";
7
7
  import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
8
8
  import { Button } from "@medusajs/ui";
9
- import Link from "next/link";
10
9
  import Image from "next/image";
11
10
  import { PlaceholderImage } from "@gfed-medusa/sf-lib-ui/icons/placeholder-image";
12
11
  import DOMPurify from "isomorphic-dompurify";
@@ -125,7 +124,7 @@ const Hit = ({ hit }) => {
125
124
  dangerouslySetInnerHTML: { __html: DOMPurify.sanitize(hit.description ?? "") }
126
125
  })]
127
126
  }),
128
- /* @__PURE__ */ jsx(Link, {
127
+ /* @__PURE__ */ jsx("a", {
129
128
  href: `/products/${hit.handle}`,
130
129
  className: "absolute top-0 right-0 h-full w-full",
131
130
  "aria-label": `View Product: ${hit.title}`