@designcrowd/library.brand-page 5.18.3-button-fix-1 → 5.18.3-undo-35
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-DQLtpdLe.js → CreatedOnBrandCrowd-de-de-nGPiEkaH.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-en-us-CvEhlADd.js → CreatedOnBrandCrowd-en-us-D3ibxOrN.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-es-es-pYQeTTC0.js → CreatedOnBrandCrowd-es-es-BAq0PV5c.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-fr-fr-CcE-iCEq.js → CreatedOnBrandCrowd-fr-ca-9foHt2a-.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-fr-ca-CcE-iCEq.js → CreatedOnBrandCrowd-fr-fr-9foHt2a-.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-pt-pt-OyhWWWyO.js → CreatedOnBrandCrowd-pt-br-DO739Uxl.js} +1 -1
- package/lib/src/{CreatedOnBrandCrowd-pt-br-OyhWWWyO.js → CreatedOnBrandCrowd-pt-pt-DO739Uxl.js} +1 -1
- package/lib/src/{CreatedOnDcom-de-de-DH98FFLS.js → CreatedOnDcom-de-de-CFbNW8tl.js} +1 -1
- package/lib/src/{CreatedOnDcom-en-us-DK67NN1r.js → CreatedOnDcom-en-us-BL34V8eu.js} +1 -1
- package/lib/src/{CreatedOnDcom-es-es-9-QU4BU6.js → CreatedOnDcom-es-es-BKXWvHkV.js} +1 -1
- package/lib/src/{CreatedOnDcom-fr-ca-U9J9H9VB.js → CreatedOnDcom-fr-ca-DCyU-m6J.js} +1 -1
- package/lib/src/{CreatedOnDcom-fr-fr-DqdzB1DJ.js → CreatedOnDcom-fr-fr-DEciA_zh.js} +1 -1
- package/lib/src/{CreatedOnDcom-pt-br-c4UiWtkB.js → CreatedOnDcom-pt-br-BVB2zdvU.js} +1 -1
- package/lib/src/{CreatedOnDcom-pt-pt-Do2qJsYp.js → CreatedOnDcom-pt-pt-DatUuIK6.js} +1 -1
- package/lib/src/brand-page-maker/components/action-bar/ActionBar.mixin.d.ts +7 -2
- package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.d.ts +7 -2
- package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.js +10 -0
- package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMakerTemplateSettings.mixin.d.ts +7 -2
- package/lib/src/brand-page-maker/components/brand-page-maker/__fixtures__/brand-page-examples.js +1 -0
- package/lib/src/brand-page-maker/components/brandpage-maker-page/BrandPageMakerPage.mixin.d.ts +23 -2
- package/lib/src/brand-page-maker/components/brandpage-settings/ReplaceImageSettingsForBrandPageSettings.mixin.d.ts +7 -2
- package/lib/src/brand-page-maker/components/quick-link-bar/QuickLinkBar.mixin.d.ts +3 -0
- package/lib/src/brand-page-maker/components/quick-link-bar/QuickLinkBar.mixin.js +11 -0
- package/lib/src/brand-page-maker/components/seo-settings/SeoPageSettings.mixin.d.ts +7 -2
- package/lib/src/brand-page-maker/components/seo-settings/UrlSettings.mixin.d.ts +7 -2
- package/lib/src/brand-page-maker/components/social-share/SocialShare.mixin.d.ts +7 -2
- package/lib/src/brand-page-maker/components/template-preview/TemplatePreview.mixin.d.ts +7 -2
- package/lib/src/brand-page-maker/composables/ai-chat/useAiWebsiteBuilderChat.js +9 -0
- package/lib/src/brand-page-maker/composables/rich-text-editor/useRichTextEditor.js +20 -1
- package/lib/src/brand-page-maker/composables/useEventTracker.d.ts +20 -0
- package/lib/src/brand-page-maker/composables/useEventTracker.js +17 -0
- package/lib/src/brand-page-maker/composables/useUndoRedoFlag.d.ts +16 -0
- package/lib/src/brand-page-maker/composables/useUndoRedoFlag.js +22 -0
- package/lib/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.d.ts +41 -2
- package/lib/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.js +307 -5
- package/lib/src/brand-page-maker/stores/history/history-store.d.ts +83 -0
- package/lib/src/brand-page-maker/stores/history/history-store.js +488 -0
- package/lib/src/brand-page-maker/stores/logo-store/logo-store.d.ts +1 -0
- package/lib/src/brand-page-maker/stores/user/user-store.js +1 -0
- package/lib/src/bundled-translations-D1q3rSEz.js +175 -0
- package/lib/src/bundles/bundled-translations.json +3 -1
- package/lib/src/constants/ui.d.ts +1 -0
- package/lib/src/css/library.brand-page-brandCrowd.min.css +50 -54
- package/lib/src/css/library.brand-page-brandPage.min.css +50 -55
- package/lib/src/css/library.brand-page-designCom.min.css +50 -54
- package/lib/src/css/library.brand-page-preview.min.css +50 -54
- package/lib/src/index.mjs +1 -1
- package/lib/src/{lib-BI3J4Mbk.js → lib-C_Pc-5bF.js} +34307 -33712
- package/lib/src/metadata-builder/builders/reorder-pages-builder.d.ts +13 -0
- package/lib/src/metadata-builder/builders/reorder-pages-builder.js +49 -0
- package/lib/src/shared/content-settings/components/content-settings/ContentSettings.mixin.d.ts +87 -2
- package/lib/src/shared/content-settings/components/content-settings/ContentSettings.mixin.js +5 -0
- package/lib/src/shared/content-settings/components/content-settings/ContentSettings.stories.js +1 -0
- package/lib/src/shared/content-settings/components/content-settings/ReplaceImageSettingsForContent.mixin.d.ts +23 -2
- package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItem.mixin.d.ts +16 -0
- package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.d.ts +7 -2
- package/lib/src/shared/content-settings/components/draggable-item-list/DraggableItemList.mixin.d.ts +3 -0
- package/lib/src/shared/content-settings/components/draggable-item-list/DraggableItemList.mixin.js +19 -2
- package/lib/src/shared/content-settings/components/form-fields-field/FormFieldsField.mixin.js +18 -8
- package/lib/src/shared/content-settings/components/payment-config-field/PaymentConfigField.mixin.d.ts +64 -0
- package/lib/src/shared/content-settings/components/payment-config-field/PaymentConfigField.mixin.js +6 -0
- package/lib/src/shared/logo-settings/components/EditLogoSettings.mixin.d.ts +19 -0
- package/lib/src/shared/logo-settings/components/EditLogoSettings.mixin.js +11 -0
- package/lib/src/shared/logo-settings/components/LogoSettings.mixin.d.ts +10 -2
- package/lib/src/shared/logo-settings/store/editable-logo-store.d.ts +5 -1
- package/lib/src/shared/logo-settings/store/editable-logo-store.js +31 -0
- package/lib/src/shared/page-settings/components/page-settings/PageSettings.mixin.d.ts +24 -2
- package/lib/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.d.ts +10 -2
- package/lib/src/shared/publish-brand-page-with-state/PublishBrandPageModalWithState.mixin.d.ts +23 -2
- package/lib/src/shared/side-bar/components/SideBarTabButton.mixin.d.ts +16 -0
- package/lib/src/shared/style-settings/components/StyleSettings.mixin.d.ts +23 -2
- package/lib/src/shared/template-settings/components/TemplatesSettings.mixin.d.ts +16 -0
- package/package.json +1 -1
- package/src/brand-page/components/button/Button.vue +2 -10
- package/src/brand-page/components/contact-form/ContactForm.vue +2 -2
- package/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.ts +11 -0
- package/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.vue +2 -3
- package/src/brand-page-maker/components/brand-page-maker/__fixtures__/brand-page-examples.ts +1 -0
- package/src/brand-page-maker/components/cookie-collection/CookieSettings.vue +18 -17
- package/src/brand-page-maker/components/quick-link-bar/QuickLinkBar.mixin.ts +13 -0
- package/src/brand-page-maker/components/quick-link-bar/QuickLinkBar.vue +26 -3
- package/src/brand-page-maker/components/quick-link-bar/RedoButton.vue +66 -0
- package/src/brand-page-maker/components/quick-link-bar/UndoButton.vue +66 -0
- package/src/brand-page-maker/components/quick-link-bar/i18n/quick-link-bar.json +3 -1
- package/src/brand-page-maker/components/quick-link-bar/undo-redo-buttons.test.ts +116 -0
- package/src/brand-page-maker/components/save-contact/SaveContact.vue +12 -19
- package/src/brand-page-maker/composables/ai-chat/useAiWebsiteBuilderChat.ts +10 -0
- package/src/brand-page-maker/composables/rich-text-editor/useRichTextEditor.ts +24 -1
- package/src/brand-page-maker/composables/useEventTracker.ts +29 -0
- package/src/brand-page-maker/composables/useUndoRedoFlag.ts +26 -0
- package/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.test.ts +335 -0
- package/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.ts +371 -4
- package/src/brand-page-maker/stores/history/history-store.test.ts +1120 -0
- package/src/brand-page-maker/stores/history/history-store.ts +651 -0
- package/src/brand-page-maker/stores/logo-store/logo-store.ts +5 -0
- package/src/brand-page-maker/stores/user/user-store.ts +1 -0
- package/src/bundles/bundled-translations.json +3 -1
- package/src/constants/ui.ts +1 -0
- package/src/metadata-builder/builders/reorder-pages-builder.ts +80 -0
- package/src/shared/content-settings/components/content-settings/ContentSettings.mixin.ts +5 -0
- package/src/shared/content-settings/components/content-settings/ContentSettings.stories.ts +1 -0
- package/src/shared/content-settings/components/draggable-item-list/DraggableItemList.mixin.ts +19 -2
- package/src/shared/content-settings/components/draggable-item-list/DraggableItemList.vue +1 -1
- package/src/shared/content-settings/components/form-fields-field/FormFieldsField.mixin.ts +26 -10
- package/src/shared/content-settings/components/logo-selection-field/LogoSelection.vue +63 -48
- package/src/shared/content-settings/components/page-dropdown-field/PageDropdownField.vue +4 -0
- package/src/shared/content-settings/components/payment-config-field/PaymentConfigField.mixin.ts +7 -0
- package/src/shared/content-settings/components/text-field/TextField.vue +1 -0
- package/src/shared/content-settings/components/text-image-field/TextImageField.vue +33 -4
- package/src/shared/logo-settings/components/EditLogoSettings.mixin.ts +11 -0
- package/src/shared/logo-settings/store/editable-logo-store.ts +42 -1
- package/lib/src/bundled-translations-B5Fkt3qd.js +0 -175
|
@@ -74,8 +74,9 @@ export interface EditableLogoState {
|
|
|
74
74
|
logoTemplateMetadata: string;
|
|
75
75
|
isLogoDraftSaved: boolean;
|
|
76
76
|
isTextOnlyLogo: boolean;
|
|
77
|
+
variationsByDraftToken: Record<string, EditableLogoVariation[]>;
|
|
77
78
|
}
|
|
78
|
-
export type SetStateAsyncPayload = Omit<EditableLogoState, 'enableEditMode' | 'editableLogoVariations'>;
|
|
79
|
+
export type SetStateAsyncPayload = Omit<EditableLogoState, 'enableEditMode' | 'editableLogoVariations' | 'variationsByDraftToken'>;
|
|
79
80
|
export declare const useUiEditableLogoStore: import("pinia").StoreDefinition<"uiEditableLogo", EditableLogoState, {
|
|
80
81
|
getLogoPrimaryText: (state: {
|
|
81
82
|
enableEditMode: boolean;
|
|
@@ -167,6 +168,7 @@ export declare const useUiEditableLogoStore: import("pinia").StoreDefinition<"ui
|
|
|
167
168
|
logoTemplateMetadata: string;
|
|
168
169
|
isLogoDraftSaved: boolean;
|
|
169
170
|
isTextOnlyLogo: boolean;
|
|
171
|
+
variationsByDraftToken: Record<string, EditableLogoVariation[]>;
|
|
170
172
|
} & import("pinia").PiniaCustomStateProperties<EditableLogoState>) => () => string | undefined;
|
|
171
173
|
}, {
|
|
172
174
|
setStateAsync(payload: {
|
|
@@ -184,6 +186,8 @@ export declare const useUiEditableLogoStore: import("pinia").StoreDefinition<"ui
|
|
|
184
186
|
getEditableLogoVariationByVariationId(id: number): any;
|
|
185
187
|
getEditableLogoVariationByBase64(base64: string): any;
|
|
186
188
|
updateEditableLogoImageUrlAsync(defaultPrimaryText?: string, overrideLogoVariation?: number | undefined, layout?: string): Promise<void>;
|
|
189
|
+
stampLogoBase64IntoBrandPageData(overrideLogoVariation?: number): void;
|
|
190
|
+
restoreVariationsForDraftToken(logoDraftToken: string): boolean;
|
|
187
191
|
updateMetadataAsync(defaultPrimaryText?: string, resetLogoTemplateMetadata?: boolean, layout?: string): Promise<void>;
|
|
188
192
|
updateEditableLogoImageByVariationAsync(editableLogoVariation: EditableLogoVariation, defaultPrimaryText?: string, layout?: string): Promise<ModifyLogoDataResponse | null>;
|
|
189
193
|
getDraftMetadata(logoDraftToken: string): string | undefined;
|
|
@@ -74,6 +74,7 @@ export const useUiEditableLogoStore = defineStore('uiEditableLogo', {
|
|
|
74
74
|
},
|
|
75
75
|
makerFonts: [],
|
|
76
76
|
isLogoDraftSaved: false,
|
|
77
|
+
variationsByDraftToken: {},
|
|
77
78
|
}),
|
|
78
79
|
actions: {
|
|
79
80
|
async setStateAsync(payload) {
|
|
@@ -217,6 +218,17 @@ export const useUiEditableLogoStore = defineStore('uiEditableLogo', {
|
|
|
217
218
|
async updateEditableLogoImageUrlAsync(defaultPrimaryText, overrideLogoVariation, layout) {
|
|
218
219
|
const tasks = this.editableLogoVariations.map((x) => this.updateEditableLogoImageByVariationAsync(x, defaultPrimaryText, layout));
|
|
219
220
|
await Promise.all(tasks);
|
|
221
|
+
this.stampLogoBase64IntoBrandPageData(overrideLogoVariation);
|
|
222
|
+
// Cache per draft token so BYO undo can restore without re-rendering.
|
|
223
|
+
if (this.logoDraftToken) {
|
|
224
|
+
this.variationsByDraftToken[this.logoDraftToken] =
|
|
225
|
+
this.editableLogoVariations.map((v) => ({ ...v }));
|
|
226
|
+
}
|
|
227
|
+
},
|
|
228
|
+
// Stamp editableLogoVariations[*].base64 across header/footer + every
|
|
229
|
+
// LogoContent. Called by the live edit path post-render, and by
|
|
230
|
+
// undo/redo to repopulate the stripped logoImageBase64Url fields.
|
|
231
|
+
stampLogoBase64IntoBrandPageData(overrideLogoVariation) {
|
|
220
232
|
const pageSettingStore = useUiPageSettingsStore();
|
|
221
233
|
[PAGE_SECTIONS.header, PAGE_SECTIONS.footer].forEach((section) => {
|
|
222
234
|
[VIEWPORTS.desktop, VIEWPORTS.mobile].forEach((viewport) => {
|
|
@@ -243,6 +255,15 @@ export const useUiEditableLogoStore = defineStore('uiEditableLogo', {
|
|
|
243
255
|
});
|
|
244
256
|
});
|
|
245
257
|
},
|
|
258
|
+
// Restore variations grid for a draft token from the per-token cache.
|
|
259
|
+
// Returns true on cache hit.
|
|
260
|
+
restoreVariationsForDraftToken(logoDraftToken) {
|
|
261
|
+
const cached = this.variationsByDraftToken[logoDraftToken];
|
|
262
|
+
if (!cached)
|
|
263
|
+
return false;
|
|
264
|
+
this.editableLogoVariations = cached.map((v) => ({ ...v }));
|
|
265
|
+
return true;
|
|
266
|
+
},
|
|
246
267
|
async updateMetadataAsync(defaultPrimaryText, resetLogoTemplateMetadata = false, layout) {
|
|
247
268
|
const result = await this.postEditableLogoRequestAsync({
|
|
248
269
|
returnJson: true,
|
|
@@ -285,6 +306,13 @@ export const useUiEditableLogoStore = defineStore('uiEditableLogo', {
|
|
|
285
306
|
const logoDraft = logoStore.getLogoDraftAssetByToken(this.logoDraftToken);
|
|
286
307
|
if (logoDraft) {
|
|
287
308
|
logoDraft.metadata = metadata;
|
|
309
|
+
// Refresh the template-asset stamp in case the active asset has
|
|
310
|
+
// changed since this draft was first registered (e.g. successive
|
|
311
|
+
// BYO uploads that share an existing draft token would otherwise
|
|
312
|
+
// keep pointing at an older template).
|
|
313
|
+
if (logoStore.logoTemplateAsset) {
|
|
314
|
+
logoDraft.templateAsset = { ...logoStore.logoTemplateAsset };
|
|
315
|
+
}
|
|
288
316
|
}
|
|
289
317
|
else {
|
|
290
318
|
logoStore.addLogoDraftAsset({
|
|
@@ -293,6 +321,9 @@ export const useUiEditableLogoStore = defineStore('uiEditableLogo', {
|
|
|
293
321
|
metadata,
|
|
294
322
|
tick: Date.now(),
|
|
295
323
|
isByo: logoStore.logoTemplateAsset?.isByo || false,
|
|
324
|
+
templateAsset: logoStore.logoTemplateAsset
|
|
325
|
+
? { ...logoStore.logoTemplateAsset }
|
|
326
|
+
: undefined,
|
|
296
327
|
},
|
|
297
328
|
});
|
|
298
329
|
}
|
|
@@ -3124,6 +3124,7 @@ declare const _default: import("vue").DefineComponent<{}, {
|
|
|
3124
3124
|
canUseGettyVideos: boolean;
|
|
3125
3125
|
canUseGoogleAdsense: boolean;
|
|
3126
3126
|
googleAdsenseEnabled: boolean;
|
|
3127
|
+
canUseUndoRedo: boolean;
|
|
3127
3128
|
}>;
|
|
3128
3129
|
isAdmin: import("vue").ComputedRef<boolean>;
|
|
3129
3130
|
isBrandSite: import("vue").ComputedRef<boolean>;
|
|
@@ -3835,16 +3836,21 @@ declare const _default: import("vue").DefineComponent<{}, {
|
|
|
3835
3836
|
hideChangeTemplateConfirmModal(): void;
|
|
3836
3837
|
onBackgroundChanged(): void;
|
|
3837
3838
|
onChangeTemplateConfirmModalCancel(): void;
|
|
3838
|
-
onChangeTemplateConfirmModalConfirm(): void
|
|
3839
|
+
onChangeTemplateConfirmModalConfirm(): Promise<void>;
|
|
3839
3840
|
onContentChanged(): void;
|
|
3840
3841
|
onStyleChanged(): void;
|
|
3841
|
-
onTemplateSelected(payload: import("@brand-page-maker/stores").OnTemplateSelectedPayload): void
|
|
3842
|
+
onTemplateSelected(payload: import("@brand-page-maker/stores").OnTemplateSelectedPayload): Promise<void>;
|
|
3842
3843
|
setSelectedTabName(payload: any): void;
|
|
3843
3844
|
showNextNotificationMessage(): Promise<void>;
|
|
3844
3845
|
updateContent<TContent extends Content, P extends {
|
|
3845
3846
|
id: string;
|
|
3846
3847
|
content: TContent;
|
|
3847
3848
|
}>(payload: P): Promise<void>;
|
|
3849
|
+
_captureTemplateSwitchIfEnabled(): void;
|
|
3850
|
+
applyHistorySnapshot(snapshot: import("@brand-page").BrandPageModel, activePageId?: string | undefined, logoEditsStr?: string | undefined): Promise<void>;
|
|
3851
|
+
_syncLogoSettingsFromSnapshot(snapshot: import("@brand-page").BrandPageModel, logoEditsStr?: string | undefined): Promise<void>;
|
|
3852
|
+
_navigateToActivePage(activePageId?: string | undefined): void;
|
|
3853
|
+
_fallbackSidebarIfSelectedContentMissing(snapshot: import("@brand-page").BrandPageModel): void;
|
|
3848
3854
|
export(): import("@brand-page").BrandPageModel;
|
|
3849
3855
|
setBrandPageType({ brandPageType }: {
|
|
3850
3856
|
brandPageType: "default" | "brandSite" | "brandContact";
|
|
@@ -4787,6 +4793,22 @@ declare const _default: import("vue").DefineComponent<{}, {
|
|
|
4787
4793
|
onDraggingEnd: (ev?: any, routeId?: string, previousParentRouteId?: string) => void;
|
|
4788
4794
|
eventTracker: {
|
|
4789
4795
|
sendShippingToggleEvent: (isEnabled: boolean) => void;
|
|
4796
|
+
sendUndoEvent: (props: {
|
|
4797
|
+
entries_count: number;
|
|
4798
|
+
actor: string | undefined;
|
|
4799
|
+
}) => void;
|
|
4800
|
+
sendRedoEvent: (props: {
|
|
4801
|
+
entries_count: number;
|
|
4802
|
+
actor: string | undefined;
|
|
4803
|
+
}) => void;
|
|
4804
|
+
sendHistoryCappedEvent: (props: {
|
|
4805
|
+
entries_count: number;
|
|
4806
|
+
size_bytes: number;
|
|
4807
|
+
}) => void;
|
|
4808
|
+
sendHistoryOversizedEvent: (props: {
|
|
4809
|
+
attempted_bytes: number;
|
|
4810
|
+
source: string;
|
|
4811
|
+
}) => void;
|
|
4790
4812
|
sendSaveContactEvent: () => void;
|
|
4791
4813
|
sendStartForFreeEvent: () => void;
|
|
4792
4814
|
sendFooterLinkClickEvent: (linkType: "watermark_logo" | "create_your_website") => void;
|
|
@@ -4269,6 +4269,7 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
|
|
|
4269
4269
|
logoTemplateMetadata: string;
|
|
4270
4270
|
isLogoDraftSaved: boolean;
|
|
4271
4271
|
isTextOnlyLogo: boolean;
|
|
4272
|
+
variationsByDraftToken: Record<string, import("@shared/logo-settings/store").EditableLogoVariation[]>;
|
|
4272
4273
|
} & import("pinia").PiniaCustomStateProperties<import("@shared/logo-settings/store").EditableLogoState>) => () => string | undefined;
|
|
4273
4274
|
}, {
|
|
4274
4275
|
setStateAsync(payload: {
|
|
@@ -4286,6 +4287,8 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
|
|
|
4286
4287
|
getEditableLogoVariationByVariationId(id: number): any;
|
|
4287
4288
|
getEditableLogoVariationByBase64(base64: string): any;
|
|
4288
4289
|
updateEditableLogoImageUrlAsync(defaultPrimaryText?: string | undefined, overrideLogoVariation?: number | undefined, layout?: string | undefined): Promise<void>;
|
|
4290
|
+
stampLogoBase64IntoBrandPageData(overrideLogoVariation?: number | undefined): void;
|
|
4291
|
+
restoreVariationsForDraftToken(logoDraftToken: string): boolean;
|
|
4289
4292
|
updateMetadataAsync(defaultPrimaryText?: string | undefined, resetLogoTemplateMetadata?: boolean, layout?: string | undefined): Promise<void>;
|
|
4290
4293
|
updateEditableLogoImageByVariationAsync(editableLogoVariation: import("@shared/logo-settings/store").EditableLogoVariation, defaultPrimaryText?: string | undefined, layout?: string | undefined): Promise<import("../../../../clients/fabric-render-client").ModifyLogoDataResponse | null>;
|
|
4291
4294
|
getDraftMetadata(logoDraftToken: string): string | undefined;
|
|
@@ -4393,16 +4396,21 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
|
|
|
4393
4396
|
hideChangeTemplateConfirmModal(): void;
|
|
4394
4397
|
onBackgroundChanged(): void;
|
|
4395
4398
|
onChangeTemplateConfirmModalCancel(): void;
|
|
4396
|
-
onChangeTemplateConfirmModalConfirm(): void
|
|
4399
|
+
onChangeTemplateConfirmModalConfirm(): Promise<void>;
|
|
4397
4400
|
onContentChanged(): void;
|
|
4398
4401
|
onStyleChanged(): void;
|
|
4399
|
-
onTemplateSelected(payload: import("@brand-page-maker/stores").OnTemplateSelectedPayload): void
|
|
4402
|
+
onTemplateSelected(payload: import("@brand-page-maker/stores").OnTemplateSelectedPayload): Promise<void>;
|
|
4400
4403
|
setSelectedTabName(payload: any): void;
|
|
4401
4404
|
showNextNotificationMessage(): Promise<void>;
|
|
4402
4405
|
updateContent<TContent extends import("@brand-page").Content, P extends {
|
|
4403
4406
|
id: string;
|
|
4404
4407
|
content: TContent;
|
|
4405
4408
|
}>(payload: P): Promise<void>;
|
|
4409
|
+
_captureTemplateSwitchIfEnabled(): void;
|
|
4410
|
+
applyHistorySnapshot(snapshot: import("@brand-page").BrandPageModel, activePageId?: string | undefined, logoEditsStr?: string | undefined): Promise<void>;
|
|
4411
|
+
_syncLogoSettingsFromSnapshot(snapshot: import("@brand-page").BrandPageModel, logoEditsStr?: string | undefined): Promise<void>;
|
|
4412
|
+
_navigateToActivePage(activePageId?: string | undefined): void;
|
|
4413
|
+
_fallbackSidebarIfSelectedContentMissing(snapshot: import("@brand-page").BrandPageModel): void;
|
|
4406
4414
|
export(): import("@brand-page").BrandPageModel;
|
|
4407
4415
|
setBrandPageType({ brandPageType }: {
|
|
4408
4416
|
brandPageType: "default" | "brandSite" | "brandContact";
|
package/lib/src/shared/publish-brand-page-with-state/PublishBrandPageModalWithState.mixin.d.ts
CHANGED
|
@@ -173,16 +173,21 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
|
|
|
173
173
|
hideChangeTemplateConfirmModal(): void;
|
|
174
174
|
onBackgroundChanged(): void;
|
|
175
175
|
onChangeTemplateConfirmModalCancel(): void;
|
|
176
|
-
onChangeTemplateConfirmModalConfirm(): void
|
|
176
|
+
onChangeTemplateConfirmModalConfirm(): Promise<void>;
|
|
177
177
|
onContentChanged(): void;
|
|
178
178
|
onStyleChanged(): void;
|
|
179
|
-
onTemplateSelected(payload: import("@brand-page-maker/stores").OnTemplateSelectedPayload): void
|
|
179
|
+
onTemplateSelected(payload: import("@brand-page-maker/stores").OnTemplateSelectedPayload): Promise<void>;
|
|
180
180
|
setSelectedTabName(payload: any): void;
|
|
181
181
|
showNextNotificationMessage(): Promise<void>;
|
|
182
182
|
updateContent<TContent extends import("@brand-page/models").Content, P extends {
|
|
183
183
|
id: string;
|
|
184
184
|
content: TContent;
|
|
185
185
|
}>(payload: P): Promise<void>;
|
|
186
|
+
_captureTemplateSwitchIfEnabled(): void;
|
|
187
|
+
applyHistorySnapshot(snapshot: import("@brand-page/models").BrandPageModel, activePageId?: string | undefined, logoEditsStr?: string | undefined): Promise<void>;
|
|
188
|
+
_syncLogoSettingsFromSnapshot(snapshot: import("@brand-page/models").BrandPageModel, logoEditsStr?: string | undefined): Promise<void>;
|
|
189
|
+
_navigateToActivePage(activePageId?: string | undefined): void;
|
|
190
|
+
_fallbackSidebarIfSelectedContentMissing(snapshot: import("@brand-page/models").BrandPageModel): void;
|
|
186
191
|
export(): import("@brand-page/models").BrandPageModel;
|
|
187
192
|
setBrandPageType({ brandPageType }: {
|
|
188
193
|
brandPageType: "default" | "brandSite" | "brandContact";
|
|
@@ -479,6 +484,22 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
|
|
|
479
484
|
}>;
|
|
480
485
|
eventTracker: {
|
|
481
486
|
sendShippingToggleEvent: (isEnabled: boolean) => void;
|
|
487
|
+
sendUndoEvent: (props: {
|
|
488
|
+
entries_count: number;
|
|
489
|
+
actor: string | undefined;
|
|
490
|
+
}) => void;
|
|
491
|
+
sendRedoEvent: (props: {
|
|
492
|
+
entries_count: number;
|
|
493
|
+
actor: string | undefined;
|
|
494
|
+
}) => void;
|
|
495
|
+
sendHistoryCappedEvent: (props: {
|
|
496
|
+
entries_count: number;
|
|
497
|
+
size_bytes: number;
|
|
498
|
+
}) => void;
|
|
499
|
+
sendHistoryOversizedEvent: (props: {
|
|
500
|
+
attempted_bytes: number;
|
|
501
|
+
source: string;
|
|
502
|
+
}) => void;
|
|
482
503
|
sendSaveContactEvent: () => void;
|
|
483
504
|
sendStartForFreeEvent: () => void;
|
|
484
505
|
sendFooterLinkClickEvent: (linkType: "watermark_logo" | "create_your_website") => void;
|
|
@@ -17,6 +17,22 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
|
|
|
17
17
|
isDesignCom: import("vue").ComputedRef<boolean>;
|
|
18
18
|
eventTracker: {
|
|
19
19
|
sendShippingToggleEvent: (isEnabled: boolean) => void;
|
|
20
|
+
sendUndoEvent: (props: {
|
|
21
|
+
entries_count: number;
|
|
22
|
+
actor: string | undefined;
|
|
23
|
+
}) => void;
|
|
24
|
+
sendRedoEvent: (props: {
|
|
25
|
+
entries_count: number;
|
|
26
|
+
actor: string | undefined;
|
|
27
|
+
}) => void;
|
|
28
|
+
sendHistoryCappedEvent: (props: {
|
|
29
|
+
entries_count: number;
|
|
30
|
+
size_bytes: number;
|
|
31
|
+
}) => void;
|
|
32
|
+
sendHistoryOversizedEvent: (props: {
|
|
33
|
+
attempted_bytes: number;
|
|
34
|
+
source: string;
|
|
35
|
+
}) => void;
|
|
20
36
|
sendSaveContactEvent: () => void;
|
|
21
37
|
sendStartForFreeEvent: () => void;
|
|
22
38
|
sendFooterLinkClickEvent: (linkType: "watermark_logo" | "create_your_website") => void;
|
|
@@ -565,16 +565,21 @@ declare const _default: import("vue").DefineComponent<{}, {
|
|
|
565
565
|
hideChangeTemplateConfirmModal(): void;
|
|
566
566
|
onBackgroundChanged(): void;
|
|
567
567
|
onChangeTemplateConfirmModalCancel(): void;
|
|
568
|
-
onChangeTemplateConfirmModalConfirm(): void
|
|
568
|
+
onChangeTemplateConfirmModalConfirm(): Promise<void>;
|
|
569
569
|
onContentChanged(): void;
|
|
570
570
|
onStyleChanged(): void;
|
|
571
|
-
onTemplateSelected(payload: import("@brand-page-maker/stores").OnTemplateSelectedPayload): void
|
|
571
|
+
onTemplateSelected(payload: import("@brand-page-maker/stores").OnTemplateSelectedPayload): Promise<void>;
|
|
572
572
|
setSelectedTabName(payload: any): void;
|
|
573
573
|
showNextNotificationMessage(): Promise<void>;
|
|
574
574
|
updateContent<TContent extends import("@brand-page").Content, P extends {
|
|
575
575
|
id: string;
|
|
576
576
|
content: TContent;
|
|
577
577
|
}>(payload: P): Promise<void>;
|
|
578
|
+
_captureTemplateSwitchIfEnabled(): void;
|
|
579
|
+
applyHistorySnapshot(snapshot: import("@brand-page").BrandPageModel, activePageId?: string | undefined, logoEditsStr?: string | undefined): Promise<void>;
|
|
580
|
+
_syncLogoSettingsFromSnapshot(snapshot: import("@brand-page").BrandPageModel, logoEditsStr?: string | undefined): Promise<void>;
|
|
581
|
+
_navigateToActivePage(activePageId?: string | undefined): void;
|
|
582
|
+
_fallbackSidebarIfSelectedContentMissing(snapshot: import("@brand-page").BrandPageModel): void;
|
|
578
583
|
export(): import("@brand-page").BrandPageModel;
|
|
579
584
|
setBrandPageType({ brandPageType }: {
|
|
580
585
|
brandPageType: "default" | "brandSite" | "brandContact";
|
|
@@ -915,6 +920,22 @@ declare const _default: import("vue").DefineComponent<{}, {
|
|
|
915
920
|
}>;
|
|
916
921
|
eventTracker: {
|
|
917
922
|
sendShippingToggleEvent: (isEnabled: boolean) => void;
|
|
923
|
+
sendUndoEvent: (props: {
|
|
924
|
+
entries_count: number;
|
|
925
|
+
actor: string | undefined;
|
|
926
|
+
}) => void;
|
|
927
|
+
sendRedoEvent: (props: {
|
|
928
|
+
entries_count: number;
|
|
929
|
+
actor: string | undefined;
|
|
930
|
+
}) => void;
|
|
931
|
+
sendHistoryCappedEvent: (props: {
|
|
932
|
+
entries_count: number;
|
|
933
|
+
size_bytes: number;
|
|
934
|
+
}) => void;
|
|
935
|
+
sendHistoryOversizedEvent: (props: {
|
|
936
|
+
attempted_bytes: number;
|
|
937
|
+
source: string;
|
|
938
|
+
}) => void;
|
|
918
939
|
sendSaveContactEvent: () => void;
|
|
919
940
|
sendStartForFreeEvent: () => void;
|
|
920
941
|
sendFooterLinkClickEvent: (linkType: "watermark_logo" | "create_your_website") => void;
|
|
@@ -565,6 +565,22 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
|
|
|
565
565
|
isDesignCom: import("vue").ComputedRef<boolean>;
|
|
566
566
|
eventTracker: {
|
|
567
567
|
sendShippingToggleEvent: (isEnabled: boolean) => void;
|
|
568
|
+
sendUndoEvent: (props: {
|
|
569
|
+
entries_count: number;
|
|
570
|
+
actor: string | undefined;
|
|
571
|
+
}) => void;
|
|
572
|
+
sendRedoEvent: (props: {
|
|
573
|
+
entries_count: number;
|
|
574
|
+
actor: string | undefined;
|
|
575
|
+
}) => void;
|
|
576
|
+
sendHistoryCappedEvent: (props: {
|
|
577
|
+
entries_count: number;
|
|
578
|
+
size_bytes: number;
|
|
579
|
+
}) => void;
|
|
580
|
+
sendHistoryOversizedEvent: (props: {
|
|
581
|
+
attempted_bytes: number;
|
|
582
|
+
source: string;
|
|
583
|
+
}) => void;
|
|
568
584
|
sendSaveContactEvent: () => void;
|
|
569
585
|
sendStartForFreeEvent: () => void;
|
|
570
586
|
sendFooterLinkClickEvent: (linkType: "watermark_logo" | "create_your_website") => void;
|
package/package.json
CHANGED
|
@@ -253,21 +253,13 @@ const onCloseModal = (): void => {
|
|
|
253
253
|
text-decoration: none;
|
|
254
254
|
}
|
|
255
255
|
|
|
256
|
-
/* Shape-library icons (vector, nested in .c-shape, no class on the img):
|
|
257
|
-
render at the default icon size, centered in normal flow like the SVG icons. */
|
|
258
256
|
.bp-button :deep(.c-button__icon-img img) {
|
|
259
257
|
@apply tw-object-cover tw-max-w-none;
|
|
260
|
-
width: var(--icon-w);
|
|
261
|
-
height: var(--icon-h);
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
/* Raster image thumbnails (FallbackImage renders <img class="c-image">):
|
|
265
|
-
render larger/prominent and centered over the icon slot. */
|
|
266
|
-
.bp-button :deep(.c-button__icon-img img.c-image) {
|
|
267
258
|
--icon-img-size: 2.3rem;
|
|
259
|
+
--icon-img-offset-x: calc((var(--button-p-x) - var(--button-p-y)) * 2);
|
|
268
260
|
position: absolute;
|
|
269
261
|
top: calc(var(--icon-img-size) / -2 + var(--icon-h) / 2);
|
|
270
|
-
left: calc(var(--icon-img-size) / -2 + var(--icon-
|
|
262
|
+
left: calc(var(--icon-img-size) / -2 + var(--icon-img-offset-x));
|
|
271
263
|
width: var(--icon-img-size);
|
|
272
264
|
height: var(--icon-img-size);
|
|
273
265
|
}
|
|
@@ -286,7 +286,7 @@
|
|
|
286
286
|
{{ value.error }}
|
|
287
287
|
</p>
|
|
288
288
|
</div>
|
|
289
|
-
<div class="tw-flex tw-w-full tw-justify-
|
|
289
|
+
<div class="tw-flex tw-w-full tw-justify-center tw-col-span-2">
|
|
290
290
|
<button
|
|
291
291
|
v-if="isSubmitButtonVisible"
|
|
292
292
|
class="tw-block tw-border-0 tw-py-2 tw-select-none tw-text-base tw-text-center tw-w-fit hover:tw-cursor-pointer tw-px-8 tw-py-3 c-button-full"
|
|
@@ -417,7 +417,7 @@
|
|
|
417
417
|
</p>
|
|
418
418
|
</div>
|
|
419
419
|
<div
|
|
420
|
-
class="tw-flex tw-w-full tw-justify-
|
|
420
|
+
class="tw-flex tw-w-full tw-justify-center tw-col-span-2"
|
|
421
421
|
>
|
|
422
422
|
<button
|
|
423
423
|
v-if="isSubmitButtonVisible"
|
|
@@ -35,6 +35,8 @@ import {
|
|
|
35
35
|
useSnapshotStore,
|
|
36
36
|
useVideoStore,
|
|
37
37
|
} from '@brand-page-maker/stores';
|
|
38
|
+
import { useHistoryStore } from '@brand-page-maker/stores/history/history-store';
|
|
39
|
+
import { useUndoRedoFlag } from '@brand-page-maker/composables/useUndoRedoFlag';
|
|
38
40
|
import type { AdminPreviewLogoTemplateModel } from '@brand-page-maker/stores/admin-logo-settings';
|
|
39
41
|
import { useUiContentSettingsStore } from '@shared/content-settings/store';
|
|
40
42
|
import { useUiTemplateSettingsStore } from '@shared/template-settings/store';
|
|
@@ -283,6 +285,15 @@ export default defineComponent({
|
|
|
283
285
|
// Mark brand page as fully loaded
|
|
284
286
|
this.brandPageMakerStore.setIsBrandPageLoaded(true);
|
|
285
287
|
|
|
288
|
+
// Capture baseline for undo/redo when the feature is active for this
|
|
289
|
+
// session. `useUndoRedoFlag` requires both the LaunchDarkly feature
|
|
290
|
+
// (`userStore.features.canUseUndoRedo`) AND the maker being a brand-site
|
|
291
|
+
// — V1 scope is brand-site only; brand-page and brand-contact don't get
|
|
292
|
+
// undo/redo. See useUndoRedoFlag.ts for the rationale.
|
|
293
|
+
if (useUndoRedoFlag().value) {
|
|
294
|
+
useHistoryStore().captureBaseline();
|
|
295
|
+
}
|
|
296
|
+
|
|
286
297
|
this.$emit(EVENTS.Initialised);
|
|
287
298
|
},
|
|
288
299
|
mounted() {
|
|
@@ -23,7 +23,6 @@
|
|
|
23
23
|
>
|
|
24
24
|
<div class="tw-flex tw-flex-col tw-w-full tw-h-full">
|
|
25
25
|
<QuickLinkBar
|
|
26
|
-
v-if="isPublished && !isAdmin"
|
|
27
26
|
class="c-quick-link-bar"
|
|
28
27
|
:brand-page-base-url="brandPageBaseUrl"
|
|
29
28
|
:slug="brandPageSlug"
|
|
@@ -87,8 +86,8 @@
|
|
|
87
86
|
v-if="isBrandPageLoaded"
|
|
88
87
|
:is-mobile-device="isMobileDevice"
|
|
89
88
|
:is-design-com="isDesignCom"
|
|
90
|
-
:has-quick-links="isPublished"
|
|
91
89
|
:container="previewContainer"
|
|
90
|
+
:has-quick-links="isPublished"
|
|
92
91
|
>
|
|
93
92
|
<div ref="previewContent" class="tw-h-full">
|
|
94
93
|
<PreviewWithState :device-mode="deviceMode" />
|
|
@@ -123,9 +122,9 @@
|
|
|
123
122
|
</div>
|
|
124
123
|
|
|
125
124
|
<SideBar
|
|
126
|
-
:has-quick-links="isPublished"
|
|
127
125
|
:mobile-tab-name="SideBarTabNames.PREVIEW"
|
|
128
126
|
:is-mobile-screen-size="isMobileScreenSize"
|
|
127
|
+
:has-quick-links="isPublished"
|
|
129
128
|
>
|
|
130
129
|
<template #tab>
|
|
131
130
|
<component
|
|
@@ -20,14 +20,14 @@
|
|
|
20
20
|
</div>
|
|
21
21
|
<Toggle
|
|
22
22
|
id="show-cookie-banner"
|
|
23
|
-
:model-value="
|
|
23
|
+
:model-value="isToggled"
|
|
24
24
|
class="tw-pointer-events-none tw-touch-none"
|
|
25
25
|
color="primary"
|
|
26
26
|
@update:model-value="onShowCookieBanner()"
|
|
27
27
|
/>
|
|
28
28
|
</div>
|
|
29
29
|
</div>
|
|
30
|
-
<div v-if="
|
|
30
|
+
<div v-if="isToggled" class="tw-flex-none tw-mt-4">
|
|
31
31
|
<div
|
|
32
32
|
class="tw-flex tw-items-center tw-justify-between tw-cursor-pointer"
|
|
33
33
|
@click="onShowPreviewCookieBanner"
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
</div>
|
|
42
42
|
<Toggle
|
|
43
43
|
id="show-preview-cookie-banner"
|
|
44
|
-
:model-value="
|
|
44
|
+
:model-value="isPreviewToggled"
|
|
45
45
|
class="tw-pointer-events-none tw-touch-none"
|
|
46
46
|
color="primary"
|
|
47
47
|
@update:model-value="onShowPreviewCookieBanner()"
|
|
@@ -55,10 +55,10 @@
|
|
|
55
55
|
import { Toggle } from '@designcrowd/fe-shared-lib';
|
|
56
56
|
import { cookieSettingTr } from '@src/composables/useTranslate';
|
|
57
57
|
import type { CookieOptions } from '@brand-page/models';
|
|
58
|
-
import {
|
|
58
|
+
import { computed, type PropType } from 'vue';
|
|
59
59
|
import { useBrandPageMakerStore } from '@brand-page-maker/stores';
|
|
60
60
|
|
|
61
|
-
|
|
61
|
+
defineProps({
|
|
62
62
|
viewModel: {
|
|
63
63
|
type: Object as PropType<CookieOptions>,
|
|
64
64
|
required: true,
|
|
@@ -67,25 +67,26 @@ const props = defineProps({
|
|
|
67
67
|
|
|
68
68
|
const brandPageMakerStore = useBrandPageMakerStore();
|
|
69
69
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
70
|
+
// Read directly from the store so undo/redo (and any other external
|
|
71
|
+
// mutation of cookieOptions) is reflected in the toggles.
|
|
72
|
+
const isToggled = computed(
|
|
73
|
+
() => brandPageMakerStore.cookieOptions.isCookieEnabled,
|
|
74
|
+
);
|
|
75
|
+
const isPreviewToggled = computed(
|
|
76
|
+
() => brandPageMakerStore.cookieOptions.isCookiePreviewEnabled,
|
|
77
|
+
);
|
|
74
78
|
|
|
75
79
|
const onShowCookieBanner = () => {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
});
|
|
80
|
-
data.isPreviewToggled = data.isToggled;
|
|
80
|
+
const next = !isToggled.value;
|
|
81
|
+
|
|
82
|
+
brandPageMakerStore.setCookieEnabled({ isCookieEnabled: next });
|
|
81
83
|
brandPageMakerStore.setCookiePreviewEnabled({
|
|
82
|
-
isCookiePreviewEnabled:
|
|
84
|
+
isCookiePreviewEnabled: next,
|
|
83
85
|
});
|
|
84
86
|
};
|
|
85
87
|
const onShowPreviewCookieBanner = () => {
|
|
86
|
-
data.isPreviewToggled = !data.isPreviewToggled;
|
|
87
88
|
brandPageMakerStore.setCookiePreviewEnabled({
|
|
88
|
-
isCookiePreviewEnabled:
|
|
89
|
+
isCookiePreviewEnabled: !isPreviewToggled.value,
|
|
89
90
|
});
|
|
90
91
|
};
|
|
91
92
|
</script>
|
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
useBrandPageContainerStore,
|
|
5
5
|
useEventManagerStore,
|
|
6
6
|
} from '@brand-page-maker/stores';
|
|
7
|
+
import { useUndoRedoFlag } from '@brand-page-maker/composables/useUndoRedoFlag';
|
|
7
8
|
import { quickLinkBarTr } from '@src/composables/useTranslate';
|
|
8
9
|
|
|
9
10
|
export default defineComponent({
|
|
@@ -21,6 +22,7 @@ export default defineComponent({
|
|
|
21
22
|
return {
|
|
22
23
|
brandPageContainerStore: useBrandPageContainerStore(),
|
|
23
24
|
eventManagerStore: useEventManagerStore(),
|
|
25
|
+
undoRedoEnabled: useUndoRedoFlag(),
|
|
24
26
|
};
|
|
25
27
|
},
|
|
26
28
|
data() {
|
|
@@ -29,6 +31,17 @@ export default defineComponent({
|
|
|
29
31
|
};
|
|
30
32
|
},
|
|
31
33
|
computed: {
|
|
34
|
+
isPublished(): boolean {
|
|
35
|
+
return this.brandPageContainerStore.isPublished;
|
|
36
|
+
},
|
|
37
|
+
|
|
38
|
+
// Only render the bar when at least one inner cluster has something to
|
|
39
|
+
// show. Otherwise we'd render an empty white strip — e.g. on an
|
|
40
|
+
// unpublished page with the undo flag off.
|
|
41
|
+
shouldShowBar(): boolean {
|
|
42
|
+
return Boolean(this.undoRedoEnabled) || this.isPublished;
|
|
43
|
+
},
|
|
44
|
+
|
|
32
45
|
brandPageUrl(): string {
|
|
33
46
|
if (
|
|
34
47
|
this.brandPageContainerStore.isCustomDomainEnabled &&
|
|
@@ -1,10 +1,24 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div
|
|
3
|
+
v-if="shouldShowBar"
|
|
3
4
|
data-component="quick-link-bar"
|
|
4
5
|
class="c-quick-links tw-w-full tw-flex-none tw-bg-white md:tw-h-12 tw-border-b tw-border-grayscale-500 tw-px-2 lg:tw-px-4 tw-box-border tw-flex tw-items-center tw-text-grayscale-800 tw-fixed lg:tw-static"
|
|
5
6
|
>
|
|
6
|
-
|
|
7
|
-
|
|
7
|
+
<!-- Left slot: Undo/Redo buttons. Always rendered for layout balance
|
|
8
|
+
(flex-1 reserves equal space on left and right) so the center
|
|
9
|
+
cluster stays geometrically centered in the bar regardless of
|
|
10
|
+
whether the buttons are visible. -->
|
|
11
|
+
<div class="tw-flex tw-flex-1 tw-justify-start tw-gap-1">
|
|
12
|
+
<template v-if="undoRedoEnabled">
|
|
13
|
+
<UndoButton />
|
|
14
|
+
<RedoButton />
|
|
15
|
+
</template>
|
|
16
|
+
</div>
|
|
17
|
+
|
|
18
|
+
<!-- Center cluster: URL label, link, copy button -->
|
|
19
|
+
<div
|
|
20
|
+
v-if="isPublished"
|
|
21
|
+
class="tw-flex tw-items-center tw-gap-2 tw-justify-center"
|
|
8
22
|
>
|
|
9
23
|
<strong class="tw-font-semibold tw-hidden xl:tw-inline-block">
|
|
10
24
|
{{ quickLinkBarTr('myWebPageLabel') }}
|
|
@@ -27,7 +41,12 @@
|
|
|
27
41
|
}"
|
|
28
42
|
@on-click.stop="onCopyClick"
|
|
29
43
|
/>
|
|
30
|
-
</
|
|
44
|
+
</div>
|
|
45
|
+
|
|
46
|
+
<!-- Right spacer: balances the left slot so the center cluster is
|
|
47
|
+
geometrically centered. -->
|
|
48
|
+
<div class="tw-flex-1" />
|
|
49
|
+
|
|
31
50
|
<textarea ref="textarea" :value="brandPageUrl" class="tw-sr-only" />
|
|
32
51
|
</div>
|
|
33
52
|
</template>
|
|
@@ -35,10 +54,14 @@
|
|
|
35
54
|
import QuickLinkBarMixin from './QuickLinkBar.mixin.ts';
|
|
36
55
|
import { Button } from '@designcrowd/fe-shared-lib';
|
|
37
56
|
import { quickLinkBarTr } from '@src/composables/useTranslate';
|
|
57
|
+
import UndoButton from './UndoButton.vue';
|
|
58
|
+
import RedoButton from './RedoButton.vue';
|
|
38
59
|
|
|
39
60
|
export default {
|
|
40
61
|
components: {
|
|
41
62
|
Button,
|
|
63
|
+
UndoButton,
|
|
64
|
+
RedoButton,
|
|
42
65
|
},
|
|
43
66
|
mixins: [QuickLinkBarMixin],
|
|
44
67
|
setup(props, context) {
|