var/cache/dev/twig/b2/b235627aac0ae83b7fecef526a344b5f.php line 59

Open in your IDE?
  1. <?php
  2. use Twig\Environment;
  3. use Twig\Error\LoaderError;
  4. use Twig\Error\RuntimeError;
  5. use Twig\Extension\CoreExtension;
  6. use Twig\Extension\SandboxExtension;
  7. use Twig\Markup;
  8. use Twig\Sandbox\SecurityError;
  9. use Twig\Sandbox\SecurityNotAllowedTagError;
  10. use Twig\Sandbox\SecurityNotAllowedFilterError;
  11. use Twig\Sandbox\SecurityNotAllowedFunctionError;
  12. use Twig\Source;
  13. use Twig\Template;
  14. use Twig\TemplateWrapper;
  15. /* vitrine/en/homepage.html.twig */
  16. class __TwigTemplate_44de184e5eb1317f89ee043904cd3b74 extends Template
  17. {
  18. private Source $source;
  19. /**
  20. * @var array<string, Template>
  21. */
  22. private array $macros = [];
  23. public function __construct(Environment $env)
  24. {
  25. parent::__construct($env);
  26. $this->source = $this->getSourceContext();
  27. $this->blocks = [
  28. 'title' => [$this, 'block_title'],
  29. 'description' => [$this, 'block_description'],
  30. 'robots' => [$this, 'block_robots'],
  31. 'canonical' => [$this, 'block_canonical'],
  32. 'body' => [$this, 'block_body'],
  33. 'footerjs' => [$this, 'block_footerjs'],
  34. 'css' => [$this, 'block_css'],
  35. ];
  36. }
  37. protected function doGetParent(array $context): bool|string|Template|TemplateWrapper
  38. {
  39. // line 1
  40. return "vitrine/en/layout.html.twig";
  41. }
  42. protected function doDisplay(array $context, array $blocks = []): iterable
  43. {
  44. $macros = $this->macros;
  45. $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  46. $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "template", "vitrine/en/homepage.html.twig"));
  47. $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  48. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "template", "vitrine/en/homepage.html.twig"));
  49. $this->parent = $this->load("vitrine/en/layout.html.twig", 1);
  50. yield from $this->parent->unwrap()->yield($context, array_merge($this->blocks, $blocks));
  51. $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  52. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  53. }
  54. // line 3
  55. /**
  56. * @return iterable<null|scalar|\Stringable>
  57. */
  58. public function block_title(array $context, array $blocks = []): iterable
  59. {
  60. $macros = $this->macros;
  61. $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  62. $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "title"));
  63. $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  64. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "title"));
  65. yield "Cathedral Heritage Suite - 8-Guest Rental Strasbourg Center";
  66. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  67. $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  68. yield from [];
  69. }
  70. // line 4
  71. /**
  72. * @return iterable<null|scalar|\Stringable>
  73. */
  74. public function block_description(array $context, array $blocks = []): iterable
  75. {
  76. $macros = $this->macros;
  77. $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  78. $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "description"));
  79. $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  80. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "description"));
  81. 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!";
  82. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  83. $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  84. yield from [];
  85. }
  86. // line 5
  87. /**
  88. * @return iterable<null|scalar|\Stringable>
  89. */
  90. public function block_robots(array $context, array $blocks = []): iterable
  91. {
  92. $macros = $this->macros;
  93. $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  94. $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "robots"));
  95. $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  96. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "robots"));
  97. yield "index,follow";
  98. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  99. $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  100. yield from [];
  101. }
  102. // line 7
  103. /**
  104. * @return iterable<null|scalar|\Stringable>
  105. */
  106. public function block_canonical(array $context, array $blocks = []): iterable
  107. {
  108. $macros = $this->macros;
  109. $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  110. $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "canonical"));
  111. $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  112. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "canonical"));
  113. // line 8
  114. yield " <link rel=\"canonical\" href=\"https://cathedraleheritage.com\" />
  115. <link rel=\"alternate\" hreflang=\"fr\" href=\"https://cathedraleheritage.com/fr\" />
  116. <link rel=\"alternate\" hreflang=\"en\" href=\"https://cathedraleheritage.com\" />
  117. <link rel=\"alternate\" hreflang=\"x-default\" href=\"https://cathedraleheritage.com\" />
  118. ";
  119. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  120. $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  121. yield from [];
  122. }
  123. // line 14
  124. /**
  125. * @return iterable<null|scalar|\Stringable>
  126. */
  127. public function block_body(array $context, array $blocks = []): iterable
  128. {
  129. $macros = $this->macros;
  130. $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  131. $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "body"));
  132. $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  133. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "body"));
  134. // line 15
  135. yield "
  136. <section id=\"hero\" class=\"text-light no-top no-bottom relative overflow-hidden z-1000\">
  137. <div class=\"abs w-100 abs-centered z-2\">
  138. <div class=\"container\">
  139. <div class=\"spacer-double\"></div>
  140. <div class=\"row g-4 align-items-center justify-content-center\">
  141. <div class=\"col-md-8 text-center\">
  142. <h1 class=\"mb-2\" style=\"color:white;\">Welcome to Cathedral Heritage Suite</h1>
  143. <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>
  144. <a class=\"btn-main btn-line bg-blur fx-slide\" href=\"#about\" style=\"color:white;\"><span>Find out more</span></a>
  145. </div>
  146. </div>
  147. </div>
  148. </div>
  149. <div class=\"vertical-center\">
  150. <div class=\"swiper\">
  151. <div class=\"swiper-wrapper\">
  152. <div class=\"swiper-slide\">
  153. <div class=\"swiper-inner\" data-bgimage=\"url(/images/salon2.jpeg)\">
  154. <div class=\"sw-overlay op-5\"></div>
  155. </div>
  156. </div>
  157. <div class=\"swiper-slide\">
  158. <div class=\"swiper-inner\" data-bgimage=\"url(/images/chambre2.jpeg)\">
  159. <div class=\"sw-overlay op-5\"></div>
  160. </div>
  161. </div>
  162. <div class=\"swiper-slide\">
  163. <div class=\"swiper-inner\" data-bgimage=\"url(/images/noel.jpeg)\">
  164. <div class=\"sw-overlay op-5\"></div>
  165. </div>
  166. </div>
  167. </div>
  168. </div>
  169. </div>
  170. <div class=\"abs w-100 bottom-0 z-2 pb-4 sm-hide\">
  171. <div class=\"container\">
  172. <div class=\"row\">
  173. <div class=\"col-lg-12\">
  174. <div class=\"d-flex justify-content-between\">
  175. <div>
  176. <h6 style=\"color:white;\">Cathedral 100m away</h6>
  177. </div>
  178. <div>
  179. <h6 style=\"color:white;\">Museums 200m away</h6>
  180. </div>
  181. <div>
  182. <h6 style=\"color:white;\">Petite France 300m away</h6>
  183. </div>
  184. </div>
  185. </div>
  186. </div>
  187. </div>
  188. </div>
  189. <div class=\"gradient-edge-bottom op-8\"></div>
  190. </section>
  191. <section id=\"about\">
  192. <div class=\"container\">
  193. <div class=\"row g-4 align-items-end justify-content-between\">
  194. <div class=\"col-lg-5\">
  195. <div class=\"subtitle\">About the apartment</div>
  196. <h2>Modern suite in the heart of Strasbourg's Grande Île</h2>
  197. </div>
  198. <div class=\"col-lg-4\">
  199. <p class=\"mb-4\" style=\"color:#212121;\">
  200. 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.
  201. </p>
  202. <p class=\"mb-4\" style=\"color:#212121;\">
  203. Kitchen fully furnished and cozy living-dining room to share great moments together.
  204. </p>
  205. <p class=\"mb-4\" style=\"color:#212121;\">
  206. 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.
  207. </p>
  208. </div>
  209. </div>
  210. <div class=\"spacer-single\"></div>
  211. <div class=\"row g-4\">
  212. <div class=\"col-md-2\">
  213. <div class=\"relative\">
  214. <h5>Size</h5>
  215. <div class=\"d-flex justify-content-start align-items-center\" style=\"padding-top:6px;\">
  216. <img src=\"/images/home.png\" width=\"37\" class=\"me-3\" alt=\"\">
  217. <div class=\"fs-20 fw-600\" style=\"color:#212121;\">83 m²</div>
  218. </div>
  219. </div>
  220. </div>
  221. <div class=\"col-md-2\">
  222. <div class=\"relative\">
  223. <h5>Bedrooms</h5>
  224. <div class=\"d-flex justify-content-start align-items-center\" style=\"padding-top:4px;\">
  225. <img src=\"/images/bed.png\" width=\"37\" class=\"me-3\" alt=\"\">
  226. <div class=\"fs-20 fw-600\" style=\"color:#212121;\">3</div>
  227. </div>
  228. </div>
  229. </div>
  230. <div class=\"col-md-2\">
  231. <div class=\"relative\">
  232. <h5>Living Room</h5>
  233. <div class=\"d-flex justify-content-start align-items-center\">
  234. <img src=\"/images/sofa.png\" width=\"50\" class=\"me-3\" alt=\"\">
  235. <div class=\"fs-20 fw-600\" style=\"color:#212121;\">Included</div>
  236. </div>
  237. </div>
  238. </div>
  239. <div class=\"col-md-2\">
  240. <div class=\"relative\">
  241. <h5>Kitchen</h5>
  242. <div class=\"d-flex justify-content-start align-items-center\" style=\"padding-top:6px;\">
  243. <img src=\"/images/cooking.png\" width=\"37\" class=\"me-3\" alt=\"\">
  244. <div class=\"fs-20 fw-600\" style=\"color:#212121;\">Included</div>
  245. </div>
  246. </div>
  247. </div>
  248. <div class=\"col-md-2\">
  249. <div class=\"relative\">
  250. <h5>Bathrooms</h5>
  251. <div class=\"d-flex justify-content-start align-items-center\" style=\"padding-top:4px;\">
  252. <img src=\"/images/bathroom.png\" width=\"40\" class=\"me-3\" alt=\"\">
  253. <div class=\"fs-20 fw-600\" style=\"color:#212121;\">2</div>
  254. </div>
  255. </div>
  256. </div>
  257. <div class=\"col-md-2\">
  258. <div class=\"relative\">
  259. <h5>Guests</h5>
  260. <div class=\"d-flex justify-content-start align-items-center\" style=\"padding-top:5px;\">
  261. <img src=\"/images/user.png\" width=\"37\" class=\"me-3\" alt=\"\">
  262. <div class=\"fs-20 fw-600\" style=\"color:#212121;\">8</div>
  263. </div>
  264. </div>
  265. </div>
  266. </div>
  267. </div>
  268. </section>
  269. <section id=\"rooms\" class=\"p-0 overflow-hidden\">
  270. <div class=\"container-fluid\">
  271. <div class=\"row\">
  272. <div class=\"col-lg-12\">
  273. <div class=\"owl-custom-nav menu-float\" data-target=\"#room-carousel\">
  274. <a class=\"btn-next\"></a>
  275. <a class=\"btn-prev\"></a>
  276. <div id=\"room-carousel\" class=\"owl-2-cols-center owl-carousel owl-theme\">
  277. <div class=\"item\">
  278. <div class=\"relative\">
  279. <div class=\"overflow-hidden text-light\">
  280. <div class=\"abs h-100 start-0 z-2 p-4\">
  281. <h3 style=\"color:white;\">Living Room</h3>
  282. </div>
  283. <img src=\"/images/salon2.jpeg\" class=\"w-100\" alt=\"Living Room\">
  284. </div>
  285. </div>
  286. </div>
  287. <div class=\"item\">
  288. <div class=\"relative\">
  289. <div class=\"overflow-hidden text-light\">
  290. <div class=\"abs h-100 start-1 z-2 p-4\">
  291. <h3 style=\"color:white;\">Bedroom 1</h3>
  292. </div>
  293. <img src=\"/images/chambre1.jpeg\" class=\"w-100\" alt=\"Bedroom 1\">
  294. </div>
  295. </div>
  296. </div>
  297. <div class=\"item\">
  298. <div class=\"relative\">
  299. <div class=\"overflow-hidden text-light\">
  300. <div class=\"abs h-100 start-2 z-2 p-4\">
  301. <h3 style=\"color:white;\">Bedroom 2</h3>
  302. </div>
  303. <img src=\"/images/chambre2.jpeg\" class=\"w-100\" alt=\"Bedroom 2\">
  304. </div>
  305. </div>
  306. </div>
  307. <div class=\"item\">
  308. <div class=\"relative\">
  309. <div class=\"overflow-hidden text-light\">
  310. <div class=\"abs h-100 start-3 z-2 p-4\">
  311. <h3 style=\"color:white;\">Bedroom 3</h3>
  312. </div>
  313. <img src=\"/images/chambre3.jpeg\" class=\"w-100\" alt=\"Bedroom 3\">
  314. </div>
  315. </div>
  316. </div>
  317. <div class=\"item\">
  318. <div class=\"relative\">
  319. <div class=\"overflow-hidden text-light\">
  320. <div class=\"abs h-100 start-4 z-2 p-4\">
  321. <h3 style=\"color:white;\">Kitchen</h3>
  322. </div>
  323. <img src=\"/images/cuisine.jpeg\" class=\"w-100\" alt=\"Kitchen\">
  324. </div>
  325. </div>
  326. </div>
  327. <div class=\"item\">
  328. <div class=\"relative\">
  329. <div class=\"overflow-hidden text-light\">
  330. <div class=\"abs h-100 start-5 z-2 p-4\">
  331. <h3 style=\"color:white;\">Bathroom</h3>
  332. </div>
  333. <img src=\"/images/salledebain.jpeg\" class=\"w-100\" alt=\"Bathroom 1\">
  334. </div>
  335. </div>
  336. </div>
  337. <div class=\"item\">
  338. <div class=\"relative\">
  339. <div class=\"overflow-hidden text-light\">
  340. <div class=\"abs h-100 start-6 z-2 p-4\">
  341. <h3 style=\"color:white;\">Bathroom 2</h3>
  342. </div>
  343. <img src=\"/images/salledebain2.jpeg\" class=\"w-100\" alt=\"Bathroom 2\">
  344. </div>
  345. </div>
  346. </div>
  347. </div>
  348. </div>
  349. </div>
  350. </div>
  351. </div>
  352. </section>
  353. <section id=\"services\" class=\"overlay-dark-1\">
  354. <div class=\"container\">
  355. <div class=\"row g-4 justify-content-between\">
  356. <div class=\"col-lg-5 relative z-3\">
  357. <div class=\"me-lg-3\">
  358. <div class=\"subtitle wow fadeInUp\" data-wow-delay=\".0s\">Your stay in Strasbourg</div>
  359. <h2 class=\"wow fadeInUp\" data-wow-delay=\".2s\">Rates and services</h2>
  360. <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>
  361. <p style=\"color:#212121; font-size:18px;\">Minimum booking of two nights.</p>
  362. <a href=\"#reservation\" class=\"btn-main\" style=\"color:white;\">Booking</a>
  363. </div>
  364. </div>
  365. <div class=\"col-lg-6\" style=\"color:black;\">
  366. <div class=\"spacer-single spacer-double\"></div>
  367. <div class=\"row\">
  368. <div class=\"col-md-6 wow fadeInUp\" data-wow-delay=\".2s\">
  369. ";
  370. // line 288
  371. yield "
  372. <ul class=\"ul-check fs-500\">
  373. <li>2 guests: €350 per night</li>
  374. <li>4 guests: €690 per night</li>
  375. <li>from 6 guests and up: €890 per night</li>
  376. <li>10% discount for bookings of 7 nights and up</li>
  377. </ul>
  378. </div>
  379. <div class=\"col-md-6 wow fadeInUp\" data-wow-delay=\".4s\">
  380. <h5 class=\"mb-3\">Optional services</h5>
  381. <ul class=\"ul-check fs-500\">
  382. <li>One parking space: €24/day or €150/week</li>
  383. <li>Extra cleaning during your stay : 60 euros</li>
  384. <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>
  385. </ul>
  386. <div class=\"mt-4\">
  387. <p class=\"fs-500\">
  388. <strong>On site assistance</strong> <br />
  389. <small>Tuesday to Saturday • 10am-6:45pm</small>
  390. </p>
  391. <p class=\"fs-500\">
  392. <strong>Private concierge subject to availability</strong><br>
  393. <small>Quotation on request</small>
  394. </p>
  395. </div>
  396. </div>
  397. </div>
  398. </div>
  399. </div>
  400. </div>
  401. </section>
  402. <section id=\"section-gallery\" class=\"relative\">
  403. <div class=\"container relative z-2\" id=\"photos\">
  404. <div class=\"row g-4 gx-5 justify-content-center\">
  405. <div class=\"col-lg-6 text-center\">
  406. <h2 class=\"wow fadeInUp\" data-wow-delay=\".2s\">Apartment Gallery</h2>
  407. <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>
  408. </div>
  409. </div>
  410. <div class=\"row\">
  411. <div class=\"col-md-12 text-center\">
  412. <ul id=\"filters\" class=\"wow fadeInUp\" data-wow-delay=\"0s\">
  413. <li><a href=\"#\" data-filter=\"*\" class=\"selected\" style=\"color:#212121;\">Show All</a></li>
  414. <li><a href=\"#\" data-filter=\".chambre\" style=\"color:#212121;\">Bedrooms</a></li>
  415. <li><a href=\"#\" data-filter=\".salon\" style=\"color:#212121;\">Living Room</a></li>
  416. <li><a href=\"#\" data-filter=\".cuisine\" style=\"color:#212121;\">Kitchen</a></li>
  417. <li><a href=\"#\" data-filter=\".salledebain\" style=\"color:#212121;\">Bathroom</a></li>
  418. <li><a href=\"#\" data-filter=\".exterieur\" style=\"color:#212121;\">Outdoor surroundings</a></li>
  419. </ul>
  420. </div>
  421. </div>
  422. <div id=\"gallery\" class=\"row g-3 wow fadeInUp\" data-wow-delay=\".3s\">
  423. <div class=\"col-md-3 col-sm-6 col-12 item chambre\">
  424. <a href=\"images/chambre1.jpeg\" class=\"image-popup d-block hover\">
  425. <div class=\"relative overflow-hidden\">
  426. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  427. View
  428. </div>
  429. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  430. <img src=\"images/chambre1.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Bedroom\">
  431. </div>
  432. </a>
  433. </div>
  434. <div class=\"col-md-3 col-sm-6 col-12 item chambre\">
  435. <a href=\"images/chambre2.jpeg\" class=\"image-popup d-block hover\">
  436. <div class=\"relative overflow-hidden\">
  437. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  438. View
  439. </div>
  440. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  441. <img src=\"images/chambre2.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Bedroom 2\">
  442. </div>
  443. </a>
  444. </div>
  445. <div class=\"col-md-3 col-sm-6 col-12 item chambre\">
  446. <a href=\"images/chambre3.jpeg\" class=\"image-popup d-block hover\">
  447. <div class=\"relative overflow-hidden\">
  448. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  449. View
  450. </div>
  451. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  452. <img src=\"images/chambre3.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Bedroom 3\">
  453. </div>
  454. </a>
  455. </div>
  456. <div class=\"col-md-3 col-sm-6 col-12 item salon\">
  457. <a href=\"images/salon.jpeg\" class=\"image-popup d-block hover\">
  458. <div class=\"relative overflow-hidden\">
  459. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  460. View
  461. </div>
  462. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  463. <img src=\"images/salon.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Living Room\">
  464. </div>
  465. </a>
  466. </div>
  467. <div class=\"col-md-3 col-sm-6 col-12 item salon\">
  468. <a href=\"images/salon2.jpeg\" class=\"image-popup d-block hover\">
  469. <div class=\"relative overflow-hidden\">
  470. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  471. View
  472. </div>
  473. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  474. <img src=\"images/salon2.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Living Room 2\">
  475. </div>
  476. </a>
  477. </div>
  478. <div class=\"col-md-3 col-sm-6 col-12 item salon\">
  479. <a href=\"images/salon3.jpeg\" class=\"image-popup d-block hover\">
  480. <div class=\"relative overflow-hidden\">
  481. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  482. View
  483. </div>
  484. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  485. <img src=\"images/salon3.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Living Room 3\">
  486. </div>
  487. </a>
  488. </div>
  489. <div class=\"col-md-3 col-sm-6 col-12 item salon\">
  490. <a href=\"images/salon4.jpeg\" class=\"image-popup d-block hover\">
  491. <div class=\"relative overflow-hidden\">
  492. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  493. View
  494. </div>
  495. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  496. <img src=\"images/salon4.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Living Room 4\">
  497. </div>
  498. </a>
  499. </div>
  500. <div class=\"col-md-3 col-sm-6 col-12 item salon\">
  501. <a href=\"images/salon5.jpeg\" class=\"image-popup d-block hover\">
  502. <div class=\"relative overflow-hidden\">
  503. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  504. View
  505. </div>
  506. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  507. <img src=\"images/salon5.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Living Room 5\">
  508. </div>
  509. </a>
  510. </div>
  511. <div class=\"col-md-3 col-sm-6 col-12 item cuisine\">
  512. <a href=\"images/cuisine.jpeg\" class=\"image-popup d-block hover\">
  513. <div class=\"relative overflow-hidden\">
  514. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  515. View
  516. </div>
  517. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  518. <img src=\"images/cuisine.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Kitchen\">
  519. </div>
  520. </a>
  521. </div>
  522. <div class=\"col-md-3 col-sm-6 col-12 item salledebain\">
  523. <a href=\"images/salledebain.jpeg\" class=\"image-popup d-block hover\">
  524. <div class=\"relative overflow-hidden\">
  525. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  526. View
  527. </div>
  528. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  529. <img src=\"images/salledebain.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Bathroom\">
  530. </div>
  531. </a>
  532. </div>
  533. <div class=\"col-md-3 col-sm-6 col-12 item salledebain\">
  534. <a href=\"images/salledebain2.jpeg\" class=\"image-popup d-block hover\">
  535. <div class=\"relative overflow-hidden\">
  536. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  537. View
  538. </div>
  539. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  540. <img src=\"images/salledebain2.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Bathroom 2\">
  541. </div>
  542. </a>
  543. </div>
  544. <div class=\"col-md-3 col-sm-6 col-12 item exterieur\">
  545. <a href=\"images/exterieur.jpeg\" class=\"image-popup d-block hover\">
  546. <div class=\"relative overflow-hidden\">
  547. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  548. View
  549. </div>
  550. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  551. <img src=\"images/exterieur.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Exterior\">
  552. </div>
  553. </a>
  554. </div>
  555. </div>
  556. </div>
  557. </section>
  558. <section id=\"reservation\" class=\"text-light\">
  559. <div class=\"container\">
  560. <div class=\"row g-4 justify-content-center\">
  561. <div class=\"col-lg-6 text-center\">
  562. <h2 class=\"wow fadeInUp\" data-wow-delay=\".2s\">Book your stay</h2>
  563. </div>
  564. </div>
  565. <div class=\"row g-4 justify-content-center\">
  566. <div class=\"col-md-6\">
  567. ";
  568. // line 494
  569. 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');
  570. yield "
  571. <div class=\"row g-4\">
  572. <div class=\"col-md-12\">
  573. <div class=\"calendar-container\" style=\"height:300px;\">
  574. <input type=\"text\" id=\"date_range_picker\">
  575. </div>
  576. </div>
  577. <div class=\"col-md-3\">
  578. <label style=\"color:#212121;\">Guests</label>
  579. ";
  580. // line 505
  581. 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');
  582. yield "
  583. </div>
  584. <div class=\"col-md-3\">
  585. <label style=\"color:#212121;\">Arrival</label> <br />
  586. </strong> <span id=\"info-start\" style=\"color:#212121;\">-</span>
  587. </div>
  588. <div class=\"col-md-3\">
  589. <label style=\"color:#212121;\">Departure</label> <br />
  590. <span id=\"info-end\" style=\"color:#212121;\">-</span>
  591. </div>
  592. <div class=\"col-md-3\">
  593. <label style=\"color:#212121;\">Nights</label> <br />
  594. <span id=\"info-nights\" style=\"color:#212121;\">-</span>
  595. </div>
  596. <div class=\"col-md-12\" style=\"font-size:20px;\">
  597. <div id=\"results\"></div>
  598. </div>
  599. <div class=\"col-md-6\">
  600. <label style=\"color:#212121;\">Last name</label>
  601. ";
  602. // line 529
  603. 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');
  604. yield "
  605. </div>
  606. <div class=\"col-md-6\">
  607. <label style=\"color:#212121;\">First name</label>
  608. ";
  609. // line 534
  610. 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');
  611. yield "
  612. </div>
  613. <div class=\"col-md-12\">
  614. <label style=\"color:#212121;\">Email address</label>
  615. ";
  616. // line 539
  617. 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');
  618. yield "
  619. </div>
  620. <div class=\"col-md-12\">
  621. <label style=\"color:#212121;\">Message</label>
  622. ";
  623. // line 544
  624. 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');
  625. yield "
  626. </div>
  627. <div class=\"col-md-12\">
  628. <div class=\"text-center\" style=\"color:#212121;\">
  629. <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>
  630. </div>
  631. </div>
  632. <div class=\"col-md-12\">
  633. <div class=\"text-center\">
  634. <button type=\"submit\" name=\"submit\" value=\"1\" class=\"btn-main\" style=\"color:white;\">Send booking request</button>
  635. </div>
  636. </div>
  637. </div>
  638. ";
  639. // line 560
  640. 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');
  641. yield "
  642. ";
  643. // line 561
  644. 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');
  645. yield "
  646. ";
  647. // line 563
  648. 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');
  649. yield "
  650. ";
  651. // line 564
  652. 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');
  653. yield "
  654. </div>
  655. </div>
  656. </div>
  657. </section>
  658. <section id=\"faq\" class=\"text-light\">
  659. <div class=\"container\">
  660. <div class=\"row g-4 justify-content-center\">
  661. <div class=\"col-lg-6 text-center\">
  662. <h2 class=\"wow fadeInUp\" data-wow-delay=\".2s\">FAQ</h2>
  663. </div>
  664. </div>
  665. <div class=\"row g-4 justify-content-center\">
  666. <div class=\"col-lg-6 text-left\" style=\"color:black !important;\">
  667. <h3 style=\"margin-top:7px;\">How can I book the accommodation?</h3>
  668. <div>You can book directly on our website and soon via partner platforms. Secure payment immediately confirms your reservation.</div>
  669. <h3 style=\"margin-top:7px;\">What are the check-in and check-out times?</h3>
  670. <div>
  671. <ul>
  672. <li>Check-in: from 3:00 PM</li>
  673. <li>Check-out: before 11:00 AM</li>
  674. </ul>
  675. </div>
  676. <h3 style=\"margin-top:7px;\">Is the accommodation fully equipped?</h3>
  677. <div> Yes, the apartment is fully furnished and equipped: kitchen, bedding, towels, appliances, Wi-Fi, and more.</div>
  678. <h3 style=\"margin-top:7px;\">Is parking available?</h3>
  679. <div>Yes, private parking is available as an option at €24 per 24 hours or €150 per week (7 nights).</div>
  680. <h3 style=\"margin-top:7px;\">Is the accommodation suitable for children?</h3>
  681. <div>Yes, we offer some baby amenities (baby cot, high chair, child-friendly tableware) upon request.</div>
  682. <h3 style=\"margin-top:7px;\"> Are pets allowed?</h3>
  683. <div> Please contact us before booking if you wish to bring a pet. Only dogs are accepted, and prior approval is required.</div>
  684. <h3 style=\"margin-top:7px;\">Can I cancel or modify my reservation?</h3>
  685. <div>Yes, our cancellation policy is provided at the time of booking:
  686. <ul>
  687. <li>85% refund if canceled more than 1 month before arrival</li>
  688. <li>50% refund if canceled between 1 month and 15 days before arrival</li>
  689. <li>No refund if canceled less than 15 days before arrival</li>
  690. </ul>
  691. </div>
  692. <h3 style=\"margin-top:7px;\">Is the accommodation accessible by public transport?</h3>
  693. <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>
  694. <h3 style=\"margin-top:7px;\">Are there shops or restaurants nearby?</h3>
  695. <div>Yes, you’ll find supermarkets, cafés, restaurants, and tourist activities right at the foot of the building.</div>
  696. <h3 style=\"margin-top:7px;\"> What should I do if there’s a problem during my stay?</h3>
  697. <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.
  698. </div>
  699. </div>
  700. </div>
  701. </div>
  702. </section>
  703. ";
  704. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  705. $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  706. yield from [];
  707. }
  708. // line 632
  709. /**
  710. * @return iterable<null|scalar|\Stringable>
  711. */
  712. public function block_footerjs(array $context, array $blocks = []): iterable
  713. {
  714. $macros = $this->macros;
  715. $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  716. $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "footerjs"));
  717. $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  718. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "footerjs"));
  719. // line 633
  720. yield " <script src=\"https://cdn.jsdelivr.net/npm/flatpickr\"></script>
  721. <script src=\"https://cdn.jsdelivr.net/npm/flatpickr/dist/l10n/en.js\"></script>
  722. <script>
  723. function updateSimulation() {
  724. var start = \$(\"#reservation_form_start\").val();
  725. var end = \$(\"#reservation_form_end\").val();
  726. var persons = \$(\"#reservation_form_persons\").val();
  727. if (start && end && persons) {
  728. \$(\"#results\").html('<div class=\"loading\">Calculating...</div>');
  729. \$.post(
  730. Routing.generate('simulation_pricing'),
  731. {'start': start, 'end': end, 'persons': persons}
  732. )
  733. .done(function(data) {
  734. \$(\"#results\").html(data);
  735. })
  736. .fail(function() {
  737. \$(\"#results\").html('<div class=\"error\">Calculation error</div>');
  738. });
  739. } else {
  740. \$(\"#results\").html('');
  741. }
  742. }
  743. // Écoute les changements sur le nombre de personnes
  744. \$(\"#reservation_form_persons\").change(updateSimulation);
  745. \$(document).ready(function() {
  746. // Désactive le bouton au chargement de la page
  747. \$('button[type=\"submit\"]').prop('disabled', true);
  748. // Écoute les changements sur la checkbox
  749. \$('#acceptCGV').change(function() {
  750. if(\$(this).is(':checked')) {
  751. \$('button[type=\"submit\"]').prop('disabled', false);
  752. } else {
  753. \$('button[type=\"submit\"]').prop('disabled', true);
  754. }
  755. });
  756. });
  757. </script>
  758. <script>
  759. \$(document).ready(function() {
  760. let bookedRanges = [];
  761. \$.ajax({
  762. url: '";
  763. // line 681
  764. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['App\Twig\CoreExtension']->getEnvironmentVariable("WEBHOOK_CALENDAR_AVAILABILITY"), "html", null, true);
  765. yield "',
  766. method: 'POST',
  767. contentType: 'application/json',
  768. data: ''
  769. })
  770. .done(function(data) {
  771. bookedRanges = data.bookings || [];
  772. console.log('✅ Créneaux chargés:', bookedRanges);
  773. initDatePicker();
  774. })
  775. .fail(function(error) {
  776. console.error('❌ Erreur:', error);
  777. initDatePicker();
  778. });
  779. // 🔧 FONCTION POUR CRÉER UNE DATE LOCALE SANS DÉCALAGE UTC
  780. function parseLocalDate(dateStr) {
  781. const [year, month, day] = dateStr.split('-').map(Number);
  782. return new Date(year, month - 1, day);
  783. }
  784. const isMobile = window.innerWidth <= 900;
  785. function initDatePicker() {
  786. flatpickr(\"#date_range_picker\", {
  787. inline: true,
  788. mode: \"range\",
  789. locale: \"fr\",
  790. minDate: new Date(new Date().setDate(new Date().getDate() + 1)),
  791. dateFormat: \"Y-m-d\",
  792. showMonths: isMobile ? 1 : 2,
  793. disable: [
  794. function(date) {
  795. const checkDate = new Date(date);
  796. checkDate.setHours(0, 0, 0, 0);
  797. return bookedRanges.some(range => {
  798. const start = parseLocalDate(range.start_date);
  799. const end = parseLocalDate(range.end_date);
  800. return checkDate >= start && checkDate <= end;
  801. });
  802. }
  803. ],
  804. onChange: function(selectedDates, dateStr, instance) {
  805. console.log('📅 Dates sélectionnées:', selectedDates.length);
  806. if (selectedDates.length === 2) {
  807. const start = selectedDates[0];
  808. const end = selectedDates[1];
  809. if (isRangeAvailable(start, end)) {
  810. // ✅ Met à jour avec jQuery ET déclenche l'événement change
  811. \$('#reservation_form_start').val(formatDate(start)).trigger('change');
  812. \$('#reservation_form_end').val(formatDate(end)).trigger('change');
  813. console.log('✅ Champs mis à jour:',
  814. \$('#reservation_form_start').val(),
  815. '→',
  816. \$('#reservation_form_end').val()
  817. );
  818. updateSelectedInfo(start, end);
  819. // ✅ Force la simulation
  820. updateSimulation();
  821. } else {
  822. alert('⚠️ Cette période contient des dates déjà réservées.\\nVeuillez choisir une autre période.');
  823. instance.clear();
  824. clearSymfonyFields();
  825. hideSelectedInfo();
  826. \$(\"#results\").html('');
  827. }
  828. } else {
  829. clearSymfonyFields();
  830. hideSelectedInfo();
  831. \$(\"#results\").html('');
  832. }
  833. },
  834. onDayCreate: function(dObj, dStr, fp, dayElem) {
  835. const date = new Date(dayElem.dateObj);
  836. date.setHours(0, 0, 0, 0);
  837. const isBooked = bookedRanges.some(range => {
  838. const start = parseLocalDate(range.start_date);
  839. const end = parseLocalDate(range.end_date);
  840. return date >= start && date <= end;
  841. });
  842. if (isBooked) {
  843. dayElem.classList.add('booked');
  844. dayElem.title = 'Date indisponible (réservée)';
  845. } else if (date >= new Date()) {
  846. dayElem.classList.add('available');
  847. dayElem.title = 'Date disponible';
  848. }
  849. }
  850. });
  851. }
  852. function isRangeAvailable(startDate, endDate) {
  853. let currentDate = new Date(startDate);
  854. currentDate.setHours(0, 0, 0, 0);
  855. const endCheck = new Date(endDate);
  856. endCheck.setHours(0, 0, 0, 0);
  857. while (currentDate <= endCheck) {
  858. const isBooked = bookedRanges.some(range => {
  859. const start = parseLocalDate(range.start_date);
  860. const end = parseLocalDate(range.end_date);
  861. return currentDate >= start && currentDate <= end;
  862. });
  863. if (isBooked) return false;
  864. currentDate.setDate(currentDate.getDate() + 1);
  865. }
  866. return true;
  867. }
  868. function updateSelectedInfo(start, end) {
  869. const nights = Math.ceil((end - start) / (1000 * 60 * 60 * 24));
  870. \$('#info-start').text(start.toLocaleDateString('fr-FR'));
  871. \$('#info-end').text(end.toLocaleDateString('fr-FR'));
  872. \$('#info-nights').text(`\${nights} nuit\${nights > 1 ? 's' : ''}`);
  873. \$('#selected-dates-info').addClass('active');
  874. }
  875. function hideSelectedInfo() {
  876. \$('#selected-dates-info').removeClass('active');
  877. }
  878. function clearSymfonyFields() {
  879. \$('#reservation_form_start').val('');
  880. \$('#reservation_form_end').val('');
  881. }
  882. function formatDate(date) {
  883. const year = date.getFullYear();
  884. const month = String(date.getMonth() + 1).padStart(2, '0');
  885. const day = String(date.getDate()).padStart(2, '0');
  886. return `\${year}-\${month}-\${day}`;
  887. }
  888. });
  889. </script>
  890. ";
  891. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  892. $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  893. yield from [];
  894. }
  895. // line 831
  896. /**
  897. * @return iterable<null|scalar|\Stringable>
  898. */
  899. public function block_css(array $context, array $blocks = []): iterable
  900. {
  901. $macros = $this->macros;
  902. $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  903. $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "css"));
  904. $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  905. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "css"));
  906. // line 832
  907. yield " <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css\">
  908. <style>
  909. .calendar-container {
  910. margin: 20px 0;
  911. width: 100%;
  912. overflow: hidden;
  913. }
  914. /* Calendrier inline (toujours visible) */
  915. #date_range_picker {
  916. display: none; /* Le champ input est caché, on affiche juste le calendrier */
  917. }
  918. .flatpickr-calendar.inline {
  919. margin: 0 auto;
  920. box-shadow: 0 4px 12px rgba(0,0,0,0.15);
  921. border-radius: 8px;
  922. max-width: 100%;
  923. }
  924. .flatpickr-day.booked {
  925. background-color: #ff4444 !important;
  926. color: white !important;
  927. cursor: not-allowed !important;
  928. position: relative;
  929. }
  930. .flatpickr-day.booked::after {
  931. content: \"✕\";
  932. position: absolute;
  933. top: 50%;
  934. left: 50%;
  935. transform: translate(-50%, -50%);
  936. font-size: 20px;
  937. font-weight: bold;
  938. }
  939. .flatpickr-day.booked:hover {
  940. background-color: #ff0000 !important;
  941. }
  942. .flatpickr-day.available:hover {
  943. background-color: #28a745;
  944. color: white;
  945. }
  946. /* Adaptations Mobile */
  947. @media (max-width: 768px) {
  948. .calendar-container {
  949. margin: 10px 0;
  950. padding: 0 10px;
  951. }
  952. .flatpickr-calendar.inline {
  953. width: 100% !important;
  954. max-width: 100% !important;
  955. }
  956. .flatpickr-months {
  957. padding: 8px 10px;
  958. }
  959. .flatpickr-days {
  960. width: 100% !important;
  961. }
  962. .dayContainer {
  963. width: 100% !important;
  964. min-width: 100% !important;
  965. max-width: 100% !important;
  966. }
  967. .flatpickr-day {
  968. height: 40px !important;
  969. line-height: 40px !important;
  970. flex-basis: 14.2857% !important;
  971. max-width: 14.2857% !important;
  972. }
  973. }
  974. </style>
  975. ";
  976. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  977. $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  978. yield from [];
  979. }
  980. /**
  981. * @codeCoverageIgnore
  982. */
  983. public function getTemplateName(): string
  984. {
  985. return "vitrine/en/homepage.html.twig";
  986. }
  987. /**
  988. * @codeCoverageIgnore
  989. */
  990. public function isTraitable(): bool
  991. {
  992. return false;
  993. }
  994. /**
  995. * @codeCoverageIgnore
  996. */
  997. public function getDebugInfo(): array
  998. {
  999. 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,);
  1000. }
  1001. public function getSourceContext(): Source
  1002. {
  1003. return new Source("{% extends 'vitrine/en/layout.html.twig' %}
  1004. {% block title %}Cathedral Heritage Suite - 8-Guest Rental Strasbourg Center{% endblock title %}
  1005. {% 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 %}
  1006. {% block robots %}index,follow{% endblock robots %}
  1007. {% block canonical %}
  1008. <link rel=\"canonical\" href=\"https://cathedraleheritage.com\" />
  1009. <link rel=\"alternate\" hreflang=\"fr\" href=\"https://cathedraleheritage.com/fr\" />
  1010. <link rel=\"alternate\" hreflang=\"en\" href=\"https://cathedraleheritage.com\" />
  1011. <link rel=\"alternate\" hreflang=\"x-default\" href=\"https://cathedraleheritage.com\" />
  1012. {% endblock canonical %}
  1013. {% block body %}
  1014. <section id=\"hero\" class=\"text-light no-top no-bottom relative overflow-hidden z-1000\">
  1015. <div class=\"abs w-100 abs-centered z-2\">
  1016. <div class=\"container\">
  1017. <div class=\"spacer-double\"></div>
  1018. <div class=\"row g-4 align-items-center justify-content-center\">
  1019. <div class=\"col-md-8 text-center\">
  1020. <h1 class=\"mb-2\" style=\"color:white;\">Welcome to Cathedral Heritage Suite</h1>
  1021. <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>
  1022. <a class=\"btn-main btn-line bg-blur fx-slide\" href=\"#about\" style=\"color:white;\"><span>Find out more</span></a>
  1023. </div>
  1024. </div>
  1025. </div>
  1026. </div>
  1027. <div class=\"vertical-center\">
  1028. <div class=\"swiper\">
  1029. <div class=\"swiper-wrapper\">
  1030. <div class=\"swiper-slide\">
  1031. <div class=\"swiper-inner\" data-bgimage=\"url(/images/salon2.jpeg)\">
  1032. <div class=\"sw-overlay op-5\"></div>
  1033. </div>
  1034. </div>
  1035. <div class=\"swiper-slide\">
  1036. <div class=\"swiper-inner\" data-bgimage=\"url(/images/chambre2.jpeg)\">
  1037. <div class=\"sw-overlay op-5\"></div>
  1038. </div>
  1039. </div>
  1040. <div class=\"swiper-slide\">
  1041. <div class=\"swiper-inner\" data-bgimage=\"url(/images/noel.jpeg)\">
  1042. <div class=\"sw-overlay op-5\"></div>
  1043. </div>
  1044. </div>
  1045. </div>
  1046. </div>
  1047. </div>
  1048. <div class=\"abs w-100 bottom-0 z-2 pb-4 sm-hide\">
  1049. <div class=\"container\">
  1050. <div class=\"row\">
  1051. <div class=\"col-lg-12\">
  1052. <div class=\"d-flex justify-content-between\">
  1053. <div>
  1054. <h6 style=\"color:white;\">Cathedral 100m away</h6>
  1055. </div>
  1056. <div>
  1057. <h6 style=\"color:white;\">Museums 200m away</h6>
  1058. </div>
  1059. <div>
  1060. <h6 style=\"color:white;\">Petite France 300m away</h6>
  1061. </div>
  1062. </div>
  1063. </div>
  1064. </div>
  1065. </div>
  1066. </div>
  1067. <div class=\"gradient-edge-bottom op-8\"></div>
  1068. </section>
  1069. <section id=\"about\">
  1070. <div class=\"container\">
  1071. <div class=\"row g-4 align-items-end justify-content-between\">
  1072. <div class=\"col-lg-5\">
  1073. <div class=\"subtitle\">About the apartment</div>
  1074. <h2>Modern suite in the heart of Strasbourg's Grande Île</h2>
  1075. </div>
  1076. <div class=\"col-lg-4\">
  1077. <p class=\"mb-4\" style=\"color:#212121;\">
  1078. 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.
  1079. </p>
  1080. <p class=\"mb-4\" style=\"color:#212121;\">
  1081. Kitchen fully furnished and cozy living-dining room to share great moments together.
  1082. </p>
  1083. <p class=\"mb-4\" style=\"color:#212121;\">
  1084. 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.
  1085. </p>
  1086. </div>
  1087. </div>
  1088. <div class=\"spacer-single\"></div>
  1089. <div class=\"row g-4\">
  1090. <div class=\"col-md-2\">
  1091. <div class=\"relative\">
  1092. <h5>Size</h5>
  1093. <div class=\"d-flex justify-content-start align-items-center\" style=\"padding-top:6px;\">
  1094. <img src=\"/images/home.png\" width=\"37\" class=\"me-3\" alt=\"\">
  1095. <div class=\"fs-20 fw-600\" style=\"color:#212121;\">83 m²</div>
  1096. </div>
  1097. </div>
  1098. </div>
  1099. <div class=\"col-md-2\">
  1100. <div class=\"relative\">
  1101. <h5>Bedrooms</h5>
  1102. <div class=\"d-flex justify-content-start align-items-center\" style=\"padding-top:4px;\">
  1103. <img src=\"/images/bed.png\" width=\"37\" class=\"me-3\" alt=\"\">
  1104. <div class=\"fs-20 fw-600\" style=\"color:#212121;\">3</div>
  1105. </div>
  1106. </div>
  1107. </div>
  1108. <div class=\"col-md-2\">
  1109. <div class=\"relative\">
  1110. <h5>Living Room</h5>
  1111. <div class=\"d-flex justify-content-start align-items-center\">
  1112. <img src=\"/images/sofa.png\" width=\"50\" class=\"me-3\" alt=\"\">
  1113. <div class=\"fs-20 fw-600\" style=\"color:#212121;\">Included</div>
  1114. </div>
  1115. </div>
  1116. </div>
  1117. <div class=\"col-md-2\">
  1118. <div class=\"relative\">
  1119. <h5>Kitchen</h5>
  1120. <div class=\"d-flex justify-content-start align-items-center\" style=\"padding-top:6px;\">
  1121. <img src=\"/images/cooking.png\" width=\"37\" class=\"me-3\" alt=\"\">
  1122. <div class=\"fs-20 fw-600\" style=\"color:#212121;\">Included</div>
  1123. </div>
  1124. </div>
  1125. </div>
  1126. <div class=\"col-md-2\">
  1127. <div class=\"relative\">
  1128. <h5>Bathrooms</h5>
  1129. <div class=\"d-flex justify-content-start align-items-center\" style=\"padding-top:4px;\">
  1130. <img src=\"/images/bathroom.png\" width=\"40\" class=\"me-3\" alt=\"\">
  1131. <div class=\"fs-20 fw-600\" style=\"color:#212121;\">2</div>
  1132. </div>
  1133. </div>
  1134. </div>
  1135. <div class=\"col-md-2\">
  1136. <div class=\"relative\">
  1137. <h5>Guests</h5>
  1138. <div class=\"d-flex justify-content-start align-items-center\" style=\"padding-top:5px;\">
  1139. <img src=\"/images/user.png\" width=\"37\" class=\"me-3\" alt=\"\">
  1140. <div class=\"fs-20 fw-600\" style=\"color:#212121;\">8</div>
  1141. </div>
  1142. </div>
  1143. </div>
  1144. </div>
  1145. </div>
  1146. </section>
  1147. <section id=\"rooms\" class=\"p-0 overflow-hidden\">
  1148. <div class=\"container-fluid\">
  1149. <div class=\"row\">
  1150. <div class=\"col-lg-12\">
  1151. <div class=\"owl-custom-nav menu-float\" data-target=\"#room-carousel\">
  1152. <a class=\"btn-next\"></a>
  1153. <a class=\"btn-prev\"></a>
  1154. <div id=\"room-carousel\" class=\"owl-2-cols-center owl-carousel owl-theme\">
  1155. <div class=\"item\">
  1156. <div class=\"relative\">
  1157. <div class=\"overflow-hidden text-light\">
  1158. <div class=\"abs h-100 start-0 z-2 p-4\">
  1159. <h3 style=\"color:white;\">Living Room</h3>
  1160. </div>
  1161. <img src=\"/images/salon2.jpeg\" class=\"w-100\" alt=\"Living Room\">
  1162. </div>
  1163. </div>
  1164. </div>
  1165. <div class=\"item\">
  1166. <div class=\"relative\">
  1167. <div class=\"overflow-hidden text-light\">
  1168. <div class=\"abs h-100 start-1 z-2 p-4\">
  1169. <h3 style=\"color:white;\">Bedroom 1</h3>
  1170. </div>
  1171. <img src=\"/images/chambre1.jpeg\" class=\"w-100\" alt=\"Bedroom 1\">
  1172. </div>
  1173. </div>
  1174. </div>
  1175. <div class=\"item\">
  1176. <div class=\"relative\">
  1177. <div class=\"overflow-hidden text-light\">
  1178. <div class=\"abs h-100 start-2 z-2 p-4\">
  1179. <h3 style=\"color:white;\">Bedroom 2</h3>
  1180. </div>
  1181. <img src=\"/images/chambre2.jpeg\" class=\"w-100\" alt=\"Bedroom 2\">
  1182. </div>
  1183. </div>
  1184. </div>
  1185. <div class=\"item\">
  1186. <div class=\"relative\">
  1187. <div class=\"overflow-hidden text-light\">
  1188. <div class=\"abs h-100 start-3 z-2 p-4\">
  1189. <h3 style=\"color:white;\">Bedroom 3</h3>
  1190. </div>
  1191. <img src=\"/images/chambre3.jpeg\" class=\"w-100\" alt=\"Bedroom 3\">
  1192. </div>
  1193. </div>
  1194. </div>
  1195. <div class=\"item\">
  1196. <div class=\"relative\">
  1197. <div class=\"overflow-hidden text-light\">
  1198. <div class=\"abs h-100 start-4 z-2 p-4\">
  1199. <h3 style=\"color:white;\">Kitchen</h3>
  1200. </div>
  1201. <img src=\"/images/cuisine.jpeg\" class=\"w-100\" alt=\"Kitchen\">
  1202. </div>
  1203. </div>
  1204. </div>
  1205. <div class=\"item\">
  1206. <div class=\"relative\">
  1207. <div class=\"overflow-hidden text-light\">
  1208. <div class=\"abs h-100 start-5 z-2 p-4\">
  1209. <h3 style=\"color:white;\">Bathroom</h3>
  1210. </div>
  1211. <img src=\"/images/salledebain.jpeg\" class=\"w-100\" alt=\"Bathroom 1\">
  1212. </div>
  1213. </div>
  1214. </div>
  1215. <div class=\"item\">
  1216. <div class=\"relative\">
  1217. <div class=\"overflow-hidden text-light\">
  1218. <div class=\"abs h-100 start-6 z-2 p-4\">
  1219. <h3 style=\"color:white;\">Bathroom 2</h3>
  1220. </div>
  1221. <img src=\"/images/salledebain2.jpeg\" class=\"w-100\" alt=\"Bathroom 2\">
  1222. </div>
  1223. </div>
  1224. </div>
  1225. </div>
  1226. </div>
  1227. </div>
  1228. </div>
  1229. </div>
  1230. </section>
  1231. <section id=\"services\" class=\"overlay-dark-1\">
  1232. <div class=\"container\">
  1233. <div class=\"row g-4 justify-content-between\">
  1234. <div class=\"col-lg-5 relative z-3\">
  1235. <div class=\"me-lg-3\">
  1236. <div class=\"subtitle wow fadeInUp\" data-wow-delay=\".0s\">Your stay in Strasbourg</div>
  1237. <h2 class=\"wow fadeInUp\" data-wow-delay=\".2s\">Rates and services</h2>
  1238. <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>
  1239. <p style=\"color:#212121; font-size:18px;\">Minimum booking of two nights.</p>
  1240. <a href=\"#reservation\" class=\"btn-main\" style=\"color:white;\">Booking</a>
  1241. </div>
  1242. </div>
  1243. <div class=\"col-lg-6\" style=\"color:black;\">
  1244. <div class=\"spacer-single spacer-double\"></div>
  1245. <div class=\"row\">
  1246. <div class=\"col-md-6 wow fadeInUp\" data-wow-delay=\".2s\">
  1247. {#
  1248. <h5 class=\" mb-3\">Peak Season</h5>
  1249. <p class=\"fs-500\"><small>June 1st to September 30th • November 25th to January 5th</small></p>
  1250. <ul class=\"ul-check fs-500\">
  1251. <li>€960 per night</li>
  1252. <li>10% discount for bookings of 7 nights and up</li>
  1253. </ul>
  1254. <h5 class=\"mb-3 mt-4\">Off-peak Season</h5>
  1255. #}
  1256. <ul class=\"ul-check fs-500\">
  1257. <li>2 guests: €350 per night</li>
  1258. <li>4 guests: €690 per night</li>
  1259. <li>from 6 guests and up: €890 per night</li>
  1260. <li>10% discount for bookings of 7 nights and up</li>
  1261. </ul>
  1262. </div>
  1263. <div class=\"col-md-6 wow fadeInUp\" data-wow-delay=\".4s\">
  1264. <h5 class=\"mb-3\">Optional services</h5>
  1265. <ul class=\"ul-check fs-500\">
  1266. <li>One parking space: €24/day or €150/week</li>
  1267. <li>Extra cleaning during your stay : 60 euros</li>
  1268. <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>
  1269. </ul>
  1270. <div class=\"mt-4\">
  1271. <p class=\"fs-500\">
  1272. <strong>On site assistance</strong> <br />
  1273. <small>Tuesday to Saturday • 10am-6:45pm</small>
  1274. </p>
  1275. <p class=\"fs-500\">
  1276. <strong>Private concierge subject to availability</strong><br>
  1277. <small>Quotation on request</small>
  1278. </p>
  1279. </div>
  1280. </div>
  1281. </div>
  1282. </div>
  1283. </div>
  1284. </div>
  1285. </section>
  1286. <section id=\"section-gallery\" class=\"relative\">
  1287. <div class=\"container relative z-2\" id=\"photos\">
  1288. <div class=\"row g-4 gx-5 justify-content-center\">
  1289. <div class=\"col-lg-6 text-center\">
  1290. <h2 class=\"wow fadeInUp\" data-wow-delay=\".2s\">Apartment Gallery</h2>
  1291. <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>
  1292. </div>
  1293. </div>
  1294. <div class=\"row\">
  1295. <div class=\"col-md-12 text-center\">
  1296. <ul id=\"filters\" class=\"wow fadeInUp\" data-wow-delay=\"0s\">
  1297. <li><a href=\"#\" data-filter=\"*\" class=\"selected\" style=\"color:#212121;\">Show All</a></li>
  1298. <li><a href=\"#\" data-filter=\".chambre\" style=\"color:#212121;\">Bedrooms</a></li>
  1299. <li><a href=\"#\" data-filter=\".salon\" style=\"color:#212121;\">Living Room</a></li>
  1300. <li><a href=\"#\" data-filter=\".cuisine\" style=\"color:#212121;\">Kitchen</a></li>
  1301. <li><a href=\"#\" data-filter=\".salledebain\" style=\"color:#212121;\">Bathroom</a></li>
  1302. <li><a href=\"#\" data-filter=\".exterieur\" style=\"color:#212121;\">Outdoor surroundings</a></li>
  1303. </ul>
  1304. </div>
  1305. </div>
  1306. <div id=\"gallery\" class=\"row g-3 wow fadeInUp\" data-wow-delay=\".3s\">
  1307. <div class=\"col-md-3 col-sm-6 col-12 item chambre\">
  1308. <a href=\"images/chambre1.jpeg\" class=\"image-popup d-block hover\">
  1309. <div class=\"relative overflow-hidden\">
  1310. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  1311. View
  1312. </div>
  1313. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  1314. <img src=\"images/chambre1.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Bedroom\">
  1315. </div>
  1316. </a>
  1317. </div>
  1318. <div class=\"col-md-3 col-sm-6 col-12 item chambre\">
  1319. <a href=\"images/chambre2.jpeg\" class=\"image-popup d-block hover\">
  1320. <div class=\"relative overflow-hidden\">
  1321. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  1322. View
  1323. </div>
  1324. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  1325. <img src=\"images/chambre2.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Bedroom 2\">
  1326. </div>
  1327. </a>
  1328. </div>
  1329. <div class=\"col-md-3 col-sm-6 col-12 item chambre\">
  1330. <a href=\"images/chambre3.jpeg\" class=\"image-popup d-block hover\">
  1331. <div class=\"relative overflow-hidden\">
  1332. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  1333. View
  1334. </div>
  1335. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  1336. <img src=\"images/chambre3.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Bedroom 3\">
  1337. </div>
  1338. </a>
  1339. </div>
  1340. <div class=\"col-md-3 col-sm-6 col-12 item salon\">
  1341. <a href=\"images/salon.jpeg\" class=\"image-popup d-block hover\">
  1342. <div class=\"relative overflow-hidden\">
  1343. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  1344. View
  1345. </div>
  1346. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  1347. <img src=\"images/salon.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Living Room\">
  1348. </div>
  1349. </a>
  1350. </div>
  1351. <div class=\"col-md-3 col-sm-6 col-12 item salon\">
  1352. <a href=\"images/salon2.jpeg\" class=\"image-popup d-block hover\">
  1353. <div class=\"relative overflow-hidden\">
  1354. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  1355. View
  1356. </div>
  1357. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  1358. <img src=\"images/salon2.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Living Room 2\">
  1359. </div>
  1360. </a>
  1361. </div>
  1362. <div class=\"col-md-3 col-sm-6 col-12 item salon\">
  1363. <a href=\"images/salon3.jpeg\" class=\"image-popup d-block hover\">
  1364. <div class=\"relative overflow-hidden\">
  1365. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  1366. View
  1367. </div>
  1368. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  1369. <img src=\"images/salon3.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Living Room 3\">
  1370. </div>
  1371. </a>
  1372. </div>
  1373. <div class=\"col-md-3 col-sm-6 col-12 item salon\">
  1374. <a href=\"images/salon4.jpeg\" class=\"image-popup d-block hover\">
  1375. <div class=\"relative overflow-hidden\">
  1376. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  1377. View
  1378. </div>
  1379. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  1380. <img src=\"images/salon4.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Living Room 4\">
  1381. </div>
  1382. </a>
  1383. </div>
  1384. <div class=\"col-md-3 col-sm-6 col-12 item salon\">
  1385. <a href=\"images/salon5.jpeg\" class=\"image-popup d-block hover\">
  1386. <div class=\"relative overflow-hidden\">
  1387. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  1388. View
  1389. </div>
  1390. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  1391. <img src=\"images/salon5.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Living Room 5\">
  1392. </div>
  1393. </a>
  1394. </div>
  1395. <div class=\"col-md-3 col-sm-6 col-12 item cuisine\">
  1396. <a href=\"images/cuisine.jpeg\" class=\"image-popup d-block hover\">
  1397. <div class=\"relative overflow-hidden\">
  1398. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  1399. View
  1400. </div>
  1401. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  1402. <img src=\"images/cuisine.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Kitchen\">
  1403. </div>
  1404. </a>
  1405. </div>
  1406. <div class=\"col-md-3 col-sm-6 col-12 item salledebain\">
  1407. <a href=\"images/salledebain.jpeg\" class=\"image-popup d-block hover\">
  1408. <div class=\"relative overflow-hidden\">
  1409. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  1410. View
  1411. </div>
  1412. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  1413. <img src=\"images/salledebain.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Bathroom\">
  1414. </div>
  1415. </a>
  1416. </div>
  1417. <div class=\"col-md-3 col-sm-6 col-12 item salledebain\">
  1418. <a href=\"images/salledebain2.jpeg\" class=\"image-popup d-block hover\">
  1419. <div class=\"relative overflow-hidden\">
  1420. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  1421. View
  1422. </div>
  1423. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  1424. <img src=\"images/salledebain2.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Bathroom 2\">
  1425. </div>
  1426. </a>
  1427. </div>
  1428. <div class=\"col-md-3 col-sm-6 col-12 item exterieur\">
  1429. <a href=\"images/exterieur.jpeg\" class=\"image-popup d-block hover\">
  1430. <div class=\"relative overflow-hidden\">
  1431. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  1432. View
  1433. </div>
  1434. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  1435. <img src=\"images/exterieur.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Exterior\">
  1436. </div>
  1437. </a>
  1438. </div>
  1439. </div>
  1440. </div>
  1441. </section>
  1442. <section id=\"reservation\" class=\"text-light\">
  1443. <div class=\"container\">
  1444. <div class=\"row g-4 justify-content-center\">
  1445. <div class=\"col-lg-6 text-center\">
  1446. <h2 class=\"wow fadeInUp\" data-wow-delay=\".2s\">Book your stay</h2>
  1447. </div>
  1448. </div>
  1449. <div class=\"row g-4 justify-content-center\">
  1450. <div class=\"col-md-6\">
  1451. {{ form_start(form) }}
  1452. <div class=\"row g-4\">
  1453. <div class=\"col-md-12\">
  1454. <div class=\"calendar-container\" style=\"height:300px;\">
  1455. <input type=\"text\" id=\"date_range_picker\">
  1456. </div>
  1457. </div>
  1458. <div class=\"col-md-3\">
  1459. <label style=\"color:#212121;\">Guests</label>
  1460. {{ form_widget(form.persons) }}
  1461. </div>
  1462. <div class=\"col-md-3\">
  1463. <label style=\"color:#212121;\">Arrival</label> <br />
  1464. </strong> <span id=\"info-start\" style=\"color:#212121;\">-</span>
  1465. </div>
  1466. <div class=\"col-md-3\">
  1467. <label style=\"color:#212121;\">Departure</label> <br />
  1468. <span id=\"info-end\" style=\"color:#212121;\">-</span>
  1469. </div>
  1470. <div class=\"col-md-3\">
  1471. <label style=\"color:#212121;\">Nights</label> <br />
  1472. <span id=\"info-nights\" style=\"color:#212121;\">-</span>
  1473. </div>
  1474. <div class=\"col-md-12\" style=\"font-size:20px;\">
  1475. <div id=\"results\"></div>
  1476. </div>
  1477. <div class=\"col-md-6\">
  1478. <label style=\"color:#212121;\">Last name</label>
  1479. {{ form_widget(form.lastname) }}
  1480. </div>
  1481. <div class=\"col-md-6\">
  1482. <label style=\"color:#212121;\">First name</label>
  1483. {{ form_widget(form.name) }}
  1484. </div>
  1485. <div class=\"col-md-12\">
  1486. <label style=\"color:#212121;\">Email address</label>
  1487. {{ form_widget(form.email) }}
  1488. </div>
  1489. <div class=\"col-md-12\">
  1490. <label style=\"color:#212121;\">Message</label>
  1491. {{ form_widget(form.message) }}
  1492. </div>
  1493. <div class=\"col-md-12\">
  1494. <div class=\"text-center\" style=\"color:#212121;\">
  1495. <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>
  1496. </div>
  1497. </div>
  1498. <div class=\"col-md-12\">
  1499. <div class=\"text-center\">
  1500. <button type=\"submit\" name=\"submit\" value=\"1\" class=\"btn-main\" style=\"color:white;\">Send booking request</button>
  1501. </div>
  1502. </div>
  1503. </div>
  1504. {{ form_widget(form.start) }}
  1505. {{ form_widget(form.end) }}
  1506. {{ form_rest(form) }}
  1507. {{ form_end(form) }}
  1508. </div>
  1509. </div>
  1510. </div>
  1511. </section>
  1512. <section id=\"faq\" class=\"text-light\">
  1513. <div class=\"container\">
  1514. <div class=\"row g-4 justify-content-center\">
  1515. <div class=\"col-lg-6 text-center\">
  1516. <h2 class=\"wow fadeInUp\" data-wow-delay=\".2s\">FAQ</h2>
  1517. </div>
  1518. </div>
  1519. <div class=\"row g-4 justify-content-center\">
  1520. <div class=\"col-lg-6 text-left\" style=\"color:black !important;\">
  1521. <h3 style=\"margin-top:7px;\">How can I book the accommodation?</h3>
  1522. <div>You can book directly on our website and soon via partner platforms. Secure payment immediately confirms your reservation.</div>
  1523. <h3 style=\"margin-top:7px;\">What are the check-in and check-out times?</h3>
  1524. <div>
  1525. <ul>
  1526. <li>Check-in: from 3:00 PM</li>
  1527. <li>Check-out: before 11:00 AM</li>
  1528. </ul>
  1529. </div>
  1530. <h3 style=\"margin-top:7px;\">Is the accommodation fully equipped?</h3>
  1531. <div> Yes, the apartment is fully furnished and equipped: kitchen, bedding, towels, appliances, Wi-Fi, and more.</div>
  1532. <h3 style=\"margin-top:7px;\">Is parking available?</h3>
  1533. <div>Yes, private parking is available as an option at €24 per 24 hours or €150 per week (7 nights).</div>
  1534. <h3 style=\"margin-top:7px;\">Is the accommodation suitable for children?</h3>
  1535. <div>Yes, we offer some baby amenities (baby cot, high chair, child-friendly tableware) upon request.</div>
  1536. <h3 style=\"margin-top:7px;\"> Are pets allowed?</h3>
  1537. <div> Please contact us before booking if you wish to bring a pet. Only dogs are accepted, and prior approval is required.</div>
  1538. <h3 style=\"margin-top:7px;\">Can I cancel or modify my reservation?</h3>
  1539. <div>Yes, our cancellation policy is provided at the time of booking:
  1540. <ul>
  1541. <li>85% refund if canceled more than 1 month before arrival</li>
  1542. <li>50% refund if canceled between 1 month and 15 days before arrival</li>
  1543. <li>No refund if canceled less than 15 days before arrival</li>
  1544. </ul>
  1545. </div>
  1546. <h3 style=\"margin-top:7px;\">Is the accommodation accessible by public transport?</h3>
  1547. <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>
  1548. <h3 style=\"margin-top:7px;\">Are there shops or restaurants nearby?</h3>
  1549. <div>Yes, you’ll find supermarkets, cafés, restaurants, and tourist activities right at the foot of the building.</div>
  1550. <h3 style=\"margin-top:7px;\"> What should I do if there’s a problem during my stay?</h3>
  1551. <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.
  1552. </div>
  1553. </div>
  1554. </div>
  1555. </div>
  1556. </section>
  1557. {% endblock body %}
  1558. {% block footerjs %}
  1559. <script src=\"https://cdn.jsdelivr.net/npm/flatpickr\"></script>
  1560. <script src=\"https://cdn.jsdelivr.net/npm/flatpickr/dist/l10n/en.js\"></script>
  1561. <script>
  1562. function updateSimulation() {
  1563. var start = \$(\"#reservation_form_start\").val();
  1564. var end = \$(\"#reservation_form_end\").val();
  1565. var persons = \$(\"#reservation_form_persons\").val();
  1566. if (start && end && persons) {
  1567. \$(\"#results\").html('<div class=\"loading\">Calculating...</div>');
  1568. \$.post(
  1569. Routing.generate('simulation_pricing'),
  1570. {'start': start, 'end': end, 'persons': persons}
  1571. )
  1572. .done(function(data) {
  1573. \$(\"#results\").html(data);
  1574. })
  1575. .fail(function() {
  1576. \$(\"#results\").html('<div class=\"error\">Calculation error</div>');
  1577. });
  1578. } else {
  1579. \$(\"#results\").html('');
  1580. }
  1581. }
  1582. // Écoute les changements sur le nombre de personnes
  1583. \$(\"#reservation_form_persons\").change(updateSimulation);
  1584. \$(document).ready(function() {
  1585. // Désactive le bouton au chargement de la page
  1586. \$('button[type=\"submit\"]').prop('disabled', true);
  1587. // Écoute les changements sur la checkbox
  1588. \$('#acceptCGV').change(function() {
  1589. if(\$(this).is(':checked')) {
  1590. \$('button[type=\"submit\"]').prop('disabled', false);
  1591. } else {
  1592. \$('button[type=\"submit\"]').prop('disabled', true);
  1593. }
  1594. });
  1595. });
  1596. </script>
  1597. <script>
  1598. \$(document).ready(function() {
  1599. let bookedRanges = [];
  1600. \$.ajax({
  1601. url: '{{ env('WEBHOOK_CALENDAR_AVAILABILITY') }}',
  1602. method: 'POST',
  1603. contentType: 'application/json',
  1604. data: ''
  1605. })
  1606. .done(function(data) {
  1607. bookedRanges = data.bookings || [];
  1608. console.log('✅ Créneaux chargés:', bookedRanges);
  1609. initDatePicker();
  1610. })
  1611. .fail(function(error) {
  1612. console.error('❌ Erreur:', error);
  1613. initDatePicker();
  1614. });
  1615. // 🔧 FONCTION POUR CRÉER UNE DATE LOCALE SANS DÉCALAGE UTC
  1616. function parseLocalDate(dateStr) {
  1617. const [year, month, day] = dateStr.split('-').map(Number);
  1618. return new Date(year, month - 1, day);
  1619. }
  1620. const isMobile = window.innerWidth <= 900;
  1621. function initDatePicker() {
  1622. flatpickr(\"#date_range_picker\", {
  1623. inline: true,
  1624. mode: \"range\",
  1625. locale: \"fr\",
  1626. minDate: new Date(new Date().setDate(new Date().getDate() + 1)),
  1627. dateFormat: \"Y-m-d\",
  1628. showMonths: isMobile ? 1 : 2,
  1629. disable: [
  1630. function(date) {
  1631. const checkDate = new Date(date);
  1632. checkDate.setHours(0, 0, 0, 0);
  1633. return bookedRanges.some(range => {
  1634. const start = parseLocalDate(range.start_date);
  1635. const end = parseLocalDate(range.end_date);
  1636. return checkDate >= start && checkDate <= end;
  1637. });
  1638. }
  1639. ],
  1640. onChange: function(selectedDates, dateStr, instance) {
  1641. console.log('📅 Dates sélectionnées:', selectedDates.length);
  1642. if (selectedDates.length === 2) {
  1643. const start = selectedDates[0];
  1644. const end = selectedDates[1];
  1645. if (isRangeAvailable(start, end)) {
  1646. // ✅ Met à jour avec jQuery ET déclenche l'événement change
  1647. \$('#reservation_form_start').val(formatDate(start)).trigger('change');
  1648. \$('#reservation_form_end').val(formatDate(end)).trigger('change');
  1649. console.log('✅ Champs mis à jour:',
  1650. \$('#reservation_form_start').val(),
  1651. '→',
  1652. \$('#reservation_form_end').val()
  1653. );
  1654. updateSelectedInfo(start, end);
  1655. // ✅ Force la simulation
  1656. updateSimulation();
  1657. } else {
  1658. alert('⚠️ Cette période contient des dates déjà réservées.\\nVeuillez choisir une autre période.');
  1659. instance.clear();
  1660. clearSymfonyFields();
  1661. hideSelectedInfo();
  1662. \$(\"#results\").html('');
  1663. }
  1664. } else {
  1665. clearSymfonyFields();
  1666. hideSelectedInfo();
  1667. \$(\"#results\").html('');
  1668. }
  1669. },
  1670. onDayCreate: function(dObj, dStr, fp, dayElem) {
  1671. const date = new Date(dayElem.dateObj);
  1672. date.setHours(0, 0, 0, 0);
  1673. const isBooked = bookedRanges.some(range => {
  1674. const start = parseLocalDate(range.start_date);
  1675. const end = parseLocalDate(range.end_date);
  1676. return date >= start && date <= end;
  1677. });
  1678. if (isBooked) {
  1679. dayElem.classList.add('booked');
  1680. dayElem.title = 'Date indisponible (réservée)';
  1681. } else if (date >= new Date()) {
  1682. dayElem.classList.add('available');
  1683. dayElem.title = 'Date disponible';
  1684. }
  1685. }
  1686. });
  1687. }
  1688. function isRangeAvailable(startDate, endDate) {
  1689. let currentDate = new Date(startDate);
  1690. currentDate.setHours(0, 0, 0, 0);
  1691. const endCheck = new Date(endDate);
  1692. endCheck.setHours(0, 0, 0, 0);
  1693. while (currentDate <= endCheck) {
  1694. const isBooked = bookedRanges.some(range => {
  1695. const start = parseLocalDate(range.start_date);
  1696. const end = parseLocalDate(range.end_date);
  1697. return currentDate >= start && currentDate <= end;
  1698. });
  1699. if (isBooked) return false;
  1700. currentDate.setDate(currentDate.getDate() + 1);
  1701. }
  1702. return true;
  1703. }
  1704. function updateSelectedInfo(start, end) {
  1705. const nights = Math.ceil((end - start) / (1000 * 60 * 60 * 24));
  1706. \$('#info-start').text(start.toLocaleDateString('fr-FR'));
  1707. \$('#info-end').text(end.toLocaleDateString('fr-FR'));
  1708. \$('#info-nights').text(`\${nights} nuit\${nights > 1 ? 's' : ''}`);
  1709. \$('#selected-dates-info').addClass('active');
  1710. }
  1711. function hideSelectedInfo() {
  1712. \$('#selected-dates-info').removeClass('active');
  1713. }
  1714. function clearSymfonyFields() {
  1715. \$('#reservation_form_start').val('');
  1716. \$('#reservation_form_end').val('');
  1717. }
  1718. function formatDate(date) {
  1719. const year = date.getFullYear();
  1720. const month = String(date.getMonth() + 1).padStart(2, '0');
  1721. const day = String(date.getDate()).padStart(2, '0');
  1722. return `\${year}-\${month}-\${day}`;
  1723. }
  1724. });
  1725. </script>
  1726. {% endblock footerjs %}
  1727. {% block css %}
  1728. <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css\">
  1729. <style>
  1730. .calendar-container {
  1731. margin: 20px 0;
  1732. width: 100%;
  1733. overflow: hidden;
  1734. }
  1735. /* Calendrier inline (toujours visible) */
  1736. #date_range_picker {
  1737. display: none; /* Le champ input est caché, on affiche juste le calendrier */
  1738. }
  1739. .flatpickr-calendar.inline {
  1740. margin: 0 auto;
  1741. box-shadow: 0 4px 12px rgba(0,0,0,0.15);
  1742. border-radius: 8px;
  1743. max-width: 100%;
  1744. }
  1745. .flatpickr-day.booked {
  1746. background-color: #ff4444 !important;
  1747. color: white !important;
  1748. cursor: not-allowed !important;
  1749. position: relative;
  1750. }
  1751. .flatpickr-day.booked::after {
  1752. content: \"✕\";
  1753. position: absolute;
  1754. top: 50%;
  1755. left: 50%;
  1756. transform: translate(-50%, -50%);
  1757. font-size: 20px;
  1758. font-weight: bold;
  1759. }
  1760. .flatpickr-day.booked:hover {
  1761. background-color: #ff0000 !important;
  1762. }
  1763. .flatpickr-day.available:hover {
  1764. background-color: #28a745;
  1765. color: white;
  1766. }
  1767. /* Adaptations Mobile */
  1768. @media (max-width: 768px) {
  1769. .calendar-container {
  1770. margin: 10px 0;
  1771. padding: 0 10px;
  1772. }
  1773. .flatpickr-calendar.inline {
  1774. width: 100% !important;
  1775. max-width: 100% !important;
  1776. }
  1777. .flatpickr-months {
  1778. padding: 8px 10px;
  1779. }
  1780. .flatpickr-days {
  1781. width: 100% !important;
  1782. }
  1783. .dayContainer {
  1784. width: 100% !important;
  1785. min-width: 100% !important;
  1786. max-width: 100% !important;
  1787. }
  1788. .flatpickr-day {
  1789. height: 40px !important;
  1790. line-height: 40px !important;
  1791. flex-basis: 14.2857% !important;
  1792. max-width: 14.2857% !important;
  1793. }
  1794. }
  1795. </style>
  1796. {% endblock css %}", "vitrine/en/homepage.html.twig", "/var/www/vhosts/mirtillostudio.com/ch.mirtillostudio.com/templates/vitrine/en/homepage.html.twig");
  1797. }
  1798. }