@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.
Files changed (131) hide show
  1. package/lib/src/{CreatedOnBrandCrowd-de-de-D3t60Z73.js → CreatedOnBrandCrowd-de-de-Cas8PeTT.js} +1 -1
  2. package/lib/src/{CreatedOnBrandCrowd-en-us-Cewj15yq.js → CreatedOnBrandCrowd-en-us-B7MbiBHY.js} +1 -1
  3. package/lib/src/{CreatedOnBrandCrowd-es-es-Bw58VPNx.js → CreatedOnBrandCrowd-es-es-Cz5-KuOu.js} +1 -1
  4. package/lib/src/{CreatedOnBrandCrowd-fr-fr-CxSCS2cD.js → CreatedOnBrandCrowd-fr-fr-Ck-2cfKr.js} +1 -1
  5. package/lib/src/{CreatedOnBrandCrowd-pt-pt-DA6ISEa6.js → CreatedOnBrandCrowd-pt-pt-9Q-cAf-I.js} +1 -1
  6. package/lib/src/{CreatedOnDcom-de-de-BCc5tNd0.js → CreatedOnDcom-de-de-DsxBVWnF.js} +1 -1
  7. package/lib/src/{CreatedOnDcom-en-us-B81q6Uaf.js → CreatedOnDcom-en-us-B8JtMCvZ.js} +1 -1
  8. package/lib/src/{CreatedOnDcom-es-es-9BUXweOj.js → CreatedOnDcom-es-es-psBzGFlu.js} +1 -1
  9. package/lib/src/{CreatedOnDcom-fr-fr-Du01yNDg.js → CreatedOnDcom-fr-fr-CtRvvcJ8.js} +1 -1
  10. package/lib/src/{CreatedOnDcom-pt-pt-CdiSwYCz.js → CreatedOnDcom-pt-pt-BHGHfKvP.js} +1 -1
  11. package/lib/src/brand-page/components/background-shape/BackgroundShape.mixin.d.ts +3 -1
  12. package/lib/src/brand-page/components/background-shape/BackgroundShape.mixin.js +49 -8
  13. package/lib/src/brand-page/components/banner-section/BannerSection.mixin.js +5 -9
  14. package/lib/src/brand-page/components/button/Button.mixin.js +4 -2
  15. package/lib/src/brand-page/components/media/Shape.mixin.d.ts +3 -2
  16. package/lib/src/brand-page/components/media/Shape.mixin.js +44 -11
  17. package/lib/src/brand-page/models/content.model.d.ts +1 -0
  18. package/lib/src/brand-page/models/content.model.js +1 -0
  19. package/lib/src/brand-page/models/index.d.ts +15 -0
  20. package/lib/src/brand-page/utils/content-callback-util.d.ts +2 -1
  21. package/lib/src/brand-page/utils/content-callback-util.js +3 -0
  22. package/lib/src/brand-page/utils/style.util.js +1 -1
  23. package/lib/src/brand-page/utils/svg.util.d.ts +1 -0
  24. package/lib/src/brand-page/utils/svg.util.js +3 -0
  25. package/lib/src/brand-page/utils/view-model.util.d.ts +3 -2
  26. package/lib/src/brand-page/utils/view-model.util.js +24 -1
  27. package/lib/src/brand-page/view-models.d.ts +6 -2
  28. package/lib/src/brand-page-maker/assessors/banner-section-description-visibility.assessor.d.ts +4 -4
  29. package/lib/src/brand-page-maker/assessors/banner-section-field.assessor.d.ts +4 -4
  30. package/lib/src/brand-page-maker/assessors/banner-section-field.assessor.js +2 -2
  31. package/lib/src/brand-page-maker/components/admin-logo-settings/AdminLogoSettings.mixin.d.ts +2 -2
  32. package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.d.ts +18 -18
  33. package/lib/src/brand-page-maker/components/brandpage-maker-page/BrandPageMakerPage.mixin.d.ts +21 -20
  34. package/lib/src/brand-page-maker/components/brandpage-maker-page/BrandPageMakerPage.mixin.js +3 -1
  35. package/lib/src/brand-page-maker/composables/useEventTracker.d.ts +2 -0
  36. package/lib/src/brand-page-maker/composables/useEventTracker.js +6 -0
  37. package/lib/src/brand-page-maker/constants/config-settings-constant.d.ts +2 -1
  38. package/lib/src/brand-page-maker/constants/config-settings-constant.js +102 -1
  39. package/lib/src/brand-page-maker/models/content-settings-configs.d.ts +1 -0
  40. package/lib/src/brand-page-maker/models/content-settings-configs.js +1 -0
  41. package/lib/src/brand-page-maker/models/content-settings.d.ts +2 -1
  42. package/lib/src/brand-page-maker/models/content-settings.js +28 -0
  43. package/lib/src/brand-page-maker/utils/rich-text-editor.util.js +32 -34
  44. package/lib/src/brand-page-maker/validators/field.validator.js +2 -0
  45. package/lib/src/brand-page-maker/validators/section-button.validator.d.ts +3 -3
  46. package/lib/src/bundled-translations-5b693qBQ.js +155 -0
  47. package/lib/src/{bundled-translations.de-DE-gxort83w.js → bundled-translations.de-DE-D7kUXYb_.js} +15 -15
  48. package/lib/src/{bundled-translations.es-ES-BuDFNpDO.js → bundled-translations.es-ES-De7iUZxe.js} +6 -6
  49. package/lib/src/{bundled-translations.fr-FR-B1h4iGcU.js → bundled-translations.fr-FR-BwMC0AJk.js} +23 -23
  50. package/lib/src/bundled-translations.pt-PT-Djz2-0GC.js +153 -0
  51. package/lib/src/bundles/bundled-translations.de-DE.json +5 -1
  52. package/lib/src/bundles/bundled-translations.es-ES.json +5 -1
  53. package/lib/src/bundles/bundled-translations.fr-FR.json +5 -1
  54. package/lib/src/bundles/bundled-translations.json +8 -1
  55. package/lib/src/bundles/bundled-translations.pt-PT.json +6 -2
  56. package/lib/src/composables/useTranslate.d.ts +2 -1
  57. package/lib/src/composables/useTranslate.js +2 -1
  58. package/lib/src/css/library.brand-page-brandCrowd.min.css +45 -40
  59. package/lib/src/css/library.brand-page-brandPage.min.css +45 -40
  60. package/lib/src/css/library.brand-page-designCom.min.css +45 -40
  61. package/lib/src/css/library.brand-page-preview.min.css +45 -40
  62. package/lib/src/index.mjs +176 -175
  63. package/lib/src/{lib-B-mA_0dk.js → lib-D7ssFj4E.js} +19931 -19617
  64. package/lib/src/shared/content-settings/components/booking-url-field/BookingUrlField.mixin.d.ts +6 -0
  65. package/lib/src/shared/content-settings/components/booking-url-field/BookingUrlField.mixin.js +36 -0
  66. package/lib/src/shared/content-settings/components/content-settings/ContentSettings.mixin.d.ts +21 -20
  67. package/lib/src/shared/content-settings/components/content-settings/ContentSettings.mixin.js +3 -1
  68. package/lib/src/shared/content-settings/components/content-settings/ReplaceImageSettingsForContent.mixin.d.ts +21 -21
  69. package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItem.mixin.d.ts +21 -20
  70. package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.d.ts +18 -18
  71. package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.js +1 -1
  72. package/lib/src/shared/content-settings/components/focused-content-item-settings/FocusedContentItemSettings.mixin.d.ts +18 -18
  73. package/lib/src/shared/content-settings/store/content-settings-store.d.ts +18 -18
  74. package/lib/src/shared/font-family-selector/FontFamilySelector.mixin.js +0 -8
  75. package/lib/src/shared/page-settings/components/page-settings/PageSettings.mixin.d.ts +23 -22
  76. package/lib/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.d.ts +20 -20
  77. package/lib/src/shared/publish-brand-page-with-state/PublishBrandPageModalWithState.mixin.d.ts +1 -0
  78. package/lib/src/shared/side-bar/components/SideBarTabButton.mixin.d.ts +1 -0
  79. package/lib/src/shared/style-settings/components/StyleSettings.mixin.d.ts +1 -0
  80. package/lib/src/shared/template-settings/components/TemplatesSettings.mixin.d.ts +1 -0
  81. package/lib/src/utils/validator.util.d.ts +7 -0
  82. package/lib/src/utils/validator.util.js +7 -0
  83. package/package.json +1 -1
  84. package/src/brand-page/components/background-shape/BackgroundShape.mixin.ts +64 -12
  85. package/src/brand-page/components/background-shape/BackgroundShape.vue +2 -12
  86. package/src/brand-page/components/banner-section/BannerSection.mixin.ts +8 -14
  87. package/src/brand-page/components/booking-section/BookingSection.vue +116 -0
  88. package/src/brand-page/components/button/Button.mixin.ts +8 -2
  89. package/src/brand-page/components/media/Shape.mixin.ts +56 -17
  90. package/src/brand-page/components/media/Shape.vue +0 -7
  91. package/src/brand-page/components/page/PageComponent.vue +2 -0
  92. package/src/brand-page/models/content.model.ts +1 -0
  93. package/src/brand-page/models/index.ts +16 -0
  94. package/src/brand-page/utils/content-callback-util.ts +7 -0
  95. package/src/brand-page/utils/style.util.ts +1 -1
  96. package/src/brand-page/utils/svg.util.ts +4 -0
  97. package/src/brand-page/utils/view-model.util.ts +41 -1
  98. package/src/brand-page/view-models.ts +10 -1
  99. package/src/brand-page-maker/assessors/banner-section-description-visibility.assessor.ts +7 -4
  100. package/src/brand-page-maker/assessors/banner-section-field.assessor.ts +9 -6
  101. package/src/brand-page-maker/components/brandpage-maker-page/BrandPageMakerPage.mixin.ts +3 -1
  102. package/src/brand-page-maker/components/rich-text-editor/RichTextEditor.vue +1 -1
  103. package/src/brand-page-maker/composables/useEventTracker.ts +6 -0
  104. package/src/brand-page-maker/constants/config-settings-constant.ts +108 -0
  105. package/src/brand-page-maker/models/content-settings-configs.ts +1 -0
  106. package/src/brand-page-maker/models/content-settings.ts +32 -0
  107. package/src/brand-page-maker/utils/rich-text-editor.util.ts +49 -42
  108. package/src/brand-page-maker/validators/field.validator.ts +2 -0
  109. package/src/brand-page-maker/validators/section-button.validator.ts +7 -6
  110. package/src/bundles/bundled-translations.de-DE.json +5 -1
  111. package/src/bundles/bundled-translations.es-ES.json +5 -1
  112. package/src/bundles/bundled-translations.fr-FR.json +5 -1
  113. package/src/bundles/bundled-translations.json +8 -1
  114. package/src/bundles/bundled-translations.pt-PT.json +6 -2
  115. package/src/composables/useTranslate.ts +2 -0
  116. package/src/shared/common/i18n/common.pt-PT.json +1 -1
  117. package/src/shared/content-settings/components/booking-url-field/BookingUrlField.mixin.ts +42 -0
  118. package/src/shared/content-settings/components/booking-url-field/BookingUrlField.vue +31 -0
  119. package/src/shared/content-settings/components/booking-url-field/i18n/booking-url-field.json +5 -0
  120. package/src/shared/content-settings/components/content-settings/ContentSettings.mixin.ts +3 -1
  121. package/src/shared/content-settings/components/content-settings/i18n/content-settings.de-DE.json +5 -1
  122. package/src/shared/content-settings/components/content-settings/i18n/content-settings.es-ES.json +5 -1
  123. package/src/shared/content-settings/components/content-settings/i18n/content-settings.fr-FR.json +5 -1
  124. package/src/shared/content-settings/components/content-settings/i18n/content-settings.json +5 -1
  125. package/src/shared/content-settings/components/content-settings/i18n/content-settings.pt-PT.json +5 -1
  126. package/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.ts +1 -1
  127. package/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.vue +2 -0
  128. package/src/shared/font-family-selector/FontFamilySelector.mixin.ts +0 -12
  129. package/src/utils/validator.util.ts +18 -0
  130. package/lib/src/bundled-translations-C4LWPXSH.js +0 -153
  131. package/lib/src/bundled-translations.pt-PT-DWXOT8W0.js +0 -153
