{% extends 'FrontBundle/layout.html.twig' %}
{% block title %}{{ app_sitename }} - {{ page.metaTitle }}{% endblock %}
{% block description %}{{ page.metaDescription }}{% endblock %}
{% block extra_class %}stack{% endblock %}
{% block sub_header %}
<div class="sub-header anchor">
<ul>
<li><a href="#concerts">{{ 'menu_concerts'|tr(tr)|raw }}</a></li>
<li><a href="#noel">{{ 'menu_noel'|tr(tr)|raw }}</a></li>
<li><a href="#evenements">{{ 'menu_evenements'|tr(tr)|raw }}</a></li>
</ul>
</div>
{% endblock %}
{% block stylesheets %}
<link href="/front/css/owl.carousel.min.css" rel="stylesheet">
<link href="/front/css/owl.theme.default.min.css" rel="stylesheet">
<link href="/plugins/photoswipe/photoswipe.css" rel="stylesheet">
<link href="/plugins/photoswipe/default-skin/default-skin.css" rel="stylesheet" type="text/css"/>
<link href="/front/css/carousel.css" rel="stylesheet">
<style>
.espace-content h2 {
font-size: 28px;
}
.pointer-event-none{
pointer-events: none !important;
font-size: 15px;
text-transform: uppercase;
border-radius: 20px;
transition: 0.3s ease;
color: var(--purple);
border: 1px solid var(--purple);
text-decoration: none;
padding: 8px 16px;
width: max-content;
opacity: 0.5;
float: left;
}
span.name-title{
font-size: 17px;
letter-spacing: 3px;
width: 80%;
text-align: left;
display: block;
text-transform: uppercase;
color: #1A1A1A;
font-weight: 600;
}
.page_spectacles-speciaux .concerts .description .desc {
font-size: 14px;
}
strong.head {
font-size: 18px;
font-style: italic;
}
@media screen and (min-width: 1200px) {
.page_spectacles-speciaux .evenements .description {
font-size: 15px;
line-height: 20px;
color: #707070;
padding-left: calc(var(--bs-gutter-x)* .5* 2);
display: flex;
flex-direction: column;
justify-content: center;
height: 100%;
align-items: center;
}
/**
Ppur la gestion de la modale du menu
*/
.span-custom {
display: flex !important;
justify-content: center !important;
}
li.custom-liste {
text-align: center !important;
font-size: 13px;
}
li.custom-liste .boisson{
font-style: italic;
color: var(--gold);
}
.space-modale {
margin-left: 5.5rem !important;
}
.space-modale2 {
margin-left: 7.3rem !important;
}
@media screen and (max-width: 450px) {
li.custom-liste {
font-size: 0.85rem !important;
text-align: center;
}
.space-modale h1 {
font-size: 1rem !important;
}
.space-modale {
margin-left: 3.5rem !important;
}
.space-modale2 {
margin-left: 2.5rem !important;
}
}
/**
fin
*/
</style>
{% endblock %}
{% block body %}
{% include 'FrontBundle/Partial/calendar.html.twig' %}
<section class="espace-content full" id="concerts" style="margin-top: 160px;">
<div class="content">
<h1>{{ 'spectacle_h1'|tr(tr)|upper|raw }}</h1>
<h2 class="mb-5 mt-5">{{ 'menu_concerts'|tr(tr)|upper|raw }}</h2>
<p class="p-0">{{ 'concert_title'|tr(tr)|raw }}</p>
</div>
</section>
<section class="concerts slider p-0 mt-5 mb-5">
<div class="content">
<div class="p-0 row">
{% set deadline = "2030-10-31 21:00:00" %}
{% set current = "now" | date("Y-m-d H:i:s") %}
{% set oktoberfest_added = false %}
{% for concert in concerts %}
{% if concert.concert is not null and concert.start.timestamp > date().timestamp %}
<div class="item col-md-6">
<div class="row mb-5">
<div class="col-6 auto">
<img alt="concert" class="cover" src="{{ concert.concert.thumbnail }}" />
<a href="#" class="order red load-event {{ (concert.isfull) ? 'btn-isfull' : '' }}" data-id="{{ concert.id }}">
{{ (concert.isfull) ? 'general_full'|tr(tr)|upper|raw : 'general_reserver'|tr(tr)|upper|raw }}
</a>
</div>
<div class="col-6">
<div class="description">
<span class="name-title"><span>{{ concert.concert.titleLocale(app.request.locale) }}</span></span>
{% if app.request.locale == 'de' %}
<p>{{ concert.strStartDe }}</p>
{% elseif app.request.locale == 'en' %}
<p>{{ concert.strStartEn }}</p>
{% else %}
<p>{{ concert.strStart }}</p>
{% endif %}
<hr>
<p class="desc mb-3">{{ concert.concert.description(app.request.locale)|replace({'Animation:':'<br><br>Animation:','Entertainment:':'<br><br>Entertainment:'})|raw }}</p>
<span class="price">{{ 'menus_tarifs_spectacle_pn'|tr(tr)|ucfirst|raw }} : {{ concert.concert.info('pn') }} €*</span>
<span class="price premium">{{ 'menus_tarifs_spectacle_ph'|tr(tr)|ucfirst|raw }} : {{ concert.concert.info('ph') }} €*</span>
<span class="price purple">{{ 'menus_tarifs_spectacle_vip'|tr(tr)|ucfirst|raw }} : {{ concert.concert.info('vip') }} €*</span>
<p class="desc mt-3">*{{ 'menus_tarifs_horsrepas'|tr(tr)|raw }}</p>
{% if concert.id == 1672 %}
<p class="desc mb-3">{{ 'concert_food3'|tr(tr)|raw }}</p>
{% else %}
<p class="desc mb-3">{{ (concert.venueType.food) ? 'concert_food'|tr(tr)|raw : 'concert_nofood'|tr(tr)|raw }}</p>
{% endif %}
</div>
</div>
</div>
</div>
{% if loop.index == 8 and current <= deadline %}
<!-- Pour Oktoberfest -->
<div class="item col-md-6">
<div class="row mb-5">
<div class="col-6 auto">
<img alt="concert" class="cover" src="{{ asset('front/img/evenements-2024/oktoberfest-min.jpg') }}" />
<a href="#" class="order red load-event" data-id="1439">
{{ 'general_reserver'|tr(tr)|upper|raw }}
</a>
</div>
<div class="col-6">
<div class="description">
<span class="name-title"><span>OKTOBERFEST</span></span>
{% if app.request.locale == 'de' %}
<p>Donnerstag, 31. Oktober 2024 / 21h </p>
{% elseif app.request.locale == 'en' %}
<p>Thursday 31 October 2024 / 21h</p>
{% else %}
<p>Jeudi 31 Octobre 2024 / 21h</p>
{% endif %}
<hr>
<p class="desc mb-3">{{ 'events_2024_spe'|tr(tr)|raw }}</p>
<p class="desc mt-3">*{{ 'menus_tarifs_horsrepas'|tr(tr)|raw }}</p>
<p class="desc mb-3">{{ 'concert_food2'|tr(tr)|raw }}</p>
</div>
</div>
</div>
</div>
{% set oktoberfest_added = true %}
{% endif %}
{% endif %}
{% endfor %}
<div class="item row">
<div class="col-6 auto">
</div>
<div class="col-6">
<div class="description">
</div>
</div>
</div>
</div>
</div>
</section>
<section class="noel slider pt-5 mt-5" id="noel" style="padding-bottom: 110px;">
<div class="content pt-5 mt-5 pb-5">
<div class="row">
<div class="col-md-4">{#
{% if app.request.locale == 'de' %}
<img src="/front/img/spectacle-noel-2023-de.jpg" width="100%" alt="noel" />
{% else %}
<img src="/front/img/spectacle-noel-2023.jpg" width="100%" alt="noel" />
{% endif %} #}
<img src="{{ asset('/front/img/2025/spectacle-enfants.jpg') }}" width="100%" alt="spectacle enfants" />
</div>
<div class="col-md-7 offset-md-1">
<p class="title">{{ 'spectacle_enfant'|tr(tr)|raw }}</p>
<p class="subtitle pt-5">{{ 'spectacle_enfant_subtitle'|tr(tr)|raw }}</p>
<p class="description">{{ 'spectacle_enfant_desc'|tr(tr)|raw }}</p>
<div class="d-flex flex-column justify-content-between gap-1 w-125px flex-md-row">
{# <a href="/{{app.request.locale}}/housh-ma-housh" class="pointer-event-none">{{ 'reser_event_home'|tr(tr)|upper|raw }}</a> #}
<a href="#" class="cal open-cal" data-date="{{ 'now'|date('Y') }}-{{ ('now'|date('m')|number_format == 12) ? '12' : '11' }}-01">{{ 'general_reserver2'|tr(tr)|upper|raw }}</a>
{# <button class="cal rounded-5" data-bs-toggle="modal" data-bs-target="#menu-child">{{ 'voir_le_menu'|tr(tr)|upper|raw }}</button> #}
</div>
</div>
</div>
</div>
</section>
<section class="espace-content full mt-5 pt-5" id="evenements">
<div class="content">
<h2 class="mb-5">{{ 'menu_evenements'|tr(tr)|upper|raw }}</h2>
<p class="p-0">{{ 'events_title'|tr(tr)|raw }}</p>
</div>
</section>
<section class="evenements slider p-0 mt-5 mb-5">
<div class="content">
<div class="row p-0">
{# <div class="item col-md-6 mb-5">
<div class="row">
<div class="col-6 auto">
<span class="name">{{ 'events_e1_title'|tr(tr)|upper|raw }}</span>
<img alt="event" class="cover" src="/front/img/spectacle-event2.jpg" />
<a href="#" class="order purple open-cal" data-date="{{ 'now'|date('Y') }}-12-01">{{ 'general_reserver'|tr(tr)|upper|raw }}</a>
</div>
<div class="col-6">
<div class="description">
{{ 'events_e1'|tr(tr)|raw }}
</div>
</div>
</div>
</div> #}
<div class="item col-md-6 mb-5">
<div class="row">
<div class="col-6 auto">
<span class="name">{{ 'events_2024_e2_title'|tr(tr)|upper|raw }}</span>
<img alt="event" class="cover" src="{{ asset('front/img/2025/oktoberfest.png') }}" />
<a href="#" class="order purple link load-event" data-id="1946">
{{ 'general_reserver'|tr(tr)|raw }}
</a>
</div>
<div class="col-6">
<div class="description">
{{ 'events_2024_e2'|tr(tr)|raw }}
</div>
</div>
</div>
</div>
<div class="item col-md-6 mb-5">
<div class="row">
<div class="col-6 auto">
<span class="name">Noël D'or</span>
<img alt="event" class="cover" src="{{ asset('front/img/2025/noel-or.jpg') }}" />
<a href="#" class="order purple open-cal" data-date="2025-11-01">{{ 'general_reserver'|tr(tr)|upper|raw }}</a>
</div>
<div class="col-6">
<div class="description">
{{ 'events_noel'|tr(tr)|raw }}
</div>
</div>
</div>
</div>
<div class="item col-md-12 mb-5 py-5">
<div class="row">
<div class="col-md-3 auto">
<span class="name">{{ 'events_e1_title'|tr(tr)|upper|raw }}</span>
<img alt="event" class="cover" src="{{ asset('front/img/evenements-2024/st-sylvestre.jpg') }}" />
<a href="#" class="order purple open-cal" data-date="2025-12-31">{{ 'general_reserver'|tr(tr)|upper|raw }}</a>
</div>
<div class="col-md-9 row">
<div class=" col-md-6">
<div class="description">
{{ 'events_2024_e3_gala'|tr(tr)|raw }}
</div>
</div>
<div class=" col-md-6">
<div class="description">
{{ 'events_2024_e3_loung'|tr(tr)|raw }}
</div>
</div>
</div>
</div>
</div>
<div class="item col-md-6 mb-5">
<div class="row">
<div class="col-6 auto">
<span class="name">{{ 'events_2024_e1_title'|tr(tr)|upper|raw }}</span>
<img alt="event" class="cover" src="{{ asset('front/img/evenements-2024/st-valentin.jpg') }}" />
<a href="#" class="order purple open-cal" data-date="2026-02-13">{{ 'general_reserver'|tr(tr)|upper|raw }}</a>
</div>
<div class="col-6">
<div class="description">
{{ 'events_2024_e1'|tr(tr)|raw }}
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- Modale pour le menu père noel -->
<div class="modal fade" id="menu-child" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="MenuChildLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered">
<div class="modal-content border-3">
<div class="modal-header border-bottom-0">
<div class="d-flex justify-content-end space-modale">
<h1 class="modal-title fs-5 " id="MenuChildLabel"> {{ 'menu_noel_enfant_title'|tr(tr)|raw }}</h1>
</div>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div class="d-flex justify-content-center mt-2">
{{ 'menu_noel_enfant_content'|tr(tr)|raw }}
</div>
</div>
</div>
</div>
</div>
<!-- fin de la modale -->
<!-- Modale pour le menu saint-sylvestre --->
<div class="modal fade" id="menu-saint-sylvestre" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="MenuSaintSylvestreLabel" aria-hidden="true">
<div class="modal-dialog modal-dialog-centered modal-dialog-scrollable">
<div class="modal-content border-3">
<div class="modal-header border-bottom-0">
<div class="d-flex justify-content-end space-modale2">
<h1 class="modal-title fs-5 " id="MenuSaintSylvestreLabel"> {{ 'menus_tarifs_ss_title'|tr(tr)|raw }}</h1>
</div>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div class="d-flex justify-content-center mt-2">
{{ 'menu_tarif_ss_home'|tr(tr)|raw }}
</div>
</div>
</div>
</div>
</div>
<!-- fin de la modale --->
{% include 'FrontBundle/Partial/footer.html.twig' %}
<!-- Root element of PhotoSwipe. Must have class pswp. -->
<div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">
<!-- Background of PhotoSwipe.
It's a separate element as animating opacity is faster than rgba(). -->
<div class="pswp__bg"></div>
<!-- Slides wrapper with overflow:hidden. -->
<div class="pswp__scroll-wrap">
<!-- Container that holds slides.
PhotoSwipe keeps only 3 of them in the DOM to save memory.
Don't modify these 3 pswp__item elements, data is added later on. -->
<div class="pswp__container">
<div class="pswp__item"></div>
<div class="pswp__item"></div>
<div class="pswp__item"></div>
</div>
<!-- Default (PhotoSwipeUI_Default) interface on top of sliding area. Can be changed. -->
<div class="pswp__ui pswp__ui--hidden">
<div class="pswp__top-bar">
<!-- Controls are self-explanatory. Order can be changed. -->
<div class="pswp__counter"></div>
<button class="pswp__button pswp__button--close" title="Close (Esc)"></button>
<button class="pswp__button pswp__button--share" title="Share"></button>
<button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button>
<button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button>
<!-- Preloader demo https://codepen.io/dimsemenov/pen/yyBWoR -->
<!-- element will get class pswp__preloader--active when preloader is running -->
<div class="pswp__preloader">
<div class="pswp__preloader__icn">
<div class="pswp__preloader__cut">
<div class="pswp__preloader__donut"></div>
</div>
</div>
</div>
</div>
<div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap">
<div class="pswp__share-tooltip"></div>
</div>
<button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)">
</button>
<button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)">
</button>
<div class="pswp__caption">
<div class="pswp__caption__center"></div>
</div>
</div>
</div>
</div>
{% endblock %}
{% block javascripts %}
<script src="/front/js/owl.carousel.min.js"></script>
<script src="/plugins/photoswipe/photoswipe.min.js"></script>
<script src="/plugins/photoswipe/photoswipe-ui-default.min.js"></script>
<script type="text/javascript">
$( document ).ready(function() {
$('.open-date').on('click', function(e){
e.preventDefault();
loadEvent($(this).data('id'));
});
var url_anchor = $(location).attr('href');
url_anchor_arr = url_anchor.split("#");
if(url_anchor_arr.length > 1){
console.log(url_anchor_arr[1]);
setTimeout(function(){ $('.anchor a[href="#'+url_anchor_arr[1]+'"]').click(); }, 1000);
}
var owl2 = $('.noel .owl-carousel');
owl2.owlCarousel({
loop: false,
mouseDrag: false,
touchDrag: false,
pullDrag: false,
// rewind: true,
itemElement: 'figure',
autoplay: false,
margin:0,
nav:true,
dots:false,
responsive:{
0:{
items:3
},
600:{
items:3
},
1920:{
items:3
}
}
});
owl.on('changed.owl.carousel', function(event) {
var itemsNbr = owl.data()['owl.carousel'].settings.items;
var itemsTotal = event.item.count;
var itemsIndex = event.item.index;
var pagesNbr = itemsTotal - itemsNbr;
var horizontalBar = $('.horizontal-bar').outerWidth();
var horizontalBarCtrl = $('.horizontal-bar-ctrl').outerWidth();
var courseLength = $('.horizontal-bar').outerWidth() - $('.horizontal-bar-ctrl').outerWidth();
var left = itemsIndex * 100 / pagesNbr; // percent
left = left * courseLength / 100;
$('.horizontal-bar-ctrl').css('left', left+'px');
});
owl2.on('changed.owl.carousel', function(event) {
var itemsNbr = owl2.data()['owl.carousel'].settings.items;
var itemsTotal = event.item.count;
var itemsIndex = event.item.index;
var pagesNbr = itemsTotal - itemsNbr;
var horizontalBar = $('.noel .horizontal-bar').outerWidth();
var horizontalBarCtrl = $('.noel .horizontal-bar-ctrl').outerWidth();
var courseLength = $('.noel .horizontal-bar').outerWidth() - $('.noel .horizontal-bar-ctrl').outerWidth();
var left = itemsIndex * 100 / pagesNbr; // percent
left = left * courseLength / 100;
$('.noel .horizontal-bar-ctrl').css('left', left+'px');
});
$('.owl-carousel.images a').each(function(index, value) {
img = new Image();
size = 0;
const ident = $(this).attr('id').toString();
img.onload = function() {
$('#'+ident).attr('data-size', this.width + 'x' + this.height);
}
img.src = $(this).attr('source');
}).promise().done( function(){
setTimeout( function(){
initPhotoSwipeFromDOM('.my-gallery');
}, 1000);
} );
$('.owl-carousel.images .owl-stage').addClass('my-gallery');
$('.owl-carousel.images .owl-stage').attr('itemscope');
$('.owl-carousel.images .owl-stage').attr('itemtype', 'http://schema.org/ImageGallery');
$('.owl-carousel.images .owl-item ').attr('itemscope');
$('.owl-carousel.images .owl-item ').attr('itemprop', 'associatedMedia');
$('.owl-carousel.images .owl-item ').attr('itemtype', 'http://schema.org/ImageObject');
});
</script>
<script type="text/javascript">
var initPhotoSwipeFromDOM = function(gallerySelector) {
// parse slide data (url, title, size ...) from DOM elements
// (children of gallerySelector)
var parseThumbnailElements = function(el) {
console.log(el.childNodes);
var thumbElements = el.childNodes,
numNodes = thumbElements.length,
items = [
// {
// src: 'https://dummyimage.com/1000x1000/ccc/5cac22',
// w: '1024',
// h: '1024'
// },
// {
// src: 'https://dummyimage.com/1000x1000/5cac22/fff',
// w: '1024',
// h: '1024'
// }
],
figureEl,
linkEl,
size,
item;
for(var i = 0; i < numNodes; i++) {
figureEl = thumbElements[i]; // <figure> element
// include only element nodes
if(figureEl.nodeType !== 1) {
continue;
}
linkEl = figureEl.children[0]; // <a> element
size = linkEl.getAttribute('data-size').split('x');
// create slide object
item = {
src: linkEl.getAttribute('href'),
w: parseInt(size[0], 10),
h: parseInt(size[1], 10)
};
if(figureEl.children.length > 1) {
// <figcaption> content
item.title = figureEl.children[1].innerHTML;
}
if(linkEl.children.length > 0) {
// <img> thumbnail element, retrieving thumbnail url
item.msrc = linkEl.children[0].getAttribute('src');
}
item.el = figureEl; // save link to element for getThumbBoundsFn
items.push(item);
}
return items;
};
// find nearest parent element
var closest = function closest(el, fn) {
return el && ( fn(el) ? el : closest(el.parentNode, fn) );
};
// triggers when user clicks on thumbnail
var onThumbnailsClick = function(e) {
e = e || window.event;
e.preventDefault ? e.preventDefault() : e.returnValue = false;
var eTarget = e.target || e.srcElement;
// find root element of slide
var clickedListItem = closest(eTarget, function(el) {
return (el.tagName && el.tagName.toUpperCase() === 'FIGURE');
});
if(!clickedListItem) {
return;
}
// find index of clicked item by looping through all child nodes
// alternatively, you may define index via data- attribute
var clickedGallery = clickedListItem.parentNode,
childNodes = clickedListItem.parentNode.childNodes,
numChildNodes = childNodes.length,
nodeIndex = 0,
index;
for (var i = 0; i < numChildNodes; i++) {
if(childNodes[i].nodeType !== 1) {
continue;
}
if(childNodes[i] === clickedListItem) {
index = nodeIndex;
break;
}
nodeIndex++;
}
if(index >= 0) {
// open PhotoSwipe if valid index found
openPhotoSwipe( index, clickedGallery );
}
return false;
};
// parse picture index and gallery index from URL (#&pid=1&gid=2)
var photoswipeParseHash = function() {
var hash = window.location.hash.substring(1),
params = {};
if(hash.length < 5) {
return params;
}
var vars = hash.split('&');
for (var i = 0; i < vars.length; i++) {
if(!vars[i]) {
continue;
}
var pair = vars[i].split('=');
if(pair.length < 2) {
continue;
}
params[pair[0]] = pair[1];
}
if(params.gid) {
params.gid = parseInt(params.gid, 10);
}
return params;
};
var openPhotoSwipe = function(index, galleryElement, disableAnimation, fromURL) {
var pswpElement = document.querySelectorAll('.pswp')[0],
gallery,
options,
items;
items = parseThumbnailElements(galleryElement);
// define options (if needed)
options = {
// define gallery index (for URL)
galleryUID: galleryElement.getAttribute('data-pswp-uid'),
getThumbBoundsFn: function(index) {
// See Options -> getThumbBoundsFn section of documentation for more info
var thumbnail = items[index].el.getElementsByTagName('img')[0], // find thumbnail
pageYScroll = window.pageYOffset || document.documentElement.scrollTop,
rect = thumbnail.getBoundingClientRect();
return {x:rect.left, y:rect.top + pageYScroll, w:rect.width};
}
};
// PhotoSwipe opened from URL
if(fromURL) {
if(options.galleryPIDs) {
// parse real index when custom PIDs are used
// http://photoswipe.com/documentation/faq.html#custom-pid-in-url
for(var j = 0; j < items.length; j++) {
if(items[j].pid == index) {
options.index = j;
break;
}
}
} else {
// in URL indexes start from 1
options.index = parseInt(index, 10) - 1;
}
} else {
options.index = parseInt(index, 10);
}
// exit if index not found
if( isNaN(options.index) ) {
return;
}
if(disableAnimation) {
options.showAnimationDuration = 0;
}
// Pass data to PhotoSwipe and initialize it
gallery = new PhotoSwipe( pswpElement, PhotoSwipeUI_Default, items, options);
gallery.init();
};
// loop through all gallery elements and bind events
var galleryElements = document.querySelectorAll( gallerySelector );
for(var i = 0, l = galleryElements.length; i < l; i++) {
galleryElements[i].setAttribute('data-pswp-uid', i+1);
galleryElements[i].onclick = onThumbnailsClick;
}
// Parse URL and open gallery if it contains #&pid=3&gid=1
var hashData = photoswipeParseHash();
if(hashData.pid && hashData.gid) {
openPhotoSwipe( hashData.pid , galleryElements[ hashData.gid - 1 ], true, true );
}
};
</script>
{% endblock %}