@designcrowd/library.brand-page 6.0.19-ast-btns-6 → 6.0.20
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-Dqv1385w.js → CreatedOnBrandCrowd-de-de-C52IyXZu.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-en-us-DuA7uGNz.js → CreatedOnBrandCrowd-en-us-DhTy_dEV.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-es-es-CaSTc5HM.js → CreatedOnBrandCrowd-es-es-BJelIAQ4.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-fr-fr-C9VKny9y.js → CreatedOnBrandCrowd-fr-ca-DwJohy0T.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-fr-ca-C9VKny9y.js → CreatedOnBrandCrowd-fr-fr-DwJohy0T.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-pt-pt-ft2V8-xm.js → CreatedOnBrandCrowd-pt-br-CMzKbxdG.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-pt-br-ft2V8-xm.js → CreatedOnBrandCrowd-pt-pt-CMzKbxdG.js} +1 -1
- package/lib/src/{CreatedOnDcom-de-de-BdZxdxoi.js → CreatedOnDcom-de-de-DAy1GHrw.js} +1 -1
- package/lib/src/{CreatedOnDcom-en-us-Dl0XbKU2.js → CreatedOnDcom-en-us-CgBDAkJN.js} +1 -1
- package/lib/src/{CreatedOnDcom-es-es-WciMRblK.js → CreatedOnDcom-es-es-Ds9d5rem.js} +1 -1
- package/lib/src/{CreatedOnDcom-fr-ca-CvjUqr4M.js → CreatedOnDcom-fr-ca-CZL0BQ-u.js} +1 -1
- package/lib/src/{CreatedOnDcom-fr-fr-CMALFpBz.js → CreatedOnDcom-fr-fr-BVYh5Wvo.js} +1 -1
- package/lib/src/{CreatedOnDcom-pt-br-C0MjZ-_y.js → CreatedOnDcom-pt-br-1hsWNXfq.js} +1 -1
- package/lib/src/{CreatedOnDcom-pt-pt-DV9I0m0I.js → CreatedOnDcom-pt-pt-DvM0N-3M.js} +1 -1
- package/lib/src/brand-page/components/collapsible/Collapsible.mixin.d.ts +0 -11
- package/lib/src/brand-page/components/collapsible/Collapsible.mixin.js +1 -13
- package/lib/src/brand-page/components/contact-form/ContactForm.mixin.d.ts +0 -1
- package/lib/src/brand-page/components/contact-form/ContactForm.mixin.js +5 -17
- package/lib/src/brand-page/components/mailing-list/MailingList.mixin.js +0 -5
- package/lib/src/brand-page/components/media/Media.mixin.d.ts +10 -1
- package/lib/src/brand-page/components/media/Media.mixin.js +13 -0
- package/lib/src/brand-page/components/page/Page.mixin.d.ts +5 -0
- package/lib/src/brand-page/components/page/Page.mixin.js +8 -1
- package/lib/src/brand-page/components/payment/Payment.mixin.js +0 -5
- package/lib/src/brand-page/models/index.d.ts +26 -35
- package/lib/src/brand-page/models/payment.model.d.ts +0 -2
- package/lib/src/brand-page/utils/button.util.d.ts +0 -5
- package/lib/src/brand-page/utils/button.util.js +0 -13
- package/lib/src/brand-page/utils/index.d.ts +1 -0
- package/lib/src/brand-page/utils/index.js +1 -0
- package/lib/src/brand-page/utils/migration.util.js +0 -30
- package/lib/src/brand-page/utils/page-heading.util.d.ts +13 -0
- package/lib/src/brand-page/utils/page-heading.util.js +24 -0
- package/lib/src/brand-page/utils/text.util.d.ts +1 -1
- package/lib/src/brand-page/utils/text.util.js +0 -32
- package/lib/src/brand-page/utils/vcard.util.js +4 -4
- package/lib/src/brand-page/utils/view-model.util.d.ts +0 -1
- package/lib/src/brand-page/utils/view-model.util.js +20 -69
- package/lib/src/brand-page/view-models.d.ts +3 -3
- package/lib/src/brand-page-maker/assessors/contact-form-visibility.assessor.d.ts +0 -1
- package/lib/src/brand-page-maker/assessors/contact-form-visibility.assessor.js +0 -6
- package/lib/src/brand-page-maker/components/brandpage-maker-page/BrandPageMakerPage.mixin.d.ts +1 -0
- package/lib/src/brand-page-maker/composables/rich-text-editor/useRichTextEditor.js +100 -21
- package/lib/src/brand-page-maker/constants/config-settings-constant.js +3 -40
- package/lib/src/brand-page-maker/default-getters/index.d.ts +0 -1
- package/lib/src/brand-page-maker/default-getters/index.js +0 -1
- package/lib/src/brand-page-maker/models/button-styles-config.js +3 -15
- package/lib/src/brand-page-maker/models/content-settings-configs.d.ts +1 -2
- package/lib/src/brand-page-maker/models/content-settings.js +3 -15
- package/lib/src/brand-page-maker/utils/index.d.ts +0 -2
- package/lib/src/brand-page-maker/utils/index.js +0 -2
- package/lib/src/brand-page-maker/utils/rich-text-editor.util.d.ts +5 -19
- package/lib/src/brand-page-maker/utils/rich-text-editor.util.js +5 -35
- package/lib/src/brand-page-maker/validators/field.validator.js +2 -10
- package/lib/src/css/library.brand-page-brandCrowd.min.css +189 -217
- package/lib/src/css/library.brand-page-brandPage.min.css +189 -217
- package/lib/src/css/library.brand-page-designCom.min.css +189 -217
- package/lib/src/css/library.brand-page-preview.min.css +189 -217
- package/lib/src/index.d.ts +0 -1
- package/lib/src/index.mjs +138 -143
- package/lib/src/{lib-CYYPMTsG.js → lib-CK2FPBv5.js} +56342 -56936
- package/lib/src/lib.js +0 -2
- package/lib/src/metadata-builder/builders/update-content-text-builder.js +15 -20
- package/lib/src/metadata-builder/builders/update-content-text-style-builder.js +3 -8
- package/lib/src/metadata-builder/helpers/rte.helpers.d.ts +2 -2
- package/lib/src/metadata-builder/helpers/rte.helpers.js +3 -6
- package/lib/src/shared/content-settings/components/GenericTextInput.mixin.js +1 -14
- package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.js +3 -17
- package/lib/src/shared/content-settings/models.d.ts +0 -1
- package/lib/src/shared/content-settings/store/content-settings-store.js +0 -3
- package/lib/src/utils/minify-brand-page-metadata.js +1 -4
- package/package.json +2 -2
- package/src/brand-page/components/about-section/AboutSection.vue +1 -1
- package/src/brand-page/components/about-section/AboutSection.vue.test.ts +11 -0
- package/src/brand-page/components/banner-section/BannerSection.vue +5 -5
- package/src/brand-page/components/booking-section/BookingSection.vue +1 -1
- package/src/brand-page/components/button/ButtonStyleWrapper.vue +44 -112
- package/src/brand-page/components/collapsible/Collapsible.mixin.ts +1 -14
- package/src/brand-page/components/contact-form/ContactForm.mixin.test.ts +0 -18
- package/src/brand-page/components/contact-form/ContactForm.mixin.ts +5 -20
- package/src/brand-page/components/contact-form/ContactForm.vue +39 -100
- package/src/brand-page/components/mailing-list/MailingList.mixin.ts +0 -6
- package/src/brand-page/components/mailing-list/MailingList.vue +11 -19
- package/src/brand-page/components/media/Media.mixin.ts +13 -0
- package/src/brand-page/components/media/Media.test.ts +65 -0
- package/src/brand-page/components/media/Media.vue +1 -1
- package/src/brand-page/components/page/Page.mixin.ts +8 -1
- package/src/brand-page/components/page/Page.vue +8 -0
- package/src/brand-page/components/page/Page.vue.test.ts +142 -0
- package/src/brand-page/components/payment/Payment.mixin.ts +0 -6
- package/src/brand-page/components/payment/Payment.vue +25 -44
- package/src/brand-page/components/payment/RequestPaymentStripe.vue +22 -26
- package/src/brand-page/components/profile/Profile.vue +1 -1
- package/src/brand-page/components/shop/Shop.vue +6 -15
- package/src/brand-page/components/social-links/SocialLinks.vue +1 -1
- package/src/brand-page/components/testimonial-section/TestimonialSection.vue +1 -1
- package/src/brand-page/components/text-media-section/TextMediaSection.vue +1 -1
- package/src/brand-page/components/text-wrapper/TextWrapper.vue +12 -18
- package/src/brand-page/models/index.ts +26 -36
- package/src/brand-page/models/payment.model.ts +0 -2
- package/src/brand-page/utils/__snapshots__/migration.util.test.ts.snap +3 -3
- package/src/brand-page/utils/button.util.ts +0 -17
- package/src/brand-page/utils/image.util.test.ts +25 -0
- package/src/brand-page/utils/index.ts +1 -0
- package/src/brand-page/utils/migration.util.ts +0 -33
- package/src/brand-page/utils/page-heading.util.test.ts +116 -0
- package/src/brand-page/utils/page-heading.util.ts +33 -0
- package/src/brand-page/utils/style.util.test.ts +0 -51
- package/src/brand-page/utils/text.util.ts +4 -43
- package/src/brand-page/utils/vcard.util.ts +4 -6
- package/src/brand-page/utils/view-model.util.ts +26 -95
- package/src/brand-page/view-models.ts +2 -3
- package/src/brand-page-maker/assessors/contact-form-visibility.assessor.ts +0 -11
- package/src/brand-page-maker/composables/rich-text-editor/useRichTextEditor.ts +107 -23
- package/src/brand-page-maker/constants/config-settings-constant.ts +2 -43
- package/src/brand-page-maker/default-getters/index.ts +0 -1
- package/src/brand-page-maker/models/button-styles-config.ts +3 -15
- package/src/brand-page-maker/models/content-settings-configs.ts +1 -4
- package/src/brand-page-maker/models/content-settings.ts +3 -16
- package/src/brand-page-maker/utils/index.ts +0 -2
- package/src/brand-page-maker/utils/rich-text-editor.util.test.ts +3 -4
- package/src/brand-page-maker/utils/rich-text-editor.util.ts +11 -50
- package/src/brand-page-maker/validators/field.validator.ts +2 -10
- package/src/lib.ts +0 -9
- package/src/metadata-builder/builders/update-content-text-builder.ts +18 -32
- package/src/metadata-builder/builders/update-content-text-style-builder.ts +4 -14
- package/src/metadata-builder/helpers/rte.helpers.ts +7 -11
- package/src/shared/content-settings/components/GenericTextInput.mixin.ts +1 -17
- package/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.ts +3 -22
- package/src/shared/content-settings/models.ts +0 -3
- package/src/shared/content-settings/store/content-settings-store.ts +0 -3
- package/src/shared/logo-settings/components/EditLogoSettings.vue +1 -0
- package/src/shared/style-settings/components/StyleSettings.vue +0 -1
- package/src/utils/minify-brand-page-metadata.ts +1 -4
- package/lib/src/brand-page/utils/migration/migration-19.d.ts +0 -2
- package/lib/src/brand-page/utils/migration/migration-19.js +0 -71
- package/lib/src/brand-page/utils/migration/migration-20.d.ts +0 -2
- package/lib/src/brand-page/utils/migration/migration-20.js +0 -28
- package/lib/src/brand-page/utils/migration/migration-21.d.ts +0 -2
- package/lib/src/brand-page/utils/migration/migration-21.js +0 -27
- package/lib/src/brand-page-maker/__fixtures__/complex-rte.fixture.d.ts +0 -22
- package/lib/src/brand-page-maker/__fixtures__/complex-rte.fixture.js +0 -22
- package/lib/src/brand-page-maker/composables/rich-text-editor/extensions/FontFamily.d.ts +0 -14
- package/lib/src/brand-page-maker/composables/rich-text-editor/extensions/FontFamily.js +0 -39
- package/lib/src/brand-page-maker/composables/rich-text-editor/getRteExtensions.d.ts +0 -28
- package/lib/src/brand-page-maker/composables/rich-text-editor/getRteExtensions.js +0 -66
- package/lib/src/brand-page-maker/default-getters/contact-form-card-color.default-getter.d.ts +0 -8
- package/lib/src/brand-page-maker/default-getters/contact-form-card-color.default-getter.js +0 -16
- package/lib/src/brand-page-maker/utils/rte-render.util.d.ts +0 -33
- package/lib/src/brand-page-maker/utils/rte-render.util.js +0 -50
- package/lib/src/brand-page-maker/utils/rte-sanitize.util.d.ts +0 -6
- package/lib/src/brand-page-maker/utils/rte-sanitize.util.js +0 -158
- package/lib/src/brand-page-maker/utils/rte-serializer.d.ts +0 -5
- package/lib/src/brand-page-maker/utils/rte-serializer.js +0 -112
- package/src/brand-page/components/button/ButtonStyleWrapper.vue.test.ts +0 -167
- package/src/brand-page/utils/migration/migration-19.test.ts +0 -72
- package/src/brand-page/utils/migration/migration-19.ts +0 -83
- package/src/brand-page/utils/migration/migration-20.test.ts +0 -115
- package/src/brand-page/utils/migration/migration-20.ts +0 -44
- package/src/brand-page/utils/migration/migration-21.test.ts +0 -112
- package/src/brand-page/utils/migration/migration-21.ts +0 -45
- package/src/brand-page/utils/text.util.test.ts +0 -47
- package/src/brand-page/utils/view-model.pageid-rte.test.ts +0 -104
- package/src/brand-page-maker/__fixtures__/complex-rte.fixture.ts +0 -23
- package/src/brand-page-maker/composables/rich-text-editor/extensions/FontFamily.test.ts +0 -52
- package/src/brand-page-maker/composables/rich-text-editor/extensions/FontFamily.ts +0 -42
- package/src/brand-page-maker/composables/rich-text-editor/getRteExtensions.ts +0 -113
- package/src/brand-page-maker/default-getters/contact-form-card-color.default-getter.ts +0 -23
- package/src/brand-page-maker/utils/__snapshots__/rte-render-parity.test.ts.snap +0 -200
- package/src/brand-page-maker/utils/rte-features.test.ts +0 -330
- package/src/brand-page-maker/utils/rte-render-parity.test.ts +0 -156
- package/src/brand-page-maker/utils/rte-render.util.ts +0 -77
- package/src/brand-page-maker/utils/rte-sanitize-json.test.ts +0 -158
- package/src/brand-page-maker/utils/rte-sanitize.util.ts +0 -195
- package/src/brand-page-maker/utils/rte-serializer.ts +0 -172
- package/src/brand-page-maker/validators/field.validator.test.ts +0 -55
|
@@ -25,11 +25,6 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
|
|
|
25
25
|
required: false;
|
|
26
26
|
default: undefined;
|
|
27
27
|
};
|
|
28
|
-
backgroundStyle: {
|
|
29
|
-
type: PropType<BrandPageCssStyle>;
|
|
30
|
-
required: false;
|
|
31
|
-
default: undefined;
|
|
32
|
-
};
|
|
33
28
|
context: {
|
|
34
29
|
type: PropType<BrandPageContext>;
|
|
35
30
|
required: true;
|
|
@@ -66,11 +61,6 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
|
|
|
66
61
|
required: false;
|
|
67
62
|
default: undefined;
|
|
68
63
|
};
|
|
69
|
-
backgroundStyle: {
|
|
70
|
-
type: PropType<BrandPageCssStyle>;
|
|
71
|
-
required: false;
|
|
72
|
-
default: undefined;
|
|
73
|
-
};
|
|
74
64
|
context: {
|
|
75
65
|
type: PropType<BrandPageContext>;
|
|
76
66
|
required: true;
|
|
@@ -78,7 +68,6 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
|
|
|
78
68
|
}>> & Readonly<{}>, {
|
|
79
69
|
titleStyle: BrandPageCssStyle;
|
|
80
70
|
cardStyle: BrandPageCssStyle;
|
|
81
|
-
backgroundStyle: BrandPageCssStyle;
|
|
82
71
|
buttonStyles: BrandPageCssStyle;
|
|
83
72
|
canCollapse: boolean;
|
|
84
73
|
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
@@ -25,11 +25,6 @@ export default defineComponent({
|
|
|
25
25
|
required: false,
|
|
26
26
|
default: undefined,
|
|
27
27
|
},
|
|
28
|
-
backgroundStyle: {
|
|
29
|
-
type: Object,
|
|
30
|
-
required: false,
|
|
31
|
-
default: undefined,
|
|
32
|
-
},
|
|
33
28
|
context: {
|
|
34
29
|
type: Object,
|
|
35
30
|
required: true,
|
|
@@ -45,16 +40,9 @@ export default defineComponent({
|
|
|
45
40
|
if (borderRadius === '9999px') {
|
|
46
41
|
containerStyle.borderRadius = '26px';
|
|
47
42
|
}
|
|
48
|
-
|
|
49
|
-
// (BP/BC contact-form card colour defaults to the button fill).
|
|
50
|
-
if (this.cardStyle?.backgroundColor) {
|
|
43
|
+
if (this.cardStyle) {
|
|
51
44
|
containerStyle.backgroundColor = this.cardStyle.backgroundColor;
|
|
52
45
|
}
|
|
53
|
-
// Own background colour decouples the container from the button fill (BP-5800).
|
|
54
|
-
// Guarded on backgroundColor so an empty {} never blanks the container.
|
|
55
|
-
if (this.backgroundStyle?.backgroundColor) {
|
|
56
|
-
containerStyle.backgroundColor = this.backgroundStyle.backgroundColor;
|
|
57
|
-
}
|
|
58
46
|
return containerStyle;
|
|
59
47
|
},
|
|
60
48
|
arrowStyle() {
|
|
@@ -43,7 +43,6 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
|
|
|
43
43
|
isSubmitting: boolean;
|
|
44
44
|
submitError: string | undefined;
|
|
45
45
|
}, {
|
|
46
|
-
isDecorativeSubmitStyle(): boolean;
|
|
47
46
|
submitButtonStyle(): BrandPageCssStyle;
|
|
48
47
|
submitButtonTextStyle(): BrandPageCssStyle;
|
|
49
48
|
contentPaddingStyle(): {
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { defineComponent } from 'vue';
|
|
2
2
|
import { FORM_FIELD_TYPES } from '@brand-page/models';
|
|
3
3
|
import { getEmailValidationError, getMessageValidationError, getNameValidationError, getPhoneValidationError, } from '@brand-page/utils';
|
|
4
|
-
import { isDecorativeButtonStyle } from '../../utils/button.util';
|
|
5
4
|
import brandPageClient from '../../clients/brand-page.client';
|
|
6
5
|
import { isEmail } from '../../../utils/validator.util';
|
|
7
6
|
import { ALIGN_CARD_CENTER, ALIGN_CARD_CENTER_IMAGE, ALIGN_CENTERED, ALIGN_LEFT_FULL_IMAGE, ALIGN_RIGHT_FULL_IMAGE, DISPLAY_STYLE_COLLAPSED, RECAPTCHA_ACTION_CONTACT_FORM, TEXT_ONLY, } from '../../constants';
|
|
8
7
|
import { getRenderText, contentPaddingStyle as toContentPaddingStyle, mutedTextForBackground, backgroundColorFromStyle, } from '@brand-page/utils';
|
|
9
|
-
import { hasRTEContent
|
|
8
|
+
import { hasRTEContent } from '@brand-page-maker/utils';
|
|
10
9
|
import { useReCaptcha } from '../../composables/recaptcha.composable';
|
|
11
10
|
export default defineComponent({
|
|
12
11
|
props: {
|
|
@@ -45,12 +44,6 @@ export default defineComponent({
|
|
|
45
44
|
submitError: undefined,
|
|
46
45
|
}),
|
|
47
46
|
computed: {
|
|
48
|
-
// Decorative styles (brushstroke/arrow/paper) render a shape that needs width
|
|
49
|
-
// to read — at pure w-fit the arrow chevron collapses. Give the submit button a
|
|
50
|
-
// ~200px min-width so the decoration looks intentional without going full-width.
|
|
51
|
-
isDecorativeSubmitStyle() {
|
|
52
|
-
return isDecorativeButtonStyle(this.viewModel.buttonStyles?.selectedButtonStyleId);
|
|
53
|
-
},
|
|
54
47
|
submitButtonStyle() {
|
|
55
48
|
const buttonStyle = { ...this.viewModel.buttonStyles?.style };
|
|
56
49
|
const buttonTextStyle = {
|
|
@@ -120,10 +113,7 @@ export default defineComponent({
|
|
|
120
113
|
isEmail(this.viewModel.responseEmail));
|
|
121
114
|
},
|
|
122
115
|
title() {
|
|
123
|
-
|
|
124
|
-
// throw — read the visible text via getPlainTextFromRTE to decide
|
|
125
|
-
// whether to fall back to the default.
|
|
126
|
-
return getPlainTextFromRTE(this.viewModel.title)
|
|
116
|
+
return this.viewModel.title && this.viewModel.title.trim() !== ''
|
|
127
117
|
? this.viewModel.title
|
|
128
118
|
: 'Contact Us';
|
|
129
119
|
},
|
|
@@ -161,8 +151,8 @@ export default defineComponent({
|
|
|
161
151
|
// differs by website type:
|
|
162
152
|
// - brandSite: the card style (card + divided layouts) or the section
|
|
163
153
|
// background (other layouts).
|
|
164
|
-
// - brand.page / brand.contact:
|
|
165
|
-
//
|
|
154
|
+
// - brand.page / brand.contact: there's no section background, so the
|
|
155
|
+
// coloured surface is the global button fill.
|
|
166
156
|
// Falls back to the title colour when there's no solid colour to anchor to.
|
|
167
157
|
const style = this.context.isBrandSite
|
|
168
158
|
? this.hasCard || this.isDividedContent
|
|
@@ -170,9 +160,7 @@ export default defineComponent({
|
|
|
170
160
|
: this.hasBgColor
|
|
171
161
|
? this.viewModel.backgroundStyle
|
|
172
162
|
: undefined
|
|
173
|
-
: this.viewModel.
|
|
174
|
-
? this.viewModel.cardStyle
|
|
175
|
-
: this.viewModel.buttonStyles?.style;
|
|
163
|
+
: this.viewModel.buttonStyles?.style;
|
|
176
164
|
return (mutedTextForBackground(backgroundColorFromStyle(style)) ??
|
|
177
165
|
this.viewModel.titleStyle?.color);
|
|
178
166
|
},
|
|
@@ -94,11 +94,6 @@ export default defineComponent({
|
|
|
94
94
|
if (borderRadius === '9999px') {
|
|
95
95
|
buttonStyle.borderRadius = '24px';
|
|
96
96
|
}
|
|
97
|
-
// Own background colour decouples the container from the button fill (BP-5800).
|
|
98
|
-
if (this.viewModel.backgroundStyle?.backgroundColor) {
|
|
99
|
-
buttonStyle.backgroundColor =
|
|
100
|
-
this.viewModel.backgroundStyle.backgroundColor;
|
|
101
|
-
}
|
|
102
97
|
return buttonStyle;
|
|
103
98
|
},
|
|
104
99
|
isFormDisabled() {
|
|
@@ -68,7 +68,16 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
|
|
|
68
68
|
}>, {}, {
|
|
69
69
|
type: string | undefined;
|
|
70
70
|
isImageBroken: boolean;
|
|
71
|
-
}, {
|
|
71
|
+
}, {
|
|
72
|
+
/**
|
|
73
|
+
* BP-5866: content images must never emit an empty `alt`. Reuses the
|
|
74
|
+
* shared alt fallback (author title → "{business}'s image" → "image") so
|
|
75
|
+
* a caller that passes no `alt-text` still renders descriptive text.
|
|
76
|
+
* Only consumed by the content `<FallbackImage>`; decorative/background
|
|
77
|
+
* images (rendered via `media`) and shapes never reach this path.
|
|
78
|
+
*/
|
|
79
|
+
effectiveAltText(): string;
|
|
80
|
+
}, {
|
|
72
81
|
onImageError(): void;
|
|
73
82
|
}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
|
74
83
|
mediaType: {
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { defineComponent } from 'vue';
|
|
2
|
+
import { getImageAltText } from '@brand-page/utils';
|
|
2
3
|
export default defineComponent({
|
|
3
4
|
props: {
|
|
4
5
|
mediaType: {
|
|
@@ -71,6 +72,18 @@ export default defineComponent({
|
|
|
71
72
|
isImageBroken: false,
|
|
72
73
|
};
|
|
73
74
|
},
|
|
75
|
+
computed: {
|
|
76
|
+
/**
|
|
77
|
+
* BP-5866: content images must never emit an empty `alt`. Reuses the
|
|
78
|
+
* shared alt fallback (author title → "{business}'s image" → "image") so
|
|
79
|
+
* a caller that passes no `alt-text` still renders descriptive text.
|
|
80
|
+
* Only consumed by the content `<FallbackImage>`; decorative/background
|
|
81
|
+
* images (rendered via `media`) and shapes never reach this path.
|
|
82
|
+
*/
|
|
83
|
+
effectiveAltText() {
|
|
84
|
+
return getImageAltText({ imageTitle: this.altText }, this.context);
|
|
85
|
+
},
|
|
86
|
+
},
|
|
74
87
|
methods: {
|
|
75
88
|
onImageError() {
|
|
76
89
|
this.isImageBroken = true;
|
|
@@ -75,6 +75,11 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
|
|
|
75
75
|
bpShowTopNavigationMobile(): boolean;
|
|
76
76
|
bpShowTopNavigationDesktop(): boolean;
|
|
77
77
|
slug(): string;
|
|
78
|
+
/**
|
|
79
|
+
* Text for the single page-level `<h1>` (BP-5866). Sourced from the
|
|
80
|
+
* business/site name + page name so it mirrors the SSR document `<title>`.
|
|
81
|
+
*/
|
|
82
|
+
pageHeadingText(): string;
|
|
78
83
|
shouldShowSaveContactWidget(): boolean;
|
|
79
84
|
isPremiumSubscription(): boolean;
|
|
80
85
|
shouldShowPopupBranding(): boolean;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { defineComponent } from 'vue';
|
|
2
2
|
import { DEFAULT_FONT_FAMILY_KEY, FALLBACK_FONT_FAMILIES, FONT_FAMILY_CONFIGS, } from '../../constants';
|
|
3
|
-
import { getSlugFromContext } from '@brand-page/utils';
|
|
3
|
+
import { getSlugFromContext, getPageHeadingText } from '@brand-page/utils';
|
|
4
4
|
import { findNavItemByRelativePath } from '@brand-page/utils/route.util';
|
|
5
5
|
import { BRAND_PAGE_TYPES } from '@brand-page/models';
|
|
6
6
|
import { hasProfileContent as checkHasProfileContent } from '@brand-page/utils/vcard.util';
|
|
@@ -292,6 +292,13 @@ export default defineComponent({
|
|
|
292
292
|
slug() {
|
|
293
293
|
return getSlugFromContext(this.context);
|
|
294
294
|
},
|
|
295
|
+
/**
|
|
296
|
+
* Text for the single page-level `<h1>` (BP-5866). Sourced from the
|
|
297
|
+
* business/site name + page name so it mirrors the SSR document `<title>`.
|
|
298
|
+
*/
|
|
299
|
+
pageHeadingText() {
|
|
300
|
+
return getPageHeadingText(this.context);
|
|
301
|
+
},
|
|
295
302
|
shouldShowSaveContactWidget() {
|
|
296
303
|
try {
|
|
297
304
|
if ((!this.context.isPreview &&
|
|
@@ -77,11 +77,6 @@ export default defineComponent({
|
|
|
77
77
|
if (borderRadius === '9999px') {
|
|
78
78
|
buttonStyle.borderRadius = '26px';
|
|
79
79
|
}
|
|
80
|
-
// Own background colour decouples the container from the button fill (BP-5800).
|
|
81
|
-
if (this.viewModel.backgroundStyle?.backgroundColor) {
|
|
82
|
-
buttonStyle.backgroundColor =
|
|
83
|
-
this.viewModel.backgroundStyle.backgroundColor;
|
|
84
|
-
}
|
|
85
80
|
return buttonStyle;
|
|
86
81
|
},
|
|
87
82
|
continueButtonStyle() {
|
|
@@ -7,14 +7,6 @@ import { TextStyles } from './styles.model';
|
|
|
7
7
|
import { LogoStyles } from './logo.model';
|
|
8
8
|
import type { LogoImageModel, LogoTemplateImageModel } from './logo.model';
|
|
9
9
|
import type { BrandPagePaymentConfig } from './payment.model';
|
|
10
|
-
import type { JSONContent } from '@tiptap/vue-3';
|
|
11
|
-
/**
|
|
12
|
-
* BP-5787 — a rich-text field is either a legacy inline-HTML string or a
|
|
13
|
-
* Tiptap JSON document. Typing RTE content fields as RichTextValue (instead of
|
|
14
|
-
* `string`) forces every consumer to handle both forms — surfacing at compile
|
|
15
|
-
* time any code that assumes a plain string (e.g. `.replace`, `.length`).
|
|
16
|
-
*/
|
|
17
|
-
export type RichTextValue = string | JSONContent;
|
|
18
10
|
export * from './brand-page-context.model';
|
|
19
11
|
export * from './payment.model';
|
|
20
12
|
export * from './content.model';
|
|
@@ -156,7 +148,7 @@ export interface TextContent extends Content {
|
|
|
156
148
|
/**
|
|
157
149
|
* For BrandPage/BrandContact only
|
|
158
150
|
*/
|
|
159
|
-
text:
|
|
151
|
+
text: string;
|
|
160
152
|
/**
|
|
161
153
|
* For BrandSite
|
|
162
154
|
*/
|
|
@@ -179,9 +171,9 @@ export interface TextContent extends Content {
|
|
|
179
171
|
}
|
|
180
172
|
export interface ProfileContent extends Content {
|
|
181
173
|
avatarImageUrl: string;
|
|
182
|
-
name:
|
|
183
|
-
title:
|
|
184
|
-
description:
|
|
174
|
+
name: string;
|
|
175
|
+
title: string;
|
|
176
|
+
description: string;
|
|
185
177
|
backgroundColor: BrandPageCssStyle;
|
|
186
178
|
colorReplacements: ColorReplacement[];
|
|
187
179
|
mediaType?: string;
|
|
@@ -199,11 +191,10 @@ export interface MapContent extends Content {
|
|
|
199
191
|
}
|
|
200
192
|
export interface MailingListContent extends Content {
|
|
201
193
|
acceptedFields?: 'emailOnly' | 'nameAndEmail';
|
|
202
|
-
title:
|
|
194
|
+
title: string;
|
|
203
195
|
buttonText: string;
|
|
204
196
|
titleStyle: TextStyleDeclaration;
|
|
205
197
|
buttonTextStyle: TextStyleDeclaration;
|
|
206
|
-
backgroundStyle?: BrandPageCssStyle;
|
|
207
198
|
}
|
|
208
199
|
export declare const FORM_FIELD_TYPES: {
|
|
209
200
|
readonly text: "text";
|
|
@@ -251,10 +242,10 @@ export interface FormField {
|
|
|
251
242
|
export interface ContactFormContent extends Content {
|
|
252
243
|
type: 'contact-form';
|
|
253
244
|
displayStyle: string;
|
|
254
|
-
title:
|
|
255
|
-
description:
|
|
245
|
+
title: string;
|
|
246
|
+
description: string;
|
|
256
247
|
buttonText: string;
|
|
257
|
-
successMessage:
|
|
248
|
+
successMessage: string;
|
|
258
249
|
fields: FormField[];
|
|
259
250
|
responseEmail: string;
|
|
260
251
|
imageUrl?: string;
|
|
@@ -273,8 +264,8 @@ export interface ContactFormContent extends Content {
|
|
|
273
264
|
export interface BannerSectionContent extends Content {
|
|
274
265
|
type: 'banner-section';
|
|
275
266
|
imageUrl: string;
|
|
276
|
-
title:
|
|
277
|
-
description:
|
|
267
|
+
title: string;
|
|
268
|
+
description: string;
|
|
278
269
|
buttonText: string | false;
|
|
279
270
|
url: string;
|
|
280
271
|
email?: string;
|
|
@@ -301,8 +292,8 @@ export declare const MEDIA_TYPES: {
|
|
|
301
292
|
};
|
|
302
293
|
export type MediaType = keyof typeof MEDIA_TYPES;
|
|
303
294
|
export interface TextMediaItem extends ImageItem {
|
|
304
|
-
title:
|
|
305
|
-
paragraph:
|
|
295
|
+
title: string;
|
|
296
|
+
paragraph: string;
|
|
306
297
|
itemsId: number;
|
|
307
298
|
buttonText?: string | false;
|
|
308
299
|
buttonPageId?: string;
|
|
@@ -321,8 +312,8 @@ export interface TextShapeItem extends TextMediaItem {
|
|
|
321
312
|
export interface ShapeItem extends ImageItem {
|
|
322
313
|
colorReplacements: ColorReplacement[];
|
|
323
314
|
mediaType: MediaType;
|
|
324
|
-
title?:
|
|
325
|
-
paragraph?:
|
|
315
|
+
title?: string;
|
|
316
|
+
paragraph?: string;
|
|
326
317
|
titleOverride?: string;
|
|
327
318
|
paragraphOverride?: string;
|
|
328
319
|
}
|
|
@@ -330,9 +321,9 @@ export interface TestimonialItems {
|
|
|
330
321
|
/** Stable per-item identifier. See ImageItem.id. */
|
|
331
322
|
id: string;
|
|
332
323
|
imageUrl: string;
|
|
333
|
-
name:
|
|
334
|
-
position:
|
|
335
|
-
testimonials:
|
|
324
|
+
name: string;
|
|
325
|
+
position: string;
|
|
326
|
+
testimonials: string;
|
|
336
327
|
colorReplacements: ColorReplacement[];
|
|
337
328
|
mediaType: string;
|
|
338
329
|
size?: string;
|
|
@@ -345,7 +336,7 @@ export interface TestimonialItems {
|
|
|
345
336
|
export interface TextItem {
|
|
346
337
|
/** Stable per-item identifier. See ImageItem.id. */
|
|
347
338
|
id: string;
|
|
348
|
-
text:
|
|
339
|
+
text: string;
|
|
349
340
|
textStyle: TextStyleDeclaration;
|
|
350
341
|
textOverride?: string;
|
|
351
342
|
}
|
|
@@ -362,8 +353,8 @@ export interface ImagesSectionContent extends Content, MediaSection {
|
|
|
362
353
|
enablePopup: boolean;
|
|
363
354
|
}
|
|
364
355
|
export interface MediaSection extends Content {
|
|
365
|
-
title:
|
|
366
|
-
description:
|
|
356
|
+
title: string;
|
|
357
|
+
description: string;
|
|
367
358
|
displayStyle: ImagesSectionContentDisplayStyle;
|
|
368
359
|
items: TextShapeItem[] | TextMediaItem[];
|
|
369
360
|
titleStyle: TextStyleDeclaration;
|
|
@@ -380,7 +371,7 @@ export interface ColorReplacement {
|
|
|
380
371
|
}
|
|
381
372
|
export interface TestimonialSectionContent extends Content {
|
|
382
373
|
type: 'testimonial-section';
|
|
383
|
-
title:
|
|
374
|
+
title: string;
|
|
384
375
|
displayStyle: string;
|
|
385
376
|
items: TestimonialItems[];
|
|
386
377
|
titleStyle: TextStyleDeclaration;
|
|
@@ -394,8 +385,8 @@ export interface TestimonialSectionContent extends Content {
|
|
|
394
385
|
export interface AboutSectionContent extends Content {
|
|
395
386
|
type: 'about-section';
|
|
396
387
|
imageUrl: string;
|
|
397
|
-
title:
|
|
398
|
-
paragraph:
|
|
388
|
+
title: string;
|
|
389
|
+
paragraph: string;
|
|
399
390
|
displayStyle: string;
|
|
400
391
|
titleStyle: TextStyleDeclaration;
|
|
401
392
|
paragraphStyle: TextStyleDeclaration;
|
|
@@ -419,7 +410,7 @@ export declare const SOCIAL_LINKS_ICON_DISPLAY_STYLES: {
|
|
|
419
410
|
export type SocialLinksIconDisplayStyle = keyof typeof SOCIAL_LINKS_ICON_DISPLAY_STYLES;
|
|
420
411
|
export interface SocialLinksContent extends Content {
|
|
421
412
|
type: 'social-links';
|
|
422
|
-
title:
|
|
413
|
+
title: string;
|
|
423
414
|
links: LinksItem[];
|
|
424
415
|
iconDisplayStyle: SocialLinksIconDisplayStyle;
|
|
425
416
|
iconFillStyles: BrandPageCssStyle;
|
|
@@ -442,8 +433,8 @@ export interface DividerSectionContent extends Content {
|
|
|
442
433
|
}
|
|
443
434
|
export interface BookingSectionContent extends Content {
|
|
444
435
|
type: 'booking-section';
|
|
445
|
-
title:
|
|
446
|
-
description:
|
|
436
|
+
title: string;
|
|
437
|
+
description: string;
|
|
447
438
|
buttonText: string;
|
|
448
439
|
url: string;
|
|
449
440
|
email?: string;
|
|
@@ -134,7 +134,6 @@ export interface RequestPaymentContent extends Content {
|
|
|
134
134
|
descriptionStyle?: TextStyleDeclaration;
|
|
135
135
|
itemTextStyle: TextStyleDeclaration;
|
|
136
136
|
buttonTextStyle?: TextStyleDeclaration;
|
|
137
|
-
backgroundStyle?: BrandPageCssStyle;
|
|
138
137
|
}
|
|
139
138
|
export interface ShopContentConfig extends PaymentConfig {
|
|
140
139
|
paymentOptionDisplayType: PaymentOptionDisplayType;
|
|
@@ -175,7 +174,6 @@ export interface SupportMeContent extends Content {
|
|
|
175
174
|
descriptionStyle: TextStyleDeclaration;
|
|
176
175
|
buttonTextStyle: TextStyleDeclaration;
|
|
177
176
|
itemTextStyle: TextStyleDeclaration;
|
|
178
|
-
backgroundStyle?: BrandPageCssStyle;
|
|
179
177
|
}
|
|
180
178
|
export interface CreateStripePaymentIntentResponse {
|
|
181
179
|
paymentIntent: StripePaymentIntent;
|
|
@@ -5,8 +5,3 @@ import type { ButtonStyles } from '../models';
|
|
|
5
5
|
* @returns The calculated box shadow CSS value
|
|
6
6
|
*/
|
|
7
7
|
export declare const getBoxShadowValue: (buttonStyles: ButtonStyles) => string;
|
|
8
|
-
export declare const BUTTON_STYLE_BRUSHSTROKE = "BUTTON_STYLE_19";
|
|
9
|
-
export declare const BUTTON_STYLE_ARROW = "BUTTON_STYLE_20";
|
|
10
|
-
export declare const BUTTON_STYLE_PAPER = "BUTTON_STYLE_21";
|
|
11
|
-
export declare const DECORATIVE_BUTTON_STYLE_IDS: string[];
|
|
12
|
-
export declare const isDecorativeButtonStyle: (styleId?: string) => boolean;
|
|
@@ -27,16 +27,3 @@ export const getBoxShadowValue = (buttonStyles) => {
|
|
|
27
27
|
}
|
|
28
28
|
return boxShadowValue;
|
|
29
29
|
};
|
|
30
|
-
// The "decorative" button styles — brushstroke / arrow / torn-paper — whose visual
|
|
31
|
-
// is drawn by ButtonStyleWrapper rather than plain CSS. Their banner-like SVG
|
|
32
|
-
// decoration needs the button to be reasonably wide to render legibly, so narrow
|
|
33
|
-
// (w-fit) hosts should widen when one of these is active (BP-5800).
|
|
34
|
-
export const BUTTON_STYLE_BRUSHSTROKE = 'BUTTON_STYLE_19';
|
|
35
|
-
export const BUTTON_STYLE_ARROW = 'BUTTON_STYLE_20';
|
|
36
|
-
export const BUTTON_STYLE_PAPER = 'BUTTON_STYLE_21';
|
|
37
|
-
export const DECORATIVE_BUTTON_STYLE_IDS = [
|
|
38
|
-
BUTTON_STYLE_BRUSHSTROKE,
|
|
39
|
-
BUTTON_STYLE_ARROW,
|
|
40
|
-
BUTTON_STYLE_PAPER,
|
|
41
|
-
];
|
|
42
|
-
export const isDecorativeButtonStyle = (styleId) => !!styleId && DECORATIVE_BUTTON_STYLE_IDS.includes(styleId);
|
|
@@ -6,6 +6,7 @@ export * from './model.util';
|
|
|
6
6
|
export * from './validation.util';
|
|
7
7
|
export * from './payment.util';
|
|
8
8
|
export * from './image.util';
|
|
9
|
+
export * from './page-heading.util';
|
|
9
10
|
export * from './font-loader.util';
|
|
10
11
|
export * from './aspect-ratio.util';
|
|
11
12
|
export * from './context.util';
|
|
@@ -6,6 +6,7 @@ export * from './model.util';
|
|
|
6
6
|
export * from './validation.util';
|
|
7
7
|
export * from './payment.util';
|
|
8
8
|
export * from './image.util';
|
|
9
|
+
export * from './page-heading.util';
|
|
9
10
|
export * from './font-loader.util';
|
|
10
11
|
export * from './aspect-ratio.util';
|
|
11
12
|
export * from './context.util';
|
|
@@ -21,9 +21,6 @@ import { migration15 } from './migration/migration-15';
|
|
|
21
21
|
import { migration16 } from './migration/migration-16';
|
|
22
22
|
import { migration17 } from './migration/migration-17';
|
|
23
23
|
import { migration18 } from './migration/migration-18';
|
|
24
|
-
import { migration19 } from './migration/migration-19';
|
|
25
|
-
import { migration20 } from './migration/migration-20';
|
|
26
|
-
import { migration21 } from './migration/migration-21';
|
|
27
24
|
const MIGRATION_TABLE = [
|
|
28
25
|
{
|
|
29
26
|
version: 1,
|
|
@@ -141,33 +138,6 @@ const MIGRATION_TABLE = [
|
|
|
141
138
|
migrateFn: migration18,
|
|
142
139
|
description: 'BP-5603: backfill stable item ids on all nested items (gallery/section/testimonial/text items, section + footer social links) — the item id is now non-nullable',
|
|
143
140
|
},
|
|
144
|
-
{
|
|
145
|
-
version: 19,
|
|
146
|
-
migrateFn: migration19,
|
|
147
|
-
// runAlways: normalise RTE to JSON on every load. Idempotent (only HTML
|
|
148
|
-
// strings are converted; JSON is skipped), so it also catches content the
|
|
149
|
-
// AI section builders still emit as HTML — converting it on the next read
|
|
150
|
-
// without a new migration or changes to those builders.
|
|
151
|
-
runAlways: true,
|
|
152
|
-
description: 'BP-5787: convert inline-HTML RTE content to Tiptap JSON on load (lazy migrate-on-read for web-renderer; persisted on next maker save; also normalises AI-built HTML)',
|
|
153
|
-
},
|
|
154
|
-
{
|
|
155
|
-
version: 20,
|
|
156
|
-
migrateFn: migration20,
|
|
157
|
-
// runAlways: re-apply on every load so already-published sites pick up the seed
|
|
158
|
-
// without a version bump. Idempotent — only seeds backgroundColor when unset.
|
|
159
|
-
runAlways: true,
|
|
160
|
-
description: 'BP-5800: seed own container backgroundStyle from the button fill colour for mailing-list, request-payment and support-me so the container background is independent of the site button (existing sites render unchanged)',
|
|
161
|
-
},
|
|
162
|
-
{
|
|
163
|
-
version: 21,
|
|
164
|
-
migrateFn: migration21,
|
|
165
|
-
// runAlways: seed on every load so content already at the latest version
|
|
166
|
-
// (skipped by a version gate) still detaches. Idempotent — only seeds
|
|
167
|
-
// cardStyle.backgroundColor when unset, so a user colour is never clobbered.
|
|
168
|
-
runAlways: true,
|
|
169
|
-
description: 'BP-5800: contact-form BP/BC container colour moves to cardStyle — seed cardStyle from the button fill (its long-standing rendered colour) so existing sites render unchanged',
|
|
170
|
-
},
|
|
171
141
|
];
|
|
172
142
|
export const GetLatestModelVersion = () => Math.max(...MIGRATION_TABLE.map((x) => x.version));
|
|
173
143
|
export const migrateBrandPageModel = async (brandPageModel, options) => {
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { BrandPageContext } from '../models';
|
|
2
|
+
/**
|
|
3
|
+
* Resolves the text for the single page-level `<h1>` a published site renders
|
|
4
|
+
* (BP-5866 — Bing rejected indexing because every section emitted its own
|
|
5
|
+
* `<h1>`; the page now owns exactly one).
|
|
6
|
+
*
|
|
7
|
+
* Mirrors the SSR `<title>` rule so the crawlable heading matches the document
|
|
8
|
+
* title: a sub-page reads `"{business} - {page}"`, while the home/root page
|
|
9
|
+
* reads just the business/site name — never the weak, non-descriptive literal
|
|
10
|
+
* "Home". Falls back to the page name, then the slug, when the business name
|
|
11
|
+
* is unset.
|
|
12
|
+
*/
|
|
13
|
+
export declare const getPageHeadingText: (context: BrandPageContext) => string;
|