@@ -1,5 +1,5 @@
1
1
  import { createElementBlock as e, openBlock as l, createStaticVNode as a } from "vue";
2
- import { _ as t } from "./lib-B-mA_0dk.js";
2
+ import { _ as t } from "./lib-D7ssFj4E.js";
3
3
  const i = {}, h = {
4
4
  width: "275",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { createElementBlock as e, openBlock as l, createStaticVNode as a } from "vue";
2
- import { _ as t } from "./lib-B-mA_0dk.js";
2
+ import { _ as t } from "./lib-D7ssFj4E.js";
3
3
  const i = {}, h = {
4
4
  width: "251",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { createElementBlock as e, openBlock as l, createStaticVNode as a } from "vue";
2
- import { _ as t } from "./lib-B-mA_0dk.js";
2
+ import { _ as t } from "./lib-D7ssFj4E.js";
3
3
  const i = {}, h = {
4
4
  width: "250",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { createElementBlock as e, openBlock as l, createStaticVNode as a } from "vue";
2
- import { _ as t } from "./lib-B-mA_0dk.js";
2
+ import { _ as t } from "./lib-D7ssFj4E.js";
3
3
  const i = {}, h = {
4
4
  width: "237",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { createElementBlock as e, openBlock as l, createStaticVNode as a } from "vue";
2
- import { _ as t } from "./lib-B-mA_0dk.js";
2
+ import { _ as t } from "./lib-D7ssFj4E.js";
3
3
  const i = {}, h = {
4
4
  width: "263",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { createElementBlock as H, openBlock as V, createStaticVNode as t } from "vue";
2
- import { _ as e } from "./lib-B-mA_0dk.js";
2
+ import { _ as e } from "./lib-D7ssFj4E.js";
3
3
  const M = {}, Z = {
4
4
  width: "242",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { createElementBlock as H, openBlock as V, createStaticVNode as t } from "vue";
2
- import { _ as e } from "./lib-B-mA_0dk.js";
2
+ import { _ as e } from "./lib-D7ssFj4E.js";
3
3
  const i = {}, M = {
4
4
  width: "231",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { createElementBlock as H, openBlock as V, createStaticVNode as t } from "vue";
2
- import { _ as e } from "./lib-B-mA_0dk.js";
2
+ import { _ as e } from "./lib-D7ssFj4E.js";
3
3
  const M = {}, Z = {
4
4
  width: "230",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { createElementBlock as H, openBlock as V, createStaticVNode as t } from "vue";
2
- import { _ as e } from "./lib-B-mA_0dk.js";
2
+ import { _ as e } from "./lib-D7ssFj4E.js";
3
3
  const i = {}, l = {
4
4
  width: "216",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { createElementBlock as H, openBlock as V, createStaticVNode as t } from "vue";
2
- import { _ as M } from "./lib-B-mA_0dk.js";
2
+ import { _ as M } from "./lib-D7ssFj4E.js";
3
3
  const Z = {}, e = {
4
4
  width: "232",
5
5
  height: "36",
@@ -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
- svgAttributes(): string;
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
- svgAttributes() {
34
- const attributes = [];
35
- if (this.isFullBackground) {
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 attributes.join(' ');
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
- this.svgData = this.svgData.replace('<svg ', `<svg ${this.svgAttributes} `);
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
- const hasButtonText = this.viewModel.buttonText && this.viewModel.buttonText.length > 0;
127
- const hasValidButtonTitle = this.viewModel.buttonViewModel?.title?.length > 0 ||
128
- (this.viewModel.buttonViewModel?.url &&
129
- isURL(this.viewModel.buttonViewModel.url));
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(): string;
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
- this.renderAsInnerHtml();
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.svgData.replace('<svg ', `<svg ${this.svgAttributes} `);
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: {
@@ -30,6 +30,7 @@ export const CONTENT_TYPES = {
30
30
  'social-links': 'social-links',
31
31
  'shapes-section': 'shapes-section',
32
32
  'shop-section': 'shop-section',
33
+ 'booking-section': 'booking-section',
33
34
  };
34
35
  export const PERSONALISATION_ROLES = {
35
36
  profile: 'profile',
@@ -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[];
@@ -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) => {
@@ -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;