@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.
Files changed (85) hide show
  1. package/lib/src/{CreatedOnBrandCrowd-de-de-CmNhDMIf.js → CreatedOnBrandCrowd-de-de-Cwq9enJs.js} +1 -1
  2. package/lib/src/{CreatedOnBrandCrowd-en-us-DgplxxWa.js → CreatedOnBrandCrowd-en-us-ILK04gFj.js} +1 -1
  3. package/lib/src/{CreatedOnBrandCrowd-es-es-DFdhFOa1.js → CreatedOnBrandCrowd-es-es-CbjxLxtu.js} +1 -1
  4. package/lib/src/{CreatedOnBrandCrowd-fr-fr-DjLCWBLB.js → CreatedOnBrandCrowd-fr-ca-BwBDiK9z.js} +1 -1
  5. package/lib/src/{CreatedOnBrandCrowd-fr-ca-DjLCWBLB.js → CreatedOnBrandCrowd-fr-fr-BwBDiK9z.js} +1 -1
  6. package/lib/src/{CreatedOnBrandCrowd-pt-pt-CI2XD0OS.js → CreatedOnBrandCrowd-pt-br-DvhJROpG.js} +1 -1
  7. package/lib/src/{CreatedOnBrandCrowd-pt-br-CI2XD0OS.js → CreatedOnBrandCrowd-pt-pt-DvhJROpG.js} +1 -1
  8. package/lib/src/{CreatedOnDcom-de-de-CkLkBztx.js → CreatedOnDcom-de-de-BK9imWOh.js} +1 -1
  9. package/lib/src/{CreatedOnDcom-en-us-frnxBJJv.js → CreatedOnDcom-en-us-CyH-_qz1.js} +1 -1
  10. package/lib/src/{CreatedOnDcom-es-es-CrqgiERj.js → CreatedOnDcom-es-es-Dh51qYEA.js} +1 -1
  11. package/lib/src/{CreatedOnDcom-fr-ca-CPoEcusj.js → CreatedOnDcom-fr-ca-BArRxwWX.js} +1 -1
  12. package/lib/src/{CreatedOnDcom-fr-fr-BqrRH3dV.js → CreatedOnDcom-fr-fr-CdglI-ZB.js} +1 -1
  13. package/lib/src/{CreatedOnDcom-pt-br-CpbVi3Sw.js → CreatedOnDcom-pt-br-DCehns-G.js} +1 -1
  14. package/lib/src/{CreatedOnDcom-pt-pt-s0XZ3c7y.js → CreatedOnDcom-pt-pt-B8hl-oew.js} +1 -1
  15. package/lib/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.mixin.d.ts +27 -2
  16. package/lib/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.mixin.js +26 -0
  17. package/lib/src/brand-page/components/page-header/PageHeader.mixin.d.ts +3 -1
  18. package/lib/src/brand-page/components/page-header/PageHeader.mixin.js +12 -0
  19. package/lib/src/brand-page/models/index.d.ts +12 -0
  20. package/lib/src/brand-page/models/index.js +3 -0
  21. package/lib/src/brand-page/utils/button.util.d.ts +5 -0
  22. package/lib/src/brand-page/utils/button.util.js +4 -0
  23. package/lib/src/brand-page/utils/view-model.util.d.ts +1 -0
  24. package/lib/src/brand-page/utils/view-model.util.js +51 -1
  25. package/lib/src/brand-page/view-models.d.ts +3 -1
  26. package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.d.ts +1 -1
  27. package/lib/src/brand-page-maker/components/brandpage-maker-page/BrandPageMakerPage.mixin.d.ts +1 -1
  28. package/lib/src/brand-page-maker/stores/ai-checkpoint/ai-checkpoint-store.d.ts +1008 -0
  29. package/lib/src/{bundled-translations-B2q5GWTQ.js → bundled-translations-B8fAEel0.js} +1 -1
  30. package/lib/src/bundles/bundled-translations.json +7 -1
  31. package/lib/src/css/library.brand-page-brandCrowd.min.css +315 -122
  32. package/lib/src/css/library.brand-page-brandPage.min.css +315 -122
  33. package/lib/src/css/library.brand-page-designCom.min.css +315 -122
  34. package/lib/src/css/library.brand-page-preview.min.css +315 -122
  35. package/lib/src/index.d.ts +1 -0
  36. package/lib/src/index.mjs +45 -44
  37. package/lib/src/{lib-O_eJgJHP.js → lib-KFjPFfxn.js} +31522 -31118
  38. package/lib/src/lib.js +1 -0
  39. package/lib/src/shared/content-settings/components/content-settings/ContentSettings.mixin.d.ts +1 -1
  40. package/lib/src/shared/content-settings/components/content-settings/ReplaceImageSettingsForContent.mixin.d.ts +1 -1
  41. package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.d.ts +1 -1
  42. package/lib/src/shared/content-settings/components/payment-config-field/PaymentConfigField.mixin.d.ts +1 -1
  43. package/lib/src/shared/ecommerce-settings/util/refreshDuplicatedMetadata.d.ts +11 -0
  44. package/lib/src/shared/ecommerce-settings/util/refreshDuplicatedMetadata.js +80 -0
  45. package/lib/src/shared/logo-settings/components/LogoSettings.mixin.d.ts +1 -1
  46. package/lib/src/shared/page-settings/components/delete-page-modal/DeletePageModal.mixin.d.ts +1 -1
  47. package/lib/src/shared/page-settings/components/new-page-modal/NewPageModal.mixin.d.ts +1 -1
  48. package/lib/src/shared/page-settings/components/page-settings/PageSettings.mixin.d.ts +113 -1
  49. package/lib/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.d.ts +117 -2
  50. package/lib/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.js +43 -1
  51. package/lib/src/shared/page-settings/store/page-settings-store.d.ts +2 -2
  52. package/package.json +1 -1
  53. package/src/brand-page/components/button/Button.vue +35 -8
  54. package/src/brand-page/components/button/Button.vue.test.ts +59 -0
  55. package/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.mixin.ts +29 -1
  56. package/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.vue +36 -0
  57. package/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.vue.test.ts +175 -0
  58. package/src/brand-page/components/page/Page.vue +6 -0
  59. package/src/brand-page/components/page-header/HeaderLayout.vue +198 -4
  60. package/src/brand-page/components/page-header/PageHeader.mixin.ts +16 -1
  61. package/src/brand-page/components/page-header/PageHeader.vue +23 -1
  62. package/src/brand-page/components/page-header/PageHeader.vue.test.ts +378 -0
  63. package/src/brand-page/models/header-button.model.test.ts +86 -0
  64. package/src/brand-page/models/index.ts +16 -0
  65. package/src/brand-page/utils/__snapshots__/migration.util.test.ts.snap +6 -0
  66. package/src/brand-page/utils/__snapshots__/migration2.util.test.ts.snap +2 -0
  67. package/src/brand-page/utils/__snapshots__/model.util.test.ts.snap +4 -0
  68. package/src/brand-page/utils/button.util.ts +8 -0
  69. package/src/brand-page/utils/view-model.util.test.ts +146 -1
  70. package/src/brand-page/utils/view-model.util.ts +71 -1
  71. package/src/brand-page/view-models.ts +3 -0
  72. package/src/bundles/bundled-translations.json +7 -1
  73. package/src/lib.ts +1 -0
  74. package/src/shared/ecommerce-settings/util/refreshDuplicatedMetadata.test.ts +399 -0
  75. package/src/shared/ecommerce-settings/util/refreshDuplicatedMetadata.ts +99 -0
  76. package/src/shared/page-settings/components/header-settings-panel/HeaderSettingsPanel.button-section.test.ts +126 -0
  77. package/src/shared/page-settings/components/header-settings-panel/HeaderSettingsPanel.vue +43 -6
  78. package/src/shared/page-settings/components/page-settings-section-styles/HeaderButtonSettings.test.ts +167 -0
  79. package/src/shared/page-settings/components/page-settings-section-styles/HeaderButtonSettings.vue +237 -0
  80. package/src/shared/page-settings/components/page-settings-section-styles/HeaderDisplayStyle.test.ts +160 -0
  81. package/src/shared/page-settings/components/page-settings-section-styles/HeaderDisplayStyle.vue +37 -8
  82. package/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.header-button.test.ts +113 -0
  83. package/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.ts +47 -0
  84. package/src/shared/page-settings/components/page-settings-section-styles/i18n/page-settings-section.json +7 -1
  85. package/src/shared/page-settings/store/page-settings-store.ts +2 -0
