@gfed-medusa/sf-lib-common 1.1.0 → 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 (254) 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-button/index.d.ts.map +1 -1
  6. package/dist/components/cart-button/index.js +11 -17
  7. package/dist/components/cart-button/index.js.map +1 -0
  8. package/dist/components/cart-dropdown/index.d.ts +3 -3
  9. package/dist/components/cart-dropdown/index.d.ts.map +1 -1
  10. package/dist/components/cart-dropdown/index.js +193 -16
  11. package/dist/components/cart-dropdown/index.js.map +1 -0
  12. package/dist/components/cart-mismatch-banner/index.d.ts +3 -3
  13. package/dist/components/cart-mismatch-banner/index.d.ts.map +1 -1
  14. package/dist/components/cart-mismatch-banner/index.js +1 -8
  15. package/dist/components/cart-mismatch-banner/index.js.map +1 -1
  16. package/dist/components/country-select/index.d.ts +1 -1
  17. package/dist/components/delete-button/index.d.ts +2 -2
  18. package/dist/components/delete-button/index.js +27 -11
  19. package/dist/components/delete-button/index.js.map +1 -0
  20. package/dist/components/error-message/index.d.ts +2 -2
  21. package/dist/components/error-message/index.d.ts.map +1 -1
  22. package/dist/components/footer/index.d.ts +2 -2
  23. package/dist/components/footer/index.d.ts.map +1 -1
  24. package/dist/components/footer/index.js +5 -10
  25. package/dist/components/footer/index.js.map +1 -1
  26. package/dist/components/free-shipping-price-nudge/index.d.ts +3 -3
  27. package/dist/components/free-shipping-price-nudge/index.d.ts.map +1 -1
  28. package/dist/components/free-shipping-price-nudge/index.js +2 -2
  29. package/dist/components/interactive-link/index.d.ts +2 -2
  30. package/dist/components/interactive-link/index.js +1 -1
  31. package/dist/components/layout-country-select/index.d.ts +4 -4
  32. package/dist/components/layout-country-select/index.js +89 -11
  33. package/dist/components/layout-country-select/index.js.map +1 -0
  34. package/dist/components/line-item-options/index.d.ts +3 -3
  35. package/dist/components/line-item-options/index.js +15 -2
  36. package/dist/components/line-item-options/index.js.map +1 -0
  37. package/dist/components/line-item-price/index.d.ts +3 -3
  38. package/dist/components/line-item-price/index.d.ts.map +1 -1
  39. package/dist/components/line-item-price/index.js +46 -2
  40. package/dist/components/line-item-price/index.js.map +1 -0
  41. package/dist/components/localized-client-link/index.d.ts +5 -12
  42. package/dist/components/localized-client-link/index.d.ts.map +1 -1
  43. package/dist/components/localized-client-link/index.js +19 -2
  44. package/dist/components/localized-client-link/index.js.map +1 -0
  45. package/dist/components/modal/index.d.ts +2 -2
  46. package/dist/components/modal/index.js +101 -3
  47. package/dist/components/modal/index.js.map +1 -0
  48. package/dist/components/nav/index.d.ts +2 -2
  49. package/dist/components/nav/index.js +6 -25
  50. package/dist/components/nav/index.js.map +1 -1
  51. package/dist/components/portable-text/index.d.ts +3 -3
  52. package/dist/components/portable-text/index.js +329 -2
  53. package/dist/components/portable-text/index.js.map +1 -0
  54. package/dist/components/preview-price/index.d.ts +1 -1
  55. package/dist/components/preview-price/index.js +19 -2
  56. package/dist/components/preview-price/index.js.map +1 -0
  57. package/dist/components/product-card/index.d.ts +2 -2
  58. package/dist/components/product-card/index.d.ts.map +1 -1
  59. package/dist/components/product-card/index.js +3 -4
  60. package/dist/components/product-card/index.js.map +1 -1
  61. package/dist/components/product-preview/index.d.ts +3 -3
  62. package/dist/components/product-preview/index.d.ts.map +1 -1
  63. package/dist/components/product-preview/index.js +4 -4
  64. package/dist/components/search-modal/index.d.ts +2 -2
  65. package/dist/components/search-modal/index.d.ts.map +1 -1
  66. package/dist/components/search-modal/index.js +135 -9
  67. package/dist/components/search-modal/index.js.map +1 -0
  68. package/dist/components/side-menu/index.d.ts +3 -3
  69. package/dist/components/side-menu/index.js +96 -13
  70. package/dist/components/side-menu/index.js.map +1 -0
  71. package/dist/components/thumbnail/index.js +43 -2
  72. package/dist/components/thumbnail/index.js.map +1 -0
  73. package/dist/lib/config/medusa.js +11 -2
  74. package/dist/lib/config/medusa.js.map +1 -0
  75. package/dist/lib/context/apollo-context.js +1 -2
  76. package/dist/lib/context/apollo-context.js.map +1 -1
  77. package/dist/lib/context/modal-context.d.ts +2 -2
  78. package/dist/lib/context/modal-context.js +19 -2
  79. package/dist/lib/context/modal-context.js.map +1 -0
  80. package/dist/lib/data/cart.d.ts +1 -1
  81. package/dist/lib/data/cart.d.ts.map +1 -1
  82. package/dist/lib/data/cart.js +102 -10
  83. package/dist/lib/data/cart.js.map +1 -0
  84. package/dist/lib/data/categories.d.ts +1 -1
  85. package/dist/lib/data/categories.js +15 -5
  86. package/dist/lib/data/categories.js.map +1 -0
  87. package/dist/lib/data/collections.d.ts +1 -1
  88. package/dist/lib/data/collections.js +21 -5
  89. package/dist/lib/data/collections.js.map +1 -0
  90. package/dist/lib/data/cookies.d.ts +2 -1
  91. package/dist/lib/data/cookies.d.ts.map +1 -1
  92. package/dist/lib/data/cookies.js +45 -2
  93. package/dist/lib/data/cookies.js.map +1 -0
  94. package/dist/lib/data/customer.d.ts +1 -1
  95. package/dist/lib/data/customer.d.ts.map +1 -1
  96. package/dist/lib/data/customer.js +39 -9
  97. package/dist/lib/data/customer.js.map +1 -0
  98. package/dist/lib/data/footer.js +15 -4
  99. package/dist/lib/data/footer.js.map +1 -0
  100. package/dist/lib/data/orders.d.ts +1 -1
  101. package/dist/lib/data/orders.js +4 -4
  102. package/dist/lib/data/regions.d.ts +1 -1
  103. package/dist/lib/data/regions.js +33 -4
  104. package/dist/lib/data/regions.js.map +1 -0
  105. package/dist/lib/data/search.d.ts +1 -1
  106. package/dist/lib/data/search.js +20 -5
  107. package/dist/lib/data/search.js.map +1 -0
  108. package/dist/lib/gql/apollo-client.js +66 -2
  109. package/dist/lib/gql/apollo-client.js.map +1 -0
  110. package/dist/lib/gql/fragments/cart.d.ts +9 -9
  111. package/dist/lib/gql/fragments/cart.d.ts.map +1 -1
  112. package/dist/lib/gql/fragments/cart.js +141 -3
  113. package/dist/{cart-BNoIGQmw.js.map → lib/gql/fragments/cart.js.map} +1 -1
  114. package/dist/lib/gql/fragments/customer.d.ts +3 -3
  115. package/dist/lib/gql/fragments/customer.js +41 -2
  116. package/dist/{customer-CgN4zI00.js.map → lib/gql/fragments/customer.js.map} +1 -1
  117. package/dist/lib/gql/fragments/product.d.ts +8 -8
  118. package/dist/lib/gql/fragments/product.js +89 -2
  119. package/dist/{product-COu5D1mS.js.map → lib/gql/fragments/product.js.map} +1 -1
  120. package/dist/lib/gql/mutations/cart.d.ts +4 -4
  121. package/dist/lib/gql/mutations/cart.d.ts.map +1 -1
  122. package/dist/lib/gql/mutations/cart.js +41 -4
  123. package/dist/{cart-IHaLnQC4.js.map → lib/gql/mutations/cart.js.map} +1 -1
  124. package/dist/lib/gql/mutations/customer.js +0 -1
  125. package/dist/lib/gql/queries/cart.d.ts +2 -2
  126. package/dist/lib/gql/queries/cart.d.ts.map +1 -1
  127. package/dist/lib/gql/queries/cart.js +15 -4
  128. package/dist/{cart-DH8urwwT.js.map → lib/gql/queries/cart.js.map} +1 -1
  129. package/dist/lib/gql/queries/collections.d.ts +2 -2
  130. package/dist/lib/gql/queries/collections.d.ts.map +1 -1
  131. package/dist/lib/gql/queries/collections.js +19 -3
  132. package/dist/{collections-DMv3UYgC.js.map → lib/gql/queries/collections.js.map} +1 -1
  133. package/dist/lib/gql/queries/customer.d.ts +2 -2
  134. package/dist/lib/gql/queries/customer.d.ts.map +1 -1
  135. package/dist/lib/gql/queries/customer.js +15 -3
  136. package/dist/{customer-DIJz6m7L.js.map → lib/gql/queries/customer.js.map} +1 -1
  137. package/dist/lib/gql/queries/footer.d.ts +2 -2
  138. package/dist/lib/gql/queries/footer.d.ts.map +1 -1
  139. package/dist/lib/gql/queries/footer.js +21 -2
  140. package/dist/lib/gql/queries/footer.js.map +1 -0
  141. package/dist/lib/gql/queries/product.d.ts +3 -3
  142. package/dist/lib/gql/queries/product.d.ts.map +1 -1
  143. package/dist/lib/gql/queries/product.js +46 -3
  144. package/dist/{product-C3HQUIgX.js.map → lib/gql/queries/product.js.map} +1 -1
  145. package/dist/lib/hooks/use-apollo.d.ts +2 -2
  146. package/dist/lib/hooks/use-apollo.js +10 -3
  147. package/dist/lib/hooks/use-apollo.js.map +1 -0
  148. package/dist/lib/hooks/use-search.d.ts +1 -1
  149. package/dist/lib/hooks/use-search.js +66 -6
  150. package/dist/lib/hooks/use-search.js.map +1 -0
  151. package/dist/lib/hooks/use-toggle-state.d.ts +23 -2
  152. package/dist/lib/hooks/use-toggle-state.d.ts.map +1 -0
  153. package/dist/lib/utils/data-types.js +9 -2
  154. package/dist/lib/utils/data-types.js.map +1 -0
  155. package/dist/lib/utils/env.js +1 -1
  156. package/dist/lib/utils/env.js.map +1 -1
  157. package/dist/lib/utils/get-percentage-diff.js +7 -2
  158. package/dist/lib/utils/get-percentage-diff.js.map +1 -0
  159. package/dist/lib/utils/get-product-price.d.ts +1 -1
  160. package/dist/lib/utils/get-product-price.js +46 -2
  161. package/dist/lib/utils/get-product-price.js.map +1 -0
  162. package/dist/lib/utils/medusa-error.js +16 -2
  163. package/dist/lib/utils/medusa-error.js.map +1 -0
  164. package/dist/lib/utils/money.js +14 -2
  165. package/dist/lib/utils/money.js.map +1 -0
  166. package/dist/lib/utils/normalize-functions.d.ts +1 -1
  167. package/dist/lib/utils/normalize-functions.js +69 -2
  168. package/dist/lib/utils/normalize-functions.js.map +1 -0
  169. package/dist/types/graphql.d.ts +1368 -2
  170. package/dist/types/graphql.d.ts.map +1 -0
  171. package/dist/types/prices.d.ts +20 -2
  172. package/dist/types/prices.d.ts.map +1 -0
  173. package/dist/types/prices.js +0 -1
  174. package/package.json +12 -12
  175. package/dist/apollo-client-Bw50r80c.js +0 -66
  176. package/dist/apollo-client-Bw50r80c.js.map +0 -1
  177. package/dist/cart-BNoIGQmw.js +0 -142
  178. package/dist/cart-DH8urwwT.js +0 -16
  179. package/dist/cart-IHaLnQC4.js +0 -42
  180. package/dist/cart-button-Dj_zRxop.js +0 -12
  181. package/dist/cart-button-Dj_zRxop.js.map +0 -1
  182. package/dist/cart-dropdown-D_PUJarp.js +0 -195
  183. package/dist/cart-dropdown-D_PUJarp.js.map +0 -1
  184. package/dist/cart-xkcyWLfU.js +0 -103
  185. package/dist/cart-xkcyWLfU.js.map +0 -1
  186. package/dist/categories-B-RYCIZ3.js +0 -16
  187. package/dist/categories-B-RYCIZ3.js.map +0 -1
  188. package/dist/collections-BgyvhW2p.js +0 -22
  189. package/dist/collections-BgyvhW2p.js.map +0 -1
  190. package/dist/collections-DMv3UYgC.js +0 -20
  191. package/dist/cookies-lksVIe4_.js +0 -38
  192. package/dist/cookies-lksVIe4_.js.map +0 -1
  193. package/dist/customer-CgN4zI00.js +0 -42
  194. package/dist/customer-ClewjBBr.js +0 -38
  195. package/dist/customer-ClewjBBr.js.map +0 -1
  196. package/dist/customer-DIJz6m7L.js +0 -16
  197. package/dist/data-types-CTPJXmJH.js +0 -10
  198. package/dist/data-types-CTPJXmJH.js.map +0 -1
  199. package/dist/delete-button-Bnm5bof2.js +0 -28
  200. package/dist/delete-button-Bnm5bof2.js.map +0 -1
  201. package/dist/footer-BvNV-R9D.js +0 -16
  202. package/dist/footer-BvNV-R9D.js.map +0 -1
  203. package/dist/footer-DCtgtjKS.js +0 -76
  204. package/dist/footer-DCtgtjKS.js.map +0 -1
  205. package/dist/get-percentage-diff-B_UVOFgE.js +0 -8
  206. package/dist/get-percentage-diff-B_UVOFgE.js.map +0 -1
  207. package/dist/get-product-price-DKWc76ev.js +0 -47
  208. package/dist/get-product-price-DKWc76ev.js.map +0 -1
  209. package/dist/graphql-CdTGi4Pp.d.ts +0 -1368
  210. package/dist/graphql-CdTGi4Pp.d.ts.map +0 -1
  211. package/dist/layout-country-select-C7Ra-opl.js +0 -90
  212. package/dist/layout-country-select-C7Ra-opl.js.map +0 -1
  213. package/dist/line-item-options-l_eRZIIq.js +0 -16
  214. package/dist/line-item-options-l_eRZIIq.js.map +0 -1
  215. package/dist/line-item-price-BlTwskFC.js +0 -47
  216. package/dist/line-item-price-BlTwskFC.js.map +0 -1
  217. package/dist/localized-client-link-CthmRcvb.js +0 -22
  218. package/dist/localized-client-link-CthmRcvb.js.map +0 -1
  219. package/dist/medusa-TumrpCF2.js +0 -12
  220. package/dist/medusa-TumrpCF2.js.map +0 -1
  221. package/dist/medusa-error-DDhA6RGC.js +0 -17
  222. package/dist/medusa-error-DDhA6RGC.js.map +0 -1
  223. package/dist/modal-BASYY-YM.js +0 -102
  224. package/dist/modal-BASYY-YM.js.map +0 -1
  225. package/dist/modal-context-02cA-7jy.js +0 -20
  226. package/dist/modal-context-02cA-7jy.js.map +0 -1
  227. package/dist/money-DVQGzXns.js +0 -15
  228. package/dist/money-DVQGzXns.js.map +0 -1
  229. package/dist/normalize-functions-Bqr-JkYn.js +0 -70
  230. package/dist/normalize-functions-Bqr-JkYn.js.map +0 -1
  231. package/dist/portable-text-CuI022GH.js +0 -330
  232. package/dist/portable-text-CuI022GH.js.map +0 -1
  233. package/dist/preview-price-_4sxkXQs.js +0 -20
  234. package/dist/preview-price-_4sxkXQs.js.map +0 -1
  235. package/dist/prices-eO1YBciD.d.ts +0 -20
  236. package/dist/prices-eO1YBciD.d.ts.map +0 -1
  237. package/dist/product-C3HQUIgX.js +0 -47
  238. package/dist/product-COu5D1mS.js +0 -90
  239. package/dist/regions-r1AvxfT8.js +0 -34
  240. package/dist/regions-r1AvxfT8.js.map +0 -1
  241. package/dist/search-D7Gw7jAk.js +0 -21
  242. package/dist/search-D7Gw7jAk.js.map +0 -1
  243. package/dist/search-modal-DaXadYWM.js +0 -137
  244. package/dist/search-modal-DaXadYWM.js.map +0 -1
  245. package/dist/side-menu-B6IjTd5M.js +0 -97
  246. package/dist/side-menu-B6IjTd5M.js.map +0 -1
  247. package/dist/thumbnail-C0TU3rh-.js +0 -44
  248. package/dist/thumbnail-C0TU3rh-.js.map +0 -1
  249. package/dist/use-apollo-BxAFd1Y5.js +0 -11
  250. package/dist/use-apollo-BxAFd1Y5.js.map +0 -1
  251. package/dist/use-search-VX-u8o1D.js +0 -67
  252. package/dist/use-search-VX-u8o1D.js.map +0 -1
  253. package/dist/use-toggle-state-DI4Gwlfj.d.ts +0 -23
  254. package/dist/use-toggle-state-DI4Gwlfj.d.ts.map +0 -1
