var/cache/dev/twig/7f/7ff77c739a8255ba0f35a2e6155892cd.php line 49

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/fr/homepage.html.twig */
  16. class __TwigTemplate_f3ef98ee2c394bb2ba6d1bc2a5ca5cc7 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/fr/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/fr/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/fr/homepage.html.twig"));
  49. $this->parent = $this->load("vitrine/fr/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 "Suite Cathedrale Heritage - Location 8 pers Strasbourg Centre";
  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 "Louez notre suite de 83m² au cœur de Strasbourg. 3 chambres, 8 personnes, à 100m de la Cathédrale. Cuisine équipée, 2 salles de bain. Réservez votre séjour!";
  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/fr\" />
  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;\">Bienvenue sur la Suite Cathédrale Héritage</h1>
  143. <p class=\"lead mb-3\" style=\"color:white; font-size:22px;\">Appartement d'exception, pouvant accueillir jusqu'à 8 personnes au cœur du prestigieux centre historique de Strasbourg</p>
  144. <a class=\"btn-main btn-line bg-blur fx-slide\" href=\"#about\" style=\"color:white;\"><span>Découverte</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;\">Cathédrale à 100m</h6>
  177. </div>
  178. <div>
  179. <h6 style=\"color:white;\">Musées à 200m</h6>
  180. </div>
  181. <div>
  182. <h6 style=\"color:white;\">Petite France à 300m</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\">A propos de l'appartement</div>
  196. <h2>Suite moderne en hyper centre de la grande île de Strasbourg</h2>
  197. </div>
  198. <div class=\"col-lg-4\">
  199. <p class=\"mb-4\" style=\"color:#212121;\">
  200. Logement spacieux idéal pour familles et groupes jusqu'à 8 personnes, comprenant deux chambres doubles dont une suite parentale avec une salle de bain, une chambre avec deux lits superposés doubles (4 couchages) maximum de 100kg pour les lits en hauteur.
  201. </p>
  202. <p class=\"mb-4\" style=\"color:#212121;\">
  203. Cuisine entièrement équipée et salon-salle à manger convivial pour partager de bons moments ensemble.
  204. </p>
  205. <p class=\"mb-4\" style=\"color:#212121;\">
  206. Équipements : sèche-cheveux, lave-vaisselle, lave-linge séchant, micro-ondes, four, planche à repasser avec fer, cafetière Nespresso, bouilloire, télévision, Wi-Fi et prises USB pour recharger vos appareils.
  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>Taille</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>Chambres</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>Salon</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;\">Inclus</div>
  236. </div>
  237. </div>
  238. </div>
  239. <div class=\"col-md-2\">
  240. <div class=\"relative\">
  241. <h5>Cuisine</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;\">Inclus</div>
  245. </div>
  246. </div>
  247. </div>
  248. <div class=\"col-md-2\">
  249. <div class=\"relative\">
  250. <h5>Salle de bain</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>Personnes</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;\">Salon</h3>
  282. </div>
  283. <img src=\"/images/salon2.jpeg\" class=\"w-100\" alt=\"Salon\">
  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;\">Chambre 1</h3>
  292. </div>
  293. <img src=\"/images/chambre1.jpeg\" class=\"w-100\" alt=\"Chambre 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;\">Chambre 2</h3>
  302. </div>
  303. <img src=\"/images/chambre2.jpeg\" class=\"w-100\" alt=\"Chambre 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;\">Chambre 3</h3>
  312. </div>
  313. <img src=\"/images/chambre3.jpeg\" class=\"w-100\" alt=\"Chambre 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;\">Cuisine</h3>
  322. </div>
  323. <img src=\"/images/cuisine.jpeg\" class=\"w-100\" alt=\"Cuisine\">
  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;\">Salle de bain</h3>
  332. </div>
  333. <img src=\"/images/salledebain.jpeg\" class=\"w-100\" alt=\"Salle de bain 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;\">Salle de bain 2</h3>
  342. </div>
  343. <img src=\"/images/salledebain2.jpeg\" class=\"w-100\" alt=\"Salle de bain 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\">Votre séjour à Strasbourg</div>
  359. <h2 class=\"wow fadeInUp\" data-wow-delay=\".2s\">Tarifs et services</h2>
  360. <p style=\"color:#212121; font-size:18px;\">Une suite d'exception au cœur de Strasbourg, avec conciergerie dédiée pour vous accompagner tout au long de votre séjour.</p>
  361. <p style=\"color:#212121; font-size:18px;\">Réservation minimum deux nuits.</p>
  362. <a href=\"#reservation\" class=\"btn-main\" style=\"color:white;\">Réservation</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 289
  371. yield "
  372. <ul class=\"ul-check fs-500\">
  373. <li>à partir de 350€ la nuit </li>
  374. <li>10% de remise à partir de 7 nuits</li>
  375. </ul>
  376. </div>
  377. <div class=\"col-md-6 wow fadeInUp\" data-wow-delay=\".4s\">
  378. <h5 class=\"mb-3\">Services optionnels</h5>
  379. <ul class=\"ul-check fs-500\">
  380. <li>Une place de parking : 24 €/jour ou 150 €/semaine</li>
  381. <li>Ménage supplémentaire durant votre séjour : 60 euros</li>
  382. <li>Apéro alsacien : sur commande</li>
  383. <li>Atelier pour enfants, équipements bébé, chiens acceptés sur demande (les autres animaux ne sont malheureusement pas autorisés dans l'appartement), Décoration pour occasions spéciales,…</li>
  384. </ul>
  385. <div class=\"mt-4\">
  386. <p class=\"fs-500\"><strong>Conciergerie sur place</strong><br>
  387. <small>Mardi au samedi • 10h-18h45 <br /> Conciergerie privée sur demande selon disponibilité <br /> Sur devis (Correspond à 10% de la réservation)</small>
  388. </p>
  389. </div>
  390. </div>
  391. </div>
  392. </div>
  393. </div>
  394. </div>
  395. </section>
  396. <section id=\"section-gallery\" class=\"relative\">
  397. <div class=\"container relative z-2\" id=\"photos\">
  398. <div class=\"row g-4 gx-5 justify-content-center\">
  399. <div class=\"col-lg-6 text-center\">
  400. <h2 class=\"wow fadeInUp\" data-wow-delay=\".2s\">Galerie de l'Appartement</h2>
  401. <p class=\"wow fadeInUp\" data-wow-delay=\".3s\" style=\"color:#212121;\">Voici les images de l'appartement qui vous permettront de découvrir les différents espaces : chambres, salon, cuisine, salle de bain et extérieur.</p>
  402. </div>
  403. </div>
  404. <div class=\"row\">
  405. <div class=\"col-md-12 text-center\">
  406. <ul id=\"filters\" class=\"wow fadeInUp\" data-wow-delay=\"0s\">
  407. <li><a href=\"#\" data-filter=\"*\" class=\"selected\" style=\"color:#212121;\">Tout afficher</a></li>
  408. <li><a href=\"#\" data-filter=\".chambre\" style=\"color:#212121;\">Chambres</a></li>
  409. <li><a href=\"#\" data-filter=\".salon\" style=\"color:#212121;\">Salon</a></li>
  410. <li><a href=\"#\" data-filter=\".cuisine\" style=\"color:#212121;\">Cuisine</a></li>
  411. <li><a href=\"#\" data-filter=\".salledebain\" style=\"color:#212121;\">Salle de bain</a></li>
  412. <li><a href=\"#\" data-filter=\".exterieur\" style=\"color:#212121;\">Extérieur</a></li>
  413. </ul>
  414. </div>
  415. </div>
  416. <div id=\"gallery\" class=\"row g-3 wow fadeInUp\" data-wow-delay=\".3s\">
  417. <!-- Chambres -->
  418. <div class=\"col-md-3 col-sm-6 col-12 item chambre\">
  419. <a href=\"images/chambre1.jpeg\" class=\"image-popup d-block hover\">
  420. <div class=\"relative overflow-hidden\">
  421. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  422. Voir
  423. </div>
  424. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  425. <img src=\"images/chambre1.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Chambre\">
  426. </div>
  427. </a>
  428. </div>
  429. <div class=\"col-md-3 col-sm-6 col-12 item chambre\">
  430. <a href=\"images/chambre2.jpeg\" class=\"image-popup d-block hover\">
  431. <div class=\"relative overflow-hidden\">
  432. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  433. Voir
  434. </div>
  435. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  436. <img src=\"images/chambre2.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Chambre 2\">
  437. </div>
  438. </a>
  439. </div>
  440. <div class=\"col-md-3 col-sm-6 col-12 item chambre\">
  441. <a href=\"images/chambre3.jpeg\" class=\"image-popup d-block hover\">
  442. <div class=\"relative overflow-hidden\">
  443. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  444. Voir
  445. </div>
  446. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  447. <img src=\"images/chambre3.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Chambre 3\">
  448. </div>
  449. </a>
  450. </div>
  451. <!-- Salon -->
  452. <div class=\"col-md-3 col-sm-6 col-12 item salon\">
  453. <a href=\"images/salon.jpeg\" class=\"image-popup d-block hover\">
  454. <div class=\"relative overflow-hidden\">
  455. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  456. Voir
  457. </div>
  458. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  459. <img src=\"images/salon.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Salon\">
  460. </div>
  461. </a>
  462. </div>
  463. <div class=\"col-md-3 col-sm-6 col-12 item salon\">
  464. <a href=\"images/salon2.jpeg\" class=\"image-popup d-block hover\">
  465. <div class=\"relative overflow-hidden\">
  466. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  467. Voir
  468. </div>
  469. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  470. <img src=\"images/salon2.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Salon 2\">
  471. </div>
  472. </a>
  473. </div>
  474. <div class=\"col-md-3 col-sm-6 col-12 item salon\">
  475. <a href=\"images/salon3.jpeg\" class=\"image-popup d-block hover\">
  476. <div class=\"relative overflow-hidden\">
  477. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  478. Voir
  479. </div>
  480. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  481. <img src=\"images/salon3.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Salon 3\">
  482. </div>
  483. </a>
  484. </div>
  485. <div class=\"col-md-3 col-sm-6 col-12 item salon\">
  486. <a href=\"images/salon4.jpeg\" class=\"image-popup d-block hover\">
  487. <div class=\"relative overflow-hidden\">
  488. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  489. Voir
  490. </div>
  491. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  492. <img src=\"images/salon4.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Salon 4\">
  493. </div>
  494. </a>
  495. </div>
  496. <div class=\"col-md-3 col-sm-6 col-12 item salon\">
  497. <a href=\"images/salon5.jpeg\" class=\"image-popup d-block hover\">
  498. <div class=\"relative overflow-hidden\">
  499. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  500. Voir
  501. </div>
  502. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  503. <img src=\"images/salon5.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Salon 5\">
  504. </div>
  505. </a>
  506. </div>
  507. <!-- Cuisine -->
  508. <div class=\"col-md-3 col-sm-6 col-12 item cuisine\">
  509. <a href=\"images/cuisine.jpeg\" class=\"image-popup d-block hover\">
  510. <div class=\"relative overflow-hidden\">
  511. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  512. Voir
  513. </div>
  514. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  515. <img src=\"images/cuisine.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Cuisine\">
  516. </div>
  517. </a>
  518. </div>
  519. <!-- Salle de bain -->
  520. <div class=\"col-md-3 col-sm-6 col-12 item salledebain\">
  521. <a href=\"images/salledebain.jpeg\" class=\"image-popup d-block hover\">
  522. <div class=\"relative overflow-hidden\">
  523. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  524. Voir
  525. </div>
  526. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  527. <img src=\"images/salledebain.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Salle de bain\">
  528. </div>
  529. </a>
  530. </div>
  531. <div class=\"col-md-3 col-sm-6 col-12 item salledebain\">
  532. <a href=\"images/salledebain2.jpeg\" class=\"image-popup d-block hover\">
  533. <div class=\"relative overflow-hidden\">
  534. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  535. Voir
  536. </div>
  537. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  538. <img src=\"images/salledebain2.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Salle de bain 2\">
  539. </div>
  540. </a>
  541. </div>
  542. <!-- Extérieur -->
  543. <div class=\"col-md-3 col-sm-6 col-12 item exterieur\">
  544. <a href=\"images/exterieur.jpeg\" class=\"image-popup d-block hover\">
  545. <div class=\"relative overflow-hidden\">
  546. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  547. Voir
  548. </div>
  549. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  550. <img src=\"images/exterieur.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Extérieur\">
  551. </div>
  552. </a>
  553. </div>
  554. </div>
  555. </div>
  556. </section>
  557. ";
  558. // line 498
  559. yield " ";
  560. // line 499
  561. yield " ";
  562. // line 500
  563. yield " <section id=\"reservation\" class=\"text-light\">
  564. <div class=\"container\">
  565. <div class=\"row g-4 justify-content-center\">
  566. <div class=\"col-lg-6 text-center\">
  567. <h2 class=\"wow fadeInUp\" data-wow-delay=\".2s\">Réservez votre séjour</h2>
  568. </div>
  569. </div>
  570. <div class=\"row g-4 justify-content-center\">
  571. <div class=\"col-lg-8\">
  572. <div class=\"booking-card\">
  573. ";
  574. // line 511
  575. 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.', 511, $this->source); })()), 'form_start');
  576. yield "
  577. ";
  578. // line 514
  579. yield " <div class=\"calendar-container\" style=\"height:300px;\">
  580. <input type=\"text\" id=\"date_range_picker\">
  581. </div>
  582. ";
  583. // line 519
  584. yield " <div class=\"row g-3 mt-2 dates-recap\">
  585. <div class=\"col-4 text-center\">
  586. <div class=\"recap-label\">Arrivée</div>
  587. <div class=\"recap-value\" id=\"info-start\">-</div>
  588. </div>
  589. <div class=\"col-4 text-center\">
  590. <div class=\"recap-label\">Départ</div>
  591. <div class=\"recap-value\" id=\"info-end\">-</div>
  592. </div>
  593. <div class=\"col-4 text-center\">
  594. <div class=\"recap-label\">Nuits</div>
  595. <div class=\"recap-value\" id=\"info-nights\">-</div>
  596. </div>
  597. </div>
  598. <hr class=\"booking-divider\">
  599. ";
  600. // line 537
  601. yield " <h4 class=\"booking-title\">Indiquez le nombre d'hébergements et de personnes</h4>
  602. <div class=\"counter-row\">
  603. <div class=\"counter-label\">
  604. <div class=\"counter-title\">Chambres</div>
  605. <div class=\"counter-sub\">Selon le nombre de voyageurs</div>
  606. </div>
  607. <div class=\"counter-controls\">
  608. <button type=\"button\" class=\"counter-btn\" data-action=\"dec\" data-target=\"rooms\">−</button>
  609. <span class=\"counter-value\" id=\"cnt-rooms\">1</span>
  610. <button type=\"button\" class=\"counter-btn\" data-action=\"inc\" data-target=\"rooms\">+</button>
  611. </div>
  612. </div>
  613. <div class=\"counter-row\">
  614. <div class=\"counter-label\">
  615. <div class=\"counter-title\">Adultes</div>
  616. </div>
  617. <div class=\"counter-controls\">
  618. <button type=\"button\" class=\"counter-btn\" data-action=\"dec\" data-target=\"adults\">−</button>
  619. <span class=\"counter-value\" id=\"cnt-adults\">2</span>
  620. <button type=\"button\" class=\"counter-btn\" data-action=\"inc\" data-target=\"adults\">+</button>
  621. </div>
  622. </div>
  623. <div class=\"counter-row\">
  624. <div class=\"counter-label\">
  625. <div class=\"counter-title\">Enfants</div>
  626. <div class=\"counter-sub\">1 - 17 ans</div>
  627. </div>
  628. <div class=\"counter-controls\">
  629. <button type=\"button\" class=\"counter-btn\" data-action=\"dec\" data-target=\"children\">−</button>
  630. <span class=\"counter-value\" id=\"cnt-children\">0</span>
  631. <button type=\"button\" class=\"counter-btn\" data-action=\"inc\" data-target=\"children\">+</button>
  632. </div>
  633. </div>
  634. <div id=\"capacity-warning\" class=\"capacity-warning\" style=\"display:none;\"></div>
  635. ";
  636. // line 577
  637. yield " <div id=\"results\" class=\"mt-3\"></div>
  638. <hr class=\"booking-divider\">
  639. ";
  640. // line 582
  641. yield " <div class=\"row g-3\">
  642. <div class=\"col-md-6\">
  643. <label class=\"booking-label\">Nom</label>
  644. ";
  645. // line 585
  646. 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.', 585, $this->source); })()), "lastname", [], "any", false, false, false, 585), 'widget');
  647. yield "
  648. </div>
  649. <div class=\"col-md-6\">
  650. <label class=\"booking-label\">Prénom</label>
  651. ";
  652. // line 589
  653. 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.', 589, $this->source); })()), "name", [], "any", false, false, false, 589), 'widget');
  654. yield "
  655. </div>
  656. <div class=\"col-md-12\">
  657. <label class=\"booking-label\">Email</label>
  658. ";
  659. // line 593
  660. 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.', 593, $this->source); })()), "email", [], "any", false, false, false, 593), 'widget');
  661. yield "
  662. </div>
  663. <div class=\"col-md-12\">
  664. <label class=\"booking-label\">Message</label>
  665. ";
  666. // line 597
  667. 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.', 597, $this->source); })()), "message", [], "any", false, false, false, 597), 'widget');
  668. yield "
  669. </div>
  670. </div>
  671. ";
  672. // line 602
  673. yield " <div class=\"text-center mt-4 cgv-block\">
  674. <input type=\"checkbox\" id=\"acceptCGV\"> J'accepte les <a href=\"";
  675. // line 603
  676. yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("locale_cgv");
  677. yield "\" target=\"_blank\" style=\"color:#212121; text-decoration:underline;\">CGV</a>
  678. </div>
  679. <div class=\"text-center mt-3\">
  680. <button type=\"submit\" name=\"submit\" value=\"1\" class=\"btn-main\" style=\"color:white;\">Confirmer la réservation</button>
  681. </div>
  682. ";
  683. // line 610
  684. yield " ";
  685. 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.', 610, $this->source); })()), "start", [], "any", false, false, false, 610), 'widget');
  686. yield "
  687. ";
  688. // line 611
  689. 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.', 611, $this->source); })()), "end", [], "any", false, false, false, 611), 'widget');
  690. yield "
  691. ";
  692. // line 612
  693. 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.', 612, $this->source); })()), "rooms", [], "any", false, false, false, 612), 'widget');
  694. yield "
  695. ";
  696. // line 613
  697. 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.', 613, $this->source); })()), "adults", [], "any", false, false, false, 613), 'widget');
  698. yield "
  699. ";
  700. // line 614
  701. 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.', 614, $this->source); })()), "children", [], "any", false, false, false, 614), 'widget');
  702. yield "
  703. ";
  704. // line 615
  705. 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.', 615, $this->source); })()), "persons", [], "any", false, false, false, 615), 'widget');
  706. yield "
  707. ";
  708. // line 617
  709. 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.', 617, $this->source); })()), 'rest');
  710. yield "
  711. ";
  712. // line 618
  713. 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.', 618, $this->source); })()), 'form_end');
  714. yield "
  715. </div>
  716. </div>
  717. </div>
  718. </div>
  719. </section>
  720. <section id=\"faq\" class=\"text-light\">
  721. <div class=\"container\">
  722. <div class=\"row g-4 justify-content-center\">
  723. <div class=\"col-lg-6 text-center\">
  724. <h2 class=\"wow fadeInUp\" data-wow-delay=\".2s\">FAQ</h2>
  725. </div>
  726. </div>
  727. <div class=\"row g-4 justify-content-center\">
  728. <div class=\"col-lg-6 text-left\" style=\"color:black !important;\">
  729. <h3 style=\"margin-top:7px;\">Comment réserver le logement ?</h3>
  730. <div>Vous pouvez réserver directement sur notre site et bientôt via les plateformes partenaires. Le paiement sécurisé confirme immédiatement votre réservation.</div>
  731. <h3 style=\"margin-top:7px;\">Quels sont les horaires d'arrivée et de départ ?</h3>
  732. <ul>
  733. <li>Arrivée : à partir de 15h</li>
  734. <li>Départ : avant 11h</li>
  735. </ul>
  736. <h3 style=\"margin-top:7px;\">Le logement est-il entièrement équipé ?</h3>
  737. <div>Oui, le logement est entièrement meublé et équipé : cuisine, literie, serviettes, électroménager, Wi-Fi,…</div>
  738. <h3 style=\"margin-top:7px;\">Y a-t-il un parking disponible ?</h3>
  739. <div>Oui, un parking privatif est possible en option au prix de 24 euros les 24h ou 150 euros la semaine (7 nuits).</div>
  740. <h3 style=\"margin-top:7px;\">Le logement est-il adapté aux enfants ?</h3>
  741. <div>Oui, nous proposons certains équipements pour enfants (lit bébé, chaise haute, vaisselle adaptée) sur demande.</div>
  742. <h3 style=\"margin-top:7px;\">Les animaux sont-ils acceptés ?</h3>
  743. <div>Merci de nous contacter avant de réserver si vous souhaitez venir avec un animal, les chiens sont les seuls animaux acceptés, mais soumis à une demande préalable.</div>
  744. <h3 style=\"margin-top:7px;\">Puis-je annuler ou modifier ma réservation ?</h3>
  745. <div>Oui, nos conditions d'annulation sont précisées lors de la réservation. Remboursement de 85% du montant de la location si annulation plus d'un mois avant la date d'arrivée, puis 50 % remboursés si annulation entre 1 mois et 15 jours avant la date d'arrivée. Pas de remboursement si annulation moins de 15 jours avant la date d'arrivée.</div>
  746. <h3 style=\"margin-top:7px;\">Le logement est-il accessible en transport public ?</h3>
  747. <div>Oui, les principaux transports sont proches. La station de tram « Langstross, Grand'rue » est à moins de 100 mètres de l'appartement. La gare de Strasbourg est à 10 minutes à pieds.</div>
  748. <h3 style=\"margin-top:7px;\">Y a-t-il des commerces ou restaurants à proximité ?</h3>
  749. <div>Oui, vous trouverez supermarchés, cafés, restaurants et activités touristiques au pied de l'immeuble.</div>
  750. <h3 style=\"margin-top:7px;\">Que faire en cas de problème pendant le séjour ?</h3>
  751. <div>Nous restons disponibles 24h/24 par mail, pour toute urgence ou question concernant le logement, vous pouvez aussi nous joindre entre 9h et 20h par téléphone au 07 61 05 82 43 et nous sommes disponibles</div>
  752. </div>
  753. </div>
  754. </div>
  755. </section>
  756. ";
  757. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  758. $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  759. yield from [];
  760. }
  761. // line 679
  762. /**
  763. * @return iterable<null|scalar|\Stringable>
  764. */
  765. public function block_footerjs(array $context, array $blocks = []): iterable
  766. {
  767. $macros = $this->macros;
  768. $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  769. $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "footerjs"));
  770. $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  771. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "footerjs"));
  772. // line 680
  773. yield " <script src=\"https://cdn.jsdelivr.net/npm/flatpickr\"></script>
  774. <script src=\"https://cdn.jsdelivr.net/npm/flatpickr/dist/l10n/fr.js\"></script>
  775. ";
  776. // line 684
  777. yield " <script>
  778. window.PRICING_MATRIX = ";
  779. // line 685
  780. yield json_encode((isset($context["pricingMatrix"]) || array_key_exists("pricingMatrix", $context) ? $context["pricingMatrix"] : (function () { throw new RuntimeError('Variable "pricingMatrix" does not exist.', 685, $this->source); })()));
  781. yield ";
  782. window.SIMULATION_URL = \"";
  783. // line 686
  784. yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("locale_simulation_pricing", ["_locale" => "fr"]);
  785. yield "\";
  786. console.log('📋 Grille basse saison chargée :', window.PRICING_MATRIX);
  787. console.log('🔗 URL simulation :', window.SIMULATION_URL);
  788. </script>
  789. <script>
  790. // ===========================================================
  791. // Logique chambres / adultes / enfants
  792. //
  793. // Configuration physique :
  794. // - Chambre A : lit double → 2 personnes
  795. // - Chambre B : lit double → 2 personnes
  796. // - Chambre C : lits superposés → 4 personnes (adultes/enfants)
  797. //
  798. // Le nombre de chambres est DÉTERMINÉ automatiquement (pas de choix) :
  799. //
  800. // SANS ENFANTS :
  801. // 1-2 ad → 1 ch
  802. // 3-4 ad → 2 ch
  803. // 5-8 ad → 3 ch
  804. //
  805. // AVEC ENFANTS :
  806. // 1-2 ad → 2 ch (chambre A + chambre superposés)
  807. // 3+ ad → 3 ch (A + B + chambre superposés)
  808. //
  809. // Contraintes : adults + children ≤ 8, children ≤ 4, adults ≥ 1
  810. // ===========================================================
  811. function roomsForCombo(adults, children) {
  812. if (children > 0) {
  813. return adults <= 2 ? 2 : 3;
  814. }
  815. if (adults <= 2) return 1;
  816. if (adults <= 4) return 2;
  817. return 3;
  818. }
  819. function canAddAdult(state) {
  820. if (state.adults >= 8) return false;
  821. return (state.adults + 1 + state.children) <= 8;
  822. }
  823. function canAddChild(state) {
  824. if (state.children >= 4) return false;
  825. return (state.adults + state.children + 1) <= 8;
  826. }
  827. const state = { rooms: 1, adults: 2, children: 0 };
  828. function updateDisplay() {
  829. // Le nombre de chambres est recalculé automatiquement à chaque update
  830. state.rooms = roomsForCombo(state.adults, state.children);
  831. \$('#cnt-rooms').text(state.rooms);
  832. \$('#cnt-adults').text(state.adults);
  833. \$('#cnt-children').text(state.children);
  834. \$('#reservation_form_rooms').val(state.rooms);
  835. \$('#reservation_form_adults').val(state.adults);
  836. \$('#reservation_form_children').val(state.children);
  837. \$('#reservation_form_persons').val(state.adults + state.children);
  838. \$('.counter-btn').each(function() {
  839. const target = \$(this).data('target');
  840. const action = \$(this).data('action');
  841. let disabled = false;
  842. if (target === 'rooms') {
  843. // Chambres = toujours verrouillé (déterminé par adultes/enfants)
  844. disabled = true;
  845. }
  846. if (target === 'adults') {
  847. if (action === 'dec' && state.adults <= 1) disabled = true;
  848. if (action === 'inc' && !canAddAdult(state)) disabled = true;
  849. }
  850. if (target === 'children') {
  851. if (action === 'dec' && state.children <= 0) disabled = true;
  852. if (action === 'inc' && !canAddChild(state)) disabled = true;
  853. }
  854. \$(this).prop('disabled', disabled).toggleClass('disabled', disabled);
  855. });
  856. \$('#capacity-warning').hide();
  857. }
  858. \$(document).on('click', '.counter-btn', function() {
  859. if (\$(this).prop('disabled')) return;
  860. const target = \$(this).data('target');
  861. const action = \$(this).data('action');
  862. // Aucune action sur \"rooms\" (toujours désactivé)
  863. if (target === 'adults') {
  864. if (action === 'inc' && canAddAdult(state)) state.adults++;
  865. if (action === 'dec' && state.adults > 1) state.adults--;
  866. }
  867. if (target === 'children') {
  868. if (action === 'inc' && canAddChild(state)) state.children++;
  869. if (action === 'dec' && state.children > 0) state.children--;
  870. }
  871. updateDisplay();
  872. updateSimulation();
  873. });
  874. function updateSimulation() {
  875. const start = \$(\"#reservation_form_start\").val();
  876. const end = \$(\"#reservation_form_end\").val();
  877. const persons = state.adults + state.children;
  878. console.log('🔄 updateSimulation', { start, end, rooms: state.rooms, adults: state.adults, children: state.children });
  879. if (!start || !end || persons < 1) {
  880. \$(\"#results\").html('');
  881. return;
  882. }
  883. \$(\"#results\").html('<div class=\"loading\" style=\"color:#212121;\">Calcul en cours...</div>');
  884. \$.post(
  885. window.SIMULATION_URL,
  886. { start: start, end: end, rooms: state.rooms, adults: state.adults, children: state.children }
  887. )
  888. .done(function(data) {
  889. console.log('✅ Simulation OK');
  890. \$(\"#results\").html(data);
  891. })
  892. .fail(function(xhr) {
  893. console.error('❌ Simulation KO', xhr.status, xhr.responseText);
  894. \$(\"#results\").html('<div class=\"error\" style=\"color:#a00;\">Erreur lors du calcul du prix (' + xhr.status + ')</div>');
  895. });
  896. }
  897. \$(document).ready(function() {
  898. updateDisplay();
  899. // Bouton submit désactivé tant que CGV non cochées
  900. \$('button[type=\"submit\"]').prop('disabled', true);
  901. \$('#acceptCGV').change(function() {
  902. \$('button[type=\"submit\"]').prop('disabled', !\$(this).is(':checked'));
  903. });
  904. });
  905. </script>
  906. <script>
  907. // ===========================================================
  908. // Flatpickr calendrier
  909. // ===========================================================
  910. \$(document).ready(function() {
  911. let bookedRanges = [];
  912. \$.ajax({
  913. url: '";
  914. // line 841
  915. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['App\Twig\CoreExtension']->getEnvironmentVariable("WEBHOOK_CALENDAR_AVAILABILITY"), "html", null, true);
  916. yield "',
  917. method: 'POST',
  918. contentType: 'application/json',
  919. data: ''
  920. })
  921. .done(function(data) {
  922. bookedRanges = data.bookings || [];
  923. initDatePicker();
  924. })
  925. .fail(function() { initDatePicker(); });
  926. function parseLocalDate(dateStr) {
  927. const [year, month, day] = dateStr.split('-').map(Number);
  928. return new Date(year, month - 1, day);
  929. }
  930. const isMobile = window.innerWidth <= 900;
  931. function initDatePicker() {
  932. flatpickr(\"#date_range_picker\", {
  933. inline: true,
  934. mode: \"range\",
  935. locale: \"fr\",
  936. minDate: new Date(new Date().setDate(new Date().getDate() + 1)),
  937. dateFormat: \"Y-m-d\",
  938. showMonths: isMobile ? 1 : 2,
  939. disable: [
  940. function(date) {
  941. const checkDate = new Date(date);
  942. checkDate.setHours(0, 0, 0, 0);
  943. return bookedRanges.some(range => {
  944. const start = parseLocalDate(range.start_date);
  945. const end = parseLocalDate(range.end_date);
  946. return checkDate >= start && checkDate <= end;
  947. });
  948. }
  949. ],
  950. onChange: function(selectedDates, dateStr, instance) {
  951. if (selectedDates.length === 2) {
  952. const start = selectedDates[0];
  953. const end = selectedDates[1];
  954. if (isRangeAvailable(start, end)) {
  955. \$('#reservation_form_start').val(formatDate(start)).trigger('change');
  956. \$('#reservation_form_end').val(formatDate(end)).trigger('change');
  957. updateSelectedInfo(start, end);
  958. updateSimulation();
  959. } else {
  960. alert('⚠️ Cette période contient des dates déjà réservées.');
  961. instance.clear();
  962. clearSymfonyFields();
  963. hideSelectedInfo();
  964. \$(\"#results\").html('');
  965. }
  966. } else {
  967. clearSymfonyFields();
  968. hideSelectedInfo();
  969. \$(\"#results\").html('');
  970. }
  971. },
  972. onDayCreate: function(dObj, dStr, fp, dayElem) {
  973. const date = new Date(dayElem.dateObj);
  974. date.setHours(0, 0, 0, 0);
  975. const isBooked = bookedRanges.some(range => {
  976. const start = parseLocalDate(range.start_date);
  977. const end = parseLocalDate(range.end_date);
  978. return date >= start && date <= end;
  979. });
  980. if (isBooked) {
  981. dayElem.classList.add('booked');
  982. dayElem.title = 'Date indisponible (réservée)';
  983. } else if (date >= new Date()) {
  984. dayElem.classList.add('available');
  985. }
  986. }
  987. });
  988. }
  989. function isRangeAvailable(startDate, endDate) {
  990. let currentDate = new Date(startDate);
  991. currentDate.setHours(0, 0, 0, 0);
  992. const endCheck = new Date(endDate);
  993. endCheck.setHours(0, 0, 0, 0);
  994. while (currentDate <= endCheck) {
  995. const isBooked = bookedRanges.some(range => {
  996. const start = parseLocalDate(range.start_date);
  997. const end = parseLocalDate(range.end_date);
  998. return currentDate >= start && currentDate <= end;
  999. });
  1000. if (isBooked) return false;
  1001. currentDate.setDate(currentDate.getDate() + 1);
  1002. }
  1003. return true;
  1004. }
  1005. function updateSelectedInfo(start, end) {
  1006. const nights = Math.ceil((end - start) / (1000 * 60 * 60 * 24));
  1007. \$('#info-start').text(start.toLocaleDateString('fr-FR'));
  1008. \$('#info-end').text(end.toLocaleDateString('fr-FR'));
  1009. \$('#info-nights').text(`\${nights} nuit\${nights > 1 ? 's' : ''}`);
  1010. }
  1011. function hideSelectedInfo() {
  1012. \$('#info-start').text('-');
  1013. \$('#info-end').text('-');
  1014. \$('#info-nights').text('-');
  1015. }
  1016. function clearSymfonyFields() {
  1017. \$('#reservation_form_start').val('');
  1018. \$('#reservation_form_end').val('');
  1019. }
  1020. function formatDate(date) {
  1021. return date.getFullYear() + '-' +
  1022. String(date.getMonth() + 1).padStart(2, '0') + '-' +
  1023. String(date.getDate()).padStart(2, '0');
  1024. }
  1025. });
  1026. </script>
  1027. ";
  1028. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  1029. $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  1030. yield from [];
  1031. }
  1032. // line 966
  1033. /**
  1034. * @return iterable<null|scalar|\Stringable>
  1035. */
  1036. public function block_css(array $context, array $blocks = []): iterable
  1037. {
  1038. $macros = $this->macros;
  1039. $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  1040. $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "css"));
  1041. $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  1042. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "css"));
  1043. // line 967
  1044. yield " <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css\">
  1045. <style>
  1046. /* ===========================================================
  1047. Booking card (border blanc, fond transparent, texte noir)
  1048. =========================================================== */
  1049. .booking-card {
  1050. background: transparent;
  1051. border: 2px solid white;
  1052. border-radius: 12px;
  1053. padding: 32px;
  1054. color: #212121;
  1055. }
  1056. .booking-title {
  1057. color: #212121;
  1058. font-weight: 700;
  1059. margin-bottom: 24px;
  1060. }
  1061. .booking-divider {
  1062. border-top: 1px solid rgba(0,0,0,0.15);
  1063. margin: 28px 0;
  1064. }
  1065. .booking-label {
  1066. color: #212121;
  1067. font-weight: 500;
  1068. margin-bottom: 6px;
  1069. display: block;
  1070. }
  1071. .booking-card input.form-control,
  1072. .booking-card textarea.form-control {
  1073. background: rgba(255,255,255,0.85) !important;
  1074. border: 1px solid rgba(0,0,0,0.2) !important;
  1075. color: #212121 !important;
  1076. }
  1077. .booking-card input.form-control::placeholder,
  1078. .booking-card textarea.form-control::placeholder {
  1079. color: rgba(0,0,0,0.4) !important;
  1080. }
  1081. .booking-card input.form-control:focus,
  1082. .booking-card textarea.form-control:focus {
  1083. border-color: #212121 !important;
  1084. box-shadow: 0 0 0 0.2rem rgba(0,0,0,0.08) !important;
  1085. }
  1086. .cgv-block { color: #212121; }
  1087. .cgv-block a { color: #212121; text-decoration: underline; }
  1088. /* ----- Dates récap ----- */
  1089. .dates-recap { color: #212121; }
  1090. .recap-label {
  1091. font-size: 13px;
  1092. text-transform: uppercase;
  1093. letter-spacing: 0.5px;
  1094. opacity: 0.7;
  1095. }
  1096. .recap-value {
  1097. font-size: 18px;
  1098. font-weight: 600;
  1099. margin-top: 4px;
  1100. }
  1101. /* ----- Widget compteurs ----- */
  1102. .counter-row {
  1103. display: flex;
  1104. justify-content: space-between;
  1105. align-items: center;
  1106. padding: 14px 0;
  1107. border-bottom: 1px solid rgba(0,0,0,0.1);
  1108. }
  1109. .counter-row:last-of-type { border-bottom: none; }
  1110. .counter-title {
  1111. font-size: 16px;
  1112. font-weight: 500;
  1113. color: #212121;
  1114. }
  1115. .counter-sub {
  1116. font-size: 12px;
  1117. color: rgba(0,0,0,0.6);
  1118. margin-top: 2px;
  1119. }
  1120. .counter-controls {
  1121. display: flex;
  1122. align-items: center;
  1123. gap: 12px;
  1124. }
  1125. .counter-btn {
  1126. width: 40px;
  1127. height: 40px;
  1128. border-radius: 8px;
  1129. border: 1.5px solid #212121;
  1130. background: transparent;
  1131. color: #212121;
  1132. font-size: 20px;
  1133. font-weight: 600;
  1134. line-height: 1;
  1135. cursor: pointer;
  1136. transition: all 0.15s;
  1137. }
  1138. .counter-btn:hover:not(.disabled) {
  1139. background: rgba(0,0,0,0.06);
  1140. }
  1141. .counter-btn.disabled,
  1142. .counter-btn:disabled {
  1143. border-color: rgba(0,0,0,0.2);
  1144. color: rgba(0,0,0,0.25);
  1145. cursor: not-allowed;
  1146. background: transparent;
  1147. }
  1148. .counter-value {
  1149. min-width: 28px;
  1150. text-align: center;
  1151. font-size: 16px;
  1152. font-weight: 500;
  1153. color: #212121;
  1154. }
  1155. .capacity-warning {
  1156. margin-top: 12px;
  1157. padding: 10px 14px;
  1158. background: rgba(255,180,0,0.18);
  1159. border: 1px solid rgba(180,120,0,0.5);
  1160. border-radius: 6px;
  1161. color: #8a4500;
  1162. font-size: 14px;
  1163. }
  1164. /* ===========================================================
  1165. Calendrier
  1166. =========================================================== */
  1167. .calendar-container {
  1168. margin: 0 0 8px 0;
  1169. width: 100%;
  1170. display: flex;
  1171. justify-content: center;
  1172. }
  1173. #date_range_picker { display: none; }
  1174. .flatpickr-calendar.inline {
  1175. box-shadow: 0 4px 12px rgba(0,0,0,0.15);
  1176. border-radius: 8px;
  1177. }
  1178. .flatpickr-day.booked {
  1179. background-color: #ff4444 !important;
  1180. color: white !important;
  1181. cursor: not-allowed !important;
  1182. position: relative;
  1183. }
  1184. .flatpickr-day.booked::after {
  1185. content: \"✕\";
  1186. position: absolute;
  1187. top: 50%; left: 50%;
  1188. transform: translate(-50%, -50%);
  1189. font-size: 20px;
  1190. font-weight: bold;
  1191. }
  1192. .flatpickr-day.booked:hover { background-color: #ff0000 !important; }
  1193. .flatpickr-day.available:hover { background-color: #28a745; color: white; }
  1194. @media (max-width: 768px) {
  1195. .booking-card { padding: 20px; }
  1196. .calendar-container { margin: 0 0 8px 0; padding: 0; }
  1197. .flatpickr-calendar.inline { width: 100% !important; max-width: 100% !important; }
  1198. .flatpickr-months { padding: 8px 10px; }
  1199. .flatpickr-days { width: 100% !important; }
  1200. .dayContainer {
  1201. width: 100% !important;
  1202. min-width: 100% !important;
  1203. max-width: 100% !important;
  1204. }
  1205. .flatpickr-day {
  1206. height: 40px !important;
  1207. line-height: 40px !important;
  1208. flex-basis: 14.2857% !important;
  1209. max-width: 14.2857% !important;
  1210. }
  1211. }
  1212. </style>
  1213. ";
  1214. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  1215. $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  1216. yield from [];
  1217. }
  1218. /**
  1219. * @codeCoverageIgnore
  1220. */
  1221. public function getTemplateName(): string
  1222. {
  1223. return "vitrine/fr/homepage.html.twig";
  1224. }
  1225. /**
  1226. * @codeCoverageIgnore
  1227. */
  1228. public function isTraitable(): bool
  1229. {
  1230. return false;
  1231. }
  1232. /**
  1233. * @codeCoverageIgnore
  1234. */
  1235. public function getDebugInfo(): array
  1236. {
  1237. return array ( 1226 => 967, 1213 => 966, 1078 => 841, 920 => 686, 916 => 685, 913 => 684, 908 => 680, 895 => 679, 824 => 618, 820 => 617, 815 => 615, 811 => 614, 807 => 613, 803 => 612, 799 => 611, 794 => 610, 785 => 603, 782 => 602, 775 => 597, 768 => 593, 761 => 589, 754 => 585, 749 => 582, 743 => 577, 702 => 537, 683 => 519, 677 => 514, 672 => 511, 659 => 500, 657 => 499, 655 => 498, 445 => 289, 179 => 15, 166 => 14, 151 => 8, 138 => 7, 115 => 5, 92 => 4, 69 => 3, 46 => 1,);
  1238. }
  1239. public function getSourceContext(): Source
  1240. {
  1241. return new Source("{% extends 'vitrine/fr/layout.html.twig' %}
  1242. {% block title %}Suite Cathedrale Heritage - Location 8 pers Strasbourg Centre{% endblock title %}
  1243. {% block description %}Louez notre suite de 83m² au cœur de Strasbourg. 3 chambres, 8 personnes, à 100m de la Cathédrale. Cuisine équipée, 2 salles de bain. Réservez votre séjour!{% endblock description %}
  1244. {% block robots %}index,follow{% endblock robots %}
  1245. {% block canonical %}
  1246. <link rel=\"canonical\" href=\"https://cathedraleheritage.com/fr\" />
  1247. <link rel=\"alternate\" hreflang=\"fr\" href=\"https://cathedraleheritage.com/fr\" />
  1248. <link rel=\"alternate\" hreflang=\"en\" href=\"https://cathedraleheritage.com\" />
  1249. <link rel=\"alternate\" hreflang=\"x-default\" href=\"https://cathedraleheritage.com\" />
  1250. {% endblock canonical %}
  1251. {% block body %}
  1252. <section id=\"hero\" class=\"text-light no-top no-bottom relative overflow-hidden z-1000\">
  1253. <div class=\"abs w-100 abs-centered z-2\">
  1254. <div class=\"container\">
  1255. <div class=\"spacer-double\"></div>
  1256. <div class=\"row g-4 align-items-center justify-content-center\">
  1257. <div class=\"col-md-8 text-center\">
  1258. <h1 class=\"mb-2\" style=\"color:white;\">Bienvenue sur la Suite Cathédrale Héritage</h1>
  1259. <p class=\"lead mb-3\" style=\"color:white; font-size:22px;\">Appartement d'exception, pouvant accueillir jusqu'à 8 personnes au cœur du prestigieux centre historique de Strasbourg</p>
  1260. <a class=\"btn-main btn-line bg-blur fx-slide\" href=\"#about\" style=\"color:white;\"><span>Découverte</span></a>
  1261. </div>
  1262. </div>
  1263. </div>
  1264. </div>
  1265. <div class=\"vertical-center\">
  1266. <div class=\"swiper\">
  1267. <div class=\"swiper-wrapper\">
  1268. <div class=\"swiper-slide\">
  1269. <div class=\"swiper-inner\" data-bgimage=\"url(/images/salon2.jpeg)\">
  1270. <div class=\"sw-overlay op-5\"></div>
  1271. </div>
  1272. </div>
  1273. <div class=\"swiper-slide\">
  1274. <div class=\"swiper-inner\" data-bgimage=\"url(/images/chambre2.jpeg)\">
  1275. <div class=\"sw-overlay op-5\"></div>
  1276. </div>
  1277. </div>
  1278. <div class=\"swiper-slide\">
  1279. <div class=\"swiper-inner\" data-bgimage=\"url(/images/noel.jpeg)\">
  1280. <div class=\"sw-overlay op-5\"></div>
  1281. </div>
  1282. </div>
  1283. </div>
  1284. </div>
  1285. </div>
  1286. <div class=\"abs w-100 bottom-0 z-2 pb-4 sm-hide\">
  1287. <div class=\"container\">
  1288. <div class=\"row\">
  1289. <div class=\"col-lg-12\">
  1290. <div class=\"d-flex justify-content-between\">
  1291. <div>
  1292. <h6 style=\"color:white;\">Cathédrale à 100m</h6>
  1293. </div>
  1294. <div>
  1295. <h6 style=\"color:white;\">Musées à 200m</h6>
  1296. </div>
  1297. <div>
  1298. <h6 style=\"color:white;\">Petite France à 300m</h6>
  1299. </div>
  1300. </div>
  1301. </div>
  1302. </div>
  1303. </div>
  1304. </div>
  1305. <div class=\"gradient-edge-bottom op-8\"></div>
  1306. </section>
  1307. <section id=\"about\">
  1308. <div class=\"container\">
  1309. <div class=\"row g-4 align-items-end justify-content-between\">
  1310. <div class=\"col-lg-5\">
  1311. <div class=\"subtitle\">A propos de l'appartement</div>
  1312. <h2>Suite moderne en hyper centre de la grande île de Strasbourg</h2>
  1313. </div>
  1314. <div class=\"col-lg-4\">
  1315. <p class=\"mb-4\" style=\"color:#212121;\">
  1316. Logement spacieux idéal pour familles et groupes jusqu'à 8 personnes, comprenant deux chambres doubles dont une suite parentale avec une salle de bain, une chambre avec deux lits superposés doubles (4 couchages) maximum de 100kg pour les lits en hauteur.
  1317. </p>
  1318. <p class=\"mb-4\" style=\"color:#212121;\">
  1319. Cuisine entièrement équipée et salon-salle à manger convivial pour partager de bons moments ensemble.
  1320. </p>
  1321. <p class=\"mb-4\" style=\"color:#212121;\">
  1322. Équipements : sèche-cheveux, lave-vaisselle, lave-linge séchant, micro-ondes, four, planche à repasser avec fer, cafetière Nespresso, bouilloire, télévision, Wi-Fi et prises USB pour recharger vos appareils.
  1323. </p>
  1324. </div>
  1325. </div>
  1326. <div class=\"spacer-single\"></div>
  1327. <div class=\"row g-4\">
  1328. <div class=\"col-md-2\">
  1329. <div class=\"relative\">
  1330. <h5>Taille</h5>
  1331. <div class=\"d-flex justify-content-start align-items-center\" style=\"padding-top:6px;\">
  1332. <img src=\"/images/home.png\" width=\"37\" class=\"me-3\" alt=\"\">
  1333. <div class=\"fs-20 fw-600\" style=\"color:#212121;\">83 m²</div>
  1334. </div>
  1335. </div>
  1336. </div>
  1337. <div class=\"col-md-2\">
  1338. <div class=\"relative\">
  1339. <h5>Chambres</h5>
  1340. <div class=\"d-flex justify-content-start align-items-center\" style=\"padding-top:4px;\">
  1341. <img src=\"/images/bed.png\" width=\"37\" class=\"me-3\" alt=\"\">
  1342. <div class=\"fs-20 fw-600\" style=\"color:#212121;\">3</div>
  1343. </div>
  1344. </div>
  1345. </div>
  1346. <div class=\"col-md-2\">
  1347. <div class=\"relative\">
  1348. <h5>Salon</h5>
  1349. <div class=\"d-flex justify-content-start align-items-center\">
  1350. <img src=\"/images/sofa.png\" width=\"50\" class=\"me-3\" alt=\"\">
  1351. <div class=\"fs-20 fw-600\" style=\"color:#212121;\">Inclus</div>
  1352. </div>
  1353. </div>
  1354. </div>
  1355. <div class=\"col-md-2\">
  1356. <div class=\"relative\">
  1357. <h5>Cuisine</h5>
  1358. <div class=\"d-flex justify-content-start align-items-center\" style=\"padding-top:6px;\">
  1359. <img src=\"/images/cooking.png\" width=\"37\" class=\"me-3\" alt=\"\">
  1360. <div class=\"fs-20 fw-600\" style=\"color:#212121;\">Inclus</div>
  1361. </div>
  1362. </div>
  1363. </div>
  1364. <div class=\"col-md-2\">
  1365. <div class=\"relative\">
  1366. <h5>Salle de bain</h5>
  1367. <div class=\"d-flex justify-content-start align-items-center\" style=\"padding-top:4px;\">
  1368. <img src=\"/images/bathroom.png\" width=\"40\" class=\"me-3\" alt=\"\">
  1369. <div class=\"fs-20 fw-600\" style=\"color:#212121;\">2</div>
  1370. </div>
  1371. </div>
  1372. </div>
  1373. <div class=\"col-md-2\">
  1374. <div class=\"relative\">
  1375. <h5>Personnes</h5>
  1376. <div class=\"d-flex justify-content-start align-items-center\" style=\"padding-top:5px;\">
  1377. <img src=\"/images/user.png\" width=\"37\" class=\"me-3\" alt=\"\">
  1378. <div class=\"fs-20 fw-600\" style=\"color:#212121;\">8</div>
  1379. </div>
  1380. </div>
  1381. </div>
  1382. </div>
  1383. </div>
  1384. </section>
  1385. <section id=\"rooms\" class=\"p-0 overflow-hidden\">
  1386. <div class=\"container-fluid\">
  1387. <div class=\"row\">
  1388. <div class=\"col-lg-12\">
  1389. <div class=\"owl-custom-nav menu-float\" data-target=\"#room-carousel\">
  1390. <a class=\"btn-next\"></a>
  1391. <a class=\"btn-prev\"></a>
  1392. <div id=\"room-carousel\" class=\"owl-2-cols-center owl-carousel owl-theme\">
  1393. <div class=\"item\">
  1394. <div class=\"relative\">
  1395. <div class=\"overflow-hidden text-light\">
  1396. <div class=\"abs h-100 start-0 z-2 p-4\">
  1397. <h3 style=\"color:white;\">Salon</h3>
  1398. </div>
  1399. <img src=\"/images/salon2.jpeg\" class=\"w-100\" alt=\"Salon\">
  1400. </div>
  1401. </div>
  1402. </div>
  1403. <div class=\"item\">
  1404. <div class=\"relative\">
  1405. <div class=\"overflow-hidden text-light\">
  1406. <div class=\"abs h-100 start-1 z-2 p-4\">
  1407. <h3 style=\"color:white;\">Chambre 1</h3>
  1408. </div>
  1409. <img src=\"/images/chambre1.jpeg\" class=\"w-100\" alt=\"Chambre 1\">
  1410. </div>
  1411. </div>
  1412. </div>
  1413. <div class=\"item\">
  1414. <div class=\"relative\">
  1415. <div class=\"overflow-hidden text-light\">
  1416. <div class=\"abs h-100 start-2 z-2 p-4\">
  1417. <h3 style=\"color:white;\">Chambre 2</h3>
  1418. </div>
  1419. <img src=\"/images/chambre2.jpeg\" class=\"w-100\" alt=\"Chambre 2\">
  1420. </div>
  1421. </div>
  1422. </div>
  1423. <div class=\"item\">
  1424. <div class=\"relative\">
  1425. <div class=\"overflow-hidden text-light\">
  1426. <div class=\"abs h-100 start-3 z-2 p-4\">
  1427. <h3 style=\"color:white;\">Chambre 3</h3>
  1428. </div>
  1429. <img src=\"/images/chambre3.jpeg\" class=\"w-100\" alt=\"Chambre 3\">
  1430. </div>
  1431. </div>
  1432. </div>
  1433. <div class=\"item\">
  1434. <div class=\"relative\">
  1435. <div class=\"overflow-hidden text-light\">
  1436. <div class=\"abs h-100 start-4 z-2 p-4\">
  1437. <h3 style=\"color:white;\">Cuisine</h3>
  1438. </div>
  1439. <img src=\"/images/cuisine.jpeg\" class=\"w-100\" alt=\"Cuisine\">
  1440. </div>
  1441. </div>
  1442. </div>
  1443. <div class=\"item\">
  1444. <div class=\"relative\">
  1445. <div class=\"overflow-hidden text-light\">
  1446. <div class=\"abs h-100 start-5 z-2 p-4\">
  1447. <h3 style=\"color:white;\">Salle de bain</h3>
  1448. </div>
  1449. <img src=\"/images/salledebain.jpeg\" class=\"w-100\" alt=\"Salle de bain 1\">
  1450. </div>
  1451. </div>
  1452. </div>
  1453. <div class=\"item\">
  1454. <div class=\"relative\">
  1455. <div class=\"overflow-hidden text-light\">
  1456. <div class=\"abs h-100 start-6 z-2 p-4\">
  1457. <h3 style=\"color:white;\">Salle de bain 2</h3>
  1458. </div>
  1459. <img src=\"/images/salledebain2.jpeg\" class=\"w-100\" alt=\"Salle de bain 2\">
  1460. </div>
  1461. </div>
  1462. </div>
  1463. </div>
  1464. </div>
  1465. </div>
  1466. </div>
  1467. </div>
  1468. </section>
  1469. <section id=\"services\" class=\"overlay-dark-1\">
  1470. <div class=\"container\">
  1471. <div class=\"row g-4 justify-content-between\">
  1472. <div class=\"col-lg-5 relative z-3\">
  1473. <div class=\"me-lg-3\">
  1474. <div class=\"subtitle wow fadeInUp\" data-wow-delay=\".0s\">Votre séjour à Strasbourg</div>
  1475. <h2 class=\"wow fadeInUp\" data-wow-delay=\".2s\">Tarifs et services</h2>
  1476. <p style=\"color:#212121; font-size:18px;\">Une suite d'exception au cœur de Strasbourg, avec conciergerie dédiée pour vous accompagner tout au long de votre séjour.</p>
  1477. <p style=\"color:#212121; font-size:18px;\">Réservation minimum deux nuits.</p>
  1478. <a href=\"#reservation\" class=\"btn-main\" style=\"color:white;\">Réservation</a>
  1479. </div>
  1480. </div>
  1481. <div class=\"col-lg-6\" style=\"color:black;\">
  1482. <div class=\"spacer-single spacer-double\"></div>
  1483. <div class=\"row\">
  1484. <div class=\"col-md-6 wow fadeInUp\" data-wow-delay=\".2s\">
  1485. {#
  1486. <h5 class=\" mb-3\">Haute saison</h5>
  1487. <p class=\"fs-500\"><small>Du 1er juin au 30 septembre • 25 novembre au 05 janvier</small></p>
  1488. <ul class=\"ul-check fs-500\">
  1489. <li>960 € la nuit</li>
  1490. <li>10% de remise à partir de 7 nuits</li>
  1491. </ul>
  1492. <h5 class=\"mb-3 mt-4\">Hors Saison</h5>
  1493. #}
  1494. <ul class=\"ul-check fs-500\">
  1495. <li>à partir de 350€ la nuit </li>
  1496. <li>10% de remise à partir de 7 nuits</li>
  1497. </ul>
  1498. </div>
  1499. <div class=\"col-md-6 wow fadeInUp\" data-wow-delay=\".4s\">
  1500. <h5 class=\"mb-3\">Services optionnels</h5>
  1501. <ul class=\"ul-check fs-500\">
  1502. <li>Une place de parking : 24 €/jour ou 150 €/semaine</li>
  1503. <li>Ménage supplémentaire durant votre séjour : 60 euros</li>
  1504. <li>Apéro alsacien : sur commande</li>
  1505. <li>Atelier pour enfants, équipements bébé, chiens acceptés sur demande (les autres animaux ne sont malheureusement pas autorisés dans l'appartement), Décoration pour occasions spéciales,…</li>
  1506. </ul>
  1507. <div class=\"mt-4\">
  1508. <p class=\"fs-500\"><strong>Conciergerie sur place</strong><br>
  1509. <small>Mardi au samedi • 10h-18h45 <br /> Conciergerie privée sur demande selon disponibilité <br /> Sur devis (Correspond à 10% de la réservation)</small>
  1510. </p>
  1511. </div>
  1512. </div>
  1513. </div>
  1514. </div>
  1515. </div>
  1516. </div>
  1517. </section>
  1518. <section id=\"section-gallery\" class=\"relative\">
  1519. <div class=\"container relative z-2\" id=\"photos\">
  1520. <div class=\"row g-4 gx-5 justify-content-center\">
  1521. <div class=\"col-lg-6 text-center\">
  1522. <h2 class=\"wow fadeInUp\" data-wow-delay=\".2s\">Galerie de l'Appartement</h2>
  1523. <p class=\"wow fadeInUp\" data-wow-delay=\".3s\" style=\"color:#212121;\">Voici les images de l'appartement qui vous permettront de découvrir les différents espaces : chambres, salon, cuisine, salle de bain et extérieur.</p>
  1524. </div>
  1525. </div>
  1526. <div class=\"row\">
  1527. <div class=\"col-md-12 text-center\">
  1528. <ul id=\"filters\" class=\"wow fadeInUp\" data-wow-delay=\"0s\">
  1529. <li><a href=\"#\" data-filter=\"*\" class=\"selected\" style=\"color:#212121;\">Tout afficher</a></li>
  1530. <li><a href=\"#\" data-filter=\".chambre\" style=\"color:#212121;\">Chambres</a></li>
  1531. <li><a href=\"#\" data-filter=\".salon\" style=\"color:#212121;\">Salon</a></li>
  1532. <li><a href=\"#\" data-filter=\".cuisine\" style=\"color:#212121;\">Cuisine</a></li>
  1533. <li><a href=\"#\" data-filter=\".salledebain\" style=\"color:#212121;\">Salle de bain</a></li>
  1534. <li><a href=\"#\" data-filter=\".exterieur\" style=\"color:#212121;\">Extérieur</a></li>
  1535. </ul>
  1536. </div>
  1537. </div>
  1538. <div id=\"gallery\" class=\"row g-3 wow fadeInUp\" data-wow-delay=\".3s\">
  1539. <!-- Chambres -->
  1540. <div class=\"col-md-3 col-sm-6 col-12 item chambre\">
  1541. <a href=\"images/chambre1.jpeg\" class=\"image-popup d-block hover\">
  1542. <div class=\"relative overflow-hidden\">
  1543. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  1544. Voir
  1545. </div>
  1546. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  1547. <img src=\"images/chambre1.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Chambre\">
  1548. </div>
  1549. </a>
  1550. </div>
  1551. <div class=\"col-md-3 col-sm-6 col-12 item chambre\">
  1552. <a href=\"images/chambre2.jpeg\" class=\"image-popup d-block hover\">
  1553. <div class=\"relative overflow-hidden\">
  1554. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  1555. Voir
  1556. </div>
  1557. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  1558. <img src=\"images/chambre2.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Chambre 2\">
  1559. </div>
  1560. </a>
  1561. </div>
  1562. <div class=\"col-md-3 col-sm-6 col-12 item chambre\">
  1563. <a href=\"images/chambre3.jpeg\" class=\"image-popup d-block hover\">
  1564. <div class=\"relative overflow-hidden\">
  1565. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  1566. Voir
  1567. </div>
  1568. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  1569. <img src=\"images/chambre3.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Chambre 3\">
  1570. </div>
  1571. </a>
  1572. </div>
  1573. <!-- Salon -->
  1574. <div class=\"col-md-3 col-sm-6 col-12 item salon\">
  1575. <a href=\"images/salon.jpeg\" class=\"image-popup d-block hover\">
  1576. <div class=\"relative overflow-hidden\">
  1577. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  1578. Voir
  1579. </div>
  1580. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  1581. <img src=\"images/salon.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Salon\">
  1582. </div>
  1583. </a>
  1584. </div>
  1585. <div class=\"col-md-3 col-sm-6 col-12 item salon\">
  1586. <a href=\"images/salon2.jpeg\" class=\"image-popup d-block hover\">
  1587. <div class=\"relative overflow-hidden\">
  1588. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  1589. Voir
  1590. </div>
  1591. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  1592. <img src=\"images/salon2.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Salon 2\">
  1593. </div>
  1594. </a>
  1595. </div>
  1596. <div class=\"col-md-3 col-sm-6 col-12 item salon\">
  1597. <a href=\"images/salon3.jpeg\" class=\"image-popup d-block hover\">
  1598. <div class=\"relative overflow-hidden\">
  1599. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  1600. Voir
  1601. </div>
  1602. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  1603. <img src=\"images/salon3.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Salon 3\">
  1604. </div>
  1605. </a>
  1606. </div>
  1607. <div class=\"col-md-3 col-sm-6 col-12 item salon\">
  1608. <a href=\"images/salon4.jpeg\" class=\"image-popup d-block hover\">
  1609. <div class=\"relative overflow-hidden\">
  1610. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  1611. Voir
  1612. </div>
  1613. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  1614. <img src=\"images/salon4.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Salon 4\">
  1615. </div>
  1616. </a>
  1617. </div>
  1618. <div class=\"col-md-3 col-sm-6 col-12 item salon\">
  1619. <a href=\"images/salon5.jpeg\" class=\"image-popup d-block hover\">
  1620. <div class=\"relative overflow-hidden\">
  1621. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  1622. Voir
  1623. </div>
  1624. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  1625. <img src=\"images/salon5.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Salon 5\">
  1626. </div>
  1627. </a>
  1628. </div>
  1629. <!-- Cuisine -->
  1630. <div class=\"col-md-3 col-sm-6 col-12 item cuisine\">
  1631. <a href=\"images/cuisine.jpeg\" class=\"image-popup d-block hover\">
  1632. <div class=\"relative overflow-hidden\">
  1633. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  1634. Voir
  1635. </div>
  1636. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  1637. <img src=\"images/cuisine.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Cuisine\">
  1638. </div>
  1639. </a>
  1640. </div>
  1641. <!-- Salle de bain -->
  1642. <div class=\"col-md-3 col-sm-6 col-12 item salledebain\">
  1643. <a href=\"images/salledebain.jpeg\" class=\"image-popup d-block hover\">
  1644. <div class=\"relative overflow-hidden\">
  1645. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  1646. Voir
  1647. </div>
  1648. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  1649. <img src=\"images/salledebain.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Salle de bain\">
  1650. </div>
  1651. </a>
  1652. </div>
  1653. <div class=\"col-md-3 col-sm-6 col-12 item salledebain\">
  1654. <a href=\"images/salledebain2.jpeg\" class=\"image-popup d-block hover\">
  1655. <div class=\"relative overflow-hidden\">
  1656. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  1657. Voir
  1658. </div>
  1659. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  1660. <img src=\"images/salledebain2.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Salle de bain 2\">
  1661. </div>
  1662. </a>
  1663. </div>
  1664. <!-- Extérieur -->
  1665. <div class=\"col-md-3 col-sm-6 col-12 item exterieur\">
  1666. <a href=\"images/exterieur.jpeg\" class=\"image-popup d-block hover\">
  1667. <div class=\"relative overflow-hidden\">
  1668. <div class=\"absolute start-0 w-100 hover-op-1 p-5 abs-middle z-2 text-center text-white z-3\">
  1669. Voir
  1670. </div>
  1671. <div class=\"absolute start-0 w-100 h-100 overlay-dark-7 hover-op-1 z-2\"></div>
  1672. <img src=\"images/exterieur.jpeg\" class=\"w-100 hover-scale-1-2\" alt=\"Extérieur\">
  1673. </div>
  1674. </a>
  1675. </div>
  1676. </div>
  1677. </div>
  1678. </section>
  1679. {# =================================================== #}
  1680. {# ============ SECTION RÉSERVATION (refondue) ======= #}
  1681. {# =================================================== #}
  1682. <section id=\"reservation\" class=\"text-light\">
  1683. <div class=\"container\">
  1684. <div class=\"row g-4 justify-content-center\">
  1685. <div class=\"col-lg-6 text-center\">
  1686. <h2 class=\"wow fadeInUp\" data-wow-delay=\".2s\">Réservez votre séjour</h2>
  1687. </div>
  1688. </div>
  1689. <div class=\"row g-4 justify-content-center\">
  1690. <div class=\"col-lg-8\">
  1691. <div class=\"booking-card\">
  1692. {{ form_start(form) }}
  1693. {# ----- CALENDRIER ----- #}
  1694. <div class=\"calendar-container\" style=\"height:300px;\">
  1695. <input type=\"text\" id=\"date_range_picker\">
  1696. </div>
  1697. {# ----- DATES RÉCAP (juste sous le calendrier) ----- #}
  1698. <div class=\"row g-3 mt-2 dates-recap\">
  1699. <div class=\"col-4 text-center\">
  1700. <div class=\"recap-label\">Arrivée</div>
  1701. <div class=\"recap-value\" id=\"info-start\">-</div>
  1702. </div>
  1703. <div class=\"col-4 text-center\">
  1704. <div class=\"recap-label\">Départ</div>
  1705. <div class=\"recap-value\" id=\"info-end\">-</div>
  1706. </div>
  1707. <div class=\"col-4 text-center\">
  1708. <div class=\"recap-label\">Nuits</div>
  1709. <div class=\"recap-value\" id=\"info-nights\">-</div>
  1710. </div>
  1711. </div>
  1712. <hr class=\"booking-divider\">
  1713. {# ----- WIDGET COMPTEURS ----- #}
  1714. <h4 class=\"booking-title\">Indiquez le nombre d'hébergements et de personnes</h4>
  1715. <div class=\"counter-row\">
  1716. <div class=\"counter-label\">
  1717. <div class=\"counter-title\">Chambres</div>
  1718. <div class=\"counter-sub\">Selon le nombre de voyageurs</div>
  1719. </div>
  1720. <div class=\"counter-controls\">
  1721. <button type=\"button\" class=\"counter-btn\" data-action=\"dec\" data-target=\"rooms\">−</button>
  1722. <span class=\"counter-value\" id=\"cnt-rooms\">1</span>
  1723. <button type=\"button\" class=\"counter-btn\" data-action=\"inc\" data-target=\"rooms\">+</button>
  1724. </div>
  1725. </div>
  1726. <div class=\"counter-row\">
  1727. <div class=\"counter-label\">
  1728. <div class=\"counter-title\">Adultes</div>
  1729. </div>
  1730. <div class=\"counter-controls\">
  1731. <button type=\"button\" class=\"counter-btn\" data-action=\"dec\" data-target=\"adults\">−</button>
  1732. <span class=\"counter-value\" id=\"cnt-adults\">2</span>
  1733. <button type=\"button\" class=\"counter-btn\" data-action=\"inc\" data-target=\"adults\">+</button>
  1734. </div>
  1735. </div>
  1736. <div class=\"counter-row\">
  1737. <div class=\"counter-label\">
  1738. <div class=\"counter-title\">Enfants</div>
  1739. <div class=\"counter-sub\">1 - 17 ans</div>
  1740. </div>
  1741. <div class=\"counter-controls\">
  1742. <button type=\"button\" class=\"counter-btn\" data-action=\"dec\" data-target=\"children\">−</button>
  1743. <span class=\"counter-value\" id=\"cnt-children\">0</span>
  1744. <button type=\"button\" class=\"counter-btn\" data-action=\"inc\" data-target=\"children\">+</button>
  1745. </div>
  1746. </div>
  1747. <div id=\"capacity-warning\" class=\"capacity-warning\" style=\"display:none;\"></div>
  1748. {# ----- RÉSULTAT PRIX ----- #}
  1749. <div id=\"results\" class=\"mt-3\"></div>
  1750. <hr class=\"booking-divider\">
  1751. {# ----- INFOS PERSONNELLES ----- #}
  1752. <div class=\"row g-3\">
  1753. <div class=\"col-md-6\">
  1754. <label class=\"booking-label\">Nom</label>
  1755. {{ form_widget(form.lastname) }}
  1756. </div>
  1757. <div class=\"col-md-6\">
  1758. <label class=\"booking-label\">Prénom</label>
  1759. {{ form_widget(form.name) }}
  1760. </div>
  1761. <div class=\"col-md-12\">
  1762. <label class=\"booking-label\">Email</label>
  1763. {{ form_widget(form.email) }}
  1764. </div>
  1765. <div class=\"col-md-12\">
  1766. <label class=\"booking-label\">Message</label>
  1767. {{ form_widget(form.message) }}
  1768. </div>
  1769. </div>
  1770. {# ----- CGV + SUBMIT ----- #}
  1771. <div class=\"text-center mt-4 cgv-block\">
  1772. <input type=\"checkbox\" id=\"acceptCGV\"> J'accepte les <a href=\"{{ path('locale_cgv') }}\" target=\"_blank\" style=\"color:#212121; text-decoration:underline;\">CGV</a>
  1773. </div>
  1774. <div class=\"text-center mt-3\">
  1775. <button type=\"submit\" name=\"submit\" value=\"1\" class=\"btn-main\" style=\"color:white;\">Confirmer la réservation</button>
  1776. </div>
  1777. {# Champs cachés #}
  1778. {{ form_widget(form.start) }}
  1779. {{ form_widget(form.end) }}
  1780. {{ form_widget(form.rooms) }}
  1781. {{ form_widget(form.adults) }}
  1782. {{ form_widget(form.children) }}
  1783. {{ form_widget(form.persons) }}
  1784. {{ form_rest(form) }}
  1785. {{ form_end(form) }}
  1786. </div>
  1787. </div>
  1788. </div>
  1789. </div>
  1790. </section>
  1791. <section id=\"faq\" class=\"text-light\">
  1792. <div class=\"container\">
  1793. <div class=\"row g-4 justify-content-center\">
  1794. <div class=\"col-lg-6 text-center\">
  1795. <h2 class=\"wow fadeInUp\" data-wow-delay=\".2s\">FAQ</h2>
  1796. </div>
  1797. </div>
  1798. <div class=\"row g-4 justify-content-center\">
  1799. <div class=\"col-lg-6 text-left\" style=\"color:black !important;\">
  1800. <h3 style=\"margin-top:7px;\">Comment réserver le logement ?</h3>
  1801. <div>Vous pouvez réserver directement sur notre site et bientôt via les plateformes partenaires. Le paiement sécurisé confirme immédiatement votre réservation.</div>
  1802. <h3 style=\"margin-top:7px;\">Quels sont les horaires d'arrivée et de départ ?</h3>
  1803. <ul>
  1804. <li>Arrivée : à partir de 15h</li>
  1805. <li>Départ : avant 11h</li>
  1806. </ul>
  1807. <h3 style=\"margin-top:7px;\">Le logement est-il entièrement équipé ?</h3>
  1808. <div>Oui, le logement est entièrement meublé et équipé : cuisine, literie, serviettes, électroménager, Wi-Fi,…</div>
  1809. <h3 style=\"margin-top:7px;\">Y a-t-il un parking disponible ?</h3>
  1810. <div>Oui, un parking privatif est possible en option au prix de 24 euros les 24h ou 150 euros la semaine (7 nuits).</div>
  1811. <h3 style=\"margin-top:7px;\">Le logement est-il adapté aux enfants ?</h3>
  1812. <div>Oui, nous proposons certains équipements pour enfants (lit bébé, chaise haute, vaisselle adaptée) sur demande.</div>
  1813. <h3 style=\"margin-top:7px;\">Les animaux sont-ils acceptés ?</h3>
  1814. <div>Merci de nous contacter avant de réserver si vous souhaitez venir avec un animal, les chiens sont les seuls animaux acceptés, mais soumis à une demande préalable.</div>
  1815. <h3 style=\"margin-top:7px;\">Puis-je annuler ou modifier ma réservation ?</h3>
  1816. <div>Oui, nos conditions d'annulation sont précisées lors de la réservation. Remboursement de 85% du montant de la location si annulation plus d'un mois avant la date d'arrivée, puis 50 % remboursés si annulation entre 1 mois et 15 jours avant la date d'arrivée. Pas de remboursement si annulation moins de 15 jours avant la date d'arrivée.</div>
  1817. <h3 style=\"margin-top:7px;\">Le logement est-il accessible en transport public ?</h3>
  1818. <div>Oui, les principaux transports sont proches. La station de tram « Langstross, Grand'rue » est à moins de 100 mètres de l'appartement. La gare de Strasbourg est à 10 minutes à pieds.</div>
  1819. <h3 style=\"margin-top:7px;\">Y a-t-il des commerces ou restaurants à proximité ?</h3>
  1820. <div>Oui, vous trouverez supermarchés, cafés, restaurants et activités touristiques au pied de l'immeuble.</div>
  1821. <h3 style=\"margin-top:7px;\">Que faire en cas de problème pendant le séjour ?</h3>
  1822. <div>Nous restons disponibles 24h/24 par mail, pour toute urgence ou question concernant le logement, vous pouvez aussi nous joindre entre 9h et 20h par téléphone au 07 61 05 82 43 et nous sommes disponibles</div>
  1823. </div>
  1824. </div>
  1825. </div>
  1826. </section>
  1827. {% endblock body %}
  1828. {% block footerjs %}
  1829. <script src=\"https://cdn.jsdelivr.net/npm/flatpickr\"></script>
  1830. <script src=\"https://cdn.jsdelivr.net/npm/flatpickr/dist/l10n/fr.js\"></script>
  1831. {# Grille tarifaire exposée au JS #}
  1832. <script>
  1833. window.PRICING_MATRIX = {{ pricingMatrix|json_encode|raw }};
  1834. window.SIMULATION_URL = \"{{ path('locale_simulation_pricing', {'_locale': 'fr'}) }}\";
  1835. console.log('📋 Grille basse saison chargée :', window.PRICING_MATRIX);
  1836. console.log('🔗 URL simulation :', window.SIMULATION_URL);
  1837. </script>
  1838. <script>
  1839. // ===========================================================
  1840. // Logique chambres / adultes / enfants
  1841. //
  1842. // Configuration physique :
  1843. // - Chambre A : lit double → 2 personnes
  1844. // - Chambre B : lit double → 2 personnes
  1845. // - Chambre C : lits superposés → 4 personnes (adultes/enfants)
  1846. //
  1847. // Le nombre de chambres est DÉTERMINÉ automatiquement (pas de choix) :
  1848. //
  1849. // SANS ENFANTS :
  1850. // 1-2 ad → 1 ch
  1851. // 3-4 ad → 2 ch
  1852. // 5-8 ad → 3 ch
  1853. //
  1854. // AVEC ENFANTS :
  1855. // 1-2 ad → 2 ch (chambre A + chambre superposés)
  1856. // 3+ ad → 3 ch (A + B + chambre superposés)
  1857. //
  1858. // Contraintes : adults + children ≤ 8, children ≤ 4, adults ≥ 1
  1859. // ===========================================================
  1860. function roomsForCombo(adults, children) {
  1861. if (children > 0) {
  1862. return adults <= 2 ? 2 : 3;
  1863. }
  1864. if (adults <= 2) return 1;
  1865. if (adults <= 4) return 2;
  1866. return 3;
  1867. }
  1868. function canAddAdult(state) {
  1869. if (state.adults >= 8) return false;
  1870. return (state.adults + 1 + state.children) <= 8;
  1871. }
  1872. function canAddChild(state) {
  1873. if (state.children >= 4) return false;
  1874. return (state.adults + state.children + 1) <= 8;
  1875. }
  1876. const state = { rooms: 1, adults: 2, children: 0 };
  1877. function updateDisplay() {
  1878. // Le nombre de chambres est recalculé automatiquement à chaque update
  1879. state.rooms = roomsForCombo(state.adults, state.children);
  1880. \$('#cnt-rooms').text(state.rooms);
  1881. \$('#cnt-adults').text(state.adults);
  1882. \$('#cnt-children').text(state.children);
  1883. \$('#reservation_form_rooms').val(state.rooms);
  1884. \$('#reservation_form_adults').val(state.adults);
  1885. \$('#reservation_form_children').val(state.children);
  1886. \$('#reservation_form_persons').val(state.adults + state.children);
  1887. \$('.counter-btn').each(function() {
  1888. const target = \$(this).data('target');
  1889. const action = \$(this).data('action');
  1890. let disabled = false;
  1891. if (target === 'rooms') {
  1892. // Chambres = toujours verrouillé (déterminé par adultes/enfants)
  1893. disabled = true;
  1894. }
  1895. if (target === 'adults') {
  1896. if (action === 'dec' && state.adults <= 1) disabled = true;
  1897. if (action === 'inc' && !canAddAdult(state)) disabled = true;
  1898. }
  1899. if (target === 'children') {
  1900. if (action === 'dec' && state.children <= 0) disabled = true;
  1901. if (action === 'inc' && !canAddChild(state)) disabled = true;
  1902. }
  1903. \$(this).prop('disabled', disabled).toggleClass('disabled', disabled);
  1904. });
  1905. \$('#capacity-warning').hide();
  1906. }
  1907. \$(document).on('click', '.counter-btn', function() {
  1908. if (\$(this).prop('disabled')) return;
  1909. const target = \$(this).data('target');
  1910. const action = \$(this).data('action');
  1911. // Aucune action sur \"rooms\" (toujours désactivé)
  1912. if (target === 'adults') {
  1913. if (action === 'inc' && canAddAdult(state)) state.adults++;
  1914. if (action === 'dec' && state.adults > 1) state.adults--;
  1915. }
  1916. if (target === 'children') {
  1917. if (action === 'inc' && canAddChild(state)) state.children++;
  1918. if (action === 'dec' && state.children > 0) state.children--;
  1919. }
  1920. updateDisplay();
  1921. updateSimulation();
  1922. });
  1923. function updateSimulation() {
  1924. const start = \$(\"#reservation_form_start\").val();
  1925. const end = \$(\"#reservation_form_end\").val();
  1926. const persons = state.adults + state.children;
  1927. console.log('🔄 updateSimulation', { start, end, rooms: state.rooms, adults: state.adults, children: state.children });
  1928. if (!start || !end || persons < 1) {
  1929. \$(\"#results\").html('');
  1930. return;
  1931. }
  1932. \$(\"#results\").html('<div class=\"loading\" style=\"color:#212121;\">Calcul en cours...</div>');
  1933. \$.post(
  1934. window.SIMULATION_URL,
  1935. { start: start, end: end, rooms: state.rooms, adults: state.adults, children: state.children }
  1936. )
  1937. .done(function(data) {
  1938. console.log('✅ Simulation OK');
  1939. \$(\"#results\").html(data);
  1940. })
  1941. .fail(function(xhr) {
  1942. console.error('❌ Simulation KO', xhr.status, xhr.responseText);
  1943. \$(\"#results\").html('<div class=\"error\" style=\"color:#a00;\">Erreur lors du calcul du prix (' + xhr.status + ')</div>');
  1944. });
  1945. }
  1946. \$(document).ready(function() {
  1947. updateDisplay();
  1948. // Bouton submit désactivé tant que CGV non cochées
  1949. \$('button[type=\"submit\"]').prop('disabled', true);
  1950. \$('#acceptCGV').change(function() {
  1951. \$('button[type=\"submit\"]').prop('disabled', !\$(this).is(':checked'));
  1952. });
  1953. });
  1954. </script>
  1955. <script>
  1956. // ===========================================================
  1957. // Flatpickr calendrier
  1958. // ===========================================================
  1959. \$(document).ready(function() {
  1960. let bookedRanges = [];
  1961. \$.ajax({
  1962. url: '{{ env('WEBHOOK_CALENDAR_AVAILABILITY') }}',
  1963. method: 'POST',
  1964. contentType: 'application/json',
  1965. data: ''
  1966. })
  1967. .done(function(data) {
  1968. bookedRanges = data.bookings || [];
  1969. initDatePicker();
  1970. })
  1971. .fail(function() { initDatePicker(); });
  1972. function parseLocalDate(dateStr) {
  1973. const [year, month, day] = dateStr.split('-').map(Number);
  1974. return new Date(year, month - 1, day);
  1975. }
  1976. const isMobile = window.innerWidth <= 900;
  1977. function initDatePicker() {
  1978. flatpickr(\"#date_range_picker\", {
  1979. inline: true,
  1980. mode: \"range\",
  1981. locale: \"fr\",
  1982. minDate: new Date(new Date().setDate(new Date().getDate() + 1)),
  1983. dateFormat: \"Y-m-d\",
  1984. showMonths: isMobile ? 1 : 2,
  1985. disable: [
  1986. function(date) {
  1987. const checkDate = new Date(date);
  1988. checkDate.setHours(0, 0, 0, 0);
  1989. return bookedRanges.some(range => {
  1990. const start = parseLocalDate(range.start_date);
  1991. const end = parseLocalDate(range.end_date);
  1992. return checkDate >= start && checkDate <= end;
  1993. });
  1994. }
  1995. ],
  1996. onChange: function(selectedDates, dateStr, instance) {
  1997. if (selectedDates.length === 2) {
  1998. const start = selectedDates[0];
  1999. const end = selectedDates[1];
  2000. if (isRangeAvailable(start, end)) {
  2001. \$('#reservation_form_start').val(formatDate(start)).trigger('change');
  2002. \$('#reservation_form_end').val(formatDate(end)).trigger('change');
  2003. updateSelectedInfo(start, end);
  2004. updateSimulation();
  2005. } else {
  2006. alert('⚠️ Cette période contient des dates déjà réservées.');
  2007. instance.clear();
  2008. clearSymfonyFields();
  2009. hideSelectedInfo();
  2010. \$(\"#results\").html('');
  2011. }
  2012. } else {
  2013. clearSymfonyFields();
  2014. hideSelectedInfo();
  2015. \$(\"#results\").html('');
  2016. }
  2017. },
  2018. onDayCreate: function(dObj, dStr, fp, dayElem) {
  2019. const date = new Date(dayElem.dateObj);
  2020. date.setHours(0, 0, 0, 0);
  2021. const isBooked = bookedRanges.some(range => {
  2022. const start = parseLocalDate(range.start_date);
  2023. const end = parseLocalDate(range.end_date);
  2024. return date >= start && date <= end;
  2025. });
  2026. if (isBooked) {
  2027. dayElem.classList.add('booked');
  2028. dayElem.title = 'Date indisponible (réservée)';
  2029. } else if (date >= new Date()) {
  2030. dayElem.classList.add('available');
  2031. }
  2032. }
  2033. });
  2034. }
  2035. function isRangeAvailable(startDate, endDate) {
  2036. let currentDate = new Date(startDate);
  2037. currentDate.setHours(0, 0, 0, 0);
  2038. const endCheck = new Date(endDate);
  2039. endCheck.setHours(0, 0, 0, 0);
  2040. while (currentDate <= endCheck) {
  2041. const isBooked = bookedRanges.some(range => {
  2042. const start = parseLocalDate(range.start_date);
  2043. const end = parseLocalDate(range.end_date);
  2044. return currentDate >= start && currentDate <= end;
  2045. });
  2046. if (isBooked) return false;
  2047. currentDate.setDate(currentDate.getDate() + 1);
  2048. }
  2049. return true;
  2050. }
  2051. function updateSelectedInfo(start, end) {
  2052. const nights = Math.ceil((end - start) / (1000 * 60 * 60 * 24));
  2053. \$('#info-start').text(start.toLocaleDateString('fr-FR'));
  2054. \$('#info-end').text(end.toLocaleDateString('fr-FR'));
  2055. \$('#info-nights').text(`\${nights} nuit\${nights > 1 ? 's' : ''}`);
  2056. }
  2057. function hideSelectedInfo() {
  2058. \$('#info-start').text('-');
  2059. \$('#info-end').text('-');
  2060. \$('#info-nights').text('-');
  2061. }
  2062. function clearSymfonyFields() {
  2063. \$('#reservation_form_start').val('');
  2064. \$('#reservation_form_end').val('');
  2065. }
  2066. function formatDate(date) {
  2067. return date.getFullYear() + '-' +
  2068. String(date.getMonth() + 1).padStart(2, '0') + '-' +
  2069. String(date.getDate()).padStart(2, '0');
  2070. }
  2071. });
  2072. </script>
  2073. {% endblock footerjs %}
  2074. {% block css %}
  2075. <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/flatpickr/dist/flatpickr.min.css\">
  2076. <style>
  2077. /* ===========================================================
  2078. Booking card (border blanc, fond transparent, texte noir)
  2079. =========================================================== */
  2080. .booking-card {
  2081. background: transparent;
  2082. border: 2px solid white;
  2083. border-radius: 12px;
  2084. padding: 32px;
  2085. color: #212121;
  2086. }
  2087. .booking-title {
  2088. color: #212121;
  2089. font-weight: 700;
  2090. margin-bottom: 24px;
  2091. }
  2092. .booking-divider {
  2093. border-top: 1px solid rgba(0,0,0,0.15);
  2094. margin: 28px 0;
  2095. }
  2096. .booking-label {
  2097. color: #212121;
  2098. font-weight: 500;
  2099. margin-bottom: 6px;
  2100. display: block;
  2101. }
  2102. .booking-card input.form-control,
  2103. .booking-card textarea.form-control {
  2104. background: rgba(255,255,255,0.85) !important;
  2105. border: 1px solid rgba(0,0,0,0.2) !important;
  2106. color: #212121 !important;
  2107. }
  2108. .booking-card input.form-control::placeholder,
  2109. .booking-card textarea.form-control::placeholder {
  2110. color: rgba(0,0,0,0.4) !important;
  2111. }
  2112. .booking-card input.form-control:focus,
  2113. .booking-card textarea.form-control:focus {
  2114. border-color: #212121 !important;
  2115. box-shadow: 0 0 0 0.2rem rgba(0,0,0,0.08) !important;
  2116. }
  2117. .cgv-block { color: #212121; }
  2118. .cgv-block a { color: #212121; text-decoration: underline; }
  2119. /* ----- Dates récap ----- */
  2120. .dates-recap { color: #212121; }
  2121. .recap-label {
  2122. font-size: 13px;
  2123. text-transform: uppercase;
  2124. letter-spacing: 0.5px;
  2125. opacity: 0.7;
  2126. }
  2127. .recap-value {
  2128. font-size: 18px;
  2129. font-weight: 600;
  2130. margin-top: 4px;
  2131. }
  2132. /* ----- Widget compteurs ----- */
  2133. .counter-row {
  2134. display: flex;
  2135. justify-content: space-between;
  2136. align-items: center;
  2137. padding: 14px 0;
  2138. border-bottom: 1px solid rgba(0,0,0,0.1);
  2139. }
  2140. .counter-row:last-of-type { border-bottom: none; }
  2141. .counter-title {
  2142. font-size: 16px;
  2143. font-weight: 500;
  2144. color: #212121;
  2145. }
  2146. .counter-sub {
  2147. font-size: 12px;
  2148. color: rgba(0,0,0,0.6);
  2149. margin-top: 2px;
  2150. }
  2151. .counter-controls {
  2152. display: flex;
  2153. align-items: center;
  2154. gap: 12px;
  2155. }
  2156. .counter-btn {
  2157. width: 40px;
  2158. height: 40px;
  2159. border-radius: 8px;
  2160. border: 1.5px solid #212121;
  2161. background: transparent;
  2162. color: #212121;
  2163. font-size: 20px;
  2164. font-weight: 600;
  2165. line-height: 1;
  2166. cursor: pointer;
  2167. transition: all 0.15s;
  2168. }
  2169. .counter-btn:hover:not(.disabled) {
  2170. background: rgba(0,0,0,0.06);
  2171. }
  2172. .counter-btn.disabled,
  2173. .counter-btn:disabled {
  2174. border-color: rgba(0,0,0,0.2);
  2175. color: rgba(0,0,0,0.25);
  2176. cursor: not-allowed;
  2177. background: transparent;
  2178. }
  2179. .counter-value {
  2180. min-width: 28px;
  2181. text-align: center;
  2182. font-size: 16px;
  2183. font-weight: 500;
  2184. color: #212121;
  2185. }
  2186. .capacity-warning {
  2187. margin-top: 12px;
  2188. padding: 10px 14px;
  2189. background: rgba(255,180,0,0.18);
  2190. border: 1px solid rgba(180,120,0,0.5);
  2191. border-radius: 6px;
  2192. color: #8a4500;
  2193. font-size: 14px;
  2194. }
  2195. /* ===========================================================
  2196. Calendrier
  2197. =========================================================== */
  2198. .calendar-container {
  2199. margin: 0 0 8px 0;
  2200. width: 100%;
  2201. display: flex;
  2202. justify-content: center;
  2203. }
  2204. #date_range_picker { display: none; }
  2205. .flatpickr-calendar.inline {
  2206. box-shadow: 0 4px 12px rgba(0,0,0,0.15);
  2207. border-radius: 8px;
  2208. }
  2209. .flatpickr-day.booked {
  2210. background-color: #ff4444 !important;
  2211. color: white !important;
  2212. cursor: not-allowed !important;
  2213. position: relative;
  2214. }
  2215. .flatpickr-day.booked::after {
  2216. content: \"✕\";
  2217. position: absolute;
  2218. top: 50%; left: 50%;
  2219. transform: translate(-50%, -50%);
  2220. font-size: 20px;
  2221. font-weight: bold;
  2222. }
  2223. .flatpickr-day.booked:hover { background-color: #ff0000 !important; }
  2224. .flatpickr-day.available:hover { background-color: #28a745; color: white; }
  2225. @media (max-width: 768px) {
  2226. .booking-card { padding: 20px; }
  2227. .calendar-container { margin: 0 0 8px 0; padding: 0; }
  2228. .flatpickr-calendar.inline { width: 100% !important; max-width: 100% !important; }
  2229. .flatpickr-months { padding: 8px 10px; }
  2230. .flatpickr-days { width: 100% !important; }
  2231. .dayContainer {
  2232. width: 100% !important;
  2233. min-width: 100% !important;
  2234. max-width: 100% !important;
  2235. }
  2236. .flatpickr-day {
  2237. height: 40px !important;
  2238. line-height: 40px !important;
  2239. flex-basis: 14.2857% !important;
  2240. max-width: 14.2857% !important;
  2241. }
  2242. }
  2243. </style>
  2244. {% endblock css %}
  2245. ", "vitrine/fr/homepage.html.twig", "/var/www/vhosts/mirtillostudio.com/ch.mirtillostudio.com/templates/vitrine/fr/homepage.html.twig");
  2246. }
  2247. }