templates/FrontBundle/Page/spectacle-le-parfum-des-etoiles.html.twig line 1

Open in your IDE?
  1. {% extends 'FrontBundle/layout.html.twig' %}
  2. {% block title %}{{ app_sitename }} - {{ page.metaTitle }}{% endblock %}
  3. {% block description %}{{ page.metaDescription }}{% endblock %}
  4. {% block extra_class %}native page_spectacle{% endblock %}
  5. {% block menu_min %}931{% endblock %}
  6. {# {% block menu_max %}3076{% endblock %} #}
  7. {% block sub_header %}
  8.     <div class="sub-header anchor">
  9.         <ul>
  10.             <li><a href="#spectacle">GRAND AMOUR</a></li>
  11.             <li><a href="#artistes">{{ 'spectacle_artistes'|tr(tr)|raw }}</a></li>
  12.             <li><a href="#coulisses">{{ 'spectacle_coulisses'|tr(tr)|raw }}</a></li>
  13.         </ul>
  14.     </div>
  15. {% endblock %}
  16. {% block stylesheets %}
  17.     <link href="/front/css/owl.carousel.min.css" rel="stylesheet">
  18.     <link href="/front/css/owl.theme.default.min.css" rel="stylesheet">
  19.     <link href="/plugins/photoswipe/photoswipe.css" rel="stylesheet">
  20.     <link href="/plugins/photoswipe/default-skin/default-skin.css" rel="stylesheet" type="text/css"/>
  21.     <link href="/front/css/carousel.css" rel="stylesheet">
  22.     <style>
  23.         .menus-tarifs-callendar {
  24.             background-image: url('/front/img/2025/background-parfum-etoiles.jpg');
  25.         }
  26.         @media (max-width: 1024px)
  27.         {
  28.             .menus-tarifs-callendar {
  29.                 background-image: url('/front/img/2025/background-parfum-etoiles-mobile.jpg') !important;
  30.             }
  31.         }
  32.         @media (max-width: 768px)
  33.         {
  34.             .page_spectacle .slider p.desc {
  35.                 width: 240px;
  36.                 left: calc(50% - 120px);
  37.             }
  38.         }
  39.         section.slider .item .desc {
  40.             display: none;
  41.         }
  42.         .page_spectacle .mini-suites .name {
  43.             bottom: 170px;
  44.         }
  45.         .page_spectacle #spectacle {
  46.             background-image: none;
  47.         }
  48.         .home:before {
  49.             background: rgba(0, 0, 0, 0.2);
  50.         }
  51. </style>
  52. {% endblock %}
  53. {% block body %}
  54.     {#
  55.     <section class="info-header2 anchor">
  56.       <ul>
  57.         <li><a href="#spectacle">Frénésie</a></li>
  58.         <li><a href="#artistes">Artistes</a></li>
  59.         <li><a href="#coulisses">Coulisses</a></li>
  60.       </ul>
  61.     </section>
  62.     #}
  63.     <section class="menus-tarifs-callendar espace-header spectacle-header p-0 home">
  64.         {# <video class="video-slide active" src="/front/videos/palace3.mp4" autoplay muted loop playsinline></video> #}
  65.         <div class="content pt-0 hide">
  66.             {#<p>
  67.                 <img src="/front/img/spectacle-title-line.svg" alt="line" class="page_spectacle_logo_line" />
  68.                 <img src="/front/img/grand-amour-w.svg" alt="line" class="page_spectacle_logo" />
  69.                 <img src="/front/img/spectacle-title-line.svg" alt="line" class="page_spectacle_logo_line"  />
  70.             </p>#}
  71.             <h1>Parfum d'étoiles</h1>
  72.             <p class="sub-title mb-0">{{ 'grandamour_title'|tr(tr)|raw }}</p>
  73.             <p class="desc mt-5 pt-2 mb-0">{{ 'grandamour_subtitle'|tr(tr)|raw }}</p>
  74.         </div>
  75.         <a href="/{{app.request.locale }}/{{ 'reservation'|getUrl(app.request.locale) }}?event=main" class="order-btn">{{ 'general_reserver'|tr(tr)|raw }}</a>
  76.         <a href="#spectacle" class="arrow-btn"><img src="/front/img/spectacle-header-arrow-b.svg" alt="next" width="20px" /></a>
  77.         {% set cata_link = '/front/2025_Royal_Palace_Le_Parfum_Des_Etoiles_fr.pdf' %}
  78.         {% if app.request.locale == 'de' %}
  79.             {% set cata_link = '/front/2025_Royal_Palace_Le_Parfum_Des_Etoiles_de.pdf' %}
  80.         {% endif %}
  81.         <a href="{{cata_link}}" class="cata-btn" target="_blank">{{ 'spectacle_cata'|tr(tr)|raw }} <img src="/front/img/espaces-down-link.svg" alt="dowload" width="33px" /></a>
  82.         <ul>
  83.             <li class="active"><a href="#spectacle">Parfum d'étoiles</a></li>
  84.             <li><a href="#artistes">{{ 'spectacle_artistes'|tr(tr)|raw }}</a></li>
  85.             <li><a href="#coulisses">{{ 'spectacle_coulisses'|tr(tr)|raw }}</a></li>
  86.         </ul>
  87.     </section>
  88. {% if app.request.locale == 'fr' %}
  89.     <section id="spectacle" class="espace-content full pt-5 mt-5 overflow-h overflow-y-h">
  90.         <div class="content">
  91.             <h1 class="pt-5 mb-3 no-bar" style="text-transform: uppercase;">SPECTACLE Parfum d'étoiles<span class="full-bar"></span></h1>
  92.             <h5 class="mb-3 mt-5">LE ROYAL PALACE fête ses 45 ans de Cabaret !</h5>
  93.             <p class="p-0">Quarante-cinq années de passion, de créativité et de spectacles inoubliables !<br>
  94.             C’est grâce à vous, notre précieux public, que nous avons pu atteindre
  95.             ce jalon et propulser notre Music-Hall à la deuxième place en France.<br>
  96.             En s'entourant des meilleurs spécialistes dans le domaine artistique, au fil des
  97.             années, nous avons conçu des spectacles audacieux et contemporains, toujours
  98.             en phase avec notre temps, ravissant ainsi un public de tous âges.<br>
  99.             Pour marquer cet événement exceptionnel, nous vous
  100.             présentons un spectacle à la hauteur de cette célébration !<br>
  101.                 Découvrez notre nouveau spectacle : </p>
  102.             <h5 class="mb-3 mt-5">PARFUM D'ÉTOILES !</h5>
  103.             <p class="p-0">
  104.                 «Après une pluie d’étoiles, la Terre s’est métamorphosée : faune, flore et humains
  105.                 ont fusionné en créatures fantastiques et envoûtantes. Evy, jeune parfumeuse,
  106.                 s’élance dans une quête sensorielle à travers des paysages oniriques, mêlant
  107.                 amour et poésie, à la recherche des senteurs oubliées et du parfum des étoiles…»<br><br>
  108.                 Cette nouvelle production captivante vous promet des performances envoûtantes,
  109.                 des surprises et une multitude d’émotions. Une sélection d’artistes remarquables
  110.                 et spectaculaires vous émerveillera sur scène, accompagnée d’un investissement
  111.                 scénique conséquent et de costumes éblouissants.<br>
  112.                 Préparez-vous à vivre un spectacle riche en couleurs
  113.                 qui met à l’honneur la magie du cabaret.<br>
  114.                 Célébrons ensemble ces 45 années de passion et d’engagement !<br><br>
  115.                 Production exclusive : ROYAL SHOW PRODUCTIONS</p>
  116. {#            <h5 class="mb-3 mt-5">{{ 'grandamour_s1_title'|tr(tr)|raw }}</h5>
  117.             <p class="p-0">{{ 'grandamour_s1'|tr(tr)|raw }}</p>#}
  118. {#            <div class="pre-carousel pt-3 mt-3">
  119.                 <a href="#" class="active photo">{{ 'spectacle_photos'|tr(tr)|raw }}<span>12</span></a>
  120.                 <a href="#" class="video">{{ 'spectacle_video'|tr(tr)|raw }}<span>1</span></a>
  121.             </div>
  122.             <div class="carousel"></div>
  123.             <div class="owl-dots">
  124.                 <button role="button" class="owl-dot"><span></span></button>
  125.                 <button role="button" class="owl-dot"><span></span></button>
  126.                 <button role="button" class="owl-dot"><span></span></button>
  127.                 <button role="button" class="owl-dot"><span></span></button>
  128.                 <button role="button" class="owl-dot"><span></span></button>
  129.             </div>
  130.             <div class="yt">
  131.                 <iframe width="560" height="315" src="https://www.youtube.com/embed/HcDfortoJtU?si=A7z3NFxBwg-Pwb7-" allow="autoplay" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
  132.             </div>#}
  133.         </div>
  134.     </section>
  135. {% endif %}
  136.     {% if app.request.locale == 'de' %}
  137.         <section id="spectacle" class="espace-content full pt-5 mt-5 overflow-h overflow-y-h">
  138.             <div class="content">
  139.                 <h1 class="pt-5 mb-3 no-bar" style="text-transform: uppercase;">SHOW PARFUM D'ETOILES<span class="full-bar"></span></h1>
  140.                 <h5 class="mb-3 mt-5">DER ROYAL PALACE feiert 45 Jahre Kabarett!</h5>
  141.                 <p class="p-0">Fünfundvierzig Jahre voller Leidenschaft, Kreativität und unvergesslicher Shows!<br>
  142.                     Dank euch, unserem geschätzten Publikum, haben wir diesen Meilenstein erreicht und unseren Music-Hall auf den zweiten Platz in Frankreich gebracht.<br>
  143.                     Mit den besten Experten im künstlerischen Bereich an unserer Seite haben wir im Laufe der Jahre mutige und moderne Shows kreiert, die stets am Puls der Zeit sind und Zuschauer jeden Alters begeistern.<br>
  144.                     Um dieses außergewöhnliche Ereignis zu feiern, präsentieren wir Ihnen eine Show, die diesem Anlass gerecht wird!<br>
  145.                     Entdecken Sie unsere neue Show:</p>
  146.                 <h5 class="mb-3 mt-5">PARFUM D'ETOILES !</h5>
  147.                 <p class="p-0">
  148.                     „Nach einem Sternenregen hat sich die Erde verwandelt: Fauna, Flora und Menschen sind zu fantastischen, bezaubernden Wesen verschmolzen. Evy, eine junge Parfümeurin, begibt sich auf eine sinnliche Reise durch traumhafte Landschaften, in denen sich Liebe und Poesie verbinden – auf der Suche nach vergessenen Düften und dem Parfum der Sterne…“<br><br>
  149.                     Diese fesselnde neue Produktion verspricht bezaubernde Darbietungen, Überraschungen und viele Emotionen. Eine Auswahl bemerkenswerter und spektakulärer Künstler wird Sie auf der Bühne verzaubern – mit aufwändiger Inszenierung und prachtvollen Kostümen.<br>
  150.                     Freuen Sie sich auf eine farbenfrohe Show, die die Magie des Kabaretts zelebriert.<br>
  151.                     Feiern wir gemeinsam 45 Jahre Leidenschaft und Engagement!<br><br>
  152.                     Exklusive Produktion: ROYAL SHOW PRODUCTIONS</p>
  153.             </div>
  154.         </section>
  155.     {% endif %}
  156.     {% if app.request.locale == 'en' %}
  157.         <section id="spectacle" class="espace-content full pt-5 mt-5 overflow-h overflow-y-h">
  158.             <div class="content">
  159.                 <h1 class="pt-5 mb-3 no-bar" style="text-transform: uppercase;">SHOW PARFUM D'ETOILES<span class="full-bar"></span></h1>
  160.                 <h5 class="mb-3 mt-5">THE ROYAL PALACE celebrates 45 years of Cabaret!</h5>
  161.                 <p class="p-0">Forty-five years of passion, creativity, and unforgettable performances!<br>
  162.                     Thanks to you, our precious audience, we have reached this milestone and brought our Music Hall to the second place in France.<br>
  163.                     By surrounding ourselves with the best experts in the artistic field, we have created bold and contemporary shows over the years, always in tune with the times, delighting audiences of all ages.<br>
  164.                     To mark this exceptional event, we present a show worthy of the celebration!<br>
  165.                     Discover our new show:</p>
  166.                 <h5 class="mb-3 mt-5">PARFUM D'ETOILES !</h5>
  167.                 <p class="p-0">
  168.                     "After a shower of stars, the Earth transformed: fauna, flora and humans merged into fantastic, enchanting creatures. Evy, a young perfumer, embarks on a sensory journey through dreamlike landscapes, blending love and poetry, in search of forgotten scents and the fragrance of stars..."<br><br>
  169.                     This captivating new production promises mesmerizing performances, surprises, and a wide range of emotions. A cast of remarkable and spectacular artists will amaze you on stage, supported by a significant stage design and dazzling costumes.<br>
  170.                     Get ready for a colorful show celebrating the magic of cabaret.<br>
  171.                     Let’s celebrate together these 45 years of passion and dedication!<br><br>
  172.                     Exclusive production: ROYAL SHOW PRODUCTIONS</p>
  173.             </div>
  174.         </section>
  175.     {% endif %}
  176.     <section id="artistes" class="espace-content full mt-5 pt-5 overflow-h">
  177.         <div class="content">
  178.             <h2 class="pt-5 mt-0 mb-3 no-bar"><span>{{ 'spectacle_artistes2'|tr(tr)|upper|raw }}<span class="full-bar"></span></h2>
  179.             <h5 class="mb-5 mt-5"><span>&nbsp;</span></h5>
  180.         </div>
  181.     </section>
  182.     <section class="slider p-0">
  183.         <div class="slider-after"></div>
  184.         <div class="content overflow-h" style="height:620px;">
  185.             <div class="owl-carousel mini-suites">
  186.                 <div class="item" data-link="#">
  187.                     <div class="img" style="background-image: url('/front/img/2025/hermanos-acero.jpg?v=1');">
  188.                         <div class="gradient"></div>
  189.                         <p class="name">Hermanos Acero</p>
  190.                         <p class="subname">{{ 'grandamour_a2'|tr(tr)|upper|raw }}</p>
  191.                     </div>{#
  192.                     <a href="https://www.instagram.com/houschmahousch/" target="_blank" class="ig"><img alt="instagram" src="/front/img/spectacle-ig.svg" /></a>
  193.                     #}
  194.                     <p class="desc">{{ 'grandamour_a2_desc'|tr(tr)|raw }}</p>
  195.                 </div>
  196.                 <div class="item" data-link="#">
  197.                     <div class="img" style="background-image: url('/front/img/2025/sarita.jpg');">
  198.                         <div class="gradient"></div>
  199.                         <p class="name">Sarita</p>
  200.                         <p class="subname">{{ 'grandamour_a3'|tr(tr)|upper|raw }}</p>
  201. {#
  202.                         <a href="https://www.instagram.com/wanderlustdancer/" target="_blank" class="ig"><img alt="instagram" src="/front/img/spectacle-ig.svg" /></a>
  203. #}
  204.                     </div>
  205.                     <p class="desc">{{ 'grandamour_a3_desc'|tr(tr)|raw }}</p>
  206.                 </div>
  207.                 <div class="item" data-link="#">
  208.                     <div class="img" style="background-image: url('/front/img/2025/skokov.jpg?v=1');">
  209.                         <div class="gradient"></div>
  210.                         <p class="name">Skokov</p>
  211.                         <p class="subname">{{ 'grandamour_a4'|tr(tr)|upper|raw }}</p>
  212. {#
  213.                         <a href="https://www.instagram.com/art_of_robots/" target="_blank" class="ig"><img alt="instagram" src="/front/img/spectacle-ig.svg" /></a>
  214. #}
  215.                     </div>
  216.                     <p class="desc">{{ 'grandamour_a4_desc'|tr(tr)|raw }}</p>
  217.                 </div>
  218.                 <div class="item" data-link="#">
  219.                     <div class="img" style="background-image: url('/front/img/2025/viviana-rossi.jpg?v=1');">
  220.                         <div class="gradient"></div>
  221.                         <p class="name">VIVIANA ROSSI</p>
  222.                         <p class="subname">{{ 'grandamour_a5'|tr(tr)|upper|raw }}</p>
  223. {#
  224.                         <a href="https://www.instagram.com/caiyong1112/" target="_blank" class="ig"><img alt="instagram" src="/front/img/spectacle-ig.svg" /></a>
  225. #}
  226.                     </div>
  227.                     <p class="desc">{{ 'grandamour_a5_desc'|tr(tr)|raw }}</p>
  228.                 </div>
  229.                 <div class="item" data-link="#">
  230.                     <div class="img" style="background-image: url('/front/img/2025/jonathan-rossi.jpg?v=1');">
  231.                         <div class="gradient"></div>
  232.                         <p class="name">JONATHAN ROSSI</p>
  233.                         <p class="subname">{{ 'grandamour_a6'|tr(tr)|upper|raw }}</p>
  234. {#
  235.                         <a href="https://www.instagram.com/shakirov_oleg/" target="_blank" class="ig"><img alt="instagram" src="/front/img/spectacle-ig.svg" /></a>
  236. #}
  237.                     </div>
  238.                     <p class="desc">{{ 'grandamour_a6_desc'|tr(tr)|raw }}</p>
  239.                 </div>
  240.                 <div class="item" data-link="#">
  241.                     <div class="img" style="background-image: url('/front/img/2025/elisa-cussadie.jpg?v=1');">
  242.                         <div class="gradient"></div>
  243.                         <p class="name">elisa cussadie</p>
  244.                         <p class="subname">{{ 'grandamour_a7'|tr(tr)|upper|raw }}</p>
  245. {#
  246.                         <a href="https://www.instagram.com/lyubanevych/" target="_blank" class="ig"><img alt="instagram" src="/front/img/spectacle-ig.svg" /></a>
  247. #}
  248.                     </div>
  249.                     <p class="desc">{{ 'grandamour_a7_desc'|tr(tr)|raw }}</p>
  250.                 </div>
  251.                 <div class="item" data-link="#">
  252.                     <div class="img" style="background-image: url('/front/img/2025/cristina-garcia.jpg?v=1');">
  253.                         <div class="gradient"></div>
  254.                         <p class="name">cristina garcia</p>
  255.                         <p class="subname">{{ 'grandamour_a1'|tr(tr)|upper|raw }}</p>
  256. {#
  257.                         <a href="https://www.instagram.com/lyubanevych/" target="_blank" class="ig"><img alt="instagram" src="/front/img/spectacle-ig.svg" /></a>
  258. #}
  259.                     </div>
  260.                     <p class="desc">{{ 'grandamour_a1_desc'|tr(tr)|raw }}</p>
  261.                 </div>
  262.             </div>
  263.             <p class="desc">{{ 'frenesie_a3_desc'|tr(tr)|raw }}</p>
  264.         </div>
  265.         <div class="buttons hide">
  266.             <a href="#infos" class="artist-link">Découvrez prochainement l'artiste</a>
  267.         </div>
  268.         <div class="red-bar"></div>
  269.     </section>
  270.     <section id="coulisses" class="espace-content full mt-2 pt-5 overflow-h">
  271.         <div class="content">
  272.             <h2 class="pt-5 mt-5 mb-3 no-bar"><span>{{ 'spectacle_coulisses2'|tr(tr)|upper|raw }}<span class="full-bar"></span></h2>
  273.             <p class="p-0 mt-5">{{ 'grandamour_s2'|tr(tr)|raw }}</p>
  274.         </div>
  275.     </section>
  276.     <section class="coulisses-slider p-0 mt-5 pt-5 overflow-h" style="margin-bottom: 180px;">
  277.         {#
  278.         <div class="content fluid">
  279.           <div class="owl-carousel">
  280.             <div class="item">
  281.               <div class="img" style="background-image: url('/front/img/spectacle-coulisses1.jpg');"> </div>
  282.               <div class="img" style="background-image: url('/front/img/spectacle-coulisses2.jpg');"> </div>
  283.             </div>
  284.             <div class="item">
  285.               <div class="img" style="background-image: url('/front/img/spectacle-coulisses3.jpg');"> </div>
  286.               <div class="img" style="background-image: url('/front/img/spectacle-coulisses4.jpg');"> </div>
  287.             </div>
  288.             <div class="item">
  289.               <div class="img" style="background-image: url('/front/img/spectacle-coulisses5.jpg');"> </div>
  290.               <div class="img" style="background-image: url('/front/img/spectacle-coulisses6.jpg');"> </div>
  291.             </div>
  292.             <div class="item">
  293.               <div class="img" style="background-image: url('/front/img/spectacle-coulisses7.jpg');"> </div>
  294.               <div class="img" style="background-image: url('/front/img/spectacle-coulisses8.jpg');"> </div>
  295.             </div>
  296.             <div class="item">
  297.               <div class="img" style="background-image: url('/front/img/spectacle-coulisses9.jpg');"> </div>
  298.               <div class="img" style="background-image: url('/front/img/spectacle-coulisses10.jpg');"> </div>
  299.             </div>
  300.             <div class="item">
  301.               <div class="img" style="background-image: url('/front/img/spectacle-coulisses11.jpg');"> </div>
  302.               <div class="img" style="background-image: url('/front/img/spectacle-coulisses12.jpg');"> </div>
  303.             </div>
  304.             <div class="item">
  305.               <div class="img" style="background-image: url('/front/img/spectacle-coulisses13.jpg');"> </div>
  306.               <div class="img" style="background-image: url('/front/img/spectacle-coulisses14.jpg');"> </div>
  307.             </div>
  308.             <div class="item">
  309.               <div class="img" style="background-image: url('/front/img/spectacle-coulisses15.jpg');"> </div>
  310.               <div class="img" style="background-image: url('/front/img/spectacle-coulisses16.jpg');"> </div>
  311.             </div>
  312.             <div class="item">
  313.               <div class="img" style="background-image: url('/front/img/spectacle-coulisses17.jpg');"> </div>
  314.               <div class="img" style="background-image: url('/front/img/spectacle-coulisses18.jpg');"> </div>
  315.             </div>
  316.           </div>
  317.         </div> #}
  318.         <div class="content fluid">
  319.             <div class="owl-carousel images">
  320.                 {% for i in 1..24 %}
  321.                     {% if i is odd %}
  322.                         <div class="item">
  323.                     {% endif %}
  324.                     <a id="{{'now'|date('U')}}_{{i}}" href="/front/img/spectacle-coulisses/spectacle-coulisses{{i}}.jpg" itemprop="contentUrl" data-size="" class="img " style="background-image: url('/front/img/spectacle-coulisses/spectacle-coulisses{{i}}.jpg');" source="{{ app.request.getSchemeAndHttpHost() }}/front/img/spectacle-coulisses/spectacle-coulisses{{i}}.jpg">
  325.                         <img src="/front/img/spectacle-coulisses/spectacle-coulisses{{i}}.jpg" style="display:none;" itemprop="thumbnail" alt="album" />
  326.                     </a>
  327.                     </a>
  328.                     {% if i is even %}
  329.                         </div>
  330.                     {% endif %}
  331.                 {% endfor %}
  332.             </div>
  333.         </div>
  334.         <div class="horizontal-bar-container">
  335.             <div class="horizontal-bar"></div>
  336.             <div class="horizontal-bar-ctrl"></div>
  337.         </div>
  338.     </section>
  339.     {% include 'FrontBundle/Partial/footer.html.twig' %}
  340.     <!-- Root element of PhotoSwipe. Must have class pswp. -->
  341.     <div class="pswp" tabindex="-1" role="dialog" aria-hidden="true">
  342.         <!-- Background of PhotoSwipe.
  343.           It's a separate element as animating opacity is faster than rgba(). -->
  344.         <div class="pswp__bg"></div>
  345.         <!-- Slides wrapper with overflow:hidden. -->
  346.         <div class="pswp__scroll-wrap">
  347.             <!-- Container that holds slides.
  348.               PhotoSwipe keeps only 3 of them in the DOM to save memory.
  349.               Don't modify these 3 pswp__item elements, data is added later on. -->
  350.             <div class="pswp__container">
  351.                 <div class="pswp__item"></div>
  352.                 <div class="pswp__item"></div>
  353.                 <div class="pswp__item"></div>
  354.             </div>
  355.             <!-- Default (PhotoSwipeUI_Default) interface on top of sliding area. Can be changed. -->
  356.             <div class="pswp__ui pswp__ui--hidden">
  357.                 <div class="pswp__top-bar">
  358.                     <!--  Controls are self-explanatory. Order can be changed. -->
  359.                     <div class="pswp__counter"></div>
  360.                     <button class="pswp__button pswp__button--close" title="Close (Esc)"></button>
  361.                     <button class="pswp__button pswp__button--share" title="Share"></button>
  362.                     <button class="pswp__button pswp__button--fs" title="Toggle fullscreen"></button>
  363.                     <button class="pswp__button pswp__button--zoom" title="Zoom in/out"></button>
  364.                     <!-- Preloader demo https://codepen.io/dimsemenov/pen/yyBWoR -->
  365.                     <!-- element will get class pswp__preloader--active when preloader is running -->
  366.                     <div class="pswp__preloader">
  367.                         <div class="pswp__preloader__icn">
  368.                             <div class="pswp__preloader__cut">
  369.                                 <div class="pswp__preloader__donut"></div>
  370.                             </div>
  371.                         </div>
  372.                     </div>
  373.                 </div>
  374.                 <div class="pswp__share-modal pswp__share-modal--hidden pswp__single-tap">
  375.                     <div class="pswp__share-tooltip"></div>
  376.                 </div>
  377.                 <button class="pswp__button pswp__button--arrow--left" title="Previous (arrow left)">
  378.                 </button>
  379.                 <button class="pswp__button pswp__button--arrow--right" title="Next (arrow right)">
  380.                 </button>
  381.                 <div class="pswp__caption">
  382.                     <div class="pswp__caption__center"></div>
  383.                 </div>
  384.             </div>
  385.         </div>
  386.     </div>
  387. {% endblock %}
  388. {% block javascripts %}
  389.     <script src="/front/js/owl.carousel.min.js"></script>
  390.     <script src="/plugins/photoswipe/photoswipe.min.js"></script>
  391.     <script src="/plugins/photoswipe/photoswipe-ui-default.min.js"></script>
  392.     <script type="text/javascript">
  393.         'use strict';
  394.         class Carousel {
  395.             constructor(el) {
  396.                 this.el = el;
  397.                 this.carouselOptions = ['previous','play','next'];
  398.                 this.carouselData = [
  399.                     {% for i in 1..7 %}
  400.                     {
  401.                         'id': '{{i}}',
  402.                         'src': '/front/img/spectacle-slider-2024-{{i}}.jpg?v=1',
  403.                     },
  404.                     {% endfor %}
  405.                 ];
  406.                 this.carouselInView = [1, 2, 3, 4, 5];
  407.                 this.carouselContainer;
  408.                 this.carouselPlayState;
  409.             }
  410.             mounted() {
  411.                 this.setupCarousel();
  412.                 this.play()
  413.             }
  414.             // Build carousel html
  415.             setupCarousel() {
  416.                 const container = document.createElement('div');
  417.                 const controls = document.createElement('div');
  418.                 // Add container for carousel items and controls
  419.                 this.el.append(container, controls);
  420.                 container.className = 'carousel-container';
  421.                 controls.className = 'carousel-controls';
  422.                 // Take dataset array and append items to container
  423.                 this.carouselData.forEach((item, index) => {
  424.                     const carouselItem = item.src ? document.createElement('img') : document.createElement('div');
  425.                     container.append(carouselItem);
  426.                     // Add item attributes
  427.                     carouselItem.className = `carousel-item carousel-item-${index + 1}`;
  428.                     carouselItem.src = item.src;
  429.                     carouselItem.setAttribute('loading', 'lazy');
  430.                     // Used to keep track of carousel items, infinite items possible in carousel however min 5 items required
  431.                     carouselItem.setAttribute('data-index', `${index + 1}`);
  432.                 });
  433.                 this.carouselOptions.forEach((option) => {
  434.                     const btn = document.createElement('button');
  435.                     const axSpan = document.createElement('span');
  436.                     // Add accessibilty spans to button
  437.                     axSpan.innerText = option;
  438.                     axSpan.className = 'ax-hidden';
  439.                     btn.append(axSpan);
  440.                     // Add button attributes
  441.                     btn.className = `carousel-control carousel-control-${option}`;
  442.                     btn.setAttribute('data-name', option);
  443.                     // Add carousel control options
  444.                     controls.append(btn);
  445.                 });
  446.                 // After rendering carousel to our DOM, setup carousel controls' event listeners
  447.                 this.setControls([...controls.children]);
  448.                 // Set container property
  449.                 this.carouselContainer = container;
  450.             %}
  451.             setControls(controls) {
  452.                 controls.forEach(control => {
  453.                     control.onclick = (event) => {
  454.                         event.preventDefault();
  455.                         // Manage control actions, update our carousel data first then with a callback update our DOM
  456.                         this.controlManager(control.dataset.name);
  457.                     };
  458.                 });
  459.             }
  460.             controlManager(control) {
  461.                 if (control === 'previous') return this.previous();
  462.                 if (control === 'next') return this.next();
  463.                 if (control === 'add') return this.add();
  464.                 if (control === 'play') return this.play();
  465.                 return;
  466.             }
  467.             getIndex(inView) {
  468.                 var inViewArr = {
  469.                     'i1': 4,
  470.                     'i2': 3,
  471.                     'i3': 2,
  472.                     'i4': 1,
  473.                     'i5': 5,
  474.                 };
  475.                 var inViewArr = {
  476.                     'i1': 0,
  477.                     'i2': 4,
  478.                     'i3': 3,
  479.                     'i4': 2,
  480.                     'i5': 1,
  481.                 };
  482.                 // console.log (inViewArr['i'+inView] );
  483.                 $('#spectacle .owl-dots .owl-dot').removeClass('active');
  484.                 $('#spectacle .owl-dots .owl-dot:eq('+inViewArr['i'+inView]+')').addClass('active');
  485.             }
  486.             previous() {
  487.                 // console.log('prev');
  488.                 this.getIndex(exampleCarousel.carouselInView[0])
  489.                 // Update order of items in data array to be shown in carousel
  490.                 this.carouselData.unshift(this.carouselData.pop());
  491.                 // Push the first item to the end of the array so that the previous item is front and center
  492.                 this.carouselInView.push(this.carouselInView.shift());
  493.                 // Update the css class for each carousel item in view
  494.                 this.carouselInView.forEach((item, index) => {
  495.                     this.carouselContainer.children[index].className = `carousel-item carousel-item-${item}`;
  496.                 });
  497.                 // Using the first 5 items in data array update content of carousel items in view
  498.                 this.carouselData.slice(0, 5).forEach((data, index) => {
  499.                     document.querySelector(`.carousel-item-${index + 1}`).src = data.src;
  500.                 });
  501.             }
  502.             next() {
  503.                 // console.log('next');
  504.                 this.getIndex(exampleCarousel.carouselInView[0])
  505.                 // Update order of items in data array to be shown in carousel
  506.                 this.carouselData.push(this.carouselData.shift());
  507.                 // Take the last item and add it to the beginning of the array so that the next item is front and center
  508.                 this.carouselInView.unshift(this.carouselInView.pop());
  509.                 // Update the css class for each carousel item in view
  510.                 this.carouselInView.forEach((item, index) => {
  511.                     this.carouselContainer.children[index].className = `carousel-item carousel-item-${item}`;
  512.                 });
  513.                 // Using the first 5 items in data array update content of carousel items in view
  514.                 this.carouselData.slice(0, 5).forEach((data, index) => {
  515.                     document.querySelector(`.carousel-item-${index + 1}`).src = data.src;
  516.                 });
  517.             }
  518.             add() {
  519.                 const newItem = {
  520.                     'id': '',
  521.                     'src': '',
  522.                 };
  523.                 const lastItem = this.carouselData.length;
  524.                 const lastIndex = this.carouselData.findIndex(item => item.id == lastItem);
  525.                 // Assign properties for new carousel item
  526.                 Object.assign(newItem, {
  527.                     id: `${lastItem + 1}`,
  528.                     src: `http://fakeimg.pl/300/?text=${lastItem + 1}`
  529.                 });
  530.                 // Then add it to the "last" item in our carouselData
  531.                 this.carouselData.splice(lastIndex + 1, 0, newItem);
  532.                 // Shift carousel to display new item
  533.                 this.next();
  534.             }
  535.             play() {
  536.                 const playBtn = document.querySelector('.carousel-control-play');
  537.                 const startPlaying = () => this.next();
  538.                 if (playBtn.classList.contains('playing')) {
  539.                     // Remove class to return to play button state/appearance
  540.                     playBtn.classList.remove('playing');
  541.                     // Remove setInterval
  542.                     clearInterval(this.carouselPlayState);
  543.                     this.carouselPlayState = null;
  544.                 } else {
  545.                     // Add class to change to pause button state/appearance
  546.                     playBtn.classList.add('playing');
  547.                     // First run initial next method
  548.                     this.next();
  549.                     // Use play state prop to store interval ID and run next method on a 1.5 second interval
  550.                     this.carouselPlayState = setInterval(startPlaying, 3000);
  551.                 };
  552.             }
  553.         }
  554.         // Refers to the carousel root element you want to target, use specific class selectors if using multiple carousels
  555.         const el = document.querySelector('.carousel');
  556.         // Create a new carousel object
  557.         const exampleCarousel = new Carousel(el);
  558.         // Setup carousel and methods
  559.         exampleCarousel.mounted();
  560.     </script>
  561.     <script type="text/javascript">
  562.         $( document ).ready(function() {
  563. /*            if(window.innerWidth > 1047 ){
  564.                 $('.menus-tarifs-callendar .content').before('<video class="video-slide active" src="/front/videos/Teaser-Grand-Amour.mp4" autoplay muted loop playsinline></video>');
  565.             }*/
  566.             $(document).scroll(function(){
  567.                 $('.info-header2 li').removeClass('active');
  568.                 $('.info-header2 li:eq(0)').addClass('active');
  569.                 if( $(window).scrollTop() > $('#artistes').position().top ){
  570.                     $('.info-header2 li').removeClass('active');
  571.                     $('.info-header2 li:eq(1)').addClass('active');
  572.                 }
  573.                 if( $(window).scrollTop() > $('#coulisses').position().top ){
  574.                     $('.info-header2 li').removeClass('active');
  575.                     $('.info-header2 li:eq(2)').addClass('active');
  576.                 }
  577.             });
  578.             $('.spectacle-header').css('height', window.innerHeight+'px');
  579.             $('.slider .owl-carousel').owlCarousel({
  580.                 loop:true,
  581.                 margin:80,
  582.                 nav:true,
  583.                 dots:false,
  584.                 responsive:{
  585.                     0:{
  586.                         items:1
  587.                     },
  588.                     1024:{
  589.                         items:1
  590.                     },
  591.                     1025:{
  592.                         items:3
  593.                     },
  594.                     1920:{
  595.                         items:3
  596.                     }
  597.                 }
  598.             });
  599.             var owl = $('.coulisses-slider .owl-carousel');
  600.             owl.owlCarousel({
  601.                 loop:false,
  602.                 margin:42,
  603.                 nav:true,
  604.                 itemElement: 'figure',
  605.                 dots:false,
  606.                 responsive:{
  607.                     0:{
  608.                         items:2
  609.                     },
  610.                     868:{
  611.                         items:3
  612.                     },
  613.                     1000:{
  614.                         items:3
  615.                     },
  616.                     1280:{
  617.                         items:4
  618.                     },
  619.                     1475:{
  620.                         items:5
  621.                     },
  622.                     1920:{
  623.                         items:6
  624.                     }
  625.                 }
  626.             });
  627.             $('.artist-link').click(function(){
  628.                 window.location.href = $('.owl-item.active ~ .owl-item.active .item').data('link');
  629.             });
  630.             $('.arrow-btn').click(function(e){
  631.                 e.preventDefault();
  632.                 $([document.documentElement, document.body]).animate({
  633.                     scrollTop: $( $('#spectacle') ).offset().top - 130
  634.                 }, 100);
  635.             });
  636.             $('#spectacle .video').click(function(e){
  637.                 e.preventDefault();
  638.                 $('#spectacle .carousel').hide();
  639.                 $('#spectacle .yt').fadeIn();
  640.                 $('#spectacle .owl-dots').hide();
  641.                 $('#spectacle .photo').removeClass('active');
  642.                 $('#spectacle .video').addClass('active');
  643.             });
  644.             $('#spectacle .photo').click(function(e){
  645.                 e.preventDefault();
  646.                 $('#spectacle .yt').hide();
  647.                 $('#spectacle .carousel').fadeIn();
  648.                 $('#spectacle .owl-dots').fadeIn();
  649.                 $('#spectacle .video').removeClass('active');
  650.                 $('#spectacle .photo').addClass('active');
  651.             });
  652.             $('#spectacle .yt .hover').click(function(e){
  653.                 e.preventDefault();
  654.                 console.log('ssss');
  655.                 window.open('https://youtu.be/RbHIzbo522o', '_blank');
  656.             });
  657.             owl.on('changed.owl.carousel', function(event) {
  658.                 var itemsNbr = owl.data()['owl.carousel'].settings.items;
  659.                 var itemsTotal = event.item.count;
  660.                 var itemsIndex = event.item.index;
  661.                 var pagesNbr = itemsTotal - itemsNbr;
  662.                 var horizontalBar = $('.horizontal-bar').outerWidth();
  663.                 var horizontalBarCtrl = $('.horizontal-bar-ctrl').outerWidth();
  664.                 var courseLength = $('.horizontal-bar').outerWidth() - $('.horizontal-bar-ctrl').outerWidth();
  665.                 var left = itemsIndex * 100 / pagesNbr; // percent
  666.                 left = left * courseLength / 100;
  667.                 $('.horizontal-bar-ctrl').css('left', left+'px');
  668.             });
  669.             $('.owl-carousel.images a').each(function(index, value) {
  670.                 img = new Image();
  671.                 size = 0;
  672.                 const ident = $(this).attr('id').toString();
  673.                 img.onload = function() {
  674.                     $('#'+ident).attr('data-size', this.width + 'x' + this.height);
  675.                 }
  676.                 img.src = $(this).attr('source');
  677.             }).promise().done( function(){
  678.                 setTimeout( function(){
  679.                     initPhotoSwipeFromDOM('.my-gallery');
  680.                 }, 1000);
  681.             } );
  682.             $('.owl-carousel.images .owl-stage').addClass('my-gallery');
  683.             $('.owl-carousel.images .owl-stage').attr('itemscope');
  684.             $('.owl-carousel.images .owl-stage').attr('itemtype', 'http://schema.org/ImageGallery');
  685.             $('.owl-carousel.images .owl-item ').attr('itemscope');
  686.             $('.owl-carousel.images .owl-item ').attr('itemprop', 'associatedMedia');
  687.             $('.owl-carousel.images .owl-item ').attr('itemtype', 'http://schema.org/ImageObject');
  688.         });
  689.     </script>
  690.     <script type="text/javascript">
  691.         var initPhotoSwipeFromDOM = function(gallerySelector) {
  692.             // parse slide data (url, title, size ...) from DOM elements
  693.             // (children of gallerySelector)
  694.             var parseThumbnailElements = function(el) {
  695.                 console.log(el.childNodes);
  696.                 var thumbElements = el.childNodes,
  697.                     numNodes = thumbElements.length,
  698.                     items = [
  699.                         // {
  700.                         //   src: 'https://dummyimage.com/1000x1000/ccc/5cac22',
  701.                         //   w: '1024',
  702.                         //   h: '1024'
  703.                         // },
  704.                         // {
  705.                         //   src: 'https://dummyimage.com/1000x1000/5cac22/fff',
  706.                         //   w: '1024',
  707.                         //   h: '1024'
  708.                         // }
  709.                     ],
  710.                     figureEl,
  711.                     linkEl,
  712.                     size,
  713.                     item;
  714.                 for(var i = 0; i < numNodes; i++) {
  715.                     figureEl = thumbElements[i]; // <figure> element
  716.                     // include only element nodes
  717.                     if(figureEl.nodeType !== 1) {
  718.                         continue;
  719.                     }
  720.                     linkEl = figureEl.children[0] // <a> element
  721.                     // console.log('linkEl')
  722.                     // console.log(linkEl.children[0])
  723.                     // console.log(linkEl.children[1])
  724.                     for(var j = 0; j < 2; j++) {
  725.                         size = linkEl.children[j].getAttribute('data-size').split('x');
  726.                         // create slide object
  727.                         item = {
  728.                             src: linkEl.children[j].getAttribute('href'),
  729.                             w: parseInt(size[0], 10),
  730.                             h: parseInt(size[1], 10)
  731.                         };
  732.                         if(figureEl.children.length > 1) {
  733.                             // <figcaption> content
  734.                             item.title = figureEl.children[1].innerHTML;
  735.                         }
  736.                         if(linkEl.children.length > 0) {
  737.                             // <img> thumbnail element, retrieving thumbnail url
  738.                             item.msrc = linkEl.children[0].getAttribute('src');
  739.                         }
  740.                         item.el = figureEl; // save link to element for getThumbBoundsFn
  741.                         items.push(item);
  742.                     }
  743.                 }
  744.                 return items;
  745.             };
  746.             // find nearest parent element
  747.             var closest = function closest(el, fn) {
  748.                 return el && ( fn(el) ? el : closest(el.parentNode, fn) );
  749.             };
  750.             // triggers when user clicks on thumbnail
  751.             var onThumbnailsClick = function(e) {
  752.                 e = e || window.event;
  753.                 e.preventDefault ? e.preventDefault() : e.returnValue = false;
  754.                 var eTarget = e.target || e.srcElement;
  755.                 // find root element of slide
  756.                 var clickedListItem = closest(eTarget, function(el) {
  757.                     return (el.tagName && el.tagName.toUpperCase() === 'FIGURE');
  758.                 });
  759.                 if(!clickedListItem) {
  760.                     return;
  761.                 }
  762.                 // find index of clicked item by looping through all child nodes
  763.                 // alternatively, you may define index via data- attribute
  764.                 var clickedGallery = clickedListItem.parentNode,
  765.                     childNodes = clickedListItem.parentNode.childNodes,
  766.                     numChildNodes = childNodes.length,
  767.                     nodeIndex = 0,
  768.                     index;
  769.                 for (var i = 0; i < numChildNodes; i++) {
  770.                     if(childNodes[i].nodeType !== 1) {
  771.                         continue;
  772.                     }
  773.                     if(childNodes[i] === clickedListItem) {
  774.                         index = nodeIndex;
  775.                         break;
  776.                     }
  777.                     nodeIndex++;
  778.                 }
  779.                 if(index >= 0) {
  780.                     // open PhotoSwipe if valid index found
  781.                     openPhotoSwipe( index, clickedGallery );
  782.                 }
  783.                 return false;
  784.             };
  785.             // parse picture index and gallery index from URL (#&pid=1&gid=2)
  786.             var photoswipeParseHash = function() {
  787.                 var hash = window.location.hash.substring(1),
  788.                     params = {};
  789.                 if(hash.length < 5) {
  790.                     return params;
  791.                 }
  792.                 var vars = hash.split('&');
  793.                 for (var i = 0; i < vars.length; i++) {
  794.                     if(!vars[i]) {
  795.                         continue;
  796.                     }
  797.                     var pair = vars[i].split('=');
  798.                     if(pair.length < 2) {
  799.                         continue;
  800.                     }
  801.                     params[pair[0]] = pair[1];
  802.                 }
  803.                 if(params.gid) {
  804.                     params.gid = parseInt(params.gid, 10);
  805.                 }
  806.                 return params;
  807.             };
  808.             var openPhotoSwipe = function(index, galleryElement, disableAnimation, fromURL) {
  809.                 var pswpElement = document.querySelectorAll('.pswp')[0],
  810.                     gallery,
  811.                     options,
  812.                     items;
  813.                 items = parseThumbnailElements(galleryElement);
  814.                 // define options (if needed)
  815.                 options = {
  816.                     // define gallery index (for URL)
  817.                     galleryUID: galleryElement.getAttribute('data-pswp-uid'),
  818.                     getThumbBoundsFn: function(index) {
  819.                         // See Options -> getThumbBoundsFn section of documentation for more info
  820.                         var thumbnail = items[index].el.getElementsByTagName('img')[0], // find thumbnail
  821.                             pageYScroll = window.pageYOffset || document.documentElement.scrollTop,
  822.                             rect = thumbnail.getBoundingClientRect();
  823.                         return {x:rect.left, y:rect.top + pageYScroll, w:rect.width};
  824.                     }
  825.                 };
  826.                 // PhotoSwipe opened from URL
  827.                 if(fromURL) {
  828.                     if(options.galleryPIDs) {
  829.                         // parse real index when custom PIDs are used
  830.                         // http://photoswipe.com/documentation/faq.html#custom-pid-in-url
  831.                         for(var j = 0; j < items.length; j++) {
  832.                             if(items[j].pid == index) {
  833.                                 options.index = j;
  834.                                 break;
  835.                             }
  836.                         }
  837.                     } else {
  838.                         // in URL indexes start from 1
  839.                         options.index = parseInt(index, 10) - 1;
  840.                     }
  841.                 } else {
  842.                     options.index = parseInt(index, 10);
  843.                 }
  844.                 // exit if index not found
  845.                 if( isNaN(options.index) ) {
  846.                     return;
  847.                 }
  848.                 if(disableAnimation) {
  849.                     options.showAnimationDuration = 0;
  850.                 }
  851.                 // Pass data to PhotoSwipe and initialize it
  852.                 gallery = new PhotoSwipe( pswpElement, PhotoSwipeUI_Default, items, options);
  853.                 gallery.init();
  854.             };
  855.             // loop through all gallery elements and bind events
  856.             var galleryElements = document.querySelectorAll( gallerySelector );
  857.             for(var i = 0, l = galleryElements.length; i < l; i++) {
  858.                 galleryElements[i].setAttribute('data-pswp-uid', i+1);
  859.                 galleryElements[i].onclick = onThumbnailsClick;
  860.             }
  861.             // Parse URL and open gallery if it contains #&pid=3&gid=1
  862.             var hashData = photoswipeParseHash();
  863.             if(hashData.pid && hashData.gid) {
  864.                 openPhotoSwipe( hashData.pid ,  galleryElements[ hashData.gid - 1 ], true, true );
  865.             }
  866.         };
  867.         // // execute above function
  868.         // initPhotoSwipeFromDOM('.my-gallery');
  869.     </script>
  870. {% endblock %}