{% set shipEntityLabel = cruise.ship.name|default(cruise.ship.title|default('')) %}{% set shipPool = [] %}{% for media in shipMedias|default([]) %}{% if media.extension|default('')|lower != 'link' and (media.cdnUrl is not empty or media.url is not empty) %}{% set shipPool = shipPool|merge([media]) %}{% endif %}{% endfor %}{# Index media → escale (même jeu que stopoversMedias côté visionneuse) #}{% set stopoverEntityLabels = {} %}{% for stopover in getCruiseStopovers(cruise)|default([]) %}{% set stopoverEntityLabel = stopover.name|default(stopover.title|default('')) %}{% for media in crea_media_get_medias([], stopover)|default([]) %}{% if media.id is defined and media.id is not null %}{% set stopoverEntityLabels = stopoverEntityLabels|merge({ (media.id ~ ''): stopoverEntityLabel }) %}{% endif %}{% set labelMediaPath = media.cdnUrl|default(media.url|default('')) %}{% if labelMediaPath is not empty %}{% set stopoverEntityLabels = stopoverEntityLabels|merge({ (labelMediaPath): stopoverEntityLabel }) %}{% endif %}{% endfor %}{% endfor %}{% set stopoverImages = [] %}{% for media in stopoversMedias|default([]) %}{% if media.extension|default('')|lower != 'link' and (media.cdnUrl is not empty or media.url is not empty) %}{% set mediaPath = media.cdnUrl|default(media.url|default('')) %}{% set mediaId = media.id|default(null) %}{% set entityLabel = mediaId ? attribute(stopoverEntityLabels, mediaId ~ '')|default('') : '' %}{% if entityLabel is empty %}{% set entityLabel = attribute(stopoverEntityLabels, mediaPath)|default('') %}{% endif %}{% set stopoverImages = stopoverImages|merge([{id: mediaId,path: mediaPath,alt: media.title|default(entityLabel)|default('Image escale'),entityLabel: entityLabel,}]) %}{% endif %}{% endfor %}{% set cabinPool = [] %}{% for media in shipPool %}{% set hasBoardingLifeTag = false %}{% for mediaTag in media.tags|default([]) %}{% set tagName = mediaTag.name|default(mediaTag.slug|default(mediaTag|default('')))|lower %}{% if tagName == 'boarding_life' %}{% set hasBoardingLifeTag = true %}{% endif %}{% endfor %}{% if hasBoardingLifeTag %}{% set cabinPool = cabinPool|merge([media]) %}{% endif %}{% endfor %}{% set gallery = {} %}{% if shipPool is not empty %}{% set shipImages = [] %}{% for media in shipPool %}{% set mediaPath = media.cdnUrl|default(media.url|default('')) %}{% set shipImages = shipImages|merge([{id: media.id|default(null),path: mediaPath,alt: media.title|default(shipEntityLabel)|default('Image navire'),entityLabel: shipEntityLabel,}]) %}{% endfor %}{% set gallery = gallery|merge({ship: {tab: 'Navire',count: shipImages|length,images: shipImages}}) %}{% endif %}{% if stopoverImages is not empty %}{% set gallery = gallery|merge({stopovers: {tab: 'Escales',count: stopoverImages|length,images: stopoverImages}}) %}{% endif %}{% if cabinPool is not empty %}{% set cabinImages = [] %}{% for media in cabinPool %}{% set mediaPath = media.cdnUrl|default(media.url|default('')) %}{% set cabinImages = cabinImages|merge([{id: media.id|default(null),path: mediaPath,alt: media.title|default(shipEntityLabel)|default('Image cabine'),entityLabel: shipEntityLabel,}]) %}{% endfor %}{% set gallery = gallery|merge({cabin: {tab: 'Cabine',count: cabinImages|length,images: cabinImages}}) %}{% endif %}<div id="box-viewer" role="dialog" aria-modal="true"><div class="modale-inner"><nav><div class="modale-title text-lg-sbd color-secondary-dark"><div>{{ getLucidIcon('grip-vertical') }}{{ 'details.gallery.title'|trans }} :{{ getCruiseName(cruise)|default('') }}</div>{% include 'pages/_includes/modals/_modale_closer.html.twig' with { closer_id: 'close-gallery' } %}</div></nav><div class="box"><div class="navbar"><ul>{% for key, category in gallery %}{% if category.tab is defined %}<li class="text-sm"><button class="gallery-tab br1 text-sm-{% if loop.first %}bd active {% else %}rg{% endif %}" data-category="{{ key }}" data-count="{{ category.count|default(0) }}">{{ category.tab }}{% if category.count|default(0) > 0 and key != 'map' %}({{ category.count }}){% endif %}</button></li>{% endif %}{% endfor %}</ul></div><div class="carousel-wrapper" id="gallery-carousel-wrapper"><div class="carousel-container"><div class="carousel" id="gallery-carousel"></div></div><button class="carousel-arrow left" aria-label="{{ 'common.previous'|trans }}">{{ getLucidIcon('chevron-left') }}</button><button class="carousel-arrow right" aria-label="{{ 'common.next'|trans }}">{{ getLucidIcon('chevron-right') }}</button></div><div id="gallery-map-container" style="display: none;"><div id="gallery-map" class="leaflet-map" style="height: 100%; width: 100%;"></div></div><div class="carousel-thumbnails" id="gallery-thumbnails"></div></div></div></div><script type="application/json" data-gallery>{{ gallery|json_encode|raw }}</script>