@designcrowd/library.brand-page 5.12.3 → 5.12.4-ast-booking

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 (123) hide show
  1. package/lib/src/{CreatedOnBrandCrowd-de-de-BIS4HwLB.js → CreatedOnBrandCrowd-de-de-BQeJ_n6B.js} +1 -1
  2. package/lib/src/{CreatedOnBrandCrowd-en-us-DxDARay8.js → CreatedOnBrandCrowd-en-us-Cj3iYC5T.js} +1 -1
  3. package/lib/src/{CreatedOnBrandCrowd-es-es-CooG2xz7.js → CreatedOnBrandCrowd-es-es-Cl7JjVJm.js} +1 -1
  4. package/lib/src/{CreatedOnBrandCrowd-fr-fr-CGfs-T2d.js → CreatedOnBrandCrowd-fr-fr-DRomv4BA.js} +1 -1
  5. package/lib/src/{CreatedOnBrandCrowd-pt-pt-CVY8SeTl.js → CreatedOnBrandCrowd-pt-pt-DZFEw5Xl.js} +1 -1
  6. package/lib/src/{CreatedOnDcom-de-de-1fdeLt5s.js → CreatedOnDcom-de-de-DZhX2bER.js} +1 -1
  7. package/lib/src/{CreatedOnDcom-en-us-0ItobO75.js → CreatedOnDcom-en-us-Bh9DHJW3.js} +1 -1
  8. package/lib/src/{CreatedOnDcom-es-es-Bss96GRx.js → CreatedOnDcom-es-es-CUkCHVmG.js} +1 -1
  9. package/lib/src/{CreatedOnDcom-fr-fr-CXmnIRMO.js → CreatedOnDcom-fr-fr-CF_tcHWx.js} +1 -1
  10. package/lib/src/{CreatedOnDcom-pt-pt-BDYYHpJa.js → CreatedOnDcom-pt-pt-gyRIp-Wi.js} +1 -1
  11. package/lib/src/brand-page/models/content.model.d.ts +1 -0
  12. package/lib/src/brand-page/models/content.model.js +1 -0
  13. package/lib/src/brand-page/models/index.d.ts +16 -0
  14. package/lib/src/brand-page/utils/style.util.js +1 -1
  15. package/lib/src/brand-page/utils/view-model.util.d.ts +3 -2
  16. package/lib/src/brand-page/utils/view-model.util.js +14 -0
  17. package/lib/src/brand-page/view-models.d.ts +6 -2
  18. package/lib/src/brand-page-maker/assessors/banner-section-description-visibility.assessor.d.ts +4 -4
  19. package/lib/src/brand-page-maker/assessors/banner-section-field.assessor.d.ts +4 -4
  20. package/lib/src/brand-page-maker/components/admin-logo-settings/AdminLogoSettings.mixin.d.ts +2 -2
  21. package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.d.ts +19 -18
  22. package/lib/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.js +2 -0
  23. package/lib/src/brand-page-maker/components/brandpage-maker-page/BrandPageMakerPage.mixin.d.ts +20 -20
  24. package/lib/src/brand-page-maker/constants/config-settings-constant.d.ts +2 -1
  25. package/lib/src/brand-page-maker/constants/config-settings-constant.js +101 -1
  26. package/lib/src/brand-page-maker/models/content-settings.d.ts +2 -1
  27. package/lib/src/brand-page-maker/models/content-settings.js +28 -0
  28. package/lib/src/brand-page-maker/validators/section-button.validator.d.ts +3 -3
  29. package/lib/src/bundled-translations-BZJKPEb9.js +155 -0
  30. package/lib/src/bundled-translations.de-DE-gxort83w.js +153 -0
  31. package/lib/src/bundled-translations.es-ES-BuDFNpDO.js +153 -0
  32. package/lib/src/bundled-translations.fr-FR-B1h4iGcU.js +153 -0
  33. package/lib/src/bundled-translations.pt-PT-DWXOT8W0.js +153 -0
  34. package/lib/src/bundles/bundled-translations.de-DE.json +10 -2
  35. package/lib/src/bundles/bundled-translations.es-ES.json +10 -2
  36. package/lib/src/bundles/bundled-translations.fr-FR.json +10 -2
  37. package/lib/src/bundles/bundled-translations.json +18 -3
  38. package/lib/src/bundles/bundled-translations.pt-PT.json +10 -2
  39. package/lib/src/composables/useTranslate.d.ts +3 -1
  40. package/lib/src/composables/useTranslate.js +3 -1
  41. package/lib/src/css/library.brand-page-brandCrowd.min.css +14 -9
  42. package/lib/src/css/library.brand-page-brandPage.min.css +14 -9
  43. package/lib/src/css/library.brand-page-designCom.min.css +14 -9
  44. package/lib/src/css/library.brand-page-preview.min.css +14 -9
  45. package/lib/src/index.mjs +176 -175
  46. package/lib/src/{lib-B3W7JSHn.js → lib-Dsso3HKV.js} +21386 -21063
  47. package/lib/src/shared/confirm-modal/ConfirmModal.mixin.d.ts +1 -0
  48. package/lib/src/shared/confirm-modal/ConfirmModal.mixin.js +2 -0
  49. package/lib/src/shared/content-settings/components/content-settings/ContentSettings.mixin.d.ts +20 -20
  50. package/lib/src/shared/content-settings/components/content-settings/ReplaceImageSettingsForContent.mixin.d.ts +21 -21
  51. package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItem.mixin.d.ts +20 -20
  52. package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.d.ts +18 -18
  53. package/lib/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.js +1 -1
  54. package/lib/src/shared/content-settings/components/focused-content-item-settings/FocusedContentItemSettings.mixin.d.ts +18 -18
  55. package/lib/src/shared/content-settings/components/url-field/UrlField.mixin.d.ts +39 -2
  56. package/lib/src/shared/content-settings/components/url-field/UrlField.mixin.js +32 -0
  57. package/lib/src/shared/content-settings/store/content-settings-store.d.ts +18 -18
  58. package/lib/src/shared/font-family-selector/FontFamilySelector.mixin.d.ts +3 -2
  59. package/lib/src/shared/font-family-selector/FontFamilySelector.mixin.js +16 -9
  60. package/lib/src/shared/page-settings/components/page-settings/PageSettings.mixin.d.ts +22 -22
  61. package/lib/src/shared/page-settings/components/page-settings-section-styles/PageSettingsSectionStyles.mixin.d.ts +20 -20
  62. package/lib/src/shared/publish-brand-page-with-state/PublishBrandPageModalWithState.mixin.d.ts +1 -1
  63. package/lib/src/shared/publish-brand-page-with-state/PublishBrandPageModalWithState.mixin.js +11 -1
  64. package/package.json +1 -1
  65. package/src/brand-page/components/booking-section/BookingSection.vue +240 -0
  66. package/src/brand-page/components/map/Map.vue +17 -9
  67. package/src/brand-page/components/page/PageComponent.vue +2 -0
  68. package/src/brand-page/models/content.model.ts +1 -0
  69. package/src/brand-page/models/index.ts +17 -0
  70. package/src/brand-page/utils/style.util.ts +1 -1
  71. package/src/brand-page/utils/view-model.util.ts +27 -0
  72. package/src/brand-page/view-models.ts +10 -1
  73. package/src/brand-page-maker/assessors/banner-section-description-visibility.assessor.ts +7 -4
  74. package/src/brand-page-maker/assessors/banner-section-field.assessor.ts +7 -4
  75. package/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.mixin.ts +2 -0
  76. package/src/brand-page-maker/components/brand-page-maker/BrandPageMaker.vue +1 -1
  77. package/src/brand-page-maker/components/google-analytics/GoogleAnalytics.vue +3 -3
  78. package/src/brand-page-maker/constants/config-settings-constant.ts +107 -0
  79. package/src/brand-page-maker/models/content-settings.ts +32 -0
  80. package/src/brand-page-maker/validators/section-button.validator.ts +7 -6
  81. package/src/bundles/bundled-translations.de-DE.json +10 -2
  82. package/src/bundles/bundled-translations.es-ES.json +10 -2
  83. package/src/bundles/bundled-translations.fr-FR.json +10 -2
  84. package/src/bundles/bundled-translations.json +18 -3
  85. package/src/bundles/bundled-translations.pt-PT.json +10 -2
  86. package/src/composables/useTranslate.ts +5 -0
  87. package/src/shared/common/i18n/common.de-DE.json +2 -1
  88. package/src/shared/common/i18n/common.es-ES.json +2 -1
  89. package/src/shared/common/i18n/common.fr-FR.json +2 -1
  90. package/src/shared/common/i18n/common.json +3 -1
  91. package/src/shared/common/i18n/common.pt-PT.json +2 -1
  92. package/src/shared/confirm-modal/ConfirmModal.mixin.ts +2 -0
  93. package/src/shared/confirm-modal/ConfirmModal.vue +5 -3
  94. package/src/shared/confirm-modal/i18n/confirm-modal.de-DE.json +7 -0
  95. package/src/shared/confirm-modal/i18n/confirm-modal.es-ES.json +7 -0
  96. package/src/shared/confirm-modal/i18n/confirm-modal.fr-FR.json +7 -0
  97. package/src/shared/confirm-modal/i18n/confirm-modal.json +7 -0
  98. package/src/shared/confirm-modal/i18n/confirm-modal.pt-PT.json +7 -0
  99. package/src/shared/content-settings/components/content-settings/i18n/content-settings.json +5 -1
  100. package/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.mixin.ts +1 -1
  101. package/src/shared/content-settings/components/content-settings-item/ContentSettingsItemField.vue +1 -1
  102. package/src/shared/content-settings/components/payment-config-field/PaymentConfigOptionField.vue +4 -1
  103. package/src/shared/content-settings/components/url-field/UrlField.mixin.ts +38 -0
  104. package/src/shared/content-settings/components/url-field/UrlField.vue +12 -0
  105. package/src/shared/content-settings/components/url-field/i18n/url-field.json +5 -0
  106. package/src/shared/font-family-selector/FontFamilySelector.mixin.ts +21 -11
  107. package/src/shared/publish-brand-page-with-state/PublishBrandPageModalWithState.mixin.ts +14 -3
  108. package/src/shared/publish-brand-page-with-state/i18n/publish-brand-page-modal-with-state.de-DE.json +4 -2
  109. package/src/shared/publish-brand-page-with-state/i18n/publish-brand-page-modal-with-state.es-ES.json +4 -2
  110. package/src/shared/publish-brand-page-with-state/i18n/publish-brand-page-modal-with-state.fr-FR.json +4 -2
  111. package/src/shared/publish-brand-page-with-state/i18n/publish-brand-page-modal-with-state.json +4 -2
  112. package/src/shared/publish-brand-page-with-state/i18n/publish-brand-page-modal-with-state.pt-PT.json +4 -2
  113. package/lib/src/brand-page/components/map/Map.mixin.d.ts +0 -50
  114. package/lib/src/brand-page/components/map/Map.mixin.js +0 -20
  115. package/lib/src/bundled-translations-DE2UZ_8B.js +0 -151
  116. package/lib/src/bundled-translations.de-DE-BawsKiJ9.js +0 -151
  117. package/lib/src/bundled-translations.es-ES-BZijuSLY.js +0 -151
  118. package/lib/src/bundled-translations.fr-FR-hqcn5AfG.js +0 -151
  119. package/lib/src/bundled-translations.pt-PT-Bnt_n1_N.js +0 -151
  120. package/src/brand-page/components/logo/test.json +0 -866
  121. package/src/brand-page/components/logo/test2.json +0 -765
  122. package/src/brand-page/components/logo/test3.json +0 -749
  123. package/src/brand-page/components/map/Map.mixin.ts +0 -24
