<?phpuse Twig\Environment;use Twig\Error\LoaderError;use Twig\Error\RuntimeError;use Twig\Extension\CoreExtension;use Twig\Extension\SandboxExtension;use Twig\Markup;use Twig\Sandbox\SecurityError;use Twig\Sandbox\SecurityNotAllowedTagError;use Twig\Sandbox\SecurityNotAllowedFilterError;use Twig\Sandbox\SecurityNotAllowedFunctionError;use Twig\Source;use Twig\Template;use Twig\TemplateWrapper;/* vitrine/en/homepage.html.twig */class __TwigTemplate_44de184e5eb1317f89ee043904cd3b74 extends Template{ private Source $source; /** * @var array<string, Template> */ private array $macros = []; public function __construct(Environment $env) { parent::__construct($env); $this->source = $this->getSourceContext(); $this->blocks = [ 'title' => [$this, 'block_title'], 'description' => [$this, 'block_description'], 'robots' => [$this, 'block_robots'], 'canonical' => [$this, 'block_canonical'], 'body' => [$this, 'block_body'], 'footerjs' => [$this, 'block_footerjs'], 'css' => [$this, 'block_css'], ]; } protected function doGetParent(array $context): bool|string|Template|TemplateWrapper { // line 1 return "vitrine/en/layout.html.twig"; } protected function doDisplay(array $context, array $blocks = []): iterable { $macros = $this->macros; $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"]; $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "template", "vitrine/en/homepage.html.twig")); $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"]; $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "template", "vitrine/en/homepage.html.twig")); $this->parent = $this->load("vitrine/en/layout.html.twig", 1); yield from $this->parent->unwrap()->yield($context, array_merge($this->blocks, $blocks)); $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof); $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof); } // line 3 /** * @return iterable<null|scalar|\Stringable> */ public function block_title(array $context, array $blocks = []): iterable { $macros = $this->macros; $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"]; $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "title")); $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"]; $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "title")); yield "Cathedral Heritage Suite - 8-Guest Rental Strasbourg Center"; $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof); $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof); yield from []; } // line 4 /** * @return iterable<null|scalar|\Stringable> */ public function block_description(array $context, array $blocks = []): iterable { $macros = $this->macros; $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"]; $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "description")); $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"]; $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "description")); yield "Rent our 83m² suite in the heart of Strasbourg. 3 bedrooms, sleeps 8, 100m from Cathedral. Kitchen fully furnished, 2 bathrooms. Book your stay today!"; $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof); $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof); yield from []; } // line 5 /** * @return iterable<null|scalar|\Stringable> */ public function block_robots(array $context, array $blocks = []): iterable { $macros = $this->macros; $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"]; $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "robots")); $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"]; $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "robots")); yield "index,follow"; $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof); $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof); yield from []; } // line 7 /** * @return iterable<null|scalar|\Stringable> */ public function block_canonical(array $context, array $blocks = []): iterable { $macros = $this->macros; $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"]; $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "canonical")); $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"]; $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "canonical")); // line 8 yield " <link rel=\"canonical\" href=\"https://cathedraleheritage.com\" /> <link rel=\"alternate\" hreflang=\"fr\" href=\"https://cathedraleheritage.com/fr\" /> <link rel=\"alternate\" hreflang=\"en\" href=\"https://cathedraleheritage.com\" /> <link rel=\"alternate\" hreflang=\"x-default\" href=\"https://cathedraleheritage.com\" />"; $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof); $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof); yield from []; } // line 14 /** * @return iterable<null|scalar|\Stringable> */ public function block_body(array $context, array $blocks = []): iterable { $macros = $this->macros; $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"]; $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "body")); $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"]; $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "body")); // line 15 yield " <section id=\"hero\" class=\"text-light no-top no-bottom relative overflow-hidden z-1000\"> <div class=\"abs w-100 abs-centered z-2\"> <div class=\"container\"> <div class=\"spacer-double\"></div> <div class=\"row g-4 align-items-center justify-content-center\"> <div class=\"col-md-8 text-center\"> <h1 class=\"mb-2\" style=\"color:white;\">Welcome to Cathedral Heritage Suite</h1> <p class=\"lead mb-3\" style=\"color:white; font-size:22px;\">Beautifully appointed apartment accommodating up to 8 guests in Strasbourg’s prestigious historical city center</p> <a class=\"btn-main btn-line bg-blur fx-slide\" href=\"#about\" style=\"color:white;\"><span>Find out more</span></a> </div> </div> </div> </div> <div class=\"vertical-center\"> <div class=\"swiper\"> <div class=\"swiper-wrapper\"> <div class=\"swiper-slide\"> <div class=\"swiper-inner\" data-bgimage=\"url(/images/salon2.jpeg)\"> <div class=\"sw-overlay op-5\"></div> </div> </div> <div class=\"swiper-slide\"> <div class=\"swiper-inner\" data-bgimage=\"url(/images/chambre2.jpeg)\"> <div class=\"sw-overlay op-5\"></div> </div> </div> <div class=\"swiper-slide\"> <div class=\"swiper-inner\" data-bgimage=\"url(/images/noel.jpeg)\"> <div class=\"sw-overlay op-5\"></div> </div> </div> </div> </div> </div> <div class=\"abs w-100 bottom-0 z-2 pb-4 sm-hide\"> <div class=\"container\"> <div class=\"row\"> <div class=\"col-lg-12\"> <div class=\"d-flex justify-content-between\"> <div> <h6 style=\"color:white;\">Cathedral 100m away</h6> </div> <div> <h6 style=\"color:white;\">Museums 200m away</h6> </div> <div> <h6 style=\"color:white;\">Petite France 300m away</h6> </div> </div> </div> </div> </div> </div> <div class=\"gradient-edge-bottom op-8\"></div> </section> <section id=\"about\"> <div class=\"container\"> <div class=\"row g-4 align-items-end justify-content-between\"> <div class=\"col-lg-5\"> <div class=\"subtitle\">About the apartment</div> <h2>Modern suite in the heart of Strasbourg's Grande Île</h2> </div> <div class=\"col-lg-4\"> <p class=\"mb-4\" style=\"color:#212121;\"> Spacious fully equipped appartement ideal for families and groups up to 8 people : 1 master bedroom with en-suite bathroom, one double bedroom, one bedroom with two double bunk beds (sleeps 4), maximum weight of 100kg for upper bunks. </p> <p class=\"mb-4\" style=\"color:#212121;\"> Kitchen fully furnished and cozy living-dining room to share great moments together. </p> <p class=\"mb-4\" style=\"color:#212121;\"> Amenities: hairdryer, dishwasher, washer-dryer, microwave, oven, ironing board with iron, Nespresso coffee machine, kettle, TV, Wi-Fi and USB outlets for charging your devices. </p> </div> </div> <div class=\"spacer-single\"></div> <div class=\"row g-4\"> <div class=\"col-md-2\"> <div class=\"relative\"> <h5>Size</h5> <div class=\"d-flex justify-content-start align-items-center\" style=\"padding-top:6px;\"> <img src=\"/images/home.png\" width=\"37\" class=\"me-3\" alt=\"\"> <div class=\"fs-20 fw-600\" style=\"color:#212121;\">83 m²</div> </div> </div> </div> <div class=\"col-md-2\"> <div class=\"relative\"> <h5>Bedrooms</h5> <div class=\"d-flex justify-content-start align-items-center\" style=\"padding-top:4px;\"> <img src=\"/images/bed.png\" width=\"37\" class=\"me-3\" alt=\"\"> <div class=\"fs-20 fw-600\" style=\"color:#212121;\">3</div> </div> </div> </div> <div class=\"col-md-2\"> <div class=\"relative\"> <h5>Living Room</h5> <div class=\"d-flex justify-content-start align-items-center\"> <img src=\"/images/sofa.png\" width=\"50\" class=\"me-3\" alt=\"\"> <div class=\"fs-20 fw-600\" style=\"color:#212121;\">Included</div> </div> </div> </div> <div class=\"col-md-2\"> <div class=\"relative\"> <h5>Kitchen</h5> <div class=\"d-flex justify-content-start align-items-center\" style=\"padding-top:6px;\"> <img src=\"/images/cooking.png\" width=\"37\" class=\"me-3\" alt=\"\"> <div class=\"fs-20 fw-600\" style=\"color:#212121;\">Included</div> </div> </div> </div> <div class=\"col-md-2\"> <div class=\"relative\"> <h5>Bathrooms</h5> <div class=\"d-flex justify-content-start align-items-center\" style=\"padding-top:4px;\"> <img src=\"/images/bathroom.png\" width=\"40\" class=\"me-3\" alt=\"\"> <div class=\"fs-20 fw-600\" style=\"color:#212121;\">2</div> </div> </div> </div> <div class=\"col-md-2\"> <div class=\"relative\"> <h5>Guests</h5> <div class=\"d-flex justify-content-start align-items-center\" style=\"padding-top:5px;\"> <img src=\"/images/user.png\" width=\"37\" class=\"me-3\" alt=\"\"> <div class=\"fs-20 fw-600\" style=\"color:#212121;\">8</div> </div> </div> </div> </div> </div> </section> <section id=\"rooms\" class=\"p-0 overflow-hidden\"> <div class=\"container-fluid\"> <div class=\"row\"> <div class=\"col-lg-12\"> <div class=\"owl-custom-nav menu-float\" data-target=\"#room-carousel\"> <a class=\"btn-next\"></a> <a class=\"btn-prev\"></a> <div id=\"room-carousel\" class=\"owl-2-cols-center owl-carousel owl-theme\"> <div class=\"item\"> <div class=\"relative\"> <div class=\"overflow-hidden text-light\"> <div class=\"abs h-100 start-0 z-2 p-4\"> <h3 style=\"color:white;\">Living Room</h3> </div> <img src=\"/images/salon2.jpeg\" class=\"w-100\" alt=\"Living Room\"> </div> </div> </div> <div class=\"item\"> <div class=\"relative\"> <div class=\"overflow-hidden text-light\"> <div class=\"abs h-100 start-1 z-2 p-4\"> <h3 style=\"color:white;\">Bedroom 1</h3> </div> <img src=\"/images/chambre1.jpeg\" class=\"w-100\" alt=\"Bedroom 1\"> </div> </div> </div> <div class=\"item\"> <div class=\"relative\"> <div class=\"overflow-hidden text-light\"> <div class=\"abs h-100 start-2 z-2 p-4\"> <h3 style=\"color:white;\">Bedroom 2</h3> </div> <img src=\"/images/chambre2.jpeg\" class=\"w-100\" alt=\"Bedroom 2\"> </div> </div> </div> <div class=\"item\"> <div class=\"relative\"> <div class=\"overflow-hidden text-light\"> <div class=\"abs h-100 start-3 z-2 p-4\"> <h3 style=\"color:white;\">Bedroom 3</h3> </div> <img src=\"/images/chambre3.jpeg\" class=\"w-100\" alt=\"Bedroom 3\"> </div> </div> </div> <div class=\"item\"> <div class=\"relative\"> <div class=\"overflow-hidden text-light\"> <div class=\"abs h-100 start-4 z-2 p-4\"> <h3 style=\"color:white;\">Kitchen</h3> </div> <img src=\"/images/cuisine.jpeg\" class=\"w-100\" alt=\"Kitchen\"> </div> </div> </div> <div class=\"item\"> <div class=\"relative\"> <div class=\"overflow-hidden text-light\"> <div class=\"abs h-100 start-5 z-2 p-4\"> <h3 style=\"color:white;\">Bathroom</h3> </div> <img src=\"/images/salledebain.jpeg\" class=\"w-100\" alt=\"Bathroom 1\"> </div> </div> </div> <div class=\"item\"> <div class=\"relative\"> <div class=\"overflow-hidden text-light\"> <div class=\"abs h-100 start-6 z-2 p-4\"> <h3 style=\"color:white;\">Bathroom 2</h3> </div> <img src=\"/images/salledebain2.jpeg\" class=\"w-100\" alt=\"Bathroom 2\"> </div> </div> </div> </div> </div> </div> </div> </div> </section> <section id=\"services\" class=\"overlay-dark-1\"> <div class=\"container\"> <div class=\"row g-4 justify-content-between\"> <div class=\"col-lg-5 relative z-3\"> <div class=\"me-lg-3\"> <div class=\"subtitle wow fadeInUp\" data-wow-delay=\".0s\">Your stay in Strasbourg</div> <h2 class=\"wow fadeInUp\" data-wow-delay=\".2s\">Rates and services</h2> <p style=\"color:#212121; font-size:18px;\">An exceptional suite in the heart of Strasbourg, with optionnal dedicated concierge service to assist you throughout your stay.</p> <p style=\"color:#212121; font-size:18px;\">Minimum booking of two nights.</p> <a href=\"#reservation\" class=\"btn-main\" style=\"color:white;\">Booking</a> </div> </div> <div class=\"col-lg-6\" style=\"color:black;\"> <div class=\"spacer-single spacer-double\"></div> <div class=\"row\"> <div class=\"col-md-6 wow fadeInUp\" data-wow-delay=\".2s\"> "; // line 288 yield " <ul class=\"ul-check fs-500\"> <li>2 guests: €350 per night</li> <li>4 guests: €690 per night</li> <li>from 6 guests and up: €890 per night</li> <li>10% discount for bookings of 7 nights and up</li> </ul> </div> <div class=\"col-md-6 wow fadeInUp\" data-wow-delay=\".4s\"> <h5 class=\"mb-3\">Optional services</h5> <ul class=\"ul-check fs-500\"> <li>One parking space: €24/day or €150/week</li> <li>Extra cleaning during your stay : 60 euros</li> <li>Other Extras : Children's workshop, baby amenities, dog policy on request (other pets are unfortunately not allowed in the appartement), Decoration for special occasions, breakfast, Alsatian delicacies, etc</li> </ul> <div class=\"mt-4\"> <p class=\"fs-500\"> <strong>On site assistance</strong> <br /> <small>Tuesday to Saturday • 10am-6:45pm</small> </p> <p class=\"fs-500\"> <strong>Private concierge subject to availability</strong><br> <small>Quotation on request</small> </p> </div> </div> </div> </div> </div> </div> </section> <section id=\"section-gallery\" class=\"relative\"> <div class=\"container relative z-2\" id=\"photos\"> <div class=\"row g-4 gx-5 justify-content-center\"> <div class=\"col-lg-6 text-center\"> <h2 class=\"wow fadeInUp\" data-wow-delay=\".2s\">Apartment Gallery</h2> <p class=\"wow fadeInUp\" data-wow-delay=\".3s\" style=\"color:#212121;\">Explore our curated images to discover the residence’s various spaces — from the bedrooms and living area to the kitchen, bathroom, and outdoor surroundings.</p> </div> </div> <div class=\"row\"> <div class=\"col-md-12 text-center\"> <ul id=\"filters\" class=\"wow fadeInUp\" data-wow-delay=\"0s\"> <li><a href=\"#\" data-filter=\"*\" class=\"selected\" style=\"color:#212121;\">Show All</a></li> <li><a href=\"#\" data-filter=\".chambre\" style=\"color:#212121;\">Bedrooms</a></li> <li><a href=\"#\" data-filter=\".salon\" style=\"color:#212121;\">Living Room</a></li> <li><a href=\"#\" data-filter=\".cuisine\" style=\"color:#212121;\">Kitchen</a></li> <li><a href=\"#\" data-filter=\".salledebain\" style=\"color:#212121;\">Bathroom</a></li> <li><a href=\"#\" data-filter=\".exterieur\" style=\"color:#212121;\">Outdoor surroundings</a></li> </ul> </div> </div> <div id=\"gallery\" class=\"row g-3 wow fadeInUp\" data-wow-delay=\".3s\"> <div class=\"col-md-3 col-sm-6 col-12 item chambre\"> <a href=\"images/chambre1.jpeg\" class=\"image-popup d-block hover\"> <div class=\"relative overflow-hidden\"> <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\"> View </div> <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div> <img src=\"images/chambre1.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Bedroom\"> </div> </a> </div> <div class=\"col-md-3 col-sm-6 col-12 item chambre\"> <a href=\"images/chambre2.jpeg\" class=\"image-popup d-block hover\"> <div class=\"relative overflow-hidden\"> <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\"> View </div> <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div> <img src=\"images/chambre2.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Bedroom 2\"> </div> </a> </div> <div class=\"col-md-3 col-sm-6 col-12 item chambre\"> <a href=\"images/chambre3.jpeg\" class=\"image-popup d-block hover\"> <div class=\"relative overflow-hidden\"> <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\"> View </div> <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div> <img src=\"images/chambre3.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Bedroom 3\"> </div> </a> </div> <div class=\"col-md-3 col-sm-6 col-12 item salon\"> <a href=\"images/salon.jpeg\" class=\"image-popup d-block hover\"> <div class=\"relative overflow-hidden\"> <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\"> View </div> <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div> <img src=\"images/salon.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Living Room\"> </div> </a> </div> <div class=\"col-md-3 col-sm-6 col-12 item salon\"> <a href=\"images/salon2.jpeg\" class=\"image-popup d-block hover\"> <div class=\"relative overflow-hidden\"> <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\"> View </div> <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div> <img src=\"images/salon2.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Living Room 2\"> </div> </a> </div> <div class=\"col-md-3 col-sm-6 col-12 item salon\"> <a href=\"images/salon3.jpeg\" class=\"image-popup d-block hover\"> <div class=\"relative overflow-hidden\"> <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\"> View </div> <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div> <img src=\"images/salon3.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Living Room 3\"> </div> </a> </div> <div class=\"col-md-3 col-sm-6 col-12 item salon\"> <a href=\"images/salon4.jpeg\" class=\"image-popup d-block hover\"> <div class=\"relative overflow-hidden\"> <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\"> View </div> <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div> <img src=\"images/salon4.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Living Room 4\"> </div> </a> </div> <div class=\"col-md-3 col-sm-6 col-12 item salon\"> <a href=\"images/salon5.jpeg\" class=\"image-popup d-block hover\"> <div class=\"relative overflow-hidden\"> <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\"> View </div> <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div> <img src=\"images/salon5.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Living Room 5\"> </div> </a> </div> <div class=\"col-md-3 col-sm-6 col-12 item cuisine\"> <a href=\"images/cuisine.jpeg\" class=\"image-popup d-block hover\"> <div class=\"relative overflow-hidden\"> <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\"> View </div> <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div> <img src=\"images/cuisine.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Kitchen\"> </div> </a> </div> <div class=\"col-md-3 col-sm-6 col-12 item salledebain\"> <a href=\"images/salledebain.jpeg\" class=\"image-popup d-block hover\"> <div class=\"relative overflow-hidden\"> <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\"> View </div> <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div> <img src=\"images/salledebain.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Bathroom\"> </div> </a> </div> <div class=\"col-md-3 col-sm-6 col-12 item salledebain\"> <a href=\"images/salledebain2.jpeg\" class=\"image-popup d-block hover\"> <div class=\"relative overflow-hidden\"> <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\"> View </div> <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div> <img src=\"images/salledebain2.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Bathroom 2\"> </div> </a> </div> <div class=\"col-md-3 col-sm-6 col-12 item exterieur\"> <a href=\"images/exterieur.jpeg\" class=\"image-popup d-block hover\"> <div class=\"relative overflow-hidden\"> <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\"> View </div> <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div> <img src=\"images/exterieur.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Exterior\"> </div> </a> </div> </div> </div> </section> <section id=\"reservation\" class=\"text-light\"> <div class=\"container\"> <div class=\"row g-4 justify-content-center\"> <div class=\"col-lg-6 text-center\"> <h2 class=\"wow fadeInUp\" data-wow-delay=\".2s\">Book your stay</h2> </div> </div> <div class=\"row g-4 justify-content-center\"> <div class=\"col-md-6\"> "; // line 494 yield $this->env->getRuntime('Symfony\Component\Form\FormRenderer')->renderBlock((isset($context["form"]) || array_key_exists("form", $context) ? $context["form"] : (function () { throw new RuntimeError('Variable "form" does not exist.', 494, $this->source); })()), 'form_start'); yield " <div class=\"row g-4\"> <div class=\"col-md-12\"> <div class=\"calendar-container\" style=\"height:300px;\"> <input type=\"text\" id=\"date_range_picker\"> </div> </div> <div class=\"col-md-3\"> <label style=\"color:#212121;\">Guests</label> "; // line 505 yield $this->env->getRuntime('Symfony\Component\Form\FormRenderer')->searchAndRenderBlock(CoreExtension::getAttribute($this->env, $this->source, (isset($context["form"]) || array_key_exists("form", $context) ? $context["form"] : (function () { throw new RuntimeError('Variable "form" does not exist.', 505, $this->source); })()), "persons", [], "any", false, false, false, 505), 'widget'); yield " </div> <div class=\"col-md-3\"> <label style=\"color:#212121;\">Arrival</label> <br /> </strong> <span id=\"info-start\" style=\"color:#212121;\">-</span> </div> <div class=\"col-md-3\"> <label style=\"color:#212121;\">Departure</label> <br /> <span id=\"info-end\" style=\"color:#212121;\">-</span> </div> <div class=\"col-md-3\"> <label style=\"color:#212121;\">Nights</label> <br /> <span id=\"info-nights\" style=\"color:#212121;\">-</span> </div> <div class=\"col-md-12\" style=\"font-size:20px;\"> <div id=\"results\"></div> </div> <div class=\"col-md-6\"> <label style=\"color:#212121;\">Last name</label> "; // line 529 yield $this->env->getRuntime('Symfony\Component\Form\FormRenderer')->searchAndRenderBlock(CoreExtension::getAttribute($this->env, $this->source, (isset($context["form"]) || array_key_exists("form", $context) ? $context["form"] : (function () { throw new RuntimeError('Variable "form" does not exist.', 529, $this->source); })()), "lastname", [], "any", false, false, false, 529), 'widget'); yield " </div> <div class=\"col-md-6\"> <label style=\"color:#212121;\">First name</label> "; // line 534 yield $this->env->getRuntime('Symfony\Component\Form\FormRenderer')->searchAndRenderBlock(CoreExtension::getAttribute($this->env, $this->source, (isset($context["form"]) || array_key_exists("form", $context) ? $context["form"] : (function () { throw new RuntimeError('Variable "form" does not exist.', 534, $this->source); })()), "name", [], "any", false, false, false, 534), 'widget'); yield " </div> <div class=\"col-md-12\"> <label style=\"color:#212121;\">Email address</label> "; // line 539 yield $this->env->getRuntime('Symfony\Component\Form\FormRenderer')->searchAndRenderBlock(CoreExtension::getAttribute($this->env, $this->source, (isset($context["form"]) || array_key_exists("form", $context) ? $context["form"] : (function () { throw new RuntimeError('Variable "form" does not exist.', 539, $this->source); })()), "email", [], "any", false, false, false, 539), 'widget'); yield " </div> <div class=\"col-md-12\"> <label style=\"color:#212121;\">Message</label> "; // line 544 yield $this->env->getRuntime('Symfony\Component\Form\FormRenderer')->searchAndRenderBlock(CoreExtension::getAttribute($this->env, $this->source, (isset($context["form"]) || array_key_exists("form", $context) ? $context["form"] : (function () { throw new RuntimeError('Variable "form" does not exist.', 544, $this->source); })()), "message", [], "any", false, false, false, 544), 'widget'); yield " </div> <div class=\"col-md-12\"> <div class=\"text-center\" style=\"color:#212121;\"> <input type=\"checkbox\" id=\"acceptCGV\" /> I accept the <a href=\"/terms\" target=\"_blank\" style=\"text-decoration:underline; color:#212121;\">terms and conditions of sale</a> </div> </div> <div class=\"col-md-12\"> <div class=\"text-center\"> <button type=\"submit\" name=\"submit\" value=\"1\" class=\"btn-main\" style=\"color:white;\">Send booking request</button> </div> </div> </div> "; // line 560 yield $this->env->getRuntime('Symfony\Component\Form\FormRenderer')->searchAndRenderBlock(CoreExtension::getAttribute($this->env, $this->source, (isset($context["form"]) || array_key_exists("form", $context) ? $context["form"] : (function () { throw new RuntimeError('Variable "form" does not exist.', 560, $this->source); })()), "start", [], "any", false, false, false, 560), 'widget'); yield " "; // line 561 yield $this->env->getRuntime('Symfony\Component\Form\FormRenderer')->searchAndRenderBlock(CoreExtension::getAttribute($this->env, $this->source, (isset($context["form"]) || array_key_exists("form", $context) ? $context["form"] : (function () { throw new RuntimeError('Variable "form" does not exist.', 561, $this->source); })()), "end", [], "any", false, false, false, 561), 'widget'); yield " "; // line 563 yield $this->env->getRuntime('Symfony\Component\Form\FormRenderer')->searchAndRenderBlock((isset($context["form"]) || array_key_exists("form", $context) ? $context["form"] : (function () { throw new RuntimeError('Variable "form" does not exist.', 563, $this->source); })()), 'rest'); yield " "; // line 564 yield $this->env->getRuntime('Symfony\Component\Form\FormRenderer')->renderBlock((isset($context["form"]) || array_key_exists("form", $context) ? $context["form"] : (function () { throw new RuntimeError('Variable "form" does not exist.', 564, $this->source); })()), 'form_end'); yield " </div> </div> </div> </section> <section id=\"faq\" class=\"text-light\"> <div class=\"container\"> <div class=\"row g-4 justify-content-center\"> <div class=\"col-lg-6 text-center\"> <h2 class=\"wow fadeInUp\" data-wow-delay=\".2s\">FAQ</h2> </div> </div> <div class=\"row g-4 justify-content-center\"> <div class=\"col-lg-6 text-left\" style=\"color:black !important;\"> <h3 style=\"margin-top:7px;\">How can I book the accommodation?</h3> <div>You can book directly on our website and soon via partner platforms. Secure payment immediately confirms your reservation.</div> <h3 style=\"margin-top:7px;\">What are the check-in and check-out times?</h3> <div> <ul> <li>Check-in: from 3:00 PM</li> <li>Check-out: before 11:00 AM</li> </ul> </div> <h3 style=\"margin-top:7px;\">Is the accommodation fully equipped?</h3> <div> Yes, the apartment is fully furnished and equipped: kitchen, bedding, towels, appliances, Wi-Fi, and more.</div> <h3 style=\"margin-top:7px;\">Is parking available?</h3> <div>Yes, private parking is available as an option at €24 per 24 hours or €150 per week (7 nights).</div> <h3 style=\"margin-top:7px;\">Is the accommodation suitable for children?</h3> <div>Yes, we offer some baby amenities (baby cot, high chair, child-friendly tableware) upon request.</div> <h3 style=\"margin-top:7px;\"> Are pets allowed?</h3> <div> Please contact us before booking if you wish to bring a pet. Only dogs are accepted, and prior approval is required.</div> <h3 style=\"margin-top:7px;\">Can I cancel or modify my reservation?</h3> <div>Yes, our cancellation policy is provided at the time of booking: <ul> <li>85% refund if canceled more than 1 month before arrival</li> <li>50% refund if canceled between 1 month and 15 days before arrival</li> <li>No refund if canceled less than 15 days before arrival</li> </ul> </div> <h3 style=\"margin-top:7px;\">Is the accommodation accessible by public transport?</h3> <div>Yes, major transport options are nearby. The tram station “Langstross, Grand’rue” is less than 100 meters from the apartment, and Strasbourg train station is a 10-minute walk.</div> <h3 style=\"margin-top:7px;\">Are there shops or restaurants nearby?</h3> <div>Yes, you’ll find supermarkets, cafés, restaurants, and tourist activities right at the foot of the building.</div> <h3 style=\"margin-top:7px;\"> What should I do if there’s a problem during my stay?</h3> <div> We are available 24/7 by email for emergencies or questions about the apartment. You can also call us from 9:00 AM to 8:00 PM at +33 7 61 05 82 43, and we are available on-site on the ground floor of the building from Tuesday to Saturday, 10:00 AM to 6:45 PM. </div> </div> </div> </div> </section>"; $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof); $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof); yield from []; } // line 632 /** * @return iterable<null|scalar|\Stringable> */ public function block_footerjs(array $context, array $blocks = []): iterable { $macros = $this->macros; $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"]; $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "footerjs")); $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"]; $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "footerjs")); // line 633 yield " <script src=\"https://cdn.jsdelivr.net/npm/flatpickr\"></script> <script src=\"https://cdn.jsdelivr.net/npm/flatpickr/dist/l10n/en.js\"></script> <script> function updateSimulation() { var start = \$(\"#reservation_form_start\").val(); var end = \$(\"#reservation_form_end\").val(); var persons = \$(\"#reservation_form_persons\").val(); if (start && end && persons) { \$(\"#results\").html('<div class=\"loading\">Calculating...</div>'); \$.post( Routing.generate('simulation_pricing'), {'start': start, 'end': end, 'persons': persons} ) .done(function(data) { \$(\"#results\").html(data); }) .fail(function() { \$(\"#results\").html('<div class=\"error\">Calculation error</div>'); }); } else { \$(\"#results\").html(''); } } // Écoute les changements sur le nombre de personnes \$(\"#reservation_form_persons\").change(updateSimulation); \$(document).ready(function() { // Désactive le bouton au chargement de la page \$('button[type=\"submit\"]').prop('disabled', true); // Écoute les changements sur la checkbox \$('#acceptCGV').change(function() { if(\$(this).is(':checked')) { \$('button[type=\"submit\"]').prop('disabled', false); } else { \$('button[type=\"submit\"]').prop('disabled', true); } }); }); </script> <script> \$(document).ready(function() { let bookedRanges = []; \$.ajax({ url: '"; // line 681 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['App\Twig\CoreExtension']->getEnvironmentVariable("WEBHOOK_CALENDAR_AVAILABILITY"), "html", null, true); yield "', method: 'POST', contentType: 'application/json', data: '' }) .done(function(data) { bookedRanges = data.bookings || []; console.log('✅ Créneaux chargés:', bookedRanges); initDatePicker(); }) .fail(function(error) { console.error('❌ Erreur:', error); initDatePicker(); }); // 🔧 FONCTION POUR CRÉER UNE DATE LOCALE SANS DÉCALAGE UTC function parseLocalDate(dateStr) { const [year, month, day] = dateStr.split('-').map(Number); return new Date(year, month - 1, day); } const isMobile = window.innerWidth <= 900; function initDatePicker() { flatpickr(\"#date_range_picker\", { inline: true, mode: \"range\", locale: \"fr\", minDate: new Date(new Date().setDate(new Date().getDate() + 1)), dateFormat: \"Y-m-d\", showMonths: isMobile ? 1 : 2, disable: [ function(date) { const checkDate = new Date(date); checkDate.setHours(0, 0, 0, 0); return bookedRanges.some(range => { const start = parseLocalDate(range.start_date); const end = parseLocalDate(range.end_date); return checkDate >= start && checkDate <= end; }); } ], onChange: function(selectedDates, dateStr, instance) { console.log('📅 Dates sélectionnées:', selectedDates.length); if (selectedDates.length === 2) { const start = selectedDates[0]; const end = selectedDates[1]; if (isRangeAvailable(start, end)) { // ✅ Met à jour avec jQuery ET déclenche l'événement change \$('#reservation_form_start').val(formatDate(start)).trigger('change'); \$('#reservation_form_end').val(formatDate(end)).trigger('change'); console.log('✅ Champs mis à jour:', \$('#reservation_form_start').val(), '→', \$('#reservation_form_end').val() ); updateSelectedInfo(start, end); // ✅ Force la simulation updateSimulation(); } else { alert('⚠️ Cette période contient des dates déjà réservées.\\nVeuillez choisir une autre période.'); instance.clear(); clearSymfonyFields(); hideSelectedInfo(); \$(\"#results\").html(''); } } else { clearSymfonyFields(); hideSelectedInfo(); \$(\"#results\").html(''); } }, onDayCreate: function(dObj, dStr, fp, dayElem) { const date = new Date(dayElem.dateObj); date.setHours(0, 0, 0, 0); const isBooked = bookedRanges.some(range => { const start = parseLocalDate(range.start_date); const end = parseLocalDate(range.end_date); return date >= start && date <= end; }); if (isBooked) { dayElem.classList.add('booked'); dayElem.title = 'Date indisponible (réservée)'; } else if (date >= new Date()) { dayElem.classList.add('available'); dayElem.title = 'Date disponible'; } } }); } function isRangeAvailable(startDate, endDate) { let currentDate = new Date(startDate); currentDate.setHours(0, 0, 0, 0); const endCheck = new Date(endDate); endCheck.setHours(0, 0, 0, 0); while (currentDate <= endCheck) { const isBooked = bookedRanges.some(range => { const start = parseLocalDate(range.start_date); const end = parseLocalDate(range.end_date); return currentDate >= start && currentDate <= end; }); if (isBooked) return false; currentDate.setDate(currentDate.getDate() + 1); } return true; } function updateSelectedInfo(start, end) { const nights = Math.ceil((end - start) / (1000 * 60 * 60 * 24)); \$('#info-start').text(start.toLocaleDateString('fr-FR')); \$('#info-end').text(end.toLocaleDateString('fr-FR')); \$('#info-nights').text(`\${nights} nuit\${nights > 1 ? 's' : ''}`); \$('#selected-dates-info').addClass('active'); } function hideSelectedInfo() { \$('#selected-dates-info').removeClass('active'); } function clearSymfonyFields() { \$('#reservation_form_start').val(''); \$('#reservation_form_end').val(''); } function formatDate(date) { const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, '0'); const day = String(date.getDate()).padStart(2, '0'); return `\${year}-\${month}-\${day}`; } }); </script>"; $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof); $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof); yield from []; } // line 831 /** * @return iterable<null|scalar|\Stringable> */ public function block_css(array $context, array $blocks = []): iterable { $macros = $this->macros; $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"]; $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "css")); $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"]; $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "css")); // line 832 yield " <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css\"> <style> .calendar-container { margin: 20px 0; width: 100%; overflow: hidden; } /* Calendrier inline (toujours visible) */ #date_range_picker { display: none; /* Le champ input est caché, on affiche juste le calendrier */ } .flatpickr-calendar.inline { margin: 0 auto; box-shadow: 0 4px 12px rgba(0,0,0,0.15); border-radius: 8px; max-width: 100%; } .flatpickr-day.booked { background-color: #ff4444 !important; color: white !important; cursor: not-allowed !important; position: relative; } .flatpickr-day.booked::after { content: \"✕\"; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); font-size: 20px; font-weight: bold; } .flatpickr-day.booked:hover { background-color: #ff0000 !important; } .flatpickr-day.available:hover { background-color: #28a745; color: white; } /* Adaptations Mobile */ @media (max-width: 768px) { .calendar-container { margin: 10px 0; padding: 0 10px; } .flatpickr-calendar.inline { width: 100% !important; max-width: 100% !important; } .flatpickr-months { padding: 8px 10px; } .flatpickr-days { width: 100% !important; } .dayContainer { width: 100% !important; min-width: 100% !important; max-width: 100% !important; } .flatpickr-day { height: 40px !important; line-height: 40px !important; flex-basis: 14.2857% !important; max-width: 14.2857% !important; } } </style>"; $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof); $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof); yield from []; } /** * @codeCoverageIgnore */ public function getTemplateName(): string { return "vitrine/en/homepage.html.twig"; } /** * @codeCoverageIgnore */ public function isTraitable(): bool { return false; } /** * @codeCoverageIgnore */ public function getDebugInfo(): array { return array ( 1063 => 832, 1050 => 831, 890 => 681, 840 => 633, 827 => 632, 749 => 564, 745 => 563, 740 => 561, 736 => 560, 717 => 544, 709 => 539, 701 => 534, 693 => 529, 666 => 505, 652 => 494, 444 => 288, 179 => 15, 166 => 14, 151 => 8, 138 => 7, 115 => 5, 92 => 4, 69 => 3, 46 => 1,); } public function getSourceContext(): Source { return new Source("{% extends 'vitrine/en/layout.html.twig' %}{% block title %}Cathedral Heritage Suite - 8-Guest Rental Strasbourg Center{% endblock title %}{% block description %}Rent our 83m² suite in the heart of Strasbourg. 3 bedrooms, sleeps 8, 100m from Cathedral. Kitchen fully furnished, 2 bathrooms. Book your stay today!{% endblock description %}{% block robots %}index,follow{% endblock robots %}{% block canonical %} <link rel=\"canonical\" href=\"https://cathedraleheritage.com\" /> <link rel=\"alternate\" hreflang=\"fr\" href=\"https://cathedraleheritage.com/fr\" /> <link rel=\"alternate\" hreflang=\"en\" href=\"https://cathedraleheritage.com\" /> <link rel=\"alternate\" hreflang=\"x-default\" href=\"https://cathedraleheritage.com\" />{% endblock canonical %}{% block body %} <section id=\"hero\" class=\"text-light no-top no-bottom relative overflow-hidden z-1000\"> <div class=\"abs w-100 abs-centered z-2\"> <div class=\"container\"> <div class=\"spacer-double\"></div> <div class=\"row g-4 align-items-center justify-content-center\"> <div class=\"col-md-8 text-center\"> <h1 class=\"mb-2\" style=\"color:white;\">Welcome to Cathedral Heritage Suite</h1> <p class=\"lead mb-3\" style=\"color:white; font-size:22px;\">Beautifully appointed apartment accommodating up to 8 guests in Strasbourg’s prestigious historical city center</p> <a class=\"btn-main btn-line bg-blur fx-slide\" href=\"#about\" style=\"color:white;\"><span>Find out more</span></a> </div> </div> </div> </div> <div class=\"vertical-center\"> <div class=\"swiper\"> <div class=\"swiper-wrapper\"> <div class=\"swiper-slide\"> <div class=\"swiper-inner\" data-bgimage=\"url(/images/salon2.jpeg)\"> <div class=\"sw-overlay op-5\"></div> </div> </div> <div class=\"swiper-slide\"> <div class=\"swiper-inner\" data-bgimage=\"url(/images/chambre2.jpeg)\"> <div class=\"sw-overlay op-5\"></div> </div> </div> <div class=\"swiper-slide\"> <div class=\"swiper-inner\" data-bgimage=\"url(/images/noel.jpeg)\"> <div class=\"sw-overlay op-5\"></div> </div> </div> </div> </div> </div> <div class=\"abs w-100 bottom-0 z-2 pb-4 sm-hide\"> <div class=\"container\"> <div class=\"row\"> <div class=\"col-lg-12\"> <div class=\"d-flex justify-content-between\"> <div> <h6 style=\"color:white;\">Cathedral 100m away</h6> </div> <div> <h6 style=\"color:white;\">Museums 200m away</h6> </div> <div> <h6 style=\"color:white;\">Petite France 300m away</h6> </div> </div> </div> </div> </div> </div> <div class=\"gradient-edge-bottom op-8\"></div> </section> <section id=\"about\"> <div class=\"container\"> <div class=\"row g-4 align-items-end justify-content-between\"> <div class=\"col-lg-5\"> <div class=\"subtitle\">About the apartment</div> <h2>Modern suite in the heart of Strasbourg's Grande Île</h2> </div> <div class=\"col-lg-4\"> <p class=\"mb-4\" style=\"color:#212121;\"> Spacious fully equipped appartement ideal for families and groups up to 8 people : 1 master bedroom with en-suite bathroom, one double bedroom, one bedroom with two double bunk beds (sleeps 4), maximum weight of 100kg for upper bunks. </p> <p class=\"mb-4\" style=\"color:#212121;\"> Kitchen fully furnished and cozy living-dining room to share great moments together. </p> <p class=\"mb-4\" style=\"color:#212121;\"> Amenities: hairdryer, dishwasher, washer-dryer, microwave, oven, ironing board with iron, Nespresso coffee machine, kettle, TV, Wi-Fi and USB outlets for charging your devices. </p> </div> </div> <div class=\"spacer-single\"></div> <div class=\"row g-4\"> <div class=\"col-md-2\"> <div class=\"relative\"> <h5>Size</h5> <div class=\"d-flex justify-content-start align-items-center\" style=\"padding-top:6px;\"> <img src=\"/images/home.png\" width=\"37\" class=\"me-3\" alt=\"\"> <div class=\"fs-20 fw-600\" style=\"color:#212121;\">83 m²</div> </div> </div> </div> <div class=\"col-md-2\"> <div class=\"relative\"> <h5>Bedrooms</h5> <div class=\"d-flex justify-content-start align-items-center\" style=\"padding-top:4px;\"> <img src=\"/images/bed.png\" width=\"37\" class=\"me-3\" alt=\"\"> <div class=\"fs-20 fw-600\" style=\"color:#212121;\">3</div> </div> </div> </div> <div class=\"col-md-2\"> <div class=\"relative\"> <h5>Living Room</h5> <div class=\"d-flex justify-content-start align-items-center\"> <img src=\"/images/sofa.png\" width=\"50\" class=\"me-3\" alt=\"\"> <div class=\"fs-20 fw-600\" style=\"color:#212121;\">Included</div> </div> </div> </div> <div class=\"col-md-2\"> <div class=\"relative\"> <h5>Kitchen</h5> <div class=\"d-flex justify-content-start align-items-center\" style=\"padding-top:6px;\"> <img src=\"/images/cooking.png\" width=\"37\" class=\"me-3\" alt=\"\"> <div class=\"fs-20 fw-600\" style=\"color:#212121;\">Included</div> </div> </div> </div> <div class=\"col-md-2\"> <div class=\"relative\"> <h5>Bathrooms</h5> <div class=\"d-flex justify-content-start align-items-center\" style=\"padding-top:4px;\"> <img src=\"/images/bathroom.png\" width=\"40\" class=\"me-3\" alt=\"\"> <div class=\"fs-20 fw-600\" style=\"color:#212121;\">2</div> </div> </div> </div> <div class=\"col-md-2\"> <div class=\"relative\"> <h5>Guests</h5> <div class=\"d-flex justify-content-start align-items-center\" style=\"padding-top:5px;\"> <img src=\"/images/user.png\" width=\"37\" class=\"me-3\" alt=\"\"> <div class=\"fs-20 fw-600\" style=\"color:#212121;\">8</div> </div> </div> </div> </div> </div> </section> <section id=\"rooms\" class=\"p-0 overflow-hidden\"> <div class=\"container-fluid\"> <div class=\"row\"> <div class=\"col-lg-12\"> <div class=\"owl-custom-nav menu-float\" data-target=\"#room-carousel\"> <a class=\"btn-next\"></a> <a class=\"btn-prev\"></a> <div id=\"room-carousel\" class=\"owl-2-cols-center owl-carousel owl-theme\"> <div class=\"item\"> <div class=\"relative\"> <div class=\"overflow-hidden text-light\"> <div class=\"abs h-100 start-0 z-2 p-4\"> <h3 style=\"color:white;\">Living Room</h3> </div> <img src=\"/images/salon2.jpeg\" class=\"w-100\" alt=\"Living Room\"> </div> </div> </div> <div class=\"item\"> <div class=\"relative\"> <div class=\"overflow-hidden text-light\"> <div class=\"abs h-100 start-1 z-2 p-4\"> <h3 style=\"color:white;\">Bedroom 1</h3> </div> <img src=\"/images/chambre1.jpeg\" class=\"w-100\" alt=\"Bedroom 1\"> </div> </div> </div> <div class=\"item\"> <div class=\"relative\"> <div class=\"overflow-hidden text-light\"> <div class=\"abs h-100 start-2 z-2 p-4\"> <h3 style=\"color:white;\">Bedroom 2</h3> </div> <img src=\"/images/chambre2.jpeg\" class=\"w-100\" alt=\"Bedroom 2\"> </div> </div> </div> <div class=\"item\"> <div class=\"relative\"> <div class=\"overflow-hidden text-light\"> <div class=\"abs h-100 start-3 z-2 p-4\"> <h3 style=\"color:white;\">Bedroom 3</h3> </div> <img src=\"/images/chambre3.jpeg\" class=\"w-100\" alt=\"Bedroom 3\"> </div> </div> </div> <div class=\"item\"> <div class=\"relative\"> <div class=\"overflow-hidden text-light\"> <div class=\"abs h-100 start-4 z-2 p-4\"> <h3 style=\"color:white;\">Kitchen</h3> </div> <img src=\"/images/cuisine.jpeg\" class=\"w-100\" alt=\"Kitchen\"> </div> </div> </div> <div class=\"item\"> <div class=\"relative\"> <div class=\"overflow-hidden text-light\"> <div class=\"abs h-100 start-5 z-2 p-4\"> <h3 style=\"color:white;\">Bathroom</h3> </div> <img src=\"/images/salledebain.jpeg\" class=\"w-100\" alt=\"Bathroom 1\"> </div> </div> </div> <div class=\"item\"> <div class=\"relative\"> <div class=\"overflow-hidden text-light\"> <div class=\"abs h-100 start-6 z-2 p-4\"> <h3 style=\"color:white;\">Bathroom 2</h3> </div> <img src=\"/images/salledebain2.jpeg\" class=\"w-100\" alt=\"Bathroom 2\"> </div> </div> </div> </div> </div> </div> </div> </div> </section> <section id=\"services\" class=\"overlay-dark-1\"> <div class=\"container\"> <div class=\"row g-4 justify-content-between\"> <div class=\"col-lg-5 relative z-3\"> <div class=\"me-lg-3\"> <div class=\"subtitle wow fadeInUp\" data-wow-delay=\".0s\">Your stay in Strasbourg</div> <h2 class=\"wow fadeInUp\" data-wow-delay=\".2s\">Rates and services</h2> <p style=\"color:#212121; font-size:18px;\">An exceptional suite in the heart of Strasbourg, with optionnal dedicated concierge service to assist you throughout your stay.</p> <p style=\"color:#212121; font-size:18px;\">Minimum booking of two nights.</p> <a href=\"#reservation\" class=\"btn-main\" style=\"color:white;\">Booking</a> </div> </div> <div class=\"col-lg-6\" style=\"color:black;\"> <div class=\"spacer-single spacer-double\"></div> <div class=\"row\"> <div class=\"col-md-6 wow fadeInUp\" data-wow-delay=\".2s\"> {# <h5 class=\" mb-3\">Peak Season</h5> <p class=\"fs-500\"><small>June 1st to September 30th • November 25th to January 5th</small></p> <ul class=\"ul-check fs-500\"> <li>€960 per night</li> <li>10% discount for bookings of 7 nights and up</li> </ul> <h5 class=\"mb-3 mt-4\">Off-peak Season</h5> #} <ul class=\"ul-check fs-500\"> <li>2 guests: €350 per night</li> <li>4 guests: €690 per night</li> <li>from 6 guests and up: €890 per night</li> <li>10% discount for bookings of 7 nights and up</li> </ul> </div> <div class=\"col-md-6 wow fadeInUp\" data-wow-delay=\".4s\"> <h5 class=\"mb-3\">Optional services</h5> <ul class=\"ul-check fs-500\"> <li>One parking space: €24/day or €150/week</li> <li>Extra cleaning during your stay : 60 euros</li> <li>Other Extras : Children's workshop, baby amenities, dog policy on request (other pets are unfortunately not allowed in the appartement), Decoration for special occasions, breakfast, Alsatian delicacies, etc</li> </ul> <div class=\"mt-4\"> <p class=\"fs-500\"> <strong>On site assistance</strong> <br /> <small>Tuesday to Saturday • 10am-6:45pm</small> </p> <p class=\"fs-500\"> <strong>Private concierge subject to availability</strong><br> <small>Quotation on request</small> </p> </div> </div> </div> </div> </div> </div> </section> <section id=\"section-gallery\" class=\"relative\"> <div class=\"container relative z-2\" id=\"photos\"> <div class=\"row g-4 gx-5 justify-content-center\"> <div class=\"col-lg-6 text-center\"> <h2 class=\"wow fadeInUp\" data-wow-delay=\".2s\">Apartment Gallery</h2> <p class=\"wow fadeInUp\" data-wow-delay=\".3s\" style=\"color:#212121;\">Explore our curated images to discover the residence’s various spaces — from the bedrooms and living area to the kitchen, bathroom, and outdoor surroundings.</p> </div> </div> <div class=\"row\"> <div class=\"col-md-12 text-center\"> <ul id=\"filters\" class=\"wow fadeInUp\" data-wow-delay=\"0s\"> <li><a href=\"#\" data-filter=\"*\" class=\"selected\" style=\"color:#212121;\">Show All</a></li> <li><a href=\"#\" data-filter=\".chambre\" style=\"color:#212121;\">Bedrooms</a></li> <li><a href=\"#\" data-filter=\".salon\" style=\"color:#212121;\">Living Room</a></li> <li><a href=\"#\" data-filter=\".cuisine\" style=\"color:#212121;\">Kitchen</a></li> <li><a href=\"#\" data-filter=\".salledebain\" style=\"color:#212121;\">Bathroom</a></li> <li><a href=\"#\" data-filter=\".exterieur\" style=\"color:#212121;\">Outdoor surroundings</a></li> </ul> </div> </div> <div id=\"gallery\" class=\"row g-3 wow fadeInUp\" data-wow-delay=\".3s\"> <div class=\"col-md-3 col-sm-6 col-12 item chambre\"> <a href=\"images/chambre1.jpeg\" class=\"image-popup d-block hover\"> <div class=\"relative overflow-hidden\"> <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\"> View </div> <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div> <img src=\"images/chambre1.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Bedroom\"> </div> </a> </div> <div class=\"col-md-3 col-sm-6 col-12 item chambre\"> <a href=\"images/chambre2.jpeg\" class=\"image-popup d-block hover\"> <div class=\"relative overflow-hidden\"> <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\"> View </div> <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div> <img src=\"images/chambre2.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Bedroom 2\"> </div> </a> </div> <div class=\"col-md-3 col-sm-6 col-12 item chambre\"> <a href=\"images/chambre3.jpeg\" class=\"image-popup d-block hover\"> <div class=\"relative overflow-hidden\"> <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\"> View </div> <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div> <img src=\"images/chambre3.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Bedroom 3\"> </div> </a> </div> <div class=\"col-md-3 col-sm-6 col-12 item salon\"> <a href=\"images/salon.jpeg\" class=\"image-popup d-block hover\"> <div class=\"relative overflow-hidden\"> <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\"> View </div> <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div> <img src=\"images/salon.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Living Room\"> </div> </a> </div> <div class=\"col-md-3 col-sm-6 col-12 item salon\"> <a href=\"images/salon2.jpeg\" class=\"image-popup d-block hover\"> <div class=\"relative overflow-hidden\"> <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\"> View </div> <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div> <img src=\"images/salon2.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Living Room 2\"> </div> </a> </div> <div class=\"col-md-3 col-sm-6 col-12 item salon\"> <a href=\"images/salon3.jpeg\" class=\"image-popup d-block hover\"> <div class=\"relative overflow-hidden\"> <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\"> View </div> <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div> <img src=\"images/salon3.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Living Room 3\"> </div> </a> </div> <div class=\"col-md-3 col-sm-6 col-12 item salon\"> <a href=\"images/salon4.jpeg\" class=\"image-popup d-block hover\"> <div class=\"relative overflow-hidden\"> <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\"> View </div> <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div> <img src=\"images/salon4.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Living Room 4\"> </div> </a> </div> <div class=\"col-md-3 col-sm-6 col-12 item salon\"> <a href=\"images/salon5.jpeg\" class=\"image-popup d-block hover\"> <div class=\"relative overflow-hidden\"> <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\"> View </div> <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div> <img src=\"images/salon5.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Living Room 5\"> </div> </a> </div> <div class=\"col-md-3 col-sm-6 col-12 item cuisine\"> <a href=\"images/cuisine.jpeg\" class=\"image-popup d-block hover\"> <div class=\"relative overflow-hidden\"> <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\"> View </div> <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div> <img src=\"images/cuisine.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Kitchen\"> </div> </a> </div> <div class=\"col-md-3 col-sm-6 col-12 item salledebain\"> <a href=\"images/salledebain.jpeg\" class=\"image-popup d-block hover\"> <div class=\"relative overflow-hidden\"> <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\"> View </div> <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div> <img src=\"images/salledebain.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Bathroom\"> </div> </a> </div> <div class=\"col-md-3 col-sm-6 col-12 item salledebain\"> <a href=\"images/salledebain2.jpeg\" class=\"image-popup d-block hover\"> <div class=\"relative overflow-hidden\"> <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\"> View </div> <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div> <img src=\"images/salledebain2.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Bathroom 2\"> </div> </a> </div> <div class=\"col-md-3 col-sm-6 col-12 item exterieur\"> <a href=\"images/exterieur.jpeg\" class=\"image-popup d-block hover\"> <div class=\"relative overflow-hidden\"> <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\"> View </div> <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div> <img src=\"images/exterieur.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Exterior\"> </div> </a> </div> </div> </div> </section> <section id=\"reservation\" class=\"text-light\"> <div class=\"container\"> <div class=\"row g-4 justify-content-center\"> <div class=\"col-lg-6 text-center\"> <h2 class=\"wow fadeInUp\" data-wow-delay=\".2s\">Book your stay</h2> </div> </div> <div class=\"row g-4 justify-content-center\"> <div class=\"col-md-6\"> {{ form_start(form) }} <div class=\"row g-4\"> <div class=\"col-md-12\"> <div class=\"calendar-container\" style=\"height:300px;\"> <input type=\"text\" id=\"date_range_picker\"> </div> </div> <div class=\"col-md-3\"> <label style=\"color:#212121;\">Guests</label> {{ form_widget(form.persons) }} </div> <div class=\"col-md-3\"> <label style=\"color:#212121;\">Arrival</label> <br /> </strong> <span id=\"info-start\" style=\"color:#212121;\">-</span> </div> <div class=\"col-md-3\"> <label style=\"color:#212121;\">Departure</label> <br /> <span id=\"info-end\" style=\"color:#212121;\">-</span> </div> <div class=\"col-md-3\"> <label style=\"color:#212121;\">Nights</label> <br /> <span id=\"info-nights\" style=\"color:#212121;\">-</span> </div> <div class=\"col-md-12\" style=\"font-size:20px;\"> <div id=\"results\"></div> </div> <div class=\"col-md-6\"> <label style=\"color:#212121;\">Last name</label> {{ form_widget(form.lastname) }} </div> <div class=\"col-md-6\"> <label style=\"color:#212121;\">First name</label> {{ form_widget(form.name) }} </div> <div class=\"col-md-12\"> <label style=\"color:#212121;\">Email address</label> {{ form_widget(form.email) }} </div> <div class=\"col-md-12\"> <label style=\"color:#212121;\">Message</label> {{ form_widget(form.message) }} </div> <div class=\"col-md-12\"> <div class=\"text-center\" style=\"color:#212121;\"> <input type=\"checkbox\" id=\"acceptCGV\" /> I accept the <a href=\"/terms\" target=\"_blank\" style=\"text-decoration:underline; color:#212121;\">terms and conditions of sale</a> </div> </div> <div class=\"col-md-12\"> <div class=\"text-center\"> <button type=\"submit\" name=\"submit\" value=\"1\" class=\"btn-main\" style=\"color:white;\">Send booking request</button> </div> </div> </div> {{ form_widget(form.start) }} {{ form_widget(form.end) }} {{ form_rest(form) }} {{ form_end(form) }} </div> </div> </div> </section> <section id=\"faq\" class=\"text-light\"> <div class=\"container\"> <div class=\"row g-4 justify-content-center\"> <div class=\"col-lg-6 text-center\"> <h2 class=\"wow fadeInUp\" data-wow-delay=\".2s\">FAQ</h2> </div> </div> <div class=\"row g-4 justify-content-center\"> <div class=\"col-lg-6 text-left\" style=\"color:black !important;\"> <h3 style=\"margin-top:7px;\">How can I book the accommodation?</h3> <div>You can book directly on our website and soon via partner platforms. Secure payment immediately confirms your reservation.</div> <h3 style=\"margin-top:7px;\">What are the check-in and check-out times?</h3> <div> <ul> <li>Check-in: from 3:00 PM</li> <li>Check-out: before 11:00 AM</li> </ul> </div> <h3 style=\"margin-top:7px;\">Is the accommodation fully equipped?</h3> <div> Yes, the apartment is fully furnished and equipped: kitchen, bedding, towels, appliances, Wi-Fi, and more.</div> <h3 style=\"margin-top:7px;\">Is parking available?</h3> <div>Yes, private parking is available as an option at €24 per 24 hours or €150 per week (7 nights).</div> <h3 style=\"margin-top:7px;\">Is the accommodation suitable for children?</h3> <div>Yes, we offer some baby amenities (baby cot, high chair, child-friendly tableware) upon request.</div> <h3 style=\"margin-top:7px;\"> Are pets allowed?</h3> <div> Please contact us before booking if you wish to bring a pet. Only dogs are accepted, and prior approval is required.</div> <h3 style=\"margin-top:7px;\">Can I cancel or modify my reservation?</h3> <div>Yes, our cancellation policy is provided at the time of booking: <ul> <li>85% refund if canceled more than 1 month before arrival</li> <li>50% refund if canceled between 1 month and 15 days before arrival</li> <li>No refund if canceled less than 15 days before arrival</li> </ul> </div> <h3 style=\"margin-top:7px;\">Is the accommodation accessible by public transport?</h3> <div>Yes, major transport options are nearby. The tram station “Langstross, Grand’rue” is less than 100 meters from the apartment, and Strasbourg train station is a 10-minute walk.</div> <h3 style=\"margin-top:7px;\">Are there shops or restaurants nearby?</h3> <div>Yes, you’ll find supermarkets, cafés, restaurants, and tourist activities right at the foot of the building.</div> <h3 style=\"margin-top:7px;\"> What should I do if there’s a problem during my stay?</h3> <div> We are available 24/7 by email for emergencies or questions about the apartment. You can also call us from 9:00 AM to 8:00 PM at +33 7 61 05 82 43, and we are available on-site on the ground floor of the building from Tuesday to Saturday, 10:00 AM to 6:45 PM. </div> </div> </div> </div> </section>{% endblock body %}{% block footerjs %} <script src=\"https://cdn.jsdelivr.net/npm/flatpickr\"></script> <script src=\"https://cdn.jsdelivr.net/npm/flatpickr/dist/l10n/en.js\"></script> <script> function updateSimulation() { var start = \$(\"#reservation_form_start\").val(); var end = \$(\"#reservation_form_end\").val(); var persons = \$(\"#reservation_form_persons\").val(); if (start && end && persons) { \$(\"#results\").html('<div class=\"loading\">Calculating...</div>'); \$.post( Routing.generate('simulation_pricing'), {'start': start, 'end': end, 'persons': persons} ) .done(function(data) { \$(\"#results\").html(data); }) .fail(function() { \$(\"#results\").html('<div class=\"error\">Calculation error</div>'); }); } else { \$(\"#results\").html(''); } } // Écoute les changements sur le nombre de personnes \$(\"#reservation_form_persons\").change(updateSimulation); \$(document).ready(function() { // Désactive le bouton au chargement de la page \$('button[type=\"submit\"]').prop('disabled', true); // Écoute les changements sur la checkbox \$('#acceptCGV').change(function() { if(\$(this).is(':checked')) { \$('button[type=\"submit\"]').prop('disabled', false); } else { \$('button[type=\"submit\"]').prop('disabled', true); } }); }); </script> <script> \$(document).ready(function() { let bookedRanges = []; \$.ajax({ url: '{{ env('WEBHOOK_CALENDAR_AVAILABILITY') }}', method: 'POST', contentType: 'application/json', data: '' }) .done(function(data) { bookedRanges = data.bookings || []; console.log('✅ Créneaux chargés:', bookedRanges); initDatePicker(); }) .fail(function(error) { console.error('❌ Erreur:', error); initDatePicker(); }); // 🔧 FONCTION POUR CRÉER UNE DATE LOCALE SANS DÉCALAGE UTC function parseLocalDate(dateStr) { const [year, month, day] = dateStr.split('-').map(Number); return new Date(year, month - 1, day); } const isMobile = window.innerWidth <= 900; function initDatePicker() { flatpickr(\"#date_range_picker\", { inline: true, mode: \"range\", locale: \"fr\", minDate: new Date(new Date().setDate(new Date().getDate() + 1)), dateFormat: \"Y-m-d\", showMonths: isMobile ? 1 : 2, disable: [ function(date) { const checkDate = new Date(date); checkDate.setHours(0, 0, 0, 0); return bookedRanges.some(range => { const start = parseLocalDate(range.start_date); const end = parseLocalDate(range.end_date); return checkDate >= start && checkDate <= end; }); } ], onChange: function(selectedDates, dateStr, instance) { console.log('📅 Dates sélectionnées:', selectedDates.length); if (selectedDates.length === 2) { const start = selectedDates[0]; const end = selectedDates[1]; if (isRangeAvailable(start, end)) { // ✅ Met à jour avec jQuery ET déclenche l'événement change \$('#reservation_form_start').val(formatDate(start)).trigger('change'); \$('#reservation_form_end').val(formatDate(end)).trigger('change'); console.log('✅ Champs mis à jour:', \$('#reservation_form_start').val(), '→', \$('#reservation_form_end').val() ); updateSelectedInfo(start, end); // ✅ Force la simulation updateSimulation(); } else { alert('⚠️ Cette période contient des dates déjà réservées.\\nVeuillez choisir une autre période.'); instance.clear(); clearSymfonyFields(); hideSelectedInfo(); \$(\"#results\").html(''); } } else { clearSymfonyFields(); hideSelectedInfo(); \$(\"#results\").html(''); } }, onDayCreate: function(dObj, dStr, fp, dayElem) { const date = new Date(dayElem.dateObj); date.setHours(0, 0, 0, 0); const isBooked = bookedRanges.some(range => { const start = parseLocalDate(range.start_date); const end = parseLocalDate(range.end_date); return date >= start && date <= end; }); if (isBooked) { dayElem.classList.add('booked'); dayElem.title = 'Date indisponible (réservée)'; } else if (date >= new Date()) { dayElem.classList.add('available'); dayElem.title = 'Date disponible'; } } }); } function isRangeAvailable(startDate, endDate) { let currentDate = new Date(startDate); currentDate.setHours(0, 0, 0, 0); const endCheck = new Date(endDate); endCheck.setHours(0, 0, 0, 0); while (currentDate <= endCheck) { const isBooked = bookedRanges.some(range => { const start = parseLocalDate(range.start_date); const end = parseLocalDate(range.end_date); return currentDate >= start && currentDate <= end; }); if (isBooked) return false; currentDate.setDate(currentDate.getDate() + 1); } return true; } function updateSelectedInfo(start, end) { const nights = Math.ceil((end - start) / (1000 * 60 * 60 * 24)); \$('#info-start').text(start.toLocaleDateString('fr-FR')); \$('#info-end').text(end.toLocaleDateString('fr-FR')); \$('#info-nights').text(`\${nights} nuit\${nights > 1 ? 's' : ''}`); \$('#selected-dates-info').addClass('active'); } function hideSelectedInfo() { \$('#selected-dates-info').removeClass('active'); } function clearSymfonyFields() { \$('#reservation_form_start').val(''); \$('#reservation_form_end').val(''); } function formatDate(date) { const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, '0'); const day = String(date.getDate()).padStart(2, '0'); return `\${year}-\${month}-\${day}`; } }); </script>{% endblock footerjs %}{% block css %} <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css\"> <style> .calendar-container { margin: 20px 0; width: 100%; overflow: hidden; } /* Calendrier inline (toujours visible) */ #date_range_picker { display: none; /* Le champ input est caché, on affiche juste le calendrier */ } .flatpickr-calendar.inline { margin: 0 auto; box-shadow: 0 4px 12px rgba(0,0,0,0.15); border-radius: 8px; max-width: 100%; } .flatpickr-day.booked { background-color: #ff4444 !important; color: white !important; cursor: not-allowed !important; position: relative; } .flatpickr-day.booked::after { content: \"✕\"; position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); font-size: 20px; font-weight: bold; } .flatpickr-day.booked:hover { background-color: #ff0000 !important; } .flatpickr-day.available:hover { background-color: #28a745; color: white; } /* Adaptations Mobile */ @media (max-width: 768px) { .calendar-container { margin: 10px 0; padding: 0 10px; } .flatpickr-calendar.inline { width: 100% !important; max-width: 100% !important; } .flatpickr-months { padding: 8px 10px; } .flatpickr-days { width: 100% !important; } .dayContainer { width: 100% !important; min-width: 100% !important; max-width: 100% !important; } .flatpickr-day { height: 40px !important; line-height: 40px !important; flex-basis: 14.2857% !important; max-width: 14.2857% !important; } } </style>{% endblock css %}", "vitrine/en/homepage.html.twig", "/var/www/vhosts/mirtillostudio.com/ch.mirtillostudio.com/templates/vitrine/en/homepage.html.twig"); }}