@designcrowd/library.brand-page 6.0.13 → 6.0.14-5804-2

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 (96) hide show
  1. package/lib/src/{CreatedOnBrandCrowd-de-de-CBjFFeBP.js → CreatedOnBrandCrowd-de-de-BW15_bVX.js} +1 -1
  2. package/lib/src/{CreatedOnBrandCrowd-en-us-NuNXF81K.js → CreatedOnBrandCrowd-en-us-MXDRWPa1.js} +1 -1
  3. package/lib/src/{CreatedOnBrandCrowd-es-es-BJG8nfug.js → CreatedOnBrandCrowd-es-es-BkeN_bU4.js} +1 -1
  4. package/lib/src/{CreatedOnBrandCrowd-fr-fr-uX-nL53e.js → CreatedOnBrandCrowd-fr-ca-DWPl8vN2.js} +1 -1
  5. package/lib/src/{CreatedOnBrandCrowd-fr-ca-uX-nL53e.js → CreatedOnBrandCrowd-fr-fr-DWPl8vN2.js} +1 -1
  6. package/lib/src/{CreatedOnBrandCrowd-pt-pt-DTrgFGQV.js → CreatedOnBrandCrowd-pt-br-B2_xFYID.js} +1 -1
  7. package/lib/src/{CreatedOnBrandCrowd-pt-br-DTrgFGQV.js → CreatedOnBrandCrowd-pt-pt-B2_xFYID.js} +1 -1
  8. package/lib/src/{CreatedOnDcom-de-de-DSfpxioT.js → CreatedOnDcom-de-de-D-Y_NKQ3.js} +1 -1
  9. package/lib/src/{CreatedOnDcom-en-us-C7G4gKem.js → CreatedOnDcom-en-us-TkzWmLPE.js} +1 -1
  10. package/lib/src/{CreatedOnDcom-es-es-DVckCaji.js → CreatedOnDcom-es-es-BRcN78-W.js} +1 -1
  11. package/lib/src/{CreatedOnDcom-fr-ca-C5GDrm_C.js → CreatedOnDcom-fr-ca-DcpgnOV-.js} +1 -1
  12. package/lib/src/{CreatedOnDcom-fr-fr-v5eMm-j2.js → CreatedOnDcom-fr-fr-CdppomFF.js} +1 -1
  13. package/lib/src/{CreatedOnDcom-pt-br-Dq3-fPUc.js → CreatedOnDcom-pt-br-Dm05huFx.js} +1 -1
  14. package/lib/src/{CreatedOnDcom-pt-pt-DFsncYax.js → CreatedOnDcom-pt-pt-C2O9rV7u.js} +1 -1
  15. package/lib/src/brand-page/components/contact-form/ContactForm.mixin.d.ts +1 -0
  16. package/lib/src/brand-page/components/contact-form/ContactForm.mixin.js +19 -1
  17. package/lib/src/brand-page/components/mailing-list/MailingList.mixin.d.ts +1 -0
  18. package/lib/src/brand-page/components/mailing-list/MailingList.mixin.js +8 -1
  19. package/lib/src/brand-page/utils/color.util.d.ts +16 -0
  20. package/lib/src/brand-page/utils/color.util.js +56 -0
  21. package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.d.ts +1 -0
  22. package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.js +5 -0
  23. package/lib/src/brand-page-maker/components/quick-link-bar/QuickLinkBar.mixin.d.ts +1 -1
  24. package/lib/src/brand-page-maker/components/quick-link-bar/QuickLinkBar.mixin.js +4 -6
  25. package/lib/src/brand-page-maker/composables/useQuickLinkBarVisibility.d.ts +17 -0
  26. package/lib/src/brand-page-maker/composables/useQuickLinkBarVisibility.js +23 -0
  27. package/lib/src/bundled-translations-2HkRBbBD.js +177 -0
  28. package/lib/src/bundled-translations.de-DE-DmmZFmGP.js +177 -0
  29. package/lib/src/bundled-translations.es-ES-D7JmTUKc.js +177 -0
  30. package/lib/src/bundled-translations.fr-CA-LANZnNuX.js +177 -0
  31. package/lib/src/bundled-translations.fr-FR-BQybH6dF.js +177 -0
  32. package/lib/src/bundled-translations.pt-BR-DRAIsAdg.js +177 -0
  33. package/lib/src/bundled-translations.pt-PT-CEqBjj6N.js +177 -0
  34. package/lib/src/bundles/bundled-translations.de-DE.json +5 -2
  35. package/lib/src/bundles/bundled-translations.es-ES.json +5 -2
  36. package/lib/src/bundles/bundled-translations.fr-CA.json +5 -2
  37. package/lib/src/bundles/bundled-translations.fr-FR.json +5 -2
  38. package/lib/src/bundles/bundled-translations.json +5 -2
  39. package/lib/src/bundles/bundled-translations.pt-BR.json +5 -2
  40. package/lib/src/bundles/bundled-translations.pt-PT.json +5 -2
  41. package/lib/src/composables/useTranslate.d.ts +2 -1
  42. package/lib/src/composables/useTranslate.js +2 -1
  43. package/lib/src/css/library.brand-page-brandCrowd.min.css +82 -65
  44. package/lib/src/css/library.brand-page-brandPage.min.css +82 -65
  45. package/lib/src/css/library.brand-page-designCom.min.css +82 -65
  46. package/lib/src/css/library.brand-page-preview.min.css +82 -65
  47. package/lib/src/index.mjs +1 -1
  48. package/lib/src/{lib-BG-pyXi9.js → lib-DwLhDsXL.js} +14511 -14413
  49. package/package.json +1 -1
  50. package/src/brand-page/components/button/Button.vue +20 -0
  51. package/src/brand-page/components/button/Button.vue.test.ts +175 -0
  52. package/src/brand-page/components/contact-form/ContactForm.mixin.test.ts +59 -0
  53. package/src/brand-page/components/contact-form/ContactForm.mixin.ts +24 -0
  54. package/src/brand-page/components/contact-form/ContactForm.vue +9 -0
  55. package/src/brand-page/components/mailing-list/MailingList.mixin.ts +11 -0
  56. package/src/brand-page/components/mailing-list/MailingList.vue +3 -0
  57. package/src/brand-page/components/page/Page.vue +9 -0
  58. package/src/brand-page/components/recaptcha-disclosure/RecaptchaDisclosure.vue +60 -0
  59. package/src/brand-page/components/recaptcha-disclosure/RecaptchaDisclosure.vue.test.ts +36 -0
  60. package/src/brand-page/components/recaptcha-disclosure/i18n/recaptcha.de-DE.json +5 -0
  61. package/src/brand-page/components/recaptcha-disclosure/i18n/recaptcha.es-ES.json +5 -0
  62. package/src/brand-page/components/recaptcha-disclosure/i18n/recaptcha.fr-CA.json +5 -0
  63. package/src/brand-page/components/recaptcha-disclosure/i18n/recaptcha.fr-FR.json +5 -0
  64. package/src/brand-page/components/recaptcha-disclosure/i18n/recaptcha.json +5 -0
  65. package/src/brand-page/components/recaptcha-disclosure/i18n/recaptcha.pt-BR.json +5 -0
  66. package/src/brand-page/components/recaptcha-disclosure/i18n/recaptcha.pt-PT.json +5 -0
  67. package/src/brand-page/utils/color.util.test.ts +78 -1
  68. package/src/brand-page/utils/color.util.ts +82 -0
  69. package/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.ts +5 -0
  70. package/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.vue +2 -2
  71. package/src/brand-page-maker/components/device/Device.vue +0 -1
  72. package/src/brand-page-maker/components/quick-link-bar/QuickLinkBar.mixin.ts +4 -7
  73. package/src/brand-page-maker/composables/useQuickLinkBarVisibility.test.ts +81 -0
  74. package/src/brand-page-maker/composables/useQuickLinkBarVisibility.ts +25 -0
  75. package/src/bundles/bundled-translations.de-DE.json +5 -2
  76. package/src/bundles/bundled-translations.es-ES.json +5 -2
  77. package/src/bundles/bundled-translations.fr-CA.json +5 -2
  78. package/src/bundles/bundled-translations.fr-FR.json +5 -2
  79. package/src/bundles/bundled-translations.json +5 -2
  80. package/src/bundles/bundled-translations.pt-BR.json +5 -2
  81. package/src/bundles/bundled-translations.pt-PT.json +5 -2
  82. package/src/composables/useTranslate.ts +3 -0
  83. package/src/shared/content-settings/components/content-settings/i18n/content-settings.de-DE.json +2 -2
  84. package/src/shared/content-settings/components/content-settings/i18n/content-settings.es-ES.json +2 -2
  85. package/src/shared/content-settings/components/content-settings/i18n/content-settings.fr-CA.json +2 -2
  86. package/src/shared/content-settings/components/content-settings/i18n/content-settings.fr-FR.json +2 -2
  87. package/src/shared/content-settings/components/content-settings/i18n/content-settings.json +2 -2
  88. package/src/shared/content-settings/components/content-settings/i18n/content-settings.pt-BR.json +2 -2
  89. package/src/shared/content-settings/components/content-settings/i18n/content-settings.pt-PT.json +2 -2
  90. package/lib/src/bundled-translations-BzzINHD2.js +0 -175
  91. package/lib/src/bundled-translations.de-DE-opJOfLO-.js +0 -175
  92. package/lib/src/bundled-translations.es-ES-MaidBiW6.js +0 -175
  93. package/lib/src/bundled-translations.fr-CA-CuG0285l.js +0 -175
  94. package/lib/src/bundled-translations.fr-FR-DWh-DHys.js +0 -175
  95. package/lib/src/bundled-translations.pt-BR-DG6n1YPu.js +0 -175
  96. package/lib/src/bundled-translations.pt-PT-J5-Lhk0H.js +0 -175
