<?phpuse Twig\Environment;use Twig\Error\LoaderError;use Twig\Error\RuntimeError;use Twig\Extension\CoreExtension;use Twig\Extension\SandboxExtension;use Twig\Markup;use Twig\Sandbox\SecurityError;use Twig\Sandbox\SecurityNotAllowedTagError;use Twig\Sandbox\SecurityNotAllowedFilterError;use Twig\Sandbox\SecurityNotAllowedFunctionError;use Twig\Source;use Twig\Template;use Twig\TemplateWrapper;/* application/whileresume/application/jobs/show_en.html.twig */class __TwigTemplate_4ba3adcc16cbde8b23780a72aa4561a0 extends Template{ private Source $source; /** * @var array<string, Template> */ private array $macros = []; public function __construct(Environment $env) { parent::__construct($env); $this->source = $this->getSourceContext(); $this->blocks = [ 'title' => [$this, 'block_title'], 'description' => [$this, 'block_description'], 'robots' => [$this, 'block_robots'], 'css' => [$this, 'block_css'], 'body' => [$this, 'block_body'], 'footerjs' => [$this, 'block_footerjs'], ]; } protected function doGetParent(array $context): bool|string|Template|TemplateWrapper { // line 1 return "vitrine/lexend/layout.html.twig"; } protected function doDisplay(array $context, array $blocks = []): iterable { $macros = $this->macros; $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"]; $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "template", "application/whileresume/application/jobs/show_en.html.twig")); $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"]; $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "template", "application/whileresume/application/jobs/show_en.html.twig")); $this->parent = $this->load("vitrine/lexend/layout.html.twig", 1); yield from $this->parent->unwrap()->yield($context, array_merge($this->blocks, $blocks)); $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof); $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof); } // line 3 /** * @return iterable<null|scalar|\Stringable> */ public function block_title(array $context, array $blocks = []): iterable { $macros = $this->macros; $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"]; $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "title")); $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"]; $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "title")); yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env, $this->source, (isset($context["job"]) || array_key_exists("job", $context) ? $context["job"] : (function () { throw new RuntimeError('Variable "job" does not exist.', 3, $this->source); })()), "shortTitle", [], "any", false, false, false, 3), "html", null, true); $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof); $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof); yield from []; } // line 4 /** * @return iterable<null|scalar|\Stringable> */ public function block_description(array $context, array $blocks = []): iterable { $macros = $this->macros; $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"]; $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "description")); $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"]; $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "description")); yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env, $this->source, (isset($context["job"]) || array_key_exists("job", $context) ? $context["job"] : (function () { throw new RuntimeError('Variable "job" does not exist.', 4, $this->source); })()), "shortDescription", [], "any", false, false, false, 4), "html", null, true); $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof); $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof); yield from []; } // line 5 /** * @return iterable<null|scalar|\Stringable> */ public function block_robots(array $context, array $blocks = []): iterable { $macros = $this->macros; $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"]; $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "robots")); $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"]; $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "robots")); yield "index,follow"; $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof); $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof); yield from []; } // line 11 /** * @return iterable<null|scalar|\Stringable> */ public function block_css(array $context, array $blocks = []): iterable { $macros = $this->macros; $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"]; $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "css")); $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"]; $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "css")); // line 12 yield " <style> .wr-search-section{position:relative;z-index:2;width:100%;max-width:720px;margin:0 auto} .wr-search-bar{display:flex;align-items:center;background:#fff;border-radius:16px;padding:6px;box-shadow:0 4px 24px rgba(108,58,237,.08),0 1px 3px rgba(0,0,0,.04);border:2px solid transparent;transition:border-color .3s,box-shadow .3s;cursor:pointer} .wr-search-bar:hover,.wr-search-bar.active{border-color:rgba(108,58,237,.2);box-shadow:0 8px 32px rgba(108,58,237,.12),0 2px 6px rgba(0,0,0,.04)} .wr-search-icon{padding:12px 14px;color:#9CA3AF;display:flex;align-items:center;flex-shrink:0} .wr-search-input-wrapper{flex:1;position:relative;height:48px;display:flex;align-items:center;overflow:hidden} .wr-search-real-input{width:100%;border:none;outline:none;font-size:16px;color:#1E1B2E;background:transparent;font-family:inherit} .wr-search-real-input::placeholder{color:#9CA3AF} .wr-search-btn{background:var(--color-primary,#6C3AED);color:#fff;border:none;padding:12px 24px;border-radius:12px;font-size:15px;font-weight:600;cursor:pointer;display:flex;align-items:center;gap:6px;transition:background .2s,transform .15s;flex-shrink:0;font-family:inherit} .wr-search-btn:hover{filter:brightness(1.1);transform:scale(1.02)} @media(max-width:640px){.wr-search-btn span{display:none}.wr-search-btn{padding:12px 14px}} .wr-search-results{position:relative;background:#fff;border-radius:16px;box-shadow:0 12px 48px rgba(0,0,0,.1),0 2px 8px rgba(0,0,0,.04);padding:0;max-height:0;overflow:hidden;transition:max-height .5s ease,padding .5s ease,margin .5s ease,opacity .4s ease;z-index:10;opacity:0;margin-top:0} .wr-search-results.visible{max-height:2000px;padding:8px;margin-top:12px;opacity:1} .wr-result-item{display:flex;align-items:center;gap:14px;padding:12px 14px;border-radius:12px;cursor:pointer;transition:background .2s,opacity .3s ease,transform .3s ease;opacity:0;transform:translateY(8px);text-decoration:none;color:inherit} .wr-result-item.show{opacity:1;transform:translateY(0)} .wr-result-item:hover{background:#F5F3FF} .wr-result-item+.wr-result-item{border-top:1px solid rgba(0,0,0,.04)} .wr-result-logo{width:44px;height:44px;border-radius:10px;display:flex;align-items:center;justify-content:center;font-size:18px;flex-shrink:0;font-weight:700} .wr-result-logo img{width:100%;height:100%;object-fit:cover;border-radius:10px} .wr-result-info{flex:1;text-align:left;min-width:0} .wr-result-title{font-size:14px;font-weight:600;color:#1E1B2E;margin-bottom:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .wr-result-meta{display:flex;align-items:center;gap:8px;font-size:12px;color:#9CA3AF;flex-wrap:wrap} .wr-result-company{color:#4B5563;font-weight:500} .wr-result-badge{display:inline-flex;padding:2px 8px;border-radius:6px;font-size:11px;font-weight:600} .wr-badge-new{background:#DCFCE7;color:#16A34A} .wr-result-salary{font-size:13px;font-weight:600;color:var(--color-primary,#6C3AED);white-space:nowrap} .wr-result-actions{display:flex;align-items:center;gap:8px;flex-shrink:0} .wr-loading{text-align:center;padding:30px 20px} .wr-spinner{display:inline-block;width:28px;height:28px;border:3px solid rgba(108,58,237,.15);border-top-color:var(--color-primary,#6C3AED);border-radius:50%;animation:wrSpin .7s linear infinite} @keyframes wrSpin{to{transform:rotate(360deg)}} .wr-empty-state{text-align:center;padding:40px 20px} .wr-empty-icon{font-size:40px;margin-bottom:12px} .wr-empty-title{font-size:16px;font-weight:600;color:#1E1B2E;margin:0 0 6px} .wr-empty-text{font-size:14px;color:#9CA3AF;margin:0} .wr-load-more{display:flex;justify-content:center;padding:12px 8px 4px} .wr-load-more-btn{background:none;border:2px solid var(--color-primary,#6C3AED);color:var(--color-primary,#6C3AED);padding:8px 24px;border-radius:10px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s;font-family:inherit} .wr-load-more-btn:hover{background:var(--color-primary,#6C3AED);color:#fff} .wr-load-more-btn:disabled{opacity:.5;cursor:not-allowed} .wr-results-count{text-align:center;padding:10px;font-size:13px;color:#9CA3AF;border-top:1px solid rgba(0,0,0,.04);margin-top:4px} .wr-results-count strong{color:var(--color-primary,#6C3AED)} .wr-search-close-wrap{text-align:right;padding:4px 8px 0} .wr-search-close-btn{background:none;border:1px solid rgba(0,0,0,.1);color:#9CA3AF;padding:4px 12px;border-radius:8px;font-size:12px;cursor:pointer;transition:all .2s;font-family:inherit} .wr-search-close-btn:hover{background:#F5F3FF;color:var(--color-primary,#6C3AED);border-color:rgba(108,58,237,.2)} "; // line 57 yield " .job-tags{display:flex;flex-wrap:wrap;gap:8px;justify-content:center} .job-tag{display:inline-flex;align-items:center;gap:5px;padding:6px 14px;border-radius:100px;font-size:13px;font-weight:500;background:#fff;border:1px solid rgba(0,0,0,.08);color:#4B5563} .job-tag i,.job-tag svg{font-size:13px;color:var(--color-primary,#6C3AED);width:14px;height:14px} .job-tag-salary{background:linear-gradient(135deg,#EDE9FE,#F5F3FF);border-color:rgba(108,58,237,.15);color:var(--color-primary,#6C3AED);font-weight:600} .job-tag-external{background:#FFFBEB;border-color:rgba(245,158,11,.2);color:#92400E;font-size:12px} .job-body-card{background:#fff;border-radius:20px;box-shadow:0 4px 32px rgba(0,0,0,.06),0 1px 4px rgba(0,0,0,.03);border:1px solid rgba(0,0,0,.05);padding:32px;max-width:780px;margin:0 auto} @media(max-width:640px){.job-body-card{padding:20px;border-radius:16px}} .job-section-title{font-size:15px;font-weight:700;color:var(--color-primary,#6C3AED);text-transform:uppercase;letter-spacing:.06em;margin:0 0 10px;display:flex;align-items:center;gap:8px} .job-section-title::before{content:'';display:inline-block;width:4px;height:18px;border-radius:2px;background:var(--color-primary,#6C3AED)} .job-section-text{font-size:16px;line-height:1.75;color:#374151;margin:0} .job-section-divider{border:none;border-top:1px solid rgba(0,0,0,.06);margin:24px 0} .job-cta-bar{display:flex;align-items:center;justify-content:center;gap:12px;flex-wrap:wrap;padding:24px 0 0} .job-cta-main{display:inline-flex;align-items:center;gap:8px;padding:14px 32px;border-radius:14px;font-size:16px;font-weight:700;border:none;cursor:pointer;transition:all .2s;text-decoration:none;font-family:inherit} .job-cta-main.active{background:var(--color-primary,#6C3AED);color:#fff;box-shadow:0 4px 16px rgba(108,58,237,.25)} .job-cta-main.active:hover{filter:brightness(1.1);transform:translateY(-1px);box-shadow:0 6px 24px rgba(108,58,237,.3)} .job-cta-main.disabled{background:#E5E7EB;color:#9CA3AF;cursor:default;box-shadow:none;pointer-events:none} .job-cta-company{display:inline-flex;align-items:center;gap:6px;padding:14px 24px;border-radius:14px;font-size:15px;font-weight:600;border:2px solid rgba(0,0,0,.08);background:#fff;color:#374151;cursor:pointer;transition:all .2s;text-decoration:none;font-family:inherit} .job-cta-company:hover{border-color:rgba(108,58,237,.2);color:var(--color-primary,#6C3AED)} .job-locked-overlay{position:relative;margin-top:24px} .job-locked-blur{filter:blur(6px);opacity:.4;pointer-events:none;user-select:none} .job-locked-cta{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;background:rgba(255,255,255,.7);backdrop-filter:blur(3px);border-radius:16px;padding:20px} .job-locked-title{font-size:18px;font-weight:700;color:#1E1B2E;text-align:center} .job-locked-text{font-size:14px;color:#6B7280;text-align:center;max-width:360px} .job-locked-btn{display:inline-flex;align-items:center;gap:6px;padding:12px 28px;background:var(--color-primary,#6C3AED);color:#fff;border:none;border-radius:12px;font-size:15px;font-weight:600;cursor:pointer;transition:all .2s;text-decoration:none;font-family:inherit} .job-locked-btn:hover{filter:brightness(1.1);transform:translateY(-1px)} .job-locked-login{font-size:13px;color:#6B7280} .job-locked-login a{color:var(--color-primary,#6C3AED);font-weight:600;text-decoration:none} .job-locked-login a:hover{text-decoration:underline} </style>"; $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof); $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof); yield from []; } // line 88 /** * @return iterable<null|scalar|\Stringable> */ public function block_body(array $context, array $blocks = []): iterable { $macros = $this->macros; $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"]; $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "body")); $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"]; $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "body")); // line 89 yield " <div id=\"hero_header\" class=\"hero-header section panel overflow-hidden\"> <div class=\"position-absolute top-0 start-0 end-0 h-screen dark:bg-gray-300 dark:bg-opacity-15 rounded-bottom-2 lg:rounded-bottom-5\"></div> <div class=\"section-outer panel py-8 lg:py-9 xl:py-10\"> <div class=\"container\"> <div class=\"section-inner panel\"> <div class=\"d-none xl:d-block\"> <div class=\"position-absolute rounded-circle border border-dashed border-primary-300 dark:border-white dark:border-opacity-15 cstack w-56px h-56px d-none lg:d-block\" style=\"top: 5%; left: 5%\" data-anime=\"translateY: [0, 10]; easing: linear; loop: true; direction: alternate; delay: 0;\"><img class=\"p-narrow rounded-circle\" src=\"/uploads/no_avatar.png\" alt=\"Anonymous candidate\"></div> <div class=\"position-absolute rounded-circle border border-dashed border-primary-300 dark:border-white dark:border-opacity-15 cstack w-56px h-56px d-none lg:d-block\" style=\"top: 20%; left: 10%\" data-anime=\"translateY: [0, 15]; easing: linear; loop: true; direction: alternate; delay: 25;\"><img class=\"p-narrow rounded-circle\" src=\"/uploads/no_avatar.png\" alt=\"Anonymous candidate\"></div> <div class=\"position-absolute rounded-circle border border-dashed border-primary-300 dark:border-white dark:border-opacity-15 cstack w-56px h-56px d-none lg:d-block\" style=\"top: 35%; left: 0%\" data-anime=\"translateY: [0, 5]; easing: linear; loop: true; direction: alternate; delay: 25;\"><img class=\"p-narrow rounded-circle\" src=\"/uploads/no_avatar.png\" alt=\"Anonymous candidate\"></div> <div class=\"position-absolute rounded-circle border border-dashed border-primary-300 dark:border-white dark:border-opacity-15 cstack w-56px h-56px d-none lg:d-block\" style=\"top: 5%; right: 5%\" data-anime=\"translateY: [0, 10]; easing: linear; loop: true; direction: alternate; delay: 0;\"><img class=\"p-narrow rounded-circle\" src=\"/uploads/no_avatar.png\" alt=\"Anonymous candidate\"></div> <div class=\"position-absolute rounded-circle border border-dashed border-primary-300 dark:border-white dark:border-opacity-15 cstack w-56px h-56px d-none lg:d-block\" style=\"top: 20%; right: 10%\" data-anime=\"translateY: [0, 15]; easing: linear; loop: true; direction: alternate; delay: 25;\"><img class=\"p-narrow rounded-circle\" src=\"/uploads/no_avatar.png\" alt=\"Anonymous candidate\"></div> <div class=\"position-absolute rounded-circle border border-dashed border-primary-300 dark:border-white dark:border-opacity-15 cstack w-56px h-56px d-none lg:d-block\" style=\"top: 35%; right: 0%\" data-anime=\"translateY: [0, 5]; easing: linear; loop: true; direction: alternate; delay: 25;\"><img class=\"p-narrow rounded-circle\" src=\"/uploads/no_avatar.png\" alt=\"Anonymous candidate\"></div> </div> <div class=\"row child-cols-12 justify-center items-center g-8\"> <div class=\"lg:col-12\"> <div class=\"panel vstack gap-4 lg:gap-6\"> <div class=\"panel vstack justify-center items-center gap-2 px-2 pt-4 text-center\"> <span class=\"fs-6 fw-bold text-uppercase text-primary\">"; // line 107 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env, $this->source, (isset($context["job"]) || array_key_exists("job", $context) ? $context["job"] : (function () { throw new RuntimeError('Variable "job" does not exist.', 107, $this->source); })()), "companyName", [], "any", false, false, false, 107), "html", null, true); yield " is hiring</span> <h1 class=\"h3 md:h2 lg:display-4 m-0\">"; // line 108 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env, $this->source, (isset($context["job"]) || array_key_exists("job", $context) ? $context["job"] : (function () { throw new RuntimeError('Variable "job" does not exist.', 108, $this->source); })()), "jobtitle", [], "any", false, false, false, 108), "html", null, true); yield "</h1> </div> <div class=\"wr-search-section\" id=\"wrSearchSection\"> <div class=\"wr-search-bar\" id=\"wrSearchBar\"> <div class=\"wr-search-icon\"> <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"M21 21l-4.35-4.35\"/></svg> </div> <div class=\"wr-search-input-wrapper\"> <input type=\"text\" id=\"wrSearchInput\" class=\"wr-search-real-input\" placeholder=\"Search for a job, company, or city...\" autocomplete=\"off\"> </div> <button class=\"wr-search-btn\" id=\"wrSearchBtn\"> <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"M21 21l-4.35-4.35\"/></svg> <span>Search</span> </button> </div> </div> <div class=\"wr-search-results\" id=\"wrSearchResults\"> <div class=\"wr-search-close-wrap\"> <button class=\"wr-search-close-btn\" id=\"wrSearchClose\">✕ Close</button> </div> <div id=\"wrJobsList\"></div> <div id=\"wrLoading\" class=\"wr-loading\" style=\"display:none;\"> <div class=\"wr-spinner\"></div> </div> <div id=\"wrEmptyState\" class=\"wr-empty-state\" style=\"display:none;\"> <div class=\"wr-empty-icon\">🔍</div> <p class=\"wr-empty-title\">No jobs match your search</p> <p class=\"wr-empty-text\">Try different keywords</p> </div> <div id=\"wrLoadMore\" class=\"wr-load-more\" style=\"display:none;\"> <button class=\"wr-load-more-btn\" id=\"wrLoadMoreBtn\">Show more jobs</button> </div> <div class=\"wr-results-count\" id=\"wrResultsCount\" style=\"display:none;\"> <strong id=\"wrTotalCount\">0</strong> jobs found </div> </div> </div> </div> </div> </div> </div> </div> </div> "; // line 158 yield " <div id=\"job_details\" class=\"job-details section panel pb-6 xl:pb-9\"> <div class=\"section-outer panel\"> <div class=\"container max-w-lg\"> <div class=\"section-inner panel\"> "; // line 164 yield " <div class=\"job-tags mb-4\" style=\"margin-top:-10px;\"> "; // line 165 if ((($tmp = !Twig\Extension\CoreExtension::testEmpty(CoreExtension::getAttribute($this->env, $this->source, (isset($context["job"]) || array_key_exists("job", $context) ? $context["job"] : (function () { throw new RuntimeError('Variable "job" does not exist.', 165, $this->source); })()), "companyName", [], "any", false, false, false, 165))) && $tmp instanceof Markup ? (string) $tmp : $tmp)) { // line 166 yield " <span class=\"job-tag\"> <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"2\" y=\"7\" width=\"20\" height=\"14\" rx=\"2\"/><path d=\"M16 7V5a4 4 0 00-8 0v2\"/></svg> "; // line 168 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env, $this->source, (isset($context["job"]) || array_key_exists("job", $context) ? $context["job"] : (function () { throw new RuntimeError('Variable "job" does not exist.', 168, $this->source); })()), "companyName", [], "any", false, false, false, 168), "html", null, true); yield " </span> "; } // line 171 yield " "; if ((($tmp = !Twig\Extension\CoreExtension::testEmpty(CoreExtension::getAttribute($this->env, $this->source, (isset($context["job"]) || array_key_exists("job", $context) ? $context["job"] : (function () { throw new RuntimeError('Variable "job" does not exist.', 171, $this->source); })()), "employmentType", [], "any", false, false, false, 171))) && $tmp instanceof Markup ? (string) $tmp : $tmp)) { // line 172 yield " <span class=\"job-tag\"> <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M12 6v6l4 2\"/></svg> "; // line 174 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env, $this->source, (isset($context["job"]) || array_key_exists("job", $context) ? $context["job"] : (function () { throw new RuntimeError('Variable "job" does not exist.', 174, $this->source); })()), "employmentType", [], "any", false, false, false, 174), "html", null, true); yield " </span> "; } // line 177 yield " "; if ((($tmp = !Twig\Extension\CoreExtension::testEmpty(CoreExtension::getAttribute($this->env, $this->source, (isset($context["job"]) || array_key_exists("job", $context) ? $context["job"] : (function () { throw new RuntimeError('Variable "job" does not exist.', 177, $this->source); })()), "city", [], "any", false, false, false, 177))) && $tmp instanceof Markup ? (string) $tmp : $tmp)) { // line 178 yield " <span class=\"job-tag\"> <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0118 0z\"/><circle cx=\"12\" cy=\"10\" r=\"3\"/></svg> "; // line 180 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env, $this->source, (isset($context["job"]) || array_key_exists("job", $context) ? $context["job"] : (function () { throw new RuntimeError('Variable "job" does not exist.', 180, $this->source); })()), "city", [], "any", false, false, false, 180), "html", null, true); if ((($tmp = !(null === CoreExtension::getAttribute($this->env, $this->source, (isset($context["job"]) || array_key_exists("job", $context) ? $context["job"] : (function () { throw new RuntimeError('Variable "job" does not exist.', 180, $this->source); })()), "country", [], "any", false, false, false, 180))) && $tmp instanceof Markup ? (string) $tmp : $tmp)) { yield ", "; yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env, $this->source, (isset($context["job"]) || array_key_exists("job", $context) ? $context["job"] : (function () { throw new RuntimeError('Variable "job" does not exist.', 180, $this->source); })()), "country", [], "any", false, false, false, 180), "html", null, true); } // line 181 yield " </span> "; } // line 183 yield " "; if ((($tmp = !Twig\Extension\CoreExtension::testEmpty(CoreExtension::getAttribute($this->env, $this->source, (isset($context["job"]) || array_key_exists("job", $context) ? $context["job"] : (function () { throw new RuntimeError('Variable "job" does not exist.', 183, $this->source); })()), "remoteWork", [], "any", false, false, false, 183))) && $tmp instanceof Markup ? (string) $tmp : $tmp)) { // line 184 yield " <span class=\"job-tag\"> <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"2\" y=\"3\" width=\"20\" height=\"14\" rx=\"2\"/><path d=\"M8 21h8M12 17v4\"/></svg> "; // line 186 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env, $this->source, (isset($context["job"]) || array_key_exists("job", $context) ? $context["job"] : (function () { throw new RuntimeError('Variable "job" does not exist.', 186, $this->source); })()), "remoteWork", [], "any", false, false, false, 186), "html", null, true); yield " </span> "; } // line 189 yield " "; if ((($tmp = !Twig\Extension\CoreExtension::testEmpty(CoreExtension::getAttribute($this->env, $this->source, (isset($context["job"]) || array_key_exists("job", $context) ? $context["job"] : (function () { throw new RuntimeError('Variable "job" does not exist.', 189, $this->source); })()), "experienceLevel", [], "any", false, false, false, 189))) && $tmp instanceof Markup ? (string) $tmp : $tmp)) { // line 190 yield " <span class=\"job-tag\"> <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M22 11.08V12a10 10 0 11-5.93-9.14\"/><path d=\"M22 4L12 14.01l-3-3\"/></svg> +"; // line 192 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env, $this->source, (isset($context["job"]) || array_key_exists("job", $context) ? $context["job"] : (function () { throw new RuntimeError('Variable "job" does not exist.', 192, $this->source); })()), "experienceLevel", [], "any", false, false, false, 192), "html", null, true); yield " years experience </span> "; } // line 195 yield " "; if ((($tmp = !(null === CoreExtension::getAttribute($this->env, $this->source, (isset($context["job"]) || array_key_exists("job", $context) ? $context["job"] : (function () { throw new RuntimeError('Variable "job" does not exist.', 195, $this->source); })()), "salaryPeriod", [], "any", false, false, false, 195))) && $tmp instanceof Markup ? (string) $tmp : $tmp)) { // line 196 yield " <span class=\"job-tag job-tag-salary\"> <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><line x1=\"12\" y1=\"1\" x2=\"12\" y2=\"23\"/><path d=\"M17 5H9.5a3.5 3.5 0 000 7h5a3.5 3.5 0 010 7H6\"/></svg> "; // line 198 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env, $this->source, (isset($context["job"]) || array_key_exists("job", $context) ? $context["job"] : (function () { throw new RuntimeError('Variable "job" does not exist.', 198, $this->source); })()), "salaryMin", [], "any", false, false, false, 198), "html", null, true); yield " – "; yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env, $this->source, (isset($context["job"]) || array_key_exists("job", $context) ? $context["job"] : (function () { throw new RuntimeError('Variable "job" does not exist.', 198, $this->source); })()), "salaryMax", [], "any", false, false, false, 198), "html", null, true); yield " "; yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env, $this->source, (isset($context["job"]) || array_key_exists("job", $context) ? $context["job"] : (function () { throw new RuntimeError('Variable "job" does not exist.', 198, $this->source); })()), "devise", [], "any", false, false, false, 198), "html", null, true); yield "/"; yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env, $this->source, (isset($context["job"]) || array_key_exists("job", $context) ? $context["job"] : (function () { throw new RuntimeError('Variable "job" does not exist.', 198, $this->source); })()), "salaryPeriod", [], "any", false, false, false, 198), "html", null, true); yield " </span> "; } // line 201 yield " "; if ((CoreExtension::getAttribute($this->env, $this->source, (isset($context["job"]) || array_key_exists("job", $context) ? $context["job"] : (function () { throw new RuntimeError('Variable "job" does not exist.', 201, $this->source); })()), "verification", [], "any", false, false, false, 201) == 0)) { // line 202 yield " <span class=\"job-tag job-tag-external\"> ⚡ Indexed listing — external source </span> "; } // line 206 yield " </div> "; // line 209 yield " <div class=\"job-body-card\"> "; // line 212 yield " "; if ((($tmp = !(null === CoreExtension::getAttribute($this->env, $this->source, (isset($context["job"]) || array_key_exists("job", $context) ? $context["job"] : (function () { throw new RuntimeError('Variable "job" does not exist.', 212, $this->source); })()), "jobSummary", [], "any", false, false, false, 212))) && $tmp instanceof Markup ? (string) $tmp : $tmp)) { // line 213 yield " <div class=\"job-section-title\">Job overview</div> <p class=\"job-section-text\">"; // line 214 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env, $this->source, (isset($context["job"]) || array_key_exists("job", $context) ? $context["job"] : (function () { throw new RuntimeError('Variable "job" does not exist.', 214, $this->source); })()), "jobSummary", [], "any", false, false, false, 214), "html", null, true); yield "</p> "; } // line 216 yield " "; // line 217 if ((null === CoreExtension::getAttribute($this->env, $this->source, (isset($context["app"]) || array_key_exists("app", $context) ? $context["app"] : (function () { throw new RuntimeError('Variable "app" does not exist.', 217, $this->source); })()), "user", [], "any", false, false, false, 217))) { // line 218 yield " <hr class=\"job-section-divider\"> <div class=\"job-section-title\">Responsibilities</div> <p class=\"job-section-text\">Find here the full details of the responsibilities for this role: daily tasks, projects to lead, goals to achieve and scope of work within the team. Everything you need to picture yourself in the role and know exactly what to expect from day one.</p> <hr class=\"job-section-divider\"> <div class=\"job-section-title\">Required profile</div> <p class=\"job-section-text\">Access the technical and interpersonal skills expected by the recruiter, the required experience level, valued qualifications and personal qualities sought. Check at a glance whether your profile matches this opportunity before applying.</p> <hr class=\"job-section-divider\"> <div class=\"job-section-title\">Benefits</div> <p class=\"job-section-text\">Discover what the company offers its employees: remote work policy, health coverage, bonuses, continuous training, work environment and growth opportunities. All the information you need to compare this offer with your expectations and make the right choice.</p> "; } // line 231 yield " "; // line 232 if ((($tmp = !(null === CoreExtension::getAttribute($this->env, $this->source, (isset($context["app"]) || array_key_exists("app", $context) ? $context["app"] : (function () { throw new RuntimeError('Variable "app" does not exist.', 232, $this->source); })()), "user", [], "any", false, false, false, 232))) && $tmp instanceof Markup ? (string) $tmp : $tmp)) { // line 233 yield " "; // line 234 yield " "; // line 235 if ((($tmp = !(null === CoreExtension::getAttribute($this->env, $this->source, (isset($context["job"]) || array_key_exists("job", $context) ? $context["job"] : (function () { throw new RuntimeError('Variable "job" does not exist.', 235, $this->source); })()), "keyResponsabilities", [], "any", false, false, false, 235))) && $tmp instanceof Markup ? (string) $tmp : $tmp)) { // line 236 yield " <hr class=\"job-section-divider\"> <div class=\"job-section-title\">Responsibilities</div> <p class=\"job-section-text\">"; // line 238 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env, $this->source, (isset($context["job"]) || array_key_exists("job", $context) ? $context["job"] : (function () { throw new RuntimeError('Variable "job" does not exist.', 238, $this->source); })()), "keyResponsabilities", [], "any", false, false, false, 238), "html", null, true); yield "</p> "; } // line 240 yield " "; // line 241 if ((($tmp = !(null === CoreExtension::getAttribute($this->env, $this->source, (isset($context["job"]) || array_key_exists("job", $context) ? $context["job"] : (function () { throw new RuntimeError('Variable "job" does not exist.', 241, $this->source); })()), "requirements", [], "any", false, false, false, 241))) && $tmp instanceof Markup ? (string) $tmp : $tmp)) { // line 242 yield " <hr class=\"job-section-divider\"> <div class=\"job-section-title\">Required profile</div> <p class=\"job-section-text\">"; // line 244 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env, $this->source, (isset($context["job"]) || array_key_exists("job", $context) ? $context["job"] : (function () { throw new RuntimeError('Variable "job" does not exist.', 244, $this->source); })()), "requirements", [], "any", false, false, false, 244), "html", null, true); yield "</p> "; } // line 246 yield " "; // line 247 if ((($tmp = !(null === CoreExtension::getAttribute($this->env, $this->source, (isset($context["job"]) || array_key_exists("job", $context) ? $context["job"] : (function () { throw new RuntimeError('Variable "job" does not exist.', 247, $this->source); })()), "benefits", [], "any", false, false, false, 247))) && $tmp instanceof Markup ? (string) $tmp : $tmp)) { // line 248 yield " <hr class=\"job-section-divider\"> <div class=\"job-section-title\">Benefits</div> <p class=\"job-section-text\">"; // line 250 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env, $this->source, (isset($context["job"]) || array_key_exists("job", $context) ? $context["job"] : (function () { throw new RuntimeError('Variable "job" does not exist.', 250, $this->source); })()), "benefits", [], "any", false, false, false, 250), "html", null, true); yield "</p> "; } // line 252 yield " "; // line 254 yield " <div class=\"job-cta-bar\"> "; // line 256 if ((($tmp = !(null === CoreExtension::getAttribute($this->env, $this->source, CoreExtension::getAttribute($this->env, $this->source, (isset($context["app"]) || array_key_exists("app", $context) ? $context["app"] : (function () { throw new RuntimeError('Variable "app" does not exist.', 256, $this->source); })()), "user", [], "any", false, false, false, 256), "candidate", [], "any", false, false, false, 256))) && $tmp instanceof Markup ? (string) $tmp : $tmp)) { // line 257 yield " <a href=\""; yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("cvs_application_job_like", ["slug" => CoreExtension::getAttribute($this->env, $this->source, (isset($context["job"]) || array_key_exists("job", $context) ? $context["job"] : (function () { throw new RuntimeError('Variable "job" does not exist.', 257, $this->source); })()), "slug", [], "any", false, false, false, 257)]), "html", null, true); yield "\" class=\"job-cta-main active\"> <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\" stroke=\"none\"><path d=\"M20.84 4.61a5.5 5.5 0 00-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 00-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 000-7.78z\"/></svg> I'm interested </a> "; } // line 262 yield " "; // line 263 if (((CoreExtension::getAttribute($this->env, $this->source, (isset($context["job"]) || array_key_exists("job", $context) ? $context["job"] : (function () { throw new RuntimeError('Variable "job" does not exist.', 263, $this->source); })()), "websearch", [], "any", false, false, false, 263) == 1) && !Twig\Extension\CoreExtension::testEmpty(CoreExtension::getAttribute($this->env, $this->source, (isset($context["job"]) || array_key_exists("job", $context) ? $context["job"] : (function () { throw new RuntimeError('Variable "job" does not exist.', 263, $this->source); })()), "website", [], "any", false, false, false, 263)))) { // line 264 yield " <a href=\""; yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env, $this->source, (isset($context["job"]) || array_key_exists("job", $context) ? $context["job"] : (function () { throw new RuntimeError('Variable "job" does not exist.', 264, $this->source); })()), "website", [], "any", false, false, false, 264), "html", null, true); yield "\" target=\"_blank\" class=\"job-cta-main active\"> <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6\"/><polyline points=\"15 3 21 3 21 9\"/><line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/></svg> Apply </a> "; } // line 269 yield " "; // line 270 if ((($tmp = !(null === CoreExtension::getAttribute($this->env, $this->source, (isset($context["job"]) || array_key_exists("job", $context) ? $context["job"] : (function () { throw new RuntimeError('Variable "job" does not exist.', 270, $this->source); })()), "enterprise", [], "any", false, false, false, 270))) && $tmp instanceof Markup ? (string) $tmp : $tmp)) { // line 271 yield " <a href=\""; yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("cvs_application_company_show", ["slug" => CoreExtension::getAttribute($this->env, $this->source, CoreExtension::getAttribute($this->env, $this->source, (isset($context["job"]) || array_key_exists("job", $context) ? $context["job"] : (function () { throw new RuntimeError('Variable "job" does not exist.', 271, $this->source); })()), "enterprise", [], "any", false, false, false, 271), "slug", [], "any", false, false, false, 271)]), "html", null, true); yield "\" class=\"job-cta-company\"> <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"2\" y=\"7\" width=\"20\" height=\"14\" rx=\"2\"/><path d=\"M16 7V5a4 4 0 00-8 0v2\"/></svg> View other listings </a> "; } // line 276 yield " </div> "; } else { // line 279 yield " "; // line 280 yield " "; // line 282 yield " <div class=\"job-locked-overlay\"> <div class=\"job-locked-blur\"> <hr class=\"job-section-divider\"> <div class=\"job-section-title\">Responsibilities</div> <p class=\"job-section-text\">Discover the main responsibilities of this role, daily tasks and projects you will be working on within the team...</p> <hr class=\"job-section-divider\"> <div class=\"job-section-title\">Required profile</div> <p class=\"job-section-text\">Technical and soft skills required, expected experience level, valued qualifications and certifications for this role...</p> <hr class=\"job-section-divider\"> <div class=\"job-section-title\">Benefits</div> <p class=\"job-section-text\">Remote work, health insurance, meal vouchers, continuous training, work environment and career growth within the company...</p> </div> <div class=\"job-locked-cta\"> <div style=\"font-size:32px;\">🔓</div> <div class=\"job-locked-title\">Unlock the full listing</div> <div class=\"job-locked-text\">Create your profile in 2 minutes to access responsibilities, benefits and apply directly</div> <a href=\""; // line 298 yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("app_register"); yield "\" class=\"job-locked-btn\"> Create my profile for free <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M7 17l9.2-9.2M17 17V7H7\"/></svg> </a> <div class=\"job-locked-login\">Already registered? <a href=\""; // line 302 yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("app_login"); yield "\">Log in</a></div> </div> </div> "; } // line 307 yield " </div> </div> </div> </div> </div> "; // line 318 if ((($tmp = !(null === (isset($context["othersJobs"]) || array_key_exists("othersJobs", $context) ? $context["othersJobs"] : (function () { throw new RuntimeError('Variable "othersJobs" does not exist.', 318, $this->source); })()))) && $tmp instanceof Markup ? (string) $tmp : $tmp)) { // line 319 yield " <div id=\"openings\" class=\"career-openings section panel overflow-hidden pb-6 xl:pb-9\"> <div class=\"section-outer panel py-6 xl:py-9 bg-secondary dark:bg-gray-800\"> <div class=\"container max-w-lg\"> <div class=\"section-inner panel\"> <div class=\"panel vstack justify-center gap-4 sm:gap-6 xl:gap-8\"> <h2 class=\"h4 sm:h2 m-0 text-center\" data-anime=\"onview: -100; translateY: [48, 0]; opacity: [0, 1]; easing: spring(1, 80, 10, 0); duration: 450; delay: 100;\"> Job openings at "; // line 326 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(Twig\Extension\CoreExtension::capitalize($this->env->getCharset(), Twig\Extension\CoreExtension::lower($this->env->getCharset(), CoreExtension::getAttribute($this->env, $this->source, CoreExtension::getAttribute($this->env, $this->source, (isset($context["job"]) || array_key_exists("job", $context) ? $context["job"] : (function () { throw new RuntimeError('Variable "job" does not exist.', 326, $this->source); })()), "enterprise", [], "any", false, false, false, 326), "companyName", [], "any", false, false, false, 326))), "html", null, true); yield " </h2> <div class=\"panel\"> <div class=\"panel\"> <div class=\"row child-cols-12 sm:child-cols-6 col-match g-2 sm:g-3 uc-grid\"> "; // line 333 $context['_parent'] = $context; $context['_seq'] = CoreExtension::ensureTraversable((isset($context["othersJobs"]) || array_key_exists("othersJobs", $context) ? $context["othersJobs"] : (function () { throw new RuntimeError('Variable "othersJobs" does not exist.', 333, $this->source); })())); foreach ($context['_seq'] as $context["_key"] => $context["oj"]) { // line 334 yield " <div class=\"panel\"> <div class=\"panel vstack justify-end items-end gap-1 p-3 rounded lg:rounded-2 bg-white dark:bg-gray-800\"> <div class=\"vstack gap-narrow\"> <h5 class=\"h6 lg:h5 m-0\">"; // line 337 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env, $this->source, $context["oj"], "jobTitle", [], "any", false, false, false, 337), "html", null, true); yield "</h5> <span class=\"fs-6 text-dark dark:text-white text-opacity-70\">"; // line 338 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env, $this->source, $context["oj"], "city", [], "any", false, false, false, 338), "html", null, true); yield "</span> </div> <a href=\""; // line 340 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("cvs_application_job_show", ["slug" => CoreExtension::getAttribute($this->env, $this->source, $context["oj"], "slug", [], "any", false, false, false, 340)]), "html", null, true); yield "\" class=\"uc-link fs-7 fw-bold d-inline-flex items-center gap-narrow border-bottom pb-narrow\"> <span>Apply</span> <i class=\"icon icon-narrow unicon-arrow-up-right fw-bold rtl:-rotate-90\"></i> </a> </div> </div> "; } $_parent = $context['_parent']; unset($context['_seq'], $context['_key'], $context['oj'], $context['_parent']); $context = array_intersect_key($context, $_parent) + $_parent; // line 348 yield " </div> </div> </div> </div> </div> </div> </div> </div> "; } // line 358 yield " "; // line 360 if ((array_key_exists("similarJobs", $context) && !Twig\Extension\CoreExtension::testEmpty((isset($context["similarJobs"]) || array_key_exists("similarJobs", $context) ? $context["similarJobs"] : (function () { throw new RuntimeError('Variable "similarJobs" does not exist.', 360, $this->source); })())))) { // line 361 yield " <div id=\"similar_jobs\" class=\"similar-jobs section panel overflow-hidden pb-6 xl:pb-9\"> <div class=\"section-outer panel py-6 xl:py-9\"> <div class=\"container max-w-lg\"> <div class=\"section-inner panel\"> <div class=\"panel vstack justify-center gap-4 sm:gap-6 xl:gap-8\"> <div class=\"vstack items-center text-center gap-1\"> <h2 class=\"h4 sm:h2 m-0\">Similar jobs</h2> </div> <div class=\"panel\"> <div class=\"row child-cols-12 sm:child-cols-6 lg:child-cols-4 col-match g-2 sm:g-3\"> "; // line 373 $context['_parent'] = $context; $context['_seq'] = CoreExtension::ensureTraversable((isset($context["similarJobs"]) || array_key_exists("similarJobs", $context) ? $context["similarJobs"] : (function () { throw new RuntimeError('Variable "similarJobs" does not exist.', 373, $this->source); })())); foreach ($context['_seq'] as $context["_key"] => $context["sj"]) { // line 374 yield " <div class=\"panel\"> <a href=\""; // line 375 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape($this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("cvs_application_job_show", ["slug" => CoreExtension::getAttribute($this->env, $this->source, $context["sj"], "slug", [], "any", false, false, false, 375)]), "html", null, true); yield "\" class=\"panel vstack gap-2 p-3 rounded-2 bg-white dark:bg-gray-800 h-100\" style=\"box-shadow: 0 2px 12px rgba(0,0,0,0.06), 0 1px 3px rgba(0,0,0,0.04); border: 1px solid rgba(0,0,0,0.06); text-decoration: none; color: inherit; transition: box-shadow 0.2s ease, transform 0.2s ease;\" onmouseover=\"this.style.boxShadow='0 8px 32px rgba(0,0,0,0.10), 0 2px 8px rgba(0,0,0,0.06)'; this.style.transform='translateY(-2px)';\" onmouseout=\"this.style.boxShadow='0 2px 12px rgba(0,0,0,0.06), 0 1px 3px rgba(0,0,0,0.04)'; this.style.transform='translateY(0)';\"> "; // line 378 yield " "; if ((($tmp = !Twig\Extension\CoreExtension::testEmpty(CoreExtension::getAttribute($this->env, $this->source, $context["sj"], "companyName", [], "any", false, false, false, 378))) && $tmp instanceof Markup ? (string) $tmp : $tmp)) { // line 379 yield " <div class=\"hstack gap-1 items-center\"> <div class=\"cstack w-32px h-32px rounded-1 bg-secondary\" style=\"min-width: 32px;\"> <i class=\"icon-narrow unicon-portfolio text-primary\" style=\"font-size: 14px;\"></i> </div> <span class=\"fs-7 fw-bold text-dark text-opacity-50\" style=\"overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\">"; // line 383 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env, $this->source, $context["sj"], "companyName", [], "any", false, false, false, 383), "html", null, true); yield "</span> </div> "; } // line 386 yield " "; // line 388 yield " <h5 class=\"h6 lg:h5 m-0\" style=\"line-height: 1.4;\">"; yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env, $this->source, $context["sj"], "jobTitle", [], "any", false, false, false, 388), "html", null, true); yield "</h5> "; // line 391 yield " <div class=\"vstack gap-narrow mt-auto\"> "; // line 392 if ((($tmp = !Twig\Extension\CoreExtension::testEmpty(CoreExtension::getAttribute($this->env, $this->source, $context["sj"], "city", [], "any", false, false, false, 392))) && $tmp instanceof Markup ? (string) $tmp : $tmp)) { // line 393 yield " <div class=\"hstack gap-narrow items-center fs-7 text-dark text-opacity-60\"> <i class=\"icon-narrow unicon-location\" style=\"font-size: 12px;\"></i> <span>"; // line 395 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env, $this->source, $context["sj"], "city", [], "any", false, false, false, 395), "html", null, true); if ((($tmp = !(null === CoreExtension::getAttribute($this->env, $this->source, $context["sj"], "country", [], "any", false, false, false, 395))) && $tmp instanceof Markup ? (string) $tmp : $tmp)) { yield ", "; yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env, $this->source, $context["sj"], "country", [], "any", false, false, false, 395), "html", null, true); } yield "</span> </div> "; } // line 398 yield " "; if ((($tmp = !Twig\Extension\CoreExtension::testEmpty(CoreExtension::getAttribute($this->env, $this->source, $context["sj"], "employmentType", [], "any", false, false, false, 398))) && $tmp instanceof Markup ? (string) $tmp : $tmp)) { // line 399 yield " <div class=\"hstack gap-narrow items-center fs-7 text-dark text-opacity-60\"> <i class=\"icon-narrow unicon-portfolio\" style=\"font-size: 12px;\"></i> <span>"; // line 401 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env, $this->source, $context["sj"], "employmentType", [], "any", false, false, false, 401), "html", null, true); yield "</span> </div> "; } // line 404 yield " "; if ((($tmp = !Twig\Extension\CoreExtension::testEmpty(CoreExtension::getAttribute($this->env, $this->source, $context["sj"], "remoteWork", [], "any", false, false, false, 404))) && $tmp instanceof Markup ? (string) $tmp : $tmp)) { // line 405 yield " <div class=\"hstack gap-narrow items-center fs-7 text-dark text-opacity-60\"> <i class=\"icon-narrow unicon-laptop\" style=\"font-size: 12px;\"></i> <span>"; // line 407 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env, $this->source, $context["sj"], "remoteWork", [], "any", false, false, false, 407), "html", null, true); yield "</span> </div> "; } // line 410 yield " </div> "; // line 413 yield " "; if ((($tmp = !Twig\Extension\CoreExtension::testEmpty(CoreExtension::getAttribute($this->env, $this->source, $context["sj"], "category", [], "any", false, false, false, 413))) && $tmp instanceof Markup ? (string) $tmp : $tmp)) { // line 414 yield " <div class=\"hstack gap-narrow flex-wrap mt-1\"> <span class=\"px-1 py-narrow fs-8 fw-bold rounded bg-secondary text-primary\" style=\"white-space: nowrap;\">"; // line 415 yield $this->env->getRuntime('Twig\Runtime\EscaperRuntime')->escape(CoreExtension::getAttribute($this->env, $this->source, $context["sj"], "category", [], "any", false, false, false, 415), "html", null, true); yield "</span> </div> "; } // line 418 yield " "; // line 420 yield " <div class=\"hstack items-center gap-narrow mt-1 fs-7 fw-bold text-primary\"> <span>View listing</span> <i class=\"icon icon-narrow unicon-arrow-up-right fw-bold\" style=\"font-size: 12px;\"></i> </div> </a> </div> "; } $_parent = $context['_parent']; unset($context['_seq'], $context['_key'], $context['sj'], $context['_parent']); $context = array_intersect_key($context, $_parent) + $_parent; // line 428 yield " </div> </div> </div> </div> </div> </div> </div> "; } // line 437 yield ""; $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof); $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof); yield from []; } // line 442 /** * @return iterable<null|scalar|\Stringable> */ public function block_footerjs(array $context, array $blocks = []): iterable { $macros = $this->macros; $__internal_5a27a8ba21ca79b61932376b2fa922d2 = $this->extensions["Symfony\\Bundle\\WebProfilerBundle\\Twig\\WebProfilerExtension"]; $__internal_5a27a8ba21ca79b61932376b2fa922d2->enter($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "footerjs")); $__internal_6f47bbe9983af81f1e7450e9a3e3768f = $this->extensions["Symfony\\Bridge\\Twig\\Extension\\ProfilerExtension"]; $__internal_6f47bbe9983af81f1e7450e9a3e3768f->enter($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof = new \Twig\Profiler\Profile($this->getTemplateName(), "block", "footerjs")); // line 443 yield " <script> (function(){ var JOB_BASE_URL = '/job/'; var SEARCH_API = '"; // line 447 yield $this->extensions['Symfony\Bridge\Twig\Extension\RoutingExtension']->getPath("api_jobs_search"); yield "'; var palette = [ {bg:'#EDE9FE',color:'#7C3AED'},{bg:'#DBEAFE',color:'#2563EB'}, {bg:'#D1FAE5',color:'#059669'},{bg:'#FEF3C7',color:'#D97706'}, {bg:'#FCE7F3',color:'#DB2777'},{bg:'#FEE2E2',color:'#DC2626'}, {bg:'#E0E7FF',color:'#4338CA'},{bg:'#CCFBF1',color:'#0D9488'} ]; function getColor(name){ var h=0;for(var i=0;i<name.length;i++) h=name.charCodeAt(i)+((h<<5)-h); return palette[Math.abs(h)%palette.length]; } var searchInput = document.getElementById('wrSearchInput'); var searchBtn = document.getElementById('wrSearchBtn'); var searchResults = document.getElementById('wrSearchResults'); var searchClose = document.getElementById('wrSearchClose'); var jobsList = document.getElementById('wrJobsList'); var loading = document.getElementById('wrLoading'); var emptyState = document.getElementById('wrEmptyState'); var loadMoreWrap = document.getElementById('wrLoadMore'); var loadMoreBtn = document.getElementById('wrLoadMoreBtn'); var resultsCount = document.getElementById('wrResultsCount'); var totalCountEl = document.getElementById('wrTotalCount'); var currentQuery = ''; var currentOffset = 0; var LIMIT = 10; var isLoading = false; var debounceTimer; function renderJob(job){ var col = getColor(job.companyName); var logoHtml; if(job.image){ logoHtml = '<div class=\"wr-result-logo\"><img src=\"'+job.image+'\" alt=\"'+job.companyName+'\"></div>'; } else { logoHtml = '<div class=\"wr-result-logo\" style=\"background:'+col.bg+';color:'+col.color+';\">'+(job.logo || job.companyName.charAt(0).toUpperCase())+'</div>'; } var badgeHtml = ''; if(job.isNew) badgeHtml = '<span class=\"wr-result-badge wr-badge-new\">Nouveau</span>'; var salaryHtml = job.salary ? '<span class=\"wr-result-salary\">'+job.salary+'</span>' : ''; var remoteHtml = ''; if(job.remoteWork && job.remoteWork !== '' && job.remoteWork !== 'no'){ var remoteLabel = job.remoteWork === 'full' ? 'Full remote' : (job.remoteWork === 'hybrid' ? 'Hybrid' : job.remoteWork); remoteHtml = '<span>·</span><span>'+remoteLabel+'</span>'; } var div = document.createElement('a'); div.className = 'wr-result-item'; div.href = JOB_BASE_URL + job.slug; div.innerHTML = logoHtml + '<div class=\"wr-result-info\">' + '<div class=\"wr-result-title\">' + job.jobTitle + '</div>' + '<div class=\"wr-result-meta\">' + '<span class=\"wr-result-company\">' + job.companyName + '</span>' + (job.city ? '<span>·</span><span>' + job.city + '</span>' : '') + '<span>·</span><span>' + (job.employmentType || '') + '</span>' + remoteHtml + badgeHtml + '</div>' + '</div>' + '<div class=\"wr-result-actions\">' + salaryHtml + '</div>'; return div; } function fetchJobs(query, offset, append){ if(isLoading) return; if(query.length < 2) return; isLoading = true; if(!append){ jobsList.innerHTML = ''; loadMoreWrap.style.display = 'none'; resultsCount.style.display = 'none'; } searchResults.classList.add('visible'); loading.style.display = 'block'; emptyState.style.display = 'none'; var url = SEARCH_API + '?q=' + encodeURIComponent(query) + '&offset=' + offset + '&limit=' + LIMIT; fetch(url, {credentials:'same-origin'}) .then(function(r){ return r.json(); }) .then(function(data){ loading.style.display = 'none'; isLoading = false; if(data.total === 0){ emptyState.style.display = 'block'; return; } data.jobs.forEach(function(job, i){ var el = renderJob(job); jobsList.appendChild(el); setTimeout(function(){ el.classList.add('show'); }, 50 + i * 60); }); totalCountEl.textContent = data.total; resultsCount.style.display = 'block'; if(data.hasMore){ loadMoreWrap.style.display = 'flex'; } else { loadMoreWrap.style.display = 'none'; } currentOffset = offset + data.jobs.length; }) .catch(function(err){ console.error('Search error:', err); loading.style.display = 'none'; isLoading = false; }); } searchClose.addEventListener('click', function(){ searchResults.classList.remove('visible'); jobsList.innerHTML = ''; searchInput.value = ''; loadMoreWrap.style.display = 'none'; resultsCount.style.display = 'none'; emptyState.style.display = 'none'; }); searchInput.addEventListener('input', function(){ clearTimeout(debounceTimer); var q = searchInput.value.trim(); if(q.length < 2){ searchResults.classList.remove('visible'); jobsList.innerHTML = ''; return; } debounceTimer = setTimeout(function(){ currentQuery = q; currentOffset = 0; fetchJobs(currentQuery, 0, false); }, 350); }); searchBtn.addEventListener('click', function(e){ e.preventDefault(); clearTimeout(debounceTimer); currentQuery = searchInput.value.trim(); currentOffset = 0; fetchJobs(currentQuery, 0, false); }); searchInput.addEventListener('keydown', function(e){ if(e.key === 'Enter'){ e.preventDefault(); clearTimeout(debounceTimer); currentQuery = searchInput.value.trim(); currentOffset = 0; fetchJobs(currentQuery, 0, false); } }); loadMoreBtn.addEventListener('click', function(){ fetchJobs(currentQuery, currentOffset, true); });})(); </script>"; $__internal_6f47bbe9983af81f1e7450e9a3e3768f->leave($__internal_6f47bbe9983af81f1e7450e9a3e3768f_prof); $__internal_5a27a8ba21ca79b61932376b2fa922d2->leave($__internal_5a27a8ba21ca79b61932376b2fa922d2_prof); yield from []; } /** * @codeCoverageIgnore */ public function getTemplateName(): string { return "application/whileresume/application/jobs/show_en.html.twig"; } /** * @codeCoverageIgnore */ public function isTraitable(): bool { return false; } /** * @codeCoverageIgnore */ public function getDebugInfo(): array { return array ( 861 => 447, 855 => 443, 842 => 442, 828 => 437, 817 => 428, 804 => 420, 801 => 418, 795 => 415, 792 => 414, 789 => 413, 785 => 410, 779 => 407, 775 => 405, 772 => 404, 766 => 401, 762 => 399, 759 => 398, 749 => 395, 745 => 393, 743 => 392, 740 => 391, 734 => 388, 731 => 386, 725 => 383, 719 => 379, 716 => 378, 711 => 375, 708 => 374, 704 => 373, 690 => 361, 688 => 360, 684 => 358, 672 => 348, 658 => 340, 653 => 338, 649 => 337, 644 => 334, 640 => 333, 630 => 326, 621 => 319, 619 => 318, 606 => 307, 598 => 302, 591 => 298, 573 => 282, 570 => 280, 568 => 279, 563 => 276, 554 => 271, 552 => 270, 549 => 269, 540 => 264, 538 => 263, 535 => 262, 526 => 257, 524 => 256, 520 => 254, 517 => 252, 512 => 250, 508 => 248, 506 => 247, 503 => 246, 498 => 244, 494 => 242, 492 => 241, 489 => 240, 484 => 238, 480 => 236, 478 => 235, 475 => 234, 473 => 233, 471 => 232, 468 => 231, 453 => 218, 451 => 217, 448 => 216, 443 => 214, 440 => 213, 437 => 212, 433 => 209, 429 => 206, 423 => 202, 420 => 201, 408 => 198, 404 => 196, 401 => 195, 395 => 192, 391 => 190, 388 => 189, 382 => 186, 378 => 184, 375 => 183, 371 => 181, 365 => 180, 361 => 178, 358 => 177, 352 => 174, 348 => 172, 345 => 171, 339 => 168, 335 => 166, 333 => 165, 330 => 164, 323 => 158, 273 => 108, 269 => 107, 249 => 89, 236 => 88, 196 => 57, 150 => 12, 137 => 11, 114 => 5, 91 => 4, 68 => 3, 45 => 1,); } public function getSourceContext(): Source { return new Source("{% extends 'vitrine/lexend/layout.html.twig' %}{% block title %}{{ job.shortTitle }}{% endblock title %}{% block description %}{{ job.shortDescription }}{% endblock description %}{% block robots %}index,follow{% endblock robots %}{#% block meta_social %}{{ parent() }}{% include \"/vitrine/components/socialmedia.html.twig\" with { 'page':page,'social_type':'website' } %}{% endblock meta_social %}{% block meta %}{{ parent() }}{% include \"/vitrine/components/author.html.twig\" with {'page':page } %}{% endblock meta %#}{#% block canonical %}{% include \"/vitrine/lexend/components/languages/canonical_classic.html.twig\" %}{% endblock canonical %#}{% block css %} <style> .wr-search-section{position:relative;z-index:2;width:100%;max-width:720px;margin:0 auto} .wr-search-bar{display:flex;align-items:center;background:#fff;border-radius:16px;padding:6px;box-shadow:0 4px 24px rgba(108,58,237,.08),0 1px 3px rgba(0,0,0,.04);border:2px solid transparent;transition:border-color .3s,box-shadow .3s;cursor:pointer} .wr-search-bar:hover,.wr-search-bar.active{border-color:rgba(108,58,237,.2);box-shadow:0 8px 32px rgba(108,58,237,.12),0 2px 6px rgba(0,0,0,.04)} .wr-search-icon{padding:12px 14px;color:#9CA3AF;display:flex;align-items:center;flex-shrink:0} .wr-search-input-wrapper{flex:1;position:relative;height:48px;display:flex;align-items:center;overflow:hidden} .wr-search-real-input{width:100%;border:none;outline:none;font-size:16px;color:#1E1B2E;background:transparent;font-family:inherit} .wr-search-real-input::placeholder{color:#9CA3AF} .wr-search-btn{background:var(--color-primary,#6C3AED);color:#fff;border:none;padding:12px 24px;border-radius:12px;font-size:15px;font-weight:600;cursor:pointer;display:flex;align-items:center;gap:6px;transition:background .2s,transform .15s;flex-shrink:0;font-family:inherit} .wr-search-btn:hover{filter:brightness(1.1);transform:scale(1.02)} @media(max-width:640px){.wr-search-btn span{display:none}.wr-search-btn{padding:12px 14px}} .wr-search-results{position:relative;background:#fff;border-radius:16px;box-shadow:0 12px 48px rgba(0,0,0,.1),0 2px 8px rgba(0,0,0,.04);padding:0;max-height:0;overflow:hidden;transition:max-height .5s ease,padding .5s ease,margin .5s ease,opacity .4s ease;z-index:10;opacity:0;margin-top:0} .wr-search-results.visible{max-height:2000px;padding:8px;margin-top:12px;opacity:1} .wr-result-item{display:flex;align-items:center;gap:14px;padding:12px 14px;border-radius:12px;cursor:pointer;transition:background .2s,opacity .3s ease,transform .3s ease;opacity:0;transform:translateY(8px);text-decoration:none;color:inherit} .wr-result-item.show{opacity:1;transform:translateY(0)} .wr-result-item:hover{background:#F5F3FF} .wr-result-item+.wr-result-item{border-top:1px solid rgba(0,0,0,.04)} .wr-result-logo{width:44px;height:44px;border-radius:10px;display:flex;align-items:center;justify-content:center;font-size:18px;flex-shrink:0;font-weight:700} .wr-result-logo img{width:100%;height:100%;object-fit:cover;border-radius:10px} .wr-result-info{flex:1;text-align:left;min-width:0} .wr-result-title{font-size:14px;font-weight:600;color:#1E1B2E;margin-bottom:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis} .wr-result-meta{display:flex;align-items:center;gap:8px;font-size:12px;color:#9CA3AF;flex-wrap:wrap} .wr-result-company{color:#4B5563;font-weight:500} .wr-result-badge{display:inline-flex;padding:2px 8px;border-radius:6px;font-size:11px;font-weight:600} .wr-badge-new{background:#DCFCE7;color:#16A34A} .wr-result-salary{font-size:13px;font-weight:600;color:var(--color-primary,#6C3AED);white-space:nowrap} .wr-result-actions{display:flex;align-items:center;gap:8px;flex-shrink:0} .wr-loading{text-align:center;padding:30px 20px} .wr-spinner{display:inline-block;width:28px;height:28px;border:3px solid rgba(108,58,237,.15);border-top-color:var(--color-primary,#6C3AED);border-radius:50%;animation:wrSpin .7s linear infinite} @keyframes wrSpin{to{transform:rotate(360deg)}} .wr-empty-state{text-align:center;padding:40px 20px} .wr-empty-icon{font-size:40px;margin-bottom:12px} .wr-empty-title{font-size:16px;font-weight:600;color:#1E1B2E;margin:0 0 6px} .wr-empty-text{font-size:14px;color:#9CA3AF;margin:0} .wr-load-more{display:flex;justify-content:center;padding:12px 8px 4px} .wr-load-more-btn{background:none;border:2px solid var(--color-primary,#6C3AED);color:var(--color-primary,#6C3AED);padding:8px 24px;border-radius:10px;font-size:14px;font-weight:600;cursor:pointer;transition:all .2s;font-family:inherit} .wr-load-more-btn:hover{background:var(--color-primary,#6C3AED);color:#fff} .wr-load-more-btn:disabled{opacity:.5;cursor:not-allowed} .wr-results-count{text-align:center;padding:10px;font-size:13px;color:#9CA3AF;border-top:1px solid rgba(0,0,0,.04);margin-top:4px} .wr-results-count strong{color:var(--color-primary,#6C3AED)} .wr-search-close-wrap{text-align:right;padding:4px 8px 0} .wr-search-close-btn{background:none;border:1px solid rgba(0,0,0,.1);color:#9CA3AF;padding:4px 12px;border-radius:8px;font-size:12px;cursor:pointer;transition:all .2s;font-family:inherit} .wr-search-close-btn:hover{background:#F5F3FF;color:var(--color-primary,#6C3AED);border-color:rgba(108,58,237,.2)} {# === Job body redesign === #} .job-tags{display:flex;flex-wrap:wrap;gap:8px;justify-content:center} .job-tag{display:inline-flex;align-items:center;gap:5px;padding:6px 14px;border-radius:100px;font-size:13px;font-weight:500;background:#fff;border:1px solid rgba(0,0,0,.08);color:#4B5563} .job-tag i,.job-tag svg{font-size:13px;color:var(--color-primary,#6C3AED);width:14px;height:14px} .job-tag-salary{background:linear-gradient(135deg,#EDE9FE,#F5F3FF);border-color:rgba(108,58,237,.15);color:var(--color-primary,#6C3AED);font-weight:600} .job-tag-external{background:#FFFBEB;border-color:rgba(245,158,11,.2);color:#92400E;font-size:12px} .job-body-card{background:#fff;border-radius:20px;box-shadow:0 4px 32px rgba(0,0,0,.06),0 1px 4px rgba(0,0,0,.03);border:1px solid rgba(0,0,0,.05);padding:32px;max-width:780px;margin:0 auto} @media(max-width:640px){.job-body-card{padding:20px;border-radius:16px}} .job-section-title{font-size:15px;font-weight:700;color:var(--color-primary,#6C3AED);text-transform:uppercase;letter-spacing:.06em;margin:0 0 10px;display:flex;align-items:center;gap:8px} .job-section-title::before{content:'';display:inline-block;width:4px;height:18px;border-radius:2px;background:var(--color-primary,#6C3AED)} .job-section-text{font-size:16px;line-height:1.75;color:#374151;margin:0} .job-section-divider{border:none;border-top:1px solid rgba(0,0,0,.06);margin:24px 0} .job-cta-bar{display:flex;align-items:center;justify-content:center;gap:12px;flex-wrap:wrap;padding:24px 0 0} .job-cta-main{display:inline-flex;align-items:center;gap:8px;padding:14px 32px;border-radius:14px;font-size:16px;font-weight:700;border:none;cursor:pointer;transition:all .2s;text-decoration:none;font-family:inherit} .job-cta-main.active{background:var(--color-primary,#6C3AED);color:#fff;box-shadow:0 4px 16px rgba(108,58,237,.25)} .job-cta-main.active:hover{filter:brightness(1.1);transform:translateY(-1px);box-shadow:0 6px 24px rgba(108,58,237,.3)} .job-cta-main.disabled{background:#E5E7EB;color:#9CA3AF;cursor:default;box-shadow:none;pointer-events:none} .job-cta-company{display:inline-flex;align-items:center;gap:6px;padding:14px 24px;border-radius:14px;font-size:15px;font-weight:600;border:2px solid rgba(0,0,0,.08);background:#fff;color:#374151;cursor:pointer;transition:all .2s;text-decoration:none;font-family:inherit} .job-cta-company:hover{border-color:rgba(108,58,237,.2);color:var(--color-primary,#6C3AED)} .job-locked-overlay{position:relative;margin-top:24px} .job-locked-blur{filter:blur(6px);opacity:.4;pointer-events:none;user-select:none} .job-locked-cta{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;background:rgba(255,255,255,.7);backdrop-filter:blur(3px);border-radius:16px;padding:20px} .job-locked-title{font-size:18px;font-weight:700;color:#1E1B2E;text-align:center} .job-locked-text{font-size:14px;color:#6B7280;text-align:center;max-width:360px} .job-locked-btn{display:inline-flex;align-items:center;gap:6px;padding:12px 28px;background:var(--color-primary,#6C3AED);color:#fff;border:none;border-radius:12px;font-size:15px;font-weight:600;cursor:pointer;transition:all .2s;text-decoration:none;font-family:inherit} .job-locked-btn:hover{filter:brightness(1.1);transform:translateY(-1px)} .job-locked-login{font-size:13px;color:#6B7280} .job-locked-login a{color:var(--color-primary,#6C3AED);font-weight:600;text-decoration:none} .job-locked-login a:hover{text-decoration:underline} </style>{% endblock css %}{% block body %} <div id=\"hero_header\" class=\"hero-header section panel overflow-hidden\"> <div class=\"position-absolute top-0 start-0 end-0 h-screen dark:bg-gray-300 dark:bg-opacity-15 rounded-bottom-2 lg:rounded-bottom-5\"></div> <div class=\"section-outer panel py-8 lg:py-9 xl:py-10\"> <div class=\"container\"> <div class=\"section-inner panel\"> <div class=\"d-none xl:d-block\"> <div class=\"position-absolute rounded-circle border border-dashed border-primary-300 dark:border-white dark:border-opacity-15 cstack w-56px h-56px d-none lg:d-block\" style=\"top: 5%; left: 5%\" data-anime=\"translateY: [0, 10]; easing: linear; loop: true; direction: alternate; delay: 0;\"><img class=\"p-narrow rounded-circle\" src=\"/uploads/no_avatar.png\" alt=\"Anonymous candidate\"></div> <div class=\"position-absolute rounded-circle border border-dashed border-primary-300 dark:border-white dark:border-opacity-15 cstack w-56px h-56px d-none lg:d-block\" style=\"top: 20%; left: 10%\" data-anime=\"translateY: [0, 15]; easing: linear; loop: true; direction: alternate; delay: 25;\"><img class=\"p-narrow rounded-circle\" src=\"/uploads/no_avatar.png\" alt=\"Anonymous candidate\"></div> <div class=\"position-absolute rounded-circle border border-dashed border-primary-300 dark:border-white dark:border-opacity-15 cstack w-56px h-56px d-none lg:d-block\" style=\"top: 35%; left: 0%\" data-anime=\"translateY: [0, 5]; easing: linear; loop: true; direction: alternate; delay: 25;\"><img class=\"p-narrow rounded-circle\" src=\"/uploads/no_avatar.png\" alt=\"Anonymous candidate\"></div> <div class=\"position-absolute rounded-circle border border-dashed border-primary-300 dark:border-white dark:border-opacity-15 cstack w-56px h-56px d-none lg:d-block\" style=\"top: 5%; right: 5%\" data-anime=\"translateY: [0, 10]; easing: linear; loop: true; direction: alternate; delay: 0;\"><img class=\"p-narrow rounded-circle\" src=\"/uploads/no_avatar.png\" alt=\"Anonymous candidate\"></div> <div class=\"position-absolute rounded-circle border border-dashed border-primary-300 dark:border-white dark:border-opacity-15 cstack w-56px h-56px d-none lg:d-block\" style=\"top: 20%; right: 10%\" data-anime=\"translateY: [0, 15]; easing: linear; loop: true; direction: alternate; delay: 25;\"><img class=\"p-narrow rounded-circle\" src=\"/uploads/no_avatar.png\" alt=\"Anonymous candidate\"></div> <div class=\"position-absolute rounded-circle border border-dashed border-primary-300 dark:border-white dark:border-opacity-15 cstack w-56px h-56px d-none lg:d-block\" style=\"top: 35%; right: 0%\" data-anime=\"translateY: [0, 5]; easing: linear; loop: true; direction: alternate; delay: 25;\"><img class=\"p-narrow rounded-circle\" src=\"/uploads/no_avatar.png\" alt=\"Anonymous candidate\"></div> </div> <div class=\"row child-cols-12 justify-center items-center g-8\"> <div class=\"lg:col-12\"> <div class=\"panel vstack gap-4 lg:gap-6\"> <div class=\"panel vstack justify-center items-center gap-2 px-2 pt-4 text-center\"> <span class=\"fs-6 fw-bold text-uppercase text-primary\">{{ job.companyName }} is hiring</span> <h1 class=\"h3 md:h2 lg:display-4 m-0\">{{ job.jobtitle }}</h1> </div> <div class=\"wr-search-section\" id=\"wrSearchSection\"> <div class=\"wr-search-bar\" id=\"wrSearchBar\"> <div class=\"wr-search-icon\"> <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"M21 21l-4.35-4.35\"/></svg> </div> <div class=\"wr-search-input-wrapper\"> <input type=\"text\" id=\"wrSearchInput\" class=\"wr-search-real-input\" placeholder=\"Search for a job, company, or city...\" autocomplete=\"off\"> </div> <button class=\"wr-search-btn\" id=\"wrSearchBtn\"> <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"11\" cy=\"11\" r=\"8\"/><path d=\"M21 21l-4.35-4.35\"/></svg> <span>Search</span> </button> </div> </div> <div class=\"wr-search-results\" id=\"wrSearchResults\"> <div class=\"wr-search-close-wrap\"> <button class=\"wr-search-close-btn\" id=\"wrSearchClose\">✕ Close</button> </div> <div id=\"wrJobsList\"></div> <div id=\"wrLoading\" class=\"wr-loading\" style=\"display:none;\"> <div class=\"wr-spinner\"></div> </div> <div id=\"wrEmptyState\" class=\"wr-empty-state\" style=\"display:none;\"> <div class=\"wr-empty-icon\">🔍</div> <p class=\"wr-empty-title\">No jobs match your search</p> <p class=\"wr-empty-text\">Try different keywords</p> </div> <div id=\"wrLoadMore\" class=\"wr-load-more\" style=\"display:none;\"> <button class=\"wr-load-more-btn\" id=\"wrLoadMoreBtn\">Show more jobs</button> </div> <div class=\"wr-results-count\" id=\"wrResultsCount\" style=\"display:none;\"> <strong id=\"wrTotalCount\">0</strong> jobs found </div> </div> </div> </div> </div> </div> </div> </div> </div> {# ═══════════════════════════════════════════════════════════════ JOB BODY — full width, no sidebar ═══════════════════════════════════════════════════════════════ #} <div id=\"job_details\" class=\"job-details section panel pb-6 xl:pb-9\"> <div class=\"section-outer panel\"> <div class=\"container max-w-lg\"> <div class=\"section-inner panel\"> {# ── Metadata tags ── #} <div class=\"job-tags mb-4\" style=\"margin-top:-10px;\"> {% if job.companyName is not empty %} <span class=\"job-tag\"> <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"2\" y=\"7\" width=\"20\" height=\"14\" rx=\"2\"/><path d=\"M16 7V5a4 4 0 00-8 0v2\"/></svg> {{ job.companyName }} </span> {% endif %} {% if job.employmentType is not empty %} <span class=\"job-tag\"> <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"12\" cy=\"12\" r=\"10\"/><path d=\"M12 6v6l4 2\"/></svg> {{ job.employmentType }} </span> {% endif %} {% if job.city is not empty %} <span class=\"job-tag\"> <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M21 10c0 7-9 13-9 13s-9-6-9-13a9 9 0 0118 0z\"/><circle cx=\"12\" cy=\"10\" r=\"3\"/></svg> {{ job.city }}{% if job.country is not null %}, {{ job.country }}{% endif %} </span> {% endif %} {% if job.remoteWork is not empty %} <span class=\"job-tag\"> <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"2\" y=\"3\" width=\"20\" height=\"14\" rx=\"2\"/><path d=\"M8 21h8M12 17v4\"/></svg> {{ job.remoteWork }} </span> {% endif %} {% if job.experienceLevel is not empty %} <span class=\"job-tag\"> <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M22 11.08V12a10 10 0 11-5.93-9.14\"/><path d=\"M22 4L12 14.01l-3-3\"/></svg> +{{ job.experienceLevel }} years experience </span> {% endif %} {% if job.salaryPeriod is not null %} <span class=\"job-tag job-tag-salary\"> <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><line x1=\"12\" y1=\"1\" x2=\"12\" y2=\"23\"/><path d=\"M17 5H9.5a3.5 3.5 0 000 7h5a3.5 3.5 0 010 7H6\"/></svg> {{ job.salaryMin }} – {{ job.salaryMax }} {{ job.devise }}/{{ job.salaryPeriod }} </span> {% endif %} {% if job.verification == 0 %} <span class=\"job-tag job-tag-external\"> ⚡ Indexed listing — external source </span> {% endif %} </div> {# ── Main card ── #} <div class=\"job-body-card\"> {# — Résumé (toujours visible) — #} {% if job.jobSummary is not null %} <div class=\"job-section-title\">Job overview</div> <p class=\"job-section-text\">{{ job.jobSummary }}</p> {% endif %} {% if app.user is null %} <hr class=\"job-section-divider\"> <div class=\"job-section-title\">Responsibilities</div> <p class=\"job-section-text\">Find here the full details of the responsibilities for this role: daily tasks, projects to lead, goals to achieve and scope of work within the team. Everything you need to picture yourself in the role and know exactly what to expect from day one.</p> <hr class=\"job-section-divider\"> <div class=\"job-section-title\">Required profile</div> <p class=\"job-section-text\">Access the technical and interpersonal skills expected by the recruiter, the required experience level, valued qualifications and personal qualities sought. Check at a glance whether your profile matches this opportunity before applying.</p> <hr class=\"job-section-divider\"> <div class=\"job-section-title\">Benefits</div> <p class=\"job-section-text\">Discover what the company offers its employees: remote work policy, health coverage, bonuses, continuous training, work environment and growth opportunities. All the information you need to compare this offer with your expectations and make the right choice.</p> {% endif %} {% if app.user is not null %} {# ══════ FULL CONTENT (logged in) ══════ #} {% if job.keyResponsabilities is not null %} <hr class=\"job-section-divider\"> <div class=\"job-section-title\">Responsibilities</div> <p class=\"job-section-text\">{{ job.keyResponsabilities }}</p> {% endif %} {% if job.requirements is not null %} <hr class=\"job-section-divider\"> <div class=\"job-section-title\">Required profile</div> <p class=\"job-section-text\">{{ job.requirements }}</p> {% endif %} {% if job.benefits is not null %} <hr class=\"job-section-divider\"> <div class=\"job-section-title\">Benefits</div> <p class=\"job-section-text\">{{ job.benefits }}</p> {% endif %} {# — CTA Buttons — #} <div class=\"job-cta-bar\"> {% if app.user.candidate is not null %} <a href=\"{{ path('cvs_application_job_like', {'slug': job.slug}) }}\" class=\"job-cta-main active\"> <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"currentColor\" stroke=\"none\"><path d=\"M20.84 4.61a5.5 5.5 0 00-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 00-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 000-7.78z\"/></svg> I'm interested </a> {% endif %} {% if job.websearch == 1 and job.website is not empty %} <a href=\"{{ job.website }}\" target=\"_blank\" class=\"job-cta-main active\"> <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M18 13v6a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h6\"/><polyline points=\"15 3 21 3 21 9\"/><line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\"/></svg> Apply </a> {% endif %} {% if job.enterprise is not null %} <a href=\"{{ path('cvs_application_company_show', {'slug': job.enterprise.slug}) }}\" class=\"job-cta-company\"> <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><rect x=\"2\" y=\"7\" width=\"20\" height=\"14\" rx=\"2\"/><path d=\"M16 7V5a4 4 0 00-8 0v2\"/></svg> View other listings </a> {% endif %} </div> {% else %} {# ══════ LOCKED CONTENT (not logged in) ══════ #} {# Blurred teaser zone #} <div class=\"job-locked-overlay\"> <div class=\"job-locked-blur\"> <hr class=\"job-section-divider\"> <div class=\"job-section-title\">Responsibilities</div> <p class=\"job-section-text\">Discover the main responsibilities of this role, daily tasks and projects you will be working on within the team...</p> <hr class=\"job-section-divider\"> <div class=\"job-section-title\">Required profile</div> <p class=\"job-section-text\">Technical and soft skills required, expected experience level, valued qualifications and certifications for this role...</p> <hr class=\"job-section-divider\"> <div class=\"job-section-title\">Benefits</div> <p class=\"job-section-text\">Remote work, health insurance, meal vouchers, continuous training, work environment and career growth within the company...</p> </div> <div class=\"job-locked-cta\"> <div style=\"font-size:32px;\">🔓</div> <div class=\"job-locked-title\">Unlock the full listing</div> <div class=\"job-locked-text\">Create your profile in 2 minutes to access responsibilities, benefits and apply directly</div> <a href=\"{{ path('app_register') }}\" class=\"job-locked-btn\"> Create my profile for free <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M7 17l9.2-9.2M17 17V7H7\"/></svg> </a> <div class=\"job-locked-login\">Already registered? <a href=\"{{ path('app_login') }}\">Log in</a></div> </div> </div> {% endif %} </div> </div> </div> </div> </div> {% if othersJobs is not null %} <div id=\"openings\" class=\"career-openings section panel overflow-hidden pb-6 xl:pb-9\"> <div class=\"section-outer panel py-6 xl:py-9 bg-secondary dark:bg-gray-800\"> <div class=\"container max-w-lg\"> <div class=\"section-inner panel\"> <div class=\"panel vstack justify-center gap-4 sm:gap-6 xl:gap-8\"> <h2 class=\"h4 sm:h2 m-0 text-center\" data-anime=\"onview: -100; translateY: [48, 0]; opacity: [0, 1]; easing: spring(1, 80, 10, 0); duration: 450; delay: 100;\"> Job openings at {{ job.enterprise.companyName|lower|capitalize }} </h2> <div class=\"panel\"> <div class=\"panel\"> <div class=\"row child-cols-12 sm:child-cols-6 col-match g-2 sm:g-3 uc-grid\"> {% for oj in othersJobs %} <div class=\"panel\"> <div class=\"panel vstack justify-end items-end gap-1 p-3 rounded lg:rounded-2 bg-white dark:bg-gray-800\"> <div class=\"vstack gap-narrow\"> <h5 class=\"h6 lg:h5 m-0\">{{ oj.jobTitle }}</h5> <span class=\"fs-6 text-dark dark:text-white text-opacity-70\">{{ oj.city }}</span> </div> <a href=\"{{ path('cvs_application_job_show', {'slug': oj.slug}) }}\" class=\"uc-link fs-7 fw-bold d-inline-flex items-center gap-narrow border-bottom pb-narrow\"> <span>Apply</span> <i class=\"icon icon-narrow unicon-arrow-up-right fw-bold rtl:-rotate-90\"></i> </a> </div> </div> {% endfor %} </div> </div> </div> </div> </div> </div> </div> </div> {% endif %} {% if similarJobs is defined and similarJobs is not empty %} <div id=\"similar_jobs\" class=\"similar-jobs section panel overflow-hidden pb-6 xl:pb-9\"> <div class=\"section-outer panel py-6 xl:py-9\"> <div class=\"container max-w-lg\"> <div class=\"section-inner panel\"> <div class=\"panel vstack justify-center gap-4 sm:gap-6 xl:gap-8\"> <div class=\"vstack items-center text-center gap-1\"> <h2 class=\"h4 sm:h2 m-0\">Similar jobs</h2> </div> <div class=\"panel\"> <div class=\"row child-cols-12 sm:child-cols-6 lg:child-cols-4 col-match g-2 sm:g-3\"> {% for sj in similarJobs %} <div class=\"panel\"> <a href=\"{{ path('cvs_application_job_show', {'slug': sj.slug}) }}\" class=\"panel vstack gap-2 p-3 rounded-2 bg-white dark:bg-gray-800 h-100\" style=\"box-shadow: 0 2px 12px rgba(0,0,0,0.06), 0 1px 3px rgba(0,0,0,0.04); border: 1px solid rgba(0,0,0,0.06); text-decoration: none; color: inherit; transition: box-shadow 0.2s ease, transform 0.2s ease;\" onmouseover=\"this.style.boxShadow='0 8px 32px rgba(0,0,0,0.10), 0 2px 8px rgba(0,0,0,0.06)'; this.style.transform='translateY(-2px)';\" onmouseout=\"this.style.boxShadow='0 2px 12px rgba(0,0,0,0.06), 0 1px 3px rgba(0,0,0,0.04)'; this.style.transform='translateY(0)';\"> {# Header: company #} {% if sj.companyName is not empty %} <div class=\"hstack gap-1 items-center\"> <div class=\"cstack w-32px h-32px rounded-1 bg-secondary\" style=\"min-width: 32px;\"> <i class=\"icon-narrow unicon-portfolio text-primary\" style=\"font-size: 14px;\"></i> </div> <span class=\"fs-7 fw-bold text-dark text-opacity-50\" style=\"overflow: hidden; text-overflow: ellipsis; white-space: nowrap;\">{{ sj.companyName }}</span> </div> {% endif %} {# Job title #} <h5 class=\"h6 lg:h5 m-0\" style=\"line-height: 1.4;\">{{ sj.jobTitle }}</h5> {# Key info #} <div class=\"vstack gap-narrow mt-auto\"> {% if sj.city is not empty %} <div class=\"hstack gap-narrow items-center fs-7 text-dark text-opacity-60\"> <i class=\"icon-narrow unicon-location\" style=\"font-size: 12px;\"></i> <span>{{ sj.city }}{% if sj.country is not null %}, {{ sj.country }}{% endif %}</span> </div> {% endif %} {% if sj.employmentType is not empty %} <div class=\"hstack gap-narrow items-center fs-7 text-dark text-opacity-60\"> <i class=\"icon-narrow unicon-portfolio\" style=\"font-size: 12px;\"></i> <span>{{ sj.employmentType }}</span> </div> {% endif %} {% if sj.remoteWork is not empty %} <div class=\"hstack gap-narrow items-center fs-7 text-dark text-opacity-60\"> <i class=\"icon-narrow unicon-laptop\" style=\"font-size: 12px;\"></i> <span>{{ sj.remoteWork }}</span> </div> {% endif %} </div> {# Category tags #} {% if sj.category is not empty %} <div class=\"hstack gap-narrow flex-wrap mt-1\"> <span class=\"px-1 py-narrow fs-8 fw-bold rounded bg-secondary text-primary\" style=\"white-space: nowrap;\">{{ sj.category }}</span> </div> {% endif %} {# CTA link #} <div class=\"hstack items-center gap-narrow mt-1 fs-7 fw-bold text-primary\"> <span>View listing</span> <i class=\"icon icon-narrow unicon-arrow-up-right fw-bold\" style=\"font-size: 12px;\"></i> </div> </a> </div> {% endfor %} </div> </div> </div> </div> </div> </div> </div> {% endif %}{% endblock body %}{% block footerjs %} <script> (function(){ var JOB_BASE_URL = '/job/'; var SEARCH_API = '{{ path(\"api_jobs_search\") }}'; var palette = [ {bg:'#EDE9FE',color:'#7C3AED'},{bg:'#DBEAFE',color:'#2563EB'}, {bg:'#D1FAE5',color:'#059669'},{bg:'#FEF3C7',color:'#D97706'}, {bg:'#FCE7F3',color:'#DB2777'},{bg:'#FEE2E2',color:'#DC2626'}, {bg:'#E0E7FF',color:'#4338CA'},{bg:'#CCFBF1',color:'#0D9488'} ]; function getColor(name){ var h=0;for(var i=0;i<name.length;i++) h=name.charCodeAt(i)+((h<<5)-h); return palette[Math.abs(h)%palette.length]; } var searchInput = document.getElementById('wrSearchInput'); var searchBtn = document.getElementById('wrSearchBtn'); var searchResults = document.getElementById('wrSearchResults'); var searchClose = document.getElementById('wrSearchClose'); var jobsList = document.getElementById('wrJobsList'); var loading = document.getElementById('wrLoading'); var emptyState = document.getElementById('wrEmptyState'); var loadMoreWrap = document.getElementById('wrLoadMore'); var loadMoreBtn = document.getElementById('wrLoadMoreBtn'); var resultsCount = document.getElementById('wrResultsCount'); var totalCountEl = document.getElementById('wrTotalCount'); var currentQuery = ''; var currentOffset = 0; var LIMIT = 10; var isLoading = false; var debounceTimer; function renderJob(job){ var col = getColor(job.companyName); var logoHtml; if(job.image){ logoHtml = '<div class=\"wr-result-logo\"><img src=\"'+job.image+'\" alt=\"'+job.companyName+'\"></div>'; } else { logoHtml = '<div class=\"wr-result-logo\" style=\"background:'+col.bg+';color:'+col.color+';\">'+(job.logo || job.companyName.charAt(0).toUpperCase())+'</div>'; } var badgeHtml = ''; if(job.isNew) badgeHtml = '<span class=\"wr-result-badge wr-badge-new\">Nouveau</span>'; var salaryHtml = job.salary ? '<span class=\"wr-result-salary\">'+job.salary+'</span>' : ''; var remoteHtml = ''; if(job.remoteWork && job.remoteWork !== '' && job.remoteWork !== 'no'){ var remoteLabel = job.remoteWork === 'full' ? 'Full remote' : (job.remoteWork === 'hybrid' ? 'Hybrid' : job.remoteWork); remoteHtml = '<span>·</span><span>'+remoteLabel+'</span>'; } var div = document.createElement('a'); div.className = 'wr-result-item'; div.href = JOB_BASE_URL + job.slug; div.innerHTML = logoHtml + '<div class=\"wr-result-info\">' + '<div class=\"wr-result-title\">' + job.jobTitle + '</div>' + '<div class=\"wr-result-meta\">' + '<span class=\"wr-result-company\">' + job.companyName + '</span>' + (job.city ? '<span>·</span><span>' + job.city + '</span>' : '') + '<span>·</span><span>' + (job.employmentType || '') + '</span>' + remoteHtml + badgeHtml + '</div>' + '</div>' + '<div class=\"wr-result-actions\">' + salaryHtml + '</div>'; return div; } function fetchJobs(query, offset, append){ if(isLoading) return; if(query.length < 2) return; isLoading = true; if(!append){ jobsList.innerHTML = ''; loadMoreWrap.style.display = 'none'; resultsCount.style.display = 'none'; } searchResults.classList.add('visible'); loading.style.display = 'block'; emptyState.style.display = 'none'; var url = SEARCH_API + '?q=' + encodeURIComponent(query) + '&offset=' + offset + '&limit=' + LIMIT; fetch(url, {credentials:'same-origin'}) .then(function(r){ return r.json(); }) .then(function(data){ loading.style.display = 'none'; isLoading = false; if(data.total === 0){ emptyState.style.display = 'block'; return; } data.jobs.forEach(function(job, i){ var el = renderJob(job); jobsList.appendChild(el); setTimeout(function(){ el.classList.add('show'); }, 50 + i * 60); }); totalCountEl.textContent = data.total; resultsCount.style.display = 'block'; if(data.hasMore){ loadMoreWrap.style.display = 'flex'; } else { loadMoreWrap.style.display = 'none'; } currentOffset = offset + data.jobs.length; }) .catch(function(err){ console.error('Search error:', err); loading.style.display = 'none'; isLoading = false; }); } searchClose.addEventListener('click', function(){ searchResults.classList.remove('visible'); jobsList.innerHTML = ''; searchInput.value = ''; loadMoreWrap.style.display = 'none'; resultsCount.style.display = 'none'; emptyState.style.display = 'none'; }); searchInput.addEventListener('input', function(){ clearTimeout(debounceTimer); var q = searchInput.value.trim(); if(q.length < 2){ searchResults.classList.remove('visible'); jobsList.innerHTML = ''; return; } debounceTimer = setTimeout(function(){ currentQuery = q; currentOffset = 0; fetchJobs(currentQuery, 0, false); }, 350); }); searchBtn.addEventListener('click', function(e){ e.preventDefault(); clearTimeout(debounceTimer); currentQuery = searchInput.value.trim(); currentOffset = 0; fetchJobs(currentQuery, 0, false); }); searchInput.addEventListener('keydown', function(e){ if(e.key === 'Enter'){ e.preventDefault(); clearTimeout(debounceTimer); currentQuery = searchInput.value.trim(); currentOffset = 0; fetchJobs(currentQuery, 0, false); } }); loadMoreBtn.addEventListener('click', function(){ fetchJobs(currentQuery, currentOffset, true); });})(); </script>{% endblock footerjs %}", "application/whileresume/application/jobs/show_en.html.twig", "/var/www/vhosts/mirtillostudio.fr/b1.mirtillostudio.fr/version-1/templates/application/whileresume/application/jobs/show_en.html.twig"); }}