@designcrowd/library.brand-page 6.1.16 → 6.1.17-ast-header-button
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-CmNhDMIf.js → CreatedOnBrandCrowd-de-de-Cwq9enJs.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-en-us-DgplxxWa.js → CreatedOnBrandCrowd-en-us-ILK04gFj.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-es-es-DFdhFOa1.js → CreatedOnBrandCrowd-es-es-CbjxLxtu.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-fr-fr-DjLCWBLB.js → CreatedOnBrandCrowd-fr-ca-BwBDiK9z.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-fr-ca-DjLCWBLB.js → CreatedOnBrandCrowd-fr-fr-BwBDiK9z.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-pt-pt-CI2XD0OS.js → CreatedOnBrandCrowd-pt-br-DvhJROpG.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-pt-br-CI2XD0OS.js → CreatedOnBrandCrowd-pt-pt-DvhJROpG.js} +1 -1
- package/lib/src/{CreatedOnDcom-de-de-CkLkBztx.js → CreatedOnDcom-de-de-BK9imWOh.js} +1 -1
- package/lib/src/{CreatedOnDcom-en-us-frnxBJJv.js → CreatedOnDcom-en-us-CyH-_qz1.js} +1 -1
- package/lib/src/{CreatedOnDcom-es-es-CrqgiERj.js → CreatedOnDcom-es-es-Dh51qYEA.js} +1 -1
- package/lib/src/{CreatedOnDcom-fr-ca-CPoEcusj.js → CreatedOnDcom-fr-ca-BArRxwWX.js} +1 -1
- package/lib/src/{CreatedOnDcom-fr-fr-BqrRH3dV.js → CreatedOnDcom-fr-fr-CdglI-ZB.js} +1 -1
- package/lib/src/{CreatedOnDcom-pt-br-CpbVi3Sw.js → CreatedOnDcom-pt-br-DCehns-G.js} +1 -1
- package/lib/src/{CreatedOnDcom-pt-pt-s0XZ3c7y.js → CreatedOnDcom-pt-pt-B8hl-oew.js} +1 -1
- package/lib/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.mixin.d.ts +27 -2
- package/lib/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.mixin.js +26 -0
- package/lib/src/brand-page/components/page-header/PageHeader.mixin.d.ts +3 -1
- package/lib/src/brand-page/components/page-header/PageHeader.mixin.js +12 -0
- package/lib/src/brand-page/models/index.d.ts +12 -0
- package/lib/src/brand-page/models/index.js +3 -0
- package/lib/src/brand-page/utils/button.util.d.ts +5 -0
- package/lib/src/brand-page/utils/button.util.js +4 -0
- package/lib/src/brand-page/utils/view-model.util.d.ts +1 -0
- package/lib/src/brand-page/utils/view-model.util.js +51 -1
- package/lib/src/brand-page/view-models.d.ts +3 -1
- package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.d.ts +1 -1
- package/lib/src/brand-page-maker/components/brandpage-maker-page/BrandPageMakerPage.mixin.d.ts +1 -1
- package/lib/src/brand-page-maker/stores/ai-checkpoint/ai-checkpoint-store.d.ts +1008 -0
- package/lib/src/{bundled-translations-B2q5GWTQ.js → bundled-translations-B8fAEel0.js} +1 -1
- package/lib/src/bundles/bundled-translations.json +7 -1
- package/lib/src/css/library.brand-page-brandCrowd.min.css +315 -122
- package/lib/src/css/library.brand-page-brandPage.min.css +315 -122
- package/lib/src/css/library.brand-page-designCom.min.css +315 -122
- package/lib/src/css/library.brand-page-preview.min.css +315 -122
- package/lib/src/index.d.ts +1 -0
- package/lib/src/index.mjs +45 -44
- package/lib/src/{lib-O_eJgJHP.js → lib-KFjPFfxn.js} +31522 -31118
- package/lib/src/lib.js +1 -0
- package/lib/src/shared/content-settings/components/content-settings/ContentSettings.mixin.d.ts +1 -1
- package/lib/src/shared/content-settings/components/content-settings/ReplaceImageSettingsForContent.mixin.d.ts +1 -1
- package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.d.ts +1 -1
- package/lib/src/shared/content-settings/components/payment-config-field/PaymentConfigField.mixin.d.ts +1 -1
- package/lib/src/shared/ecommerce-settings/util/refreshDuplicatedMetadata.d.ts +11 -0
- package/lib/src/shared/ecommerce-settings/util/refreshDuplicatedMetadata.js +80 -0
- package/lib/src/shared/logo-settings/components/LogoSettings.mixin.d.ts +1 -1
- package/lib/src/shared/page-settings/components/delete-page-modal/DeletePageModal.mixin.d.ts +1 -1
- package/lib/src/shared/page-settings/components/new-page-modal/NewPageModal.mixin.d.ts +1 -1
- package/lib/src/shared/page-settings/components/page-settings/PageSettings.mixin.d.ts +113 -1
- package/lib/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.d.ts +117 -2
- package/lib/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.js +43 -1
- package/lib/src/shared/page-settings/store/page-settings-store.d.ts +2 -2
- package/package.json +1 -1
- package/src/brand-page/components/button/Button.vue +35 -8
- package/src/brand-page/components/button/Button.vue.test.ts +59 -0
- package/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.mixin.ts +29 -1
- package/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.vue +36 -0
- package/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.vue.test.ts +175 -0
- package/src/brand-page/components/page/Page.vue +6 -0
- package/src/brand-page/components/page-header/HeaderLayout.vue +198 -4
- package/src/brand-page/components/page-header/PageHeader.mixin.ts +16 -1
- package/src/brand-page/components/page-header/PageHeader.vue +23 -1
- package/src/brand-page/components/page-header/PageHeader.vue.test.ts +378 -0
- package/src/brand-page/models/header-button.model.test.ts +86 -0
- package/src/brand-page/models/index.ts +16 -0
- package/src/brand-page/utils/__snapshots__/migration.util.test.ts.snap +6 -0
- package/src/brand-page/utils/__snapshots__/migration2.util.test.ts.snap +2 -0
- package/src/brand-page/utils/__snapshots__/model.util.test.ts.snap +4 -0
- package/src/brand-page/utils/button.util.ts +8 -0
- package/src/brand-page/utils/view-model.util.test.ts +146 -1
- package/src/brand-page/utils/view-model.util.ts +71 -1
- package/src/brand-page/view-models.ts +3 -0
- package/src/bundles/bundled-translations.json +7 -1
- package/src/lib.ts +1 -0
- package/src/shared/ecommerce-settings/util/refreshDuplicatedMetadata.test.ts +399 -0
- package/src/shared/ecommerce-settings/util/refreshDuplicatedMetadata.ts +99 -0
- package/src/shared/page-settings/components/header-settings-panel/HeaderSettingsPanel.button-section.test.ts +126 -0
- package/src/shared/page-settings/components/header-settings-panel/HeaderSettingsPanel.vue +43 -6
- package/src/shared/page-settings/components/page-settings-section-styles/HeaderButtonSettings.test.ts +167 -0
- package/src/shared/page-settings/components/page-settings-section-styles/HeaderButtonSettings.vue +237 -0
- package/src/shared/page-settings/components/page-settings-section-styles/HeaderDisplayStyle.test.ts +160 -0
- package/src/shared/page-settings/components/page-settings-section-styles/HeaderDisplayStyle.vue +37 -8
- package/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.header-button.test.ts +113 -0
- package/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.ts +47 -0
- package/src/shared/page-settings/components/page-settings-section-styles/i18n/page-settings-section.json +7 -1
- package/src/shared/page-settings/store/page-settings-store.ts +2 -0
package/lib/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.mixin.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { PropType } from 'vue';
|
|
2
2
|
import type { BrandPageContext, NavigationDesktop, NavigationMobile } from '../../../models';
|
|
3
|
-
import type { NavItemViewModel } from '../../../view-models';
|
|
3
|
+
import type { ButtonViewModel, NavItemViewModel } from '../../../view-models';
|
|
4
4
|
declare const _default: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
5
5
|
context: {
|
|
6
6
|
type: PropType<BrandPageContext>;
|
|
@@ -18,6 +18,16 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
|
|
|
18
18
|
type: PropType<NavigationDesktop | NavigationMobile>;
|
|
19
19
|
required: true;
|
|
20
20
|
};
|
|
21
|
+
headerButtonViewModel: {
|
|
22
|
+
type: PropType<ButtonViewModel>;
|
|
23
|
+
required: false;
|
|
24
|
+
default: undefined;
|
|
25
|
+
};
|
|
26
|
+
isMobile: {
|
|
27
|
+
type: BooleanConstructor;
|
|
28
|
+
required: false;
|
|
29
|
+
default: boolean;
|
|
30
|
+
};
|
|
21
31
|
}>, {}, {
|
|
22
32
|
expandedItems: Record<string, boolean>;
|
|
23
33
|
}, {
|
|
@@ -27,12 +37,14 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
|
|
|
27
37
|
selectedButtonStyle(): BrandPageCssStyle;
|
|
28
38
|
defaultWrapperStyle(): BrandPageCssStyle;
|
|
29
39
|
selectedWrapperStyle(): BrandPageCssStyle;
|
|
40
|
+
showHeaderButton(): boolean;
|
|
30
41
|
routes(): any[];
|
|
31
42
|
}, {
|
|
32
43
|
filterHiddenNavItems(navItems: NavItemViewModel[]): NavItemViewModel[];
|
|
33
44
|
isCurrentPage(navItem: NavItemViewModel): boolean;
|
|
34
45
|
getSubNavItemStyle(navItem: NavItemViewModel): BrandPageCssStyle;
|
|
35
46
|
closeSideMenu(): void;
|
|
47
|
+
onDrawerCtaClick(event: MouseEvent): void;
|
|
36
48
|
toggleExpanded(pageId: string): void;
|
|
37
49
|
isExpanded(pageId: string): boolean;
|
|
38
50
|
expandSubPageIfCurrentPage(): void;
|
|
@@ -53,7 +65,20 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
|
|
|
53
65
|
type: PropType<NavigationDesktop | NavigationMobile>;
|
|
54
66
|
required: true;
|
|
55
67
|
};
|
|
68
|
+
headerButtonViewModel: {
|
|
69
|
+
type: PropType<ButtonViewModel>;
|
|
70
|
+
required: false;
|
|
71
|
+
default: undefined;
|
|
72
|
+
};
|
|
73
|
+
isMobile: {
|
|
74
|
+
type: BooleanConstructor;
|
|
75
|
+
required: false;
|
|
76
|
+
default: boolean;
|
|
77
|
+
};
|
|
56
78
|
}>> & Readonly<{
|
|
57
79
|
"onClose-side-menu"?: ((...args: any[]) => any) | undefined;
|
|
58
|
-
}>, {
|
|
80
|
+
}>, {
|
|
81
|
+
isMobile: boolean;
|
|
82
|
+
headerButtonViewModel: ButtonViewModel;
|
|
83
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
59
84
|
export default _default;
|
package/lib/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.mixin.js
CHANGED
|
@@ -18,6 +18,18 @@ export default defineComponent({
|
|
|
18
18
|
type: Object,
|
|
19
19
|
required: true,
|
|
20
20
|
},
|
|
21
|
+
headerButtonViewModel: {
|
|
22
|
+
type: Object,
|
|
23
|
+
required: false,
|
|
24
|
+
default: undefined,
|
|
25
|
+
},
|
|
26
|
+
// The desktop drawer suppresses the header CTA — the desktop header row already
|
|
27
|
+
// renders it. Only the mobile drawer carries the button.
|
|
28
|
+
isMobile: {
|
|
29
|
+
type: Boolean,
|
|
30
|
+
required: false,
|
|
31
|
+
default: false,
|
|
32
|
+
},
|
|
21
33
|
},
|
|
22
34
|
emits: ['close-side-menu'],
|
|
23
35
|
data() {
|
|
@@ -50,6 +62,9 @@ export default defineComponent({
|
|
|
50
62
|
const { fontSize: _fontSize, lineHeight: _lineHeight, letterSpacing: _letterSpacing, ...rest } = this.selectedButtonStyle;
|
|
51
63
|
return rest;
|
|
52
64
|
},
|
|
65
|
+
showHeaderButton() {
|
|
66
|
+
return this.isMobile && Boolean(this.headerButtonViewModel);
|
|
67
|
+
},
|
|
53
68
|
routes() {
|
|
54
69
|
return this.visibleNavItems.map((navItem, _i) => {
|
|
55
70
|
return {
|
|
@@ -85,6 +100,17 @@ export default defineComponent({
|
|
|
85
100
|
closeSideMenu() {
|
|
86
101
|
this.$emit('close-side-menu');
|
|
87
102
|
},
|
|
103
|
+
// In the maker preview the CTA is inert (BP-5852 decision): capture-phase so the
|
|
104
|
+
// prevent lands before the inner anchor/router-link fires. On the published site
|
|
105
|
+
// the click follows the link and the drawer closes behind it.
|
|
106
|
+
onDrawerCtaClick(event) {
|
|
107
|
+
if (this.context.isPreview) {
|
|
108
|
+
event.preventDefault();
|
|
109
|
+
event.stopPropagation();
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
this.closeSideMenu();
|
|
113
|
+
},
|
|
88
114
|
toggleExpanded(pageId) {
|
|
89
115
|
const isCurrentlyExpanded = this.expandedItems[pageId];
|
|
90
116
|
this.expandedItems = {};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { PropType } from 'vue';
|
|
2
2
|
import type { BrandPageContext } from '@brand-page/models';
|
|
3
|
-
import type { PageHeaderViewModel } from '@brand-page/view-models';
|
|
3
|
+
import type { ButtonViewModel, PageHeaderViewModel } from '@brand-page/view-models';
|
|
4
4
|
declare const _default: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
5
5
|
navId: {
|
|
6
6
|
type: StringConstructor;
|
|
@@ -23,9 +23,11 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
|
|
|
23
23
|
LOGO_SLIDER_DESKTOP_MAX: number;
|
|
24
24
|
}, {
|
|
25
25
|
containerCss(): BrandPageCssStyle;
|
|
26
|
+
headerButtonViewModel(): ButtonViewModel | undefined;
|
|
26
27
|
showNav(): boolean;
|
|
27
28
|
}, {
|
|
28
29
|
onHeaderContainerClick(): void;
|
|
30
|
+
onHeaderCtaClick(event: MouseEvent): void;
|
|
29
31
|
}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, "header-container-click"[], "header-container-click", import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
|
30
32
|
navId: {
|
|
31
33
|
type: StringConstructor;
|
|
@@ -33,6 +33,9 @@ export default defineComponent({
|
|
|
33
33
|
padding: '1.5rem 0', // var(--page-padding) 0
|
|
34
34
|
};
|
|
35
35
|
},
|
|
36
|
+
headerButtonViewModel() {
|
|
37
|
+
return this.viewModel.headerButtonViewModel;
|
|
38
|
+
},
|
|
36
39
|
showNav() {
|
|
37
40
|
const visibleNavItems = this.context.nav.navItems.filter((item) => !item.isHidden);
|
|
38
41
|
return (visibleNavItems.length > 1 ||
|
|
@@ -45,5 +48,14 @@ export default defineComponent({
|
|
|
45
48
|
onHeaderContainerClick() {
|
|
46
49
|
this.$emit('header-container-click');
|
|
47
50
|
},
|
|
51
|
+
// In the maker preview the CTA is inert (BP-5852 decision): capture-phase so the
|
|
52
|
+
// prevent lands before the inner anchor/router-link fires, and the stop keeps the
|
|
53
|
+
// click from selecting the header panel. On the published site it does nothing.
|
|
54
|
+
onHeaderCtaClick(event) {
|
|
55
|
+
if (this.context.isPreview) {
|
|
56
|
+
event.preventDefault();
|
|
57
|
+
event.stopPropagation();
|
|
58
|
+
}
|
|
59
|
+
},
|
|
48
60
|
},
|
|
49
61
|
});
|
|
@@ -501,6 +501,16 @@ export declare class NavModel {
|
|
|
501
501
|
routes: NavRoute[];
|
|
502
502
|
constructor(options?: Partial<NavModel>);
|
|
503
503
|
}
|
|
504
|
+
export interface HeaderButton {
|
|
505
|
+
isVisible: boolean;
|
|
506
|
+
text: string;
|
|
507
|
+
buttonLinkType: ButtonLinkType;
|
|
508
|
+
url?: string;
|
|
509
|
+
buttonPageId?: string;
|
|
510
|
+
buttonTextStyle?: TextStyleDeclaration;
|
|
511
|
+
fillColor?: string;
|
|
512
|
+
borderColor?: string;
|
|
513
|
+
}
|
|
504
514
|
type AbstractPageHeaderStylesType = Partial<AbstractPageHeaderStyles>;
|
|
505
515
|
export declare abstract class AbstractPageHeaderStyles {
|
|
506
516
|
displayStyle: HeaderDisplayStyle;
|
|
@@ -525,6 +535,8 @@ export declare abstract class AbstractPageHeaderStyles {
|
|
|
525
535
|
backgroundStyle: BackgroundColorStyle;
|
|
526
536
|
style: BrandPageCssStyle;
|
|
527
537
|
viewport: ViewportsType;
|
|
538
|
+
/** Absent means no header call-to-action button — never seed a default. */
|
|
539
|
+
headerButton?: HeaderButton;
|
|
528
540
|
protected constructor(options?: AbstractPageHeaderStylesType);
|
|
529
541
|
}
|
|
530
542
|
export declare class PageHeaderDesktop extends AbstractPageHeaderStyles {
|
|
@@ -227,6 +227,8 @@ export class AbstractPageHeaderStyles {
|
|
|
227
227
|
backgroundStyle;
|
|
228
228
|
style;
|
|
229
229
|
viewport;
|
|
230
|
+
/** Absent means no header call-to-action button — never seed a default. */
|
|
231
|
+
headerButton;
|
|
230
232
|
constructor(options = {}) {
|
|
231
233
|
if (typeof options.viewport === 'undefined') {
|
|
232
234
|
throw new Error('"viewport" is required');
|
|
@@ -257,6 +259,7 @@ export class AbstractPageHeaderStyles {
|
|
|
257
259
|
...(options.backgroundStyle || {}),
|
|
258
260
|
backgroundOpacity: options.backgroundStyle?.backgroundOpacity ?? 100,
|
|
259
261
|
};
|
|
262
|
+
this.headerButton = options.headerButton;
|
|
260
263
|
}
|
|
261
264
|
}
|
|
262
265
|
export class PageHeaderDesktop extends AbstractPageHeaderStyles {
|
|
@@ -5,6 +5,11 @@ 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_VARIANTS: {
|
|
9
|
+
readonly section: "section";
|
|
10
|
+
readonly header: "header";
|
|
11
|
+
};
|
|
12
|
+
export type ButtonVariant = (typeof BUTTON_VARIANTS)[keyof typeof BUTTON_VARIANTS];
|
|
8
13
|
export declare const BUTTON_STYLE_BRUSHSTROKE = "BUTTON_STYLE_19";
|
|
9
14
|
export declare const BUTTON_STYLE_ARROW = "BUTTON_STYLE_20";
|
|
10
15
|
export declare const BUTTON_STYLE_PAPER = "BUTTON_STYLE_21";
|
|
@@ -32,6 +32,10 @@ export const getBoxShadowValue = (buttonStyles) => {
|
|
|
32
32
|
}
|
|
33
33
|
return boxShadow;
|
|
34
34
|
};
|
|
35
|
+
export const BUTTON_VARIANTS = {
|
|
36
|
+
section: 'section',
|
|
37
|
+
header: 'header',
|
|
38
|
+
};
|
|
35
39
|
// The "decorative" button styles — brushstroke / arrow / torn-paper — whose visual
|
|
36
40
|
// is drawn by ButtonStyleWrapper rather than plain CSS. Their banner-like SVG
|
|
37
41
|
// decoration needs the button to be reasonably wide to render legibly, so narrow
|
|
@@ -13,6 +13,7 @@ export declare const mapToImagesSectionViewModel: (content: ImagesSectionContent
|
|
|
13
13
|
export declare const mapToBookingSectionViewModel: (content: BookingSectionContent, styles: PageStyles) => BookingSectionViewModel;
|
|
14
14
|
export declare const mapToNavViewModel: (nav: NavModel, brandPageSlug?: string, isCustomDomain?: boolean) => NavViewModel;
|
|
15
15
|
export declare const mapToPageStyleViewModel: (pageStyles: PageStyles, options: ViewModelMappingOptions) => PageStylesViewModel;
|
|
16
|
+
export declare const HEADER_BUTTON_FALLBACK_TEXT = "Contact Us";
|
|
16
17
|
export declare const mapToPageHeaderViewModel: (pageHeader: PageHeaderDesktop | PageHeaderMobile, pageStyles: PageStyles, pages: PageViewModel[], useOldLogoRenderSize?: boolean) => PageHeaderViewModel;
|
|
17
18
|
export declare const mapToPageFooterViewModel: (pageFooter: PageFooterDesktop | PageFooterMobile, pageStyles: PageStyles, useOldLogoRenderSize?: boolean) => PageFooterViewModel;
|
|
18
19
|
export declare const mapToViewModel: (styles: PageStyles, brandPageType: BrandPageType, options: ViewModelMappingOptions) => (content: Content) => ContentViewModel | undefined;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { reactive } from 'vue';
|
|
2
2
|
import { assertUnreachable } from '../../helpers/ts.helper';
|
|
3
|
-
import { ButtonStyles, VIEWPORTS } from '../models';
|
|
3
|
+
import { ButtonStyles, TEXT_STYLE_TYPES, VIEWPORTS } from '../models';
|
|
4
4
|
import { NavigationMobile, NavigationDesktop, BRAND_PAGE_TYPES, BUTTON_LINK_TYPE, NavigationMenuStyles, } from '../models';
|
|
5
5
|
import { backgroundColorFromStyle, isTransparentColour, mutedTextForBackground, withColorOpacity, } from './color.util';
|
|
6
6
|
import { resolveColorReference } from './color-palette.util';
|
|
@@ -691,6 +691,55 @@ export const mapToPageStyleViewModel = (pageStyles, options) => {
|
|
|
691
691
|
colors: pageStyles.colors ?? [],
|
|
692
692
|
};
|
|
693
693
|
};
|
|
694
|
+
// Must stay in step with the maker's `pageSettingsSection.buttonLabelPlaceholder`
|
|
695
|
+
// (page-settings-section.json) — the placeholder shows what an empty label publishes as.
|
|
696
|
+
export const HEADER_BUTTON_FALLBACK_TEXT = 'Contact Us';
|
|
697
|
+
/**
|
|
698
|
+
* `Button.vue` reads the link kind off `role` for every non-section role, so the header
|
|
699
|
+
* CTA's authored `buttonLinkType` is expressed as the role (+ `clickActionField` for a
|
|
700
|
+
* page link) that component already resolves — no new branch in the button itself.
|
|
701
|
+
*/
|
|
702
|
+
const HEADER_BUTTON_LINK_ROLES = {
|
|
703
|
+
[BUTTON_LINK_TYPE.url]: 'general-link',
|
|
704
|
+
[BUTTON_LINK_TYPE.page]: 'general-link',
|
|
705
|
+
[BUTTON_LINK_TYPE.mailTo]: 'email',
|
|
706
|
+
[BUTTON_LINK_TYPE.tel]: 'phone',
|
|
707
|
+
};
|
|
708
|
+
const mapToHeaderButtonViewModel = (headerButton, styles) => {
|
|
709
|
+
if (!headerButton?.isVisible) {
|
|
710
|
+
return undefined;
|
|
711
|
+
}
|
|
712
|
+
const titleStyle = headerButton.buttonTextStyle ?? {
|
|
713
|
+
textStyleType: TEXT_STYLE_TYPES.buttons,
|
|
714
|
+
};
|
|
715
|
+
const viewModel = mapToButtonViewModel({
|
|
716
|
+
id: 'page-header-button',
|
|
717
|
+
type: HEADER_BUTTON_LINK_ROLES[headerButton.buttonLinkType],
|
|
718
|
+
iconUrl: '',
|
|
719
|
+
modalImageUrl: '',
|
|
720
|
+
colorReplacements: [],
|
|
721
|
+
title: headerButton.text?.trim() || HEADER_BUTTON_FALLBACK_TEXT,
|
|
722
|
+
titleStyle,
|
|
723
|
+
url: headerButton.url ?? '',
|
|
724
|
+
page: headerButton.buttonPageId ?? '',
|
|
725
|
+
clickActionField: headerButton.buttonLinkType === BUTTON_LINK_TYPE.page ? 'page' : 'url',
|
|
726
|
+
}, styles, { titleStyle });
|
|
727
|
+
return {
|
|
728
|
+
...viewModel,
|
|
729
|
+
styles: {
|
|
730
|
+
...viewModel.styles,
|
|
731
|
+
style: {
|
|
732
|
+
...viewModel.styles.style,
|
|
733
|
+
...(headerButton.fillColor
|
|
734
|
+
? { backgroundColor: headerButton.fillColor }
|
|
735
|
+
: {}),
|
|
736
|
+
...(headerButton.borderColor
|
|
737
|
+
? { borderColor: headerButton.borderColor }
|
|
738
|
+
: {}),
|
|
739
|
+
},
|
|
740
|
+
},
|
|
741
|
+
};
|
|
742
|
+
};
|
|
694
743
|
export const mapToPageHeaderViewModel = (pageHeader, pageStyles, pages, useOldLogoRenderSize = false) => {
|
|
695
744
|
const viewport = pageHeader.viewport;
|
|
696
745
|
const logoContent = {
|
|
@@ -738,6 +787,7 @@ export const mapToPageHeaderViewModel = (pageHeader, pageStyles, pages, useOldLo
|
|
|
738
787
|
}),
|
|
739
788
|
style: pageHeader.style,
|
|
740
789
|
backgroundStyle: getHeaderBackgroundStyleWithOpacity(pageHeader),
|
|
790
|
+
headerButtonViewModel: mapToHeaderButtonViewModel(pageHeader.headerButton, pageStyles),
|
|
741
791
|
};
|
|
742
792
|
};
|
|
743
793
|
// Folds backgroundOpacity into backgroundColor's alpha so only the container's paint fades, not its children.
|
|
@@ -132,10 +132,12 @@ export interface BookingSectionViewModel extends ContentViewModel, Omit<BookingS
|
|
|
132
132
|
buttonViewModel: ButtonViewModel;
|
|
133
133
|
isFullWidth: boolean;
|
|
134
134
|
}
|
|
135
|
-
export interface PageHeaderViewModel extends Omit<PageHeaderDesktop | PageHeaderMobile, 'logoImage' | 'logoImageStyle' | 'isLogoOptional' | 'viewport' | 'isLogoVisible' | 'logoTemplateImage' | 'logoImageHeight' | 'logoImageWidth' | 'backgroundStyle'> {
|
|
135
|
+
export interface PageHeaderViewModel extends Omit<PageHeaderDesktop | PageHeaderMobile, 'logoImage' | 'logoImageStyle' | 'isLogoOptional' | 'viewport' | 'isLogoVisible' | 'logoTemplateImage' | 'logoImageHeight' | 'logoImageWidth' | 'headerButton' | 'backgroundStyle'> {
|
|
136
136
|
logo: LogoViewModel;
|
|
137
137
|
pages: PageViewModel[];
|
|
138
138
|
backgroundStyle: BrandPageCssStyle;
|
|
139
|
+
/** Absent unless the header call-to-action button is configured AND visible. */
|
|
140
|
+
headerButtonViewModel?: ButtonViewModel;
|
|
139
141
|
}
|
|
140
142
|
export interface PageFooterViewModel extends Omit<PageFooterDesktop | PageFooterMobile, 'logoImage' | 'logoImageStyle' | 'isLogoOptional' | 'viewport' | 'isLogoVisible' | 'logoTemplateImage' | 'logoImageHeight' | 'logoImageWidth'> {
|
|
141
143
|
logo: LogoViewModel;
|
|
@@ -1127,7 +1127,7 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
|
|
|
1127
1127
|
sectionName: import("@shared/page-settings/store").PageSettingsSection;
|
|
1128
1128
|
propName: keyof import("@shared/page-settings/store").PageSettingsStateSectionStyles;
|
|
1129
1129
|
index?: number;
|
|
1130
|
-
value: string | boolean | import("@brand-page").LinksItem[] | BrandPageCssStyle | Partial<import("@brand-page").ImageGalleryItem> | number | null | undefined;
|
|
1130
|
+
value: string | boolean | import("@brand-page").LinksItem[] | BrandPageCssStyle | Partial<import("@brand-page").ImageGalleryItem> | import("@brand-page").HeaderButton | number | null | undefined;
|
|
1131
1131
|
merge?: boolean;
|
|
1132
1132
|
viewport: ViewportsType;
|
|
1133
1133
|
}): void;
|
package/lib/src/brand-page-maker/components/brandpage-maker-page/BrandPageMakerPage.mixin.d.ts
CHANGED
|
@@ -1110,7 +1110,7 @@ declare const _default: import("vue").DefineComponent<{}, {
|
|
|
1110
1110
|
sectionName: import("@shared/page-settings/store").PageSettingsSection;
|
|
1111
1111
|
propName: keyof import("@shared/page-settings/store").PageSettingsStateSectionStyles;
|
|
1112
1112
|
index?: number;
|
|
1113
|
-
value: string | boolean | import("@brand-page").LinksItem[] | BrandPageCssStyle | Partial<import("@brand-page").ImageGalleryItem> | number | null | undefined;
|
|
1113
|
+
value: string | boolean | import("@brand-page").LinksItem[] | BrandPageCssStyle | Partial<import("@brand-page").ImageGalleryItem> | import("@brand-page").HeaderButton | number | null | undefined;
|
|
1114
1114
|
merge?: boolean;
|
|
1115
1115
|
viewport: import("@brand-page").ViewportsType;
|
|
1116
1116
|
}): void;
|