@designcrowd/library.brand-page 5.16.35 → 5.16.36
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/lib/src/{CreatedOnBrandCrowd-de-de-86kFDsjd.js → CreatedOnBrandCrowd-de-de-DVJiCllu.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-en-us-BhFAL2r4.js → CreatedOnBrandCrowd-en-us-C0ySCxIL.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-es-es-spGcLYbG.js → CreatedOnBrandCrowd-es-es-Lx2TeOFQ.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-fr-fr-DKe-tShk.js → CreatedOnBrandCrowd-fr-ca-hnZGTPjT.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-fr-ca-DKe-tShk.js → CreatedOnBrandCrowd-fr-fr-hnZGTPjT.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-pt-pt-DcT0oRzX.js → CreatedOnBrandCrowd-pt-br-DS1LjpsM.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-pt-br-DcT0oRzX.js → CreatedOnBrandCrowd-pt-pt-DS1LjpsM.js} +1 -1
- package/lib/src/{CreatedOnDcom-de-de-BMuHkNH2.js → CreatedOnDcom-de-de-CEb2I9b_.js} +1 -1
- package/lib/src/{CreatedOnDcom-en-us-h174d2n3.js → CreatedOnDcom-en-us-BV3oETu_.js} +1 -1
- package/lib/src/{CreatedOnDcom-es-es-B6D1xSPS.js → CreatedOnDcom-es-es-D4Y8_uzV.js} +1 -1
- package/lib/src/{CreatedOnDcom-fr-ca-BE0ONxF_.js → CreatedOnDcom-fr-ca-D0zmS934.js} +1 -1
- package/lib/src/{CreatedOnDcom-fr-fr-6tXvojla.js → CreatedOnDcom-fr-fr-nPvCDeF3.js} +1 -1
- package/lib/src/{CreatedOnDcom-pt-br-DZYu7pp5.js → CreatedOnDcom-pt-br-LnkzeH5-.js} +1 -1
- package/lib/src/{CreatedOnDcom-pt-pt-DrGT23mO.js → CreatedOnDcom-pt-pt-BlRxxeSh.js} +1 -1
- package/lib/src/brand-page-maker/components/action-bar/ActionBar.mixin.d.ts +8 -10
- package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.d.ts +10 -10
- package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.js +0 -2
- package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.stories.js +47 -35
- package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMakerTemplateSettings.mixin.d.ts +1 -1
- package/lib/src/brand-page-maker/components/brand-page-maker/__fixtures__/brand-page-examples.d.ts +2 -0
- package/lib/src/brand-page-maker/components/brand-page-maker/__fixtures__/brand-page-examples.js +17 -18
- package/lib/src/brand-page-maker/components/brandpage-maker-page/BrandPageMakerPage.mixin.d.ts +4 -1
- package/lib/src/brand-page-maker/components/brandpage-settings/ReplaceImageSettingsForBrandPageSettings.mixin.d.ts +8 -10
- package/lib/src/brand-page-maker/components/seo-settings/SeoPageSettings.mixin.d.ts +1 -1
- package/lib/src/brand-page-maker/components/seo-settings/UrlSettings.mixin.d.ts +1 -1
- package/lib/src/brand-page-maker/components/social-share/SocialShare.mixin.d.ts +1 -1
- package/lib/src/brand-page-maker/components/template-preview/TemplatePreview.mixin.d.ts +8 -10
- package/lib/src/brand-page-maker/composables/useEventTracker.d.ts +4 -0
- package/lib/src/brand-page-maker/composables/useEventTracker.js +19 -0
- package/lib/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.d.ts +1 -4
- package/lib/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.js +2 -4
- package/lib/src/brand-page-maker/stores/event-manager/event-manager-store.js +3 -3
- package/lib/src/brand-page-maker/stores/user/user-store.d.ts +8 -10
- package/lib/src/brand-page-maker/stores/user/user-store.js +9 -18
- package/lib/src/brand-page-maker/stores/video/video-store.d.ts +3 -0
- package/lib/src/brand-page-maker/stores/video/video-store.js +22 -0
- package/lib/src/{bundled-translations-CMyG8Azk.js → bundled-translations-EqxiRIwA.js} +13 -13
- package/lib/src/{bundled-translations.de-DE-BJPw07Ba.js → bundled-translations.de-DE-BKqVO-q2.js} +9 -9
- package/lib/src/{bundled-translations.es-ES-DqQ7zLxJ.js → bundled-translations.es-ES-DwKrkWcX.js} +12 -12
- package/lib/src/{bundled-translations.fr-CA-2dy4OokC.js → bundled-translations.fr-CA-BZtZzL79.js} +17 -17
- package/lib/src/{bundled-translations.fr-FR-Bjh3iNSg.js → bundled-translations.fr-FR-NgI1lWQl.js} +29 -29
- package/lib/src/{bundled-translations.pt-BR-BRC_B0LW.js → bundled-translations.pt-BR-DuqcSme7.js} +1 -1
- package/lib/src/{bundled-translations.pt-PT-Ka3E8T1F.js → bundled-translations.pt-PT-DDsgh_7r.js} +17 -17
- package/lib/src/bundles/bundled-translations.de-DE.json +14 -1
- package/lib/src/bundles/bundled-translations.es-ES.json +14 -1
- package/lib/src/bundles/bundled-translations.fr-CA.json +14 -1
- package/lib/src/bundles/bundled-translations.fr-FR.json +14 -1
- package/lib/src/bundles/bundled-translations.json +14 -1
- package/lib/src/bundles/bundled-translations.pt-BR.json +14 -1
- package/lib/src/bundles/bundled-translations.pt-PT.json +14 -1
- package/lib/src/composables/useTranslate.d.ts +1 -1
- package/lib/src/composables/useTranslate.js +1 -1
- package/lib/src/css/library.brand-page-brandCrowd.min.css +23 -20
- package/lib/src/css/library.brand-page-brandPage.min.css +24 -20
- package/lib/src/css/library.brand-page-designCom.min.css +23 -20
- package/lib/src/css/library.brand-page-preview.min.css +23 -20
- package/lib/src/index.mjs +1 -1
- package/lib/src/{lib-WUyXDBI4.js → lib-DAR6PgGS.js} +18241 -18191
- package/lib/src/shared/background-settings/components/background-shapes/BackgroundShapeSettings.mixin.d.ts +7 -9
- package/lib/src/shared/content-settings/components/content-settings/ContentSettings.mixin.d.ts +4 -1
- package/lib/src/shared/content-settings/components/content-settings/ReplaceImageSettingsForContent.mixin.d.ts +78 -11
- package/lib/src/shared/content-settings/components/content-settings/ReplaceImageSettingsForContent.mixin.js +30 -3
- package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItem.mixin.d.ts +3 -0
- package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.d.ts +8 -10
- package/lib/src/shared/content-settings/components/image-field/ImageField.mixin.js +3 -0
- package/lib/src/shared/content-settings/components/page-dropdown-field/PageDropdownField.mixin.d.ts +7 -9
- package/lib/src/shared/logo-settings/components/EditLogoSettings.mixin.d.ts +3 -0
- package/lib/src/shared/logo-settings/components/LogoSettings.mixin.d.ts +1 -1
- package/lib/src/shared/page-settings/components/page-settings/PageSettings.mixin.d.ts +11 -10
- package/lib/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.d.ts +1 -1
- package/lib/src/shared/publish-brand-page-with-state/PublishBrandPageModalWithState.mixin.d.ts +4 -1
- package/lib/src/shared/side-bar/components/SideBar.mixin.d.ts +7 -9
- package/lib/src/shared/side-bar/components/SideBarTabButton.mixin.d.ts +3 -0
- package/lib/src/shared/style-settings/components/StyleSettings.mixin.d.ts +11 -10
- package/lib/src/shared/style-settings/components/StyleSettings.stories.js +8 -5
- package/lib/src/shared/template-settings/components/TemplatesSettings.mixin.d.ts +3 -0
- package/package.json +2 -2
- package/src/brand-page/components/page/Page.vue +1 -1
- package/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.ts +0 -2
- package/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.stories.ts +52 -35
- package/src/brand-page-maker/components/brand-page-maker/__fixtures__/brand-page-examples.ts +19 -18
- package/src/brand-page-maker/composables/useEventTracker.ts +20 -0
- package/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.test.ts +11 -6
- package/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.ts +1 -9
- package/src/brand-page-maker/stores/event-manager/event-manager-store.ts +3 -3
- package/src/brand-page-maker/stores/user/user-store.test.ts +2 -2
- package/src/brand-page-maker/stores/user/user-store.ts +17 -19
- package/src/brand-page-maker/stores/video/video-store.ts +30 -0
- package/src/bundles/bundled-translations.de-DE.json +14 -1
- package/src/bundles/bundled-translations.es-ES.json +14 -1
- package/src/bundles/bundled-translations.fr-CA.json +14 -1
- package/src/bundles/bundled-translations.fr-FR.json +14 -1
- package/src/bundles/bundled-translations.json +14 -1
- package/src/bundles/bundled-translations.pt-BR.json +14 -1
- package/src/bundles/bundled-translations.pt-PT.json +14 -1
- package/src/composables/useTranslate.ts +2 -1
- package/src/shared/background-settings/components/BackgroundSettings.vue +7 -5
- package/src/shared/background-settings/components/ReplaceImageSettingsForBackgroundSettings.vue +41 -1
- package/src/shared/content-settings/components/content-settings/ReplaceImageSettingsForContent.mixin.ts +43 -2
- package/src/shared/content-settings/components/image-field/ImageField.mixin.ts +4 -0
- package/src/shared/content-settings/components/replace-image-base-settings/ReplaceImageBaseSettings.vue +6 -5
- package/src/shared/page-settings/store/page-settings-store.test.ts +16 -2
- package/src/shared/style-settings/components/StyleSettings.stories.ts +12 -5
- package/src/shared/video-library/VideoLibrary.vue +6 -13
- package/src/shared/video-library/i18n/video-library.de-DE.json +14 -1
- package/src/shared/video-library/i18n/video-library.es-ES.json +14 -1
- package/src/shared/video-library/i18n/video-library.fr-CA.json +14 -1
- package/src/shared/video-library/i18n/video-library.fr-FR.json +14 -1
- package/src/shared/video-library/i18n/video-library.json +14 -1
- package/src/shared/video-library/i18n/video-library.pt-BR.json +14 -1
- package/src/shared/video-library/i18n/video-library.pt-PT.json +14 -1
|
@@ -271,9 +271,11 @@ const InitialiseMakerStores = (options: {
|
|
|
271
271
|
templateSearchTerm: undefined,
|
|
272
272
|
});
|
|
273
273
|
|
|
274
|
-
userStore.
|
|
275
|
-
|
|
276
|
-
|
|
274
|
+
userStore.setUserState({
|
|
275
|
+
isAdmin: options.isAdmin,
|
|
276
|
+
hasPremiumSubscription: false,
|
|
277
|
+
brandPageCommissionPercentage: 0.1,
|
|
278
|
+
});
|
|
277
279
|
};
|
|
278
280
|
|
|
279
281
|
const FABRIC_RENDER_BASE_URL = 'https://localhost:6006/';
|
|
@@ -343,6 +345,7 @@ export const SampleDesktopManagePages = (): any => {
|
|
|
343
345
|
|
|
344
346
|
const contentSettingsStore = useUiContentSettingsStore();
|
|
345
347
|
const brandPageMakerStore = useBrandPageMakerStore();
|
|
348
|
+
const userStore = useBrandPageMakerUserStore();
|
|
346
349
|
|
|
347
350
|
contentSettingsStore.pushMode({
|
|
348
351
|
mode: CONTENT_SETTINGS_MODES.pages,
|
|
@@ -352,6 +355,12 @@ export const SampleDesktopManagePages = (): any => {
|
|
|
352
355
|
viewport: VIEWPORTS.desktop,
|
|
353
356
|
});
|
|
354
357
|
|
|
358
|
+
userStore.setUserState({
|
|
359
|
+
features: {
|
|
360
|
+
...userFeatures,
|
|
361
|
+
},
|
|
362
|
+
});
|
|
363
|
+
|
|
355
364
|
return defineComponent({
|
|
356
365
|
components: {
|
|
357
366
|
BrandPageMaker,
|
|
@@ -399,10 +408,6 @@ export const SampleDesktopManagePages = (): any => {
|
|
|
399
408
|
isSaving: false,
|
|
400
409
|
logoDraftDesignAttributes: simpleLogoDesignAttributes,
|
|
401
410
|
logoVariationImageUrls,
|
|
402
|
-
features: {
|
|
403
|
-
...userFeatures,
|
|
404
|
-
canAddMoreThanThreePages: true,
|
|
405
|
-
},
|
|
406
411
|
templateCategories: TEMPLATE_CATEGORIES,
|
|
407
412
|
},
|
|
408
413
|
};
|
|
@@ -424,6 +429,7 @@ export const SampleBanner = (): any => {
|
|
|
424
429
|
|
|
425
430
|
InitialiseMakerStores({});
|
|
426
431
|
const brandPageMakerStore = useBrandPageMakerStore();
|
|
432
|
+
const userStore = useBrandPageMakerUserStore();
|
|
427
433
|
|
|
428
434
|
const bannerContent = createInitialBannerSectionContent();
|
|
429
435
|
bannerContent.description = 'Lorem ipsum dolor sit amet';
|
|
@@ -432,6 +438,12 @@ export const SampleBanner = (): any => {
|
|
|
432
438
|
viewport: VIEWPORTS.desktop,
|
|
433
439
|
});
|
|
434
440
|
|
|
441
|
+
userStore.setUserState({
|
|
442
|
+
features: {
|
|
443
|
+
...userFeatures,
|
|
444
|
+
},
|
|
445
|
+
});
|
|
446
|
+
|
|
435
447
|
return defineComponent({
|
|
436
448
|
components: {
|
|
437
449
|
BrandPageMaker,
|
|
@@ -453,10 +465,6 @@ export const SampleBanner = (): any => {
|
|
|
453
465
|
isSaving: false,
|
|
454
466
|
logoDraftDesignAttributes: simpleLogoDesignAttributes,
|
|
455
467
|
logoVariationImageUrls,
|
|
456
|
-
features: {
|
|
457
|
-
...userFeatures,
|
|
458
|
-
canAddMoreThanThreePages: true,
|
|
459
|
-
},
|
|
460
468
|
templateCategories: TEMPLATE_CATEGORIES,
|
|
461
469
|
},
|
|
462
470
|
};
|
|
@@ -1010,6 +1018,7 @@ export const SamplePremiumUser = (): any => {
|
|
|
1010
1018
|
},
|
|
1011
1019
|
setup() {
|
|
1012
1020
|
const containerStore = useBrandPageContainerStore();
|
|
1021
|
+
const userStore = useBrandPageMakerUserStore();
|
|
1013
1022
|
|
|
1014
1023
|
const logoStore = useLogoStore();
|
|
1015
1024
|
|
|
@@ -1025,6 +1034,18 @@ export const SamplePremiumUser = (): any => {
|
|
|
1025
1034
|
containerStore.$patch({
|
|
1026
1035
|
baseFabricRenderUrl: FABRIC_RENDER_BASE_URL,
|
|
1027
1036
|
});
|
|
1037
|
+
|
|
1038
|
+
userStore.setUserState({
|
|
1039
|
+
features: {
|
|
1040
|
+
...userFeatures,
|
|
1041
|
+
showBrandCrowdLogo: false,
|
|
1042
|
+
canAddVideoContents: true,
|
|
1043
|
+
canUploadBackgroundImages: true,
|
|
1044
|
+
canAddMapContents: true,
|
|
1045
|
+
canAddContactFormContents: true,
|
|
1046
|
+
canAddLibraryBackgroundImages: true,
|
|
1047
|
+
},
|
|
1048
|
+
});
|
|
1028
1049
|
},
|
|
1029
1050
|
data() {
|
|
1030
1051
|
return {
|
|
@@ -1033,16 +1054,6 @@ export const SamplePremiumUser = (): any => {
|
|
|
1033
1054
|
isSaving: false,
|
|
1034
1055
|
logoVariationImageUrls,
|
|
1035
1056
|
logoDraftDesignAttributes: gradientLogoDesignAttributes,
|
|
1036
|
-
features: {
|
|
1037
|
-
...userFeatures,
|
|
1038
|
-
showBrandCrowdLogo: false,
|
|
1039
|
-
canAddVideoContents: true,
|
|
1040
|
-
canUploadBackgroundImages: true,
|
|
1041
|
-
canAddMapContents: true,
|
|
1042
|
-
canAddContactFormContents: true,
|
|
1043
|
-
canAddLibraryBackgroundImages: true,
|
|
1044
|
-
canAddMoreThanThreePages: true,
|
|
1045
|
-
},
|
|
1046
1057
|
initialCategories: {},
|
|
1047
1058
|
},
|
|
1048
1059
|
};
|
|
@@ -1073,6 +1084,7 @@ export const SamplePremiumBContactUser = (): any => {
|
|
|
1073
1084
|
},
|
|
1074
1085
|
setup() {
|
|
1075
1086
|
const containerStore = useBrandPageContainerStore();
|
|
1087
|
+
const userStore = useBrandPageMakerUserStore();
|
|
1076
1088
|
|
|
1077
1089
|
const logoStore = useLogoStore();
|
|
1078
1090
|
|
|
@@ -1088,6 +1100,18 @@ export const SamplePremiumBContactUser = (): any => {
|
|
|
1088
1100
|
containerStore.$patch({
|
|
1089
1101
|
baseFabricRenderUrl: FABRIC_RENDER_BASE_URL,
|
|
1090
1102
|
});
|
|
1103
|
+
|
|
1104
|
+
userStore.setUserState({
|
|
1105
|
+
features: {
|
|
1106
|
+
...userFeatures,
|
|
1107
|
+
showBrandCrowdLogo: false,
|
|
1108
|
+
canAddVideoContents: true,
|
|
1109
|
+
canUploadBackgroundImages: true,
|
|
1110
|
+
canAddMapContents: true,
|
|
1111
|
+
canAddContactFormContents: true,
|
|
1112
|
+
canAddLibraryBackgroundImages: true,
|
|
1113
|
+
},
|
|
1114
|
+
});
|
|
1091
1115
|
},
|
|
1092
1116
|
data() {
|
|
1093
1117
|
return {
|
|
@@ -1096,16 +1120,6 @@ export const SamplePremiumBContactUser = (): any => {
|
|
|
1096
1120
|
isSaving: false,
|
|
1097
1121
|
logoVariationImageUrls,
|
|
1098
1122
|
logoDraftDesignAttributes: gradientLogoDesignAttributes,
|
|
1099
|
-
features: {
|
|
1100
|
-
...userFeatures,
|
|
1101
|
-
showBrandCrowdLogo: false,
|
|
1102
|
-
canAddVideoContents: true,
|
|
1103
|
-
canUploadBackgroundImages: true,
|
|
1104
|
-
canAddMapContents: true,
|
|
1105
|
-
canAddContactFormContents: true,
|
|
1106
|
-
canAddLibraryBackgroundImages: true,
|
|
1107
|
-
canAddMoreThanThreePages: true,
|
|
1108
|
-
},
|
|
1109
1123
|
initialCategories: {},
|
|
1110
1124
|
},
|
|
1111
1125
|
};
|
|
@@ -1735,6 +1749,7 @@ export const TextStyleOptions = (): any => {
|
|
|
1735
1749
|
const imageUrl = 'https://source.unsplash.com/random/400x225?1';
|
|
1736
1750
|
|
|
1737
1751
|
const brandPageMakerStore = useBrandPageMakerStore();
|
|
1752
|
+
const userStore = useBrandPageMakerUserStore();
|
|
1738
1753
|
|
|
1739
1754
|
brandPageMakerStore.setSelectedTabName({
|
|
1740
1755
|
tabName: SIDE_BAR_TAB_NAMES.STYLE_SETTINGS,
|
|
@@ -1837,6 +1852,12 @@ export const TextStyleOptions = (): any => {
|
|
|
1837
1852
|
viewport: VIEWPORTS.desktop,
|
|
1838
1853
|
});
|
|
1839
1854
|
|
|
1855
|
+
userStore.setUserState({
|
|
1856
|
+
features: {
|
|
1857
|
+
...userFeatures,
|
|
1858
|
+
},
|
|
1859
|
+
});
|
|
1860
|
+
|
|
1840
1861
|
return defineComponent({
|
|
1841
1862
|
components: {
|
|
1842
1863
|
BrandPageMaker,
|
|
@@ -1858,10 +1879,6 @@ export const TextStyleOptions = (): any => {
|
|
|
1858
1879
|
isSaving: false,
|
|
1859
1880
|
logoDraftDesignAttributes: simpleLogoDesignAttributes,
|
|
1860
1881
|
logoVariationImageUrls,
|
|
1861
|
-
features: {
|
|
1862
|
-
...userFeatures,
|
|
1863
|
-
canAddMoreThanThreePages: true,
|
|
1864
|
-
},
|
|
1865
1882
|
templateCategories: TEMPLATE_CATEGORIES,
|
|
1866
1883
|
},
|
|
1867
1884
|
};
|
package/src/brand-page-maker/components/brand-page-maker/__fixtures__/brand-page-examples.ts
CHANGED
|
@@ -37,6 +37,7 @@ import type { UserFeatures } from '../../../stores';
|
|
|
37
37
|
import type { AdminPreviewLogoTemplateModel } from '../../../stores/admin-logo-settings';
|
|
38
38
|
import { v4 as uuid } from 'uuid';
|
|
39
39
|
import { CONTENT_SETTINGS_CONFIGS } from '../../../constants';
|
|
40
|
+
import type { UIUserFeatures } from 'src/constants/ui';
|
|
40
41
|
|
|
41
42
|
export const storyEmailAddress = 'test@test.com';
|
|
42
43
|
|
|
@@ -2108,26 +2109,26 @@ export const brandPageCustom: BrandPageData = {
|
|
|
2108
2109
|
},
|
|
2109
2110
|
};
|
|
2110
2111
|
|
|
2112
|
+
export const USER_FEATURES: UIUserFeatures = Object.freeze({
|
|
2113
|
+
showBrandCrowdLogo: true,
|
|
2114
|
+
canAddImageContents: true,
|
|
2115
|
+
canAddVideoContents: false,
|
|
2116
|
+
canAddMapContents: false,
|
|
2117
|
+
canAddLibraryBackgroundImages: true,
|
|
2118
|
+
canAddRequestPaymentContents: true,
|
|
2119
|
+
canAddShopContents: true,
|
|
2120
|
+
canUploadBackgroundImages: false,
|
|
2121
|
+
canAddContactFormContents: true,
|
|
2122
|
+
canUseRichTextEditor: false,
|
|
2123
|
+
canUsePremiumFontFamily: true,
|
|
2124
|
+
maxNumOfPages: UNLIMITED_MAX_NUM_OF_PAGES,
|
|
2125
|
+
canUseGettyVideos: true,
|
|
2126
|
+
canUseGoogleAdsense: false,
|
|
2127
|
+
googleAdsenseEnabled: true,
|
|
2128
|
+
} as UIUserFeatures);
|
|
2129
|
+
|
|
2111
2130
|
export const INITIALISE_PAYLOAD: InitialisePayload = Object.freeze({
|
|
2112
2131
|
brandPage: BRAND_PAGE,
|
|
2113
|
-
emailAddress: storyEmailAddress,
|
|
2114
|
-
features: {
|
|
2115
|
-
showBrandCrowdLogo: true,
|
|
2116
|
-
canAddImageContents: true,
|
|
2117
|
-
canAddVideoContents: false,
|
|
2118
|
-
canAddMapContents: false,
|
|
2119
|
-
canAddLibraryBackgroundImages: true,
|
|
2120
|
-
canAddRequestPaymentContents: true,
|
|
2121
|
-
canAddShopContents: true,
|
|
2122
|
-
canUploadBackgroundImages: false,
|
|
2123
|
-
canAddContactFormContents: true,
|
|
2124
|
-
canUseRichTextEditor: false,
|
|
2125
|
-
canUsePremiumFontFamily: true,
|
|
2126
|
-
maxNumOfPages: UNLIMITED_MAX_NUM_OF_PAGES,
|
|
2127
|
-
canUseGettyVideos: true,
|
|
2128
|
-
canUseGoogleAdsense: false,
|
|
2129
|
-
googleAdsenseEnabled: true,
|
|
2130
|
-
},
|
|
2131
2132
|
logoDraftDesignAttributes: simpleLogoDesignAttributes,
|
|
2132
2133
|
backUrl: '',
|
|
2133
2134
|
logoVariationImageUrls: [],
|
|
@@ -63,6 +63,7 @@ export const EVENTS = {
|
|
|
63
63
|
WEBSITE_MAKER_AI_CLICK_SUGGESTED_PROMPT:
|
|
64
64
|
'website_maker_ai_click_suggested_prompt',
|
|
65
65
|
WEBSITE_MAKER_DOMAIN_UPSELL_MODAL: 'website_domain_upsell_modal',
|
|
66
|
+
WEBSITE_MAKER_GETTY_VIDEO: 'website_maker_getty_video',
|
|
66
67
|
};
|
|
67
68
|
|
|
68
69
|
export const SELECT_LOCATIONS = {
|
|
@@ -160,6 +161,24 @@ const _publishEvent = (
|
|
|
160
161
|
};
|
|
161
162
|
|
|
162
163
|
const useEventTracker = () => {
|
|
164
|
+
const gettyVideoEvents = {
|
|
165
|
+
sendGettyVideoAddEvent: () => {
|
|
166
|
+
_publishEvent(EVENTS.WEBSITE_MAKER_GETTY_VIDEO, {
|
|
167
|
+
action: 'add',
|
|
168
|
+
});
|
|
169
|
+
},
|
|
170
|
+
sendGettyVideoReplaceEvent: () => {
|
|
171
|
+
_publishEvent(EVENTS.WEBSITE_MAKER_GETTY_VIDEO, {
|
|
172
|
+
action: 'replace',
|
|
173
|
+
});
|
|
174
|
+
},
|
|
175
|
+
sendGettyVideoRemoveEvent: () => {
|
|
176
|
+
_publishEvent(EVENTS.WEBSITE_MAKER_GETTY_VIDEO, {
|
|
177
|
+
action: 'remove',
|
|
178
|
+
});
|
|
179
|
+
},
|
|
180
|
+
};
|
|
181
|
+
|
|
163
182
|
return {
|
|
164
183
|
sendExperimentStartedEvent: (abTestKey: string, abTestValue: string) => {
|
|
165
184
|
_publishEvent(
|
|
@@ -324,6 +343,7 @@ const useEventTracker = () => {
|
|
|
324
343
|
continuation,
|
|
325
344
|
});
|
|
326
345
|
},
|
|
346
|
+
...gettyVideoEvents,
|
|
327
347
|
};
|
|
328
348
|
};
|
|
329
349
|
|
|
@@ -2,6 +2,7 @@ import { vi } from 'vitest';
|
|
|
2
2
|
import {
|
|
3
3
|
BRAND_PAGE,
|
|
4
4
|
INITIALISE_PAYLOAD,
|
|
5
|
+
USER_FEATURES,
|
|
5
6
|
userFeatures,
|
|
6
7
|
} from '../../components/brand-page-maker/__fixtures__';
|
|
7
8
|
import {
|
|
@@ -79,7 +80,7 @@ describe('brand page maker store module', () => {
|
|
|
79
80
|
const store = useBrandPageMakerStore();
|
|
80
81
|
const userStore = useBrandPageMakerUserStore();
|
|
81
82
|
|
|
82
|
-
userStore.
|
|
83
|
+
userStore.setUserState({ isAdmin: true });
|
|
83
84
|
|
|
84
85
|
await store.initialise(INITIALISE_PAYLOAD);
|
|
85
86
|
|
|
@@ -95,7 +96,7 @@ describe('brand page maker store module', () => {
|
|
|
95
96
|
const store = useBrandPageMakerStore();
|
|
96
97
|
const userStore = useBrandPageMakerUserStore();
|
|
97
98
|
|
|
98
|
-
userStore.
|
|
99
|
+
userStore.setUserState({ isAdmin: true });
|
|
99
100
|
|
|
100
101
|
await store.initialise(INITIALISE_PAYLOAD);
|
|
101
102
|
|
|
@@ -113,14 +114,18 @@ describe('brand page maker store module', () => {
|
|
|
113
114
|
const userStore = useBrandPageMakerUserStore();
|
|
114
115
|
|
|
115
116
|
// Act
|
|
116
|
-
|
|
117
|
-
|
|
117
|
+
|
|
118
|
+
userStore.setUserState({
|
|
118
119
|
features: {
|
|
119
120
|
...userFeatures,
|
|
120
121
|
showBrandCrowdLogo: false,
|
|
121
122
|
},
|
|
122
123
|
});
|
|
123
124
|
|
|
125
|
+
await store.initialise({
|
|
126
|
+
...INITIALISE_PAYLOAD,
|
|
127
|
+
});
|
|
128
|
+
|
|
124
129
|
// Assert
|
|
125
130
|
expect(userStore.features.showBrandCrowdLogo).toBe(false);
|
|
126
131
|
});
|
|
@@ -170,7 +175,7 @@ describe('brand page maker store module', () => {
|
|
|
170
175
|
const store = useBrandPageMakerStore();
|
|
171
176
|
const userStore = useBrandPageMakerUserStore();
|
|
172
177
|
|
|
173
|
-
userStore.
|
|
178
|
+
userStore.setUserState({ isAdmin: true });
|
|
174
179
|
|
|
175
180
|
const contactFormContent: ContactFormContent = {
|
|
176
181
|
id: faker.datatype.uuid(),
|
|
@@ -497,7 +502,7 @@ describe('brand page maker store module', () => {
|
|
|
497
502
|
// Arrange
|
|
498
503
|
const userStore = useBrandPageMakerUserStore();
|
|
499
504
|
|
|
500
|
-
userStore.
|
|
505
|
+
userStore.setUserState({ isAdmin: true });
|
|
501
506
|
|
|
502
507
|
const templateId = faker.string.uuid();
|
|
503
508
|
|
|
@@ -114,8 +114,6 @@ export type SelectedCategoryPayload = InitialCategories;
|
|
|
114
114
|
export interface InitialisePayload {
|
|
115
115
|
brandPage: string | BrandPageData;
|
|
116
116
|
brandPageType?: BrandPageType;
|
|
117
|
-
emailAddress: string;
|
|
118
|
-
features: UserFeatures;
|
|
119
117
|
logoDraftDesignAttributes: LogoDesignAttributesModel;
|
|
120
118
|
unsplashApplicationName: string;
|
|
121
119
|
templateCategories: TemplateCategory[];
|
|
@@ -729,8 +727,6 @@ export const useBrandPageMakerStore = defineStore('brandPageMaker', {
|
|
|
729
727
|
async initialise({
|
|
730
728
|
brandPage,
|
|
731
729
|
brandPageType,
|
|
732
|
-
emailAddress,
|
|
733
|
-
features,
|
|
734
730
|
logoDraftDesignAttributes,
|
|
735
731
|
unsplashApplicationName,
|
|
736
732
|
templateCategories,
|
|
@@ -844,10 +840,6 @@ export const useBrandPageMakerStore = defineStore('brandPageMaker', {
|
|
|
844
840
|
templateType: brandPageTypeTemplateTypeMap[_brandPageType],
|
|
845
841
|
});
|
|
846
842
|
|
|
847
|
-
userStore.setEmailAddress(emailAddress);
|
|
848
|
-
|
|
849
|
-
userStore.setFeatures(features);
|
|
850
|
-
|
|
851
843
|
uiStore.setLogoTheme({
|
|
852
844
|
logoTheme: parseLogoThemeToCssStyles(
|
|
853
845
|
logoDraftDesignAttributes.logoTheme,
|
|
@@ -887,7 +879,7 @@ export const useBrandPageMakerStore = defineStore('brandPageMaker', {
|
|
|
887
879
|
pages: brandPageModel.pages,
|
|
888
880
|
});
|
|
889
881
|
|
|
890
|
-
setContentSettingsAddContentOptions(features);
|
|
882
|
+
setContentSettingsAddContentOptions(userStore.features);
|
|
891
883
|
|
|
892
884
|
if (logoImage) {
|
|
893
885
|
const logoSettingsState: LogoSettingsState = {
|
|
@@ -82,12 +82,12 @@ const getBrandPageEventCategory = () => {
|
|
|
82
82
|
|
|
83
83
|
if (
|
|
84
84
|
process.env.NODE_ENV !== 'production' &&
|
|
85
|
-
typeof userStore.
|
|
85
|
+
typeof userStore.hasPremiumSubscription !== 'boolean'
|
|
86
86
|
) {
|
|
87
|
-
console.error('
|
|
87
|
+
console.error('hasPremiumSubscription should be a boolean');
|
|
88
88
|
}
|
|
89
89
|
|
|
90
|
-
return userStore.
|
|
90
|
+
return userStore.hasPremiumSubscription
|
|
91
91
|
? BRAND_PAGE_ACTIVE
|
|
92
92
|
: BRAND_PAGE_INACTIVE;
|
|
93
93
|
};
|
|
@@ -12,7 +12,7 @@ describe('brand page user store module', () => {
|
|
|
12
12
|
// Arrange
|
|
13
13
|
const store = useBrandPageMakerUserStore();
|
|
14
14
|
|
|
15
|
-
store.
|
|
15
|
+
store.setUserState({ isAdmin: true });
|
|
16
16
|
|
|
17
17
|
// Act
|
|
18
18
|
|
|
@@ -24,7 +24,7 @@ describe('brand page user store module', () => {
|
|
|
24
24
|
// Arrange
|
|
25
25
|
const store = useBrandPageMakerUserStore();
|
|
26
26
|
|
|
27
|
-
store.
|
|
27
|
+
store.setUserState({ isAdmin: false });
|
|
28
28
|
// Act
|
|
29
29
|
|
|
30
30
|
// Assert
|
|
@@ -7,7 +7,7 @@ export type UserFeatures = UIUserFeatures;
|
|
|
7
7
|
export interface UserState extends UIUserState {
|
|
8
8
|
features: UserFeatures;
|
|
9
9
|
emailAddress: string;
|
|
10
|
-
|
|
10
|
+
hasPremiumSubscription: boolean;
|
|
11
11
|
brandPageCommissionPercentage: number | undefined;
|
|
12
12
|
userToken?: string;
|
|
13
13
|
}
|
|
@@ -35,29 +35,27 @@ export const useBrandPageMakerUserStore = defineStore('brandPageMakerUser', {
|
|
|
35
35
|
googleAdsenseEnabled: false,
|
|
36
36
|
},
|
|
37
37
|
emailAddress: '',
|
|
38
|
-
|
|
38
|
+
hasPremiumSubscription: false,
|
|
39
39
|
brandPageCommissionPercentage: undefined,
|
|
40
40
|
isAdmin: false, // this is currently used as way to identify admin maker mode
|
|
41
41
|
userToken: undefined,
|
|
42
42
|
}),
|
|
43
43
|
actions: {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
this.
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
this.
|
|
58
|
-
|
|
59
|
-
setUserToken(payload: { userToken: string }): void {
|
|
60
|
-
this.userToken = payload.userToken;
|
|
44
|
+
setUserState(payload: {
|
|
45
|
+
emailAddress?: string;
|
|
46
|
+
userToken?: string;
|
|
47
|
+
isAdmin?: boolean;
|
|
48
|
+
hasPremiumSubscription?: boolean;
|
|
49
|
+
brandPageCommissionPercentage?: number;
|
|
50
|
+
features?: Partial<UserFeatures>;
|
|
51
|
+
}): void {
|
|
52
|
+
this.emailAddress = payload.emailAddress || '';
|
|
53
|
+
this.userToken = payload.userToken || '';
|
|
54
|
+
this.hasPremiumSubscription = payload.hasPremiumSubscription || false;
|
|
55
|
+
this.brandPageCommissionPercentage =
|
|
56
|
+
payload.brandPageCommissionPercentage || undefined;
|
|
57
|
+
this.isAdmin = payload.isAdmin || false;
|
|
58
|
+
this.features = Object.assign({}, this.features, payload.features);
|
|
61
59
|
},
|
|
62
60
|
},
|
|
63
61
|
});
|
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
import { defineStore } from 'pinia';
|
|
2
|
+
import { useBrandPageMakerStore } from '../brandpage-maker';
|
|
3
|
+
import cloneDeep from 'lodash.clonedeep';
|
|
4
|
+
import { findValuesByKey } from '../../../helpers/ts.helper';
|
|
5
|
+
import { useBrandPageMakerUserStore } from '../user';
|
|
6
|
+
import { useBrandPageContainerStore } from '../brandpage-container';
|
|
2
7
|
|
|
3
8
|
const CDN_GETTY_S3_URL_PREFIX = 'https://bc-getty-media.brandcrowd.com';
|
|
4
9
|
|
|
10
|
+
export const GETTY_VIDEO_LIMIT_FOR_SITE = 5;
|
|
11
|
+
|
|
5
12
|
export type VideoUrlData = {
|
|
6
13
|
videoUrl: string;
|
|
7
14
|
previewImageUrl: string;
|
|
@@ -54,5 +61,28 @@ export const useVideoStore = defineStore('video', {
|
|
|
54
61
|
previewImageUrl: `${CDN_GETTY_S3_URL_PREFIX}/public/${state.gettyImagesKeyPrefix}/${token}/${token}_optimised_thumb`,
|
|
55
62
|
};
|
|
56
63
|
},
|
|
64
|
+
hasReachedLimitForVideo() {
|
|
65
|
+
// Looking through the bp maker store as the video-store isn't aware of removals
|
|
66
|
+
const brandPageMakerStore = useBrandPageMakerStore();
|
|
67
|
+
const brandPageData = cloneDeep(brandPageMakerStore.brandPageData);
|
|
68
|
+
|
|
69
|
+
const gettyAssetIds = findValuesByKey(brandPageData, 'gettyAssetId');
|
|
70
|
+
|
|
71
|
+
return gettyAssetIds.length >= GETTY_VIDEO_LIMIT_FOR_SITE;
|
|
72
|
+
},
|
|
73
|
+
canAddNewVideo() {
|
|
74
|
+
const userStore = useBrandPageMakerUserStore();
|
|
75
|
+
const brandPageContainerStore = useBrandPageContainerStore();
|
|
76
|
+
|
|
77
|
+
const canUseGettyVideos = userStore.features.canUseGettyVideos;
|
|
78
|
+
const isPrePurchase = brandPageContainerStore.isPrePurchase;
|
|
79
|
+
|
|
80
|
+
const hasPremiumSubscription = userStore.hasPremiumSubscription;
|
|
81
|
+
|
|
82
|
+
return (
|
|
83
|
+
canUseGettyVideos &&
|
|
84
|
+
(userStore.isAdmin || isPrePurchase || hasPremiumSubscription)
|
|
85
|
+
);
|
|
86
|
+
},
|
|
57
87
|
},
|
|
58
88
|
});
|
|
@@ -920,9 +920,22 @@
|
|
|
920
920
|
"continueLabel": "Weiter"
|
|
921
921
|
},
|
|
922
922
|
"videoLibrary": {
|
|
923
|
+
"categories": {
|
|
924
|
+
"aerial": "Luftaufnahme",
|
|
925
|
+
"beach": "Strand",
|
|
926
|
+
"business": "Unternehmen",
|
|
927
|
+
"cities": "Städte",
|
|
928
|
+
"landscape": "Landschaft",
|
|
929
|
+
"nature": "Natur",
|
|
930
|
+
"people": "Menschen",
|
|
931
|
+
"plants": "Pflanzen",
|
|
932
|
+
"sky": "Himmel",
|
|
933
|
+
"sunrise": "Sonnenaufgang"
|
|
934
|
+
},
|
|
923
935
|
"poweredBy": "Powered by",
|
|
924
936
|
"emptyState": "Ihr Browser unterstützt keine eingebetteten Videos.",
|
|
925
937
|
"loadMoreVideos": "Weitere Videos laden",
|
|
926
|
-
"supported": "Ihr Browser unterstützt keine eingebetteten Videos."
|
|
938
|
+
"supported": "Ihr Browser unterstützt keine eingebetteten Videos.",
|
|
939
|
+
"limitMessage": "Sie haben das Videolimit erreicht. Jede Seite unterstützt bis zu {{ videoLimit }} Videos. Entfernen Sie eines, um ein weiteres hinzuzufügen."
|
|
927
940
|
}
|
|
928
941
|
}
|
|
@@ -920,9 +920,22 @@
|
|
|
920
920
|
"continueLabel": "Continuar"
|
|
921
921
|
},
|
|
922
922
|
"videoLibrary": {
|
|
923
|
+
"categories": {
|
|
924
|
+
"aerial": "Aéreo",
|
|
925
|
+
"beach": "Playa",
|
|
926
|
+
"business": "Negocio",
|
|
927
|
+
"cities": "Ciudades",
|
|
928
|
+
"landscape": "Paisaje",
|
|
929
|
+
"nature": "Naturaleza",
|
|
930
|
+
"people": "Personas",
|
|
931
|
+
"plants": "Plantas",
|
|
932
|
+
"sky": "Cielo",
|
|
933
|
+
"sunrise": "Amanecer"
|
|
934
|
+
},
|
|
923
935
|
"poweredBy": "Desarrollado por",
|
|
924
936
|
"emptyState": "Lo sentimos, tu navegador no admite vídeos incrustados.",
|
|
925
937
|
"loadMoreVideos": "Carga más vídeos",
|
|
926
|
-
"supported": "Lo sentimos, tu navegador no admite vídeos incrustados."
|
|
938
|
+
"supported": "Lo sentimos, tu navegador no admite vídeos incrustados.",
|
|
939
|
+
"limitMessage": "Has alcanzado el límite de vídeos. Cada sitio admite hasta {{ videoLimit }} vídeos; elimina uno para añadir otro."
|
|
927
940
|
}
|
|
928
941
|
}
|
|
@@ -920,9 +920,22 @@
|
|
|
920
920
|
"continueLabel": "Continuer"
|
|
921
921
|
},
|
|
922
922
|
"videoLibrary": {
|
|
923
|
+
"categories": {
|
|
924
|
+
"aerial": "Aérien",
|
|
925
|
+
"beach": "Plage",
|
|
926
|
+
"business": "Activité",
|
|
927
|
+
"cities": "Villes",
|
|
928
|
+
"landscape": "Paysage",
|
|
929
|
+
"nature": "Nature",
|
|
930
|
+
"people": "Gens",
|
|
931
|
+
"plants": "Plantes",
|
|
932
|
+
"sky": "Ciel",
|
|
933
|
+
"sunrise": "Lever du soleil"
|
|
934
|
+
},
|
|
923
935
|
"poweredBy": "Alimenté par",
|
|
924
936
|
"emptyState": "Désolé, votre navigateur ne prend pas en charge les vidéos intégrées.",
|
|
925
937
|
"loadMoreVideos": "Charger plus de vidéos",
|
|
926
|
-
"supported": "Désolé, votre navigateur ne prend pas en charge les vidéos intégrées."
|
|
938
|
+
"supported": "Désolé, votre navigateur ne prend pas en charge les vidéos intégrées.",
|
|
939
|
+
"limitMessage": "Vous avez atteint la limite de vidéos. Chaque site prend en charge jusqu'à {{ videoLimit }} vidéos. Supprimez-en une pour en ajouter une autre."
|
|
927
940
|
}
|
|
928
941
|
}
|
|
@@ -920,9 +920,22 @@
|
|
|
920
920
|
"continueLabel": "Continuer"
|
|
921
921
|
},
|
|
922
922
|
"videoLibrary": {
|
|
923
|
+
"categories": {
|
|
924
|
+
"aerial": "Aérien",
|
|
925
|
+
"beach": "Plage",
|
|
926
|
+
"business": "Activité",
|
|
927
|
+
"cities": "Villes",
|
|
928
|
+
"landscape": "Paysage",
|
|
929
|
+
"nature": "Nature",
|
|
930
|
+
"people": "Gens",
|
|
931
|
+
"plants": "Plantes",
|
|
932
|
+
"sky": "Ciel",
|
|
933
|
+
"sunrise": "Lever du soleil"
|
|
934
|
+
},
|
|
923
935
|
"poweredBy": "Alimenté par",
|
|
924
936
|
"emptyState": "Désolé, votre navigateur ne prend pas en charge les vidéos intégrées.",
|
|
925
937
|
"loadMoreVideos": "Charger plus de vidéos",
|
|
926
|
-
"supported": "Désolé, votre navigateur ne prend pas en charge les vidéos intégrées."
|
|
938
|
+
"supported": "Désolé, votre navigateur ne prend pas en charge les vidéos intégrées.",
|
|
939
|
+
"limitMessage": "Vous avez atteint la limite de vidéos. Chaque site prend en charge jusqu'à {{ videoLimit }} vidéos. Supprimez-en une pour en ajouter une autre."
|
|
927
940
|
}
|
|
928
941
|
}
|
|
@@ -920,9 +920,22 @@
|
|
|
920
920
|
"continueLabel": "Continue"
|
|
921
921
|
},
|
|
922
922
|
"videoLibrary": {
|
|
923
|
+
"categories": {
|
|
924
|
+
"aerial": "Aerial",
|
|
925
|
+
"beach": "Beach",
|
|
926
|
+
"business": "Business",
|
|
927
|
+
"cities": "Cities",
|
|
928
|
+
"landscape": "Landscape",
|
|
929
|
+
"nature": "Nature",
|
|
930
|
+
"people": "People",
|
|
931
|
+
"plants": "Plants",
|
|
932
|
+
"sky": "Sky",
|
|
933
|
+
"sunrise": "Sunrise"
|
|
934
|
+
},
|
|
923
935
|
"poweredBy": "Powered by",
|
|
924
936
|
"emptyState": "Sorry, your browser doesn't support embedded videos.",
|
|
925
937
|
"loadMoreVideos": "Load more videos",
|
|
926
|
-
"supported": "Sorry, your browser doesn't support embedded videos."
|
|
938
|
+
"supported": "Sorry, your browser doesn't support embedded videos.",
|
|
939
|
+
"limitMessage": "You’ve reached the video limit. Each site supports up to {{ videoLimit }} videos - remove one to add another."
|
|
927
940
|
}
|
|
928
941
|
}
|
|
@@ -920,9 +920,22 @@
|
|
|
920
920
|
"continueLabel": "Continuar"
|
|
921
921
|
},
|
|
922
922
|
"videoLibrary": {
|
|
923
|
+
"categories": {
|
|
924
|
+
"aerial": "Aéreo",
|
|
925
|
+
"beach": "Praia",
|
|
926
|
+
"business": "Negócio",
|
|
927
|
+
"cities": "Cidades",
|
|
928
|
+
"landscape": "Paisagem",
|
|
929
|
+
"nature": "Natureza",
|
|
930
|
+
"people": "Pessoas",
|
|
931
|
+
"plants": "Plantas",
|
|
932
|
+
"sky": "Céu",
|
|
933
|
+
"sunrise": "Nascer do sol"
|
|
934
|
+
},
|
|
923
935
|
"poweredBy": "Assegurado por",
|
|
924
936
|
"emptyState": "Seu navegador não aceita vídeos incorporados.",
|
|
925
937
|
"loadMoreVideos": "Carregar mais vídeos",
|
|
926
|
-
"supported": "Seu navegador não aceita vídeos incorporados."
|
|
938
|
+
"supported": "Seu navegador não aceita vídeos incorporados.",
|
|
939
|
+
"limitMessage": "Você atingiu o limite de vídeos. Cada site permite até {{ videoLimit }} vídeos – remova um para adicionar outro."
|
|
927
940
|
}
|
|
928
941
|
}
|