@@ -1,3 +1,330 @@
1
- import { t as PortableText } from "../../portable-text-CuI022GH.js";
1
+ import { Fragment } from "react";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { Heading, Text } from "@medusajs/ui";
4
+ import { ArrowUpRightMini } from "@medusajs/icons";
5
+ import Image from "next/image";
6
+ import { PlaceholderImage } from "@gfed-medusa/sf-lib-ui/icons/placeholder-image";
7
+ import { Back } from "@gfed-medusa/sf-lib-ui/icons/back";
8
+ import { Bancontact } from "@gfed-medusa/sf-lib-ui/icons/bancontact";
9
+ import { ChevronDown } from "@gfed-medusa/sf-lib-ui/icons/chevron-down";
10
+ import { Eye } from "@gfed-medusa/sf-lib-ui/icons/eye";
11
+ import { EyeOff } from "@gfed-medusa/sf-lib-ui/icons/eye-off";
12
+ import { FastDelivery } from "@gfed-medusa/sf-lib-ui/icons/fast-delivery";
13
+ import { Ideal } from "@gfed-medusa/sf-lib-ui/icons/ideal";
14
+ import { MapPin } from "@gfed-medusa/sf-lib-ui/icons/map-pin";
15
+ import { Medusa } from "@gfed-medusa/sf-lib-ui/icons/medusa";
16
+ import { NextJs } from "@gfed-medusa/sf-lib-ui/icons/nextjs";
17
+ import { Package } from "@gfed-medusa/sf-lib-ui/icons/package";
18
+ import { PayPal } from "@gfed-medusa/sf-lib-ui/icons/paypal";
19
+ import { Refresh } from "@gfed-medusa/sf-lib-ui/icons/refresh";
20
+ import { Spinner as Spinner$1 } from "@gfed-medusa/sf-lib-ui/icons/spinner";
21
+ import { Trash as Trash$1 } from "@gfed-medusa/sf-lib-ui/icons/trash";
22
+ import { User } from "@gfed-medusa/sf-lib-ui/icons/user";
23
+ import { X } from "@gfed-medusa/sf-lib-ui/icons/x";
2
24
 
