@gem-sdk/pages 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/README.md +7 -0
  2. package/dist/cjs/components/ErrorBoundary.js +32 -0
  3. package/dist/cjs/components/ErrorFallback.js +9 -0
  4. package/dist/cjs/components/FacebookPixel.js +41 -0
  5. package/dist/cjs/components/GoogleAnalytic.js +43 -0
  6. package/dist/cjs/components/TikTokPixel.js +20 -0
  7. package/dist/cjs/components/builder/Toolbox.js +200 -0
  8. package/dist/cjs/index.js +62 -0
  9. package/dist/cjs/layouts/main.js +15 -0
  10. package/dist/cjs/libs/api/get-builder-props.js +33 -0
  11. package/dist/cjs/libs/api/get-collection-props.js +64 -0
  12. package/dist/cjs/libs/api/get-home-page-props-v2.js +127 -0
  13. package/dist/cjs/libs/api/get-home-page-props.js +135 -0
  14. package/dist/cjs/libs/api/get-preview-props.js +18 -0
  15. package/dist/cjs/libs/api/get-product-props.js +71 -0
  16. package/dist/cjs/libs/api/get-static-page-props-preview.js +133 -0
  17. package/dist/cjs/libs/api/get-static-page-props-v2.js +130 -0
  18. package/dist/cjs/libs/api/get-static-page-props.js +132 -0
  19. package/dist/cjs/libs/fetcher.js +71 -0
  20. package/dist/cjs/libs/get-layout.js +10 -0
  21. package/dist/cjs/libs/get-storefront-api.js +12 -0
  22. package/dist/cjs/libs/getStaticPaths.js +10 -0
  23. package/dist/cjs/libs/google-fonts.js +68 -0
  24. package/dist/cjs/libs/helpers/gen-css.js +102 -0
  25. package/dist/cjs/libs/helpers/generate-manifres.js +5 -0
  26. package/dist/cjs/libs/helpers/get-fallback.js +29 -0
  27. package/dist/cjs/libs/helpers/normalize.js +87 -0
  28. package/dist/cjs/libs/helpers/parse-json.js +18 -0
  29. package/dist/cjs/pages/404.js +11 -0
  30. package/dist/cjs/pages/500.js +19 -0
  31. package/dist/cjs/pages/builder.js +26 -0
  32. package/dist/cjs/pages/collection-detail.js +21 -0
  33. package/dist/cjs/pages/preview.js +20 -0
  34. package/dist/cjs/pages/product-detail.js +21 -0
  35. package/dist/cjs/pages/static-v2.js +17 -0
  36. package/dist/cjs/pages/static.js +19 -0
  37. package/dist/esm/components/ErrorBoundary.js +30 -0
  38. package/dist/esm/components/ErrorFallback.js +7 -0
  39. package/dist/esm/components/FacebookPixel.js +39 -0
  40. package/dist/esm/components/GoogleAnalytic.js +41 -0
  41. package/dist/esm/components/TikTokPixel.js +18 -0
  42. package/dist/esm/components/builder/Toolbox.js +196 -0
  43. package/dist/esm/index.js +28 -0
  44. package/dist/esm/layouts/main.js +11 -0
  45. package/dist/esm/libs/api/get-builder-props.js +31 -0
  46. package/dist/esm/libs/api/get-collection-props.js +62 -0
  47. package/dist/esm/libs/api/get-home-page-props-v2.js +125 -0
  48. package/dist/esm/libs/api/get-home-page-props.js +133 -0
  49. package/dist/esm/libs/api/get-preview-props.js +16 -0
  50. package/dist/esm/libs/api/get-product-props.js +69 -0
  51. package/dist/esm/libs/api/get-static-page-props-preview.js +131 -0
  52. package/dist/esm/libs/api/get-static-page-props-v2.js +128 -0
  53. package/dist/esm/libs/api/get-static-page-props.js +130 -0
  54. package/dist/esm/libs/fetcher.js +68 -0
  55. package/dist/esm/libs/get-layout.js +8 -0
  56. package/dist/esm/libs/get-storefront-api.js +10 -0
  57. package/dist/esm/libs/getStaticPaths.js +8 -0
  58. package/dist/esm/libs/google-fonts.js +64 -0
  59. package/dist/esm/libs/helpers/gen-css.js +100 -0
  60. package/dist/esm/libs/helpers/generate-manifres.js +3 -0
  61. package/dist/esm/libs/helpers/get-fallback.js +27 -0
  62. package/dist/esm/libs/helpers/normalize.js +83 -0
  63. package/dist/esm/libs/helpers/parse-json.js +15 -0
  64. package/dist/esm/pages/404.js +9 -0
  65. package/dist/esm/pages/500.js +17 -0
  66. package/dist/esm/pages/builder.js +24 -0
  67. package/dist/esm/pages/collection-detail.js +17 -0
  68. package/dist/esm/pages/preview.js +18 -0
  69. package/dist/esm/pages/product-detail.js +17 -0
  70. package/dist/esm/pages/static-v2.js +15 -0
  71. package/dist/esm/pages/static.js +15 -0
  72. package/dist/types/index.d.ts +173 -0
  73. package/package.json +45 -0
