{# ------------------------------------------------------------------------ #}{# ----------------------------- PARAMÉTRAGES ----------------------------- #}{# ------------------------------------------------------------------------ #}{% set effectiveSectionSettings = showSectionSettings|default(true) ? sectionSettings|default({}) : {} %}{% set content = effectiveSectionSettings|merge(bestSellers) %}{% set bestSellers = content %}{% set bestSellersId = 'best_sellers-' ~ random() %}{% set tag = getTagById(bestSellers.CommonTagSelector|default(0))%}{% include '_snippets/sections/cards_section_settings.html.twig' with {'content': content,'id': bestSellersId,} %}{% if bestSellers.companiesBlocks is not empty %}<sectionid="{{ bestSellersId }}" class="best-sellers"> {# En-tête avec titre et navigation #}<div class="best-sellers-head"><h2><div class="icon">{{ getLucidIcon(attribute(bestSellers, 'pictogramTitleSection')|default('')) }}</div>{{ attribute(bestSellers, 'titleTextSection')|default('')|raw }}</h2><div class="chevrons"></div></div>{# Carousel des super cards (1 card = 1 compagnie) #}<div class="slider"><div class="cards">{% for companyData in bestSellers.companiesBlocks %}{% if companyData.CommonCompanySelector is defined %}{% set company = getCompanyById(companyData.CommonCompanySelector|default(0)) %}{% set cruises = searchCruises([company, tag], 3, true) %}{% set gradientStartRgb = companyData.companyColorStart|default('') ? (companyData.companyColorStart|hex_to_rgb|join(', ')) : '0, 12, 37' %}{% set gradientEndRgb = companyData.companyColorEnd|default('') ? (companyData.companyColorEnd|hex_to_rgb|join(', ')) : '0, 0, 0' %}{% set gradientStartOpacity = companyData.companyColorStartOpacity|default(1) %}{% set gradientEndOpacity = companyData.companyColorEndOpacity|default(0) %}{% set previewCruise = cruises|first %}{% set headerImageUrl = (previewCruise and previewCruise.ship is defined and crea_media_get_media(['main'], previewCruise.ship)) ? crea_media_get_media(['main'], previewCruise.ship).cdnUrl : '/img/photos-temporaires/placeholder-image-offer.jpg' %}<divclass="card" data-company-name="{{ company.name|default('Compagnie') }}">{# Header de la card avec image de fond et logo de la compagnie #}<div class="card-header" style="background-image: url('{{ crea_media_get_media(['banner'], company).cdnUrl|default('/img/photos-temporaires/placeholder-image-offer.jpg') }}'); --gradient-start: {{ gradientStartRgb }}; --gradient-start-opacity: {{ gradientStartOpacity }}; --gradient-end: {{ gradientEndRgb }}; --gradient-end-opacity: {{ gradientEndOpacity }};"><div class="company-logo"><img src="{{ crea_media_get_media(['logo'], company).cdnUrl|default('/img/placeholder-company.svg') }}" alt="{{ 'common.company'|trans }} {{ company.name|default('Compagnie') }}"></div></div>{# Contenu de la card avec les sous-cards (croisières) #}<divclass="card-content">{# Preloader affiché pendant le chargement (même nombre que les vraies cards) #}<div id="{{ bestSellersId }}-preloader-{{ loop.index }}" class="sub-cards sub-cards-preloader">{% for cruise in cruises %}{% include "pages/_includes/preloaders/includes/_preload-card.html.twig" %}{% endfor %}</div>{# Sub-cards réelles (cachées au début) #}<div class="sub-cards" style="display: none;">{% for cruise in cruises %}{% include '_snippets/components/cards/mini_card.html.twig' with {cruise: cruise,isPriorityLoad: true,isCompanyLogo: false,isFavorite: false,} only %}{% endfor %}</div></div>{# Footer de la card #}<div class="card-footer button-container"><a href="{{ getCruiseSearchUrl([company]) }}" class="company-link">{% set buttonText = bestSellers.textButtonContent|default('snippets.offers.see_all'|trans) %}{% set buttonText = buttonText|replace({'%company_slug%': company.slug|default(''), '%company_name%': company.name|default('Company'), '%company_id%': company.id|default('')}) %}{{ buttonText }}</a></div></div>{% endif %}{% endfor %}</div></div></section>{% endif %}{# Le JavaScript des offres est maintenant géré par assets/website/js/snippets/best-sellers.js #}<!-- Variables CSS dynamiques --><!-- prettier-ignore --><style>#{{ bestSellersId }}{/* Padding section */--padding-left-section: {{bestSellers.paddingLeftRightSection|default(1.125) ~ bestSellers.paddingUnitSection|default('rem')}};/* Card dimensions */--card-min-width: {{bestSellers.widthCards|default(34) ~ bestSellers.widthUnitCards|default('rem')}};--card-border-radius: {{bestSellers.borderRadiusCards|default(1.125) ~ bestSellers.borderRadiusUnitCards|default('rem')}};--card-image-height: {{bestSellers.imageHeightCards|default(9) ~ bestSellers.imageHeightCardsUnit|default('rem')}};--card-padding: {{bestSellers.paddingTopBottomCards|default(6) ~ bestSellers.paddingUnitCards|default('px')}}{{bestSellers.paddingRightLeftCards|default(6) ~ bestSellers.paddingUnitCards|default('px')}};/* Typography - Title */--title-font-size: {{bestSellers.titleSizeCards|default(1.125) ~ bestSellers.titleSizeUnitCards|default('rem')}};--title-font-weight: {{bestSellers.titleWeightCards|default(500)}};--title-color: {{bestSellers.titleColorCards|default('#1D1D1D')}};/* Typography - Text */--text-color: {{bestSellers.textColorCards|default('#6C6C6C')}};--text-font-size: {{bestSellers.textSizeCards|default(0.875) ~ bestSellers.textSizeUnitCards|default('rem')}};--text-font-weight: {{bestSellers.textWeightCards|default(400)}};--icon-width: {{bestSellers.textSizeCards|default(0.875) * 0.85 ~ bestSellers.textSizeUnitCards|default('rem')}};/* Typography - Price */--price-color: {{bestSellers.priceColorCards|default('#FF5C00')}};--price-font-size: {{bestSellers.priceSizeCards|default(1.25) ~ bestSellers.priceSizeUnitCards|default('rem')}};--price-font-weight: {{bestSellers.priceWeightCards|default(700)}};/* Button */--button-padding: {{bestSellers.paddingButtonTopBottomContent|default(14) ~ bestSellers.paddingButtonUnitContent|default('px')}}{{bestSellers.paddingButtonRightLeftContent|default(14) ~ bestSellers.paddingButtonUnitContent|default('px')}};--button-color: {{bestSellers.colorButtonContent|default('#004461')}};--button-bg-color: {{bestSellers.backgroundColorButtonContent|default('#FFFFFF')}};--button-border-radius: {{bestSellers.borderRadiusButtonContent|default(0.75) ~ bestSellers.borderRadiusButtonContentUnit|default('rem')}};--button-border: {{bestSellers.borderSizeButtonContent|default(1) ~ bestSellers.borderSizeButtonContentUnit|default('px')}} solid{{bestSellers.borderColorButtonContent|default('#F2F2F2')}};}</style>{# Le JavaScript du carousel est chargé automatiquement via assets/website/js/snippets/best-sellers.js #}