@designcrowd/library.brand-page 5.18.4 → 5.18.6-ast-padding-1

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 (148) hide show
  1. package/lib/src/{CreatedOnBrandCrowd-de-de-DQLtpdLe.js → CreatedOnBrandCrowd-de-de-CAtPZtwo.js} +1 -1
  2. package/lib/src/{CreatedOnBrandCrowd-en-us-CvEhlADd.js → CreatedOnBrandCrowd-en-us-Dcx4yFkK.js} +1 -1
  3. package/lib/src/{CreatedOnBrandCrowd-es-es-pYQeTTC0.js → CreatedOnBrandCrowd-es-es-DpodH0gD.js} +1 -1
  4. package/lib/src/{CreatedOnBrandCrowd-fr-fr-CcE-iCEq.js → CreatedOnBrandCrowd-fr-ca-DZbMRJn-.js} +1 -1
  5. package/lib/src/{CreatedOnBrandCrowd-fr-ca-CcE-iCEq.js → CreatedOnBrandCrowd-fr-fr-DZbMRJn-.js} +1 -1
  6. package/lib/src/{CreatedOnBrandCrowd-pt-pt-OyhWWWyO.js → CreatedOnBrandCrowd-pt-br-C3gBveLk.js} +1 -1
  7. package/lib/src/{CreatedOnBrandCrowd-pt-br-OyhWWWyO.js → CreatedOnBrandCrowd-pt-pt-C3gBveLk.js} +1 -1
  8. package/lib/src/{CreatedOnDcom-de-de-DH98FFLS.js → CreatedOnDcom-de-de-DHNyyTV9.js} +1 -1
  9. package/lib/src/{CreatedOnDcom-en-us-DK67NN1r.js → CreatedOnDcom-en-us-BjqZ0Jmw.js} +1 -1
  10. package/lib/src/{CreatedOnDcom-es-es-9-QU4BU6.js → CreatedOnDcom-es-es-tiNjDJmH.js} +1 -1
  11. package/lib/src/{CreatedOnDcom-fr-ca-U9J9H9VB.js → CreatedOnDcom-fr-ca-COUSI6w1.js} +1 -1
  12. package/lib/src/{CreatedOnDcom-fr-fr-DqdzB1DJ.js → CreatedOnDcom-fr-fr-c3UCfh9A.js} +1 -1
  13. package/lib/src/{CreatedOnDcom-pt-br-c4UiWtkB.js → CreatedOnDcom-pt-br-U1jbo_g5.js} +1 -1
  14. package/lib/src/{CreatedOnDcom-pt-pt-Do2qJsYp.js → CreatedOnDcom-pt-pt-BOW_n3bo.js} +1 -1
  15. package/lib/src/brand-page/components/contact-form/ContactForm.mixin.d.ts +4 -0
  16. package/lib/src/brand-page/components/contact-form/ContactForm.mixin.js +8 -4
  17. package/lib/src/brand-page/components/image-gallery/ImageGallery.mixin.d.ts +4 -0
  18. package/lib/src/brand-page/components/image-gallery/ImageGallery.mixin.js +4 -0
  19. package/lib/src/brand-page/components/mailing-list/MailingList.mixin.d.ts +4 -0
  20. package/lib/src/brand-page/components/mailing-list/MailingList.mixin.js +4 -1
  21. package/lib/src/brand-page/components/payment/request-payment/RequestPayment.mixin.d.ts +4 -0
  22. package/lib/src/brand-page/components/payment/request-payment/RequestPayment.mixin.js +4 -0
  23. package/lib/src/brand-page/components/payment/support-me/SupportMe.mixin.d.ts +4 -0
  24. package/lib/src/brand-page/components/payment/support-me/SupportMe.mixin.js +4 -1
  25. package/lib/src/brand-page/components/video/Video.mixin.d.ts +4 -0
  26. package/lib/src/brand-page/components/video/Video.mixin.js +4 -0
  27. package/lib/src/brand-page/constants/misc.constants.d.ts +30 -0
  28. package/lib/src/brand-page/constants/misc.constants.js +51 -0
  29. package/lib/src/brand-page/models/content.model.d.ts +2 -0
  30. package/lib/src/brand-page/models/navigation-styles.model.d.ts +7 -0
  31. package/lib/src/brand-page/models/navigation-styles.model.js +25 -2
  32. package/lib/src/brand-page/utils/content-padding.util.d.ts +13 -0
  33. package/lib/src/brand-page/utils/content-padding.util.js +10 -0
  34. package/lib/src/brand-page/utils/index.d.ts +1 -0
  35. package/lib/src/brand-page/utils/index.js +1 -0
  36. package/lib/src/brand-page/utils/migration/migration-16.d.ts +2 -0
  37. package/lib/src/brand-page/utils/migration/migration-16.js +47 -0
  38. package/lib/src/brand-page/utils/migration/migration-17.d.ts +2 -0
  39. package/lib/src/brand-page/utils/migration/migration-17.js +50 -0
  40. package/lib/src/brand-page/utils/migration.util.js +17 -0
  41. package/lib/src/brand-page-maker/components/admin-logo-settings/AdminLogoSettings.mixin.d.ts +2 -0
  42. package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.d.ts +12 -0
  43. package/lib/src/brand-page-maker/components/brandpage-maker-page/BrandPageMakerPage.mixin.d.ts +14 -0
  44. package/lib/src/brand-page-maker/constants/config-settings-constant.js +37 -0
  45. package/lib/src/brand-page-maker/convertors/about-display-style.convertor.js +9 -1
  46. package/lib/src/brand-page-maker/convertors/banner-align-display-style.convertor.js +7 -1
  47. package/lib/src/brand-page-maker/convertors/contact-layout-style.convertor.js +6 -1
  48. package/lib/src/brand-page-maker/models/content-settings.js +36 -2
  49. package/lib/src/brand-page-maker/stores/ai-checkpoint/ai-checkpoint-store.d.ts +12 -0
  50. package/lib/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.js +1 -9
  51. package/lib/src/{bundled-translations-B5Fkt3qd.js → bundled-translations-Chw0nsFv.js} +9 -9
  52. package/lib/src/{bundled-translations.de-DE-DpdVePM9.js → bundled-translations.de-DE-cqBv7atZ.js} +1 -1
  53. package/lib/src/{bundled-translations.es-ES-BsIcrzZF.js → bundled-translations.es-ES-D9VXftl_.js} +9 -9
  54. package/lib/src/{bundled-translations.fr-CA-G1XCp2Qh.js → bundled-translations.fr-CA-BYstWXcO.js} +1 -1
  55. package/lib/src/{bundled-translations.fr-FR-BdwLXOnB.js → bundled-translations.fr-FR-D1H1hJD4.js} +1 -1
  56. package/lib/src/{bundled-translations.pt-BR-Bvn5ePe7.js → bundled-translations.pt-BR-DqNFuNHX.js} +1 -1
  57. package/lib/src/{bundled-translations.pt-PT-CDtkb2k1.js → bundled-translations.pt-PT-tOic0FfQ.js} +9 -9
  58. package/lib/src/bundles/bundled-translations.de-DE.json +2 -0
  59. package/lib/src/bundles/bundled-translations.es-ES.json +2 -0
  60. package/lib/src/bundles/bundled-translations.fr-CA.json +2 -0
  61. package/lib/src/bundles/bundled-translations.fr-FR.json +2 -0
  62. package/lib/src/bundles/bundled-translations.json +2 -0
  63. package/lib/src/bundles/bundled-translations.pt-BR.json +2 -0
  64. package/lib/src/bundles/bundled-translations.pt-PT.json +2 -0
  65. package/lib/src/css/library.brand-page-brandCrowd.min.css +150 -168
  66. package/lib/src/css/library.brand-page-brandPage.min.css +150 -168
  67. package/lib/src/css/library.brand-page-designCom.min.css +150 -168
  68. package/lib/src/css/library.brand-page-preview.min.css +150 -168
  69. package/lib/src/index.mjs +62 -60
  70. package/lib/src/{lib-BI3J4Mbk.js → lib-Bl7w5LQl.js} +19205 -18991
  71. package/lib/src/shared/content-settings/components/content-settings/ContentSettings.mixin.d.ts +14 -0
  72. package/lib/src/shared/content-settings/components/content-settings/ReplaceImageSettingsForContent.mixin.d.ts +14 -0
  73. package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItem.mixin.d.ts +12 -0
  74. package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.d.ts +12 -0
  75. package/lib/src/shared/content-settings/components/focused-content-item-settings/FocusedContentItemSettings.mixin.d.ts +12 -0
  76. package/lib/src/shared/content-settings/components/slider-field/SliderField.mixin.js +9 -0
  77. package/lib/src/shared/content-settings/store/content-settings-store.d.ts +12 -0
  78. package/lib/src/shared/navigation-style-settings/components/navigation-style-settings/NavigationStyleSettings.mixin.js +10 -8
  79. package/lib/src/shared/navigation-style-settings/store/index.js +1 -12
  80. package/lib/src/shared/page-settings/components/page-settings/PageSettings.mixin.d.ts +16 -0
  81. package/lib/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.d.ts +14 -0
  82. package/lib/src/utils/minify-brand-page-metadata.js +11 -1
  83. package/package.json +1 -1
  84. package/src/brand-page/components/about-section/AboutSection.vue +10 -4
  85. package/src/brand-page/components/banner-section/BannerSection.vue +11 -4
  86. package/src/brand-page/components/booking-section/BookingSection.vue +11 -3
  87. package/src/brand-page/components/button/Button.vue +2 -10
  88. package/src/brand-page/components/contact-form/ContactForm.mixin.ts +12 -6
  89. package/src/brand-page/components/contact-form/ContactForm.vue +117 -120
  90. package/src/brand-page/components/image-gallery/ImageGallery.mixin.ts +5 -0
  91. package/src/brand-page/components/image-gallery/ImageGallery.vue +1 -1
  92. package/src/brand-page/components/mailing-list/MailingList.mixin.ts +8 -1
  93. package/src/brand-page/components/mailing-list/MailingList.vue +1 -1
  94. package/src/brand-page/components/map/Map.vue +5 -1
  95. package/src/brand-page/components/navigation/navigation-side-menu/NavigationSideMenu.vue +4 -1
  96. package/src/brand-page/components/payment/request-payment/RequestPayment.mixin.ts +5 -0
  97. package/src/brand-page/components/payment/request-payment/RequestPayment.vue +1 -0
  98. package/src/brand-page/components/payment/support-me/SupportMe.mixin.ts +8 -1
  99. package/src/brand-page/components/payment/support-me/SupportMe.vue +1 -0
  100. package/src/brand-page/components/shop/Shop.vue +7 -2
  101. package/src/brand-page/components/social-links/SocialLinks.vue +7 -3
  102. package/src/brand-page/components/text/Text.vue +12 -5
  103. package/src/brand-page/components/text-media-section/TextMediaSection.vue +11 -3
  104. package/src/brand-page/components/video/Video.mixin.ts +5 -0
  105. package/src/brand-page/components/video/Video.vue +1 -1
  106. package/src/brand-page/constants/misc.constants.ts +60 -0
  107. package/src/brand-page/models/content.model.ts +2 -0
  108. package/src/brand-page/models/navigation-styles.model.ts +39 -1
  109. package/src/brand-page/utils/__snapshots__/migration.util.test.ts.snap +9 -3
  110. package/src/brand-page/utils/content-padding.util.test.ts +29 -0
  111. package/src/brand-page/utils/content-padding.util.ts +13 -0
  112. package/src/brand-page/utils/index.ts +1 -0
  113. package/src/brand-page/utils/migration/migration-16.test.ts +319 -0
  114. package/src/brand-page/utils/migration/migration-16.ts +75 -0
  115. package/src/brand-page/utils/migration/migration-17.ts +73 -0
  116. package/src/brand-page/utils/migration.util.test.ts +145 -0
  117. package/src/brand-page/utils/migration.util.ts +19 -0
  118. package/src/brand-page-maker/components/color-palette/BpColorPalette.vue +9 -7
  119. package/src/brand-page-maker/constants/config-settings-constant.ts +43 -0
  120. package/src/brand-page-maker/convertors/about-display-style.convertor.ts +10 -0
  121. package/src/brand-page-maker/convertors/banner-align-display-style.convertor.ts +8 -0
  122. package/src/brand-page-maker/convertors/contact-layout-style.convertor.test.ts +50 -0
  123. package/src/brand-page-maker/convertors/contact-layout-style.convertor.ts +8 -0
  124. package/src/brand-page-maker/models/content-settings.ts +38 -2
  125. package/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.test.ts +43 -0
  126. package/src/brand-page-maker/stores/brandpage-maker/brandpage-maker-store.ts +0 -14
  127. package/src/bundles/bundled-translations.de-DE.json +2 -0
  128. package/src/bundles/bundled-translations.es-ES.json +2 -0
  129. package/src/bundles/bundled-translations.fr-CA.json +2 -0
  130. package/src/bundles/bundled-translations.fr-FR.json +2 -0
  131. package/src/bundles/bundled-translations.json +2 -0
  132. package/src/bundles/bundled-translations.pt-BR.json +2 -0
  133. package/src/bundles/bundled-translations.pt-PT.json +2 -0
  134. package/src/shared/content-settings/components/color-field/ColorField.vue +10 -5
  135. package/src/shared/content-settings/components/content-settings/i18n/content-settings.de-DE.json +2 -0
  136. package/src/shared/content-settings/components/content-settings/i18n/content-settings.es-ES.json +2 -0
  137. package/src/shared/content-settings/components/content-settings/i18n/content-settings.fr-CA.json +2 -0
  138. package/src/shared/content-settings/components/content-settings/i18n/content-settings.fr-FR.json +2 -0
  139. package/src/shared/content-settings/components/content-settings/i18n/content-settings.json +2 -0
  140. package/src/shared/content-settings/components/content-settings/i18n/content-settings.pt-BR.json +2 -0
  141. package/src/shared/content-settings/components/content-settings/i18n/content-settings.pt-PT.json +2 -0
  142. package/src/shared/content-settings/components/content-settings-item/ContentSettingsItem.vue +1 -1
  143. package/src/shared/content-settings/components/focused-content-item-settings/FocusedContentItemSettings.vue +2 -2
  144. package/src/shared/content-settings/components/slider-field/SliderField.mixin.ts +9 -0
  145. package/src/shared/navigation-style-settings/components/navigation-style-settings/NavigationStyleSettings.mixin.ts +17 -11
  146. package/src/shared/navigation-style-settings/components/navigation-style-settings/NavigationStyleSettings.vue +4 -1
  147. package/src/shared/navigation-style-settings/store/index.ts +1 -21
  148. package/src/utils/minify-brand-page-metadata.ts +11 -1
