@gem-sdk/pages 2.0.0-dev.884 → 2.0.0-staging.118
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/cjs/components/ErrorBoundary.js +41 -1
- package/dist/cjs/components/ErrorFallback.js +27 -1
- package/dist/cjs/components/FacebookPixel.js +34 -3
- package/dist/cjs/components/FooterForPostPurchase.js +35 -1
- package/dist/cjs/components/GoogleAnalytic.js +66 -5
- package/dist/cjs/components/TikTokPixel.js +20 -3
- package/dist/cjs/components/builder/Body.js +37 -0
- package/dist/cjs/components/builder/Footer.js +155 -0
- package/dist/cjs/components/builder/Header.js +188 -0
- package/dist/cjs/components/builder/PopupManager.js +64 -1
- package/dist/cjs/components/builder/SwitchView.js +185 -0
- package/dist/cjs/components/builder/Toolbar.js +701 -1
- package/dist/cjs/components/builder/Toolbox.js +485 -1
- package/dist/cjs/components/builder/const.js +56 -0
- package/dist/cjs/components/builder/toolbar/const.js +7 -0
- package/dist/cjs/components/builder/toolbar/utils/findDOMClosest.js +41 -0
- package/dist/cjs/components/builder/toolbar/utils/findOverflowParent.js +20 -0
- package/dist/cjs/components/builder/toolbar/utils/getChildrenByAttrSelector.js +18 -0
- package/dist/cjs/components/builder/toolbar/utils/getDOMElementParents.js +32 -0
- package/dist/cjs/components/builder/toolbar/utils/isOverParent.js +16 -0
- package/dist/cjs/components/builder/toolbar/utils/isOverToolbarPosition.js +12 -0
- package/dist/cjs/components/builder/toolbar/utils/isSection.js +8 -0
- package/dist/cjs/components/builder/toolbar/utils/notVisible.js +8 -0
- package/dist/cjs/components/builder/toolbar/utils/waitForElementToExist.js +27 -0
- package/dist/cjs/components/image-to-layout/AddSectionImageToLayout.js +151 -1
- package/dist/cjs/components/image-to-layout/DropElement.js +167 -1
- package/dist/cjs/components/image-to-layout/ImageToLayout.js +42 -1
- package/dist/cjs/index.js +80 -1
- package/dist/cjs/layouts/main.js +31 -1
- package/dist/cjs/libs/api/get-builder-props.js +46 -1
- package/dist/cjs/libs/api/get-collection-props.js +68 -1
- package/dist/cjs/libs/api/get-home-page-props-v2.js +145 -1
- package/dist/cjs/libs/api/get-home-page-props.js +151 -1
- package/dist/cjs/libs/api/get-post-purchase-props-preview.js +268 -1
- package/dist/cjs/libs/api/get-preview-props.js +18 -1
- package/dist/cjs/libs/api/get-product-props.js +73 -1
- package/dist/cjs/libs/api/get-static-page-props-preview.js +155 -1
- package/dist/cjs/libs/api/get-static-page-props-v2.js +164 -1
- package/dist/cjs/libs/api/get-static-page-props.js +148 -1
- package/dist/cjs/libs/custom-fonts.js +60 -6
- package/dist/cjs/libs/fetcher.js +100 -1
- package/dist/cjs/libs/get-layout.js +13 -1
- package/dist/cjs/libs/get-storefront-api.js +12 -1
- package/dist/cjs/libs/getStaticPaths.js +10 -1
- package/dist/cjs/libs/google-fonts.js +118 -1
- package/dist/cjs/libs/helpers/check-option-font.js +65 -0
- package/dist/cjs/libs/helpers/common.js +27 -1
- package/dist/cjs/libs/helpers/gen-css.js +135 -1
- package/dist/cjs/libs/helpers/gen-fonts.js +90 -1
- package/dist/cjs/libs/helpers/generate-manifres.js +5 -1
- package/dist/cjs/libs/helpers/get-fallback.js +34 -1
- package/dist/cjs/libs/helpers/normalize.js +111 -1
- package/dist/cjs/libs/helpers/parse-json.js +16 -1
- package/dist/cjs/libs/helpers/user-agent.js +7 -1
- package/dist/cjs/libs/hooks/use-tracking-view.js +43 -1
- package/dist/cjs/libs/hooks/usePagePreview.js +92 -1
- package/dist/cjs/libs/parse-html.js +34 -1
- package/dist/cjs/libs/shopify-cdn-with-google-fonts.js +1845 -1
- package/dist/cjs/pages/404.js +43 -1
- package/dist/cjs/pages/500.js +74 -1
- package/dist/cjs/pages/CollectionGlobalProvider.js +59 -1
- package/dist/cjs/pages/builder.js +115 -1
- package/dist/cjs/pages/collection-detail.js +64 -1
- package/dist/cjs/pages/preview.js +26 -1
- package/dist/cjs/pages/product-detail.js +69 -1
- package/dist/cjs/pages/static-v2.js +139 -1
- package/dist/cjs/pages/static.js +75 -1
- package/dist/cjs/store/libs-store.js +14 -0
- package/dist/esm/components/ErrorBoundary.js +39 -1
- package/dist/esm/components/ErrorFallback.js +25 -1
- package/dist/esm/components/FacebookPixel.js +32 -3
- package/dist/esm/components/FooterForPostPurchase.js +31 -1
- package/dist/esm/components/GoogleAnalytic.js +64 -5
- package/dist/esm/components/TikTokPixel.js +18 -3
- package/dist/esm/components/builder/Body.js +33 -0
- package/dist/esm/components/builder/Footer.js +151 -0
- package/dist/esm/components/builder/Header.js +184 -0
- package/dist/esm/components/builder/PopupManager.js +60 -1
- package/dist/esm/components/builder/SwitchView.js +181 -0
- package/dist/esm/components/builder/Toolbar.js +697 -1
- package/dist/esm/components/builder/Toolbox.js +481 -1
- package/dist/esm/components/builder/const.js +54 -0
- package/dist/esm/components/builder/toolbar/const.js +4 -0
- package/dist/esm/components/builder/toolbar/utils/findDOMClosest.js +39 -0
- package/dist/esm/components/builder/toolbar/utils/findOverflowParent.js +18 -0
- package/dist/esm/components/builder/toolbar/utils/getChildrenByAttrSelector.js +16 -0
- package/dist/esm/components/builder/toolbar/utils/getDOMElementParents.js +30 -0
- package/dist/esm/components/builder/toolbar/utils/isOverParent.js +14 -0
- package/dist/esm/components/builder/toolbar/utils/isOverToolbarPosition.js +10 -0
- package/dist/esm/components/builder/toolbar/utils/isSection.js +6 -0
- package/dist/esm/components/builder/toolbar/utils/notVisible.js +6 -0
- package/dist/esm/components/builder/toolbar/utils/waitForElementToExist.js +25 -0
- package/dist/esm/components/image-to-layout/AddSectionImageToLayout.js +147 -1
- package/dist/esm/components/image-to-layout/DropElement.js +165 -1
- package/dist/esm/components/image-to-layout/ImageToLayout.js +38 -1
- package/dist/esm/index.js +35 -1
- package/dist/esm/layouts/main.js +27 -1
- package/dist/esm/libs/api/get-builder-props.js +44 -1
- package/dist/esm/libs/api/get-collection-props.js +66 -1
- package/dist/esm/libs/api/get-home-page-props-v2.js +143 -1
- package/dist/esm/libs/api/get-home-page-props.js +149 -1
- package/dist/esm/libs/api/get-post-purchase-props-preview.js +260 -1
- package/dist/esm/libs/api/get-preview-props.js +16 -1
- package/dist/esm/libs/api/get-product-props.js +71 -1
- package/dist/esm/libs/api/get-static-page-props-preview.js +153 -1
- package/dist/esm/libs/api/get-static-page-props-v2.js +162 -1
- package/dist/esm/libs/api/get-static-page-props.js +146 -1
- package/dist/esm/libs/custom-fonts.js +55 -6
- package/dist/esm/libs/fetcher.js +96 -1
- package/dist/esm/libs/get-layout.js +11 -1
- package/dist/esm/libs/get-storefront-api.js +10 -1
- package/dist/esm/libs/getStaticPaths.js +8 -1
- package/dist/esm/libs/google-fonts.js +112 -1
- package/dist/esm/libs/helpers/check-option-font.js +63 -0
- package/dist/esm/libs/helpers/common.js +24 -1
- package/dist/esm/libs/helpers/gen-css.js +133 -1
- package/dist/esm/libs/helpers/gen-fonts.js +87 -1
- package/dist/esm/libs/helpers/generate-manifres.js +3 -1
- package/dist/esm/libs/helpers/get-fallback.js +32 -1
- package/dist/esm/libs/helpers/normalize.js +103 -1
- package/dist/esm/libs/helpers/parse-json.js +13 -1
- package/dist/esm/libs/helpers/user-agent.js +5 -1
- package/dist/esm/libs/hooks/use-tracking-view.js +41 -1
- package/dist/esm/libs/hooks/usePagePreview.js +90 -1
- package/dist/esm/libs/parse-html.js +32 -1
- package/dist/esm/libs/shopify-cdn-with-google-fonts.js +1843 -1
- package/dist/esm/pages/404.js +41 -1
- package/dist/esm/pages/500.js +72 -1
- package/dist/esm/pages/CollectionGlobalProvider.js +55 -1
- package/dist/esm/pages/builder.js +113 -1
- package/dist/esm/pages/collection-detail.js +60 -1
- package/dist/esm/pages/preview.js +24 -1
- package/dist/esm/pages/product-detail.js +65 -1
- package/dist/esm/pages/static-v2.js +137 -1
- package/dist/esm/pages/static.js +71 -1
- package/dist/esm/store/libs-store.js +12 -0
- package/dist/types/index.d.ts +50 -34
- package/package.json +8 -5
- package/dist/cjs/components/Footer.js +0 -1
- package/dist/cjs/components/Header.js +0 -1
- package/dist/cjs/components/builder/toolbar/Onboarding.js +0 -1
- package/dist/esm/components/Footer.js +0 -1
- package/dist/esm/components/Header.js +0 -1
- package/dist/esm/components/builder/toolbar/Onboarding.js +0 -1
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const listFontsNotInBunny = [
|
|
4
|
+
'Anton SC',
|
|
5
|
+
'Arsenal SC',
|
|
6
|
+
'Baskervville SC',
|
|
7
|
+
'Beiruti',
|
|
8
|
+
'Bodoni Moda SC',
|
|
9
|
+
'Bona Nova SC',
|
|
10
|
+
'Bungee Tint',
|
|
11
|
+
'Edu AU VIC WA NT Hand',
|
|
12
|
+
'Fustat',
|
|
13
|
+
'Ga Maamli',
|
|
14
|
+
'Kalnia Glaze',
|
|
15
|
+
'Maname',
|
|
16
|
+
'Matemasie',
|
|
17
|
+
'Material Icons',
|
|
18
|
+
'Material Icons Outlined',
|
|
19
|
+
'Material Icons Round',
|
|
20
|
+
'Material Icons Sharp',
|
|
21
|
+
'Material Icons Two Tone',
|
|
22
|
+
'Material Symbols Outlined',
|
|
23
|
+
'Material Symbols Rounded',
|
|
24
|
+
'Material Symbols Sharp',
|
|
25
|
+
'Moderustic',
|
|
26
|
+
'New Amsterdam',
|
|
27
|
+
'Playwrite AR',
|
|
28
|
+
'Playwrite AT',
|
|
29
|
+
'Playwrite BE VLG',
|
|
30
|
+
'Playwrite BE WAL',
|
|
31
|
+
'Playwrite CL',
|
|
32
|
+
'Playwrite CU',
|
|
33
|
+
'Playwrite CZ',
|
|
34
|
+
'Playwrite DK Loopet',
|
|
35
|
+
'Playwrite DK Uloopet',
|
|
36
|
+
'Playwrite HR',
|
|
37
|
+
'Playwrite HR Lijeva',
|
|
38
|
+
'Playwrite HU',
|
|
39
|
+
'Playwrite PE',
|
|
40
|
+
'SUSE',
|
|
41
|
+
'Sankofa Display',
|
|
42
|
+
'Wittgenstein',
|
|
43
|
+
'Zain'
|
|
44
|
+
];
|
|
45
|
+
const listFontsNotInGoogle = [
|
|
46
|
+
'Arima Madurai',
|
|
47
|
+
'Coda Caption',
|
|
48
|
+
'Fredoka One',
|
|
49
|
+
'Gentium Book Basic',
|
|
50
|
+
'Kantumruy',
|
|
51
|
+
'Merienda One',
|
|
52
|
+
'Source Sans Pro',
|
|
53
|
+
'Source Serif Pro',
|
|
54
|
+
'Briem Hand',
|
|
55
|
+
'Pushster'
|
|
56
|
+
];
|
|
57
|
+
const objectFont = {
|
|
58
|
+
bunny: listFontsNotInBunny,
|
|
59
|
+
google: listFontsNotInGoogle
|
|
60
|
+
};
|
|
61
|
+
const checkNotInOptionFont = (currentfont, type)=>{
|
|
62
|
+
return objectFont?.[type]?.includes(currentfont);
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
exports.checkNotInOptionFont = checkNotInOptionFont;
|
|
@@ -1 +1,27 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
async function wait(ms) {
|
|
4
|
+
return new Promise((resolve)=>setTimeout(resolve, ms));
|
|
5
|
+
}
|
|
6
|
+
const retryWithDelay = async (fn, config)=>{
|
|
7
|
+
const retries = config?.retries ?? 3;
|
|
8
|
+
const delay = config?.delay ?? 1000;
|
|
9
|
+
try {
|
|
10
|
+
return await fn();
|
|
11
|
+
} catch (err) {
|
|
12
|
+
if (retries <= 0 || config?.retryIf && !config.retryIf(err)) {
|
|
13
|
+
return Promise.reject(err);
|
|
14
|
+
}
|
|
15
|
+
//delay the next call
|
|
16
|
+
await wait(delay);
|
|
17
|
+
//recursively call the same func
|
|
18
|
+
return retryWithDelay(fn, {
|
|
19
|
+
...config,
|
|
20
|
+
retries: retries - 1,
|
|
21
|
+
delay
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
exports.retryWithDelay = retryWithDelay;
|
|
27
|
+
exports.wait = wait;
|
|
@@ -1 +1,135 @@
|
|
|
1
|
-
|
|
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 devicesOrder = [
|
|
11
|
+
'desktop',
|
|
12
|
+
'tablet',
|
|
13
|
+
'mobile'
|
|
14
|
+
];
|
|
15
|
+
const flattenObject = (obj, prefix)=>{
|
|
16
|
+
return Object.keys(obj).reduce((acc, k)=>{
|
|
17
|
+
const pre = prefix ? `${prefix}-` : '';
|
|
18
|
+
if (typeof obj[k] === 'object' && obj[k] !== null && Object.keys(obj[k]).length > 0) Object.assign(acc, flattenObject(obj[k], pre + k));
|
|
19
|
+
else acc[pre + k] = obj[k];
|
|
20
|
+
return acc;
|
|
21
|
+
}, {});
|
|
22
|
+
};
|
|
23
|
+
const mapObject = (obj)=>{
|
|
24
|
+
return Object.entries(obj ?? {}).reduce((acc, [k, v])=>{
|
|
25
|
+
return {
|
|
26
|
+
...acc,
|
|
27
|
+
[core.getShortName(k)]: typeof v === 'object' ? mapObject(v) : v
|
|
28
|
+
};
|
|
29
|
+
}, {});
|
|
30
|
+
};
|
|
31
|
+
const getValueByDevice = (data, device)=>{
|
|
32
|
+
const deviceData = {
|
|
33
|
+
typography: Object.fromEntries(Object.entries(data?.typography ?? {}).map(([key, value])=>{
|
|
34
|
+
const typo = {
|
|
35
|
+
...value?.[device]
|
|
36
|
+
};
|
|
37
|
+
if (!typo) return [
|
|
38
|
+
key,
|
|
39
|
+
undefined
|
|
40
|
+
];
|
|
41
|
+
if (typo.fontFamily) {
|
|
42
|
+
typo.fontFamily = `var(--g-font-${typo.fontFamily}, ${typo.fontFamily})`;
|
|
43
|
+
}
|
|
44
|
+
return [
|
|
45
|
+
key,
|
|
46
|
+
typo
|
|
47
|
+
];
|
|
48
|
+
})),
|
|
49
|
+
spacing: Object.fromEntries(Object.entries(data?.spacing ?? {}).map(([key, value])=>{
|
|
50
|
+
return [
|
|
51
|
+
key,
|
|
52
|
+
value?.[device]
|
|
53
|
+
];
|
|
54
|
+
})),
|
|
55
|
+
container: Object.fromEntries(Object.entries(data?.container ?? {}).map(([key, value])=>{
|
|
56
|
+
return [
|
|
57
|
+
key,
|
|
58
|
+
value?.[device]
|
|
59
|
+
];
|
|
60
|
+
})),
|
|
61
|
+
font: Object.fromEntries(Object.entries(data?.font ?? {}).map(([key, value])=>{
|
|
62
|
+
return [
|
|
63
|
+
key,
|
|
64
|
+
value?.family
|
|
65
|
+
];
|
|
66
|
+
})),
|
|
67
|
+
theme: {
|
|
68
|
+
font: Object.fromEntries(Object.entries(data?.theme?.font ?? {}).map(([key, value])=>{
|
|
69
|
+
return [
|
|
70
|
+
key,
|
|
71
|
+
value?.family
|
|
72
|
+
];
|
|
73
|
+
}))
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
return deviceData;
|
|
77
|
+
};
|
|
78
|
+
const quoteFontName = (font)=>{
|
|
79
|
+
if ([
|
|
80
|
+
'sans-serif'
|
|
81
|
+
].includes(font)) {
|
|
82
|
+
return font;
|
|
83
|
+
}
|
|
84
|
+
return `'${font}'`;
|
|
85
|
+
};
|
|
86
|
+
const genCSSVariable = (deviceData)=>{
|
|
87
|
+
return Object.entries(mapObject(flattenObject(deviceData))).map(([key, value])=>{
|
|
88
|
+
if (value === undefined) return undefined;
|
|
89
|
+
if ([
|
|
90
|
+
'font-heading',
|
|
91
|
+
'font-body',
|
|
92
|
+
'theme-font-heading',
|
|
93
|
+
'theme-font-body'
|
|
94
|
+
].includes(key)) {
|
|
95
|
+
return `--g-${key}: ${quoteFontName(value)}`;
|
|
96
|
+
}
|
|
97
|
+
return `--g-${key}:${value}`;
|
|
98
|
+
}).filter((v)=>v !== undefined).join(';');
|
|
99
|
+
};
|
|
100
|
+
const genCSS = (input, mobileOnly)=>{
|
|
101
|
+
if (!input) return '';
|
|
102
|
+
let data = {};
|
|
103
|
+
try {
|
|
104
|
+
if (typeof input === 'string') {
|
|
105
|
+
data = JSON.parse(input);
|
|
106
|
+
} else {
|
|
107
|
+
data = input;
|
|
108
|
+
}
|
|
109
|
+
if (mobileOnly) {
|
|
110
|
+
const desktop = getValueByDevice(data, 'desktop');
|
|
111
|
+
const mobile = getValueByDevice(data, 'mobile');
|
|
112
|
+
const deviceData = merge(desktop, mobile);
|
|
113
|
+
deviceData.color = data.color;
|
|
114
|
+
deviceData.radius = data.radius;
|
|
115
|
+
const cssData = genCSSVariable(deviceData);
|
|
116
|
+
return `:root{${cssData}}`;
|
|
117
|
+
}
|
|
118
|
+
return devicesOrder.map((device)=>{
|
|
119
|
+
const deviceData = getValueByDevice(data, device);
|
|
120
|
+
if (device === 'desktop') {
|
|
121
|
+
deviceData.color = data.color;
|
|
122
|
+
deviceData.radius = data.radius;
|
|
123
|
+
}
|
|
124
|
+
const cssData = genCSSVariable(deviceData);
|
|
125
|
+
if (device === 'desktop') {
|
|
126
|
+
return `:root{${cssData}}`;
|
|
127
|
+
}
|
|
128
|
+
return `@media (max-width: ${baseDevices[device]}) {:root{${cssData}}}`;
|
|
129
|
+
}).join('\n');
|
|
130
|
+
} catch {
|
|
131
|
+
return '';
|
|
132
|
+
}
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
exports.genCSS = genCSS;
|
|
@@ -1 +1,90 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const getFontsFromDataBuilder = (dataBuilder)=>{
|
|
4
|
+
const fonts = [];
|
|
5
|
+
for(const uid in dataBuilder){
|
|
6
|
+
if (Object.prototype.hasOwnProperty.call(dataBuilder, uid)) {
|
|
7
|
+
const data = dataBuilder[uid];
|
|
8
|
+
const styles = data.styles;
|
|
9
|
+
const settings = data.settings;
|
|
10
|
+
getFontFromGroupSetting(fonts, styles);
|
|
11
|
+
getFontFromGroupSetting(fonts, settings);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
return fonts;
|
|
15
|
+
};
|
|
16
|
+
const getFontFromGroupSetting = (fonts, groupSetting)=>{
|
|
17
|
+
const states = [
|
|
18
|
+
'normal',
|
|
19
|
+
'hover',
|
|
20
|
+
'focus',
|
|
21
|
+
'active',
|
|
22
|
+
'disabled',
|
|
23
|
+
'price',
|
|
24
|
+
'compareAtPrice'
|
|
25
|
+
];
|
|
26
|
+
for(const attr in groupSetting){
|
|
27
|
+
if (Object.prototype.hasOwnProperty.call(groupSetting, attr)) {
|
|
28
|
+
const value = groupSetting[attr];
|
|
29
|
+
if (!value) continue;
|
|
30
|
+
getFontValue(fonts, value);
|
|
31
|
+
for (const state of states){
|
|
32
|
+
if (!value[state]) continue;
|
|
33
|
+
getFontValue(fonts, value[state]);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
const getFontValue = (fonts, value)=>{
|
|
39
|
+
let customFontFamily = value.custom?.fontFamily;
|
|
40
|
+
if (typeof customFontFamily === 'string') {
|
|
41
|
+
customFontFamily = {
|
|
42
|
+
value: value.custom?.fontFamily || '',
|
|
43
|
+
type: 'google'
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
const fontFamily = customFontFamily?.value;
|
|
47
|
+
let customFontVariants = value.custom?.fontVariants;
|
|
48
|
+
if (!customFontVariants?.length) {
|
|
49
|
+
customFontVariants = [
|
|
50
|
+
value.custom?.fontWeight
|
|
51
|
+
];
|
|
52
|
+
}
|
|
53
|
+
if (customFontFamily && customFontVariants?.length) {
|
|
54
|
+
const variants = customFontVariants.map((item)=>{
|
|
55
|
+
switch(item){
|
|
56
|
+
case 'regular':
|
|
57
|
+
return '400';
|
|
58
|
+
}
|
|
59
|
+
return item;
|
|
60
|
+
});
|
|
61
|
+
const customFontWeight = value.custom?.fontWeight && variants.includes(value.custom?.fontWeight) ? value.custom?.fontWeight : variants[0];
|
|
62
|
+
if (customFontWeight) {
|
|
63
|
+
const isExist = fonts.find((item)=>item.family == fontFamily && item.variants.includes(customFontWeight));
|
|
64
|
+
if (!isExist) {
|
|
65
|
+
const isFontFamily = fonts.find((item)=>item.family == fontFamily);
|
|
66
|
+
if (isFontFamily) {
|
|
67
|
+
isFontFamily.variants.push(customFontWeight);
|
|
68
|
+
} else {
|
|
69
|
+
const fontVariants = [
|
|
70
|
+
customFontWeight
|
|
71
|
+
];
|
|
72
|
+
if (customFontWeight !== '700') {
|
|
73
|
+
if (variants.includes('700')) {
|
|
74
|
+
fontVariants.push('700'); // Auto add 700 for bold in editor inline
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
fonts.push({
|
|
78
|
+
family: fontFamily || '',
|
|
79
|
+
variants: fontVariants,
|
|
80
|
+
subsets: [],
|
|
81
|
+
type: customFontFamily.type
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
exports.getFontFromGroupSetting = getFontFromGroupSetting;
|
|
90
|
+
exports.getFontsFromDataBuilder = getFontsFromDataBuilder;
|
|
@@ -1 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const generateManifest = (data)=>`data:application/manifest+json,${encodeURIComponent(JSON.stringify(data))}`;
|
|
4
|
+
|
|
5
|
+
exports.generateManifest = generateManifest;
|
|
@@ -1 +1,34 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var core = require('@gem-sdk/core');
|
|
4
|
+
|
|
5
|
+
const getFallbackV2 = async (fetcher, data, isStorefront = true)=>{
|
|
6
|
+
const isSample = isStorefront ? !process.env.NEXT_PUBLIC_STOREFRONT_TOKEN : false;
|
|
7
|
+
const queries = data.map((v)=>core.prefetchQueries(v.data, {
|
|
8
|
+
isSample,
|
|
9
|
+
isStorefront
|
|
10
|
+
})).flat();
|
|
11
|
+
const datas = await Promise.allSettled(queries.map(({ query, variables, func })=>{
|
|
12
|
+
if (func) {
|
|
13
|
+
return func(fetcher, variables);
|
|
14
|
+
}
|
|
15
|
+
if (query) return fetcher([
|
|
16
|
+
query,
|
|
17
|
+
variables
|
|
18
|
+
]);
|
|
19
|
+
return {};
|
|
20
|
+
}));
|
|
21
|
+
const fallback = queries.reduce((acc, { key }, index)=>{
|
|
22
|
+
const res = datas[index];
|
|
23
|
+
if (res?.status === 'fulfilled') {
|
|
24
|
+
return {
|
|
25
|
+
...acc,
|
|
26
|
+
[key]: res.value
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
return acc;
|
|
30
|
+
}, {});
|
|
31
|
+
return fallback;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
exports.getFallbackV2 = getFallbackV2;
|
|
@@ -1 +1,111 @@
|
|
|
1
|
-
|
|
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
|
+
} else {
|
|
11
|
+
const items = childrens?.map((child)=>child?.uid) ?? [];
|
|
12
|
+
currData[rest.uid] = {
|
|
13
|
+
...rest,
|
|
14
|
+
childrens: items
|
|
15
|
+
};
|
|
16
|
+
if (childrens) {
|
|
17
|
+
childrens.map((child)=>compose(child, currData));
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
compose(data, result);
|
|
23
|
+
return {
|
|
24
|
+
...result
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
const orderSection = (sections, orders)=>{
|
|
28
|
+
// Filter out sections that are not in the order list
|
|
29
|
+
const ids = orders?.filter((id)=>sections?.some((v)=>v?.id === id));
|
|
30
|
+
// Return the ordered sections
|
|
31
|
+
const orderedSections = ids?.map((id)=>sections?.find((v)=>v?.id === id)) ?? [];
|
|
32
|
+
// Return the sections that are not in the order list
|
|
33
|
+
const sectionsNotInOrder = sections?.filter((v)=>(!v?.id || !ids?.includes(v.id)) && !v?.deletedAt) ?? [];
|
|
34
|
+
// Return the ordered sections + the sections that are not in the order list
|
|
35
|
+
return orderedSections.concat(sectionsNotInOrder);
|
|
36
|
+
};
|
|
37
|
+
function normalizePageSectionResponse(sections, orders) {
|
|
38
|
+
const sortedSections = orderSection(sections, orders);
|
|
39
|
+
const childrens = sortedSections.map((item)=>{
|
|
40
|
+
if (!item?.component) return false;
|
|
41
|
+
try {
|
|
42
|
+
const data = JSON.parse(item.component);
|
|
43
|
+
return data;
|
|
44
|
+
} catch {
|
|
45
|
+
return false;
|
|
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.map((item)=>{
|
|
57
|
+
if (!item?.component) return false;
|
|
58
|
+
try {
|
|
59
|
+
const data = JSON.parse(item.component);
|
|
60
|
+
return data;
|
|
61
|
+
} catch {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}).filter(Boolean);
|
|
65
|
+
return childrens.map((v)=>{
|
|
66
|
+
return {
|
|
67
|
+
uid: v.uid,
|
|
68
|
+
lazy: Boolean(v.settings?.lazy),
|
|
69
|
+
priority: Boolean(v.settings?.priority),
|
|
70
|
+
data: normalizeBuilderData(v)
|
|
71
|
+
};
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
const parseBuilderTemplateV2 = (data)=>{
|
|
75
|
+
return normalizePageSectionResponseV2([
|
|
76
|
+
...data?.pageSections ?? [],
|
|
77
|
+
...data?.themePageCustomSections ?? []
|
|
78
|
+
], data?.sectionPosition);
|
|
79
|
+
};
|
|
80
|
+
const parseBuilderTemplate = (data)=>{
|
|
81
|
+
return normalizePageSectionResponse([
|
|
82
|
+
...data?.pageSections ?? [],
|
|
83
|
+
...data?.themePageCustomSections ?? []
|
|
84
|
+
], data?.sectionPosition);
|
|
85
|
+
};
|
|
86
|
+
const extractPageBackground = (data)=>{
|
|
87
|
+
try {
|
|
88
|
+
const pageBackgroundStr = data?.metafields?.find((item)=>item?.key === 'page_background')?.value;
|
|
89
|
+
return JSON.parse(pageBackgroundStr ?? '{}');
|
|
90
|
+
} catch {
|
|
91
|
+
return {};
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
const parseBuilderLibraryTemplate = (data)=>{
|
|
95
|
+
return normalizePageSectionResponseV2([
|
|
96
|
+
...data?.sections ?? []
|
|
97
|
+
], data?.sectionPosition);
|
|
98
|
+
};
|
|
99
|
+
const parseShopLibraryPageTemplate = (data)=>{
|
|
100
|
+
return normalizePageSectionResponseV2([
|
|
101
|
+
...data?.shopLibrarySections ?? []
|
|
102
|
+
], data?.sectionPosition);
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
exports.extractPageBackground = extractPageBackground;
|
|
106
|
+
exports.normalizeBuilderData = normalizeBuilderData;
|
|
107
|
+
exports.normalizePageSectionResponseV2 = normalizePageSectionResponseV2;
|
|
108
|
+
exports.parseBuilderLibraryTemplate = parseBuilderLibraryTemplate;
|
|
109
|
+
exports.parseBuilderTemplate = parseBuilderTemplate;
|
|
110
|
+
exports.parseBuilderTemplateV2 = parseBuilderTemplateV2;
|
|
111
|
+
exports.parseShopLibraryPageTemplate = parseShopLibraryPageTemplate;
|
|
@@ -1 +1,16 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const parseJson = (json)=>{
|
|
4
|
+
if (!json) return null;
|
|
5
|
+
try {
|
|
6
|
+
return JSON.parse(json);
|
|
7
|
+
} catch (e) {
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
const serializableJson = (props)=>{
|
|
12
|
+
return JSON.parse(JSON.stringify(props));
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
exports.parseJson = parseJson;
|
|
16
|
+
exports.serializableJson = serializableJson;
|
|
@@ -1 +1,7 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
function isBot(input) {
|
|
4
|
+
return /Googlebot|Mediapartners-Google|AdsBot-Google|googleweblight|Storebot-Google|Google-PageRenderer|Chrome-Lighthouse|Bingbot|BingPreview|Slurp|DuckDuckBot|baiduspider|yandex|sogou|LinkedInBot|bitlybot|tumblr|vkShare|quora link preview|facebookexternalhit|facebookcatalog|Twitterbot|applebot|redditbot|Slackbot|Discordbot|WhatsApp|SkypeUriPreview|ia_archiver/i.test(input);
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
exports.isBot = isBot;
|
|
@@ -1 +1,43 @@
|
|
|
1
|
-
|
|
1
|
+
'use client';
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
var core = require('@gem-sdk/core');
|
|
5
|
+
var react = require('react');
|
|
6
|
+
|
|
7
|
+
const useTrackingView = (token, handle, isFallback)=>{
|
|
8
|
+
const shopToken = token || process.env.NEXT_PUBLIC_SHOP_TOKEN;
|
|
9
|
+
const apiURL = process.env.NEXT_PUBLIC_API_URL;
|
|
10
|
+
const sendTracking = react.useCallback((handle)=>{
|
|
11
|
+
if (!apiURL || !shopToken) return;
|
|
12
|
+
const variables = {
|
|
13
|
+
pageHandle: handle
|
|
14
|
+
};
|
|
15
|
+
const headers = {
|
|
16
|
+
'Content-Type': 'application/json',
|
|
17
|
+
'X-GemX-Shop-Token': shopToken
|
|
18
|
+
};
|
|
19
|
+
fetch(apiURL, {
|
|
20
|
+
method: 'POST',
|
|
21
|
+
headers,
|
|
22
|
+
body: JSON.stringify({
|
|
23
|
+
query: core.PageViewUpDocument,
|
|
24
|
+
variables
|
|
25
|
+
})
|
|
26
|
+
}).finally(()=>{
|
|
27
|
+
//
|
|
28
|
+
});
|
|
29
|
+
}, [
|
|
30
|
+
apiURL,
|
|
31
|
+
shopToken
|
|
32
|
+
]);
|
|
33
|
+
react.useEffect(()=>{
|
|
34
|
+
if (!handle || isFallback) return;
|
|
35
|
+
sendTracking(handle);
|
|
36
|
+
}, [
|
|
37
|
+
handle,
|
|
38
|
+
sendTracking,
|
|
39
|
+
isFallback
|
|
40
|
+
]);
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
exports.useTrackingView = useTrackingView;
|
|
@@ -1 +1,92 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var generateManifres = require('../helpers/generate-manifres.js');
|
|
4
|
+
var parseJson = require('../helpers/parse-json.js');
|
|
5
|
+
|
|
6
|
+
const usePagePreview = (dataBuilder, storeProperty, shopifyMeta)=>{
|
|
7
|
+
const mobileOnly = dataBuilder?.isMobile ?? false;
|
|
8
|
+
const shopMeta = shopifyMeta?.status === 'fulfilled' ? shopifyMeta.value : undefined;
|
|
9
|
+
const shopData = storeProperty.status === 'fulfilled' ? storeProperty.value : undefined;
|
|
10
|
+
const favicon = shopData?.storeProperty?.favicon ?? '/favicon/favicon-32x32.png';
|
|
11
|
+
const languageIsoCode = shopMeta?.localization.language.isoCode ?? null;
|
|
12
|
+
const countryIsoCode = shopMeta?.localization.country.isoCode ?? null;
|
|
13
|
+
const moneyFormat = shopMeta?.shop.moneyFormat ?? null;
|
|
14
|
+
const currency = shopMeta?.localization.country.currency.isoCode ?? null;
|
|
15
|
+
const swatches = parseJson.parseJson(shopData?.storeProperty?.swatchesConfig);
|
|
16
|
+
const locale = !languageIsoCode || !countryIsoCode ? null : `${languageIsoCode}-${countryIsoCode}`;
|
|
17
|
+
const seo = {
|
|
18
|
+
defaultTitle: shopMeta?.shop.name,
|
|
19
|
+
title: dataBuilder?.name,
|
|
20
|
+
openGraph: {
|
|
21
|
+
site_name: shopMeta?.shop.name,
|
|
22
|
+
locale: shopMeta?.localization.country.isoCode,
|
|
23
|
+
title: dataBuilder?.name ?? shopMeta?.shop.name
|
|
24
|
+
},
|
|
25
|
+
nofollow: true,
|
|
26
|
+
noindex: true,
|
|
27
|
+
canonical: `/preview/${dataBuilder?.id}`,
|
|
28
|
+
additionalMetaTags: [
|
|
29
|
+
{
|
|
30
|
+
name: 'theme-color',
|
|
31
|
+
content: '#000000'
|
|
32
|
+
}
|
|
33
|
+
],
|
|
34
|
+
additionalLinkTags: [
|
|
35
|
+
{
|
|
36
|
+
rel: 'icon',
|
|
37
|
+
sizes: '32x32',
|
|
38
|
+
href: `${favicon}-/crop/1:1/center/-/smart_resize/32x32/`
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
rel: 'icon',
|
|
42
|
+
sizes: '16x16',
|
|
43
|
+
href: `${favicon}-/crop/1:1/center/-/smart_resize/16x16/`
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
rel: 'apple-touch-icon',
|
|
47
|
+
sizes: '180x180',
|
|
48
|
+
href: `${favicon}-/crop/1:1/center/-/smart_resize/180x180/`
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
rel: 'manifest',
|
|
52
|
+
href: generateManifres.generateManifest({
|
|
53
|
+
theme_color: '#000000',
|
|
54
|
+
background_color: '#ffffff',
|
|
55
|
+
display: 'standalone',
|
|
56
|
+
scope: '/',
|
|
57
|
+
start_url: '/',
|
|
58
|
+
name: shopMeta?.shop.name,
|
|
59
|
+
short_name: shopMeta?.shop.name,
|
|
60
|
+
description: shopMeta?.shop.description,
|
|
61
|
+
icons: [
|
|
62
|
+
{
|
|
63
|
+
src: `${favicon}-/crop/1:1/center/-/smart_resize/192x192/`,
|
|
64
|
+
sizes: '192x192',
|
|
65
|
+
type: 'image/png',
|
|
66
|
+
purpose: 'any maskable'
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
src: `${favicon}-/crop/1:1/center/-/smart_resize/512x512/`,
|
|
70
|
+
sizes: '512x512',
|
|
71
|
+
type: 'image/png'
|
|
72
|
+
}
|
|
73
|
+
]
|
|
74
|
+
})
|
|
75
|
+
}
|
|
76
|
+
]
|
|
77
|
+
};
|
|
78
|
+
return {
|
|
79
|
+
seo,
|
|
80
|
+
pageConfig: {
|
|
81
|
+
mobileOnly,
|
|
82
|
+
locale,
|
|
83
|
+
languageIsoCode,
|
|
84
|
+
countryIsoCode,
|
|
85
|
+
moneyFormat,
|
|
86
|
+
currency,
|
|
87
|
+
swatches
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
exports.usePagePreview = usePagePreview;
|