@@ -3400,7 +3400,7 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
3400
3400
  contentErrorCount(): number;
3401
3401
  getContent(state: {
3402
3402
  addContentOptions: {
3403
- type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "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";
3403
+ type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "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";
3404
3404
  category: string;
3405
3405
  createInitialContent: (options: import("../../../content-settings/models").CreateInitialContentOptions) => import("../../../../brand-page").Content;
3406
3406
  displayName: string;
@@ -3411,11 +3411,11 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
3411
3411
  }[];
3412
3412
  items: {
3413
3413
  id: string;
3414
- type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "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";
3414
+ type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "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";
3415
3415
  settings: {
3416
3416
  content: {
3417
3417
  id: string;
3418
- type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "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";
3418
+ type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "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";
3419
3419
  personalisationRole?: "website" | "email" | "phone" | "profile" | "about" | "information" | "media" | undefined;
3420
3420
  imageUrlOverride?: string | undefined;
3421
3421
  imageUrlsOverride?: string | undefined;
@@ -3449,7 +3449,7 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
3449
3449
  } & import("pinia").PiniaCustomStateProperties<import("../../../content-settings/store").ContentSettingsState>): (id: string) => import("../../../../brand-page").Content | undefined;
3450
3450
  getFieldSettings(state: {
3451
3451
  addContentOptions: {
3452
- type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "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";
3452
+ type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "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";
3453
3453
  category: string;
3454
3454
  createInitialContent: (options: import("../../../content-settings/models").CreateInitialContentOptions) => import("../../../../brand-page").Content;
3455
3455
  displayName: string;
@@ -3460,11 +3460,11 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
3460
3460
  }[];
3461
3461
  items: {
3462
3462
  id: string;
3463
- type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "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";
3463
+ type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "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";
3464
3464
  settings: {
3465
3465
  content: {
3466
3466
  id: string;
3467
- type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "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";
3467
+ type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "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";
3468
3468
  personalisationRole?: "website" | "email" | "phone" | "profile" | "about" | "information" | "media" | undefined;
3469
3469
  imageUrlOverride?: string | undefined;
3470
3470
  imageUrlsOverride?: string | undefined;
@@ -3498,7 +3498,7 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
3498
3498
  } & import("pinia").PiniaCustomStateProperties<import("../../../content-settings/store").ContentSettingsState>): (id: string, fieldName: string) => ContentItemFieldSettings | undefined;
3499
3499
  getItem(state: {
3500
3500
  addContentOptions: {
3501
- type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "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";
3501
+ type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "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";
3502
3502
  category: string;
3503
3503
  createInitialContent: (options: import("../../../content-settings/models").CreateInitialContentOptions) => import("../../../../brand-page").Content;
3504
3504
  displayName: string;
@@ -3509,11 +3509,11 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
3509
3509
  }[];
3510
3510
  items: {
3511
3511
  id: string;
3512
- type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "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";
3512
+ type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "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";
3513
3513
  settings: {
3514
3514
  content: {
3515
3515
  id: string;
3516
- type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "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";
3516
+ type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "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";
3517
3517
  personalisationRole?: "website" | "email" | "phone" | "profile" | "about" | "information" | "media" | undefined;
3518
3518
  imageUrlOverride?: string | undefined;
3519
3519
  imageUrlsOverride?: string | undefined;
@@ -3547,7 +3547,7 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
3547
3547
  } & import("pinia").PiniaCustomStateProperties<import("../../../content-settings/store").ContentSettingsState>): (id: string) => import("../../../content-settings/models").ContentItem<any> | undefined;
3548
3548
  getValue(state: {
3549
3549
  addContentOptions: {
3550
- type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "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";
3550
+ type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "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";
3551
3551
  category: string;
3552
3552
  createInitialContent: (options: import("../../../content-settings/models").CreateInitialContentOptions) => import("../../../../brand-page").Content;
3553
3553
  displayName: string;
@@ -3558,11 +3558,11 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
3558
3558
  }[];
3559
3559
  items: {
3560
3560
  id: string;
3561
- type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "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";
3561
+ type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "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";
3562
3562
  settings: {
3563
3563
  content: {
3564
3564
  id: string;
3565
- type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "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";
3565
+ type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "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";
3566
3566
  personalisationRole?: "website" | "email" | "phone" | "profile" | "about" | "information" | "media" | undefined;
3567
3567
  imageUrlOverride?: string | undefined;
3568
3568
  imageUrlsOverride?: string | undefined;
@@ -3596,7 +3596,7 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
3596
3596
  } & import("pinia").PiniaCustomStateProperties<import("../../../content-settings/store").ContentSettingsState>): (id: string, fieldName: string) => string | import("../../../../brand-page").Content | undefined;
3597
3597
  getItemState(state: {
3598
3598
  addContentOptions: {
3599
- type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "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";
3599
+ type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "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";
3600
3600
  category: string;
3601
3601
  createInitialContent: (options: import("../../../content-settings/models").CreateInitialContentOptions) => import("../../../../brand-page").Content;
3602
3602
  displayName: string;
@@ -3607,11 +3607,11 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
3607
3607
  }[];
3608
3608
  items: {
3609
3609
  id: string;
3610
- type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "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";
3610
+ type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "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";
3611
3611
  settings: {
3612
3612
  content: {
3613
3613
  id: string;
3614
- type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "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";
3614
+ type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "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";
3615
3615
  personalisationRole?: "website" | "email" | "phone" | "profile" | "about" | "information" | "media" | undefined;
3616
3616
  imageUrlOverride?: string | undefined;
3617
3617
  imageUrlsOverride?: string | undefined;
@@ -3645,7 +3645,7 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
3645
3645
  } & import("pinia").PiniaCustomStateProperties<import("../../../content-settings/store").ContentSettingsState>): (id: string) => import("../../../content-settings/models").ContentSettingsItemState;
3646
3646
  getItemGroupState(state: {
3647
3647
  addContentOptions: {
3648
- type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "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";
3648
+ type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "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";
3649
3649
  category: string;
3650
3650
  createInitialContent: (options: import("../../../content-settings/models").CreateInitialContentOptions) => import("../../../../brand-page").Content;
3651
3651
  displayName: string;
@@ -3656,11 +3656,11 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
3656
3656
  }[];
3657
3657
  items: {
3658
3658
  id: string;
3659
- type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "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";
3659
+ type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "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";
3660
3660
  settings: {
3661
3661
  content: {
3662
3662
  id: string;
3663
- type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "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";
3663
+ type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "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";
3664
3664
  personalisationRole?: "website" | "email" | "phone" | "profile" | "about" | "information" | "media" | undefined;
3665
3665
  imageUrlOverride?: string | undefined;
3666
3666
  imageUrlsOverride?: string | undefined;
@@ -4252,11 +4252,11 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
4252
4252
  slug: string;
4253
4253
  contents: {
4254
4254
  id: string;
4255
- type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "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";
4255
+ type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "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";
4256
4256
  settings: {
4257
4257
  content: {
4258
4258
  id: string;
4259
- type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "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";
4259
+ type: "website" | "image" | "facebook" | "twitter" | "email" | "phone" | "logo" | "general-link" | "profile" | "video" | "text" | "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";
4260
4260
  personalisationRole?: "website" | "email" | "phone" | "profile" | "about" | "information" | "media" | undefined;
4261
4261
  imageUrlOverride?: string | undefined;
4262
4262
  imageUrlsOverride?: string | undefined;
@@ -41,7 +41,7 @@ declare const _default: import("vue").DefineComponent<import("vue").ExtractPropT
41
41
  designDraftToken: import("vue").ComputedRef<string | undefined>;
42
42
  brandPageViewModel: import("vue").ComputedRef<import("../../brand-page").BrandPageViewModel>;
43
43
  backUrl: import("vue").ComputedRef<string>;
44
- brandPageDisplayName: import("vue").ComputedRef<string>;
44
+ brandPageDisplayName: import("vue").ComputedRef<any>;
45
45
  publishBrandPage: import("vue").ComputedRef<({ shouldPublish, slug }: {
46
46
  shouldPublish: any;
47
47
  slug: any;
@@ -45,7 +45,17 @@ export default defineComponent({
45
45
  designDraftToken: computed(() => brandPageContainerStore.designDraftToken),
46
46
  brandPageViewModel: computed(() => brandPageMakerStore.brandPageViewModel),
47
47
  backUrl: computed(() => localisedRouteStore.backToWebsiteManageUrlPath),
48
- brandPageDisplayName: computed(() => brandPageContainerStore.brandPageDisplayName),
48
+ brandPageDisplayName: computed(() => {
49
+ const brandPageName = brandPageContainerStore.brandPageDisplayName;
50
+ switch (brandPageName) {
51
+ case 'Website':
52
+ return publishBrandPageModalWithStateTr('websiteFriendlyName');
53
+ case 'Digital Business Card':
54
+ return publishBrandPageModalWithStateTr('digitalBusinessCardFriendlyName');
55
+ default:
56
+ return brandPageName;
57
+ }
58
+ }),
49
59
  publishBrandPage: computed(() => brandPageContainerStore.publishBrandPage),
50
60
  publishCustomDomain: computed(() => brandPageContainerStore.publishBrandPageWithCustomDomainAsync),
51
61
  checkWebsiteSlugAsync: computed(() => brandPageContainerStore.checkWebsiteSlugAsync),
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.12.3",
4
+ "version": "5.12.4-ast-booking",
5
5
  "author": "Design.com Eng",
6
6
  "license": "UNLICENSED",
7
7
  "type": "module",
@@ -0,0 +1,240 @@
1
+ <template>
2
+ <section>
3
+ <div
4
+ class="tw-relative tw-px-6 tw-py-8"
5
+ :style="viewModel.backgroundStyle"
6
+ style="container-type: inline-size"
7
+ >
8
+ <div
9
+ class="tw-flex tw-gap-8 tw-w-full tw-h-full tw-items-center c_banner-container tw-flex-col tw-gap-5"
10
+ >
11
+ <TextWrapper
12
+ v-if="viewModel.title"
13
+ :text-style="viewModel.titleStyle"
14
+ :text="viewModel.title"
15
+ :slug="context.brandPageSlug"
16
+ element="h1"
17
+ />
18
+ <TextWrapper
19
+ v-if="hasDescriptionText"
20
+ :text-style="viewModel.descriptionStyle"
21
+ :text="renderText"
22
+ :slug="context.brandPageSlug"
23
+ element="div"
24
+ />
25
+ <div
26
+ v-if="shouldShowButton"
27
+ class="tw-w-full tw-flex tw-justify-center"
28
+ >
29
+ <button
30
+ class="tw-block tw-py-4 tw-px-5 tw-text-base tw-text-center tw-w-fit tw-border-0 hover:tw-cursor-pointer"
31
+ :style="buttonStyle"
32
+ @click="onClickUrl"
33
+ >
34
+ <TextWrapper
35
+ :text-style="props.viewModel.buttonTextStyle"
36
+ :text="props.viewModel.buttonText"
37
+ class="tw-text-center tw-text-base"
38
+ />
39
+ </button>
40
+ </div>
41
+ </div>
42
+ </div>
43
+ </section>
44
+ </template>
45
+ <script setup lang="ts">
46
+ import type { PropType, StyleValue } from 'vue';
47
+ import { computed } from 'vue';
48
+ import { useRouter } from 'vue-router';
49
+ import TextWrapper from '../text-wrapper/TextWrapper.vue';
50
+ import type { BookingSectionViewModel } from '../../view-models';
51
+ import type { BrandPageContext } from '../../models';
52
+ import { getRenderText, escapeContentText } from '../../utils';
53
+ import { hasRTEContent } from '../../../brand-page-maker/utils';
54
+ import { isURL, isEmail, isTel } from '../../../utils/validator.util';
55
+ import { getRouteParamsByPage } from '../../utils/route.util';
56
+ import { BP_PAGE_SLUG_ROUTE_NAME, BP_SLUG_ROUTE_NAME } from '../../constants';
57
+
58
+ const props = defineProps({
59
+ viewModel: {
60
+ type: Object as PropType<BookingSectionViewModel>,
61
+ required: true,
62
+ },
63
+ context: {
64
+ type: Object as PropType<BrandPageContext>,
65
+ required: true,
66
+ },
67
+ containerClientWidth: {
68
+ type: Number as PropType<number | undefined>,
69
+ required: false,
70
+ default: undefined,
71
+ },
72
+ containerClientHeight: {
73
+ type: Number as PropType<number | undefined>,
74
+ required: false,
75
+ default: undefined,
76
+ },
77
+ });
78
+
79
+ const router = useRouter();
80
+
81
+ const handleUrlClick = (url: string) => {
82
+ if (url && isURL(url)) {
83
+ window.open(url, '_blank', 'noopener,noreferrer');
84
+ }
85
+ };
86
+
87
+ const handlePageNavigation = (pageSlug: string) => {
88
+ if (!pageSlug) return;
89
+
90
+ const routeParams = getRouteParamsByPage(
91
+ !!props.context.customDomain,
92
+ props.context.brandPageSlug,
93
+ pageSlug,
94
+ );
95
+
96
+ const routeName = !!props.context.customDomain
97
+ ? BP_SLUG_ROUTE_NAME
98
+ : BP_PAGE_SLUG_ROUTE_NAME;
99
+
100
+ router.push({
101
+ name: routeName,
102
+ params: routeParams,
103
+ });
104
+ };
105
+
106
+ const handleEmailClick = (email?: string, fallbackUrl?: string) => {
107
+ if (email && isEmail(email)) {
108
+ window.location.href = `mailto:${email}`;
109
+ } else if (fallbackUrl && isEmail(fallbackUrl)) {
110
+ window.location.href = `mailto:${fallbackUrl}`;
111
+ }
112
+ };
113
+
114
+ const handlePhoneClick = (tel?: string, fallbackUrl?: string) => {
115
+ if (tel && isTel(tel)) {
116
+ window.location.href = `tel:${tel}`;
117
+ } else if (fallbackUrl && isTel(fallbackUrl)) {
118
+ window.location.href = `tel:${fallbackUrl}`;
119
+ }
120
+ };
121
+
122
+ const handleFallbackClick = (url?: string) => {
123
+ if (!url) return;
124
+
125
+ if (isEmail(url)) {
126
+ window.location.href = `mailto:${url}`;
127
+ } else if (isTel(url)) {
128
+ window.location.href = `tel:${url}`;
129
+ } else if (isURL(url)) {
130
+ window.open(url, '_blank', 'noopener,noreferrer');
131
+ }
132
+ };
133
+
134
+ const onClickUrl = () => {
135
+ const { buttonLinkType, url, pageSlug, email, tel } = props.viewModel;
136
+
137
+ switch (buttonLinkType) {
138
+ case 'url':
139
+ handleUrlClick(url);
140
+ break;
141
+
142
+ case 'page':
143
+ handlePageNavigation(pageSlug);
144
+ break;
145
+
146
+ case 'mailTo':
147
+ handleEmailClick(email, url);
148
+ break;
149
+
150
+ case 'tel':
151
+ handlePhoneClick(tel, url);
152
+ break;
153
+
154
+ default:
155
+ handleFallbackClick(url);
156
+ break;
157
+ }
158
+ };
159
+
160
+ const renderText = computed((): string => {
161
+ if (!props.viewModel.description) {
162
+ return '';
163
+ }
164
+
165
+ if (hasRTEContent(props.viewModel.description)) {
166
+ return props.viewModel.description;
167
+ } else {
168
+ return getRenderText(props.viewModel.description);
169
+ }
170
+ });
171
+
172
+ const hasDescriptionText = computed((): boolean => {
173
+ if (hasRTEContent(props.viewModel.description)) {
174
+ return escapeContentText(props.viewModel.description) !== '';
175
+ } else {
176
+ return props.viewModel?.description?.length > 0;
177
+ }
178
+ });
179
+
180
+ const buttonStyle = computed((): StyleValue => {
181
+ const buttonStyle = {
182
+ color: props.viewModel.buttonStyles?.style.color,
183
+ ...props.viewModel.buttonStyles?.style,
184
+ };
185
+ const buttonTextStyle = {
186
+ ...buttonStyle,
187
+ color: props.viewModel.buttonTextStyle.color,
188
+ };
189
+
190
+ return buttonTextStyle as StyleValue;
191
+ });
192
+
193
+ const isValidUrl = (url?: string): boolean => !!(url && isURL(url));
194
+ const isValidEmail = (email?: string): boolean => !!(email && isEmail(email));
195
+ const isValidPhone = (tel?: string): boolean => !!(tel && isTel(tel));
196
+ const isValidPage = (pageSlug?: string): boolean => !!pageSlug;
197
+
198
+ const hasValidTarget = (
199
+ buttonLinkType: string,
200
+ url?: string,
201
+ pageSlug?: string,
202
+ email?: string,
203
+ tel?: string,
204
+ ): boolean => {
205
+ switch (buttonLinkType) {
206
+ case 'url':
207
+ return isValidUrl(url);
208
+
209
+ case 'page':
210
+ return isValidPage(pageSlug);
211
+
212
+ case 'mailTo':
213
+ return isValidEmail(email) || isValidEmail(url);
214
+
215
+ case 'tel':
216
+ return isValidPhone(tel) || isValidPhone(url);
217
+
218
+ default:
219
+ return isValidUrl(url) || isValidEmail(url) || isValidPhone(url);
220
+ }
221
+ };
222
+
223
+ const shouldShowButton = computed((): boolean => {
224
+ const hasButtonText = !!props.viewModel.buttonText?.length;
225
+
226
+ if (!hasButtonText) {
227
+ return false;
228
+ }
229
+
230
+ const { buttonLinkType, url, pageSlug, email, tel } = props.viewModel;
231
+ return hasValidTarget(buttonLinkType, url, pageSlug, email, tel);
232
+ });
233
+ </script>
234
+
235
+ <style scoped>
236
+ .c_banner-container {
237
+ max-width: var(--brandsite-max-width);
238
+ margin: 0 auto;
239
+ }
240
+ </style>
@@ -16,19 +16,27 @@
16
16
  </div>
17
17
  </div>
18
18
  </template>
19
- <script>
19
+ <script setup lang="ts">
20
20
  import GoogleMap from './GoogleMap.vue';
21
21
  import Placeholder from '../placeholder/Placeholder.vue';
22
- import MapMixin from './Map.mixin.ts';
22
+ import type { MapViewModel } from '../../view-models';
23
+ import type { BrandPageContext } from '../../models';
23
24
  import { mapTr } from '../../../composables/useTranslate';
25
+ import { computed } from 'vue';
24
26
 
25
- export default {
26
- components: {
27
- GoogleMap,
28
- Placeholder,
29
- },
30
- mixins: [MapMixin],
31
- };
27
+ interface Props {
28
+ viewModel: MapViewModel;
29
+ context: BrandPageContext;
30
+ isPreview?: boolean;
31
+ isMobileDevice?: boolean;
32
+ }
33
+
34
+ const props = withDefaults(defineProps<Props>(), {
35
+ isPreview: false,
36
+ isMobileDevice: false,
37
+ });
38
+
39
+ const placeId = computed(() => props.viewModel?.address?.placeId);
32
40
  </script>
33
41
  <style scoped>
34
42
  .c-map {
@@ -33,6 +33,7 @@ import DividerSection from '../divider-section/DividerSection.vue';
33
33
  import ShapesSection from '../shapes-section/ShapesSection.vue';
34
34
  import PageComponentMixin from './PageComponent.mixin.ts';
35
35
  import Shop from '../shop/Shop.vue';
36
+ import BookingSection from '../booking-section/BookingSection.vue';
36
37
 
37
38
  export default {
38
39
  components: {
@@ -57,6 +58,7 @@ export default {
57
58
  'bp-divider-section': DividerSection,
58
59
  'bp-shapes-section': ShapesSection,
59
60
  'bp-shop-section': Shop,
61
+ 'bp-booking-section': BookingSection,
60
62
  },
61
63
  mixins: [PageComponentMixin],
62
64
  };
@@ -30,6 +30,7 @@ export const CONTENT_TYPES = {
30
30
  'social-links': 'social-links',
31
31
  'shapes-section': 'shapes-section',
32
32
  'shop-section': 'shop-section',
33
+ 'booking-section': 'booking-section',
33
34
  } as const;
34
35
 
35
36
  export type ContentType = keyof typeof CONTENT_TYPES;
@@ -581,6 +581,23 @@ export interface DividerSectionContent extends Content {
581
581
  backgroundStyle?: BrandPageCssStyle;
582
582
  }
583
583
 
584
+ export interface BookingSectionContent extends Content {
585
+ type: 'booking-section';
586
+ title: string;
587
+ description: string;
588
+ buttonText: string;
589
+ url: string;
590
+ email?: string;
591
+ tel?: string;
592
+ titleStyle: TextStyleDeclaration;
593
+ descriptionStyle: TextStyleDeclaration;
594
+ backgroundStyle: BrandPageCssStyle;
595
+ pageSlug: string;
596
+ buttonLinkType: ButtonLinkType;
597
+ buttonTextStyle: TextStyleDeclaration;
598
+ aspectRatio?: number | null;
599
+ }
600
+
584
601
  export class PageModel {
585
602
  title: string;
586
603
  slug: string;
@@ -372,7 +372,7 @@ const CONTENT_STYLE_PROP_NAME_SUFFIX = [
372
372
  'Replacements',
373
373
  ];
374
374
 
375
- const RTE_ALLOWED_SECTION_TYPES = ['text', 'banner-section'];
375
+ const RTE_ALLOWED_SECTION_TYPES = ['text', 'banner-section', 'booking-section'];
376
376
  const RTE_ALLOWED_FIELDS = ['title', 'description', 'text', 'textItems'];
377
377
 
378
378
  export const applyLogoThemeToContents = (
@@ -36,6 +36,7 @@ import type {
36
36
  LogoTemplateImageModel,
37
37
  ShopContent,
38
38
  SensitiveContent,
39
+ BookingSectionContent,
39
40
  } from '../models';
40
41
  import { ButtonStyles, SENSITIVE_CONTENT_TYPES, VIEWPORTS } from '../models';
41
42
  import {
@@ -72,6 +73,7 @@ import type {
72
73
  DividerSectionViewModel,
73
74
  ShapesSectionViewModel,
74
75
  ShopViewModel,
76
+ BookingSectionViewModel,
75
77
  } from '../view-models';
76
78
  import { isHexTransparent, setRgbAlpha } from './color.util';
77
79
  import type { ContentTextStylePropertyKey } from '../constants';
@@ -842,6 +844,25 @@ const mapToSocialLinksViewModel = (
842
844
  );
843
845
  };
844
846
 
847
+ export const mapToBookingSectionViewModel = (
848
+ content: BookingSectionContent,
849
+ styles: PageStyles,
850
+ ): BookingSectionViewModel => {
851
+ return applyViewModelTextStyles(
852
+ {
853
+ ...content,
854
+ role: content.type,
855
+ type: 'booking-section',
856
+ buttonStyles: styles.buttonStyles,
857
+ buttonTextStyle: {
858
+ ...content.buttonTextStyle,
859
+ },
860
+ isFullWidth: true,
861
+ },
862
+ styles,
863
+ );
864
+ };
865
+
845
866
  export const mapToPageHeaderViewModel = (
846
867
  pageHeader: PageHeaderDesktop | PageHeaderMobile,
847
868
  pageStyles: PageStyles,
@@ -1048,6 +1069,12 @@ export const mapToViewModel =
1048
1069
  styles,
1049
1070
  );
1050
1071
 
1072
+ case 'booking-section':
1073
+ return mapToBookingSectionViewModel(
1074
+ content as BookingSectionContent,
1075
+ styles,
1076
+ );
1077
+
1051
1078
  case 'about-section':
1052
1079
  return mapToAboutSectionViewModel(
1053
1080
  content as AboutSectionContent,