@@ -3445,6 +3445,8 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
3445
3445
  id: string;
3446
3446
  type: "website" | "image" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "facebook" | "x" | "instagram" | "youtube" | "linkedin" | "pinterest" | "twitch" | "tiktok" | "map" | "image-gallery" | "mailing-list" | "request-payment" | "support-me" | "contact-form" | "banner-section" | "about-section" | "divider-section" | "images-section" | "testimonial-section" | "social-links" | "shapes-section" | "shop-section" | "booking-section";
3447
3447
  personalisationRole?: "website" | "email" | "phone" | "profile" | "about" | "information" | "media" | undefined;
3448
+ topPadding?: number | undefined;
3449
+ bottomPadding?: number | undefined;
3448
3450
  imageUrlOverride?: string | undefined;
3449
3451
  imageUrlsOverride?: string | undefined;
3450
3452
  avatarImageUrlOverride?: string | undefined;
@@ -3494,6 +3496,8 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
3494
3496
  id: string;
3495
3497
  type: "website" | "image" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "facebook" | "x" | "instagram" | "youtube" | "linkedin" | "pinterest" | "twitch" | "tiktok" | "map" | "image-gallery" | "mailing-list" | "request-payment" | "support-me" | "contact-form" | "banner-section" | "about-section" | "divider-section" | "images-section" | "testimonial-section" | "social-links" | "shapes-section" | "shop-section" | "booking-section";
