var/cache/dev/twig/1b/1b5fd8eabc9303fb3052d376954a82c4.php line 42

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. /* base.html.twig */
  16. class __TwigTemplate_a1e20a0471dae62b8df9961ef4ac47f2 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->parent = false;
  28. $this->blocks = [
  29. 'title' => [$this, 'block_title'],
  30. 'stylesheets' => [$this, 'block_stylesheets'],
  31. 'body' => [$this, 'block_body'],
  32. 'javascripts' => [$this, 'block_javascripts'],
  33. ];
  34. }
  35. protected function doDisplay(array $context, array $blocks = []): iterable
  36. {
  37. $macros = $this->macros;
  38. $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  39. $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "template", "base.html.twig"));
  40. $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  41. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "template", "base.html.twig"));
  42. // line 1
  43. yield "<!DOCTYPE html>
  44. <html>
  45. <head>
  46. <meta charset=\"UTF-8\">
  47. <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">
  48. <title>";
  49. // line 6
  50. yield from $this->unwrap()->yieldBlock('title', $context, $blocks);
  51. yield "</title>
  52. ";
  53. // line 7
  54. yield from $this->unwrap()->yieldBlock('stylesheets', $context, $blocks);
  55. // line 191
  56. yield " </head>
  57. <body>
  58. <nav class=\"navbar navbar-light bg-light\">
  59. <div class=\"d-flex align-items-center\">
  60. <!-- Liste déroulante BDD-Books / BDD-Magazines -->
  61. <div class=\"dropdown mr-3\">
  62. <a class=\"navbar-brand dropdown-toggle\" href=\"#\" id=\"navbarBddDropdown\" data-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">
  63. <i class=\"fas fa-database mr-1\"></i>BDD
  64. </a>
  65. <div class=\"dropdown-menu\" aria-labelledby=\"navbarBddDropdown\">
  66. <a class=\"dropdown-item\" href=\"";
  67. // line 201
  68. yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("index");
  69. yield "\">
  70. <i class=\"fas fa-book mr-2 text-primary\"></i>BDD-Books
  71. </a>
  72. <a class=\"dropdown-item\" href=\"";
  73. // line 204
  74. yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("magazines_search");
  75. yield "\">
  76. <i class=\"fas fa-newspaper mr-2 text-success\"></i>BDD-Magazines
  77. </a>
  78. </div>
  79. </div>
  80. </div>
  81. <div class=\"d-flex align-items-center\">
  82. ";
  83. // line 212
  84. if ($this->extensions['Symfony\Bridge\Twig\Extension\SecurityExtension']->isGranted("IS_AUTHENTICATED_REMEMBERED")) {
  85. // line 213
  86. yield " <div class=\"dropdown\">
  87. <a class=\"user-menu-btn\" href=\"#\" id=\"navbarDropdownMenuLink\" data-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">
  88. <div class=\"user-avatar\">
  89. ";
  90. // line 216
  91. if (CoreExtension::getAttribute($this->env, $this->source, CoreExtension::getAttribute($this->env, $this->source, (isset($context["app"]) || array_key_exists("app", $context) ? $context["app"] : (function () { throw new RuntimeError('Variable "app" does not exist.', 216, $this->source); })()), "user", [], "any", false, false, false, 216), "logo", [], "any", false, false, false, 216)) {
  92. // line 217
  93. yield " <img src=\"";
  94. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl(("uploads/avatars/" . CoreExtension::getAttribute($this->env, $this->source, CoreExtension::getAttribute($this->env, $this->source, (isset($context["app"]) || array_key_exists("app", $context) ? $context["app"] : (function () { throw new RuntimeError('Variable "app" does not exist.', 217, $this->source); })()), "user", [], "any", false, false, false, 217), "logo", [], "any", false, false, false, 217))), "html", null, true);
  95. yield "\" alt=\"";
  96. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env, $this->source, CoreExtension::getAttribute($this->env, $this->source, (isset($context["app"]) || array_key_exists("app", $context) ? $context["app"] : (function () { throw new RuntimeError('Variable "app" does not exist.', 217, $this->source); })()), "user", [], "any", false, false, false, 217), "username", [], "any", false, false, false, 217), "html", null, true);
  97. yield "\" class=\"user-avatar-img\">
  98. ";
  99. } else {
  100. // line 219
  101. yield " <span class=\"user-avatar-initials\">";
  102. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(Twig\Extension\CoreExtension::upper($this->env->getCharset(), Twig\Extension\CoreExtension::first($this->env->getCharset(), CoreExtension::getAttribute($this->env, $this->source, CoreExtension::getAttribute($this->env, $this->source, (isset($context["app"]) || array_key_exists("app", $context) ? $context["app"] : (function () { throw new RuntimeError('Variable "app" does not exist.', 219, $this->source); })()), "user", [], "any", false, false, false, 219), "name", [], "any", false, false, false, 219))), "html", null, true);
  103. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(Twig\Extension\CoreExtension::upper($this->env->getCharset(), Twig\Extension\CoreExtension::first($this->env->getCharset(), CoreExtension::getAttribute($this->env, $this->source, CoreExtension::getAttribute($this->env, $this->source, (isset($context["app"]) || array_key_exists("app", $context) ? $context["app"] : (function () { throw new RuntimeError('Variable "app" does not exist.', 219, $this->source); })()), "user", [], "any", false, false, false, 219), "lastname", [], "any", false, false, false, 219))), "html", null, true);
  104. yield "</span>
  105. ";
  106. }
  107. // line 221
  108. yield " </div>
  109. <span class=\"user-name d-none d-md-inline ml-2\">";
  110. // line 222
  111. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env, $this->source, CoreExtension::getAttribute($this->env, $this->source, (isset($context["app"]) || array_key_exists("app", $context) ? $context["app"] : (function () { throw new RuntimeError('Variable "app" does not exist.', 222, $this->source); })()), "user", [], "any", false, false, false, 222), "username", [], "any", false, false, false, 222), "html", null, true);
  112. yield "</span>
  113. <i class=\"fas fa-chevron-down ml-1 small\"></i>
  114. </a>
  115. <div class=\"dropdown-menu dropdown-menu-right\" aria-labelledby=\"navbarDropdownMenuLink\">
  116. <div class=\"dropdown-header\">
  117. <strong>";
  118. // line 227
  119. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env, $this->source, CoreExtension::getAttribute($this->env, $this->source, (isset($context["app"]) || array_key_exists("app", $context) ? $context["app"] : (function () { throw new RuntimeError('Variable "app" does not exist.', 227, $this->source); })()), "user", [], "any", false, false, false, 227), "name", [], "any", false, false, false, 227), "html", null, true);
  120. yield " ";
  121. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env, $this->source, CoreExtension::getAttribute($this->env, $this->source, (isset($context["app"]) || array_key_exists("app", $context) ? $context["app"] : (function () { throw new RuntimeError('Variable "app" does not exist.', 227, $this->source); })()), "user", [], "any", false, false, false, 227), "lastname", [], "any", false, false, false, 227), "html", null, true);
  122. yield "</strong>
  123. <br><small class=\"text-muted\">";
  124. // line 228
  125. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env, $this->source, CoreExtension::getAttribute($this->env, $this->source, (isset($context["app"]) || array_key_exists("app", $context) ? $context["app"] : (function () { throw new RuntimeError('Variable "app" does not exist.', 228, $this->source); })()), "user", [], "any", false, false, false, 228), "email", [], "any", false, false, false, 228), "html", null, true);
  126. yield "</small>
  127. </div>
  128. <div class=\"dropdown-divider\"></div>
  129. <a class=\"dropdown-item\" href=\"";
  130. // line 231
  131. yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("user_profile");
  132. yield "\">
  133. <i class=\"fas fa-user-cog mr-2\"></i>Mon profil
  134. </a>
  135. <div class=\"dropdown-divider\"></div>
  136. <a class=\"dropdown-item\" href=\"";
  137. // line 235
  138. yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("magazines_list");
  139. yield "\">
  140. <i class=\"fas fa-newspaper mr-2\"></i>Magazines
  141. </a>
  142. <a class=\"dropdown-item\" href=\"";
  143. // line 238
  144. yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("listesLivres");
  145. yield "\">
  146. <i class=\"fas fa-book mr-2\"></i>Livres
  147. </a>
  148. <div class=\"dropdown-divider\"></div>
  149. <a class=\"dropdown-item text-danger\" href=\"";
  150. // line 242
  151. yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("app_logout");
  152. yield "\">
  153. <i class=\"fas fa-sign-out-alt mr-2\"></i>Déconnexion
  154. </a>
  155. </div>
  156. </div>
  157. ";
  158. } else {
  159. // line 248
  160. yield " <button class=\"btn btn-outline-primary btn-sm\" data-toggle=\"modal\" data-target=\"#loginModal\">
  161. <i class=\"fas fa-sign-in-alt mr-1\"></i>";
  162. // line 249
  163. yield "Connexion";
  164. yield "
  165. </button>
  166. ";
  167. }
  168. // line 252
  169. yield " </div>
  170. </nav>
  171. ";
  172. // line 254
  173. $context['_parent'] = $context;
  174. $context['_seq'] = CoreExtension::ensureTraversable(CoreExtension::getAttribute($this->env, $this->source, (isset($context["app"]) || array_key_exists("app", $context) ? $context["app"] : (function () { throw new RuntimeError('Variable "app" does not exist.', 254, $this->source); })()), "flashes", ["warning"], "method", false, false, false, 254));
  175. foreach ($context['_seq'] as $context["_key"] => $context["message"]) {
  176. // line 255
  177. yield " <div class=\"alert alert-success\">
  178. ";
  179. // line 256
  180. yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($context["message"], "html", null, true);
  181. yield "
  182. </div>
  183. ";
  184. }
  185. $_parent = $context['_parent'];
  186. unset($context['_seq'], $context['_key'], $context['message'], $context['_parent']);
  187. $context = array_intersect_key($context, $_parent) + $_parent;
  188. // line 259
  189. yield " <div id=\"bodyContain\">
  190. ";
  191. // line 260
  192. yield from $this->unwrap()->yieldBlock('body', $context, $blocks);
  193. // line 263
  194. yield " </div>
  195. ";
  196. // line 265
  197. if ( !$this->extensions['Symfony\Bridge\Twig\Extension\SecurityExtension']->isGranted("IS_AUTHENTICATED_REMEMBERED")) {
  198. // line 266
  199. yield " ";
  200. yield from $this->loadTemplate("includes/loginModal.html.twig", "base.html.twig", 266)->unwrap()->yield($context);
  201. // line 267
  202. yield " ";
  203. }
  204. // line 268
  205. yield "
  206. ";
  207. // line 269
  208. yield from $this->unwrap()->yieldBlock('javascripts', $context, $blocks);
  209. // line 273
  210. yield " </body>
  211. </html>
  212. ";
  213. $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  214. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  215. yield from [];
  216. }
  217. // line 6
  218. /**
  219. * @return iterable<null|scalar|\Stringable>
  220. */
  221. public function block_title(array $context, array $blocks = []): iterable
  222. {
  223. $macros = $this->macros;
  224. $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  225. $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "title"));
  226. $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  227. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "title"));
  228. yield "BDD-Books";
  229. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  230. $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  231. yield from [];
  232. }
  233. // line 7
  234. /**
  235. * @return iterable<null|scalar|\Stringable>
  236. */
  237. public function block_stylesheets(array $context, array $blocks = []): iterable
  238. {
  239. $macros = $this->macros;
  240. $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  241. $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "stylesheets"));
  242. $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  243. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "stylesheets"));
  244. // line 8
  245. yield " <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css\">
  246. <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css\">
  247. <style>
  248. /* Variables et styles globaux */
  249. :root {
  250. --primary-color: #4a90d9;
  251. --secondary-color: #6c757d;
  252. --success-color: #28a745;
  253. --bg-light: #f8f9fa;
  254. --shadow: 0 2px 10px rgba(0,0,0,0.1);
  255. }
  256. body { background-color: #f5f7fa; }
  257. /* _index.scss */
  258. #list_user { padding: 3%; }
  259. #list_user #users { text-align: center; }
  260. #list_user .logo { width: auto; height: 150px; }
  261. #list_user #div-btn-user { width: 100%; margin: auto; padding-top: 2%; padding-bottom: 1%; }
  262. #list_user #btn-user { text-align: center; width: 250px; height: 250px; }
  263. .navbar { width: 100%; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%) !important; box-shadow: var(--shadow); }
  264. .navbar .navbar-brand { color: white !important; font-weight: bold; font-size: 1.5rem; }
  265. .navbar .btn-outline-secondary { color: white; border-color: rgba(255,255,255,0.5); }
  266. .navbar .btn-outline-secondary:hover { background-color: rgba(255,255,255,0.2); color: white; }
  267. .navbar .btn-outline-primary { color: white; border-color: white; }
  268. .navbar .btn-outline-primary:hover { background-color: white; color: #667eea; }
  269. #circleUser { width: 30px; height: 30px; color: white; }
  270. #bodyContain { padding-top: 20px; }
  271. #titleListe { margin: 0 20px; }
  272. #acceuilSite { padding-top: 20px; justify-content: center; margin-right: 5%; margin-left: 5%; max-width: 1200px; margin: 20px auto; }
  273. #acceuilSite h2 { font-size: 2rem; text-align: center; padding-bottom: 10px; color: #333; }
  274. #acceuilSite .btn { margin-bottom: 10px; }
  275. #acceuilSite #cameraButton { position: absolute; top: 0; border-radius: 5px; right: 18px; z-index: 2; border: none; height: 38px; cursor: pointer; transform: translateX(2px); }
  276. #acceuilSite #divSearchButton { padding-top: 15px; }
  277. #acceuilSite #selectuser { padding-top: 15px; }
  278. .row { padding-bottom: 15px; }
  279. /* Cards améliorées */
  280. .card { border: none; border-radius: 12px; box-shadow: var(--shadow); transition: transform 0.2s, box-shadow 0.2s; }
  281. .card:hover { transform: translateY(-2px); box-shadow: 0 4px 20px rgba(0,0,0,0.15); }
  282. .card-header { border-radius: 12px 12px 0 0 !important; }
  283. /* _tablivres.scss */
  284. #tableBook { padding: 20px; background: white; border-radius: 12px; box-shadow: var(--shadow); margin: 0 20px; }
  285. #tableBook table { margin-bottom: 0; }
  286. #tableBook thead th { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border: none; padding: 15px 10px; font-weight: 500; }
  287. #tableBook thead th a { color: white; text-decoration: none; }
  288. #tableBook thead th a:hover { color: #ddd; }
  289. #tableBook tbody tr { transition: background-color 0.2s; }
  290. #tableBook tbody tr:hover { background-color: #f8f9fa; }
  291. #tableBook tbody td { vertical-align: middle; padding: 10px; border-color: #eee; }
  292. #tableBook tbody > tr { height: auto; min-height: 120px; }
  293. @media only screen and (max-device-width: 900px) {
  294. #tableBook { padding: 10px; margin: 0 10px; }
  295. #tableBook tr th:nth-child(3), #tableBook tr td:nth-child(3),
  296. #tableBook tr th:nth-child(4), #tableBook tr td:nth-child(4),
  297. #tableBook tr th:nth-child(5), #tableBook tr td:nth-child(5),
  298. #tableBook tr th:nth-child(6), #tableBook tr td:nth-child(6) { display: none; }
  299. }
  300. .pagination { display: flex; flex-wrap: wrap; padding: 20px 0; list-style: none; border-radius: 0.25rem; justify-content: center; }
  301. .pagination .page-link { border-radius: 8px; margin: 0 3px; border: none; color: #667eea; }
  302. .pagination .page-item.active .page-link { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border: none; }
  303. .indexAuteur { flex-wrap: wrap; display: flex; padding-left: 0; list-style: none; border-radius: 0.25rem; justify-content: center; }
  304. #myImg { border-radius: 8px; cursor: pointer; transition: 0.3s; }
  305. #myImg:hover { opacity: 0.7; }
  306. #caption { margin: auto; display: block; width: 80%; max-width: 700px; text-align: center; color: #ccc; padding: 10px 0; height: 150px; }
  307. /* Images de couverture dans le tableau */
  308. .img-cover { border-radius: 8px; box-shadow: 0 2px 8px rgba(0,0,0,0.15); transition: transform 0.2s, box-shadow 0.2s; }
  309. .img-cover:hover { transform: scale(1.05); box-shadow: 0 4px 15px rgba(0,0,0,0.25); }
  310. /* Fix input-group alignment */
  311. .border-right-0 { border-right: 0 !important; }
  312. .border-left-0 { border-left: 0 !important; }
  313. .input-group-lg > .input-group-prepend > .input-group-text,
  314. .input-group-lg > .input-group-append > .btn {
  315. height: 100%;
  316. display: flex;
  317. align-items: center;
  318. }
  319. /* _livres.scss */
  320. #titleLivre { text-align: center; margin-bottom: 30px; }
  321. .detail-infos th, .detail-infos td { padding: 5px; }
  322. .cover { display: block; margin-left: auto; margin-right: auto; margin-bottom: 30px; }
  323. .details_listuser { border-collapse: collapse; border: 2px solid black; font-family: sans-serif; font-size: 0.8rem; letter-spacing: 1px; }
  324. .details_listuser thead, .details_listuser tfoot { background-color: grey; }
  325. .details_listuser th, .details_listuser td { border: 1px solid black; padding: 8px 10px; }
  326. .details_listuser td:last-of-type { text-align: center; }
  327. /* Image Modal (pour la liste des livres) */
  328. .image-modal {
  329. display: none;
  330. position: fixed;
  331. z-index: 9999;
  332. padding-top: 50px;
  333. left: 0;
  334. top: 0;
  335. width: 100%;
  336. height: 100%;
  337. overflow: auto;
  338. background-color: rgba(0,0,0,0.9);
  339. }
  340. .image-modal-content {
  341. margin: auto;
  342. display: block;
  343. max-width: 80%;
  344. max-height: 80vh;
  345. animation: zoomIn 0.3s;
  346. }
  347. .image-modal-close {
  348. position: absolute;
  349. top: 15px;
  350. right: 35px;
  351. color: #f1f1f1;
  352. font-size: 40px;
  353. font-weight: bold;
  354. cursor: pointer;
  355. z-index: 10000;
  356. }
  357. .image-modal-close:hover { color: #bbb; }
  358. @keyframes zoomIn {
  359. from { transform: scale(0.5); opacity: 0; }
  360. to { transform: scale(1); opacity: 1; }
  361. }
  362. .img-cover { cursor: pointer; transition: opacity 0.3s; }
  363. .img-cover:hover { opacity: 0.7; }
  364. /* User Avatar Styles */
  365. .user-menu-btn {
  366. display: flex;
  367. align-items: center;
  368. text-decoration: none;
  369. color: white;
  370. padding: 5px 10px;
  371. border-radius: 25px;
  372. transition: background-color 0.2s;
  373. }
  374. .user-menu-btn:hover {
  375. background-color: rgba(255,255,255,0.2);
  376. text-decoration: none;
  377. color: white;
  378. }
  379. .user-avatar {
  380. width: 36px;
  381. height: 36px;
  382. border-radius: 50%;
  383. background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
  384. display: flex;
  385. align-items: center;
  386. justify-content: center;
  387. border: 2px solid rgba(255,255,255,0.8);
  388. box-shadow: 0 2px 8px rgba(0,0,0,0.2);
  389. }
  390. .user-avatar-img {
  391. width: 100%;
  392. height: 100%;
  393. border-radius: 50%;
  394. object-fit: cover;
  395. }
  396. .user-avatar-initials {
  397. color: white;
  398. font-weight: bold;
  399. font-size: 14px;
  400. text-transform: uppercase;
  401. }
  402. .user-name {
  403. font-weight: 500;
  404. font-size: 14px;
  405. }
  406. .dropdown-header {
  407. padding: 10px 15px;
  408. background-color: #f8f9fa;
  409. }
  410. /* Navbar Brand Dropdown */
  411. .navbar-brand.dropdown-toggle {
  412. cursor: pointer;
  413. }
  414. .navbar-brand.dropdown-toggle::after {
  415. margin-left: 8px;
  416. }
  417. </style>
  418. ";
  419. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  420. $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  421. yield from [];
  422. }
  423. // line 260
  424. /**
  425. * @return iterable<null|scalar|\Stringable>
  426. */
  427. public function block_body(array $context, array $blocks = []): iterable
  428. {
  429. $macros = $this->macros;
  430. $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  431. $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "body"));
  432. $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  433. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "body"));
  434. // line 261
  435. yield "
  436. ";
  437. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  438. $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  439. yield from [];
  440. }
  441. // line 269
  442. /**
  443. * @return iterable<null|scalar|\Stringable>
  444. */
  445. public function block_javascripts(array $context, array $blocks = []): iterable
  446. {
  447. $macros = $this->macros;
  448. $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  449. $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "javascripts"));
  450. $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  451. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "javascripts"));
  452. // line 270
  453. yield " <script src=\"https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js\"></script>
  454. <script src=\"https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js\"></script>
  455. ";
  456. $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  457. $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  458. yield from [];
  459. }
  460. /**
  461. * @codeCoverageIgnore
  462. */
  463. public function getTemplateName(): string
  464. {
  465. return "base.html.twig";
  466. }
  467. /**
  468. * @codeCoverageIgnore
  469. */
  470. public function isTraitable(): bool
  471. {
  472. return false;
  473. }
  474. /**
  475. * @codeCoverageIgnore
  476. */
  477. public function getDebugInfo(): array
  478. {
  479. return array ( 501 => 270, 488 => 269, 476 => 261, 463 => 260, 270 => 8, 257 => 7, 234 => 6, 221 => 273, 219 => 269, 216 => 268, 213 => 267, 210 => 266, 208 => 265, 204 => 263, 202 => 260, 199 => 259, 190 => 256, 187 => 255, 183 => 254, 179 => 252, 173 => 249, 170 => 248, 161 => 242, 154 => 238, 148 => 235, 141 => 231, 135 => 228, 129 => 227, 121 => 222, 118 => 221, 111 => 219, 103 => 217, 101 => 216, 96 => 213, 94 => 212, 83 => 204, 77 => 201, 65 => 191, 63 => 7, 59 => 6, 52 => 1,);
  480. }
  481. public function getSourceContext(): Source
  482. {
  483. return new Source("<!DOCTYPE html>
  484. <html>
  485. <head>
  486. <meta charset=\"UTF-8\">
  487. <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">
  488. <title>{% block title %}BDD-Books{% endblock %}</title>
  489. {% block stylesheets %}
  490. <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/css/bootstrap.min.css\">
  491. <link rel=\"stylesheet\" href=\"https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css\">
  492. <style>
  493. /* Variables et styles globaux */
  494. :root {
  495. --primary-color: #4a90d9;
  496. --secondary-color: #6c757d;
  497. --success-color: #28a745;
  498. --bg-light: #f8f9fa;
  499. --shadow: 0 2px 10px rgba(0,0,0,0.1);
  500. }
  501. body { background-color: #f5f7fa; }
  502. /* _index.scss */
  503. #list_user { padding: 3%; }
  504. #list_user #users { text-align: center; }
  505. #list_user .logo { width: auto; height: 150px; }
  506. #list_user #div-btn-user { width: 100%; margin: auto; padding-top: 2%; padding-bottom: 1%; }
  507. #list_user #btn-user { text-align: center; width: 250px; height: 250px; }
  508. .navbar { width: 100%; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%) !important; box-shadow: var(--shadow); }
  509. .navbar .navbar-brand { color: white !important; font-weight: bold; font-size: 1.5rem; }
  510. .navbar .btn-outline-secondary { color: white; border-color: rgba(255,255,255,0.5); }
  511. .navbar .btn-outline-secondary:hover { background-color: rgba(255,255,255,0.2); color: white; }
  512. .navbar .btn-outline-primary { color: white; border-color: white; }
  513. .navbar .btn-outline-primary:hover { background-color: white; color: #667eea; }
  514. #circleUser { width: 30px; height: 30px; color: white; }
  515. #bodyContain { padding-top: 20px; }
  516. #titleListe { margin: 0 20px; }
  517. #acceuilSite { padding-top: 20px; justify-content: center; margin-right: 5%; margin-left: 5%; max-width: 1200px; margin: 20px auto; }
  518. #acceuilSite h2 { font-size: 2rem; text-align: center; padding-bottom: 10px; color: #333; }
  519. #acceuilSite .btn { margin-bottom: 10px; }
  520. #acceuilSite #cameraButton { position: absolute; top: 0; border-radius: 5px; right: 18px; z-index: 2; border: none; height: 38px; cursor: pointer; transform: translateX(2px); }
  521. #acceuilSite #divSearchButton { padding-top: 15px; }
  522. #acceuilSite #selectuser { padding-top: 15px; }
  523. .row { padding-bottom: 15px; }
  524. /* Cards améliorées */
  525. .card { border: none; border-radius: 12px; box-shadow: var(--shadow); transition: transform 0.2s, box-shadow 0.2s; }
  526. .card:hover { transform: translateY(-2px); box-shadow: 0 4px 20px rgba(0,0,0,0.15); }
  527. .card-header { border-radius: 12px 12px 0 0 !important; }
  528. /* _tablivres.scss */
  529. #tableBook { padding: 20px; background: white; border-radius: 12px; box-shadow: var(--shadow); margin: 0 20px; }
  530. #tableBook table { margin-bottom: 0; }
  531. #tableBook thead th { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border: none; padding: 15px 10px; font-weight: 500; }
  532. #tableBook thead th a { color: white; text-decoration: none; }
  533. #tableBook thead th a:hover { color: #ddd; }
  534. #tableBook tbody tr { transition: background-color 0.2s; }
  535. #tableBook tbody tr:hover { background-color: #f8f9fa; }
  536. #tableBook tbody td { vertical-align: middle; padding: 10px; border-color: #eee; }
  537. #tableBook tbody > tr { height: auto; min-height: 120px; }
  538. @media only screen and (max-device-width: 900px) {
  539. #tableBook { padding: 10px; margin: 0 10px; }
  540. #tableBook tr th:nth-child(3), #tableBook tr td:nth-child(3),
  541. #tableBook tr th:nth-child(4), #tableBook tr td:nth-child(4),
  542. #tableBook tr th:nth-child(5), #tableBook tr td:nth-child(5),
  543. #tableBook tr th:nth-child(6), #tableBook tr td:nth-child(6) { display: none; }
  544. }
  545. .pagination { display: flex; flex-wrap: wrap; padding: 20px 0; list-style: none; border-radius: 0.25rem; justify-content: center; }
  546. .pagination .page-link { border-radius: 8px; margin: 0 3px; border: none; color: #667eea; }
  547. .pagination .page-item.active .page-link { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border: none; }
  548. .indexAuteur { flex-wrap: wrap; display: flex; padding-left: 0; list-style: none; border-radius: 0.25rem; justify-content: center; }
  549. #myImg { border-radius: 8px; cursor: pointer; transition: 0.3s; }
  550. #myImg:hover { opacity: 0.7; }
  551. #caption { margin: auto; display: block; width: 80%; max-width: 700px; text-align: center; color: #ccc; padding: 10px 0; height: 150px; }
  552. /* Images de couverture dans le tableau */
  553. .img-cover { border-radius: 8px; box-shadow: 0 2px 8px rgba(0,0,0,0.15); transition: transform 0.2s, box-shadow 0.2s; }
  554. .img-cover:hover { transform: scale(1.05); box-shadow: 0 4px 15px rgba(0,0,0,0.25); }
  555. /* Fix input-group alignment */
  556. .border-right-0 { border-right: 0 !important; }
  557. .border-left-0 { border-left: 0 !important; }
  558. .input-group-lg > .input-group-prepend > .input-group-text,
  559. .input-group-lg > .input-group-append > .btn {
  560. height: 100%;
  561. display: flex;
  562. align-items: center;
  563. }
  564. /* _livres.scss */
  565. #titleLivre { text-align: center; margin-bottom: 30px; }
  566. .detail-infos th, .detail-infos td { padding: 5px; }
  567. .cover { display: block; margin-left: auto; margin-right: auto; margin-bottom: 30px; }
  568. .details_listuser { border-collapse: collapse; border: 2px solid black; font-family: sans-serif; font-size: 0.8rem; letter-spacing: 1px; }
  569. .details_listuser thead, .details_listuser tfoot { background-color: grey; }
  570. .details_listuser th, .details_listuser td { border: 1px solid black; padding: 8px 10px; }
  571. .details_listuser td:last-of-type { text-align: center; }
  572. /* Image Modal (pour la liste des livres) */
  573. .image-modal {
  574. display: none;
  575. position: fixed;
  576. z-index: 9999;
  577. padding-top: 50px;
  578. left: 0;
  579. top: 0;
  580. width: 100%;
  581. height: 100%;
  582. overflow: auto;
  583. background-color: rgba(0,0,0,0.9);
  584. }
  585. .image-modal-content {
  586. margin: auto;
  587. display: block;
  588. max-width: 80%;
  589. max-height: 80vh;
  590. animation: zoomIn 0.3s;
  591. }
  592. .image-modal-close {
  593. position: absolute;
  594. top: 15px;
  595. right: 35px;
  596. color: #f1f1f1;
  597. font-size: 40px;
  598. font-weight: bold;
  599. cursor: pointer;
  600. z-index: 10000;
  601. }
  602. .image-modal-close:hover { color: #bbb; }
  603. @keyframes zoomIn {
  604. from { transform: scale(0.5); opacity: 0; }
  605. to { transform: scale(1); opacity: 1; }
  606. }
  607. .img-cover { cursor: pointer; transition: opacity 0.3s; }
  608. .img-cover:hover { opacity: 0.7; }
  609. /* User Avatar Styles */
  610. .user-menu-btn {
  611. display: flex;
  612. align-items: center;
  613. text-decoration: none;
  614. color: white;
  615. padding: 5px 10px;
  616. border-radius: 25px;
  617. transition: background-color 0.2s;
  618. }
  619. .user-menu-btn:hover {
  620. background-color: rgba(255,255,255,0.2);
  621. text-decoration: none;
  622. color: white;
  623. }
  624. .user-avatar {
  625. width: 36px;
  626. height: 36px;
  627. border-radius: 50%;
  628. background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
  629. display: flex;
  630. align-items: center;
  631. justify-content: center;
  632. border: 2px solid rgba(255,255,255,0.8);
  633. box-shadow: 0 2px 8px rgba(0,0,0,0.2);
  634. }
  635. .user-avatar-img {
  636. width: 100%;
  637. height: 100%;
  638. border-radius: 50%;
  639. object-fit: cover;
  640. }
  641. .user-avatar-initials {
  642. color: white;
  643. font-weight: bold;
  644. font-size: 14px;
  645. text-transform: uppercase;
  646. }
  647. .user-name {
  648. font-weight: 500;
  649. font-size: 14px;
  650. }
  651. .dropdown-header {
  652. padding: 10px 15px;
  653. background-color: #f8f9fa;
  654. }
  655. /* Navbar Brand Dropdown */
  656. .navbar-brand.dropdown-toggle {
  657. cursor: pointer;
  658. }
  659. .navbar-brand.dropdown-toggle::after {
  660. margin-left: 8px;
  661. }
  662. </style>
  663. {% endblock %}
  664. </head>
  665. <body>
  666. <nav class=\"navbar navbar-light bg-light\">
  667. <div class=\"d-flex align-items-center\">
  668. <!-- Liste déroulante BDD-Books / BDD-Magazines -->
  669. <div class=\"dropdown mr-3\">
  670. <a class=\"navbar-brand dropdown-toggle\" href=\"#\" id=\"navbarBddDropdown\" data-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">
  671. <i class=\"fas fa-database mr-1\"></i>BDD
  672. </a>
  673. <div class=\"dropdown-menu\" aria-labelledby=\"navbarBddDropdown\">
  674. <a class=\"dropdown-item\" href=\"{{ path('index') }}\">
  675. <i class=\"fas fa-book mr-2 text-primary\"></i>BDD-Books
  676. </a>
  677. <a class=\"dropdown-item\" href=\"{{ path('magazines_search') }}\">
  678. <i class=\"fas fa-newspaper mr-2 text-success\"></i>BDD-Magazines
  679. </a>
  680. </div>
  681. </div>
  682. </div>
  683. <div class=\"d-flex align-items-center\">
  684. {% if is_granted('IS_AUTHENTICATED_REMEMBERED') %}
  685. <div class=\"dropdown\">
  686. <a class=\"user-menu-btn\" href=\"#\" id=\"navbarDropdownMenuLink\" data-toggle=\"dropdown\" aria-haspopup=\"true\" aria-expanded=\"false\">
  687. <div class=\"user-avatar\">
  688. {% if app.user.logo %}
  689. <img src=\"{{ asset('uploads/avatars/' ~ app.user.logo) }}\" alt=\"{{ app.user.username }}\" class=\"user-avatar-img\">
  690. {% else %}
  691. <span class=\"user-avatar-initials\">{{ app.user.name|first|upper }}{{ app.user.lastname|first|upper }}</span>
  692. {% endif %}
  693. </div>
  694. <span class=\"user-name d-none d-md-inline ml-2\">{{ app.user.username }}</span>
  695. <i class=\"fas fa-chevron-down ml-1 small\"></i>
  696. </a>
  697. <div class=\"dropdown-menu dropdown-menu-right\" aria-labelledby=\"navbarDropdownMenuLink\">
  698. <div class=\"dropdown-header\">
  699. <strong>{{ app.user.name }} {{ app.user.lastname }}</strong>
  700. <br><small class=\"text-muted\">{{ app.user.email }}</small>
  701. </div>
  702. <div class=\"dropdown-divider\"></div>
  703. <a class=\"dropdown-item\" href=\"{{ path('user_profile') }}\">
  704. <i class=\"fas fa-user-cog mr-2\"></i>Mon profil
  705. </a>
  706. <div class=\"dropdown-divider\"></div>
  707. <a class=\"dropdown-item\" href=\"{{ path('magazines_list') }}\">
  708. <i class=\"fas fa-newspaper mr-2\"></i>Magazines
  709. </a>
  710. <a class=\"dropdown-item\" href=\"{{ path('listesLivres') }}\">
  711. <i class=\"fas fa-book mr-2\"></i>Livres
  712. </a>
  713. <div class=\"dropdown-divider\"></div>
  714. <a class=\"dropdown-item text-danger\" href=\"{{ path('app_logout') }}\">
  715. <i class=\"fas fa-sign-out-alt mr-2\"></i>Déconnexion
  716. </a>
  717. </div>
  718. </div>
  719. {% else %}
  720. <button class=\"btn btn-outline-primary btn-sm\" data-toggle=\"modal\" data-target=\"#loginModal\">
  721. <i class=\"fas fa-sign-in-alt mr-1\"></i>{{ 'Connexion' }}
  722. </button>
  723. {% endif %}
  724. </div>
  725. </nav>
  726. {% for message in app.flashes('warning') %}
  727. <div class=\"alert alert-success\">
  728. {{ message }}
  729. </div>
  730. {% endfor %}
  731. <div id=\"bodyContain\">
  732. {% block body %}
  733. {% endblock %}
  734. </div>
  735. {% if not is_granted('IS_AUTHENTICATED_REMEMBERED') %}
  736. {% include 'includes/loginModal.html.twig' %}
  737. {% endif %}
  738. {% block javascripts %}
  739. <script src=\"https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.min.js\"></script>
  740. <script src=\"https://cdn.jsdelivr.net/npm/bootstrap@4.6.2/dist/js/bootstrap.bundle.min.js\"></script>
  741. {% endblock %}
  742. </body>
  743. </html>
  744. ", "base.html.twig", "/home/jla23/project/DEV/Bdd-Books-DEV/templates/base.html.twig");
  745. }
  746. }