@@ -1,5 +1,5 @@
1
1
  import { openBlock as e, createElementBlock as l, createStaticVNode as a } from "vue";
2
- import { _ as t } from "./lib-O_eJgJHP.js";
2
+ import { _ as t } from "./lib-KFjPFfxn.js";
3
3
  const i = {}, h = {
4
4
  width: "275",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as e, createElementBlock as l, createStaticVNode as a } from "vue";
2
- import { _ as t } from "./lib-O_eJgJHP.js";
2
+ import { _ as t } from "./lib-KFjPFfxn.js";
3
3
  const i = {}, h = {
4
4
  width: "251",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as e, createElementBlock as l, createStaticVNode as a } from "vue";
2
- import { _ as t } from "./lib-O_eJgJHP.js";
2
+ import { _ as t } from "./lib-KFjPFfxn.js";
3
3
  const i = {}, h = {
4
4
  width: "250",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as e, createElementBlock as l, createStaticVNode as a } from "vue";
2
- import { _ as t } from "./lib-O_eJgJHP.js";
2
+ import { _ as t } from "./lib-KFjPFfxn.js";
3
3
  const i = {}, h = {
4
4
  width: "237",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as e, createElementBlock as l, createStaticVNode as a } from "vue";
2
- import { _ as t } from "./lib-O_eJgJHP.js";
2
+ import { _ as t } from "./lib-KFjPFfxn.js";
3
3
  const i = {}, h = {
4
4
  width: "237",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as e, createElementBlock as l, createStaticVNode as a } from "vue";