3496
3498
  personalisationRole?: "website" | "email" | "phone" | "profile" | "about" | "information" | "media" | undefined;
3499
+ topPadding?: number | undefined;
3500
+ bottomPadding?: number | undefined;
3497
3501
  imageUrlOverride?: string | undefined;
3498
3502
  imageUrlsOverride?: string | undefined;
3499
3503
  avatarImageUrlOverride?: string | undefined;
@@ -3543,6 +3547,8 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
3543
3547
  id: string;
3544
3548
  type: "website" | "image" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "facebook" | "x" | "instagram" | "youtube" | "linkedin" | "pinterest" | "twitch" | "tiktok" | "map" | "image-gallery" | "mailing-list" | "request-payment" | "support-me" | "contact-form" | "banner-section" | "about-section" | "divider-section" | "images-section" | "testimonial-section" | "social-links" | "shapes-section" | "shop-section" | "booking-section";
3545
3549
  personalisationRole?: "website" | "email" | "phone" | "profile" | "about" | "information" | "media" | undefined;
3550
+ topPadding?: number | undefined;
3551
+ bottomPadding?: number | undefined;
3546
3552
  imageUrlOverride?: string | undefined;
3547
3553
  imageUrlsOverride?: string | undefined;
3548
3554
  avatarImageUrlOverride?: string | undefined;
