@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.
- package/dist/components/breadcrumbs/index.d.ts +4 -6
- package/dist/components/breadcrumbs/index.d.ts.map +1 -1
- package/dist/components/breadcrumbs/index.js.map +1 -1
- package/dist/components/cart-button/index.d.ts +2 -2
- package/dist/components/cart-button/index.d.ts.map +1 -1
- package/dist/components/cart-button/index.js +11 -17
- package/dist/components/cart-button/index.js.map +1 -0
- package/dist/components/cart-dropdown/index.d.ts +3 -3
- package/dist/components/cart-dropdown/index.d.ts.map +1 -1
- package/dist/components/cart-dropdown/index.js +193 -16
- package/dist/components/cart-dropdown/index.js.map +1 -0
- package/dist/components/cart-mismatch-banner/index.d.ts +3 -3
- package/dist/components/cart-mismatch-banner/index.d.ts.map +1 -1
- package/dist/components/cart-mismatch-banner/index.js +1 -8
- package/dist/components/cart-mismatch-banner/index.js.map +1 -1
- package/dist/components/country-select/index.d.ts +1 -1
- package/dist/components/delete-button/index.d.ts +2 -2
- package/dist/components/delete-button/index.js +27 -11
- package/dist/components/delete-button/index.js.map +1 -0
- package/dist/components/error-message/index.d.ts +2 -2
- package/dist/components/error-message/index.d.ts.map +1 -1
- package/dist/components/footer/index.d.ts +2 -2
- package/dist/components/footer/index.d.ts.map +1 -1
- package/dist/components/footer/index.js +5 -10
- package/dist/components/footer/index.js.map +1 -1
- package/dist/components/free-shipping-price-nudge/index.d.ts +3 -3
- package/dist/components/free-shipping-price-nudge/index.d.ts.map +1 -1
- package/dist/components/free-shipping-price-nudge/index.js +2 -2
- package/dist/components/interactive-link/index.d.ts +2 -2
- package/dist/components/interactive-link/index.js +1 -1
- package/dist/components/layout-country-select/index.d.ts +4 -4
- package/dist/components/layout-country-select/index.js +89 -11
- package/dist/components/layout-country-select/index.js.map +1 -0
- package/dist/components/line-item-options/index.d.ts +3 -3
- package/dist/components/line-item-options/index.js +15 -2
- package/dist/components/line-item-options/index.js.map +1 -0
- package/dist/components/line-item-price/index.d.ts +3 -3
- package/dist/components/line-item-price/index.d.ts.map +1 -1
- package/dist/components/line-item-price/index.js +46 -2
- package/dist/components/line-item-price/index.js.map +1 -0
- package/dist/components/localized-client-link/index.d.ts +5 -12
- package/dist/components/localized-client-link/index.d.ts.map +1 -1
- package/dist/components/localized-client-link/index.js +19 -2
- package/dist/components/localized-client-link/index.js.map +1 -0
- package/dist/components/modal/index.d.ts +2 -2
- package/dist/components/modal/index.js +101 -3
- package/dist/components/modal/index.js.map +1 -0
- package/dist/components/nav/index.d.ts +2 -2
- package/dist/components/nav/index.js +6 -25
- package/dist/components/nav/index.js.map +1 -1
- package/dist/components/portable-text/index.d.ts +3 -3
- package/dist/components/portable-text/index.js +329 -2
- package/dist/components/portable-text/index.js.map +1 -0
- package/dist/components/preview-price/index.d.ts +1 -1
- package/dist/components/preview-price/index.js +19 -2
- package/dist/components/preview-price/index.js.map +1 -0
- package/dist/components/product-card/index.d.ts +2 -2
- package/dist/components/product-card/index.d.ts.map +1 -1
- package/dist/components/product-card/index.js +3 -4
- package/dist/components/product-card/index.js.map +1 -1
- package/dist/components/product-preview/index.d.ts +3 -3
- package/dist/components/product-preview/index.d.ts.map +1 -1
- package/dist/components/product-preview/index.js +4 -4
- package/dist/components/search-modal/index.d.ts +2 -2
- package/dist/components/search-modal/index.d.ts.map +1 -1
- package/dist/components/search-modal/index.js +135 -9
- package/dist/components/search-modal/index.js.map +1 -0
- package/dist/components/side-menu/index.d.ts +3 -3
- package/dist/components/side-menu/index.js +96 -13
- package/dist/components/side-menu/index.js.map +1 -0
- package/dist/components/thumbnail/index.js +43 -2
- package/dist/components/thumbnail/index.js.map +1 -0
- package/dist/lib/config/medusa.js +11 -2
- package/dist/lib/config/medusa.js.map +1 -0
- package/dist/lib/context/apollo-context.js +1 -2
- package/dist/lib/context/apollo-context.js.map +1 -1
- package/dist/lib/context/modal-context.d.ts +2 -2
- package/dist/lib/context/modal-context.js +19 -2
- package/dist/lib/context/modal-context.js.map +1 -0
- package/dist/lib/data/cart.d.ts +1 -1
- package/dist/lib/data/cart.d.ts.map +1 -1
- package/dist/lib/data/cart.js +102 -10
- package/dist/lib/data/cart.js.map +1 -0
- package/dist/lib/data/categories.d.ts +1 -1
- package/dist/lib/data/categories.js +15 -5
- package/dist/lib/data/categories.js.map +1 -0
- package/dist/lib/data/collections.d.ts +1 -1
- package/dist/lib/data/collections.js +21 -5
- package/dist/lib/data/collections.js.map +1 -0
- package/dist/lib/data/cookies.d.ts +2 -1
- package/dist/lib/data/cookies.d.ts.map +1 -1
- package/dist/lib/data/cookies.js +45 -2
- package/dist/lib/data/cookies.js.map +1 -0
- package/dist/lib/data/customer.d.ts +1 -1
- package/dist/lib/data/customer.d.ts.map +1 -1
- package/dist/lib/data/customer.js +39 -9
- package/dist/lib/data/customer.js.map +1 -0
- package/dist/lib/data/footer.js +15 -4
- package/dist/lib/data/footer.js.map +1 -0
- package/dist/lib/data/orders.d.ts +1 -1
- package/dist/lib/data/orders.js +4 -4
- package/dist/lib/data/regions.d.ts +1 -1
- package/dist/lib/data/regions.js +33 -4
- package/dist/lib/data/regions.js.map +1 -0
- package/dist/lib/data/search.d.ts +1 -1
- package/dist/lib/data/search.js +20 -5
- package/dist/lib/data/search.js.map +1 -0
- package/dist/lib/gql/apollo-client.js +66 -2
- package/dist/lib/gql/apollo-client.js.map +1 -0
- package/dist/lib/gql/fragments/cart.d.ts +9 -9
- package/dist/lib/gql/fragments/cart.d.ts.map +1 -1
- package/dist/lib/gql/fragments/cart.js +141 -3
- package/dist/{cart-BNoIGQmw.js.map → lib/gql/fragments/cart.js.map} +1 -1
- package/dist/lib/gql/fragments/customer.d.ts +3 -3
- package/dist/lib/gql/fragments/customer.js +41 -2
- package/dist/{customer-CgN4zI00.js.map → lib/gql/fragments/customer.js.map} +1 -1
- package/dist/lib/gql/fragments/product.d.ts +8 -8
- package/dist/lib/gql/fragments/product.js +89 -2
- package/dist/{product-COu5D1mS.js.map → lib/gql/fragments/product.js.map} +1 -1
- package/dist/lib/gql/mutations/cart.d.ts +4 -4
- package/dist/lib/gql/mutations/cart.d.ts.map +1 -1
- package/dist/lib/gql/mutations/cart.js +41 -4
- package/dist/{cart-IHaLnQC4.js.map → lib/gql/mutations/cart.js.map} +1 -1
- package/dist/lib/gql/mutations/customer.js +0 -1
- package/dist/lib/gql/queries/cart.d.ts +2 -2
- package/dist/lib/gql/queries/cart.d.ts.map +1 -1
- package/dist/lib/gql/queries/cart.js +15 -4
- package/dist/{cart-DH8urwwT.js.map → lib/gql/queries/cart.js.map} +1 -1
- package/dist/lib/gql/queries/collections.d.ts +2 -2
- package/dist/lib/gql/queries/collections.d.ts.map +1 -1
- package/dist/lib/gql/queries/collections.js +19 -3
- package/dist/{collections-DMv3UYgC.js.map → lib/gql/queries/collections.js.map} +1 -1
- package/dist/lib/gql/queries/customer.d.ts +2 -2
- package/dist/lib/gql/queries/customer.d.ts.map +1 -1
- package/dist/lib/gql/queries/customer.js +15 -3
- package/dist/{customer-DIJz6m7L.js.map → lib/gql/queries/customer.js.map} +1 -1
- package/dist/lib/gql/queries/footer.d.ts +2 -2
- package/dist/lib/gql/queries/footer.d.ts.map +1 -1
- package/dist/lib/gql/queries/footer.js +21 -2
- package/dist/lib/gql/queries/footer.js.map +1 -0
- package/dist/lib/gql/queries/product.d.ts +3 -3
- package/dist/lib/gql/queries/product.d.ts.map +1 -1
- package/dist/lib/gql/queries/product.js +46 -3
- package/dist/{product-C3HQUIgX.js.map → lib/gql/queries/product.js.map} +1 -1
- package/dist/lib/hooks/use-apollo.d.ts +2 -2
- package/dist/lib/hooks/use-apollo.js +10 -3
- package/dist/lib/hooks/use-apollo.js.map +1 -0
- package/dist/lib/hooks/use-search.d.ts +1 -1
- package/dist/lib/hooks/use-search.js +66 -6
- package/dist/lib/hooks/use-search.js.map +1 -0
- package/dist/lib/hooks/use-toggle-state.d.ts +23 -2
- package/dist/lib/hooks/use-toggle-state.d.ts.map +1 -0
- package/dist/lib/utils/data-types.js +9 -2
- package/dist/lib/utils/data-types.js.map +1 -0
- package/dist/lib/utils/env.js +1 -1
- package/dist/lib/utils/env.js.map +1 -1
- package/dist/lib/utils/get-percentage-diff.js +7 -2
- package/dist/lib/utils/get-percentage-diff.js.map +1 -0
- package/dist/lib/utils/get-product-price.d.ts +1 -1
- package/dist/lib/utils/get-product-price.js +46 -2
- package/dist/lib/utils/get-product-price.js.map +1 -0
- package/dist/lib/utils/medusa-error.js +16 -2
- package/dist/lib/utils/medusa-error.js.map +1 -0
- package/dist/lib/utils/money.js +14 -2
- package/dist/lib/utils/money.js.map +1 -0
- package/dist/lib/utils/normalize-functions.d.ts +1 -1
- package/dist/lib/utils/normalize-functions.js +69 -2
- package/dist/lib/utils/normalize-functions.js.map +1 -0
- package/dist/types/graphql.d.ts +1368 -2
- package/dist/types/graphql.d.ts.map +1 -0
- package/dist/types/prices.d.ts +20 -2
- package/dist/types/prices.d.ts.map +1 -0
- package/dist/types/prices.js +0 -1
- package/package.json +12 -12
- package/dist/apollo-client-Bw50r80c.js +0 -66
- package/dist/apollo-client-Bw50r80c.js.map +0 -1
- package/dist/cart-BNoIGQmw.js +0 -142
- package/dist/cart-DH8urwwT.js +0 -16
- package/dist/cart-IHaLnQC4.js +0 -42
- package/dist/cart-button-Dj_zRxop.js +0 -12
- package/dist/cart-button-Dj_zRxop.js.map +0 -1
- package/dist/cart-dropdown-D_PUJarp.js +0 -195
- package/dist/cart-dropdown-D_PUJarp.js.map +0 -1
- package/dist/cart-xkcyWLfU.js +0 -103
- package/dist/cart-xkcyWLfU.js.map +0 -1
- package/dist/categories-B-RYCIZ3.js +0 -16
- package/dist/categories-B-RYCIZ3.js.map +0 -1
- package/dist/collections-BgyvhW2p.js +0 -22
- package/dist/collections-BgyvhW2p.js.map +0 -1
- package/dist/collections-DMv3UYgC.js +0 -20
- package/dist/cookies-lksVIe4_.js +0 -38
- package/dist/cookies-lksVIe4_.js.map +0 -1
- package/dist/customer-CgN4zI00.js +0 -42
- package/dist/customer-ClewjBBr.js +0 -38
- package/dist/customer-ClewjBBr.js.map +0 -1
- package/dist/customer-DIJz6m7L.js +0 -16
- package/dist/data-types-CTPJXmJH.js +0 -10
- package/dist/data-types-CTPJXmJH.js.map +0 -1
- package/dist/delete-button-Bnm5bof2.js +0 -28
- package/dist/delete-button-Bnm5bof2.js.map +0 -1
- package/dist/footer-BvNV-R9D.js +0 -16
- package/dist/footer-BvNV-R9D.js.map +0 -1
- package/dist/footer-DCtgtjKS.js +0 -76
- package/dist/footer-DCtgtjKS.js.map +0 -1
- package/dist/get-percentage-diff-B_UVOFgE.js +0 -8
- package/dist/get-percentage-diff-B_UVOFgE.js.map +0 -1
- package/dist/get-product-price-DKWc76ev.js +0 -47
- package/dist/get-product-price-DKWc76ev.js.map +0 -1
- package/dist/graphql-CdTGi4Pp.d.ts +0 -1368
- package/dist/graphql-CdTGi4Pp.d.ts.map +0 -1
- package/dist/layout-country-select-C7Ra-opl.js +0 -90
- package/dist/layout-country-select-C7Ra-opl.js.map +0 -1
- package/dist/line-item-options-l_eRZIIq.js +0 -16
- package/dist/line-item-options-l_eRZIIq.js.map +0 -1
- package/dist/line-item-price-BlTwskFC.js +0 -47
- package/dist/line-item-price-BlTwskFC.js.map +0 -1
- package/dist/localized-client-link-CthmRcvb.js +0 -22
- package/dist/localized-client-link-CthmRcvb.js.map +0 -1
- package/dist/medusa-TumrpCF2.js +0 -12
- package/dist/medusa-TumrpCF2.js.map +0 -1
- package/dist/medusa-error-DDhA6RGC.js +0 -17
- package/dist/medusa-error-DDhA6RGC.js.map +0 -1
- package/dist/modal-BASYY-YM.js +0 -102
- package/dist/modal-BASYY-YM.js.map +0 -1
- package/dist/modal-context-02cA-7jy.js +0 -20
- package/dist/modal-context-02cA-7jy.js.map +0 -1
- package/dist/money-DVQGzXns.js +0 -15
- package/dist/money-DVQGzXns.js.map +0 -1
- package/dist/normalize-functions-Bqr-JkYn.js +0 -70
- package/dist/normalize-functions-Bqr-JkYn.js.map +0 -1
- package/dist/portable-text-CuI022GH.js +0 -330
- package/dist/portable-text-CuI022GH.js.map +0 -1
- package/dist/preview-price-_4sxkXQs.js +0 -20
- package/dist/preview-price-_4sxkXQs.js.map +0 -1
- package/dist/prices-eO1YBciD.d.ts +0 -20
- package/dist/prices-eO1YBciD.d.ts.map +0 -1
- package/dist/product-C3HQUIgX.js +0 -47
- package/dist/product-COu5D1mS.js +0 -90
- package/dist/regions-r1AvxfT8.js +0 -34
- package/dist/regions-r1AvxfT8.js.map +0 -1
- package/dist/search-D7Gw7jAk.js +0 -21
- package/dist/search-D7Gw7jAk.js.map +0 -1
- package/dist/search-modal-DaXadYWM.js +0 -137
- package/dist/search-modal-DaXadYWM.js.map +0 -1
- package/dist/side-menu-B6IjTd5M.js +0 -97
- package/dist/side-menu-B6IjTd5M.js.map +0 -1
- package/dist/thumbnail-C0TU3rh-.js +0 -44
- package/dist/thumbnail-C0TU3rh-.js.map +0 -1
- package/dist/use-apollo-BxAFd1Y5.js +0 -11
- package/dist/use-apollo-BxAFd1Y5.js.map +0 -1
- package/dist/use-search-VX-u8o1D.js +0 -67
- package/dist/use-search-VX-u8o1D.js.map +0 -1
- package/dist/use-toggle-state-DI4Gwlfj.d.ts +0 -23
- package/dist/use-toggle-state-DI4Gwlfj.d.ts.map +0 -1
|
@@ -1,3 +1,330 @@
|
|
|
1
|
-
import {
|
|
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
|
-
|
|
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":"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"}
|
|
@@ -1,3 +1,20 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Text, clx } from "@medusajs/ui";
|
|
2
3
|
|
|
3
|
-
|
|
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
|
|
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):
|
|
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":";;;;;
|
|
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(
|
|
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
|
|
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(
|
|
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';\
|
|
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 {
|
|
2
|
-
import * as
|
|
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):
|
|
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,
|
|
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 {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
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
|
|
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):
|
|
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":";;;
|
|
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"}
|