3
- export { PortableText };
25
+ //#region src/components/portable-text/index.tsx
26
+ const PortableText = ({ value }) => {
27
+ if (!value || !Array.isArray(value)) return null;
28
+ const getBlockType = (block) => {
29
+ if (block.__typename) {
30
+ const typename = block.__typename.toLowerCase();
31
+ if (typename === "textblock") return "block";
32
+ return typename.replace("block", "");
33
+ }
34
+ return "unknown";
35
+ };
36
+ const renderSpan = (span, markDefs) => {
37
+ if (!span.text) return null;
38
+ let content = span.text;
39
+ const marks = span.marks || [];
40
+ marks.forEach((mark) => {
41
+ if (typeof mark === "string") switch (mark) {
42
+ case "strong":
43
+ content = /* @__PURE__ */ jsx("strong", { children: content });
44
+ break;
45
+ case "em":
46
+ content = /* @__PURE__ */ jsx("em", { children: content });
47
+ break;
48
+ case "code":
49
+ content = /* @__PURE__ */ jsx("code", {
50
+ className: "bg-ui-bg-subtle rounded px-1 py-0.5 font-mono text-sm",
51
+ children: content
52
+ });
53
+ break;
54
+ case "underline":
55
+ content = /* @__PURE__ */ jsx("u", { children: content });
56
+ break;
57
+ case "superscript":
58
+ content = /* @__PURE__ */ jsx("sup", { children: content });
59
+ break;
60
+ case "subscript":
61
+ content = /* @__PURE__ */ jsx("sub", { children: content });
62
+ break;
63
+ }
64
+ });
65
+ const getMarkByKey = (key) => {
66
+ return markDefs?.find((def) => def._key === key);
67
+ };
68
+ const linkMark = marks.find((mark) => {
69
+ if (typeof mark === "object") return mark;
70
+ if (typeof mark === "string") {
71
+ const markDef = getMarkByKey(mark);
72
+ return markDef && (markDef._type === "link" || markDef.__typename === "LinkMark");
73
+ }
74
+ return false;
75
+ });
76
+ const iconLinkMark = marks.find((mark) => {
77
+ if (typeof mark === "object") return mark;
78
+ if (typeof mark === "string") {
79
+ const markDef = getMarkByKey(mark);
80
+ return markDef && (markDef._type === "iconlink" || markDef.__typename === "IconLinkMark");
81
+ }
82
+ return false;
83
+ });
84
+ const resolvedIconLinkMark = typeof iconLinkMark === "string" ? (() => {
85
+ const mark = getMarkByKey(iconLinkMark);
86
+ return mark && (mark.__typename === "IconLinkMark" || mark._type === "iconlink") ? mark : void 0;
87
+ })() : iconLinkMark ? iconLinkMark : void 0;
88
+ const resolvedLinkMark = typeof linkMark === "string" ? getMarkByKey(linkMark) : linkMark;
89
+ if (resolvedIconLinkMark) return renderIconLink(resolvedIconLinkMark, content);
90
+ if (resolvedLinkMark) return /* @__PURE__ */ jsx("a", {
91
+ href: resolvedLinkMark.href,
92
+ target: resolvedLinkMark.target ?? "",
93
+ className: "text-ui-fg-interactive hover:underline",
94
+ children: content
95
+ });
96
+ return content;
97
+ };
98
+ const renderIconLink = (mark, children) => {
99
+ const renderIcon = () => {
100
+ switch (mark.iconType) {
101
+ case "class": return mark.iconClass ? /* @__PURE__ */ jsx("i", { className: mark.iconClass }) : null;
102
+ case "component": switch (mark.iconComponent) {
103
+ case "ArrowUpRightMini": return /* @__PURE__ */ jsx(ArrowUpRightMini, {
104
+ fill: mark.iconFill ?? "",
105
+ className: "h-4 w-4"
106
+ });
107
+ case "Back": return /* @__PURE__ */ jsx(Back, {
108
+ size: 16,
109
+ fill: mark.iconFill ?? ""
110
+ });
111
+ case "Bancontact": return /* @__PURE__ */ jsx(Bancontact, {
112
+ size: 16,
113
+ fill: mark.iconFill ?? ""
114
+ });
115
+ case "ChevronDown": return /* @__PURE__ */ jsx(ChevronDown, {
116
+ size: 16,
117
+ fill: mark.iconFill ?? ""
118
+ });
119
+ case "Eye": return /* @__PURE__ */ jsx(Eye, {
120
+ size: 16,
121
+ fill: mark.iconFill ?? ""
122
+ });
123
+ case "EyeOff": return /* @__PURE__ */ jsx(EyeOff, {
124
+ size: 16,
125
+ fill: mark.iconFill ?? ""
126
+ });
127
+ case "FastDelivery": return /* @__PURE__ */ jsx(FastDelivery, {
128
+ size: 16,
129
+ fill: mark.iconFill ?? ""
130
+ });
131
+ case "Ideal": return /* @__PURE__ */ jsx(Ideal, {
132
+ size: 16,
133
+ fill: mark.iconFill ?? ""
134
+ });
135
+ case "MapPin": return /* @__PURE__ */ jsx(MapPin, {
136
+ size: 16,
137
+ fill: mark.iconFill ?? ""
138
+ });
139
+ case "Medusa": return /* @__PURE__ */ jsx(Medusa, {
140
+ size: 16,
141
+ fill: mark.iconFill ?? ""
142
+ });
143
+ case "NextJs": return /* @__PURE__ */ jsx(NextJs, {
144
+ size: 16,
145
+ fill: mark.iconFill ?? ""
146
+ });
147
+ case "Package": return /* @__PURE__ */ jsx(Package, {
148
+ size: 16,
149
+ fill: mark.iconFill ?? ""
150
+ });
151
+ case "PayPal": return /* @__PURE__ */ jsx(PayPal, {});
152
+ case "PlaceholderImage": return /* @__PURE__ */ jsx(PlaceholderImage, {
153
+ size: 16,
154
+ fill: mark.iconFill ?? ""
155
+ });
156
+ case "Refresh": return /* @__PURE__ */ jsx(Refresh, {
157
+ size: 16,
158
+ fill: mark.iconFill ?? ""
159
+ });
160
+ case "Spinner": return /* @__PURE__ */ jsx(Spinner$1, {
161
+ size: 16,
162
+ fill: mark.iconFill ?? ""
163
+ });
164
+ case "Trash": return /* @__PURE__ */ jsx(Trash$1, {
165
+ size: 16,
166
+ fill: mark.iconFill ?? ""
167
+ });
168
+ case "User": return /* @__PURE__ */ jsx(User, {
169
+ size: 16,
170
+ fill: mark.iconFill ?? ""
171
+ });
172
+ case "X": return /* @__PURE__ */ jsx(X, {
173
+ size: 16,
174
+ fill: mark.iconFill ?? ""
175
+ });
176
+ default: return null;
177
+ }
178
+ case "sanity": return mark.iconImage?.asset?.url ? /* @__PURE__ */ jsx(Image, {
179
+ src: mark.iconImage.asset.url,
180
+ alt: mark.iconImage.alt || "Icon",
181
+ width: 16,
182
+ height: 16,
183
+ className: "h-4 w-4"
184
+ }) : null;
185
+ case "url": return mark.iconUrl ? /* @__PURE__ */ jsx(Image, {
186
+ src: mark.iconUrl,
187
+ alt: "Icon",
188
+ width: 16,
189
+ height: 16,
190
+ className: "h-4 w-4"
191
+ }) : null;
192
+ default: return null;
193
+ }
194
+ };
195
+ return /* @__PURE__ */ jsxs("a", {
196
+ href: mark.href,
197
+ target: mark.target ?? "",
198
+ className: "text-ui-fg-interactive inline-flex items-center gap-1 hover:underline",
199
+ children: [children, renderIcon()]
200
+ });
201
+ };
202
+ const renderTextBlock = (block) => {
203
+ const style = block.style || "normal";
204
+ const children = block.children || [];
205
+ const markDefs = block.markDefs || [];
206
+ const content = children.map((child, index) => /* @__PURE__ */ jsx(Fragment, { children: renderSpan(child, markDefs) }, child._key || index));
207
+ switch (style) {
208
+ case "h1": return /* @__PURE__ */ jsx("h1", {
209
+ className: "mt-8 mb-6 text-4xl font-bold",
210
+ children: content
211
+ });
212
+ case "h2": return /* @__PURE__ */ jsx(Heading, {
213
+ level: "h2",
214
+ className: "mt-6 mb-4 text-3xl font-semibold",
215
+ children: content
216
+ });
217
+ case "h3": return /* @__PURE__ */ jsx(Heading, {
218
+ level: "h3",
219
+ className: "mt-6 mb-4 text-2xl font-semibold",
220
+ children: content
221
+ });
222
+ case "h4": return /* @__PURE__ */ jsx("h4", {
223
+ className: "mt-4 mb-3 text-xl font-semibold",
224
+ children: content
225
+ });
226
+ case "h5": return /* @__PURE__ */ jsx("h5", {
227
+ className: "mt-4 mb-3 text-lg font-semibold",
228
+ children: content
229
+ });
230
+ case "h6": return /* @__PURE__ */ jsx("h6", {
231
+ className: "mt-4 mb-2 text-base font-semibold",
232
+ children: content
233
+ });
234
+ case "blockquote": return /* @__PURE__ */ jsx("blockquote", {
235
+ className: "border-ui-border-base my-4 border-l-4 py-2 pl-4 italic",
236
+ children: /* @__PURE__ */ jsx(Text, { children: content })
237
+ });
238
+ default: return /* @__PURE__ */ jsx(Text, {
239
+ className: "mb-4 leading-relaxed",
240
+ children: content
241
+ });
242
+ }
243
+ };
244
+ const renderImage = (image) => {
245
+ if (!image.asset?.url) return null;
246
+ return /* @__PURE__ */ jsx("div", {
247
+ className: "my-6",
248
+ children: /* @__PURE__ */ jsx(Image, {
249
+ src: image.asset.url,
250
+ alt: image.alt || "",
251
+ width: 800,
252
+ height: 400,
253
+ className: "h-auto w-full rounded-lg"
254
+ })
255
+ });
256
+ };
257
+ const renderFileBlock = (file) => {
258
+ if (!file.asset?.url) return null;
259
+ return /* @__PURE__ */ jsx("div", {
260
+ className: "my-6",
261
+ children: /* @__PURE__ */ jsxs("a", {
262
+ href: file.asset.url,
263
+ target: "_blank",
264
+ rel: "noopener noreferrer",
265
+ className: "border-ui-border-base text-ui-fg-interactive hover:bg-ui-bg-subtle inline-flex items-center gap-2 rounded-lg border p-4",
266
+ children: [
267
+ /* @__PURE__ */ jsx("span", { children: "📎" }),
268
+ /* @__PURE__ */ jsx("span", { children: file.asset.originalFilename || "Download file" }),
269
+ file.asset.size && /* @__PURE__ */ jsxs("span", {
270
+ className: "text-ui-fg-muted text-sm",
271
+ children: [
272
+ "(",
273
+ Math.round(file.asset.size / 1024),
274
+ " KB)"
275
+ ]
276
+ })
277
+ ]
278
+ })
279
+ });
280
+ };
281
+ const renderList = (items, listType) => {
282
+ return /* @__PURE__ */ jsx(listType === "bullet" ? "ul" : "ol", {
283
+ className: listType === "bullet" ? "list-disc pl-6 mb-4 space-y-1" : "list-decimal pl-6 mb-4 space-y-1",
284
+ children: items.map((item) => {
285
+ const markDefs = item.markDefs || [];
286
+ return /* @__PURE__ */ jsx("li", {
287
+ className: "leading-relaxed",
288
+ children: item.children?.map((child, childIndex) => /* @__PURE__ */ jsx(Fragment, { children: renderSpan(child, markDefs) }, child._key || childIndex))
289
+ }, item._key);
290
+ })
291
+ });
292
+ };
293
+ const renderBlock = (block) => {
294
+ const blockType = getBlockType(block);
295
+ if (blockType === "block" || blockType === "textblock" || blockType === "text") return renderTextBlock(block);
296
+ if (blockType === "image" || blockType === "imageblock") return renderImage(block);
297
+ if (blockType === "file" || blockType === "fileblock") return renderFileBlock(block);
298
+ return null;
299
+ };
300
+ const processedContent = [];
301
+ let currentListItems = [];
302
+ let currentListType = null;
303
+ value.forEach((block, index) => {
304
+ if (getBlockType(block) === "block" && block.listItem) {
305
+ const textBlock = block;
306
+ const listItem = textBlock.listItem || null;
307
+ if (currentListType !== listItem) {
308
+ if (currentListItems.length > 0 && currentListType) processedContent.push(/* @__PURE__ */ jsx(Fragment, { children: renderList(currentListItems, currentListType) }, `list-${index}`));
309
+ currentListItems = [textBlock];
310
+ currentListType = listItem;
311
+ } else currentListItems.push(textBlock);
312
+ } else {
313
+ if (currentListItems.length > 0 && currentListType) {
314
+ processedContent.push(/* @__PURE__ */ jsx(Fragment, { children: renderList(currentListItems, currentListType) }, `list-${index}`));
315
+ currentListItems = [];
316
+ currentListType = null;
317
+ }
318
+ processedContent.push(/* @__PURE__ */ jsx(Fragment, { children: renderBlock(block) }, block._key || index));
319
+ }
320
+ });
321
+ if (currentListItems.length > 0 && currentListType) processedContent.push(/* @__PURE__ */ jsx(Fragment, { children: renderList(currentListItems, currentListType) }, "final-list"));
322
+ return /* @__PURE__ */ jsx("div", {
323
+ className: "prose prose-ui max-w-none",
324
+ children: processedContent
325
+ });
326
+ };
327
+
328
+ //#endregion
329
+ export { PortableText };
330
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["content: ReactNode","resolvedIconLinkMark: IconLinkMark | undefined","Spinner","Trash","processedContent: ReactNode[]","currentListItems: TextBlock[]","currentListType: string | null"],"sources":["../../../src/components/portable-text/index.tsx"],"sourcesContent":["import { Fragment, ReactNode } from 'react';\n\nimport Image from 'next/image';\n\nimport { Back } from '@gfed-medusa/sf-lib-ui/icons/back';\nimport { Bancontact } from '@gfed-medusa/sf-lib-ui/icons/bancontact';\nimport { ChevronDown } from '@gfed-medusa/sf-lib-ui/icons/chevron-down';\nimport { Eye } from '@gfed-medusa/sf-lib-ui/icons/eye';\nimport { EyeOff } from '@gfed-medusa/sf-lib-ui/icons/eye-off';\nimport { FastDelivery } from '@gfed-medusa/sf-lib-ui/icons/fast-delivery';\nimport { Ideal } from '@gfed-medusa/sf-lib-ui/icons/ideal';\nimport { MapPin } from '@gfed-medusa/sf-lib-ui/icons/map-pin';\nimport { Medusa } from '@gfed-medusa/sf-lib-ui/icons/medusa';\nimport { NextJs } from '@gfed-medusa/sf-lib-ui/icons/nextjs';\nimport { Package } from '@gfed-medusa/sf-lib-ui/icons/package';\nimport { PayPal } from '@gfed-medusa/sf-lib-ui/icons/paypal';\nimport { PlaceholderImage } from '@gfed-medusa/sf-lib-ui/icons/placeholder-image';\nimport { Refresh } from '@gfed-medusa/sf-lib-ui/icons/refresh';\nimport { Spinner } from '@gfed-medusa/sf-lib-ui/icons/spinner';\nimport { Trash } from '@gfed-medusa/sf-lib-ui/icons/trash';\nimport { User } from '@gfed-medusa/sf-lib-ui/icons/user';\nimport { X } from '@gfed-medusa/sf-lib-ui/icons/x';\nimport { ArrowUpRightMini } from '@medusajs/icons';\nimport { Heading, Text } from '@medusajs/ui';\n\nimport {\n FileBlock,\n IconLinkMark,\n ImageBlock,\n RichTextBlock,\n Span,\n TextBlock,\n} from '@/types/graphql';\n\ntype PortableTextProps = {\n value: RichTextBlock[];\n};\n\nconst PortableText = ({ value }: PortableTextProps) => {\n if (!value || !Array.isArray(value)) {\n return null;\n }\n\n const getBlockType = (block: RichTextBlock): string => {\n if (block.__typename) {\n const typename = block.__typename.toLowerCase();\n if (typename === 'textblock') return 'block';\n return typename.replace('block', '');\n }\n return 'unknown';\n };\n\n const renderSpan = (\n span: Span,\n markDefs: TextBlock['markDefs']\n ): ReactNode => {\n if (!span.text) return null;\n\n let content: ReactNode = span.text;\n const marks = span.marks || [];\n\n marks.forEach((mark) => {\n if (typeof mark === 'string') {\n switch (mark) {\n case 'strong':\n content = <strong>{content}</strong>;\n break;\n case 'em':\n content = <em>{content}</em>;\n break;\n case 'code':\n content = (\n <code className=\"bg-ui-bg-subtle rounded px-1 py-0.5 font-mono text-sm\">\n {content}\n </code>\n );\n break;\n case 'underline':\n content = <u>{content}</u>;\n break;\n case 'superscript':\n content = <sup>{content}</sup>;\n break;\n case 'subscript':\n content = <sub>{content}</sub>;\n break;\n }\n }\n });\n\n // Handle marks that reference markDefs by _key\n const getMarkByKey = (key: string) => {\n return markDefs?.find((def) => def._key === key);\n };\n\n // Find link marks (both direct objects and references)\n const linkMark = marks.find((mark) => {\n if (typeof mark === 'object') {\n return mark;\n }\n if (typeof mark === 'string') {\n const markDef = getMarkByKey(mark);\n return (\n markDef &&\n (markDef._type === 'link' || markDef.__typename === 'LinkMark')\n );\n }\n return false;\n });\n\n // Find icon link marks (both direct objects and references)\n const iconLinkMark = marks.find((mark) => {\n if (typeof mark === 'object') {\n return mark;\n }\n if (typeof mark === 'string') {\n const markDef = getMarkByKey(mark);\n return (\n markDef &&\n (markDef._type === 'iconlink' ||\n markDef.__typename === 'IconLinkMark')\n );\n }\n return false;\n });\n\n // Get the actual mark object (either direct or from markDefs)\n const resolvedIconLinkMark: IconLinkMark | undefined =\n typeof iconLinkMark === 'string'\n ? (() => {\n const mark = getMarkByKey(iconLinkMark);\n return mark &&\n (mark.__typename === 'IconLinkMark' || mark._type === 'iconlink')\n ? (mark as IconLinkMark)\n : undefined;\n })()\n : iconLinkMark\n ? (iconLinkMark as IconLinkMark)\n : undefined;\n const resolvedLinkMark =\n typeof linkMark === 'string' ? getMarkByKey(linkMark) : linkMark;\n\n if (resolvedIconLinkMark) {\n return renderIconLink(resolvedIconLinkMark, content);\n }\n\n if (resolvedLinkMark) {\n return (\n <a\n href={resolvedLinkMark.href}\n target={resolvedLinkMark.target ?? ''}\n className=\"text-ui-fg-interactive hover:underline\"\n >\n {content}\n </a>\n );\n }\n\n return content;\n };\n\n const renderIconLink = (\n mark: IconLinkMark,\n children: ReactNode\n ): ReactNode => {\n const renderIcon = () => {\n switch (mark.iconType) {\n case 'class':\n return mark.iconClass ? <i className={mark.iconClass} /> : null;\n case 'component':\n switch (mark.iconComponent) {\n case 'ArrowUpRightMini':\n return (\n <ArrowUpRightMini\n fill={mark.iconFill ?? ''}\n className=\"h-4 w-4\"\n />\n );\n case 'Back':\n return <Back size={16} fill={mark.iconFill ?? ''} />;\n case 'Bancontact':\n return <Bancontact size={16} fill={mark.iconFill ?? ''} />;\n case 'ChevronDown':\n return <ChevronDown size={16} fill={mark.iconFill ?? ''} />;\n case 'Eye':\n return <Eye size={16} fill={mark.iconFill ?? ''} />;\n case 'EyeOff':\n return <EyeOff size={16} fill={mark.iconFill ?? ''} />;\n case 'FastDelivery':\n return <FastDelivery size={16} fill={mark.iconFill ?? ''} />;\n case 'Ideal':\n return <Ideal size={16} fill={mark.iconFill ?? ''} />;\n case 'MapPin':\n return <MapPin size={16} fill={mark.iconFill ?? ''} />;\n case 'Medusa':\n return <Medusa size={16} fill={mark.iconFill ?? ''} />;\n case 'NextJs':\n return <NextJs size={16} fill={mark.iconFill ?? ''} />;\n case 'Package':\n return <Package size={16} fill={mark.iconFill ?? ''} />;\n case 'PayPal':\n return <PayPal />;\n case 'PlaceholderImage':\n return <PlaceholderImage size={16} fill={mark.iconFill ?? ''} />;\n case 'Refresh':\n return <Refresh size={16} fill={mark.iconFill ?? ''} />;\n case 'Spinner':\n return <Spinner size={16} fill={mark.iconFill ?? ''} />;\n case 'Trash':\n return <Trash size={16} fill={mark.iconFill ?? ''} />;\n case 'User':\n return <User size={16} fill={mark.iconFill ?? ''} />;\n case 'X':\n return <X size={16} fill={mark.iconFill ?? ''} />;\n default:\n return null;\n }\n case 'sanity':\n return mark.iconImage?.asset?.url ? (\n <Image\n src={mark.iconImage.asset.url}\n alt={mark.iconImage.alt || 'Icon'}\n width={16}\n height={16}\n className=\"h-4 w-4\"\n />\n ) : null;\n case 'url':\n return mark.iconUrl ? (\n <Image\n src={mark.iconUrl}\n alt=\"Icon\"\n width={16}\n height={16}\n className=\"h-4 w-4\"\n />\n ) : null;\n default:\n return null;\n }\n };\n\n return (\n <a\n href={mark.href}\n target={mark.target ?? ''}\n className=\"text-ui-fg-interactive inline-flex items-center gap-1 hover:underline\"\n >\n {children}\n {renderIcon()}\n </a>\n );\n };\n\n const renderTextBlock = (block: TextBlock): ReactNode => {\n const style = block.style || 'normal';\n const children = block.children || [];\n const markDefs = block.markDefs || [];\n\n const content = children.map((child, index) => (\n <Fragment key={child._key || index}>\n {renderSpan(child, markDefs)}\n </Fragment>\n ));\n\n switch (style) {\n case 'h1':\n return <h1 className=\"mt-8 mb-6 text-4xl font-bold\">{content}</h1>;\n case 'h2':\n return (\n <Heading level=\"h2\" className=\"mt-6 mb-4 text-3xl font-semibold\">\n {content}\n </Heading>\n );\n case 'h3':\n return (\n <Heading level=\"h3\" className=\"mt-6 mb-4 text-2xl font-semibold\">\n {content}\n </Heading>\n );\n case 'h4':\n return <h4 className=\"mt-4 mb-3 text-xl font-semibold\">{content}</h4>;\n case 'h5':\n return <h5 className=\"mt-4 mb-3 text-lg font-semibold\">{content}</h5>;\n case 'h6':\n return <h6 className=\"mt-4 mb-2 text-base font-semibold\">{content}</h6>;\n case 'blockquote':\n return (\n <blockquote className=\"border-ui-border-base my-4 border-l-4 py-2 pl-4 italic\">\n <Text>{content}</Text>\n </blockquote>\n );\n default:\n return <Text className=\"mb-4 leading-relaxed\">{content}</Text>;\n }\n };\n\n const renderImage = (image: ImageBlock): ReactNode => {\n if (!image.asset?.url) return null;\n\n return (\n <div className=\"my-6\">\n <Image\n src={image.asset.url}\n alt={image.alt || ''}\n width={800}\n height={400}\n className=\"h-auto w-full rounded-lg\"\n />\n </div>\n );\n };\n\n const renderFileBlock = (file: FileBlock): ReactNode => {\n if (!file.asset?.url) return null;\n\n return (\n <div className=\"my-6\">\n <a\n href={file.asset.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"border-ui-border-base text-ui-fg-interactive hover:bg-ui-bg-subtle inline-flex items-center gap-2 rounded-lg border p-4\"\n >\n <span>📎</span>\n <span>{file.asset.originalFilename || 'Download file'}</span>\n {file.asset.size && (\n <span className=\"text-ui-fg-muted text-sm\">\n ({Math.round(file.asset.size / 1024)} KB)\n </span>\n )}\n </a>\n </div>\n );\n };\n\n const renderList = (items: TextBlock[], listType: string): ReactNode => {\n const ListComponent = listType === 'bullet' ? 'ul' : 'ol';\n const listClass =\n listType === 'bullet'\n ? 'list-disc pl-6 mb-4 space-y-1'\n : 'list-decimal pl-6 mb-4 space-y-1';\n\n return (\n <ListComponent className={listClass}>\n {items.map((item) => {\n const markDefs = item.markDefs || [];\n return (\n <li key={item._key} className=\"leading-relaxed\">\n {item.children?.map((child, childIndex) => (\n <Fragment key={child._key || childIndex}>\n {renderSpan(child, markDefs)}\n </Fragment>\n ))}\n </li>\n );\n })}\n </ListComponent>\n );\n };\n\n const renderBlock = (block: RichTextBlock): ReactNode => {\n const blockType = getBlockType(block);\n\n if (\n blockType === 'block' ||\n blockType === 'textblock' ||\n blockType === 'text'\n ) {\n return renderTextBlock(block as TextBlock);\n }\n\n if (blockType === 'image' || blockType === 'imageblock') {\n return renderImage(block as ImageBlock);\n }\n\n if (blockType === 'file' || blockType === 'fileblock') {\n return renderFileBlock(block as FileBlock);\n }\n\n return null;\n };\n\n // Process blocks and group consecutive list items\n const processedContent: ReactNode[] = [];\n let currentListItems: TextBlock[] = [];\n let currentListType: string | null = null;\n\n value.forEach((block: RichTextBlock, index: number) => {\n const blockType = getBlockType(block);\n\n if (blockType === 'block' && (block as TextBlock).listItem) {\n const textBlock = block as TextBlock;\n const listItem = textBlock.listItem || null;\n if (currentListType !== listItem) {\n if (currentListItems.length > 0 && currentListType) {\n processedContent.push(\n <Fragment key={`list-${index}`}>\n {renderList(currentListItems, currentListType)}\n </Fragment>\n );\n }\n currentListItems = [textBlock];\n currentListType = listItem;\n } else {\n currentListItems.push(textBlock);\n }\n } else {\n if (currentListItems.length > 0 && currentListType) {\n processedContent.push(\n <Fragment key={`list-${index}`}>\n {renderList(currentListItems, currentListType)}\n </Fragment>\n );\n currentListItems = [];\n currentListType = null;\n }\n processedContent.push(\n <Fragment key={block._key || index}>{renderBlock(block)}</Fragment>\n );\n }\n });\n\n if (currentListItems.length > 0 && currentListType) {\n processedContent.push(\n <Fragment key=\"final-list\">\n {renderList(currentListItems, currentListType)}\n </Fragment>\n );\n }\n\n return <div className=\"prose prose-ui max-w-none\">{processedContent}</div>;\n};\n\nexport { PortableText };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAsCA,MAAM,gBAAgB,EAAE,YAA+B;AACrD,KAAI,CAAC,SAAS,CAAC,MAAM,QAAQ,MAAM,CACjC,QAAO;CAGT,MAAM,gBAAgB,UAAiC;AACrD,MAAI,MAAM,YAAY;GACpB,MAAM,WAAW,MAAM,WAAW,aAAa;AAC/C,OAAI,aAAa,YAAa,QAAO;AACrC,UAAO,SAAS,QAAQ,SAAS,GAAG;;AAEtC,SAAO;;CAGT,MAAM,cACJ,MACA,aACc;AACd,MAAI,CAAC,KAAK,KAAM,QAAO;EAEvB,IAAIA,UAAqB,KAAK;EAC9B,MAAM,QAAQ,KAAK,SAAS,EAAE;AAE9B,QAAM,SAAS,SAAS;AACtB,OAAI,OAAO,SAAS,SAClB,SAAQ,MAAR;IACE,KAAK;AACH,eAAU,oBAAC,sBAAQ,UAAiB;AACpC;IACF,KAAK;AACH,eAAU,oBAAC,kBAAI,UAAa;AAC5B;IACF,KAAK;AACH,eACE,oBAAC;MAAK,WAAU;gBACb;OACI;AAET;IACF,KAAK;AACH,eAAU,oBAAC,iBAAG,UAAY;AAC1B;IACF,KAAK;AACH,eAAU,oBAAC,mBAAK,UAAc;AAC9B;IACF,KAAK;AACH,eAAU,oBAAC,mBAAK,UAAc;AAC9B;;IAGN;EAGF,MAAM,gBAAgB,QAAgB;AACpC,UAAO,UAAU,MAAM,QAAQ,IAAI,SAAS,IAAI;;EAIlD,MAAM,WAAW,MAAM,MAAM,SAAS;AACpC,OAAI,OAAO,SAAS,SAClB,QAAO;AAET,OAAI,OAAO,SAAS,UAAU;IAC5B,MAAM,UAAU,aAAa,KAAK;AAClC,WACE,YACC,QAAQ,UAAU,UAAU,QAAQ,eAAe;;AAGxD,UAAO;IACP;EAGF,MAAM,eAAe,MAAM,MAAM,SAAS;AACxC,OAAI,OAAO,SAAS,SAClB,QAAO;AAET,OAAI,OAAO,SAAS,UAAU;IAC5B,MAAM,UAAU,aAAa,KAAK;AAClC,WACE,YACC,QAAQ,UAAU,cACjB,QAAQ,eAAe;;AAG7B,UAAO;IACP;EAGF,MAAMC,uBACJ,OAAO,iBAAiB,kBACb;GACL,MAAM,OAAO,aAAa,aAAa;AACvC,UAAO,SACJ,KAAK,eAAe,kBAAkB,KAAK,UAAU,cACnD,OACD;MACF,GACJ,eACG,eACD;EACR,MAAM,mBACJ,OAAO,aAAa,WAAW,aAAa,SAAS,GAAG;AAE1D,MAAI,qBACF,QAAO,eAAe,sBAAsB,QAAQ;AAGtD,MAAI,iBACF,QACE,oBAAC;GACC,MAAM,iBAAiB;GACvB,QAAQ,iBAAiB,UAAU;GACnC,WAAU;aAET;IACC;AAIR,SAAO;;CAGT,MAAM,kBACJ,MACA,aACc;EACd,MAAM,mBAAmB;AACvB,WAAQ,KAAK,UAAb;IACE,KAAK,QACH,QAAO,KAAK,YAAY,oBAAC,OAAE,WAAW,KAAK,YAAa,GAAG;IAC7D,KAAK,YACH,SAAQ,KAAK,eAAb;KACE,KAAK,mBACH,QACE,oBAAC;MACC,MAAM,KAAK,YAAY;MACvB,WAAU;OACV;KAEN,KAAK,OACH,QAAO,oBAAC;MAAK,MAAM;MAAI,MAAM,KAAK,YAAY;OAAM;KACtD,KAAK,aACH,QAAO,oBAAC;MAAW,MAAM;MAAI,MAAM,KAAK,YAAY;OAAM;KAC5D,KAAK,cACH,QAAO,oBAAC;MAAY,MAAM;MAAI,MAAM,KAAK,YAAY;OAAM;KAC7D,KAAK,MACH,QAAO,oBAAC;MAAI,MAAM;MAAI,MAAM,KAAK,YAAY;OAAM;KACrD,KAAK,SACH,QAAO,oBAAC;MAAO,MAAM;MAAI,MAAM,KAAK,YAAY;OAAM;KACxD,KAAK,eACH,QAAO,oBAAC;MAAa,MAAM;MAAI,MAAM,KAAK,YAAY;OAAM;KAC9D,KAAK,QACH,QAAO,oBAAC;MAAM,MAAM;MAAI,MAAM,KAAK,YAAY;OAAM;KACvD,KAAK,SACH,QAAO,oBAAC;MAAO,MAAM;MAAI,MAAM,KAAK,YAAY;OAAM;KACxD,KAAK,SACH,QAAO,oBAAC;MAAO,MAAM;MAAI,MAAM,KAAK,YAAY;OAAM;KACxD,KAAK,SACH,QAAO,oBAAC;MAAO,MAAM;MAAI,MAAM,KAAK,YAAY;OAAM;KACxD,KAAK,UACH,QAAO,oBAAC;MAAQ,MAAM;MAAI,MAAM,KAAK,YAAY;OAAM;KACzD,KAAK,SACH,QAAO,oBAAC,WAAS;KACnB,KAAK,mBACH,QAAO,oBAAC;MAAiB,MAAM;MAAI,MAAM,KAAK,YAAY;OAAM;KAClE,KAAK,UACH,QAAO,oBAAC;MAAQ,MAAM;MAAI,MAAM,KAAK,YAAY;OAAM;KACzD,KAAK,UACH,QAAO,oBAACC;MAAQ,MAAM;MAAI,MAAM,KAAK,YAAY;OAAM;KACzD,KAAK,QACH,QAAO,oBAACC;MAAM,MAAM;MAAI,MAAM,KAAK,YAAY;OAAM;KACvD,KAAK,OACH,QAAO,oBAAC;MAAK,MAAM;MAAI,MAAM,KAAK,YAAY;OAAM;KACtD,KAAK,IACH,QAAO,oBAAC;MAAE,MAAM;MAAI,MAAM,KAAK,YAAY;OAAM;KACnD,QACE,QAAO;;IAEb,KAAK,SACH,QAAO,KAAK,WAAW,OAAO,MAC5B,oBAAC;KACC,KAAK,KAAK,UAAU,MAAM;KAC1B,KAAK,KAAK,UAAU,OAAO;KAC3B,OAAO;KACP,QAAQ;KACR,WAAU;MACV,GACA;IACN,KAAK,MACH,QAAO,KAAK,UACV,oBAAC;KACC,KAAK,KAAK;KACV,KAAI;KACJ,OAAO;KACP,QAAQ;KACR,WAAU;MACV,GACA;IACN,QACE,QAAO;;;AAIb,SACE,qBAAC;GACC,MAAM,KAAK;GACX,QAAQ,KAAK,UAAU;GACvB,WAAU;cAET,UACA,YAAY;IACX;;CAIR,MAAM,mBAAmB,UAAgC;EACvD,MAAM,QAAQ,MAAM,SAAS;EAC7B,MAAM,WAAW,MAAM,YAAY,EAAE;EACrC,MAAM,WAAW,MAAM,YAAY,EAAE;EAErC,MAAM,UAAU,SAAS,KAAK,OAAO,UACnC,oBAAC,sBACE,WAAW,OAAO,SAAS,IADf,MAAM,QAAQ,MAElB,CACX;AAEF,UAAQ,OAAR;GACE,KAAK,KACH,QAAO,oBAAC;IAAG,WAAU;cAAgC;KAAa;GACpE,KAAK,KACH,QACE,oBAAC;IAAQ,OAAM;IAAK,WAAU;cAC3B;KACO;GAEd,KAAK,KACH,QACE,oBAAC;IAAQ,OAAM;IAAK,WAAU;cAC3B;KACO;GAEd,KAAK,KACH,QAAO,oBAAC;IAAG,WAAU;cAAmC;KAAa;GACvE,KAAK,KACH,QAAO,oBAAC;IAAG,WAAU;cAAmC;KAAa;GACvE,KAAK,KACH,QAAO,oBAAC;IAAG,WAAU;cAAqC;KAAa;GACzE,KAAK,aACH,QACE,oBAAC;IAAW,WAAU;cACpB,oBAAC,kBAAM,UAAe;KACX;GAEjB,QACE,QAAO,oBAAC;IAAK,WAAU;cAAwB;KAAe;;;CAIpE,MAAM,eAAe,UAAiC;AACpD,MAAI,CAAC,MAAM,OAAO,IAAK,QAAO;AAE9B,SACE,oBAAC;GAAI,WAAU;aACb,oBAAC;IACC,KAAK,MAAM,MAAM;IACjB,KAAK,MAAM,OAAO;IAClB,OAAO;IACP,QAAQ;IACR,WAAU;KACV;IACE;;CAIV,MAAM,mBAAmB,SAA+B;AACtD,MAAI,CAAC,KAAK,OAAO,IAAK,QAAO;AAE7B,SACE,oBAAC;GAAI,WAAU;aACb,qBAAC;IACC,MAAM,KAAK,MAAM;IACjB,QAAO;IACP,KAAI;IACJ,WAAU;;KAEV,oBAAC,oBAAK,OAAS;KACf,oBAAC,oBAAM,KAAK,MAAM,oBAAoB,kBAAuB;KAC5D,KAAK,MAAM,QACV,qBAAC;MAAK,WAAU;;OAA2B;OACvC,KAAK,MAAM,KAAK,MAAM,OAAO,KAAK;OAAC;;OAChC;;KAEP;IACA;;CAIV,MAAM,cAAc,OAAoB,aAAgC;AAOtE,SACE,oBAPoB,aAAa,WAAW,OAAO;GAOpC,WALf,aAAa,WACT,kCACA;aAID,MAAM,KAAK,SAAS;IACnB,MAAM,WAAW,KAAK,YAAY,EAAE;AACpC,WACE,oBAAC;KAAmB,WAAU;eAC3B,KAAK,UAAU,KAAK,OAAO,eAC1B,oBAAC,sBACE,WAAW,OAAO,SAAS,IADf,MAAM,QAAQ,WAElB,CACX;OALK,KAAK,KAMT;KAEP;IACY;;CAIpB,MAAM,eAAe,UAAoC;EACvD,MAAM,YAAY,aAAa,MAAM;AAErC,MACE,cAAc,WACd,cAAc,eACd,cAAc,OAEd,QAAO,gBAAgB,MAAmB;AAG5C,MAAI,cAAc,WAAW,cAAc,aACzC,QAAO,YAAY,MAAoB;AAGzC,MAAI,cAAc,UAAU,cAAc,YACxC,QAAO,gBAAgB,MAAmB;AAG5C,SAAO;;CAIT,MAAMC,mBAAgC,EAAE;CACxC,IAAIC,mBAAgC,EAAE;CACtC,IAAIC,kBAAiC;AAErC,OAAM,SAAS,OAAsB,UAAkB;AAGrD,MAFkB,aAAa,MAAM,KAEnB,WAAY,MAAoB,UAAU;GAC1D,MAAM,YAAY;GAClB,MAAM,WAAW,UAAU,YAAY;AACvC,OAAI,oBAAoB,UAAU;AAChC,QAAI,iBAAiB,SAAS,KAAK,gBACjC,kBAAiB,KACf,oBAAC,sBACE,WAAW,kBAAkB,gBAAgB,IADjC,QAAQ,QAEZ,CACZ;AAEH,uBAAmB,CAAC,UAAU;AAC9B,sBAAkB;SAElB,kBAAiB,KAAK,UAAU;SAE7B;AACL,OAAI,iBAAiB,SAAS,KAAK,iBAAiB;AAClD,qBAAiB,KACf,oBAAC,sBACE,WAAW,kBAAkB,gBAAgB,IADjC,QAAQ,QAEZ,CACZ;AACD,uBAAmB,EAAE;AACrB,sBAAkB;;AAEpB,oBAAiB,KACf,oBAAC,sBAAoC,YAAY,MAAM,IAAxC,MAAM,QAAQ,MAAsC,CACpE;;GAEH;AAEF,KAAI,iBAAiB,SAAS,KAAK,gBACjC,kBAAiB,KACf,oBAAC,sBACE,WAAW,kBAAkB,gBAAgB,IADlC,aAEH,CACZ;AAGH,QAAO,oBAAC;EAAI,WAAU;YAA6B;GAAuB"}
@@ -1,4 +1,4 @@
1
- import { n as VariantPrice } from "../../prices-eO1YBciD.js";
1
+ import { VariantPrice } from "../../types/prices.js";
2
2
  import * as react_jsx_runtime9 from "react/jsx-runtime";