@@ -3592,6 +3598,8 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
3592
3598
  id: string;
3593
3599
  type: "website" | "image" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "facebook" | "x" | "instagram" | "youtube" | "linkedin" | "pinterest" | "twitch" | "tiktok" | "map" | "image-gallery" | "mailing-list" | "request-payment" | "support-me" | "contact-form" | "banner-section" | "about-section" | "divider-section" | "images-section" | "testimonial-section" | "social-links" | "shapes-section" | "shop-section" | "booking-section";
3594
3600
  personalisationRole?: "website" | "email" | "phone" | "profile" | "about" | "information" | "media" | undefined;
3601
+ topPadding?: number | undefined;
3602
+ bottomPadding?: number | undefined;
3595
3603
  imageUrlOverride?: string | undefined;
3596
3604
  imageUrlsOverride?: string | undefined;
3597
3605
  avatarImageUrlOverride?: string | undefined;
@@ -3641,6 +3649,8 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
3641
3649
  id: string;
3642
3650
  type: "website" | "image" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "facebook" | "x" | "instagram" | "youtube" | "linkedin" | "pinterest" | "twitch" | "tiktok" | "map" | "image-gallery" | "mailing-list" | "request-payment" | "support-me" | "contact-form" | "banner-section" | "about-section" | "divider-section" | "images-section" | "testimonial-section" | "social-links" | "shapes-section" | "shop-section" | "booking-section";
3643
3651
  personalisationRole?: "website" | "email" | "phone" | "profile" | "about" | "information" | "media" | undefined;
3652
+ topPadding?: number | undefined;
3653
+ bottomPadding?: number | undefined;
3644
3654
  imageUrlOverride?: string | undefined;
3645
3655
  imageUrlsOverride?: string | undefined;
3646
3656
  avatarImageUrlOverride?: string | undefined;
@@ -3690,6 +3700,8 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
3690
3700
  id: string;
3691
3701
  type: "website" | "image" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "facebook" | "x" | "instagram" | "youtube" | "linkedin" | "pinterest" | "twitch" | "tiktok" | "map" | "image-gallery" | "mailing-list" | "request-payment" | "support-me" | "contact-form" | "banner-section" | "about-section" | "divider-section" | "images-section" | "testimonial-section" | "social-links" | "shapes-section" | "shop-section" | "booking-section";
3692
3702
  personalisationRole?: "website" | "email" | "phone" | "profile" | "about" | "information" | "media" | undefined;
3703
+ topPadding?: number | undefined;
3704
+ bottomPadding?: number | undefined;
3693
3705
  imageUrlOverride?: string | undefined;
3694
3706
  imageUrlsOverride?: string | undefined;
3695
3707
  avatarImageUrlOverride?: string | undefined;
@@ -4450,6 +4462,8 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
4450
4462
  id: string;
4451
4463
  type: "website" | "image" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "facebook" | "x" | "instagram" | "youtube" | "linkedin" | "pinterest" | "twitch" | "tiktok" | "map" | "image-gallery" | "mailing-list" | "request-payment" | "support-me" | "contact-form" | "banner-section" | "about-section" | "divider-section" | "images-section" | "testimonial-section" | "social-links" | "shapes-section" | "shop-section" | "booking-section";
4452
4464
  personalisationRole?: "website" | "email" | "phone" | "profile" | "about" | "information" | "media" | undefined;
4465
+ topPadding?: number | undefined;
4466
+ bottomPadding?: number | undefined;
4453
4467
  imageUrlOverride?: string | undefined;
4454
4468
  imageUrlsOverride?: string | undefined;
4455
4469
  avatarImageUrlOverride?: string | undefined;
@@ -87,7 +87,17 @@ const findAssetKey = (assets, data) => {
87
87
  return assets.find((a) => a.data === data)?.key;
88
88
  };
