@designcrowd/library.brand-page 5.12.10 → 5.12.11-ast-booking
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-D3t60Z73.js → CreatedOnBrandCrowd-de-de-Cas8PeTT.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-en-us-Cewj15yq.js → CreatedOnBrandCrowd-en-us-B7MbiBHY.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-es-es-Bw58VPNx.js → CreatedOnBrandCrowd-es-es-Cz5-KuOu.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-fr-fr-CxSCS2cD.js → CreatedOnBrandCrowd-fr-fr-Ck-2cfKr.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-pt-pt-DA6ISEa6.js → CreatedOnBrandCrowd-pt-pt-9Q-cAf-I.js} +1 -1
- package/lib/src/{CreatedOnDcom-de-de-BCc5tNd0.js → CreatedOnDcom-de-de-DsxBVWnF.js} +1 -1
- package/lib/src/{CreatedOnDcom-en-us-B81q6Uaf.js → CreatedOnDcom-en-us-B8JtMCvZ.js} +1 -1
- package/lib/src/{CreatedOnDcom-es-es-9BUXweOj.js → CreatedOnDcom-es-es-psBzGFlu.js} +1 -1
- package/lib/src/{CreatedOnDcom-fr-fr-Du01yNDg.js → CreatedOnDcom-fr-fr-CtRvvcJ8.js} +1 -1
- package/lib/src/{CreatedOnDcom-pt-pt-CdiSwYCz.js → CreatedOnDcom-pt-pt-BHGHfKvP.js} +1 -1
- package/lib/src/brand-page/components/background-shape/BackgroundShape.mixin.d.ts +3 -1
- package/lib/src/brand-page/components/background-shape/BackgroundShape.mixin.js +49 -8
- package/lib/src/brand-page/components/banner-section/BannerSection.mixin.js +5 -9
- package/lib/src/brand-page/components/button/Button.mixin.js +4 -2
- package/lib/src/brand-page/components/media/Shape.mixin.d.ts +3 -2
- package/lib/src/brand-page/components/media/Shape.mixin.js +44 -11
- package/lib/src/brand-page/models/content.model.d.ts +1 -0
- package/lib/src/brand-page/models/content.model.js +1 -0
- package/lib/src/brand-page/models/index.d.ts +15 -0
- package/lib/src/brand-page/utils/content-callback-util.d.ts +2 -1
- package/lib/src/brand-page/utils/content-callback-util.js +3 -0
- package/lib/src/brand-page/utils/style.util.js +1 -1
- package/lib/src/brand-page/utils/svg.util.d.ts +1 -0
- package/lib/src/brand-page/utils/svg.util.js +3 -0
- package/lib/src/brand-page/utils/view-model.util.d.ts +3 -2
- package/lib/src/brand-page/utils/view-model.util.js +24 -1
- package/lib/src/brand-page/view-models.d.ts +6 -2
- package/lib/src/brand-page-maker/assessors/banner-section-description-visibility.assessor.d.ts +4 -4
- package/lib/src/brand-page-maker/assessors/banner-section-field.assessor.d.ts +4 -4
- package/lib/src/brand-page-maker/assessors/banner-section-field.assessor.js +2 -2
- package/lib/src/brand-page-maker/components/admin-logo-settings/AdminLogoSettings.mixin.d.ts +2 -2
- package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.d.ts +18 -18
- package/lib/src/brand-page-maker/components/brandpage-maker-page/BrandPageMakerPage.mixin.d.ts +21 -20
- package/lib/src/brand-page-maker/components/brandpage-maker-page/BrandPageMakerPage.mixin.js +3 -1
- package/lib/src/brand-page-maker/composables/useEventTracker.d.ts +2 -0
- package/lib/src/brand-page-maker/composables/useEventTracker.js +6 -0
- package/lib/src/brand-page-maker/constants/config-settings-constant.d.ts +2 -1
- package/lib/src/brand-page-maker/constants/config-settings-constant.js +102 -1
- package/lib/src/brand-page-maker/models/content-settings-configs.d.ts +1 -0
- package/lib/src/brand-page-maker/models/content-settings-configs.js +1 -0
- package/lib/src/brand-page-maker/models/content-settings.d.ts +2 -1
- package/lib/src/brand-page-maker/models/content-settings.js +28 -0
- package/lib/src/brand-page-maker/utils/rich-text-editor.util.js +32 -34
- package/lib/src/brand-page-maker/validators/field.validator.js +2 -0
- package/lib/src/brand-page-maker/validators/section-button.validator.d.ts +3 -3
- package/lib/src/bundled-translations-5b693qBQ.js +155 -0
- package/lib/src/{bundled-translations.de-DE-gxort83w.js → bundled-translations.de-DE-D7kUXYb_.js} +15 -15
- package/lib/src/{bundled-translations.es-ES-BuDFNpDO.js → bundled-translations.es-ES-De7iUZxe.js} +6 -6
- package/lib/src/{bundled-translations.fr-FR-B1h4iGcU.js → bundled-translations.fr-FR-BwMC0AJk.js} +23 -23
- package/lib/src/bundled-translations.pt-PT-Djz2-0GC.js +153 -0
- package/lib/src/bundles/bundled-translations.de-DE.json +5 -1
- package/lib/src/bundles/bundled-translations.es-ES.json +5 -1
- package/lib/src/bundles/bundled-translations.fr-FR.json +5 -1
- package/lib/src/bundles/bundled-translations.json +8 -1
- package/lib/src/bundles/bundled-translations.pt-PT.json +6 -2
- package/lib/src/composables/useTranslate.d.ts +2 -1
- package/lib/src/composables/useTranslate.js +2 -1
- package/lib/src/css/library.brand-page-brandCrowd.min.css +45 -40
- package/lib/src/css/library.brand-page-brandPage.min.css +45 -40
- package/lib/src/css/library.brand-page-designCom.min.css +45 -40
- package/lib/src/css/library.brand-page-preview.min.css +45 -40
- package/lib/src/index.mjs +176 -175
- package/lib/src/{lib-B-mA_0dk.js → lib-D7ssFj4E.js} +19931 -19617
- package/lib/src/shared/content-settings/components/booking-url-field/BookingUrlField.mixin.d.ts +6 -0
- package/lib/src/shared/content-settings/components/booking-url-field/BookingUrlField.mixin.js +36 -0
- package/lib/src/shared/content-settings/components/content-settings/ContentSettings.mixin.d.ts +21 -20
- package/lib/src/shared/content-settings/components/content-settings/ContentSettings.mixin.js +3 -1
- package/lib/src/shared/content-settings/components/content-settings/ReplaceImageSettingsForContent.mixin.d.ts +21 -21
- package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItem.mixin.d.ts +21 -20
- package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.d.ts +18 -18
- package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.js +1 -1
- package/lib/src/shared/content-settings/components/focused-content-item-settings/FocusedContentItemSettings.mixin.d.ts +18 -18
- package/lib/src/shared/content-settings/store/content-settings-store.d.ts +18 -18
- package/lib/src/shared/font-family-selector/FontFamilySelector.mixin.js +0 -8
- package/lib/src/shared/page-settings/components/page-settings/PageSettings.mixin.d.ts +23 -22
- package/lib/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.d.ts +20 -20
- package/lib/src/shared/publish-brand-page-with-state/PublishBrandPageModalWithState.mixin.d.ts +1 -0
- package/lib/src/shared/side-bar/components/SideBarTabButton.mixin.d.ts +1 -0
- package/lib/src/shared/style-settings/components/StyleSettings.mixin.d.ts +1 -0
- package/lib/src/shared/template-settings/components/TemplatesSettings.mixin.d.ts +1 -0
- package/lib/src/utils/validator.util.d.ts +7 -0
- package/lib/src/utils/validator.util.js +7 -0
- package/package.json +1 -1
- package/src/brand-page/components/background-shape/BackgroundShape.mixin.ts +64 -12
- package/src/brand-page/components/background-shape/BackgroundShape.vue +2 -12
- package/src/brand-page/components/banner-section/BannerSection.mixin.ts +8 -14
- package/src/brand-page/components/booking-section/BookingSection.vue +116 -0
- package/src/brand-page/components/button/Button.mixin.ts +8 -2
- package/src/brand-page/components/media/Shape.mixin.ts +56 -17
- package/src/brand-page/components/media/Shape.vue +0 -7
- package/src/brand-page/components/page/PageComponent.vue +2 -0
- package/src/brand-page/models/content.model.ts +1 -0
- package/src/brand-page/models/index.ts +16 -0
- package/src/brand-page/utils/content-callback-util.ts +7 -0
- package/src/brand-page/utils/style.util.ts +1 -1
- package/src/brand-page/utils/svg.util.ts +4 -0
- package/src/brand-page/utils/view-model.util.ts +41 -1
- package/src/brand-page/view-models.ts +10 -1
- package/src/brand-page-maker/assessors/banner-section-description-visibility.assessor.ts +7 -4
- package/src/brand-page-maker/assessors/banner-section-field.assessor.ts +9 -6
- package/src/brand-page-maker/components/brandpage-maker-page/BrandPageMakerPage.mixin.ts +3 -1
- package/src/brand-page-maker/components/rich-text-editor/RichTextEditor.vue +1 -1
- package/src/brand-page-maker/composables/useEventTracker.ts +6 -0
- package/src/brand-page-maker/constants/config-settings-constant.ts +108 -0
- package/src/brand-page-maker/models/content-settings-configs.ts +1 -0
- package/src/brand-page-maker/models/content-settings.ts +32 -0
- package/src/brand-page-maker/utils/rich-text-editor.util.ts +49 -42
- package/src/brand-page-maker/validators/field.validator.ts +2 -0
- package/src/brand-page-maker/validators/section-button.validator.ts +7 -6
- package/src/bundles/bundled-translations.de-DE.json +5 -1
- package/src/bundles/bundled-translations.es-ES.json +5 -1
- package/src/bundles/bundled-translations.fr-FR.json +5 -1
- package/src/bundles/bundled-translations.json +8 -1
- package/src/bundles/bundled-translations.pt-PT.json +6 -2
- package/src/composables/useTranslate.ts +2 -0
- package/src/shared/common/i18n/common.pt-PT.json +1 -1
- package/src/shared/content-settings/components/booking-url-field/BookingUrlField.mixin.ts +42 -0
- package/src/shared/content-settings/components/booking-url-field/BookingUrlField.vue +31 -0
- package/src/shared/content-settings/components/booking-url-field/i18n/booking-url-field.json +5 -0
- package/src/shared/content-settings/components/content-settings/ContentSettings.mixin.ts +3 -1
- package/src/shared/content-settings/components/content-settings/i18n/content-settings.de-DE.json +5 -1
- package/src/shared/content-settings/components/content-settings/i18n/content-settings.es-ES.json +5 -1
- package/src/shared/content-settings/components/content-settings/i18n/content-settings.fr-FR.json +5 -1
- package/src/shared/content-settings/components/content-settings/i18n/content-settings.json +5 -1
- package/src/shared/content-settings/components/content-settings/i18n/content-settings.pt-PT.json +5 -1
- package/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.ts +1 -1
- package/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.vue +2 -0
- package/src/shared/font-family-selector/FontFamilySelector.mixin.ts +0 -12
- package/src/utils/validator.util.ts +18 -0
- package/lib/src/bundled-translations-C4LWPXSH.js +0 -153
- package/lib/src/bundled-translations.pt-PT-DWXOT8W0.js +0 -153
|
@@ -7,14 +7,16 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
|
|
|
7
7
|
};
|
|
8
8
|
}>, {}, {
|
|
9
9
|
svgData: string;
|
|
10
|
+
svgDataObjectUrl: string;
|
|
10
11
|
originalSvgData: string;
|
|
11
12
|
}, {
|
|
12
13
|
useObjectElement(): boolean;
|
|
13
14
|
backgroundShapesStyle(): BrandPageCssStyle;
|
|
14
15
|
isFullBackground(): boolean;
|
|
15
|
-
|
|
16
|
+
objectUrl(): string;
|
|
16
17
|
}, {
|
|
17
18
|
isValidSvgUrl(url: string): boolean;
|
|
19
|
+
applySvgAttributes(svgData: string): string;
|
|
18
20
|
render(): Promise<void>;
|
|
19
21
|
}, import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
20
22
|
isPreview: {
|
|
@@ -4,6 +4,7 @@ import axios from 'axios';
|
|
|
4
4
|
import { applyColorToSvgString } from '../../utils/svg-color.util';
|
|
5
5
|
import { isURL } from '../../../utils/validator.util';
|
|
6
6
|
import { PROXY_SHAPE_URL_REGEX } from '../../../brand-page/constants';
|
|
7
|
+
import { getRegexToMatchAttributeInSvgTag } from '../../../brand-page/utils/svg.util';
|
|
7
8
|
const SUPPORTED_SHAPE_HOSTS = [
|
|
8
9
|
'https://bc-user-uploads.brandcrowd.com/public',
|
|
9
10
|
'https://bcassetcdn.com/shapes',
|
|
@@ -17,7 +18,7 @@ export default defineComponent({
|
|
|
17
18
|
},
|
|
18
19
|
},
|
|
19
20
|
data() {
|
|
20
|
-
return { svgData: '', originalSvgData: '' };
|
|
21
|
+
return { svgData: '', svgDataObjectUrl: '', originalSvgData: '' };
|
|
21
22
|
},
|
|
22
23
|
computed: {
|
|
23
24
|
useObjectElement() {
|
|
@@ -30,13 +31,11 @@ export default defineComponent({
|
|
|
30
31
|
return (this.viewModel.style.width === '100%' &&
|
|
31
32
|
this.viewModel.style.height === '100%');
|
|
32
33
|
},
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
attributes.push('preserveAspectRatio="xMidYMid slice"');
|
|
37
|
-
attributes.push('style="width: 100%; height: 100%;"');
|
|
34
|
+
objectUrl() {
|
|
35
|
+
if (!this.useObjectElement) {
|
|
36
|
+
return this.svgDataObjectUrl;
|
|
38
37
|
}
|
|
39
|
-
return
|
|
38
|
+
return this.viewModel.name;
|
|
40
39
|
},
|
|
41
40
|
},
|
|
42
41
|
watch: {
|
|
@@ -61,6 +60,37 @@ export default defineComponent({
|
|
|
61
60
|
return (!!SUPPORTED_SHAPE_HOSTS.find((h) => url.startsWith(h)) &&
|
|
62
61
|
url.endsWith('.svg'));
|
|
63
62
|
},
|
|
63
|
+
applySvgAttributes(svgData) {
|
|
64
|
+
const attributes = [];
|
|
65
|
+
if (this.isFullBackground) {
|
|
66
|
+
const widthRegex = getRegexToMatchAttributeInSvgTag('width');
|
|
67
|
+
if (svgData.match(widthRegex)) {
|
|
68
|
+
svgData = svgData.replace(widthRegex, `$1width="100%"`);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
attributes.push(`width="100%"`);
|
|
72
|
+
}
|
|
73
|
+
const heightRegex = getRegexToMatchAttributeInSvgTag('height');
|
|
74
|
+
if (svgData.match(heightRegex)) {
|
|
75
|
+
svgData = svgData.replace(heightRegex, `$1height="100%"`);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
attributes.push(`height="100%"`);
|
|
79
|
+
}
|
|
80
|
+
const preserveAspectRatioRegex = getRegexToMatchAttributeInSvgTag('preserveAspectRatio');
|
|
81
|
+
if (svgData.match(preserveAspectRatioRegex)) {
|
|
82
|
+
svgData = svgData.replace(preserveAspectRatioRegex, `$1preserveAspectRatio="xMidYMid slice"`);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
attributes.push(`preserveAspectRatio="xMidYMid slice"`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
const svgAttributes = attributes.join(' ');
|
|
89
|
+
if (svgAttributes) {
|
|
90
|
+
svgData = svgData.replace('<svg ', `<svg ${svgAttributes} `);
|
|
91
|
+
}
|
|
92
|
+
return svgData;
|
|
93
|
+
},
|
|
64
94
|
async render() {
|
|
65
95
|
if (this.useObjectElement) {
|
|
66
96
|
return;
|
|
@@ -77,7 +107,18 @@ export default defineComponent({
|
|
|
77
107
|
if (this.viewModel.style.color) {
|
|
78
108
|
this.svgData = applyColorToSvgString(this.originalSvgData, this.viewModel.style.color);
|
|
79
109
|
}
|
|
80
|
-
|
|
110
|
+
else {
|
|
111
|
+
this.svgData = this.originalSvgData;
|
|
112
|
+
}
|
|
113
|
+
this.svgData = this.applySvgAttributes(this.svgData);
|
|
114
|
+
const blob = new Blob([this.svgData], { type: 'image/svg+xml' });
|
|
115
|
+
const oldSvgDataObjectUrl = this.svgDataObjectUrl;
|
|
116
|
+
// Create an Object URL
|
|
117
|
+
this.svgDataObjectUrl = URL.createObjectURL(blob);
|
|
118
|
+
if (oldSvgDataObjectUrl) {
|
|
119
|
+
// clean up previous Object URL
|
|
120
|
+
URL.revokeObjectURL(oldSvgDataObjectUrl);
|
|
121
|
+
}
|
|
81
122
|
},
|
|
82
123
|
},
|
|
83
124
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { defineComponent } from 'vue';
|
|
2
2
|
import ComponentCommonMixin from '../mixins/component-common.mixin';
|
|
3
|
-
import { isURL } from '../../../utils/validator.util';
|
|
3
|
+
import { isURL, hasValidButton as shouldShowButtonUtil, } from '../../../utils/validator.util';
|
|
4
4
|
import { ALIGN_CENTERED, ALIGN_LEFT_ALIGNED, ALIGN_RIGHT_ALIGNED, BIG_IMAGE, ALIGN_LEFT_BIG_IMAGE, ALIGN_RIGHT_FULL_IMAGE, ALIGN_LEFT_FULL_IMAGE, ALIGN_CARD_CENTER_IMAGE, ALIGN_CARD_LEFT_IMAGE, } from '../../constants';
|
|
5
5
|
import { getRenderText, escapeContentText } from '../../utils';
|
|
6
6
|
import { hasRTEContent } from '../../../brand-page-maker/utils';
|
|
@@ -123,14 +123,10 @@ export default defineComponent({
|
|
|
123
123
|
return buttonViewModel;
|
|
124
124
|
},
|
|
125
125
|
shouldShowButton() {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
if (hasButtonText && hasValidButtonTitle) {
|
|
131
|
-
return true;
|
|
132
|
-
}
|
|
133
|
-
return false;
|
|
126
|
+
return shouldShowButtonUtil({
|
|
127
|
+
buttonText: this.viewModel.buttonText,
|
|
128
|
+
buttonViewModel: this.viewModel.buttonViewModel,
|
|
129
|
+
});
|
|
134
130
|
},
|
|
135
131
|
isHorizontalAligned() {
|
|
136
132
|
return (this.viewModel.displayStyle === ALIGN_LEFT_ALIGNED ||
|
|
@@ -109,7 +109,8 @@ export default defineComponent({
|
|
|
109
109
|
return this.url;
|
|
110
110
|
},
|
|
111
111
|
isValidUrl() {
|
|
112
|
-
if (this.viewModel.role === 'banner-section'
|
|
112
|
+
if (this.viewModel.role === 'banner-section' ||
|
|
113
|
+
this.viewModel.role === 'booking-section') {
|
|
113
114
|
switch (this.viewModel.buttonLinkType) {
|
|
114
115
|
case 'mailTo':
|
|
115
116
|
return isEmail(this.viewModel.url);
|
|
@@ -129,7 +130,8 @@ export default defineComponent({
|
|
|
129
130
|
}
|
|
130
131
|
},
|
|
131
132
|
url() {
|
|
132
|
-
if (this.viewModel.role === 'banner-section'
|
|
133
|
+
if (this.viewModel.role === 'banner-section' ||
|
|
134
|
+
this.viewModel.role === 'booking-section') {
|
|
133
135
|
switch (this.viewModel.buttonLinkType) {
|
|
134
136
|
case 'mailTo':
|
|
135
137
|
return `mailto:${this.viewModel.url}`;
|
|
@@ -26,6 +26,7 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
|
|
|
26
26
|
};
|
|
27
27
|
}>, {}, {
|
|
28
28
|
svgData: string;
|
|
29
|
+
svgDataObjectUrl: string;
|
|
29
30
|
originalSvgData: string;
|
|
30
31
|
}, {
|
|
31
32
|
useObjectElement(): boolean;
|
|
@@ -36,9 +37,9 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
|
|
|
36
37
|
width: any;
|
|
37
38
|
height: any;
|
|
38
39
|
};
|
|
39
|
-
objectUrl():
|
|
40
|
-
svgAttributes(): string;
|
|
40
|
+
objectUrl(): any;
|
|
41
41
|
}, {
|
|
42
|
+
applySvgAttributes(svgData: string): string;
|
|
42
43
|
renderAsInnerHtml(): Promise<void>;
|
|
43
44
|
}, import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
44
45
|
isPreview: {
|
|
@@ -3,6 +3,7 @@ import ComponentCommonMixin from '../mixins/component-common.mixin';
|
|
|
3
3
|
import axios from 'axios';
|
|
4
4
|
import { applyColorReplacementsToSvgString } from '../../utils/svg-color.util';
|
|
5
5
|
import { PROXY_SHAPE_URL_REGEX } from '../../../brand-page/constants';
|
|
6
|
+
import { getRegexToMatchAttributeInSvgTag } from '../../../brand-page/utils/svg.util';
|
|
6
7
|
export default defineComponent({
|
|
7
8
|
mixins: [ComponentCommonMixin],
|
|
8
9
|
props: {
|
|
@@ -31,7 +32,7 @@ export default defineComponent({
|
|
|
31
32
|
},
|
|
32
33
|
},
|
|
33
34
|
data() {
|
|
34
|
-
return { svgData: '', originalSvgData: '' };
|
|
35
|
+
return { svgData: '', svgDataObjectUrl: '', originalSvgData: '' };
|
|
35
36
|
},
|
|
36
37
|
computed: {
|
|
37
38
|
useObjectElement() {
|
|
@@ -47,6 +48,9 @@ export default defineComponent({
|
|
|
47
48
|
};
|
|
48
49
|
},
|
|
49
50
|
objectUrl() {
|
|
51
|
+
if (!this.useObjectElement) {
|
|
52
|
+
return this.svgDataObjectUrl;
|
|
53
|
+
}
|
|
50
54
|
let dimensionQuery = ``;
|
|
51
55
|
if (this.size) {
|
|
52
56
|
const encodedSize = encodeURIComponent(this.size);
|
|
@@ -54,18 +58,15 @@ export default defineComponent({
|
|
|
54
58
|
}
|
|
55
59
|
return `${this.imageUrl}${dimensionQuery}`;
|
|
56
60
|
},
|
|
57
|
-
svgAttributes() {
|
|
58
|
-
const attributes = [];
|
|
59
|
-
if (this.size) {
|
|
60
|
-
attributes.push(`height=${this.size} width=${this.size}`);
|
|
61
|
-
}
|
|
62
|
-
return attributes.join(' ');
|
|
63
|
-
},
|
|
64
61
|
},
|
|
65
62
|
watch: {
|
|
66
63
|
colorReplacements: {
|
|
67
|
-
handler() {
|
|
68
|
-
|
|
64
|
+
handler(newVal, oldVal) {
|
|
65
|
+
if (newVal &&
|
|
66
|
+
oldVal &&
|
|
67
|
+
JSON.stringify(newVal) !== JSON.stringify(oldVal)) {
|
|
68
|
+
this.renderAsInnerHtml();
|
|
69
|
+
}
|
|
69
70
|
},
|
|
70
71
|
deep: true,
|
|
71
72
|
},
|
|
@@ -101,12 +102,44 @@ export default defineComponent({
|
|
|
101
102
|
}
|
|
102
103
|
},
|
|
103
104
|
methods: {
|
|
105
|
+
applySvgAttributes(svgData) {
|
|
106
|
+
const attributes = [];
|
|
107
|
+
if (this.size) {
|
|
108
|
+
const widthRegex = getRegexToMatchAttributeInSvgTag('width');
|
|
109
|
+
if (svgData.match(widthRegex)) {
|
|
110
|
+
svgData = svgData.replace(widthRegex, `$1width="${this.size}"`);
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
attributes.push(`width="${this.size}"`);
|
|
114
|
+
}
|
|
115
|
+
const heightRegex = getRegexToMatchAttributeInSvgTag('height');
|
|
116
|
+
if (svgData.match(heightRegex)) {
|
|
117
|
+
svgData = svgData.replace(heightRegex, `$1height="${this.size}"`);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
attributes.push(`height="${this.size}"`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
const svgAttributes = attributes.join(' ');
|
|
124
|
+
if (svgAttributes) {
|
|
125
|
+
svgData = svgData.replace('<svg ', `<svg ${svgAttributes} `);
|
|
126
|
+
}
|
|
127
|
+
return svgData;
|
|
128
|
+
},
|
|
104
129
|
async renderAsInnerHtml() {
|
|
105
130
|
if (!this.originalSvgData) {
|
|
106
131
|
return;
|
|
107
132
|
}
|
|
108
133
|
this.svgData = applyColorReplacementsToSvgString(this.originalSvgData, this.colorReplacements);
|
|
109
|
-
this.svgData = this.
|
|
134
|
+
this.svgData = this.applySvgAttributes(this.svgData);
|
|
135
|
+
const blob = new Blob([this.svgData], { type: 'image/svg+xml' });
|
|
136
|
+
const oldSvgDataObjectUrl = this.svgDataObjectUrl;
|
|
137
|
+
// Create an Object URL
|
|
138
|
+
this.svgDataObjectUrl = URL.createObjectURL(blob);
|
|
139
|
+
if (oldSvgDataObjectUrl) {
|
|
140
|
+
// clean up previous Object URL
|
|
141
|
+
URL.revokeObjectURL(oldSvgDataObjectUrl);
|
|
142
|
+
}
|
|
110
143
|
},
|
|
111
144
|
},
|
|
112
145
|
});
|
|
@@ -30,6 +30,7 @@ export declare const CONTENT_TYPES: {
|
|
|
30
30
|
readonly 'social-links': "social-links";
|
|
31
31
|
readonly 'shapes-section': "shapes-section";
|
|
32
32
|
readonly 'shop-section': "shop-section";
|
|
33
|
+
readonly 'booking-section': "booking-section";
|
|
33
34
|
};
|
|
34
35
|
export type ContentType = keyof typeof CONTENT_TYPES;
|
|
35
36
|
export declare const PERSONALISATION_ROLES: {
|
|
@@ -409,6 +409,21 @@ export interface DividerSectionContent extends Content {
|
|
|
409
409
|
dividerColor: BrandPageCssStyle;
|
|
410
410
|
backgroundStyle?: BrandPageCssStyle;
|
|
411
411
|
}
|
|
412
|
+
export interface BookingSectionContent extends Content {
|
|
413
|
+
type: 'booking-section';
|
|
414
|
+
title: string;
|
|
415
|
+
description: string;
|
|
416
|
+
buttonText: string;
|
|
417
|
+
url: string;
|
|
418
|
+
email?: string;
|
|
419
|
+
tel?: string;
|
|
420
|
+
titleStyle: TextStyleDeclaration;
|
|
421
|
+
descriptionStyle: TextStyleDeclaration;
|
|
422
|
+
backgroundStyle: BrandPageCssStyle;
|
|
423
|
+
pageSlug: string;
|
|
424
|
+
buttonLinkType: ButtonLinkType;
|
|
425
|
+
buttonTextStyle: TextStyleDeclaration;
|
|
426
|
+
}
|
|
412
427
|
export declare class PageModel {
|
|
413
428
|
title: string;
|
|
414
429
|
slug: string;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ProfileContent, TextContent, ContactFormContent, ImageContent, BannerSectionContent, SocialLinksContent, ImageGalleryContent, TestimonialSectionContent, AboutSectionContent, ImagesSectionContent, MailingListContent, SupportMeContent, RequestPaymentContent, ShapesSectionContent, ShopContent, ButtonContent, PageModel } from '../models';
|
|
1
|
+
import type { ProfileContent, TextContent, ContactFormContent, ImageContent, BannerSectionContent, SocialLinksContent, ImageGalleryContent, TestimonialSectionContent, AboutSectionContent, ImagesSectionContent, MailingListContent, SupportMeContent, RequestPaymentContent, ShapesSectionContent, ShopContent, ButtonContent, PageModel, BookingSectionContent } from '../models';
|
|
2
2
|
export type ContentCallback = {
|
|
3
3
|
profileContentCallback: (content: ProfileContent) => void;
|
|
4
4
|
textContentCallback: (content: TextContent) => void;
|
|
@@ -16,5 +16,6 @@ export type ContentCallback = {
|
|
|
16
16
|
shapesSectionContentCallback: (content: ShapesSectionContent) => void;
|
|
17
17
|
shopSectionContentCallback: (content: ShopContent) => void;
|
|
18
18
|
buttonContentCallback: (content: ButtonContent) => void;
|
|
19
|
+
bookingSectionContentCallback: (content: BookingSectionContent) => void;
|
|
19
20
|
};
|
|
20
21
|
export declare const forEachPageCallContentCallback: (page: PageModel, callbacks: ContentCallback) => void;
|
|
@@ -46,6 +46,9 @@ export const forEachPageCallContentCallback = (page, callbacks) => {
|
|
|
46
46
|
case 'shop-section':
|
|
47
47
|
callbacks.shopSectionContentCallback(content);
|
|
48
48
|
break;
|
|
49
|
+
case 'booking-section':
|
|
50
|
+
callbacks.bookingSectionContentCallback(content);
|
|
51
|
+
break;
|
|
49
52
|
case 'general-link':
|
|
50
53
|
case 'website':
|
|
51
54
|
case 'email':
|
|
@@ -199,7 +199,7 @@ const CONTENT_STYLE_PROP_NAME_SUFFIX = [
|
|
|
199
199
|
'Color',
|
|
200
200
|
'Replacements',
|
|
201
201
|
];
|
|
202
|
-
const RTE_ALLOWED_SECTION_TYPES = ['text', 'banner-section'];
|
|
202
|
+
const RTE_ALLOWED_SECTION_TYPES = ['text', 'banner-section', 'booking-section'];
|
|
203
203
|
const RTE_ALLOWED_FIELDS = ['title', 'description', 'text', 'textItems'];
|
|
204
204
|
export const applyLogoThemeToContents = (logoTheme, pages) => {
|
|
205
205
|
let isModified = false;
|
|
@@ -5,3 +5,4 @@ export declare const normaliseSvgData: (svgData: string) => string;
|
|
|
5
5
|
export declare const setSvgCssStyle: (svgData: string, cssStyle: string) => string;
|
|
6
6
|
/** svg linear gradient is shared across the DOM, append unique suffix to avoid conflict issue */
|
|
7
7
|
export declare const appendSvgIdSuffix: (svgData: string, svgIdSuffix: string) => string;
|
|
8
|
+
export declare const getRegexToMatchAttributeInSvgTag: (attribute: string) => RegExp;
|
|
@@ -21,3 +21,6 @@ export const setSvgCssStyle = (svgData, cssStyle) => {
|
|
|
21
21
|
export const appendSvgIdSuffix = (svgData, svgIdSuffix) => {
|
|
22
22
|
return svgData.replace(/(SVGID(?:_\d+)+)/g, `$1_${svgIdSuffix}`);
|
|
23
23
|
};
|
|
24
|
+
export const getRegexToMatchAttributeInSvgTag = (attribute) => {
|
|
25
|
+
return new RegExp(`(<svg\\b[^>]*?)${attribute}="[^"]*"`, 'i');
|
|
26
|
+
};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { ImageContent, ProfileContent, TextContent, PageStyles, Content, BrandPageModel, ImageGalleryContent, GalleryStyles, BannerSectionContent, ImagesSectionContent, BrandPageType, PageHeaderDesktop, PageFooterDesktop, PageFooterMobile, PageHeaderMobile, LogoImageModel, LogoTemplateImageModel } from '../models';
|
|
2
|
-
import type { ImageViewModel, LogoViewModel, ProfileViewModel, TextViewModel, ContentViewModel, BrandPageViewModel, ImageGalleryViewModel, PageViewModel, BannerSectionViewModel, PageHeaderViewModel, PageFooterViewModel, TextImageSectionViewModel } from '../view-models';
|
|
1
|
+
import type { ImageContent, ProfileContent, TextContent, PageStyles, Content, BrandPageModel, ImageGalleryContent, GalleryStyles, BannerSectionContent, ImagesSectionContent, BrandPageType, PageHeaderDesktop, PageFooterDesktop, PageFooterMobile, PageHeaderMobile, LogoImageModel, LogoTemplateImageModel, BookingSectionContent } from '../models';
|
|
2
|
+
import type { ImageViewModel, LogoViewModel, ProfileViewModel, TextViewModel, ContentViewModel, BrandPageViewModel, ImageGalleryViewModel, PageViewModel, BannerSectionViewModel, PageHeaderViewModel, PageFooterViewModel, TextImageSectionViewModel, BookingSectionViewModel } from '../view-models';
|
|
3
3
|
export declare const applyViewModelTextStyles: <T extends ContentViewModel>(content: T, styles: PageStyles) => T;
|
|
4
4
|
export declare const mapToImageViewModel: (content: ImageContent) => ImageViewModel;
|
|
5
5
|
export declare const mapToImageGalleryViewModel: (content: ImageGalleryContent, globalStyles: GalleryStyles) => ImageGalleryViewModel;
|
|
@@ -7,6 +7,7 @@ export declare const mapToProfileViewModel: (content: ProfileContent, styles: Pa
|
|
|
7
7
|
export declare const mapToTextViewModel: (content: TextContent, styles: PageStyles, brandPageType: BrandPageType) => TextViewModel;
|
|
8
8
|
export declare const mapToBannerSectionViewModel: (content: BannerSectionContent, styles: PageStyles) => BannerSectionViewModel;
|
|
9
9
|
export declare const mapToImagesSectionViewModel: (content: ImagesSectionContent, styles: PageStyles, brandPageType: BrandPageType) => TextImageSectionViewModel;
|
|
10
|
+
export declare const mapToBookingSectionViewModel: (content: BookingSectionContent, styles: PageStyles) => BookingSectionViewModel;
|
|
10
11
|
export declare const mapToPageHeaderViewModel: (pageHeader: PageHeaderDesktop | PageHeaderMobile, pageStyles: PageStyles, pages: PageViewModel[]) => PageHeaderViewModel;
|
|
11
12
|
export declare const mapToPageFooterViewModel: (pageFooter: PageFooterDesktop | PageFooterMobile, pageStyles: PageStyles) => PageFooterViewModel;
|
|
12
13
|
export declare const mapToViewModel: (styles: PageStyles, brandPageType: BrandPageType) => (content: Content) => ContentViewModel | undefined;
|
|
@@ -234,7 +234,7 @@ const mapToButtonViewModel = (content, styles, options) => {
|
|
|
234
234
|
}
|
|
235
235
|
},
|
|
236
236
|
buttonLinkType: BUTTON_LINK_TYPE.url,
|
|
237
|
-
pageSlug: '',
|
|
237
|
+
pageSlug: content.page || '',
|
|
238
238
|
}, styles);
|
|
239
239
|
};
|
|
240
240
|
export const mapToProfileViewModel = (content, styles) => {
|
|
@@ -507,6 +507,27 @@ const mapToSocialLinksViewModel = (content, styles, brandPageType) => {
|
|
|
507
507
|
isFullWidth: brandPageType === BRAND_PAGE_TYPES.brandSite,
|
|
508
508
|
}, styles);
|
|
509
509
|
};
|
|
510
|
+
export const mapToBookingSectionViewModel = (content, styles) => {
|
|
511
|
+
return applyViewModelTextStyles({
|
|
512
|
+
...content,
|
|
513
|
+
role: content.type,
|
|
514
|
+
type: 'booking-section',
|
|
515
|
+
buttonViewModel: mapToButtonViewModel({
|
|
516
|
+
...content,
|
|
517
|
+
clickActionField: 'url',
|
|
518
|
+
iconUrl: '',
|
|
519
|
+
modalImageUrl: '',
|
|
520
|
+
url: content.url,
|
|
521
|
+
title: content.buttonText || '',
|
|
522
|
+
page: content.pageSlug || '',
|
|
523
|
+
colorReplacements: [],
|
|
524
|
+
titleStyle: content.buttonTextStyle,
|
|
525
|
+
}, styles, {
|
|
526
|
+
titleStyle: content.buttonTextStyle,
|
|
527
|
+
}),
|
|
528
|
+
isFullWidth: true,
|
|
529
|
+
}, styles);
|
|
530
|
+
};
|
|
510
531
|
export const mapToPageHeaderViewModel = (pageHeader, pageStyles, pages) => {
|
|
511
532
|
const viewport = pageHeader.viewport;
|
|
512
533
|
const logoContent = {
|
|
@@ -619,6 +640,8 @@ export const mapToViewModel = (styles, brandPageType) => (content) => {
|
|
|
619
640
|
return mapToContactFormViewModel(content, styles, brandPageType);
|
|
620
641
|
case 'banner-section':
|
|
621
642
|
return mapToBannerSectionViewModel(content, styles);
|
|
643
|
+
case 'booking-section':
|
|
644
|
+
return mapToBookingSectionViewModel(content, styles);
|
|
622
645
|
case 'about-section':
|
|
623
646
|
return mapToAboutSectionViewModel(content, styles);
|
|
624
647
|
case 'images-section':
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { PageStyles, ButtonWithModalContent, ProfileContent, TextContent, VideoContent, ImageContent, ContentType, ButtonStyles, LogoStyles, MapContent, ImageGalleryContent, GalleryStyles, MailingListContent, RequestPaymentContent, ShopContent, SupportMeContent, ContactFormContent, BannerSectionContent, BrandPageType, SocialLinksContent, TestimonialSectionContent, AboutSectionContent, DividerSectionContent, ShapesSectionContent, ButtonLinkType, PageHeaderMobile, PageHeaderDesktop, PageFooterMobile, PageFooterDesktop, TextMediaItem, TextStyleDeclaration, AspectRatio, LogoImageModel, LogoTemplateImageModel, CookieOptions } from './models';
|
|
1
|
+
import type { PageStyles, ButtonWithModalContent, ProfileContent, TextContent, VideoContent, ImageContent, ContentType, ButtonStyles, LogoStyles, MapContent, ImageGalleryContent, GalleryStyles, MailingListContent, RequestPaymentContent, ShopContent, SupportMeContent, ContactFormContent, BannerSectionContent, BrandPageType, SocialLinksContent, TestimonialSectionContent, AboutSectionContent, DividerSectionContent, ShapesSectionContent, ButtonLinkType, PageHeaderMobile, PageHeaderDesktop, PageFooterMobile, PageFooterDesktop, TextMediaItem, TextStyleDeclaration, AspectRatio, LogoImageModel, LogoTemplateImageModel, CookieOptions, BookingSectionContent } from './models';
|
|
2
2
|
import type { ImagesSectionContentDisplayStyle } from './constants';
|
|
3
|
-
export type ViewModelType = 'button' | 'image' | 'image-gallery' | 'logo' | 'map' | 'mailing-list' | 'profile' | 'support-me' | 'request-payment' | 'text' | 'video' | 'contact-form' | 'banner-section' | 'images-section' | 'about-section' | 'divider-section' | 'testimonial-section' | 'social-links' | 'shapes-section' | 'shop-section';
|
|
3
|
+
export type ViewModelType = 'button' | 'image' | 'image-gallery' | 'logo' | 'map' | 'mailing-list' | 'profile' | 'support-me' | 'request-payment' | 'text' | 'video' | 'contact-form' | 'banner-section' | 'images-section' | 'about-section' | 'divider-section' | 'testimonial-section' | 'social-links' | 'shapes-section' | 'shop-section' | 'booking-section';
|
|
4
4
|
export interface ContentViewModel {
|
|
5
5
|
id: string;
|
|
6
6
|
type: ViewModelType;
|
|
@@ -96,6 +96,10 @@ export interface SocialLinksViewModel extends ContentViewModel, Omit<SocialLinks
|
|
|
96
96
|
export interface DividerSectionViewModel extends ContentViewModel, Omit<DividerSectionContent, 'type'> {
|
|
97
97
|
isFullWidth: boolean;
|
|
98
98
|
}
|
|
99
|
+
export interface BookingSectionViewModel extends ContentViewModel, Omit<BookingSectionContent, 'type'> {
|
|
100
|
+
buttonViewModel: ButtonViewModel;
|
|
101
|
+
isFullWidth: boolean;
|
|
102
|
+
}
|
|
99
103
|
export interface PageHeaderViewModel extends Omit<PageHeaderDesktop | PageHeaderMobile, 'logoImage' | 'logoImageStyle' | 'isLogoOptional' | 'viewport' | 'isLogoVisible' | 'logoTemplateImage' | 'logoImageHeight' | 'logoImageWidth'> {
|
|
100
104
|
logo: LogoViewModel;
|
|
101
105
|
pages: PageViewModel[];
|
package/lib/src/brand-page-maker/assessors/banner-section-description-visibility.assessor.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { BannerSectionContent } from '../../brand-page';
|
|
1
|
+
import type { BannerSectionContent, BookingSectionContent } from '../../brand-page';
|
|
2
2
|
import type { VisibilityAssessor } from '../models';
|
|
3
|
-
export declare const bannerSectionUrlVisibilityAssessor: VisibilityAssessor<BannerSectionContent | undefined>;
|
|
4
|
-
export declare const bannerSectionPageVisibilityAssessor: VisibilityAssessor<BannerSectionContent | undefined>;
|
|
5
|
-
export declare const bannerLinkTypeVisibilityAssessor: VisibilityAssessor<BannerSectionContent | undefined>;
|
|
3
|
+
export declare const bannerSectionUrlVisibilityAssessor: VisibilityAssessor<BannerSectionContent | BookingSectionContent | undefined>;
|
|
4
|
+
export declare const bannerSectionPageVisibilityAssessor: VisibilityAssessor<BannerSectionContent | BookingSectionContent | undefined>;
|
|
5
|
+
export declare const bannerLinkTypeVisibilityAssessor: VisibilityAssessor<BannerSectionContent | BookingSectionContent | undefined>;
|
|
6
6
|
export declare const bannerDisplayTypeVisibilityAssessor: VisibilityAssessor<BannerSectionContent | undefined>;
|
|
7
7
|
export declare const bannerOverlayOptionsVisibilityAssessor: VisibilityAssessor<BannerSectionContent>;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { BannerSectionContent } from '../../brand-page';
|
|
1
|
+
import type { BannerSectionContent, BookingSectionContent } from '../../brand-page';
|
|
2
2
|
import type { FieldTypeAssessor, PlaceholderTypeAssessor } from '../models';
|
|
3
|
-
export declare const bannerSectionFieldTypeAssessor: FieldTypeAssessor<BannerSectionContent | undefined>;
|
|
4
|
-
export declare const bannerSectionRoleTypeAssessor: FieldTypeAssessor<BannerSectionContent | undefined>;
|
|
5
|
-
export declare const bannerPlaceholderFieldTypeAssessor: PlaceholderTypeAssessor<BannerSectionContent | undefined>;
|
|
3
|
+
export declare const bannerSectionFieldTypeAssessor: FieldTypeAssessor<BannerSectionContent | BookingSectionContent | undefined>;
|
|
4
|
+
export declare const bannerSectionRoleTypeAssessor: FieldTypeAssessor<BannerSectionContent | BookingSectionContent | undefined>;
|
|
5
|
+
export declare const bannerPlaceholderFieldTypeAssessor: PlaceholderTypeAssessor<BannerSectionContent | BookingSectionContent | undefined>;
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
export const bannerSectionFieldTypeAssessor = (content) => {
|
|
2
2
|
switch (content?.buttonLinkType) {
|
|
3
3
|
case 'url':
|
|
4
|
-
return 'url';
|
|
4
|
+
return content?.type === 'booking-section' ? 'booking-url' : 'url';
|
|
5
5
|
case 'mailTo':
|
|
6
6
|
return 'email';
|
|
7
7
|
case 'tel':
|
|
8
8
|
return 'tel';
|
|
9
9
|
default:
|
|
10
|
-
return 'url';
|
|
10
|
+
return 'booking-url';
|
|
11
11
|
}
|
|
12
12
|
};
|
|
13
13
|
export const bannerSectionRoleTypeAssessor = (content) => {
|
package/lib/src/brand-page-maker/components/admin-logo-settings/AdminLogoSettings.mixin.d.ts
CHANGED
|
@@ -2,11 +2,11 @@ declare const _default: import("vue").DefineComponent<{}, {
|
|
|
2
2
|
templates: import("vue").ComputedRef<import("../../stores/admin-logo-settings").AdminPreviewLogoTemplateTemplate[]>;
|
|
3
3
|
items: import("vue").ComputedRef<{
|
|
4
4
|
id: string;
|
|
5
|
-
type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "instagram" | "youtube" | "linkedin" | "pinterest" | "twitch" | "tiktok" | "map" | "image-gallery" | "mailing-list" | "request-payment" | "support-me" | "contact-form" | "banner-section" | "about-section" | "divider-section" | "images-section" | "testimonial-section" | "social-links" | "shapes-section" | "shop-section";
|
|
5
|
+
type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "instagram" | "youtube" | "linkedin" | "pinterest" | "twitch" | "tiktok" | "map" | "image-gallery" | "mailing-list" | "request-payment" | "support-me" | "contact-form" | "banner-section" | "about-section" | "divider-section" | "images-section" | "testimonial-section" | "social-links" | "shapes-section" | "shop-section" | "booking-section";
|
|
6
6
|
settings: {
|
|
7
7
|
content: {
|
|
8
8
|
id: string;
|
|
9
|
-
type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "instagram" | "youtube" | "linkedin" | "pinterest" | "twitch" | "tiktok" | "map" | "image-gallery" | "mailing-list" | "request-payment" | "support-me" | "contact-form" | "banner-section" | "about-section" | "divider-section" | "images-section" | "testimonial-section" | "social-links" | "shapes-section" | "shop-section";
|
|
9
|
+
type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "instagram" | "youtube" | "linkedin" | "pinterest" | "twitch" | "tiktok" | "map" | "image-gallery" | "mailing-list" | "request-payment" | "support-me" | "contact-form" | "banner-section" | "about-section" | "divider-section" | "images-section" | "testimonial-section" | "social-links" | "shapes-section" | "shop-section" | "booking-section";
|
|
10
10
|
personalisationRole?: "website" | "email" | "phone" | "profile" | "about" | "information" | "media" | undefined;
|
|
11
11
|
imageUrlOverride?: string | undefined;
|
|
12
12
|
imageUrlsOverride?: string | undefined;
|