{# ------------------------------------------------------------------------ #}{# ----------------------------- PARAMÉTRAGES ----------------------------- #}{# ------------------------------------------------------------------------ #}{% set effectiveSectionSettings = showSectionSettings|default(true) ? sectionSettings|default({}) : {} %}{% set content = effectiveSectionSettings|merge(bestCruises) %}{% set bestCruises = content %}{% set bestCruisesId = 'best_cruises-' ~ random() %}{# Filtrage des croisières par date de départ (on n'affiche que celles qui ont commencé) #}{% set currentDate = 'now'|date('Y-m-d') %}{% include '_snippets/sections/cards_section_settings.html.twig' with {'content': content,'id': bestCruisesId,} %}{# Paramètres spécifiques à ce fragment #}{% set buttonSettings = {'padding': bestCruises.paddingButtonTopBottomContent|default(14) ~ bestCruises.paddingButtonUnitContent|default('px') ~ ' ' ~ bestCruises.paddingButtonRightLeftContent|default(14) ~ bestCruises.paddingButtonUnitContent|default('px'),'color': bestCruises.colorButtonContent|default('#004461'),'background-color': bestCruises.backgroundColorButtonContent|default('#FFFFFF'),'border-radius': bestCruises.borderRadiusButtonContent|default(0.75) ~ bestCruises.borderRadiusButtonContentUnit|default('rem'),'font-size': '16px','font-weight': '500','border': bestCruises.borderSizeButtonContent|default(1) ~ bestCruises.borderSizeButtonContentUnit|default('px') ~ ' solid ' ~ bestCruises.borderColorButtonContent|default('#F2F2F2'),} %}{% set conditionSettings = {'color': bestCruises.textColorCards|default('#6C6C6C'),'font-weight': bestCruises.textWeightCards|default(400),'font-size': bestCruises.textSizeCards|default(0.875) ~ bestCruises.textSizeUnitCards|default('rem'),} %}{% set tags = bestCruises.tags|default('') %}{% set maxNumberCards = bestCruises.maxNumberCards|default(4) %}{% if true %}<section id="{{ bestCruisesId }}" class="best-cruises">{# En-tête avec titre et navigation #}<div class="best-cruises-head"><h2><div class="icon">{{ getLucidIcon(attribute(bestCruises, 'pictogramTitleSection')|default('')) }}</div>{{ attribute(bestCruises, 'titleTextSection')|default('')|raw }}</h2><div class="chevrons"></div></div>{# Une seule card avec toutes les croisières #}<div class="slider"><div class="cards"><div class="card">{# Header avec les onglets de catégories #}<div class="card-header"><div class="card-navbar">{% for tab in bestCruises.tabs %}{% set top_offers_cruises = tab.isTopPromo|default(false) ? true : false %}{% set last_minutes_cruises = tab.isLastMinutes|default(false) ? true : false %}{% set tabFilters = [] %}{% for tag in tab.tags|default([]) %}{% if tag.tagId is defined %}{% set tabFilters = tabFilters|merge([tag.tagId]) %}{% endif %}{% endfor %}{% if top_offers_cruises == true %}{% set tabFilters = tabFilters|merge(['is_top_promos']) %}{% endif %}{% if last_minutes_cruises == true %}{% set tabFilters = tabFilters|merge(['is_last_minutes']) %}{% endif %}<button type="button" class="category-tab {{ loop.first ? 'active' : '' }}" data-tabs="{{ tabFilters|json_encode|e('html_attr') }}">{{ tab.tabName|default('default tab name') }}</button>{% endfor %}</div></div>{# Contenu avec les croisières #}<div class="card-content" style="gap: var(--card-spacing, 12px);">{# Preloader affiché pendant le chargement (même nombre que les vraies cards avec data-tag-id) #}<div id="{{ bestCruisesId }}-preloader" class="sub-cards sub-cards-preloader"><div class="sub-card preload-card-wrapper">{% include "pages/_includes/preloaders/includes/_preload-card.html.twig" %}</div></div><div class="sub-cards sub-cards-grid" style="display: none;">{% for tab in bestCruises.tabs %}{% for tag in tab.tags|default([]) %}{% if tag.tagId is defined %}{% set tagItem = getTagById(tag.tagId) %}{% if tagItem %}{% for tagCruise in tagItem.tagCruises|shuffle|slice(0, maxNumberCards) %}{% set cruise = tagCruise.cruise %}{% if cruise %}{% include '_snippets/components/cards/mini_card.html.twig' with {cruise: cruise,isPriorityLoad: true,categoryTagId: tagItem.id} only %}{% endif %}{% endfor %}{% endif %}{% endif %}{% endfor %}{% endfor %}</div></div></div></div></div></section>{% endif %}{# Le JavaScript des offres est maintenant géré par assets/website/js/snippets/best-cruises.js #}<!-- Variables CSS dynamiques --><!-- prettier-ignore --><style>#{{ bestCruisesId }} {/* Padding section */--padding-left-section: {{ bestCruises.paddingLeftRightSection|default(1.125) ~ bestCruises.paddingUnitSection|default('rem') }};--padding-right-left-cards-content-mobile: {{ bestCruises.paddingRightLeftCardsContentMobile|default(0) ~ bestCruises.paddingUnitCardsContentMobile|default('px') }};--padding-top-bottom-cards-content-mobile: {{ bestCruises.paddingTopBottomCardsContentMobile|default(0) ~ bestCruises.paddingUnitCardsContentMobile|default('px') }};/* Espacements */--card-spacing: {{ bestCruises.gapCards|default(12) ~ bestCruises.gapUnitCards|default('px') }};/* Card dimensions *//* --card-min-width: {{ bestCruises.widthCards|default(34) ~ bestCruises.widthUnitCards|default('rem') }}; */--card-border-radius: {{ bestCruises.borderRadiusCards|default(1.125) ~ bestCruises.borderRadiusUnitCards|default('rem') }};--card-image-height: {{ bestCruises.imageHeightCards|default(9) ~ bestCruises.imageHeightCardsUnit|default('rem') }};--card-padding: {{ bestCruises.paddingTopBottomCards|default(6) ~ bestCruises.paddingUnitCards|default('px') }} {{ bestCruises.paddingRightLeftCards|default(6) ~ bestCruises.paddingUnitCards|default('px') }};/* Typography - Title */--title-font-size: {{ bestCruises.titleSizeCards|default(1.125) ~ bestCruises.titleSizeUnitCards|default('rem') }};--title-font-weight: {{ bestCruises.titleWeightCards|default(500) }};--title-color: {{ bestCruises.titleColorCards|default('#1D1D1D') }};/* Typography - Text */--text-color: {{ bestCruises.textColorCards|default('#6C6C6C') }};--text-font-size: {{ bestCruises.textSizeCards|default(0.875) ~ bestCruises.textSizeUnitCards|default('rem') }};--text-font-weight: {{ bestCruises.textWeightCards|default(400) }};--icon-width: {{ bestCruises.textSizeCards|default(0.875) * 0.85 ~ bestCruises.textSizeUnitCards|default('rem') }};/* Typography - Price */--price-color: {{ bestCruises.priceColorCards|default('#FF5C00') }};--price-font-size: {{ bestCruises.priceSizeCards|default(1.25) ~ bestCruises.priceSizeUnitCards|default('rem') }};--price-font-weight: {{ bestCruises.priceWeightCards|default(700) }};/* Button */--button-padding: {{ bestCruises.paddingButtonTopBottomContent|default(14) ~ bestCruises.paddingButtonUnitContent|default('px') }} {{ bestCruises.paddingButtonRightLeftContent|default(14) ~ bestCruises.paddingButtonUnitContent|default('px') }};--button-color: {{ bestCruises.colorButtonContent|default('#004461') }};--button-bg-color: {{ bestCruises.backgroundColorButtonContent|default('#FFFFFF') }};--button-border-radius: {{ bestCruises.borderRadiusButtonContent|default(0.75) ~ bestCruises.borderRadiusButtonContentUnit|default('rem') }};--button-border: {{ bestCruises.borderSizeButtonContent|default(1) ~ bestCruises.borderSizeButtonContentUnit|default('px') }} solid {{ bestCruises.borderColorButtonContent|default('#F2F2F2') }};}</style>{# Le JavaScript du carousel et la gestion du preloader sont dans assets/website/js/snippets/best-cruises.js #}