89
89
  const minifyContent = (content, editor, assets) => {
90
- const base = { id: content.id, type: content.type };
90
+ const base = {
91
+ id: content.id,
92
+ type: content.type,
93
+ // Padding Control (BP-5687) — shared across every block, persist when set.
94
+ ...(typeof content.topPadding === 'number' && {
95
+ topPadding: content.topPadding,
96
+ }),
97
+ ...(typeof content.bottomPadding === 'number' && {
98
+ bottomPadding: content.bottomPadding,
99
+ }),
100
+ };
91
101
  const c = content;
92
102
  // Helper: include imageUrl and its asset key if available
93
103
  const includeImageWithKey = (url, urlField = 'imageUrl', keyField = 'imageAssetKey') => {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@designcrowd/library.brand-page",
3
3
  "description": "A collection of Maker/Designer applications",
4
- "version": "5.18.4",
4
+ "version": "5.18.6-ast-padding-1",
5
5
  "author": "Design.com Eng",
6
6
  "license": "UNLICENSED",
7
7
  "type": "module",
@@ -7,9 +7,10 @@
7
7
  <div
8
8
  :class="{
9
9
  'about-container': context.isBrandSite,
10
- 'about-container--padding tw-py-10': !isFullImage,
10
+ 'about-container--padding': !isFullImage,
11
11
  'mobile-about-container--padding': isFullImage,
12
12
  }"
13
+ :style="contentPaddingStyle"
13
14
  >
14
15
  <Media
15
16
  v-if="
@@ -103,7 +104,10 @@
103
104
  import { computed } from 'vue';
104
105
  import type { AboutSectionViewModel } from '@brand-page/view-models';
105
106
  import type { BrandPageContext } from '@brand-page/models';
106
- import { getRenderText } from '@brand-page/utils';
107
+ import {
108
+ getRenderText,
109
+ contentPaddingStyle as toContentPaddingStyle,
110
+ } from '@brand-page/utils';
107
111
  import { hasRTEContent } from '@brand-page-maker/utils';
108
112
  import Media from '../media/Media.vue';
109
113
  import TextWrapper from '../text-wrapper/TextWrapper.vue';
@@ -123,6 +127,10 @@ const props = withDefaults(
123
127
  },
124
128
  );
125
129
 
