@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,137 +0,0 @@
|
|
|
1
|
-
import { t as Modal } from "./modal-BASYY-YM.js";
|
|
2
|
-
import { t as useSearch } from "./use-search-VX-u8o1D.js";
|
|
3
|
-
import { useEffect, useRef, useState } from "react";
|
|
4
|
-
import { usePathname } from "next/navigation";
|
|
5
|
-
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
-
import { Button } from "@medusajs/ui";
|
|
7
|
-
import Link from "next/link";
|
|
8
|
-
import Image from "next/image";
|
|
9
|
-
import { PlaceholderImage } from "@gfed-medusa/sf-lib-ui/icons/placeholder-image";
|
|
10
|
-
import DOMPurify from "isomorphic-dompurify";
|
|
11
|
-
import { cn } from "@gfed-medusa/sf-lib-ui/lib/utils";
|
|
12
|
-
|
|
13
|
-
//#region src/components/search-modal/index.tsx
|
|
14
|
-
function SearchModal({ buttonClassName }) {
|
|
15
|
-
const [isOpen, setIsOpen] = useState(false);
|
|
16
|
-
const pathname = usePathname();
|
|
17
|
-
const { query, setQuery, results, loading, error, isTyping } = useSearch();
|
|
18
|
-
useEffect(() => {
|
|
19
|
-
setIsOpen(false);
|
|
20
|
-
}, [pathname]);
|
|
21
|
-
useEffect(() => {
|
|
22
|
-
if (!isOpen) setQuery("");
|
|
23
|
-
}, [isOpen, setQuery]);
|
|
24
|
-
return /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("div", {
|
|
25
|
-
className: cn("small:flex hidden h-full items-center gap-x-6", buttonClassName),
|
|
26
|
-
children: /* @__PURE__ */ jsx(Button, {
|
|
27
|
-
onClick: () => setIsOpen(true),
|
|
28
|
-
variant: "transparent",
|
|
29
|
-
className: "text-small-regular hover:text-ui-fg-base px-0 hover:bg-transparent focus:!bg-transparent",
|
|
30
|
-
"data-testid": "search-button",
|
|
31
|
-
children: "Search"
|
|
32
|
-
})
|
|
33
|
-
}), /* @__PURE__ */ jsx(Modal, {
|
|
34
|
-
isOpen,
|
|
35
|
-
close: () => setIsOpen(false),
|
|
36
|
-
"aria-label": "Search modal",
|
|
37
|
-
children: /* @__PURE__ */ jsxs("div", {
|
|
38
|
-
className: "flex h-full max-h-[75vh] min-h-0 flex-col",
|
|
39
|
-
children: [/* @__PURE__ */ jsx("div", {
|
|
40
|
-
className: "shrink-0",
|
|
41
|
-
children: /* @__PURE__ */ jsx(SearchBox, {
|
|
42
|
-
query,
|
|
43
|
-
setQuery,
|
|
44
|
-
loading
|
|
45
|
-
})
|
|
46
|
-
}), /* @__PURE__ */ jsx("div", {
|
|
47
|
-
className: "mt-4 min-h-0 flex-1 overflow-y-auto",
|
|
48
|
-
children: /* @__PURE__ */ jsx(SearchResults, {
|
|
49
|
-
results,
|
|
50
|
-
loading,
|
|
51
|
-
error,
|
|
52
|
-
query,
|
|
53
|
-
isTyping
|
|
54
|
-
})
|
|
55
|
-
})]
|
|
56
|
-
})
|
|
57
|
-
})] });
|
|
58
|
-
}
|
|
59
|
-
const SearchBox = ({ query, setQuery, loading }) => {
|
|
60
|
-
const inputRef = useRef(null);
|
|
61
|
-
useEffect(() => {
|
|
62
|
-
if (inputRef.current && document.activeElement !== inputRef.current) inputRef.current.focus();
|
|
63
|
-
}, [loading]);
|
|
64
|
-
return /* @__PURE__ */ jsx("div", {
|
|
65
|
-
className: "relative w-full",
|
|
66
|
-
children: /* @__PURE__ */ jsx("input", {
|
|
67
|
-
ref: inputRef,
|
|
68
|
-
type: "text",
|
|
69
|
-
value: query,
|
|
70
|
-
onChange: (e) => setQuery(e.target.value),
|
|
71
|
-
placeholder: "Search products...",
|
|
72
|
-
className: "w-full rounded-md border border-gray-300 px-4 py-2 focus:outline-none focus-visible:outline-2 focus-visible:outline-blue-500",
|
|
73
|
-
disabled: loading,
|
|
74
|
-
autoFocus: true,
|
|
75
|
-
"data-testid": "search-input"
|
|
76
|
-
})
|
|
77
|
-
});
|
|
78
|
-
};
|
|
79
|
-
const SearchResults = ({ results, loading, error, query, isTyping }) => {
|
|
80
|
-
if (loading) return /* @__PURE__ */ jsx("div", {
|
|
81
|
-
className: "flex min-h-full items-center justify-center",
|
|
82
|
-
children: /* @__PURE__ */ jsxs("div", {
|
|
83
|
-
className: "text-center",
|
|
84
|
-
children: [/* @__PURE__ */ jsx("div", { className: "mx-auto h-8 w-8 animate-spin rounded-full border-b-2 border-blue-500" }), /* @__PURE__ */ jsx("p", {
|
|
85
|
-
className: "mt-2 text-sm text-gray-500",
|
|
86
|
-
children: "Searching..."
|
|
87
|
-
})]
|
|
88
|
-
})
|
|
89
|
-
});
|
|
90
|
-
if (error) return /* @__PURE__ */ jsx("div", {
|
|
91
|
-
className: "flex min-h-full items-center justify-center text-rose-600",
|
|
92
|
-
children: /* @__PURE__ */ jsxs("p", { children: ["Error: ", error] })
|
|
93
|
-
});
|
|
94
|
-
if (query.trim() && !isTyping && !loading && (!results || !results.items || results.items.length === 0)) return /* @__PURE__ */ jsx("div", {
|
|
95
|
-
className: "flex min-h-full items-center justify-center text-gray-500",
|
|
96
|
-
children: /* @__PURE__ */ jsx("p", { children: "No products found" })
|
|
97
|
-
});
|
|
98
|
-
if (!query.trim()) return null;
|
|
99
|
-
return /* @__PURE__ */ jsx("div", { children: results?.items?.map((hit) => /* @__PURE__ */ jsx(Hit, { hit }, hit.id)) });
|
|
100
|
-
};
|
|
101
|
-
const Hit = ({ hit }) => {
|
|
102
|
-
return /* @__PURE__ */ jsxs("div", {
|
|
103
|
-
className: "relative mt-4 flex flex-row gap-x-2",
|
|
104
|
-
"data-testid": "search-hit",
|
|
105
|
-
children: [
|
|
106
|
-
/* @__PURE__ */ jsx("div", {
|
|
107
|
-
className: "relative h-[100px] w-[100px] shrink-0 overflow-hidden border border-gray-200",
|
|
108
|
-
children: hit.thumbnail ? /* @__PURE__ */ jsx(Image, {
|
|
109
|
-
src: hit.thumbnail,
|
|
110
|
-
alt: hit.title ?? "Product Image",
|
|
111
|
-
width: 100,
|
|
112
|
-
height: 100,
|
|
113
|
-
className: "aspect-square object-cover"
|
|
114
|
-
}) : /* @__PURE__ */ jsx("div", {
|
|
115
|
-
className: "border-grey-400 flex h-[125px] w-[100px] items-center justify-center self-start border",
|
|
116
|
-
children: /* @__PURE__ */ jsx(PlaceholderImage, { size: 40 })
|
|
117
|
-
})
|
|
118
|
-
}),
|
|
119
|
-
/* @__PURE__ */ jsxs("div", {
|
|
120
|
-
className: "flex flex-col gap-y-1",
|
|
121
|
-
children: [/* @__PURE__ */ jsx("h3", { children: hit.title }), /* @__PURE__ */ jsx("p", {
|
|
122
|
-
className: "text-sm text-gray-500",
|
|
123
|
-
dangerouslySetInnerHTML: { __html: DOMPurify.sanitize(hit.description ?? "") }
|
|
124
|
-
})]
|
|
125
|
-
}),
|
|
126
|
-
/* @__PURE__ */ jsx(Link, {
|
|
127
|
-
href: `/products/${hit.handle}`,
|
|
128
|
-
className: "absolute top-0 right-0 h-full w-full",
|
|
129
|
-
"aria-label": `View Product: ${hit.title}`
|
|
130
|
-
})
|
|
131
|
-
]
|
|
132
|
-
});
|
|
133
|
-
};
|
|
134
|
-
|
|
135
|
-
//#endregion
|
|
136
|
-
export { SearchModal as t };
|
|
137
|
-
//# sourceMappingURL=search-modal-DaXadYWM.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"search-modal-DaXadYWM.js","names":[],"sources":["../src/components/search-modal/index.tsx"],"sourcesContent":["'use client';\n\nimport { useEffect, useRef, useState } from 'react';\n\nimport Image from 'next/image';\nimport Link from 'next/link';\nimport { usePathname } from 'next/navigation';\n\nimport DOMPurify from 'isomorphic-dompurify';\n\nimport { PlaceholderImage } from '@gfed-medusa/sf-lib-ui/icons/placeholder-image';\nimport { cn } from '@gfed-medusa/sf-lib-ui/lib/utils';\nimport { Button } from '@medusajs/ui';\n\nimport { useSearch } from '@/lib/hooks/use-search';\nimport { ProductHit } from '@/types/graphql';\n\nimport { Modal } from '../modal';\n\ntype SearchModalProps = {\n buttonClassName?: string;\n};\n\nfunction SearchModal({ buttonClassName }: SearchModalProps) {\n const [isOpen, setIsOpen] = useState(false);\n const pathname = usePathname();\n\n const { query, setQuery, results, loading, error, isTyping } = useSearch();\n\n useEffect(() => {\n setIsOpen(false);\n }, [pathname]);\n\n useEffect(() => {\n if (!isOpen) {\n setQuery('');\n }\n }, [isOpen, setQuery]);\n\n return (\n <>\n <div\n className={cn(\n 'small:flex hidden h-full items-center gap-x-6',\n buttonClassName\n )}\n >\n <Button\n onClick={() => setIsOpen(true)}\n variant=\"transparent\"\n className=\"text-small-regular hover:text-ui-fg-base px-0 hover:bg-transparent focus:!bg-transparent\"\n data-testid=\"search-button\"\n >\n Search\n </Button>\n </div>\n <Modal\n isOpen={isOpen}\n close={() => setIsOpen(false)}\n aria-label=\"Search modal\"\n >\n <div className=\"flex h-full max-h-[75vh] min-h-0 flex-col\">\n <div className=\"shrink-0\">\n <SearchBox query={query} setQuery={setQuery} loading={loading} />\n </div>\n <div className=\"mt-4 min-h-0 flex-1 overflow-y-auto\">\n <SearchResults\n results={results}\n loading={loading}\n error={error}\n query={query}\n isTyping={isTyping}\n />\n </div>\n </div>\n </Modal>\n </>\n );\n}\n\nconst SearchBox = ({\n query,\n setQuery,\n loading,\n}: {\n query: string;\n setQuery: (query: string) => void;\n loading: boolean;\n}) => {\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (inputRef.current && document.activeElement !== inputRef.current) {\n inputRef.current.focus();\n }\n }, [loading]);\n\n return (\n <div className=\"relative w-full\">\n <input\n ref={inputRef}\n type=\"text\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n placeholder=\"Search products...\"\n className=\"w-full rounded-md border border-gray-300 px-4 py-2 focus:outline-none focus-visible:outline-2 focus-visible:outline-blue-500\"\n disabled={loading}\n autoFocus\n data-testid=\"search-input\"\n />\n </div>\n );\n};\n\nconst SearchResults = ({\n results,\n loading,\n error,\n query,\n isTyping,\n}: {\n results: { items: ProductHit[] } | null;\n loading: boolean;\n error: string | null;\n query: string;\n isTyping: boolean;\n}) => {\n if (loading) {\n return (\n <div className=\"flex min-h-full items-center justify-center\">\n <div className=\"text-center\">\n <div className=\"mx-auto h-8 w-8 animate-spin rounded-full border-b-2 border-blue-500\"></div>\n <p className=\"mt-2 text-sm text-gray-500\">Searching...</p>\n </div>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className=\"flex min-h-full items-center justify-center text-rose-600\">\n <p>Error: {error}</p>\n </div>\n );\n }\n\n if (\n query.trim() &&\n !isTyping &&\n !loading &&\n (!results || !results.items || results.items.length === 0)\n ) {\n return (\n <div className=\"flex min-h-full items-center justify-center text-gray-500\">\n <p>No products found</p>\n </div>\n );\n }\n\n if (!query.trim()) {\n return null;\n }\n\n return (\n <div>\n {results?.items?.map((hit: ProductHit) => (\n <Hit key={hit.id} hit={hit} />\n ))}\n </div>\n );\n};\n\nconst Hit = ({ hit }: { hit: ProductHit }) => {\n return (\n <div\n className=\"relative mt-4 flex flex-row gap-x-2\"\n data-testid=\"search-hit\"\n >\n <div className=\"relative h-[100px] w-[100px] shrink-0 overflow-hidden border border-gray-200\">\n {hit.thumbnail ? (\n <Image\n src={hit.thumbnail}\n alt={hit.title ?? 'Product Image'}\n width={100}\n height={100}\n className=\"aspect-square object-cover\"\n />\n ) : (\n <div className=\"border-grey-400 flex h-[125px] w-[100px] items-center justify-center self-start border\">\n <PlaceholderImage size={40} />\n </div>\n )}\n </div>\n <div className=\"flex flex-col gap-y-1\">\n <h3>{hit.title}</h3>\n <p\n className=\"text-sm text-gray-500\"\n dangerouslySetInnerHTML={{\n __html: DOMPurify.sanitize(hit.description ?? ''),\n }}\n />\n </div>\n <Link\n href={`/products/${hit.handle}`}\n className=\"absolute top-0 right-0 h-full w-full\"\n aria-label={`View Product: ${hit.title}`}\n />\n </div>\n );\n};\n\nexport { SearchModal };\n"],"mappings":";;;;;;;;;;;;;AAuBA,SAAS,YAAY,EAAE,mBAAqC;CAC1D,MAAM,CAAC,QAAQ,aAAa,SAAS,MAAM;CAC3C,MAAM,WAAW,aAAa;CAE9B,MAAM,EAAE,OAAO,UAAU,SAAS,SAAS,OAAO,aAAa,WAAW;AAE1E,iBAAgB;AACd,YAAU,MAAM;IACf,CAAC,SAAS,CAAC;AAEd,iBAAgB;AACd,MAAI,CAAC,OACH,UAAS,GAAG;IAEb,CAAC,QAAQ,SAAS,CAAC;AAEtB,QACE,8CACE,oBAAC;EACC,WAAW,GACT,iDACA,gBACD;YAED,oBAAC;GACC,eAAe,UAAU,KAAK;GAC9B,SAAQ;GACR,WAAU;GACV,eAAY;aACb;IAEQ;GACL,EACN,oBAAC;EACS;EACR,aAAa,UAAU,MAAM;EAC7B,cAAW;YAEX,qBAAC;GAAI,WAAU;cACb,oBAAC;IAAI,WAAU;cACb,oBAAC;KAAiB;KAAiB;KAAmB;MAAW;KAC7D,EACN,oBAAC;IAAI,WAAU;cACb,oBAAC;KACU;KACA;KACF;KACA;KACG;MACV;KACE;IACF;GACA,IACP;;AAIP,MAAM,aAAa,EACjB,OACA,UACA,cAKI;CACJ,MAAM,WAAW,OAAyB,KAAK;AAE/C,iBAAgB;AACd,MAAI,SAAS,WAAW,SAAS,kBAAkB,SAAS,QAC1D,UAAS,QAAQ,OAAO;IAEzB,CAAC,QAAQ,CAAC;AAEb,QACE,oBAAC;EAAI,WAAU;YACb,oBAAC;GACC,KAAK;GACL,MAAK;GACL,OAAO;GACP,WAAW,MAAM,SAAS,EAAE,OAAO,MAAM;GACzC,aAAY;GACZ,WAAU;GACV,UAAU;GACV;GACA,eAAY;IACZ;GACE;;AAIV,MAAM,iBAAiB,EACrB,SACA,SACA,OACA,OACA,eAOI;AACJ,KAAI,QACF,QACE,oBAAC;EAAI,WAAU;YACb,qBAAC;GAAI,WAAU;cACb,oBAAC,SAAI,WAAU,yEAA6E,EAC5F,oBAAC;IAAE,WAAU;cAA6B;KAAgB;IACtD;GACF;AAIV,KAAI,MACF,QACE,oBAAC;EAAI,WAAU;YACb,qBAAC,kBAAE,WAAQ,SAAU;GACjB;AAIV,KACE,MAAM,MAAM,IACZ,CAAC,YACD,CAAC,YACA,CAAC,WAAW,CAAC,QAAQ,SAAS,QAAQ,MAAM,WAAW,GAExD,QACE,oBAAC;EAAI,WAAU;YACb,oBAAC,iBAAE,sBAAqB;GACpB;AAIV,KAAI,CAAC,MAAM,MAAM,CACf,QAAO;AAGT,QACE,oBAAC,mBACE,SAAS,OAAO,KAAK,QACpB,oBAAC,OAAsB,OAAb,IAAI,GAAgB,CAC9B,GACE;;AAIV,MAAM,OAAO,EAAE,UAA+B;AAC5C,QACE,qBAAC;EACC,WAAU;EACV,eAAY;;GAEZ,oBAAC;IAAI,WAAU;cACZ,IAAI,YACH,oBAAC;KACC,KAAK,IAAI;KACT,KAAK,IAAI,SAAS;KAClB,OAAO;KACP,QAAQ;KACR,WAAU;MACV,GAEF,oBAAC;KAAI,WAAU;eACb,oBAAC,oBAAiB,MAAM,KAAM;MAC1B;KAEJ;GACN,qBAAC;IAAI,WAAU;eACb,oBAAC,kBAAI,IAAI,QAAW,EACpB,oBAAC;KACC,WAAU;KACV,yBAAyB,EACvB,QAAQ,UAAU,SAAS,IAAI,eAAe,GAAG,EAClD;MACD;KACE;GACN,oBAAC;IACC,MAAM,aAAa,IAAI;IACvB,WAAU;IACV,cAAY,iBAAiB,IAAI;KACjC;;GACE"}
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
import { t as LocalizedClientLink } from "./localized-client-link-CthmRcvb.js";
|
|
2
|
-
import { t as LayoutCountrySelect } from "./layout-country-select-C7Ra-opl.js";
|
|
3
|
-
import { Fragment } from "react";
|
|
4
|
-
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
-
import { Popover, PopoverPanel, Transition } from "@headlessui/react";
|
|
6
|
-
import { Text, clx, useToggleState } from "@medusajs/ui";
|
|
7
|
-
import { ArrowRightMini, XMark } from "@medusajs/icons";
|
|
8
|
-
|
|
9
|
-
//#region src/components/side-menu/index.tsx
|
|
10
|
-
const SideMenuItems = {
|
|
11
|
-
Home: "/",
|
|
12
|
-
Store: "/store",
|
|
13
|
-
Account: "/account",
|
|
14
|
-
Cart: "/cart"
|
|
15
|
-
};
|
|
16
|
-
const SideMenu = ({ regions }) => {
|
|
17
|
-
const toggleState = useToggleState();
|
|
18
|
-
return /* @__PURE__ */ jsx("div", {
|
|
19
|
-
className: "h-full",
|
|
20
|
-
children: /* @__PURE__ */ jsx("div", {
|
|
21
|
-
className: "flex h-full items-center",
|
|
22
|
-
children: /* @__PURE__ */ jsx(Popover, {
|
|
23
|
-
className: "flex h-full",
|
|
24
|
-
children: ({ open, close }) => /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx("div", {
|
|
25
|
-
className: "relative flex h-full",
|
|
26
|
-
children: /* @__PURE__ */ jsx(Popover.Button, {
|
|
27
|
-
"data-testid": "nav-menu-button",
|
|
28
|
-
className: "hover:text-ui-fg-base relative flex h-full items-center transition-all duration-200 ease-out focus:outline-none",
|
|
29
|
-
children: "Menu"
|
|
30
|
-
})
|
|
31
|
-
}), /* @__PURE__ */ jsx(Transition, {
|
|
32
|
-
show: open,
|
|
33
|
-
as: Fragment,
|
|
34
|
-
enter: "transition ease-out duration-150",
|
|
35
|
-
enterFrom: "opacity-0",
|
|
36
|
-
enterTo: "opacity-100 backdrop-blur-2xl",
|
|
37
|
-
leave: "transition ease-in duration-150",
|
|
38
|
-
leaveFrom: "opacity-100 backdrop-blur-2xl",
|
|
39
|
-
leaveTo: "opacity-0",
|
|
40
|
-
children: /* @__PURE__ */ jsx(PopoverPanel, {
|
|
41
|
-
className: "text-ui-fg-on-color absolute inset-x-0 z-30 m-2 flex h-[calc(100vh-1rem)] w-full flex-col pr-4 text-sm backdrop-blur-2xl sm:w-1/3 sm:min-w-min sm:pr-0 2xl:w-1/4",
|
|
42
|
-
children: /* @__PURE__ */ jsxs("div", {
|
|
43
|
-
"data-testid": "nav-menu-popup",
|
|
44
|
-
className: "rounded-rounded flex h-full flex-col justify-between bg-[rgba(3,7,18,0.5)] p-6",
|
|
45
|
-
children: [
|
|
46
|
-
/* @__PURE__ */ jsx("div", {
|
|
47
|
-
className: "flex justify-end",
|
|
48
|
-
id: "xmark",
|
|
49
|
-
children: /* @__PURE__ */ jsx("button", {
|
|
50
|
-
"data-testid": "close-menu-button",
|
|
51
|
-
onClick: close,
|
|
52
|
-
children: /* @__PURE__ */ jsx(XMark, {})
|
|
53
|
-
})
|
|
54
|
-
}),
|
|
55
|
-
/* @__PURE__ */ jsx("ul", {
|
|
56
|
-
className: "flex flex-col items-start justify-start gap-6",
|
|
57
|
-
children: Object.entries(SideMenuItems).map(([name, href]) => {
|
|
58
|
-
return /* @__PURE__ */ jsx("li", { children: /* @__PURE__ */ jsx(LocalizedClientLink, {
|
|
59
|
-
href,
|
|
60
|
-
className: "hover:text-ui-fg-disabled text-3xl leading-10",
|
|
61
|
-
onClick: close,
|
|
62
|
-
"data-testid": `${name.toLowerCase()}-link`,
|
|
63
|
-
children: name
|
|
64
|
-
}) }, name);
|
|
65
|
-
})
|
|
66
|
-
}),
|
|
67
|
-
/* @__PURE__ */ jsxs("div", {
|
|
68
|
-
className: "flex flex-col gap-y-6",
|
|
69
|
-
children: [/* @__PURE__ */ jsxs("div", {
|
|
70
|
-
className: "flex justify-between",
|
|
71
|
-
onMouseEnter: toggleState.open,
|
|
72
|
-
onMouseLeave: toggleState.close,
|
|
73
|
-
children: [regions && /* @__PURE__ */ jsx(LayoutCountrySelect, {
|
|
74
|
-
toggleState,
|
|
75
|
-
regions
|
|
76
|
-
}), /* @__PURE__ */ jsx(ArrowRightMini, { className: clx("transition-transform duration-150", toggleState.state ? "-rotate-90" : "") })]
|
|
77
|
-
}), /* @__PURE__ */ jsxs(Text, {
|
|
78
|
-
className: "txt-compact-small flex justify-between",
|
|
79
|
-
children: [
|
|
80
|
-
"© ",
|
|
81
|
-
(/* @__PURE__ */ new Date()).getFullYear(),
|
|
82
|
-
" Medusa Store. All rights reserved."
|
|
83
|
-
]
|
|
84
|
-
})]
|
|
85
|
-
})
|
|
86
|
-
]
|
|
87
|
-
})
|
|
88
|
-
})
|
|
89
|
-
})] })
|
|
90
|
-
})
|
|
91
|
-
})
|
|
92
|
-
});
|
|
93
|
-
};
|
|
94
|
-
|
|
95
|
-
//#endregion
|
|
96
|
-
export { SideMenu as t };
|
|
97
|
-
//# sourceMappingURL=side-menu-B6IjTd5M.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"side-menu-B6IjTd5M.js","names":[],"sources":["../src/components/side-menu/index.tsx"],"sourcesContent":["'use client';\n\nimport { Fragment } from 'react';\n\nimport { Popover, PopoverPanel, Transition } from '@headlessui/react';\nimport { ArrowRightMini, XMark } from '@medusajs/icons';\nimport { Text, clx, useToggleState } from '@medusajs/ui';\n\nimport { Region } from '@/types/graphql';\n\nimport { LayoutCountrySelect } from '../layout-country-select';\nimport { LocalizedClientLink } from '../localized-client-link';\n\nconst SideMenuItems = {\n Home: '/',\n Store: '/store',\n Account: '/account',\n Cart: '/cart',\n};\n\nconst SideMenu = ({ regions }: { regions: Region[] | null }) => {\n const toggleState = useToggleState();\n\n return (\n <div className=\"h-full\">\n <div className=\"flex h-full items-center\">\n <Popover className=\"flex h-full\">\n {({ open, close }) => (\n <>\n <div className=\"relative flex h-full\">\n <Popover.Button\n data-testid=\"nav-menu-button\"\n className=\"hover:text-ui-fg-base relative flex h-full items-center transition-all duration-200 ease-out focus:outline-none\"\n >\n Menu\n </Popover.Button>\n </div>\n\n <Transition\n show={open}\n as={Fragment}\n enter=\"transition ease-out duration-150\"\n enterFrom=\"opacity-0\"\n enterTo=\"opacity-100 backdrop-blur-2xl\"\n leave=\"transition ease-in duration-150\"\n leaveFrom=\"opacity-100 backdrop-blur-2xl\"\n leaveTo=\"opacity-0\"\n >\n <PopoverPanel className=\"text-ui-fg-on-color absolute inset-x-0 z-30 m-2 flex h-[calc(100vh-1rem)] w-full flex-col pr-4 text-sm backdrop-blur-2xl sm:w-1/3 sm:min-w-min sm:pr-0 2xl:w-1/4\">\n <div\n data-testid=\"nav-menu-popup\"\n className=\"rounded-rounded flex h-full flex-col justify-between bg-[rgba(3,7,18,0.5)] p-6\"\n >\n <div className=\"flex justify-end\" id=\"xmark\">\n <button data-testid=\"close-menu-button\" onClick={close}>\n <XMark />\n </button>\n </div>\n <ul className=\"flex flex-col items-start justify-start gap-6\">\n {Object.entries(SideMenuItems).map(([name, href]) => {\n return (\n <li key={name}>\n <LocalizedClientLink\n href={href}\n className=\"hover:text-ui-fg-disabled text-3xl leading-10\"\n onClick={close}\n data-testid={`${name.toLowerCase()}-link`}\n >\n {name}\n </LocalizedClientLink>\n </li>\n );\n })}\n </ul>\n <div className=\"flex flex-col gap-y-6\">\n <div\n className=\"flex justify-between\"\n onMouseEnter={toggleState.open}\n onMouseLeave={toggleState.close}\n >\n {regions && (\n <LayoutCountrySelect\n toggleState={toggleState}\n regions={regions}\n />\n )}\n <ArrowRightMini\n className={clx(\n 'transition-transform duration-150',\n toggleState.state ? '-rotate-90' : ''\n )}\n />\n </div>\n <Text className=\"txt-compact-small flex justify-between\">\n © {new Date().getFullYear()} Medusa Store. All rights\n reserved.\n </Text>\n </div>\n </div>\n </PopoverPanel>\n </Transition>\n </>\n )}\n </Popover>\n </div>\n </div>\n );\n};\n\nexport { SideMenu };\n"],"mappings":";;;;;;;;;AAaA,MAAM,gBAAgB;CACpB,MAAM;CACN,OAAO;CACP,SAAS;CACT,MAAM;CACP;AAED,MAAM,YAAY,EAAE,cAA4C;CAC9D,MAAM,cAAc,gBAAgB;AAEpC,QACE,oBAAC;EAAI,WAAU;YACb,oBAAC;GAAI,WAAU;aACb,oBAAC;IAAQ,WAAU;eACf,EAAE,MAAM,YACR,8CACE,oBAAC;KAAI,WAAU;eACb,oBAAC,QAAQ;MACP,eAAY;MACZ,WAAU;gBACX;OAEgB;MACb,EAEN,oBAAC;KACC,MAAM;KACN,IAAI;KACJ,OAAM;KACN,WAAU;KACV,SAAQ;KACR,OAAM;KACN,WAAU;KACV,SAAQ;eAER,oBAAC;MAAa,WAAU;gBACtB,qBAAC;OACC,eAAY;OACZ,WAAU;;QAEV,oBAAC;SAAI,WAAU;SAAmB,IAAG;mBACnC,oBAAC;UAAO,eAAY;UAAoB,SAAS;oBAC/C,oBAAC,UAAQ;WACF;UACL;QACN,oBAAC;SAAG,WAAU;mBACX,OAAO,QAAQ,cAAc,CAAC,KAAK,CAAC,MAAM,UAAU;AACnD,iBACE,oBAAC,kBACC,oBAAC;WACO;WACN,WAAU;WACV,SAAS;WACT,eAAa,GAAG,KAAK,aAAa,CAAC;qBAElC;YACmB,IARf,KASJ;WAEP;UACC;QACL,qBAAC;SAAI,WAAU;oBACb,qBAAC;UACC,WAAU;UACV,cAAc,YAAY;UAC1B,cAAc,YAAY;qBAEzB,WACC,oBAAC;WACc;WACJ;YACT,EAEJ,oBAAC,kBACC,WAAW,IACT,qCACA,YAAY,QAAQ,eAAe,GACpC,GACD;WACE,EACN,qBAAC;UAAK,WAAU;;WAAyC;4BACpD,IAAI,MAAM,EAAC,aAAa;WAAC;;WAEvB;UACH;;QACF;OACO;MACJ,IACZ;KAEG;IACN;GACF"}
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import React from "react";
|
|
2
|
-
import { jsx } from "react/jsx-runtime";
|
|
3
|
-
import { Container, clx } from "@medusajs/ui";
|
|
4
|
-
import Image from "next/image";
|
|
5
|
-
import { PlaceholderImage } from "@gfed-medusa/sf-lib-ui/icons/placeholder-image";
|
|
6
|
-
|
|
7
|
-
//#region src/components/thumbnail/index.tsx
|
|
8
|
-
const Thumbnail = ({ thumbnail, images, size = "small", isFeatured, className, "data-testid": dataTestid }) => {
|
|
9
|
-
const initialImage = thumbnail || images?.[0]?.url;
|
|
10
|
-
return /* @__PURE__ */ jsx(Container, {
|
|
11
|
-
className: clx("rounded-large bg-ui-bg-subtle shadow-elevation-card-rest group-hover:shadow-elevation-card-hover relative w-full overflow-hidden p-4 transition-shadow duration-150 ease-in-out", className, {
|
|
12
|
-
"aspect-[11/14]": isFeatured,
|
|
13
|
-
"aspect-[9/16]": !isFeatured && size !== "square",
|
|
14
|
-
"aspect-[1/1]": size === "square",
|
|
15
|
-
"w-[180px]": size === "small",
|
|
16
|
-
"w-[290px]": size === "medium",
|
|
17
|
-
"w-[440px]": size === "large",
|
|
18
|
-
"w-full": size === "full"
|
|
19
|
-
}),
|
|
20
|
-
"data-testid": dataTestid,
|
|
21
|
-
children: /* @__PURE__ */ jsx(ImageOrPlaceholder, {
|
|
22
|
-
image: initialImage,
|
|
23
|
-
size
|
|
24
|
-
})
|
|
25
|
-
});
|
|
26
|
-
};
|
|
27
|
-
const ImageOrPlaceholder = ({ image, size }) => {
|
|
28
|
-
return image ? /* @__PURE__ */ jsx(Image, {
|
|
29
|
-
src: image,
|
|
30
|
-
alt: "Thumbnail",
|
|
31
|
-
className: "absolute inset-0 object-cover object-center",
|
|
32
|
-
draggable: false,
|
|
33
|
-
quality: 50,
|
|
34
|
-
sizes: "(max-width: 576px) 280px, (max-width: 768px) 360px, (max-width: 992px) 480px, 800px",
|
|
35
|
-
fill: true
|
|
36
|
-
}) : /* @__PURE__ */ jsx("div", {
|
|
37
|
-
className: "absolute inset-0 flex h-full w-full items-center justify-center",
|
|
38
|
-
children: /* @__PURE__ */ jsx(PlaceholderImage, { size: size === "small" ? 16 : 24 })
|
|
39
|
-
});
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
//#endregion
|
|
43
|
-
export { Thumbnail as t };
|
|
44
|
-
//# sourceMappingURL=thumbnail-C0TU3rh-.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"thumbnail-C0TU3rh-.js","names":["Thumbnail: React.FC<ThumbnailProps>"],"sources":["../src/components/thumbnail/index.tsx"],"sourcesContent":["import React from 'react';\n\nimport Image from 'next/image';\n\nimport { PlaceholderImage } from '@gfed-medusa/sf-lib-ui/icons/placeholder-image';\nimport { Container, clx } from '@medusajs/ui';\n\ntype ThumbnailProps = {\n thumbnail?: string | null;\n // TODO: Fix image typings\n images?: any[] | null;\n size?: 'small' | 'medium' | 'large' | 'full' | 'square';\n isFeatured?: boolean;\n className?: string;\n 'data-testid'?: string;\n};\n\nconst Thumbnail: React.FC<ThumbnailProps> = ({\n thumbnail,\n images,\n size = 'small',\n isFeatured,\n className,\n 'data-testid': dataTestid,\n}) => {\n const initialImage = thumbnail || images?.[0]?.url;\n\n return (\n <Container\n className={clx(\n 'rounded-large bg-ui-bg-subtle shadow-elevation-card-rest group-hover:shadow-elevation-card-hover relative w-full overflow-hidden p-4 transition-shadow duration-150 ease-in-out',\n className,\n {\n 'aspect-[11/14]': isFeatured,\n 'aspect-[9/16]': !isFeatured && size !== 'square',\n 'aspect-[1/1]': size === 'square',\n 'w-[180px]': size === 'small',\n 'w-[290px]': size === 'medium',\n 'w-[440px]': size === 'large',\n 'w-full': size === 'full',\n }\n )}\n data-testid={dataTestid}\n >\n <ImageOrPlaceholder image={initialImage} size={size} />\n </Container>\n );\n};\n\nconst ImageOrPlaceholder = ({\n image,\n size,\n}: Pick<ThumbnailProps, 'size'> & { image?: string }) => {\n return image ? (\n <Image\n src={image}\n alt=\"Thumbnail\"\n className=\"absolute inset-0 object-cover object-center\"\n draggable={false}\n quality={50}\n sizes=\"(max-width: 576px) 280px, (max-width: 768px) 360px, (max-width: 992px) 480px, 800px\"\n fill\n />\n ) : (\n <div className=\"absolute inset-0 flex h-full w-full items-center justify-center\">\n <PlaceholderImage size={size === 'small' ? 16 : 24} />\n </div>\n );\n};\n\nexport { Thumbnail };\n"],"mappings":";;;;;;;AAiBA,MAAMA,aAAuC,EAC3C,WACA,QACA,OAAO,SACP,YACA,WACA,eAAe,iBACX;CACJ,MAAM,eAAe,aAAa,SAAS,IAAI;AAE/C,QACE,oBAAC;EACC,WAAW,IACT,mLACA,WACA;GACE,kBAAkB;GAClB,iBAAiB,CAAC,cAAc,SAAS;GACzC,gBAAgB,SAAS;GACzB,aAAa,SAAS;GACtB,aAAa,SAAS;GACtB,aAAa,SAAS;GACtB,UAAU,SAAS;GACpB,CACF;EACD,eAAa;YAEb,oBAAC;GAAmB,OAAO;GAAoB;IAAQ;GAC7C;;AAIhB,MAAM,sBAAsB,EAC1B,OACA,WACuD;AACvD,QAAO,QACL,oBAAC;EACC,KAAK;EACL,KAAI;EACJ,WAAU;EACV,WAAW;EACX,SAAS;EACT,OAAM;EACN;GACA,GAEF,oBAAC;EAAI,WAAU;YACb,oBAAC,oBAAiB,MAAM,SAAS,UAAU,KAAK,KAAM;GAClD"}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { a as initializeApollo } from "./apollo-client-Bw50r80c.js";
|
|
2
|
-
import { useMemo } from "react";
|
|
3
|
-
|
|
4
|
-
//#region src/lib/hooks/use-apollo.tsx
|
|
5
|
-
function useApollo() {
|
|
6
|
-
return useMemo(initializeApollo, []);
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
//#endregion
|
|
10
|
-
export { useApollo as t };
|
|
11
|
-
//# sourceMappingURL=use-apollo-BxAFd1Y5.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-apollo-BxAFd1Y5.js","names":[],"sources":["../src/lib/hooks/use-apollo.tsx"],"sourcesContent":["import { useMemo } from 'react';\n\nimport { initializeApollo } from '@/lib/gql/apollo-client';\n\nexport function useApollo() {\n const storedClient = useMemo(initializeApollo, []);\n\n return storedClient;\n}\n"],"mappings":";;;;AAIA,SAAgB,YAAY;AAG1B,QAFqB,QAAQ,kBAAkB,EAAE,CAAC"}
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import { t as searchSuggestions } from "./search-D7Gw7jAk.js";
|
|
2
|
-
import { useCallback, useEffect, useState } from "react";
|
|
3
|
-
|
|
4
|
-
//#region src/lib/hooks/use-search.tsx
|
|
5
|
-
const DEBOUNCE_MS = 500;
|
|
6
|
-
const useSearch = () => {
|
|
7
|
-
const [query, setQuery] = useState("");
|
|
8
|
-
const [results, setResults] = useState(null);
|
|
9
|
-
const [loading, setLoading] = useState(false);
|
|
10
|
-
const [error, setError] = useState(null);
|
|
11
|
-
const [isTyping, setIsTyping] = useState(false);
|
|
12
|
-
const [debounceTimer, setDebounceTimer] = useState(null);
|
|
13
|
-
const performSearch = useCallback(async (searchQuery) => {
|
|
14
|
-
if (!searchQuery.trim()) {
|
|
15
|
-
setResults(null);
|
|
16
|
-
return;
|
|
17
|
-
}
|
|
18
|
-
setLoading(true);
|
|
19
|
-
setError(null);
|
|
20
|
-
try {
|
|
21
|
-
setResults(await searchSuggestions({
|
|
22
|
-
query: searchQuery,
|
|
23
|
-
hitsPerPage: 20
|
|
24
|
-
}));
|
|
25
|
-
} catch (err) {
|
|
26
|
-
setError(err instanceof Error ? err.message : "Search failed");
|
|
27
|
-
console.error("Search error:", err);
|
|
28
|
-
} finally {
|
|
29
|
-
setLoading(false);
|
|
30
|
-
}
|
|
31
|
-
}, []);
|
|
32
|
-
const search = useCallback(async (searchQuery) => {
|
|
33
|
-
await performSearch(searchQuery);
|
|
34
|
-
}, [performSearch]);
|
|
35
|
-
const handleQueryChange = useCallback((newQuery) => {
|
|
36
|
-
setQuery(newQuery);
|
|
37
|
-
if (debounceTimer) clearTimeout(debounceTimer);
|
|
38
|
-
if (newQuery.trim()) setIsTyping(true);
|
|
39
|
-
else {
|
|
40
|
-
setIsTyping(false);
|
|
41
|
-
setResults(null);
|
|
42
|
-
return;
|
|
43
|
-
}
|
|
44
|
-
setDebounceTimer(setTimeout(() => {
|
|
45
|
-
setIsTyping(false);
|
|
46
|
-
performSearch(newQuery);
|
|
47
|
-
}, DEBOUNCE_MS));
|
|
48
|
-
}, [debounceTimer, performSearch]);
|
|
49
|
-
useEffect(() => {
|
|
50
|
-
return () => {
|
|
51
|
-
if (debounceTimer) clearTimeout(debounceTimer);
|
|
52
|
-
};
|
|
53
|
-
}, [debounceTimer]);
|
|
54
|
-
return {
|
|
55
|
-
query,
|
|
56
|
-
setQuery: handleQueryChange,
|
|
57
|
-
results,
|
|
58
|
-
loading,
|
|
59
|
-
error,
|
|
60
|
-
search,
|
|
61
|
-
isTyping
|
|
62
|
-
};
|
|
63
|
-
};
|
|
64
|
-
|
|
65
|
-
//#endregion
|
|
66
|
-
export { useSearch as t };
|
|
67
|
-
//# sourceMappingURL=use-search-VX-u8o1D.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-search-VX-u8o1D.js","names":[],"sources":["../src/lib/hooks/use-search.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useState } from 'react';\n\nimport { searchSuggestions } from '@/lib/data/search';\nimport { ProductHit } from '@/types/graphql';\n\nexport type UseSearchOptions = {\n hitsPerPage?: number;\n debounceMs?: number;\n};\n\nexport type SearchResult = {\n items: ProductHit[];\n};\n\nconst DEBOUNCE_MS = 500;\n\nexport const useSearch = () => {\n const [query, setQuery] = useState('');\n const [results, setResults] = useState<SearchResult | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [isTyping, setIsTyping] = useState(false);\n const [debounceTimer, setDebounceTimer] = useState<NodeJS.Timeout | null>(\n null\n );\n\n const performSearch = useCallback(async (searchQuery: string) => {\n if (!searchQuery.trim()) {\n setResults(null);\n return;\n }\n\n setLoading(true);\n setError(null);\n\n try {\n const searchParams = {\n query: searchQuery,\n hitsPerPage: 20,\n };\n\n const searchResults = await searchSuggestions(searchParams);\n setResults(searchResults);\n } catch (err) {\n const errorMessage = err instanceof Error ? err.message : 'Search failed';\n setError(errorMessage);\n console.error('Search error:', err);\n } finally {\n setLoading(false);\n }\n }, []);\n\n const search = useCallback(\n async (searchQuery: string) => {\n await performSearch(searchQuery);\n },\n [performSearch]\n );\n\n const handleQueryChange = useCallback(\n (newQuery: string) => {\n setQuery(newQuery);\n\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n\n if (newQuery.trim()) {\n setIsTyping(true);\n } else {\n setIsTyping(false);\n setResults(null);\n return;\n }\n\n const timer = setTimeout(() => {\n setIsTyping(false);\n performSearch(newQuery);\n }, DEBOUNCE_MS);\n\n setDebounceTimer(timer);\n },\n [debounceTimer, performSearch]\n );\n\n useEffect(() => {\n return () => {\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n };\n }, [debounceTimer]);\n\n return {\n query,\n setQuery: handleQueryChange,\n results,\n loading,\n error,\n search,\n isTyping,\n };\n};\n"],"mappings":";;;;AAgBA,MAAM,cAAc;AAEpB,MAAa,kBAAkB;CAC7B,MAAM,CAAC,OAAO,YAAY,SAAS,GAAG;CACtC,MAAM,CAAC,SAAS,cAAc,SAA8B,KAAK;CACjE,MAAM,CAAC,SAAS,cAAc,SAAS,MAAM;CAC7C,MAAM,CAAC,OAAO,YAAY,SAAwB,KAAK;CACvD,MAAM,CAAC,UAAU,eAAe,SAAS,MAAM;CAC/C,MAAM,CAAC,eAAe,oBAAoB,SACxC,KACD;CAED,MAAM,gBAAgB,YAAY,OAAO,gBAAwB;AAC/D,MAAI,CAAC,YAAY,MAAM,EAAE;AACvB,cAAW,KAAK;AAChB;;AAGF,aAAW,KAAK;AAChB,WAAS,KAAK;AAEd,MAAI;AAOF,cADsB,MAAM,kBALP;IACnB,OAAO;IACP,aAAa;IACd,CAE0D,CAClC;WAClB,KAAK;AAEZ,YADqB,eAAe,QAAQ,IAAI,UAAU,gBACpC;AACtB,WAAQ,MAAM,iBAAiB,IAAI;YAC3B;AACR,cAAW,MAAM;;IAElB,EAAE,CAAC;CAEN,MAAM,SAAS,YACb,OAAO,gBAAwB;AAC7B,QAAM,cAAc,YAAY;IAElC,CAAC,cAAc,CAChB;CAED,MAAM,oBAAoB,aACvB,aAAqB;AACpB,WAAS,SAAS;AAElB,MAAI,cACF,cAAa,cAAc;AAG7B,MAAI,SAAS,MAAM,CACjB,aAAY,KAAK;OACZ;AACL,eAAY,MAAM;AAClB,cAAW,KAAK;AAChB;;AAQF,mBALc,iBAAiB;AAC7B,eAAY,MAAM;AAClB,iBAAc,SAAS;KACtB,YAAY,CAEQ;IAEzB,CAAC,eAAe,cAAc,CAC/B;AAED,iBAAgB;AACd,eAAa;AACX,OAAI,cACF,cAAa,cAAc;;IAG9B,CAAC,cAAc,CAAC;AAEnB,QAAO;EACL;EACA,UAAU;EACV;EACA;EACA;EACA;EACA;EACD"}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
//#region src/lib/hooks/use-toggle-state.d.ts
|
|
2
|
-
type StateType = [boolean, () => void, () => void, () => void] & {
|
|
3
|
-
state: boolean;
|
|
4
|
-
open: () => void;
|
|
5
|
-
close: () => void;
|
|
6
|
-
toggle: () => void;
|
|
7
|
-
};
|
|
8
|
-
/**
|
|
9
|
-
*
|
|
10
|
-
* @param initialState - boolean
|
|
11
|
-
* @returns An array like object with `state`, `open`, `close`, and `toggle` properties
|
|
12
|
-
* to allow both object and array destructuring
|
|
13
|
-
*
|
|
14
|
-
* ```
|
|
15
|
-
* const [showModal, openModal, closeModal, toggleModal] = useToggleState()
|
|
16
|
-
* // or
|
|
17
|
-
* const { state, open, close, toggle } = useToggleState()
|
|
18
|
-
* ```
|
|
19
|
-
*/
|
|
20
|
-
declare const useToggleState: (initialState?: boolean) => StateType;
|
|
21
|
-
//#endregion
|
|
22
|
-
export { useToggleState as n, StateType as t };
|
|
23
|
-
//# sourceMappingURL=use-toggle-state-DI4Gwlfj.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"use-toggle-state-DI4Gwlfj.d.ts","names":[],"sources":["../src/lib/hooks/use-toggle-state.tsx"],"sourcesContent":[],"mappings":";KAEY,SAAA;EAAA,KAAA,EAAA,OAAS;EAoBf,IAAA,EAAA,GAAA,GAAA,IAAA;;;;;;;;;;;;;;;;cAAA,4CAAsC"}
|