@designcrowd/library.brand-page 6.1.7 → 6.1.8-ast-header

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 (115) hide show
  1. package/lib/src/{CreatedOnBrandCrowd-de-de-Dh3Paq4X.js → CreatedOnBrandCrowd-de-de-CmXTpyAA.js} +1 -1
  2. package/lib/src/{CreatedOnBrandCrowd-en-us-DLWYV4xe.js → CreatedOnBrandCrowd-en-us-FUfcPskv.js} +1 -1
  3. package/lib/src/{CreatedOnBrandCrowd-es-es-CcjzRbm_.js → CreatedOnBrandCrowd-es-es-BkRUovXn.js} +1 -1
  4. package/lib/src/{CreatedOnBrandCrowd-fr-fr-UuUNeB_L.js → CreatedOnBrandCrowd-fr-ca-xsLZEhPK.js} +1 -1
  5. package/lib/src/{CreatedOnBrandCrowd-fr-ca-UuUNeB_L.js → CreatedOnBrandCrowd-fr-fr-xsLZEhPK.js} +1 -1
  6. package/lib/src/{CreatedOnBrandCrowd-pt-pt-ZVYZ5AnV.js → CreatedOnBrandCrowd-pt-br-BJ4DkilI.js} +1 -1
  7. package/lib/src/{CreatedOnBrandCrowd-pt-br-ZVYZ5AnV.js → CreatedOnBrandCrowd-pt-pt-BJ4DkilI.js} +1 -1
  8. package/lib/src/{CreatedOnDcom-de-de-BPVyqOPL.js → CreatedOnDcom-de-de-D7f4iceH.js} +1 -1
  9. package/lib/src/{CreatedOnDcom-en-us-BUSRV01e.js → CreatedOnDcom-en-us-BHbqZcVl.js} +1 -1
  10. package/lib/src/{CreatedOnDcom-es-es-BuABJnvQ.js → CreatedOnDcom-es-es-BT_eFhYg.js} +1 -1
  11. package/lib/src/{CreatedOnDcom-fr-ca-sjHceLRY.js → CreatedOnDcom-fr-ca-DCWCvJTS.js} +1 -1
  12. package/lib/src/{CreatedOnDcom-fr-fr-D_qGXL3E.js → CreatedOnDcom-fr-fr-DpLretAn.js} +1 -1
  13. package/lib/src/{CreatedOnDcom-pt-br-D3Sb_YEi.js → CreatedOnDcom-pt-br-DmyQqot9.js} +1 -1
  14. package/lib/src/{CreatedOnDcom-pt-pt-BI47Hv58.js → CreatedOnDcom-pt-pt-CRLWHfnY.js} +1 -1
  15. package/lib/src/brand-page/components/page-footer/PageFooter.mixin.d.ts +0 -1
  16. package/lib/src/brand-page/components/page-footer/PageFooter.mixin.js +1 -4
  17. package/lib/src/brand-page/utils/route.util.d.ts +12 -0
  18. package/lib/src/brand-page/utils/route.util.js +56 -0
  19. package/lib/src/brand-page-maker/components/index.d.ts +1 -0
  20. package/lib/src/brand-page-maker/components/index.js +1 -0
  21. package/lib/src/bundled-translations-BlUyLdcg.js +179 -0
  22. package/lib/src/bundled-translations.de-DE-DZm_F46B.js +179 -0
  23. package/lib/src/bundled-translations.es-ES-DiOMEwZz.js +179 -0
  24. package/lib/src/bundled-translations.fr-CA-BPBNxV69.js +179 -0
  25. package/lib/src/bundled-translations.fr-FR-bCNdWkJW.js +179 -0
  26. package/lib/src/bundled-translations.pt-BR-CC6okekB.js +179 -0
  27. package/lib/src/bundled-translations.pt-PT-CSgMSLFn.js +179 -0
  28. package/lib/src/bundles/bundled-translations.de-DE.json +5 -4
  29. package/lib/src/bundles/bundled-translations.es-ES.json +5 -4
  30. package/lib/src/bundles/bundled-translations.fr-CA.json +5 -4
  31. package/lib/src/bundles/bundled-translations.fr-FR.json +5 -4
  32. package/lib/src/bundles/bundled-translations.json +9 -4
  33. package/lib/src/bundles/bundled-translations.pt-BR.json +5 -4
  34. package/lib/src/bundles/bundled-translations.pt-PT.json +5 -4
  35. package/lib/src/css/library.brand-page-brandCrowd.min.css +159 -222
  36. package/lib/src/css/library.brand-page-brandPage.min.css +159 -222
  37. package/lib/src/css/library.brand-page-designCom.min.css +159 -222
  38. package/lib/src/css/library.brand-page-preview.min.css +159 -222
  39. package/lib/src/index.d.ts +1 -1
  40. package/lib/src/index.mjs +110 -109
  41. package/lib/src/{lib-BBX3eBci.js → lib-CZMytXbN.js} +19842 -19669
  42. package/lib/src/lib.js +1 -1
  43. package/lib/src/shared/components/live-preview-modal/live-preview-modal.utils.d.ts +4 -0
  44. package/lib/src/shared/components/live-preview-modal/live-preview-modal.utils.js +3 -0
  45. package/lib/src/shared/page-settings/components/page-settings/PageSettings.mixin.d.ts +3 -1
  46. package/lib/src/shared/page-settings/components/page-settings/PageSettings.mixin.js +23 -11
  47. package/package.json +1 -1
  48. package/src/brand-page/components/button/Button.vue +41 -18
  49. package/src/brand-page/components/button/Button.vue.test.ts +211 -0
  50. package/src/brand-page/components/images-section/ImagesSection.test.ts +91 -0
  51. package/src/brand-page/components/images-section/ImagesSection.vue +29 -10
  52. package/src/brand-page/components/page-footer/PageFooter.mixin.ts +1 -4
  53. package/src/brand-page/components/page-footer/PageFooter.vue +0 -1
  54. package/src/brand-page/components/payment/Payment.vue +0 -3
  55. package/src/brand-page/components/payment/request-payment/RequestPayment.vue +0 -1
  56. package/src/brand-page/components/payment/support-me/SupportMe.vue +0 -3
  57. package/src/brand-page/components/save-contact/SaveContactWidget.vue +1 -0
  58. package/src/brand-page/components/save-contact/popup-card/PopupCard.vue +1 -0
  59. package/src/brand-page/components/shop/CartModal.test.ts +51 -0
  60. package/src/brand-page/components/shop/CartModal.vue +1 -0
  61. package/src/brand-page/components/shop/FeaturedDisplay.vue +8 -3
  62. package/src/brand-page/components/shop/Shop.vue +5 -5
  63. package/src/brand-page/components/shop/Shop.vue.test.ts +104 -2
  64. package/src/brand-page/components/social-links/SocialLinks.vue +1 -9
  65. package/src/brand-page/components/social-links/SocialLinks.vue.test.ts +28 -8
  66. package/src/brand-page/components/social-links/SocialLinksItems.vue +6 -2
  67. package/src/brand-page/components/testimonial-section/TestimonialSection.vue +2 -2
  68. package/src/brand-page/components/video/Video.vue +0 -3
  69. package/src/brand-page/utils/route.util.test.ts +116 -0
  70. package/src/brand-page/utils/route.util.ts +82 -0
  71. package/src/brand-page-maker/components/action-bar/ActionBarNavigation.test.ts +23 -0
  72. package/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.preview-gate.test.ts +68 -3
  73. package/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.vue +1 -0
  74. package/src/brand-page-maker/components/index.ts +1 -0
  75. package/src/brand-page-maker/components/preview-modal/PreviewModalWithState.test.ts +61 -41
  76. package/src/brand-page-maker/components/preview-modal/PreviewModalWithState.vue +37 -42
  77. package/src/bundles/bundled-translations.de-DE.json +5 -4
  78. package/src/bundles/bundled-translations.es-ES.json +5 -4
  79. package/src/bundles/bundled-translations.fr-CA.json +5 -4
  80. package/src/bundles/bundled-translations.fr-FR.json +5 -4
  81. package/src/bundles/bundled-translations.json +9 -4
  82. package/src/bundles/bundled-translations.pt-BR.json +5 -4
  83. package/src/bundles/bundled-translations.pt-PT.json +5 -4
  84. package/src/lib.ts +1 -0
  85. package/src/{brand-page-maker/components/preview-modal/PreviewModal.test.ts → shared/components/live-preview-modal/LivePreviewModal.test.ts} +96 -3
  86. package/src/{brand-page-maker/components/preview-modal/PreviewModal.vue → shared/components/live-preview-modal/LivePreviewModal.vue} +103 -89
  87. package/src/shared/components/live-preview-modal/i18n/preview-modal.de-DE.json +7 -0
  88. package/src/shared/components/live-preview-modal/i18n/preview-modal.es-ES.json +7 -0
  89. package/src/shared/components/live-preview-modal/i18n/preview-modal.fr-CA.json +7 -0
  90. package/src/shared/components/live-preview-modal/i18n/preview-modal.fr-FR.json +7 -0
  91. package/src/shared/components/live-preview-modal/i18n/preview-modal.json +7 -0
  92. package/src/shared/components/live-preview-modal/i18n/preview-modal.pt-BR.json +7 -0
  93. package/src/shared/components/live-preview-modal/i18n/preview-modal.pt-PT.json +7 -0
  94. package/src/shared/components/live-preview-modal/live-preview-modal.utils.ts +11 -0
  95. package/src/shared/ecommerce-settings/store/cart-store.test.ts +38 -0
  96. package/src/shared/page-settings/components/header-settings-panel/HeaderSettingsPanel.vue +205 -0
  97. package/src/shared/page-settings/components/page-settings/PageSettings.header-settings-panel.test.ts +97 -0
  98. package/src/shared/page-settings/components/page-settings/PageSettings.mixin.ts +27 -12
  99. package/src/shared/page-settings/components/page-settings/PageSettings.vue +113 -92
  100. package/src/shared/page-settings/components/page-settings/i18n/page-settings.json +4 -0
  101. package/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.vue +1 -57
  102. package/lib/src/bundled-translations-D42tE0D2.js +0 -179
  103. package/lib/src/bundled-translations.de-DE-D9aWGgFt.js +0 -179
  104. package/lib/src/bundled-translations.es-ES-lk4B0xQ7.js +0 -179
  105. package/lib/src/bundled-translations.fr-CA-DhOBNt6q.js +0 -179
  106. package/lib/src/bundled-translations.fr-FR-CnpafQeG.js +0 -179
  107. package/lib/src/bundled-translations.pt-BR-C4PnKrd9.js +0 -179
  108. package/lib/src/bundled-translations.pt-PT-CfKDVQC-.js +0 -179
  109. package/src/brand-page-maker/components/preview-modal/i18n/preview-modal.de-DE.json +0 -6
  110. package/src/brand-page-maker/components/preview-modal/i18n/preview-modal.es-ES.json +0 -6
  111. package/src/brand-page-maker/components/preview-modal/i18n/preview-modal.fr-CA.json +0 -6
  112. package/src/brand-page-maker/components/preview-modal/i18n/preview-modal.fr-FR.json +0 -6
  113. package/src/brand-page-maker/components/preview-modal/i18n/preview-modal.json +0 -6
  114. package/src/brand-page-maker/components/preview-modal/i18n/preview-modal.pt-BR.json +0 -6
  115. package/src/brand-page-maker/components/preview-modal/i18n/preview-modal.pt-PT.json +0 -6