130
+ const contentPaddingStyle = computed(() =>
131
+ toContentPaddingStyle(props.viewModel),
132
+ );
133
+
126
134
  const isFullImage = computed(
127
135
  () =>
128
136
  props.viewModel.displayStyle === 'right-aligned-full-image' ||
@@ -201,7 +209,6 @@ const renderText = computed((): string => {
201
209
  .device-wrapper--mobile .mobile-about-container--padding {
202
210
  padding-left: var(--page-padding);
203
211
  padding-right: var(--page-padding);
204
- @apply tw-py-10;
205
212
  }
206
213
  .device-wrapper--mobile .text-grid-column {
207
214
  @apply container-grid-columns;
@@ -275,7 +282,6 @@ const renderText = computed((): string => {
275
282
  .mobile-about-container--padding {
276
283
  padding-left: var(--page-padding);
277
284
  padding-right: var(--page-padding);
278
- @apply tw-py-10;
279
285
  }
280
286
  .about-container :deep(.container-image) {
281
287
  aspect-ratio: 1/1;
@@ -7,9 +7,8 @@
7
7
  viewModel.isBigImageType,
8
8
  'c_banner--with-image-overlay tw-flex tw-flex-col': isDividedContent,
9
9
  'tw-px-6': !isDividedContent,
10
- 'tw-py-8': !isDividedContent && !isStackedFullWidth,
11
10
  }"
12
- :style="viewModel.backgroundStyle"
11
+ :style="[viewModel.backgroundStyle, contentPaddingStyle]"
13
12
  style="container-type: inline-size"
14
13
  >
15
14
  <Media
@@ -201,7 +200,7 @@
201
200
  <div
202
201
  class="!tw-text-center tw-flex tw-flex-col tw-gap-5"
203
202
  :class="{
204
- 'tw-px-6 tw-py-8': isDividedContent,
203
+ 'tw-px-6': isDividedContent,
205
204
  }"
206
205
  >
207
206
  <TextWrapper
@@ -332,7 +331,11 @@ import type {
332
331
  } from '@brand-page/view-models';
333
332
  import type { BrandPageContext } from '@brand-page/models';
334
333
  import { hasValidButton } from '../../../utils/validator.util';
335
- import { getRenderText, escapeContentText } from '@brand-page/utils';
334
+ import {
335
+ getRenderText,
336
+ escapeContentText,
337
+ contentPaddingStyle as toContentPaddingStyle,
338
+ } from '@brand-page/utils';
336
339
  import { hasRTEContent } from '@brand-page-maker/utils';
337
340
  import {
338
341
  ALIGN_CENTERED,
@@ -490,6 +493,10 @@ const layout = computed<BannerLayoutConfig>(
490
493
  () => BANNER_LAYOUTS[props.viewModel.displayStyle] ?? DEFAULT_LAYOUT,
491
494
  );
492
495
 
496
+ const contentPaddingStyle = computed(() =>
497
+ toContentPaddingStyle(props.viewModel),
498
+ );
499
+
493
500
  const displayAlignClass = computed(() => layout.value.alignClass);
494
501
  const isHorizontalAligned = computed(() => !!layout.value.hasSideImage);
495
502
  const isDividedContent = computed(() => layout.value.layout === 'divided');
@@ -1,8 +1,8 @@
1
1
  <template>
2
2
  <section data-component="booking-section">
3
3
  <div
4
- class="tw-relative tw-px-6 tw-py-8"
5
- :style="viewModel.backgroundStyle"
4
+ class="tw-relative tw-px-6"
5
+ :style="[viewModel.backgroundStyle, contentPaddingStyle]"
6
6
  style="container-type: inline-size"
7
7
  >
8
8
  <div
@@ -45,7 +45,11 @@ import type {
45
45
  ButtonViewModel,
46
46
  } from '@brand-page/view-models';
47
47
  import type { BrandPageContext } from '@brand-page/models';
48
- import { getRenderText, escapeContentText } from '@brand-page/utils';
48
+ import {
49
+ getRenderText,
50
+ escapeContentText,
51
+ contentPaddingStyle as toContentPaddingStyle,
52
+ } from '@brand-page/utils';
49
53
  import { hasRTEContent } from '@brand-page-maker/utils';
50
54
  import { hasValidButton as shouldShowButtonUtil } from '../../../utils/validator.util';
51
55
  import Button from '../button/Button.vue';
@@ -71,6 +75,10 @@ const props = defineProps({
71
75
  },
72
76
  });
73
77
 
78
+ const contentPaddingStyle = computed(() =>
79
+ toContentPaddingStyle(props.viewModel),
80
+ );
81
+
74
82
  const renderText = computed((): string => {
75
83
  if (!props.viewModel.description) {
76
84
  return '';
@@ -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-w) / 2);
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
  }
@@ -25,7 +25,10 @@ import {
25
25
  RECAPTCHA_ACTION_CONTACT_FORM,
26
26
  TEXT_ONLY,
27
27
  } from '../../constants';
28
- import { getRenderText } from '@brand-page/utils';
28
+ import {
29
+ getRenderText,
30
+ contentPaddingStyle as toContentPaddingStyle,
31
+ } from '@brand-page/utils';
29
32
  import { hasRTEContent } from '@brand-page-maker/utils';
30
33
  import { useReCaptcha } from '../../composables/recaptcha.composable';
31
34
 
@@ -97,6 +100,10 @@ export default defineComponent({
97
100
  return buttonTextStyle;
98
101
  },
99
102
 
103
+ contentPaddingStyle(): { paddingTop: string; paddingBottom: string } {
104
+ return toContentPaddingStyle(this.viewModel);
105
+ },
106
+
100
107
  hasCard(): boolean {
101
108
  return (
102
109
  this.viewModel.layoutStyle === ALIGN_CARD_CENTER ||
@@ -109,11 +116,10 @@ export default defineComponent({
109
116
  },
110
117
 
111
118
  hasBgColor(): boolean {
112
- return (
113
- this.viewModel.layoutStyle === ALIGN_CARD_CENTER ||
114
- this.viewModel.layoutStyle === TEXT_ONLY ||
115
- this.viewModel.layoutStyle === ALIGN_CENTERED
116
- );
119
+ // Every brandSite layout applies the background colour on the section
120
+ // root (banner-style) so the padding control reveals it; for the image
121
+ // layouts it only shows in the padding bands around the image block.
122
+ return Boolean(this.viewModel.layoutStyle);
117
123
  },
118
124
 
119
125
  isCenteredLayout(): boolean {
@@ -1,24 +1,12 @@
1
1
  <template>
2
2
  <section data-component="contact-form">
3
3
  <div
4
- :class="{
5
- 'tw-flex': isCenteredLayout && !hasBgImage,
6
- 'tw-block': !viewModel.layoutStyle,
7
- 'tw-relative': hasBgImage,
8
- }"
9
- :style="hasBgColor ? viewModel.backgroundStyle : {}"
4
+ :class="{ 'tw-block': !viewModel.layoutStyle }"
5
+ :style="[
6
+ hasBgColor ? viewModel.backgroundStyle : {},
7
+ contentPaddingStyle,
8
+ ]"
10
9
  >
11
- <Media
12
- v-if="hasBgImage && isCenteredLayout"
13
- :image-url="viewModel.imageUrl"
14
- :color-replacements="viewModel.colorReplacements"
15
- :context="context"
16
- :media-type="viewModel.mediaType"
17
- :role="viewModel.role"
18
- :size="viewModel.size"
19
- :content-index="contentIndex"
20
- img-classes="tw-w-full tw-h-full tw-object-cover tw-absolute tw-left-0 tw-top-0 tw-overflow-hidden"
21
- />
22
10
  <Collapsible
23
11
  v-if="
24
12
  !viewModel.layoutStyle ||
@@ -108,110 +96,125 @@
108
96
  </Collapsible>
109
97
  <div
110
98
  v-else-if="isCenteredLayout"
111
- class="contact-container tw-py-4"
112
- :class="{
113
- 'tw-px-6 tw-py-8': hasCard,
114
- 'tw-py-6': !hasCard,
115
- 'tw-w-full': !hasBgImage,
116
- }"
99
+ :class="{ 'tw-relative': hasBgImage, 'tw-flex': !hasBgImage }"
117
100
  >
101
+ <Media
102
+ v-if="hasBgImage"
103
+ :image-url="viewModel.imageUrl"
104
+ :color-replacements="viewModel.colorReplacements"
105
+ :context="context"
106
+ :media-type="viewModel.mediaType"
107
+ :role="viewModel.role"
108
+ :size="viewModel.size"
109
+ :content-index="contentIndex"
110
+ img-classes="tw-w-full tw-h-full tw-object-cover tw-absolute tw-left-0 tw-top-0 tw-overflow-hidden"
111
+ />
118
112
  <div
119
- :style="hasCard ? viewModel.cardStyle : {}"
120
- class="tw-relative tw-block tw-px-6 tw-py-8 tw-rounded-2xl"
113
+ class="contact-container"
114
+ :class="{
115
+ 'tw-px-6': hasCard,
116
+ 'tw-py-8': hasBgImage,
117
+ 'tw-w-full': !hasBgImage,
118
+ }"
121
119
  >
122
- <form v-if="!hasSubmitted" @submit.prevent="submitContactForm">
123
- <TextWrapper
124
- v-if="viewModel.title"
125
- :text-style="viewModel.titleStyle"
126
- :text="viewModel.title"
127
- element="h1"
128
- class="tw-mb-4 tw-text-base"
129
- />
130
- <TextWrapper
131
- v-if="renderText"
132
- :text-style="viewModel.descriptionStyle"
133
- :text="renderText"
134
- element="div"
135
- class="tw-mb-4 tw-text-base"
136
- />
137
- <div v-if="!isSubmitting" class="tw-grid tw-grid-cols-2 tw-gap-4">
138
- <div
139
- v-for="(value, index) in values"
140
- :key="index"
141
- class="tw-text-secondary-500 c-col-span-2"
142
- :class="{
143
- 'tw-col-span-2':
144
- value.field.type === 'text-area' || isMobileDevice,
145
- }"
146
- >
147
- <TextInput
148
- v-if="value.field.type !== 'text-area'"
149
- v-model="value.value"
150
- :placeholder="`${value.field.name}${
151
- value.field.required ? '*' : ''
152
- }`"
153
- :label="`${value.field.name}${value.field.required ? '*' : ''}`"
154
- :show-label-screen-reader-only="true"
155
- size="sm"
156
- :error="!!value.error"
157
- :type="getTextInputTypeByFieldType(value.field.type)"
158
- class="tw-w-full"
159
- @input="onValueChange(index)"
160
- />
161
- <Textarea
162
- v-if="value.field.type === 'text-area'"
163
- v-model="value.value"
164
- :placeholder="`${value.field.name}${
165
- value.field.required ? '*' : ''
166
- }`"
167
- :label="`${value.field.name}${value.field.required ? '*' : ''}`"
168
- :show-label-screen-reader-only="true"
169
- size="sm"
170
- :error="!!value.error"
171
- :resize="false"
172
- class="tw-w-full"
173
- @input="onValueChange(index)"
174
- />
175
- <p v-if="!!value.error" class="form-error">
176
- {{ value.error }}
177
- </p>
178
- </div>
179
- <div class="tw-flex tw-w-full tw-justify-center tw-col-span-2">
180
- <button
181
- v-if="isSubmitButtonVisible"
182
- 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"
183
- :style="submitButtonStyle"
184
- :class="{ 'tw-w-full': isMobileDevice }"
120
+ <div
121
+ :style="hasCard ? viewModel.cardStyle : {}"
122
+ class="tw-relative tw-block tw-px-6 tw-py-8 tw-rounded-2xl"
123
+ >
124
+ <form v-if="!hasSubmitted" @submit.prevent="submitContactForm">
125
+ <TextWrapper
126
+ v-if="viewModel.title"
127
+ :text-style="viewModel.titleStyle"
128
+ :text="viewModel.title"
129
+ element="h1"
130
+ class="tw-mb-4 tw-text-base"
131
+ />
132
+ <TextWrapper
133
+ v-if="renderText"
134
+ :text-style="viewModel.descriptionStyle"
135
+ :text="renderText"
136
+ element="div"
137
+ class="tw-mb-4 tw-text-base"
138
+ />
139
+ <div v-if="!isSubmitting" class="tw-grid tw-grid-cols-2 tw-gap-4">
140
+ <div
141
+ v-for="(value, index) in values"
142
+ :key="index"
143
+ class="tw-text-secondary-500 c-col-span-2"
144
+ :class="{
145
+ 'tw-col-span-2':
146
+ value.field.type === 'text-area' || isMobileDevice,
147
+ }"
185
148
  >
186
- <TextWrapper
187
- :text-style="submitButtonTextStyle"
188
- :text="viewModel.buttonText"
189
- class="tw-text-center tw-text-base"
149
+ <TextInput
150
+ v-if="value.field.type !== 'text-area'"
151
+ v-model="value.value"
152
+ :placeholder="`${value.field.name}${
153
+ value.field.required ? '*' : ''
154
+ }`"
155
+ :label="`${value.field.name}${value.field.required ? '*' : ''}`"
156
+ :show-label-screen-reader-only="true"
157
+ size="sm"
158
+ :error="!!value.error"
159
+ :type="getTextInputTypeByFieldType(value.field.type)"
160
+ class="tw-w-full"
161
+ @input="onValueChange(index)"
190
162
  />
191
- </button>
163
+ <Textarea
164
+ v-if="value.field.type === 'text-area'"
165
+ v-model="value.value"
166
+ :placeholder="`${value.field.name}${
167
+ value.field.required ? '*' : ''
168
+ }`"
169
+ :label="`${value.field.name}${value.field.required ? '*' : ''}`"
170
+ :show-label-screen-reader-only="true"
171
+ size="sm"
172
+ :error="!!value.error"
173
+ :resize="false"
174
+ class="tw-w-full"
175
+ @input="onValueChange(index)"
176
+ />
177
+ <p v-if="!!value.error" class="form-error">
178
+ {{ value.error }}
179
+ </p>
180
+ </div>
181
+ <div class="tw-flex tw-w-full tw-justify-center tw-col-span-2">
182
+ <button
183
+ v-if="isSubmitButtonVisible"
184
+ 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"
185
+ :style="submitButtonStyle"
186
+ :class="{ 'tw-w-full': isMobileDevice }"
187
+ >
188
+ <TextWrapper
189
+ :text-style="submitButtonTextStyle"
190
+ :text="viewModel.buttonText"
191
+ class="tw-text-center tw-text-base"
192
+ />
193
+ </button>
194
+ </div>
192
195
  </div>
196
+ <div v-else class="tw-w-full tw-flex tw-justify-center">
197
+ <Loader />
198
+ </div>
199
+ <p
200
+ v-if="hasSubmitError"
201
+ class="tw-text-center tw-mt-2 form-error"
202
+ >
203
+ {{ submitError }}
204
+ </p>
205
+ </form>
206
+ <div v-else :style="successMessageColorStyle">
207
+ <TextWrapper
208
+ v-if="viewModel.successMessage"
209
+ :text="renderSuccessText"
210
+ element="p"
211
+ :class="'tw-my-0.5'"
212
+ />
193
213
  </div>
194
- <div v-else class="tw-w-full tw-flex tw-justify-center">
195
- <Loader />
196
- </div>
197
- <p v-if="hasSubmitError" class="tw-text-center tw-mt-2 form-error">
198
- {{ submitError }}
199
- </p>
200
- </form>
201
- <div v-else :style="successMessageColorStyle">
202
- <TextWrapper
203
- v-if="viewModel.successMessage"
204
- :text="renderSuccessText"
205
- element="p"
206
- :class="'tw-my-0.5'"
207
- />
208
214
  </div>
209
215
  </div>
210
216
  </div>
211
- <div
212
- v-else-if="isTextOnly"
213
- class="tw-px-6 tw-py-8 tw-gap-2 contact-container"
214
- >
217
+ <div v-else-if="isTextOnly" class="tw-px-6 tw-gap-2 contact-container">
215
218
  <span v-if="!hasSubmitted" class="tw-grid tw-grid-cols-2">
216
219
  <div
217
220
  v-if="!isSubmitting"
@@ -286,7 +289,7 @@
286
289
  {{ value.error }}
287
290
  </p>
288
291
  </div>
289
- <div class="tw-flex tw-w-full tw-justify-start tw-col-span-2">
292
+ <div class="tw-flex tw-w-full tw-justify-center tw-col-span-2">
290
293
  <button
291
294
  v-if="isSubmitButtonVisible"
292
295
  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"
@@ -350,10 +353,7 @@
350
353
  }"
351
354
  >
352
355
  <div
353
- class="tw-flex tw-flex-col tw-gap-2 tw-px-8 tw-w-full tw-justify-center c-py-6"
354
- :class="{
355
- 'tw-py-6': isMobileDevice,
356
- }"
356
+ class="tw-flex tw-flex-col tw-gap-2 tw-px-8 tw-py-6 tw-w-full tw-justify-center"
357
357
  >
358
358
  <span v-if="!hasSubmitted">
359
359
  <TextWrapper
@@ -417,7 +417,7 @@
417
417
  </p>
418
418
  </div>
419
419
  <div
420
- class="tw-flex tw-w-full tw-justify-start tw-col-span-2"
420
+ class="tw-flex tw-w-full tw-justify-center tw-col-span-2"
421
421
  >
422
422
  <button
423
423
  v-if="isSubmitButtonVisible"
@@ -516,9 +516,6 @@ export default {
516
516
  .c-text-padding {
517
517
  @apply tw-px-0 tw-col-span-2;
518
518
  }
519
- .c-py-6 {
520
- @apply tw-py-6;
521
- }
522
519
  .c-divided-container {
523
520
  @apply tw-flex-col;
524
521
  }
@@ -1,6 +1,7 @@
1
1
  import { defineComponent } from 'vue';
2
2
  import type { PropType } from 'vue';
3
3
  import type { ImageGalleryViewModel } from '@brand-page/view-models';
4
+ import { contentPaddingStyle as toContentPaddingStyle } from '@brand-page/utils';
4
5
  import ComponentCommonMixin from '../mixins/component-common.mixin';
5
6
  import ImageModalMixin from '../mixins/image-modal.mixin';
6
7
  import type { ImageGalleryImageClickPayload } from './models';
@@ -34,6 +35,10 @@ export default defineComponent({
34
35
  };
35
36
  },
36
37
  computed: {
38
+ contentPaddingStyle(): { paddingTop: string; paddingBottom: string } {
39
+ return toContentPaddingStyle(this.viewModel);
40
+ },
41
+
37
42
  getContainerStyle(): BrandPageCssStyle {
38
43
  if (this.galleryType === 'carousel') {
39
44
  const maxWidth = this.containerClientWidth
@@ -10,7 +10,7 @@
10
10
  'c-carousel-full-width':
11
11
  viewModel.isFullWidth && isPreview && galleryType === 'carousel',
12
12
  }"
13
- :style="getContainerStyle"
13
+ :style="[getContainerStyle, contentPaddingStyle]"
14
14
  >
15
15
  <component
16
16
  :is="galleryType"
@@ -2,7 +2,10 @@ import { defineComponent } from 'vue';
2
2
  import type { PropType } from 'vue';
3
3
  import type { MailingListViewModel } from '@brand-page/view-models';
4
4
  import brandPageClient from '../../clients/brand-page.client';
5
- import { getEmailValidationError } from '@brand-page/utils';
5
+ import {
6
+ getEmailValidationError,
7
+ contentPaddingStyle as toContentPaddingStyle,
8
+ } from '@brand-page/utils';
6
9
  import type { BrandPageContext } from '@brand-page/models';
7
10
  import {
8
11
  contentSettingsTr,
@@ -61,6 +64,10 @@ export default defineComponent({
61
64
  }
62
65
  },
63
66
  computed: {
67
+ contentPaddingStyle(): { paddingTop: string; paddingBottom: string } {
68
+ return toContentPaddingStyle(this.viewModel);
69
+ },
70
+
64
71
  hasNameError(): boolean {
65
72
  return !!this.nameError;
66
73
  },
@@ -1,5 +1,5 @@
1
1
  <template>
2
- <section>
2
+ <section :style="contentPaddingStyle">
3
3
  <div
4
4
  v-if="show"
5
5
  class="tw-p-4"