@@ -71,6 +71,88 @@ export const setRgbAlpha = (rgb: string, alpha: number): string => {
71
71
  return `rgba(${match[1]},${match[2]},${match[3]},${alpha})`;
72
72
  };
73
73
 
74
+ // Weighted linear blend of two colours in sRGB (weight = amount of `b`, 0..1).
75
+ const mixRgb = (
76
+ a: ColorInstance,
77
+ b: ColorInstance,
78
+ weight: number,
79
+ ): ColorInstance => {
80
+ const [ar, ag, ab] = a.rgb().array();
81
+ const [br, bg, bb] = b.rgb().array();
82
+
83
+ return Color.rgb(
84
+ ar + (br - ar) * weight,
85
+ ag + (bg - ag) * weight,
86
+ ab + (bb - ab) * weight,
87
+ );
88
+ };
89
+
90
+ // WCAG contrast ratio (1..21) between two colours.
91
+ const contrastRatio = (a: ColorInstance, b: ColorInstance): number => {
92
+ const [ar, ag, ab] = a.rgb().array();
93
+ const [br, bg, bb] = b.rgb().array();
94
+ const la = luminance(ar, ag, ab);
95
+ const lb = luminance(br, bg, bb);
96
+
97
+ return (Math.max(la, lb) + 0.05) / (Math.min(la, lb) + 0.05);
98
+ };
99
+
100
+ /**
101
+ * A muted text colour whose lightness runs opposite to the background: darker
102
+ * text on light backgrounds (e.g. beige), lighter text on dark ones. Starts
103
+ * faded (close to the background) and is nudged toward black or white — whichever
104
+ * the background contrasts with more — only until it reaches a legible target
105
+ * contrast, so the result is as subtle as legibility allows.
106
+ *
107
+ * Returns undefined when the background isn't a solid, opaque colour (image,
108
+ * gradient, transparent, unparseable) so callers can fall back.
109
+ */
110
+ export const mutedTextForBackground = (
111
+ bgColor: string | undefined,
112
+ { targetContrast = 3.5, start = 0.12, step = 0.04 } = {},
113
+ ): string | undefined => {
114
+ if (!bgColor) {
115
+ return undefined;
116
+ }
117
+
118
+ let bg: ColorInstance;
119
+
120
+ try {
121
+ bg = Color(bgColor);
122
+ } catch {
123
+ return undefined;
124
+ }
125
+
126
+ // Can't anchor to a see-through background — caller should fall back.
127
+ if (bg.alpha() === 0) {
128
+ return undefined;
129
+ }
130
+
131
+ const black = Color.rgb(0, 0, 0);
132
+ const white = Color.rgb(255, 255, 255);
133
+ const target =
134
+ contrastRatio(bg, black) >= contrastRatio(bg, white) ? black : white;
135
+
136
+ let weight = start;
137
+ let text = mixRgb(bg, target, weight);
138
+
139
+ while (weight < 1 && contrastRatio(text, bg) < targetContrast) {
140
+ weight += step;
141
+ text = mixRgb(bg, target, weight);
142
+ }
143
+
144
+ return text.hex();
145
+ };
146
+
147
+ // Pull a usable background colour out of a style object. Section backgrounds are
148
+ // written under the `background` shorthand (the background-settings store forbids
149
+ // `backgroundColor`), while card/button styles use `backgroundColor` — so check
150
+ // both. The value may be a gradient/shorthand; callers that need a solid colour
151
+ // pass it through mutedTextForBackground, which rejects anything unparseable.
152
+ export const backgroundColorFromStyle = (
153
+ style: BrandPageCssStyle | undefined,
154
+ ): string | undefined => style?.backgroundColor || style?.background;
155
+
74
156
  export const getThemeByTextStyleAndLogoTheme = (
75
157
  textStyle: BrandPageCssStyle,
76
158
  logoTheme: LogoTheme,
@@ -37,6 +37,7 @@ import {
37
37
  } from '@brand-page-maker/stores';
38
38
  import { useHistoryStore } from '@brand-page-maker/stores/history/history-store';
39
39
  import { useUndoRedoFlag } from '@brand-page-maker/composables/useUndoRedoFlag';
40
+ import { useQuickLinkBarVisibility } from '@brand-page-maker/composables/useQuickLinkBarVisibility';
40
41
  import type { AdminPreviewLogoTemplateModel } from '@brand-page-maker/stores/admin-logo-settings';
41
42
  import { useUiContentSettingsStore } from '@shared/content-settings/store';
42
43
  import { useUiTemplateSettingsStore } from '@shared/template-settings/store';
@@ -137,6 +138,10 @@ export default defineComponent({
137
138
  isSaving: computed(() => brandPageMakerStore.isSaving),
138
139
  isPublishing: computed(() => brandPageMakerStore.isPublishing),
139
140
  isPublished: computed(() => brandPageMakerStore.isPublished),
141
+ // Whether the QuickLinkBar renders — used to offset the preview (Device)
142
+ // and SideBar clear of the fixed bar on mobile. Must match the bar's own
143
+ // render condition, so it shares the same predicate.
144
+ shouldShowQuickLinkBar: useQuickLinkBarVisibility(),
140
145
  isBrandPageOrIsBrandContact: computed(
141
146
  () => brandPageMakerStore.isBrandPageOrIsBrandContact,
142
147
  ),
@@ -90,7 +90,7 @@
90
90
  :is-mobile-device="isMobileDevice"
91
91
  :is-design-com="isDesignCom"
92
92
  :container="previewContainer"
93
- :has-quick-links="isPublished"
93
+ :has-quick-links="shouldShowQuickLinkBar"
94
94
  >
95
95
  <div ref="previewContent" class="tw-h-full">
96
96
  <PreviewWithState :device-mode="deviceMode" />
@@ -127,7 +127,7 @@
127
127
  <SideBar
128
128
  :mobile-tab-name="SideBarTabNames.PREVIEW"
129
129
  :is-mobile-screen-size="isMobileScreenSize"
130
- :has-quick-links="isPublished"
130
+ :has-quick-links="shouldShowQuickLinkBar"
131
131
  >
132
132
  <template #tab>
133
133
  <component
@@ -11,7 +11,6 @@
11
11
  'tw-opacity-0': !visible,
12
12
  'tw-pt-8': !hasQuickLinks && isMobileDevice,
13
13
  'tw-pt-20 lg:tw-pt-8': hasQuickLinks && isMobileDevice,
14
- 'tw-pt-10': hasQuickLinks && isMobileDevice,
15
14
  }"
16
15
  tabindex="0"
17
16
  >
@@ -5,6 +5,7 @@ import {
5
5
  useEventManagerStore,
6
6
  } from '@brand-page-maker/stores';
7
7
  import { useUndoRedoFlag } from '@brand-page-maker/composables/useUndoRedoFlag';
8
+ import { useQuickLinkBarVisibility } from '@brand-page-maker/composables/useQuickLinkBarVisibility';
8
9
  import { quickLinkBarTr } from '@src/composables/useTranslate';
9
10
 
10
11
  export default defineComponent({
@@ -23,6 +24,9 @@ export default defineComponent({
23
24
  brandPageContainerStore: useBrandPageContainerStore(),
24
25
  eventManagerStore: useEventManagerStore(),
25
26
  undoRedoEnabled: useUndoRedoFlag(),
27
+ // Single source of truth for whether the bar renders — shared with the
28
+ // layout components (Device, SideBar) that offset content clear of it.
29
+ shouldShowBar: useQuickLinkBarVisibility(),
26
30
  };
27
31
  },
28
32
  data() {
@@ -35,13 +39,6 @@ export default defineComponent({
35
39
  return this.brandPageContainerStore.isPublished;
36
40
  },
37
41
 
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
-
45
42
  brandPageUrl(): string {
46
43
  if (
47
44
  this.brandPageContainerStore.isCustomDomainEnabled &&
@@ -0,0 +1,81 @@
1
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
2
+ import { useQuickLinkBarVisibility } from './useQuickLinkBarVisibility';
3
+
4
+ // The QuickLinkBar renders when it has something to show — the undo/redo
5
+ // controls (flag on, non-admin) OR the published-URL cluster. This predicate
6
+ // is the single source of truth shared by the bar and the layout components
7
+ // (Device, SideBar) that offset content clear of the fixed bar on mobile.
8
+ //
9
+ // The regression it guards: an unpublished page with the undo/redo flag on
10
+ // still shows the bar, so the offset must treat it as visible — otherwise the
11
+ // fixed bar overlaps the mobile preview.
12
+ //
13
+ // The real useUndoRedoFlag is exercised (only its underlying stores are
14
+ // mocked) so admin gating is covered end-to-end.
15
+
16
+ const containerStoreMock = { isPublished: false };
17
+
18
+ vi.mock('@brand-page-maker/stores', () => ({
19
+ useBrandPageContainerStore: vi.fn(() => containerStoreMock),
20
+ }));
21
+
22
+ const userStoreMock = {
23
+ features: { canUseUndoRedo: false },
24
+ isAdmin: false,
25
+ };
26
+
27
+ vi.mock('@brand-page-maker/stores/user', () => ({
28
+ useBrandPageMakerUserStore: vi.fn(() => userStoreMock),
29
+ }));
30
+
31
+ beforeEach(() => {
32
+ containerStoreMock.isPublished = false;
33
+ userStoreMock.features.canUseUndoRedo = false;
34
+ userStoreMock.isAdmin = false;
35
+ });
36
+
37
+ describe('useQuickLinkBarVisibility', () => {
38
+ it('is visible when unpublished but the undo/redo flag is on (the overlap regression)', () => {
39
+ containerStoreMock.isPublished = false;
40
+ userStoreMock.features.canUseUndoRedo = true;
41
+
42
+ expect(useQuickLinkBarVisibility().value).toBe(true);
43
+ });
44
+
45
+ it('is hidden when unpublished and the undo/redo flag is off', () => {
46
+ containerStoreMock.isPublished = false;
47
+ userStoreMock.features.canUseUndoRedo = false;
48
+
49
+ expect(useQuickLinkBarVisibility().value).toBe(false);
50
+ });
51
+
52
+ it('is visible when published even with the undo/redo flag off', () => {
53
+ containerStoreMock.isPublished = true;
54
+ userStoreMock.features.canUseUndoRedo = false;
55
+
56
+ expect(useQuickLinkBarVisibility().value).toBe(true);
57
+ });
58
+
59
+ it('is visible when both published and the undo/redo flag is on', () => {
60
+ containerStoreMock.isPublished = true;
61
+ userStoreMock.features.canUseUndoRedo = true;
62
+
63
+ expect(useQuickLinkBarVisibility().value).toBe(true);
64
+ });
65
+
66
+ it('gates the undo/redo reason for admins: unpublished admin stays hidden despite the flag', () => {
67
+ containerStoreMock.isPublished = false;
68
+ userStoreMock.features.canUseUndoRedo = true;
69
+ userStoreMock.isAdmin = true;
70
+
71
+ expect(useQuickLinkBarVisibility().value).toBe(false);
72
+ });
73
+
74
+ it('stays visible for a published admin (published cluster is not admin-gated)', () => {
75
+ containerStoreMock.isPublished = true;
76
+ userStoreMock.features.canUseUndoRedo = true;
77
+ userStoreMock.isAdmin = true;
78
+
79
+ expect(useQuickLinkBarVisibility().value).toBe(true);
80
+ });
81
+ });
@@ -0,0 +1,25 @@
1
+ import { computed, type ComputedRef } from 'vue';
2
+ import { useBrandPageContainerStore } from '@brand-page-maker/stores';
3
+ import { useUndoRedoFlag } from './useUndoRedoFlag';
4
+
5
+ /**
6
+ * Whether the QuickLinkBar is rendered in the maker.
7
+ *
8
+ * The bar shows when at least one of its inner clusters has something to
9
+ * display: the undo/redo controls (flag on, non-admin — see
10
+ * {@link useUndoRedoFlag}) OR the published-URL cluster (page published).
11
+ *
12
+ * This is the single source of truth shared by the bar itself
13
+ * (`QuickLinkBar`) and the layout components that offset their content to sit
14
+ * clear of the fixed bar on mobile (`Device`, `SideBar`). Keeping the offset
15
+ * bound to the same predicate the bar renders on prevents the two from
16
+ * drifting — a drift where the bar showed for the undo/redo reason but the
17
+ * offset only accounted for the published reason caused the bar to overlap
18
+ * the mobile preview.
19
+ */
20
+ export function useQuickLinkBarVisibility(): ComputedRef<boolean> {
21
+ const containerStore = useBrandPageContainerStore();
22
+ const undoRedoEnabled = useUndoRedoFlag();
23
+
24
+ return computed(() => undoRedoEnabled.value || containerStore.isPublished);
25
+ }
@@ -56,6 +56,9 @@
56
56
  "poweredBy": "Powered by",
57
57
  "invalidEmailMessage": "Bitte geben Sie eine gültige E-Mail-Adresse ein"
58
58
  },
59
+ "recaptcha": {
60
+ "disclosure": "Geschützt durch reCAPTCHA (&lt;a href=&quot;https://policies.google.com/privacy\" target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Datenschutz</a> / &lt;a href=&quot;https://policies.google.com/terms\" target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Nutzungsbedingungen</a>)"
61
+ },
59
62
  "saveContactWidget": {
60
63
  "saveContactButton": "Kontakt speichern",
61
64
  "createCard": "Erstellen Sie kostenlos Ihre eigene Karte auf {{ siteName }}",
@@ -1454,7 +1457,7 @@
1454
1457
  "testimonialDisplayName": "Testimonial",
1455
1458
  "imageDisplayName": "Bild",
1456
1459
  "imageSectionDisplayName": "Bilder",
1457
- "imageGalleryDisplayName": "Bildergalerie",
1460
+ "imageGalleryDisplayName": "Galerie",
1458
1461
  "videoDisplayName": "Video",
1459
1462
  "mapDisplayName": "Karte",
1460
1463
  "mailingListDisplayName": "Mailingliste",
@@ -1468,7 +1471,7 @@
1468
1471
  "tiktokDisplayName": "Tiktok",
1469
1472
  "supportMeDisplayName": "Trinkgeld",
1470
1473
  "requestPaymentDisplayName": "Zahlungen",
1471
- "contactFormDisplayName": "Kontaktformular",
1474
+ "contactFormDisplayName": "Kontakt",
1472
1475
  "bannerSectionDisplayName": "Banner",
1473
1476
  "testimonialSectionDisplayName": "Testimonials",
1474
1477
  "aboutSectionDisplayName": "Über",
@@ -56,6 +56,9 @@
56
56
  "poweredBy": "Desarrollado por",
57
57
  "invalidEmailMessage": "Introduce una dirección de correo electrónico válida"
58
58
  },
59
+ "recaptcha": {
60
+ "disclosure": "Protegido por reCAPTCHA (&lt;a href=&quot;https://policies.google.com/privacy\" target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Privacidad</a> / &lt;a href=&quot;https://policies.google.com/terms\" target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Términos</a>)"
61
+ },
59
62
  "saveContactWidget": {
60
63
  "saveContactButton": "Guardar contacto",
61
64
  "createCard": "Crea tu propia tarjeta gratis en {{ siteName }}",
@@ -1454,7 +1457,7 @@
1454
1457
  "testimonialDisplayName": "Testimonio",
1455
1458
  "imageDisplayName": "Imagen",
1456
1459
  "imageSectionDisplayName": "Imágenes",
1457
- "imageGalleryDisplayName": "Galería de imágenes",
1460
+ "imageGalleryDisplayName": "Galería",
1458
1461
  "videoDisplayName": "Vídeo",
1459
1462
  "mapDisplayName": "Mapa",
1460
1463
  "mailingListDisplayName": "Lista de correo",
@@ -1468,7 +1471,7 @@
1468
1471
  "tiktokDisplayName": "Tiktok",
1469
1472
  "supportMeDisplayName": "Propinas",
1470
1473
  "requestPaymentDisplayName": "Pagos",
1471
- "contactFormDisplayName": "Formulario de contacto",
1474
+ "contactFormDisplayName": "Contacto",
1472
1475
  "bannerSectionDisplayName": "Banner",
1473
1476
  "testimonialSectionDisplayName": "Testimonios",
1474
1477
  "aboutSectionDisplayName": "Acerca de",
@@ -56,6 +56,9 @@
56
56
  "poweredBy": "Alimenté par",
57
57
  "invalidEmailMessage": "Veuillez entrer une adresse e-mail valide"
58
58
  },
59
+ "recaptcha": {
60
+ "disclosure": "Protégé par reCAPTCHA (&lt;a href=&quot;https://policies.google.com/privacy\" target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Confidentialité</a> / &lt;a href=&quot;https://policies.google.com/terms\" target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Conditions</a>)"
61
+ },
59
62
  "saveContactWidget": {
60
63
  "saveContactButton": "Enregistrer le contact",
61
64
  "createCard": "Créez votre propre carte gratuitement sur {{ siteName }}",
@@ -1454,7 +1457,7 @@
1454
1457
  "testimonialDisplayName": "Témoignage",
1455
1458
  "imageDisplayName": "Image",
1456
1459
  "imageSectionDisplayName": "Images",
1457
- "imageGalleryDisplayName": "Galerie d’images",
1460
+ "imageGalleryDisplayName": "Galerie",
1458
1461
  "videoDisplayName": "Vidéo",
1459
1462
  "mapDisplayName": "Carte",
1460
1463
  "mailingListDisplayName": "Liste de diffusion",
@@ -1468,7 +1471,7 @@
1468
1471
  "tiktokDisplayName": "Tiktok",
1469
1472
  "supportMeDisplayName": "Don",
1470
1473
  "requestPaymentDisplayName": "Paiements",
1471
- "contactFormDisplayName": "Formulaire de contact",
1474
+ "contactFormDisplayName": "Contact",
1472
1475
  "bannerSectionDisplayName": "Bannière",
1473
1476
  "testimonialSectionDisplayName": "Témoignages",
1474
1477
  "aboutSectionDisplayName": "À propos",
@@ -56,6 +56,9 @@
56
56
  "poweredBy": "Alimenté par",
57
57
  "invalidEmailMessage": "Veuillez entrer une adresse e-mail valide"
58
58
  },
59
+ "recaptcha": {
60
+ "disclosure": "Protégé par reCAPTCHA (&lt;a href=&quot;https://policies.google.com/privacy\" target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Confidentialité</a> / &lt;a href=&quot;https://policies.google.com/terms\" target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Conditions</a>)"
61
+ },
59
62
  "saveContactWidget": {
60
63
  "saveContactButton": "Enregistrer le contact",
61
64
  "createCard": "Créez votre propre carte gratuitement sur {{ siteName }}",
@@ -1454,7 +1457,7 @@
1454
1457
  "testimonialDisplayName": "Témoignage",
1455
1458
  "imageDisplayName": "Image",
1456
1459
  "imageSectionDisplayName": "Images",
1457
- "imageGalleryDisplayName": "Galerie d’images",
1460
+ "imageGalleryDisplayName": "Galerie",
1458
1461
  "videoDisplayName": "Vidéo",
1459
1462
  "mapDisplayName": "Carte",
1460
1463
  "mailingListDisplayName": "Liste de diffusion",
@@ -1468,7 +1471,7 @@
1468
1471
  "tiktokDisplayName": "Tiktok",
1469
1472
  "supportMeDisplayName": "Don",
1470
1473
  "requestPaymentDisplayName": "Paiements",
1471
- "contactFormDisplayName": "Formulaire de contact",
1474
+ "contactFormDisplayName": "Contact",
1472
1475
  "bannerSectionDisplayName": "Bannière",
1473
1476
  "testimonialSectionDisplayName": "Témoignages",
1474
1477
  "aboutSectionDisplayName": "À propos",
@@ -56,6 +56,9 @@
56
56
  "poweredBy": "Powered by",
57
57
  "invalidEmailMessage": "Please enter a valid email address"
58
58
  },
59
+ "recaptcha": {
60
+ "disclosure": "Protected by reCAPTCHA (<a href=\"https://policies.google.com/privacy\" target=\"_blank\" rel=\"noopener noreferrer\">Privacy</a> / <a href=\"https://policies.google.com/terms\" target=\"_blank\" rel=\"noopener noreferrer\">Terms</a>)"
61
+ },
59
62
  "saveContactWidget": {
60
63
  "saveContactButton": "Save Contact",
61
64
  "createCard": "Create your own card for free on {{ siteName }}",
@@ -1454,7 +1457,7 @@
1454
1457
  "testimonialDisplayName": "Testimonial",
1455
1458
  "imageDisplayName": "Image",
1456
1459
  "imageSectionDisplayName": "Images",
1457
- "imageGalleryDisplayName": "Image Gallery",
1460
+ "imageGalleryDisplayName": "Gallery",
1458
1461
  "videoDisplayName": "Video",
1459
1462
  "mapDisplayName": "Map",
1460
1463
  "mailingListDisplayName": "Mailing list",
@@ -1468,7 +1471,7 @@
1468
1471
  "tiktokDisplayName": "Tiktok",
1469
1472
  "supportMeDisplayName": "Tipping",
1470
1473
  "requestPaymentDisplayName": "Payments",
1471
- "contactFormDisplayName": "Contact Form",
1474
+ "contactFormDisplayName": "Contact",
1472
1475
  "bannerSectionDisplayName": "Banner",
1473
1476
  "testimonialSectionDisplayName": "Testimonials",
1474
1477
  "aboutSectionDisplayName": "About",
@@ -56,6 +56,9 @@
56
56
  "poweredBy": "Assegurado por",
57
57
  "invalidEmailMessage": "Por favor, insira um endereço de e-mail válido"
58
58
  },
59
+ "recaptcha": {
60
+ "disclosure": "Protegido pelo reCAPTCHA (&lt;a href=&quot;https://policies.google.com/privacy\" target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Termos de</a> / &lt;a href=&quot;https://policies.google.com/terms\" target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Privacidade</a>)"
61
+ },
59
62
  "saveContactWidget": {
60
63
  "saveContactButton": "Salvar contato",
61
64
  "createCard": "Crie seu próprio cartão gratuitamente em {{ siteName }}",
@@ -1454,7 +1457,7 @@
1454
1457
  "testimonialDisplayName": "Depoimento",
1455
1458
  "imageDisplayName": "Imagem",
1456
1459
  "imageSectionDisplayName": "Imagens",
1457
- "imageGalleryDisplayName": "Galeria de imagens",
1460
+ "imageGalleryDisplayName": "Galeria",
1458
1461
  "videoDisplayName": "Vídeo",
1459
1462
  "mapDisplayName": "Mapa",
1460
1463
  "mailingListDisplayName": "Lista de e-mails",
@@ -1468,7 +1471,7 @@
1468
1471
  "tiktokDisplayName": "TikTok",
1469
1472
  "supportMeDisplayName": "Dar gorjeta",
1470
1473
  "requestPaymentDisplayName": "Pagamentos",
1471
- "contactFormDisplayName": "Formulário de contato",
1474
+ "contactFormDisplayName": "Contato",
1472
1475
  "bannerSectionDisplayName": "Banner",
1473
1476
  "testimonialSectionDisplayName": "Depoimentos",
1474
1477
  "aboutSectionDisplayName": "Sobre",
@@ -56,6 +56,9 @@
56
56
  "poweredBy": "Assegurado por",
57
57
  "invalidEmailMessage": "Por favor, introduza um endereço de e-mail válido"
58
58
  },
59
+ "recaptcha": {
60
+ "disclosure": "Protegido pelo reCAPTCHA (&lt;a href=&quot;https://policies.google.com/privacy\" target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Termos de </a> / &lt;a href=&quot;https://policies.google.com/terms\" target=&quot;_blank&quot; rel=&quot;noopener noreferrer&quot;&gt;Privacidade</a>)"
61
+ },
59
62
  "saveContactWidget": {
60
63
  "saveContactButton": "Guardar contacto",
61
64
  "createCard": "Crie o seu próprio cartão em {{ siteName }}",
@@ -1454,7 +1457,7 @@
1454
1457
  "testimonialDisplayName": "Testemunho",
1455
1458
  "imageDisplayName": "Imagem",
1456
1459
  "imageSectionDisplayName": "Imagens",
1457
- "imageGalleryDisplayName": "Galeria de Imagens",
1460
+ "imageGalleryDisplayName": "Galeria",
1458
1461
  "videoDisplayName": "Vídeo",
1459
1462
  "mapDisplayName": "Mapa",
1460
1463
  "mailingListDisplayName": "Lista de correio",
@@ -1468,7 +1471,7 @@
1468
1471
  "tiktokDisplayName": "TikTok",
1469
1472
  "supportMeDisplayName": "Dar gorjeta",
1470
1473
  "requestPaymentDisplayName": "Pagamentos",
1471
- "contactFormDisplayName": "Formulário de Contacto",
1474
+ "contactFormDisplayName": "Contacto",
1472
1475
  "bannerSectionDisplayName": "Banner",
1473
1476
  "testimonialSectionDisplayName": "Testemunhos",
1474
1477
  "aboutSectionDisplayName": "Sobre",
@@ -195,6 +195,8 @@ const paymentModalTr = (key, valuesToInterpolate = {}) =>
195
195
  tr(`paymentModal.${key}`, valuesToInterpolate);
196
196
  const mailingListTr = (key, valuesToInterpolate = {}) =>
197
197
  tr(`mailingList.${key}`, valuesToInterpolate);
198
+ const recaptchaTr = (key, valuesToInterpolate = {}) =>
199
+ tr(`recaptcha.${key}`, valuesToInterpolate);
198
200
  const deletePageModalTr = (key, valuesToInterpolate = {}) =>
199
201
  tr(`deletePageModal.${key}`, valuesToInterpolate);
200
202
  const deleteDomainModalTr = (key, valuesToInterpolate = {}) =>
@@ -319,6 +321,7 @@ export {
319
321
  personalisationOverrideTr,
320
322
  paymentModalTr,
321
323
  mailingListTr,
324
+ recaptchaTr,
322
325
  deletePageModalTr,
323
326
  deleteDomainModalTr,
324
327
  requestPaymentStripeTr,
@@ -17,7 +17,7 @@
17
17
  "testimonialDisplayName": "Testimonial",
18
18
  "imageDisplayName": "Bild",
19
19
  "imageSectionDisplayName": "Bilder",
20
- "imageGalleryDisplayName": "Bildergalerie",
20
+ "imageGalleryDisplayName": "Galerie",
21
21
  "videoDisplayName": "Video",
22
22
  "mapDisplayName": "Karte",
23
23
  "mailingListDisplayName": "Mailingliste",
@@ -31,7 +31,7 @@
31
31
  "tiktokDisplayName": "Tiktok",
32
32
  "supportMeDisplayName": "Trinkgeld",
33
33
  "requestPaymentDisplayName": "Zahlungen",
34
- "contactFormDisplayName": "Kontaktformular",
34
+ "contactFormDisplayName": "Kontakt",
35
35
  "bannerSectionDisplayName": "Banner",
36
36
  "testimonialSectionDisplayName": "Testimonials",
37
37
  "aboutSectionDisplayName": "Über",
@@ -17,7 +17,7 @@
17
17
  "testimonialDisplayName": "Testimonio",
18
18
  "imageDisplayName": "Imagen",
19
19
  "imageSectionDisplayName": "Imágenes",
20
- "imageGalleryDisplayName": "Galería de imágenes",
20
+ "imageGalleryDisplayName": "Galería",
21
21
  "videoDisplayName": "Vídeo",
22
22
  "mapDisplayName": "Mapa",
23
23
  "mailingListDisplayName": "Lista de correo",
@@ -31,7 +31,7 @@
31
31
  "tiktokDisplayName": "Tiktok",
32
32
  "supportMeDisplayName": "Propinas",
33
33
  "requestPaymentDisplayName": "Pagos",
34
- "contactFormDisplayName": "Formulario de contacto",
34
+ "contactFormDisplayName": "Contacto",
35
35
  "bannerSectionDisplayName": "Banner",
36
36
  "testimonialSectionDisplayName": "Testimonios",
37
37
  "aboutSectionDisplayName": "Acerca de",
@@ -17,7 +17,7 @@
17
17
  "testimonialDisplayName": "Témoignage",
18
18
  "imageDisplayName": "Image",
19
19
  "imageSectionDisplayName": "Images",
20
- "imageGalleryDisplayName": "Galerie d’images",
20
+ "imageGalleryDisplayName": "Galerie",
21
21
  "videoDisplayName": "Vidéo",
22
22
  "mapDisplayName": "Carte",
23
23
  "mailingListDisplayName": "Liste de diffusion",
@@ -31,7 +31,7 @@
31
31
  "tiktokDisplayName": "Tiktok",
32
32
  "supportMeDisplayName": "Don",
33
33
  "requestPaymentDisplayName": "Paiements",
34
- "contactFormDisplayName": "Formulaire de contact",
34
+ "contactFormDisplayName": "Contact",
35
35
  "bannerSectionDisplayName": "Bannière",
36
36
  "testimonialSectionDisplayName": "Témoignages",
37
37
  "aboutSectionDisplayName": "À propos",
@@ -17,7 +17,7 @@
17
17
  "testimonialDisplayName": "Témoignage",
18
18
  "imageDisplayName": "Image",
19
19
  "imageSectionDisplayName": "Images",
20
- "imageGalleryDisplayName": "Galerie d’images",
20
+ "imageGalleryDisplayName": "Galerie",
21
21
  "videoDisplayName": "Vidéo",
22
22
  "mapDisplayName": "Carte",
23
23
  "mailingListDisplayName": "Liste de diffusion",
@@ -31,7 +31,7 @@
31
31
  "tiktokDisplayName": "Tiktok",
32
32
  "supportMeDisplayName": "Don",
33
33
  "requestPaymentDisplayName": "Paiements",
34
- "contactFormDisplayName": "Formulaire de contact",
34
+ "contactFormDisplayName": "Contact",
35
35
  "bannerSectionDisplayName": "Bannière",
36
36
  "testimonialSectionDisplayName": "Témoignages",
37
37
  "aboutSectionDisplayName": "À propos",
@@ -17,7 +17,7 @@
17
17
  "testimonialDisplayName": "Testimonial",
18
18
  "imageDisplayName": "Image",
19
19
  "imageSectionDisplayName": "Images",
20
- "imageGalleryDisplayName": "Image Gallery",
20
+ "imageGalleryDisplayName": "Gallery",
21
21
  "videoDisplayName": "Video",
22
22
  "mapDisplayName": "Map",
23
23
  "mailingListDisplayName": "Mailing list",
@@ -31,7 +31,7 @@
31
31
  "tiktokDisplayName": "Tiktok",
32
32
  "supportMeDisplayName": "Tipping",
33
33
  "requestPaymentDisplayName": "Payments",
34
- "contactFormDisplayName": "Contact Form",
34
+ "contactFormDisplayName": "Contact",
35
35
  "bannerSectionDisplayName": "Banner",
36
36
  "testimonialSectionDisplayName": "Testimonials",
37
37
  "aboutSectionDisplayName": "About",
@@ -17,7 +17,7 @@
17
17
  "testimonialDisplayName": "Depoimento",
18
18
  "imageDisplayName": "Imagem",
19
19
  "imageSectionDisplayName": "Imagens",
20
- "imageGalleryDisplayName": "Galeria de imagens",
20
+ "imageGalleryDisplayName": "Galeria",
21
21
  "videoDisplayName": "Vídeo",
22
22
  "mapDisplayName": "Mapa",
23
23
  "mailingListDisplayName": "Lista de e-mails",
@@ -31,7 +31,7 @@
31
31
  "tiktokDisplayName": "TikTok",
32
32
  "supportMeDisplayName": "Dar gorjeta",
33
33
  "requestPaymentDisplayName": "Pagamentos",
34
- "contactFormDisplayName": "Formulário de contato",
34
+ "contactFormDisplayName": "Contato",
35
35
  "bannerSectionDisplayName": "Banner",
36
36
  "testimonialSectionDisplayName": "Depoimentos",
37
37
  "aboutSectionDisplayName": "Sobre",
@@ -17,7 +17,7 @@
17
17
  "testimonialDisplayName": "Testemunho",
18
18
  "imageDisplayName": "Imagem",
19
19
  "imageSectionDisplayName": "Imagens",
20
- "imageGalleryDisplayName": "Galeria de Imagens",
20
+ "imageGalleryDisplayName": "Galeria",
21
21
  "videoDisplayName": "Vídeo",
22
22
  "mapDisplayName": "Mapa",
23
23
  "mailingListDisplayName": "Lista de correio",
@@ -31,7 +31,7 @@
31
31
  "tiktokDisplayName": "TikTok",
32
32
  "supportMeDisplayName": "Dar gorjeta",
33
33
  "requestPaymentDisplayName": "Pagamentos",
34
- "contactFormDisplayName": "Formulário de Contacto",
34
+ "contactFormDisplayName": "Contacto",
35
35
  "bannerSectionDisplayName": "Banner",
36
36
  "testimonialSectionDisplayName": "Testemunhos",
37
37
  "aboutSectionDisplayName": "Sobre",