@@ -0,0 +1,71 @@
1
+ 'use strict';
2
+
3
+ var getStorefrontApi = require('./get-storefront-api.js');
4
+
5
+ const createFetcher = (token) => {
6
+ const shopToken = token || process.env.NEXT_PUBLIC_SHOP_TOKEN;
7
+ return async (args) => {
8
+ const [query, variables, operationName] = args;
9
+ if (!shopToken) {
10
+ throw new Error('shopToken is not defined');
11
+ }
12
+ if (!process.env.NEXT_PUBLIC_API_URL) {
13
+ throw new Error('NEXT_PUBLIC_API_URL is not defined');
14
+ }
15
+ const headers = {
16
+ 'Content-Type': 'application/json',
17
+ 'X-GemX-Shop-Token': shopToken,
18
+ };
19
+ return fetch(process.env.NEXT_PUBLIC_API_URL, {
20
+ method: 'POST',
21
+ headers,
22
+ body: JSON.stringify({
23
+ query,
24
+ variables,
25
+ operationName,
26
+ }),
27
+ })
28
+ .then((res) => res.json())
29
+ .then((res) => {
30
+ if (res.errors) {
31
+ return Promise.reject(res.errors);
32
+ }
33
+ return res.data;
34
+ });
35
+ };
36
+ };
37
+ const createShopifyFetcher = (storefrontToken, handle) => {
38
+ const token = storefrontToken ?? process.env.NEXT_PUBLIC_STOREFRONT_TOKEN;
39
+ const storefrontHandle = handle ?? process.env.NEXT_PUBLIC_STOREFRONT_HANDLE;
40
+ return async (args) => {
41
+ if (!token) {
42
+ throw new Error('NEXT_PUBLIC_STOREFRONT_TOKEN is not defined');
43
+ }
44
+ if (!storefrontHandle) {
45
+ throw new Error('NEXT_PUBLIC_STOREFRONT_HANDLE is not defined');
46
+ }
47
+ const headers = {
48
+ 'Content-Type': 'application/json',
49
+ 'X-Shopify-Storefront-Access-Token': token,
50
+ };
51
+ const [query, variables] = args;
52
+ return fetch(getStorefrontApi.getStorefrontApi(storefrontHandle), {
53
+ method: 'POST',
54
+ headers,
55
+ body: JSON.stringify({
56
+ query,
57
+ variables,
58
+ }),
59
+ })
60
+ .then((res) => res.json())
61
+ .then((res) => {
62
+ if (res.errors) {
63
+ return Promise.reject(res.errors);
64
+ }
65
+ return res.data;
66
+ });
67
+ };
68
+ };
69
+
70
+ exports.createFetcher = createFetcher;
71
+ exports.createShopifyFetcher = createShopifyFetcher;
@@ -0,0 +1,10 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var main = require('../layouts/main.js');
5
+
6
+ const getLayout = (page) => {
7
+ return jsxRuntime.jsx(main.default, { children: page });
8
+ };
9
+
10
+ exports.getLayout = getLayout;
@@ -0,0 +1,12 @@
1
+ 'use strict';
2
+
3
+ const getStorefrontApi = (handle, provider) => {
4
+ switch (provider) {
5
+ case 'BIGCOMMERCE':
6
+ return `https://${handle}.bigcommerce.com`;
7
+ default:
8
+ return `https://${handle}.myshopify.com/api/2022-07/graphql.json`;
9
+ }
10
+ };
11
+
12
+ exports.getStorefrontApi = getStorefrontApi;
@@ -0,0 +1,10 @@
1
+ 'use strict';
2
+
3
+ const getStaticPaths = async () => {
4
+ return {
5
+ paths: [],
6
+ fallback: true,
7
+ };
8
+ };
9
+
10
+ exports.getStaticPaths = getStaticPaths;
@@ -0,0 +1,68 @@
1
+ 'use strict';
2
+
3
+ const CHROME_UA = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.61 Safari/537.36';
4
+ const IE_UA = 'Mozilla/5.0 (Windows NT 10.0; Trident/7.0; rv:11.0) like Gecko';
5
+ async function getFontForUA(url, UA) {
6
+ return fetch(url, {
7
+ headers: {
8
+ 'User-Agent': UA,
9
+ },
10
+ }).then((res) => res.text());
11
+ }
12
+ const createFontUrl = (fonts, option) => {
13
+ const params = new URLSearchParams();
14
+ const display = option?.display || 'swap';
15
+ const family = fonts
16
+ .filter((font, index, arr) => {
17
+ return index === arr.findIndex((t) => t.family === font.family);
18
+ })
19
+ .map((font) => {
20
+ return `${font.family.replace(/ /g, '+')}:${font.variants.join(',')}`;
21
+ })
22
+ .join('|');
23
+ params.append('family', family);
24
+ params.append('display', display);
25
+ if (option?.subset) {
26
+ params.append('subset', option.subset);
27
+ }
28
+ if (option?.effect) {
29
+ params.append('effect', option.effect);
30
+ }
31
+ return `https://fonts.googleapis.com/css?${decodeURIComponent(params.toString())}`;
32
+ };
33
+ async function getFonts(fonts, option) {
34
+ /**
35
+ * The order of IE -> Chrome is important, other wise chrome starts loading woff1.
36
+ * CSS cascading 🤷‍♂️.
37
+ */
38
+ const url = createFontUrl(fonts, option);
39
+ try {
40
+ const [ie, chrome] = await Promise.all([
41
+ getFontForUA(url, IE_UA),
42
+ getFontForUA(url, CHROME_UA),
43
+ ]);
44
+ return ie + chrome;
45
+ }
46
+ catch (e) {
47
+ return '';
48
+ }
49
+ }
50
+ const getFontFromGlobalStyle = (data) => {
51
+ if (!data)
52
+ return '';
53
+ try {
54
+ const globalStyle = JSON.parse(data);
55
+ const fonts = globalStyle?.font ?? {};
56
+ const font = Object.entries(fonts).map(([, value]) => {
57
+ return value;
58
+ });
59
+ return getFonts(font);
60
+ }
61
+ catch {
62
+ return '';
63
+ }
64
+ };
65
+
66
+ exports.createFontUrl = createFontUrl;
67
+ exports.getFontFromGlobalStyle = getFontFromGlobalStyle;
68
+ exports.getFonts = getFonts;
@@ -0,0 +1,102 @@
1
+ 'use strict';
2
+
3
+ var core = require('@gem-sdk/core');
4
+ var merge = require('deepmerge');
5
+
6
+ const baseDevices = {
7
+ tablet: '1023px',
8
+ mobile: '767px',
9
+ };
10
+ const flattenObject = (obj, prefix) => {
11
+ return Object.keys(obj).reduce((acc, k) => {
12
+ const pre = prefix ? `${prefix}-` : '';
13
+ if (typeof obj[k] === 'object' && obj[k] !== null && Object.keys(obj[k]).length > 0)
14
+ Object.assign(acc, flattenObject(obj[k], pre + k));
15
+ else
16
+ acc[pre + k] = obj[k];
17
+ return acc;
18
+ }, {});
19
+ };
20
+ const devicesOrder = ['desktop', 'tablet', 'mobile'];
21
+ const mapObject = (obj) => {
22
+ return Object.entries(obj ?? {}).reduce((acc, [k, v]) => {
23
+ return {
24
+ ...acc,
25
+ [core.getShortName(k)]: typeof v === 'object' ? mapObject(v) : v,
26
+ };
27
+ }, {});
28
+ };
29
+ const getValueByDevice = (data, device) => {
30
+ const deviceData = {
31
+ typography: Object.fromEntries(Object.entries(data?.typography ?? {}).map(([key, value]) => {
32
+ const typo = { ...value?.[device] };
33
+ if (!typo)
34
+ return [key, undefined];
35
+ if (typo.fontFamily) {
36
+ typo.fontFamily = `var(--g-font-${typo.fontFamily}, ${typo.fontFamily})`;
37
+ }
38
+ return [key, typo];
39
+ })),
40
+ spacing: Object.fromEntries(Object.entries(data?.spacing ?? {}).map(([key, value]) => {
41
+ return [key, value?.[device]];
42
+ })),
43
+ container: Object.fromEntries(Object.entries(data?.container ?? {}).map(([key, value]) => {
44
+ return [key, value?.[device]];
45
+ })),
46
+ font: Object.fromEntries(Object.entries(data?.font ?? {}).map(([key, value]) => {
47
+ return [key, value?.family];
48
+ })),
49
+ };
50
+ return deviceData;
51
+ };
52
+ const genCSSVariable = (deviceData) => {
53
+ return Object.entries(mapObject(flattenObject(deviceData)))
54
+ .map(([key, value]) => {
55
+ if (value === undefined)
56
+ return undefined;
57
+ return `--g-${key}:${value}`;
58
+ })
59
+ .filter((v) => v !== undefined)
60
+ .join(';');
61
+ };
62
+ const genCSS = (input, mobileOnly) => {
63
+ if (!input)
64
+ return '';
65
+ let data = {};
66
+ try {
67
+ if (typeof input === 'string') {
68
+ data = JSON.parse(input);
69
+ }
70
+ else {
71
+ data = input;
72
+ }
73
+ if (mobileOnly) {
74
+ const desktop = getValueByDevice(data, 'desktop');
75
+ const mobile = getValueByDevice(data, 'mobile');
76
+ const deviceData = merge(desktop, mobile);
77
+ deviceData.color = data.color;
78
+ deviceData.radius = data.radius;
79
+ const cssData = genCSSVariable(deviceData);
80
+ return `:root{${cssData}}`;
81
+ }
82
+ return devicesOrder
83
+ .map((device) => {
84
+ const deviceData = getValueByDevice(data, device);
85
+ if (device === 'desktop') {
86
+ deviceData.color = data.color;
87
+ deviceData.radius = data.radius;
88
+ }
89
+ const cssData = genCSSVariable(deviceData);
90
+ if (device === 'desktop') {
91
+ return `:root{${cssData}}`;
92
+ }
93
+ return `@media (max-width: ${baseDevices[device]}) {:root{${cssData}}}`;
94
+ })
95
+ .join('\n');
96
+ }
97
+ catch {
98
+ return '';
99
+ }
100
+ };
101
+
102
+ exports.genCSS = genCSS;
@@ -0,0 +1,5 @@
1
+ 'use strict';
2
+
3
+ const generateManifest = (data) => `data:application/manifest+json,${encodeURIComponent(JSON.stringify(data))}`;
4
+
5
+ exports.generateManifest = generateManifest;
@@ -0,0 +1,29 @@
1
+ 'use strict';
2
+
3
+ var core = require('@gem-sdk/core');
4
+
5
+ const getFallbackV2 = async (fetcher, data) => {
6
+ const isSample = !process.env.NEXT_PUBLIC_STOREFRONT_TOKEN;
7
+ const queries = data.map((v) => core.prefetchQueries(v.data, isSample)).flat();
8
+ const datas = await Promise.allSettled(queries.map(({ query, variables, func }) => {
9
+ if (func) {
10
+ return func(fetcher, variables);
11
+ }
12
+ if (query)
13
+ return fetcher([query, variables]);
14
+ return {};
15
+ }));
16
+ const fallback = queries.reduce((acc, { key }, index) => {
17
+ const res = datas[index];
18
+ if (res?.status === 'fulfilled') {
19
+ return {
20
+ ...acc,
21
+ [key]: res.value,
22
+ };
23
+ }
24
+ return acc;
25
+ }, {});
26
+ return fallback;
27
+ };
28
+
29
+ exports.getFallbackV2 = getFallbackV2;
@@ -0,0 +1,87 @@
1
+ 'use strict';
2
+
3
+ const normalizeBuilderData = (data) => {
4
+ const result = {};
5
+ function compose(cData, currData = {}) {
6
+ if (cData) {
7
+ const { childrens, dateModified, editorConfigs, ...rest } = cData;
8
+ if (rest.type === 'section') {
9
+ currData[rest.uid] = rest;
10
+ }
11
+ else {
12
+ const items = childrens?.map((child) => child?.uid) ?? [];
13
+ currData[rest.uid] = { ...rest, childrens: items };
14
+ if (childrens) {
15
+ childrens.map((child) => compose(child, currData));
16
+ }
17
+ }
18
+ }
19
+ }
20
+ compose(data, result);
21
+ return { ...result };
22
+ };
23
+ const orderSection = (sections, orders) => {
24
+ // Filter out sections that are not in the order list
25
+ const ids = orders?.filter((id) => sections?.some((v) => v?.id === id));
26
+ // Return the ordered sections
27
+ const orderedSections = ids?.map((id) => sections?.find((v) => v?.id === id)) ?? [];
28
+ // Return the sections that are not in the order list
29
+ const sectionsNotInOrder = sections?.filter((v) => !v?.id || !ids?.includes(v.id)) ?? [];
30
+ // Return the ordered sections + the sections that are not in the order list
31
+ return orderedSections.concat(sectionsNotInOrder);
32
+ };
33
+ function normalizePageSectionResponse(sections, orders) {
34
+ const sortedSections = orderSection(sections, orders);
35
+ const childrens = sortedSections
36
+ .map((item) => {
37
+ if (!item?.component)
38
+ return false;
39
+ try {
40
+ const data = JSON.parse(item.component);
41
+ return data;
42
+ }
43
+ catch {
44
+ return false;
45
+ }
46
+ })
47
+ .filter(Boolean);
48
+ return normalizeBuilderData({
49
+ uid: 'ROOT',
50
+ tag: 'Root',
51
+ childrens,
52
+ });
53
+ }
54
+ function normalizePageSectionResponseV2(sections, orders) {
55
+ const sortedSections = orderSection(sections, orders);
56
+ const childrens = sortedSections
57
+ .map((item) => {
58
+ if (!item?.component)
59
+ return false;
60
+ try {
61
+ const data = JSON.parse(item.component);
62
+ return data;
63
+ }
64
+ catch {
65
+ return false;
66
+ }
67
+ })
68
+ .filter(Boolean);
69
+ return childrens.map((v) => {
70
+ return {
71
+ uid: v.uid,
72
+ lazy: Boolean(v.settings?.lazy),
73
+ priority: Boolean(v.settings?.priority),
74
+ data: normalizeBuilderData(v),
75
+ };
76
+ });
77
+ }
78
+ const parseBuilderTemplateV2 = (data) => {
79
+ return normalizePageSectionResponseV2([...(data?.pageSections ?? []), ...(data?.themePageCustomSections ?? [])], data?.sectionPosition);
80
+ };
81
+ const parseBuilderTemplate = (data) => {
82
+ return normalizePageSectionResponse([...(data?.pageSections ?? []), ...(data?.themePageCustomSections ?? [])], data?.sectionPosition);
83
+ };
84
+
85
+ exports.normalizeBuilderData = normalizeBuilderData;
86
+ exports.parseBuilderTemplate = parseBuilderTemplate;
87
+ exports.parseBuilderTemplateV2 = parseBuilderTemplateV2;
@@ -0,0 +1,18 @@
1
+ 'use strict';
2
+
3
+ const parseJson = (json) => {
4
+ if (!json)
5
+ return null;
6
+ try {
7
+ return JSON.parse(json);
8
+ }
9
+ catch (e) {
10
+ return null;
11
+ }
12
+ };
13
+ const serializableJson = (props) => {
14
+ return JSON.parse(JSON.stringify(props));
15
+ };
16
+
17
+ exports.parseJson = parseJson;
18
+ exports.serializableJson = serializableJson;
@@ -0,0 +1,11 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var nextSeo = require('next-seo');
5
+ var Image = require('next/image');
6
+
7
+ const Page404 = () => {
8
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(nextSeo.NextSeo, { title: "Page not found" }), jsxRuntime.jsxs("div", { className: "tablet:max-w-2xl container mx-auto flex min-h-screen max-w-4xl flex-col items-center justify-center gap-8 px-8", children: [jsxRuntime.jsx(Image, { sizes: "(max-width: 768px) 100vw, 50vw", src: "https://ucarecdn.com/27dfcf10-8fff-4341-90a0-dc97e4072acc/-/format/auto/", width: 802, height: 450, alt: "Not found", quality: 100, priority: true }), jsxRuntime.jsxs("div", { className: "flex flex-col items-center justify-center gap-2 pb-36", children: [jsxRuntime.jsx("h1", { className: "mobile:text-2xl text-4xl font-semibold", children: "Oops! Page not found" }), jsxRuntime.jsx("p", { children: "Your page URL is incorrect." })] })] })] }));
9
+ };
10
+
11
+ exports.Page404 = Page404;
@@ -0,0 +1,19 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var core = require('@gem-sdk/core');
5
+ var nextSeo = require('next-seo');
6
+ var Image = require('next/image');
7
+ var react = require('react');
8
+
9
+ const Page500 = () => {
10
+ const [loading, setLoading] = react.useState(false);
11
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(nextSeo.NextSeo, { title: "Service Unavailable" }), jsxRuntime.jsxs("div", { className: "tablet:max-w-2xl container mx-auto flex min-h-screen max-w-4xl flex-col items-center justify-center gap-8 px-8", children: [jsxRuntime.jsx(Image, { sizes: "(max-width: 768px) 100vw, 50vw", src: "https://ucarecdn.com/ea647025-54e3-4abb-87c4-859c5853ed56/-/format/auto/", width: 802, height: 450, alt: "Not found", quality: 100, priority: true }), jsxRuntime.jsxs("div", { className: "flex flex-col gap-8 pb-36", children: [jsxRuntime.jsxs("div", { className: "flex flex-col items-center justify-center gap-2 text-center", children: [jsxRuntime.jsx("h1", { className: "mobile:text-2xl text-4xl font-semibold", children: "Service Unavailable" }), jsxRuntime.jsx("p", { className: "text-center", children: "The server is temporarily busy. Try again later." })] }), jsxRuntime.jsxs("button", { className: "mx-auto inline-flex h-10 items-center justify-center gap-2 rounded bg-[#3C67FF] px-6 text-white active:translate-y-1", onClick: () => {
12
+ setLoading(true);
13
+ window.location.reload();
14
+ }, children: [jsxRuntime.jsx("svg", { className: core.cls('w-5', {
15
+ 'animate-spin': loading,
16
+ }), viewBox: "0 0 20 20", fill: "none", xmlns: "http://www.w3.org/2000/svg", children: jsxRuntime.jsx("path", { d: "M12.3408 3.03528C10.6845 2.42235 8.86506 2.41356 7.20294 3.01045C5.54082 3.60734 4.14265 4.77163 3.25471 6.29822C2.36677 7.82482 2.04603 9.61579 2.34898 11.3557C2.65193 13.0955 3.55915 14.6727 4.91081 15.8093C6.26248 16.9459 7.97189 17.5691 9.73794 17.5691C10.0831 17.5691 10.3629 17.2893 10.3629 16.9441C10.3629 16.5989 10.0831 16.3191 9.73792 16.3191C8.26621 16.3191 6.8417 15.7998 5.71531 14.8526C4.58892 13.9054 3.83291 12.5911 3.58045 11.1412C3.32799 9.69134 3.59528 8.19886 4.33523 6.9267C5.07518 5.65454 6.24032 4.6843 7.62542 4.18689C9.01052 3.68948 10.5267 3.69681 11.9069 4.20758C13.2872 4.71835 14.4429 5.69981 15.1705 6.97906C15.8981 8.25832 16.151 9.75331 15.8845 11.2007C15.677 12.3276 15.1651 13.3694 14.4127 14.2174L14.4127 11.7856C14.4127 11.4405 14.1329 11.1606 13.7877 11.1606C13.4425 11.1606 13.1627 11.4405 13.1627 11.7856L13.1627 15.4106C13.1627 15.5764 13.2285 15.7354 13.3457 15.8526C13.4629 15.9698 13.6219 16.0356 13.7877 16.0356H17.2845C17.6297 16.0356 17.9095 15.7558 17.9095 15.4106C17.9095 15.0655 17.6297 14.7856 17.2845 14.7856H15.5691C16.3513 13.8186 16.8858 12.6657 17.1139 11.427C17.4336 9.69015 17.1302 7.89616 16.257 6.36106C15.3839 4.82595 13.9971 3.64821 12.3408 3.03528Z", fill: "currentColor" }) }), "Refresh"] })] })] })] }));
17
+ };
18
+
19
+ exports.Page500 = Page500;
@@ -0,0 +1,26 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var core = require('@gem-sdk/core');
5
+ var nextSeo = require('next-seo');
6
+ var Head = require('next/head');
7
+ var react = require('react');
8
+ var Toolbox = require('../components/builder/Toolbox.js');
9
+
10
+ const BuilderPage = ({ components, seo, themeStyle, fontStyle, sectionData, }) => {
11
+ const [loadSuccess, setLoadSuccess] = react.useState(false);
12
+ const initState = {
13
+ ROOT: {
14
+ uid: 'ROOT',
15
+ tag: 'Root',
16
+ label: 'Root',
17
+ childrens: [],
18
+ },
19
+ };
20
+ react.useEffect(() => {
21
+ setLoadSuccess(true);
22
+ }, []);
23
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(nextSeo.NextSeo, { ...seo }), jsxRuntime.jsxs(Head, { children: [themeStyle && (jsxRuntime.jsx("style", { type: "text/css", id: "global-style", dangerouslySetInnerHTML: { __html: themeStyle } })), fontStyle && (jsxRuntime.jsx("style", { "data-id": "google-fonts", type: "text/css", dangerouslySetInnerHTML: { __html: fontStyle } }))] }), jsxRuntime.jsx(core.BuilderComponentProvider, { components: components, children: jsxRuntime.jsx(core.SectionProvider, { data: sectionData, children: jsxRuntime.jsxs(core.BuilderPreviewProvider, { state: initState, children: [jsxRuntime.jsx(Toolbox.default, {}), loadSuccess && (jsxRuntime.jsxs("div", { className: "builder", children: [jsxRuntime.jsx("div", { id: "storefront", children: jsxRuntime.jsx(core.RenderPreview, { uid: "ROOT" }) }), jsxRuntime.jsx("div", { id: "visual-content" })] }))] }, "preview") }) })] }));
24
+ };
25
+
26
+ exports.BuilderPage = BuilderPage;
@@ -0,0 +1,21 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+ var core = require('@gem-sdk/core');
7
+ var nextSeo = require('next-seo');
8
+ var dynamic = require('next/dynamic');
9
+ var Head = require('next/head');
10
+ var router = require('next/router');
11
+
12
+ const CollectionProvider = dynamic(() => import('@gem-sdk/core').then((m) => m.CollectionProvider));
13
+ const CollectionDetailPage = ({ seo, components, builderData, sectionData, themeStyle, collection, fontStyle, }) => {
14
+ const router$1 = router.useRouter();
15
+ if (router$1.isFallback) {
16
+ return jsxRuntime.jsx("div", { children: "Loading..." });
17
+ }
18
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(nextSeo.NextSeo, { ...seo }), jsxRuntime.jsxs(Head, { children: [themeStyle && (jsxRuntime.jsx("style", { "data-id": "global-style", type: "text/css", dangerouslySetInnerHTML: { __html: themeStyle } })), fontStyle && (jsxRuntime.jsx("style", { "data-id": "google-fonts", type: "text/css", dangerouslySetInnerHTML: { __html: fontStyle } }))] }), jsxRuntime.jsx(core.BuilderComponentProvider, { components: components, children: jsxRuntime.jsx(core.SectionProvider, { data: sectionData, children: jsxRuntime.jsx(CollectionProvider, { collection: collection, children: builderData && (jsxRuntime.jsx(core.BuilderProvider, { state: builderData, children: jsxRuntime.jsx(core.Render, { uid: "ROOT" }) })) }) }) })] }));
19
+ };
20
+
21
+ exports.default = CollectionDetailPage;
@@ -0,0 +1,20 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var dynamic = require('next/dynamic');
5
+
6
+ const StaticPage = dynamic(() => Promise.resolve().then(function () { return require('./static.js'); }));
7
+ const ProductPage = dynamic(() => Promise.resolve().then(function () { return require('./product-detail.js'); }));
8
+ const CollectionPage = dynamic(() => Promise.resolve().then(function () { return require('./collection-detail.js'); }));
9
+ const PreviewPage = ({ pageType, ...props }) => {
10
+ switch (pageType) {
11
+ case 'PRODUCT':
12
+ return jsxRuntime.jsx(ProductPage, { ...props });
13
+ case 'COLLECTION':
14
+ return jsxRuntime.jsx(CollectionPage, { ...props });
15
+ default:
16
+ return jsxRuntime.jsx(StaticPage, { ...props });
17
+ }
18
+ };
19
+
20
+ exports.PreviewPage = PreviewPage;
@@ -0,0 +1,21 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+ var core = require('@gem-sdk/core');
7
+ var nextSeo = require('next-seo');
8
+ var dynamic = require('next/dynamic');
9
+ var Head = require('next/head');
10
+ var router = require('next/router');
11
+
12
+ const ProductProvider = dynamic(() => import('@gem-sdk/core').then((m) => m.ProductProvider));
13
+ const ProductDetailPage = ({ themeStyle, fontStyle, seo, product, components, builderData, sectionData, }) => {
14
+ const router$1 = router.useRouter();
15
+ if (router$1.isFallback) {
16
+ return jsxRuntime.jsx("div", { children: "Loading..." });
17
+ }
18
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(nextSeo.NextSeo, { ...seo }), jsxRuntime.jsxs(Head, { children: [themeStyle && (jsxRuntime.jsx("style", { "data-id": "global-style", type: "text/css", dangerouslySetInnerHTML: { __html: themeStyle } })), fontStyle && (jsxRuntime.jsx("style", { "data-id": "google-fonts", type: "text/css", dangerouslySetInnerHTML: { __html: fontStyle } }))] }), jsxRuntime.jsx(core.BuilderComponentProvider, { components: components, children: jsxRuntime.jsx(core.SectionProvider, { data: sectionData, children: jsxRuntime.jsxs(ProductProvider, { product: product, children: [builderData && (jsxRuntime.jsx(core.BuilderProvider, { state: builderData, children: jsxRuntime.jsx(core.Render, { uid: "ROOT" }) })), jsxRuntime.jsx(core.AddOn, { name: "sticky-add-to-cart" })] }) }) })] }));
19
+ };
20
+
21
+ exports.default = ProductDetailPage;
@@ -0,0 +1,17 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var core = require('@gem-sdk/core');
5
+ var nextSeo = require('next-seo');
6
+ var Head = require('next/head');
7
+ var router = require('next/router');
8
+
9
+ const StaticPageV2 = ({ components, builderData, sectionData, seo, themeStyle, fontStyle, }) => {
10
+ const router$1 = router.useRouter();
11
+ if (router$1.isFallback) {
12
+ return (jsxRuntime.jsx("div", { className: "flex h-full items-center justify-center", children: jsxRuntime.jsxs("div", { className: "flex gap-2", children: [jsxRuntime.jsx("span", { className: "aspect-square h-2 animate-[flashing_500ms_infinite_alternate] rounded-full bg-slate-800" }), jsxRuntime.jsx("span", { className: "aspect-square h-2 animate-[flashing_500ms_infinite_200ms_linear_alternate] rounded-full bg-slate-800" }), jsxRuntime.jsx("span", { className: "aspect-square h-2 animate-[flashing_500ms_infinite_500ms_alternate] rounded-full bg-slate-800" })] }) }));
13
+ }
14
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(nextSeo.NextSeo, { ...seo }), jsxRuntime.jsxs(Head, { children: [themeStyle && (jsxRuntime.jsx("style", { "data-id": "global-style", type: "text/css", dangerouslySetInnerHTML: { __html: themeStyle } })), fontStyle && (jsxRuntime.jsx("style", { "data-id": "google-fonts", type: "text/css", dangerouslySetInnerHTML: { __html: fontStyle } }))] }), jsxRuntime.jsx(core.BuilderComponentProvider, { components: components, children: jsxRuntime.jsx(core.SectionProvider, { data: sectionData, children: builderData?.map((builder) => (jsxRuntime.jsx(core.BuilderProvider, { state: builder.data, lazy: builder.lazy, priority: builder.priority, children: jsxRuntime.jsx(core.Render, { uid: builder.uid }) }, builder.uid))) }) })] }));
15
+ };
16
+
17
+ exports.StaticPageV2 = StaticPageV2;
@@ -0,0 +1,19 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+ var core = require('@gem-sdk/core');
7
+ var nextSeo = require('next-seo');
8
+ var Head = require('next/head');
9
+ var router = require('next/router');
10
+
11
+ const StaticPage = ({ components, builderData, sectionData, seo, themeStyle, fontStyle, }) => {
12
+ const router$1 = router.useRouter();
13
+ if (router$1.isFallback) {
14
+ return (jsxRuntime.jsx("div", { className: "flex h-full items-center justify-center", children: jsxRuntime.jsxs("div", { className: "flex gap-2", children: [jsxRuntime.jsx("span", { className: "aspect-square h-2 animate-[flashing_500ms_infinite_alternate] rounded-full bg-slate-800" }), jsxRuntime.jsx("span", { className: "aspect-square h-2 animate-[flashing_500ms_infinite_200ms_linear_alternate] rounded-full bg-slate-800" }), jsxRuntime.jsx("span", { className: "aspect-square h-2 animate-[flashing_500ms_infinite_500ms_alternate] rounded-full bg-slate-800" })] }) }));
15
+ }
16
+ return (jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [jsxRuntime.jsx(nextSeo.NextSeo, { ...seo }), jsxRuntime.jsxs(Head, { children: [themeStyle && (jsxRuntime.jsx("style", { "data-id": "global-style", type: "text/css", dangerouslySetInnerHTML: { __html: themeStyle } })), fontStyle && (jsxRuntime.jsx("style", { "data-id": "google-fonts", type: "text/css", dangerouslySetInnerHTML: { __html: fontStyle } }))] }), jsxRuntime.jsx(core.BuilderComponentProvider, { components: components, children: jsxRuntime.jsx(core.SectionProvider, { data: sectionData, children: jsxRuntime.jsx(jsxRuntime.Fragment, { children: builderData && (jsxRuntime.jsx(core.BuilderProvider, { state: builderData, children: jsxRuntime.jsx(core.Render, { uid: "ROOT" }) }, "body")) }) }) })] }));
17
+ };
18
+
19
+ exports.default = StaticPage;
@@ -0,0 +1,30 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { Component } from 'react';
3
+
4
+ const initialState = { hasError: false };
5
+ class ErrorBoundary extends Component {
6
+ state = initialState;
7
+ static getDerivedStateFromError(error) {
8
+ // Update state so the next render will show the fallback UI
9
+ return { hasError: true, error };
10
+ }
11
+ reset = () => {
12
+ this.setState(initialState);
13
+ };
14
+ componentDidCatch(error, errorInfo) {
15
+ // You can use your own error logging service here
16
+ this.props.onError?.(error, errorInfo);
17
+ }
18
+ render() {
19
+ const { FallbackComponent } = this.props;
20
+ // Check if the error is thrown
21
+ if (this.state.hasError) {
22
+ // You can render any custom fallback UI
23
+ return jsx(FallbackComponent, { error: this.state.error, resetErrorBoundary: this.reset });
24
+ }
25
+ // Return children components in case of no error
26
+ return this.props.children;
27
+ }
28
+ }
29
+
30
+ export { ErrorBoundary };
@@ -0,0 +1,7 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+
3
+ const ErrorFallback = ({ error, resetErrorBoundary }) => {
4
+ return (jsxs("div", { role: "alert", className: "flex flex-col items-center gap-2", children: [jsx("p", { className: "text-center text-2xl", children: "Oops! Something went wrong" }), jsx("pre", { children: error?.message }), jsx("button", { onClick: resetErrorBoundary, className: "inline-flex h-10 items-center justify-center gap-2 rounded bg-[#3C67FF] px-6 text-white active:translate-y-1", children: "Try again" })] }));
5
+ };
6
+
7
+ export { ErrorFallback };