3
3
 
4
4
  //#region src/components/preview-price/index.d.ts
@@ -1,3 +1,20 @@
1
- import { t as PreviewPrice } from "../../preview-price-_4sxkXQs.js";
1
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
2
+ import { Text, clx } from "@medusajs/ui";
2
3
 
3
- export { PreviewPrice };
4
+ //#region src/components/preview-price/index.tsx
5
+ function PreviewPrice({ price }) {
6
+ if (!price) return null;
7
+ return /* @__PURE__ */ jsxs(Fragment, { children: [price.price_type === "sale" && /* @__PURE__ */ jsx(Text, {
8
+ className: "text-ui-fg-muted line-through",
9
+ "data-testid": "original-price",
10
+ children: price.original_price
11
+ }), /* @__PURE__ */ jsx(Text, {
12
+ className: clx("text-ui-fg-muted", { "text-ui-fg-interactive": price.price_type === "sale" }),
13
+ "data-testid": "price",
14
+ children: price.calculated_price
15
+ })] });
16
+ }
17
+
18
+ //#endregion
19
+ export { PreviewPrice };
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/components/preview-price/index.tsx"],"sourcesContent":["import { Text, clx } from '@medusajs/ui';\n\nimport { VariantPrice } from '@/types/prices';\n\nfunction PreviewPrice({ price }: { price: VariantPrice }) {\n if (!price) {\n return null;\n }\n\n return (\n <>\n {price.price_type === 'sale' && (\n <Text\n className=\"text-ui-fg-muted line-through\"\n data-testid=\"original-price\"\n >\n {price.original_price}\n </Text>\n )}\n <Text\n className={clx('text-ui-fg-muted', {\n 'text-ui-fg-interactive': price.price_type === 'sale',\n })}\n data-testid=\"price\"\n >\n {price.calculated_price}\n </Text>\n </>\n );\n}\n\nexport { PreviewPrice };\n"],"mappings":";;;;AAIA,SAAS,aAAa,EAAE,SAAkC;AACxD,KAAI,CAAC,MACH,QAAO;AAGT,QACE,4CACG,MAAM,eAAe,UACpB,oBAAC;EACC,WAAU;EACV,eAAY;YAEX,MAAM;GACF,EAET,oBAAC;EACC,WAAW,IAAI,oBAAoB,EACjC,0BAA0B,MAAM,eAAe,QAChD,CAAC;EACF,eAAY;YAEX,MAAM;GACF,IACN"}
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime0 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_runtime0.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,kBAAA,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
- import { gn as Product } from "../../graphql-CdTGi4Pp.js";
2
- import * as react_jsx_runtime18 from "react/jsx-runtime";
1
+ import { Product } from "../../types/graphql.js";
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_runtime18.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,7 +1,7 @@
1
- import { t as LocalizedClientLink } from "../../localized-client-link-CthmRcvb.js";
2
- import { t as Thumbnail } from "../../thumbnail-C0TU3rh-.js";
3
- import { t as PreviewPrice } from "../../preview-price-_4sxkXQs.js";
4
- import { n as getProductPrice } from "../../get-product-price-DKWc76ev.js";
1
+ import { LocalizedClientLink } from "../localized-client-link/index.js";
2
+ import { Thumbnail } from "../thumbnail/index.js";
3
+ import { PreviewPrice } from "../preview-price/index.js";
4
+ import { getProductPrice } from "../../lib/utils/get-product-price.js";
5
5
  import { jsx, jsxs } from "react/jsx-runtime";
6
6
  import { Text } from "@medusajs/ui";
7
7
 
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime12 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_runtime12.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"}