var/cache/dev/twig/84/84bb0ccf4e71a0637706afe4cb4858b5.php line 58

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. /* Parent/LoginParent.html.twig */
  16. class __TwigTemplate_37bb9239606940e257554a0bc0386491 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.             'stylesheets' => [$this'block_stylesheets'],
  30.             'Header' => [$this'block_Header'],
  31.             'Content' => [$this'block_Content'],
  32.             'Footer' => [$this'block_Footer'],
  33.             'javascript' => [$this'block_javascript'],
  34.         ];
  35.     }
  36.     protected function doGetParent(array $context): bool|string|Template|TemplateWrapper
  37.     {
  38.         // line 1
  39.         return "Accueil/layoutAccueil.html.twig";
  40.     }
  41.     protected function doDisplay(array $context, array $blocks = []): iterable
  42.     {
  43.         $macros $this->macros;
  44.         $__internal_5a27a8ba21ca79b61932376b2fa922d2 $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  45.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "template""Parent/LoginParent.html.twig"));
  46.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  47.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "template""Parent/LoginParent.html.twig"));
  48.         $this->parent $this->load("Accueil/layoutAccueil.html.twig"1);
  49.         yield from $this->parent->unwrap()->yield($contextarray_merge($this->blocks$blocks));
  50.         
  51.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  52.         
  53.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  54.     }
  55.     // line 3
  56.     /**
  57.      * @return iterable<null|scalar|\Stringable>
  58.      */
  59.     public function block_title(array $context, array $blocks = []): iterable
  60.     {
  61.         $macros $this->macros;
  62.         $__internal_5a27a8ba21ca79b61932376b2fa922d2 $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  63.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""title"));
  64.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  65.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""title"));
  66.         yield "Connexion Parent — 5sur5séjour";
  67.         
  68.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  69.         
  70.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  71.         yield from [];
  72.     }
  73.     // line 5
  74.     /**
  75.      * @return iterable<null|scalar|\Stringable>
  76.      */
  77.     public function block_stylesheets(array $context, array $blocks = []): iterable
  78.     {
  79.         $macros $this->macros;
  80.         $__internal_5a27a8ba21ca79b61932376b2fa922d2 $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  81.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""stylesheets"));
  82.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  83.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""stylesheets"));
  84.         // line 6
  85.         yield from $this->yieldParentBlock("stylesheets"$context$blocks);
  86.         yield "
  87. <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/sweetalert2@11/dist/sweetalert2.min.css\">
  88. <style>
  89. /* ========================================
  90.    5SUR5 PARENT LOGIN - CLEAN TWO-COLUMN
  91.    Stripe/Notion Quality · No Slider
  92.    ======================================== */
  93. :root {
  94.     --pl-teal: #41A2AA;
  95.     --pl-teal-dark: #359BA3;
  96.     --pl-teal-light: rgba(65, 162, 170, 0.06);
  97.     --pl-orange: #F09E7A;
  98.     --pl-orange-dark: #E8865E;
  99.     --pl-text: #1A1A2E;
  100.     --pl-text-secondary: #5A6178;
  101.     --pl-text-muted: #8E95A9;
  102.     --pl-bg: #FFFFFF;
  103.     --pl-bg-hero: #F8FAFB;
  104.     --pl-border: #E5E9F0;
  105.     --pl-shadow: 0 4px 24px rgba(0, 0, 0, 0.08);
  106.     --pl-radius: 16px;
  107. }
  108. * {
  109.     box-sizing: border-box;
  110. }
  111. .pl-page {
  112.     min-height: 100vh;
  113.     display: flex;
  114.     flex-direction: column;
  115. }
  116. /* ========================================
  117.    MAIN CONTAINER - TWO COLUMNS
  118.    ======================================== */
  119. .pl-main {
  120.     flex: 1;
  121.     display: flex;
  122.     min-height: calc(100vh - 160px);
  123. }
  124. /* ========================================
  125.    LEFT COLUMN - HERO
  126.    ======================================== */
  127. .pl-hero {
  128.     width: 35%;
  129.     background: var(--pl-bg-hero);
  130.     padding: 40px;
  131.     display: flex;
  132.     flex-direction: column;
  133.     justify-content: center;
  134.     position: relative;
  135. }
  136. .pl-hero-content {
  137.     flex: 1;
  138.     display: flex;
  139.     flex-direction: column;
  140.     justify-content: center;
  141.     max-width: 420px;
  142. }
  143. .pl-hero h1 {
  144.     font-size: 32px;
  145.     font-weight: 700;
  146.     color: var(--pl-text);
  147.     line-height: 1.25;
  148.     margin: 0 0 16px;
  149.     letter-spacing: -0.02em;
  150. }
  151. .pl-hero-subtitle {
  152.     font-size: 17px;
  153.     color: var(--pl-text-secondary);
  154.     line-height: 1.6;
  155.     margin: 0 0 32px;
  156. }
  157. /* Features List - Premium Style */
  158. .pl-features {
  159.     list-style: none;
  160.     padding: 0;
  161.     margin: 0;
  162.     display: flex;
  163.     flex-direction: column;
  164.     gap: 18px;
  165. }
  166. .pl-feature {
  167.     display: flex;
  168.     align-items: flex-start;
  169.     gap: 14px;
  170. }
  171. .pl-feature-icon {
  172.     width: 44px;
  173.     height: 44px;
  174.     border-radius: 12px;
  175.     display: flex;
  176.     align-items: center;
  177.     justify-content: center;
  178.     flex-shrink: 0;
  179. }
  180. .pl-feature-icon svg {
  181.     width: 22px;
  182.     height: 22px;
  183.     color: #fff;
  184. }
  185. .pl-feature-icon.teal { background: var(--pl-teal); }
  186. .pl-feature-icon.orange { background: var(--pl-orange); }
  187. .pl-feature-icon.coral { background: #F56040; }
  188. .pl-feature-icon.brown { background: #c47d5e; }
  189. .pl-feature-text {
  190.     padding-top: 2px;
  191. }
  192. .pl-feature-title {
  193.     font-size: 14px;
  194.     font-weight: 600;
  195.     color: var(--pl-text);
  196.     margin: 0 0 3px;
  197. }
  198. .pl-feature-desc {
  199.     font-size: 13px;
  200.     color: var(--pl-text-muted);
  201.     margin: 0;
  202.     line-height: 1.4;
  203. }
  204. /* Hero image */
  205. .pl-hero-image {
  206.     margin-top: auto;
  207.     border-radius: 12px;
  208.     overflow: hidden;
  209. }
  210. .pl-hero-image img {
  211.     width: 100%;
  212.     height: auto;
  213.     display: block;
  214.     border-radius: 12px;
  215. }
  216. /* Hero decorative illustration */
  217. .pl-hero-illustration {
  218.     margin-top: auto;
  219.     padding-top: 40px;
  220.     position: relative;
  221. }
  222. .pl-hero-illustration svg {
  223.     width: 100%;
  224.     max-width: 320px;
  225.     height: auto;
  226.     opacity: 0.9;
  227. }
  228. /* Floating badges */
  229. .pl-floating-badges {
  230.     position: absolute;
  231.     inset: 0;
  232.     pointer-events: none;
  233. }
  234. .pl-badge {
  235.     position: absolute;
  236.     background: #fff;
  237.     border-radius: 12px;
  238.     padding: 10px 14px;
  239.     box-shadow: 0 8px 32px rgba(0, 0, 0, 0.12);
  240.     display: flex;
  241.     align-items: center;
  242.     gap: 10px;
  243.     font-size: 13px;
  244.     font-weight: 500;
  245.     color: var(--pl-text);
  246.     animation: plFloat 3s ease-in-out infinite;
  247. }
  248. .pl-badge-icon {
  249.     width: 32px;
  250.     height: 32px;
  251.     border-radius: 8px;
  252.     display: flex;
  253.     align-items: center;
  254.     justify-content: center;
  255. }
  256. .pl-badge-icon svg {
  257.     width: 18px;
  258.     height: 18px;
  259.     color: #fff;
  260. }
  261. .pl-badge-icon.teal { background: var(--pl-teal); }
  262. .pl-badge-icon.orange { background: var(--pl-orange); }
  263. .pl-badge-icon.coral { background: #F56040; }
  264. .pl-badge-1 {
  265.     top: 20%;
  266.     right: -10px;
  267.     animation-delay: 0s;
  268. }
  269. .pl-badge-2 {
  270.     bottom: 30%;
  271.     left: -5px;
  272.     animation-delay: 1s;
  273. }
  274. .pl-badge-3 {
  275.     bottom: 10%;
  276.     right: 10%;
  277.     animation-delay: 2s;
  278. }
  279. @keyframes plFloat {
  280.     0%, 100% { transform: translateY(0); }
  281.     50% { transform: translateY(-8px); }
  282. }
  283. /* Entry animations */
  284. .pl-hero-content {
  285.     animation: plSlideRight 0.6s ease-out;
  286. }
  287. .pl-card {
  288.     animation: plSlideUp 0.5s ease-out;
  289. }
  290. @keyframes plSlideRight {
  291.     from { opacity: 0; transform: translateX(-20px); }
  292.     to { opacity: 1; transform: translateX(0); }
  293. }
  294. @keyframes plSlideUp {
  295.     from { opacity: 0; transform: translateY(20px); }
  296.     to { opacity: 1; transform: translateY(0); }
  297. }
  298. /* Feature items staggered animation */
  299. .pl-feature {
  300.     opacity: 0;
  301.     animation: plFadeIn 0.4s ease forwards;
  302. }
  303. .pl-feature:nth-child(1) { animation-delay: 0.1s; }
  304. .pl-feature:nth-child(2) { animation-delay: 0.2s; }
  305. .pl-feature:nth-child(3) { animation-delay: 0.3s; }
  306. .pl-feature:nth-child(4) { animation-delay: 0.4s; }
  307. /* ========================================
  308.    RIGHT COLUMN - FORM
  309.    ======================================== */
  310. .pl-form-section {
  311.     width: 58%;
  312.     display: flex;
  313.     align-items: center;
  314.     justify-content: center;
  315.     padding: 40px;
  316.     background: var(--pl-bg);
  317. }
  318. .pl-card {
  319.     width: 100%;
  320.     max-width: 420px;
  321.     background: var(--pl-bg);
  322.     border-radius: var(--pl-radius);
  323.     box-shadow: var(--pl-shadow);
  324.     border: 1px solid var(--pl-border);
  325.     overflow: hidden;
  326. }
  327. /* Tabs */
  328. .pl-tabs {
  329.     display: flex;
  330.     border-bottom: 1px solid var(--pl-border);
  331. }
  332. .pl-tab {
  333.     flex: 1;
  334.     padding: 18px 16px;
  335.     font-size: 14px;
  336.     font-weight: 600;
  337.     color: var(--pl-text-muted);
  338.     background: var(--pl-bg-hero);
  339.     border: none;
  340.     cursor: pointer;
  341.     position: relative;
  342.     transition: all 0.2s ease;
  343. }
  344. .pl-tab:hover {
  345.     color: var(--pl-text-secondary);
  346. }
  347. .pl-tab.active {
  348.     color: var(--pl-teal);
  349.     background: var(--pl-bg);
  350. }
  351. .pl-tab.active::after {
  352.     content: '';
  353.     position: absolute;
  354.     bottom: -1px;
  355.     left: 0;
  356.     right: 0;
  357.     height: 2px;
  358.     background: var(--pl-teal);
  359. }
  360. .pl-tab:focus-visible {
  361.     outline: 2px solid var(--pl-teal);
  362.     outline-offset: -2px;
  363. }
  364. .pl-btn:focus-visible,
  365. .pl-social-btn:focus-visible {
  366.     outline: 2px solid var(--pl-teal);
  367.     outline-offset: 2px;
  368. }
  369. /* Tab panels */
  370. .pl-panel {
  371.     padding: 28px;
  372.     display: none;
  373. }
  374. .pl-panel.active {
  375.     display: block;
  376.     animation: plFadeIn 0.25s ease;
  377. }
  378. @keyframes plFadeIn {
  379.     from { opacity: 0; transform: translateY(6px); }
  380.     to { opacity: 1; transform: translateY(0); }
  381. }
  382. /* Form elements */
  383. .pl-form-group {
  384.     margin-bottom: 18px;
  385. }
  386. .pl-label {
  387.     display: block;
  388.     font-size: 13px;
  389.     font-weight: 500;
  390.     color: var(--pl-text);
  391.     margin-bottom: 6px;
  392. }
  393. .pl-input {
  394.     width: 100%;
  395.     padding: 12px 14px;
  396.     font-size: 15px;
  397.     font-family: inherit;
  398.     color: var(--pl-text);
  399.     background: var(--pl-bg);
  400.     border: 1px solid var(--pl-border);
  401.     border-radius: 8px;
  402.     transition: all 0.2s ease;
  403.     outline: none;
  404. }
  405. .pl-input::placeholder {
  406.     color: var(--pl-text-muted);
  407. }
  408. .pl-input:hover {
  409.     border-color: #D0D6E0;
  410. }
  411. .pl-input:focus {
  412.     border-color: var(--pl-teal);
  413.     box-shadow: 0 0 0 3px var(--pl-teal-light);
  414. }
  415. .pl-input.is-invalid {
  416.     border-color: #EF4444;
  417.     background: #FEF2F2;
  418. }
  419. .pl-input.is-valid {
  420.     border-color: #10B981;
  421.     background: rgba(16, 185, 129, 0.04);
  422. }
  423. .pl-hint {
  424.     font-size: 12px;
  425.     color: var(--pl-text-muted);
  426.     margin-top: 5px;
  427.     display: flex;
  428.     align-items: center;
  429.     gap: 4px;
  430. }
  431. /* Password wrapper */
  432. .pl-password-wrap {
  433.     position: relative;
  434. }
  435. .pl-password-wrap .pl-input {
  436.     padding-right: 44px;
  437. }
  438. .pl-eye-btn {
  439.     position: absolute;
  440.     right: 12px;
  441.     top: 50%;
  442.     transform: translateY(-50%);
  443.     background: none;
  444.     border: none;
  445.     padding: 4px;
  446.     cursor: pointer;
  447.     color: var(--pl-text-muted);
  448.     transition: color 0.2s ease;
  449. }
  450. .pl-eye-btn:hover {
  451.     color: var(--pl-teal);
  452. }
  453. /* Row for name fields */
  454. .pl-row {
  455.     display: flex;
  456.     gap: 12px;
  457. }
  458. .pl-row .pl-form-group {
  459.     flex: 1;
  460. }
  461. /* Primary button */
  462. .pl-btn {
  463.     width: 100%;
  464.     padding: 14px 20px;
  465.     font-size: 15px;
  466.     font-weight: 600;
  467.     font-family: inherit;
  468.     color: #FFF;
  469.     background: linear-gradient(135deg, var(--pl-teal) 0%, var(--pl-teal-dark) 100%);
  470.     border: none;
  471.     border-radius: 8px;
  472.     cursor: pointer;
  473.     transition: all 0.2s ease, transform 0.15s ease;
  474.     box-shadow: 0 2px 8px rgba(65, 162, 170, 0.3);
  475. }
  476. .pl-btn:hover {
  477.     background: linear-gradient(135deg, var(--pl-teal-dark) 0%, #2E8E96 100%);
  478.     box-shadow: 0 4px 16px rgba(65, 162, 170, 0.4);
  479.     transform: translateY(-1px);
  480. }
  481. .pl-btn:active {
  482.     transform: scale(0.98);
  483. }
  484. .pl-btn:disabled {
  485.     opacity: 0.7;
  486.     cursor: not-allowed;
  487. }
  488. .pl-btn-secondary {
  489.     background: linear-gradient(135deg, var(--pl-orange) 0%, var(--pl-orange-dark) 100%);
  490.     box-shadow: 0 2px 8px rgba(240, 158, 122, 0.3);
  491. }
  492. .pl-btn-secondary:hover {
  493.     background: linear-gradient(135deg, var(--pl-orange-dark) 0%, #D67A50 100%);
  494.     box-shadow: 0 4px 16px rgba(240, 158, 122, 0.4);
  495. }
  496. /* Button loading state */
  497. .pl-btn-loading {
  498.     position: relative;
  499.     color: transparent !important;
  500. }
  501. .pl-btn-loading::after {
  502.     content: '';
  503.     position: absolute;
  504.     width: 20px;
  505.     height: 20px;
  506.     top: 50%;
  507.     left: 50%;
  508.     margin-left: -10px;
  509.     margin-top: -10px;
  510.     border: 2px solid rgba(255,255,255,0.3);
  511.     border-top-color: #fff;
  512.     border-radius: 50%;
  513.     animation: plSpin 0.6s linear infinite;
  514. }
  515. /* Forgot link */
  516. .pl-forgot {
  517.     display: inline-block;
  518.     font-size: 13px;
  519.     color: var(--pl-orange);
  520.     margin-top: 12px;
  521.     text-decoration: none;
  522.     transition: color 0.2s ease;
  523. }
  524. .pl-forgot:hover {
  525.     color: var(--pl-orange-dark);
  526.     text-decoration: underline;
  527. }
  528. /* Divider */
  529. .pl-divider {
  530.     display: flex;
  531.     align-items: center;
  532.     margin: 24px 0;
  533.     gap: 14px;
  534. }
  535. .pl-divider-line {
  536.     flex: 1;
  537.     height: 1px;
  538.     background: var(--pl-border);
  539. }
  540. .pl-divider-text {
  541.     font-size: 12px;
  542.     font-weight: 500;
  543.     color: var(--pl-text-muted);
  544.     text-transform: uppercase;
  545.     letter-spacing: 0.04em;
  546. }
  547. /* Social buttons */
  548. .pl-socials {
  549.     display: flex;
  550.     flex-direction: column;
  551.     gap: 10px;
  552. }
  553. .pl-social-btn {
  554.     width: 100%;
  555.     padding: 11px 16px;
  556.     font-size: 14px;
  557.     font-weight: 500;
  558.     font-family: inherit;
  559.     border-radius: 8px;
  560.     cursor: pointer;
  561.     transition: all 0.2s ease, transform 0.15s ease;
  562.     display: flex;
  563.     align-items: center;
  564.     justify-content: center;
  565.     gap: 10px;
  566.     text-decoration: none;
  567. }
  568. .pl-social-btn img {
  569.     width: 18px;
  570.     height: 18px;
  571. }
  572. .pl-social-google {
  573.     background: var(--pl-bg);
  574.     color: var(--pl-text);
  575.     border: 1px solid var(--pl-border);
  576. }
  577. .pl-social-google:hover {
  578.     background: var(--pl-bg-hero);
  579.     border-color: #D0D6E0;
  580. }
  581. .pl-social-facebook {
  582.     background: #1877F2;
  583.     color: #FFF;
  584.     border: 1px solid #1877F2;
  585. }
  586. .pl-social-facebook:hover {
  587.     background: #166FE5;
  588.     transform: translateY(-1px);
  589.     box-shadow: 0 4px 12px rgba(24, 119, 242, 0.3);
  590. }
  591. .pl-social-google:hover {
  592.     transform: translateY(-1px);
  593.     box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
  594. }
  595. /* Notification prefs (compact) */
  596. .pl-notif-box {
  597.     background: var(--pl-bg-hero);
  598.     border-radius: 8px;
  599.     padding: 12px 14px;
  600.     margin-bottom: 18px;
  601. }
  602. .pl-notif-label {
  603.     font-size: 12px;
  604.     font-weight: 500;
  605.     color: var(--pl-text-secondary);
  606.     margin-bottom: 8px;
  607. }
  608. .pl-notif-opts {
  609.     display: flex;
  610.     gap: 20px;
  611. }
  612. .pl-checkbox {
  613.     display: flex;
  614.     align-items: center;
  615.     gap: 6px;
  616.     font-size: 13px;
  617.     color: var(--pl-text);
  618.     cursor: pointer;
  619. }
  620. .pl-checkbox input {
  621.     width: 16px;
  622.     height: 16px;
  623.     accent-color: var(--pl-teal);
  624.     cursor: pointer;
  625. }
  626. /* Form note */
  627. .pl-note {
  628.     font-size: 12px;
  629.     color: var(--pl-text-muted);
  630.     text-align: center;
  631.     margin-top: 14px;
  632.     line-height: 1.5;
  633. }
  634. .pl-input-code {
  635.     font-family: 'SF Mono', 'Monaco', 'Consolas', monospace;
  636.     font-size: 18px;
  637.     font-weight: 600;
  638.     letter-spacing: 2px;
  639.     text-transform: uppercase;
  640.     text-align: center;
  641.     padding: 14px 16px;
  642.     background: linear-gradient(135deg, rgba(65, 162, 170, 0.04), rgba(240, 158, 122, 0.04));
  643.     border: 2px solid var(--pl-border);
  644. }
  645. .pl-input-code:focus {
  646.     border-color: var(--pl-teal);
  647.     background: var(--pl-bg);
  648. }
  649. .pl-input-code::placeholder {
  650.     font-weight: 400;
  651.     letter-spacing: 1px;
  652.     color: var(--pl-text-muted);
  653. }
  654. .pl-optional {
  655.     font-weight: 400;
  656.     color: var(--pl-text-muted);
  657. }
  658. .pl-required {
  659.     color: #EF4444;
  660.     margin-left: 2px;
  661. }
  662. /* Error alert */
  663. .pl-error {
  664.     background: #FEF2F2;
  665.     border: 1px solid #FECACA;
  666.     border-radius: 8px;
  667.     padding: 12px 14px;
  668.     margin-bottom: 18px;
  669.     font-size: 13px;
  670.     color: #991B1B;
  671.     display: flex;
  672.     align-items: center;
  673.     gap: 8px;
  674. }
  675. .pl-error svg {
  676.     flex-shrink: 0;
  677.     color: #EF4444;
  678. }
  679. /* ========================================
  680.    FOOTER TRUST BAR
  681.    ======================================== */
  682. .pl-footer-trust {
  683.     background: var(--pl-bg-hero);
  684.     border-top: 1px solid var(--pl-border);
  685.     padding: 16px 24px;
  686.     display: flex;
  687.     justify-content: center;
  688.     gap: 32px;
  689. }
  690. .pl-footer-item {
  691.     display: flex;
  692.     align-items: center;
  693.     gap: 8px;
  694.     font-size: 12px;
  695.     color: var(--pl-text-muted);
  696. }
  697. .pl-footer-item svg {
  698.     width: 16px;
  699.     height: 16px;
  700.     color: var(--pl-teal);
  701. }
  702. /* ========================================
  703.    LOADER
  704.    ======================================== */
  705. .pl-loader {
  706.     position: fixed;
  707.     inset: 0;
  708.     background: rgba(255,255,255,0.95);
  709.     z-index: 9999;
  710.     display: none;
  711.     align-items: center;
  712.     justify-content: center;
  713. }
  714. .pl-loader.active {
  715.     display: flex;
  716. }
  717. .pl-loader-inner {
  718.     text-align: center;
  719. }
  720. .pl-spinner {
  721.     width: 40px;
  722.     height: 40px;
  723.     border: 3px solid var(--pl-border);
  724.     border-top-color: var(--pl-teal);
  725.     border-radius: 50%;
  726.     animation: plSpin 0.7s linear infinite;
  727. }
  728. @keyframes plSpin {
  729.     to { transform: rotate(360deg); }
  730. }
  731. .pl-loader-text {
  732.     margin-top: 16px;
  733.     font-size: 15px;
  734.     font-weight: 600;
  735.     color: var(--pl-text);
  736. }
  737. .pl-loader-sub {
  738.     margin-top: 6px;
  739.     font-size: 13px;
  740.     color: var(--pl-text-secondary);
  741. }
  742. /* ========================================
  743.    RESPONSIVE - MOBILE
  744.    ======================================== */
  745. @media (max-width: 900px) {
  746.     .pl-main {
  747.         flex-direction: column;
  748.         min-height: auto;
  749.     }
  750.     .pl-hero {
  751.         width: 100%;
  752.         padding: 32px 24px;
  753.     }
  754.     .pl-hero-content {
  755.         max-width: 100%;
  756.         animation: none;
  757.     }
  758.     .pl-hero h1 {
  759.         font-size: 26px;
  760.     }
  761.     .pl-hero-subtitle {
  762.         font-size: 15px;
  763.         margin-bottom: 24px;
  764.     }
  765.     .pl-features {
  766.         gap: 14px;
  767.     }
  768.     .pl-feature {
  769.         animation: none;
  770.         opacity: 1;
  771.     }
  772.     .pl-feature-icon {
  773.         width: 38px;
  774.         height: 38px;
  775.     }
  776.     .pl-feature-icon svg {
  777.         width: 18px;
  778.         height: 18px;
  779.     }
  780.     .pl-feature-title {
  781.         font-size: 13px;
  782.     }
  783.     .pl-feature-desc {
  784.         font-size: 12px;
  785.     }
  786.     .pl-hero-illustration {
  787.         display: none;
  788.     }
  789.     .pl-form-section {
  790.         width: 100%;
  791.         padding: 24px 16px 40px;
  792.     }
  793.     .pl-card {
  794.         max-width: 100%;
  795.         box-shadow: none;
  796.         border: none;
  797.         animation: none;
  798.     }
  799.     .pl-panel {
  800.         padding: 24px 20px;
  801.     }
  802.     .pl-row {
  803.         flex-direction: column;
  804.         gap: 0;
  805.     }
  806.     .pl-footer-trust {
  807.         flex-wrap: wrap;
  808.         gap: 16px 24px;
  809.         justify-content: center;
  810.     }
  811. }
  812. @media (max-width: 480px) {
  813.     .pl-hero {
  814.         padding: 24px 20px;
  815.     }
  816.     .pl-hero h1 {
  817.         font-size: 22px;
  818.     }
  819.     .pl-tab {
  820.         padding: 14px 12px;
  821.         font-size: 13px;
  822.     }
  823. }
  824. </style>
  825. ";
  826.         
  827.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  828.         
  829.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  830.         yield from [];
  831.     }
  832.     // line 874
  833.     /**
  834.      * @return iterable<null|scalar|\Stringable>
  835.      */
  836.     public function block_Header(array $context, array $blocks = []): iterable
  837.     {
  838.         $macros $this->macros;
  839.         $__internal_5a27a8ba21ca79b61932376b2fa922d2 $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  840.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""Header"));
  841.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  842.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""Header"));
  843.         // line 875
  844.         yield from $this->yieldParentBlock("Header"$context$blocks);
  845.         yield "
  846. ";
  847.         
  848.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  849.         
  850.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  851.         yield from [];
  852.     }
  853.     // line 878
  854.     /**
  855.      * @return iterable<null|scalar|\Stringable>
  856.      */
  857.     public function block_Content(array $context, array $blocks = []): iterable
  858.     {
  859.         $macros $this->macros;
  860.         $__internal_5a27a8ba21ca79b61932376b2fa922d2 $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  861.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""Content"));
  862.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  863.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""Content"));
  864.         // line 879
  865.         yield "<div class=\"pl-page\">
  866.     <!-- Loader -->
  867.     <div class=\"pl-loader\" id=\"plLoader\">
  868.         <div class=\"pl-loader-inner\">
  869.             <div class=\"pl-spinner\"></div>
  870.             <p class=\"pl-loader-text\">Création de votre compte...</p>
  871.             <p class=\"pl-loader-sub\">Préparation de votre espace parent</p>
  872.         </div>
  873.     </div>
  874.     <!-- Main two-column layout -->
  875.     <main class=\"pl-main\">
  876.         <!-- LEFT: Hero -->
  877.         <section class=\"pl-hero\">
  878.             <div class=\"pl-hero-content\">
  879.                 <h1>Suivez le séjour de votre enfant en toute sérénité.</h1>
  880.                 <p class=\"pl-hero-subtitle\">Photos, vidéos et messages vocaux, dans un espace privé réservé aux familles.</p>
  881.                 <ul class=\"pl-features\">
  882.                     <li class=\"pl-feature\">
  883.                         <span class=\"pl-feature-icon orange\">
  884.                             <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">
  885.                                 <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"/>
  886.                                 <circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"/>
  887.                                 <polyline points=\"21 15 16 10 5 21\"/>
  888.                             </svg>
  889.                         </span>
  890.                         <div class=\"pl-feature-text\">
  891.                             <p class=\"pl-feature-title\">Photos & vidéos en direct</p>
  892.                             <p class=\"pl-feature-desc\">Visualisez les moments du séjour en toute confidentialité</p>
  893.                         </div>
  894.                     </li>
  895.                     <li class=\"pl-feature\">
  896.                         <span class=\"pl-feature-icon teal\">
  897.                             <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">
  898.                                 <path d=\"M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72\"/>
  899.                             </svg>
  900.                         </span>
  901.                         <div class=\"pl-feature-text\">
  902.                             <p class=\"pl-feature-title\">Messages vocaux</p>
  903.                             <p class=\"pl-feature-desc\">Accédez à l’ensemble des messages vocaux enregistrés, en illimité.</p>
  904.                         </div>
  905.                     </li>
  906.                     <li class=\"pl-feature\">
  907.                         <span class=\"pl-feature-icon coral\">
  908.                             <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">
  909.                                 <path d=\"M20 12v6a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2v-6\"/>
  910.                                 <rect x=\"6\" y=\"5\" width=\"12\" height=\"7\"/>
  911.                                 <path d=\"M12 3v5\"/>
  912.                             </svg>
  913.                         </span>
  914.                         <div class=\"pl-feature-text\">
  915.                             <p class=\"pl-feature-title\">Souvenirs personnalisés</p>
  916.                             <p class=\"pl-feature-desc\">Créez albums, livres et cadeaux uniques du séjour</p>
  917.                         </div>
  918.                     </li>
  919.                     <li class=\"pl-feature\">
  920.                         <span class=\"pl-feature-icon brown\">
  921.                             <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">
  922.                                 <path d=\"M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9\"/>
  923.                                 <path d=\"M13.73 21a2 2 0 0 1-3.46 0\"/>
  924.                             </svg>
  925.                         </span>
  926.                         <div class=\"pl-feature-text\">
  927.                             <p class=\"pl-feature-title\">Notifications instantanées</p>
  928.                             <p class=\"pl-feature-desc\">Restez informé à chaque nouvelle publication</p>
  929.                         </div>
  930.                     </li>
  931.                 </ul>
  932.                 <!-- Decorative illustration -->
  933.                 <div class=\"pl-hero-illustration\">
  934.                     <svg viewBox=\"0 0 400 280\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">
  935.                         <!-- Background shapes -->
  936.                         <ellipse cx=\"200\" cy=\"250\" rx=\"180\" ry=\"20\" fill=\"#E5E9F0\" opacity=\"0.5\"/>
  937.                         
  938.                         <!-- Phone mockup -->
  939.                         <rect x=\"140\" y=\"30\" width=\"120\" height=\"200\" rx=\"16\" fill=\"#1A1A2E\"/>
  940.                         <rect x=\"146\" y=\"40\" width=\"108\" height=\"180\" rx=\"12\" fill=\"#fff\"/>
  941.                         
  942.                         <!-- Phone content - photos grid -->
  943.                         <rect x=\"152\" y=\"55\" width=\"48\" height=\"48\" rx=\"6\" fill=\"#F09E7A\" opacity=\"0.3\"/>
  944.                         <rect x=\"152\" y=\"55\" width=\"48\" height=\"48\" rx=\"6\" fill=\"url(#imgGrad1)\"/>
  945.                         <rect x=\"204\" y=\"55\" width=\"44\" height=\"48\" rx=\"6\" fill=\"#41A2AA\" opacity=\"0.3\"/>
  946.                         <rect x=\"204\" y=\"55\" width=\"44\" height=\"48\" rx=\"6\" fill=\"url(#imgGrad2)\"/>
  947.                         <rect x=\"152\" y=\"107\" width=\"96\" height=\"60\" rx=\"6\" fill=\"#F56040\" opacity=\"0.2\"/>
  948.                         <rect x=\"152\" y=\"107\" width=\"96\" height=\"60\" rx=\"6\" fill=\"url(#imgGrad3)\"/>
  949.                         
  950.                         <!-- Photo icons -->
  951.                         <circle cx=\"176\" cy=\"79\" r=\"12\" fill=\"#F09E7A\"/>
  952.                         <path d=\"M170 82l4-5 3 3 5-6 6 8H170z\" fill=\"#fff\"/>
  953.                         <circle cx=\"226\" cy=\"79\" r=\"10\" fill=\"#41A2AA\"/>
  954.                         <polygon points=\"221,82 226,74 231,82\" fill=\"#fff\"/>
  955.                         
  956.                         <!-- Play button on video -->
  957.                         <circle cx=\"200\" cy=\"137\" r=\"14\" fill=\"rgba(255,255,255,0.9)\"/>
  958.                         <polygon points=\"196,131 196,143 208,137\" fill=\"#F56040\"/>
  959.                         
  960.                         <!-- Notification bar -->
  961.                         <rect x=\"152\" y=\"175\" width=\"96\" height=\"38\" rx=\"8\" fill=\"#F8FAFB\"/>
  962.                         <circle cx=\"168\" cy=\"194\" r=\"10\" fill=\"#41A2AA\"/>
  963.                         <path d=\"M165 194l2 2 4-4\" stroke=\"#fff\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>
  964.                         <rect x=\"184\" y=\"188\" width=\"50\" height=\"6\" rx=\"3\" fill=\"#E5E9F0\"/>
  965.                         <rect x=\"184\" y=\"198\" width=\"35\" height=\"4\" rx=\"2\" fill=\"#E5E9F0\"/>
  966.                         
  967.                         <!-- Phone notch -->
  968.                         <rect x=\"175\" y=\"34\" width=\"50\" height=\"4\" rx=\"2\" fill=\"#1A1A2E\"/>
  969.                         
  970.                         <!-- Decorative elements around -->
  971.                         <circle cx=\"80\" cy=\"80\" r=\"8\" fill=\"#F09E7A\" opacity=\"0.6\"/>
  972.                         <circle cx=\"320\" cy=\"100\" r=\"6\" fill=\"#41A2AA\" opacity=\"0.5\"/>
  973.                         <circle cx=\"340\" cy=\"180\" r=\"10\" fill=\"#F56040\" opacity=\"0.4\"/>
  974.                         <circle cx=\"60\" cy=\"180\" r=\"5\" fill=\"#41A2AA\" opacity=\"0.4\"/>
  975.                         
  976.                         <!-- Hearts/love -->
  977.                         <path d=\"M300 60c-2-4-8-4-10 0-2-4-8-4-10 0 0 6 10 12 10 12s10-6 10-12z\" fill=\"#F09E7A\" opacity=\"0.7\"/>
  978.                         
  979.                         <!-- Stars -->
  980.                         <path d=\"M70 120l2 4 4 1-3 3 1 4-4-2-4 2 1-4-3-3 4-1 2-4z\" fill=\"#FFD93D\" opacity=\"0.8\"/>
  981.                         <path d=\"M350 140l1.5 3 3 .5-2 2 .5 3-3-1.5-3 1.5.5-3-2-2 3-.5 1.5-3z\" fill=\"#FFD93D\" opacity=\"0.6\"/>
  982.                         
  983.                         <!-- Gradients -->
  984.                         <defs>
  985.                             <linearGradient id=\"imgGrad1\" x1=\"152\" y1=\"55\" x2=\"200\" y2=\"103\">
  986.                                 <stop offset=\"0%\" stop-color=\"#F09E7A\" stop-opacity=\"0.4\"/>
  987.                                 <stop offset=\"100%\" stop-color=\"#F56040\" stop-opacity=\"0.3\"/>
  988.                             </linearGradient>
  989.                             <linearGradient id=\"imgGrad2\" x1=\"204\" y1=\"55\" x2=\"248\" y2=\"103\">
  990.                                 <stop offset=\"0%\" stop-color=\"#41A2AA\" stop-opacity=\"0.4\"/>
  991.                                 <stop offset=\"100%\" stop-color=\"#359BA3\" stop-opacity=\"0.3\"/>
  992.                             </linearGradient>
  993.                             <linearGradient id=\"imgGrad3\" x1=\"152\" y1=\"107\" x2=\"248\" y2=\"167\">
  994.                                 <stop offset=\"0%\" stop-color=\"#F56040\" stop-opacity=\"0.3\"/>
  995.                                 <stop offset=\"100%\" stop-color=\"#F09E7A\" stop-opacity=\"0.2\"/>
  996.                             </linearGradient>
  997.                         </defs>
  998.                     </svg>
  999.                     
  1000.                     <!-- Floating notification badges -->
  1001.                     <div class=\"pl-floating-badges\">
  1002.                         <div class=\"pl-badge pl-badge-1\">
  1003.                             <span class=\"pl-badge-icon orange\">
  1004.                                 <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">
  1005.                                     <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/>
  1006.                                     <circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"/>
  1007.                                     <polyline points=\"21 15 16 10 5 21\"/>
  1008.                                 </svg>
  1009.                             </span>
  1010.                             <span>+12 photos</span>
  1011.                         </div>
  1012.                         <div class=\"pl-badge pl-badge-2\">
  1013.                             <span class=\"pl-badge-icon teal\">
  1014.                                 <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">
  1015.                                     <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"/>
  1016.                                     <polyline points=\"22 4 12 14.01 9 11.01\"/>
  1017.                                 </svg>
  1018.                             </span>
  1019.                             <span>Bien arrivés !</span>
  1020.                         </div>
  1021.                     </div>
  1022.                 </div>
  1023.             </div>
  1024.         </section>
  1025.         <!-- RIGHT: Form -->
  1026.         <section class=\"pl-form-section\">
  1027.             <div class=\"pl-card\">
  1028.                 <!-- Tabs -->
  1029.                 <div class=\"pl-tabs\" role=\"tablist\">
  1030.                     <button class=\"pl-tab active\" role=\"tab\" data-tab=\"login\" aria-selected=\"true\">Se connecter</button>
  1031.                     <button class=\"pl-tab\" role=\"tab\" data-tab=\"register\" aria-selected=\"false\">Créer un compte</button>
  1032.                 </div>
  1033.                 <!-- LOGIN PANEL -->
  1034.                 <div class=\"pl-panel active\" id=\"panel-login\" role=\"tabpanel\">
  1035.                     ";
  1036.         // line 1054
  1037.         if ((($tmp = (isset($context["error"]) || array_key_exists("error"$context) ? $context["error"] : (function () { throw new RuntimeError('Variable "error" does not exist.'1054$this->source); })())) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  1038.             // line 1055
  1039.             yield "                    <div class=\"pl-error\">
  1040.                         <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">
  1041.                             <circle cx=\"12\" cy=\"12\" r=\"10\"/>
  1042.                             <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"/>
  1043.                             <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"/>
  1044.                         </svg>
  1045.                         Identifiant ou mot de passe incorrect.
  1046.                     </div>
  1047.                     ";
  1048.         }
  1049.         // line 1064
  1050.         yield "
  1051.                     <form method=\"post\" action=\"";
  1052.         // line 1065
  1053.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("app_back_Parent");
  1054.         yield "\" id=\"loginForm\" autocomplete=\"off\">
  1055.                         <!-- Code Séjour - Required for direct access -->
  1056.                         <div class=\"pl-form-group\">
  1057.                             <label class=\"pl-label\">
  1058.                                 Code séjour
  1059.                                 <span class=\"pl-required\">*</span>
  1060.                             </label>
  1061.                             <input type=\"text\" 
  1062.                                 class=\"pl-input pl-input-code\" 
  1063.                                 name=\"code_sejour\" 
  1064.                                 id=\"loginCode\" 
  1065.                                 placeholder=\"   XX000000\"
  1066.                                 maxlength=\"8\"
  1067.                                 autocomplete=\"one-time-code\"
  1068.                                 data-lpignore=\"true\"
  1069.                                 data-form-type=\"other\"
  1070.                                 required>
  1071.                             <p class=\"pl-hint\">
  1072.                                 <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">
  1073.                                     <circle cx=\"12\" cy=\"12\" r=\"10\"/>
  1074.                                     <path d=\"M12 16v-4\"/>
  1075.                                     <path d=\"M12 8h.01\"/>
  1076.                                 </svg>
  1077.                                 Code reçu par l'école ou l'organisateur du séjour
  1078.                             </p>
  1079.                         </div>
  1080.                         <div class=\"pl-form-group\">
  1081.                             <label class=\"pl-label\">Adresse e-mail</label>
  1082.                             <input type=\"email\" class=\"pl-input\" name=\"email\" id=\"loginEmail\" value=\"";
  1083.         // line 1094
  1084.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape((isset($context["last_username"]) || array_key_exists("last_username"$context) ? $context["last_username"] : (function () { throw new RuntimeError('Variable "last_username" does not exist.'1094$this->source); })()), "html"nulltrue);
  1085.         yield "\" placeholder=\"votre@email.com\" autocomplete=\"username\" required>
  1086.                         </div>
  1087.                         <div class=\"pl-form-group\">
  1088.                             <label class=\"pl-label\">Mot de passe</label>
  1089.                             <div class=\"pl-password-wrap\">
  1090.                                 <input type=\"password\" class=\"pl-input\" name=\"password\" id=\"loginPwd\" placeholder=\"••••••••\" autocomplete=\"current-password\" required>
  1091.                                 <button type=\"button\" class=\"pl-eye-btn\" data-target=\"loginPwd\" aria-label=\"Afficher\">
  1092.                                     <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">
  1093.                                         <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\"/>
  1094.                                         <circle cx=\"12\" cy=\"12\" r=\"3\"/>
  1095.                                     </svg>
  1096.                                 </button>
  1097.                             </div>
  1098.                         </div>
  1099.                         <input type=\"hidden\" name=\"_csrf_token\" value=\"";
  1100.         // line 1110
  1101.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->env->getRuntime('Symfony\Component\Form\FormRenderer')->renderCsrfToken("authenticate"), "html"nulltrue);
  1102.         yield "\">
  1103.                         <button type=\"submit\" class=\"pl-btn\">Se connecter</button>
  1104.                         <a href=\"";
  1105.         // line 1113
  1106.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("forgotPassparent");
  1107.         yield "\" class=\"pl-forgot\">Vous avez oublié votre mot de passe ?</a>
  1108.                     </form>
  1109.                     <div class=\"pl-divider\">
  1110.                         <span class=\"pl-divider-line\"></span>
  1111.                         <span class=\"pl-divider-text\">ou</span>
  1112.                         <span class=\"pl-divider-line\"></span>
  1113.                     </div>
  1114.                     <div class=\"pl-socials\">
  1115.                         <a href=\"";
  1116.         // line 1123
  1117.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("connect_google_start");
  1118.         yield "\" class=\"pl-social-btn pl-social-google\">
  1119.                             <img src=\"";
  1120.         // line 1124
  1121.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("/images/icons-google.png"), "html"nulltrue);
  1122.         yield "\" alt=\"\">
  1123.                             Continuer avec Google
  1124.                         </a>
  1125.                         <a href=\"";
  1126.         // line 1127
  1127.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("connect_facebook_start");
  1128.         yield "\" class=\"pl-social-btn pl-social-facebook\">
  1129.                             <img src=\"";
  1130.         // line 1128
  1131.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("/images/icons-facebook.png"), "html"nulltrue);
  1132.         yield "\" alt=\"\">
  1133.                             Continuer avec Facebook
  1134.                         </a>
  1135.                     </div>
  1136.                 </div>
  1137.                 <!-- REGISTER PANEL -->
  1138.                 <div class=\"pl-panel\" id=\"panel-register\" role=\"tabpanel\">
  1139.                     <form id=\"registerForm\" onsubmit=\"return false;\" autocomplete=\"off\">
  1140.                      
  1141.                         <div class=\"pl-row\">
  1142.                             <div class=\"pl-form-group\">
  1143.                                 <label class=\"pl-label\">Nom</label>
  1144.                                 <input type=\"text\" class=\"pl-input\" id=\"regNom\" name=\"family-name\" placeholder=\"Votre nom\" autocomplete=\"family-name\" required>
  1145.                             </div>
  1146.                             <div class=\"pl-form-group\">
  1147.                                 <label class=\"pl-label\">Prénom</label>
  1148.                                 <input type=\"text\" class=\"pl-input\" id=\"regPrenom\" name=\"given-name\" placeholder=\"Votre prénom\" autocomplete=\"given-name\" required>
  1149.                             </div>
  1150.                         </div>
  1151.                         <div class=\"pl-form-group\">
  1152.                             <label class=\"pl-label\">Adresse e-mail</label>
  1153.                             <input type=\"email\" class=\"pl-input\" id=\"regEmail\" name=\"email\" placeholder=\"votre@email.com\" autocomplete=\"email\" required>
  1154.                         </div>
  1155.                         <div class=\"pl-form-group\">
  1156.                             <label class=\"pl-label\">Mot de passe</label>
  1157.                             <div class=\"pl-password-wrap\">
  1158.                                 <input type=\"password\" class=\"pl-input\" id=\"regPwd\" name=\"new-password\" placeholder=\"Minimum 6 caractères\" autocomplete=\"new-password\" required>
  1159.                                 <button type=\"button\" class=\"pl-eye-btn\" data-target=\"regPwd\" aria-label=\"Afficher\">
  1160.                                     <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">
  1161.                                         <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\"/>
  1162.                                         <circle cx=\"12\" cy=\"12\" r=\"3\"/>
  1163.                                     </svg>
  1164.                                 </button>
  1165.                             </div>
  1166.                         </div>
  1167.                         <div class=\"pl-form-group\">
  1168.                             <label class=\"pl-label\">Confirmer le mot de passe</label>
  1169.                             <div class=\"pl-password-wrap\">
  1170.                                 <input type=\"password\" class=\"pl-input\" id=\"regPwdConfirm\" name=\"confirm-password\" placeholder=\"Retapez votre mot de passe\" autocomplete=\"new-password\" required>
  1171.                                 <button type=\"button\" class=\"pl-eye-btn\" data-target=\"regPwdConfirm\" aria-label=\"Afficher\">
  1172.                                     <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">
  1173.                                         <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\"/>
  1174.                                         <circle cx=\"12\" cy=\"12\" r=\"3\"/>
  1175.                                     </svg>
  1176.                                 </button>
  1177.                             </div>
  1178.                         </div>
  1179.                         <div class=\"pl-form-group\">
  1180.                             <label class=\"pl-label\">Téléphone portable</label>
  1181.                             <input type=\"tel\" class=\"pl-input\" id=\"regPhone\" placeholder=\"06 12 34 56 78\" required>
  1182.                         </div>
  1183.                         <div class=\"pl-notif-box\">
  1184.                             <p class=\"pl-notif-label\">Recevoir les notifications :</p>
  1185.                             <div class=\"pl-notif-opts\">
  1186.                                 <label class=\"pl-checkbox\">
  1187.                                     <input type=\"checkbox\" id=\"notifSms\">
  1188.                                     SMS
  1189.                                 </label>
  1190.                                 <label class=\"pl-checkbox\">
  1191.                                     <input type=\"checkbox\" id=\"notifEmail\" checked>
  1192.                                     E-mail
  1193.                                 </label>
  1194.                             </div>
  1195.                         </div>
  1196.                         <button type=\"button\" class=\"pl-btn pl-btn-secondary\" onclick=\"handleRegister()\">Créer mon compte Parent</button>
  1197.                         <p class=\"pl-note\">Vous pourrez modifier vos informations et vos préférences de notifications à tout moment.</p>
  1198.                     </form>
  1199.                     <div class=\"pl-divider\">
  1200.                         <span class=\"pl-divider-line\"></span>
  1201.                         <span class=\"pl-divider-text\">ou</span>
  1202.                         <span class=\"pl-divider-line\"></span>
  1203.                     </div>
  1204.                     <div class=\"pl-socials\">
  1205.                         <a href=\"";
  1206.         // line 1210
  1207.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("connect_google_start");
  1208.         yield "\" class=\"pl-social-btn pl-social-google\">
  1209.                             <img src=\"";
  1210.         // line 1211
  1211.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("/images/icons-google.png"), "html"nulltrue);
  1212.         yield "\" alt=\"\">
  1213.                             Continuer avec Google
  1214.                         </a>
  1215.                         <a href=\"";
  1216.         // line 1214
  1217.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("connect_facebook_start");
  1218.         yield "\" class=\"pl-social-btn pl-social-facebook\">
  1219.                             <img src=\"";
  1220.         // line 1215
  1221.         yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\AssetExtension']->getAssetUrl("/images/icons-facebook.png"), "html"nulltrue);
  1222.         yield "\" alt=\"\">
  1223.                             Continuer avec Facebook
  1224.                         </a>
  1225.                     </div>
  1226.                 </div>
  1227.             </div>
  1228.         </section>
  1229.     </main>
  1230.     <!-- Footer trust bar -->
  1231.     <footer class=\"pl-footer-trust\">
  1232.         <span class=\"pl-footer-item\">
  1233.             <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">
  1234.                 <rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\"/>
  1235.                 <path d=\"M7 11V7a5 5 0 0 1 10 0v4\"/>
  1236.             </svg>
  1237.             Connexion sécurisée
  1238.         </span>
  1239.         <span class=\"pl-footer-item\">
  1240.             <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">
  1241.                 <path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"/>
  1242.             </svg>
  1243.             Données protégées
  1244.         </span>
  1245.         <span class=\"pl-footer-item\">
  1246.             <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">
  1247.                 <circle cx=\"12\" cy=\"12\" r=\"10\"/>
  1248.                 <line x1=\"2\" y1=\"12\" x2=\"22\" y2=\"12\"/>
  1249.                 <path d=\"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z\"/>
  1250.             </svg>
  1251.             Hébergé en France
  1252.         </span>
  1253.     </footer>
  1254. </div>
  1255. ";
  1256.         
  1257.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  1258.         
  1259.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  1260.         yield from [];
  1261.     }
  1262.     // line 1251
  1263.     /**
  1264.      * @return iterable<null|scalar|\Stringable>
  1265.      */
  1266.     public function block_Footer(array $context, array $blocks = []): iterable
  1267.     {
  1268.         $macros $this->macros;
  1269.         $__internal_5a27a8ba21ca79b61932376b2fa922d2 $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  1270.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""Footer"));
  1271.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  1272.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""Footer"));
  1273.         // line 1252
  1274.         yield from $this->yieldParentBlock("Footer"$context$blocks);
  1275.         yield "
  1276. ";
  1277.         
  1278.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  1279.         
  1280.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  1281.         yield from [];
  1282.     }
  1283.     // line 1255
  1284.     /**
  1285.      * @return iterable<null|scalar|\Stringable>
  1286.      */
  1287.     public function block_javascript(array $context, array $blocks = []): iterable
  1288.     {
  1289.         $macros $this->macros;
  1290.         $__internal_5a27a8ba21ca79b61932376b2fa922d2 $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"];
  1291.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""javascript"));
  1292.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"];
  1293.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block""javascript"));
  1294.         // line 1256
  1295.         yield from $this->yieldParentBlock("javascript"$context$blocks);
  1296.         yield "
  1297. <script src=\"https://cdn.jsdelivr.net/npm/sweetalert2@11/dist/sweetalert2.all.min.js\"></script>
  1298. <script>
  1299. document.addEventListener('DOMContentLoaded', function() {
  1300.     // Tab switching
  1301.     const tabs = document.querySelectorAll('.pl-tab');
  1302.     const panels = document.querySelectorAll('.pl-panel');
  1303.     tabs.forEach(tab => {
  1304.         tab.addEventListener('click', () => {
  1305.             const target = tab.dataset.tab;
  1306.             tabs.forEach(t => {
  1307.                 t.classList.remove('active');
  1308.                 t.setAttribute('aria-selected', 'false');
  1309.             });
  1310.             tab.classList.add('active');
  1311.             tab.setAttribute('aria-selected', 'true');
  1312.             panels.forEach(p => p.classList.remove('active'));
  1313.             document.getElementById('panel-' + target).classList.add('active');
  1314.         });
  1315.     });
  1316.     // Clear autofilled code séjour field on page load (browser autofill fix)
  1317.     const codeInput = document.getElementById('loginCode');
  1318.     if (codeInput) {
  1319.         // Clear any incorrect autofill value
  1320.         setTimeout(() => {
  1321.             const currentValue = codeInput.value;
  1322.             // If the value doesn't match code séjour format (2 letters + 6 digits), clear it
  1323.             if (currentValue && !/^[A-Z]{2}[0-9]{6}\$/.test(currentValue.toUpperCase())) {
  1324.                 codeInput.value = '';
  1325.             }
  1326.         }, 100);
  1327.     }
  1328.     // Password toggle
  1329.     document.querySelectorAll('.pl-eye-btn').forEach(btn => {
  1330.         btn.addEventListener('click', () => {
  1331.             const input = document.getElementById(btn.dataset.target);
  1332.             const isPassword = input.type === 'password';
  1333.             input.type = isPassword ? 'text' : 'password';
  1334.             btn.querySelector('svg').style.opacity = isPassword ? '0.5' : '1';
  1335.         });
  1336.     });
  1337.     // Auto-format code séjour (uppercase) and validation
  1338.     if (codeInput) {
  1339.         codeInput.addEventListener('input', (e) => {
  1340.             let value = e.target.value.toUpperCase().replace(/[^A-Z0-9]/g, '');
  1341.             e.target.value = value;
  1342.             
  1343.             // Visual feedback when complete
  1344.             if (value.length === 8) {
  1345.                 e.target.style.borderColor = '#41A2AA';
  1346.                 e.target.style.background = 'rgba(65, 162, 170, 0.06)';
  1347.             } else {
  1348.                 e.target.style.borderColor = '';
  1349.                 e.target.style.background = '';
  1350.             }
  1351.         });
  1352.         // Validate on form submit
  1353.         document.getElementById('loginForm').addEventListener('submit', function(e) {
  1354.             const codePattern = /^[A-Z]{2}[0-9]{6}\$/;
  1355.             if (!codePattern.test(codeInput.value)) {
  1356.                 e.preventDefault();
  1357.                 codeInput.classList.add('is-invalid');
  1358.                 Swal.fire({
  1359.                     icon: 'error',
  1360.                     title: 'Code séjour invalide',
  1361.                     html: '<p style=\"margin-bottom:8px;\">Le code doit contenir :</p><p style=\"color:#5A6178;font-size:14px;\"><strong>2 lettres</strong> + <strong>6 chiffres</strong><br>Exemple : <span style=\"color:#41A2AA;font-weight:600;\">PF270076</span></p>',
  1362.                     confirmButtonColor: '#41a2aa'
  1363.                 });
  1364.             } else {
  1365.                 // Show loading state on button
  1366.                 const btn = this.querySelector('button[type=\"submit\"]');
  1367.                 btn.classList.add('pl-btn-loading');
  1368.                 btn.disabled = true;
  1369.             }
  1370.         });
  1371.     }
  1372.     // Add visual feedback when email is valid
  1373.     const emailInputs = document.querySelectorAll('input[type=\"email\"]');
  1374.     emailInputs.forEach(input => {
  1375.         input.addEventListener('blur', function() {
  1376.             const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+\$/;
  1377.             if (this.value && emailRegex.test(this.value)) {
  1378.                 this.classList.add('is-valid');
  1379.                 this.classList.remove('is-invalid');
  1380.             } else if (this.value) {
  1381.                 this.classList.add('is-invalid');
  1382.                 this.classList.remove('is-valid');
  1383.             }
  1384.         });
  1385.         input.addEventListener('input', function() {
  1386.             this.classList.remove('is-valid', 'is-invalid');
  1387.         });
  1388.     });
  1389.     // Login error
  1390.     ";
  1391.         // line 1359
  1392.         if ((($tmp = (isset($context["error"]) || array_key_exists("error"$context) ? $context["error"] : (function () { throw new RuntimeError('Variable "error" does not exist.'1359$this->source); })())) && $tmp instanceof Markup ? (string) $tmp $tmp)) {
  1393.             // line 1360
  1394.             yield "    Swal.fire({
  1395.         icon: 'error',
  1396.         title: 'Erreur de connexion',
  1397.         text: 'Identifiant ou mot de passe incorrect.',
  1398.         confirmButtonColor: '#41a2aa'
  1399.     });
  1400.     ";
  1401.         }
  1402.         // line 1367
  1403.         yield "});
  1404. // Registration
  1405. function handleRegister() {
  1406.     const loader = document.getElementById('plLoader');
  1407.     const fields = {
  1408.         nom: document.getElementById('regNom'),
  1409.         prenom: document.getElementById('regPrenom'),
  1410.         email: document.getElementById('regEmail'),
  1411.         pwd: document.getElementById('regPwd'),
  1412.         pwdConfirm: document.getElementById('regPwdConfirm'),
  1413.         phone: document.getElementById('regPhone')
  1414.     };
  1415.     // Reset
  1416.     Object.values(fields).forEach(f => f.classList.remove('is-invalid'));
  1417.     // Validate
  1418.     let valid = true;
  1419.     if (!fields.nom.value.trim()) { fields.nom.classList.add('is-invalid'); valid = false; }
  1420.     if (!fields.prenom.value.trim()) { fields.prenom.classList.add('is-invalid'); valid = false; }
  1421.     const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+\$/;
  1422.     if (!emailRegex.test(fields.email.value)) { fields.email.classList.add('is-invalid'); valid = false; }
  1423.     if (fields.pwd.value.length < 6) {
  1424.         fields.pwd.classList.add('is-invalid');
  1425.         Swal.fire({ icon: 'warning', title: 'Mot de passe trop court', text: 'Minimum 6 caractères.', confirmButtonColor: '#41a2aa' });
  1426.         return;
  1427.     }
  1428.     if (fields.pwd.value !== fields.pwdConfirm.value) {
  1429.         fields.pwdConfirm.classList.add('is-invalid');
  1430.         Swal.fire({ icon: 'warning', title: 'Erreur', text: 'Les mots de passe ne correspondent pas.', confirmButtonColor: '#41a2aa' });
  1431.         return;
  1432.     }
  1433.     if (!fields.phone.value.trim()) { fields.phone.classList.add('is-invalid'); valid = false; }
  1434.     if (!valid) return;
  1435.     loader.classList.add('active');
  1436.     const data = {
  1437.         nomparent: fields.nom.value.trim(),
  1438.         prenomparent: fields.prenom.value.trim(),
  1439.         mailprent: fields.email.value.trim(),
  1440.         numtel: fields.phone.value.trim(),
  1441.         passwordparent: fields.pwd.value,
  1442.         confirmpassword: fields.pwdConfirm.value,
  1443.         sms: document.getElementById('notifSms').checked ? 1 : 0,
  1444.         mailnotif: document.getElementById('notifEmail').checked ? 1 : 0
  1445.     };
  1446.     fetch(\"";
  1447.         // line 1422
  1448.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("parent_register");
  1449.         yield "\", {
  1450.         method: 'POST',
  1451.         headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  1452.         body: new URLSearchParams(data)
  1453.     })
  1454.     .then(r => r.text())
  1455.     .then(result => {
  1456.         loader.classList.remove('active');
  1457.         if (result === 'eror') {
  1458.             fields.email.classList.add('is-invalid');
  1459.             Swal.fire({
  1460.                 icon: 'error',
  1461.                 title: 'Email déjà utilisé',
  1462.                 text: 'Cette adresse est déjà associée à un compte.',
  1463.                 footer: '<a href=\"";
  1464.         // line 1437
  1465.         yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("forgotPassparent");
  1466.         yield "\" style=\"color:#F09E7A;\">Mot de passe oublié ?</a>',
  1467.                 confirmButtonColor: '#41a2aa'
  1468.             });
  1469.         } else if (result === 'erorpasswordconfirm') {
  1470.             fields.pwdConfirm.classList.add('is-invalid');
  1471.             Swal.fire({ icon: 'error', title: 'Erreur', text: 'Les mots de passe ne correspondent pas.', confirmButtonColor: '#41a2aa' });
  1472.         } else {
  1473.             Swal.fire({
  1474.                 icon: 'success',
  1475.                 title: '🎉 Bienvenue !',
  1476.                 html: '<p>Votre compte parent est presque prêt.</p><p style=\"color:#5A6178;font-size:14px;\">📩 Un e-mail vous a été envoyé pour activer votre compte.</p>',
  1477.                 confirmButtonText: 'Compris',
  1478.                 confirmButtonColor: '#41a2aa'
  1479.             }).then(() => location.reload());
  1480.         }
  1481.     })
  1482.     .catch(() => {
  1483.         loader.classList.remove('active');
  1484.         Swal.fire({ icon: 'error', title: 'Erreur', text: 'Un problème est survenu. Veuillez réessayer.', confirmButtonColor: '#F09E7A' });
  1485.     });
  1486. }
  1487. </script>
  1488. ";
  1489.         
  1490.         $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof);
  1491.         
  1492.         $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof);
  1493.         yield from [];
  1494.     }
  1495.     /**
  1496.      * @codeCoverageIgnore
  1497.      */
  1498.     public function getTemplateName(): string
  1499.     {
  1500.         return "Parent/LoginParent.html.twig";
  1501.     }
  1502.     /**
  1503.      * @codeCoverageIgnore
  1504.      */
  1505.     public function isTraitable(): bool
  1506.     {
  1507.         return false;
  1508.     }
  1509.     /**
  1510.      * @codeCoverageIgnore
  1511.      */
  1512.     public function getDebugInfo(): array
  1513.     {
  1514.         return array (  1674 => 1437,  1656 => 1422,  1599 => 1367,  1590 => 1360,  1588 => 1359,  1482 => 1256,  1469 => 1255,  1456 => 1252,  1443 => 1251,  1397 => 1215,  1393 => 1214,  1387 => 1211,  1383 => 1210,  1298 => 1128,  1294 => 1127,  1288 => 1124,  1284 => 1123,  1271 => 1113,  1265 => 1110,  1246 => 1094,  1214 => 1065,  1211 => 1064,  1200 => 1055,  1198 => 1054,  1021 => 879,  1008 => 878,  995 => 875,  982 => 874,  104 => 6,  91 => 5,  68 => 3,  45 => 1,);
  1515.     }
  1516.     public function getSourceContext(): Source
  1517.     {
  1518.         return new Source("{% extends 'Accueil/layoutAccueil.html.twig' %}
  1519. {% block title %}Connexion Parent — 5sur5séjour{% endblock %}
  1520. {% block stylesheets %}
  1521. {{ parent() }}
  1522. <link rel=\"stylesheet\" href=\"https://cdn.jsdelivr.net/npm/sweetalert2@11/dist/sweetalert2.min.css\">
  1523. <style>
  1524. /* ========================================
  1525.    5SUR5 PARENT LOGIN - CLEAN TWO-COLUMN
  1526.    Stripe/Notion Quality · No Slider
  1527.    ======================================== */
  1528. :root {
  1529.     --pl-teal: #41A2AA;
  1530.     --pl-teal-dark: #359BA3;
  1531.     --pl-teal-light: rgba(65, 162, 170, 0.06);
  1532.     --pl-orange: #F09E7A;
  1533.     --pl-orange-dark: #E8865E;
  1534.     --pl-text: #1A1A2E;
  1535.     --pl-text-secondary: #5A6178;
  1536.     --pl-text-muted: #8E95A9;
  1537.     --pl-bg: #FFFFFF;
  1538.     --pl-bg-hero: #F8FAFB;
  1539.     --pl-border: #E5E9F0;
  1540.     --pl-shadow: 0 4px 24px rgba(0, 0, 0, 0.08);
  1541.     --pl-radius: 16px;
  1542. }
  1543. * {
  1544.     box-sizing: border-box;
  1545. }
  1546. .pl-page {
  1547.     min-height: 100vh;
  1548.     display: flex;
  1549.     flex-direction: column;
  1550. }
  1551. /* ========================================
  1552.    MAIN CONTAINER - TWO COLUMNS
  1553.    ======================================== */
  1554. .pl-main {
  1555.     flex: 1;
  1556.     display: flex;
  1557.     min-height: calc(100vh - 160px);
  1558. }
  1559. /* ========================================
  1560.    LEFT COLUMN - HERO
  1561.    ======================================== */
  1562. .pl-hero {
  1563.     width: 35%;
  1564.     background: var(--pl-bg-hero);
  1565.     padding: 40px;
  1566.     display: flex;
  1567.     flex-direction: column;
  1568.     justify-content: center;
  1569.     position: relative;
  1570. }
  1571. .pl-hero-content {
  1572.     flex: 1;
  1573.     display: flex;
  1574.     flex-direction: column;
  1575.     justify-content: center;
  1576.     max-width: 420px;
  1577. }
  1578. .pl-hero h1 {
  1579.     font-size: 32px;
  1580.     font-weight: 700;
  1581.     color: var(--pl-text);
  1582.     line-height: 1.25;
  1583.     margin: 0 0 16px;
  1584.     letter-spacing: -0.02em;
  1585. }
  1586. .pl-hero-subtitle {
  1587.     font-size: 17px;
  1588.     color: var(--pl-text-secondary);
  1589.     line-height: 1.6;
  1590.     margin: 0 0 32px;
  1591. }
  1592. /* Features List - Premium Style */
  1593. .pl-features {
  1594.     list-style: none;
  1595.     padding: 0;
  1596.     margin: 0;
  1597.     display: flex;
  1598.     flex-direction: column;
  1599.     gap: 18px;
  1600. }
  1601. .pl-feature {
  1602.     display: flex;
  1603.     align-items: flex-start;
  1604.     gap: 14px;
  1605. }
  1606. .pl-feature-icon {
  1607.     width: 44px;
  1608.     height: 44px;
  1609.     border-radius: 12px;
  1610.     display: flex;
  1611.     align-items: center;
  1612.     justify-content: center;
  1613.     flex-shrink: 0;
  1614. }
  1615. .pl-feature-icon svg {
  1616.     width: 22px;
  1617.     height: 22px;
  1618.     color: #fff;
  1619. }
  1620. .pl-feature-icon.teal { background: var(--pl-teal); }
  1621. .pl-feature-icon.orange { background: var(--pl-orange); }
  1622. .pl-feature-icon.coral { background: #F56040; }
  1623. .pl-feature-icon.brown { background: #c47d5e; }
  1624. .pl-feature-text {
  1625.     padding-top: 2px;
  1626. }
  1627. .pl-feature-title {
  1628.     font-size: 14px;
  1629.     font-weight: 600;
  1630.     color: var(--pl-text);
  1631.     margin: 0 0 3px;
  1632. }
  1633. .pl-feature-desc {
  1634.     font-size: 13px;
  1635.     color: var(--pl-text-muted);
  1636.     margin: 0;
  1637.     line-height: 1.4;
  1638. }
  1639. /* Hero image */
  1640. .pl-hero-image {
  1641.     margin-top: auto;
  1642.     border-radius: 12px;
  1643.     overflow: hidden;
  1644. }
  1645. .pl-hero-image img {
  1646.     width: 100%;
  1647.     height: auto;
  1648.     display: block;
  1649.     border-radius: 12px;
  1650. }
  1651. /* Hero decorative illustration */
  1652. .pl-hero-illustration {
  1653.     margin-top: auto;
  1654.     padding-top: 40px;
  1655.     position: relative;
  1656. }
  1657. .pl-hero-illustration svg {
  1658.     width: 100%;
  1659.     max-width: 320px;
  1660.     height: auto;
  1661.     opacity: 0.9;
  1662. }
  1663. /* Floating badges */
  1664. .pl-floating-badges {
  1665.     position: absolute;
  1666.     inset: 0;
  1667.     pointer-events: none;
  1668. }
  1669. .pl-badge {
  1670.     position: absolute;
  1671.     background: #fff;
  1672.     border-radius: 12px;
  1673.     padding: 10px 14px;
  1674.     box-shadow: 0 8px 32px rgba(0, 0, 0, 0.12);
  1675.     display: flex;
  1676.     align-items: center;
  1677.     gap: 10px;
  1678.     font-size: 13px;
  1679.     font-weight: 500;
  1680.     color: var(--pl-text);
  1681.     animation: plFloat 3s ease-in-out infinite;
  1682. }
  1683. .pl-badge-icon {
  1684.     width: 32px;
  1685.     height: 32px;
  1686.     border-radius: 8px;
  1687.     display: flex;
  1688.     align-items: center;
  1689.     justify-content: center;
  1690. }
  1691. .pl-badge-icon svg {
  1692.     width: 18px;
  1693.     height: 18px;
  1694.     color: #fff;
  1695. }
  1696. .pl-badge-icon.teal { background: var(--pl-teal); }
  1697. .pl-badge-icon.orange { background: var(--pl-orange); }
  1698. .pl-badge-icon.coral { background: #F56040; }
  1699. .pl-badge-1 {
  1700.     top: 20%;
  1701.     right: -10px;
  1702.     animation-delay: 0s;
  1703. }
  1704. .pl-badge-2 {
  1705.     bottom: 30%;
  1706.     left: -5px;
  1707.     animation-delay: 1s;
  1708. }
  1709. .pl-badge-3 {
  1710.     bottom: 10%;
  1711.     right: 10%;
  1712.     animation-delay: 2s;
  1713. }
  1714. @keyframes plFloat {
  1715.     0%, 100% { transform: translateY(0); }
  1716.     50% { transform: translateY(-8px); }
  1717. }
  1718. /* Entry animations */
  1719. .pl-hero-content {
  1720.     animation: plSlideRight 0.6s ease-out;
  1721. }
  1722. .pl-card {
  1723.     animation: plSlideUp 0.5s ease-out;
  1724. }
  1725. @keyframes plSlideRight {
  1726.     from { opacity: 0; transform: translateX(-20px); }
  1727.     to { opacity: 1; transform: translateX(0); }
  1728. }
  1729. @keyframes plSlideUp {
  1730.     from { opacity: 0; transform: translateY(20px); }
  1731.     to { opacity: 1; transform: translateY(0); }
  1732. }
  1733. /* Feature items staggered animation */
  1734. .pl-feature {
  1735.     opacity: 0;
  1736.     animation: plFadeIn 0.4s ease forwards;
  1737. }
  1738. .pl-feature:nth-child(1) { animation-delay: 0.1s; }
  1739. .pl-feature:nth-child(2) { animation-delay: 0.2s; }
  1740. .pl-feature:nth-child(3) { animation-delay: 0.3s; }
  1741. .pl-feature:nth-child(4) { animation-delay: 0.4s; }
  1742. /* ========================================
  1743.    RIGHT COLUMN - FORM
  1744.    ======================================== */
  1745. .pl-form-section {
  1746.     width: 58%;
  1747.     display: flex;
  1748.     align-items: center;
  1749.     justify-content: center;
  1750.     padding: 40px;
  1751.     background: var(--pl-bg);
  1752. }
  1753. .pl-card {
  1754.     width: 100%;
  1755.     max-width: 420px;
  1756.     background: var(--pl-bg);
  1757.     border-radius: var(--pl-radius);
  1758.     box-shadow: var(--pl-shadow);
  1759.     border: 1px solid var(--pl-border);
  1760.     overflow: hidden;
  1761. }
  1762. /* Tabs */
  1763. .pl-tabs {
  1764.     display: flex;
  1765.     border-bottom: 1px solid var(--pl-border);
  1766. }
  1767. .pl-tab {
  1768.     flex: 1;
  1769.     padding: 18px 16px;
  1770.     font-size: 14px;
  1771.     font-weight: 600;
  1772.     color: var(--pl-text-muted);
  1773.     background: var(--pl-bg-hero);
  1774.     border: none;
  1775.     cursor: pointer;
  1776.     position: relative;
  1777.     transition: all 0.2s ease;
  1778. }
  1779. .pl-tab:hover {
  1780.     color: var(--pl-text-secondary);
  1781. }
  1782. .pl-tab.active {
  1783.     color: var(--pl-teal);
  1784.     background: var(--pl-bg);
  1785. }
  1786. .pl-tab.active::after {
  1787.     content: '';
  1788.     position: absolute;
  1789.     bottom: -1px;
  1790.     left: 0;
  1791.     right: 0;
  1792.     height: 2px;
  1793.     background: var(--pl-teal);
  1794. }
  1795. .pl-tab:focus-visible {
  1796.     outline: 2px solid var(--pl-teal);
  1797.     outline-offset: -2px;
  1798. }
  1799. .pl-btn:focus-visible,
  1800. .pl-social-btn:focus-visible {
  1801.     outline: 2px solid var(--pl-teal);
  1802.     outline-offset: 2px;
  1803. }
  1804. /* Tab panels */
  1805. .pl-panel {
  1806.     padding: 28px;
  1807.     display: none;
  1808. }
  1809. .pl-panel.active {
  1810.     display: block;
  1811.     animation: plFadeIn 0.25s ease;
  1812. }
  1813. @keyframes plFadeIn {
  1814.     from { opacity: 0; transform: translateY(6px); }
  1815.     to { opacity: 1; transform: translateY(0); }
  1816. }
  1817. /* Form elements */
  1818. .pl-form-group {
  1819.     margin-bottom: 18px;
  1820. }
  1821. .pl-label {
  1822.     display: block;
  1823.     font-size: 13px;
  1824.     font-weight: 500;
  1825.     color: var(--pl-text);
  1826.     margin-bottom: 6px;
  1827. }
  1828. .pl-input {
  1829.     width: 100%;
  1830.     padding: 12px 14px;
  1831.     font-size: 15px;
  1832.     font-family: inherit;
  1833.     color: var(--pl-text);
  1834.     background: var(--pl-bg);
  1835.     border: 1px solid var(--pl-border);
  1836.     border-radius: 8px;
  1837.     transition: all 0.2s ease;
  1838.     outline: none;
  1839. }
  1840. .pl-input::placeholder {
  1841.     color: var(--pl-text-muted);
  1842. }
  1843. .pl-input:hover {
  1844.     border-color: #D0D6E0;
  1845. }
  1846. .pl-input:focus {
  1847.     border-color: var(--pl-teal);
  1848.     box-shadow: 0 0 0 3px var(--pl-teal-light);
  1849. }
  1850. .pl-input.is-invalid {
  1851.     border-color: #EF4444;
  1852.     background: #FEF2F2;
  1853. }
  1854. .pl-input.is-valid {
  1855.     border-color: #10B981;
  1856.     background: rgba(16, 185, 129, 0.04);
  1857. }
  1858. .pl-hint {
  1859.     font-size: 12px;
  1860.     color: var(--pl-text-muted);
  1861.     margin-top: 5px;
  1862.     display: flex;
  1863.     align-items: center;
  1864.     gap: 4px;
  1865. }
  1866. /* Password wrapper */
  1867. .pl-password-wrap {
  1868.     position: relative;
  1869. }
  1870. .pl-password-wrap .pl-input {
  1871.     padding-right: 44px;
  1872. }
  1873. .pl-eye-btn {
  1874.     position: absolute;
  1875.     right: 12px;
  1876.     top: 50%;
  1877.     transform: translateY(-50%);
  1878.     background: none;
  1879.     border: none;
  1880.     padding: 4px;
  1881.     cursor: pointer;
  1882.     color: var(--pl-text-muted);
  1883.     transition: color 0.2s ease;
  1884. }
  1885. .pl-eye-btn:hover {
  1886.     color: var(--pl-teal);
  1887. }
  1888. /* Row for name fields */
  1889. .pl-row {
  1890.     display: flex;
  1891.     gap: 12px;
  1892. }
  1893. .pl-row .pl-form-group {
  1894.     flex: 1;
  1895. }
  1896. /* Primary button */
  1897. .pl-btn {
  1898.     width: 100%;
  1899.     padding: 14px 20px;
  1900.     font-size: 15px;
  1901.     font-weight: 600;
  1902.     font-family: inherit;
  1903.     color: #FFF;
  1904.     background: linear-gradient(135deg, var(--pl-teal) 0%, var(--pl-teal-dark) 100%);
  1905.     border: none;
  1906.     border-radius: 8px;
  1907.     cursor: pointer;
  1908.     transition: all 0.2s ease, transform 0.15s ease;
  1909.     box-shadow: 0 2px 8px rgba(65, 162, 170, 0.3);
  1910. }
  1911. .pl-btn:hover {
  1912.     background: linear-gradient(135deg, var(--pl-teal-dark) 0%, #2E8E96 100%);
  1913.     box-shadow: 0 4px 16px rgba(65, 162, 170, 0.4);
  1914.     transform: translateY(-1px);
  1915. }
  1916. .pl-btn:active {
  1917.     transform: scale(0.98);
  1918. }
  1919. .pl-btn:disabled {
  1920.     opacity: 0.7;
  1921.     cursor: not-allowed;
  1922. }
  1923. .pl-btn-secondary {
  1924.     background: linear-gradient(135deg, var(--pl-orange) 0%, var(--pl-orange-dark) 100%);
  1925.     box-shadow: 0 2px 8px rgba(240, 158, 122, 0.3);
  1926. }
  1927. .pl-btn-secondary:hover {
  1928.     background: linear-gradient(135deg, var(--pl-orange-dark) 0%, #D67A50 100%);
  1929.     box-shadow: 0 4px 16px rgba(240, 158, 122, 0.4);
  1930. }
  1931. /* Button loading state */
  1932. .pl-btn-loading {
  1933.     position: relative;
  1934.     color: transparent !important;
  1935. }
  1936. .pl-btn-loading::after {
  1937.     content: '';
  1938.     position: absolute;
  1939.     width: 20px;
  1940.     height: 20px;
  1941.     top: 50%;
  1942.     left: 50%;
  1943.     margin-left: -10px;
  1944.     margin-top: -10px;
  1945.     border: 2px solid rgba(255,255,255,0.3);
  1946.     border-top-color: #fff;
  1947.     border-radius: 50%;
  1948.     animation: plSpin 0.6s linear infinite;
  1949. }
  1950. /* Forgot link */
  1951. .pl-forgot {
  1952.     display: inline-block;
  1953.     font-size: 13px;
  1954.     color: var(--pl-orange);
  1955.     margin-top: 12px;
  1956.     text-decoration: none;
  1957.     transition: color 0.2s ease;
  1958. }
  1959. .pl-forgot:hover {
  1960.     color: var(--pl-orange-dark);
  1961.     text-decoration: underline;
  1962. }
  1963. /* Divider */
  1964. .pl-divider {
  1965.     display: flex;
  1966.     align-items: center;
  1967.     margin: 24px 0;
  1968.     gap: 14px;
  1969. }
  1970. .pl-divider-line {
  1971.     flex: 1;
  1972.     height: 1px;
  1973.     background: var(--pl-border);
  1974. }
  1975. .pl-divider-text {
  1976.     font-size: 12px;
  1977.     font-weight: 500;
  1978.     color: var(--pl-text-muted);
  1979.     text-transform: uppercase;
  1980.     letter-spacing: 0.04em;
  1981. }
  1982. /* Social buttons */
  1983. .pl-socials {
  1984.     display: flex;
  1985.     flex-direction: column;
  1986.     gap: 10px;
  1987. }
  1988. .pl-social-btn {
  1989.     width: 100%;
  1990.     padding: 11px 16px;
  1991.     font-size: 14px;
  1992.     font-weight: 500;
  1993.     font-family: inherit;
  1994.     border-radius: 8px;
  1995.     cursor: pointer;
  1996.     transition: all 0.2s ease, transform 0.15s ease;
  1997.     display: flex;
  1998.     align-items: center;
  1999.     justify-content: center;
  2000.     gap: 10px;
  2001.     text-decoration: none;
  2002. }
  2003. .pl-social-btn img {
  2004.     width: 18px;
  2005.     height: 18px;
  2006. }
  2007. .pl-social-google {
  2008.     background: var(--pl-bg);
  2009.     color: var(--pl-text);
  2010.     border: 1px solid var(--pl-border);
  2011. }
  2012. .pl-social-google:hover {
  2013.     background: var(--pl-bg-hero);
  2014.     border-color: #D0D6E0;
  2015. }
  2016. .pl-social-facebook {
  2017.     background: #1877F2;
  2018.     color: #FFF;
  2019.     border: 1px solid #1877F2;
  2020. }
  2021. .pl-social-facebook:hover {
  2022.     background: #166FE5;
  2023.     transform: translateY(-1px);
  2024.     box-shadow: 0 4px 12px rgba(24, 119, 242, 0.3);
  2025. }
  2026. .pl-social-google:hover {
  2027.     transform: translateY(-1px);
  2028.     box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
  2029. }
  2030. /* Notification prefs (compact) */
  2031. .pl-notif-box {
  2032.     background: var(--pl-bg-hero);
  2033.     border-radius: 8px;
  2034.     padding: 12px 14px;
  2035.     margin-bottom: 18px;
  2036. }
  2037. .pl-notif-label {
  2038.     font-size: 12px;
  2039.     font-weight: 500;
  2040.     color: var(--pl-text-secondary);
  2041.     margin-bottom: 8px;
  2042. }
  2043. .pl-notif-opts {
  2044.     display: flex;
  2045.     gap: 20px;
  2046. }
  2047. .pl-checkbox {
  2048.     display: flex;
  2049.     align-items: center;
  2050.     gap: 6px;
  2051.     font-size: 13px;
  2052.     color: var(--pl-text);
  2053.     cursor: pointer;
  2054. }
  2055. .pl-checkbox input {
  2056.     width: 16px;
  2057.     height: 16px;
  2058.     accent-color: var(--pl-teal);
  2059.     cursor: pointer;
  2060. }
  2061. /* Form note */
  2062. .pl-note {
  2063.     font-size: 12px;
  2064.     color: var(--pl-text-muted);
  2065.     text-align: center;
  2066.     margin-top: 14px;
  2067.     line-height: 1.5;
  2068. }
  2069. .pl-input-code {
  2070.     font-family: 'SF Mono', 'Monaco', 'Consolas', monospace;
  2071.     font-size: 18px;
  2072.     font-weight: 600;
  2073.     letter-spacing: 2px;
  2074.     text-transform: uppercase;
  2075.     text-align: center;
  2076.     padding: 14px 16px;
  2077.     background: linear-gradient(135deg, rgba(65, 162, 170, 0.04), rgba(240, 158, 122, 0.04));
  2078.     border: 2px solid var(--pl-border);
  2079. }
  2080. .pl-input-code:focus {
  2081.     border-color: var(--pl-teal);
  2082.     background: var(--pl-bg);
  2083. }
  2084. .pl-input-code::placeholder {
  2085.     font-weight: 400;
  2086.     letter-spacing: 1px;
  2087.     color: var(--pl-text-muted);
  2088. }
  2089. .pl-optional {
  2090.     font-weight: 400;
  2091.     color: var(--pl-text-muted);
  2092. }
  2093. .pl-required {
  2094.     color: #EF4444;
  2095.     margin-left: 2px;
  2096. }
  2097. /* Error alert */
  2098. .pl-error {
  2099.     background: #FEF2F2;
  2100.     border: 1px solid #FECACA;
  2101.     border-radius: 8px;
  2102.     padding: 12px 14px;
  2103.     margin-bottom: 18px;
  2104.     font-size: 13px;
  2105.     color: #991B1B;
  2106.     display: flex;
  2107.     align-items: center;
  2108.     gap: 8px;
  2109. }
  2110. .pl-error svg {
  2111.     flex-shrink: 0;
  2112.     color: #EF4444;
  2113. }
  2114. /* ========================================
  2115.    FOOTER TRUST BAR
  2116.    ======================================== */
  2117. .pl-footer-trust {
  2118.     background: var(--pl-bg-hero);
  2119.     border-top: 1px solid var(--pl-border);
  2120.     padding: 16px 24px;
  2121.     display: flex;
  2122.     justify-content: center;
  2123.     gap: 32px;
  2124. }
  2125. .pl-footer-item {
  2126.     display: flex;
  2127.     align-items: center;
  2128.     gap: 8px;
  2129.     font-size: 12px;
  2130.     color: var(--pl-text-muted);
  2131. }
  2132. .pl-footer-item svg {
  2133.     width: 16px;
  2134.     height: 16px;
  2135.     color: var(--pl-teal);
  2136. }
  2137. /* ========================================
  2138.    LOADER
  2139.    ======================================== */
  2140. .pl-loader {
  2141.     position: fixed;
  2142.     inset: 0;
  2143.     background: rgba(255,255,255,0.95);
  2144.     z-index: 9999;
  2145.     display: none;
  2146.     align-items: center;
  2147.     justify-content: center;
  2148. }
  2149. .pl-loader.active {
  2150.     display: flex;
  2151. }
  2152. .pl-loader-inner {
  2153.     text-align: center;
  2154. }
  2155. .pl-spinner {
  2156.     width: 40px;
  2157.     height: 40px;
  2158.     border: 3px solid var(--pl-border);
  2159.     border-top-color: var(--pl-teal);
  2160.     border-radius: 50%;
  2161.     animation: plSpin 0.7s linear infinite;
  2162. }
  2163. @keyframes plSpin {
  2164.     to { transform: rotate(360deg); }
  2165. }
  2166. .pl-loader-text {
  2167.     margin-top: 16px;
  2168.     font-size: 15px;
  2169.     font-weight: 600;
  2170.     color: var(--pl-text);
  2171. }
  2172. .pl-loader-sub {
  2173.     margin-top: 6px;
  2174.     font-size: 13px;
  2175.     color: var(--pl-text-secondary);
  2176. }
  2177. /* ========================================
  2178.    RESPONSIVE - MOBILE
  2179.    ======================================== */
  2180. @media (max-width: 900px) {
  2181.     .pl-main {
  2182.         flex-direction: column;
  2183.         min-height: auto;
  2184.     }
  2185.     .pl-hero {
  2186.         width: 100%;
  2187.         padding: 32px 24px;
  2188.     }
  2189.     .pl-hero-content {
  2190.         max-width: 100%;
  2191.         animation: none;
  2192.     }
  2193.     .pl-hero h1 {
  2194.         font-size: 26px;
  2195.     }
  2196.     .pl-hero-subtitle {
  2197.         font-size: 15px;
  2198.         margin-bottom: 24px;
  2199.     }
  2200.     .pl-features {
  2201.         gap: 14px;
  2202.     }
  2203.     .pl-feature {
  2204.         animation: none;
  2205.         opacity: 1;
  2206.     }
  2207.     .pl-feature-icon {
  2208.         width: 38px;
  2209.         height: 38px;
  2210.     }
  2211.     .pl-feature-icon svg {
  2212.         width: 18px;
  2213.         height: 18px;
  2214.     }
  2215.     .pl-feature-title {
  2216.         font-size: 13px;
  2217.     }
  2218.     .pl-feature-desc {
  2219.         font-size: 12px;
  2220.     }
  2221.     .pl-hero-illustration {
  2222.         display: none;
  2223.     }
  2224.     .pl-form-section {
  2225.         width: 100%;
  2226.         padding: 24px 16px 40px;
  2227.     }
  2228.     .pl-card {
  2229.         max-width: 100%;
  2230.         box-shadow: none;
  2231.         border: none;
  2232.         animation: none;
  2233.     }
  2234.     .pl-panel {
  2235.         padding: 24px 20px;
  2236.     }
  2237.     .pl-row {
  2238.         flex-direction: column;
  2239.         gap: 0;
  2240.     }
  2241.     .pl-footer-trust {
  2242.         flex-wrap: wrap;
  2243.         gap: 16px 24px;
  2244.         justify-content: center;
  2245.     }
  2246. }
  2247. @media (max-width: 480px) {
  2248.     .pl-hero {
  2249.         padding: 24px 20px;
  2250.     }
  2251.     .pl-hero h1 {
  2252.         font-size: 22px;
  2253.     }
  2254.     .pl-tab {
  2255.         padding: 14px 12px;
  2256.         font-size: 13px;
  2257.     }
  2258. }
  2259. </style>
  2260. {% endblock %}
  2261. {% block Header %}
  2262. {{ parent() }}
  2263. {% endblock %}
  2264. {% block Content %}
  2265. <div class=\"pl-page\">
  2266.     <!-- Loader -->
  2267.     <div class=\"pl-loader\" id=\"plLoader\">
  2268.         <div class=\"pl-loader-inner\">
  2269.             <div class=\"pl-spinner\"></div>
  2270.             <p class=\"pl-loader-text\">Création de votre compte...</p>
  2271.             <p class=\"pl-loader-sub\">Préparation de votre espace parent</p>
  2272.         </div>
  2273.     </div>
  2274.     <!-- Main two-column layout -->
  2275.     <main class=\"pl-main\">
  2276.         <!-- LEFT: Hero -->
  2277.         <section class=\"pl-hero\">
  2278.             <div class=\"pl-hero-content\">
  2279.                 <h1>Suivez le séjour de votre enfant en toute sérénité.</h1>
  2280.                 <p class=\"pl-hero-subtitle\">Photos, vidéos et messages vocaux, dans un espace privé réservé aux familles.</p>
  2281.                 <ul class=\"pl-features\">
  2282.                     <li class=\"pl-feature\">
  2283.                         <span class=\"pl-feature-icon orange\">
  2284.                             <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">
  2285.                                 <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\"/>
  2286.                                 <circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"/>
  2287.                                 <polyline points=\"21 15 16 10 5 21\"/>
  2288.                             </svg>
  2289.                         </span>
  2290.                         <div class=\"pl-feature-text\">
  2291.                             <p class=\"pl-feature-title\">Photos & vidéos en direct</p>
  2292.                             <p class=\"pl-feature-desc\">Visualisez les moments du séjour en toute confidentialité</p>
  2293.                         </div>
  2294.                     </li>
  2295.                     <li class=\"pl-feature\">
  2296.                         <span class=\"pl-feature-icon teal\">
  2297.                             <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">
  2298.                                 <path d=\"M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72\"/>
  2299.                             </svg>
  2300.                         </span>
  2301.                         <div class=\"pl-feature-text\">
  2302.                             <p class=\"pl-feature-title\">Messages vocaux</p>
  2303.                             <p class=\"pl-feature-desc\">Accédez à l’ensemble des messages vocaux enregistrés, en illimité.</p>
  2304.                         </div>
  2305.                     </li>
  2306.                     <li class=\"pl-feature\">
  2307.                         <span class=\"pl-feature-icon coral\">
  2308.                             <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">
  2309.                                 <path d=\"M20 12v6a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2v-6\"/>
  2310.                                 <rect x=\"6\" y=\"5\" width=\"12\" height=\"7\"/>
  2311.                                 <path d=\"M12 3v5\"/>
  2312.                             </svg>
  2313.                         </span>
  2314.                         <div class=\"pl-feature-text\">
  2315.                             <p class=\"pl-feature-title\">Souvenirs personnalisés</p>
  2316.                             <p class=\"pl-feature-desc\">Créez albums, livres et cadeaux uniques du séjour</p>
  2317.                         </div>
  2318.                     </li>
  2319.                     <li class=\"pl-feature\">
  2320.                         <span class=\"pl-feature-icon brown\">
  2321.                             <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">
  2322.                                 <path d=\"M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9\"/>
  2323.                                 <path d=\"M13.73 21a2 2 0 0 1-3.46 0\"/>
  2324.                             </svg>
  2325.                         </span>
  2326.                         <div class=\"pl-feature-text\">
  2327.                             <p class=\"pl-feature-title\">Notifications instantanées</p>
  2328.                             <p class=\"pl-feature-desc\">Restez informé à chaque nouvelle publication</p>
  2329.                         </div>
  2330.                     </li>
  2331.                 </ul>
  2332.                 <!-- Decorative illustration -->
  2333.                 <div class=\"pl-hero-illustration\">
  2334.                     <svg viewBox=\"0 0 400 280\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">
  2335.                         <!-- Background shapes -->
  2336.                         <ellipse cx=\"200\" cy=\"250\" rx=\"180\" ry=\"20\" fill=\"#E5E9F0\" opacity=\"0.5\"/>
  2337.                         
  2338.                         <!-- Phone mockup -->
  2339.                         <rect x=\"140\" y=\"30\" width=\"120\" height=\"200\" rx=\"16\" fill=\"#1A1A2E\"/>
  2340.                         <rect x=\"146\" y=\"40\" width=\"108\" height=\"180\" rx=\"12\" fill=\"#fff\"/>
  2341.                         
  2342.                         <!-- Phone content - photos grid -->
  2343.                         <rect x=\"152\" y=\"55\" width=\"48\" height=\"48\" rx=\"6\" fill=\"#F09E7A\" opacity=\"0.3\"/>
  2344.                         <rect x=\"152\" y=\"55\" width=\"48\" height=\"48\" rx=\"6\" fill=\"url(#imgGrad1)\"/>
  2345.                         <rect x=\"204\" y=\"55\" width=\"44\" height=\"48\" rx=\"6\" fill=\"#41A2AA\" opacity=\"0.3\"/>
  2346.                         <rect x=\"204\" y=\"55\" width=\"44\" height=\"48\" rx=\"6\" fill=\"url(#imgGrad2)\"/>
  2347.                         <rect x=\"152\" y=\"107\" width=\"96\" height=\"60\" rx=\"6\" fill=\"#F56040\" opacity=\"0.2\"/>
  2348.                         <rect x=\"152\" y=\"107\" width=\"96\" height=\"60\" rx=\"6\" fill=\"url(#imgGrad3)\"/>
  2349.                         
  2350.                         <!-- Photo icons -->
  2351.                         <circle cx=\"176\" cy=\"79\" r=\"12\" fill=\"#F09E7A\"/>
  2352.                         <path d=\"M170 82l4-5 3 3 5-6 6 8H170z\" fill=\"#fff\"/>
  2353.                         <circle cx=\"226\" cy=\"79\" r=\"10\" fill=\"#41A2AA\"/>
  2354.                         <polygon points=\"221,82 226,74 231,82\" fill=\"#fff\"/>
  2355.                         
  2356.                         <!-- Play button on video -->
  2357.                         <circle cx=\"200\" cy=\"137\" r=\"14\" fill=\"rgba(255,255,255,0.9)\"/>
  2358.                         <polygon points=\"196,131 196,143 208,137\" fill=\"#F56040\"/>
  2359.                         
  2360.                         <!-- Notification bar -->
  2361.                         <rect x=\"152\" y=\"175\" width=\"96\" height=\"38\" rx=\"8\" fill=\"#F8FAFB\"/>
  2362.                         <circle cx=\"168\" cy=\"194\" r=\"10\" fill=\"#41A2AA\"/>
  2363.                         <path d=\"M165 194l2 2 4-4\" stroke=\"#fff\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"/>
  2364.                         <rect x=\"184\" y=\"188\" width=\"50\" height=\"6\" rx=\"3\" fill=\"#E5E9F0\"/>
  2365.                         <rect x=\"184\" y=\"198\" width=\"35\" height=\"4\" rx=\"2\" fill=\"#E5E9F0\"/>
  2366.                         
  2367.                         <!-- Phone notch -->
  2368.                         <rect x=\"175\" y=\"34\" width=\"50\" height=\"4\" rx=\"2\" fill=\"#1A1A2E\"/>
  2369.                         
  2370.                         <!-- Decorative elements around -->
  2371.                         <circle cx=\"80\" cy=\"80\" r=\"8\" fill=\"#F09E7A\" opacity=\"0.6\"/>
  2372.                         <circle cx=\"320\" cy=\"100\" r=\"6\" fill=\"#41A2AA\" opacity=\"0.5\"/>
  2373.                         <circle cx=\"340\" cy=\"180\" r=\"10\" fill=\"#F56040\" opacity=\"0.4\"/>
  2374.                         <circle cx=\"60\" cy=\"180\" r=\"5\" fill=\"#41A2AA\" opacity=\"0.4\"/>
  2375.                         
  2376.                         <!-- Hearts/love -->
  2377.                         <path d=\"M300 60c-2-4-8-4-10 0-2-4-8-4-10 0 0 6 10 12 10 12s10-6 10-12z\" fill=\"#F09E7A\" opacity=\"0.7\"/>
  2378.                         
  2379.                         <!-- Stars -->
  2380.                         <path d=\"M70 120l2 4 4 1-3 3 1 4-4-2-4 2 1-4-3-3 4-1 2-4z\" fill=\"#FFD93D\" opacity=\"0.8\"/>
  2381.                         <path d=\"M350 140l1.5 3 3 .5-2 2 .5 3-3-1.5-3 1.5.5-3-2-2 3-.5 1.5-3z\" fill=\"#FFD93D\" opacity=\"0.6\"/>
  2382.                         
  2383.                         <!-- Gradients -->
  2384.                         <defs>
  2385.                             <linearGradient id=\"imgGrad1\" x1=\"152\" y1=\"55\" x2=\"200\" y2=\"103\">
  2386.                                 <stop offset=\"0%\" stop-color=\"#F09E7A\" stop-opacity=\"0.4\"/>
  2387.                                 <stop offset=\"100%\" stop-color=\"#F56040\" stop-opacity=\"0.3\"/>
  2388.                             </linearGradient>
  2389.                             <linearGradient id=\"imgGrad2\" x1=\"204\" y1=\"55\" x2=\"248\" y2=\"103\">
  2390.                                 <stop offset=\"0%\" stop-color=\"#41A2AA\" stop-opacity=\"0.4\"/>
  2391.                                 <stop offset=\"100%\" stop-color=\"#359BA3\" stop-opacity=\"0.3\"/>
  2392.                             </linearGradient>
  2393.                             <linearGradient id=\"imgGrad3\" x1=\"152\" y1=\"107\" x2=\"248\" y2=\"167\">
  2394.                                 <stop offset=\"0%\" stop-color=\"#F56040\" stop-opacity=\"0.3\"/>
  2395.                                 <stop offset=\"100%\" stop-color=\"#F09E7A\" stop-opacity=\"0.2\"/>
  2396.                             </linearGradient>
  2397.                         </defs>
  2398.                     </svg>
  2399.                     
  2400.                     <!-- Floating notification badges -->
  2401.                     <div class=\"pl-floating-badges\">
  2402.                         <div class=\"pl-badge pl-badge-1\">
  2403.                             <span class=\"pl-badge-icon orange\">
  2404.                                 <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">
  2405.                                     <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/>
  2406.                                     <circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\"/>
  2407.                                     <polyline points=\"21 15 16 10 5 21\"/>
  2408.                                 </svg>
  2409.                             </span>
  2410.                             <span>+12 photos</span>
  2411.                         </div>
  2412.                         <div class=\"pl-badge pl-badge-2\">
  2413.                             <span class=\"pl-badge-icon teal\">
  2414.                                 <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">
  2415.                                     <path d=\"M22 11.08V12a10 10 0 1 1-5.93-9.14\"/>
  2416.                                     <polyline points=\"22 4 12 14.01 9 11.01\"/>
  2417.                                 </svg>
  2418.                             </span>
  2419.                             <span>Bien arrivés !</span>
  2420.                         </div>
  2421.                     </div>
  2422.                 </div>
  2423.             </div>
  2424.         </section>
  2425.         <!-- RIGHT: Form -->
  2426.         <section class=\"pl-form-section\">
  2427.             <div class=\"pl-card\">
  2428.                 <!-- Tabs -->
  2429.                 <div class=\"pl-tabs\" role=\"tablist\">
  2430.                     <button class=\"pl-tab active\" role=\"tab\" data-tab=\"login\" aria-selected=\"true\">Se connecter</button>
  2431.                     <button class=\"pl-tab\" role=\"tab\" data-tab=\"register\" aria-selected=\"false\">Créer un compte</button>
  2432.                 </div>
  2433.                 <!-- LOGIN PANEL -->
  2434.                 <div class=\"pl-panel active\" id=\"panel-login\" role=\"tabpanel\">
  2435.                     {% if error %}
  2436.                     <div class=\"pl-error\">
  2437.                         <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">
  2438.                             <circle cx=\"12\" cy=\"12\" r=\"10\"/>
  2439.                             <line x1=\"12\" y1=\"8\" x2=\"12\" y2=\"12\"/>
  2440.                             <line x1=\"12\" y1=\"16\" x2=\"12.01\" y2=\"16\"/>
  2441.                         </svg>
  2442.                         Identifiant ou mot de passe incorrect.
  2443.                     </div>
  2444.                     {% endif %}
  2445.                     <form method=\"post\" action=\"{{ path('app_back_Parent') }}\" id=\"loginForm\" autocomplete=\"off\">
  2446.                         <!-- Code Séjour - Required for direct access -->
  2447.                         <div class=\"pl-form-group\">
  2448.                             <label class=\"pl-label\">
  2449.                                 Code séjour
  2450.                                 <span class=\"pl-required\">*</span>
  2451.                             </label>
  2452.                             <input type=\"text\" 
  2453.                                 class=\"pl-input pl-input-code\" 
  2454.                                 name=\"code_sejour\" 
  2455.                                 id=\"loginCode\" 
  2456.                                 placeholder=\"   XX000000\"
  2457.                                 maxlength=\"8\"
  2458.                                 autocomplete=\"one-time-code\"
  2459.                                 data-lpignore=\"true\"
  2460.                                 data-form-type=\"other\"
  2461.                                 required>
  2462.                             <p class=\"pl-hint\">
  2463.                                 <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">
  2464.                                     <circle cx=\"12\" cy=\"12\" r=\"10\"/>
  2465.                                     <path d=\"M12 16v-4\"/>
  2466.                                     <path d=\"M12 8h.01\"/>
  2467.                                 </svg>
  2468.                                 Code reçu par l'école ou l'organisateur du séjour
  2469.                             </p>
  2470.                         </div>
  2471.                         <div class=\"pl-form-group\">
  2472.                             <label class=\"pl-label\">Adresse e-mail</label>
  2473.                             <input type=\"email\" class=\"pl-input\" name=\"email\" id=\"loginEmail\" value=\"{{ last_username }}\" placeholder=\"votre@email.com\" autocomplete=\"username\" required>
  2474.                         </div>
  2475.                         <div class=\"pl-form-group\">
  2476.                             <label class=\"pl-label\">Mot de passe</label>
  2477.                             <div class=\"pl-password-wrap\">
  2478.                                 <input type=\"password\" class=\"pl-input\" name=\"password\" id=\"loginPwd\" placeholder=\"••••••••\" autocomplete=\"current-password\" required>
  2479.                                 <button type=\"button\" class=\"pl-eye-btn\" data-target=\"loginPwd\" aria-label=\"Afficher\">
  2480.                                     <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">
  2481.                                         <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\"/>
  2482.                                         <circle cx=\"12\" cy=\"12\" r=\"3\"/>
  2483.                                     </svg>
  2484.                                 </button>
  2485.                             </div>
  2486.                         </div>
  2487.                         <input type=\"hidden\" name=\"_csrf_token\" value=\"{{ csrf_token('authenticate') }}\">
  2488.                         <button type=\"submit\" class=\"pl-btn\">Se connecter</button>
  2489.                         <a href=\"{{ path('forgotPassparent') }}\" class=\"pl-forgot\">Vous avez oublié votre mot de passe ?</a>
  2490.                     </form>
  2491.                     <div class=\"pl-divider\">
  2492.                         <span class=\"pl-divider-line\"></span>
  2493.                         <span class=\"pl-divider-text\">ou</span>
  2494.                         <span class=\"pl-divider-line\"></span>
  2495.                     </div>
  2496.                     <div class=\"pl-socials\">
  2497.                         <a href=\"{{ path('connect_google_start') }}\" class=\"pl-social-btn pl-social-google\">
  2498.                             <img src=\"{{ asset('/images/icons-google.png') }}\" alt=\"\">
  2499.                             Continuer avec Google
  2500.                         </a>
  2501.                         <a href=\"{{ path('connect_facebook_start') }}\" class=\"pl-social-btn pl-social-facebook\">
  2502.                             <img src=\"{{ asset('/images/icons-facebook.png') }}\" alt=\"\">
  2503.                             Continuer avec Facebook
  2504.                         </a>
  2505.                     </div>
  2506.                 </div>
  2507.                 <!-- REGISTER PANEL -->
  2508.                 <div class=\"pl-panel\" id=\"panel-register\" role=\"tabpanel\">
  2509.                     <form id=\"registerForm\" onsubmit=\"return false;\" autocomplete=\"off\">
  2510.                      
  2511.                         <div class=\"pl-row\">
  2512.                             <div class=\"pl-form-group\">
  2513.                                 <label class=\"pl-label\">Nom</label>
  2514.                                 <input type=\"text\" class=\"pl-input\" id=\"regNom\" name=\"family-name\" placeholder=\"Votre nom\" autocomplete=\"family-name\" required>
  2515.                             </div>
  2516.                             <div class=\"pl-form-group\">
  2517.                                 <label class=\"pl-label\">Prénom</label>
  2518.                                 <input type=\"text\" class=\"pl-input\" id=\"regPrenom\" name=\"given-name\" placeholder=\"Votre prénom\" autocomplete=\"given-name\" required>
  2519.                             </div>
  2520.                         </div>
  2521.                         <div class=\"pl-form-group\">
  2522.                             <label class=\"pl-label\">Adresse e-mail</label>
  2523.                             <input type=\"email\" class=\"pl-input\" id=\"regEmail\" name=\"email\" placeholder=\"votre@email.com\" autocomplete=\"email\" required>
  2524.                         </div>
  2525.                         <div class=\"pl-form-group\">
  2526.                             <label class=\"pl-label\">Mot de passe</label>
  2527.                             <div class=\"pl-password-wrap\">
  2528.                                 <input type=\"password\" class=\"pl-input\" id=\"regPwd\" name=\"new-password\" placeholder=\"Minimum 6 caractères\" autocomplete=\"new-password\" required>
  2529.                                 <button type=\"button\" class=\"pl-eye-btn\" data-target=\"regPwd\" aria-label=\"Afficher\">
  2530.                                     <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">
  2531.                                         <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\"/>
  2532.                                         <circle cx=\"12\" cy=\"12\" r=\"3\"/>
  2533.                                     </svg>
  2534.                                 </button>
  2535.                             </div>
  2536.                         </div>
  2537.                         <div class=\"pl-form-group\">
  2538.                             <label class=\"pl-label\">Confirmer le mot de passe</label>
  2539.                             <div class=\"pl-password-wrap\">
  2540.                                 <input type=\"password\" class=\"pl-input\" id=\"regPwdConfirm\" name=\"confirm-password\" placeholder=\"Retapez votre mot de passe\" autocomplete=\"new-password\" required>
  2541.                                 <button type=\"button\" class=\"pl-eye-btn\" data-target=\"regPwdConfirm\" aria-label=\"Afficher\">
  2542.                                     <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">
  2543.                                         <path d=\"M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z\"/>
  2544.                                         <circle cx=\"12\" cy=\"12\" r=\"3\"/>
  2545.                                     </svg>
  2546.                                 </button>
  2547.                             </div>
  2548.                         </div>
  2549.                         <div class=\"pl-form-group\">
  2550.                             <label class=\"pl-label\">Téléphone portable</label>
  2551.                             <input type=\"tel\" class=\"pl-input\" id=\"regPhone\" placeholder=\"06 12 34 56 78\" required>
  2552.                         </div>
  2553.                         <div class=\"pl-notif-box\">
  2554.                             <p class=\"pl-notif-label\">Recevoir les notifications :</p>
  2555.                             <div class=\"pl-notif-opts\">
  2556.                                 <label class=\"pl-checkbox\">
  2557.                                     <input type=\"checkbox\" id=\"notifSms\">
  2558.                                     SMS
  2559.                                 </label>
  2560.                                 <label class=\"pl-checkbox\">
  2561.                                     <input type=\"checkbox\" id=\"notifEmail\" checked>
  2562.                                     E-mail
  2563.                                 </label>
  2564.                             </div>
  2565.                         </div>
  2566.                         <button type=\"button\" class=\"pl-btn pl-btn-secondary\" onclick=\"handleRegister()\">Créer mon compte Parent</button>
  2567.                         <p class=\"pl-note\">Vous pourrez modifier vos informations et vos préférences de notifications à tout moment.</p>
  2568.                     </form>
  2569.                     <div class=\"pl-divider\">
  2570.                         <span class=\"pl-divider-line\"></span>
  2571.                         <span class=\"pl-divider-text\">ou</span>
  2572.                         <span class=\"pl-divider-line\"></span>
  2573.                     </div>
  2574.                     <div class=\"pl-socials\">
  2575.                         <a href=\"{{ path('connect_google_start') }}\" class=\"pl-social-btn pl-social-google\">
  2576.                             <img src=\"{{ asset('/images/icons-google.png') }}\" alt=\"\">
  2577.                             Continuer avec Google
  2578.                         </a>
  2579.                         <a href=\"{{ path('connect_facebook_start') }}\" class=\"pl-social-btn pl-social-facebook\">
  2580.                             <img src=\"{{ asset('/images/icons-facebook.png') }}\" alt=\"\">
  2581.                             Continuer avec Facebook
  2582.                         </a>
  2583.                     </div>
  2584.                 </div>
  2585.             </div>
  2586.         </section>
  2587.     </main>
  2588.     <!-- Footer trust bar -->
  2589.     <footer class=\"pl-footer-trust\">
  2590.         <span class=\"pl-footer-item\">
  2591.             <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">
  2592.                 <rect x=\"3\" y=\"11\" width=\"18\" height=\"11\" rx=\"2\" ry=\"2\"/>
  2593.                 <path d=\"M7 11V7a5 5 0 0 1 10 0v4\"/>
  2594.             </svg>
  2595.             Connexion sécurisée
  2596.         </span>
  2597.         <span class=\"pl-footer-item\">
  2598.             <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">
  2599.                 <path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"/>
  2600.             </svg>
  2601.             Données protégées
  2602.         </span>
  2603.         <span class=\"pl-footer-item\">
  2604.             <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\">
  2605.                 <circle cx=\"12\" cy=\"12\" r=\"10\"/>
  2606.                 <line x1=\"2\" y1=\"12\" x2=\"22\" y2=\"12\"/>
  2607.                 <path d=\"M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z\"/>
  2608.             </svg>
  2609.             Hébergé en France
  2610.         </span>
  2611.     </footer>
  2612. </div>
  2613. {% endblock %}
  2614. {% block Footer %}
  2615. {{ parent() }}
  2616. {% endblock %}
  2617. {% block javascript %}
  2618. {{ parent() }}
  2619. <script src=\"https://cdn.jsdelivr.net/npm/sweetalert2@11/dist/sweetalert2.all.min.js\"></script>
  2620. <script>
  2621. document.addEventListener('DOMContentLoaded', function() {
  2622.     // Tab switching
  2623.     const tabs = document.querySelectorAll('.pl-tab');
  2624.     const panels = document.querySelectorAll('.pl-panel');
  2625.     tabs.forEach(tab => {
  2626.         tab.addEventListener('click', () => {
  2627.             const target = tab.dataset.tab;
  2628.             tabs.forEach(t => {
  2629.                 t.classList.remove('active');
  2630.                 t.setAttribute('aria-selected', 'false');
  2631.             });
  2632.             tab.classList.add('active');
  2633.             tab.setAttribute('aria-selected', 'true');
  2634.             panels.forEach(p => p.classList.remove('active'));
  2635.             document.getElementById('panel-' + target).classList.add('active');
  2636.         });
  2637.     });
  2638.     // Clear autofilled code séjour field on page load (browser autofill fix)
  2639.     const codeInput = document.getElementById('loginCode');
  2640.     if (codeInput) {
  2641.         // Clear any incorrect autofill value
  2642.         setTimeout(() => {
  2643.             const currentValue = codeInput.value;
  2644.             // If the value doesn't match code séjour format (2 letters + 6 digits), clear it
  2645.             if (currentValue && !/^[A-Z]{2}[0-9]{6}\$/.test(currentValue.toUpperCase())) {
  2646.                 codeInput.value = '';
  2647.             }
  2648.         }, 100);
  2649.     }
  2650.     // Password toggle
  2651.     document.querySelectorAll('.pl-eye-btn').forEach(btn => {
  2652.         btn.addEventListener('click', () => {
  2653.             const input = document.getElementById(btn.dataset.target);
  2654.             const isPassword = input.type === 'password';
  2655.             input.type = isPassword ? 'text' : 'password';
  2656.             btn.querySelector('svg').style.opacity = isPassword ? '0.5' : '1';
  2657.         });
  2658.     });
  2659.     // Auto-format code séjour (uppercase) and validation
  2660.     if (codeInput) {
  2661.         codeInput.addEventListener('input', (e) => {
  2662.             let value = e.target.value.toUpperCase().replace(/[^A-Z0-9]/g, '');
  2663.             e.target.value = value;
  2664.             
  2665.             // Visual feedback when complete
  2666.             if (value.length === 8) {
  2667.                 e.target.style.borderColor = '#41A2AA';
  2668.                 e.target.style.background = 'rgba(65, 162, 170, 0.06)';
  2669.             } else {
  2670.                 e.target.style.borderColor = '';
  2671.                 e.target.style.background = '';
  2672.             }
  2673.         });
  2674.         // Validate on form submit
  2675.         document.getElementById('loginForm').addEventListener('submit', function(e) {
  2676.             const codePattern = /^[A-Z]{2}[0-9]{6}\$/;
  2677.             if (!codePattern.test(codeInput.value)) {
  2678.                 e.preventDefault();
  2679.                 codeInput.classList.add('is-invalid');
  2680.                 Swal.fire({
  2681.                     icon: 'error',
  2682.                     title: 'Code séjour invalide',
  2683.                     html: '<p style=\"margin-bottom:8px;\">Le code doit contenir :</p><p style=\"color:#5A6178;font-size:14px;\"><strong>2 lettres</strong> + <strong>6 chiffres</strong><br>Exemple : <span style=\"color:#41A2AA;font-weight:600;\">PF270076</span></p>',
  2684.                     confirmButtonColor: '#41a2aa'
  2685.                 });
  2686.             } else {
  2687.                 // Show loading state on button
  2688.                 const btn = this.querySelector('button[type=\"submit\"]');
  2689.                 btn.classList.add('pl-btn-loading');
  2690.                 btn.disabled = true;
  2691.             }
  2692.         });
  2693.     }
  2694.     // Add visual feedback when email is valid
  2695.     const emailInputs = document.querySelectorAll('input[type=\"email\"]');
  2696.     emailInputs.forEach(input => {
  2697.         input.addEventListener('blur', function() {
  2698.             const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+\$/;
  2699.             if (this.value && emailRegex.test(this.value)) {
  2700.                 this.classList.add('is-valid');
  2701.                 this.classList.remove('is-invalid');
  2702.             } else if (this.value) {
  2703.                 this.classList.add('is-invalid');
  2704.                 this.classList.remove('is-valid');
  2705.             }
  2706.         });
  2707.         input.addEventListener('input', function() {
  2708.             this.classList.remove('is-valid', 'is-invalid');
  2709.         });
  2710.     });
  2711.     // Login error
  2712.     {% if error %}
  2713.     Swal.fire({
  2714.         icon: 'error',
  2715.         title: 'Erreur de connexion',
  2716.         text: 'Identifiant ou mot de passe incorrect.',
  2717.         confirmButtonColor: '#41a2aa'
  2718.     });
  2719.     {% endif %}
  2720. });
  2721. // Registration
  2722. function handleRegister() {
  2723.     const loader = document.getElementById('plLoader');
  2724.     const fields = {
  2725.         nom: document.getElementById('regNom'),
  2726.         prenom: document.getElementById('regPrenom'),
  2727.         email: document.getElementById('regEmail'),
  2728.         pwd: document.getElementById('regPwd'),
  2729.         pwdConfirm: document.getElementById('regPwdConfirm'),
  2730.         phone: document.getElementById('regPhone')
  2731.     };
  2732.     // Reset
  2733.     Object.values(fields).forEach(f => f.classList.remove('is-invalid'));
  2734.     // Validate
  2735.     let valid = true;
  2736.     if (!fields.nom.value.trim()) { fields.nom.classList.add('is-invalid'); valid = false; }
  2737.     if (!fields.prenom.value.trim()) { fields.prenom.classList.add('is-invalid'); valid = false; }
  2738.     const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+\$/;
  2739.     if (!emailRegex.test(fields.email.value)) { fields.email.classList.add('is-invalid'); valid = false; }
  2740.     if (fields.pwd.value.length < 6) {
  2741.         fields.pwd.classList.add('is-invalid');
  2742.         Swal.fire({ icon: 'warning', title: 'Mot de passe trop court', text: 'Minimum 6 caractères.', confirmButtonColor: '#41a2aa' });
  2743.         return;
  2744.     }
  2745.     if (fields.pwd.value !== fields.pwdConfirm.value) {
  2746.         fields.pwdConfirm.classList.add('is-invalid');
  2747.         Swal.fire({ icon: 'warning', title: 'Erreur', text: 'Les mots de passe ne correspondent pas.', confirmButtonColor: '#41a2aa' });
  2748.         return;
  2749.     }
  2750.     if (!fields.phone.value.trim()) { fields.phone.classList.add('is-invalid'); valid = false; }
  2751.     if (!valid) return;
  2752.     loader.classList.add('active');
  2753.     const data = {
  2754.         nomparent: fields.nom.value.trim(),
  2755.         prenomparent: fields.prenom.value.trim(),
  2756.         mailprent: fields.email.value.trim(),
  2757.         numtel: fields.phone.value.trim(),
  2758.         passwordparent: fields.pwd.value,
  2759.         confirmpassword: fields.pwdConfirm.value,
  2760.         sms: document.getElementById('notifSms').checked ? 1 : 0,
  2761.         mailnotif: document.getElementById('notifEmail').checked ? 1 : 0
  2762.     };
  2763.     fetch(\"{{ path('parent_register') }}\", {
  2764.         method: 'POST',
  2765.         headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  2766.         body: new URLSearchParams(data)
  2767.     })
  2768.     .then(r => r.text())
  2769.     .then(result => {
  2770.         loader.classList.remove('active');
  2771.         if (result === 'eror') {
  2772.             fields.email.classList.add('is-invalid');
  2773.             Swal.fire({
  2774.                 icon: 'error',
  2775.                 title: 'Email déjà utilisé',
  2776.                 text: 'Cette adresse est déjà associée à un compte.',
  2777.                 footer: '<a href=\"{{ path(\"forgotPassparent\") }}\" style=\"color:#F09E7A;\">Mot de passe oublié ?</a>',
  2778.                 confirmButtonColor: '#41a2aa'
  2779.             });
  2780.         } else if (result === 'erorpasswordconfirm') {
  2781.             fields.pwdConfirm.classList.add('is-invalid');
  2782.             Swal.fire({ icon: 'error', title: 'Erreur', text: 'Les mots de passe ne correspondent pas.', confirmButtonColor: '#41a2aa' });
  2783.         } else {
  2784.             Swal.fire({
  2785.                 icon: 'success',
  2786.                 title: '🎉 Bienvenue !',
  2787.                 html: '<p>Votre compte parent est presque prêt.</p><p style=\"color:#5A6178;font-size:14px;\">📩 Un e-mail vous a été envoyé pour activer votre compte.</p>',
  2788.                 confirmButtonText: 'Compris',
  2789.                 confirmButtonColor: '#41a2aa'
  2790.             }).then(() => location.reload());
  2791.         }
  2792.     })
  2793.     .catch(() => {
  2794.         loader.classList.remove('active');
  2795.         Swal.fire({ icon: 'error', title: 'Erreur', text: 'Un problème est survenu. Veuillez réessayer.', confirmButtonColor: '#F09E7A' });
  2796.     });
  2797. }
  2798. </script>
  2799. {% endblock %}
  2800. ""Parent/LoginParent.html.twig""/var/www/5sur5sejour/templates/Parent/LoginParent.html.twig");
  2801.     }
  2802. }