@designcrowd/library.brand-page 6.1.17-ast-optional-button-3 → 6.1.17-ast-duplicate
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-Cu_ukOxI.js → CreatedOnBrandCrowd-de-de-Bz5w6xY7.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-en-us-BK04pmL9.js → CreatedOnBrandCrowd-en-us-CcDoBjme.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-es-es-DfREN5ib.js → CreatedOnBrandCrowd-es-es-D8e1mbkt.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-fr-fr-C0_zl1cL.js → CreatedOnBrandCrowd-fr-ca-ZJ_zEHZC.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-fr-ca-C0_zl1cL.js → CreatedOnBrandCrowd-fr-fr-ZJ_zEHZC.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-pt-pt-CKQK6zH9.js → CreatedOnBrandCrowd-pt-br-DxPXv2g2.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-pt-br-CKQK6zH9.js → CreatedOnBrandCrowd-pt-pt-DxPXv2g2.js} +1 -1
- package/lib/src/{CreatedOnDcom-de-de-yrdfxkUi.js → CreatedOnDcom-de-de-C2RXJmc_.js} +1 -1
- package/lib/src/{CreatedOnDcom-en-us-DanUrMxL.js → CreatedOnDcom-en-us-D9edHsj5.js} +1 -1
- package/lib/src/{CreatedOnDcom-es-es-D8d_PqxB.js → CreatedOnDcom-es-es-i4YR-7lH.js} +1 -1
- package/lib/src/{CreatedOnDcom-fr-ca-C1-28hQH.js → CreatedOnDcom-fr-ca-C2mq_W_H.js} +1 -1
- package/lib/src/{CreatedOnDcom-fr-fr-DKm8kfeQ.js → CreatedOnDcom-fr-fr-DD0VktYV.js} +1 -1
- package/lib/src/{CreatedOnDcom-pt-br-DQN8j45I.js → CreatedOnDcom-pt-br-BgVjPCIg.js} +1 -1
- package/lib/src/{CreatedOnDcom-pt-pt-Bq9n3MeJ.js → CreatedOnDcom-pt-pt-DqHGGZby.js} +1 -1
- package/lib/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.mixin.d.ts +2 -16
- package/lib/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.mixin.js +0 -17
- package/lib/src/brand-page/components/page/Page.mixin.d.ts +1 -2
- package/lib/src/brand-page/components/page/Page.mixin.js +7 -12
- package/lib/src/brand-page/components/page-header/HeaderLayout.stories.d.ts +0 -1
- package/lib/src/brand-page/components/page-header/HeaderLayout.stories.js +0 -9
- package/lib/src/brand-page/components/page-header/PageHeader.mixin.d.ts +1 -3
- package/lib/src/brand-page/components/page-header/PageHeader.mixin.js +4 -10
- package/lib/src/brand-page/constants/sections/header-display.constants.d.ts +0 -3
- package/lib/src/brand-page/constants/sections/header-display.constants.js +0 -15
- package/lib/src/brand-page/models/index.d.ts +0 -12
- package/lib/src/brand-page/models/index.js +0 -4
- package/lib/src/brand-page/utils/button.util.d.ts +0 -5
- package/lib/src/brand-page/utils/button.util.js +0 -4
- package/lib/src/brand-page/utils/context.util.d.ts +0 -1
- package/lib/src/brand-page/utils/context.util.js +0 -9
- package/lib/src/brand-page/utils/route.util.d.ts +0 -1
- package/lib/src/brand-page/utils/route.util.js +0 -9
- package/lib/src/brand-page/utils/view-model.util.js +1 -53
- package/lib/src/brand-page/view-models.d.ts +1 -3
- package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.d.ts +8 -2
- package/lib/src/brand-page-maker/components/brandpage-maker-page/BrandPageMakerPage.mixin.d.ts +6 -2
- package/lib/src/brand-page-maker/composables/useEventTracker.d.ts +3 -0
- package/lib/src/brand-page-maker/composables/useEventTracker.js +11 -0
- package/lib/src/brand-page-maker/stores/ai-checkpoint/ai-checkpoint-store.d.ts +16 -1642
- package/lib/src/brand-page-maker/validators/section-button.validator.d.ts +1 -3
- package/lib/src/{bundled-translations-KY0aSmMp.js → bundled-translations-CFsLTrMp.js} +17 -17
- package/lib/src/{bundled-translations.de-DE-BIFi4bYj.js → bundled-translations.de-DE-FhH2H_rd.js} +9 -9
- package/lib/src/{bundled-translations.es-ES-CHlKuPLO.js → bundled-translations.es-ES-_ZExxMi7.js} +5 -5
- package/lib/src/{bundled-translations.fr-CA-DR1fvm8e.js → bundled-translations.fr-CA-Tg-ODIiC.js} +1 -1
- package/lib/src/{bundled-translations.fr-FR-DnpWVIQg.js → bundled-translations.fr-FR-C0sU51Mz.js} +9 -9
- package/lib/src/{bundled-translations.pt-BR-p8szTOiT.js → bundled-translations.pt-BR-MYFIhA4u.js} +17 -17
- package/lib/src/{bundled-translations.pt-PT-DEk39NhW.js → bundled-translations.pt-PT-DeUBSzCB.js} +22 -22
- package/lib/src/bundles/bundled-translations.de-DE.json +1 -6
- package/lib/src/bundles/bundled-translations.es-ES.json +1 -6
- package/lib/src/bundles/bundled-translations.fr-CA.json +1 -6
- package/lib/src/bundles/bundled-translations.fr-FR.json +1 -6
- package/lib/src/bundles/bundled-translations.json +4 -7
- package/lib/src/bundles/bundled-translations.pt-BR.json +1 -6
- package/lib/src/bundles/bundled-translations.pt-PT.json +1 -6
- package/lib/src/composables/useTranslate.d.ts +1 -1
- package/lib/src/composables/useTranslate.js +1 -1
- package/lib/src/css/library.brand-page-brandCrowd.min.css +149 -401
- package/lib/src/css/library.brand-page-brandPage.min.css +149 -402
- package/lib/src/css/library.brand-page-designCom.min.css +149 -401
- package/lib/src/css/library.brand-page-preview.min.css +149 -401
- package/lib/src/index.mjs +2 -2
- package/lib/src/{lib-6Z0OQVEM.js → lib-Dn6SsFX-.js} +30394 -30853
- package/lib/src/shared/content-settings/components/content-settings/ContentSettings.mixin.d.ts +9 -2
- package/lib/src/shared/content-settings/components/content-settings/ReplaceImageSettingsForContent.mixin.d.ts +6 -1
- package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItem.mixin.d.ts +1 -0
- package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.d.ts +5 -1
- package/lib/src/shared/content-settings/components/payment-config-field/PaymentConfigField.mixin.d.ts +5 -1
- package/lib/src/shared/ecommerce-settings/util/refreshDuplicatedMetadata.d.ts +14 -0
- package/lib/src/shared/ecommerce-settings/util/refreshDuplicatedMetadata.js +15 -2
- package/lib/src/shared/logo-settings/components/EditLogoSettings.mixin.d.ts +1 -0
- package/lib/src/shared/logo-settings/components/LogoSettings.mixin.d.ts +5 -1
- package/lib/src/shared/page-navigation/store/page-navigation-store.d.ts +3 -1
- package/lib/src/shared/page-navigation/store/page-navigation-store.js +27 -8
- 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 +8 -2
- package/lib/src/shared/page-settings/components/page-settings/PageSettings.mixin.d.ts +12 -190
- package/lib/src/shared/page-settings/components/page-settings/PageSettings.mixin.js +13 -0
- package/lib/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.d.ts +7 -184
- package/lib/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.js +2 -34
- package/lib/src/shared/page-settings/duplicate-page.util.d.ts +4 -0
- package/lib/src/shared/page-settings/duplicate-page.util.js +75 -0
- package/lib/src/shared/page-settings/models.d.ts +1 -0
- package/lib/src/shared/page-settings/store/page-settings-store.d.ts +6 -2
- package/lib/src/shared/page-settings/store/page-settings-store.js +58 -7
- package/lib/src/shared/publish-brand-page-with-state/PublishBrandPageModalWithState.mixin.d.ts +1 -0
- package/lib/src/shared/side-bar/components/SideBarTabButton.mixin.d.ts +1 -0
- package/lib/src/shared/style-settings/components/StyleSettings.mixin.d.ts +1 -3
- package/lib/src/shared/template-settings/components/TemplatesSettings.mixin.d.ts +1 -0
- package/lib/src/tracker.mjs +1 -1
- package/lib/src/{useEventTracker-C5Ql5p7u.js → useEventTracker-BPE7Rq9Q.js} +14 -3
- package/package.json +2 -2
- package/src/brand-page/components/button/Button.vue +8 -33
- package/src/brand-page/components/button/Button.vue.test.ts +0 -58
- package/src/brand-page/components/navigation/hamburger/HamburgerNavigation.vue +0 -1
- package/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.mixin.ts +1 -18
- package/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.vue +3 -64
- package/src/brand-page/components/page/Page.mixin.ts +11 -21
- package/src/brand-page/components/page/Page.vue +0 -2
- package/src/brand-page/components/page-header/HeaderLayout.stories.ts +0 -10
- package/src/brand-page/components/page-header/HeaderLayout.vue +65 -195
- package/src/brand-page/components/page-header/PageHeader.mixin.ts +10 -14
- package/src/brand-page/components/page-header/PageHeader.vue +1 -21
- package/src/brand-page/constants/sections/header-display.constants.ts +0 -35
- package/src/brand-page/models/index.ts +0 -19
- package/src/brand-page/utils/button.util.ts +0 -8
- package/src/brand-page/utils/context.util.ts +0 -15
- package/src/brand-page/utils/route.util.ts +0 -13
- package/src/brand-page/utils/view-model.util.test.ts +1 -151
- package/src/brand-page/utils/view-model.util.ts +1 -73
- package/src/brand-page/view-models.ts +0 -3
- package/src/brand-page-maker/composables/useEventTracker.ts +14 -0
- package/src/brand-page-maker/validators/section-button.validator.ts +3 -9
- package/src/bundles/bundled-translations.de-DE.json +1 -6
- package/src/bundles/bundled-translations.es-ES.json +1 -6
- package/src/bundles/bundled-translations.fr-CA.json +1 -6
- package/src/bundles/bundled-translations.fr-FR.json +1 -6
- package/src/bundles/bundled-translations.json +4 -7
- package/src/bundles/bundled-translations.pt-BR.json +1 -6
- package/src/bundles/bundled-translations.pt-PT.json +1 -6
- package/src/composables/useTranslate.ts +2 -1
- package/src/shared/content-settings/components/url-field/UrlField.vue +0 -1
- package/src/shared/ecommerce-settings/util/refreshDuplicatedMetadata.ts +17 -3
- package/src/shared/page-navigation/store/page-navigation-store.ts +48 -12
- package/src/shared/page-settings/components/header-settings-panel/HeaderSettingsPanel.vue +10 -65
- package/src/shared/page-settings/components/page-settings/NestedDraggable.vue +3 -0
- package/src/shared/page-settings/components/page-settings/PageElement.vue +2 -0
- package/src/shared/page-settings/components/page-settings/PageSettingMenu.test.ts +106 -0
- package/src/shared/page-settings/components/page-settings/PageSettingMenu.vue +16 -0
- package/src/shared/page-settings/components/page-settings/PageSettings.mixin.ts +24 -0
- package/src/shared/page-settings/components/page-settings/PageSettings.vue +1 -0
- package/src/shared/page-settings/components/page-settings/i18n/page-settings.json +3 -1
- package/src/shared/page-settings/components/page-settings-section-styles/HeaderDisplayStyle.vue +8 -14
- package/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.ts +1 -38
- package/src/shared/page-settings/components/page-settings-section-styles/i18n/page-settings-section.de-DE.json +1 -6
- package/src/shared/page-settings/components/page-settings-section-styles/i18n/page-settings-section.es-ES.json +1 -6
- package/src/shared/page-settings/components/page-settings-section-styles/i18n/page-settings-section.fr-CA.json +1 -6
- package/src/shared/page-settings/components/page-settings-section-styles/i18n/page-settings-section.fr-FR.json +1 -6
- package/src/shared/page-settings/components/page-settings-section-styles/i18n/page-settings-section.json +1 -6
- package/src/shared/page-settings/components/page-settings-section-styles/i18n/page-settings-section.pt-BR.json +1 -6
- package/src/shared/page-settings/components/page-settings-section-styles/i18n/page-settings-section.pt-PT.json +1 -6
- package/src/shared/page-settings/duplicate-page.util.test.ts +320 -0
- package/src/shared/page-settings/duplicate-page.util.ts +107 -0
- package/src/shared/page-settings/models.ts +1 -0
- package/src/shared/page-settings/store/page-settings-store.test.ts +285 -0
- package/src/shared/page-settings/store/page-settings-store.ts +100 -13
- package/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.vue.test.ts +0 -181
- package/src/brand-page/components/page-header/PageHeader.vue.test.ts +0 -339
- package/src/brand-page/constants/sections/header-display.constants.test.ts +0 -44
- package/src/brand-page/models/header-button.model.test.ts +0 -85
- package/src/shared/page-settings/components/header-settings-panel/HeaderSettingsPanel.button-section.test.ts +0 -131
- package/src/shared/page-settings/components/page-settings-section-styles/HeaderButtonSettings.test.ts +0 -263
- package/src/shared/page-settings/components/page-settings-section-styles/HeaderButtonSettings.vue +0 -263
- package/src/shared/page-settings/components/page-settings-section-styles/HeaderDisplayStyle.test.ts +0 -170
- package/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.header-button.test.ts +0 -114
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 {
|
|
3
|
+
import type { NavItemViewModel } from '../../../view-models';
|
|
4
4
|
declare const _default: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
5
5
|
context: {
|
|
6
6
|
type: PropType<BrandPageContext>;
|
|
@@ -18,11 +18,6 @@ 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
21
|
}>, {}, {
|
|
27
22
|
expandedItems: Record<string, boolean>;
|
|
28
23
|
}, {
|
|
@@ -32,14 +27,12 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
|
|
|
32
27
|
selectedButtonStyle(): BrandPageCssStyle;
|
|
33
28
|
defaultWrapperStyle(): BrandPageCssStyle;
|
|
34
29
|
selectedWrapperStyle(): BrandPageCssStyle;
|
|
35
|
-
showHeaderButton(): boolean;
|
|
36
30
|
routes(): any[];
|
|
37
31
|
}, {
|
|
38
32
|
filterHiddenNavItems(navItems: NavItemViewModel[]): NavItemViewModel[];
|
|
39
33
|
isCurrentPage(navItem: NavItemViewModel): boolean;
|
|
40
34
|
getSubNavItemStyle(navItem: NavItemViewModel): BrandPageCssStyle;
|
|
41
35
|
closeSideMenu(): void;
|
|
42
|
-
onSideMenuCtaClick(event: MouseEvent): void;
|
|
43
36
|
toggleExpanded(pageId: string): void;
|
|
44
37
|
isExpanded(pageId: string): boolean;
|
|
45
38
|
expandSubPageIfCurrentPage(): void;
|
|
@@ -60,14 +53,7 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
|
|
|
60
53
|
type: PropType<NavigationDesktop | NavigationMobile>;
|
|
61
54
|
required: true;
|
|
62
55
|
};
|
|
63
|
-
headerButtonViewModel: {
|
|
64
|
-
type: PropType<ButtonViewModel>;
|
|
65
|
-
required: false;
|
|
66
|
-
default: undefined;
|
|
67
|
-
};
|
|
68
56
|
}>> & Readonly<{
|
|
69
57
|
"onClose-side-menu"?: ((...args: any[]) => any) | undefined;
|
|
70
|
-
}>, {
|
|
71
|
-
headerButtonViewModel: ButtonViewModel;
|
|
72
|
-
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
58
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
|
|
73
59
|
export default _default;
|
package/lib/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.mixin.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { defineComponent } from 'vue';
|
|
2
2
|
import { resolveSubNavItemBackgroundColor } from '../../../models';
|
|
3
|
-
import { guardPreviewClick } from '../../../utils/context.util';
|
|
4
3
|
export default defineComponent({
|
|
5
4
|
props: {
|
|
6
5
|
context: {
|
|
@@ -19,13 +18,6 @@ export default defineComponent({
|
|
|
19
18
|
type: Object,
|
|
20
19
|
required: true,
|
|
21
20
|
},
|
|
22
|
-
// Provided only when the header row does not render the CTA (the caller
|
|
23
|
-
// decides via headerRowRendersCta) — absent means the side menu shows none.
|
|
24
|
-
headerButtonViewModel: {
|
|
25
|
-
type: Object,
|
|
26
|
-
required: false,
|
|
27
|
-
default: undefined,
|
|
28
|
-
},
|
|
29
21
|
},
|
|
30
22
|
emits: ['close-side-menu'],
|
|
31
23
|
data() {
|
|
@@ -58,9 +50,6 @@ export default defineComponent({
|
|
|
58
50
|
const { fontSize: _fontSize, lineHeight: _lineHeight, letterSpacing: _letterSpacing, ...rest } = this.selectedButtonStyle;
|
|
59
51
|
return rest;
|
|
60
52
|
},
|
|
61
|
-
showHeaderButton() {
|
|
62
|
-
return Boolean(this.headerButtonViewModel);
|
|
63
|
-
},
|
|
64
53
|
routes() {
|
|
65
54
|
return this.visibleNavItems.map((navItem, _i) => {
|
|
66
55
|
return {
|
|
@@ -96,12 +85,6 @@ export default defineComponent({
|
|
|
96
85
|
closeSideMenu() {
|
|
97
86
|
this.$emit('close-side-menu');
|
|
98
87
|
},
|
|
99
|
-
// Preview: inert; published: follow the link and close the side menu behind it.
|
|
100
|
-
onSideMenuCtaClick(event) {
|
|
101
|
-
if (!guardPreviewClick(event, this.context)) {
|
|
102
|
-
this.closeSideMenu();
|
|
103
|
-
}
|
|
104
|
-
},
|
|
105
88
|
toggleExpanded(pageId) {
|
|
106
89
|
const isCurrentlyExpanded = this.expandedItems[pageId];
|
|
107
90
|
this.expandedItems = {};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { PropType } from 'vue';
|
|
2
|
-
import type { BrandPageViewModel,
|
|
2
|
+
import type { BrandPageViewModel, ContentViewModel, PageViewModel } from '@brand-page/view-models';
|
|
3
3
|
import type { BackgroundShape, BrandPageContext, ViewportsType } from '@brand-page/models';
|
|
4
4
|
declare const _default: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
5
5
|
context: {
|
|
@@ -81,7 +81,6 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
|
|
|
81
81
|
headerViewModelDesktop(): any;
|
|
82
82
|
isNavigationEmbeddedInLogoMobile(): boolean;
|
|
83
83
|
isNavigationEmbeddedInLogoDesktop(): boolean;
|
|
84
|
-
sideMenuHeaderButtonViewModel(): ButtonViewModel | undefined;
|
|
85
84
|
shouldShowNavigation(): boolean;
|
|
86
85
|
showNavigationAfterLogoMobile(): boolean;
|
|
87
86
|
showNavigationAfterLogoDesktop(): boolean;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { defineComponent } from 'vue';
|
|
2
|
-
import { DEFAULT_FONT_FAMILY_KEY, FALLBACK_FONT_FAMILIES, FONT_FAMILY_CONFIGS,
|
|
2
|
+
import { DEFAULT_FONT_FAMILY_KEY, FALLBACK_FONT_FAMILIES, FONT_FAMILY_CONFIGS, } from '../../constants';
|
|
3
3
|
import { getSlugFromContext, getPageHeadingText, buildPaletteRootCss, buildPaletteScopedCss, PAGE_SCOPE_ID_ATTRIBUTE, resolveColorReference, } from '@brand-page/utils';
|
|
4
|
-
import { findNavItemByRelativePath
|
|
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';
|
|
7
7
|
// Per-instance id for a `Page` instance. Deliberately generic — any per-instance
|
|
@@ -276,17 +276,12 @@ export default defineComponent({
|
|
|
276
276
|
this.contents[0]?.type === 'logo' &&
|
|
277
277
|
this.viewModel.pages.length > 1);
|
|
278
278
|
},
|
|
279
|
-
// The button shows in the header row OR in the side menu, never both. This gives it to the side menu when the header doesn't show it; undefined = no button in the menu.
|
|
280
|
-
sideMenuHeaderButtonViewModel() {
|
|
281
|
-
const header = this.viewModel.headerViewModelMobile;
|
|
282
|
-
if (!header.headerButtonViewModel ||
|
|
283
|
-
headerRowRendersCta(header.displayStyle, this.shouldShowNavigation)) {
|
|
284
|
-
return undefined;
|
|
285
|
-
}
|
|
286
|
-
return header.headerButtonViewModel;
|
|
287
|
-
},
|
|
288
279
|
shouldShowNavigation() {
|
|
289
|
-
|
|
280
|
+
// Show navigation if more than 1 non-hidden page exists, or if there's 1 page with non-hidden subpages
|
|
281
|
+
const visibleNavItems = this.context.nav.navItems.filter((item) => !item.isHidden);
|
|
282
|
+
return (visibleNavItems.length > 1 ||
|
|
283
|
+
(visibleNavItems.length === 1 &&
|
|
284
|
+
visibleNavItems[0].nestedNavItems.some((item) => !item.isHidden)));
|
|
290
285
|
},
|
|
291
286
|
showNavigationAfterLogoMobile() {
|
|
292
287
|
return (!this.context.isBrandSite &&
|
|
@@ -36,7 +36,6 @@ const Template = (args) => ({
|
|
|
36
36
|
nav-id="nav-1"
|
|
37
37
|
:show-nav="args.showNav"
|
|
38
38
|
:display-style="args.displayStyle"
|
|
39
|
-
:has-cta="args.hasCta"
|
|
40
39
|
logo-width="100px"
|
|
41
40
|
>
|
|
42
41
|
<template v-slot:logo>
|
|
@@ -45,9 +44,6 @@ const Template = (args) => ({
|
|
|
45
44
|
<template v-slot:nav>
|
|
46
45
|
<div style="border: 1px solid red; display: inline-block;">Nav | Nav | Nav | Nav | Nav | Nav | Nav | Nav</div>
|
|
47
46
|
</template>
|
|
48
|
-
<template v-slot:cta>
|
|
49
|
-
<div style="border: 1px solid green; display: inline-block; padding: 8px 16px;">Contact Us</div>
|
|
50
|
-
</template>
|
|
51
47
|
</HeaderLayout>
|
|
52
48
|
</div>
|
|
53
49
|
`,
|
|
@@ -56,8 +52,3 @@ export const Sample = Template.bind({});
|
|
|
56
52
|
Sample.args = {
|
|
57
53
|
displayStyle: HEADER_DISPLAY.DESKTOP_TAB_5,
|
|
58
54
|
};
|
|
59
|
-
export const WithHeaderButton = Template.bind({});
|
|
60
|
-
WithHeaderButton.args = {
|
|
61
|
-
displayStyle: HEADER_DISPLAY.DESKTOP_TAB_1,
|
|
62
|
-
hasCta: true,
|
|
63
|
-
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { PropType } from 'vue';
|
|
2
2
|
import type { BrandPageContext } from '@brand-page/models';
|
|
3
|
-
import type {
|
|
3
|
+
import type { 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,11 +23,9 @@ 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;
|
|
27
26
|
showNav(): boolean;
|
|
28
27
|
}, {
|
|
29
28
|
onHeaderContainerClick(): void;
|
|
30
|
-
onHeaderCtaClick(event: MouseEvent): void;
|
|
31
29
|
}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, "header-container-click"[], "header-container-click", import("vue").PublicProps, Readonly<import("vue").ExtractPropTypes<{
|
|
32
30
|
navId: {
|
|
33
31
|
type: StringConstructor;
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { defineComponent } from 'vue';
|
|
2
2
|
import { LOGO_SLIDER_DESKTOP_MAX } from '../../constants';
|
|
3
|
-
import { hasVisibleNavigation } from '../../utils/route.util';
|
|
4
|
-
import { guardPreviewClick } from '../../utils/context.util';
|
|
5
3
|
export default defineComponent({
|
|
6
4
|
props: {
|
|
7
5
|
navId: {
|
|
@@ -35,11 +33,11 @@ export default defineComponent({
|
|
|
35
33
|
padding: '1.5rem 0', // var(--page-padding) 0
|
|
36
34
|
};
|
|
37
35
|
},
|
|
38
|
-
headerButtonViewModel() {
|
|
39
|
-
return this.viewModel.headerButtonViewModel;
|
|
40
|
-
},
|
|
41
36
|
showNav() {
|
|
42
|
-
|
|
37
|
+
const visibleNavItems = this.context.nav.navItems.filter((item) => !item.isHidden);
|
|
38
|
+
return (visibleNavItems.length > 1 ||
|
|
39
|
+
(visibleNavItems.length === 1 &&
|
|
40
|
+
visibleNavItems[0].nestedNavItems.some((item) => !item.isHidden)));
|
|
43
41
|
},
|
|
44
42
|
},
|
|
45
43
|
emits: ['header-container-click'],
|
|
@@ -47,9 +45,5 @@ export default defineComponent({
|
|
|
47
45
|
onHeaderContainerClick() {
|
|
48
46
|
this.$emit('header-container-click');
|
|
49
47
|
},
|
|
50
|
-
// Preview only: deliberately inert — no link-follow, no Header Settings open.
|
|
51
|
-
onHeaderCtaClick(event) {
|
|
52
|
-
guardPreviewClick(event, this.context);
|
|
53
|
-
},
|
|
54
48
|
},
|
|
55
49
|
});
|
|
@@ -42,9 +42,6 @@ interface HeaderDisplayStyleConfig {
|
|
|
42
42
|
supportLogo: boolean;
|
|
43
43
|
supportedNavTypes: string[];
|
|
44
44
|
option: ButtonGroupOption;
|
|
45
|
-
withButtonIconName?: string;
|
|
46
45
|
}
|
|
47
46
|
export declare const HEADER_DISPLAY_STYLE_CONFIGS: HeaderDisplayStyleConfig[];
|
|
48
|
-
/** True when the header row shows the button; mobile hamburger styles put it in the side menu instead (unless the nav is hidden — then there is no side menu). */
|
|
49
|
-
export declare const headerRowRendersCta: (displayStyle: string, showNav: boolean) => boolean;
|
|
50
47
|
export {};
|
|
@@ -48,7 +48,6 @@ export const HEADER_DISPLAY_STYLE_CONFIGS = [
|
|
|
48
48
|
dataAttribute: HEADER_DISPLAY.DESKTOP_TAB_1,
|
|
49
49
|
isSelected: false,
|
|
50
50
|
},
|
|
51
|
-
withButtonIconName: 'header-desktop-nav-style-tab-display-style-with-button-1',
|
|
52
51
|
},
|
|
53
52
|
{
|
|
54
53
|
viewMode: 'desktop',
|
|
@@ -62,7 +61,6 @@ export const HEADER_DISPLAY_STYLE_CONFIGS = [
|
|
|
62
61
|
dataAttribute: HEADER_DISPLAY.DESKTOP_TAB_2,
|
|
63
62
|
isSelected: false,
|
|
64
63
|
},
|
|
65
|
-
withButtonIconName: 'header-desktop-nav-style-tab-display-style-with-button-2',
|
|
66
64
|
},
|
|
67
65
|
{
|
|
68
66
|
viewMode: 'desktop',
|
|
@@ -76,7 +74,6 @@ export const HEADER_DISPLAY_STYLE_CONFIGS = [
|
|
|
76
74
|
dataAttribute: HEADER_DISPLAY.DESKTOP_TAB_3,
|
|
77
75
|
isSelected: false,
|
|
78
76
|
},
|
|
79
|
-
withButtonIconName: 'header-desktop-nav-style-tab-display-style-with-button-3',
|
|
80
77
|
},
|
|
81
78
|
{
|
|
82
79
|
viewMode: 'desktop',
|
|
@@ -90,7 +87,6 @@ export const HEADER_DISPLAY_STYLE_CONFIGS = [
|
|
|
90
87
|
dataAttribute: HEADER_DISPLAY.DESKTOP_TAB_4,
|
|
91
88
|
isSelected: false,
|
|
92
89
|
},
|
|
93
|
-
withButtonIconName: 'header-desktop-nav-style-tab-display-style-with-button-4',
|
|
94
90
|
},
|
|
95
91
|
{
|
|
96
92
|
viewMode: 'desktop',
|
|
@@ -104,7 +100,6 @@ export const HEADER_DISPLAY_STYLE_CONFIGS = [
|
|
|
104
100
|
dataAttribute: HEADER_DISPLAY.DESKTOP_TAB_5,
|
|
105
101
|
isSelected: false,
|
|
106
102
|
},
|
|
107
|
-
withButtonIconName: 'header-desktop-nav-style-tab-display-style-with-button-5',
|
|
108
103
|
},
|
|
109
104
|
{
|
|
110
105
|
viewMode: 'desktop',
|
|
@@ -118,7 +113,6 @@ export const HEADER_DISPLAY_STYLE_CONFIGS = [
|
|
|
118
113
|
dataAttribute: HEADER_DISPLAY.DESKTOP_TAB_6,
|
|
119
114
|
isSelected: false,
|
|
120
115
|
},
|
|
121
|
-
withButtonIconName: 'header-desktop-nav-style-tab-display-style-with-button-6',
|
|
122
116
|
},
|
|
123
117
|
// desktop - tab with no logo
|
|
124
118
|
{
|
|
@@ -178,7 +172,6 @@ export const HEADER_DISPLAY_STYLE_CONFIGS = [
|
|
|
178
172
|
dataAttribute: HEADER_DISPLAY.DESKTOP_HAMBURGER_1,
|
|
179
173
|
isSelected: false,
|
|
180
174
|
},
|
|
181
|
-
withButtonIconName: 'header-desktop-nav-style-hamburger-display-style-with-button-1',
|
|
182
175
|
},
|
|
183
176
|
{
|
|
184
177
|
viewMode: 'desktop',
|
|
@@ -197,7 +190,6 @@ export const HEADER_DISPLAY_STYLE_CONFIGS = [
|
|
|
197
190
|
dataAttribute: HEADER_DISPLAY.DESKTOP_HAMBURGER_2,
|
|
198
191
|
isSelected: false,
|
|
199
192
|
},
|
|
200
|
-
withButtonIconName: 'header-desktop-nav-style-hamburger-display-style-with-button-2',
|
|
201
193
|
},
|
|
202
194
|
// desktop - hamburger no logo
|
|
203
195
|
{
|
|
@@ -267,7 +259,6 @@ export const HEADER_DISPLAY_STYLE_CONFIGS = [
|
|
|
267
259
|
dataAttribute: HEADER_DISPLAY.MOBILE_TAB_1,
|
|
268
260
|
isSelected: false,
|
|
269
261
|
},
|
|
270
|
-
withButtonIconName: 'header-mobile-nav-style-tab-display-style-with-button-1',
|
|
271
262
|
},
|
|
272
263
|
{
|
|
273
264
|
viewMode: 'mobile',
|
|
@@ -281,7 +272,6 @@ export const HEADER_DISPLAY_STYLE_CONFIGS = [
|
|
|
281
272
|
dataAttribute: HEADER_DISPLAY.MOBILE_TAB_2,
|
|
282
273
|
isSelected: false,
|
|
283
274
|
},
|
|
284
|
-
withButtonIconName: 'header-mobile-nav-style-tab-display-style-with-button-2',
|
|
285
275
|
},
|
|
286
276
|
// mobile - tab with no logo
|
|
287
277
|
{
|
|
@@ -426,8 +416,3 @@ export const HEADER_DISPLAY_STYLE_CONFIGS = [
|
|
|
426
416
|
},
|
|
427
417
|
},
|
|
428
418
|
];
|
|
429
|
-
/** True when the header row shows the button; mobile hamburger styles put it in the side menu instead (unless the nav is hidden — then there is no side menu). */
|
|
430
|
-
export const headerRowRendersCta = (displayStyle, showNav) => !showNav ||
|
|
431
|
-
!HEADER_DISPLAY_STYLE_CONFIGS.some((config) => config.option.value === displayStyle &&
|
|
432
|
-
config.viewMode === 'mobile' &&
|
|
433
|
-
config.navType === 'hamburger');
|
|
@@ -501,16 +501,6 @@ 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
|
-
}
|
|
514
504
|
type AbstractPageHeaderStylesType = Partial<AbstractPageHeaderStyles>;
|
|
515
505
|
export declare abstract class AbstractPageHeaderStyles {
|
|
516
506
|
displayStyle: HeaderDisplayStyle;
|
|
@@ -535,8 +525,6 @@ export declare abstract class AbstractPageHeaderStyles {
|
|
|
535
525
|
backgroundStyle: BackgroundColorStyle;
|
|
536
526
|
style: BrandPageCssStyle;
|
|
537
527
|
viewport: ViewportsType;
|
|
538
|
-
/** Missing = no button. `declare` keeps it off saved data so old migrations still see the same shape. */
|
|
539
|
-
headerButton?: HeaderButton;
|
|
540
528
|
protected constructor(options?: AbstractPageHeaderStylesType);
|
|
541
529
|
}
|
|
542
530
|
export declare class PageHeaderDesktop extends AbstractPageHeaderStyles {
|
|
@@ -257,10 +257,6 @@ export class AbstractPageHeaderStyles {
|
|
|
257
257
|
...(options.backgroundStyle || {}),
|
|
258
258
|
backgroundOpacity: options.backgroundStyle?.backgroundOpacity ?? 100,
|
|
259
259
|
};
|
|
260
|
-
// Only set when given — a missing button must stay missing for old migrations.
|
|
261
|
-
if (options.headerButton) {
|
|
262
|
-
this.headerButton = options.headerButton;
|
|
263
|
-
}
|
|
264
260
|
}
|
|
265
261
|
}
|
|
266
262
|
export class PageHeaderDesktop extends AbstractPageHeaderStyles {
|
|
@@ -5,11 +5,6 @@ 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];
|
|
13
8
|
export declare const BUTTON_STYLE_BRUSHSTROKE = "BUTTON_STYLE_19";
|
|
14
9
|
export declare const BUTTON_STYLE_ARROW = "BUTTON_STYLE_20";
|
|
15
10
|
export declare const BUTTON_STYLE_PAPER = "BUTTON_STYLE_21";
|
|
@@ -32,10 +32,6 @@ export const getBoxShadowValue = (buttonStyles) => {
|
|
|
32
32
|
}
|
|
33
33
|
return boxShadow;
|
|
34
34
|
};
|
|
35
|
-
export const BUTTON_VARIANTS = {
|
|
36
|
-
section: 'section',
|
|
37
|
-
header: 'header',
|
|
38
|
-
};
|
|
39
35
|
// The "decorative" button styles — brushstroke / arrow / torn-paper — whose visual
|
|
40
36
|
// is drawn by ButtonStyleWrapper rather than plain CSS. Their banner-like SVG
|
|
41
37
|
// decoration needs the button to be reasonably wide to render legibly, so narrow
|
|
@@ -8,4 +8,3 @@ export declare const getSlugFromContext: (context: BrandPageContext) => string;
|
|
|
8
8
|
* placeholders) must keep reading `context.isPreview` directly.
|
|
9
9
|
*/
|
|
10
10
|
export declare const isPreviewMode: (context: BrandPageContext) => boolean;
|
|
11
|
-
export declare const guardPreviewClick: (event: MouseEvent, context: BrandPageContext) => boolean;
|
|
@@ -12,12 +12,3 @@ export const getSlugFromContext = (context) => {
|
|
|
12
12
|
* placeholders) must keep reading `context.isPreview` directly.
|
|
13
13
|
*/
|
|
14
14
|
export const isPreviewMode = (context) => !!(context.isPreview || context.isLivePreview);
|
|
15
|
-
// Blocks a click in the maker preview (no link-follow, no bubbling); true when it fired.
|
|
16
|
-
export const guardPreviewClick = (event, context) => {
|
|
17
|
-
if (!context.isPreview) {
|
|
18
|
-
return false;
|
|
19
|
-
}
|
|
20
|
-
event.preventDefault();
|
|
21
|
-
event.stopPropagation();
|
|
22
|
-
return true;
|
|
23
|
-
};
|
|
@@ -33,4 +33,3 @@ export declare const toRouteLocation: (navItem?: NavItemViewModel) => {
|
|
|
33
33
|
};
|
|
34
34
|
export declare const findNavItemByRelativePath: (navItems: NavItemViewModel[], relativePath: string) => NavItemViewModel | undefined;
|
|
35
35
|
export declare const findNavItemByPageSlug: (navItems: NavItemViewModel[], pageSlug: string) => NavItemViewModel | undefined;
|
|
36
|
-
export declare const hasVisibleNavigation: (navItems: NavItemViewModel[]) => boolean;
|
|
@@ -136,12 +136,3 @@ export const findNavItemByPageSlug = (navItems, pageSlug) => {
|
|
|
136
136
|
}
|
|
137
137
|
return undefined;
|
|
138
138
|
};
|
|
139
|
-
// Nav shows when more than one page is visible, or one page has visible subpages.
|
|
140
|
-
// The header row and the side menu both key the button placement off this — one
|
|
141
|
-
// source so the two can never disagree.
|
|
142
|
-
export const hasVisibleNavigation = (navItems) => {
|
|
143
|
-
const visibleNavItems = navItems.filter((item) => !item.isHidden);
|
|
144
|
-
return (visibleNavItems.length > 1 ||
|
|
145
|
-
(visibleNavItems.length === 1 &&
|
|
146
|
-
visibleNavItems[0].nestedNavItems.some((item) => !item.isHidden)));
|
|
147
|
-
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { reactive } from 'vue';
|
|
2
2
|
import { assertUnreachable } from '../../helpers/ts.helper';
|
|
3
|
-
import { ButtonStyles,
|
|
3
|
+
import { ButtonStyles, 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,57 +691,6 @@ export const mapToPageStyleViewModel = (pageStyles, options) => {
|
|
|
691
691
|
colors: pageStyles.colors ?? [],
|
|
692
692
|
};
|
|
693
693
|
};
|
|
694
|
-
// Maps each link kind to the role Button.vue already understands, so the button needs no new code.
|
|
695
|
-
const HEADER_BUTTON_LINK_ROLES = {
|
|
696
|
-
[BUTTON_LINK_TYPE.url]: 'general-link',
|
|
697
|
-
[BUTTON_LINK_TYPE.page]: 'general-link',
|
|
698
|
-
[BUTTON_LINK_TYPE.mailTo]: 'email',
|
|
699
|
-
[BUTTON_LINK_TYPE.tel]: 'phone',
|
|
700
|
-
};
|
|
701
|
-
const mapToHeaderButtonViewModel = (headerButton, styles) => {
|
|
702
|
-
// No label means no button — hidden in preview and on the published site.
|
|
703
|
-
if (!headerButton?.isVisible || !headerButton.text?.trim()) {
|
|
704
|
-
return undefined;
|
|
705
|
-
}
|
|
706
|
-
const titleStyle = headerButton.buttonTextStyle ?? {
|
|
707
|
-
textStyleType: TEXT_STYLE_TYPES.buttons,
|
|
708
|
-
};
|
|
709
|
-
const viewModel = mapToButtonViewModel({
|
|
710
|
-
id: 'page-header-button',
|
|
711
|
-
// Old saved data may have no link kind — treat it as a url.
|
|
712
|
-
type: HEADER_BUTTON_LINK_ROLES[headerButton.buttonLinkType] ??
|
|
713
|
-
HEADER_BUTTON_LINK_ROLES[BUTTON_LINK_TYPE.url],
|
|
714
|
-
iconUrl: '',
|
|
715
|
-
modalImageUrl: '',
|
|
716
|
-
colorReplacements: [],
|
|
717
|
-
title: headerButton.text.trim(),
|
|
718
|
-
titleStyle,
|
|
719
|
-
url: headerButton.url ?? '',
|
|
720
|
-
page: headerButton.buttonPageId ?? '',
|
|
721
|
-
clickActionField: headerButton.buttonLinkType === BUTTON_LINK_TYPE.page ? 'page' : 'url',
|
|
722
|
-
}, styles, { titleStyle });
|
|
723
|
-
return {
|
|
724
|
-
...viewModel,
|
|
725
|
-
// A wrapped label justifies; the last (or only) line stays centered like a short label.
|
|
726
|
-
titleStyle: {
|
|
727
|
-
...viewModel.titleStyle,
|
|
728
|
-
textAlign: 'justify',
|
|
729
|
-
textAlignLast: 'center',
|
|
730
|
-
},
|
|
731
|
-
styles: {
|
|
732
|
-
...viewModel.styles,
|
|
733
|
-
style: {
|
|
734
|
-
...viewModel.styles.style,
|
|
735
|
-
...(headerButton.fillColor
|
|
736
|
-
? { backgroundColor: headerButton.fillColor }
|
|
737
|
-
: {}),
|
|
738
|
-
...(headerButton.borderColor
|
|
739
|
-
? { borderColor: headerButton.borderColor }
|
|
740
|
-
: {}),
|
|
741
|
-
},
|
|
742
|
-
},
|
|
743
|
-
};
|
|
744
|
-
};
|
|
745
694
|
export const mapToPageHeaderViewModel = (pageHeader, pageStyles, pages, useOldLogoRenderSize = false) => {
|
|
746
695
|
const viewport = pageHeader.viewport;
|
|
747
696
|
const logoContent = {
|
|
@@ -789,7 +738,6 @@ export const mapToPageHeaderViewModel = (pageHeader, pageStyles, pages, useOldLo
|
|
|
789
738
|
}),
|
|
790
739
|
style: pageHeader.style,
|
|
791
740
|
backgroundStyle: getHeaderBackgroundStyleWithOpacity(pageHeader),
|
|
792
|
-
headerButtonViewModel: mapToHeaderButtonViewModel(pageHeader.headerButton, pageStyles),
|
|
793
741
|
};
|
|
794
742
|
};
|
|
795
743
|
// Folds backgroundOpacity into backgroundColor's alpha so only the container's paint fades, not its children.
|
|
@@ -132,12 +132,10 @@ 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' | '
|
|
135
|
+
export interface PageHeaderViewModel extends Omit<PageHeaderDesktop | PageHeaderMobile, 'logoImage' | 'logoImageStyle' | 'isLogoOptional' | 'viewport' | 'isLogoVisible' | 'logoTemplateImage' | 'logoImageHeight' | 'logoImageWidth' | '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;
|
|
141
139
|
}
|
|
142
140
|
export interface PageFooterViewModel extends Omit<PageFooterDesktop | PageFooterMobile, 'logoImage' | 'logoImageStyle' | 'isLogoOptional' | 'viewport' | 'isLogoVisible' | 'logoTemplateImage' | 'logoImageHeight' | 'logoImageWidth'> {
|
|
143
141
|
logo: LogoViewModel;
|