templates/_snippets/best_cruises.html.twig line 1

Open in your IDE?
  1. {# ------------------------------------------------------------------------ #}
  2. {# ----------------------------- PARAMÉTRAGES ----------------------------- #}
  3. {# ------------------------------------------------------------------------ #}
  4. {% set effectiveSectionSettings = showSectionSettings|default(true) ? sectionSettings|default({}) : {} %}
  5. {% set content = effectiveSectionSettings|merge(bestCruises) %}
  6. {% set bestCruises = content %}
  7. {% set bestCruisesId = 'best_cruises-' ~ random() %}
  8. {# Filtrage des croisières par date de départ (on n'affiche que celles qui ont commencé) #}
  9. {% set currentDate = 'now'|date('Y-m-d') %}
  10. {% include '_snippets/sections/cards_section_settings.html.twig' with {
  11. 'content': content,
  12. 'id': bestCruisesId,
  13. } %}
  14. {# Paramètres spécifiques à ce fragment #}
  15. {% set buttonSettings = {
  16. 'padding': bestCruises.paddingButtonTopBottomContent|default(14) ~ bestCruises.paddingButtonUnitContent|default('px') ~ ' ' ~ bestCruises.paddingButtonRightLeftContent|default(14) ~ bestCruises.paddingButtonUnitContent|default('px'),
  17. 'color': bestCruises.colorButtonContent|default('#004461'),
  18. 'background-color': bestCruises.backgroundColorButtonContent|default('#FFFFFF'),
  19. 'border-radius': bestCruises.borderRadiusButtonContent|default(0.75) ~ bestCruises.borderRadiusButtonContentUnit|default('rem'),
  20. 'font-size': '16px',
  21. 'font-weight': '500',
  22. 'border': bestCruises.borderSizeButtonContent|default(1) ~ bestCruises.borderSizeButtonContentUnit|default('px') ~ ' solid ' ~ bestCruises.borderColorButtonContent|default('#F2F2F2'),
  23. } %}
  24. {% set conditionSettings = {
  25. 'color': bestCruises.textColorCards|default('#6C6C6C'),
  26. 'font-weight': bestCruises.textWeightCards|default(400),
  27. 'font-size': bestCruises.textSizeCards|default(0.875) ~ bestCruises.textSizeUnitCards|default('rem'),
  28. } %}
  29. {% set tags = bestCruises.tags|default('') %}
  30. {% set maxNumberCards = bestCruises.maxNumberCards|default(4) %}
  31. {% if true %}
  32. <section id="{{ bestCruisesId }}" class="best-cruises">
  33. {# En-tête avec titre et navigation #}
  34. <div class="best-cruises-head">
  35. <h2>
  36. <div class="icon">
  37. {{ getLucidIcon(attribute(bestCruises, 'pictogramTitleSection')|default('')) }}
  38. </div>
  39. {{ attribute(bestCruises, 'titleTextSection')|default('')|raw }}
  40. </h2>
  41. <div class="chevrons"></div>
  42. </div>
  43. {# Une seule card avec toutes les croisières #}
  44. <div class="slider">
  45. <div class="cards">
  46. <div class="card">
  47. {# Header avec les onglets de catégories #}
  48. <div class="card-header">
  49. <div class="card-navbar">
  50. {% for tab in bestCruises.tabs %}
  51. {% set top_offers_cruises = tab.isTopPromo|default(false) ? true : false %}
  52. {% set last_minutes_cruises = tab.isLastMinutes|default(false) ? true : false %}
  53. {% set tabFilters = [] %}
  54. {% for tag in tab.tags|default([]) %}
  55. {% if tag.tagId is defined %}
  56. {% set tabFilters = tabFilters|merge([tag.tagId]) %}
  57. {% endif %}
  58. {% endfor %}
  59. {% if top_offers_cruises == true %}
  60. {% set tabFilters = tabFilters|merge(['is_top_promos']) %}
  61. {% endif %}
  62. {% if last_minutes_cruises == true %}
  63. {% set tabFilters = tabFilters|merge(['is_last_minutes']) %}
  64. {% endif %}
  65. <button type="button" class="category-tab {{ loop.first ? 'active' : '' }}" data-tabs="{{ tabFilters|json_encode|e('html_attr') }}">
  66. {{ tab.tabName|default('default tab name') }}
  67. </button>
  68. {% endfor %}
  69. </div>
  70. </div>
  71. {# Contenu avec les croisières #}
  72. <div class="card-content" style="gap: var(--card-spacing, 12px);">
  73. {# Preloader affiché pendant le chargement (même nombre que les vraies cards avec data-tag-id) #}
  74. <div id="{{ bestCruisesId }}-preloader" class="sub-cards sub-cards-preloader">
  75. <div class="sub-card preload-card-wrapper">
  76. {% include "pages/_includes/preloaders/includes/_preload-card.html.twig" %}
  77. </div>
  78. </div>
  79. <div class="sub-cards sub-cards-grid" style="display: none;">
  80. {% for tab in bestCruises.tabs %}
  81. {% for tag in tab.tags|default([]) %}
  82. {% if tag.tagId is defined %}
  83. {% set tagItem = getTagById(tag.tagId) %}
  84. {% if tagItem %}
  85. {% for tagCruise in tagItem.tagCruises|shuffle|slice(0, maxNumberCards) %}
  86. {% set cruise = tagCruise.cruise %}
  87. {% if cruise %}
  88. {% include '_snippets/components/cards/mini_card.html.twig' with {
  89. cruise: cruise,
  90. isPriorityLoad: true,
  91. categoryTagId: tagItem.id
  92. } only %}
  93. {% endif %}
  94. {% endfor %}
  95. {% endif %}
  96. {% endif %}
  97. {% endfor %}
  98. {% endfor %}
  99. </div>
  100. </div>
  101. </div>
  102. </div>
  103. </div>
  104. </section>
  105. {% endif %}
  106. {# Le JavaScript des offres est maintenant géré par assets/website/js/snippets/best-cruises.js #}
  107. <!-- Variables CSS dynamiques -->
  108. <!-- prettier-ignore -->
  109. <style>
  110. #{{ bestCruisesId }} {
  111. /* Padding section */
  112. --padding-left-section: {{ bestCruises.paddingLeftRightSection|default(1.125) ~ bestCruises.paddingUnitSection|default('rem') }};
  113. --padding-right-left-cards-content-mobile: {{ bestCruises.paddingRightLeftCardsContentMobile|default(0) ~ bestCruises.paddingUnitCardsContentMobile|default('px') }};
  114. --padding-top-bottom-cards-content-mobile: {{ bestCruises.paddingTopBottomCardsContentMobile|default(0) ~ bestCruises.paddingUnitCardsContentMobile|default('px') }};
  115. /* Espacements */
  116. --card-spacing: {{ bestCruises.gapCards|default(12) ~ bestCruises.gapUnitCards|default('px') }};
  117. /* Card dimensions */
  118. /* --card-min-width: {{ bestCruises.widthCards|default(34) ~ bestCruises.widthUnitCards|default('rem') }}; */
  119. --card-border-radius: {{ bestCruises.borderRadiusCards|default(1.125) ~ bestCruises.borderRadiusUnitCards|default('rem') }};
  120. --card-image-height: {{ bestCruises.imageHeightCards|default(9) ~ bestCruises.imageHeightCardsUnit|default('rem') }};
  121. --card-padding: {{ bestCruises.paddingTopBottomCards|default(6) ~ bestCruises.paddingUnitCards|default('px') }} {{ bestCruises.paddingRightLeftCards|default(6) ~ bestCruises.paddingUnitCards|default('px') }};
  122. /* Typography - Title */
  123. --title-font-size: {{ bestCruises.titleSizeCards|default(1.125) ~ bestCruises.titleSizeUnitCards|default('rem') }};
  124. --title-font-weight: {{ bestCruises.titleWeightCards|default(500) }};
  125. --title-color: {{ bestCruises.titleColorCards|default('#1D1D1D') }};
  126. /* Typography - Text */
  127. --text-color: {{ bestCruises.textColorCards|default('#6C6C6C') }};
  128. --text-font-size: {{ bestCruises.textSizeCards|default(0.875) ~ bestCruises.textSizeUnitCards|default('rem') }};
  129. --text-font-weight: {{ bestCruises.textWeightCards|default(400) }};
  130. --icon-width: {{ bestCruises.textSizeCards|default(0.875) * 0.85 ~ bestCruises.textSizeUnitCards|default('rem') }};
  131. /* Typography - Price */
  132. --price-color: {{ bestCruises.priceColorCards|default('#FF5C00') }};
  133. --price-font-size: {{ bestCruises.priceSizeCards|default(1.25) ~ bestCruises.priceSizeUnitCards|default('rem') }};
  134. --price-font-weight: {{ bestCruises.priceWeightCards|default(700) }};
  135. /* Button */
  136. --button-padding: {{ bestCruises.paddingButtonTopBottomContent|default(14) ~ bestCruises.paddingButtonUnitContent|default('px') }} {{ bestCruises.paddingButtonRightLeftContent|default(14) ~ bestCruises.paddingButtonUnitContent|default('px') }};
  137. --button-color: {{ bestCruises.colorButtonContent|default('#004461') }};
  138. --button-bg-color: {{ bestCruises.backgroundColorButtonContent|default('#FFFFFF') }};
  139. --button-border-radius: {{ bestCruises.borderRadiusButtonContent|default(0.75) ~ bestCruises.borderRadiusButtonContentUnit|default('rem') }};
  140. --button-border: {{ bestCruises.borderSizeButtonContent|default(1) ~ bestCruises.borderSizeButtonContentUnit|default('px') }} solid {{ bestCruises.borderColorButtonContent|default('#F2F2F2') }};
  141. }
  142. </style>
  143. {# Le JavaScript du carousel et la gestion du preloader sont dans assets/website/js/snippets/best-cruises.js #}