@@ -0,0 +1,205 @@
1
+ <template>
2
+ <div data-component="header-settings-panel">
3
+ <SideBarSettingsHeader
4
+ :show-back-button="true"
5
+ :title="pageSettingsTr('headerSettings')"
6
+ @on-back="$emit('on-back')"
7
+ />
8
+
9
+ <TabMenu
10
+ :tab-names="viewports"
11
+ :selected-tab-name="selectedViewportTabName"
12
+ class="tw-mb-4"
13
+ @on-tab-selected="handleSelectViewport"
14
+ />
15
+
16
+ <HelloBar
17
+ v-if="showDeviceWarning"
18
+ variant="warning"
19
+ :label="tr('previewDescription')"
20
+ class="tw-mb-4"
21
+ />
22
+
23
+ <CollapsiblePanel
24
+ data-component="collapsible-panel"
25
+ :title="pageSettingsTr('navigationSectionTitle')"
26
+ :is-collapsed="collapsedSections.navigation"
27
+ @changed="toggleSectionCollapsed('navigation')"
28
+ >
29
+ <HeaderNavigationType
30
+ :navigation-display-type="navigation.displayType"
31
+ :available-navigation-style-configs="availableNavigationStyleConfigs"
32
+ :on-select="handleHeaderNavigationDisplayTypeChange"
33
+ />
34
+
35
+ <div v-if="!isBrandSite">
36
+ <div
37
+ v-if="showNavigationBelowLogoOption"
38
+ class="tw-my-4 tw-flex tw-items-center tw-justify-between tw-cursor-pointer"
39
+ >
40
+ <div class="tw-flex tw-items-center">
41
+ <div
42
+ class="tw-font-sans tw-font-bold tw-text-secondary-800 tw-text-sm tw-mr-2"
43
+ >
44
+ {{ tr('showNavigationBelow') }}
45
+ </div>
46
+ </div>
47
+ <Toggle
48
+ id="move-logo"
49
+ :model-value="isRenderAfterLogo"
50
+ @update:model-value="toggleShowNavigationBelowLogo"
51
+ />
52
+ </div>
53
+ </div>
54
+
55
+ <HeaderDisplayStyle
56
+ :display-style="header.displayStyle"
57
+ :navigation-display-type="navigation.displayType"
58
+ :on-select="handleHeaderDisplayStyleChange"
59
+ :viewport="viewport"
60
+ :is-logo-visible="isLogoVisible"
61
+ />
62
+
63
+ <NavigationStyleSettings
64
+ :available-navigation-style-configs="availableNavigationStyleConfigs"
65
+ :is-admin-maker="isAdminMaker"
66
+ :logo-theme="logoTheme"
67
+ :value="navigation"
68
+ @option-value-change="handleHeaderNavigationStyleOptionValueChange"
69
+ />
70
+ </CollapsiblePanel>
71
+
72
+ <CollapsiblePanel
73
+ v-if="isBrandSite"
74
+ data-component="collapsible-panel"
75
+ :title="pageSettingsTr('headerSectionTitle')"
76
+ :is-collapsed="collapsedSections.header"
77
+ @changed="toggleSectionCollapsed('header')"
78
+ >
79
+ <ColorField
80
+ id="backgroundStyle"
81
+ :class="{ 'tw-mt-4': isHeader }"
82
+ :enable-color-match="true"
83
+ name="backgroundColor"
84
+ :label="commonTr('backgroundColor')"
85
+ :value="backgroundColor"
86
+ :is-admin-maker="isAdminMaker"
87
+ :logo-theme="logoTheme"
88
+ :toggle-unique-id="sectionName"
89
+ @update:model-value="onSelectColor"
90
+ />
91
+ </CollapsiblePanel>
92
+
93
+ <CollapsiblePanel
94
+ v-if="isBrandSite"
95
+ data-component="collapsible-panel"
96
+ :title="pageSettingsTr('logoSectionTitle')"
97
+ :is-collapsed="collapsedSections.logo"
98
+ @changed="toggleSectionCollapsed('logo')"
99
+ >
100
+ <LogoSelection
101
+ :is-logo-visible="isLogoVisible"
102
+ :selected-logo="selectedLogoViewModel"
103
+ :selected-logo-image-url="logoImageBase64Url || logoImageUrl"
104
+ :selected-logo-draft-token="logoDraftToken"
105
+ @on-logo-visible-changed="onLogoVisibleChanged"
106
+ @on-logo-variation-selected="onLogoVariationSelected"
107
+ @on-editable-logo-variation-selected="onEditableLogoVariationSelected"
108
+ @on-logo-version-selected="onLogoVersionSelected"
109
+ />
110
+ <div v-if="isLogoVisible">
111
+ <div class="tw-mb-2 tw-flex tw-items-center tw-justify-between">
112
+ <span class="header-settings-panel_option-title tw-mt-2">
113
+ {{ tr('logoSize') }}
114
+ </span>
115
+ </div>
116
+ <LogoSizeSlider
117
+ :value="logoImageHeight"
118
+ :viewport="viewport"
119
+ @on-change="onLogoSizeChanged"
120
+ />
121
+ </div>
122
+ </CollapsiblePanel>
123
+
124
+ <!-- Button section hidden for now (BP-5854) — re-enable once BP-5852 implements
125
+ the header button. Left commented rather than removed since the shell
126
+ (CollapsiblePanel + collapsedSections.button state) is already wired up.
127
+ <CollapsiblePanel
128
+ data-component="collapsible-panel"
129
+ :title="pageSettingsTr('buttonSectionTitle')"
130
+ :is-collapsed="collapsedSections.button"
131
+ @changed="toggleSectionCollapsed('button')"
132
+ />
133
+ -->
134
+ </div>
135
+ </template>
136
+ <script>
137
+ import {
138
+ CollapsiblePanel,
139
+ HelloBar,
140
+ TabMenu,
141
+ Toggle,
142
+ } from '@designcrowd/fe-shared-lib';
143
+ import PageSettingsSectionStyleMixin from '../page-settings-section-styles/PageSettingsSectionStyles.mixin.ts';
144
+ import HeaderDisplayStyle from '../page-settings-section-styles/HeaderDisplayStyle.vue';
145
+ import HeaderNavigationType from '../page-settings-section-styles/HeaderNavigationType.vue';
146
+ import NavigationStyleSettings from '../../../navigation-style-settings/components/navigation-style-settings/NavigationStyleSettings.vue';
147
+ import ColorField from '../../../content-settings/components/color-field/ColorField.vue';
148
+ import LogoSelection from '@shared/content-settings/components/logo-selection-field/LogoSelection.vue';
149
+ import LogoSizeSlider from '@shared/content-settings/components/logo-size-field/LogoSizeSlider.vue';
150
+ import SideBarSettingsHeader from '../../../common/SideBarSettingsHeader.vue';
151
+ import { tr, commonTr, pageSettingsTr } from '@src/composables/useTranslate';
152
+
153
+ export default {
154
+ components: {
155
+ CollapsiblePanel,
156
+ ColorField,
157
+ HelloBar,
158
+ TabMenu,
159
+ Toggle,
160
+ HeaderDisplayStyle,
161
+ HeaderNavigationType,
162
+ NavigationStyleSettings,
163
+ LogoSelection,
164
+ LogoSizeSlider,
165
+ SideBarSettingsHeader,
166
+ },
167
+ mixins: [PageSettingsSectionStyleMixin],
168
+ emits: ['on-back'],
169
+ setup() {
170
+ return {
171
+ ...PageSettingsSectionStyleMixin.setup(),
172
+ tr: (key) => tr(`pageSettingsSection.${key}`),
173
+ commonTr,
174
+ pageSettingsTr,
175
+ };
176
+ },
177
+ data() {
178
+ return {
179
+ // All sections start collapsed, matching the panel's default-state
180
+ // design (BP-5854) — not persisted, this is purely local UI state.
181
+ collapsedSections: {
182
+ navigation: true,
183
+ header: true,
184
+ logo: true,
185
+ button: true,
186
+ },
187
+ };
188
+ },
189
+ computed: {
190
+ selectedViewportTabName() {
191
+ return this.findSelectedViewport();
192
+ },
193
+ },
194
+ methods: {
195
+ toggleSectionCollapsed(section) {
196
+ this.collapsedSections[section] = !this.collapsedSections[section];
197
+ },
198
+ },
199
+ };
200
+ </script>
201
+ <style scoped>
202
+ .header-settings-panel_option-title {
203
+ @apply tw-font-sans tw-font-bold tw-text-secondary-800 tw-text-sm;
204
+ }
205
+ </style>
@@ -0,0 +1,97 @@
1
+ import { describe, test, expect, beforeEach } from 'vitest';
2
+ import { createPinia, setActivePinia } from 'pinia';
3
+ import { shallowMount } from '@vue/test-utils';
4
+ import PageSettings from './PageSettings.vue';
5
+ import HeaderSettingsPanel from '../header-settings-panel/HeaderSettingsPanel.vue';
6
+ import { useUiPageSettingsStore } from '../../store';
7
+
8
+ // Coverage for BP-5854: the flat "Header Settings" CollapsiblePanel became a
9
+ // chevron row that navigates to a dedicated HeaderSettingsPanel, mirroring the
10
+ // existing ContentSettings mode-switch pattern. This pins that navigation and
11
+ // the "jump here from the live-preview canvas" path (selectedSectionName).
12
+ describe('PageSettings — header settings panel navigation', () => {
13
+ let pageSettingsStore: ReturnType<typeof useUiPageSettingsStore>;
14
+
15
+ beforeEach(() => {
16
+ setActivePinia(createPinia());
17
+ pageSettingsStore = useUiPageSettingsStore();
18
+ });
19
+
20
+ const mountPageSettings = () => shallowMount(PageSettings);
21
+
22
+ test('by default: header settings panel is not shown, the chevron row is', () => {
23
+ const wrapper = mountPageSettings();
24
+
25
+ expect(wrapper.findComponent(HeaderSettingsPanel).exists()).toBe(false);
26
+ expect(wrapper.find('[data-test-tag="header-settings-row"]').exists()).toBe(
27
+ true,
28
+ );
29
+ });
30
+
31
+ test('clicking the header settings row opens the panel', async () => {
32
+ const wrapper = mountPageSettings();
33
+
34
+ await wrapper
35
+ .find('[data-test-tag="header-settings-row"]')
36
+ .trigger('click');
37
+
38
+ expect(wrapper.findComponent(HeaderSettingsPanel).exists()).toBe(true);
39
+ expect(wrapper.find('[data-test-tag="header-settings-row"]').exists()).toBe(
40
+ false,
41
+ );
42
+ });
43
+
44
+ test('the panel\'s "on-back" event returns to the pages list', async () => {
45
+ const wrapper = mountPageSettings();
46
+
47
+ await wrapper
48
+ .find('[data-test-tag="header-settings-row"]')
49
+ .trigger('click');
50
+ await wrapper.findComponent(HeaderSettingsPanel).vm.$emit('on-back');
51
+
52
+ expect(wrapper.findComponent(HeaderSettingsPanel).exists()).toBe(false);
53
+ expect(wrapper.find('[data-test-tag="header-settings-row"]').exists()).toBe(
54
+ true,
55
+ );
56
+ });
57
+
58
+ test('selecting the header section (e.g. from the live-preview canvas) opens the panel', async () => {
59
+ const wrapper = mountPageSettings();
60
+
61
+ pageSettingsStore.setSelectedSectionName({ sectionName: 'header' });
62
+ await wrapper.vm.$nextTick();
63
+
64
+ expect(wrapper.findComponent(HeaderSettingsPanel).exists()).toBe(true);
65
+ });
66
+
67
+ test('selecting the pages section keeps the list view (no panel)', async () => {
68
+ const wrapper = mountPageSettings();
69
+
70
+ pageSettingsStore.setSelectedSectionName({ sectionName: 'header' });
71
+ await wrapper.vm.$nextTick();
72
+
73
+ pageSettingsStore.setSelectedSectionName({ sectionName: 'pages' });
74
+ await wrapper.vm.$nextTick();
75
+
76
+ expect(wrapper.findComponent(HeaderSettingsPanel).exists()).toBe(false);
77
+ });
78
+
79
+ test('re-selecting the header section after Back reopens the panel (same-value store write must still re-trigger)', async () => {
80
+ const wrapper = mountPageSettings();
81
+
82
+ // Opened once via the canvas (selectedSectionName), then closed via Back.
83
+ pageSettingsStore.setSelectedSectionName({ sectionName: 'header' });
84
+ await wrapper.vm.$nextTick();
85
+ await wrapper.findComponent(HeaderSettingsPanel).vm.$emit('on-back');
86
+
87
+ expect(pageSettingsStore.selectedSectionName).toBeUndefined();
88
+
89
+ // Clicking the header on the canvas again writes the SAME value ('header')
90
+ // it already held before Back reset it to undefined — this must still open
91
+ // the panel rather than being a no-op against Pinia's change detection.
92
+ pageSettingsStore.setSelectedSectionName({ sectionName: 'header' });
93
+ await wrapper.vm.$nextTick();
94
+
95
+ expect(wrapper.findComponent(HeaderSettingsPanel).exists()).toBe(true);
96
+ });
97
+ });
@@ -264,6 +264,7 @@ export default defineComponent({
264
264
  onDraggingStart,
265
265
  onDraggingEnd,
266
266
  eventTracker,
267
+ pageSettingsView: ref<'list' | 'headerSettings'>('list'),
267
268
  };
268
269
  },