2
- import { _ as t } from "./lib-O_eJgJHP.js";
2
+ import { _ as t } from "./lib-KFjPFfxn.js";
3
3
  const i = {}, h = {
4
4
  width: "263",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as e, createElementBlock as l, createStaticVNode as a } from "vue";
2
- import { _ as t } from "./lib-O_eJgJHP.js";
2
+ import { _ as t } from "./lib-KFjPFfxn.js";
3
3
  const i = {}, h = {
4
4
  width: "263",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as H, createElementBlock as V, createStaticVNode as t } from "vue";
2
- import { _ as e } from "./lib-O_eJgJHP.js";
2
+ import { _ as e } from "./lib-KFjPFfxn.js";
3
3
  const M = {}, Z = {
4
4
  width: "242",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as H, createElementBlock as V, createStaticVNode as t } from "vue";
2
- import { _ as e } from "./lib-O_eJgJHP.js";
2
+ import { _ as e } from "./lib-KFjPFfxn.js";
3
3
  const i = {}, M = {
4
4
  width: "231",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as H, createElementBlock as V, createStaticVNode as t } from "vue";
2
- import { _ as e } from "./lib-O_eJgJHP.js";
2
+ import { _ as e } from "./lib-KFjPFfxn.js";
3
3
  const M = {}, Z = {
4
4
  width: "230",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as H, createElementBlock as V, createStaticVNode as t } from "vue";
2
- import { _ as e } from "./lib-O_eJgJHP.js";
2
+ import { _ as e } from "./lib-KFjPFfxn.js";
3
3
  const i = {}, l = {
4
4
  width: "216",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as H, createElementBlock as V, createStaticVNode as t } from "vue";
2
- import { _ as e } from "./lib-O_eJgJHP.js";
2
+ import { _ as e } from "./lib-KFjPFfxn.js";
3
3
  const i = {}, l = {
4
4
  width: "216",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as H, createElementBlock as V, createStaticVNode as t } from "vue";
2
- import { _ as M } from "./lib-O_eJgJHP.js";
2
+ import { _ as M } from "./lib-KFjPFfxn.js";
3
3
  const Z = {}, e = {
4
4
  width: "232",
5
5
  height: "36",
@@ -1,5 +1,5 @@
1
1
  import { openBlock as H, createElementBlock as V, createStaticVNode as t } from "vue";
2
- import { _ as M } from "./lib-O_eJgJHP.js";
2
+ import { _ as M } from "./lib-KFjPFfxn.js";
3
3
  const Z = {}, e = {
4
4
  width: "232",
5
5
  height: "36",
@@ -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
- }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
80
+ }>, {
81
+ isMobile: boolean;
82
+ headerButtonViewModel: ButtonViewModel;
83
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
59
84
  export default _default;
@@ -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;
@@ -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;