269
270
  data() {
@@ -297,18 +298,6 @@ export default defineComponent({
297
298
  contentListItems(): ContentItem<Content>[] {
298
299
  return this.contentSettingsStore.items;
299
300
  },
300
- headerPageSectionStyleOptions(): PageSectionStyleOption[] {
301
- if (this.isBrandSite) {
302
- return [
303
- PAGE_SECTION_STYLE_OPTIONS.logo,
304
- PAGE_SECTION_STYLE_OPTIONS.logoSize,
305
- PAGE_SECTION_STYLE_OPTIONS.backgroundColor,
306
- PAGE_SECTION_STYLE_OPTIONS.headerDisplay,
307
- ];
308
- }
309
-
310
- return [PAGE_SECTION_STYLE_OPTIONS.headerDisplay];
311
- },
312
301
  footerPageSectionStyleOptions(): PageSectionStyleOption[] {
313
302
  return [
314
303
  PAGE_SECTION_STYLE_OPTIONS.logo,
@@ -485,6 +474,16 @@ export default defineComponent({
485
474
  });
486
475
  },
487
476
  scrollToPageSettingsSection(sectionName: PageSettingsSection) {
477
+ if (sectionName === PAGE_SETTINGS_SECTIONS.header) {
478
+ // Header settings live in their own dedicated panel now (BP-5854),
479
+ // not an inline CollapsiblePanel to scroll to.
480
+ this.pageSettingsView = 'headerSettings';
481
+
482
+ return;
483
+ }
484
+
485
+ this.pageSettingsView = 'list';
486
+
488
487
  this.$nextTick(() => {
489
488
  const $sideBarContent = document.querySelector(
490
489
  `#${SIDE_BAR_CONTENT_ID}`,
@@ -519,6 +518,22 @@ export default defineComponent({
519
518
  $sideBarContent.scrollTop = $el.offsetTop - $sidebarHeader.clientHeight;
520
519
  });
521
520
  },
521
+ openHeaderSettingsPanel() {
522
+ this.pageSettingsView = 'headerSettings';
523
+ },
524
+ closeHeaderSettingsPanel() {
525
+ this.pageSettingsView = 'list';
526
+
527
+ // Keep the store in sync so a repeat click on the header in the
528
+ // live-preview canvas (which sets selectedSectionName to the same
529
+ // value it already had) still re-fires the watcher and reopens
530
+ // this panel, instead of being a no-op.
531
+ if (this.pageSettingsStore.selectedSectionName) {
532
+ this.pageSettingsStore.setSelectedSectionName({
533
+ sectionName: undefined,
534
+ });
535
+ }
536
+ },
522
537
  async onHideBrandPageLogoClickFromFooter() {
523
538
  this.eventTracker.setUpsellBridgeState({
524
539
  cta_location: UPGRADE_CTA_LOCATIONS.REMOVE_WATERMARK_FOOTER_SETTINGS,
@@ -5,118 +5,137 @@
5
5
  <ReplaceImageSettingsForContent v-if="isReplacingPageSettingsImage" />
6
6
  <!-- start page settings -->
7
7
  <div v-show="!isReplacingPageSettingsImage">
8
- <SideBarSettingsHeader :title="pageSettingsTr('managePages')" />
9
- <p class="tw-font-sans tw-text-sm tw-text-grayscale-600 tw-mb-3">
10
- {{ pageSettingsTr('addPagesDescription') }}
11
- </p>
12
- <CollapsiblePanel
13
- :ref="PAGE_SETTINGS_SECTIONS.pages"
14
- data-component="collapsible-panel"
15
- :title="pageSettingsTr('pages')"
16
- :is-collapsed="sectionCollapsedStates[PAGE_SETTINGS_SECTIONS.pages]"
17
- >
18
- <SideBarSectionTitle :title="pageSettingsTr('addPages')" />
19
- <!-- Nested draggable section for visible pages -->
20
- <NestedDraggable
21
- :orders="pageNavigationStore.orders"
22
- :is-dragging-page="isDraggingPage"
23
- :is-design-com="isDesignCom"
24
- :on-page-title-input="onPageTitleInput"
25
- :on-delete-page-selected="onDeletePageSelected"
26
- :on-change-page-visibility="onChangePageVisibility"
27
- :on-add-sub-page-selected="onAddSubPageSelected"
28
- @drag-start="onDraggingStart"
29
- @drag-end="onDraggingEnd"
30
- />
31
-
32
- <Button
33
- data-test-tag="add-page"
34
- :label="addPageLabel"
35
- :variant="addPageButtonVariant"
36
- size="small-wide"
37
- :full-width="true"
38
- @on-click.stop="onAddNewPageSelected()"
39
- />
40
- </CollapsiblePanel>
8
+ <!-- style-options is required by the shared mixin (PageSettingsSectionStyles.mixin.ts)
9
+ but unused here — HeaderSettingsPanel's own isBrandSite checks decide what renders. -->
10
+ <HeaderSettingsPanel
11
+ v-if="pageSettingsView === 'headerSettings'"
12
+ :is-admin-maker="isAdminMaker"
13
+ :is-brand-site="isBrandSite"
14
+ :logo-theme="logoTheme"
15
+ section-name="header"
16
+ :style-options="[]"
17
+ @on-back="closeHeaderSettingsPanel"
18
+ />
41
19
 
42
- <CollapsiblePanel
43
- :ref="PAGE_SETTINGS_SECTIONS.header"
44
- data-component="collapsible-panel"
45
- :title="pageSettingsTr('headerSettings')"
46
- :is-collapsed="sectionCollapsedStates[PAGE_SETTINGS_SECTIONS.header]"
47
- >
48
- <PageSettingsSectionStyles
49
- section-name="header"
50
- :is-admin-maker="isAdminMaker"
51
- :is-brand-site="isBrandSite"
52
- :logo-theme="logoTheme"
53
- :style-options="headerPageSectionStyleOptions"
54
- />
55
- </CollapsiblePanel>
20
+ <template v-else>
21
+ <SideBarSettingsHeader :title="pageSettingsTr('managePages')" />
22
+ <p class="tw-font-sans tw-text-sm tw-text-grayscale-600 tw-mb-3">
23
+ {{ pageSettingsTr('addPagesDescription') }}
24
+ </p>
25
+ <CollapsiblePanel
26
+ :ref="PAGE_SETTINGS_SECTIONS.pages"
27
+ data-component="collapsible-panel"
28
+ :title="pageSettingsTr('pages')"
29
+ :is-collapsed="sectionCollapsedStates[PAGE_SETTINGS_SECTIONS.pages]"
30
+ >
31
+ <SideBarSectionTitle :title="pageSettingsTr('addPages')" />
32
+ <!-- Nested draggable section for visible pages -->
33
+ <NestedDraggable
34
+ :orders="pageNavigationStore.orders"
35
+ :is-dragging-page="isDraggingPage"
36
+ :is-design-com="isDesignCom"
37
+ :on-page-title-input="onPageTitleInput"
38
+ :on-delete-page-selected="onDeletePageSelected"
39
+ :on-change-page-visibility="onChangePageVisibility"
40
+ :on-add-sub-page-selected="onAddSubPageSelected"
41
+ @drag-start="onDraggingStart"
42
+ @drag-end="onDraggingEnd"
43
+ />
56
44
 
57
- <CollapsiblePanel
58
- v-if="showFooterSettings"
59
- :ref="PAGE_SETTINGS_SECTIONS.footer"
60
- data-component="collapsible-panel"
61
- :title="pageSettingsTr('footerSettings')"
62
- :is-collapsed="sectionCollapsedStates[PAGE_SETTINGS_SECTIONS.footer]"
63
- >
64
- <PageSettingsSectionStyles
65
- section-name="footer"
66
- :font-settings-options="footerFontSettingsOptions"
67
- :is-admin-maker="isAdminMaker"
68
- :is-brand-site="isBrandSite"
69
- :logo-theme="logoTheme"
70
- :style-options="footerPageSectionStyleOptions"
71
- />
45
+ <Button
46
+ data-test-tag="add-page"
47
+ :label="addPageLabel"
48
+ :variant="addPageButtonVariant"
49
+ size="small-wide"
50
+ :full-width="true"
51
+ @on-click.stop="onAddNewPageSelected()"
52
+ />
53
+ </CollapsiblePanel>
72
54
 
73
55
  <div
74
- v-if="!isAdminMaker && !isPrePurchase && showBrandCrowdLogo"
75
- class="tw-flex tw-items-center tw-justify-between tw-cursor-pointer"
76
- @click="onHideBrandPageLogoClickFromFooter"
56
+ data-component="header-settings-row"
57
+ data-test-tag="header-settings-row"
58
+ class="tw-bg-white tw-border tw-border-grayscale-500 tw-border-solid tw-flex tw-items-center tw-justify-between tw-cursor-pointer tw-mb-4 tw-p-4 tw-rounded-md"
59
+ @click="openHeaderSettingsPanel"
77
60
  >
78
- <div class="tw-flex tw-items-center">
79
- <div
80
- class="tw-font-sans tw-font-bold tw-text-secondary-800 tw-text-sm tw-mr-2"
81
- >
82
- {{ hideText }}
83
- </div>
84
- <div
85
- class="tw-inline-block tw-text-primary-500 tw-border-2 tw-border-solid tw-border-current tw-rounded-full tw-px-3 tw-py-px tw-uppercase tw-text-xs"
86
- >
87
- {{ styleSettingsTr('premium') }}
88
- </div>
61
+ <div
62
+ class="tw-text-md tw-font-sans tw-font-bold tw-text-secondary-800"
63
+ >
64
+ {{ pageSettingsTr('headerSettings') }}
89
65
  </div>
90
- <Toggle
91
- id="hide-brandpage-logo"
92
- class="tw-pointer-events-none tw-touch-none"
93
- :model-value="false"
94
- color="info"
95
- />
66
+ <Icon name="chevron-right" size="sm" class="tw-text-grayscale-600" />
96
67
  </div>
97
- </CollapsiblePanel>
98
68
 
99
- <DeletePageModal
100
- :is-visible="isDeleteModalVisible"
101
- :page-id="deleteModalPageId"
102
- :page-title="deleteModalPageTitle"
103
- @cancel="onCancelDeletePage"
104
- @confirm="onConfirmDeletePage"
105
- />
69
+ <CollapsiblePanel
70
+ v-if="showFooterSettings"
71
+ :ref="PAGE_SETTINGS_SECTIONS.footer"
72
+ data-component="collapsible-panel"
73
+ :title="pageSettingsTr('footerSettings')"
74
+ :is-collapsed="sectionCollapsedStates[PAGE_SETTINGS_SECTIONS.footer]"
75
+ >
76
+ <PageSettingsSectionStyles
77
+ section-name="footer"
78
+ :font-settings-options="footerFontSettingsOptions"
79
+ :is-admin-maker="isAdminMaker"
80
+ :is-brand-site="isBrandSite"
81
+ :logo-theme="logoTheme"
82
+ :style-options="footerPageSectionStyleOptions"
83
+ />
84
+
85
+ <div
86
+ v-if="!isAdminMaker && !isPrePurchase && showBrandCrowdLogo"
87
+ class="tw-flex tw-items-center tw-justify-between tw-cursor-pointer"
88
+ @click="onHideBrandPageLogoClickFromFooter"
89
+ >
90
+ <div class="tw-flex tw-items-center">
91
+ <div
92
+ class="tw-font-sans tw-font-bold tw-text-secondary-800 tw-text-sm tw-mr-2"
93
+ >
94
+ {{ hideText }}
95
+ </div>
96
+ <div
97
+ class="tw-inline-block tw-text-primary-500 tw-border-2 tw-border-solid tw-border-current tw-rounded-full tw-px-3 tw-py-px tw-uppercase tw-text-xs"
98
+ >
99
+ {{ styleSettingsTr('premium') }}
100
+ </div>
101
+ </div>
102
+ <Toggle
103
+ id="hide-brandpage-logo"
104
+ class="tw-pointer-events-none tw-touch-none"
105
+ :model-value="false"
106
+ color="info"
107
+ />
108
+ </div>
109
+ </CollapsiblePanel>
110
+
111
+ <DeletePageModal
112
+ :is-visible="isDeleteModalVisible"
113
+ :page-id="deleteModalPageId"
114
+ :page-title="deleteModalPageTitle"
115
+ @cancel="onCancelDeletePage"
116
+ @confirm="onConfirmDeletePage"
117
+ />
106
118
 
107
- <NewPageModal />
119
+ <NewPageModal />
120
+ </template>
108
121
  </div>
109
122
  <!-- end page settings -->
110
123
  </div>
111
124
  </template>
112
125
  <script>
113
- import { Button, CollapsiblePanel, Toggle } from '@designcrowd/fe-shared-lib';
126
+ import {
127
+ Button,
128
+ CollapsiblePanel,
129
+ Icon,
130
+ Toggle,
131
+ } from '@designcrowd/fe-shared-lib';
114
132
  import SideBarSettingsHeader from '../../../common/SideBarSettingsHeader.vue';
115
133
  import PageSettingsMixin from './PageSettings.mixin.ts';
116
134
  import SideBarSectionTitle from '../../../common/SideBarSectionTitle.vue';
117
135
  import DeletePageModal from '../delete-page-modal/DeletePageModal.vue';
118
136
  import NewPageModal from '../new-page-modal/NewPageModal.vue';
119
137
  import PageSettingsSectionStyles from '../page-settings-section-styles/PageSettingsSectionStyles.vue';
138
+ import HeaderSettingsPanel from '../header-settings-panel/HeaderSettingsPanel.vue';
120
139
  import ReplaceImageSettingsForContent from '../../../content-settings/components/content-settings/ReplaceImageSettingsForContent.vue';
121
140
  import NestedDraggable from './NestedDraggable.vue';
122
141
  import { useBrandPageContainerStore } from '@brand-page-maker/stores';
@@ -126,6 +145,7 @@ export default {
126
145
  components: {
127
146
  Button,
128
147
  CollapsiblePanel,
148
+ Icon,
129
149
  Toggle,
130
150
  SideBarSettingsHeader,
131
151
  SideBarSectionTitle,
@@ -133,6 +153,7 @@ export default {
133
153
  DeletePageModal,
134
154
  NewPageModal,
135
155
  PageSettingsSectionStyles,
156
+ HeaderSettingsPanel,
136
157
  ReplaceImageSettingsForContent,
137
158
  },
138
159
  mixins: [PageSettingsMixin],
@@ -1,6 +1,10 @@
1
1
  {
2
2
  "pageSettings": {
3
3
  "headerSettings": "Header Settings",
4
+ "navigationSectionTitle": "Navigation",
5
+ "headerSectionTitle": "Header",
6
+ "logoSectionTitle": "Logo",
7
+ "buttonSectionTitle": "Button",
4
8
  "footerSettings": "Footer Settings",
5
9
  "managePages": "Manage Pages",
6
10
  "pages": "Pages",