protese.php — leitura técnica completa

protese.php
Arquivo público de prótese capilar presente no pacote do sistema. O código abaixo é a cópia integral do arquivo enviado.

Página públicaPágina pública4228 linhas

Responsabilidade do arquivo

Arquivo público de prótese capilar presente no pacote do sistema. O código abaixo é a cópia integral do arquivo enviado.

Fonte conferida: protese.php
SHA-256: 1ca0d582fa0acffe726aeb2c9e62b546a3be4561c9dc5aff90512d2d4842487e

Dependências extraídas do arquivo:
Include: $_SERVER['DOCUMENT_ROOT'] . '/sistema/conexao.php'Include: __DIR__ . '/security.php'Include: $___recaptcha_fileTabela: site_carrosselTabela: foto_adminTabela: comentarios

Bytes inválidos em UTF-8 são exibidos como \xNN, sem alterar o arquivo original.

Tipo

Página pública

Grupo

Página pública

Total de linhas

4228

Código completo

1<?php 2ini_set('display_errors', 0); 3ini_set('display_startup_errors', 0); 4error_reporting(E_ALL); 5 6if (!headers_sent() && !ob_get_level()) { 7 if (extension_loaded('zlib') && !ini_get('zlib.output_compression')) { 8 ob_start('ob_gzhandler'); 9 } else { 10 ob_start(); 11 } 12} 13 14/* ============================================================ 15 BOOT / SEGURANÇA 16 ============================================================ */ 17 18// Sessão com flags seguras (antes de qualquer output) 19if (session_status() === PHP_SESSION_NONE) { 20 $secure = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off'); 21 session_set_cookie_params([ 22 'lifetime' => 0, 23 'path' => '/', 24 'domain' => $_SERVER['HTTP_HOST'] ?? '', 25 'secure' => $secure, 26 'httponly' => true, 27 'samesite' => 'Lax', 28 ]); 29 @session_start(); 30} 31 32// Headers de segurança 33header('Content-Type: text/html; charset=UTF-8'); 34header('X-Content-Type-Options: nosniff'); 35header('X-Frame-Options: SAMEORIGIN'); 36header('Referrer-Policy: strict-origin-when-cross-origin'); 37header('Permissions-Policy: geolocation=(), microphone=(), camera=()'); 38 39if (!headers_sent()) { 40 if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') { 41 header('Strict-Transport-Security: max-age=31536000; includeSubDomains; preload'); 42 } 43 44 $csp = [ 45 "default-src 'self'", 46 "base-uri 'self'", 47 "form-action 'self'", 48 "frame-ancestors 'self'", 49 "upgrade-insecure-requests", 50 "img-src 'self' data: https: i.ytimg.com s.ytimg.com", 51 "script-src 'self' 'unsafe-inline' https://www.youtube.com https://www.youtube-nocookie.com https://www.google.com https://www.gstatic.com https://s.ytimg.com https://code.jquery.com https://cdn.jsdelivr.net https://cdnjs.cloudflare.com https://www.googletagmanager.com https://www.google-analytics.com", 52 "style-src 'self' 'unsafe-inline'", 53 "frame-src https://www.youtube.com https://www.youtube-nocookie.com https://www.google.com", 54 "connect-src 'self' https://www.youtube.com https://www.google.com https://www.gstatic.com https://i.ytimg.com https://s.ytimg.com https://*.googlevideo.com https://www.googletagmanager.com https://www.google-analytics.com", 55 "media-src 'self' https: blob: https://*.googlevideo.com", 56 "font-src 'self' data: https:" 57 ]; 58 59 header('Content-Security-Policy: ' . implode('; ', $csp)); 60} 61 62/* ============================================================ 63 CONEXÃO 64 ============================================================ */ 65$pdo = null; 66try { 67 require_once $_SERVER['DOCUMENT_ROOT'] . '/sistema/conexao.php'; 68} catch (Throwable $e) { 69 $pdo = null; 70} 71require_once __DIR__ . '/security.php'; 72 73/* ============================================================ 74 HELPERS 75 ============================================================ */ 76function h($v) { return htmlspecialchars((string)$v, ENT_QUOTES, 'UTF-8'); } 77function d($s) { return preg_replace('/\D+/', '', (string)$s); } 78 79function money_br($v) { 80 if ($v === null || $v === '') return ''; 81 if (is_string($v) && preg_match('/^\d+(?:[.,]\d+)?$/', $v)) { 82 $v = str_replace(',', '.', $v); 83 } 84 return 'R$ ' . number_format((float)$v, 2, ',', '.'); 85} 86 87function table_exists(?PDO $pdo, $t) { 88 if (!$pdo) return false; 89 try { 90 $st = $pdo->prepare('SHOW TABLES LIKE :t'); 91 $st->execute([':t' => $t]); 92 return (bool)$st->fetch(PDO::FETCH_NUM); 93 } catch (Throwable $e) { 94 return false; 95 } 96} 97 98function col_exists(PDO $pdo, $t, $c) { 99 try { 100 $st = $pdo->prepare("SHOW COLUMNS FROM `$t` LIKE :c"); 101 $st->execute([':c' => $c]); 102 return (bool)$st->fetch(PDO::FETCH_ASSOC); 103 } catch (Throwable $e) { 104 return false; 105 } 106} 107 108function coalesce_expr(PDO $pdo, $t, $cands, $alias) { 109 $cands = (array)$cands; 110 $ok = []; 111 foreach ($cands as $c) { 112 if (col_exists($pdo, $t, $c)) $ok[] = $c; 113 } 114 115 if (!empty($ok)) { 116 $parts = []; 117 foreach ($ok as $c) { 118 $c = str_replace('`', '', $c); 119 $parts[] = '`' . $c . '`'; 120 } 121 $cols = implode(',', $parts); 122 return "COALESCE($cols) AS $alias"; 123 } 124 125 return "NULL AS $alias"; 126} 127 128function official_agenda_link(): string { 129 return '/agendamentos/'; 130} 131 132function normalize_agenda_link(string $url): string { 133 $url = trim($url); 134 if ($url === '') return official_agenda_link(); 135 136 $normalized = rtrim(strtolower($url), '/'); 137 $agendaAliases = [ 138 '/agendamentos', 139 'agendamentos', 140 'https://jacycabeleireiro.com/agendamentos', 141 'http://jacycabeleireiro.com/agendamentos', 142 ]; 143 144 if (in_array($normalized, $agendaAliases, true)) { 145 return official_agenda_link(); 146 } 147 148 return $url; 149} 150 151function canonical_link($u) { 152 $u = trim((string)$u); 153 if ($u === '' || $u === '#') return ''; 154 155 if (preg_match('#^(https?:)?//#i', $u)) return normalize_agenda_link($u); 156 if ($u[0] === '/') return normalize_agenda_link($u); 157 if (preg_match('/^[\w.-]+\.[a-z]{2,}(\/.*)?$/i', $u)) return normalize_agenda_link('https://' . $u); 158 159 return normalize_agenda_link('/' . ltrim($u, '/')); 160} 161 162function yt_id(string $urlOrId): string { 163 $u = trim($urlOrId); 164 if ($u === '') return ''; 165 166 if (preg_match('~^(?:https?://)?(?:www\.)?(?:youtube\.com/(?:watch\?v=|embed/)|youtu\.be/)([A-Za-z0-9_-]{6,})~i', $u, $m)) { 167 return $m[1]; 168 } 169 170 if (preg_match('~^[A-Za-z0-9_-]{6,}$~', $u)) return $u; 171 return ''; 172} 173 174function fix_path(string $raw): string { 175 $raw = trim($raw); 176 if ($raw === '' || $raw === '#') return ''; 177 if (preg_match('#^(?:https?:)?//#i', $raw) || strncmp($raw, 'data:', 5) === 0) return $raw; 178 if ($raw[0] === '/') return $raw; 179 180 $cands = []; 181 if (preg_match('#^(paginas/|site/|uploads_)#i', $raw)) { 182 $cands[] = '/sistema/painel/' . $raw; 183 $cands[] = '/' . $raw; 184 } 185 186 if (defined('UP')) $cands[] = rtrim(UP, '/') . '/' . ltrim($raw, '/'); 187 $cands[] = '/sistema/painel/paginas/site/' . ltrim($raw, '/'); 188 189 foreach ($cands as $u) { 190 $abs = $_SERVER['DOCUMENT_ROOT'] . $u; 191 if (is_file($abs)) return $u; 192 } 193 194 return $cands[0] ?? '/' . $raw; 195} 196 197function resolve_media_src(string $raw): array { 198 $u = fix_path($raw); 199 $path = parse_url($u, PHP_URL_PATH) ?? $u; 200 $isVideo = preg_match('/\.(mp4|webm|ogg)$/i', $path); 201 return $isVideo ? ['img' => '', 'video' => $u] : ['img' => $u, 'video' => '']; 202} 203 204/* ============================================================ 205 SETTINGS 206 ============================================================ */ 207function loadSettings(?PDO $pdo) { 208 $out = [ 209 'site' => 'https://jacycabeleireiro.com/', 210 'nome' => 'Jacy Cabeleireiro', 211 'descricao' => 'Cortes, prótese capilar, mechas e escovas com técnica e acabamento profissional.', 212 'whatsapp' => '5545999882100', 213 'telefone' => '(45) 99988-2100', 214 'email' => 'jacycordeiro1@gmail.com', 215 'endereco' => 'Rio Grande do Sul, 2151 - Cascavel/PR', 216 'uploads' => '/sistema/painel/paginas/site/uploads_banners', 217 'logo_png' => '/sistema/img/logo.png', 218 'logo_webp' => '/sistema/img/logo.webp', 219 'agenda_url' => official_agenda_link(), 220 ]; 221 222 if (!$pdo) return $out; 223 224 $tabs = ['site_config', 'configuracoes', 'empresa', 'institucional', 'config_site', 'settings', 'config']; 225 foreach ($tabs as $t) { 226 if (!table_exists($pdo, $t)) continue; 227 228 try { 229 $nome = coalesce_expr($pdo, $t, ['nome', 'titulo', 'razao_social', 'nome_fantasia'], 'nome'); 230 $desc = coalesce_expr($pdo, $t, ['descricao', 'descricao_site', 'sobre', 'texto'], 'descricao'); 231 $wpp = coalesce_expr($pdo, $t, ['whatsapp', 'wpp', 'telefone2'], 'whatsapp'); 232 $tel = coalesce_expr($pdo, $t, ['telefone', 'fone'], 'telefone'); 233 $mail = coalesce_expr($pdo, $t, ['email', 'mail', 'contato'], 'email'); 234 $end = coalesce_expr($pdo, $t, ['endereco', 'endereço', 'address'], 'endereco'); 235 $logo = coalesce_expr($pdo, $t, ['logo_webp', 'logo', 'logo_png'], 'logo'); 236 $uploads = coalesce_expr($pdo, $t, ['uploads_base', 'uploads', 'upload_dir'], 'uploads'); 237 $agenda = coalesce_expr($pdo, $t, ['agenda', 'agenda_url', 'link_agenda'], 'agenda_url'); 238 $site = coalesce_expr($pdo, $t, ['site', 'url', 'dominio'], 'site'); 239 240 $sql = "SELECT $nome,$desc,$wpp,$tel,$mail,$end,$logo,$uploads,$agenda,$site FROM `$t` LIMIT 1"; 241 $r = $pdo->query($sql)->fetch(PDO::FETCH_ASSOC); 242 243 if ($r) { 244 foreach ($r as $k => $v) { 245 if ($v !== null && $v !== '') { 246 $out[$k] = $v; 247 } 248 } 249 break; 250 } 251 } catch (Throwable $e) {} 252 } 253 254 $out['agenda_url'] = official_agenda_link(); 255 return $out; 256} 257 258$SET = loadSettings($pdo); 259$AGENDA_LINK = official_agenda_link(); 260$SET['agenda_url'] = $AGENDA_LINK; 261 262$WPP = 'https://wa.me/' . (strpos($SET['whatsapp'], '55') === 0 ? $SET['whatsapp'] : '55' . d($SET['whatsapp'])); 263$SERVICOS_LINK = '/servicos'; 264$BARBEIRO_LINK = '/corte-cabelo'; 265$PRODUTOS_LINK = '/produtos'; 266$INSTAGRAM_LINK = !empty($instagram_sistema) ? $instagram_sistema : $WPP; 267if (!defined('UP')) define('UP', rtrim($SET['uploads'] ?? '/sistema/public/uploads/site/', '/') . '/'); 268 269/* ============================================================ 270 SLIDES (topo edge-to-edge) 271 ============================================================ */ 272function loadSlides(?PDO $pdo) { 273 $fallback = [[ 274 'img' => UP . 'banner-1.webp', 275 'video' => '', 276 'titulo'=> 'Prótese Capilar Masculino', 277 'texto' => 'Técnica discreta e com acabamento profissional.', 278 'link' => official_agenda_link() 279 ]]; 280 281 if (!$pdo) return $fallback; 282 283 $table = table_exists($pdo, 'site_banners_data') ? 'site_banners_data' 284 : (table_exists($pdo, 'site_banners') ? 'site_banners' 285 : (table_exists($pdo, 'arquivos') ? 'arquivos' : null)); 286 287 if (!$table) return $fallback; 288 289 try { 290 $isData = ($table === 'site_banners_data'); 291 292 $midia = $isData 293 ? coalesce_expr($pdo, $table, ['arquivo', 'src', 'caminho', 'midia'], 'src') 294 : coalesce_expr($pdo, $table, ['arquivo', 'src', 'caminho', 'link', 'url'], 'src'); 295 296 $titulo = coalesce_expr($pdo, $table, ['titulo', 'nome', 'legenda'], 'titulo'); 297 $texto = coalesce_expr($pdo, $table, ['texto', 'descricao', 'conteudo', 'caption'], 'texto'); 298 $cta = coalesce_expr($pdo, $table, ['btn_url', 'cta_url', 'link_url', 'href', 'url', 'link', 'arquivo_url'], 'cta'); 299 $ordem = col_exists($pdo, $table, 'ordem') ? 'ordem' : (col_exists($pdo, $table, 'posicao') ? 'posicao' : 'id'); 300 301 $wheres = []; 302 if (col_exists($pdo, $table, 'ativo')) $wheres[] = 'COALESCE(ativo,1)=1'; 303 if (col_exists($pdo, $table, 'registro')) $wheres[] = "registro IN ('home','site','index','banner_home')"; 304 305 $sqlWhere = $wheres ? (' WHERE ' . implode(' AND ', $wheres)) : ''; 306 307 $rows = $pdo->query("SELECT $titulo,$texto,$midia,$cta FROM `$table` $sqlWhere ORDER BY $ordem ASC LIMIT 12") 308 ->fetchAll(PDO::FETCH_ASSOC); 309 310 $out = []; 311 foreach ($rows as $r) { 312 $src = trim((string)($r['src'] ?? '')); 313 if ($src === '') continue; 314 315 if (!preg_match('#^(?:https?:)?//#i', $src) && strpos($src, '/') === false) { 316 $src = rtrim(UP, '/') . '/' . $src; 317 } 318 319 $media = resolve_media_src($src); 320 321 $out[] = [ 322 'img' => $media['img'], 323 'video' => $media['video'], 324 'titulo'=> trim((string)($r['titulo'] ?? '')), 325 'texto' => trim((string)($r['texto'] ?? '')), 326 'link' => canonical_link((string)($r['cta'] ?? '')), 327 ]; 328 } 329 330 return $out ?: $fallback; 331 } catch (Throwable $e) { 332 return $fallback; 333 } 334} 335 336$slides = loadSlides($pdo); 337 338function jacy_fast_img_src(string $src): string { 339 $src = trim($src); 340 if ($src === '' || preg_match('#^(?:https?:)?//#i', $src) || strncmp($src, 'data:', 5) === 0) return $src; 341 342 $path = parse_url($src, PHP_URL_PATH) ?: $src; 343 if ($path === '' || preg_match('/\.webp(?:\?.*)?$/i', $path)) return $src; 344 if (!preg_match('/\.(jpe?g|png)$/i', $path)) return $src; 345 346 $info = pathinfo($path); 347 $dir = $info['dirname'] ?? ''; 348 $filename = $info['filename'] ?? ''; 349 if ($filename === '') return $src; 350 351 $mobileWebp = rtrim($dir, '/') . '/' . $filename . '-mobile.webp'; 352 $webp = rtrim($dir, '/') . '/' . $filename . '.webp'; 353 354 $doc = $_SERVER['DOCUMENT_ROOT'] ?? ''; 355 if ($doc !== '') { 356 if (is_file($doc . $mobileWebp)) return $mobileWebp; 357 if (is_file($doc . $webp)) return $webp; 358 } 359 360 return $src; 361} 362 363$LCP = ''; 364foreach ($slides as $__slide) { 365 if (!empty($__slide['img'])) { 366 $LCP = jacy_fast_img_src((string)$__slide['img']); 367 break; 368 } 369} 370if ($LCP === '' && !empty($SET['logo_png'])) { 371 $LCP = fix_path((string)$SET['logo_png']); 372} 373$LCP_POSTER = $LCP !== '' ? $LCP : '/images/favicon.png'; 374 375/* ============================================================ 376 HERO (Agenda Seletiva, ESQ) 377 ============================================================ */ 378function loadHeroCarousel(?PDO $pdo): array { 379 $fallback = [ 380 ['id' => '108YeuHhaFQ', 'titulo' => '', 'subtitulo' => '', 'thumb' => 'https://img.youtube.com/vi/108YeuHhaFQ/hqdefault.jpg'], 381 ['id' => '26ZB20BR0E4', 'titulo' => '', 'subtitulo' => '', 'thumb' => 'https://img.youtube.com/vi/26ZB20BR0E4/hqdefault.jpg'], 382 ]; 383 384 if (!$pdo || !table_exists($pdo, 'site_carrossel')) return $fallback; 385 386 try { 387 $sql = "SELECT id, titulo, subtitulo, video_url, thumb, ordem, ativo 388 FROM site_carrossel 389 WHERE COALESCE(ativo,1)=1 390 ORDER BY COALESCE(ordem,0), id"; 391 392 $rows = $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC); 393 $out = []; 394 395 foreach ($rows as $r) { 396 $vid = yt_id((string)$r['video_url']); 397 if ($vid === '') continue; 398 399 $thumb = trim((string)($r['thumb'] ?? '')); 400 if ($thumb !== '') { 401 if (!preg_match('#^(?:https?:)?//#i', $thumb) && strncmp($thumb, 'data:', 5) !== 0) { 402 $thumbPath = parse_url($thumb, PHP_URL_PATH) ?: $thumb; 403 $thumbFile = basename($thumbPath); 404 $thumb = '/sistema/painel/paginas/site/uploads_carrossel/' . $thumbFile; 405 } 406 } else { 407 $thumb = "https://img.youtube.com/vi/$vid/hqdefault.jpg"; 408 } 409 410 $out[] = [ 411 'id' => $vid, 412 'thumb' => $thumb, 413 'titulo' => trim((string)($r['titulo'] ?? '')), 414 'subtitulo' => trim((string)($r['subtitulo'] ?? '')), 415 ]; 416 } 417 418 return $out ?: $fallback; 419 } catch (Throwable $e) { 420 return $fallback; 421 } 422} 423 424$HERO = loadHeroCarousel($pdo); 425 426/* ============================================================ 427 SERVIÇOS 428 ============================================================ */ 429function loadServices(?PDO $pdo): array { 430 if (!$pdo) return []; 431 432 $cands = [ 433 ['t' => 'servicos', 'title' => ['titulo', 'nome'], 'desc' => ['descricao', 'texto', 'resumo'], 'preco' => ['preco', 'valor'], 'img' => ['capa', 'img', 'imagem', 'thumb'], 'link' => ['link', 'url', 'slug'], 'ativo' => ['ativo', 'status']], 434 ['t' => 'produtos_servicos', 'title' => ['titulo', 'nome'], 'desc' => ['descricao', 'texto'], 'preco' => ['preco', 'valor'], 'img' => ['imagem', 'capa'], 'link' => ['url', 'slug'], 'ativo' => ['ativo', 'status']], 435 ['t' => 'servicos_site', 'title' => ['titulo', 'nome'], 'desc' => ['descricao', 'texto'], 'preco' => ['preco', 'valor'], 'img' => ['imagem', 'capa'], 'link' => ['url', 'slug'], 'ativo' => ['ativo', 'status']], 436 ]; 437 438 foreach ($cands as $c) { 439 if (!table_exists($pdo, $c['t'])) continue; 440 441 try { 442 $title = coalesce_expr($pdo, $c['t'], $c['title'], 'titulo'); 443 $desc = coalesce_expr($pdo, $c['t'], $c['desc'], 'descricao'); 444 $preco = coalesce_expr($pdo, $c['t'], $c['preco'], 'preco'); 445 $img = coalesce_expr($pdo, $c['t'], $c['img'], 'img'); 446 $link = coalesce_expr($pdo, $c['t'], $c['link'], 'link'); 447 448 $ativoCol = null; 449 foreach ($c['ativo'] as $ac) { 450 if (col_exists($pdo, $c['t'], $ac)) { 451 $ativoCol = $ac; 452 break; 453 } 454 } 455 456 $where = $ativoCol ? "WHERE COALESCE($ativoCol,1)=1" : ""; 457 $sql = "SELECT $title,$desc,$preco,$img,$link FROM `{$c['t']}` $where ORDER BY 1 LIMIT 12"; 458 $rows = $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC); 459 460 if (!$rows) continue; 461 462 $out = []; 463 foreach ($rows as $r) { 464 $imgSrc = trim((string)($r['img'] ?? '')); 465 if ($imgSrc === '') continue; 466 467 $path = parse_url($imgSrc, PHP_URL_PATH) ?: ''; 468 $ext = strtolower(pathinfo($path, PATHINFO_EXTENSION)); 469 $isImg = in_array($ext, ['jpg', 'jpeg', 'png', 'webp', 'gif'], true); 470 $isVideo = in_array($ext, ['mp4', 'webm', 'ogg'], true); 471 472 if (!$isImg && !$isVideo) continue; 473 474 if (!preg_match('#^https?://#i', $imgSrc) && ($imgSrc[0] ?? '') !== '/') { 475 if (preg_match('#^/?paginas/#', $imgSrc)) { 476 $imgSrc = '/sistema/painel/' . ltrim($imgSrc, '/'); 477 } else { 478 $imgSrc = '/' . ltrim($imgSrc, '/'); 479 } 480 } 481 482 $out[] = [ 483 'img' => $isImg ? $imgSrc : '', 484 'video' => $isVideo ? $imgSrc : '', 485 'titulo' => trim((string)($r['titulo'] ?? '')), 486 'descricao' => trim((string)($r['descricao'] ?? '')), 487 'preco' => trim((string)($r['preco'] ?? '')), 488 'link' => canonical_link((string)($r['link'] ?? '')), 489 ]; 490 } 491 492 return $out; 493 } catch (Throwable $e) {} 494 } 495 496 return []; 497} 498 499$servicos = loadServices($pdo); 500 501/* ============================================================ 502 GALERIA 503 ============================================================ */ 504if (!function_exists('galeria_resolve_img')) { 505 function galeria_resolve_img(string $nome): string { 506 $nome = trim($nome); 507 if ($nome === '') return ''; 508 509 $maybe = fix_path($nome); 510 $absMaybe = $_SERVER['DOCUMENT_ROOT'] . (parse_url($maybe, PHP_URL_PATH) ?? $maybe); 511 if (is_file($absMaybe)) return (parse_url($maybe, PHP_URL_PATH) ?? $maybe); 512 513 $nome = basename($nome); 514 $roots = [ 515 $_SERVER['DOCUMENT_ROOT'] . "/sistema/painel/img/foto_admin/$nome", 516 $_SERVER['DOCUMENT_ROOT'] . "/sistema/painel/img/fotos/$nome", 517 $_SERVER['DOCUMENT_ROOT'] . "/sistema/painel/img/galeria/$nome", 518 $_SERVER['DOCUMENT_ROOT'] . "/sistema/public/uploads/site/$nome", 519 $_SERVER['DOCUMENT_ROOT'] . "/sistema/img/$nome", 520 ]; 521 522 foreach ($roots as $abs) { 523 if (is_file($abs)) return str_replace($_SERVER['DOCUMENT_ROOT'], '', $abs); 524 } 525 526 return "/sistema/painel/img/foto_admin/sem-foto.jpg"; 527 } 528} 529 530if (!function_exists('galeria_load_rows')) { 531 function galeria_load_rows(?PDO $pdo): array { 532 if (!$pdo) return []; 533 534 try { 535 $sql = "SELECT id, titulo, imagem FROM foto_admin ORDER BY data_cad DESC, id DESC"; 536 $rows = $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC); 537 $out = []; 538 539 foreach ($rows as $r) { 540 $src = galeria_resolve_img((string)($r['imagem'] ?? '')); 541 if ($src !== '') { 542 $out[] = [ 543 'titulo' => trim((string)($r['titulo'] ?? '')), 544 'src' => $src 545 ]; 546 } 547 } 548 549 return $out; 550 } catch (Throwable $e) { 551 return []; 552 } 553 } 554} 555 556$GALERIA_ROWS = galeria_load_rows($pdo); 557 558/* ============================================================ 559 HTML 560 ============================================================ */ 561?> 562<!doctype html> 563<html lang="pt-BR"> 564<head> 565 566 <!-- Meta Pixel Code otimizado: carrega somente após load/interação para não travar a renderização inicial --> 567<script> 568(function(){ 569 var pixelLoaded = false; 570 function loadMetaPixel(){ 571 if (pixelLoaded) return; 572 pixelLoaded = true; 573 !function(f,b,e,v,n,t,s){ 574 if(f.fbq)return;n=f.fbq=function(){n.callMethod?n.callMethod.apply(n,arguments):n.queue.push(arguments)}; 575 if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0'; 576 n.queue=[];t=b.createElement(e);t.async=!0;t.src=v; 577 s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s); 578 }(window, document,'script','https://connect.facebook.net/en_US/fbevents.js'); 579 fbq('init', '957398226898063'); 580 fbq('track', 'PageView'); 581 } 582 window.jacyLoadMetaPixel = loadMetaPixel; 583 window.addEventListener('load', function(){ setTimeout(loadMetaPixel, 6000); }, {once:true}); 584 document.addEventListener('pointerdown', loadMetaPixel, {once:true, passive:true}); 585 document.addEventListener('keydown', loadMetaPixel, {once:true}); 586 document.addEventListener('touchstart', loadMetaPixel, {once:true, passive:true}); 587 document.addEventListener('scroll', loadMetaPixel, {once:true, passive:true}); 588})(); 589</script> 590<noscript><img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=957398226898063&ev=PageView&noscript=1" alt=""></noscript> 591<!-- End Meta Pixel Code otimizado --> 592 593<!-- Google tag (gtag.js) --> 594 <link rel="dns-prefetch" href="//www.googletagmanager.com"> 595 <script> 596 window.dataLayer = window.dataLayer || []; 597 function gtag(){dataLayer.push(arguments);} 598 599 (function(){ 600 var gtagLoaded = false; 601 602 function loadGtag(){ 603 if (gtagLoaded) return; 604 gtagLoaded = true; 605 606 var s = document.createElement('script'); 607 s.src = 'https://www.googletagmanager.com/gtag/js?id=AW-10875176701'; 608 s.async = true; 609 document.head.appendChild(s); 610 611 gtag('js', new Date()); 612 gtag('config', 'AW-10875176701'); 613 } 614 615 window.loadGtag = loadGtag; 616 617 window.addEventListener('load', function(){ 618 setTimeout(loadGtag, 6000); 619 }, { once:true }); 620 621 document.addEventListener('pointerdown', loadGtag, { once:true, passive:true }); 622 document.addEventListener('keydown', loadGtag, { once:true }); 623 document.addEventListener('touchstart', loadGtag, { once:true, passive:true }); 624 })(); 625 </script> 626 627 <?php 628 $scheme = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https://' : 'http://'; 629 $httpHost = $_SERVER['HTTP_HOST'] ?? 'jacycabeleireiro.com'; 630 $requestUri = $_SERVER['REQUEST_URI'] ?? '/protese'; 631 $path = parse_url($requestUri, PHP_URL_PATH) ?: '/protese'; 632 633 $canonical = rtrim($scheme . $httpHost . $path, '/'); 634 if ($canonical === rtrim($scheme . $httpHost, '/')) { 635 $canonical = rtrim($scheme . $httpHost, '/') . '/'; 636 } 637 638 $metaTitle = !empty($meta_title) 639 ? $meta_title 640 : 'Prótese Capilar em Cascavel | Jacy Cabeleireiro'; 641 642 $metaDescription = !empty($meta_description) 643 ? $meta_description 644 : 'Prótese capilar em Cascavel com avaliação profissional, aplicação, manutenção e acabamento natural. Agende seu atendimento com Jacy Cabeleireiro.'; 645 646 $metaKeywords = !empty($meta_keywords) 647 ? $meta_keywords 648 : 'prótese capilar em Cascavel, manutenção de prótese capilar, prótese capilar masculina, cabeleireiro em Cascavel, barbeiro em Cascavel'; 649 650 $faviconSeoFile = __DIR__ . '/images/favicon.png'; 651 $faviconSeoUrl = '/images/favicon.png'; 652 $faviconPadrao = 'images/' . ltrim((string)($icone_site ?? ''), '/'); 653 $faviconUrl = is_file($faviconSeoFile) ? $faviconSeoUrl : $faviconPadrao; 654 655 $siteName = !empty($SET['nome']) ? $SET['nome'] : 'Jacy Cabeleireiro'; 656 $ogImagePath = !empty($SET['logo_png']) ? $SET['logo_png'] : $faviconUrl; 657 if (!preg_match('#^(https?:)?//#i', $ogImagePath)) { 658 $ogImage = $scheme . $httpHost . '/' . ltrim($ogImagePath, '/'); 659 } else { 660 $ogImage = $ogImagePath; 661 } 662 663 $serviceSchema = [ 664 '@context' => 'https://schema.org', 665 '@type' => 'Service', 666 'name' => 'Prótese Capilar em Cascavel', 667 'serviceType' => 'Prótese Capilar', 668 'description' => $metaDescription, 669 'url' => $canonical, 670 'provider' => [ 671 '@type' => 'HairSalon', 672 'name' => $siteName, 673 'url' => rtrim($scheme . $httpHost, '/') . '/', 674 'image' => $ogImage, 675 'areaServed' => [ 676 '@type' => 'City', 677 'name' => 'Cascavel' 678 ] 679 ] 680 ]; 681 682 if (!empty($SET['telefone'])) { 683 $serviceSchema['provider']['telephone'] = $SET['telefone']; 684 } 685 ?> 686 687 <meta charset="utf-8"> 688 <meta http-equiv="x-dns-prefetch-control" content="on"> 689 <meta name="viewport" content="width=device-width,initial-scale=1"> 690 <title><?=h($metaTitle)?></title> 691 <meta name="description" content="<?=h($metaDescription)?>"> 692 <meta name="keywords" content="<?=h($metaKeywords)?>"> 693 <meta name="author" content="Jacy Cordeiro"> 694 <meta name="theme-color" content="#05070a"> 695 <link rel="icon" type="image/png" sizes="48x48" href="<?=h($faviconUrl)?>"> 696 <link rel="shortcut icon" href="<?=h($faviconUrl)?>" type="image/x-icon"> 697 <link rel="apple-touch-icon" href="<?=h($faviconUrl)?>"> 698 <meta name="robots" content="index,follow,max-image-preview:large"> 699 <link rel="canonical" href="<?=h($canonical)?>"> 700 701 <meta property="og:type" content="website"> 702 <meta property="og:locale" content="pt_BR"> 703 <meta property="og:site_name" content="<?=h($siteName)?>"> 704 <meta property="og:title" content="<?=h($metaTitle)?>"> 705 <meta property="og:description" content="<?=h($metaDescription)?>"> 706 <meta property="og:url" content="<?=h($canonical)?>"> 707 <meta property="og:image" content="<?=h($ogImage)?>"> 708 <meta name="twitter:card" content="summary_large_image"> 709 <meta name="twitter:title" content="<?=h($metaTitle)?>"> 710 <meta name="twitter:description" content="<?=h($metaDescription)?>"> 711 <meta name="twitter:image" content="<?=h($ogImage)?>"> 712 713 <script type="application/ld+json"><?=json_encode($serviceSchema, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)?></script> 714 <link rel="dns-prefetch" href="//cdn.jsdelivr.net"> 715 <link rel="dns-prefetch" href="//connect.facebook.net"> 716 717 <?php if ($LCP): 718 $isExt = preg_match('#^https?://#i', $LCP); 719 ?> 720 <link rel="preload" as="image" href="<?=h($LCP)?>" fetchpriority="high" <?= $isExt ? 'crossorigin' : ''?>> 721 <?php endif; ?> 722 <?php 723 $___recaptcha_file = $_SERVER['DOCUMENT_ROOT'] . '/config/recaptcha.php'; 724 if (is_file($___recaptcha_file)) { 725 require_once $___recaptcha_file; 726 } 727 $___site_key = defined('RECAPTCHA_SITE_KEY') ? RECAPTCHA_SITE_KEY : ''; 728 ?> 729 <script>window.RECAPTCHA_SITE_KEY="<?=h($___site_key)?>";</script> 730 <?php 731 $indexCssFile = __DIR__ . '/css/index.css'; 732 $indexCssVersion = file_exists($indexCssFile) ? filemtime($indexCssFile) : time(); 733?> 734<!-- V7: carrega os CSS essenciais imediatamente para não quebrar carrossel, grid, menu e rodapé --> 735<link rel="stylesheet" href="/css/bootstrap.css?v=<?php echo (int)$indexCssVersion; ?>"> 736<link rel="stylesheet" href="/css/style.css?v=<?php echo (int)$indexCssVersion; ?>"> 737<link rel="stylesheet" href="/css/responsive.css?v=<?php echo (int)$indexCssVersion; ?>"> 738<link rel="stylesheet" href="/css/font-awesome.min.css?v=<?php echo (int)$indexCssVersion; ?>"> 739<link rel="stylesheet" href="/css/index.css?v=<?php echo (int)$indexCssVersion; ?>"> 740<link rel="stylesheet" href="/css/protese-google-ads.css?v=<?php echo (int)$indexCssVersion; ?>"> 741<noscript> 742 <link rel="stylesheet" href="/css/bootstrap.css"> 743 <link rel="stylesheet" href="/css/style.css"> 744 <link rel="stylesheet" href="/css/responsive.css"> 745 <link rel="stylesheet" href="/css/font-awesome.min.css"> 746 <link rel="stylesheet" href="/css/index.css"> 747 <link rel="stylesheet" href="/css/protese-google-ads.css"> 748</noscript> 749<style> 750 751 /* ============================================================ 752 PATCH V7 - correção visual segura 753 Objetivo: evitar carrossel empilhado e rodapé sem grid quando 754 a página /protese usa cabeçalho parcial otimizado. 755 Não altera consultas, formulários, banco, links ou lógica PHP. 756 ============================================================ */ 757 .carousel{position:relative;} 758 .carousel-inner{position:relative;width:100%;overflow:hidden;} 759 .carousel-item{position:relative;display:none;width:100%;backface-visibility:hidden;} 760 .carousel-item.active{display:block!important;} 761 .slider_section .carousel-inner{overflow:hidden!important;} 762 .slider_section .carousel-item:not(.active){display:none!important;} 763 .slider_section .carousel-item.active{display:block!important;} 764 .slider_section .carousel-item > div{width:100%;} 765 .footer_section .container{width:100%;max-width:1140px;margin-right:auto;margin-left:auto;padding-right:15px;padding-left:15px;} 766 .footer_section .row{display:flex;flex-wrap:wrap;margin-right:-15px;margin-left:-15px;} 767 .footer_section [class*="col-"]{position:relative;width:100%;padding-right:15px;padding-left:15px;} 768 .footer_section .form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;} 769 .footer_section .btn{display:inline-block;font-weight:700;text-align:center;vertical-align:middle;cursor:pointer;border:1px solid transparent;padding:.55rem .85rem;border-radius:.25rem;} 770 .footer_section .btn-block{display:block;width:100%;} 771 @media (min-width:768px){.footer_section .col-md-5{flex:0 0 41.666667%;max-width:41.666667%;}.footer_section .col-md-6{flex:0 0 50%;max-width:50%;}.footer_section .col-md-7{flex:0 0 58.333333%;max-width:58.333333%;}} 772 @media (min-width:992px){.footer_section .col-lg-3{flex:0 0 25%;max-width:25%;}.footer_section .col-lg-4{flex:0 0 33.333333%;max-width:33.333333%;}.footer_section .col-lg-5{flex:0 0 41.666667%;max-width:41.666667%;}} 773 774 /* ============================================================ 775 PAGESPEED V6 - crítico da /protese 776 Mantém a lógica e reduz bloqueio, CLS e reflow no mobile. 777 ============================================================ */ 778 *,*::before,*::after{box-sizing:border-box;} 779 img,video,iframe{max-width:100%;} 780 .jacy-header-lite{ 781 position:sticky!important; 782 top:0; 783 left:0; 784 right:0; 785 z-index:10000; 786 min-height:84px; 787 padding:10px 0; 788 background:rgba(0,0,0,.96); 789 box-shadow:0 8px 22px rgba(0,0,0,.18); 790 } 791 .jacy-header-lite .container{width:100%;max-width:1140px;margin:0 auto;padding:0 15px;} 792 .jacy-header-lite .navbar{display:flex;align-items:center;justify-content:space-between;gap:18px;padding:0;} 793 .jacy-header-lite .navbar-brand{display:inline-flex;align-items:center;flex:0 0 auto;text-decoration:none;color:#fff;font-weight:800;} 794 .jacy-header-lite .navbar-brand img{display:block;width:80px;height:54px;object-fit:contain;} 795 .jacy-header-lite .navbar-collapse{display:flex;align-items:center;justify-content:flex-end;flex:1 1 auto;} 796 .jacy-header-lite .navbar-nav{display:flex;align-items:center;gap:6px;margin:0 0 0 auto;padding:0;list-style:none;} 797 .jacy-header-lite .nav-link{display:block;color:#fff;text-decoration:none;text-transform:uppercase;font-weight:800;font-size:15px;line-height:1.25;padding:10px 13px;border-radius:8px;} 798 .jacy-header-lite .nav-link:hover,.jacy-header-lite .nav-link:focus{color:#d1aa57;background:rgba(209,170,87,.08);} 799 .jacy-header-lite .navbar-toggler{display:none;width:44px;height:40px;border:0;background:transparent;padding:0;cursor:pointer;} 800 .jacy-header-lite .navbar-toggler span,.jacy-header-lite .navbar-toggler span::before,.jacy-header-lite .navbar-toggler span::after{display:block;width:34px;height:4px;background:#fff;border-radius:8px;content:"";position:relative;} 801 .jacy-header-lite .navbar-toggler span::before{position:absolute;top:-10px;left:0;} 802 .jacy-header-lite .navbar-toggler span::after{position:absolute;top:10px;left:0;} 803 .jacy-header-lite .dropdown{position:relative;} 804 .jacy-header-lite .dropdown-menu{display:none;position:absolute;top:100%;left:0;min-width:220px;padding:8px 0;margin:4px 0 0;background:#080808;border:1px solid rgba(209,170,87,.25);border-radius:12px;box-shadow:0 14px 30px rgba(0,0,0,.35);z-index:10001;} 805 .jacy-header-lite .dropdown-menu.show{display:block;} 806 .jacy-header-lite .dropdown-item{display:block;color:#fff;text-decoration:none;padding:10px 16px;font-weight:700;white-space:nowrap;} 807 .jacy-header-lite .dropdown-item:hover{background:rgba(209,170,87,.16);color:#d1aa57;} 808 .jacy-header-lite .dropdown-divider{height:1px;background:rgba(255,255,255,.09);margin:4px 0;} 809 .slider_section .carousel-inner,.slider_section .carousel-item{min-height:720px;} 810 #agenda-seletiva{min-height:620px;} 811 .modal{position:fixed;inset:0;z-index:10050;display:none;overflow:auto;background:rgba(0,0,0,.45);} 812 .modal.show{display:block;} 813 .modal-dialog{position:relative;width:auto;margin:1.5rem auto;pointer-events:none;} 814 .modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background:#fff;border-radius:12px;outline:0;} 815 .modal-backdrop{position:fixed;inset:0;background:rgba(0,0,0,.65);z-index:10040;} 816 @media (max-width:991px){ 817 .jacy-header-lite{min-height:74px;padding:8px 0;} 818 .jacy-header-lite .navbar-brand img{width:72px;height:48px;} 819 .jacy-header-lite .navbar-toggler{display:grid;place-items:center;} 820 .jacy-header-lite .navbar-collapse{display:none;position:absolute;top:100%;left:0;right:0;background:#050505;border-top:1px solid rgba(209,170,87,.22);padding:12px 15px;box-shadow:0 16px 30px rgba(0,0,0,.35);} 821 .jacy-header-lite .navbar-collapse.show{display:block;} 822 .jacy-header-lite .navbar-nav{display:block;margin:0;} 823 .jacy-header-lite .nav-link{text-align:left;padding:12px 8px;} 824 .jacy-header-lite .dropdown-menu{position:static;min-width:0;margin:5px 0 8px;box-shadow:none;} 825 .slider_section .carousel-inner,.slider_section .carousel-item,.slider_section .carousel-item > div{min-height:560px!important;} 826 #agenda-seletiva{min-height:760px;} 827 #agenda-seletiva>div{grid-template-columns:1fr!important;padding-top:44px!important;padding-bottom:44px!important;} 828 } 829 830 :root{ 831 --bg:#0b0b0d; 832 --card:#1a1c23; 833 --text:#e9e9ee; 834 --muted:#d2d6de; 835 --brand:#2d86ff; 836 } 837 838 html, 839 body{ 840 margin:0; 841 background:var(--bg); 842 color:var(--text); 843 } 844 845 body{ 846 overflow-x:hidden; 847 } 848 849 main{ 850 display:block; 851 margin:0; 852 padding:0; 853 background:#020202; 854 } 855 856 .sr-only{ 857 position:absolute !important; 858 width:1px !important; 859 height:1px !important; 860 padding:0 !important; 861 margin:-1px !important; 862 overflow:hidden !important; 863 clip:rect(0,0,0,0) !important; 864 white-space:nowrap !important; 865 border:0 !important; 866 } 867 868 .grecaptcha-badge{ 869 z-index:2147483647; 870 } 871 872 main > section:not(.slider_section), 873 #agenda-seletiva, 874 #galeria-banco, 875 .experience-section, 876 #depoimentos{ 877 content-visibility:auto; 878 contain-intrinsic-size:900px; 879 } 880 881 /* Banner padrão do sistema */ 882 .slider_section{ 883 position:relative; 884 display:block !important; 885 margin:0 !important; 886 padding:0 !important; 887 background:#000 !important; 888 overflow:hidden; 889 } 890 891 .slider_section #customCarouselProtese{ 892 position:relative !important; 893 width:100%; 894 background:#000; 895 } 896 897 .slider_section #customCarouselProtese > .container{ 898 position:absolute; 899 left:0; 900 right:0; 901 bottom:24px; 902 z-index:6; 903 pointer-events:none; 904 } 905 906 .slider_section .carousel-inner, 907 .slider_section .carousel-item{ 908 background:#000; 909 } 910 911 .slider_section .carousel-item > div{ 912 min-height:720px; 913 } 914 915 .slider_section .carousel_btn-box{ 916 display:flex; 917 align-items:center; 918 gap:12px; 919 margin:0 !important; 920 padding:0 !important; 921 width:auto; 922 pointer-events:none; 923 } 924 925 .slider_section .carousel-control-prev, 926 .slider_section .carousel-control-next{ 927 position:relative !important; 928 inset:auto !important; 929 width:52px !important; 930 height:52px !important; 931 border-radius:50% !important; 932 display:inline-flex !important; 933 align-items:center !important; 934 justify-content:center !important; 935 background:#111 !important; 936 border:1px solid rgba(255,255,255,.22) !important; 937 color:#fff !important; 938 opacity:1 !important; 939 text-shadow:none !important; 940 box-shadow:0 8px 18px rgba(0,0,0,.28); 941 pointer-events:auto; 942 } 943 944 .slider_section .carousel-control-prev:hover, 945 .slider_section .carousel-control-next:hover{ 946 background:#b8862d !important; 947 color:#fff !important; 948 text-decoration:none; 949 } 950 951 .section{ 952 margin:0; 953 padding:28px 0; 954 background:#020202; 955 border-top:1px solid #161616; 956 } 957 958 /* Correção: evita espaço vazio entre o banner e a próxima seção quando não houver cards de serviços */ 959 .section:empty{ 960 display:none !important; 961 margin:0 !important; 962 padding:0 !important; 963 border:0 !important; 964 min-height:0 !important; 965 } 966 967 .cards{ 968 display:grid; 969 grid-template-columns:repeat(3,minmax(0,1fr)); 970 gap:16px; 971 } 972 973 .card{ 974 background:var(--card); 975 border:1px solid rgba(255,255,255,.07); 976 border-radius:14px; 977 overflow:hidden; 978 display:flex; 979 flex-direction:column; 980 } 981 982 .card img{ 983 width:100%; 984 height:180px; 985 object-fit:cover; 986 display:block; 987 background:#000; 988 } 989 990 .card .p{ 991 padding:12px; 992 display:flex; 993 flex-direction:column; 994 gap:6px; 995 } 996 997 .price{ 998 font-weight:800; 999 color:#fff; 1000 } 1001 1002 .muted{ 1003 color:var(--muted); 1004 } 1005 1006 /* Experiência */ 1007 .xp-wrap{ 1008 max-width:1280px; 1009 margin:0 auto; 1010 padding:0 16px; 1011 position:relative; 1012 z-index:2; 1013 } 1014 1015 .xp-grid{ 1016 display:grid; 1017 grid-template-columns:1.1fr 1fr; 1018 gap:32px; 1019 align-items:center; 1020 } 1021 1022 .xp-left-year{ 1023 position:relative; 1024 text-align:center; 1025 } 1026 1027 .xp-year{ 1028 display:block; 1029 margin:0; 1030 font-size:min(22vw,200px); 1031 line-height:.85; 1032 font-weight:900; 1033 letter-spacing:2px; 1034 background:linear-gradient(180deg,#ffffff 0%,#b9c5ff 60%,#8aa2ff 100%); 1035 -webkit-background-clip:text; 1036 background-clip:text; 1037 -webkit-text-fill-color:transparent; 1038 color:transparent; 1039 text-shadow:0 10px 40px rgba(0,0,0,.25); 1040 } 1041 1042 .xp-subtitle{ 1043 display:block; 1044 margin:0; 1045 font-size:28px; 1046 font-weight:800; 1047 color:#cfe1ff; 1048 } 1049 1050 .xp-underline{ 1051 width:120px; 1052 height:4px; 1053 background:linear-gradient(90deg,#2d86ff,#3ddc97); 1054 border-radius:6px; 1055 margin:10px auto 18px; 1056 } 1057 1058 .xp-visitas{ 1059 background:rgba(255,255,255,.05); 1060 border:2px solid rgba(66,133,244,.30); 1061 border-radius:15px; 1062 padding:20px; 1063 display:flex; 1064 align-items:center; 1065 justify-content:center; 1066 gap:14px; 1067 max-width:100%; 1068 } 1069 1070 .xp-vis-num{ 1071 font-size:2.4rem; 1072 font-weight:800; 1073 color:#4285f4; 1074 line-height:1; 1075 margin:0; 1076 } 1077 1078 .xp-vis-label{ 1079 font-size:.9rem; 1080 color:#bbbbbb; 1081 text-transform:uppercase; 1082 letter-spacing:1px; 1083 font-weight:600; 1084 margin:0; 1085 } 1086 1087 .xp-title{ 1088 color:#ffffff; 1089 font-size:clamp(28px,4.4vw,56px); 1090 line-height:1.05; 1091 font-weight:900; 1092 margin:0 0 10px; 1093 } 1094 1095 .xp-title .blue{ 1096 color:#8ab4ff; 1097 } 1098 1099 .xp-desc{ 1100 color:#d7dbff; 1101 line-height:1.75; 1102 margin:0 0 22px; 1103 max-width:60ch; 1104 font-size:18px; 1105 } 1106 1107 .exp-stats{ 1108 display:grid; 1109 grid-template-columns:repeat(3,minmax(0,1fr)); 1110 gap:14px; 1111 margin-top:26px; 1112 } 1113 1114 .exp-card{ 1115 background:rgba(255,255,255,.05); 1116 border:1px solid rgba(255,255,255,.10); 1117 border-radius:12px; 1118 padding:18px 12px; 1119 text-align:center; 1120 min-width:0; 1121 min-height:120px; 1122 overflow:hidden; 1123 display:flex; 1124 flex-direction:column; 1125 justify-content:center; 1126 } 1127 1128 .exp-num{ 1129 max-width:100%; 1130 font-size:clamp(1.35rem,1.75vw,2.2rem); 1131 font-weight:800; 1132 line-height:1.15; 1133 margin-bottom:6px; 1134 overflow-wrap:break-word; 1135 word-break:normal; 1136 hyphens:auto; 1137 } 1138 1139 .exp-label{ 1140 max-width:100%; 1141 font-size:.9rem; 1142 line-height:1.35; 1143 letter-spacing:1px; 1144 text-transform:uppercase; 1145 color:#bbbbbb; 1146 font-weight:600; 1147 overflow-wrap:break-word; 1148 word-break:normal; 1149 hyphens:auto; 1150 } 1151 1152 .exp-num--blue{ 1153 color:#4285f4; 1154 } 1155 1156 .exp-num--green{ 1157 color:#34a853; 1158 } 1159 1160 .exp-num--gold{ 1161 color:#fbbc04; 1162 } 1163 1164 .xp-badges{ 1165 display:flex; 1166 gap:12px; 1167 flex-wrap:wrap; 1168 margin-top:12px; 1169 } 1170 1171 .xp-badge{ 1172 display:inline-flex; 1173 align-items:center; 1174 gap:10px; 1175 padding:10px 18px; 1176 border-radius:999px; 1177 font-weight:800; 1178 border:1px solid; 1179 } 1180 1181 .xp-badge--cert{ 1182 background:#0e1935; 1183 border-color:rgba(141,176,255,.25); 1184 color:#cfe1ff; 1185 } 1186 1187 .xp-badge--qual{ 1188 background:#0f1d15; 1189 border-color:rgba(83,214,155,.25); 1190 color:#bff3dd; 1191 } 1192 1193 .xp-badge .dot{ 1194 display:inline-grid; 1195 place-items:center; 1196 width:22px; 1197 height:22px; 1198 border-radius:50%; 1199 flex:0 0 22px; 1200 } 1201 1202 .xp-badge--cert .dot{ 1203 background:#2d86ff; 1204 color:#ffffff; 1205 } 1206 1207 .xp-badge--qual .dot{ 1208 background:#3ddc97; 1209 color:#0d2a1f; 1210 } 1211 1212 .experience-section.visitas-normal{ 1213 --vis-w:100%; 1214 --vis-pad:20px; 1215 --vis-num:2.4rem; 1216 --vis-icon:2.2rem; 1217 --vis-bw:2px; 1218 --under-w:120px; 1219 --under-h:4px; 1220 --under-m:10px auto 18px; 1221 } 1222 1223 .experience-section.visitas-normal .xp-visitas{ 1224 max-width:var(--vis-w); 1225 margin:10px auto 0; 1226 padding:var(--vis-pad); 1227 border-width:var(--vis-bw); 1228 border-radius:12px; 1229 } 1230 1231 .experience-section.visitas-normal .xp-visitas > div:first-child{ 1232 font-size:var(--vis-icon) !important; 1233 line-height:1; 1234 } 1235 1236 .experience-section.visitas-normal .xp-visitas .xp-vis-num{ 1237 font-size:var(--vis-num); 1238 } 1239 1240 .experience-section.visitas-normal .xp-left-year .xp-underline{ 1241 width:var(--under-w); 1242 height:var(--under-h); 1243 margin:var(--under-m); 1244 } 1245 1246 /* Modal específico da página */ 1247 #modalSimulacaoCliente .modal-dialog{ 1248 max-width:1100px; 1249 margin:1.5rem auto; 1250 } 1251 1252 #modalSimulacaoCliente .modal-content{ 1253 border-radius:18px; 1254 border:0; 1255 overflow:hidden; 1256 box-shadow:0 18px 50px rgba(0,0,0,.25); 1257 } 1258 1259 #modalSimulacaoCliente .modal-header{ 1260 background:linear-gradient(90deg,#111 0%,#1f1f1f 100%); 1261 color:#fff; 1262 border-bottom:0; 1263 padding:18px 22px; 1264 } 1265 1266 #modalSimulacaoCliente .modal-header .close{ 1267 color:#fff; 1268 opacity:1; 1269 text-shadow:none; 1270 } 1271 1272 #modalSimulacaoCliente .modal-body{ 1273 background:#f7f8fa; 1274 padding:22px; 1275 } 1276 1277 #modalSimulacaoCliente .alert{ 1278 border-radius:12px; 1279 border:1px solid #d7c29a; 1280 background:#f7f0e3; 1281 color:#5e4824; 1282 margin-bottom:18px; 1283 } 1284 1285 #modalSimulacaoCliente .form-group label{ 1286 font-weight:700; 1287 color:#333; 1288 margin-bottom:8px; 1289 } 1290 1291 #modalSimulacaoCliente .form-control{ 1292 border-radius:10px; 1293 min-height:46px; 1294 border:1px solid #d8dee6; 1295 box-shadow:none; 1296 } 1297 1298 #modalSimulacaoCliente .form-control:focus{ 1299 border-color:#b8862d; 1300 box-shadow:0 0 0 .15rem rgba(184,134,45,.15); 1301 } 1302 1303 .painel-comparacao-simulacao{ 1304 background:#fff; 1305 border:1px solid #e4e7eb; 1306 border-radius:16px; 1307 padding:16px; 1308 box-shadow:0 6px 20px rgba(0,0,0,.05); 1309 height:100%; 1310 } 1311 1312 .painel-comparacao-simulacao .titulo-painel{ 1313 font-size:15px; 1314 font-weight:700; 1315 color:#2d3436; 1316 margin-bottom:12px; 1317 } 1318 1319 .box-imagem-simulacao{ 1320 background:linear-gradient(180deg,#ffffff 0%,#f8f9fb 100%); 1321 border:1px solid #dfe4ea; 1322 border-radius:14px; 1323 min-height:340px; 1324 display:flex; 1325 align-items:center; 1326 justify-content:center; 1327 padding:12px; 1328 position:relative; 1329 overflow:hidden; 1330 } 1331 1332 .box-imagem-simulacao img{ 1333 position:relative; 1334 z-index:2; 1335 max-width:100%; 1336 max-height:310px; 1337 border-radius:10px; 1338 box-shadow:0 8px 24px rgba(0,0,0,.12); 1339 background:#fff; 1340 } 1341 1342 .legenda-simulacao{ 1343 margin-top:12px; 1344 font-size:13px; 1345 color:#6c757d; 1346 line-height:20px; 1347 } 1348 1349 #btn_simular_cliente{ 1350 border-radius:50px; 1351 min-height:52px; 1352 font-size:18px; 1353 font-weight:700; 1354 box-shadow:0 10px 24px rgba(184,134,45,.18); 1355 } 1356 1357 #mensagem_simulacao_cliente{ 1358 font-size:14px; 1359 font-weight:600; 1360 min-height:22px; 1361 } 1362 1363 .selo-comparacao{ 1364 display:inline-block; 1365 padding:6px 12px; 1366 border-radius:30px; 1367 font-size:12px; 1368 font-weight:700; 1369 background:#111; 1370 color:#fff; 1371 margin-bottom:10px; 1372 } 1373 1374 @media (max-width:1000px){ 1375 .cards{ 1376 grid-template-columns:repeat(2,minmax(0,1fr)); 1377 } 1378 } 1379 1380 @media (max-width:991px){ 1381 .slider_section .carousel-item > div{ 1382 min-height:620px; 1383 } 1384 1385 .slider_section #customCarouselProtese > .container{ 1386 bottom:18px; 1387 } 1388 1389 .xp-grid{ 1390 grid-template-columns:1fr; 1391 gap:24px; 1392 } 1393 1394 .exp-stats{ 1395 grid-template-columns:repeat(2,1fr); 1396 } 1397 1398 #modalSimulacaoCliente .modal-body{ 1399 padding:16px; 1400 } 1401 1402 .box-imagem-simulacao{ 1403 min-height:260px; 1404 margin-bottom:12px; 1405 } 1406 1407 .box-imagem-simulacao img{ 1408 max-height:230px; 1409 } 1410 1411 #btn_simular_cliente{ 1412 font-size:16px; 1413 } 1414 } 1415 1416 @media (max-width:768px){ 1417 .slider_section .detail-box{ 1418 margin-top:110px !important; 1419 } 1420 1421 .slider_section .detail-box h2{ 1422 font-size:32px; 1423 line-height:1.2; 1424 } 1425 1426 .slider_section .detail-box p{ 1427 font-size:15px; 1428 line-height:1.6; 1429 } 1430 1431 .slider_section .carousel-control-prev, 1432 .slider_section .carousel-control-next{ 1433 width:46px !important; 1434 height:46px !important; 1435 } 1436 1437 .xp-year{ 1438 font-size:min(30vw,140px); 1439 } 1440 1441 .xp-subtitle{ 1442 font-size:22px; 1443 } 1444 1445 .xp-title{ 1446 font-size:clamp(24px,8vw,38px); 1447 } 1448 1449 .xp-desc{ 1450 font-size:16px; 1451 } 1452 1453 .exp-stats{ 1454 grid-template-columns:1fr; 1455 } 1456 1457 .xp-badges{ 1458 flex-direction:column; 1459 align-items:flex-start; 1460 } 1461 1462 .cards{ 1463 grid-template-columns:1fr; 1464 } 1465 } 1466 1467 1468 /* PATCH V5: estabilidade visual sem mudar a lógica */ 1469 html{scroll-behavior:auto;} 1470 .layout_padding,.footer_section,footer{content-visibility:auto;contain-intrinsic-size:760px;} 1471 .header_section{min-height:96px;} 1472 @media (max-width:768px){.header_section{min-height:84px;}} 1473 img{max-width:100%;height:auto;} 1474 .carousel-item img[width][height]{height:100%;} 1475 1476 1477 /* ============================================================ 1478 GALERIA DE TRABALHOS - movimento contínuo e clique no atendimento 1479 ============================================================ */ 1480 #galeria-banco #galeriaWrap{ 1481 touch-action:pan-y; 1482 } 1483 1484 #galeria-banco #galeriaViewport{ 1485 overflow:hidden; 1486 } 1487 1488 #galeria-banco #galTrack{ 1489 transition:none !important; 1490 will-change:transform; 1491 } 1492 1493 #galeria-banco .galItem{ 1494 cursor:pointer; 1495 user-select:none; 1496 -webkit-user-select:none; 1497 outline:none; 1498 } 1499 1500 #galeria-banco .galItem:focus-visible{ 1501 box-shadow:0 0 0 3px rgba(209,170,87,.82); 1502 border-radius:12px; 1503 } 1504 1505 #galeria-banco .galItem img{ 1506 pointer-events:none; 1507 } 1508 1509 1510 /* ============================================================ 1511 DEPOIMENTOS /PROTESE - organização profissional dos cards 1512 Mantém os IDs, classes depItem e o carrossel original. 1513 Ajusta somente espaçamento, tamanho padrão e responsividade. 1514 ============================================================ */ 1515 .depoimentos-protese-section{ 1516 background:#050607 !important; 1517 color:#fff !important; 1518 padding:118px 0 58px !important; 1519 margin:0 !important; 1520 scroll-margin-top:130px !important; 1521 overflow:hidden !important; 1522 } 1523 .depoimentos-protese-container{ 1524 width:100% !important; 1525 max-width:1320px !important; 1526 margin:0 auto !important; 1527 padding:0 18px !important; 1528 } 1529 .depoimentos-protese-titulo{ 1530 color:#fff8ea !important; 1531 text-align:center !important; 1532 font-size:38px !important; 1533 line-height:1.2 !important; 1534 font-weight:900 !important; 1535 margin:0 0 28px !important; 1536 letter-spacing:.2px !important; 1537 text-shadow:0 8px 24px rgba(0,0,0,.45) !important; 1538 } 1539 .depoimentos-controle-protese{ 1540 display:flex !important; 1541 align-items:center !important; 1542 gap:12px !important; 1543 margin:0 auto 18px !important; 1544 max-width:1020px !important; 1545 } 1546 .depoimentos-controle-protese button{ 1547 border:1px solid rgba(209,170,87,.28) !important; 1548 background:rgba(209,170,87,.10) !important; 1549 color:#fff !important; 1550 width:42px !important; 1551 height:42px !important; 1552 border-radius:50% !important; 1553 cursor:pointer !important; 1554 font-size:26px !important; 1555 line-height:1 !important; 1556 display:flex !important; 1557 align-items:center !important; 1558 justify-content:center !important; 1559 box-shadow:0 10px 24px rgba(0,0,0,.22) !important; 1560 } 1561 .depoimentos-controle-protese button:disabled{ 1562 opacity:.45 !important; 1563 cursor:not-allowed !important; 1564 } 1565 .depoimentos-dots-protese{ 1566 display:flex !important; 1567 gap:7px !important; 1568 flex:1 !important; 1569 align-items:center !important; 1570 justify-content:center !important; 1571 min-height:12px !important; 1572 } 1573 .depoimentos-viewport-protese{ 1574 overflow:hidden !important; 1575 padding:2px 0 8px !important; 1576 } 1577 .depoimentos-track-protese{ 1578 display:flex !important; 1579 gap:26px !important; 1580 align-items:stretch !important; 1581 transition:transform .45s ease !important; 1582 will-change:transform !important; 1583 } 1584 .depoimento-item-protese{ 1585 display:flex !important; 1586 align-items:stretch !important; 1587 box-sizing:border-box !important; 1588 padding:0 0 8px !important; 1589 } 1590 .depoimento-card-protese{ 1591 width:100% !important; 1592 height:650px !important; 1593 display:flex !important; 1594 flex-direction:column !important; 1595 background:linear-gradient(180deg,#121821 0%,#0a0d12 100%) !important; 1596 border:1px solid rgba(209,170,87,.22) !important; 1597 border-radius:22px !important; 1598 padding:26px !important; 1599 box-shadow:0 20px 48px rgba(0,0,0,.38) !important; 1600 overflow:hidden !important; 1601 } 1602 .depoimento-card-topo-protese{ 1603 min-height:112px !important; 1604 display:flex !important; 1605 align-items:center !important; 1606 gap:20px !important; 1607 padding-bottom:18px !important; 1608 margin-bottom:18px !important; 1609 border-bottom:1px solid rgba(209,170,87,.16) !important; 1610 } 1611 .depoimento-card-foto-protese{ 1612 width:96px !important; 1613 height:96px !important; 1614 object-fit:cover !important; 1615 border-radius:50% !important; 1616 border:3px solid rgba(209,170,87,.42) !important; 1617 background:#000 !important; 1618 box-shadow:0 12px 28px rgba(0,0,0,.32) !important; 1619 flex:0 0 96px !important; 1620 } 1621 .depoimento-card-info-protese{ 1622 flex:1 !important; 1623 min-width:0 !important; 1624 } 1625 .depoimento-card-info-protese strong{ 1626 display:block !important; 1627 color:#fff !important; 1628 font-size:26px !important; 1629 line-height:1.15 !important; 1630 font-weight:900 !important; 1631 margin:0 0 7px !important; 1632 word-break:break-word !important; 1633 } 1634 .depoimento-card-info-protese span{ 1635 display:inline-flex !important; 1636 align-items:center !important; 1637 gap:7px !important; 1638 color:#d7c6a8 !important; 1639 font-size:15px !important; 1640 line-height:1.4 !important; 1641 } 1642 .depoimento-card-info-protese span:before{ 1643 content:"✓" !important; 1644 width:19px !important; 1645 height:19px !important; 1646 display:inline-flex !important; 1647 align-items:center !important; 1648 justify-content:center !important; 1649 border-radius:50% !important; 1650 background:rgba(209,170,87,.18) !important; 1651 color:#d1aa57 !important; 1652 font-size:12px !important; 1653 font-weight:900 !important; 1654 } 1655 .depoimento-card-corpo-protese{ 1656 flex:1 !important; 1657 display:flex !important; 1658 flex-direction:column !important; 1659 min-height:0 !important; 1660 } 1661 .depoimento-card-texto-protese{ 1662 height:178px !important; 1663 overflow:auto !important; 1664 scrollbar-width:thin !important; 1665 margin:0 !important; 1666 padding:20px !important; 1667 color:#f4f4f4 !important; 1668 background:#0b0c0f !important; 1669 border:1px solid rgba(255,255,255,.08) !important; 1670 border-radius:16px !important; 1671 text-align:center !important; 1672 font-size:17px !important; 1673 line-height:1.75 !important; 1674 } 1675 .depoimento-card-midias-protese{ 1676 height:260px !important; 1677 margin-top:16px !important; 1678 display:flex !important; 1679 gap:14px !important; 1680 min-height:0 !important; 1681 } 1682 .depoimento-card-midia-protese{ 1683 flex:1 1 0 !important; 1684 min-width:0 !important; 1685 height:100% !important; 1686 display:flex !important; 1687 align-items:center !important; 1688 justify-content:center !important; 1689 background:#020203 !important; 1690 border:1px solid rgba(255,255,255,.10) !important; 1691 border-radius:18px !important; 1692 overflow:hidden !important; 1693 } 1694 .depoimento-card-midia-protese video, 1695 .depoimento-card-midia-protese img{ 1696 width:100% !important; 1697 height:100% !important; 1698 object-fit:contain !important; 1699 display:block !important; 1700 border:0 !important; 1701 border-radius:0 !important; 1702 background:#020203 !important; 1703 } 1704 .depoimento-card-sem-midia-protese{ 1705 flex:1 !important; 1706 margin-top:16px !important; 1707 display:flex !important; 1708 align-items:center !important; 1709 justify-content:center !important; 1710 text-align:center !important; 1711 min-height:260px !important; 1712 color:#a99d88 !important; 1713 border:1px dashed rgba(209,170,87,.20) !important; 1714 border-radius:18px !important; 1715 background:rgba(209,170,87,.035) !important; 1716 font-size:15px !important; 1717 } 1718 .depoimentos-protese-botao{ 1719 text-align:center !important; 1720 margin-top:24px !important; 1721 } 1722 .depoimentos-protese-botao a{ 1723 display:inline-block !important; 1724 background:#d1aa57 !important; 1725 color:#111 !important; 1726 padding:14px 28px !important; 1727 border-radius:999px !important; 1728 font-weight:900 !important; 1729 text-decoration:none !important; 1730 box-shadow:0 10px 28px rgba(209,170,87,.32) !important; 1731 } 1732 @media (max-width:899px){ 1733 .depoimentos-protese-section{ 1734 padding:104px 0 46px !important; 1735 scroll-margin-top:112px !important; 1736 } 1737 .depoimentos-protese-titulo{ 1738 font-size:30px !important; 1739 } 1740 .depoimentos-track-protese{ 1741 gap:18px !important; 1742 } 1743 .depoimento-card-protese{ 1744 height:auto !important; 1745 min-height:0 !important; 1746 padding:20px !important; 1747 } 1748 .depoimento-card-topo-protese{ 1749 min-height:88px !important; 1750 gap:15px !important; 1751 } 1752 .depoimento-card-foto-protese{ 1753 width:78px !important; 1754 height:78px !important; 1755 flex-basis:78px !important; 1756 } 1757 .depoimento-card-info-protese strong{ 1758 font-size:22px !important; 1759 } 1760 .depoimento-card-texto-protese{ 1761 height:auto !important; 1762 max-height:230px !important; 1763 font-size:16px !important; 1764 padding:18px !important; 1765 } 1766 .depoimento-card-midias-protese{ 1767 height:auto !important; 1768 flex-direction:column !important; 1769 } 1770 .depoimento-card-midia-protese{ 1771 height:280px !important; 1772 } 1773 .depoimento-card-sem-midia-protese{ 1774 display:none !important; 1775 } 1776 } 1777 1778</style> 1779 <!-- Google Ads: conversão somente em ação real do usuário 1780 Não dispara conversão apenas por abrir a página. --> 1781<script> 1782 window.JACY_ADS_CONVERSION_SEND_TO = 'AW-10875176701/WWgPCPKFp4ocEP2N2MEo'; 1783 window.jacyTrackAdsConversion = window.jacyTrackAdsConversion || function(label){ 1784 try { 1785 if (window.loadGtag) window.loadGtag(); 1786 if (typeof gtag === 'function') { 1787 gtag('event', 'conversion', { 1788 'send_to': window.JACY_ADS_CONVERSION_SEND_TO, 1789 'event_category': 'lead', 1790 'event_label': label || 'protese_capilar', 1791 'transport_type': 'beacon' 1792 }); 1793 } 1794 } catch(e) {} 1795 }; 1796</script> 1797 1798 <!-- Patch PageSpeed V6 aplicado em /protese: header parcial, footer leve, CSS assíncrono e imagens otimizáveis. --> 1799</head> 1800<body class="pagina-protese-google-ads"> 1801 1802<?php if (!defined('JACY_HEADER_PARTIAL_ONLY')) define('JACY_HEADER_PARTIAL_ONLY', true); require_once("cabecalho.php"); ?> 1803 1804<main> 1805<section class="slider_section" aria-label="Destaques"> 1806 <div id="customCarouselProtese" class="carousel slide" data-ride="carousel" data-interval="5000" aria-roledescription="carousel"> 1807 <div class="carousel-inner"> 1808 <?php foreach ($slides as $i => $s): 1809 $ativo = ($i === 0) ? 'active' : ''; 1810 $titulo = trim((string)($s['titulo'] ?? '')); 1811 $descricao = trim((string)($s['texto'] ?? '')); 1812 $botao_link = trim((string)($s['link'] ?? '')); 1813 $botao_texto = 'Agendar'; 1814 $botao_target = '_self'; 1815 $botao_rel = ''; 1816 1817 if ($botao_link === '' || preg_match('/^\s*javascript:/i', $botao_link)) { 1818 $botao_link = $SET['agenda_url']; 1819 } else { 1820 $botao_texto = 'Saiba mais'; 1821 if (preg_match('/^(https?:)?\/\//i', $botao_link)) { 1822 $botao_target = '_blank'; 1823 $botao_rel = 'noopener noreferrer'; 1824 } 1825 } 1826 ?> 1827 <div class="carousel-item <?php echo $ativo; ?>"> 1828 <div style="position:relative;min-height:720px;background:#000;overflow:hidden;"> 1829 <div style="position:absolute;top:0;left:0;width:100%;height:100%;z-index:1;"> 1830 <?php if (!empty($s['video'])): ?> 1831 <video 1832 poster="<?=h($LCP_POSTER)?>" 1833 muted 1834 playsinline 1835 loop 1836 preload="none" 1837 style="width:100%;height:100%;object-fit:cover;display:block;opacity:.38;" 1838 > 1839 <source src="<?=h($s['video'])?>" type="video/mp4"> 1840 </video> 1841 <?php else: ?> 1842 <img 1843 src="<?=h(jacy_fast_img_src((string)$s['img']))?>" 1844 alt="<?=h($titulo !== '' ? $titulo : 'Banner')?>" 1845 title="<?=h($titulo)?>" 1846 width="1920" 1847 height="720" 1848 <?php echo ($i === 0) ? 'loading="eager" fetchpriority="high"' : 'loading="lazy"'; ?> 1849 decoding="async" 1850 sizes="100vw" 1851 style="width:100%;height:100%;object-fit:cover;display:block;opacity:.38;" 1852 > 1853 <?php endif; ?> 1854 </div> 1855 1856 <div style="position:absolute;top:0;left:0;width:100%;height:100%;background:linear-gradient(90deg, rgba(0,0,0,.88) 0%, rgba(0,0,0,.62) 45%, rgba(0,0,0,.25) 100%);z-index:2;"></div> 1857 1858 <div class="container" style="position:relative;z-index:3;"> 1859 <div class="row align-items-center" style="min-height:720px;"> 1860 <div class="col-md-7 col-lg-6"> 1861 <div class="detail-box" style="margin-top:80px;"> 1862 <?php if ($titulo !== ''): ?> 1863 <h2 style="color:#fff;"><?php echo h($titulo); ?></h2> 1864 <?php endif; ?> 1865 1866 <?php if ($descricao !== ''): ?> 1867 <p style="color:#fff;"><?php echo h($descricao); ?></p> 1868 <?php endif; ?> 1869 1870 <div class="btn-box"> 1871 <a 1872 href="<?php echo h($botao_link); ?>" 1873 target="<?php echo $botao_target; ?>" 1874 <?php if ($botao_rel !== ''): ?>rel="<?php echo $botao_rel; ?>"<?php endif; ?> 1875 class="btn btn-lg btn-contact" 1876 > 1877 <?php echo h($botao_texto); ?> 1878 </a> 1879 </div> 1880 </div> 1881 </div> 1882 </div> 1883 </div> 1884 </div> 1885 </div> 1886 <?php endforeach; ?> 1887 </div> 1888 1889 <div class="container"> 1890 <div class="carousel_btn-box"> 1891 <a class="carousel-control-prev" href="#customCarouselProtese" role="button" data-slide="prev" aria-label="Anterior"> 1892 <i class="fa fa-arrow-left" aria-hidden="true"></i><span class="sr-only">Previous</span> 1893 </a> 1894 <a class="carousel-control-next" href="#customCarouselProtese" role="button" data-slide="next" aria-label="Próximo"> 1895 <i class="fa fa-arrow-right" aria-hidden="true"></i><span class="sr-only">Next</span> 1896 </a> 1897 </div> 1898 </div> 1899 </div> 1900</section> 1901 1902 <?php if ($servicos): ?> 1903 <section class="section"> 1904 <div class="container"> 1905 <?php if ($servicos): ?> 1906 <div class="cards"> 1907 <?php foreach ($servicos as $s): ?> 1908 <article class="card"> 1909 <img src="<?=h(jacy_fast_img_src($s['img'] ? $s['img'] : (UP . 'placeholder.webp')))?>" width="600" height="360" alt="<?=h($s['titulo'])?>" loading="lazy" decoding="async" fetchpriority="low" sizes="(max-width: 600px) 100vw, 33vw"> 1910 <div class="p"> 1911 <strong><?=h($s['titulo'])?></strong> 1912 1913 <?php if (!empty($s['descricao'])): ?> 1914 <div class="muted"><?=h(mb_strimwidth(strip_tags($s['descricao']), 0, 160, '…', 'UTF-8'))?></div> 1915 <?php endif; ?> 1916 1917 <div style="display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-top:4px"> 1918 <?php if ($s['preco'] !== ''): ?><span class="price"><?=h(money_br($s['preco']))?></span><?php endif; ?> 1919 <span class="muted">·</span> 1920 <a class="btn btn-brand" href="<?=h($SET['agenda_url'])?>">Agendar</a> 1921 <a class="btn btn-outline" href="<?=h($WPP)?>" target="_blank" rel="noopener">WhatsApp</a> 1922 <?php if (!empty($s['link'])): ?> 1923 <a class="btn btn-outline" href="<?=h($s['link'])?>" target="_blank" rel="noopener">Detalhes</a> 1924 <?php endif; ?> 1925 </div> 1926 </div> 1927 </article> 1928 <?php endforeach; ?> 1929 </div> 1930 <?php else: ?> 1931 <p class="muted" aria-hidden="true"></p> 1932 <?php endif; ?> 1933 </div> 1934 </section> 1935 <?php endif; ?> 1936 1937 <section id="agenda-seletiva" style="background:radial-gradient(1200px 600px at 70% -10%,#0d1f17 0%,#070b09 60%,#050807 100%);color:#fff"> 1938 <div style="max-width:1200px;margin:0 auto;padding:60px 20px;display:grid;grid-template-columns:1.1fr 1fr;gap:48px;align-items:center"> 1939 <div> 1940 <div id="heroSlider" style="position:relative;border-radius:18px;overflow:hidden;background:#000;box-shadow:0 20px 60px rgba(0,0,0,.35)"> 1941 <div id="heroTrack" style="display:flex;transition:transform .5s ease"> 1942 <?php foreach ($HERO as $h): ?> 1943 <div class="hero-slide" data-video="<?=h($h['id'])?>" style="min-width:100%;position:relative;aspect-ratio:16/9;background:#000"> 1944 <img alt="<?=h($h['titulo'] ?: 'Vídeo')?>" loading="lazy" fetchpriority="low" width="640" height="360" style="position:absolute;inset:0;width:100%;height:100%;object-fit:cover;opacity:.9" src="<?=h($h['thumb'])?>" onerror="this.onerror=null;this.src='https://img.youtube.com/vi/<?=h($h['id'])?>/hqdefault.jpg'"> 1945 <button class="play-btn" type="button" aria-label="Reproduzir vídeo" style="position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:72px;height:72px;border-radius:50%;border:0;background:rgba(255,255,255,.16);backdrop-filter:blur(6px);cursor:pointer;display:grid;place-items:center;box-shadow:0 10px 30px rgba(0,0,0,.35)"> 1946 <svg width="28" height="28" viewBox="0 0 24 24" fill="#fff" aria-hidden="true"><path d="M8 5v14l11-7z"/></svg> 1947 <span class="sr" style="position:absolute;left:-9999px">Reproduzir vídeo</span> 1948 </button> 1949 </div> 1950 <?php endforeach; ?> 1951 </div> 1952 1953 <button id="heroPrev" aria-label="Anterior" style="position:absolute;left:14px;top:50%;transform:translateY(-50%);width:42px;height:42px;border-radius:50%;border:0;background:rgba(255,255,255,.14);color:#fff;cursor:pointer;display:grid;place-items:center">‹</button> 1954 <button id="heroNext" aria-label="Próximo" style="position:absolute;right:14px;top:50%;transform:translateY(-50%);width:42px;height:42px;border-radius:50%;border:0;background:rgba(255,255,255,.14);color:#fff;cursor:pointer;display:grid;place-items:center">›</button> 1955 1956 <div id="heroDots" style="position:absolute;left:0;right:0;bottom:12px;display:flex;gap:8px;justify-content:center"> 1957 <?php for ($i = 0, $n = count($HERO); $i < $n; $i++): ?> 1958 <button type="button" data-i="<?=$i?>" aria-label="Ir para o vídeo <?=$i + 1?>" style="width:8px;height:8px;border-radius:50%;border:0;cursor:pointer;<?=$i === 0 ? 'background:#ffffffaa' : 'background:#ffffff55'?>"></button> 1959 <?php endfor; ?> 1960 </div> 1961 </div> 1962 </div> 1963 1964 <div> 1965 <h1 style="font-size:48px;line-height:1.1;margin:0 0 20px 0;font-weight:800;letter-spacing:.5px">Prótese Capilar em Cascavel<br>com Avaliação Profissional</h1> 1966 <p style="color:#cfe6dc;line-height:1.7;margin:0 0 28px 0;max-width:46ch">Atendimento com hora marcada, avaliação individual, orientação sobre aplicação, manutenção e acabamento para um visual natural e alinhado ao seu perfil.</p> 1967 <div style="display:flex;flex-direction:column;gap:16px;max-width:560px"> 1968 <a id="ctaWhats" href="<?=h($WPP)?>" target="_blank" rel="noopener" style="display:block;text-align:center;background:#b8862d;color:#fff;padding:18px 24px;border-radius:32px;text-decoration:none;font-weight:700;letter-spacing:.3px;box-shadow:0 6px 24px rgba(19,170,120,.25)">FALAR COM O JACY PELO WHATSAPP</a> 1969 <a id="ctaApp" href="<?=h($AGENDA_LINK)?>" target="_blank" rel="noopener" style="display:block;text-align:center;background:transparent;color:#d1aa57;padding:18px 24px;border-radius:32px;text-decoration:none;font-weight:700;letter-spacing:.3px;border:2px solid rgba(215,239,230,.35)">AGENDAR PELO BARBERBOT</a> 1970 </div> 1971 </div> 1972 </div> 1973 </section> 1974 1975 <?php if (!empty($GALERIA_ROWS)): ?> 1976 <section id="galeria-banco" style="padding:40px 0;background:#0b0b0d;color:#fff"> 1977 <div style="max-width:1200px;margin:0 auto;padding:0 16px"> 1978 <h2 style="margin:0 0 22px;font-size:28px;font-weight:800;letter-spacing:.3px">Galeria de trabalhos</h2> 1979 1980 <div id="galeriaWrap" style="position:relative"> 1981 <button id="galPrev" type="button" aria-label="Anterior" style="position:absolute;left:-8px;top:45%;transform:translateY(-50%);width:44px;height:44px;border-radius:50%;border:0;cursor:pointer;background:rgba(255,255,255,.15);color:#fff;font-size:24px;z-index:2">‹</button> 1982 <button id="galNext" type="button" aria-label="Próximo" style="position:absolute;right:-8px;top:45%;transform:translateY(-50%);width:44px;height:44px;border-radius:50%;border:0;cursor:pointer;background:rgba(255,255,255,.15);color:#fff;font-size:24px;z-index:2">›</button> 1983 1984 <div id="galeriaViewport" style="overflow:hidden"> 1985 <div id="galTrack" style="display:flex;gap:22px;transition:none;will-change:transform"> 1986 <?php foreach ($GALERIA_ROWS as $g): ?> 1987 <figure class="galItem" data-jacy-open-whatsapp-modal="1" role="button" tabindex="0" aria-label="Abrir atendimento pelo WhatsApp" style="margin:0;min-width:25%;display:flex;flex-direction:column;align-items:center"> 1988 <div style="width:100%;aspect-ratio:1/1.02;position:relative;border-radius:12px;overflow:hidden;background:#000"> 1989 <img src="<?=h(jacy_fast_img_src((string)$g['src']))?>" alt="<?=h($g['titulo'] ?: 'Foto')?>" width="400" height="408" style="position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block" loading="lazy" decoding="async" fetchpriority="low" onerror="this.onerror=null;this.src='/sistema/painel/img/foto_admin/sem-foto.jpg'"> 1990 </div> 1991 <?php if (!empty($g['titulo'])): ?> 1992 <figcaption style="margin-top:12px;font-weight:700;text-align:center"><?=h($g['titulo'])?></figcaption> 1993 <?php endif; ?> 1994 </figure> 1995 <?php endforeach; ?> 1996 </div> 1997 </div> 1998 </div> 1999 </div> 2000 </section> 2001 <?php endif; ?> 2002 2003 <section class="jacy-simulacao-section" style="background:linear-gradient(180deg,#090909 0%,#0f0c08 100%);padding:56px 0 48px;border-top:1px solid rgba(209,170,87,.18);border-bottom:1px solid rgba(209,170,87,.18);"> 2004 <div style="max-width:1280px;margin:0 auto;padding:0 16px;"> 2005 2006 <div style="text-align:center;margin:0 auto 34px;max-width:980px;"> 2007 <h2 style="margin:0 0 14px;font-size:42px;line-height:1.15;font-weight:800;color:#fff;"> 2008 Simulação visual para apoiar sua avaliação 2009 </h2> 2010 2011 <p style="margin:0 auto;max-width:860px;color:#d7d7d7;line-height:1.8;font-size:16px;"> 2012 Envie uma foto frontal para gerar uma prévia visual de referência. A simulação ajuda na conversa inicial e respeita a cor natural do cabelo. A definição final de cor, densidade e modelo é feita durante a avaliação profissional. 2013 </p> 2014 </div> 2015 2016 <div style="display:flex;flex-wrap:wrap;justify-content:center;gap:24px;margin-bottom:28px;align-items:stretch;"> 2017 <div class="jacy-sim-card" style="flex:1 1 320px;max-width:390px;min-width:280px;background:linear-gradient(180deg,#f4ead7 0%,#e7d8bf 100%);border:1px solid rgba(209,170,87,.38);border-radius:14px;box-shadow:0 14px 34px rgba(0,0,0,.22);padding:28px 22px;text-align:center;"> 2018 <div class="jacy-sim-num" style="width:72px;height:72px;line-height:72px;margin:0 auto 15px;border-radius:50%;background:linear-gradient(135deg,#d4ad5a 0%,#b8872d 100%);color:#17120b;font-size:28px;font-weight:900;box-shadow:0 10px 22px rgba(184,134,45,.24);">1</div> 2019 <h4 style="margin:0 0 10px;font-weight:900;color:#1f160a !important;text-shadow:none !important;opacity:1 !important;">Envie sua foto</h4> 2020 <p style="margin:0;color:#5c4a2f !important;line-height:1.7;text-shadow:none !important;opacity:1 !important;font-weight:600;">Envie uma foto frontal para gerar uma prévia visual de referência para o atendimento.</p> 2021 </div> 2022 2023 <div class="jacy-sim-card" style="flex:1 1 320px;max-width:390px;min-width:280px;background:linear-gradient(180deg,#f4ead7 0%,#e7d8bf 100%);border:1px solid rgba(209,170,87,.38);border-radius:14px;box-shadow:0 14px 34px rgba(0,0,0,.22);padding:28px 22px;text-align:center;"> 2024 <div class="jacy-sim-num" style="width:72px;height:72px;line-height:72px;margin:0 auto 15px;border-radius:50%;background:linear-gradient(135deg,#d4ad5a 0%,#b8872d 100%);color:#17120b;font-size:28px;font-weight:900;box-shadow:0 10px 22px rgba(184,134,45,.24);">2</div> 2025 <h4 style="margin:0 0 10px;font-weight:900;color:#1f160a !important;text-shadow:none !important;opacity:1 !important;">Prévia com referência natural</h4> 2026 <p style="margin:0;color:#5c4a2f !important;line-height:1.7;text-shadow:none !important;opacity:1 !important;font-weight:600;">A prévia considera a cor natural do cabelo e serve como apoio para a avaliação presencial ou online.</p> 2027 </div> 2028 2029 <div class="jacy-sim-card" style="flex:1 1 320px;max-width:390px;min-width:280px;background:linear-gradient(180deg,#f4ead7 0%,#e7d8bf 100%);border:1px solid rgba(209,170,87,.38);border-radius:14px;box-shadow:0 14px 34px rgba(0,0,0,.22);padding:28px 22px;text-align:center;"> 2030 <div class="jacy-sim-num" style="width:72px;height:72px;line-height:72px;margin:0 auto 15px;border-radius:50%;background:linear-gradient(135deg,#d4ad5a 0%,#b8872d 100%);color:#17120b;font-size:28px;font-weight:900;box-shadow:0 10px 22px rgba(184,134,45,.24);">3</div> 2031 <h4 style="margin:0 0 10px;font-weight:900;color:#1f160a !important;text-shadow:none !important;opacity:1 !important;">Receba uma referência visual</h4> 2032 <p style="margin:0;color:#5c4a2f !important;line-height:1.7;text-shadow:none !important;opacity:1 !important;font-weight:600;">Visualize uma referência antes do atendimento. O resultado final depende da avaliação, materiais, técnica de aplicação e manutenção.</p> 2033 </div> 2034 </div> 2035 2036 <div style="max-width:760px;margin:0 auto;"> 2037 <div class="jacy-sim-cta" style="text-align:center;padding:28px;background:linear-gradient(180deg,rgba(24,21,16,.94) 0%,rgba(16,14,11,.98) 100%);border:1px solid rgba(209,170,87,.24);border-radius:16px;box-shadow:0 18px 36px rgba(0,0,0,.26);"> 2038 <h4 style="margin:0 0 12px;color:#fff;font-weight:700;">Solicite uma simulação visual com orientação profissional</h4> 2039 <p style="margin:0 0 20px;color:#d7d7d7;line-height:1.8;"> 2040 Envie sua foto e receba uma prévia visual para iniciar sua avaliação. A definição final de cor, densidade e modelo será orientada pelo profissional durante o atendimento. 2041 </p> 2042 2043 <a 2044 href="#modalSimulacaoCliente" 2045 id="btnAbrirSimuladorProtese" 2046 data-toggle="modal" 2047 data-target="#modalSimulacaoCliente" 2048 role="button" 2049 class="btn btn-primary btn-lg" 2050 style="font-size:1.3rem;padding:12px 34px;border-radius:50px;text-decoration:none;display:inline-block;font-weight:900;background:linear-gradient(135deg,#d1aa57 0%,#b8862d 55%,#8f6520 100%);border:0;color:#111;box-shadow:0 12px 28px rgba(184,134,45,.28);" 2051> 2052 Solicitar simulação visual 2053</a> 2054 </div> 2055 </div> 2056 2057 </div> 2058 </section> 2059 2060 <section class="experience-section visitas-normal" style="background:linear-gradient(135deg,#11100d 0%,#1b1711 55%,#0f0d0a 100%); color:#e9e9ee; padding:56px 0 48px; border-top:1px solid #2a2a2a; border-bottom:1px solid #2a2a2a; position:relative; overflow:hidden"> 2061 <div class="xp-wrap"> 2062 <div class="xp-grid"> 2063 <div class="xp-left-year"> 2064 <div class="xp-year">1999</div> 2065 <div class="xp-subtitle">Início da nossa trajetória</div> 2066 <div class="xp-underline"></div> 2067 2068 <div class="xp-visitas"> 2069 <div style="font-size:2.2rem">👁️</div> 2070 <div style="text-align:left"> 2071 <div class="xp-vis-num"><span class="counter-1999" data-target="0">0</span></div> 2072 <div class="xp-vis-label">Visitas ao site</div> 2073 </div> 2074 </div> 2075 </div> 2076 2077 <div> 2078 <h2 class="xp-title">Experiência desde <span class="blue">1999</span></h2> 2079 <p class="xp-desc"> 2080 Há mais de 25 anos, Jacy Cordeiro oferece atendimento personalizado 2081em Cascavel, com avaliação individual, orientação sobre aplicação, 2082manutenção e acabamento para um resultado discreto e alinhado ao 2083perfil de cada cliente.</p> 2084 2085 <div class="exp-stats"> 2086 <div class="exp-card"> 2087 <div class="exp-num exp-num--blue">+ 25 anos</div> 2088 <div class="exp-label">de experiências</div> 2089 </div> 2090 <div class="exp-card"> 2091 <div class="exp-num exp-num--green">Atendimento </div> 2092 <div class="exp-label">personalizado</div> 2093 </div> 2094 <div class="exp-card"> 2095 <div class="exp-num exp-num--gold">Resultado</div> 2096 <div class="exp-label">natural e discreto</div> 2097 </div> 2098 </div> 2099 2100 <div class="xp-badges"> 2101 <span class="xp-badge xp-badge--cert"><span class="dot">✔</span>Avaliação individual</span> 2102 <span class="xp-badge xp-badge--qual"><span class="dot">🏆</span>Experiência e cuidado</span> 2103 </div> 2104 </div> 2105 </div> 2106 </div> 2107 2108 <div style="position:absolute;inset:auto -10% -40% -10%;height:300px;background:radial-gradient(60% 60% at 50% 0%,rgba(45,134,255,.25),transparent 60%)"></div> 2109 </section> 2110 2111 <section style="background:#0b0b0d;color:#fff;padding:36px 0"> 2112 <div style="max-width:1280px;margin:0 auto;padding:0 16px;display:flex;flex-wrap:wrap;gap:24px;align-items:center"> 2113 <div style="flex:1 1 520px;min-width:280px"> 2114 <div style="border-radius:14px;overflow:hidden;background:#000"> 2115 <?php 2116 $url_video = isset($url_video) ? (string)$url_video : ''; 2117 $posicao_video = isset($posicao_video) ? (string)$posicao_video : ''; 2118 $imagem_sobre = isset($imagem_sobre) ? basename((string)$imagem_sobre) : 'sobre.jpg'; 2119 $texto_sobre = isset($texto_sobre) ? (string)$texto_sobre : ''; 2120 $videoEmCima = ($url_video !== '' && trim($posicao_video) === 'sobre'); 2121 $videoEmBaixo = ($url_video !== '' && trim($posicao_video) === 'abaixo'); 2122 2123 if ($videoEmCima) { 2124 echo '<div style="position:relative;width:100%;padding-top:56.25%"><iframe src="about:blank" data-src="' . h($url_video) . '" class="js-lazy-iframe" title="Vídeo institucional" frameborder="0" loading="lazy" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen referrerpolicy="strict-origin-when-cross-origin" style="position:absolute;inset:0;width:100%;height:100%;display:block;border:0"></iframe></div>'; 2125 } else { 2126 $imgPath = "images/{$imagem_sobre}"; 2127 $webpPath = preg_replace('/\.(jpe?g|png)$/i', '.webp', $imgPath); 2128 ?> 2129 <picture> 2130 <?php if ($webpPath && file_exists($webpPath)): ?> 2131 <source type="image/webp" srcset="<?=h($webpPath)?>"> 2132 <?php endif; ?> 2133 <img src="<?=h($imgPath)?>" alt="Sobre nós" width="1200" height="675" loading="lazy" decoding="async" fetchpriority="low" style="width:100%;height:auto;display:block"> 2134 </picture> 2135 <?php } ?> 2136 </div> 2137 </div> 2138 2139 <div style="flex:1 1 520px;min-width:280px;display:flex;align-items:center"> 2140 <div style="width:100%"> 2141 <h4 style="margin:0 0 14px;font-size:42px;line-height:1.15;font-weight:800;letter-spacing:.4px">Sobre Nós</h4> 2142 <p style="margin:0 0 22px;line-height:1.75;font-size:16px;color:#EDEDED"><?=nl2br(h($texto_sobre))?></p> 2143 <a href="#empresa" data-toggle="modal" data-target="#empresa" aria-controls="empresa" aria-label="Abrir informações da empresa" style="display:inline-block;background:#d1aa57;border:0;color:#fff;padding:14px 22px;border-radius:999px;font-weight:800;letter-spacing:.3px;text-decoration:none;box-shadow:0 8px 26px rgba(209,170,87,.35)">Mais Informações</a> 2144 </div> 2145 </div> 2146 </div> 2147 </section> 2148 2149 <?php if (!empty($videoEmBaixo)): ?> 2150 <div style="background:#0b0b0d;padding:12px 0"> 2151 <div style="max-width:1280px;margin:0 auto;padding:0 16px"> 2152 <div style="position:relative;width:100%;padding-top:56.25%;border-radius:14px;overflow:hidden;background:#000"> 2153 <iframe class="video_mobile js-lazy-iframe" src="about:blank" data-src="<?=h($url_video)?>" title="Vídeo institucional" frameborder="0" loading="lazy" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen referrerpolicy="strict-origin-when-cross-origin" style="position:absolute;inset:0;width:100%;height:100%;display:block;border:0"></iframe> 2154 </div> 2155 </div> 2156 </div> 2157 <?php endif; ?> 2158 2159 <?php 2160 $resDep = []; 2161 2162 try { 2163 $__colsDep = $pdo ? $pdo->query("SHOW COLUMNS FROM comentarios")->fetchAll(PDO::FETCH_COLUMN) : []; 2164 $__selectDep = "nome, texto, foto"; 2165 2166 if (in_array('video', $__colsDep, true)) { 2167 $__selectDep .= ", video"; 2168 } else { 2169 $__selectDep .= ", '' AS video"; 2170 } 2171 2172 if (in_array('print_whatsapp', $__colsDep, true)) { 2173 $__selectDep .= ", print_whatsapp"; 2174 } else { 2175 $__selectDep .= ", '' AS print_whatsapp"; 2176 } 2177 2178 $resDep = $pdo ? $pdo->query("SELECT {$__selectDep} FROM comentarios WHERE ativo='Sim' ORDER BY id DESC LIMIT 20")->fetchAll(PDO::FETCH_ASSOC) : []; 2179 } catch (Throwable $e) { 2180 try { 2181 $resDep = $pdo ? $pdo->query("SELECT nome, texto, foto, '' AS video, '' AS print_whatsapp FROM comentarios WHERE ativo='Sim' ORDER BY id DESC LIMIT 20")->fetchAll(PDO::FETCH_ASSOC) : []; 2182 } catch (Throwable $e) { 2183 $resDep = []; 2184 } 2185 } 2186 2187 if ($resDep && count($resDep) > 0): 2188 ?> 2189 2190 <section id="depoimentos" class="depoimentos-protese-section"> 2191 <div class="depoimentos-protese-container"> 2192 <h2 class="depoimentos-protese-titulo">Depoimentos de clientes</h2> 2193 2194 <div class="depoimentos-controle-protese"> 2195 <button id="depPrev" type="button" aria-label="Anterior">‹</button> 2196 <div id="depDots" class="depoimentos-dots-protese"></div> 2197 <button id="depNext" type="button" aria-label="Próximo">›</button> 2198 </div> 2199 2200 <div class="depoimentos-viewport-protese"> 2201 <div id="depTrack" class="depoimentos-track-protese"> 2202 <?php foreach ($resDep as $c): 2203 $nome = trim($c['nome'] ?? ''); 2204 $texto = trim($c['texto'] ?? ''); 2205 $foto = basename((string)($c['foto'] ?? '')); 2206 $video = basename((string)($c['video'] ?? '')); 2207 $print_whatsapp = basename((string)($c['print_whatsapp'] ?? '')); 2208 2209 $path = "sistema/painel/img/comentarios/" . ($foto ?: 'sem-foto.jpg'); 2210 $webp = preg_replace('/\.(jpe?g|png)$/i', '.webp', $path); 2211 $src = (is_file($_SERVER['DOCUMENT_ROOT'] . '/' . $webp) ? $webp : $path); 2212 2213 $videoSrc = $video !== '' ? "sistema/painel/img/comentarios/" . $video : ''; 2214 $printSrc = $print_whatsapp !== '' ? "sistema/painel/img/comentarios/" . $print_whatsapp : ''; 2215 ?> 2216 <article class="depItem depoimento-item-protese"> 2217 <div class="depoimento-card-protese"> 2218 <div class="depoimento-card-topo-protese"> 2219 <img 2220 class="depoimento-card-foto-protese" 2221 src="<?=h(jacy_fast_img_src((string)$src))?>" 2222 alt="<?=h($nome ?: 'Cliente')?>" 2223 width="96" 2224 height="96" 2225 loading="lazy" 2226 decoding="async" 2227 fetchpriority="low" 2228 > 2229 2230 <div class="depoimento-card-info-protese"> 2231 <strong><?=h($nome ?: 'Cliente')?></strong> 2232 <span>Avaliação verificada</span> 2233 </div> 2234 </div> 2235 2236 <div class="depoimento-card-corpo-protese"> 2237 <p class="depoimento-card-texto-protese"><?=nl2br(h($texto))?></p> 2238 2239 <?php if ($videoSrc !== '' || $printSrc !== ''): ?> 2240 <div class="depoimento-card-midias-protese"> 2241 <?php if ($videoSrc !== ''): ?> 2242 <div class="depoimento-card-midia-protese"> 2243 <video controls preload="metadata" playsinline> 2244 <source src="<?=h($videoSrc)?>" type="video/mp4"> 2245 </video> 2246 </div> 2247 <?php endif; ?> 2248 2249 <?php if ($printSrc !== ''): ?> 2250 <div class="depoimento-card-midia-protese"> 2251 <img 2252 src="<?=h($printSrc)?>" 2253 alt="Print do WhatsApp do depoimento de <?=h($nome ?: 'cliente')?>" 2254 loading="lazy" 2255 decoding="async" 2256 > 2257 </div> 2258 <?php endif; ?> 2259 </div> 2260 <?php else: ?> 2261 <div class="depoimento-card-sem-midia-protese"> 2262 Depoimento cliente satisfeit. 2263 </div> 2264 <?php endif; ?> 2265 </div> 2266 </div> 2267 </article> 2268 <?php endforeach; ?> 2269 </div> 2270 </div> 2271 2272 <div class="depoimentos-protese-botao"> 2273 <a href="#modalComentario" data-toggle="modal" data-target="#modalComentario">Enviar depoimento</a> 2274 </div> 2275 </div> 2276 </section> 2277 <?php endif; ?> 2278</main> 2279 2280<?php require_once("rodape.php"); ?> 2281 2282<div class="modal fade" id="modalSimulacaoCliente" tabindex="-1" role="dialog" aria-labelledby="modalSimulacaoClienteLabel" aria-hidden="true"> 2283 <div class="modal-dialog modal-xl" role="document"> 2284 <div class="modal-content"> 2285 <div class="modal-header"> 2286 <h4 class="modal-title" id="modalSimulacaoClienteLabel">Simulação Visual de Prótese Capilar</h4> 2287 <button type="button" class="close" data-dismiss="modal" aria-label="Fechar modal"> 2288 <span aria-hidden="true">&times;</span> 2289 </button> 2290 </div> 2291 2292 <form id="form_simulacao_cliente" method="post" action="javascript:void(0);" enctype="multipart/form-data" onsubmit="return false;"> 2293 <div class="modal-body"> 2294 <div class="alert alert-info" style="font-size:14px;line-height:22px;"> 2295 Envie uma foto frontal para uma prévia visual de referência. A imagem será usada para atendimento e simulação, conforme a Política de Privacidade. 2296 </div> 2297 2298 <div class="row"> 2299 <div class="col-md-6"> 2300 <div class="form-group"> 2301 <label for="nome_simulacao_cliente">Seu Nome *</label> 2302 <input type="text" class="form-control" id="nome_simulacao_cliente" name="nome" autocomplete="name" placeholder="Digite seu nome" required> 2303 </div> 2304 </div> 2305 2306 <div class="col-md-6"> 2307 <div class="form-group"> 2308 <label for="telefone_simulacao_cliente">WhatsApp *</label> 2309 <input type="tel" class="form-control" id="telefone_simulacao_cliente" name="telefone" autocomplete="tel" inputmode="tel" placeholder="(00) 00000-0000" maxlength="15" required> 2310 </div> 2311 </div> 2312 </div> 2313 2314 <div class="row"> 2315 <div class="col-md-12"> 2316 <div class="form-group"> 2317 <label for="foto_simulacao_cliente">Escolha sua foto</label> 2318 <input type="file" class="form-control" id="foto_simulacao_cliente" name="foto" accept=".jpg,.jpeg,.png,.webp" onchange="carregarPreviewSimulacaoCliente()" required> 2319 </div> 2320 </div> 2321 </div> 2322 2323 <div class="row linha-imagens"> 2324 <div class="col-md-6"> 2325 <div class="painel-comparacao-simulacao"> 2326 <span class="selo-comparacao">Antes</span> 2327 <div class="titulo-painel">Imagem Original</div> 2328 <div class="box-imagem-simulacao"> 2329 <img src="/sistema/painel/images/simulacoes/sem-foto.jpg" id="preview_original_simulacao_cliente" alt="Prévia da imagem original enviada" width="260" height="260" loading="lazy" decoding="async" fetchpriority="low"> 2330 </div> 2331 <div class="legenda-simulacao">Foto enviada para referência visual no atendimento.</div> 2332 </div> 2333 </div> 2334 2335 <div class="col-md-6"> 2336 <div class="painel-comparacao-simulacao"> 2337 <span class="selo-comparacao">Depois</span> 2338 <div class="titulo-painel">Imagem Simulada</div> 2339 <div class="box-imagem-simulacao"> 2340 <img src="/sistema/painel/images/simulacoes/sem-foto.jpg" id="preview_resultado_simulacao_cliente" alt="Prévia da simulação gerada" width="260" height="260" loading="lazy" decoding="async" fetchpriority="low"> 2341 </div> 2342 <div class="legenda-simulacao">Prévia visual gerada para apoiar a avaliação profissional.</div> 2343 </div> 2344 </div> 2345 </div> 2346 2347 <div class="row linha-botao"> 2348 <div class="col-md-12"> 2349 <button type="button" id="btn_simular_cliente" class="btn btn-primary btn-block" onclick="enviarSimulacaoCliente()"> 2350 <i id="icone_btn_simular_cliente" class="fa fa-magic"></i> 2351 <span id="texto_btn_simular_cliente">Solicitar simulação</span> 2352 </button> 2353 </div> 2354 </div> 2355 2356 <div class="row" style="margin-top:12px;"> 2357 <div class="col-md-12"> 2358 <div id="mensagem_simulacao_cliente" role="status" aria-live="polite" style="text-align:center"></div> 2359 </div> 2360 </div> 2361 </div> 2362 </form> 2363 </div> 2364 </div> 2365</div> 2366 2367<div class="modal fade" id="modalComentario" tabindex="-1" role="dialog" aria-labelledby="modalComentarioLabel" aria-hidden="true"> 2368 <div class="modal-dialog" role="document" style="max-width:760px"> 2369 <div class="modal-content" style="background:#0f0f10;color:#eaeef3;border:1px solid #2a2a2c;border-radius:12px;overflow:hidden"> 2370 <div class="modal-header" style="border:0;padding:14px 16px"> 2371 <h5 class="modal-title" id="modalComentarioLabel" style="margin:0;font-weight:800;letter-spacing:.3px">Enviar depoimento</h5> 2372 <button type="button" class="close" data-dismiss="modal" aria-label="Fechar" style="border:0;background:transparent;color:#eaeef3;font-size:28px;line-height:1;opacity:.9;cursor:pointer"><span aria-hidden="true">&times;</span></button> 2373 </div> 2374 2375 <form id="form" enctype="multipart/form-data"> 2376 <div class="modal-body" style="padding:10px 16px 6px"> 2377 <div style="margin-bottom:12px"> 2378 <label for="nome_cliente" style="display:block;margin:0 0 6px;font-weight:700">Nome</label> 2379 <input type="text" id="nome_cliente" name="nome" autocomplete="name" placeholder="Seu nome completo" required class="form-control" style="width:100%;background:#eaecef;border:0;border-radius:8px;box-shadow:none;padding:12px 14px;outline:none;color:#111"> 2380 </div> 2381 2382 <div style="margin-bottom:16px"> 2383 <label for="texto_cliente" style="display:block;margin:0 0 6px;font-weight:700">Texto <small style="opacity:.8;font-weight:400">(até 500 caracteres)</small></label> 2384 <textarea id="texto_cliente" name="texto" maxlength="500" rows="4" required placeholder="Seu depoimento" class="form-control" style="width:100%;background:#eaecef;border:0;border-radius:8px;box-shadow:none;padding:12px 14px;outline:none;color:#111"></textarea> 2385 </div> 2386 2387 <div style="display:flex;align-items:flex-end;gap:16px;flex-wrap:wrap"> 2388 <div style="flex:1 1 360px"> 2389 <label for="foto" style="display:block;margin:0 0 6px;font-weight:700">Foto</label> 2390 <input id="foto" name="foto" type="file" accept=".jpg,.jpeg,.png,.webp" class="form-control" onchange="carregarImg()" style="width:100%;background:#eaecef;border:0;border-radius:8px;box-shadow:none;padding:10px 12px;outline:none;color:#111"> 2391 <div style="margin-top:6px;font-size:12px;opacity:.8">Opcional: JPG/PNG/WebP (até 5MB)</div> 2392 </div> 2393 2394 <div id="divImg" style="flex:0 0 110px;margin-left:auto;display:grid;place-items:center"> 2395 <img id="target" alt="Pré-visualização" src="sistema/painel/img/comentarios/sem-foto.jpg" width="96" height="96" loading="lazy" decoding="async" fetchpriority="low" style="display:block;width:96px;height:96px;object-fit:cover;border-radius:50%;border:2px solid #2a2a2c;background:#000"> 2396 </div> 2397 </div> 2398 2399 <div style="margin-top:14px"> 2400 <label for="video" style="display:block;margin:0 0 6px;font-weight:700">Vídeo do depoimento</label> 2401 <input id="video" name="video" type="file" accept=".mp4,.mov,.webm,.3gp,.m4v,video/*" class="form-control" style="width:100%;background:#eaecef;border:0;border-radius:8px;box-shadow:none;padding:10px 12px;outline:none;color:#111"> 2402 <div style="margin-top:6px;font-size:12px;opacity:.8">Opcional: MP4, MOV, WEBM, 3GP ou M4V (até 80MB)</div> 2403 </div> 2404 2405 <div style="margin-top:14px"> 2406 <label for="print_whatsapp" style="display:block;margin:0 0 6px;font-weight:700">Print do WhatsApp</label> 2407 <input id="print_whatsapp" name="print_whatsapp" type="file" accept=".jpg,.jpeg,.png,.webp" class="form-control" style="width:100%;background:#eaecef;border:0;border-radius:8px;box-shadow:none;padding:10px 12px;outline:none;color:#111"> 2408 <div style="margin-top:6px;font-size:12px;opacity:.8">Opcional: print da conversa em JPG/PNG/WebP (até 5MB)</div> 2409 </div> 2410 2411 <input type="hidden" name="id" id="id"> 2412 <input type="hidden" name="cliente" value="1"> 2413 <div id="mensagem-comentario" role="status" aria-live="polite" style="margin-top:12px;text-align:center;font-size:13px;min-height:18px"></div> 2414 </div> 2415 2416 <div class="modal-footer" style="border-top:1px solid #24262b;padding:12px 16px;display:flex;gap:10px;justify-content:flex-end"> 2417 <button type="button" class="btn btn-secondary" data-dismiss="modal" style="background:transparent;color:#eaeef3;border:1px solid #333;border-radius:10px;padding:10px 18px;font-weight:700;cursor:pointer">Cancelar</button> 2418 <button type="submit" class="btn btn-primary" style="background:#b8862d;border:0;border-radius:10px;padding:10px 18px;font-weight:700;cursor:pointer">Inserir</button> 2419 </div> 2420 </form> 2421 </div> 2422 </div> 2423</div> 2424 2425<div id="empresa" class="modal fade" role="dialog"> 2426 <div class="modal-dialog modal-lg"> 2427 <div class="modal-content"> 2428 <form method="POST" action=""> 2429 <div class="modal-header"> 2430 <h1 class="modal-title"><small>JACY CABELEIREIRO</small></h1> 2431 <button type="button" class="close" data-dismiss="modal" aria-label="Fechar modal">&times;</button> 2432 </div> 2433 </form> 2434 2435 <div class="modal-body"> 2436 <p class="text-muted"><small>Com mais de 25 anos de experiência, Jacy Cordeiro atende com foco em técnica, acabamento e orientação personalizada.<br>Especializado em cortes, barba e prótese capilar, trabalha com avaliação individual para indicar o melhor caminho de acordo com o perfil de cada cliente.<br><br>💇‍♂️ Cabeleireiro & Barbeiro<br>✨ Especialista em Prótese Capilar<br>📆 Atendimento com hora marcada<br>✅ Aplicação, manutenção e acabamento natural<br>Agende uma avaliação e converse diretamente com o profissional.</small></p> 2437 <p class="text-muted"><small>Jacy Cordeiro - CNPJ: 38.896.614/0001-40.<br>Assista o vídeo a seguir.</small></p> 2438 <iframe width="100%" height="500" src="about:blank" data-src="https://www.youtube.com/embed/fO_s7jlO1tU?si=n3Yntmowyfms6aFm&amp;controls=0" class="js-lazy-iframe" title="Vídeo sobre Jacy Cabeleireiro" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen loading="lazy" referrerpolicy="strict-origin-when-cross-origin"></iframe> 2439 <p class="text-muted" align="center"><small>"Motivação é aquilo que te faz começar. Habito é aquilo que te faz continuar."</small></p> 2440 </div> 2441 </div> 2442 </div> 2443</div> 2444 2445<div id="modalTermos" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="modalTermosLabel" aria-hidden="true"> 2446 <div class="modal-dialog modal-lg" role="document"> 2447 <div class="modal-content"> 2448 <div class="modal-header"> 2449 <h1 class="modal-title" id="modalTermosLabel"><small>Termos de Uso</small></h1> 2450 <button type="button" class="close" data-dismiss="modal" aria-label="Fechar"><span aria-hidden="true">&times;</span></button> 2451 </div> 2452 2453 <div class="modal-body"> 2454 <div class="col-lg-12"><span class="text-muted"><small><i> 2455 <br> 2456 <h2><span style="color:#444">1. Termos</span></h2> 2457 <p><span style="color:#444">Ao acessar ao site <a href="<?=h($AGENDA_LINK)?>">Jacy Cabeleireiro</a>, concorda em cumprir estes termos de serviço, todas as leis e regulamentos aplicáveis ​​e concorda que é responsável pelo cumprimento de todas as leis locais aplicáveis. Se você não concordar com algum desses termos, está proibido de usar ou acessar este site. Os materiais contidos neste site são protegidos pelas leis de direitos autorais e marcas comerciais aplicáveis.</span></p> 2458 <h2><span style="color:#444">2. Uso de Licença</span></h2> 2459 <p><span style="color:#444">É concedida permissão para baixar temporariamente uma cópia dos materiais (informações ou software) no site Jacy Cabeleireiro , apenas para visualização transitória pessoal e não comercial. Esta é a concessão de uma licença, não uma transferência de título e, sob esta licença, você não pode:&nbsp;</span></p> 2460 <ol> 2461 <li><span style="color:#444">modificar ou copiar os materiais;&nbsp;</span></li> 2462 <li><span style="color:#444">usar os materiais para qualquer finalidade comercial ou para exibição pública (comercial ou não comercial);&nbsp;</span></li> 2463 <li><span style="color:#444">tentar descompilar ou fazer engenharia reversa de qualquer software contido no site Jacy Cabeleireiro;&nbsp;</span></li> 2464 <li><span style="color:#444">remover quaisquer direitos autorais ou outras notações de propriedade dos materiais; ou&nbsp;</span></li> 2465 <li><span style="color:#444">transferir os materiais para outra pessoa ou 'espelhe' os materiais em qualquer outro servidor.</span></li> 2466 </ol> 2467 <p><span style="color:#444">Esta licença será automaticamente rescindida se você violar alguma dessas restrições e poderá ser rescindida por Jacy Cabeleireiro a qualquer momento. Ao encerrar a visualização desses materiais ou após o término desta licença, você deve apagar todos os materiais baixados em sua posse, seja em formato eletrónico ou impresso.</span></p> 2468 <h2><span style="color:#444">3. Isenção de responsabilidade</span></h2> 2469 <ol> 2470 <li><span style="color:#444">Os materiais no site da Jacy Cabeleireiro são fornecidos 'como estão'. Jacy Cabeleireiro não oferece garantias, expressas ou implícitas, e, por este meio, isenta e nega todas as outras garantias, incluindo, sem limitação, garantias implícitas ou condições de comercialização, adequação a um fim específico ou não violação de propriedade intelectual ou outra violação de direitos.</span></li> 2471 <li><span style="color:#444">Além disso, o Jacy Cabeleireiro não garante ou faz qualquer representação relativa à precisão, aos resultados prováveis ​​ou à confiabilidade do uso dos materiais em seu site ou de outra forma relacionado a esses materiais ou em sites vinculados a este site.</span></li> 2472 </ol> 2473 <h2><span style="color:#444">4. Limitações</span></h2> 2474 <p><span style="color:#444">Em nenhum caso o Jacy Cabeleireiro ou seus fornecedores serão responsáveis ​​por quaisquer danos (incluindo, sem limitação, danos por perda de dados ou lucro ou devido a interrupção dos negócios) decorrentes do uso ou da incapacidade de usar os materiais em Jacy Cabeleireiro, mesmo que Jacy Cabeleireiro ou um representante autorizado da Jacy Cabeleireiro tenha sido notificado oralmente ou por escrito da possibilidade de tais danos. Como algumas jurisdições não permitem limitações em garantias implícitas, ou limitações de responsabilidade por danos consequentes ou incidentais, essas limitações podem não se aplicar a você.</span></p> 2475 <h2><span style="color:#444">5. Precisão dos materiais</span></h2> 2476 <p><span style="color:#444">Os materiais exibidos no site da Jacy Cabeleireiro podem incluir erros técnicos, tipográficos ou fotográficos. Jacy Cabeleireiro não garante que qualquer material em seu site seja preciso, completo ou atual. Jacy Cabeleireiro pode fazer alterações nos materiais contidos em seu site a qualquer momento, sem aviso prévio. No entanto, Jacy Cabeleireiro não se compromete a atualizar os materiais.</span></p> 2477 <h2><span style="color:#444">6. Links</span></h2> 2478 <p><span style="color:#444">O Jacy Cabeleireiro não analisou todos os sites vinculados ao seu site e não é responsável pelo conteúdo de nenhum site vinculado. A inclusão de qualquer link não implica endosso por Jacy Cabeleireiro do site. O uso de qualquer site vinculado é por conta e risco do usuário.</span></p> 2479 <h3><span style="color:#444">Modificações</span></h3> 2480 <p><span style="color:#444">O Jacy Cabeleireiro pode revisar estes termos de serviço do site a qualquer momento, sem aviso prévio. Ao usar este site, você concorda em ficar vinculado à versão atual desses termos de serviço.</span></p> 2481 <h3><span style="color:#444">Lei aplicável</span></h3> 2482 <p><span style="color:#444">Estes termos e condições são regidos e interpretados de acordo com as leis do Jacy Cabeleireiro e você se submete irrevogavelmente à jurisdição exclusiva dos tribunais naquele estado ou localidade.</span></p> 2483 </i></small></span></div> 2484 </div> 2485 2486 <div class="modal-footer"> 2487 <small><span class="text-muted ml-4">WhatsApp <a class="text-muted" href="https://api.whatsapp.com/send?1=pt_BR&phone=<?=$tel_whatsapp?>" target="_blank" rel="noopener"><?=$whatsapp_sistema?></a></span></small> 2488 </div> 2489 </div> 2490 </div> 2491</div> 2492 2493<div id="privacidade" class="modal fade" role="dialog" aria-hidden="true"> 2494 <div class="modal-dialog modal-lg"> 2495 <div class="modal-content" style="background:#0f0f10;color:#e6e6e6"> 2496 <div class="modal-header" style="border-bottom:1px solid #2a2a2c"> 2497 <h5 class="modal-title" style="color:#fff;margin:0">Política de privacidade</h5> 2498 <button type="button" class="close" data-dismiss="modal" aria-label="Fechar" style="color:#e6e6e6;opacity:1"><span aria-hidden="true">&times;</span></button> 2499 </div> 2500 2501 <div class="modal-body" style="line-height:1.6"> 2502 <p>A sua privacidade é importante para nós. É política do <strong>Jacy Cabeleireiro</strong> respeitar a sua privacidade em relação a qualquer informação sua que possamos coletar no site <a href="<?=h($AGENDA_LINK)?>" target="_blank" rel="noopener" style="color:#e6e6e6;text-decoration:underline">Jacy Cabeleireiro</a> e outros sites que possuímos e operamos.</p> 2503 <p>Solicitamos informações pessoais apenas quando realmente precisamos delas para lhe fornecer um serviço. Fazemos isso por meios justos e legais, com o seu conhecimento e consentimento. Também informamos por que estamos coletando e como será usado.</p> 2504 <p>Apenas retemos as informações coletadas pelo tempo necessário para fornecer o serviço solicitado. Quando armazenamos dados, protegemos dentro de meios comercialmente aceitáveis para evitar perdas, roubos, acesso, divulgação, cópia, uso ou modificação não autorizados.</p> 2505 <p>Não compartilhamos informações de identificação pessoal publicamente ou com terceiros, exceto quando exigido por lei.</p> 2506 <p>Nosso site pode conter links para sites externos que não são operados por nós. Não temos controle sobre o conteúdo e práticas desses sites e não podemos aceitar responsabilidade por suas respectivas <a href="https://politicaprivacidade.com/" target="_blank" rel="noopener" style="color:#e6e6e6;text-decoration:underline">políticas de privacidade</a>.</p> 2507 <p>Você é livre para recusar nossa solicitação de informações pessoais, entendendo que talvez não possamos fornecer alguns dos serviços desejados.</p> 2508 <p>O uso continuado de nosso site será considerado como aceitação de nossas práticas em torno de privacidade e informações pessoais. Se você tiver alguma dúvida sobre como lidamos com dados do usuário e informações pessoais, entre em contato conosco.</p> 2509 2510 <h6 style="color:#fff;margin-top:18px">Cookies, Google Ads e medição</h6> 2511 <ul style="padding-left:18px;margin:0"> 2512 <li>Podemos utilizar cookies, Google Ads, Google Analytics, Google Tag Manager, reCAPTCHA e tags de conversão para segurança, medição de visitas e análise de campanhas.</li> 2513 <li>Cliques em WhatsApp, agendamento e envio de formulário podem ser medidos como conversões para avaliar o desempenho dos anúncios.</li> 2514 <li>Fotos enviadas para simulação são usadas para gerar a prévia visual e apoiar o atendimento solicitado. Você pode pedir exclusão dos dados pelo WhatsApp informado no site.</li> 2515 </ul> 2516 2517 <h6 style="color:#fff;margin-top:18px">Compromisso do usuário</h6> 2518 <ul style="padding-left:18px;margin:0"> 2519 <li>Não se envolver em atividades ilegais ou contrárias à boa-fé e à ordem pública.</li> 2520 <li>Não difundir conteúdo discriminatório, ilegal, violento ou que viole direitos humanos.</li> 2521 <li>Não causar danos aos sistemas do site, nem introduzir vírus ou softwares maliciosos.</li> 2522 </ul> 2523 2524 <h6 style="color:#fff;margin-top:18px">Mais informações</h6> 2525 <p>Se restarem dúvidas, é geralmente mais seguro manter os cookies ativados caso interaja com algum recurso que você usa em nosso site.</p> 2526 <p style="opacity:.85">Esta política foi atualizada em <strong>26/05/2026</strong>.</p> 2527 <p style="opacity:.85">reCAPTCHA v3 aplicado para proteção de formulários.</p> 2528 </div> 2529 2530 <div class="modal-footer" style="border-top:1px solid #2a2a2c"> 2531 <small>WhatsApp: <a href="https://api.whatsapp.com/send?1=pt_BR&phone=<?=$tel_whatsapp?>" target="_blank" rel="noopener" style="color:#e6e6e6;text-decoration:underline"><?=$whatsapp_sistema?></a></small> 2532 </div> 2533 </div> 2534 </div> 2535</div> 2536 2537<div id="ytModal" style="position:fixed;inset:0;background:rgba(0,0,0,.7);display:none;align-items:center;justify-content:center;z-index:99999"> 2538 <div style="position:relative;width:96vw;max-width:980px;background:#000;border-radius:14px;overflow:hidden"> 2539 <button id="ytClose" aria-label="Fechar" style="position:absolute;top:10px;right:10px;border:0;background:rgba(255,255,255,.15);color:#fff;padding:6px 10px;border-radius:6px;cursor:pointer;z-index:1">✕</button> 2540 <div style="position:relative;width:100%;padding-top:56.25%"><div id="ytPlayer" style="position:absolute;inset:0"></div></div> 2541 </div> 2542</div> 2543 2544<script> 2545(function(){ 2546 var recaptchaJaCarregado = false; 2547 2548 function carregarRecaptcha(){ 2549 if (recaptchaJaCarregado || !window.RECAPTCHA_SITE_KEY) { 2550 return; 2551 } 2552 2553 recaptchaJaCarregado = true; 2554 2555 var s = document.createElement('script'); 2556 s.src = 'https://www.google.com/recaptcha/api.js?render=' + window.RECAPTCHA_SITE_KEY; 2557 s.async = true; 2558 s.defer = true; 2559 document.head.appendChild(s); 2560 } 2561 2562 window.addEventListener('load', function(){ 2563 setTimeout(carregarRecaptcha, 2500); 2564 }, { once:true }); 2565 2566 document.addEventListener('focusin', function(e){ 2567 if (e.target.closest('#form_cadastro') || e.target.closest('#form_simulacao_cliente')) { 2568 carregarRecaptcha(); 2569 } 2570 }); 2571 2572 document.addEventListener('pointerdown', function(e){ 2573 if (e.target.closest('#form_cadastro') || e.target.closest('#form_simulacao_cliente')) { 2574 carregarRecaptcha(); 2575 } 2576 }, { passive:true }); 2577})(); 2578</script> 2579 2580<script> 2581(function(){ 2582 function getModalBySelector(sel){ 2583 if (!sel || sel.charAt(0) !== '#') return null; 2584 2585 try { 2586 return document.querySelector(sel); 2587 } catch (e) { 2588 return null; 2589 } 2590 } 2591 2592 function getSelectorFromTrigger(el){ 2593 if (!el) return ''; 2594 2595 return el.getAttribute('data-target') 2596 || el.getAttribute('data-bs-target') 2597 || el.getAttribute('href') 2598 || ''; 2599 } 2600 2601 function criarBackdrop(modal){ 2602 removerBackdrop(modal); 2603 2604 var backdrop = document.createElement('div'); 2605 backdrop.className = 'modal-backdrop fade show jacy-modal-backdrop'; 2606 backdrop.setAttribute('data-modal-fallback', modal.id || ''); 2607 document.body.appendChild(backdrop); 2608 } 2609 2610 function removerBackdrop(modal){ 2611 var id = modal && modal.id ? modal.id : ''; 2612 var seletor = id 2613 ? '.jacy-modal-backdrop[data-modal-fallback="' + id + '"]' 2614 : '.jacy-modal-backdrop'; 2615 2616 document.querySelectorAll(seletor).forEach(function(item){ 2617 if (item && item.parentNode) item.parentNode.removeChild(item); 2618 }); 2619 } 2620 2621 function abrirModalFallback(modal){ 2622 if (!modal) return; 2623 2624 modal.style.display = 'block'; 2625 modal.removeAttribute('aria-hidden'); 2626 modal.setAttribute('aria-modal', 'true'); 2627 modal.classList.add('show'); 2628 document.body.classList.add('modal-open'); 2629 document.body.style.overflow = 'hidden'; 2630 criarBackdrop(modal); 2631 2632 setTimeout(function(){ 2633 var primeiroCampo = modal.querySelector('input, select, textarea, button, a[href]'); 2634 if (primeiroCampo && typeof primeiroCampo.focus === 'function') primeiroCampo.focus(); 2635 }, 80); 2636 2637 modal.dispatchEvent(new Event('shown.bs.modal', { bubbles:true })); 2638 } 2639 2640 function fecharModalFallback(modal){ 2641 if (!modal) return; 2642 2643 modal.classList.remove('show'); 2644 modal.style.display = 'none'; 2645 modal.setAttribute('aria-hidden', 'true'); 2646 modal.removeAttribute('aria-modal'); 2647 removerBackdrop(modal); 2648 2649 if (!document.querySelector('.modal.show')) { 2650 document.body.classList.remove('modal-open'); 2651 document.body.style.overflow = ''; 2652 } 2653 2654 modal.dispatchEvent(new Event('hidden.bs.modal', { bubbles:true })); 2655 } 2656 2657 function abrirModalSistema(sel){ 2658 var modal = getModalBySelector(sel); 2659 if (!modal) return false; 2660 2661 if (window.jQuery && window.jQuery.fn && typeof window.jQuery.fn.modal === 'function') { 2662 window.jQuery(modal).modal('show'); 2663 return true; 2664 } 2665 2666 if (window.bootstrap && window.bootstrap.Modal) { 2667 var instancia = window.bootstrap.Modal.getOrCreateInstance(modal); 2668 instancia.show(); 2669 return true; 2670 } 2671 2672 abrirModalFallback(modal); 2673 return true; 2674 } 2675 2676 function fecharModalSistema(modal){ 2677 if (!modal) return false; 2678 2679 if (window.jQuery && window.jQuery.fn && typeof window.jQuery.fn.modal === 'function') { 2680 window.jQuery(modal).modal('hide'); 2681 return true; 2682 } 2683 2684 if (window.bootstrap && window.bootstrap.Modal) { 2685 var instancia = window.bootstrap.Modal.getOrCreateInstance(modal); 2686 instancia.hide(); 2687 return true; 2688 } 2689 2690 fecharModalFallback(modal); 2691 return true; 2692 } 2693 2694 window.abrirModalSistema = abrirModalSistema; 2695 window.fecharModalSistema = fecharModalSistema; 2696 2697 document.addEventListener('click', function(ev){ 2698 var abrir = ev.target.closest('[data-toggle="modal"], [data-bs-toggle="modal"]'); 2699 if (!abrir) return; 2700 2701 var sel = getSelectorFromTrigger(abrir); 2702 if (!getModalBySelector(sel)) return; 2703 2704 ev.preventDefault(); 2705 abrirModalSistema(sel); 2706 2707 if (history.replaceState && sel === '#modalSimulacaoCliente') { 2708 history.replaceState(null, '', location.pathname + location.search); 2709 } 2710 }, false); 2711 2712 document.addEventListener('click', function(ev){ 2713 var fechar = ev.target.closest('[data-dismiss="modal"], [data-bs-dismiss="modal"], .modal .close'); 2714 if (fechar) { 2715 var modalFechar = fechar.closest('.modal'); 2716 if (modalFechar) { 2717 ev.preventDefault(); 2718 fecharModalSistema(modalFechar); 2719 } 2720 return; 2721 } 2722 2723 if (ev.target && ev.target.classList && ev.target.classList.contains('modal')) { 2724 fecharModalSistema(ev.target); 2725 } 2726 }, false); 2727 2728 document.addEventListener('keydown', function(ev){ 2729 if (ev.key !== 'Escape') return; 2730 2731 var modais = document.querySelectorAll('.modal.show'); 2732 if (!modais.length) return; 2733 2734 fecharModalSistema(modais[modais.length - 1]); 2735 }); 2736 2737 document.addEventListener('DOMContentLoaded', function(){ 2738 var parametros = new URLSearchParams(window.location.search); 2739 2740 if (parametros.get('abrir_simulador') === '1') { 2741 setTimeout(function(){ 2742 abrirModalSistema('#modalSimulacaoCliente'); 2743 }, 250); 2744 } 2745 }); 2746})(); 2747 2748const LINK_WHATSAPP = <?=json_encode($WPP, JSON_UNESCAPED_SLASHES)?>; 2749const LINK_APP = <?=json_encode($AGENDA_LINK, JSON_UNESCAPED_SLASHES)?>; 2750 2751var btnW = document.getElementById('ctaWhats'); 2752if (btnW) btnW.href = LINK_WHATSAPP; 2753 2754var btnA = document.getElementById('ctaApp'); 2755if (btnA) btnA.href = LINK_APP; 2756 2757const track = document.getElementById('heroTrack'); 2758const slidesV = track ? Array.from(track.querySelectorAll('.hero-slide')) : []; 2759const dotsV = Array.from(document.querySelectorAll('#heroDots button')); 2760 2761let heroIndex = 0; 2762 2763function heroGo(i){ 2764 if (!track) return; 2765 heroIndex = (i + slidesV.length) % slidesV.length; 2766 track.style.transform = 'translateX(' + (heroIndex * -100) + '%)'; 2767 dotsV.forEach((d, idx) => d.style.background = idx === heroIndex ? '#ffffffaa' : '#ffffff55'); 2768} 2769 2770var prevH = document.getElementById('heroPrev'); 2771if (prevH) prevH.onclick = () => heroGo(heroIndex - 1); 2772 2773var nextH = document.getElementById('heroNext'); 2774if (nextH) nextH.onclick = () => heroGo(heroIndex + 1); 2775 2776dotsV.forEach(d => d.onclick = () => heroGo(parseInt(d.dataset.i, 10))); 2777let heroTimer = null; 2778 2779function startHeroTimer(){ 2780 stopHeroTimer(); 2781 if (document.hidden) return; 2782 heroTimer = setInterval(() => heroGo(heroIndex + 1), 4000); 2783} 2784 2785function stopHeroTimer(){ 2786 clearInterval(heroTimer); 2787} 2788 2789let __ytApiRequested = false; 2790 2791function ensureYTApiLoaded(cb){ 2792 if (window.YT && window.YT.Player) { 2793 cb(); 2794 return; 2795 } 2796 2797 if (!__ytApiRequested) { 2798 __ytApiRequested = true; 2799 var s = document.createElement('script'); 2800 s.src = 'https://www.youtube.com/iframe_api'; 2801 s.async = true; 2802 document.head.appendChild(s); 2803 } 2804 2805 (function wait(){ 2806 if (window.YT && window.YT.Player) cb(); 2807 else setTimeout(wait, 80); 2808 })(); 2809} 2810 2811let ytPlayer; 2812const ytModal = document.getElementById('ytModal'); 2813const ytClose = document.getElementById('ytClose'); 2814function onYouTubeIframeAPIReady(){} 2815 2816function openVideo(videoId){ 2817 if (!ytModal) return; 2818 2819 ytModal.style.display = 'flex'; 2820 document.body.style.overflow = 'hidden'; 2821 stopHeroTimer(); 2822 2823 ensureYTApiLoaded(function(){ 2824 if (!ytPlayer) { 2825 ytPlayer = new YT.Player('ytPlayer', { 2826 videoId: videoId, 2827 playerVars: {autoplay:1, rel:0, controls:1, modestbranding:1, playsinline:1}, 2828 events: { 2829 onReady: (e) => { 2830 const ifr = e.target.getIframe(); 2831 ifr.style.position = 'absolute'; 2832 ifr.style.inset = '0'; 2833 ifr.style.width = '100%'; 2834 ifr.style.height = '100%'; 2835 }, 2836 onStateChange: (e) => { 2837 if (e.data === YT.PlayerState.ENDED) closeVideo(); 2838 } 2839 } 2840 }); 2841 } else { 2842 ytPlayer.loadVideoById(videoId); 2843 } 2844 }); 2845} 2846 2847function closeVideo(){ 2848 if (!ytModal) return; 2849 ytModal.style.display = 'none'; 2850 document.body.style.overflow = ''; 2851 if (ytPlayer && ytPlayer.stopVideo) ytPlayer.stopVideo(); 2852 startHeroTimer(); 2853} 2854 2855if (ytClose) ytClose.onclick = closeVideo; 2856if (ytModal) ytModal.addEventListener('click', (ev) => { if (ev.target === ytModal) closeVideo(); }); 2857document.addEventListener('keydown', (e) => { if (e.key === 'Escape') closeVideo(); }); 2858document.addEventListener('visibilitychange', () => { 2859 if (document.hidden) stopHeroTimer(); 2860 else if (!ytModal || ytModal.style.display !== 'flex') startHeroTimer(); 2861}, { passive:true }); 2862 2863startHeroTimer(); 2864 2865slidesV.forEach(slide => { 2866 const id = slide.dataset.video; 2867 var p = slide.querySelector('.play-btn'); 2868 if (p) p.addEventListener('click', () => openVideo(id)); 2869 slide.addEventListener('dblclick', () => openVideo(id)); 2870}); 2871 2872(function(){ 2873 const root = document.getElementById('hero'); 2874 if (!root) return; 2875 2876 const slides = root.querySelector('#slides'); 2877 const items = Array.from(root.querySelectorAll('.slide')); 2878 const dotsEl = root.querySelector('#dots'); 2879 const btnPrev = root.querySelector('#prev'); 2880 const btnNext = root.querySelector('#next'); 2881 2882 let idx = 0, timer = null, hover = false; 2883 const duration = 5000; 2884 const reduced = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches; 2885 2886 items.forEach((_, i) => { 2887 const b = document.createElement('button'); 2888 b.type = 'button'; 2889 b.setAttribute('aria-label', 'Ir para o slide ' + (i + 1)); 2890 b.addEventListener('click', () => go(i), { passive:true }); 2891 dotsEl.appendChild(b); 2892 }); 2893 2894 function mark(){ dotsEl.querySelectorAll('button').forEach((b, i) => b.classList.toggle('active', i === idx)); } 2895 2896 function syncVideos(){ 2897 items.forEach((item, itemIndex) => { 2898 const video = item.querySelector('video[data-hero-video]'); 2899 if (!video) return; 2900 2901 if (itemIndex === idx) { 2902 const playNow = function(){ 2903 const promise = video.play(); 2904 if (promise && typeof promise.catch === 'function') { 2905 promise.catch(function(){}); 2906 } 2907 }; 2908 2909 if (video.readyState >= 2) playNow(); 2910 else { 2911 video.addEventListener('loadeddata', playNow, { once:true }); 2912 video.load(); 2913 } 2914 } else { 2915 video.pause(); 2916 try { video.currentTime = 0; } catch(e) {} 2917 } 2918 }); 2919 } 2920 2921 function go(i){ 2922 idx = (i + items.length) % items.length; 2923 slides.style.transform = 'translateX(' + (-100 * idx) + '%)'; 2924 mark(); 2925 syncVideos(); 2926 } 2927 function next(){ go(idx + 1); } 2928 function prev(){ go(idx - 1); } 2929 function loop(){ 2930 clearTimeout(timer); 2931 if (hover || reduced) return; 2932 timer = setTimeout(() => { next(); loop(); }, duration); 2933 } 2934 2935 if (btnPrev) btnPrev.addEventListener('click', prev, { passive:true }); 2936 if (btnNext) btnNext.addEventListener('click', next, { passive:true }); 2937 2938 root.addEventListener('pointerenter', () => { hover = true; clearTimeout(timer); }, { passive:true }); 2939 root.addEventListener('pointerleave', () => { hover = false; loop(); }, { passive:true }); 2940 2941 let sx = 0, dx = 0; 2942 root.addEventListener('touchstart', e => { sx = e.touches[0].clientX; }, { passive:true }); 2943 root.addEventListener('touchmove', e => { dx = e.touches[0].clientX - sx; }, { passive:true }); 2944 root.addEventListener('touchend', () => { if (Math.abs(dx) > 40) { dx < 0 ? next() : prev(); } dx = 0; }, { passive:true }); 2945 2946 let visibleOnScreen = true; 2947 2948 function stopLoop(){ 2949 clearTimeout(timer); 2950 } 2951 2952 function startLoop(){ 2953 if (!visibleOnScreen || document.hidden) return; 2954 loop(); 2955 } 2956 2957 if ('IntersectionObserver' in window) { 2958 const obs = new IntersectionObserver(function(entries){ 2959 visibleOnScreen = entries.some(function(entry){ return entry.isIntersecting; }); 2960 if (visibleOnScreen) { 2961 syncVideos(); 2962 startLoop(); 2963 } else { 2964 stopLoop(); 2965 items.forEach(function(item){ 2966 const video = item.querySelector('video[data-hero-video]'); 2967 if (video) video.pause(); 2968 }); 2969 } 2970 }, { threshold: 0.2 }); 2971 2972 obs.observe(root); 2973 } 2974 2975 document.addEventListener('visibilitychange', function(){ 2976 if (document.hidden) { 2977 stopLoop(); 2978 items.forEach(function(item){ 2979 const video = item.querySelector('video[data-hero-video]'); 2980 if (video) video.pause(); 2981 }); 2982 return; 2983 } 2984 syncVideos(); 2985 startLoop(); 2986 }, { passive:true }); 2987 2988 const boot = () => { go(0); startLoop(); }; 2989 if ('requestIdleCallback' in window) requestIdleCallback(boot, { timeout: 1200 }); 2990 else window.addEventListener('load', boot, { once:true }); 2991})(); 2992 2993/* ============================================================ 2994 Galeria foto_admin 2995 Movimento contínuo e abertura do mesmo modal usado pelo 2996 botão flutuante de WhatsApp do rodapé. 2997 ============================================================ */ 2998(function(){ 2999 'use strict'; 3000 3001 var wrap = document.getElementById('galeriaWrap'); 3002 var track = document.getElementById('galTrack'); 3003 3004 if (!wrap || !track || track.getAttribute('data-carrossel-continuo') === '1') return; 3005 3006 var viewport = document.getElementById('galeriaViewport') || track.parentElement; 3007 var itensOriginais = Array.prototype.slice.call(track.querySelectorAll('.galItem')); 3008 var anterior = document.getElementById('galPrev'); 3009 var proximo = document.getElementById('galNext'); 3010 3011 if (!viewport || !itensOriginais.length) { 3012 if (anterior) anterior.hidden = true; 3013 if (proximo) proximo.hidden = true; 3014 return; 3015 } 3016 3017 track.setAttribute('data-carrossel-continuo', '1'); 3018 3019 var clones = []; 3020 var posicao = 0; 3021 var larguraSequencia = 0; 3022 var passoItem = 0; 3023 var ultimoTempo = 0; 3024 var animacaoId = 0; 3025 var visivelNaTela = true; 3026 var toqueAtivo = false; 3027 var inicioToque = 0; 3028 var deslocamentoToque = 0; 3029 var ignorarCliqueAte = 0; 3030 var resizeTimer = 0; 3031 var velocidade = 38; 3032 3033 function normalizarTexto(valor){ 3034 var texto = String(valor || '').toLowerCase(); 3035 3036 if (typeof texto.normalize === 'function') { 3037 texto = texto.normalize('NFD').replace(/[\u0300-\u036f]/g, ''); 3038 } 3039 3040 return texto.replace(/\s+/g, ' ').trim(); 3041 } 3042 3043 function estaVisivel(elemento){ 3044 if (!elemento) return false; 3045 3046 var estilo = window.getComputedStyle(elemento); 3047 if (estilo.display === 'none' || estilo.visibility === 'hidden' || estilo.opacity === '0') return false; 3048 3049 var caixa = elemento.getBoundingClientRect(); 3050 return caixa.width > 0 && caixa.height > 0; 3051 } 3052 3053 function abrirModalElemento(modal){ 3054 if (!modal) return false; 3055 3056 if (!modal.id) modal.id = 'jacyModalWhatsAppRodape'; 3057 3058 if (typeof window.abrirModalSistema === 'function') { 3059 return window.abrirModalSistema('#' + modal.id); 3060 } 3061 3062 if (window.jQuery && window.jQuery.fn && typeof window.jQuery.fn.modal === 'function') { 3063 window.jQuery(modal).modal('show'); 3064 return true; 3065 } 3066 3067 if (window.bootstrap && window.bootstrap.Modal) { 3068 window.bootstrap.Modal.getOrCreateInstance(modal).show(); 3069 return true; 3070 } 3071 3072 return false; 3073 } 3074 3075 function localizarModalWhatsAppRodape(){ 3076 var modais = document.querySelectorAll('.modal'); 3077 3078 for (var i = 0; i < modais.length; i++) { 3079 var texto = normalizarTexto(modais[i].textContent); 3080 3081 if (texto.indexOf('fale conosco') !== -1 && texto.indexOf('whatsapp') !== -1) { 3082 return modais[i]; 3083 } 3084 } 3085 3086 return null; 3087 } 3088 3089 function localizarGatilhoWhatsAppRodape(){ 3090 var elementos = document.querySelectorAll('a, button, [role="button"]'); 3091 var melhor = null; 3092 var melhorPontuacao = -1; 3093 3094 for (var i = 0; i < elementos.length; i++) { 3095 var elemento = elementos[i]; 3096 3097 if (wrap.contains(elemento) || elemento.id === 'ctaWhats' || !estaVisivel(elemento)) continue; 3098 3099 var dados = normalizarTexto([ 3100 elemento.id, 3101 elemento.className, 3102 elemento.getAttribute('aria-label'), 3103 elemento.getAttribute('title'), 3104 elemento.getAttribute('href'), 3105 elemento.getAttribute('data-target'), 3106 elemento.getAttribute('data-bs-target'), 3107 elemento.innerHTML 3108 ].join(' ')); 3109 3110 if (dados.indexOf('whatsapp') === -1 && dados.indexOf('wa.me') === -1 && dados.indexOf('api.whatsapp.com') === -1) { 3111 continue; 3112 } 3113 3114 var pontuacao = 20; 3115 var alvoModal = elemento.getAttribute('data-target') || elemento.getAttribute('data-bs-target') || ''; 3116 var estilo = window.getComputedStyle(elemento); 3117 var caixa = elemento.getBoundingClientRect(); 3118 3119 if (alvoModal.charAt(0) === '#' && document.querySelector(alvoModal + '.modal')) pontuacao += 80; 3120 if (estilo.position === 'fixed' || estilo.position === 'sticky') pontuacao += 60; 3121 if (caixa.right >= window.innerWidth * 0.70) pontuacao += 20; 3122 if (caixa.bottom >= window.innerHeight * 0.60) pontuacao += 20; 3123 if (elemento.closest('footer, .footer_section')) pontuacao += 10; 3124 3125 if (pontuacao > melhorPontuacao) { 3126 melhor = elemento; 3127 melhorPontuacao = pontuacao; 3128 } 3129 } 3130 3131 return melhor; 3132 } 3133 3134 function abrirWhatsAppRodape(){ 3135 var modal = localizarModalWhatsAppRodape(); 3136 if (modal && abrirModalElemento(modal)) return true; 3137 3138 var gatilho = localizarGatilhoWhatsAppRodape(); 3139 if (!gatilho) return false; 3140 3141 var alvo = gatilho.getAttribute('data-target') || gatilho.getAttribute('data-bs-target') || gatilho.getAttribute('href') || ''; 3142 3143 if (alvo.charAt(0) === '#') { 3144 var modalAlvo = document.querySelector(alvo); 3145 if (modalAlvo && modalAlvo.classList.contains('modal') && abrirModalElemento(modalAlvo)) return true; 3146 } 3147 3148 gatilho.click(); 3149 return true; 3150 } 3151 3152 function quantidadeVisivel(){ 3153 var largura = window.innerWidth; 3154 3155 if (largura < 520) return 1; 3156 if (largura < 768) return 2; 3157 if (largura < 1024) return 3; 3158 3159 return 4; 3160 } 3161 3162 function gapTrack(){ 3163 var estilo = window.getComputedStyle(track); 3164 var valor = parseFloat(estilo.columnGap || estilo.gap || '0'); 3165 3166 return Number.isFinite(valor) ? valor : 0; 3167 } 3168 3169 function removerIdsDuplicados(elemento){ 3170 if (elemento.id) elemento.removeAttribute('id'); 3171 3172 var filhos = elemento.querySelectorAll('[id]'); 3173 for (var i = 0; i < filhos.length; i++) filhos[i].removeAttribute('id'); 3174 } 3175 3176 function removerClones(){ 3177 for (var i = 0; i < clones.length; i++) { 3178 if (clones[i] && clones[i].parentNode === track) track.removeChild(clones[i]); 3179 } 3180 3181 clones = []; 3182 } 3183 3184 function aplicarLarguraItem(item, largura){ 3185 item.style.width = largura + 'px'; 3186 item.style.minWidth = largura + 'px'; 3187 item.style.maxWidth = largura + 'px'; 3188 item.style.flex = '0 0 ' + largura + 'px'; 3189 } 3190 3191 function montarSequencia(){ 3192 removerClones(); 3193 3194 var visiveis = quantidadeVisivel(); 3195 var gap = gapTrack(); 3196 var larguraViewport = viewport.clientWidth; 3197 var larguraItem = (larguraViewport - (gap * (visiveis - 1))) / visiveis; 3198 3199 if (!Number.isFinite(larguraItem) || larguraItem <= 0) return; 3200 3201 passoItem = larguraItem + gap; 3202 larguraSequencia = passoItem * itensOriginais.length; 3203 3204 for (var i = 0; i < itensOriginais.length; i++) { 3205 aplicarLarguraItem(itensOriginais[i], larguraItem); 3206 } 3207 3208 var quantidadeClones = Math.max( 3209 visiveis + 2, 3210 Math.ceil((larguraViewport + passoItem) / passoItem) + 1 3211 ); 3212 3213 for (var indice = 0; indice < quantidadeClones; indice++) { 3214 var clone = itensOriginais[indice % itensOriginais.length].cloneNode(true); 3215 3216 clone.setAttribute('data-galeria-clone', '1'); 3217 clone.setAttribute('aria-hidden', 'true'); 3218 clone.setAttribute('tabindex', '-1'); 3219 removerIdsDuplicados(clone); 3220 aplicarLarguraItem(clone, larguraItem); 3221 3222 track.appendChild(clone); 3223 clones.push(clone); 3224 } 3225 3226 if (larguraSequencia > 0) posicao = posicao % larguraSequencia; 3227 aplicarTransformacao(); 3228 3229 var esconderControles = itensOriginais.length <= 1; 3230 if (anterior) anterior.hidden = esconderControles; 3231 if (proximo) proximo.hidden = esconderControles; 3232 } 3233 3234 function normalizarPosicao(){ 3235 if (!larguraSequencia) return; 3236 3237 while (posicao >= larguraSequencia) posicao -= larguraSequencia; 3238 while (posicao < 0) posicao += larguraSequencia; 3239 } 3240 3241 function aplicarTransformacao(){ 3242 normalizarPosicao(); 3243 track.style.transform = 'translate3d(-' + posicao.toFixed(3) + 'px,0,0)'; 3244 } 3245 3246 function animar(tempo){ 3247 if (!animacaoId) return; 3248 3249 if (!ultimoTempo) ultimoTempo = tempo; 3250 3251 var delta = Math.min(64, tempo - ultimoTempo); 3252 ultimoTempo = tempo; 3253 3254 if (!toqueAtivo && visivelNaTela && !document.hidden && larguraSequencia > 0) { 3255 posicao += velocidade * (delta / 1000); 3256 aplicarTransformacao(); 3257 } 3258 3259 animacaoId = window.requestAnimationFrame(animar); 3260 } 3261 3262 function iniciarAnimacao(){ 3263 if (animacaoId || document.hidden || !visivelNaTela || !larguraSequencia) return; 3264 3265 ultimoTempo = 0; 3266 animacaoId = window.requestAnimationFrame(animar); 3267 } 3268 3269 function pararAnimacao(){ 3270 if (animacaoId) window.cancelAnimationFrame(animacaoId); 3271 3272 animacaoId = 0; 3273 ultimoTempo = 0; 3274 } 3275 3276 function moverUmItem(direcao){ 3277 if (!passoItem) return; 3278 3279 posicao += passoItem * direcao; 3280 aplicarTransformacao(); 3281 } 3282 3283 if (anterior) { 3284 anterior.setAttribute('type', 'button'); 3285 anterior.addEventListener('click', function(evento){ 3286 evento.preventDefault(); 3287 evento.stopPropagation(); 3288 moverUmItem(-1); 3289 }); 3290 } 3291 3292 if (proximo) { 3293 proximo.setAttribute('type', 'button'); 3294 proximo.addEventListener('click', function(evento){ 3295 evento.preventDefault(); 3296 evento.stopPropagation(); 3297 moverUmItem(1); 3298 }); 3299 } 3300 3301 track.addEventListener('touchstart', function(evento){ 3302 toqueAtivo = true; 3303 inicioToque = evento.touches[0].clientX; 3304 deslocamentoToque = 0; 3305 pararAnimacao(); 3306 }, { passive:true }); 3307 3308 track.addEventListener('touchmove', function(evento){ 3309 deslocamentoToque = evento.touches[0].clientX - inicioToque; 3310 }, { passive:true }); 3311 3312 track.addEventListener('touchend', function(){ 3313 if (Math.abs(deslocamentoToque) > 40) { 3314 moverUmItem(deslocamentoToque < 0 ? 1 : -1); 3315 ignorarCliqueAte = Date.now() + 450; 3316 } 3317 3318 deslocamentoToque = 0; 3319 toqueAtivo = false; 3320 iniciarAnimacao(); 3321 }, { passive:true }); 3322 3323 wrap.addEventListener('click', function(evento){ 3324 var item = evento.target.closest('.galItem[data-jacy-open-whatsapp-modal="1"]'); 3325 3326 if (!item || Date.now() < ignorarCliqueAte) return; 3327 3328 evento.preventDefault(); 3329 abrirWhatsAppRodape(); 3330 }); 3331 3332 wrap.addEventListener('keydown', function(evento){ 3333 var item = evento.target.closest('.galItem[data-jacy-open-whatsapp-modal="1"]'); 3334 3335 if (!item || (evento.key !== 'Enter' && evento.key !== ' ')) return; 3336 3337 evento.preventDefault(); 3338 abrirWhatsAppRodape(); 3339 }); 3340 3341 document.addEventListener('visibilitychange', function(){ 3342 if (document.hidden) pararAnimacao(); 3343 else iniciarAnimacao(); 3344 }, { passive:true }); 3345 3346 if ('IntersectionObserver' in window) { 3347 var observador = new IntersectionObserver(function(entradas){ 3348 visivelNaTela = entradas.some(function(entrada){ return entrada.isIntersecting; }); 3349 3350 if (visivelNaTela) iniciarAnimacao(); 3351 else pararAnimacao(); 3352 }, { threshold:0.01 }); 3353 3354 observador.observe(wrap); 3355 } 3356 3357 window.addEventListener('resize', function(){ 3358 window.clearTimeout(resizeTimer); 3359 resizeTimer = window.setTimeout(function(){ 3360 montarSequencia(); 3361 iniciarAnimacao(); 3362 }, 120); 3363 }, { passive:true }); 3364 3365 track.style.transition = 'none'; 3366 montarSequencia(); 3367 iniciarAnimacao(); 3368})(); 3369 3370(function(){ 3371 var track = document.getElementById('depTrack'); 3372 if (!track) return; 3373 3374 var items = Array.from(track.querySelectorAll('.depItem')); 3375 var prev = document.getElementById('depPrev'); 3376 var next = document.getElementById('depNext'); 3377 var dotsEl = document.getElementById('depDots'); 3378 var dots = []; 3379 var index = 0; 3380 var t = null; 3381 var videoEmUso = false; 3382 var retomadaTimer = null; 3383 3384 function perView(){ 3385 return (window.innerWidth >= 900) ? 2 : 1; 3386 } 3387 3388 function temVideoAssistindo(){ 3389 var videos = Array.from(track.querySelectorAll('video')); 3390 return videos.some(function(video){ 3391 return video && !video.paused && !video.ended; 3392 }); 3393 } 3394 3395 function temVideoTelaCheia(){ 3396 var fs = document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement; 3397 return !!(fs && track.contains(fs)); 3398 } 3399 3400 function podeRodarAutomatico(){ 3401 return !document.hidden && !videoEmUso && !temVideoAssistindo() && !temVideoTelaCheia(); 3402 } 3403 3404 function stopDepoTimer(){ 3405 if (t) { 3406 clearInterval(t); 3407 t = null; 3408 } 3409 } 3410 3411 function startDepoTimer(){ 3412 stopDepoTimer(); 3413 if (!podeRodarAutomatico()) return; 3414 3415 t = setInterval(function(){ 3416 if (!podeRodarAutomatico()) { 3417 stopDepoTimer(); 3418 return; 3419 } 3420 3421 var pv = perView(); 3422 var pages = Math.max(1, Math.ceil(items.length / pv)); 3423 go((index + 1) % pages, false, false); 3424 }, 6000); 3425 } 3426 3427 function pausarOutrosVideos(videoAtual){ 3428 Array.from(track.querySelectorAll('video')).forEach(function(video){ 3429 if (video !== videoAtual) { 3430 try { video.pause(); } catch(e) {} 3431 } 3432 }); 3433 } 3434 3435 function pausarVideosForaDaPagina(){ 3436 var pv = perView(); 3437 var inicio = index * pv; 3438 var fim = inicio + pv; 3439 3440 items.forEach(function(item, pos){ 3441 if (pos < inicio || pos >= fim) { 3442 Array.from(item.querySelectorAll('video')).forEach(function(video){ 3443 try { video.pause(); } catch(e) {} 3444 }); 3445 } 3446 }); 3447 } 3448 3449 function marcarVideoEmUso(){ 3450 videoEmUso = true; 3451 if (retomadaTimer) clearTimeout(retomadaTimer); 3452 stopDepoTimer(); 3453 } 3454 3455 function liberarVideoSeParado(){ 3456 if (retomadaTimer) clearTimeout(retomadaTimer); 3457 3458 retomadaTimer = setTimeout(function(){ 3459 if (!temVideoAssistindo() && !temVideoTelaCheia()) { 3460 videoEmUso = false; 3461 startDepoTimer(); 3462 } 3463 }, 1200); 3464 } 3465 3466 function layout(){ 3467 var pv = perView(); 3468 var w = (100 / pv) + '%'; 3469 items.forEach(function(el){ el.style.minWidth = w; }); 3470 3471 if (dotsEl) dotsEl.innerHTML = ''; 3472 dots = []; 3473 3474 var pages = Math.max(1, Math.ceil(items.length / pv)); 3475 for (var i = 0; i < pages; i++) { 3476 var b = document.createElement('button'); 3477 b.type = 'button'; 3478 b.style.cssText = 'width:10px;height:10px;border-radius:999px;border:0;background:#3a3c44;cursor:pointer;'; 3479 (function(i){ 3480 b.addEventListener('click', function(){ 3481 videoEmUso = false; 3482 pausarOutrosVideos(null); 3483 go(i, false, true); 3484 startDepoTimer(); 3485 }); 3486 })(i); 3487 if (dotsEl) dotsEl.appendChild(b); 3488 dots.push(b); 3489 } 3490 3491 clamp(); 3492 go(index, true, false); 3493 } 3494 3495 function clamp(){ 3496 var pv = perView(); 3497 var pages = Math.max(1, Math.ceil(items.length / pv)); 3498 if (index < 0) index = 0; 3499 if (index > pages - 1) index = pages - 1; 3500 dots.forEach(function(d, i){ d.style.background = (i === index ? '#ffffff' : '#3a3c44'); }); 3501 if (prev) prev.disabled = (index === 0); 3502 if (next) next.disabled = (index === pages - 1); 3503 } 3504 3505 function go(i, noAnim, navegacaoManual){ 3506 index = i; 3507 clamp(); 3508 3509 if (navegacaoManual) { 3510 videoEmUso = false; 3511 pausarOutrosVideos(null); 3512 } 3513 3514 if (noAnim) track.style.transition = 'none'; 3515 var shift = (100 * index); 3516 track.style.transform = 'translateX(' + (-shift) + '%)'; 3517 if (noAnim) requestAnimationFrame(function(){ track.style.transition = '.45s ease'; }); 3518 3519 pausarVideosForaDaPagina(); 3520 } 3521 3522 if (prev) { 3523 prev.addEventListener('click', function(){ 3524 videoEmUso = false; 3525 pausarOutrosVideos(null); 3526 go(index - 1, false, true); 3527 startDepoTimer(); 3528 }); 3529 } 3530 3531 if (next) { 3532 next.addEventListener('click', function(){ 3533 videoEmUso = false; 3534 pausarOutrosVideos(null); 3535 go(index + 1, false, true); 3536 startDepoTimer(); 3537 }); 3538 } 3539 3540 var sx = 0, dx = 0; 3541 track.addEventListener('touchstart', function(e){ sx = e.touches[0].clientX; }, { passive:true }); 3542 track.addEventListener('touchmove', function(e){ dx = e.touches[0].clientX - sx; }, { passive:true }); 3543 track.addEventListener('touchend', function(){ 3544 if (Math.abs(dx) > 40) { 3545 videoEmUso = false; 3546 pausarOutrosVideos(null); 3547 dx < 0 ? go(index + 1, false, true) : go(index - 1, false, true); 3548 startDepoTimer(); 3549 } 3550 dx = 0; 3551 }, { passive:true }); 3552 3553 Array.from(track.querySelectorAll('video')).forEach(function(video){ 3554 ['pointerdown','mousedown','touchstart','click','focus','seeking','volumechange'].forEach(function(evt){ 3555 video.addEventListener(evt, marcarVideoEmUso, { passive:true }); 3556 }); 3557 3558 video.addEventListener('play', function(){ 3559 marcarVideoEmUso(); 3560 pausarOutrosVideos(video); 3561 }); 3562 3563 video.addEventListener('pause', liberarVideoSeParado); 3564 video.addEventListener('ended', liberarVideoSeParado); 3565 }); 3566 3567 ['fullscreenchange','webkitfullscreenchange','mozfullscreenchange','MSFullscreenChange'].forEach(function(evt){ 3568 document.addEventListener(evt, function(){ 3569 if (temVideoTelaCheia()) marcarVideoEmUso(); 3570 else liberarVideoSeParado(); 3571 }); 3572 }); 3573 3574 window.addEventListener('resize', layout, { passive:true }); 3575 3576 document.addEventListener('visibilitychange', function(){ 3577 if (document.hidden) stopDepoTimer(); 3578 else startDepoTimer(); 3579 }, { passive:true }); 3580 3581 layout(); 3582 startDepoTimer(); 3583})(); 3584(function(){ 3585 document.addEventListener('click', function(ev){ 3586 document.querySelectorAll('header details[open]').forEach(function(d){ 3587 if (!d.contains(ev.target)) d.removeAttribute('open'); 3588 }); 3589 }, { passive:true }); 3590})(); 3591 3592function carregarImg(){ 3593 var input = document.getElementById('foto'); 3594 var img = document.getElementById('target'); 3595 var msg = document.getElementById('mensagem-comentario'); 3596 3597 if (!input || !input.files || !input.files[0]) return; 3598 3599 var file = input.files[0]; 3600 var okTypes = ['image/jpeg', 'image/jpg', 'image/png', 'image/webp']; 3601 3602 if (okTypes.indexOf(file.type) === -1) { 3603 msg.textContent = 'Arquivo inválido. Use JPG, PNG ou WebP.'; 3604 msg.style.color = '#ff8080'; 3605 input.value = ''; 3606 img.src = 'sistema/painel/img/comentarios/sem-foto.jpg'; 3607 return; 3608 } 3609 3610 if (file.size > 5 * 1024 * 1024) { 3611 msg.textContent = 'Arquivo muito grande (máx. 5MB).'; 3612 msg.style.color = '#ff8080'; 3613 input.value = ''; 3614 img.src = 'sistema/painel/img/comentarios/sem-foto.jpg'; 3615 return; 3616 } 3617 3618 var reader = new FileReader(); 3619 reader.onload = function(e){ 3620 img.src = e.target.result; 3621 msg.textContent = ''; 3622 }; 3623 reader.readAsDataURL(file); 3624} 3625</script> 3626 3627<script> 3628(function(){ 3629 var ENDPOINT = '/cadastrar.php'; 3630 var tel = document.getElementById('telefone_rodape'); 3631 3632 if (tel) { 3633 tel.addEventListener('input', function(e){ 3634 var d = e.target.value.replace(/\D/g, '').slice(0, 11); 3635 var out = d; 3636 3637 if (d.length > 2) out = '(' + d.slice(0, 2) + ') ' + d.slice(2); 3638 if (d.length >= 11) out = '(' + d.slice(0, 2) + ') ' + d.slice(2, 7) + '-' + d.slice(7); 3639 else if (d.length >= 7) out = '(' + d.slice(0, 2) + ') ' + d.slice(2, 6) + '-' + d.slice(6); 3640 3641 e.target.value = out; 3642 }); 3643 } 3644 3645 var form = document.getElementById('form_cadastro'); 3646 if (!form) return; 3647 3648 form.addEventListener('submit', function(e){ 3649 e.preventDefault(); 3650 if (window.loadSwal) window.loadSwal(); 3651 3652 var action = (form.getAttribute('data-recaptcha-action') || 'cadastro').trim(); 3653 var tokEl = form.querySelector('input[name="recaptcha_token"]'); 3654 var actEl = form.querySelector('input[name="recaptcha_action"]'); 3655 if (actEl) actEl.value = action; 3656 3657 function prosseguirEnvio(){ 3658 var nome = (form.querySelector('[name="nome"]').value || '').trim(); 3659 var fone = (form.querySelector('[name="telefone"]').value || '').replace(/\D/g, ''); 3660 3661 if (!nome || fone.length < 10) { 3662 if (window.Swal) Swal.fire({icon:'error', title:'❌ Dados inválidos', text:'Preencha corretamente nome e telefone.', confirmButtonColor:'#DAA520'}); 3663 else alert('Preencha corretamente nome e telefone.'); 3664 return; 3665 } 3666 3667 var xhr = new XMLHttpRequest(); 3668 xhr.open('POST', ENDPOINT, true); 3669 xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest'); 3670 3671 xhr.onreadystatechange = function(){ 3672 if (xhr.readyState !== 4) return; 3673 3674 var ok = (xhr.status >= 200 && xhr.status < 300); 3675 var resp = (xhr.responseText || '').replace(/\s+/g, ' ').trim(); 3676 3677 if (!ok) { 3678 if (window.Swal) Swal.fire({icon:'error', title:'❌ Erro ao enviar', text:'HTTP ' + xhr.status, confirmButtonColor:'#DAA520'}); 3679 else alert('Erro HTTP ' + xhr.status); 3680 return; 3681 } 3682 3683 if (resp.indexOf('Cadastrado com Sucesso') === 0) { 3684 if (window.Swal) { 3685 Swal.fire({icon:'success', title:'✅ Sucesso!', text:'Cadastro realizado com sucesso.', confirmButtonColor:'#DAA520'}) 3686 .then(function(){ window.location.href = '/sistema/acesso'; }); 3687 } else { 3688 alert('Cadastro realizado com sucesso.'); 3689 window.location.href = '/sistema/acesso'; 3690 } 3691 } else if (resp.indexOf('Você já está Cadastrado') === 0) { 3692 if (window.Swal) { 3693 Swal.fire({icon:'warning', title:'⚠️ Já cadastrado', text:'Você já tem cadastro.', confirmButtonColor:'#DAA520'}) 3694 .then(function(){ window.location.href = '/sistema/acesso'; }); 3695 } else { 3696 alert('Você já tem cadastro.'); 3697 window.location.href = '/sistema/acesso'; 3698 } 3699 } else if (resp.indexOf('Preencha nome e telefone') === 0) { 3700 if (window.Swal) Swal.fire({icon:'error', title:'❌ Dados inválidos', text:'Preencha corretamente nome e telefone.', confirmButtonColor:'#DAA520'}); 3701 else alert('Preencha corretamente nome e telefone.'); 3702 } else { 3703 if (window.Swal) Swal.fire({icon:'error', title:'❌ Erro inesperado', html:'Retorno:<br><pre style="white-space:pre-wrap">' + resp + '</pre>', confirmButtonColor:'#DAA520'}); 3704 else alert('Erro: ' + resp); 3705 } 3706 }; 3707 3708 xhr.onerror = function(){ 3709 if (window.Swal) Swal.fire({icon:'error', title:'❌ Falha de rede', text:'Não foi possível enviar os dados.', confirmButtonColor:'#DAA520'}); 3710 else alert('Falha de rede.'); 3711 }; 3712 3713 xhr.send(new FormData(form)); 3714 } 3715 3716 if (window.grecaptcha && window.RECAPTCHA_SITE_KEY) { 3717 grecaptcha.ready(function(){ 3718 grecaptcha.execute(window.RECAPTCHA_SITE_KEY, {action:action}).then(function(token){ 3719 if (tokEl) tokEl.value = token; 3720 prosseguirEnvio(); 3721 }).catch(function(){ 3722 prosseguirEnvio(); 3723 }); 3724 }); 3725 } else { 3726 prosseguirEnvio(); 3727 } 3728 }); 3729})(); 3730</script> 3731 3732 3733<script type="application/ld+json"> 3734{ 3735 "@context":"https://schema.org", 3736 "@type":"HairSalon", 3737 "name":<?=json_encode($SET['nome'], JSON_UNESCAPED_UNICODE)?>, 3738 "url":<?=json_encode(rtrim($SET['site'], '/') . '/', JSON_UNESCAPED_SLASHES)?>, 3739 "description":<?=json_encode($SET['descricao'], JSON_UNESCAPED_UNICODE)?>, 3740 "telephone":<?=json_encode($SET['telefone'], JSON_UNESCAPED_UNICODE)?>, 3741 "image":<?=json_encode($SET['logo_png'], JSON_UNESCAPED_SLASHES)?>, 3742 "address":{ 3743 "@type":"PostalAddress", 3744 "streetAddress":"Rua Rio Grande do Sul, 2151", 3745 "addressLocality":"Cascavel", 3746 "addressRegion":"PR", 3747 "postalCode":"85801-050", 3748 "addressCountry":"BR" 3749 }, 3750 "geo":{ 3751 "@type":"GeoCoordinates", 3752 "latitude":-24.957842, 3753 "longitude":-53.458627 3754 }, 3755 "areaServed":"Cascavel e região oeste do Paraná", 3756 "priceRange":"R$R$", 3757 "openingHoursSpecification":[ 3758 {"@type":"OpeningHoursSpecification","dayOfWeek":["Monday","Tuesday","Wednesday","Thursday","Friday"],"opens":"09:00","closes":"19:00"}, 3759 {"@type":"OpeningHoursSpecification","dayOfWeek":"Saturday","opens":"09:00","closes":"17:00"} 3760 ], 3761 "sameAs":[ 3762 <?=json_encode($INSTAGRAM_LINK ?: "https://www.instagram.com/jacycabeleireiro", JSON_UNESCAPED_SLASHES)?>, 3763 "https://maps.app.goo.gl/PGDcFaCRaq2pmMVa9" 3764 ] 3765} 3766</script> 3767 3768<script> 3769document.addEventListener('DOMContentLoaded', function () { 3770 const el = document.querySelector('.counter-1999'); 3771 const sec = document.querySelector('.experience-section'); 3772 if (!el) return; 3773 3774 fetch('/contador-visitas.php', { cache: 'no-store' }) 3775 .then(r => r.ok ? r.json() : Promise.reject(r.status)) 3776 .then(data => { 3777 const total = Number(data && data.visitas) || 0; 3778 const finalFmt = (data && data.formatado) ? String(data.formatado) : total.toLocaleString('pt-BR'); 3779 startCounter(total, finalFmt); 3780 }) 3781 .catch(() => { 3782 startCounter(5280, (5280).toLocaleString('pt-BR')); 3783 }); 3784 3785 function startCounter(target, finalFmt) { 3786 el.textContent = '0'; 3787 el.setAttribute('data-target', String(target)); 3788 const run = () => animateTo(target, finalFmt); 3789 3790 if ('IntersectionObserver' in window && sec) { 3791 const io = new IntersectionObserver((entries) => { 3792 if (entries.some(e => e.isIntersecting) && !el.classList.contains('animated')) { 3793 el.classList.add('animated'); 3794 run(); 3795 io.disconnect(); 3796 } 3797 }, { threshold: 0.3 }); 3798 io.observe(sec); 3799 } else { 3800 run(); 3801 } 3802 } 3803 3804 function animateTo(target, finalFmt) { 3805 if (!target || target <= 0) { el.textContent = '0'; return; } 3806 3807 let current = 0; 3808 const duration = 2400; 3809 const steps = 100; 3810 const increment = Math.max(1, Math.ceil(target / steps)); 3811 const tick = Math.max(16, Math.floor(duration / Math.ceil(target / increment))); 3812 3813 const t = setInterval(() => { 3814 current += increment; 3815 if (current >= target) { 3816 clearInterval(t); 3817 el.textContent = finalFmt; 3818 return; 3819 } 3820 el.textContent = current.toLocaleString('pt-BR'); 3821 }, tick); 3822 } 3823}); 3824</script> 3825 3826<script> 3827(function(){ 3828 var urlSimulacaoCliente = '/ajax/gerar_ia_cliente.php'; 3829 var urlCadastroCliente = '/cadastrar.php'; 3830 var imagemPadrao = '/sistema/painel/images/simulacoes/sem-foto.jpg'; 3831 var pastaSimulacoes = '/sistema/painel/images/simulacoes/'; 3832 var simulacaoEmAndamento = false; 3833 3834 function normalizarUrlImagem(url){ 3835 if (!url) return ''; 3836 url = String(url).trim(); 3837 if (!url) return ''; 3838 3839 if (/^https?:\/\//i.test(url)) return url; 3840 if (url.charAt(0) === '/') return window.location.origin + url; 3841 3842 return window.location.origin + '/' + url.replace(/^\.?\//, ''); 3843 } 3844 3845 function montarUrlSimulacao(caminho){ 3846 if (!caminho) return ''; 3847 caminho = String(caminho).trim(); 3848 if (!caminho) return ''; 3849 3850 if (/^https?:\/\//i.test(caminho)) return caminho; 3851 if (caminho.indexOf('sistema/painel/images/simulacoes/') !== -1) return normalizarUrlImagem(caminho); 3852 if (caminho.charAt(0) === '/') return normalizarUrlImagem(caminho); 3853 3854 return normalizarUrlImagem(pastaSimulacoes + caminho.replace(/^\.?\//, '')); 3855 } 3856 3857 function adicionarCacheNaImagem(url){ 3858 if (!url) return ''; 3859 return url + (url.indexOf('?') !== -1 ? '&v=' : '?v=') + Date.now(); 3860 } 3861 3862 function retornoFoiSucesso(status){ 3863 if (!status) return false; 3864 status = String(status).toLowerCase().trim(); 3865 return status === 'success' || status === 'sucesso'; 3866 } 3867 3868 function formatarTelefoneBR(valor){ 3869 var d = String(valor || '').replace(/\D/g, '').slice(0, 11); 3870 if (!d) return ''; 3871 3872 if (d.length <= 2) return d; 3873 if (d.length <= 6) return '(' + d.slice(0, 2) + ') ' + d.slice(2); 3874 if (d.length <= 10) return '(' + d.slice(0, 2) + ') ' + d.slice(2, 6) + '-' + d.slice(6); 3875 3876 return '(' + d.slice(0, 2) + ') ' + d.slice(2, 7) + '-' + d.slice(7, 11); 3877 } 3878 3879 function aplicarMascaraTelefoneSimulador(){ 3880 var campo = document.getElementById('telefone_simulacao_cliente'); 3881 if (!campo) return; 3882 3883 if (campo.getAttribute('data-mask-simulador') === '1') { 3884 campo.value = formatarTelefoneBR(campo.value); 3885 return; 3886 } 3887 3888 var aplicar = function(){ 3889 campo.value = formatarTelefoneBR(campo.value); 3890 }; 3891 3892 campo.addEventListener('input', aplicar); 3893 campo.addEventListener('blur', aplicar); 3894 campo.addEventListener('paste', function(){ setTimeout(aplicar, 0); }); 3895 3896 campo.setAttribute('data-mask-simulador', '1'); 3897 aplicar(); 3898 } 3899 3900 function setEstadoBotao(carregando){ 3901 var btn = document.getElementById('btn_simular_cliente'); 3902 var icone = document.getElementById('icone_btn_simular_cliente'); 3903 var texto = document.getElementById('texto_btn_simular_cliente'); 3904 var msg = document.getElementById('mensagem_simulacao_cliente'); 3905 3906 if (!btn || !icone || !texto || !msg) return; 3907 3908 if (carregando) { 3909 btn.disabled = true; 3910 btn.style.pointerEvents = 'none'; 3911 icone.className = 'fa fa-spinner fa-spin'; 3912 texto.innerText = 'Simulando...'; 3913 msg.className = 'text-info'; 3914 msg.innerText = 'Gerando simulação, aguarde...'; 3915 return; 3916 } 3917 3918 btn.disabled = false; 3919 btn.style.pointerEvents = ''; 3920 icone.className = 'fa fa-magic'; 3921 texto.innerText = 'Simular'; 3922 } 3923 3924 function resetarModalSimulacaoCliente(){ 3925 var form = document.getElementById('form_simulacao_cliente'); 3926 var imgOriginal = document.getElementById('preview_original_simulacao_cliente'); 3927 var imgResultado = document.getElementById('preview_resultado_simulacao_cliente'); 3928 var msg = document.getElementById('mensagem_simulacao_cliente'); 3929 3930 simulacaoEmAndamento = false; 3931 3932 if (form) form.reset(); 3933 if (imgOriginal) imgOriginal.src = adicionarCacheNaImagem(imagemPadrao); 3934 if (imgResultado) imgResultado.src = adicionarCacheNaImagem(imagemPadrao); 3935 3936 if (msg) { 3937 msg.innerText = ''; 3938 msg.className = ''; 3939 } 3940 3941 setEstadoBotao(false); 3942 aplicarMascaraTelefoneSimulador(); 3943 } 3944 3945 function inicializarSimuladorCliente(){ 3946 aplicarMascaraTelefoneSimulador(); 3947 3948 var imgOriginal = document.getElementById('preview_original_simulacao_cliente'); 3949 var imgResultado = document.getElementById('preview_resultado_simulacao_cliente'); 3950 3951 if (imgOriginal && (!imgOriginal.getAttribute('src') || imgOriginal.getAttribute('src') === '')) { 3952 imgOriginal.src = adicionarCacheNaImagem(imagemPadrao); 3953 } 3954 3955 if (imgResultado && (!imgResultado.getAttribute('src') || imgResultado.getAttribute('src') === '')) { 3956 imgResultado.src = adicionarCacheNaImagem(imagemPadrao); 3957 } 3958 } 3959 3960 window.carregarPreviewSimulacaoCliente = function(){ 3961 var campo = document.getElementById('foto_simulacao_cliente'); 3962 var imgOriginal = document.getElementById('preview_original_simulacao_cliente'); 3963 var imgResultado = document.getElementById('preview_resultado_simulacao_cliente'); 3964 3965 if (!campo || !imgOriginal || !imgResultado) return; 3966 3967 if (!campo.files || !campo.files[0]) { 3968 imgOriginal.src = adicionarCacheNaImagem(imagemPadrao); 3969 imgResultado.src = adicionarCacheNaImagem(imagemPadrao); 3970 return; 3971 } 3972 3973 var arquivo = campo.files[0]; 3974 var reader = new FileReader(); 3975 3976 reader.onload = function(e){ 3977 imgOriginal.src = e.target.result; 3978 imgResultado.src = adicionarCacheNaImagem(imagemPadrao); 3979 }; 3980 3981 reader.onerror = function(){ 3982 imgOriginal.src = adicionarCacheNaImagem(imagemPadrao); 3983 imgResultado.src = adicionarCacheNaImagem(imagemPadrao); 3984 }; 3985 3986 reader.readAsDataURL(arquivo); 3987 }; 3988 3989 window.enviarSimulacaoCliente = function(){ 3990 if (window.loadSwal) window.loadSwal(); 3991 var form = document.getElementById('form_simulacao_cliente'); 3992 var campo = document.getElementById('foto_simulacao_cliente'); 3993 var nomeCampo = document.getElementById('nome_simulacao_cliente'); 3994 var telefoneCampo = document.getElementById('telefone_simulacao_cliente'); 3995 var msg = document.getElementById('mensagem_simulacao_cliente'); 3996 var imgOriginal = document.getElementById('preview_original_simulacao_cliente'); 3997 var imgResultado = document.getElementById('preview_resultado_simulacao_cliente'); 3998 3999 if (simulacaoEmAndamento) return; 4000 if (!form || !campo || !msg || !imgOriginal || !imgResultado) return; 4001 4002 var nome = nomeCampo ? nomeCampo.value.trim() : ''; 4003 var telefone = telefoneCampo ? telefoneCampo.value.trim() : ''; 4004 4005 if (!nome || !telefone) { 4006 msg.className = 'text-danger'; 4007 msg.innerText = 'Preencha nome e WhatsApp'; 4008 return; 4009 } 4010 4011 if (telefone.replace(/\D/g, '').length < 10) { 4012 msg.className = 'text-danger'; 4013 msg.innerText = 'Preencha um WhatsApp válido'; 4014 return; 4015 } 4016 4017 if (!campo.files || !campo.files[0]) { 4018 msg.className = 'text-danger'; 4019 msg.innerText = 'Selecione uma imagem para simular'; 4020 return; 4021 } 4022 4023 simulacaoEmAndamento = true; 4024 setEstadoBotao(true); 4025 4026 var formData = new FormData(form); 4027 4028 fetch(urlSimulacaoCliente, { 4029 method: 'POST', 4030 body: formData 4031 }) 4032 .then(async function(response){ 4033 var texto = await response.text(); 4034 var dados = null; 4035 4036 try { 4037 dados = JSON.parse(texto); 4038 } catch (e) { 4039 throw new Error(texto || 'Resposta inválida do servidor'); 4040 } 4041 4042 if (!response.ok || !dados || !retornoFoiSucesso(dados.status)) { 4043 throw new Error((dados && dados.mensagem) ? dados.mensagem : 'Erro ao processar a simulação'); 4044 } 4045 4046 var urlOriginal = ''; 4047 var urlSimulada = ''; 4048 4049 if (dados.url_original) urlOriginal = normalizarUrlImagem(dados.url_original); 4050 else if (dados.foto_original) urlOriginal = montarUrlSimulacao(dados.foto_original); 4051 4052 if (dados.url_simulada) urlSimulada = normalizarUrlImagem(dados.url_simulada); 4053 else if (dados.imagem_simulada) urlSimulada = montarUrlSimulacao(dados.imagem_simulada); 4054 4055 if (!urlSimulada) throw new Error('A imagem simulada não foi retornada'); 4056 4057 if (urlOriginal) imgOriginal.src = adicionarCacheNaImagem(urlOriginal); 4058 imgResultado.src = adicionarCacheNaImagem(urlSimulada); 4059 4060 fetch(urlCadastroCliente, { 4061 method: 'POST', 4062 body: new FormData(form) 4063 }).catch(function(){}); 4064 4065 msg.className = 'text-success'; 4066 msg.innerText = 'Simulação enviada com sucesso'; 4067 if (typeof window.jacyTrackAdsConversion === 'function') { window.jacyTrackAdsConversion('simulacao_protese_sucesso'); } 4068 }) 4069 .catch(function(erro){ 4070 imgResultado.src = adicionarCacheNaImagem(imagemPadrao); 4071 msg.className = 'text-danger'; 4072 msg.innerText = erro.message ? erro.message : 'Erro ao processar a simulação'; 4073 }) 4074 .finally(function(){ 4075 simulacaoEmAndamento = false; 4076 setEstadoBotao(false); 4077 }); 4078 }; 4079 4080 document.addEventListener('DOMContentLoaded', function(){ 4081 inicializarSimuladorCliente(); 4082 }); 4083 4084 window.addEventListener('load', function(){ 4085 inicializarSimuladorCliente(); 4086 }); 4087 4088 document.addEventListener('click', function(ev){ 4089 var abrir = ev.target.closest('[data-target="#modalSimulacaoCliente"], a[href="#modalSimulacaoCliente"]'); 4090 if (abrir) { 4091 setTimeout(function(){ inicializarSimuladorCliente(); }, 80); 4092 } 4093 4094 var fechar = ev.target.closest('#modalSimulacaoCliente [data-dismiss="modal"], #modalSimulacaoCliente .close'); 4095 if (fechar) { 4096 setTimeout(function(){ resetarModalSimulacaoCliente(); }, 80); 4097 } 4098 }); 4099 4100 if (window.jQuery) { 4101 window.jQuery('#modalSimulacaoCliente').on('hidden.bs.modal', function(){ 4102 resetarModalSimulacaoCliente(); 4103 }); 4104 4105 window.jQuery('#modalSimulacaoCliente').on('shown.bs.modal', function(){ 4106 inicializarSimuladorCliente(); 4107 }); 4108 } 4109})(); 4110</script> 4111 4112 4113<script> 4114(function(){ 4115 var frames = Array.prototype.slice.call(document.querySelectorAll('iframe.js-lazy-iframe[data-src]')); 4116 if (!frames.length) return; 4117 4118 function loadFrame(frame){ 4119 if (!frame || frame.dataset.loaded === '1') return; 4120 var src = frame.getAttribute('data-src'); 4121 if (!src) return; 4122 frame.src = src; 4123 frame.dataset.loaded = '1'; 4124 } 4125 4126 if ('IntersectionObserver' in window) { 4127 var io = new IntersectionObserver(function(entries){ 4128 entries.forEach(function(entry){ 4129 if (!entry.isIntersecting) return; 4130 loadFrame(entry.target); 4131 io.unobserve(entry.target); 4132 }); 4133 }, { rootMargin: '350px 0px', threshold: 0.01 }); 4134 4135 frames.forEach(function(frame){ io.observe(frame); }); 4136 } else { 4137 frames.forEach(loadFrame); 4138 } 4139 4140 document.addEventListener('shown.bs.modal', function(e){ 4141 if (!e.target) return; 4142 var frame = e.target.querySelector('iframe.js-lazy-iframe[data-src]'); 4143 if (frame) loadFrame(frame); 4144 }); 4145 4146 document.addEventListener('click', function(e){ 4147 var opener = e.target.closest('[data-target="#empresa"], a[href="#empresa"], [data-target="#modalVideo"], a[href="#modalVideo"]'); 4148 if (!opener) return; 4149 setTimeout(function(){ 4150 frames.forEach(function(frame){ 4151 if (frame.offsetParent !== null) loadFrame(frame); 4152 }); 4153 }, 120); 4154 }); 4155})(); 4156</script> 4157 4158<script> 4159(function(){ 4160 var swalLoaded = false; 4161 4162 function loadSwal(){ 4163 if (swalLoaded) return; 4164 swalLoaded = true; 4165 4166 var s = document.createElement('script'); 4167 s.src = 'https://cdn.jsdelivr.net/npm/sweetalert2@11'; 4168 s.defer = true; 4169 document.head.appendChild(s); 4170 } 4171 4172 window.loadSwal = loadSwal; 4173 4174 if ('requestIdleCallback' in window) { 4175 requestIdleCallback(function(){ setTimeout(loadSwal, 10000); }, { timeout: 7000 }); 4176 } else { 4177 window.addEventListener('load', function(){ setTimeout(loadSwal, 10000); }, { once:true }); 4178 } 4179 4180 document.addEventListener('focusin', function(e){ 4181 if (e.target.closest('#form_cadastro') || e.target.closest('#form_simulacao_cliente') || e.target.closest('#form')) { 4182 loadSwal(); 4183 } 4184 }); 4185 4186 document.addEventListener('pointerdown', function(e){ 4187 if (e.target.closest('#form_cadastro') || e.target.closest('#form_simulacao_cliente') || e.target.closest('#form')) { 4188 loadSwal(); 4189 } 4190 }, { passive:true }); 4191})(); 4192</script> 4193 4194 4195<script> 4196(function(){ 4197 function marcarConversaoPorClique(rotulo){ 4198 if (typeof window.jacyTrackAdsConversion === 'function') { 4199 window.jacyTrackAdsConversion(rotulo); 4200 } 4201 } 4202 4203 document.addEventListener('click', function(ev){ 4204 var alvo = ev.target.closest('a, button'); 4205 if (!alvo) return; 4206 4207 var href = (alvo.getAttribute('href') || '').toLowerCase(); 4208 var id = (alvo.getAttribute('id') || '').toLowerCase(); 4209 4210 if (id === 'ctawhats' || href.indexOf('wa.me/') !== -1 || href.indexOf('api.whatsapp.com') !== -1) { 4211 marcarConversaoPorClique('clique_whatsapp_protese'); 4212 return; 4213 } 4214 4215 if (id === 'ctaapp' || href.indexOf('/agendamentos') !== -1 || href.indexOf('agendamentos') !== -1) { 4216 marcarConversaoPorClique('clique_agendamento_protese'); 4217 return; 4218 } 4219 4220 if (href.indexOf('abrir_simulador=1') !== -1 || href.indexOf('#modalsimulacaocliente') !== -1) { 4221 marcarConversaoPorClique('clique_simulacao_protese'); 4222 } 4223 }, true); 4224})(); 4225</script> 4226 4227</body> 4228</html>

Leitura linha por linha

LinhaCódigoExplicação técnica
1<?phpAbre um bloco PHP executado no servidor.
2ini_set('display_errors', 0);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3ini_set('display_startup_errors', 0);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4error_reporting(E_ALL);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
5 Linha em branco usada para separar blocos do arquivo.
6if (!headers_sent() && !ob_get_level()) {Avalia a condição escrita nesta linha.
7 if (extension_loaded('zlib') && !ini_get('zlib.output_compression')) {Avalia a condição escrita nesta linha.
8 ob_start('ob_gzhandler');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
9 } else {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
10 ob_start();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
11 }Fecha ou delimita a estrutura iniciada anteriormente.
12}Fecha ou delimita a estrutura iniciada anteriormente.
13 Linha em branco usada para separar blocos do arquivo.
14/* ============================================================Comentário existente no código-fonte.
15 BOOT / SEGURANÇALinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
16 ============================================================ */Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
17 Linha em branco usada para separar blocos do arquivo.
18// Sessão com flags seguras (antes de qualquer output)Comentário existente no código-fonte.
19if (session_status() === PHP_SESSION_NONE) {Avalia a condição escrita nesta linha.
20 $secure = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off');Atribui o valor ou resultado exibido à variável.
21 session_set_cookie_params([Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
22 'lifetime' => 0,Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
23 'path' => '/',Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
24 'domain' => $_SERVER['HTTP_HOST'] ?? '',Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
25 'secure' => $secure,Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
26 'httponly' => true,Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
27 'samesite' => 'Lax',Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
28 ]);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
29 @session_start();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
30}Fecha ou delimita a estrutura iniciada anteriormente.
31 Linha em branco usada para separar blocos do arquivo.
32// Headers de segurançaComentário existente no código-fonte.
33header('Content-Type: text/html; charset=UTF-8');Define um cabeçalho HTTP.
34header('X-Content-Type-Options: nosniff');Define um cabeçalho HTTP.
35header('X-Frame-Options: SAMEORIGIN');Define um cabeçalho HTTP.
36header('Referrer-Policy: strict-origin-when-cross-origin');Define um cabeçalho HTTP.
37header('Permissions-Policy: geolocation=(), microphone=(), camera=()');Define um cabeçalho HTTP.
38 Linha em branco usada para separar blocos do arquivo.
39if (!headers_sent()) {Avalia a condição escrita nesta linha.
40 if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') {Avalia a condição escrita nesta linha.
41 header('Strict-Transport-Security: max-age=31536000; includeSubDomains; preload');Define um cabeçalho HTTP.
42 }Fecha ou delimita a estrutura iniciada anteriormente.
43 Linha em branco usada para separar blocos do arquivo.
44 $csp = [Atribui o valor ou resultado exibido à variável.
45 "default-src 'self'",Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
46 "base-uri 'self'",Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
47 "form-action 'self'",Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
48 "frame-ancestors 'self'",Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
49 "upgrade-insecure-requests",Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
50 "img-src 'self' data: https: i.ytimg.com s.ytimg.com",Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
51 "script-src 'self' 'unsafe-inline' https://www.youtube.com https://www.youtube-nocookie.com https://www.google.com https://www.gstatic.com https://s.ytimg.com https://code.jquery.com https://cdn.jsdelivr.net https://cdnjs.cloudflare.com https://www.googletagmanager.com https://www.google-analytics.com",Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
52 "style-src 'self' 'unsafe-inline'",Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
53 "frame-src https://www.youtube.com https://www.youtube-nocookie.com https://www.google.com",Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
54 "connect-src 'self' https://www.youtube.com https://www.google.com https://www.gstatic.com https://i.ytimg.com https://s.ytimg.com https://*.googlevideo.com https://www.googletagmanager.com https://www.google-analytics.com",Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
55 "media-src 'self' https: blob: https://*.googlevideo.com",Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
56 "font-src 'self' data: https:"Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
57 ];Fecha ou delimita a estrutura iniciada anteriormente.
58 Linha em branco usada para separar blocos do arquivo.
59 header('Content-Security-Policy: ' . implode('; ', $csp));Define um cabeçalho HTTP.
60}Fecha ou delimita a estrutura iniciada anteriormente.
61 Linha em branco usada para separar blocos do arquivo.
62/* ============================================================Comentário existente no código-fonte.
63 CONEXÃOLinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
64 ============================================================ */Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
65$pdo = null;Atribui o valor ou resultado exibido à variável.
66try {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
67 require_once $_SERVER['DOCUMENT_ROOT'] . '/sistema/conexao.php';Carrega o arquivo ou a dependência indicada na própria linha.
68} catch (Throwable $e) {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
69 $pdo = null;Atribui o valor ou resultado exibido à variável.
70}Fecha ou delimita a estrutura iniciada anteriormente.
71require_once __DIR__ . '/security.php';Carrega o arquivo ou a dependência indicada na própria linha.
72 Linha em branco usada para separar blocos do arquivo.
73/* ============================================================Comentário existente no código-fonte.
74 HELPERSLinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
75 ============================================================ */Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
76function h($v) { return htmlspecialchars((string)$v, ENT_QUOTES, 'UTF-8'); }Declara a função e os parâmetros mostrados.
77function d($s) { return preg_replace('/\D+/', '', (string)$s); }Declara a função e os parâmetros mostrados.
78 Linha em branco usada para separar blocos do arquivo.
79function money_br($v) {Declara a função e os parâmetros mostrados.
80 if ($v === null || $v === '') return '';Avalia a condição escrita nesta linha.
81 if (is_string($v) && preg_match('/^\d+(?:[.,]\d+)?$/', $v)) {Avalia a condição escrita nesta linha.
82 $v = str_replace(',', '.', $v);Atribui o valor ou resultado exibido à variável.
83 }Fecha ou delimita a estrutura iniciada anteriormente.
84 return 'R$ ' . number_format((float)$v, 2, ',', '.');Retorna o valor indicado pela linha.
85}Fecha ou delimita a estrutura iniciada anteriormente.
86 Linha em branco usada para separar blocos do arquivo.
87function table_exists(?PDO $pdo, $t) {Declara a função e os parâmetros mostrados.
88 if (!$pdo) return false;Avalia a condição escrita nesta linha.
89 try {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
90 $st = $pdo->prepare('SHOW TABLES LIKE :t');Prepara uma instrução SQL com PDO.
91 $st->execute([':t' => $t]);Executa a instrução preparada.
92 return (bool)$st->fetch(PDO::FETCH_NUM);Retorna o valor indicado pela linha.
93 } catch (Throwable $e) {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
94 return false;Retorna o valor indicado pela linha.
95 }Fecha ou delimita a estrutura iniciada anteriormente.
96}Fecha ou delimita a estrutura iniciada anteriormente.
97 Linha em branco usada para separar blocos do arquivo.
98function col_exists(PDO $pdo, $t, $c) {Declara a função e os parâmetros mostrados.
99 try {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
100 $st = $pdo->prepare("SHOW COLUMNS FROM `$t` LIKE :c");Prepara uma instrução SQL com PDO.
101 $st->execute([':c' => $c]);Executa a instrução preparada.
102 return (bool)$st->fetch(PDO::FETCH_ASSOC);Retorna o valor indicado pela linha.
103 } catch (Throwable $e) {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
104 return false;Retorna o valor indicado pela linha.
105 }Fecha ou delimita a estrutura iniciada anteriormente.
106}Fecha ou delimita a estrutura iniciada anteriormente.
107 Linha em branco usada para separar blocos do arquivo.
108function coalesce_expr(PDO $pdo, $t, $cands, $alias) {Declara a função e os parâmetros mostrados.
109 $cands = (array)$cands;Atribui o valor ou resultado exibido à variável.
110 $ok = [];Atribui o valor ou resultado exibido à variável.
111 foreach ($cands as $c) {Controla uma repetição conforme a expressão exibida.
112 if (col_exists($pdo, $t, $c)) $ok[] = $c;Avalia a condição escrita nesta linha.
113 }Fecha ou delimita a estrutura iniciada anteriormente.
114 Linha em branco usada para separar blocos do arquivo.
115 if (!empty($ok)) {Avalia a condição escrita nesta linha.
116 $parts = [];Atribui o valor ou resultado exibido à variável.
117 foreach ($ok as $c) {Controla uma repetição conforme a expressão exibida.
118 $c = str_replace('`', '', $c);Atribui o valor ou resultado exibido à variável.
119 $parts[] = '`' . $c . '`';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
120 }Fecha ou delimita a estrutura iniciada anteriormente.
121 $cols = implode(',', $parts);Atribui o valor ou resultado exibido à variável.
122 return "COALESCE($cols) AS $alias";Retorna o valor indicado pela linha.
123 }Fecha ou delimita a estrutura iniciada anteriormente.
124 Linha em branco usada para separar blocos do arquivo.
125 return "NULL AS $alias";Retorna o valor indicado pela linha.
126}Fecha ou delimita a estrutura iniciada anteriormente.
127 Linha em branco usada para separar blocos do arquivo.
128function official_agenda_link(): string {Declara a função e os parâmetros mostrados.
129 return '/agendamentos/';Retorna o valor indicado pela linha.
130}Fecha ou delimita a estrutura iniciada anteriormente.
131 Linha em branco usada para separar blocos do arquivo.
132function normalize_agenda_link(string $url): string {Declara a função e os parâmetros mostrados.
133 $url = trim($url);Atribui o valor ou resultado exibido à variável.
134 if ($url === '') return official_agenda_link();Avalia a condição escrita nesta linha.
135 Linha em branco usada para separar blocos do arquivo.
136 $normalized = rtrim(strtolower($url), '/');Atribui o valor ou resultado exibido à variável.
137 $agendaAliases = [Atribui o valor ou resultado exibido à variável.
138 '/agendamentos',Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
139 'agendamentos',Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
140 'https://jacycabeleireiro.com/agendamentos',Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
141 'http://jacycabeleireiro.com/agendamentos',Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
142 ];Fecha ou delimita a estrutura iniciada anteriormente.
143 Linha em branco usada para separar blocos do arquivo.
144 if (in_array($normalized, $agendaAliases, true)) {Avalia a condição escrita nesta linha.
145 return official_agenda_link();Retorna o valor indicado pela linha.
146 }Fecha ou delimita a estrutura iniciada anteriormente.
147 Linha em branco usada para separar blocos do arquivo.
148 return $url;Retorna o valor indicado pela linha.
149}Fecha ou delimita a estrutura iniciada anteriormente.
150 Linha em branco usada para separar blocos do arquivo.
151function canonical_link($u) {Declara a função e os parâmetros mostrados.
152 $u = trim((string)$u);Atribui o valor ou resultado exibido à variável.
153 if ($u === '' || $u === '#') return '';Avalia a condição escrita nesta linha.
154 Linha em branco usada para separar blocos do arquivo.
155 if (preg_match('#^(https?:)?//#i', $u)) return normalize_agenda_link($u);Avalia a condição escrita nesta linha.
156 if ($u[0] === '/') return normalize_agenda_link($u);Avalia a condição escrita nesta linha.
157 if (preg_match('/^[\w.-]+\.[a-z]{2,}(\/.*)?$/i', $u)) return normalize_agenda_link('https://' . $u);Avalia a condição escrita nesta linha.
158 Linha em branco usada para separar blocos do arquivo.
159 return normalize_agenda_link('/' . ltrim($u, '/'));Retorna o valor indicado pela linha.
160}Fecha ou delimita a estrutura iniciada anteriormente.
161 Linha em branco usada para separar blocos do arquivo.
162function yt_id(string $urlOrId): string {Declara a função e os parâmetros mostrados.
163 $u = trim($urlOrId);Atribui o valor ou resultado exibido à variável.
164 if ($u === '') return '';Avalia a condição escrita nesta linha.
165 Linha em branco usada para separar blocos do arquivo.
166 if (preg_match('~^(?:https?://)?(?:www\.)?(?:youtube\.com/(?:watch\?v=|embed/)|youtu\.be/)([A-Za-z0-9_-]{6,})~i', $u, $m)) {Avalia a condição escrita nesta linha.
167 return $m[1];Retorna o valor indicado pela linha.
168 }Fecha ou delimita a estrutura iniciada anteriormente.
169 Linha em branco usada para separar blocos do arquivo.
170 if (preg_match('~^[A-Za-z0-9_-]{6,}$~', $u)) return $u;Avalia a condição escrita nesta linha.
171 return '';Retorna o valor indicado pela linha.
172}Fecha ou delimita a estrutura iniciada anteriormente.
173 Linha em branco usada para separar blocos do arquivo.
174function fix_path(string $raw): string {Declara a função e os parâmetros mostrados.
175 $raw = trim($raw);Atribui o valor ou resultado exibido à variável.
176 if ($raw === '' || $raw === '#') return '';Avalia a condição escrita nesta linha.
177 if (preg_match('#^(?:https?:)?//#i', $raw) || strncmp($raw, 'data:', 5) === 0) return $raw;Avalia a condição escrita nesta linha.
178 if ($raw[0] === '/') return $raw;Avalia a condição escrita nesta linha.
179 Linha em branco usada para separar blocos do arquivo.
180 $cands = [];Atribui o valor ou resultado exibido à variável.
181 if (preg_match('#^(paginas/|site/|uploads_)#i', $raw)) {Avalia a condição escrita nesta linha.
182 $cands[] = '/sistema/painel/' . $raw;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
183 $cands[] = '/' . $raw;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
184 }Fecha ou delimita a estrutura iniciada anteriormente.
185 Linha em branco usada para separar blocos do arquivo.
186 if (defined('UP')) $cands[] = rtrim(UP, '/') . '/' . ltrim($raw, '/');Avalia a condição escrita nesta linha.
187 $cands[] = '/sistema/painel/paginas/site/' . ltrim($raw, '/');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
188 Linha em branco usada para separar blocos do arquivo.
189 foreach ($cands as $u) {Controla uma repetição conforme a expressão exibida.
190 $abs = $_SERVER['DOCUMENT_ROOT'] . $u;Atribui o valor ou resultado exibido à variável.
191 if (is_file($abs)) return $u;Avalia a condição escrita nesta linha.
192 }Fecha ou delimita a estrutura iniciada anteriormente.
193 Linha em branco usada para separar blocos do arquivo.
194 return $cands[0] ?? '/' . $raw;Retorna o valor indicado pela linha.
195}Fecha ou delimita a estrutura iniciada anteriormente.
196 Linha em branco usada para separar blocos do arquivo.
197function resolve_media_src(string $raw): array {Declara a função e os parâmetros mostrados.
198 $u = fix_path($raw);Atribui o valor ou resultado exibido à variável.
199 $path = parse_url($u, PHP_URL_PATH) ?? $u;Atribui o valor ou resultado exibido à variável.
200 $isVideo = preg_match('/\.(mp4|webm|ogg)$/i', $path);Atribui o valor ou resultado exibido à variável.
201 return $isVideo ? ['img' => '', 'video' => $u] : ['img' => $u, 'video' => ''];Retorna o valor indicado pela linha.
202}Fecha ou delimita a estrutura iniciada anteriormente.
203 Linha em branco usada para separar blocos do arquivo.
204/* ============================================================Comentário existente no código-fonte.
205 SETTINGSLinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
206 ============================================================ */Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
207function loadSettings(?PDO $pdo) {Declara a função e os parâmetros mostrados.
208 $out = [Atribui o valor ou resultado exibido à variável.
209 'site' => 'https://jacycabeleireiro.com/',Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
210 'nome' => 'Jacy Cabeleireiro',Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
211 'descricao' => 'Cortes, prótese capilar, mechas e escovas com técnica e acabamento profissional.',Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
212 'whatsapp' => '5545999882100',Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
213 'telefone' => '(45) 99988-2100',Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
214 'email' => 'jacycordeiro1@gmail.com',Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
215 'endereco' => 'Rio Grande do Sul, 2151 - Cascavel/PR',Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
216 'uploads' => '/sistema/painel/paginas/site/uploads_banners',Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
217 'logo_png' => '/sistema/img/logo.png',Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
218 'logo_webp' => '/sistema/img/logo.webp',Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
219 'agenda_url' => official_agenda_link(),Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
220 ];Fecha ou delimita a estrutura iniciada anteriormente.
221 Linha em branco usada para separar blocos do arquivo.
222 if (!$pdo) return $out;Avalia a condição escrita nesta linha.
223 Linha em branco usada para separar blocos do arquivo.
224 $tabs = ['site_config', 'configuracoes', 'empresa', 'institucional', 'config_site', 'settings', 'config'];Atribui o valor ou resultado exibido à variável.
225 foreach ($tabs as $t) {Controla uma repetição conforme a expressão exibida.
226 if (!table_exists($pdo, $t)) continue;Avalia a condição escrita nesta linha.
227 Linha em branco usada para separar blocos do arquivo.
228 try {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
229 $nome = coalesce_expr($pdo, $t, ['nome', 'titulo', 'razao_social', 'nome_fantasia'], 'nome');Atribui o valor ou resultado exibido à variável.
230 $desc = coalesce_expr($pdo, $t, ['descricao', 'descricao_site', 'sobre', 'texto'], 'descricao');Atribui o valor ou resultado exibido à variável.
231 $wpp = coalesce_expr($pdo, $t, ['whatsapp', 'wpp', 'telefone2'], 'whatsapp');Atribui o valor ou resultado exibido à variável.
232 $tel = coalesce_expr($pdo, $t, ['telefone', 'fone'], 'telefone');Atribui o valor ou resultado exibido à variável.
233 $mail = coalesce_expr($pdo, $t, ['email', 'mail', 'contato'], 'email');Atribui o valor ou resultado exibido à variável.
234 $end = coalesce_expr($pdo, $t, ['endereco', 'endereço', 'address'], 'endereco');Atribui o valor ou resultado exibido à variável.
235 $logo = coalesce_expr($pdo, $t, ['logo_webp', 'logo', 'logo_png'], 'logo');Atribui o valor ou resultado exibido à variável.
236 $uploads = coalesce_expr($pdo, $t, ['uploads_base', 'uploads', 'upload_dir'], 'uploads');Atribui o valor ou resultado exibido à variável.
237 $agenda = coalesce_expr($pdo, $t, ['agenda', 'agenda_url', 'link_agenda'], 'agenda_url');Atribui o valor ou resultado exibido à variável.
238 $site = coalesce_expr($pdo, $t, ['site', 'url', 'dominio'], 'site');Atribui o valor ou resultado exibido à variável.
239 Linha em branco usada para separar blocos do arquivo.
240 $sql = "SELECT $nome,$desc,$wpp,$tel,$mail,$end,$logo,$uploads,$agenda,$site FROM `$t` LIMIT 1";Atribui o valor ou resultado exibido à variável.
241 $r = $pdo->query($sql)->fetch(PDO::FETCH_ASSOC);Executa uma consulta pelo objeto PDO.
242 Linha em branco usada para separar blocos do arquivo.
243 if ($r) {Avalia a condição escrita nesta linha.
244 foreach ($r as $k => $v) {Controla uma repetição conforme a expressão exibida.
245 if ($v !== null && $v !== '') {Avalia a condição escrita nesta linha.
246 $out[$k] = $v;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
247 }Fecha ou delimita a estrutura iniciada anteriormente.
248 }Fecha ou delimita a estrutura iniciada anteriormente.
249 break;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
250 }Fecha ou delimita a estrutura iniciada anteriormente.
251 } catch (Throwable $e) {}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
252 }Fecha ou delimita a estrutura iniciada anteriormente.
253 Linha em branco usada para separar blocos do arquivo.
254 $out['agenda_url'] = official_agenda_link();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
255 return $out;Retorna o valor indicado pela linha.
256}Fecha ou delimita a estrutura iniciada anteriormente.
257 Linha em branco usada para separar blocos do arquivo.
258$SET = loadSettings($pdo);Atribui o valor ou resultado exibido à variável.
259$AGENDA_LINK = official_agenda_link();Atribui o valor ou resultado exibido à variável.
260$SET['agenda_url'] = $AGENDA_LINK;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
261 Linha em branco usada para separar blocos do arquivo.
262$WPP = 'https://wa.me/' . (strpos($SET['whatsapp'], '55') === 0 ? $SET['whatsapp'] : '55' . d($SET['whatsapp']));Atribui o valor ou resultado exibido à variável.
263$SERVICOS_LINK = '/servicos';Atribui o valor ou resultado exibido à variável.
264$BARBEIRO_LINK = '/corte-cabelo';Atribui o valor ou resultado exibido à variável.
265$PRODUTOS_LINK = '/produtos';Atribui o valor ou resultado exibido à variável.
266$INSTAGRAM_LINK = !empty($instagram_sistema) ? $instagram_sistema : $WPP;Atribui o valor ou resultado exibido à variável.
267if (!defined('UP')) define('UP', rtrim($SET['uploads'] ?? '/sistema/public/uploads/site/', '/') . '/');Avalia a condição escrita nesta linha.
268 Linha em branco usada para separar blocos do arquivo.
269/* ============================================================Comentário existente no código-fonte.
270 SLIDES (topo edge-to-edge)Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
271 ============================================================ */Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
272function loadSlides(?PDO $pdo) {Declara a função e os parâmetros mostrados.
273 $fallback = [[Atribui o valor ou resultado exibido à variável.
274 'img' => UP . 'banner-1.webp',Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
275 'video' => '',Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
276 'titulo'=> 'Prótese Capilar Masculino',Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
277 'texto' => 'Técnica discreta e com acabamento profissional.',Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
278 'link' => official_agenda_link()Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
279 ]];Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
280 Linha em branco usada para separar blocos do arquivo.
281 if (!$pdo) return $fallback;Avalia a condição escrita nesta linha.
282 Linha em branco usada para separar blocos do arquivo.
283 $table = table_exists($pdo, 'site_banners_data') ? 'site_banners_data'Atribui o valor ou resultado exibido à variável.
284 : (table_exists($pdo, 'site_banners') ? 'site_banners'Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
285 : (table_exists($pdo, 'arquivos') ? 'arquivos' : null));Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
286 Linha em branco usada para separar blocos do arquivo.
287 if (!$table) return $fallback;Avalia a condição escrita nesta linha.
288 Linha em branco usada para separar blocos do arquivo.
289 try {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
290 $isData = ($table === 'site_banners_data');Atribui o valor ou resultado exibido à variável.
291 Linha em branco usada para separar blocos do arquivo.
292 $midia = $isDataAtribui o valor ou resultado exibido à variável.
293 ? coalesce_expr($pdo, $table, ['arquivo', 'src', 'caminho', 'midia'], 'src')Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
294 : coalesce_expr($pdo, $table, ['arquivo', 'src', 'caminho', 'link', 'url'], 'src');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
295 Linha em branco usada para separar blocos do arquivo.
296 $titulo = coalesce_expr($pdo, $table, ['titulo', 'nome', 'legenda'], 'titulo');Atribui o valor ou resultado exibido à variável.
297 $texto = coalesce_expr($pdo, $table, ['texto', 'descricao', 'conteudo', 'caption'], 'texto');Atribui o valor ou resultado exibido à variável.
298 $cta = coalesce_expr($pdo, $table, ['btn_url', 'cta_url', 'link_url', 'href', 'url', 'link', 'arquivo_url'], 'cta');Atribui o valor ou resultado exibido à variável.
299 $ordem = col_exists($pdo, $table, 'ordem') ? 'ordem' : (col_exists($pdo, $table, 'posicao') ? 'posicao' : 'id');Atribui o valor ou resultado exibido à variável.
300 Linha em branco usada para separar blocos do arquivo.
301 $wheres = [];Atribui o valor ou resultado exibido à variável.
302 if (col_exists($pdo, $table, 'ativo')) $wheres[] = 'COALESCE(ativo,1)=1';Avalia a condição escrita nesta linha.
303 if (col_exists($pdo, $table, 'registro')) $wheres[] = "registro IN ('home','site','index','banner_home')";Avalia a condição escrita nesta linha.
304 Linha em branco usada para separar blocos do arquivo.
305 $sqlWhere = $wheres ? (' WHERE ' . implode(' AND ', $wheres)) : '';Atribui o valor ou resultado exibido à variável.
306 Linha em branco usada para separar blocos do arquivo.
307 $rows = $pdo->query("SELECT $titulo,$texto,$midia,$cta FROM `$table` $sqlWhere ORDER BY $ordem ASC LIMIT 12")Executa uma consulta pelo objeto PDO.
308 ->fetchAll(PDO::FETCH_ASSOC);Lê dados retornados pela consulta.
309 Linha em branco usada para separar blocos do arquivo.
310 $out = [];Atribui o valor ou resultado exibido à variável.
311 foreach ($rows as $r) {Controla uma repetição conforme a expressão exibida.
312 $src = trim((string)($r['src'] ?? ''));Atribui o valor ou resultado exibido à variável.
313 if ($src === '') continue;Avalia a condição escrita nesta linha.
314 Linha em branco usada para separar blocos do arquivo.
315 if (!preg_match('#^(?:https?:)?//#i', $src) && strpos($src, '/') === false) {Avalia a condição escrita nesta linha.
316 $src = rtrim(UP, '/') . '/' . $src;Atribui o valor ou resultado exibido à variável.
317 }Fecha ou delimita a estrutura iniciada anteriormente.
318 Linha em branco usada para separar blocos do arquivo.
319 $media = resolve_media_src($src);Atribui o valor ou resultado exibido à variável.
320 Linha em branco usada para separar blocos do arquivo.
321 $out[] = [Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
322 'img' => $media['img'],Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
323 'video' => $media['video'],Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
324 'titulo'=> trim((string)($r['titulo'] ?? '')),Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
325 'texto' => trim((string)($r['texto'] ?? '')),Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
326 'link' => canonical_link((string)($r['cta'] ?? '')),Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
327 ];Fecha ou delimita a estrutura iniciada anteriormente.
328 }Fecha ou delimita a estrutura iniciada anteriormente.
329 Linha em branco usada para separar blocos do arquivo.
330 return $out ?: $fallback;Retorna o valor indicado pela linha.
331 } catch (Throwable $e) {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
332 return $fallback;Retorna o valor indicado pela linha.
333 }Fecha ou delimita a estrutura iniciada anteriormente.
334}Fecha ou delimita a estrutura iniciada anteriormente.
335 Linha em branco usada para separar blocos do arquivo.
336$slides = loadSlides($pdo);Atribui o valor ou resultado exibido à variável.
337 Linha em branco usada para separar blocos do arquivo.
338function jacy_fast_img_src(string $src): string {Declara a função e os parâmetros mostrados.
339 $src = trim($src);Atribui o valor ou resultado exibido à variável.
340 if ($src === '' || preg_match('#^(?:https?:)?//#i', $src) || strncmp($src, 'data:', 5) === 0) return $src;Avalia a condição escrita nesta linha.
341 Linha em branco usada para separar blocos do arquivo.
342 $path = parse_url($src, PHP_URL_PATH) ?: $src;Atribui o valor ou resultado exibido à variável.
343 if ($path === '' || preg_match('/\.webp(?:\?.*)?$/i', $path)) return $src;Avalia a condição escrita nesta linha.
344 if (!preg_match('/\.(jpe?g|png)$/i', $path)) return $src;Avalia a condição escrita nesta linha.
345 Linha em branco usada para separar blocos do arquivo.
346 $info = pathinfo($path);Atribui o valor ou resultado exibido à variável.
347 $dir = $info['dirname'] ?? '';Atribui o valor ou resultado exibido à variável.
348 $filename = $info['filename'] ?? '';Atribui o valor ou resultado exibido à variável.
349 if ($filename === '') return $src;Avalia a condição escrita nesta linha.
350 Linha em branco usada para separar blocos do arquivo.
351 $mobileWebp = rtrim($dir, '/') . '/' . $filename . '-mobile.webp';Atribui o valor ou resultado exibido à variável.
352 $webp = rtrim($dir, '/') . '/' . $filename . '.webp';Atribui o valor ou resultado exibido à variável.
353 Linha em branco usada para separar blocos do arquivo.
354 $doc = $_SERVER['DOCUMENT_ROOT'] ?? '';Atribui o valor ou resultado exibido à variável.
355 if ($doc !== '') {Avalia a condição escrita nesta linha.
356 if (is_file($doc . $mobileWebp)) return $mobileWebp;Avalia a condição escrita nesta linha.
357 if (is_file($doc . $webp)) return $webp;Avalia a condição escrita nesta linha.
358 }Fecha ou delimita a estrutura iniciada anteriormente.
359 Linha em branco usada para separar blocos do arquivo.
360 return $src;Retorna o valor indicado pela linha.
361}Fecha ou delimita a estrutura iniciada anteriormente.
362 Linha em branco usada para separar blocos do arquivo.
363$LCP = '';Atribui o valor ou resultado exibido à variável.
364foreach ($slides as $__slide) {Controla uma repetição conforme a expressão exibida.
365 if (!empty($__slide['img'])) {Avalia a condição escrita nesta linha.
366 $LCP = jacy_fast_img_src((string)$__slide['img']);Atribui o valor ou resultado exibido à variável.
367 break;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
368 }Fecha ou delimita a estrutura iniciada anteriormente.
369}Fecha ou delimita a estrutura iniciada anteriormente.
370if ($LCP === '' && !empty($SET['logo_png'])) {Avalia a condição escrita nesta linha.
371 $LCP = fix_path((string)$SET['logo_png']);Atribui o valor ou resultado exibido à variável.
372}Fecha ou delimita a estrutura iniciada anteriormente.
373$LCP_POSTER = $LCP !== '' ? $LCP : '/images/favicon.png';Atribui o valor ou resultado exibido à variável.
374 Linha em branco usada para separar blocos do arquivo.
375/* ============================================================Comentário existente no código-fonte.
376 HERO (Agenda Seletiva, ESQ)Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
377 ============================================================ */Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
378function loadHeroCarousel(?PDO $pdo): array {Declara a função e os parâmetros mostrados.
379 $fallback = [Atribui o valor ou resultado exibido à variável.
380 ['id' => '108YeuHhaFQ', 'titulo' => '', 'subtitulo' => '', 'thumb' => 'https://img.youtube.com/vi/108YeuHhaFQ/hqdefault.jpg'],Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
381 ['id' => '26ZB20BR0E4', 'titulo' => '', 'subtitulo' => '', 'thumb' => 'https://img.youtube.com/vi/26ZB20BR0E4/hqdefault.jpg'],Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
382 ];Fecha ou delimita a estrutura iniciada anteriormente.
383 Linha em branco usada para separar blocos do arquivo.
384 if (!$pdo || !table_exists($pdo, 'site_carrossel')) return $fallback;Avalia a condição escrita nesta linha.
385 Linha em branco usada para separar blocos do arquivo.
386 try {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
387 $sql = "SELECT id, titulo, subtitulo, video_url, thumb, ordem, ativoAtribui o valor ou resultado exibido à variável.
388 FROM site_carrosselLinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
389 WHERE COALESCE(ativo,1)=1Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
390 ORDER BY COALESCE(ordem,0), id";Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
391 Linha em branco usada para separar blocos do arquivo.
392 $rows = $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC);Executa uma consulta pelo objeto PDO.
393 $out = [];Atribui o valor ou resultado exibido à variável.
394 Linha em branco usada para separar blocos do arquivo.
395 foreach ($rows as $r) {Controla uma repetição conforme a expressão exibida.
396 $vid = yt_id((string)$r['video_url']);Atribui o valor ou resultado exibido à variável.
397 if ($vid === '') continue;Avalia a condição escrita nesta linha.
398 Linha em branco usada para separar blocos do arquivo.
399 $thumb = trim((string)($r['thumb'] ?? ''));Atribui o valor ou resultado exibido à variável.
400 if ($thumb !== '') {Avalia a condição escrita nesta linha.
401 if (!preg_match('#^(?:https?:)?//#i', $thumb) && strncmp($thumb, 'data:', 5) !== 0) {Avalia a condição escrita nesta linha.
402 $thumbPath = parse_url($thumb, PHP_URL_PATH) ?: $thumb;Atribui o valor ou resultado exibido à variável.
403 $thumbFile = basename($thumbPath);Atribui o valor ou resultado exibido à variável.
404 $thumb = '/sistema/painel/paginas/site/uploads_carrossel/' . $thumbFile;Atribui o valor ou resultado exibido à variável.
405 }Fecha ou delimita a estrutura iniciada anteriormente.
406 } else {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
407 $thumb = "https://img.youtube.com/vi/$vid/hqdefault.jpg";Atribui o valor ou resultado exibido à variável.
408 }Fecha ou delimita a estrutura iniciada anteriormente.
409 Linha em branco usada para separar blocos do arquivo.
410 $out[] = [Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
411 'id' => $vid,Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
412 'thumb' => $thumb,Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
413 'titulo' => trim((string)($r['titulo'] ?? '')),Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
414 'subtitulo' => trim((string)($r['subtitulo'] ?? '')),Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
415 ];Fecha ou delimita a estrutura iniciada anteriormente.
416 }Fecha ou delimita a estrutura iniciada anteriormente.
417 Linha em branco usada para separar blocos do arquivo.
418 return $out ?: $fallback;Retorna o valor indicado pela linha.
419 } catch (Throwable $e) {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
420 return $fallback;Retorna o valor indicado pela linha.
421 }Fecha ou delimita a estrutura iniciada anteriormente.
422}Fecha ou delimita a estrutura iniciada anteriormente.
423 Linha em branco usada para separar blocos do arquivo.
424$HERO = loadHeroCarousel($pdo);Atribui o valor ou resultado exibido à variável.
425 Linha em branco usada para separar blocos do arquivo.
426/* ============================================================Comentário existente no código-fonte.
427 SERVIÇOSLinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
428 ============================================================ */Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
429function loadServices(?PDO $pdo): array {Declara a função e os parâmetros mostrados.
430 if (!$pdo) return [];Avalia a condição escrita nesta linha.
431 Linha em branco usada para separar blocos do arquivo.
432 $cands = [Atribui o valor ou resultado exibido à variável.
433 ['t' => 'servicos', 'title' => ['titulo', 'nome'], 'desc' => ['descricao', 'texto', 'resumo'], 'preco' => ['preco', 'valor'], 'img' => ['capa', 'img', 'imagem', 'thumb'], 'link' => ['link', 'url', 'slug'], 'ativo' => ['ativo', 'status']],Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
434 ['t' => 'produtos_servicos', 'title' => ['titulo', 'nome'], 'desc' => ['descricao', 'texto'], 'preco' => ['preco', 'valor'], 'img' => ['imagem', 'capa'], 'link' => ['url', 'slug'], 'ativo' => ['ativo', 'status']],Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
435 ['t' => 'servicos_site', 'title' => ['titulo', 'nome'], 'desc' => ['descricao', 'texto'], 'preco' => ['preco', 'valor'], 'img' => ['imagem', 'capa'], 'link' => ['url', 'slug'], 'ativo' => ['ativo', 'status']],Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
436 ];Fecha ou delimita a estrutura iniciada anteriormente.
437 Linha em branco usada para separar blocos do arquivo.
438 foreach ($cands as $c) {Controla uma repetição conforme a expressão exibida.
439 if (!table_exists($pdo, $c['t'])) continue;Avalia a condição escrita nesta linha.
440 Linha em branco usada para separar blocos do arquivo.
441 try {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
442 $title = coalesce_expr($pdo, $c['t'], $c['title'], 'titulo');Atribui o valor ou resultado exibido à variável.
443 $desc = coalesce_expr($pdo, $c['t'], $c['desc'], 'descricao');Atribui o valor ou resultado exibido à variável.
444 $preco = coalesce_expr($pdo, $c['t'], $c['preco'], 'preco');Atribui o valor ou resultado exibido à variável.
445 $img = coalesce_expr($pdo, $c['t'], $c['img'], 'img');Atribui o valor ou resultado exibido à variável.
446 $link = coalesce_expr($pdo, $c['t'], $c['link'], 'link');Atribui o valor ou resultado exibido à variável.
447 Linha em branco usada para separar blocos do arquivo.
448 $ativoCol = null;Atribui o valor ou resultado exibido à variável.
449 foreach ($c['ativo'] as $ac) {Controla uma repetição conforme a expressão exibida.
450 if (col_exists($pdo, $c['t'], $ac)) {Avalia a condição escrita nesta linha.
451 $ativoCol = $ac;Atribui o valor ou resultado exibido à variável.
452 break;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
453 }Fecha ou delimita a estrutura iniciada anteriormente.
454 }Fecha ou delimita a estrutura iniciada anteriormente.
455 Linha em branco usada para separar blocos do arquivo.
456 $where = $ativoCol ? "WHERE COALESCE($ativoCol,1)=1" : "";Atribui o valor ou resultado exibido à variável.
457 $sql = "SELECT $title,$desc,$preco,$img,$link FROM `{$c['t']}` $where ORDER BY 1 LIMIT 12";Atribui o valor ou resultado exibido à variável.
458 $rows = $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC);Executa uma consulta pelo objeto PDO.
459 Linha em branco usada para separar blocos do arquivo.
460 if (!$rows) continue;Avalia a condição escrita nesta linha.
461 Linha em branco usada para separar blocos do arquivo.
462 $out = [];Atribui o valor ou resultado exibido à variável.
463 foreach ($rows as $r) {Controla uma repetição conforme a expressão exibida.
464 $imgSrc = trim((string)($r['img'] ?? ''));Atribui o valor ou resultado exibido à variável.
465 if ($imgSrc === '') continue;Avalia a condição escrita nesta linha.
466 Linha em branco usada para separar blocos do arquivo.
467 $path = parse_url($imgSrc, PHP_URL_PATH) ?: '';Atribui o valor ou resultado exibido à variável.
468 $ext = strtolower(pathinfo($path, PATHINFO_EXTENSION));Atribui o valor ou resultado exibido à variável.
469 $isImg = in_array($ext, ['jpg', 'jpeg', 'png', 'webp', 'gif'], true);Atribui o valor ou resultado exibido à variável.
470 $isVideo = in_array($ext, ['mp4', 'webm', 'ogg'], true);Atribui o valor ou resultado exibido à variável.
471 Linha em branco usada para separar blocos do arquivo.
472 if (!$isImg && !$isVideo) continue;Avalia a condição escrita nesta linha.
473 Linha em branco usada para separar blocos do arquivo.
474 if (!preg_match('#^https?://#i', $imgSrc) && ($imgSrc[0] ?? '') !== '/') {Avalia a condição escrita nesta linha.
475 if (preg_match('#^/?paginas/#', $imgSrc)) {Avalia a condição escrita nesta linha.
476 $imgSrc = '/sistema/painel/' . ltrim($imgSrc, '/');Atribui o valor ou resultado exibido à variável.
477 } else {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
478 $imgSrc = '/' . ltrim($imgSrc, '/');Atribui o valor ou resultado exibido à variável.
479 }Fecha ou delimita a estrutura iniciada anteriormente.
480 }Fecha ou delimita a estrutura iniciada anteriormente.
481 Linha em branco usada para separar blocos do arquivo.
482 $out[] = [Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
483 'img' => $isImg ? $imgSrc : '',Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
484 'video' => $isVideo ? $imgSrc : '',Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
485 'titulo' => trim((string)($r['titulo'] ?? '')),Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
486 'descricao' => trim((string)($r['descricao'] ?? '')),Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
487 'preco' => trim((string)($r['preco'] ?? '')),Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
488 'link' => canonical_link((string)($r['link'] ?? '')),Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
489 ];Fecha ou delimita a estrutura iniciada anteriormente.
490 }Fecha ou delimita a estrutura iniciada anteriormente.
491 Linha em branco usada para separar blocos do arquivo.
492 return $out;Retorna o valor indicado pela linha.
493 } catch (Throwable $e) {}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
494 }Fecha ou delimita a estrutura iniciada anteriormente.
495 Linha em branco usada para separar blocos do arquivo.
496 return [];Retorna o valor indicado pela linha.
497}Fecha ou delimita a estrutura iniciada anteriormente.
498 Linha em branco usada para separar blocos do arquivo.
499$servicos = loadServices($pdo);Atribui o valor ou resultado exibido à variável.
500 Linha em branco usada para separar blocos do arquivo.
501/* ============================================================Comentário existente no código-fonte.
502 GALERIALinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
503 ============================================================ */Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
504if (!function_exists('galeria_resolve_img')) {Avalia a condição escrita nesta linha.
505 function galeria_resolve_img(string $nome): string {Declara a função e os parâmetros mostrados.
506 $nome = trim($nome);Atribui o valor ou resultado exibido à variável.
507 if ($nome === '') return '';Avalia a condição escrita nesta linha.
508 Linha em branco usada para separar blocos do arquivo.
509 $maybe = fix_path($nome);Atribui o valor ou resultado exibido à variável.
510 $absMaybe = $_SERVER['DOCUMENT_ROOT'] . (parse_url($maybe, PHP_URL_PATH) ?? $maybe);Atribui o valor ou resultado exibido à variável.
511 if (is_file($absMaybe)) return (parse_url($maybe, PHP_URL_PATH) ?? $maybe);Avalia a condição escrita nesta linha.
512 Linha em branco usada para separar blocos do arquivo.
513 $nome = basename($nome);Atribui o valor ou resultado exibido à variável.
514 $roots = [Atribui o valor ou resultado exibido à variável.
515 $_SERVER['DOCUMENT_ROOT'] . "/sistema/painel/img/foto_admin/$nome",Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
516 $_SERVER['DOCUMENT_ROOT'] . "/sistema/painel/img/fotos/$nome",Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
517 $_SERVER['DOCUMENT_ROOT'] . "/sistema/painel/img/galeria/$nome",Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
518 $_SERVER['DOCUMENT_ROOT'] . "/sistema/public/uploads/site/$nome",Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
519 $_SERVER['DOCUMENT_ROOT'] . "/sistema/img/$nome",Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
520 ];Fecha ou delimita a estrutura iniciada anteriormente.
521 Linha em branco usada para separar blocos do arquivo.
522 foreach ($roots as $abs) {Controla uma repetição conforme a expressão exibida.
523 if (is_file($abs)) return str_replace($_SERVER['DOCUMENT_ROOT'], '', $abs);Avalia a condição escrita nesta linha.
524 }Fecha ou delimita a estrutura iniciada anteriormente.
525 Linha em branco usada para separar blocos do arquivo.
526 return "/sistema/painel/img/foto_admin/sem-foto.jpg";Retorna o valor indicado pela linha.
527 }Fecha ou delimita a estrutura iniciada anteriormente.
528}Fecha ou delimita a estrutura iniciada anteriormente.
529 Linha em branco usada para separar blocos do arquivo.
530if (!function_exists('galeria_load_rows')) {Avalia a condição escrita nesta linha.
531 function galeria_load_rows(?PDO $pdo): array {Declara a função e os parâmetros mostrados.
532 if (!$pdo) return [];Avalia a condição escrita nesta linha.
533 Linha em branco usada para separar blocos do arquivo.
534 try {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
535 $sql = "SELECT id, titulo, imagem FROM foto_admin ORDER BY data_cad DESC, id DESC";Atribui o valor ou resultado exibido à variável.
536 $rows = $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC);Executa uma consulta pelo objeto PDO.
537 $out = [];Atribui o valor ou resultado exibido à variável.
538 Linha em branco usada para separar blocos do arquivo.
539 foreach ($rows as $r) {Controla uma repetição conforme a expressão exibida.
540 $src = galeria_resolve_img((string)($r['imagem'] ?? ''));Atribui o valor ou resultado exibido à variável.
541 if ($src !== '') {Avalia a condição escrita nesta linha.
542 $out[] = [Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
543 'titulo' => trim((string)($r['titulo'] ?? '')),Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
544 'src' => $srcLinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
545 ];Fecha ou delimita a estrutura iniciada anteriormente.
546 }Fecha ou delimita a estrutura iniciada anteriormente.
547 }Fecha ou delimita a estrutura iniciada anteriormente.
548 Linha em branco usada para separar blocos do arquivo.
549 return $out;Retorna o valor indicado pela linha.
550 } catch (Throwable $e) {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
551 return [];Retorna o valor indicado pela linha.
552 }Fecha ou delimita a estrutura iniciada anteriormente.
553 }Fecha ou delimita a estrutura iniciada anteriormente.
554}Fecha ou delimita a estrutura iniciada anteriormente.
555 Linha em branco usada para separar blocos do arquivo.
556$GALERIA_ROWS = galeria_load_rows($pdo);Atribui o valor ou resultado exibido à variável.
557 Linha em branco usada para separar blocos do arquivo.
558/* ============================================================Comentário existente no código-fonte.
559 HTMLLinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
560 ============================================================ */Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
561?>Fecha o bloco PHP.
562<!doctype html>Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
563<html lang="pt-BR">Marca HTML presente na saída da página.
564<head>Marca HTML presente na saída da página.
565 Linha em branco usada para separar blocos do arquivo.
566 <!-- Meta Pixel Code otimizado: carrega somente após load/interação para não travar a renderização inicial -->Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
567<script>Marca HTML presente na saída da página.
568(function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
569 var pixelLoaded = false;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
570 function loadMetaPixel(){Declara a função e os parâmetros mostrados.
571 if (pixelLoaded) return;Avalia a condição escrita nesta linha.
572 pixelLoaded = true;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
573 !function(f,b,e,v,n,t,s){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
574 if(f.fbq)return;n=f.fbq=function(){n.callMethod?n.callMethod.apply(n,arguments):n.queue.push(arguments)};Avalia a condição escrita nesta linha.
575 if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';Avalia a condição escrita nesta linha.
576 n.queue=[];t=b.createElement(e);t.async=!0;t.src=v;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
577 s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
578 }(window, document,'script','https://connect.facebook.net/en_US/fbevents.js');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
579 fbq('init', '957398226898063');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
580 fbq('track', 'PageView');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
581 }Fecha ou delimita a estrutura iniciada anteriormente.
582 window.jacyLoadMetaPixel = loadMetaPixel;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
583 window.addEventListener('load', function(){ setTimeout(loadMetaPixel, 6000); }, {once:true});Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
584 document.addEventListener('pointerdown', loadMetaPixel, {once:true, passive:true});Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
585 document.addEventListener('keydown', loadMetaPixel, {once:true});Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
586 document.addEventListener('touchstart', loadMetaPixel, {once:true, passive:true});Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
587 document.addEventListener('scroll', loadMetaPixel, {once:true, passive:true});Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
588})();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
589</script>Marca HTML presente na saída da página.
590<noscript><img height="1" width="1" style="display:none" src="https://www.facebook.com/tr?id=957398226898063&ev=PageView&noscript=1" alt=""></noscript>Marca HTML presente na saída da página.
591<!-- End Meta Pixel Code otimizado -->Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
592 Linha em branco usada para separar blocos do arquivo.
593<!-- Google tag (gtag.js) -->Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
594 <link rel="dns-prefetch" href="//www.googletagmanager.com">Marca HTML presente na saída da página.
595 <script>Marca HTML presente na saída da página.
596 window.dataLayer = window.dataLayer || [];Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
597 function gtag(){dataLayer.push(arguments);}Declara a função e os parâmetros mostrados.
598 Linha em branco usada para separar blocos do arquivo.
599 (function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
600 var gtagLoaded = false;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
601 Linha em branco usada para separar blocos do arquivo.
602 function loadGtag(){Declara a função e os parâmetros mostrados.
603 if (gtagLoaded) return;Avalia a condição escrita nesta linha.
604 gtagLoaded = true;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
605 Linha em branco usada para separar blocos do arquivo.
606 var s = document.createElement('script');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
607 s.src = 'https://www.googletagmanager.com/gtag/js?id=AW-10875176701';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
608 s.async = true;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
609 document.head.appendChild(s);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
610 Linha em branco usada para separar blocos do arquivo.
611 gtag('js', new Date());Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
612 gtag('config', 'AW-10875176701');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
613 }Fecha ou delimita a estrutura iniciada anteriormente.
614 Linha em branco usada para separar blocos do arquivo.
615 window.loadGtag = loadGtag;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
616 Linha em branco usada para separar blocos do arquivo.
617 window.addEventListener('load', function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
618 setTimeout(loadGtag, 6000);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
619 }, { once:true });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
620 Linha em branco usada para separar blocos do arquivo.
621 document.addEventListener('pointerdown', loadGtag, { once:true, passive:true });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
622 document.addEventListener('keydown', loadGtag, { once:true });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
623 document.addEventListener('touchstart', loadGtag, { once:true, passive:true });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
624 })();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
625 </script>Marca HTML presente na saída da página.
626 Linha em branco usada para separar blocos do arquivo.
627 <?phpAbre um bloco PHP executado no servidor.
628 $scheme = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') ? 'https://' : 'http://';Atribui o valor ou resultado exibido à variável.
629 $httpHost = $_SERVER['HTTP_HOST'] ?? 'jacycabeleireiro.com';Atribui o valor ou resultado exibido à variável.
630 $requestUri = $_SERVER['REQUEST_URI'] ?? '/protese';Atribui o valor ou resultado exibido à variável.
631 $path = parse_url($requestUri, PHP_URL_PATH) ?: '/protese';Atribui o valor ou resultado exibido à variável.
632 Linha em branco usada para separar blocos do arquivo.
633 $canonical = rtrim($scheme . $httpHost . $path, '/');Atribui o valor ou resultado exibido à variável.
634 if ($canonical === rtrim($scheme . $httpHost, '/')) {Avalia a condição escrita nesta linha.
635 $canonical = rtrim($scheme . $httpHost, '/') . '/';Atribui o valor ou resultado exibido à variável.
636 }Fecha ou delimita a estrutura iniciada anteriormente.
637 Linha em branco usada para separar blocos do arquivo.
638 $metaTitle = !empty($meta_title)Atribui o valor ou resultado exibido à variável.
639 ? $meta_titleLinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
640 : 'Prótese Capilar em Cascavel | Jacy Cabeleireiro';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
641 Linha em branco usada para separar blocos do arquivo.
642 $metaDescription = !empty($meta_description)Atribui o valor ou resultado exibido à variável.
643 ? $meta_descriptionLinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
644 : 'Prótese capilar em Cascavel com avaliação profissional, aplicação, manutenção e acabamento natural. Agende seu atendimento com Jacy Cabeleireiro.';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
645 Linha em branco usada para separar blocos do arquivo.
646 $metaKeywords = !empty($meta_keywords)Atribui o valor ou resultado exibido à variável.
647 ? $meta_keywordsLinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
648 : 'prótese capilar em Cascavel, manutenção de prótese capilar, prótese capilar masculina, cabeleireiro em Cascavel, barbeiro em Cascavel';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
649 Linha em branco usada para separar blocos do arquivo.
650 $faviconSeoFile = __DIR__ . '/images/favicon.png';Atribui o valor ou resultado exibido à variável.
651 $faviconSeoUrl = '/images/favicon.png';Atribui o valor ou resultado exibido à variável.
652 $faviconPadrao = 'images/' . ltrim((string)($icone_site ?? ''), '/');Atribui o valor ou resultado exibido à variável.
653 $faviconUrl = is_file($faviconSeoFile) ? $faviconSeoUrl : $faviconPadrao;Atribui o valor ou resultado exibido à variável.
654 Linha em branco usada para separar blocos do arquivo.
655 $siteName = !empty($SET['nome']) ? $SET['nome'] : 'Jacy Cabeleireiro';Atribui o valor ou resultado exibido à variável.
656 $ogImagePath = !empty($SET['logo_png']) ? $SET['logo_png'] : $faviconUrl;Atribui o valor ou resultado exibido à variável.
657 if (!preg_match('#^(https?:)?//#i', $ogImagePath)) {Avalia a condição escrita nesta linha.
658 $ogImage = $scheme . $httpHost . '/' . ltrim($ogImagePath, '/');Atribui o valor ou resultado exibido à variável.
659 } else {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
660 $ogImage = $ogImagePath;Atribui o valor ou resultado exibido à variável.
661 }Fecha ou delimita a estrutura iniciada anteriormente.
662 Linha em branco usada para separar blocos do arquivo.
663 $serviceSchema = [Atribui o valor ou resultado exibido à variável.
664 '@context' => 'https://schema.org',Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
665 '@type' => 'Service',Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
666 'name' => 'Prótese Capilar em Cascavel',Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
667 'serviceType' => 'Prótese Capilar',Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
668 'description' => $metaDescription,Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
669 'url' => $canonical,Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
670 'provider' => [Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
671 '@type' => 'HairSalon',Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
672 'name' => $siteName,Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
673 'url' => rtrim($scheme . $httpHost, '/') . '/',Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
674 'image' => $ogImage,Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
675 'areaServed' => [Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
676 '@type' => 'City',Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
677 'name' => 'Cascavel'Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
678 ]Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
679 ]Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
680 ];Fecha ou delimita a estrutura iniciada anteriormente.
681 Linha em branco usada para separar blocos do arquivo.
682 if (!empty($SET['telefone'])) {Avalia a condição escrita nesta linha.
683 $serviceSchema['provider']['telephone'] = $SET['telefone'];Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
684 }Fecha ou delimita a estrutura iniciada anteriormente.
685 ?>Fecha o bloco PHP.
686 Linha em branco usada para separar blocos do arquivo.
687 <meta charset="utf-8">Marca HTML presente na saída da página.
688 <meta http-equiv="x-dns-prefetch-control" content="on">Marca HTML presente na saída da página.
689 <meta name="viewport" content="width=device-width,initial-scale=1">Marca HTML presente na saída da página.
690 <title><?=h($metaTitle)?></title>Marca HTML presente na saída da página.
691 <meta name="description" content="<?=h($metaDescription)?>">Marca HTML presente na saída da página.
692 <meta name="keywords" content="<?=h($metaKeywords)?>">Marca HTML presente na saída da página.
693 <meta name="author" content="Jacy Cordeiro">Marca HTML presente na saída da página.
694 <meta name="theme-color" content="#05070a">Marca HTML presente na saída da página.
695 <link rel="icon" type="image/png" sizes="48x48" href="<?=h($faviconUrl)?>">Marca HTML presente na saída da página.
696 <link rel="shortcut icon" href="<?=h($faviconUrl)?>" type="image/x-icon">Marca HTML presente na saída da página.
697 <link rel="apple-touch-icon" href="<?=h($faviconUrl)?>">Marca HTML presente na saída da página.
698 <meta name="robots" content="index,follow,max-image-preview:large">Marca HTML presente na saída da página.
699 <link rel="canonical" href="<?=h($canonical)?>">Marca HTML presente na saída da página.
700 Linha em branco usada para separar blocos do arquivo.
701 <meta property="og:type" content="website">Marca HTML presente na saída da página.
702 <meta property="og:locale" content="pt_BR">Marca HTML presente na saída da página.
703 <meta property="og:site_name" content="<?=h($siteName)?>">Marca HTML presente na saída da página.
704 <meta property="og:title" content="<?=h($metaTitle)?>">Marca HTML presente na saída da página.
705 <meta property="og:description" content="<?=h($metaDescription)?>">Marca HTML presente na saída da página.
706 <meta property="og:url" content="<?=h($canonical)?>">Marca HTML presente na saída da página.
707 <meta property="og:image" content="<?=h($ogImage)?>">Marca HTML presente na saída da página.
708 <meta name="twitter:card" content="summary_large_image">Marca HTML presente na saída da página.
709 <meta name="twitter:title" content="<?=h($metaTitle)?>">Marca HTML presente na saída da página.
710 <meta name="twitter:description" content="<?=h($metaDescription)?>">Marca HTML presente na saída da página.
711 <meta name="twitter:image" content="<?=h($ogImage)?>">Marca HTML presente na saída da página.
712 Linha em branco usada para separar blocos do arquivo.
713 <script type="application/ld+json"><?=json_encode($serviceSchema, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES)?></script>Converte dados para JSON.
714 <link rel="dns-prefetch" href="//cdn.jsdelivr.net">Marca HTML presente na saída da página.
715 <link rel="dns-prefetch" href="//connect.facebook.net">Marca HTML presente na saída da página.
716 Linha em branco usada para separar blocos do arquivo.
717 <?php if ($LCP):Abre um bloco PHP executado no servidor.
718 $isExt = preg_match('#^https?://#i', $LCP);Atribui o valor ou resultado exibido à variável.
719 ?>Fecha o bloco PHP.
720 <link rel="preload" as="image" href="<?=h($LCP)?>" fetchpriority="high" <?= $isExt ? 'crossorigin' : ''?>>Marca HTML presente na saída da página.
721 <?php endif; ?>Abre um bloco PHP executado no servidor.
722 <?phpAbre um bloco PHP executado no servidor.
723 $___recaptcha_file = $_SERVER['DOCUMENT_ROOT'] . '/config/recaptcha.php';Atribui o valor ou resultado exibido à variável.
724 if (is_file($___recaptcha_file)) {Avalia a condição escrita nesta linha.
725 require_once $___recaptcha_file;Carrega o arquivo ou a dependência indicada na própria linha.
726 }Fecha ou delimita a estrutura iniciada anteriormente.
727 $___site_key = defined('RECAPTCHA_SITE_KEY') ? RECAPTCHA_SITE_KEY : '';Atribui o valor ou resultado exibido à variável.
728 ?>Fecha o bloco PHP.
729 <script>window.RECAPTCHA_SITE_KEY="<?=h($___site_key)?>";</script>Marca HTML presente na saída da página.
730 <?phpAbre um bloco PHP executado no servidor.
731 $indexCssFile = __DIR__ . '/css/index.css';Atribui o valor ou resultado exibido à variável.
732 $indexCssVersion = file_exists($indexCssFile) ? filemtime($indexCssFile) : time();Atribui o valor ou resultado exibido à variável.
733?>Fecha o bloco PHP.
734<!-- V7: carrega os CSS essenciais imediatamente para não quebrar carrossel, grid, menu e rodapé -->Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
735<link rel="stylesheet" href="/css/bootstrap.css?v=<?php echo (int)$indexCssVersion; ?>">Marca HTML presente na saída da página.
736<link rel="stylesheet" href="/css/style.css?v=<?php echo (int)$indexCssVersion; ?>">Marca HTML presente na saída da página.
737<link rel="stylesheet" href="/css/responsive.css?v=<?php echo (int)$indexCssVersion; ?>">Marca HTML presente na saída da página.
738<link rel="stylesheet" href="/css/font-awesome.min.css?v=<?php echo (int)$indexCssVersion; ?>">Marca HTML presente na saída da página.
739<link rel="stylesheet" href="/css/index.css?v=<?php echo (int)$indexCssVersion; ?>">Marca HTML presente na saída da página.
740<link rel="stylesheet" href="/css/protese-google-ads.css?v=<?php echo (int)$indexCssVersion; ?>">Marca HTML presente na saída da página.
741<noscript>Marca HTML presente na saída da página.
742 <link rel="stylesheet" href="/css/bootstrap.css">Marca HTML presente na saída da página.
743 <link rel="stylesheet" href="/css/style.css">Marca HTML presente na saída da página.
744 <link rel="stylesheet" href="/css/responsive.css">Marca HTML presente na saída da página.
745 <link rel="stylesheet" href="/css/font-awesome.min.css">Marca HTML presente na saída da página.
746 <link rel="stylesheet" href="/css/index.css">Marca HTML presente na saída da página.
747 <link rel="stylesheet" href="/css/protese-google-ads.css">Marca HTML presente na saída da página.
748</noscript>Marca HTML presente na saída da página.
749<style>Marca HTML presente na saída da página.
750 Linha em branco usada para separar blocos do arquivo.
751 /* ============================================================Comentário existente no código-fonte.
752 PATCH V7 - correção visual seguraLinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
753 Objetivo: evitar carrossel empilhado e rodapé sem grid quandoLinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
754 a página /protese usa cabeçalho parcial otimizado.Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
755 Não altera consultas, formulários, banco, links ou lógica PHP.Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
756 ============================================================ */Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
757 .carousel{position:relative;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
758 .carousel-inner{position:relative;width:100%;overflow:hidden;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
759 .carousel-item{position:relative;display:none;width:100%;backface-visibility:hidden;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
760 .carousel-item.active{display:block!important;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
761 .slider_section .carousel-inner{overflow:hidden!important;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
762 .slider_section .carousel-item:not(.active){display:none!important;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
763 .slider_section .carousel-item.active{display:block!important;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
764 .slider_section .carousel-item > div{width:100%;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
765 .footer_section .container{width:100%;max-width:1140px;margin-right:auto;margin-left:auto;padding-right:15px;padding-left:15px;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
766 .footer_section .row{display:flex;flex-wrap:wrap;margin-right:-15px;margin-left:-15px;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
767 .footer_section [class*="col-"]{position:relative;width:100%;padding-right:15px;padding-left:15px;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
768 .footer_section .form-control{display:block;width:100%;height:calc(1.5em + .75rem + 2px);padding:.375rem .75rem;font-size:1rem;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
769 .footer_section .btn{display:inline-block;font-weight:700;text-align:center;vertical-align:middle;cursor:pointer;border:1px solid transparent;padding:.55rem .85rem;border-radius:.25rem;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
770 .footer_section .btn-block{display:block;width:100%;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
771 @media (min-width:768px){.footer_section .col-md-5{flex:0 0 41.666667%;max-width:41.666667%;}.footer_section .col-md-6{flex:0 0 50%;max-width:50%;}.footer_section .col-md-7{flex:0 0 58.333333%;max-width:58.333333%;}}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
772 @media (min-width:992px){.footer_section .col-lg-3{flex:0 0 25%;max-width:25%;}.footer_section .col-lg-4{flex:0 0 33.333333%;max-width:33.333333%;}.footer_section .col-lg-5{flex:0 0 41.666667%;max-width:41.666667%;}}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
773 Linha em branco usada para separar blocos do arquivo.
774 /* ============================================================Comentário existente no código-fonte.
775 PAGESPEED V6 - crítico da /proteseLinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
776 Mantém a lógica e reduz bloqueio, CLS e reflow no mobile.Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
777 ============================================================ */Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
778 *,*::before,*::after{box-sizing:border-box;}Comentário existente no código-fonte.
779 img,video,iframe{max-width:100%;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
780 .jacy-header-lite{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
781 position:sticky!important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
782 top:0;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
783 left:0;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
784 right:0;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
785 z-index:10000;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
786 min-height:84px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
787 padding:10px 0;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
788 background:rgba(0,0,0,.96);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
789 box-shadow:0 8px 22px rgba(0,0,0,.18);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
790 }Fecha ou delimita a estrutura iniciada anteriormente.
791 .jacy-header-lite .container{width:100%;max-width:1140px;margin:0 auto;padding:0 15px;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
792 .jacy-header-lite .navbar{display:flex;align-items:center;justify-content:space-between;gap:18px;padding:0;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
793 .jacy-header-lite .navbar-brand{display:inline-flex;align-items:center;flex:0 0 auto;text-decoration:none;color:#fff;font-weight:800;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
794 .jacy-header-lite .navbar-brand img{display:block;width:80px;height:54px;object-fit:contain;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
795 .jacy-header-lite .navbar-collapse{display:flex;align-items:center;justify-content:flex-end;flex:1 1 auto;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
796 .jacy-header-lite .navbar-nav{display:flex;align-items:center;gap:6px;margin:0 0 0 auto;padding:0;list-style:none;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
797 .jacy-header-lite .nav-link{display:block;color:#fff;text-decoration:none;text-transform:uppercase;font-weight:800;font-size:15px;line-height:1.25;padding:10px 13px;border-radius:8px;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
798 .jacy-header-lite .nav-link:hover,.jacy-header-lite .nav-link:focus{color:#d1aa57;background:rgba(209,170,87,.08);}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
799 .jacy-header-lite .navbar-toggler{display:none;width:44px;height:40px;border:0;background:transparent;padding:0;cursor:pointer;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
800 .jacy-header-lite .navbar-toggler span,.jacy-header-lite .navbar-toggler span::before,.jacy-header-lite .navbar-toggler span::after{display:block;width:34px;height:4px;background:#fff;border-radius:8px;content:"";position:relative;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
801 .jacy-header-lite .navbar-toggler span::before{position:absolute;top:-10px;left:0;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
802 .jacy-header-lite .navbar-toggler span::after{position:absolute;top:10px;left:0;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
803 .jacy-header-lite .dropdown{position:relative;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
804 .jacy-header-lite .dropdown-menu{display:none;position:absolute;top:100%;left:0;min-width:220px;padding:8px 0;margin:4px 0 0;background:#080808;border:1px solid rgba(209,170,87,.25);border-radius:12px;box-shadow:0 14px 30px rgba(0,0,0,.35);z-index:10001;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
805 .jacy-header-lite .dropdown-menu.show{display:block;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
806 .jacy-header-lite .dropdown-item{display:block;color:#fff;text-decoration:none;padding:10px 16px;font-weight:700;white-space:nowrap;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
807 .jacy-header-lite .dropdown-item:hover{background:rgba(209,170,87,.16);color:#d1aa57;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
808 .jacy-header-lite .dropdown-divider{height:1px;background:rgba(255,255,255,.09);margin:4px 0;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
809 .slider_section .carousel-inner,.slider_section .carousel-item{min-height:720px;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
810 #agenda-seletiva{min-height:620px;}Comentário existente no código-fonte.
811 .modal{position:fixed;inset:0;z-index:10050;display:none;overflow:auto;background:rgba(0,0,0,.45);}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
812 .modal.show{display:block;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
813 .modal-dialog{position:relative;width:auto;margin:1.5rem auto;pointer-events:none;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
814 .modal-content{position:relative;display:flex;flex-direction:column;width:100%;pointer-events:auto;background:#fff;border-radius:12px;outline:0;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
815 .modal-backdrop{position:fixed;inset:0;background:rgba(0,0,0,.65);z-index:10040;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
816 @media (max-width:991px){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
817 .jacy-header-lite{min-height:74px;padding:8px 0;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
818 .jacy-header-lite .navbar-brand img{width:72px;height:48px;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
819 .jacy-header-lite .navbar-toggler{display:grid;place-items:center;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
820 .jacy-header-lite .navbar-collapse{display:none;position:absolute;top:100%;left:0;right:0;background:#050505;border-top:1px solid rgba(209,170,87,.22);padding:12px 15px;box-shadow:0 16px 30px rgba(0,0,0,.35);}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
821 .jacy-header-lite .navbar-collapse.show{display:block;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
822 .jacy-header-lite .navbar-nav{display:block;margin:0;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
823 .jacy-header-lite .nav-link{text-align:left;padding:12px 8px;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
824 .jacy-header-lite .dropdown-menu{position:static;min-width:0;margin:5px 0 8px;box-shadow:none;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
825 .slider_section .carousel-inner,.slider_section .carousel-item,.slider_section .carousel-item > div{min-height:560px!important;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
826 #agenda-seletiva{min-height:760px;}Comentário existente no código-fonte.
827 #agenda-seletiva>div{grid-template-columns:1fr!important;padding-top:44px!important;padding-bottom:44px!important;}Comentário existente no código-fonte.
828 }Fecha ou delimita a estrutura iniciada anteriormente.
829 Linha em branco usada para separar blocos do arquivo.
830 :root{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
831 --bg:#0b0b0d;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
832 --card:#1a1c23;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
833 --text:#e9e9ee;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
834 --muted:#d2d6de;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
835 --brand:#2d86ff;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
836 }Fecha ou delimita a estrutura iniciada anteriormente.
837 Linha em branco usada para separar blocos do arquivo.
838 html,Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
839 body{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
840 margin:0;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
841 background:var(--bg);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
842 color:var(--text);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
843 }Fecha ou delimita a estrutura iniciada anteriormente.
844 Linha em branco usada para separar blocos do arquivo.
845 body{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
846 overflow-x:hidden;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
847 }Fecha ou delimita a estrutura iniciada anteriormente.
848 Linha em branco usada para separar blocos do arquivo.
849 main{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
850 display:block;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
851 margin:0;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
852 padding:0;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
853 background:#020202;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
854 }Fecha ou delimita a estrutura iniciada anteriormente.
855 Linha em branco usada para separar blocos do arquivo.
856 .sr-only{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
857 position:absolute !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
858 width:1px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
859 height:1px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
860 padding:0 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
861 margin:-1px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
862 overflow:hidden !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
863 clip:rect(0,0,0,0) !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
864 white-space:nowrap !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
865 border:0 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
866 }Fecha ou delimita a estrutura iniciada anteriormente.
867 Linha em branco usada para separar blocos do arquivo.
868 .grecaptcha-badge{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
869 z-index:2147483647;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
870 }Fecha ou delimita a estrutura iniciada anteriormente.
871 Linha em branco usada para separar blocos do arquivo.
872 main > section:not(.slider_section),Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
873 #agenda-seletiva,Comentário existente no código-fonte.
874 #galeria-banco,Comentário existente no código-fonte.
875 .experience-section,Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
876 #depoimentos{Comentário existente no código-fonte.
877 content-visibility:auto;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
878 contain-intrinsic-size:900px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
879 }Fecha ou delimita a estrutura iniciada anteriormente.
880 Linha em branco usada para separar blocos do arquivo.
881 /* Banner padrão do sistema */Comentário existente no código-fonte.
882 .slider_section{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
883 position:relative;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
884 display:block !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
885 margin:0 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
886 padding:0 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
887 background:#000 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
888 overflow:hidden;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
889 }Fecha ou delimita a estrutura iniciada anteriormente.
890 Linha em branco usada para separar blocos do arquivo.
891 .slider_section #customCarouselProtese{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
892 position:relative !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
893 width:100%;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
894 background:#000;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
895 }Fecha ou delimita a estrutura iniciada anteriormente.
896 Linha em branco usada para separar blocos do arquivo.
897 .slider_section #customCarouselProtese > .container{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
898 position:absolute;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
899 left:0;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
900 right:0;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
901 bottom:24px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
902 z-index:6;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
903 pointer-events:none;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
904 }Fecha ou delimita a estrutura iniciada anteriormente.
905 Linha em branco usada para separar blocos do arquivo.
906 .slider_section .carousel-inner,Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
907 .slider_section .carousel-item{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
908 background:#000;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
909 }Fecha ou delimita a estrutura iniciada anteriormente.
910 Linha em branco usada para separar blocos do arquivo.
911 .slider_section .carousel-item > div{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
912 min-height:720px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
913 }Fecha ou delimita a estrutura iniciada anteriormente.
914 Linha em branco usada para separar blocos do arquivo.
915 .slider_section .carousel_btn-box{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
916 display:flex;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
917 align-items:center;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
918 gap:12px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
919 margin:0 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
920 padding:0 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
921 width:auto;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
922 pointer-events:none;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
923 }Fecha ou delimita a estrutura iniciada anteriormente.
924 Linha em branco usada para separar blocos do arquivo.
925 .slider_section .carousel-control-prev,Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
926 .slider_section .carousel-control-next{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
927 position:relative !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
928 inset:auto !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
929 width:52px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
930 height:52px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
931 border-radius:50% !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
932 display:inline-flex !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
933 align-items:center !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
934 justify-content:center !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
935 background:#111 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
936 border:1px solid rgba(255,255,255,.22) !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
937 color:#fff !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
938 opacity:1 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
939 text-shadow:none !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
940 box-shadow:0 8px 18px rgba(0,0,0,.28);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
941 pointer-events:auto;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
942 }Fecha ou delimita a estrutura iniciada anteriormente.
943 Linha em branco usada para separar blocos do arquivo.
944 .slider_section .carousel-control-prev:hover,Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
945 .slider_section .carousel-control-next:hover{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
946 background:#b8862d !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
947 color:#fff !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
948 text-decoration:none;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
949 }Fecha ou delimita a estrutura iniciada anteriormente.
950 Linha em branco usada para separar blocos do arquivo.
951 .section{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
952 margin:0;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
953 padding:28px 0;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
954 background:#020202;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
955 border-top:1px solid #161616;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
956 }Fecha ou delimita a estrutura iniciada anteriormente.
957 Linha em branco usada para separar blocos do arquivo.
958 /* Correção: evita espaço vazio entre o banner e a próxima seção quando não houver cards de serviços */Comentário existente no código-fonte.
959 .section:empty{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
960 display:none !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
961 margin:0 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
962 padding:0 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
963 border:0 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
964 min-height:0 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
965 }Fecha ou delimita a estrutura iniciada anteriormente.
966 Linha em branco usada para separar blocos do arquivo.
967 .cards{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
968 display:grid;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
969 grid-template-columns:repeat(3,minmax(0,1fr));Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
970 gap:16px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
971 }Fecha ou delimita a estrutura iniciada anteriormente.
972 Linha em branco usada para separar blocos do arquivo.
973 .card{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
974 background:var(--card);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
975 border:1px solid rgba(255,255,255,.07);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
976 border-radius:14px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
977 overflow:hidden;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
978 display:flex;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
979 flex-direction:column;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
980 }Fecha ou delimita a estrutura iniciada anteriormente.
981 Linha em branco usada para separar blocos do arquivo.
982 .card img{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
983 width:100%;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
984 height:180px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
985 object-fit:cover;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
986 display:block;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
987 background:#000;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
988 }Fecha ou delimita a estrutura iniciada anteriormente.
989 Linha em branco usada para separar blocos do arquivo.
990 .card .p{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
991 padding:12px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
992 display:flex;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
993 flex-direction:column;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
994 gap:6px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
995 }Fecha ou delimita a estrutura iniciada anteriormente.
996 Linha em branco usada para separar blocos do arquivo.
997 .price{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
998 font-weight:800;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
999 color:#fff;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1000 }Fecha ou delimita a estrutura iniciada anteriormente.
1001 Linha em branco usada para separar blocos do arquivo.
1002 .muted{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1003 color:var(--muted);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1004 }Fecha ou delimita a estrutura iniciada anteriormente.
1005 Linha em branco usada para separar blocos do arquivo.
1006 /* Experiência */Comentário existente no código-fonte.
1007 .xp-wrap{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1008 max-width:1280px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1009 margin:0 auto;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1010 padding:0 16px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1011 position:relative;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1012 z-index:2;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1013 }Fecha ou delimita a estrutura iniciada anteriormente.
1014 Linha em branco usada para separar blocos do arquivo.
1015 .xp-grid{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1016 display:grid;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1017 grid-template-columns:1.1fr 1fr;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1018 gap:32px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1019 align-items:center;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1020 }Fecha ou delimita a estrutura iniciada anteriormente.
1021 Linha em branco usada para separar blocos do arquivo.
1022 .xp-left-year{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1023 position:relative;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1024 text-align:center;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1025 }Fecha ou delimita a estrutura iniciada anteriormente.
1026 Linha em branco usada para separar blocos do arquivo.
1027 .xp-year{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1028 display:block;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1029 margin:0;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1030 font-size:min(22vw,200px);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1031 line-height:.85;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1032 font-weight:900;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1033 letter-spacing:2px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1034 background:linear-gradient(180deg,#ffffff 0%,#b9c5ff 60%,#8aa2ff 100%);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1035 -webkit-background-clip:text;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1036 background-clip:text;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1037 -webkit-text-fill-color:transparent;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1038 color:transparent;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1039 text-shadow:0 10px 40px rgba(0,0,0,.25);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1040 }Fecha ou delimita a estrutura iniciada anteriormente.
1041 Linha em branco usada para separar blocos do arquivo.
1042 .xp-subtitle{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1043 display:block;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1044 margin:0;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1045 font-size:28px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1046 font-weight:800;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1047 color:#cfe1ff;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1048 }Fecha ou delimita a estrutura iniciada anteriormente.
1049 Linha em branco usada para separar blocos do arquivo.
1050 .xp-underline{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1051 width:120px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1052 height:4px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1053 background:linear-gradient(90deg,#2d86ff,#3ddc97);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1054 border-radius:6px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1055 margin:10px auto 18px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1056 }Fecha ou delimita a estrutura iniciada anteriormente.
1057 Linha em branco usada para separar blocos do arquivo.
1058 .xp-visitas{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1059 background:rgba(255,255,255,.05);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1060 border:2px solid rgba(66,133,244,.30);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1061 border-radius:15px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1062 padding:20px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1063 display:flex;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1064 align-items:center;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1065 justify-content:center;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1066 gap:14px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1067 max-width:100%;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1068 }Fecha ou delimita a estrutura iniciada anteriormente.
1069 Linha em branco usada para separar blocos do arquivo.
1070 .xp-vis-num{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1071 font-size:2.4rem;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1072 font-weight:800;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1073 color:#4285f4;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1074 line-height:1;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1075 margin:0;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1076 }Fecha ou delimita a estrutura iniciada anteriormente.
1077 Linha em branco usada para separar blocos do arquivo.
1078 .xp-vis-label{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1079 font-size:.9rem;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1080 color:#bbbbbb;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1081 text-transform:uppercase;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1082 letter-spacing:1px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1083 font-weight:600;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1084 margin:0;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1085 }Fecha ou delimita a estrutura iniciada anteriormente.
1086 Linha em branco usada para separar blocos do arquivo.
1087 .xp-title{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1088 color:#ffffff;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1089 font-size:clamp(28px,4.4vw,56px);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1090 line-height:1.05;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1091 font-weight:900;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1092 margin:0 0 10px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1093 }Fecha ou delimita a estrutura iniciada anteriormente.
1094 Linha em branco usada para separar blocos do arquivo.
1095 .xp-title .blue{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1096 color:#8ab4ff;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1097 }Fecha ou delimita a estrutura iniciada anteriormente.
1098 Linha em branco usada para separar blocos do arquivo.
1099 .xp-desc{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1100 color:#d7dbff;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1101 line-height:1.75;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1102 margin:0 0 22px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1103 max-width:60ch;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1104 font-size:18px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1105 }Fecha ou delimita a estrutura iniciada anteriormente.
1106 Linha em branco usada para separar blocos do arquivo.
1107 .exp-stats{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1108 display:grid;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1109 grid-template-columns:repeat(3,minmax(0,1fr));Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1110 gap:14px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1111 margin-top:26px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1112 }Fecha ou delimita a estrutura iniciada anteriormente.
1113 Linha em branco usada para separar blocos do arquivo.
1114 .exp-card{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1115 background:rgba(255,255,255,.05);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1116 border:1px solid rgba(255,255,255,.10);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1117 border-radius:12px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1118 padding:18px 12px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1119 text-align:center;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1120 min-width:0;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1121 min-height:120px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1122 overflow:hidden;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1123 display:flex;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1124 flex-direction:column;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1125 justify-content:center;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1126 }Fecha ou delimita a estrutura iniciada anteriormente.
1127 Linha em branco usada para separar blocos do arquivo.
1128 .exp-num{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1129 max-width:100%;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1130 font-size:clamp(1.35rem,1.75vw,2.2rem);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1131 font-weight:800;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1132 line-height:1.15;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1133 margin-bottom:6px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1134 overflow-wrap:break-word;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1135 word-break:normal;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1136 hyphens:auto;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1137 }Fecha ou delimita a estrutura iniciada anteriormente.
1138 Linha em branco usada para separar blocos do arquivo.
1139 .exp-label{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1140 max-width:100%;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1141 font-size:.9rem;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1142 line-height:1.35;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1143 letter-spacing:1px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1144 text-transform:uppercase;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1145 color:#bbbbbb;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1146 font-weight:600;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1147 overflow-wrap:break-word;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1148 word-break:normal;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1149 hyphens:auto;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1150 }Fecha ou delimita a estrutura iniciada anteriormente.
1151 Linha em branco usada para separar blocos do arquivo.
1152 .exp-num--blue{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1153 color:#4285f4;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1154 }Fecha ou delimita a estrutura iniciada anteriormente.
1155 Linha em branco usada para separar blocos do arquivo.
1156 .exp-num--green{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1157 color:#34a853;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1158 }Fecha ou delimita a estrutura iniciada anteriormente.
1159 Linha em branco usada para separar blocos do arquivo.
1160 .exp-num--gold{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1161 color:#fbbc04;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1162 }Fecha ou delimita a estrutura iniciada anteriormente.
1163 Linha em branco usada para separar blocos do arquivo.
1164 .xp-badges{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1165 display:flex;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1166 gap:12px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1167 flex-wrap:wrap;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1168 margin-top:12px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1169 }Fecha ou delimita a estrutura iniciada anteriormente.
1170 Linha em branco usada para separar blocos do arquivo.
1171 .xp-badge{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1172 display:inline-flex;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1173 align-items:center;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1174 gap:10px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1175 padding:10px 18px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1176 border-radius:999px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1177 font-weight:800;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1178 border:1px solid;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1179 }Fecha ou delimita a estrutura iniciada anteriormente.
1180 Linha em branco usada para separar blocos do arquivo.
1181 .xp-badge--cert{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1182 background:#0e1935;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1183 border-color:rgba(141,176,255,.25);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1184 color:#cfe1ff;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1185 }Fecha ou delimita a estrutura iniciada anteriormente.
1186 Linha em branco usada para separar blocos do arquivo.
1187 .xp-badge--qual{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1188 background:#0f1d15;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1189 border-color:rgba(83,214,155,.25);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1190 color:#bff3dd;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1191 }Fecha ou delimita a estrutura iniciada anteriormente.
1192 Linha em branco usada para separar blocos do arquivo.
1193 .xp-badge .dot{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1194 display:inline-grid;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1195 place-items:center;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1196 width:22px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1197 height:22px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1198 border-radius:50%;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1199 flex:0 0 22px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1200 }Fecha ou delimita a estrutura iniciada anteriormente.
1201 Linha em branco usada para separar blocos do arquivo.
1202 .xp-badge--cert .dot{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1203 background:#2d86ff;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1204 color:#ffffff;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1205 }Fecha ou delimita a estrutura iniciada anteriormente.
1206 Linha em branco usada para separar blocos do arquivo.
1207 .xp-badge--qual .dot{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1208 background:#3ddc97;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1209 color:#0d2a1f;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1210 }Fecha ou delimita a estrutura iniciada anteriormente.
1211 Linha em branco usada para separar blocos do arquivo.
1212 .experience-section.visitas-normal{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1213 --vis-w:100%;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1214 --vis-pad:20px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1215 --vis-num:2.4rem;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1216 --vis-icon:2.2rem;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1217 --vis-bw:2px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1218 --under-w:120px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1219 --under-h:4px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1220 --under-m:10px auto 18px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1221 }Fecha ou delimita a estrutura iniciada anteriormente.
1222 Linha em branco usada para separar blocos do arquivo.
1223 .experience-section.visitas-normal .xp-visitas{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1224 max-width:var(--vis-w);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1225 margin:10px auto 0;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1226 padding:var(--vis-pad);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1227 border-width:var(--vis-bw);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1228 border-radius:12px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1229 }Fecha ou delimita a estrutura iniciada anteriormente.
1230 Linha em branco usada para separar blocos do arquivo.
1231 .experience-section.visitas-normal .xp-visitas > div:first-child{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1232 font-size:var(--vis-icon) !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1233 line-height:1;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1234 }Fecha ou delimita a estrutura iniciada anteriormente.
1235 Linha em branco usada para separar blocos do arquivo.
1236 .experience-section.visitas-normal .xp-visitas .xp-vis-num{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1237 font-size:var(--vis-num);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1238 }Fecha ou delimita a estrutura iniciada anteriormente.
1239 Linha em branco usada para separar blocos do arquivo.
1240 .experience-section.visitas-normal .xp-left-year .xp-underline{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1241 width:var(--under-w);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1242 height:var(--under-h);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1243 margin:var(--under-m);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1244 }Fecha ou delimita a estrutura iniciada anteriormente.
1245 Linha em branco usada para separar blocos do arquivo.
1246 /* Modal específico da página */Comentário existente no código-fonte.
1247 #modalSimulacaoCliente .modal-dialog{Comentário existente no código-fonte.
1248 max-width:1100px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1249 margin:1.5rem auto;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1250 }Fecha ou delimita a estrutura iniciada anteriormente.
1251 Linha em branco usada para separar blocos do arquivo.
1252 #modalSimulacaoCliente .modal-content{Comentário existente no código-fonte.
1253 border-radius:18px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1254 border:0;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1255 overflow:hidden;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1256 box-shadow:0 18px 50px rgba(0,0,0,.25);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1257 }Fecha ou delimita a estrutura iniciada anteriormente.
1258 Linha em branco usada para separar blocos do arquivo.
1259 #modalSimulacaoCliente .modal-header{Comentário existente no código-fonte.
1260 background:linear-gradient(90deg,#111 0%,#1f1f1f 100%);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1261 color:#fff;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1262 border-bottom:0;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1263 padding:18px 22px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1264 }Fecha ou delimita a estrutura iniciada anteriormente.
1265 Linha em branco usada para separar blocos do arquivo.
1266 #modalSimulacaoCliente .modal-header .close{Comentário existente no código-fonte.
1267 color:#fff;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1268 opacity:1;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1269 text-shadow:none;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1270 }Fecha ou delimita a estrutura iniciada anteriormente.
1271 Linha em branco usada para separar blocos do arquivo.
1272 #modalSimulacaoCliente .modal-body{Comentário existente no código-fonte.
1273 background:#f7f8fa;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1274 padding:22px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1275 }Fecha ou delimita a estrutura iniciada anteriormente.
1276 Linha em branco usada para separar blocos do arquivo.
1277 #modalSimulacaoCliente .alert{Comentário existente no código-fonte.
1278 border-radius:12px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1279 border:1px solid #d7c29a;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1280 background:#f7f0e3;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1281 color:#5e4824;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1282 margin-bottom:18px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1283 }Fecha ou delimita a estrutura iniciada anteriormente.
1284 Linha em branco usada para separar blocos do arquivo.
1285 #modalSimulacaoCliente .form-group label{Comentário existente no código-fonte.
1286 font-weight:700;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1287 color:#333;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1288 margin-bottom:8px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1289 }Fecha ou delimita a estrutura iniciada anteriormente.
1290 Linha em branco usada para separar blocos do arquivo.
1291 #modalSimulacaoCliente .form-control{Comentário existente no código-fonte.
1292 border-radius:10px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1293 min-height:46px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1294 border:1px solid #d8dee6;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1295 box-shadow:none;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1296 }Fecha ou delimita a estrutura iniciada anteriormente.
1297 Linha em branco usada para separar blocos do arquivo.
1298 #modalSimulacaoCliente .form-control:focus{Comentário existente no código-fonte.
1299 border-color:#b8862d;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1300 box-shadow:0 0 0 .15rem rgba(184,134,45,.15);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1301 }Fecha ou delimita a estrutura iniciada anteriormente.
1302 Linha em branco usada para separar blocos do arquivo.
1303 .painel-comparacao-simulacao{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1304 background:#fff;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1305 border:1px solid #e4e7eb;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1306 border-radius:16px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1307 padding:16px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1308 box-shadow:0 6px 20px rgba(0,0,0,.05);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1309 height:100%;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1310 }Fecha ou delimita a estrutura iniciada anteriormente.
1311 Linha em branco usada para separar blocos do arquivo.
1312 .painel-comparacao-simulacao .titulo-painel{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1313 font-size:15px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1314 font-weight:700;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1315 color:#2d3436;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1316 margin-bottom:12px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1317 }Fecha ou delimita a estrutura iniciada anteriormente.
1318 Linha em branco usada para separar blocos do arquivo.
1319 .box-imagem-simulacao{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1320 background:linear-gradient(180deg,#ffffff 0%,#f8f9fb 100%);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1321 border:1px solid #dfe4ea;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1322 border-radius:14px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1323 min-height:340px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1324 display:flex;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1325 align-items:center;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1326 justify-content:center;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1327 padding:12px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1328 position:relative;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1329 overflow:hidden;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1330 }Fecha ou delimita a estrutura iniciada anteriormente.
1331 Linha em branco usada para separar blocos do arquivo.
1332 .box-imagem-simulacao img{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1333 position:relative;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1334 z-index:2;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1335 max-width:100%;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1336 max-height:310px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1337 border-radius:10px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1338 box-shadow:0 8px 24px rgba(0,0,0,.12);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1339 background:#fff;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1340 }Fecha ou delimita a estrutura iniciada anteriormente.
1341 Linha em branco usada para separar blocos do arquivo.
1342 .legenda-simulacao{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1343 margin-top:12px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1344 font-size:13px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1345 color:#6c757d;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1346 line-height:20px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1347 }Fecha ou delimita a estrutura iniciada anteriormente.
1348 Linha em branco usada para separar blocos do arquivo.
1349 #btn_simular_cliente{Comentário existente no código-fonte.
1350 border-radius:50px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1351 min-height:52px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1352 font-size:18px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1353 font-weight:700;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1354 box-shadow:0 10px 24px rgba(184,134,45,.18);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1355 }Fecha ou delimita a estrutura iniciada anteriormente.
1356 Linha em branco usada para separar blocos do arquivo.
1357 #mensagem_simulacao_cliente{Comentário existente no código-fonte.
1358 font-size:14px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1359 font-weight:600;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1360 min-height:22px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1361 }Fecha ou delimita a estrutura iniciada anteriormente.
1362 Linha em branco usada para separar blocos do arquivo.
1363 .selo-comparacao{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1364 display:inline-block;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1365 padding:6px 12px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1366 border-radius:30px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1367 font-size:12px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1368 font-weight:700;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1369 background:#111;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1370 color:#fff;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1371 margin-bottom:10px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1372 }Fecha ou delimita a estrutura iniciada anteriormente.
1373 Linha em branco usada para separar blocos do arquivo.
1374 @media (max-width:1000px){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1375 .cards{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1376 grid-template-columns:repeat(2,minmax(0,1fr));Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1377 }Fecha ou delimita a estrutura iniciada anteriormente.
1378 }Fecha ou delimita a estrutura iniciada anteriormente.
1379 Linha em branco usada para separar blocos do arquivo.
1380 @media (max-width:991px){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1381 .slider_section .carousel-item > div{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1382 min-height:620px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1383 }Fecha ou delimita a estrutura iniciada anteriormente.
1384 Linha em branco usada para separar blocos do arquivo.
1385 .slider_section #customCarouselProtese > .container{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1386 bottom:18px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1387 }Fecha ou delimita a estrutura iniciada anteriormente.
1388 Linha em branco usada para separar blocos do arquivo.
1389 .xp-grid{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1390 grid-template-columns:1fr;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1391 gap:24px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1392 }Fecha ou delimita a estrutura iniciada anteriormente.
1393 Linha em branco usada para separar blocos do arquivo.
1394 .exp-stats{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1395 grid-template-columns:repeat(2,1fr);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1396 }Fecha ou delimita a estrutura iniciada anteriormente.
1397 Linha em branco usada para separar blocos do arquivo.
1398 #modalSimulacaoCliente .modal-body{Comentário existente no código-fonte.
1399 padding:16px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1400 }Fecha ou delimita a estrutura iniciada anteriormente.
1401 Linha em branco usada para separar blocos do arquivo.
1402 .box-imagem-simulacao{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1403 min-height:260px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1404 margin-bottom:12px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1405 }Fecha ou delimita a estrutura iniciada anteriormente.
1406 Linha em branco usada para separar blocos do arquivo.
1407 .box-imagem-simulacao img{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1408 max-height:230px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1409 }Fecha ou delimita a estrutura iniciada anteriormente.
1410 Linha em branco usada para separar blocos do arquivo.
1411 #btn_simular_cliente{Comentário existente no código-fonte.
1412 font-size:16px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1413 }Fecha ou delimita a estrutura iniciada anteriormente.
1414 }Fecha ou delimita a estrutura iniciada anteriormente.
1415 Linha em branco usada para separar blocos do arquivo.
1416 @media (max-width:768px){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1417 .slider_section .detail-box{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1418 margin-top:110px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1419 }Fecha ou delimita a estrutura iniciada anteriormente.
1420 Linha em branco usada para separar blocos do arquivo.
1421 .slider_section .detail-box h2{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1422 font-size:32px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1423 line-height:1.2;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1424 }Fecha ou delimita a estrutura iniciada anteriormente.
1425 Linha em branco usada para separar blocos do arquivo.
1426 .slider_section .detail-box p{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1427 font-size:15px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1428 line-height:1.6;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1429 }Fecha ou delimita a estrutura iniciada anteriormente.
1430 Linha em branco usada para separar blocos do arquivo.
1431 .slider_section .carousel-control-prev,Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1432 .slider_section .carousel-control-next{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1433 width:46px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1434 height:46px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1435 }Fecha ou delimita a estrutura iniciada anteriormente.
1436 Linha em branco usada para separar blocos do arquivo.
1437 .xp-year{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1438 font-size:min(30vw,140px);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1439 }Fecha ou delimita a estrutura iniciada anteriormente.
1440 Linha em branco usada para separar blocos do arquivo.
1441 .xp-subtitle{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1442 font-size:22px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1443 }Fecha ou delimita a estrutura iniciada anteriormente.
1444 Linha em branco usada para separar blocos do arquivo.
1445 .xp-title{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1446 font-size:clamp(24px,8vw,38px);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1447 }Fecha ou delimita a estrutura iniciada anteriormente.
1448 Linha em branco usada para separar blocos do arquivo.
1449 .xp-desc{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1450 font-size:16px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1451 }Fecha ou delimita a estrutura iniciada anteriormente.
1452 Linha em branco usada para separar blocos do arquivo.
1453 .exp-stats{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1454 grid-template-columns:1fr;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1455 }Fecha ou delimita a estrutura iniciada anteriormente.
1456 Linha em branco usada para separar blocos do arquivo.
1457 .xp-badges{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1458 flex-direction:column;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1459 align-items:flex-start;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1460 }Fecha ou delimita a estrutura iniciada anteriormente.
1461 Linha em branco usada para separar blocos do arquivo.
1462 .cards{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1463 grid-template-columns:1fr;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1464 }Fecha ou delimita a estrutura iniciada anteriormente.
1465 }Fecha ou delimita a estrutura iniciada anteriormente.
1466 Linha em branco usada para separar blocos do arquivo.
1467 Linha em branco usada para separar blocos do arquivo.
1468 /* PATCH V5: estabilidade visual sem mudar a lógica */Comentário existente no código-fonte.
1469 html{scroll-behavior:auto;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1470 .layout_padding,.footer_section,footer{content-visibility:auto;contain-intrinsic-size:760px;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1471 .header_section{min-height:96px;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1472 @media (max-width:768px){.header_section{min-height:84px;}}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1473 img{max-width:100%;height:auto;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1474 .carousel-item img[width][height]{height:100%;}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1475 Linha em branco usada para separar blocos do arquivo.
1476 Linha em branco usada para separar blocos do arquivo.
1477 /* ============================================================Comentário existente no código-fonte.
1478 GALERIA DE TRABALHOS - movimento contínuo e clique no atendimentoLinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1479 ============================================================ */Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1480 #galeria-banco #galeriaWrap{Comentário existente no código-fonte.
1481 touch-action:pan-y;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1482 }Fecha ou delimita a estrutura iniciada anteriormente.
1483 Linha em branco usada para separar blocos do arquivo.
1484 #galeria-banco #galeriaViewport{Comentário existente no código-fonte.
1485 overflow:hidden;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1486 }Fecha ou delimita a estrutura iniciada anteriormente.
1487 Linha em branco usada para separar blocos do arquivo.
1488 #galeria-banco #galTrack{Comentário existente no código-fonte.
1489 transition:none !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1490 will-change:transform;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1491 }Fecha ou delimita a estrutura iniciada anteriormente.
1492 Linha em branco usada para separar blocos do arquivo.
1493 #galeria-banco .galItem{Comentário existente no código-fonte.
1494 cursor:pointer;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1495 user-select:none;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1496 -webkit-user-select:none;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1497 outline:none;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1498 }Fecha ou delimita a estrutura iniciada anteriormente.
1499 Linha em branco usada para separar blocos do arquivo.
1500 #galeria-banco .galItem:focus-visible{Comentário existente no código-fonte.
1501 box-shadow:0 0 0 3px rgba(209,170,87,.82);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1502 border-radius:12px;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1503 }Fecha ou delimita a estrutura iniciada anteriormente.
1504 Linha em branco usada para separar blocos do arquivo.
1505 #galeria-banco .galItem img{Comentário existente no código-fonte.
1506 pointer-events:none;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1507 }Fecha ou delimita a estrutura iniciada anteriormente.
1508 Linha em branco usada para separar blocos do arquivo.
1509 Linha em branco usada para separar blocos do arquivo.
1510 /* ============================================================Comentário existente no código-fonte.
1511 DEPOIMENTOS /PROTESE - organização profissional dos cardsLinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1512 Mantém os IDs, classes depItem e o carrossel original.Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1513 Ajusta somente espaçamento, tamanho padrão e responsividade.Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1514 ============================================================ */Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1515 .depoimentos-protese-section{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1516 background:#050607 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1517 color:#fff !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1518 padding:118px 0 58px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1519 margin:0 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1520 scroll-margin-top:130px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1521 overflow:hidden !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1522 }Fecha ou delimita a estrutura iniciada anteriormente.
1523 .depoimentos-protese-container{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1524 width:100% !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1525 max-width:1320px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1526 margin:0 auto !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1527 padding:0 18px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1528 }Fecha ou delimita a estrutura iniciada anteriormente.
1529 .depoimentos-protese-titulo{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1530 color:#fff8ea !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1531 text-align:center !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1532 font-size:38px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1533 line-height:1.2 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1534 font-weight:900 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1535 margin:0 0 28px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1536 letter-spacing:.2px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1537 text-shadow:0 8px 24px rgba(0,0,0,.45) !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1538 }Fecha ou delimita a estrutura iniciada anteriormente.
1539 .depoimentos-controle-protese{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1540 display:flex !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1541 align-items:center !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1542 gap:12px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1543 margin:0 auto 18px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1544 max-width:1020px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1545 }Fecha ou delimita a estrutura iniciada anteriormente.
1546 .depoimentos-controle-protese button{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1547 border:1px solid rgba(209,170,87,.28) !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1548 background:rgba(209,170,87,.10) !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1549 color:#fff !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1550 width:42px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1551 height:42px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1552 border-radius:50% !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1553 cursor:pointer !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1554 font-size:26px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1555 line-height:1 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1556 display:flex !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1557 align-items:center !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1558 justify-content:center !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1559 box-shadow:0 10px 24px rgba(0,0,0,.22) !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1560 }Fecha ou delimita a estrutura iniciada anteriormente.
1561 .depoimentos-controle-protese button:disabled{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1562 opacity:.45 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1563 cursor:not-allowed !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1564 }Fecha ou delimita a estrutura iniciada anteriormente.
1565 .depoimentos-dots-protese{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1566 display:flex !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1567 gap:7px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1568 flex:1 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1569 align-items:center !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1570 justify-content:center !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1571 min-height:12px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1572 }Fecha ou delimita a estrutura iniciada anteriormente.
1573 .depoimentos-viewport-protese{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1574 overflow:hidden !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1575 padding:2px 0 8px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1576 }Fecha ou delimita a estrutura iniciada anteriormente.
1577 .depoimentos-track-protese{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1578 display:flex !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1579 gap:26px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1580 align-items:stretch !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1581 transition:transform .45s ease !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1582 will-change:transform !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1583 }Fecha ou delimita a estrutura iniciada anteriormente.
1584 .depoimento-item-protese{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1585 display:flex !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1586 align-items:stretch !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1587 box-sizing:border-box !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1588 padding:0 0 8px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1589 }Fecha ou delimita a estrutura iniciada anteriormente.
1590 .depoimento-card-protese{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1591 width:100% !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1592 height:650px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1593 display:flex !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1594 flex-direction:column !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1595 background:linear-gradient(180deg,#121821 0%,#0a0d12 100%) !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1596 border:1px solid rgba(209,170,87,.22) !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1597 border-radius:22px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1598 padding:26px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1599 box-shadow:0 20px 48px rgba(0,0,0,.38) !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1600 overflow:hidden !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1601 }Fecha ou delimita a estrutura iniciada anteriormente.
1602 .depoimento-card-topo-protese{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1603 min-height:112px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1604 display:flex !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1605 align-items:center !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1606 gap:20px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1607 padding-bottom:18px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1608 margin-bottom:18px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1609 border-bottom:1px solid rgba(209,170,87,.16) !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1610 }Fecha ou delimita a estrutura iniciada anteriormente.
1611 .depoimento-card-foto-protese{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1612 width:96px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1613 height:96px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1614 object-fit:cover !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1615 border-radius:50% !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1616 border:3px solid rgba(209,170,87,.42) !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1617 background:#000 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1618 box-shadow:0 12px 28px rgba(0,0,0,.32) !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1619 flex:0 0 96px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1620 }Fecha ou delimita a estrutura iniciada anteriormente.
1621 .depoimento-card-info-protese{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1622 flex:1 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1623 min-width:0 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1624 }Fecha ou delimita a estrutura iniciada anteriormente.
1625 .depoimento-card-info-protese strong{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1626 display:block !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1627 color:#fff !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1628 font-size:26px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1629 line-height:1.15 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1630 font-weight:900 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1631 margin:0 0 7px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1632 word-break:break-word !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1633 }Fecha ou delimita a estrutura iniciada anteriormente.
1634 .depoimento-card-info-protese span{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1635 display:inline-flex !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1636 align-items:center !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1637 gap:7px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1638 color:#d7c6a8 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1639 font-size:15px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1640 line-height:1.4 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1641 }Fecha ou delimita a estrutura iniciada anteriormente.
1642 .depoimento-card-info-protese span:before{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1643 content:"✓" !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1644 width:19px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1645 height:19px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1646 display:inline-flex !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1647 align-items:center !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1648 justify-content:center !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1649 border-radius:50% !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1650 background:rgba(209,170,87,.18) !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1651 color:#d1aa57 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1652 font-size:12px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1653 font-weight:900 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1654 }Fecha ou delimita a estrutura iniciada anteriormente.
1655 .depoimento-card-corpo-protese{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1656 flex:1 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1657 display:flex !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1658 flex-direction:column !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1659 min-height:0 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1660 }Fecha ou delimita a estrutura iniciada anteriormente.
1661 .depoimento-card-texto-protese{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1662 height:178px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1663 overflow:auto !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1664 scrollbar-width:thin !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1665 margin:0 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1666 padding:20px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1667 color:#f4f4f4 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1668 background:#0b0c0f !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1669 border:1px solid rgba(255,255,255,.08) !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1670 border-radius:16px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1671 text-align:center !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1672 font-size:17px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1673 line-height:1.75 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1674 }Fecha ou delimita a estrutura iniciada anteriormente.
1675 .depoimento-card-midias-protese{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1676 height:260px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1677 margin-top:16px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1678 display:flex !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1679 gap:14px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1680 min-height:0 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1681 }Fecha ou delimita a estrutura iniciada anteriormente.
1682 .depoimento-card-midia-protese{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1683 flex:1 1 0 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1684 min-width:0 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1685 height:100% !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1686 display:flex !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1687 align-items:center !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1688 justify-content:center !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1689 background:#020203 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1690 border:1px solid rgba(255,255,255,.10) !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1691 border-radius:18px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1692 overflow:hidden !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1693 }Fecha ou delimita a estrutura iniciada anteriormente.
1694 .depoimento-card-midia-protese video,Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1695 .depoimento-card-midia-protese img{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1696 width:100% !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1697 height:100% !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1698 object-fit:contain !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1699 display:block !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1700 border:0 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1701 border-radius:0 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1702 background:#020203 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1703 }Fecha ou delimita a estrutura iniciada anteriormente.
1704 .depoimento-card-sem-midia-protese{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1705 flex:1 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1706 margin-top:16px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1707 display:flex !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1708 align-items:center !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1709 justify-content:center !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1710 text-align:center !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1711 min-height:260px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1712 color:#a99d88 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1713 border:1px dashed rgba(209,170,87,.20) !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1714 border-radius:18px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1715 background:rgba(209,170,87,.035) !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1716 font-size:15px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1717 }Fecha ou delimita a estrutura iniciada anteriormente.
1718 .depoimentos-protese-botao{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1719 text-align:center !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1720 margin-top:24px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1721 }Fecha ou delimita a estrutura iniciada anteriormente.
1722 .depoimentos-protese-botao a{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1723 display:inline-block !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1724 background:#d1aa57 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1725 color:#111 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1726 padding:14px 28px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1727 border-radius:999px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1728 font-weight:900 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1729 text-decoration:none !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1730 box-shadow:0 10px 28px rgba(209,170,87,.32) !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1731 }Fecha ou delimita a estrutura iniciada anteriormente.
1732 @media (max-width:899px){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1733 .depoimentos-protese-section{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1734 padding:104px 0 46px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1735 scroll-margin-top:112px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1736 }Fecha ou delimita a estrutura iniciada anteriormente.
1737 .depoimentos-protese-titulo{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1738 font-size:30px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1739 }Fecha ou delimita a estrutura iniciada anteriormente.
1740 .depoimentos-track-protese{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1741 gap:18px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1742 }Fecha ou delimita a estrutura iniciada anteriormente.
1743 .depoimento-card-protese{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1744 height:auto !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1745 min-height:0 !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1746 padding:20px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1747 }Fecha ou delimita a estrutura iniciada anteriormente.
1748 .depoimento-card-topo-protese{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1749 min-height:88px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1750 gap:15px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1751 }Fecha ou delimita a estrutura iniciada anteriormente.
1752 .depoimento-card-foto-protese{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1753 width:78px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1754 height:78px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1755 flex-basis:78px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1756 }Fecha ou delimita a estrutura iniciada anteriormente.
1757 .depoimento-card-info-protese strong{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1758 font-size:22px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1759 }Fecha ou delimita a estrutura iniciada anteriormente.
1760 .depoimento-card-texto-protese{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1761 height:auto !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1762 max-height:230px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1763 font-size:16px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1764 padding:18px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1765 }Fecha ou delimita a estrutura iniciada anteriormente.
1766 .depoimento-card-midias-protese{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1767 height:auto !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1768 flex-direction:column !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1769 }Fecha ou delimita a estrutura iniciada anteriormente.
1770 .depoimento-card-midia-protese{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1771 height:280px !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1772 }Fecha ou delimita a estrutura iniciada anteriormente.
1773 .depoimento-card-sem-midia-protese{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1774 display:none !important;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1775 }Fecha ou delimita a estrutura iniciada anteriormente.
1776 }Fecha ou delimita a estrutura iniciada anteriormente.
1777 Linha em branco usada para separar blocos do arquivo.
1778</style>Marca HTML presente na saída da página.
1779 <!-- Google Ads: conversão somente em ação real do usuárioLinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1780 Não dispara conversão apenas por abrir a página. -->Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1781<script>Marca HTML presente na saída da página.
1782 window.JACY_ADS_CONVERSION_SEND_TO = 'AW-10875176701/WWgPCPKFp4ocEP2N2MEo';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1783 window.jacyTrackAdsConversion = window.jacyTrackAdsConversion || function(label){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1784 try {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1785 if (window.loadGtag) window.loadGtag();Avalia a condição escrita nesta linha.
1786 if (typeof gtag === 'function') {Avalia a condição escrita nesta linha.
1787 gtag('event', 'conversion', {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1788 'send_to': window.JACY_ADS_CONVERSION_SEND_TO,Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1789 'event_category': 'lead',Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1790 'event_label': label || 'protese_capilar',Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1791 'transport_type': 'beacon'Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1792 });Fecha ou delimita a estrutura iniciada anteriormente.
1793 }Fecha ou delimita a estrutura iniciada anteriormente.
1794 } catch(e) {}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1795 };Fecha ou delimita a estrutura iniciada anteriormente.
1796</script>Marca HTML presente na saída da página.
1797 Linha em branco usada para separar blocos do arquivo.
1798 <!-- Patch PageSpeed V6 aplicado em /protese: header parcial, footer leve, CSS assíncrono e imagens otimizáveis. -->Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1799</head>Marca HTML presente na saída da página.
1800<body class="pagina-protese-google-ads">Marca HTML presente na saída da página.
1801 Linha em branco usada para separar blocos do arquivo.
1802<?php if (!defined('JACY_HEADER_PARTIAL_ONLY')) define('JACY_HEADER_PARTIAL_ONLY', true); require_once("cabecalho.php"); ?>Abre um bloco PHP executado no servidor.
1803 Linha em branco usada para separar blocos do arquivo.
1804<main>Marca HTML presente na saída da página.
1805<section class="slider_section" aria-label="Destaques">Marca HTML presente na saída da página.
1806 <div id="customCarouselProtese" class="carousel slide" data-ride="carousel" data-interval="5000" aria-roledescription="carousel">Marca HTML presente na saída da página.
1807 <div class="carousel-inner">Marca HTML presente na saída da página.
1808 <?php foreach ($slides as $i => $s):Abre um bloco PHP executado no servidor.
1809 $ativo = ($i === 0) ? 'active' : '';Atribui o valor ou resultado exibido à variável.
1810 $titulo = trim((string)($s['titulo'] ?? ''));Atribui o valor ou resultado exibido à variável.
1811 $descricao = trim((string)($s['texto'] ?? ''));Atribui o valor ou resultado exibido à variável.
1812 $botao_link = trim((string)($s['link'] ?? ''));Atribui o valor ou resultado exibido à variável.
1813 $botao_texto = 'Agendar';Atribui o valor ou resultado exibido à variável.
1814 $botao_target = '_self';Atribui o valor ou resultado exibido à variável.
1815 $botao_rel = '';Atribui o valor ou resultado exibido à variável.
1816 Linha em branco usada para separar blocos do arquivo.
1817 if ($botao_link === '' || preg_match('/^\s*javascript:/i', $botao_link)) {Avalia a condição escrita nesta linha.
1818 $botao_link = $SET['agenda_url'];Atribui o valor ou resultado exibido à variável.
1819 } else {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1820 $botao_texto = 'Saiba mais';Atribui o valor ou resultado exibido à variável.
1821 if (preg_match('/^(https?:)?\/\//i', $botao_link)) {Avalia a condição escrita nesta linha.
1822 $botao_target = '_blank';Atribui o valor ou resultado exibido à variável.
1823 $botao_rel = 'noopener noreferrer';Atribui o valor ou resultado exibido à variável.
1824 }Fecha ou delimita a estrutura iniciada anteriormente.
1825 }Fecha ou delimita a estrutura iniciada anteriormente.
1826 ?>Fecha o bloco PHP.
1827 <div class="carousel-item <?php echo $ativo; ?>">Marca HTML presente na saída da página.
1828 <div style="position:relative;min-height:720px;background:#000;overflow:hidden;">Marca HTML presente na saída da página.
1829 <div style="position:absolute;top:0;left:0;width:100%;height:100%;z-index:1;">Marca HTML presente na saída da página.
1830 <?php if (!empty($s['video'])): ?>Abre um bloco PHP executado no servidor.
1831 <videoLinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1832 poster="<?=h($LCP_POSTER)?>"Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1833 mutedLinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1834 playsinlineLinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1835 loopLinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1836 preload="none"Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1837 style="width:100%;height:100%;object-fit:cover;display:block;opacity:.38;"Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1838 >Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1839 <source src="<?=h($s['video'])?>" type="video/mp4">Marca HTML presente na saída da página.
1840 </video>Marca HTML presente na saída da página.
1841 <?php else: ?>Abre um bloco PHP executado no servidor.
1842 <imgLinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1843 src="<?=h(jacy_fast_img_src((string)$s['img']))?>"Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1844 alt="<?=h($titulo !== '' ? $titulo : 'Banner')?>"Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1845 title="<?=h($titulo)?>"Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1846 width="1920"Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1847 height="720"Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1848 <?php echo ($i === 0) ? 'loading="eager" fetchpriority="high"' : 'loading="lazy"'; ?>Abre um bloco PHP executado no servidor.
1849 decoding="async"Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1850 sizes="100vw"Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1851 style="width:100%;height:100%;object-fit:cover;display:block;opacity:.38;"Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1852 >Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1853 <?php endif; ?>Abre um bloco PHP executado no servidor.
1854 </div>Marca HTML presente na saída da página.
1855 Linha em branco usada para separar blocos do arquivo.
1856 <div style="position:absolute;top:0;left:0;width:100%;height:100%;background:linear-gradient(90deg, rgba(0,0,0,.88) 0%, rgba(0,0,0,.62) 45%, rgba(0,0,0,.25) 100%);z-index:2;"></div>Marca HTML presente na saída da página.
1857 Linha em branco usada para separar blocos do arquivo.
1858 <div class="container" style="position:relative;z-index:3;">Marca HTML presente na saída da página.
1859 <div class="row align-items-center" style="min-height:720px;">Marca HTML presente na saída da página.
1860 <div class="col-md-7 col-lg-6">Marca HTML presente na saída da página.
1861 <div class="detail-box" style="margin-top:80px;">Marca HTML presente na saída da página.
1862 <?php if ($titulo !== ''): ?>Abre um bloco PHP executado no servidor.
1863 <h2 style="color:#fff;"><?php echo h($titulo); ?></h2>Marca HTML presente na saída da página.
1864 <?php endif; ?>Abre um bloco PHP executado no servidor.
1865 Linha em branco usada para separar blocos do arquivo.
1866 <?php if ($descricao !== ''): ?>Abre um bloco PHP executado no servidor.
1867 <p style="color:#fff;"><?php echo h($descricao); ?></p>Marca HTML presente na saída da página.
1868 <?php endif; ?>Abre um bloco PHP executado no servidor.
1869 Linha em branco usada para separar blocos do arquivo.
1870 <div class="btn-box">Marca HTML presente na saída da página.
1871 <aLinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1872 href="<?php echo h($botao_link); ?>"Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1873 target="<?php echo $botao_target; ?>"Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1874 <?php if ($botao_rel !== ''): ?>rel="<?php echo $botao_rel; ?>"<?php endif; ?>Abre um bloco PHP executado no servidor.
1875 class="btn btn-lg btn-contact"Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1876 >Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
1877 <?php echo h($botao_texto); ?>Abre um bloco PHP executado no servidor.
1878 </a>Marca HTML presente na saída da página.
1879 </div>Marca HTML presente na saída da página.
1880 </div>Marca HTML presente na saída da página.
1881 </div>Marca HTML presente na saída da página.
1882 </div>Marca HTML presente na saída da página.
1883 </div>Marca HTML presente na saída da página.
1884 </div>Marca HTML presente na saída da página.
1885 </div>Marca HTML presente na saída da página.
1886 <?php endforeach; ?>Abre um bloco PHP executado no servidor.
1887 </div>Marca HTML presente na saída da página.
1888 Linha em branco usada para separar blocos do arquivo.
1889 <div class="container">Marca HTML presente na saída da página.
1890 <div class="carousel_btn-box">Marca HTML presente na saída da página.
1891 <a class="carousel-control-prev" href="#customCarouselProtese" role="button" data-slide="prev" aria-label="Anterior">Marca HTML presente na saída da página.
1892 <i class="fa fa-arrow-left" aria-hidden="true"></i><span class="sr-only">Previous</span>Marca HTML presente na saída da página.
1893 </a>Marca HTML presente na saída da página.
1894 <a class="carousel-control-next" href="#customCarouselProtese" role="button" data-slide="next" aria-label="Próximo">Marca HTML presente na saída da página.
1895 <i class="fa fa-arrow-right" aria-hidden="true"></i><span class="sr-only">Next</span>Marca HTML presente na saída da página.
1896 </a>Marca HTML presente na saída da página.
1897 </div>Marca HTML presente na saída da página.
1898 </div>Marca HTML presente na saída da página.
1899 </div>Marca HTML presente na saída da página.
1900</section>Marca HTML presente na saída da página.
1901 Linha em branco usada para separar blocos do arquivo.
1902 <?php if ($servicos): ?>Abre um bloco PHP executado no servidor.
1903 <section class="section">Marca HTML presente na saída da página.
1904 <div class="container">Marca HTML presente na saída da página.
1905 <?php if ($servicos): ?>Abre um bloco PHP executado no servidor.
1906 <div class="cards">Marca HTML presente na saída da página.
1907 <?php foreach ($servicos as $s): ?>Abre um bloco PHP executado no servidor.
1908 <article class="card">Marca HTML presente na saída da página.
1909 <img src="<?=h(jacy_fast_img_src($s['img'] ? $s['img'] : (UP . 'placeholder.webp')))?>" width="600" height="360" alt="<?=h($s['titulo'])?>" loading="lazy" decoding="async" fetchpriority="low" sizes="(max-width: 600px) 100vw, 33vw">Marca HTML presente na saída da página.
1910 <div class="p">Marca HTML presente na saída da página.
1911 <strong><?=h($s['titulo'])?></strong>Marca HTML presente na saída da página.
1912 Linha em branco usada para separar blocos do arquivo.
1913 <?php if (!empty($s['descricao'])): ?>Abre um bloco PHP executado no servidor.
1914 <div class="muted"><?=h(mb_strimwidth(strip_tags($s['descricao']), 0, 160, '…', 'UTF-8'))?></div>Marca HTML presente na saída da página.
1915 <?php endif; ?>Abre um bloco PHP executado no servidor.
1916 Linha em branco usada para separar blocos do arquivo.
1917 <div style="display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-top:4px">Marca HTML presente na saída da página.
1918 <?php if ($s['preco'] !== ''): ?><span class="price"><?=h(money_br($s['preco']))?></span><?php endif; ?>Abre um bloco PHP executado no servidor.
1919 <span class="muted">·</span>Marca HTML presente na saída da página.
1920 <a class="btn btn-brand" href="<?=h($SET['agenda_url'])?>">Agendar</a>Marca HTML presente na saída da página.
1921 <a class="btn btn-outline" href="<?=h($WPP)?>" target="_blank" rel="noopener">WhatsApp</a>Marca HTML presente na saída da página.
1922 <?php if (!empty($s['link'])): ?>Abre um bloco PHP executado no servidor.
1923 <a class="btn btn-outline" href="<?=h($s['link'])?>" target="_blank" rel="noopener">Detalhes</a>Marca HTML presente na saída da página.
1924 <?php endif; ?>Abre um bloco PHP executado no servidor.
1925 </div>Marca HTML presente na saída da página.
1926 </div>Marca HTML presente na saída da página.
1927 </article>Marca HTML presente na saída da página.
1928 <?php endforeach; ?>Abre um bloco PHP executado no servidor.
1929 </div>Marca HTML presente na saída da página.
1930 <?php else: ?>Abre um bloco PHP executado no servidor.
1931 <p class="muted" aria-hidden="true"></p>Marca HTML presente na saída da página.
1932 <?php endif; ?>Abre um bloco PHP executado no servidor.
1933 </div>Marca HTML presente na saída da página.
1934 </section>Marca HTML presente na saída da página.
1935 <?php endif; ?>Abre um bloco PHP executado no servidor.
1936 Linha em branco usada para separar blocos do arquivo.
1937 <section id="agenda-seletiva" style="background:radial-gradient(1200px 600px at 70% -10%,#0d1f17 0%,#070b09 60%,#050807 100%);color:#fff">Marca HTML presente na saída da página.
1938 <div style="max-width:1200px;margin:0 auto;padding:60px 20px;display:grid;grid-template-columns:1.1fr 1fr;gap:48px;align-items:center">Marca HTML presente na saída da página.
1939 <div>Marca HTML presente na saída da página.
1940 <div id="heroSlider" style="position:relative;border-radius:18px;overflow:hidden;background:#000;box-shadow:0 20px 60px rgba(0,0,0,.35)">Marca HTML presente na saída da página.
1941 <div id="heroTrack" style="display:flex;transition:transform .5s ease">Marca HTML presente na saída da página.
1942 <?php foreach ($HERO as $h): ?>Abre um bloco PHP executado no servidor.
1943 <div class="hero-slide" data-video="<?=h($h['id'])?>" style="min-width:100%;position:relative;aspect-ratio:16/9;background:#000">Marca HTML presente na saída da página.
1944 <img alt="<?=h($h['titulo'] ?: 'Vídeo')?>" loading="lazy" fetchpriority="low" width="640" height="360" style="position:absolute;inset:0;width:100%;height:100%;object-fit:cover;opacity:.9" src="<?=h($h['thumb'])?>" onerror="this.onerror=null;this.src='https://img.youtube.com/vi/<?=h($h['id'])?>/hqdefault.jpg'">Marca HTML presente na saída da página.
1945 <button class="play-btn" type="button" aria-label="Reproduzir vídeo" style="position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:72px;height:72px;border-radius:50%;border:0;background:rgba(255,255,255,.16);backdrop-filter:blur(6px);cursor:pointer;display:grid;place-items:center;box-shadow:0 10px 30px rgba(0,0,0,.35)">Marca HTML presente na saída da página.
1946 <svg width="28" height="28" viewBox="0 0 24 24" fill="#fff" aria-hidden="true"><path d="M8 5v14l11-7z"/></svg>Marca HTML presente na saída da página.
1947 <span class="sr" style="position:absolute;left:-9999px">Reproduzir vídeo</span>Marca HTML presente na saída da página.
1948 </button>Marca HTML presente na saída da página.
1949 </div>Marca HTML presente na saída da página.
1950 <?php endforeach; ?>Abre um bloco PHP executado no servidor.
1951 </div>Marca HTML presente na saída da página.
1952 Linha em branco usada para separar blocos do arquivo.
1953 <button id="heroPrev" aria-label="Anterior" style="position:absolute;left:14px;top:50%;transform:translateY(-50%);width:42px;height:42px;border-radius:50%;border:0;background:rgba(255,255,255,.14);color:#fff;cursor:pointer;display:grid;place-items:center">‹</button>Marca HTML presente na saída da página.
1954 <button id="heroNext" aria-label="Próximo" style="position:absolute;right:14px;top:50%;transform:translateY(-50%);width:42px;height:42px;border-radius:50%;border:0;background:rgba(255,255,255,.14);color:#fff;cursor:pointer;display:grid;place-items:center">›</button>Marca HTML presente na saída da página.
1955 Linha em branco usada para separar blocos do arquivo.
1956 <div id="heroDots" style="position:absolute;left:0;right:0;bottom:12px;display:flex;gap:8px;justify-content:center">Marca HTML presente na saída da página.
1957 <?php for ($i = 0, $n = count($HERO); $i < $n; $i++): ?>Abre um bloco PHP executado no servidor.
1958 <button type="button" data-i="<?=$i?>" aria-label="Ir para o vídeo <?=$i + 1?>" style="width:8px;height:8px;border-radius:50%;border:0;cursor:pointer;<?=$i === 0 ? 'background:#ffffffaa' : 'background:#ffffff55'?>"></button>Marca HTML presente na saída da página.
1959 <?php endfor; ?>Abre um bloco PHP executado no servidor.
1960 </div>Marca HTML presente na saída da página.
1961 </div>Marca HTML presente na saída da página.
1962 </div>Marca HTML presente na saída da página.
1963 Linha em branco usada para separar blocos do arquivo.
1964 <div>Marca HTML presente na saída da página.
1965 <h1 style="font-size:48px;line-height:1.1;margin:0 0 20px 0;font-weight:800;letter-spacing:.5px">Prótese Capilar em Cascavel<br>com Avaliação Profissional</h1>Marca HTML presente na saída da página.
1966 <p style="color:#cfe6dc;line-height:1.7;margin:0 0 28px 0;max-width:46ch">Atendimento com hora marcada, avaliação individual, orientação sobre aplicação, manutenção e acabamento para um visual natural e alinhado ao seu perfil.</p>Marca HTML presente na saída da página.
1967 <div style="display:flex;flex-direction:column;gap:16px;max-width:560px">Marca HTML presente na saída da página.
1968 <a id="ctaWhats" href="<?=h($WPP)?>" target="_blank" rel="noopener" style="display:block;text-align:center;background:#b8862d;color:#fff;padding:18px 24px;border-radius:32px;text-decoration:none;font-weight:700;letter-spacing:.3px;box-shadow:0 6px 24px rgba(19,170,120,.25)">FALAR COM O JACY PELO WHATSAPP</a>Marca HTML presente na saída da página.
1969 <a id="ctaApp" href="<?=h($AGENDA_LINK)?>" target="_blank" rel="noopener" style="display:block;text-align:center;background:transparent;color:#d1aa57;padding:18px 24px;border-radius:32px;text-decoration:none;font-weight:700;letter-spacing:.3px;border:2px solid rgba(215,239,230,.35)">AGENDAR PELO BARBERBOT</a>Marca HTML presente na saída da página.
1970 </div>Marca HTML presente na saída da página.
1971 </div>Marca HTML presente na saída da página.
1972 </div>Marca HTML presente na saída da página.
1973 </section>Marca HTML presente na saída da página.
1974 Linha em branco usada para separar blocos do arquivo.
1975 <?php if (!empty($GALERIA_ROWS)): ?>Abre um bloco PHP executado no servidor.
1976 <section id="galeria-banco" style="padding:40px 0;background:#0b0b0d;color:#fff">Marca HTML presente na saída da página.
1977 <div style="max-width:1200px;margin:0 auto;padding:0 16px">Marca HTML presente na saída da página.
1978 <h2 style="margin:0 0 22px;font-size:28px;font-weight:800;letter-spacing:.3px">Galeria de trabalhos</h2>Marca HTML presente na saída da página.
1979 Linha em branco usada para separar blocos do arquivo.
1980 <div id="galeriaWrap" style="position:relative">Marca HTML presente na saída da página.
1981 <button id="galPrev" type="button" aria-label="Anterior" style="position:absolute;left:-8px;top:45%;transform:translateY(-50%);width:44px;height:44px;border-radius:50%;border:0;cursor:pointer;background:rgba(255,255,255,.15);color:#fff;font-size:24px;z-index:2">‹</button>Marca HTML presente na saída da página.
1982 <button id="galNext" type="button" aria-label="Próximo" style="position:absolute;right:-8px;top:45%;transform:translateY(-50%);width:44px;height:44px;border-radius:50%;border:0;cursor:pointer;background:rgba(255,255,255,.15);color:#fff;font-size:24px;z-index:2">›</button>Marca HTML presente na saída da página.
1983 Linha em branco usada para separar blocos do arquivo.
1984 <div id="galeriaViewport" style="overflow:hidden">Marca HTML presente na saída da página.
1985 <div id="galTrack" style="display:flex;gap:22px;transition:none;will-change:transform">Marca HTML presente na saída da página.
1986 <?php foreach ($GALERIA_ROWS as $g): ?>Abre um bloco PHP executado no servidor.
1987 <figure class="galItem" data-jacy-open-whatsapp-modal="1" role="button" tabindex="0" aria-label="Abrir atendimento pelo WhatsApp" style="margin:0;min-width:25%;display:flex;flex-direction:column;align-items:center">Marca HTML presente na saída da página.
1988 <div style="width:100%;aspect-ratio:1/1.02;position:relative;border-radius:12px;overflow:hidden;background:#000">Marca HTML presente na saída da página.
1989 <img src="<?=h(jacy_fast_img_src((string)$g['src']))?>" alt="<?=h($g['titulo'] ?: 'Foto')?>" width="400" height="408" style="position:absolute;inset:0;width:100%;height:100%;object-fit:cover;display:block" loading="lazy" decoding="async" fetchpriority="low" onerror="this.onerror=null;this.src='/sistema/painel/img/foto_admin/sem-foto.jpg'">Marca HTML presente na saída da página.
1990 </div>Marca HTML presente na saída da página.
1991 <?php if (!empty($g['titulo'])): ?>Abre um bloco PHP executado no servidor.
1992 <figcaption style="margin-top:12px;font-weight:700;text-align:center"><?=h($g['titulo'])?></figcaption>Marca HTML presente na saída da página.
1993 <?php endif; ?>Abre um bloco PHP executado no servidor.
1994 </figure>Marca HTML presente na saída da página.
1995 <?php endforeach; ?>Abre um bloco PHP executado no servidor.
1996 </div>Marca HTML presente na saída da página.
1997 </div>Marca HTML presente na saída da página.
1998 </div>Marca HTML presente na saída da página.
1999 </div>Marca HTML presente na saída da página.
2000 </section>Marca HTML presente na saída da página.
2001 <?php endif; ?>Abre um bloco PHP executado no servidor.
2002 Linha em branco usada para separar blocos do arquivo.
2003 <section class="jacy-simulacao-section" style="background:linear-gradient(180deg,#090909 0%,#0f0c08 100%);padding:56px 0 48px;border-top:1px solid rgba(209,170,87,.18);border-bottom:1px solid rgba(209,170,87,.18);">Marca HTML presente na saída da página.
2004 <div style="max-width:1280px;margin:0 auto;padding:0 16px;">Marca HTML presente na saída da página.
2005 Linha em branco usada para separar blocos do arquivo.
2006 <div style="text-align:center;margin:0 auto 34px;max-width:980px;">Marca HTML presente na saída da página.
2007 <h2 style="margin:0 0 14px;font-size:42px;line-height:1.15;font-weight:800;color:#fff;">Marca HTML presente na saída da página.
2008 Simulação visual para apoiar sua avaliaçãoLinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2009 </h2>Marca HTML presente na saída da página.
2010 Linha em branco usada para separar blocos do arquivo.
2011 <p style="margin:0 auto;max-width:860px;color:#d7d7d7;line-height:1.8;font-size:16px;">Marca HTML presente na saída da página.
2012 Envie uma foto frontal para gerar uma prévia visual de referência. A simulação ajuda na conversa inicial e respeita a cor natural do cabelo. A definição final de cor, densidade e modelo é feita durante a avaliação profissional.Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2013 </p>Marca HTML presente na saída da página.
2014 </div>Marca HTML presente na saída da página.
2015 Linha em branco usada para separar blocos do arquivo.
2016 <div style="display:flex;flex-wrap:wrap;justify-content:center;gap:24px;margin-bottom:28px;align-items:stretch;">Marca HTML presente na saída da página.
2017 <div class="jacy-sim-card" style="flex:1 1 320px;max-width:390px;min-width:280px;background:linear-gradient(180deg,#f4ead7 0%,#e7d8bf 100%);border:1px solid rgba(209,170,87,.38);border-radius:14px;box-shadow:0 14px 34px rgba(0,0,0,.22);padding:28px 22px;text-align:center;">Marca HTML presente na saída da página.
2018 <div class="jacy-sim-num" style="width:72px;height:72px;line-height:72px;margin:0 auto 15px;border-radius:50%;background:linear-gradient(135deg,#d4ad5a 0%,#b8872d 100%);color:#17120b;font-size:28px;font-weight:900;box-shadow:0 10px 22px rgba(184,134,45,.24);">1</div>Marca HTML presente na saída da página.
2019 <h4 style="margin:0 0 10px;font-weight:900;color:#1f160a !important;text-shadow:none !important;opacity:1 !important;">Envie sua foto</h4>Marca HTML presente na saída da página.
2020 <p style="margin:0;color:#5c4a2f !important;line-height:1.7;text-shadow:none !important;opacity:1 !important;font-weight:600;">Envie uma foto frontal para gerar uma prévia visual de referência para o atendimento.</p>Marca HTML presente na saída da página.
2021 </div>Marca HTML presente na saída da página.
2022 Linha em branco usada para separar blocos do arquivo.
2023 <div class="jacy-sim-card" style="flex:1 1 320px;max-width:390px;min-width:280px;background:linear-gradient(180deg,#f4ead7 0%,#e7d8bf 100%);border:1px solid rgba(209,170,87,.38);border-radius:14px;box-shadow:0 14px 34px rgba(0,0,0,.22);padding:28px 22px;text-align:center;">Marca HTML presente na saída da página.
2024 <div class="jacy-sim-num" style="width:72px;height:72px;line-height:72px;margin:0 auto 15px;border-radius:50%;background:linear-gradient(135deg,#d4ad5a 0%,#b8872d 100%);color:#17120b;font-size:28px;font-weight:900;box-shadow:0 10px 22px rgba(184,134,45,.24);">2</div>Marca HTML presente na saída da página.
2025 <h4 style="margin:0 0 10px;font-weight:900;color:#1f160a !important;text-shadow:none !important;opacity:1 !important;">Prévia com referência natural</h4>Marca HTML presente na saída da página.
2026 <p style="margin:0;color:#5c4a2f !important;line-height:1.7;text-shadow:none !important;opacity:1 !important;font-weight:600;">A prévia considera a cor natural do cabelo e serve como apoio para a avaliação presencial ou online.</p>Marca HTML presente na saída da página.
2027 </div>Marca HTML presente na saída da página.
2028 Linha em branco usada para separar blocos do arquivo.
2029 <div class="jacy-sim-card" style="flex:1 1 320px;max-width:390px;min-width:280px;background:linear-gradient(180deg,#f4ead7 0%,#e7d8bf 100%);border:1px solid rgba(209,170,87,.38);border-radius:14px;box-shadow:0 14px 34px rgba(0,0,0,.22);padding:28px 22px;text-align:center;">Marca HTML presente na saída da página.
2030 <div class="jacy-sim-num" style="width:72px;height:72px;line-height:72px;margin:0 auto 15px;border-radius:50%;background:linear-gradient(135deg,#d4ad5a 0%,#b8872d 100%);color:#17120b;font-size:28px;font-weight:900;box-shadow:0 10px 22px rgba(184,134,45,.24);">3</div>Marca HTML presente na saída da página.
2031 <h4 style="margin:0 0 10px;font-weight:900;color:#1f160a !important;text-shadow:none !important;opacity:1 !important;">Receba uma referência visual</h4>Marca HTML presente na saída da página.
2032 <p style="margin:0;color:#5c4a2f !important;line-height:1.7;text-shadow:none !important;opacity:1 !important;font-weight:600;">Visualize uma referência antes do atendimento. O resultado final depende da avaliação, materiais, técnica de aplicação e manutenção.</p>Marca HTML presente na saída da página.
2033 </div>Marca HTML presente na saída da página.
2034 </div>Marca HTML presente na saída da página.
2035 Linha em branco usada para separar blocos do arquivo.
2036 <div style="max-width:760px;margin:0 auto;">Marca HTML presente na saída da página.
2037 <div class="jacy-sim-cta" style="text-align:center;padding:28px;background:linear-gradient(180deg,rgba(24,21,16,.94) 0%,rgba(16,14,11,.98) 100%);border:1px solid rgba(209,170,87,.24);border-radius:16px;box-shadow:0 18px 36px rgba(0,0,0,.26);">Marca HTML presente na saída da página.
2038 <h4 style="margin:0 0 12px;color:#fff;font-weight:700;">Solicite uma simulação visual com orientação profissional</h4>Marca HTML presente na saída da página.
2039 <p style="margin:0 0 20px;color:#d7d7d7;line-height:1.8;">Marca HTML presente na saída da página.
2040 Envie sua foto e receba uma prévia visual para iniciar sua avaliação. A definição final de cor, densidade e modelo será orientada pelo profissional durante o atendimento.Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2041 </p>Marca HTML presente na saída da página.
2042 Linha em branco usada para separar blocos do arquivo.
2043 <aLinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2044 href="#modalSimulacaoCliente"Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2045 id="btnAbrirSimuladorProtese"Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2046 data-toggle="modal"Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2047 data-target="#modalSimulacaoCliente"Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2048 role="button"Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2049 class="btn btn-primary btn-lg"Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2050 style="font-size:1.3rem;padding:12px 34px;border-radius:50px;text-decoration:none;display:inline-block;font-weight:900;background:linear-gradient(135deg,#d1aa57 0%,#b8862d 55%,#8f6520 100%);border:0;color:#111;box-shadow:0 12px 28px rgba(184,134,45,.28);"Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2051>Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2052 Solicitar simulação visualLinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2053</a>Marca HTML presente na saída da página.
2054 </div>Marca HTML presente na saída da página.
2055 </div>Marca HTML presente na saída da página.
2056 Linha em branco usada para separar blocos do arquivo.
2057 </div>Marca HTML presente na saída da página.
2058 </section>Marca HTML presente na saída da página.
2059 Linha em branco usada para separar blocos do arquivo.
2060 <section class="experience-section visitas-normal" style="background:linear-gradient(135deg,#11100d 0%,#1b1711 55%,#0f0d0a 100%); color:#e9e9ee; padding:56px 0 48px; border-top:1px solid #2a2a2a; border-bottom:1px solid #2a2a2a; position:relative; overflow:hidden">Marca HTML presente na saída da página.
2061 <div class="xp-wrap">Marca HTML presente na saída da página.
2062 <div class="xp-grid">Marca HTML presente na saída da página.
2063 <div class="xp-left-year">Marca HTML presente na saída da página.
2064 <div class="xp-year">1999</div>Marca HTML presente na saída da página.
2065 <div class="xp-subtitle">Início da nossa trajetória</div>Marca HTML presente na saída da página.
2066 <div class="xp-underline"></div>Marca HTML presente na saída da página.
2067 Linha em branco usada para separar blocos do arquivo.
2068 <div class="xp-visitas">Marca HTML presente na saída da página.
2069 <div style="font-size:2.2rem">👁️</div>Marca HTML presente na saída da página.
2070 <div style="text-align:left">Marca HTML presente na saída da página.
2071 <div class="xp-vis-num"><span class="counter-1999" data-target="0">0</span></div>Marca HTML presente na saída da página.
2072 <div class="xp-vis-label">Visitas ao site</div>Marca HTML presente na saída da página.
2073 </div>Marca HTML presente na saída da página.
2074 </div>Marca HTML presente na saída da página.
2075 </div>Marca HTML presente na saída da página.
2076 Linha em branco usada para separar blocos do arquivo.
2077 <div>Marca HTML presente na saída da página.
2078 <h2 class="xp-title">Experiência desde <span class="blue">1999</span></h2>Marca HTML presente na saída da página.
2079 <p class="xp-desc">Marca HTML presente na saída da página.
2080 Há mais de 25 anos, Jacy Cordeiro oferece atendimento personalizadoLinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2081em Cascavel, com avaliação individual, orientação sobre aplicação,Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2082manutenção e acabamento para um resultado discreto e alinhado aoLinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2083perfil de cada cliente.</p>Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2084 Linha em branco usada para separar blocos do arquivo.
2085 <div class="exp-stats">Marca HTML presente na saída da página.
2086 <div class="exp-card">Marca HTML presente na saída da página.
2087 <div class="exp-num exp-num--blue">+ 25 anos</div>Marca HTML presente na saída da página.
2088 <div class="exp-label">de experiências</div>Marca HTML presente na saída da página.
2089 </div>Marca HTML presente na saída da página.
2090 <div class="exp-card">Marca HTML presente na saída da página.
2091 <div class="exp-num exp-num--green">Atendimento </div>Marca HTML presente na saída da página.
2092 <div class="exp-label">personalizado</div>Marca HTML presente na saída da página.
2093 </div>Marca HTML presente na saída da página.
2094 <div class="exp-card">Marca HTML presente na saída da página.
2095 <div class="exp-num exp-num--gold">Resultado</div>Marca HTML presente na saída da página.
2096 <div class="exp-label">natural e discreto</div>Marca HTML presente na saída da página.
2097 </div>Marca HTML presente na saída da página.
2098 </div>Marca HTML presente na saída da página.
2099 Linha em branco usada para separar blocos do arquivo.
2100 <div class="xp-badges">Marca HTML presente na saída da página.
2101 <span class="xp-badge xp-badge--cert"><span class="dot">✔</span>Avaliação individual</span>Marca HTML presente na saída da página.
2102 <span class="xp-badge xp-badge--qual"><span class="dot">🏆</span>Experiência e cuidado</span>Marca HTML presente na saída da página.
2103 </div>Marca HTML presente na saída da página.
2104 </div>Marca HTML presente na saída da página.
2105 </div>Marca HTML presente na saída da página.
2106 </div>Marca HTML presente na saída da página.
2107 Linha em branco usada para separar blocos do arquivo.
2108 <div style="position:absolute;inset:auto -10% -40% -10%;height:300px;background:radial-gradient(60% 60% at 50% 0%,rgba(45,134,255,.25),transparent 60%)"></div>Marca HTML presente na saída da página.
2109 </section>Marca HTML presente na saída da página.
2110 Linha em branco usada para separar blocos do arquivo.
2111 <section style="background:#0b0b0d;color:#fff;padding:36px 0">Marca HTML presente na saída da página.
2112 <div style="max-width:1280px;margin:0 auto;padding:0 16px;display:flex;flex-wrap:wrap;gap:24px;align-items:center">Marca HTML presente na saída da página.
2113 <div style="flex:1 1 520px;min-width:280px">Marca HTML presente na saída da página.
2114 <div style="border-radius:14px;overflow:hidden;background:#000">Marca HTML presente na saída da página.
2115 <?phpAbre um bloco PHP executado no servidor.
2116 $url_video = isset($url_video) ? (string)$url_video : '';Atribui o valor ou resultado exibido à variável.
2117 $posicao_video = isset($posicao_video) ? (string)$posicao_video : '';Atribui o valor ou resultado exibido à variável.
2118 $imagem_sobre = isset($imagem_sobre) ? basename((string)$imagem_sobre) : 'sobre.jpg';Atribui o valor ou resultado exibido à variável.
2119 $texto_sobre = isset($texto_sobre) ? (string)$texto_sobre : '';Atribui o valor ou resultado exibido à variável.
2120 $videoEmCima = ($url_video !== '' && trim($posicao_video) === 'sobre');Atribui o valor ou resultado exibido à variável.
2121 $videoEmBaixo = ($url_video !== '' && trim($posicao_video) === 'abaixo');Atribui o valor ou resultado exibido à variável.
2122 Linha em branco usada para separar blocos do arquivo.
2123 if ($videoEmCima) {Avalia a condição escrita nesta linha.
2124 echo '<div style="position:relative;width:100%;padding-top:56.25%"><iframe src="about:blank" data-src="' . h($url_video) . '" class="js-lazy-iframe" title="Vídeo institucional" frameborder="0" loading="lazy" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen referrerpolicy="strict-origin-when-cross-origin" style="position:absolute;inset:0;width:100%;height:100%;display:block;border:0"></iframe></div>';Envia conteúdo para a saída da requisição.
2125 } else {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2126 $imgPath = "images/{$imagem_sobre}";Atribui o valor ou resultado exibido à variável.
2127 $webpPath = preg_replace('/\.(jpe?g|png)$/i', '.webp', $imgPath);Atribui o valor ou resultado exibido à variável.
2128 ?>Fecha o bloco PHP.
2129 <picture>Marca HTML presente na saída da página.
2130 <?php if ($webpPath && file_exists($webpPath)): ?>Abre um bloco PHP executado no servidor.
2131 <source type="image/webp" srcset="<?=h($webpPath)?>">Marca HTML presente na saída da página.
2132 <?php endif; ?>Abre um bloco PHP executado no servidor.
2133 <img src="<?=h($imgPath)?>" alt="Sobre nós" width="1200" height="675" loading="lazy" decoding="async" fetchpriority="low" style="width:100%;height:auto;display:block">Marca HTML presente na saída da página.
2134 </picture>Marca HTML presente na saída da página.
2135 <?php } ?>Abre um bloco PHP executado no servidor.
2136 </div>Marca HTML presente na saída da página.
2137 </div>Marca HTML presente na saída da página.
2138 Linha em branco usada para separar blocos do arquivo.
2139 <div style="flex:1 1 520px;min-width:280px;display:flex;align-items:center">Marca HTML presente na saída da página.
2140 <div style="width:100%">Marca HTML presente na saída da página.
2141 <h4 style="margin:0 0 14px;font-size:42px;line-height:1.15;font-weight:800;letter-spacing:.4px">Sobre Nós</h4>Marca HTML presente na saída da página.
2142 <p style="margin:0 0 22px;line-height:1.75;font-size:16px;color:#EDEDED"><?=nl2br(h($texto_sobre))?></p>Marca HTML presente na saída da página.
2143 <a href="#empresa" data-toggle="modal" data-target="#empresa" aria-controls="empresa" aria-label="Abrir informações da empresa" style="display:inline-block;background:#d1aa57;border:0;color:#fff;padding:14px 22px;border-radius:999px;font-weight:800;letter-spacing:.3px;text-decoration:none;box-shadow:0 8px 26px rgba(209,170,87,.35)">Mais Informações</a>Marca HTML presente na saída da página.
2144 </div>Marca HTML presente na saída da página.
2145 </div>Marca HTML presente na saída da página.
2146 </div>Marca HTML presente na saída da página.
2147 </section>Marca HTML presente na saída da página.
2148 Linha em branco usada para separar blocos do arquivo.
2149 <?php if (!empty($videoEmBaixo)): ?>Abre um bloco PHP executado no servidor.
2150 <div style="background:#0b0b0d;padding:12px 0">Marca HTML presente na saída da página.
2151 <div style="max-width:1280px;margin:0 auto;padding:0 16px">Marca HTML presente na saída da página.
2152 <div style="position:relative;width:100%;padding-top:56.25%;border-radius:14px;overflow:hidden;background:#000">Marca HTML presente na saída da página.
2153 <iframe class="video_mobile js-lazy-iframe" src="about:blank" data-src="<?=h($url_video)?>" title="Vídeo institucional" frameborder="0" loading="lazy" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen referrerpolicy="strict-origin-when-cross-origin" style="position:absolute;inset:0;width:100%;height:100%;display:block;border:0"></iframe>Marca HTML presente na saída da página.
2154 </div>Marca HTML presente na saída da página.
2155 </div>Marca HTML presente na saída da página.
2156 </div>Marca HTML presente na saída da página.
2157 <?php endif; ?>Abre um bloco PHP executado no servidor.
2158 Linha em branco usada para separar blocos do arquivo.
2159 <?phpAbre um bloco PHP executado no servidor.
2160 $resDep = [];Atribui o valor ou resultado exibido à variável.
2161 Linha em branco usada para separar blocos do arquivo.
2162 try {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2163 $__colsDep = $pdo ? $pdo->query("SHOW COLUMNS FROM comentarios")->fetchAll(PDO::FETCH_COLUMN) : [];Executa uma consulta pelo objeto PDO.
2164 $__selectDep = "nome, texto, foto";Atribui o valor ou resultado exibido à variável.
2165 Linha em branco usada para separar blocos do arquivo.
2166 if (in_array('video', $__colsDep, true)) {Avalia a condição escrita nesta linha.
2167 $__selectDep .= ", video";Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2168 } else {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2169 $__selectDep .= ", '' AS video";Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2170 }Fecha ou delimita a estrutura iniciada anteriormente.
2171 Linha em branco usada para separar blocos do arquivo.
2172 if (in_array('print_whatsapp', $__colsDep, true)) {Avalia a condição escrita nesta linha.
2173 $__selectDep .= ", print_whatsapp";Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2174 } else {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2175 $__selectDep .= ", '' AS print_whatsapp";Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2176 }Fecha ou delimita a estrutura iniciada anteriormente.
2177 Linha em branco usada para separar blocos do arquivo.
2178 $resDep = $pdo ? $pdo->query("SELECT {$__selectDep} FROM comentarios WHERE ativo='Sim' ORDER BY id DESC LIMIT 20")->fetchAll(PDO::FETCH_ASSOC) : [];Executa uma consulta pelo objeto PDO.
2179 } catch (Throwable $e) {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2180 try {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2181 $resDep = $pdo ? $pdo->query("SELECT nome, texto, foto, '' AS video, '' AS print_whatsapp FROM comentarios WHERE ativo='Sim' ORDER BY id DESC LIMIT 20")->fetchAll(PDO::FETCH_ASSOC) : [];Executa uma consulta pelo objeto PDO.
2182 } catch (Throwable $e) {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2183 $resDep = [];Atribui o valor ou resultado exibido à variável.
2184 }Fecha ou delimita a estrutura iniciada anteriormente.
2185 }Fecha ou delimita a estrutura iniciada anteriormente.
2186 Linha em branco usada para separar blocos do arquivo.
2187 if ($resDep && count($resDep) > 0):Avalia a condição escrita nesta linha.
2188 ?>Fecha o bloco PHP.
2189 Linha em branco usada para separar blocos do arquivo.
2190 <section id="depoimentos" class="depoimentos-protese-section">Marca HTML presente na saída da página.
2191 <div class="depoimentos-protese-container">Marca HTML presente na saída da página.
2192 <h2 class="depoimentos-protese-titulo">Depoimentos de clientes</h2>Marca HTML presente na saída da página.
2193 Linha em branco usada para separar blocos do arquivo.
2194 <div class="depoimentos-controle-protese">Marca HTML presente na saída da página.
2195 <button id="depPrev" type="button" aria-label="Anterior">‹</button>Marca HTML presente na saída da página.
2196 <div id="depDots" class="depoimentos-dots-protese"></div>Marca HTML presente na saída da página.
2197 <button id="depNext" type="button" aria-label="Próximo">›</button>Marca HTML presente na saída da página.
2198 </div>Marca HTML presente na saída da página.
2199 Linha em branco usada para separar blocos do arquivo.
2200 <div class="depoimentos-viewport-protese">Marca HTML presente na saída da página.
2201 <div id="depTrack" class="depoimentos-track-protese">Marca HTML presente na saída da página.
2202 <?php foreach ($resDep as $c):Abre um bloco PHP executado no servidor.
2203 $nome = trim($c['nome'] ?? '');Atribui o valor ou resultado exibido à variável.
2204 $texto = trim($c['texto'] ?? '');Atribui o valor ou resultado exibido à variável.
2205 $foto = basename((string)($c['foto'] ?? ''));Atribui o valor ou resultado exibido à variável.
2206 $video = basename((string)($c['video'] ?? ''));Atribui o valor ou resultado exibido à variável.
2207 $print_whatsapp = basename((string)($c['print_whatsapp'] ?? ''));Atribui o valor ou resultado exibido à variável.
2208 Linha em branco usada para separar blocos do arquivo.
2209 $path = "sistema/painel/img/comentarios/" . ($foto ?: 'sem-foto.jpg');Atribui o valor ou resultado exibido à variável.
2210 $webp = preg_replace('/\.(jpe?g|png)$/i', '.webp', $path);Atribui o valor ou resultado exibido à variável.
2211 $src = (is_file($_SERVER['DOCUMENT_ROOT'] . '/' . $webp) ? $webp : $path);Atribui o valor ou resultado exibido à variável.
2212 Linha em branco usada para separar blocos do arquivo.
2213 $videoSrc = $video !== '' ? "sistema/painel/img/comentarios/" . $video : '';Atribui o valor ou resultado exibido à variável.
2214 $printSrc = $print_whatsapp !== '' ? "sistema/painel/img/comentarios/" . $print_whatsapp : '';Atribui o valor ou resultado exibido à variável.
2215 ?>Fecha o bloco PHP.
2216 <article class="depItem depoimento-item-protese">Marca HTML presente na saída da página.
2217 <div class="depoimento-card-protese">Marca HTML presente na saída da página.
2218 <div class="depoimento-card-topo-protese">Marca HTML presente na saída da página.
2219 <imgLinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2220 class="depoimento-card-foto-protese"Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2221 src="<?=h(jacy_fast_img_src((string)$src))?>"Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2222 alt="<?=h($nome ?: 'Cliente')?>"Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2223 width="96"Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2224 height="96"Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2225 loading="lazy"Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2226 decoding="async"Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2227 fetchpriority="low"Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2228 >Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2229 Linha em branco usada para separar blocos do arquivo.
2230 <div class="depoimento-card-info-protese">Marca HTML presente na saída da página.
2231 <strong><?=h($nome ?: 'Cliente')?></strong>Marca HTML presente na saída da página.
2232 <span>Avaliação verificada</span>Marca HTML presente na saída da página.
2233 </div>Marca HTML presente na saída da página.
2234 </div>Marca HTML presente na saída da página.
2235 Linha em branco usada para separar blocos do arquivo.
2236 <div class="depoimento-card-corpo-protese">Marca HTML presente na saída da página.
2237 <p class="depoimento-card-texto-protese"><?=nl2br(h($texto))?></p>Marca HTML presente na saída da página.
2238 Linha em branco usada para separar blocos do arquivo.
2239 <?php if ($videoSrc !== '' || $printSrc !== ''): ?>Abre um bloco PHP executado no servidor.
2240 <div class="depoimento-card-midias-protese">Marca HTML presente na saída da página.
2241 <?php if ($videoSrc !== ''): ?>Abre um bloco PHP executado no servidor.
2242 <div class="depoimento-card-midia-protese">Marca HTML presente na saída da página.
2243 <video controls preload="metadata" playsinline>Marca HTML presente na saída da página.
2244 <source src="<?=h($videoSrc)?>" type="video/mp4">Marca HTML presente na saída da página.
2245 </video>Marca HTML presente na saída da página.
2246 </div>Marca HTML presente na saída da página.
2247 <?php endif; ?>Abre um bloco PHP executado no servidor.
2248 Linha em branco usada para separar blocos do arquivo.
2249 <?php if ($printSrc !== ''): ?>Abre um bloco PHP executado no servidor.
2250 <div class="depoimento-card-midia-protese">Marca HTML presente na saída da página.
2251 <imgLinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2252 src="<?=h($printSrc)?>"Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2253 alt="Print do WhatsApp do depoimento de <?=h($nome ?: 'cliente')?>"Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2254 loading="lazy"Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2255 decoding="async"Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2256 >Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2257 </div>Marca HTML presente na saída da página.
2258 <?php endif; ?>Abre um bloco PHP executado no servidor.
2259 </div>Marca HTML presente na saída da página.
2260 <?php else: ?>Abre um bloco PHP executado no servidor.
2261 <div class="depoimento-card-sem-midia-protese">Marca HTML presente na saída da página.
2262 Depoimento cliente satisfeit.Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2263 </div>Marca HTML presente na saída da página.
2264 <?php endif; ?>Abre um bloco PHP executado no servidor.
2265 </div>Marca HTML presente na saída da página.
2266 </div>Marca HTML presente na saída da página.
2267 </article>Marca HTML presente na saída da página.
2268 <?php endforeach; ?>Abre um bloco PHP executado no servidor.
2269 </div>Marca HTML presente na saída da página.
2270 </div>Marca HTML presente na saída da página.
2271 Linha em branco usada para separar blocos do arquivo.
2272 <div class="depoimentos-protese-botao">Marca HTML presente na saída da página.
2273 <a href="#modalComentario" data-toggle="modal" data-target="#modalComentario">Enviar depoimento</a>Marca HTML presente na saída da página.
2274 </div>Marca HTML presente na saída da página.
2275 </div>Marca HTML presente na saída da página.
2276 </section>Marca HTML presente na saída da página.
2277 <?php endif; ?>Abre um bloco PHP executado no servidor.
2278</main>Marca HTML presente na saída da página.
2279 Linha em branco usada para separar blocos do arquivo.
2280<?php require_once("rodape.php"); ?>Abre um bloco PHP executado no servidor.
2281 Linha em branco usada para separar blocos do arquivo.
2282<div class="modal fade" id="modalSimulacaoCliente" tabindex="-1" role="dialog" aria-labelledby="modalSimulacaoClienteLabel" aria-hidden="true">Marca HTML presente na saída da página.
2283 <div class="modal-dialog modal-xl" role="document">Marca HTML presente na saída da página.
2284 <div class="modal-content">Marca HTML presente na saída da página.
2285 <div class="modal-header">Marca HTML presente na saída da página.
2286 <h4 class="modal-title" id="modalSimulacaoClienteLabel">Simulação Visual de Prótese Capilar</h4>Marca HTML presente na saída da página.
2287 <button type="button" class="close" data-dismiss="modal" aria-label="Fechar modal">Marca HTML presente na saída da página.
2288 <span aria-hidden="true">&times;</span>Marca HTML presente na saída da página.
2289 </button>Marca HTML presente na saída da página.
2290 </div>Marca HTML presente na saída da página.
2291 Linha em branco usada para separar blocos do arquivo.
2292 <form id="form_simulacao_cliente" method="post" action="javascript:void(0);" enctype="multipart/form-data" onsubmit="return false;">Marca HTML presente na saída da página.
2293 <div class="modal-body">Marca HTML presente na saída da página.
2294 <div class="alert alert-info" style="font-size:14px;line-height:22px;">Marca HTML presente na saída da página.
2295 Envie uma foto frontal para uma prévia visual de referência. A imagem será usada para atendimento e simulação, conforme a Política de Privacidade.Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2296 </div>Marca HTML presente na saída da página.
2297 Linha em branco usada para separar blocos do arquivo.
2298 <div class="row">Marca HTML presente na saída da página.
2299 <div class="col-md-6">Marca HTML presente na saída da página.
2300 <div class="form-group">Marca HTML presente na saída da página.
2301 <label for="nome_simulacao_cliente">Seu Nome *</label>Marca HTML presente na saída da página.
2302 <input type="text" class="form-control" id="nome_simulacao_cliente" name="nome" autocomplete="name" placeholder="Digite seu nome" required>Marca HTML presente na saída da página.
2303 </div>Marca HTML presente na saída da página.
2304 </div>Marca HTML presente na saída da página.
2305 Linha em branco usada para separar blocos do arquivo.
2306 <div class="col-md-6">Marca HTML presente na saída da página.
2307 <div class="form-group">Marca HTML presente na saída da página.
2308 <label for="telefone_simulacao_cliente">WhatsApp *</label>Marca HTML presente na saída da página.
2309 <input type="tel" class="form-control" id="telefone_simulacao_cliente" name="telefone" autocomplete="tel" inputmode="tel" placeholder="(00) 00000-0000" maxlength="15" required>Marca HTML presente na saída da página.
2310 </div>Marca HTML presente na saída da página.
2311 </div>Marca HTML presente na saída da página.
2312 </div>Marca HTML presente na saída da página.
2313 Linha em branco usada para separar blocos do arquivo.
2314 <div class="row">Marca HTML presente na saída da página.
2315 <div class="col-md-12">Marca HTML presente na saída da página.
2316 <div class="form-group">Marca HTML presente na saída da página.
2317 <label for="foto_simulacao_cliente">Escolha sua foto</label>Marca HTML presente na saída da página.
2318 <input type="file" class="form-control" id="foto_simulacao_cliente" name="foto" accept=".jpg,.jpeg,.png,.webp" onchange="carregarPreviewSimulacaoCliente()" required>Marca HTML presente na saída da página.
2319 </div>Marca HTML presente na saída da página.
2320 </div>Marca HTML presente na saída da página.
2321 </div>Marca HTML presente na saída da página.
2322 Linha em branco usada para separar blocos do arquivo.
2323 <div class="row linha-imagens">Marca HTML presente na saída da página.
2324 <div class="col-md-6">Marca HTML presente na saída da página.
2325 <div class="painel-comparacao-simulacao">Marca HTML presente na saída da página.
2326 <span class="selo-comparacao">Antes</span>Marca HTML presente na saída da página.
2327 <div class="titulo-painel">Imagem Original</div>Marca HTML presente na saída da página.
2328 <div class="box-imagem-simulacao">Marca HTML presente na saída da página.
2329 <img src="/sistema/painel/images/simulacoes/sem-foto.jpg" id="preview_original_simulacao_cliente" alt="Prévia da imagem original enviada" width="260" height="260" loading="lazy" decoding="async" fetchpriority="low">Marca HTML presente na saída da página.
2330 </div>Marca HTML presente na saída da página.
2331 <div class="legenda-simulacao">Foto enviada para referência visual no atendimento.</div>Marca HTML presente na saída da página.
2332 </div>Marca HTML presente na saída da página.
2333 </div>Marca HTML presente na saída da página.
2334 Linha em branco usada para separar blocos do arquivo.
2335 <div class="col-md-6">Marca HTML presente na saída da página.
2336 <div class="painel-comparacao-simulacao">Marca HTML presente na saída da página.
2337 <span class="selo-comparacao">Depois</span>Marca HTML presente na saída da página.
2338 <div class="titulo-painel">Imagem Simulada</div>Marca HTML presente na saída da página.
2339 <div class="box-imagem-simulacao">Marca HTML presente na saída da página.
2340 <img src="/sistema/painel/images/simulacoes/sem-foto.jpg" id="preview_resultado_simulacao_cliente" alt="Prévia da simulação gerada" width="260" height="260" loading="lazy" decoding="async" fetchpriority="low">Marca HTML presente na saída da página.
2341 </div>Marca HTML presente na saída da página.
2342 <div class="legenda-simulacao">Prévia visual gerada para apoiar a avaliação profissional.</div>Marca HTML presente na saída da página.
2343 </div>Marca HTML presente na saída da página.
2344 </div>Marca HTML presente na saída da página.
2345 </div>Marca HTML presente na saída da página.
2346 Linha em branco usada para separar blocos do arquivo.
2347 <div class="row linha-botao">Marca HTML presente na saída da página.
2348 <div class="col-md-12">Marca HTML presente na saída da página.
2349 <button type="button" id="btn_simular_cliente" class="btn btn-primary btn-block" onclick="enviarSimulacaoCliente()">Marca HTML presente na saída da página.
2350 <i id="icone_btn_simular_cliente" class="fa fa-magic"></i>Marca HTML presente na saída da página.
2351 <span id="texto_btn_simular_cliente">Solicitar simulação</span>Marca HTML presente na saída da página.
2352 </button>Marca HTML presente na saída da página.
2353 </div>Marca HTML presente na saída da página.
2354 </div>Marca HTML presente na saída da página.
2355 Linha em branco usada para separar blocos do arquivo.
2356 <div class="row" style="margin-top:12px;">Marca HTML presente na saída da página.
2357 <div class="col-md-12">Marca HTML presente na saída da página.
2358 <div id="mensagem_simulacao_cliente" role="status" aria-live="polite" style="text-align:center"></div>Marca HTML presente na saída da página.
2359 </div>Marca HTML presente na saída da página.
2360 </div>Marca HTML presente na saída da página.
2361 </div>Marca HTML presente na saída da página.
2362 </form>Marca HTML presente na saída da página.
2363 </div>Marca HTML presente na saída da página.
2364 </div>Marca HTML presente na saída da página.
2365</div>Marca HTML presente na saída da página.
2366 Linha em branco usada para separar blocos do arquivo.
2367<div class="modal fade" id="modalComentario" tabindex="-1" role="dialog" aria-labelledby="modalComentarioLabel" aria-hidden="true">Marca HTML presente na saída da página.
2368 <div class="modal-dialog" role="document" style="max-width:760px">Marca HTML presente na saída da página.
2369 <div class="modal-content" style="background:#0f0f10;color:#eaeef3;border:1px solid #2a2a2c;border-radius:12px;overflow:hidden">Marca HTML presente na saída da página.
2370 <div class="modal-header" style="border:0;padding:14px 16px">Marca HTML presente na saída da página.
2371 <h5 class="modal-title" id="modalComentarioLabel" style="margin:0;font-weight:800;letter-spacing:.3px">Enviar depoimento</h5>Marca HTML presente na saída da página.
2372 <button type="button" class="close" data-dismiss="modal" aria-label="Fechar" style="border:0;background:transparent;color:#eaeef3;font-size:28px;line-height:1;opacity:.9;cursor:pointer"><span aria-hidden="true">&times;</span></button>Marca HTML presente na saída da página.
2373 </div>Marca HTML presente na saída da página.
2374 Linha em branco usada para separar blocos do arquivo.
2375 <form id="form" enctype="multipart/form-data">Marca HTML presente na saída da página.
2376 <div class="modal-body" style="padding:10px 16px 6px">Marca HTML presente na saída da página.
2377 <div style="margin-bottom:12px">Marca HTML presente na saída da página.
2378 <label for="nome_cliente" style="display:block;margin:0 0 6px;font-weight:700">Nome</label>Marca HTML presente na saída da página.
2379 <input type="text" id="nome_cliente" name="nome" autocomplete="name" placeholder="Seu nome completo" required class="form-control" style="width:100%;background:#eaecef;border:0;border-radius:8px;box-shadow:none;padding:12px 14px;outline:none;color:#111">Marca HTML presente na saída da página.
2380 </div>Marca HTML presente na saída da página.
2381 Linha em branco usada para separar blocos do arquivo.
2382 <div style="margin-bottom:16px">Marca HTML presente na saída da página.
2383 <label for="texto_cliente" style="display:block;margin:0 0 6px;font-weight:700">Texto <small style="opacity:.8;font-weight:400">(até 500 caracteres)</small></label>Marca HTML presente na saída da página.
2384 <textarea id="texto_cliente" name="texto" maxlength="500" rows="4" required placeholder="Seu depoimento" class="form-control" style="width:100%;background:#eaecef;border:0;border-radius:8px;box-shadow:none;padding:12px 14px;outline:none;color:#111"></textarea>Marca HTML presente na saída da página.
2385 </div>Marca HTML presente na saída da página.
2386 Linha em branco usada para separar blocos do arquivo.
2387 <div style="display:flex;align-items:flex-end;gap:16px;flex-wrap:wrap">Marca HTML presente na saída da página.
2388 <div style="flex:1 1 360px">Marca HTML presente na saída da página.
2389 <label for="foto" style="display:block;margin:0 0 6px;font-weight:700">Foto</label>Marca HTML presente na saída da página.
2390 <input id="foto" name="foto" type="file" accept=".jpg,.jpeg,.png,.webp" class="form-control" onchange="carregarImg()" style="width:100%;background:#eaecef;border:0;border-radius:8px;box-shadow:none;padding:10px 12px;outline:none;color:#111">Marca HTML presente na saída da página.
2391 <div style="margin-top:6px;font-size:12px;opacity:.8">Opcional: JPG/PNG/WebP (até 5MB)</div>Marca HTML presente na saída da página.
2392 </div>Marca HTML presente na saída da página.
2393 Linha em branco usada para separar blocos do arquivo.
2394 <div id="divImg" style="flex:0 0 110px;margin-left:auto;display:grid;place-items:center">Marca HTML presente na saída da página.
2395 <img id="target" alt="Pré-visualização" src="sistema/painel/img/comentarios/sem-foto.jpg" width="96" height="96" loading="lazy" decoding="async" fetchpriority="low" style="display:block;width:96px;height:96px;object-fit:cover;border-radius:50%;border:2px solid #2a2a2c;background:#000">Marca HTML presente na saída da página.
2396 </div>Marca HTML presente na saída da página.
2397 </div>Marca HTML presente na saída da página.
2398 Linha em branco usada para separar blocos do arquivo.
2399 <div style="margin-top:14px">Marca HTML presente na saída da página.
2400 <label for="video" style="display:block;margin:0 0 6px;font-weight:700">Vídeo do depoimento</label>Marca HTML presente na saída da página.
2401 <input id="video" name="video" type="file" accept=".mp4,.mov,.webm,.3gp,.m4v,video/*" class="form-control" style="width:100%;background:#eaecef;border:0;border-radius:8px;box-shadow:none;padding:10px 12px;outline:none;color:#111">Marca HTML presente na saída da página.
2402 <div style="margin-top:6px;font-size:12px;opacity:.8">Opcional: MP4, MOV, WEBM, 3GP ou M4V (até 80MB)</div>Marca HTML presente na saída da página.
2403 </div>Marca HTML presente na saída da página.
2404 Linha em branco usada para separar blocos do arquivo.
2405 <div style="margin-top:14px">Marca HTML presente na saída da página.
2406 <label for="print_whatsapp" style="display:block;margin:0 0 6px;font-weight:700">Print do WhatsApp</label>Marca HTML presente na saída da página.
2407 <input id="print_whatsapp" name="print_whatsapp" type="file" accept=".jpg,.jpeg,.png,.webp" class="form-control" style="width:100%;background:#eaecef;border:0;border-radius:8px;box-shadow:none;padding:10px 12px;outline:none;color:#111">Marca HTML presente na saída da página.
2408 <div style="margin-top:6px;font-size:12px;opacity:.8">Opcional: print da conversa em JPG/PNG/WebP (até 5MB)</div>Marca HTML presente na saída da página.
2409 </div>Marca HTML presente na saída da página.
2410 Linha em branco usada para separar blocos do arquivo.
2411 <input type="hidden" name="id" id="id">Marca HTML presente na saída da página.
2412 <input type="hidden" name="cliente" value="1">Marca HTML presente na saída da página.
2413 <div id="mensagem-comentario" role="status" aria-live="polite" style="margin-top:12px;text-align:center;font-size:13px;min-height:18px"></div>Marca HTML presente na saída da página.
2414 </div>Marca HTML presente na saída da página.
2415 Linha em branco usada para separar blocos do arquivo.
2416 <div class="modal-footer" style="border-top:1px solid #24262b;padding:12px 16px;display:flex;gap:10px;justify-content:flex-end">Marca HTML presente na saída da página.
2417 <button type="button" class="btn btn-secondary" data-dismiss="modal" style="background:transparent;color:#eaeef3;border:1px solid #333;border-radius:10px;padding:10px 18px;font-weight:700;cursor:pointer">Cancelar</button>Marca HTML presente na saída da página.
2418 <button type="submit" class="btn btn-primary" style="background:#b8862d;border:0;border-radius:10px;padding:10px 18px;font-weight:700;cursor:pointer">Inserir</button>Marca HTML presente na saída da página.
2419 </div>Marca HTML presente na saída da página.
2420 </form>Marca HTML presente na saída da página.
2421 </div>Marca HTML presente na saída da página.
2422 </div>Marca HTML presente na saída da página.
2423</div>Marca HTML presente na saída da página.
2424 Linha em branco usada para separar blocos do arquivo.
2425<div id="empresa" class="modal fade" role="dialog">Marca HTML presente na saída da página.
2426 <div class="modal-dialog modal-lg">Marca HTML presente na saída da página.
2427 <div class="modal-content">Marca HTML presente na saída da página.
2428 <form method="POST" action="">Marca HTML presente na saída da página.
2429 <div class="modal-header">Marca HTML presente na saída da página.
2430 <h1 class="modal-title"><small>JACY CABELEIREIRO</small></h1>Marca HTML presente na saída da página.
2431 <button type="button" class="close" data-dismiss="modal" aria-label="Fechar modal">&times;</button>Marca HTML presente na saída da página.
2432 </div>Marca HTML presente na saída da página.
2433 </form>Marca HTML presente na saída da página.
2434 Linha em branco usada para separar blocos do arquivo.
2435 <div class="modal-body">Marca HTML presente na saída da página.
2436 <p class="text-muted"><small>Com mais de 25 anos de experiência, Jacy Cordeiro atende com foco em técnica, acabamento e orientação personalizada.<br>Especializado em cortes, barba e prótese capilar, trabalha com avaliação individual para indicar o melhor caminho de acordo com o perfil de cada cliente.<br><br>💇‍♂️ Cabeleireiro & Barbeiro<br>✨ Especialista em Prótese Capilar<br>📆 Atendimento com hora marcada<br>✅ Aplicação, manutenção e acabamento natural<br>Agende uma avaliação e converse diretamente com o profissional.</small></p>Marca HTML presente na saída da página.
2437 <p class="text-muted"><small>Jacy Cordeiro - CNPJ: 38.896.614/0001-40.<br>Assista o vídeo a seguir.</small></p>Marca HTML presente na saída da página.
2438 <iframe width="100%" height="500" src="about:blank" data-src="https://www.youtube.com/embed/fO_s7jlO1tU?si=n3Yntmowyfms6aFm&amp;controls=0" class="js-lazy-iframe" title="Vídeo sobre Jacy Cabeleireiro" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen loading="lazy" referrerpolicy="strict-origin-when-cross-origin"></iframe>Marca HTML presente na saída da página.
2439 <p class="text-muted" align="center"><small>"Motivação é aquilo que te faz começar. Habito é aquilo que te faz continuar."</small></p>Marca HTML presente na saída da página.
2440 </div>Marca HTML presente na saída da página.
2441 </div>Marca HTML presente na saída da página.
2442 </div>Marca HTML presente na saída da página.
2443</div>Marca HTML presente na saída da página.
2444 Linha em branco usada para separar blocos do arquivo.
2445<div id="modalTermos" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="modalTermosLabel" aria-hidden="true">Marca HTML presente na saída da página.
2446 <div class="modal-dialog modal-lg" role="document">Marca HTML presente na saída da página.
2447 <div class="modal-content">Marca HTML presente na saída da página.
2448 <div class="modal-header">Marca HTML presente na saída da página.
2449 <h1 class="modal-title" id="modalTermosLabel"><small>Termos de Uso</small></h1>Marca HTML presente na saída da página.
2450 <button type="button" class="close" data-dismiss="modal" aria-label="Fechar"><span aria-hidden="true">&times;</span></button>Marca HTML presente na saída da página.
2451 </div>Marca HTML presente na saída da página.
2452 Linha em branco usada para separar blocos do arquivo.
2453 <div class="modal-body">Marca HTML presente na saída da página.
2454 <div class="col-lg-12"><span class="text-muted"><small><i>Marca HTML presente na saída da página.
2455 <br>Marca HTML presente na saída da página.
2456 <h2><span style="color:#444">1. Termos</span></h2>Marca HTML presente na saída da página.
2457 <p><span style="color:#444">Ao acessar ao site <a href="<?=h($AGENDA_LINK)?>">Jacy Cabeleireiro</a>, concorda em cumprir estes termos de serviço, todas as leis e regulamentos aplicáveis ​​e concorda que é responsável pelo cumprimento de todas as leis locais aplicáveis. Se você não concordar com algum desses termos, está proibido de usar ou acessar este site. Os materiais contidos neste site são protegidos pelas leis de direitos autorais e marcas comerciais aplicáveis.</span></p>Marca HTML presente na saída da página.
2458 <h2><span style="color:#444">2. Uso de Licença</span></h2>Marca HTML presente na saída da página.
2459 <p><span style="color:#444">É concedida permissão para baixar temporariamente uma cópia dos materiais (informações ou software) no site Jacy Cabeleireiro , apenas para visualização transitória pessoal e não comercial. Esta é a concessão de uma licença, não uma transferência de título e, sob esta licença, você não pode:&nbsp;</span></p>Marca HTML presente na saída da página.
2460 <ol>Marca HTML presente na saída da página.
2461 <li><span style="color:#444">modificar ou copiar os materiais;&nbsp;</span></li>Marca HTML presente na saída da página.
2462 <li><span style="color:#444">usar os materiais para qualquer finalidade comercial ou para exibição pública (comercial ou não comercial);&nbsp;</span></li>Marca HTML presente na saída da página.
2463 <li><span style="color:#444">tentar descompilar ou fazer engenharia reversa de qualquer software contido no site Jacy Cabeleireiro;&nbsp;</span></li>Marca HTML presente na saída da página.
2464 <li><span style="color:#444">remover quaisquer direitos autorais ou outras notações de propriedade dos materiais; ou&nbsp;</span></li>Marca HTML presente na saída da página.
2465 <li><span style="color:#444">transferir os materiais para outra pessoa ou 'espelhe' os materiais em qualquer outro servidor.</span></li>Marca HTML presente na saída da página.
2466 </ol>Marca HTML presente na saída da página.
2467 <p><span style="color:#444">Esta licença será automaticamente rescindida se você violar alguma dessas restrições e poderá ser rescindida por Jacy Cabeleireiro a qualquer momento. Ao encerrar a visualização desses materiais ou após o término desta licença, você deve apagar todos os materiais baixados em sua posse, seja em formato eletrónico ou impresso.</span></p>Marca HTML presente na saída da página.
2468 <h2><span style="color:#444">3. Isenção de responsabilidade</span></h2>Marca HTML presente na saída da página.
2469 <ol>Marca HTML presente na saída da página.
2470 <li><span style="color:#444">Os materiais no site da Jacy Cabeleireiro são fornecidos 'como estão'. Jacy Cabeleireiro não oferece garantias, expressas ou implícitas, e, por este meio, isenta e nega todas as outras garantias, incluindo, sem limitação, garantias implícitas ou condições de comercialização, adequação a um fim específico ou não violação de propriedade intelectual ou outra violação de direitos.</span></li>Marca HTML presente na saída da página.
2471 <li><span style="color:#444">Além disso, o Jacy Cabeleireiro não garante ou faz qualquer representação relativa à precisão, aos resultados prováveis ​​ou à confiabilidade do uso dos materiais em seu site ou de outra forma relacionado a esses materiais ou em sites vinculados a este site.</span></li>Marca HTML presente na saída da página.
2472 </ol>Marca HTML presente na saída da página.
2473 <h2><span style="color:#444">4. Limitações</span></h2>Marca HTML presente na saída da página.
2474 <p><span style="color:#444">Em nenhum caso o Jacy Cabeleireiro ou seus fornecedores serão responsáveis ​​por quaisquer danos (incluindo, sem limitação, danos por perda de dados ou lucro ou devido a interrupção dos negócios) decorrentes do uso ou da incapacidade de usar os materiais em Jacy Cabeleireiro, mesmo que Jacy Cabeleireiro ou um representante autorizado da Jacy Cabeleireiro tenha sido notificado oralmente ou por escrito da possibilidade de tais danos. Como algumas jurisdições não permitem limitações em garantias implícitas, ou limitações de responsabilidade por danos consequentes ou incidentais, essas limitações podem não se aplicar a você.</span></p>Marca HTML presente na saída da página.
2475 <h2><span style="color:#444">5. Precisão dos materiais</span></h2>Marca HTML presente na saída da página.
2476 <p><span style="color:#444">Os materiais exibidos no site da Jacy Cabeleireiro podem incluir erros técnicos, tipográficos ou fotográficos. Jacy Cabeleireiro não garante que qualquer material em seu site seja preciso, completo ou atual. Jacy Cabeleireiro pode fazer alterações nos materiais contidos em seu site a qualquer momento, sem aviso prévio. No entanto, Jacy Cabeleireiro não se compromete a atualizar os materiais.</span></p>Marca HTML presente na saída da página.
2477 <h2><span style="color:#444">6. Links</span></h2>Marca HTML presente na saída da página.
2478 <p><span style="color:#444">O Jacy Cabeleireiro não analisou todos os sites vinculados ao seu site e não é responsável pelo conteúdo de nenhum site vinculado. A inclusão de qualquer link não implica endosso por Jacy Cabeleireiro do site. O uso de qualquer site vinculado é por conta e risco do usuário.</span></p>Marca HTML presente na saída da página.
2479 <h3><span style="color:#444">Modificações</span></h3>Marca HTML presente na saída da página.
2480 <p><span style="color:#444">O Jacy Cabeleireiro pode revisar estes termos de serviço do site a qualquer momento, sem aviso prévio. Ao usar este site, você concorda em ficar vinculado à versão atual desses termos de serviço.</span></p>Marca HTML presente na saída da página.
2481 <h3><span style="color:#444">Lei aplicável</span></h3>Marca HTML presente na saída da página.
2482 <p><span style="color:#444">Estes termos e condições são regidos e interpretados de acordo com as leis do Jacy Cabeleireiro e você se submete irrevogavelmente à jurisdição exclusiva dos tribunais naquele estado ou localidade.</span></p>Marca HTML presente na saída da página.
2483 </i></small></span></div>Marca HTML presente na saída da página.
2484 </div>Marca HTML presente na saída da página.
2485 Linha em branco usada para separar blocos do arquivo.
2486 <div class="modal-footer">Marca HTML presente na saída da página.
2487 <small><span class="text-muted ml-4">WhatsApp <a class="text-muted" href="https://api.whatsapp.com/send?1=pt_BR&phone=<?=$tel_whatsapp?>" target="_blank" rel="noopener"><?=$whatsapp_sistema?></a></span></small>Marca HTML presente na saída da página.
2488 </div>Marca HTML presente na saída da página.
2489 </div>Marca HTML presente na saída da página.
2490 </div>Marca HTML presente na saída da página.
2491</div>Marca HTML presente na saída da página.
2492 Linha em branco usada para separar blocos do arquivo.
2493<div id="privacidade" class="modal fade" role="dialog" aria-hidden="true">Marca HTML presente na saída da página.
2494 <div class="modal-dialog modal-lg">Marca HTML presente na saída da página.
2495 <div class="modal-content" style="background:#0f0f10;color:#e6e6e6">Marca HTML presente na saída da página.
2496 <div class="modal-header" style="border-bottom:1px solid #2a2a2c">Marca HTML presente na saída da página.
2497 <h5 class="modal-title" style="color:#fff;margin:0">Política de privacidade</h5>Marca HTML presente na saída da página.
2498 <button type="button" class="close" data-dismiss="modal" aria-label="Fechar" style="color:#e6e6e6;opacity:1"><span aria-hidden="true">&times;</span></button>Marca HTML presente na saída da página.
2499 </div>Marca HTML presente na saída da página.
2500 Linha em branco usada para separar blocos do arquivo.
2501 <div class="modal-body" style="line-height:1.6">Marca HTML presente na saída da página.
2502 <p>A sua privacidade é importante para nós. É política do <strong>Jacy Cabeleireiro</strong> respeitar a sua privacidade em relação a qualquer informação sua que possamos coletar no site <a href="<?=h($AGENDA_LINK)?>" target="_blank" rel="noopener" style="color:#e6e6e6;text-decoration:underline">Jacy Cabeleireiro</a> e outros sites que possuímos e operamos.</p>Marca HTML presente na saída da página.
2503 <p>Solicitamos informações pessoais apenas quando realmente precisamos delas para lhe fornecer um serviço. Fazemos isso por meios justos e legais, com o seu conhecimento e consentimento. Também informamos por que estamos coletando e como será usado.</p>Marca HTML presente na saída da página.
2504 <p>Apenas retemos as informações coletadas pelo tempo necessário para fornecer o serviço solicitado. Quando armazenamos dados, protegemos dentro de meios comercialmente aceitáveis para evitar perdas, roubos, acesso, divulgação, cópia, uso ou modificação não autorizados.</p>Marca HTML presente na saída da página.
2505 <p>Não compartilhamos informações de identificação pessoal publicamente ou com terceiros, exceto quando exigido por lei.</p>Marca HTML presente na saída da página.
2506 <p>Nosso site pode conter links para sites externos que não são operados por nós. Não temos controle sobre o conteúdo e práticas desses sites e não podemos aceitar responsabilidade por suas respectivas <a href="https://politicaprivacidade.com/" target="_blank" rel="noopener" style="color:#e6e6e6;text-decoration:underline">políticas de privacidade</a>.</p>Marca HTML presente na saída da página.
2507 <p>Você é livre para recusar nossa solicitação de informações pessoais, entendendo que talvez não possamos fornecer alguns dos serviços desejados.</p>Marca HTML presente na saída da página.
2508 <p>O uso continuado de nosso site será considerado como aceitação de nossas práticas em torno de privacidade e informações pessoais. Se você tiver alguma dúvida sobre como lidamos com dados do usuário e informações pessoais, entre em contato conosco.</p>Marca HTML presente na saída da página.
2509 Linha em branco usada para separar blocos do arquivo.
2510 <h6 style="color:#fff;margin-top:18px">Cookies, Google Ads e medição</h6>Marca HTML presente na saída da página.
2511 <ul style="padding-left:18px;margin:0">Marca HTML presente na saída da página.
2512 <li>Podemos utilizar cookies, Google Ads, Google Analytics, Google Tag Manager, reCAPTCHA e tags de conversão para segurança, medição de visitas e análise de campanhas.</li>Marca HTML presente na saída da página.
2513 <li>Cliques em WhatsApp, agendamento e envio de formulário podem ser medidos como conversões para avaliar o desempenho dos anúncios.</li>Marca HTML presente na saída da página.
2514 <li>Fotos enviadas para simulação são usadas para gerar a prévia visual e apoiar o atendimento solicitado. Você pode pedir exclusão dos dados pelo WhatsApp informado no site.</li>Marca HTML presente na saída da página.
2515 </ul>Marca HTML presente na saída da página.
2516 Linha em branco usada para separar blocos do arquivo.
2517 <h6 style="color:#fff;margin-top:18px">Compromisso do usuário</h6>Marca HTML presente na saída da página.
2518 <ul style="padding-left:18px;margin:0">Marca HTML presente na saída da página.
2519 <li>Não se envolver em atividades ilegais ou contrárias à boa-fé e à ordem pública.</li>Marca HTML presente na saída da página.
2520 <li>Não difundir conteúdo discriminatório, ilegal, violento ou que viole direitos humanos.</li>Marca HTML presente na saída da página.
2521 <li>Não causar danos aos sistemas do site, nem introduzir vírus ou softwares maliciosos.</li>Marca HTML presente na saída da página.
2522 </ul>Marca HTML presente na saída da página.
2523 Linha em branco usada para separar blocos do arquivo.
2524 <h6 style="color:#fff;margin-top:18px">Mais informações</h6>Marca HTML presente na saída da página.
2525 <p>Se restarem dúvidas, é geralmente mais seguro manter os cookies ativados caso interaja com algum recurso que você usa em nosso site.</p>Marca HTML presente na saída da página.
2526 <p style="opacity:.85">Esta política foi atualizada em <strong>26/05/2026</strong>.</p>Marca HTML presente na saída da página.
2527 <p style="opacity:.85">reCAPTCHA v3 aplicado para proteção de formulários.</p>Marca HTML presente na saída da página.
2528 </div>Marca HTML presente na saída da página.
2529 Linha em branco usada para separar blocos do arquivo.
2530 <div class="modal-footer" style="border-top:1px solid #2a2a2c">Marca HTML presente na saída da página.
2531 <small>WhatsApp: <a href="https://api.whatsapp.com/send?1=pt_BR&phone=<?=$tel_whatsapp?>" target="_blank" rel="noopener" style="color:#e6e6e6;text-decoration:underline"><?=$whatsapp_sistema?></a></small>Marca HTML presente na saída da página.
2532 </div>Marca HTML presente na saída da página.
2533 </div>Marca HTML presente na saída da página.
2534 </div>Marca HTML presente na saída da página.
2535</div>Marca HTML presente na saída da página.
2536 Linha em branco usada para separar blocos do arquivo.
2537<div id="ytModal" style="position:fixed;inset:0;background:rgba(0,0,0,.7);display:none;align-items:center;justify-content:center;z-index:99999">Marca HTML presente na saída da página.
2538 <div style="position:relative;width:96vw;max-width:980px;background:#000;border-radius:14px;overflow:hidden">Marca HTML presente na saída da página.
2539 <button id="ytClose" aria-label="Fechar" style="position:absolute;top:10px;right:10px;border:0;background:rgba(255,255,255,.15);color:#fff;padding:6px 10px;border-radius:6px;cursor:pointer;z-index:1">✕</button>Marca HTML presente na saída da página.
2540 <div style="position:relative;width:100%;padding-top:56.25%"><div id="ytPlayer" style="position:absolute;inset:0"></div></div>Marca HTML presente na saída da página.
2541 </div>Marca HTML presente na saída da página.
2542</div>Marca HTML presente na saída da página.
2543 Linha em branco usada para separar blocos do arquivo.
2544<script>Marca HTML presente na saída da página.
2545(function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2546 var recaptchaJaCarregado = false;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2547 Linha em branco usada para separar blocos do arquivo.
2548 function carregarRecaptcha(){Declara a função e os parâmetros mostrados.
2549 if (recaptchaJaCarregado || !window.RECAPTCHA_SITE_KEY) {Avalia a condição escrita nesta linha.
2550 return;Retorna o valor indicado pela linha.
2551 }Fecha ou delimita a estrutura iniciada anteriormente.
2552 Linha em branco usada para separar blocos do arquivo.
2553 recaptchaJaCarregado = true;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2554 Linha em branco usada para separar blocos do arquivo.
2555 var s = document.createElement('script');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2556 s.src = 'https://www.google.com/recaptcha/api.js?render=' + window.RECAPTCHA_SITE_KEY;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2557 s.async = true;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2558 s.defer = true;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2559 document.head.appendChild(s);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2560 }Fecha ou delimita a estrutura iniciada anteriormente.
2561 Linha em branco usada para separar blocos do arquivo.
2562 window.addEventListener('load', function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2563 setTimeout(carregarRecaptcha, 2500);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2564 }, { once:true });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2565 Linha em branco usada para separar blocos do arquivo.
2566 document.addEventListener('focusin', function(e){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2567 if (e.target.closest('#form_cadastro') || e.target.closest('#form_simulacao_cliente')) {Avalia a condição escrita nesta linha.
2568 carregarRecaptcha();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2569 }Fecha ou delimita a estrutura iniciada anteriormente.
2570 });Fecha ou delimita a estrutura iniciada anteriormente.
2571 Linha em branco usada para separar blocos do arquivo.
2572 document.addEventListener('pointerdown', function(e){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2573 if (e.target.closest('#form_cadastro') || e.target.closest('#form_simulacao_cliente')) {Avalia a condição escrita nesta linha.
2574 carregarRecaptcha();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2575 }Fecha ou delimita a estrutura iniciada anteriormente.
2576 }, { passive:true });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2577})();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2578</script>Marca HTML presente na saída da página.
2579 Linha em branco usada para separar blocos do arquivo.
2580<script>Marca HTML presente na saída da página.
2581(function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2582 function getModalBySelector(sel){Declara a função e os parâmetros mostrados.
2583 if (!sel || sel.charAt(0) !== '#') return null;Avalia a condição escrita nesta linha.
2584 Linha em branco usada para separar blocos do arquivo.
2585 try {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2586 return document.querySelector(sel);Retorna o valor indicado pela linha.
2587 } catch (e) {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2588 return null;Retorna o valor indicado pela linha.
2589 }Fecha ou delimita a estrutura iniciada anteriormente.
2590 }Fecha ou delimita a estrutura iniciada anteriormente.
2591 Linha em branco usada para separar blocos do arquivo.
2592 function getSelectorFromTrigger(el){Declara a função e os parâmetros mostrados.
2593 if (!el) return '';Avalia a condição escrita nesta linha.
2594 Linha em branco usada para separar blocos do arquivo.
2595 return el.getAttribute('data-target')Retorna o valor indicado pela linha.
2596 || el.getAttribute('data-bs-target')Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2597 || el.getAttribute('href')Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2598 || '';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2599 }Fecha ou delimita a estrutura iniciada anteriormente.
2600 Linha em branco usada para separar blocos do arquivo.
2601 function criarBackdrop(modal){Declara a função e os parâmetros mostrados.
2602 removerBackdrop(modal);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2603 Linha em branco usada para separar blocos do arquivo.
2604 var backdrop = document.createElement('div');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2605 backdrop.className = 'modal-backdrop fade show jacy-modal-backdrop';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2606 backdrop.setAttribute('data-modal-fallback', modal.id || '');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2607 document.body.appendChild(backdrop);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2608 }Fecha ou delimita a estrutura iniciada anteriormente.
2609 Linha em branco usada para separar blocos do arquivo.
2610 function removerBackdrop(modal){Declara a função e os parâmetros mostrados.
2611 var id = modal && modal.id ? modal.id : '';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2612 var seletor = idLinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2613 ? '.jacy-modal-backdrop[data-modal-fallback="' + id + '"]'Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2614 : '.jacy-modal-backdrop';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2615 Linha em branco usada para separar blocos do arquivo.
2616 document.querySelectorAll(seletor).forEach(function(item){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2617 if (item && item.parentNode) item.parentNode.removeChild(item);Avalia a condição escrita nesta linha.
2618 });Fecha ou delimita a estrutura iniciada anteriormente.
2619 }Fecha ou delimita a estrutura iniciada anteriormente.
2620 Linha em branco usada para separar blocos do arquivo.
2621 function abrirModalFallback(modal){Declara a função e os parâmetros mostrados.
2622 if (!modal) return;Avalia a condição escrita nesta linha.
2623 Linha em branco usada para separar blocos do arquivo.
2624 modal.style.display = 'block';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2625 modal.removeAttribute('aria-hidden');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2626 modal.setAttribute('aria-modal', 'true');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2627 modal.classList.add('show');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2628 document.body.classList.add('modal-open');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2629 document.body.style.overflow = 'hidden';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2630 criarBackdrop(modal);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2631 Linha em branco usada para separar blocos do arquivo.
2632 setTimeout(function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2633 var primeiroCampo = modal.querySelector('input, select, textarea, button, a[href]');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2634 if (primeiroCampo && typeof primeiroCampo.focus === 'function') primeiroCampo.focus();Avalia a condição escrita nesta linha.
2635 }, 80);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2636 Linha em branco usada para separar blocos do arquivo.
2637 modal.dispatchEvent(new Event('shown.bs.modal', { bubbles:true }));Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2638 }Fecha ou delimita a estrutura iniciada anteriormente.
2639 Linha em branco usada para separar blocos do arquivo.
2640 function fecharModalFallback(modal){Declara a função e os parâmetros mostrados.
2641 if (!modal) return;Avalia a condição escrita nesta linha.
2642 Linha em branco usada para separar blocos do arquivo.
2643 modal.classList.remove('show');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2644 modal.style.display = 'none';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2645 modal.setAttribute('aria-hidden', 'true');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2646 modal.removeAttribute('aria-modal');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2647 removerBackdrop(modal);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2648 Linha em branco usada para separar blocos do arquivo.
2649 if (!document.querySelector('.modal.show')) {Avalia a condição escrita nesta linha.
2650 document.body.classList.remove('modal-open');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2651 document.body.style.overflow = '';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2652 }Fecha ou delimita a estrutura iniciada anteriormente.
2653 Linha em branco usada para separar blocos do arquivo.
2654 modal.dispatchEvent(new Event('hidden.bs.modal', { bubbles:true }));Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2655 }Fecha ou delimita a estrutura iniciada anteriormente.
2656 Linha em branco usada para separar blocos do arquivo.
2657 function abrirModalSistema(sel){Declara a função e os parâmetros mostrados.
2658 var modal = getModalBySelector(sel);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2659 if (!modal) return false;Avalia a condição escrita nesta linha.
2660 Linha em branco usada para separar blocos do arquivo.
2661 if (window.jQuery && window.jQuery.fn && typeof window.jQuery.fn.modal === 'function') {Avalia a condição escrita nesta linha.
2662 window.jQuery(modal).modal('show');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2663 return true;Retorna o valor indicado pela linha.
2664 }Fecha ou delimita a estrutura iniciada anteriormente.
2665 Linha em branco usada para separar blocos do arquivo.
2666 if (window.bootstrap && window.bootstrap.Modal) {Avalia a condição escrita nesta linha.
2667 var instancia = window.bootstrap.Modal.getOrCreateInstance(modal);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2668 instancia.show();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2669 return true;Retorna o valor indicado pela linha.
2670 }Fecha ou delimita a estrutura iniciada anteriormente.
2671 Linha em branco usada para separar blocos do arquivo.
2672 abrirModalFallback(modal);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2673 return true;Retorna o valor indicado pela linha.
2674 }Fecha ou delimita a estrutura iniciada anteriormente.
2675 Linha em branco usada para separar blocos do arquivo.
2676 function fecharModalSistema(modal){Declara a função e os parâmetros mostrados.
2677 if (!modal) return false;Avalia a condição escrita nesta linha.
2678 Linha em branco usada para separar blocos do arquivo.
2679 if (window.jQuery && window.jQuery.fn && typeof window.jQuery.fn.modal === 'function') {Avalia a condição escrita nesta linha.
2680 window.jQuery(modal).modal('hide');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2681 return true;Retorna o valor indicado pela linha.
2682 }Fecha ou delimita a estrutura iniciada anteriormente.
2683 Linha em branco usada para separar blocos do arquivo.
2684 if (window.bootstrap && window.bootstrap.Modal) {Avalia a condição escrita nesta linha.
2685 var instancia = window.bootstrap.Modal.getOrCreateInstance(modal);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2686 instancia.hide();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2687 return true;Retorna o valor indicado pela linha.
2688 }Fecha ou delimita a estrutura iniciada anteriormente.
2689 Linha em branco usada para separar blocos do arquivo.
2690 fecharModalFallback(modal);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2691 return true;Retorna o valor indicado pela linha.
2692 }Fecha ou delimita a estrutura iniciada anteriormente.
2693 Linha em branco usada para separar blocos do arquivo.
2694 window.abrirModalSistema = abrirModalSistema;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2695 window.fecharModalSistema = fecharModalSistema;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2696 Linha em branco usada para separar blocos do arquivo.
2697 document.addEventListener('click', function(ev){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2698 var abrir = ev.target.closest('[data-toggle="modal"], [data-bs-toggle="modal"]');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2699 if (!abrir) return;Avalia a condição escrita nesta linha.
2700 Linha em branco usada para separar blocos do arquivo.
2701 var sel = getSelectorFromTrigger(abrir);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2702 if (!getModalBySelector(sel)) return;Avalia a condição escrita nesta linha.
2703 Linha em branco usada para separar blocos do arquivo.
2704 ev.preventDefault();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2705 abrirModalSistema(sel);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2706 Linha em branco usada para separar blocos do arquivo.
2707 if (history.replaceState && sel === '#modalSimulacaoCliente') {Avalia a condição escrita nesta linha.
2708 history.replaceState(null, '', location.pathname + location.search);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2709 }Fecha ou delimita a estrutura iniciada anteriormente.
2710 }, false);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2711 Linha em branco usada para separar blocos do arquivo.
2712 document.addEventListener('click', function(ev){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2713 var fechar = ev.target.closest('[data-dismiss="modal"], [data-bs-dismiss="modal"], .modal .close');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2714 if (fechar) {Avalia a condição escrita nesta linha.
2715 var modalFechar = fechar.closest('.modal');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2716 if (modalFechar) {Avalia a condição escrita nesta linha.
2717 ev.preventDefault();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2718 fecharModalSistema(modalFechar);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2719 }Fecha ou delimita a estrutura iniciada anteriormente.
2720 return;Retorna o valor indicado pela linha.
2721 }Fecha ou delimita a estrutura iniciada anteriormente.
2722 Linha em branco usada para separar blocos do arquivo.
2723 if (ev.target && ev.target.classList && ev.target.classList.contains('modal')) {Avalia a condição escrita nesta linha.
2724 fecharModalSistema(ev.target);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2725 }Fecha ou delimita a estrutura iniciada anteriormente.
2726 }, false);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2727 Linha em branco usada para separar blocos do arquivo.
2728 document.addEventListener('keydown', function(ev){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2729 if (ev.key !== 'Escape') return;Avalia a condição escrita nesta linha.
2730 Linha em branco usada para separar blocos do arquivo.
2731 var modais = document.querySelectorAll('.modal.show');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2732 if (!modais.length) return;Avalia a condição escrita nesta linha.
2733 Linha em branco usada para separar blocos do arquivo.
2734 fecharModalSistema(modais[modais.length - 1]);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2735 });Fecha ou delimita a estrutura iniciada anteriormente.
2736 Linha em branco usada para separar blocos do arquivo.
2737 document.addEventListener('DOMContentLoaded', function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2738 var parametros = new URLSearchParams(window.location.search);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2739 Linha em branco usada para separar blocos do arquivo.
2740 if (parametros.get('abrir_simulador') === '1') {Avalia a condição escrita nesta linha.
2741 setTimeout(function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2742 abrirModalSistema('#modalSimulacaoCliente');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2743 }, 250);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2744 }Fecha ou delimita a estrutura iniciada anteriormente.
2745 });Fecha ou delimita a estrutura iniciada anteriormente.
2746})();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2747 Linha em branco usada para separar blocos do arquivo.
2748const LINK_WHATSAPP = <?=json_encode($WPP, JSON_UNESCAPED_SLASHES)?>;Converte dados para JSON.
2749const LINK_APP = <?=json_encode($AGENDA_LINK, JSON_UNESCAPED_SLASHES)?>;Converte dados para JSON.
2750 Linha em branco usada para separar blocos do arquivo.
2751var btnW = document.getElementById('ctaWhats');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2752if (btnW) btnW.href = LINK_WHATSAPP;Avalia a condição escrita nesta linha.
2753 Linha em branco usada para separar blocos do arquivo.
2754var btnA = document.getElementById('ctaApp');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2755if (btnA) btnA.href = LINK_APP;Avalia a condição escrita nesta linha.
2756 Linha em branco usada para separar blocos do arquivo.
2757const track = document.getElementById('heroTrack');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2758const slidesV = track ? Array.from(track.querySelectorAll('.hero-slide')) : [];Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2759const dotsV = Array.from(document.querySelectorAll('#heroDots button'));Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2760 Linha em branco usada para separar blocos do arquivo.
2761let heroIndex = 0;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2762 Linha em branco usada para separar blocos do arquivo.
2763function heroGo(i){Declara a função e os parâmetros mostrados.
2764 if (!track) return;Avalia a condição escrita nesta linha.
2765 heroIndex = (i + slidesV.length) % slidesV.length;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2766 track.style.transform = 'translateX(' + (heroIndex * -100) + '%)';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2767 dotsV.forEach((d, idx) => d.style.background = idx === heroIndex ? '#ffffffaa' : '#ffffff55');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2768}Fecha ou delimita a estrutura iniciada anteriormente.
2769 Linha em branco usada para separar blocos do arquivo.
2770var prevH = document.getElementById('heroPrev');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2771if (prevH) prevH.onclick = () => heroGo(heroIndex - 1);Avalia a condição escrita nesta linha.
2772 Linha em branco usada para separar blocos do arquivo.
2773var nextH = document.getElementById('heroNext');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2774if (nextH) nextH.onclick = () => heroGo(heroIndex + 1);Avalia a condição escrita nesta linha.
2775 Linha em branco usada para separar blocos do arquivo.
2776dotsV.forEach(d => d.onclick = () => heroGo(parseInt(d.dataset.i, 10)));Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2777let heroTimer = null;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2778 Linha em branco usada para separar blocos do arquivo.
2779function startHeroTimer(){Declara a função e os parâmetros mostrados.
2780 stopHeroTimer();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2781 if (document.hidden) return;Avalia a condição escrita nesta linha.
2782 heroTimer = setInterval(() => heroGo(heroIndex + 1), 4000);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2783}Fecha ou delimita a estrutura iniciada anteriormente.
2784 Linha em branco usada para separar blocos do arquivo.
2785function stopHeroTimer(){Declara a função e os parâmetros mostrados.
2786 clearInterval(heroTimer);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2787}Fecha ou delimita a estrutura iniciada anteriormente.
2788 Linha em branco usada para separar blocos do arquivo.
2789let __ytApiRequested = false;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2790 Linha em branco usada para separar blocos do arquivo.
2791function ensureYTApiLoaded(cb){Declara a função e os parâmetros mostrados.
2792 if (window.YT && window.YT.Player) {Avalia a condição escrita nesta linha.
2793 cb();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2794 return;Retorna o valor indicado pela linha.
2795 }Fecha ou delimita a estrutura iniciada anteriormente.
2796 Linha em branco usada para separar blocos do arquivo.
2797 if (!__ytApiRequested) {Avalia a condição escrita nesta linha.
2798 __ytApiRequested = true;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2799 var s = document.createElement('script');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2800 s.src = 'https://www.youtube.com/iframe_api';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2801 s.async = true;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2802 document.head.appendChild(s);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2803 }Fecha ou delimita a estrutura iniciada anteriormente.
2804 Linha em branco usada para separar blocos do arquivo.
2805 (function wait(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2806 if (window.YT && window.YT.Player) cb();Avalia a condição escrita nesta linha.
2807 else setTimeout(wait, 80);Abre o caminho alternativo da condição anterior.
2808 })();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2809}Fecha ou delimita a estrutura iniciada anteriormente.
2810 Linha em branco usada para separar blocos do arquivo.
2811let ytPlayer;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2812const ytModal = document.getElementById('ytModal');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2813const ytClose = document.getElementById('ytClose');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2814function onYouTubeIframeAPIReady(){}Declara a função e os parâmetros mostrados.
2815 Linha em branco usada para separar blocos do arquivo.
2816function openVideo(videoId){Declara a função e os parâmetros mostrados.
2817 if (!ytModal) return;Avalia a condição escrita nesta linha.
2818 Linha em branco usada para separar blocos do arquivo.
2819 ytModal.style.display = 'flex';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2820 document.body.style.overflow = 'hidden';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2821 stopHeroTimer();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2822 Linha em branco usada para separar blocos do arquivo.
2823 ensureYTApiLoaded(function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2824 if (!ytPlayer) {Avalia a condição escrita nesta linha.
2825 ytPlayer = new YT.Player('ytPlayer', {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2826 videoId: videoId,Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2827 playerVars: {autoplay:1, rel:0, controls:1, modestbranding:1, playsinline:1},Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2828 events: {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2829 onReady: (e) => {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2830 const ifr = e.target.getIframe();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2831 ifr.style.position = 'absolute';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2832 ifr.style.inset = '0';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2833 ifr.style.width = '100%';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2834 ifr.style.height = '100%';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2835 },Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2836 onStateChange: (e) => {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2837 if (e.data === YT.PlayerState.ENDED) closeVideo();Avalia a condição escrita nesta linha.
2838 }Fecha ou delimita a estrutura iniciada anteriormente.
2839 }Fecha ou delimita a estrutura iniciada anteriormente.
2840 });Fecha ou delimita a estrutura iniciada anteriormente.
2841 } else {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2842 ytPlayer.loadVideoById(videoId);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2843 }Fecha ou delimita a estrutura iniciada anteriormente.
2844 });Fecha ou delimita a estrutura iniciada anteriormente.
2845}Fecha ou delimita a estrutura iniciada anteriormente.
2846 Linha em branco usada para separar blocos do arquivo.
2847function closeVideo(){Declara a função e os parâmetros mostrados.
2848 if (!ytModal) return;Avalia a condição escrita nesta linha.
2849 ytModal.style.display = 'none';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2850 document.body.style.overflow = '';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2851 if (ytPlayer && ytPlayer.stopVideo) ytPlayer.stopVideo();Avalia a condição escrita nesta linha.
2852 startHeroTimer();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2853}Fecha ou delimita a estrutura iniciada anteriormente.
2854 Linha em branco usada para separar blocos do arquivo.
2855if (ytClose) ytClose.onclick = closeVideo;Avalia a condição escrita nesta linha.
2856if (ytModal) ytModal.addEventListener('click', (ev) => { if (ev.target === ytModal) closeVideo(); });Avalia a condição escrita nesta linha.
2857document.addEventListener('keydown', (e) => { if (e.key === 'Escape') closeVideo(); });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2858document.addEventListener('visibilitychange', () => {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2859 if (document.hidden) stopHeroTimer();Avalia a condição escrita nesta linha.
2860 else if (!ytModal || ytModal.style.display !== 'flex') startHeroTimer();Avalia a condição escrita nesta linha.
2861}, { passive:true });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2862 Linha em branco usada para separar blocos do arquivo.
2863startHeroTimer();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2864 Linha em branco usada para separar blocos do arquivo.
2865slidesV.forEach(slide => {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2866 const id = slide.dataset.video;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2867 var p = slide.querySelector('.play-btn');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2868 if (p) p.addEventListener('click', () => openVideo(id));Avalia a condição escrita nesta linha.
2869 slide.addEventListener('dblclick', () => openVideo(id));Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2870});Fecha ou delimita a estrutura iniciada anteriormente.
2871 Linha em branco usada para separar blocos do arquivo.
2872(function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2873 const root = document.getElementById('hero');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2874 if (!root) return;Avalia a condição escrita nesta linha.
2875 Linha em branco usada para separar blocos do arquivo.
2876 const slides = root.querySelector('#slides');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2877 const items = Array.from(root.querySelectorAll('.slide'));Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2878 const dotsEl = root.querySelector('#dots');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2879 const btnPrev = root.querySelector('#prev');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2880 const btnNext = root.querySelector('#next');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2881 Linha em branco usada para separar blocos do arquivo.
2882 let idx = 0, timer = null, hover = false;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2883 const duration = 5000;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2884 const reduced = window.matchMedia && window.matchMedia('(prefers-reduced-motion: reduce)').matches;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2885 Linha em branco usada para separar blocos do arquivo.
2886 items.forEach((_, i) => {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2887 const b = document.createElement('button');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2888 b.type = 'button';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2889 b.setAttribute('aria-label', 'Ir para o slide ' + (i + 1));Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2890 b.addEventListener('click', () => go(i), { passive:true });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2891 dotsEl.appendChild(b);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2892 });Fecha ou delimita a estrutura iniciada anteriormente.
2893 Linha em branco usada para separar blocos do arquivo.
2894 function mark(){ dotsEl.querySelectorAll('button').forEach((b, i) => b.classList.toggle('active', i === idx)); }Declara a função e os parâmetros mostrados.
2895 Linha em branco usada para separar blocos do arquivo.
2896 function syncVideos(){Declara a função e os parâmetros mostrados.
2897 items.forEach((item, itemIndex) => {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2898 const video = item.querySelector('video[data-hero-video]');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2899 if (!video) return;Avalia a condição escrita nesta linha.
2900 Linha em branco usada para separar blocos do arquivo.
2901 if (itemIndex === idx) {Avalia a condição escrita nesta linha.
2902 const playNow = function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2903 const promise = video.play();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2904 if (promise && typeof promise.catch === 'function') {Avalia a condição escrita nesta linha.
2905 promise.catch(function(){});Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2906 }Fecha ou delimita a estrutura iniciada anteriormente.
2907 };Fecha ou delimita a estrutura iniciada anteriormente.
2908 Linha em branco usada para separar blocos do arquivo.
2909 if (video.readyState >= 2) playNow();Avalia a condição escrita nesta linha.
2910 else {Abre o caminho alternativo da condição anterior.
2911 video.addEventListener('loadeddata', playNow, { once:true });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2912 video.load();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2913 }Fecha ou delimita a estrutura iniciada anteriormente.
2914 } else {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2915 video.pause();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2916 try { video.currentTime = 0; } catch(e) {}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2917 }Fecha ou delimita a estrutura iniciada anteriormente.
2918 });Fecha ou delimita a estrutura iniciada anteriormente.
2919 }Fecha ou delimita a estrutura iniciada anteriormente.
2920 Linha em branco usada para separar blocos do arquivo.
2921 function go(i){Declara a função e os parâmetros mostrados.
2922 idx = (i + items.length) % items.length;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2923 slides.style.transform = 'translateX(' + (-100 * idx) + '%)';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2924 mark();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2925 syncVideos();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2926 }Fecha ou delimita a estrutura iniciada anteriormente.
2927 function next(){ go(idx + 1); }Declara a função e os parâmetros mostrados.
2928 function prev(){ go(idx - 1); }Declara a função e os parâmetros mostrados.
2929 function loop(){Declara a função e os parâmetros mostrados.
2930 clearTimeout(timer);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2931 if (hover || reduced) return;Avalia a condição escrita nesta linha.
2932 timer = setTimeout(() => { next(); loop(); }, duration);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2933 }Fecha ou delimita a estrutura iniciada anteriormente.
2934 Linha em branco usada para separar blocos do arquivo.
2935 if (btnPrev) btnPrev.addEventListener('click', prev, { passive:true });Avalia a condição escrita nesta linha.
2936 if (btnNext) btnNext.addEventListener('click', next, { passive:true });Avalia a condição escrita nesta linha.
2937 Linha em branco usada para separar blocos do arquivo.
2938 root.addEventListener('pointerenter', () => { hover = true; clearTimeout(timer); }, { passive:true });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2939 root.addEventListener('pointerleave', () => { hover = false; loop(); }, { passive:true });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2940 Linha em branco usada para separar blocos do arquivo.
2941 let sx = 0, dx = 0;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2942 root.addEventListener('touchstart', e => { sx = e.touches[0].clientX; }, { passive:true });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2943 root.addEventListener('touchmove', e => { dx = e.touches[0].clientX - sx; }, { passive:true });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2944 root.addEventListener('touchend', () => { if (Math.abs(dx) > 40) { dx < 0 ? next() : prev(); } dx = 0; }, { passive:true });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2945 Linha em branco usada para separar blocos do arquivo.
2946 let visibleOnScreen = true;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2947 Linha em branco usada para separar blocos do arquivo.
2948 function stopLoop(){Declara a função e os parâmetros mostrados.
2949 clearTimeout(timer);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2950 }Fecha ou delimita a estrutura iniciada anteriormente.
2951 Linha em branco usada para separar blocos do arquivo.
2952 function startLoop(){Declara a função e os parâmetros mostrados.
2953 if (!visibleOnScreen || document.hidden) return;Avalia a condição escrita nesta linha.
2954 loop();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2955 }Fecha ou delimita a estrutura iniciada anteriormente.
2956 Linha em branco usada para separar blocos do arquivo.
2957 if ('IntersectionObserver' in window) {Avalia a condição escrita nesta linha.
2958 const obs = new IntersectionObserver(function(entries){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2959 visibleOnScreen = entries.some(function(entry){ return entry.isIntersecting; });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2960 if (visibleOnScreen) {Avalia a condição escrita nesta linha.
2961 syncVideos();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2962 startLoop();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2963 } else {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2964 stopLoop();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2965 items.forEach(function(item){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2966 const video = item.querySelector('video[data-hero-video]');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2967 if (video) video.pause();Avalia a condição escrita nesta linha.
2968 });Fecha ou delimita a estrutura iniciada anteriormente.
2969 }Fecha ou delimita a estrutura iniciada anteriormente.
2970 }, { threshold: 0.2 });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2971 Linha em branco usada para separar blocos do arquivo.
2972 obs.observe(root);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2973 }Fecha ou delimita a estrutura iniciada anteriormente.
2974 Linha em branco usada para separar blocos do arquivo.
2975 document.addEventListener('visibilitychange', function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2976 if (document.hidden) {Avalia a condição escrita nesta linha.
2977 stopLoop();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2978 items.forEach(function(item){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2979 const video = item.querySelector('video[data-hero-video]');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2980 if (video) video.pause();Avalia a condição escrita nesta linha.
2981 });Fecha ou delimita a estrutura iniciada anteriormente.
2982 return;Retorna o valor indicado pela linha.
2983 }Fecha ou delimita a estrutura iniciada anteriormente.
2984 syncVideos();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2985 startLoop();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2986 }, { passive:true });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2987 Linha em branco usada para separar blocos do arquivo.
2988 const boot = () => { go(0); startLoop(); };Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2989 if ('requestIdleCallback' in window) requestIdleCallback(boot, { timeout: 1200 });Avalia a condição escrita nesta linha.
2990 else window.addEventListener('load', boot, { once:true });Abre o caminho alternativo da condição anterior.
2991})();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2992 Linha em branco usada para separar blocos do arquivo.
2993/* ============================================================Comentário existente no código-fonte.
2994 Galeria foto_adminLinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2995 Movimento contínuo e abertura do mesmo modal usado peloLinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2996 botão flutuante de WhatsApp do rodapé.Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2997 ============================================================ */Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2998(function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
2999 'use strict';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3000 Linha em branco usada para separar blocos do arquivo.
3001 var wrap = document.getElementById('galeriaWrap');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3002 var track = document.getElementById('galTrack');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3003 Linha em branco usada para separar blocos do arquivo.
3004 if (!wrap || !track || track.getAttribute('data-carrossel-continuo') === '1') return;Avalia a condição escrita nesta linha.
3005 Linha em branco usada para separar blocos do arquivo.
3006 var viewport = document.getElementById('galeriaViewport') || track.parentElement;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3007 var itensOriginais = Array.prototype.slice.call(track.querySelectorAll('.galItem'));Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3008 var anterior = document.getElementById('galPrev');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3009 var proximo = document.getElementById('galNext');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3010 Linha em branco usada para separar blocos do arquivo.
3011 if (!viewport || !itensOriginais.length) {Avalia a condição escrita nesta linha.
3012 if (anterior) anterior.hidden = true;Avalia a condição escrita nesta linha.
3013 if (proximo) proximo.hidden = true;Avalia a condição escrita nesta linha.
3014 return;Retorna o valor indicado pela linha.
3015 }Fecha ou delimita a estrutura iniciada anteriormente.
3016 Linha em branco usada para separar blocos do arquivo.
3017 track.setAttribute('data-carrossel-continuo', '1');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3018 Linha em branco usada para separar blocos do arquivo.
3019 var clones = [];Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3020 var posicao = 0;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3021 var larguraSequencia = 0;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3022 var passoItem = 0;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3023 var ultimoTempo = 0;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3024 var animacaoId = 0;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3025 var visivelNaTela = true;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3026 var toqueAtivo = false;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3027 var inicioToque = 0;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3028 var deslocamentoToque = 0;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3029 var ignorarCliqueAte = 0;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3030 var resizeTimer = 0;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3031 var velocidade = 38;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3032 Linha em branco usada para separar blocos do arquivo.
3033 function normalizarTexto(valor){Declara a função e os parâmetros mostrados.
3034 var texto = String(valor || '').toLowerCase();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3035 Linha em branco usada para separar blocos do arquivo.
3036 if (typeof texto.normalize === 'function') {Avalia a condição escrita nesta linha.
3037 texto = texto.normalize('NFD').replace(/[\u0300-\u036f]/g, '');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3038 }Fecha ou delimita a estrutura iniciada anteriormente.
3039 Linha em branco usada para separar blocos do arquivo.
3040 return texto.replace(/\s+/g, ' ').trim();Retorna o valor indicado pela linha.
3041 }Fecha ou delimita a estrutura iniciada anteriormente.
3042 Linha em branco usada para separar blocos do arquivo.
3043 function estaVisivel(elemento){Declara a função e os parâmetros mostrados.
3044 if (!elemento) return false;Avalia a condição escrita nesta linha.
3045 Linha em branco usada para separar blocos do arquivo.
3046 var estilo = window.getComputedStyle(elemento);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3047 if (estilo.display === 'none' || estilo.visibility === 'hidden' || estilo.opacity === '0') return false;Avalia a condição escrita nesta linha.
3048 Linha em branco usada para separar blocos do arquivo.
3049 var caixa = elemento.getBoundingClientRect();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3050 return caixa.width > 0 && caixa.height > 0;Retorna o valor indicado pela linha.
3051 }Fecha ou delimita a estrutura iniciada anteriormente.
3052 Linha em branco usada para separar blocos do arquivo.
3053 function abrirModalElemento(modal){Declara a função e os parâmetros mostrados.
3054 if (!modal) return false;Avalia a condição escrita nesta linha.
3055 Linha em branco usada para separar blocos do arquivo.
3056 if (!modal.id) modal.id = 'jacyModalWhatsAppRodape';Avalia a condição escrita nesta linha.
3057 Linha em branco usada para separar blocos do arquivo.
3058 if (typeof window.abrirModalSistema === 'function') {Avalia a condição escrita nesta linha.
3059 return window.abrirModalSistema('#' + modal.id);Retorna o valor indicado pela linha.
3060 }Fecha ou delimita a estrutura iniciada anteriormente.
3061 Linha em branco usada para separar blocos do arquivo.
3062 if (window.jQuery && window.jQuery.fn && typeof window.jQuery.fn.modal === 'function') {Avalia a condição escrita nesta linha.
3063 window.jQuery(modal).modal('show');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3064 return true;Retorna o valor indicado pela linha.
3065 }Fecha ou delimita a estrutura iniciada anteriormente.
3066 Linha em branco usada para separar blocos do arquivo.
3067 if (window.bootstrap && window.bootstrap.Modal) {Avalia a condição escrita nesta linha.
3068 window.bootstrap.Modal.getOrCreateInstance(modal).show();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3069 return true;Retorna o valor indicado pela linha.
3070 }Fecha ou delimita a estrutura iniciada anteriormente.
3071 Linha em branco usada para separar blocos do arquivo.
3072 return false;Retorna o valor indicado pela linha.
3073 }Fecha ou delimita a estrutura iniciada anteriormente.
3074 Linha em branco usada para separar blocos do arquivo.
3075 function localizarModalWhatsAppRodape(){Declara a função e os parâmetros mostrados.
3076 var modais = document.querySelectorAll('.modal');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3077 Linha em branco usada para separar blocos do arquivo.
3078 for (var i = 0; i < modais.length; i++) {Controla uma repetição conforme a expressão exibida.
3079 var texto = normalizarTexto(modais[i].textContent);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3080 Linha em branco usada para separar blocos do arquivo.
3081 if (texto.indexOf('fale conosco') !== -1 && texto.indexOf('whatsapp') !== -1) {Avalia a condição escrita nesta linha.
3082 return modais[i];Retorna o valor indicado pela linha.
3083 }Fecha ou delimita a estrutura iniciada anteriormente.
3084 }Fecha ou delimita a estrutura iniciada anteriormente.
3085 Linha em branco usada para separar blocos do arquivo.
3086 return null;Retorna o valor indicado pela linha.
3087 }Fecha ou delimita a estrutura iniciada anteriormente.
3088 Linha em branco usada para separar blocos do arquivo.
3089 function localizarGatilhoWhatsAppRodape(){Declara a função e os parâmetros mostrados.
3090 var elementos = document.querySelectorAll('a, button, [role="button"]');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3091 var melhor = null;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3092 var melhorPontuacao = -1;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3093 Linha em branco usada para separar blocos do arquivo.
3094 for (var i = 0; i < elementos.length; i++) {Controla uma repetição conforme a expressão exibida.
3095 var elemento = elementos[i];Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3096 Linha em branco usada para separar blocos do arquivo.
3097 if (wrap.contains(elemento) || elemento.id === 'ctaWhats' || !estaVisivel(elemento)) continue;Avalia a condição escrita nesta linha.
3098 Linha em branco usada para separar blocos do arquivo.
3099 var dados = normalizarTexto([Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3100 elemento.id,Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3101 elemento.className,Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3102 elemento.getAttribute('aria-label'),Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3103 elemento.getAttribute('title'),Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3104 elemento.getAttribute('href'),Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3105 elemento.getAttribute('data-target'),Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3106 elemento.getAttribute('data-bs-target'),Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3107 elemento.innerHTMLLinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3108 ].join(' '));Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3109 Linha em branco usada para separar blocos do arquivo.
3110 if (dados.indexOf('whatsapp') === -1 && dados.indexOf('wa.me') === -1 && dados.indexOf('api.whatsapp.com') === -1) {Avalia a condição escrita nesta linha.
3111 continue;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3112 }Fecha ou delimita a estrutura iniciada anteriormente.
3113 Linha em branco usada para separar blocos do arquivo.
3114 var pontuacao = 20;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3115 var alvoModal = elemento.getAttribute('data-target') || elemento.getAttribute('data-bs-target') || '';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3116 var estilo = window.getComputedStyle(elemento);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3117 var caixa = elemento.getBoundingClientRect();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3118 Linha em branco usada para separar blocos do arquivo.
3119 if (alvoModal.charAt(0) === '#' && document.querySelector(alvoModal + '.modal')) pontuacao += 80;Avalia a condição escrita nesta linha.
3120 if (estilo.position === 'fixed' || estilo.position === 'sticky') pontuacao += 60;Avalia a condição escrita nesta linha.
3121 if (caixa.right >= window.innerWidth * 0.70) pontuacao += 20;Avalia a condição escrita nesta linha.
3122 if (caixa.bottom >= window.innerHeight * 0.60) pontuacao += 20;Avalia a condição escrita nesta linha.
3123 if (elemento.closest('footer, .footer_section')) pontuacao += 10;Avalia a condição escrita nesta linha.
3124 Linha em branco usada para separar blocos do arquivo.
3125 if (pontuacao > melhorPontuacao) {Avalia a condição escrita nesta linha.
3126 melhor = elemento;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3127 melhorPontuacao = pontuacao;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3128 }Fecha ou delimita a estrutura iniciada anteriormente.
3129 }Fecha ou delimita a estrutura iniciada anteriormente.
3130 Linha em branco usada para separar blocos do arquivo.
3131 return melhor;Retorna o valor indicado pela linha.
3132 }Fecha ou delimita a estrutura iniciada anteriormente.
3133 Linha em branco usada para separar blocos do arquivo.
3134 function abrirWhatsAppRodape(){Declara a função e os parâmetros mostrados.
3135 var modal = localizarModalWhatsAppRodape();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3136 if (modal && abrirModalElemento(modal)) return true;Avalia a condição escrita nesta linha.
3137 Linha em branco usada para separar blocos do arquivo.
3138 var gatilho = localizarGatilhoWhatsAppRodape();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3139 if (!gatilho) return false;Avalia a condição escrita nesta linha.
3140 Linha em branco usada para separar blocos do arquivo.
3141 var alvo = gatilho.getAttribute('data-target') || gatilho.getAttribute('data-bs-target') || gatilho.getAttribute('href') || '';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3142 Linha em branco usada para separar blocos do arquivo.
3143 if (alvo.charAt(0) === '#') {Avalia a condição escrita nesta linha.
3144 var modalAlvo = document.querySelector(alvo);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3145 if (modalAlvo && modalAlvo.classList.contains('modal') && abrirModalElemento(modalAlvo)) return true;Avalia a condição escrita nesta linha.
3146 }Fecha ou delimita a estrutura iniciada anteriormente.
3147 Linha em branco usada para separar blocos do arquivo.
3148 gatilho.click();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3149 return true;Retorna o valor indicado pela linha.
3150 }Fecha ou delimita a estrutura iniciada anteriormente.
3151 Linha em branco usada para separar blocos do arquivo.
3152 function quantidadeVisivel(){Declara a função e os parâmetros mostrados.
3153 var largura = window.innerWidth;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3154 Linha em branco usada para separar blocos do arquivo.
3155 if (largura < 520) return 1;Avalia a condição escrita nesta linha.
3156 if (largura < 768) return 2;Avalia a condição escrita nesta linha.
3157 if (largura < 1024) return 3;Avalia a condição escrita nesta linha.
3158 Linha em branco usada para separar blocos do arquivo.
3159 return 4;Retorna o valor indicado pela linha.
3160 }Fecha ou delimita a estrutura iniciada anteriormente.
3161 Linha em branco usada para separar blocos do arquivo.
3162 function gapTrack(){Declara a função e os parâmetros mostrados.
3163 var estilo = window.getComputedStyle(track);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3164 var valor = parseFloat(estilo.columnGap || estilo.gap || '0');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3165 Linha em branco usada para separar blocos do arquivo.
3166 return Number.isFinite(valor) ? valor : 0;Retorna o valor indicado pela linha.
3167 }Fecha ou delimita a estrutura iniciada anteriormente.
3168 Linha em branco usada para separar blocos do arquivo.
3169 function removerIdsDuplicados(elemento){Declara a função e os parâmetros mostrados.
3170 if (elemento.id) elemento.removeAttribute('id');Avalia a condição escrita nesta linha.
3171 Linha em branco usada para separar blocos do arquivo.
3172 var filhos = elemento.querySelectorAll('[id]');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3173 for (var i = 0; i < filhos.length; i++) filhos[i].removeAttribute('id');Controla uma repetição conforme a expressão exibida.
3174 }Fecha ou delimita a estrutura iniciada anteriormente.
3175 Linha em branco usada para separar blocos do arquivo.
3176 function removerClones(){Declara a função e os parâmetros mostrados.
3177 for (var i = 0; i < clones.length; i++) {Controla uma repetição conforme a expressão exibida.
3178 if (clones[i] && clones[i].parentNode === track) track.removeChild(clones[i]);Avalia a condição escrita nesta linha.
3179 }Fecha ou delimita a estrutura iniciada anteriormente.
3180 Linha em branco usada para separar blocos do arquivo.
3181 clones = [];Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3182 }Fecha ou delimita a estrutura iniciada anteriormente.
3183 Linha em branco usada para separar blocos do arquivo.
3184 function aplicarLarguraItem(item, largura){Declara a função e os parâmetros mostrados.
3185 item.style.width = largura + 'px';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3186 item.style.minWidth = largura + 'px';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3187 item.style.maxWidth = largura + 'px';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3188 item.style.flex = '0 0 ' + largura + 'px';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3189 }Fecha ou delimita a estrutura iniciada anteriormente.
3190 Linha em branco usada para separar blocos do arquivo.
3191 function montarSequencia(){Declara a função e os parâmetros mostrados.
3192 removerClones();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3193 Linha em branco usada para separar blocos do arquivo.
3194 var visiveis = quantidadeVisivel();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3195 var gap = gapTrack();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3196 var larguraViewport = viewport.clientWidth;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3197 var larguraItem = (larguraViewport - (gap * (visiveis - 1))) / visiveis;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3198 Linha em branco usada para separar blocos do arquivo.
3199 if (!Number.isFinite(larguraItem) || larguraItem <= 0) return;Avalia a condição escrita nesta linha.
3200 Linha em branco usada para separar blocos do arquivo.
3201 passoItem = larguraItem + gap;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3202 larguraSequencia = passoItem * itensOriginais.length;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3203 Linha em branco usada para separar blocos do arquivo.
3204 for (var i = 0; i < itensOriginais.length; i++) {Controla uma repetição conforme a expressão exibida.
3205 aplicarLarguraItem(itensOriginais[i], larguraItem);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3206 }Fecha ou delimita a estrutura iniciada anteriormente.
3207 Linha em branco usada para separar blocos do arquivo.
3208 var quantidadeClones = Math.max(Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3209 visiveis + 2,Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3210 Math.ceil((larguraViewport + passoItem) / passoItem) + 1Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3211 );Fecha ou delimita a estrutura iniciada anteriormente.
3212 Linha em branco usada para separar blocos do arquivo.
3213 for (var indice = 0; indice < quantidadeClones; indice++) {Controla uma repetição conforme a expressão exibida.
3214 var clone = itensOriginais[indice % itensOriginais.length].cloneNode(true);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3215 Linha em branco usada para separar blocos do arquivo.
3216 clone.setAttribute('data-galeria-clone', '1');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3217 clone.setAttribute('aria-hidden', 'true');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3218 clone.setAttribute('tabindex', '-1');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3219 removerIdsDuplicados(clone);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3220 aplicarLarguraItem(clone, larguraItem);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3221 Linha em branco usada para separar blocos do arquivo.
3222 track.appendChild(clone);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3223 clones.push(clone);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3224 }Fecha ou delimita a estrutura iniciada anteriormente.
3225 Linha em branco usada para separar blocos do arquivo.
3226 if (larguraSequencia > 0) posicao = posicao % larguraSequencia;Avalia a condição escrita nesta linha.
3227 aplicarTransformacao();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3228 Linha em branco usada para separar blocos do arquivo.
3229 var esconderControles = itensOriginais.length <= 1;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3230 if (anterior) anterior.hidden = esconderControles;Avalia a condição escrita nesta linha.
3231 if (proximo) proximo.hidden = esconderControles;Avalia a condição escrita nesta linha.
3232 }Fecha ou delimita a estrutura iniciada anteriormente.
3233 Linha em branco usada para separar blocos do arquivo.
3234 function normalizarPosicao(){Declara a função e os parâmetros mostrados.
3235 if (!larguraSequencia) return;Avalia a condição escrita nesta linha.
3236 Linha em branco usada para separar blocos do arquivo.
3237 while (posicao >= larguraSequencia) posicao -= larguraSequencia;Controla uma repetição conforme a expressão exibida.
3238 while (posicao < 0) posicao += larguraSequencia;Controla uma repetição conforme a expressão exibida.
3239 }Fecha ou delimita a estrutura iniciada anteriormente.
3240 Linha em branco usada para separar blocos do arquivo.
3241 function aplicarTransformacao(){Declara a função e os parâmetros mostrados.
3242 normalizarPosicao();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3243 track.style.transform = 'translate3d(-' + posicao.toFixed(3) + 'px,0,0)';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3244 }Fecha ou delimita a estrutura iniciada anteriormente.
3245 Linha em branco usada para separar blocos do arquivo.
3246 function animar(tempo){Declara a função e os parâmetros mostrados.
3247 if (!animacaoId) return;Avalia a condição escrita nesta linha.
3248 Linha em branco usada para separar blocos do arquivo.
3249 if (!ultimoTempo) ultimoTempo = tempo;Avalia a condição escrita nesta linha.
3250 Linha em branco usada para separar blocos do arquivo.
3251 var delta = Math.min(64, tempo - ultimoTempo);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3252 ultimoTempo = tempo;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3253 Linha em branco usada para separar blocos do arquivo.
3254 if (!toqueAtivo && visivelNaTela && !document.hidden && larguraSequencia > 0) {Avalia a condição escrita nesta linha.
3255 posicao += velocidade * (delta / 1000);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3256 aplicarTransformacao();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3257 }Fecha ou delimita a estrutura iniciada anteriormente.
3258 Linha em branco usada para separar blocos do arquivo.
3259 animacaoId = window.requestAnimationFrame(animar);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3260 }Fecha ou delimita a estrutura iniciada anteriormente.
3261 Linha em branco usada para separar blocos do arquivo.
3262 function iniciarAnimacao(){Declara a função e os parâmetros mostrados.
3263 if (animacaoId || document.hidden || !visivelNaTela || !larguraSequencia) return;Avalia a condição escrita nesta linha.
3264 Linha em branco usada para separar blocos do arquivo.
3265 ultimoTempo = 0;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3266 animacaoId = window.requestAnimationFrame(animar);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3267 }Fecha ou delimita a estrutura iniciada anteriormente.
3268 Linha em branco usada para separar blocos do arquivo.
3269 function pararAnimacao(){Declara a função e os parâmetros mostrados.
3270 if (animacaoId) window.cancelAnimationFrame(animacaoId);Avalia a condição escrita nesta linha.
3271 Linha em branco usada para separar blocos do arquivo.
3272 animacaoId = 0;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3273 ultimoTempo = 0;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3274 }Fecha ou delimita a estrutura iniciada anteriormente.
3275 Linha em branco usada para separar blocos do arquivo.
3276 function moverUmItem(direcao){Declara a função e os parâmetros mostrados.
3277 if (!passoItem) return;Avalia a condição escrita nesta linha.
3278 Linha em branco usada para separar blocos do arquivo.
3279 posicao += passoItem * direcao;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3280 aplicarTransformacao();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3281 }Fecha ou delimita a estrutura iniciada anteriormente.
3282 Linha em branco usada para separar blocos do arquivo.
3283 if (anterior) {Avalia a condição escrita nesta linha.
3284 anterior.setAttribute('type', 'button');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3285 anterior.addEventListener('click', function(evento){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3286 evento.preventDefault();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3287 evento.stopPropagation();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3288 moverUmItem(-1);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3289 });Fecha ou delimita a estrutura iniciada anteriormente.
3290 }Fecha ou delimita a estrutura iniciada anteriormente.
3291 Linha em branco usada para separar blocos do arquivo.
3292 if (proximo) {Avalia a condição escrita nesta linha.
3293 proximo.setAttribute('type', 'button');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3294 proximo.addEventListener('click', function(evento){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3295 evento.preventDefault();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3296 evento.stopPropagation();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3297 moverUmItem(1);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3298 });Fecha ou delimita a estrutura iniciada anteriormente.
3299 }Fecha ou delimita a estrutura iniciada anteriormente.
3300 Linha em branco usada para separar blocos do arquivo.
3301 track.addEventListener('touchstart', function(evento){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3302 toqueAtivo = true;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3303 inicioToque = evento.touches[0].clientX;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3304 deslocamentoToque = 0;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3305 pararAnimacao();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3306 }, { passive:true });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3307 Linha em branco usada para separar blocos do arquivo.
3308 track.addEventListener('touchmove', function(evento){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3309 deslocamentoToque = evento.touches[0].clientX - inicioToque;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3310 }, { passive:true });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3311 Linha em branco usada para separar blocos do arquivo.
3312 track.addEventListener('touchend', function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3313 if (Math.abs(deslocamentoToque) > 40) {Avalia a condição escrita nesta linha.
3314 moverUmItem(deslocamentoToque < 0 ? 1 : -1);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3315 ignorarCliqueAte = Date.now() + 450;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3316 }Fecha ou delimita a estrutura iniciada anteriormente.
3317 Linha em branco usada para separar blocos do arquivo.
3318 deslocamentoToque = 0;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3319 toqueAtivo = false;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3320 iniciarAnimacao();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3321 }, { passive:true });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3322 Linha em branco usada para separar blocos do arquivo.
3323 wrap.addEventListener('click', function(evento){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3324 var item = evento.target.closest('.galItem[data-jacy-open-whatsapp-modal="1"]');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3325 Linha em branco usada para separar blocos do arquivo.
3326 if (!item || Date.now() < ignorarCliqueAte) return;Avalia a condição escrita nesta linha.
3327 Linha em branco usada para separar blocos do arquivo.
3328 evento.preventDefault();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3329 abrirWhatsAppRodape();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3330 });Fecha ou delimita a estrutura iniciada anteriormente.
3331 Linha em branco usada para separar blocos do arquivo.
3332 wrap.addEventListener('keydown', function(evento){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3333 var item = evento.target.closest('.galItem[data-jacy-open-whatsapp-modal="1"]');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3334 Linha em branco usada para separar blocos do arquivo.
3335 if (!item || (evento.key !== 'Enter' && evento.key !== ' ')) return;Avalia a condição escrita nesta linha.
3336 Linha em branco usada para separar blocos do arquivo.
3337 evento.preventDefault();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3338 abrirWhatsAppRodape();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3339 });Fecha ou delimita a estrutura iniciada anteriormente.
3340 Linha em branco usada para separar blocos do arquivo.
3341 document.addEventListener('visibilitychange', function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3342 if (document.hidden) pararAnimacao();Avalia a condição escrita nesta linha.
3343 else iniciarAnimacao();Abre o caminho alternativo da condição anterior.
3344 }, { passive:true });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3345 Linha em branco usada para separar blocos do arquivo.
3346 if ('IntersectionObserver' in window) {Avalia a condição escrita nesta linha.
3347 var observador = new IntersectionObserver(function(entradas){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3348 visivelNaTela = entradas.some(function(entrada){ return entrada.isIntersecting; });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3349 Linha em branco usada para separar blocos do arquivo.
3350 if (visivelNaTela) iniciarAnimacao();Avalia a condição escrita nesta linha.
3351 else pararAnimacao();Abre o caminho alternativo da condição anterior.
3352 }, { threshold:0.01 });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3353 Linha em branco usada para separar blocos do arquivo.
3354 observador.observe(wrap);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3355 }Fecha ou delimita a estrutura iniciada anteriormente.
3356 Linha em branco usada para separar blocos do arquivo.
3357 window.addEventListener('resize', function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3358 window.clearTimeout(resizeTimer);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3359 resizeTimer = window.setTimeout(function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3360 montarSequencia();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3361 iniciarAnimacao();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3362 }, 120);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3363 }, { passive:true });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3364 Linha em branco usada para separar blocos do arquivo.
3365 track.style.transition = 'none';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3366 montarSequencia();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3367 iniciarAnimacao();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3368})();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3369 Linha em branco usada para separar blocos do arquivo.
3370(function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3371 var track = document.getElementById('depTrack');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3372 if (!track) return;Avalia a condição escrita nesta linha.
3373 Linha em branco usada para separar blocos do arquivo.
3374 var items = Array.from(track.querySelectorAll('.depItem'));Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3375 var prev = document.getElementById('depPrev');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3376 var next = document.getElementById('depNext');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3377 var dotsEl = document.getElementById('depDots');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3378 var dots = [];Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3379 var index = 0;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3380 var t = null;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3381 var videoEmUso = false;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3382 var retomadaTimer = null;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3383 Linha em branco usada para separar blocos do arquivo.
3384 function perView(){Declara a função e os parâmetros mostrados.
3385 return (window.innerWidth >= 900) ? 2 : 1;Retorna o valor indicado pela linha.
3386 }Fecha ou delimita a estrutura iniciada anteriormente.
3387 Linha em branco usada para separar blocos do arquivo.
3388 function temVideoAssistindo(){Declara a função e os parâmetros mostrados.
3389 var videos = Array.from(track.querySelectorAll('video'));Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3390 return videos.some(function(video){Retorna o valor indicado pela linha.
3391 return video && !video.paused && !video.ended;Retorna o valor indicado pela linha.
3392 });Fecha ou delimita a estrutura iniciada anteriormente.
3393 }Fecha ou delimita a estrutura iniciada anteriormente.
3394 Linha em branco usada para separar blocos do arquivo.
3395 function temVideoTelaCheia(){Declara a função e os parâmetros mostrados.
3396 var fs = document.fullscreenElement || document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3397 return !!(fs && track.contains(fs));Retorna o valor indicado pela linha.
3398 }Fecha ou delimita a estrutura iniciada anteriormente.
3399 Linha em branco usada para separar blocos do arquivo.
3400 function podeRodarAutomatico(){Declara a função e os parâmetros mostrados.
3401 return !document.hidden && !videoEmUso && !temVideoAssistindo() && !temVideoTelaCheia();Retorna o valor indicado pela linha.
3402 }Fecha ou delimita a estrutura iniciada anteriormente.
3403 Linha em branco usada para separar blocos do arquivo.
3404 function stopDepoTimer(){Declara a função e os parâmetros mostrados.
3405 if (t) {Avalia a condição escrita nesta linha.
3406 clearInterval(t);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3407 t = null;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3408 }Fecha ou delimita a estrutura iniciada anteriormente.
3409 }Fecha ou delimita a estrutura iniciada anteriormente.
3410 Linha em branco usada para separar blocos do arquivo.
3411 function startDepoTimer(){Declara a função e os parâmetros mostrados.
3412 stopDepoTimer();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3413 if (!podeRodarAutomatico()) return;Avalia a condição escrita nesta linha.
3414 Linha em branco usada para separar blocos do arquivo.
3415 t = setInterval(function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3416 if (!podeRodarAutomatico()) {Avalia a condição escrita nesta linha.
3417 stopDepoTimer();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3418 return;Retorna o valor indicado pela linha.
3419 }Fecha ou delimita a estrutura iniciada anteriormente.
3420 Linha em branco usada para separar blocos do arquivo.
3421 var pv = perView();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3422 var pages = Math.max(1, Math.ceil(items.length / pv));Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3423 go((index + 1) % pages, false, false);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3424 }, 6000);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3425 }Fecha ou delimita a estrutura iniciada anteriormente.
3426 Linha em branco usada para separar blocos do arquivo.
3427 function pausarOutrosVideos(videoAtual){Declara a função e os parâmetros mostrados.
3428 Array.from(track.querySelectorAll('video')).forEach(function(video){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3429 if (video !== videoAtual) {Avalia a condição escrita nesta linha.
3430 try { video.pause(); } catch(e) {}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3431 }Fecha ou delimita a estrutura iniciada anteriormente.
3432 });Fecha ou delimita a estrutura iniciada anteriormente.
3433 }Fecha ou delimita a estrutura iniciada anteriormente.
3434 Linha em branco usada para separar blocos do arquivo.
3435 function pausarVideosForaDaPagina(){Declara a função e os parâmetros mostrados.
3436 var pv = perView();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3437 var inicio = index * pv;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3438 var fim = inicio + pv;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3439 Linha em branco usada para separar blocos do arquivo.
3440 items.forEach(function(item, pos){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3441 if (pos < inicio || pos >= fim) {Avalia a condição escrita nesta linha.
3442 Array.from(item.querySelectorAll('video')).forEach(function(video){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3443 try { video.pause(); } catch(e) {}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3444 });Fecha ou delimita a estrutura iniciada anteriormente.
3445 }Fecha ou delimita a estrutura iniciada anteriormente.
3446 });Fecha ou delimita a estrutura iniciada anteriormente.
3447 }Fecha ou delimita a estrutura iniciada anteriormente.
3448 Linha em branco usada para separar blocos do arquivo.
3449 function marcarVideoEmUso(){Declara a função e os parâmetros mostrados.
3450 videoEmUso = true;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3451 if (retomadaTimer) clearTimeout(retomadaTimer);Avalia a condição escrita nesta linha.
3452 stopDepoTimer();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3453 }Fecha ou delimita a estrutura iniciada anteriormente.
3454 Linha em branco usada para separar blocos do arquivo.
3455 function liberarVideoSeParado(){Declara a função e os parâmetros mostrados.
3456 if (retomadaTimer) clearTimeout(retomadaTimer);Avalia a condição escrita nesta linha.
3457 Linha em branco usada para separar blocos do arquivo.
3458 retomadaTimer = setTimeout(function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3459 if (!temVideoAssistindo() && !temVideoTelaCheia()) {Avalia a condição escrita nesta linha.
3460 videoEmUso = false;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3461 startDepoTimer();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3462 }Fecha ou delimita a estrutura iniciada anteriormente.
3463 }, 1200);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3464 }Fecha ou delimita a estrutura iniciada anteriormente.
3465 Linha em branco usada para separar blocos do arquivo.
3466 function layout(){Declara a função e os parâmetros mostrados.
3467 var pv = perView();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3468 var w = (100 / pv) + '%';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3469 items.forEach(function(el){ el.style.minWidth = w; });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3470 Linha em branco usada para separar blocos do arquivo.
3471 if (dotsEl) dotsEl.innerHTML = '';Avalia a condição escrita nesta linha.
3472 dots = [];Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3473 Linha em branco usada para separar blocos do arquivo.
3474 var pages = Math.max(1, Math.ceil(items.length / pv));Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3475 for (var i = 0; i < pages; i++) {Controla uma repetição conforme a expressão exibida.
3476 var b = document.createElement('button');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3477 b.type = 'button';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3478 b.style.cssText = 'width:10px;height:10px;border-radius:999px;border:0;background:#3a3c44;cursor:pointer;';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3479 (function(i){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3480 b.addEventListener('click', function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3481 videoEmUso = false;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3482 pausarOutrosVideos(null);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3483 go(i, false, true);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3484 startDepoTimer();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3485 });Fecha ou delimita a estrutura iniciada anteriormente.
3486 })(i);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3487 if (dotsEl) dotsEl.appendChild(b);Avalia a condição escrita nesta linha.
3488 dots.push(b);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3489 }Fecha ou delimita a estrutura iniciada anteriormente.
3490 Linha em branco usada para separar blocos do arquivo.
3491 clamp();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3492 go(index, true, false);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3493 }Fecha ou delimita a estrutura iniciada anteriormente.
3494 Linha em branco usada para separar blocos do arquivo.
3495 function clamp(){Declara a função e os parâmetros mostrados.
3496 var pv = perView();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3497 var pages = Math.max(1, Math.ceil(items.length / pv));Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3498 if (index < 0) index = 0;Avalia a condição escrita nesta linha.
3499 if (index > pages - 1) index = pages - 1;Avalia a condição escrita nesta linha.
3500 dots.forEach(function(d, i){ d.style.background = (i === index ? '#ffffff' : '#3a3c44'); });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3501 if (prev) prev.disabled = (index === 0);Avalia a condição escrita nesta linha.
3502 if (next) next.disabled = (index === pages - 1);Avalia a condição escrita nesta linha.
3503 }Fecha ou delimita a estrutura iniciada anteriormente.
3504 Linha em branco usada para separar blocos do arquivo.
3505 function go(i, noAnim, navegacaoManual){Declara a função e os parâmetros mostrados.
3506 index = i;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3507 clamp();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3508 Linha em branco usada para separar blocos do arquivo.
3509 if (navegacaoManual) {Avalia a condição escrita nesta linha.
3510 videoEmUso = false;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3511 pausarOutrosVideos(null);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3512 }Fecha ou delimita a estrutura iniciada anteriormente.
3513 Linha em branco usada para separar blocos do arquivo.
3514 if (noAnim) track.style.transition = 'none';Avalia a condição escrita nesta linha.
3515 var shift = (100 * index);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3516 track.style.transform = 'translateX(' + (-shift) + '%)';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3517 if (noAnim) requestAnimationFrame(function(){ track.style.transition = '.45s ease'; });Avalia a condição escrita nesta linha.
3518 Linha em branco usada para separar blocos do arquivo.
3519 pausarVideosForaDaPagina();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3520 }Fecha ou delimita a estrutura iniciada anteriormente.
3521 Linha em branco usada para separar blocos do arquivo.
3522 if (prev) {Avalia a condição escrita nesta linha.
3523 prev.addEventListener('click', function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3524 videoEmUso = false;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3525 pausarOutrosVideos(null);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3526 go(index - 1, false, true);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3527 startDepoTimer();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3528 });Fecha ou delimita a estrutura iniciada anteriormente.
3529 }Fecha ou delimita a estrutura iniciada anteriormente.
3530 Linha em branco usada para separar blocos do arquivo.
3531 if (next) {Avalia a condição escrita nesta linha.
3532 next.addEventListener('click', function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3533 videoEmUso = false;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3534 pausarOutrosVideos(null);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3535 go(index + 1, false, true);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3536 startDepoTimer();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3537 });Fecha ou delimita a estrutura iniciada anteriormente.
3538 }Fecha ou delimita a estrutura iniciada anteriormente.
3539 Linha em branco usada para separar blocos do arquivo.
3540 var sx = 0, dx = 0;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3541 track.addEventListener('touchstart', function(e){ sx = e.touches[0].clientX; }, { passive:true });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3542 track.addEventListener('touchmove', function(e){ dx = e.touches[0].clientX - sx; }, { passive:true });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3543 track.addEventListener('touchend', function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3544 if (Math.abs(dx) > 40) {Avalia a condição escrita nesta linha.
3545 videoEmUso = false;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3546 pausarOutrosVideos(null);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3547 dx < 0 ? go(index + 1, false, true) : go(index - 1, false, true);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3548 startDepoTimer();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3549 }Fecha ou delimita a estrutura iniciada anteriormente.
3550 dx = 0;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3551 }, { passive:true });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3552 Linha em branco usada para separar blocos do arquivo.
3553 Array.from(track.querySelectorAll('video')).forEach(function(video){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3554 ['pointerdown','mousedown','touchstart','click','focus','seeking','volumechange'].forEach(function(evt){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3555 video.addEventListener(evt, marcarVideoEmUso, { passive:true });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3556 });Fecha ou delimita a estrutura iniciada anteriormente.
3557 Linha em branco usada para separar blocos do arquivo.
3558 video.addEventListener('play', function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3559 marcarVideoEmUso();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3560 pausarOutrosVideos(video);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3561 });Fecha ou delimita a estrutura iniciada anteriormente.
3562 Linha em branco usada para separar blocos do arquivo.
3563 video.addEventListener('pause', liberarVideoSeParado);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3564 video.addEventListener('ended', liberarVideoSeParado);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3565 });Fecha ou delimita a estrutura iniciada anteriormente.
3566 Linha em branco usada para separar blocos do arquivo.
3567 ['fullscreenchange','webkitfullscreenchange','mozfullscreenchange','MSFullscreenChange'].forEach(function(evt){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3568 document.addEventListener(evt, function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3569 if (temVideoTelaCheia()) marcarVideoEmUso();Avalia a condição escrita nesta linha.
3570 else liberarVideoSeParado();Abre o caminho alternativo da condição anterior.
3571 });Fecha ou delimita a estrutura iniciada anteriormente.
3572 });Fecha ou delimita a estrutura iniciada anteriormente.
3573 Linha em branco usada para separar blocos do arquivo.
3574 window.addEventListener('resize', layout, { passive:true });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3575 Linha em branco usada para separar blocos do arquivo.
3576 document.addEventListener('visibilitychange', function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3577 if (document.hidden) stopDepoTimer();Avalia a condição escrita nesta linha.
3578 else startDepoTimer();Abre o caminho alternativo da condição anterior.
3579 }, { passive:true });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3580 Linha em branco usada para separar blocos do arquivo.
3581 layout();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3582 startDepoTimer();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3583})();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3584(function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3585 document.addEventListener('click', function(ev){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3586 document.querySelectorAll('header details[open]').forEach(function(d){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3587 if (!d.contains(ev.target)) d.removeAttribute('open');Avalia a condição escrita nesta linha.
3588 });Fecha ou delimita a estrutura iniciada anteriormente.
3589 }, { passive:true });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3590})();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3591 Linha em branco usada para separar blocos do arquivo.
3592function carregarImg(){Declara a função e os parâmetros mostrados.
3593 var input = document.getElementById('foto');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3594 var img = document.getElementById('target');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3595 var msg = document.getElementById('mensagem-comentario');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3596 Linha em branco usada para separar blocos do arquivo.
3597 if (!input || !input.files || !input.files[0]) return;Avalia a condição escrita nesta linha.
3598 Linha em branco usada para separar blocos do arquivo.
3599 var file = input.files[0];Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3600 var okTypes = ['image/jpeg', 'image/jpg', 'image/png', 'image/webp'];Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3601 Linha em branco usada para separar blocos do arquivo.
3602 if (okTypes.indexOf(file.type) === -1) {Avalia a condição escrita nesta linha.
3603 msg.textContent = 'Arquivo inválido. Use JPG, PNG ou WebP.';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3604 msg.style.color = '#ff8080';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3605 input.value = '';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3606 img.src = 'sistema/painel/img/comentarios/sem-foto.jpg';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3607 return;Retorna o valor indicado pela linha.
3608 }Fecha ou delimita a estrutura iniciada anteriormente.
3609 Linha em branco usada para separar blocos do arquivo.
3610 if (file.size > 5 * 1024 * 1024) {Avalia a condição escrita nesta linha.
3611 msg.textContent = 'Arquivo muito grande (máx. 5MB).';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3612 msg.style.color = '#ff8080';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3613 input.value = '';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3614 img.src = 'sistema/painel/img/comentarios/sem-foto.jpg';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3615 return;Retorna o valor indicado pela linha.
3616 }Fecha ou delimita a estrutura iniciada anteriormente.
3617 Linha em branco usada para separar blocos do arquivo.
3618 var reader = new FileReader();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3619 reader.onload = function(e){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3620 img.src = e.target.result;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3621 msg.textContent = '';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3622 };Fecha ou delimita a estrutura iniciada anteriormente.
3623 reader.readAsDataURL(file);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3624}Fecha ou delimita a estrutura iniciada anteriormente.
3625</script>Marca HTML presente na saída da página.
3626 Linha em branco usada para separar blocos do arquivo.
3627<script>Marca HTML presente na saída da página.
3628(function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3629 var ENDPOINT = '/cadastrar.php';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3630 var tel = document.getElementById('telefone_rodape');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3631 Linha em branco usada para separar blocos do arquivo.
3632 if (tel) {Avalia a condição escrita nesta linha.
3633 tel.addEventListener('input', function(e){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3634 var d = e.target.value.replace(/\D/g, '').slice(0, 11);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3635 var out = d;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3636 Linha em branco usada para separar blocos do arquivo.
3637 if (d.length > 2) out = '(' + d.slice(0, 2) + ') ' + d.slice(2);Avalia a condição escrita nesta linha.
3638 if (d.length >= 11) out = '(' + d.slice(0, 2) + ') ' + d.slice(2, 7) + '-' + d.slice(7);Avalia a condição escrita nesta linha.
3639 else if (d.length >= 7) out = '(' + d.slice(0, 2) + ') ' + d.slice(2, 6) + '-' + d.slice(6);Avalia a condição escrita nesta linha.
3640 Linha em branco usada para separar blocos do arquivo.
3641 e.target.value = out;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3642 });Fecha ou delimita a estrutura iniciada anteriormente.
3643 }Fecha ou delimita a estrutura iniciada anteriormente.
3644 Linha em branco usada para separar blocos do arquivo.
3645 var form = document.getElementById('form_cadastro');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3646 if (!form) return;Avalia a condição escrita nesta linha.
3647 Linha em branco usada para separar blocos do arquivo.
3648 form.addEventListener('submit', function(e){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3649 e.preventDefault();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3650 if (window.loadSwal) window.loadSwal();Avalia a condição escrita nesta linha.
3651 Linha em branco usada para separar blocos do arquivo.
3652 var action = (form.getAttribute('data-recaptcha-action') || 'cadastro').trim();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3653 var tokEl = form.querySelector('input[name="recaptcha_token"]');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3654 var actEl = form.querySelector('input[name="recaptcha_action"]');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3655 if (actEl) actEl.value = action;Avalia a condição escrita nesta linha.
3656 Linha em branco usada para separar blocos do arquivo.
3657 function prosseguirEnvio(){Declara a função e os parâmetros mostrados.
3658 var nome = (form.querySelector('[name="nome"]').value || '').trim();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3659 var fone = (form.querySelector('[name="telefone"]').value || '').replace(/\D/g, '');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3660 Linha em branco usada para separar blocos do arquivo.
3661 if (!nome || fone.length < 10) {Avalia a condição escrita nesta linha.
3662 if (window.Swal) Swal.fire({icon:'error', title:'❌ Dados inválidos', text:'Preencha corretamente nome e telefone.', confirmButtonColor:'#DAA520'});Avalia a condição escrita nesta linha.
3663 else alert('Preencha corretamente nome e telefone.');Abre o caminho alternativo da condição anterior.
3664 return;Retorna o valor indicado pela linha.
3665 }Fecha ou delimita a estrutura iniciada anteriormente.
3666 Linha em branco usada para separar blocos do arquivo.
3667 var xhr = new XMLHttpRequest();Inicia ou configura uma requisição assíncrona no navegador.
3668 xhr.open('POST', ENDPOINT, true);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3669 xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');Inicia ou configura uma requisição assíncrona no navegador.
3670 Linha em branco usada para separar blocos do arquivo.
3671 xhr.onreadystatechange = function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3672 if (xhr.readyState !== 4) return;Avalia a condição escrita nesta linha.
3673 Linha em branco usada para separar blocos do arquivo.
3674 var ok = (xhr.status >= 200 && xhr.status < 300);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3675 var resp = (xhr.responseText || '').replace(/\s+/g, ' ').trim();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3676 Linha em branco usada para separar blocos do arquivo.
3677 if (!ok) {Avalia a condição escrita nesta linha.
3678 if (window.Swal) Swal.fire({icon:'error', title:'❌ Erro ao enviar', text:'HTTP ' + xhr.status, confirmButtonColor:'#DAA520'});Avalia a condição escrita nesta linha.
3679 else alert('Erro HTTP ' + xhr.status);Abre o caminho alternativo da condição anterior.
3680 return;Retorna o valor indicado pela linha.
3681 }Fecha ou delimita a estrutura iniciada anteriormente.
3682 Linha em branco usada para separar blocos do arquivo.
3683 if (resp.indexOf('Cadastrado com Sucesso') === 0) {Avalia a condição escrita nesta linha.
3684 if (window.Swal) {Avalia a condição escrita nesta linha.
3685 Swal.fire({icon:'success', title:'✅ Sucesso!', text:'Cadastro realizado com sucesso.', confirmButtonColor:'#DAA520'})Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3686 .then(function(){ window.location.href = '/sistema/acesso'; });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3687 } else {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3688 alert('Cadastro realizado com sucesso.');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3689 window.location.href = '/sistema/acesso';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3690 }Fecha ou delimita a estrutura iniciada anteriormente.
3691 } else if (resp.indexOf('Você já está Cadastrado') === 0) {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3692 if (window.Swal) {Avalia a condição escrita nesta linha.
3693 Swal.fire({icon:'warning', title:'⚠️ Já cadastrado', text:'Você já tem cadastro.', confirmButtonColor:'#DAA520'})Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3694 .then(function(){ window.location.href = '/sistema/acesso'; });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3695 } else {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3696 alert('Você já tem cadastro.');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3697 window.location.href = '/sistema/acesso';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3698 }Fecha ou delimita a estrutura iniciada anteriormente.
3699 } else if (resp.indexOf('Preencha nome e telefone') === 0) {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3700 if (window.Swal) Swal.fire({icon:'error', title:'❌ Dados inválidos', text:'Preencha corretamente nome e telefone.', confirmButtonColor:'#DAA520'});Avalia a condição escrita nesta linha.
3701 else alert('Preencha corretamente nome e telefone.');Abre o caminho alternativo da condição anterior.
3702 } else {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3703 if (window.Swal) Swal.fire({icon:'error', title:'❌ Erro inesperado', html:'Retorno:<br><pre style="white-space:pre-wrap">' + resp + '</pre>', confirmButtonColor:'#DAA520'});Avalia a condição escrita nesta linha.
3704 else alert('Erro: ' + resp);Abre o caminho alternativo da condição anterior.
3705 }Fecha ou delimita a estrutura iniciada anteriormente.
3706 };Fecha ou delimita a estrutura iniciada anteriormente.
3707 Linha em branco usada para separar blocos do arquivo.
3708 xhr.onerror = function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3709 if (window.Swal) Swal.fire({icon:'error', title:'❌ Falha de rede', text:'Não foi possível enviar os dados.', confirmButtonColor:'#DAA520'});Avalia a condição escrita nesta linha.
3710 else alert('Falha de rede.');Abre o caminho alternativo da condição anterior.
3711 };Fecha ou delimita a estrutura iniciada anteriormente.
3712 Linha em branco usada para separar blocos do arquivo.
3713 xhr.send(new FormData(form));Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3714 }Fecha ou delimita a estrutura iniciada anteriormente.
3715 Linha em branco usada para separar blocos do arquivo.
3716 if (window.grecaptcha && window.RECAPTCHA_SITE_KEY) {Avalia a condição escrita nesta linha.
3717 grecaptcha.ready(function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3718 grecaptcha.execute(window.RECAPTCHA_SITE_KEY, {action:action}).then(function(token){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3719 if (tokEl) tokEl.value = token;Avalia a condição escrita nesta linha.
3720 prosseguirEnvio();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3721 }).catch(function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3722 prosseguirEnvio();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3723 });Fecha ou delimita a estrutura iniciada anteriormente.
3724 });Fecha ou delimita a estrutura iniciada anteriormente.
3725 } else {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3726 prosseguirEnvio();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3727 }Fecha ou delimita a estrutura iniciada anteriormente.
3728 });Fecha ou delimita a estrutura iniciada anteriormente.
3729})();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3730</script>Marca HTML presente na saída da página.
3731 Linha em branco usada para separar blocos do arquivo.
3732 Linha em branco usada para separar blocos do arquivo.
3733<script type="application/ld+json">Marca HTML presente na saída da página.
3734{Fecha ou delimita a estrutura iniciada anteriormente.
3735 "@context":"https://schema.org",Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3736 "@type":"HairSalon",Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3737 "name":<?=json_encode($SET['nome'], JSON_UNESCAPED_UNICODE)?>,Converte dados para JSON.
3738 "url":<?=json_encode(rtrim($SET['site'], '/') . '/', JSON_UNESCAPED_SLASHES)?>,Converte dados para JSON.
3739 "description":<?=json_encode($SET['descricao'], JSON_UNESCAPED_UNICODE)?>,Converte dados para JSON.
3740 "telephone":<?=json_encode($SET['telefone'], JSON_UNESCAPED_UNICODE)?>,Converte dados para JSON.
3741 "image":<?=json_encode($SET['logo_png'], JSON_UNESCAPED_SLASHES)?>,Converte dados para JSON.
3742 "address":{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3743 "@type":"PostalAddress",Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3744 "streetAddress":"Rua Rio Grande do Sul, 2151",Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3745 "addressLocality":"Cascavel",Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3746 "addressRegion":"PR",Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3747 "postalCode":"85801-050",Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3748 "addressCountry":"BR"Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3749 },Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3750 "geo":{Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3751 "@type":"GeoCoordinates",Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3752 "latitude":-24.957842,Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3753 "longitude":-53.458627Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3754 },Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3755 "areaServed":"Cascavel e região oeste do Paraná",Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3756 "priceRange":"R$R$",Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3757 "openingHoursSpecification":[Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3758 {"@type":"OpeningHoursSpecification","dayOfWeek":["Monday","Tuesday","Wednesday","Thursday","Friday"],"opens":"09:00","closes":"19:00"},Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3759 {"@type":"OpeningHoursSpecification","dayOfWeek":"Saturday","opens":"09:00","closes":"17:00"}Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3760 ],Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3761 "sameAs":[Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3762 <?=json_encode($INSTAGRAM_LINK ?: "https://www.instagram.com/jacycabeleireiro", JSON_UNESCAPED_SLASHES)?>,Converte dados para JSON.
3763 "https://maps.app.goo.gl/PGDcFaCRaq2pmMVa9"Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3764 ]Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3765}Fecha ou delimita a estrutura iniciada anteriormente.
3766</script>Marca HTML presente na saída da página.
3767 Linha em branco usada para separar blocos do arquivo.
3768<script>Marca HTML presente na saída da página.
3769document.addEventListener('DOMContentLoaded', function () {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3770 const el = document.querySelector('.counter-1999');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3771 const sec = document.querySelector('.experience-section');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3772 if (!el) return;Avalia a condição escrita nesta linha.
3773 Linha em branco usada para separar blocos do arquivo.
3774 fetch('/contador-visitas.php', { cache: 'no-store' })Inicia ou configura uma requisição assíncrona no navegador.
3775 .then(r => r.ok ? r.json() : Promise.reject(r.status))Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3776 .then(data => {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3777 const total = Number(data && data.visitas) || 0;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3778 const finalFmt = (data && data.formatado) ? String(data.formatado) : total.toLocaleString('pt-BR');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3779 startCounter(total, finalFmt);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3780 })Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3781 .catch(() => {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3782 startCounter(5280, (5280).toLocaleString('pt-BR'));Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3783 });Fecha ou delimita a estrutura iniciada anteriormente.
3784 Linha em branco usada para separar blocos do arquivo.
3785 function startCounter(target, finalFmt) {Declara a função e os parâmetros mostrados.
3786 el.textContent = '0';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3787 el.setAttribute('data-target', String(target));Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3788 const run = () => animateTo(target, finalFmt);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3789 Linha em branco usada para separar blocos do arquivo.
3790 if ('IntersectionObserver' in window && sec) {Avalia a condição escrita nesta linha.
3791 const io = new IntersectionObserver((entries) => {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3792 if (entries.some(e => e.isIntersecting) && !el.classList.contains('animated')) {Avalia a condição escrita nesta linha.
3793 el.classList.add('animated');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3794 run();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3795 io.disconnect();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3796 }Fecha ou delimita a estrutura iniciada anteriormente.
3797 }, { threshold: 0.3 });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3798 io.observe(sec);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3799 } else {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3800 run();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3801 }Fecha ou delimita a estrutura iniciada anteriormente.
3802 }Fecha ou delimita a estrutura iniciada anteriormente.
3803 Linha em branco usada para separar blocos do arquivo.
3804 function animateTo(target, finalFmt) {Declara a função e os parâmetros mostrados.
3805 if (!target || target <= 0) { el.textContent = '0'; return; }Avalia a condição escrita nesta linha.
3806 Linha em branco usada para separar blocos do arquivo.
3807 let current = 0;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3808 const duration = 2400;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3809 const steps = 100;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3810 const increment = Math.max(1, Math.ceil(target / steps));Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3811 const tick = Math.max(16, Math.floor(duration / Math.ceil(target / increment)));Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3812 Linha em branco usada para separar blocos do arquivo.
3813 const t = setInterval(() => {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3814 current += increment;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3815 if (current >= target) {Avalia a condição escrita nesta linha.
3816 clearInterval(t);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3817 el.textContent = finalFmt;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3818 return;Retorna o valor indicado pela linha.
3819 }Fecha ou delimita a estrutura iniciada anteriormente.
3820 el.textContent = current.toLocaleString('pt-BR');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3821 }, tick);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3822 }Fecha ou delimita a estrutura iniciada anteriormente.
3823});Fecha ou delimita a estrutura iniciada anteriormente.
3824</script>Marca HTML presente na saída da página.
3825 Linha em branco usada para separar blocos do arquivo.
3826<script>Marca HTML presente na saída da página.
3827(function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3828 var urlSimulacaoCliente = '/ajax/gerar_ia_cliente.php';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3829 var urlCadastroCliente = '/cadastrar.php';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3830 var imagemPadrao = '/sistema/painel/images/simulacoes/sem-foto.jpg';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3831 var pastaSimulacoes = '/sistema/painel/images/simulacoes/';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3832 var simulacaoEmAndamento = false;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3833 Linha em branco usada para separar blocos do arquivo.
3834 function normalizarUrlImagem(url){Declara a função e os parâmetros mostrados.
3835 if (!url) return '';Avalia a condição escrita nesta linha.
3836 url = String(url).trim();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3837 if (!url) return '';Avalia a condição escrita nesta linha.
3838 Linha em branco usada para separar blocos do arquivo.
3839 if (/^https?:\/\//i.test(url)) return url;Avalia a condição escrita nesta linha.
3840 if (url.charAt(0) === '/') return window.location.origin + url;Avalia a condição escrita nesta linha.
3841 Linha em branco usada para separar blocos do arquivo.
3842 return window.location.origin + '/' + url.replace(/^\.?\//, '');Retorna o valor indicado pela linha.
3843 }Fecha ou delimita a estrutura iniciada anteriormente.
3844 Linha em branco usada para separar blocos do arquivo.
3845 function montarUrlSimulacao(caminho){Declara a função e os parâmetros mostrados.
3846 if (!caminho) return '';Avalia a condição escrita nesta linha.
3847 caminho = String(caminho).trim();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3848 if (!caminho) return '';Avalia a condição escrita nesta linha.
3849 Linha em branco usada para separar blocos do arquivo.
3850 if (/^https?:\/\//i.test(caminho)) return caminho;Avalia a condição escrita nesta linha.
3851 if (caminho.indexOf('sistema/painel/images/simulacoes/') !== -1) return normalizarUrlImagem(caminho);Avalia a condição escrita nesta linha.
3852 if (caminho.charAt(0) === '/') return normalizarUrlImagem(caminho);Avalia a condição escrita nesta linha.
3853 Linha em branco usada para separar blocos do arquivo.
3854 return normalizarUrlImagem(pastaSimulacoes + caminho.replace(/^\.?\//, ''));Retorna o valor indicado pela linha.
3855 }Fecha ou delimita a estrutura iniciada anteriormente.
3856 Linha em branco usada para separar blocos do arquivo.
3857 function adicionarCacheNaImagem(url){Declara a função e os parâmetros mostrados.
3858 if (!url) return '';Avalia a condição escrita nesta linha.
3859 return url + (url.indexOf('?') !== -1 ? '&v=' : '?v=') + Date.now();Retorna o valor indicado pela linha.
3860 }Fecha ou delimita a estrutura iniciada anteriormente.
3861 Linha em branco usada para separar blocos do arquivo.
3862 function retornoFoiSucesso(status){Declara a função e os parâmetros mostrados.
3863 if (!status) return false;Avalia a condição escrita nesta linha.
3864 status = String(status).toLowerCase().trim();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3865 return status === 'success' || status === 'sucesso';Retorna o valor indicado pela linha.
3866 }Fecha ou delimita a estrutura iniciada anteriormente.
3867 Linha em branco usada para separar blocos do arquivo.
3868 function formatarTelefoneBR(valor){Declara a função e os parâmetros mostrados.
3869 var d = String(valor || '').replace(/\D/g, '').slice(0, 11);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3870 if (!d) return '';Avalia a condição escrita nesta linha.
3871 Linha em branco usada para separar blocos do arquivo.
3872 if (d.length <= 2) return d;Avalia a condição escrita nesta linha.
3873 if (d.length <= 6) return '(' + d.slice(0, 2) + ') ' + d.slice(2);Avalia a condição escrita nesta linha.
3874 if (d.length <= 10) return '(' + d.slice(0, 2) + ') ' + d.slice(2, 6) + '-' + d.slice(6);Avalia a condição escrita nesta linha.
3875 Linha em branco usada para separar blocos do arquivo.
3876 return '(' + d.slice(0, 2) + ') ' + d.slice(2, 7) + '-' + d.slice(7, 11);Retorna o valor indicado pela linha.
3877 }Fecha ou delimita a estrutura iniciada anteriormente.
3878 Linha em branco usada para separar blocos do arquivo.
3879 function aplicarMascaraTelefoneSimulador(){Declara a função e os parâmetros mostrados.
3880 var campo = document.getElementById('telefone_simulacao_cliente');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3881 if (!campo) return;Avalia a condição escrita nesta linha.
3882 Linha em branco usada para separar blocos do arquivo.
3883 if (campo.getAttribute('data-mask-simulador') === '1') {Avalia a condição escrita nesta linha.
3884 campo.value = formatarTelefoneBR(campo.value);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3885 return;Retorna o valor indicado pela linha.
3886 }Fecha ou delimita a estrutura iniciada anteriormente.
3887 Linha em branco usada para separar blocos do arquivo.
3888 var aplicar = function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3889 campo.value = formatarTelefoneBR(campo.value);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3890 };Fecha ou delimita a estrutura iniciada anteriormente.
3891 Linha em branco usada para separar blocos do arquivo.
3892 campo.addEventListener('input', aplicar);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3893 campo.addEventListener('blur', aplicar);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3894 campo.addEventListener('paste', function(){ setTimeout(aplicar, 0); });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3895 Linha em branco usada para separar blocos do arquivo.
3896 campo.setAttribute('data-mask-simulador', '1');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3897 aplicar();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3898 }Fecha ou delimita a estrutura iniciada anteriormente.
3899 Linha em branco usada para separar blocos do arquivo.
3900 function setEstadoBotao(carregando){Declara a função e os parâmetros mostrados.
3901 var btn = document.getElementById('btn_simular_cliente');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3902 var icone = document.getElementById('icone_btn_simular_cliente');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3903 var texto = document.getElementById('texto_btn_simular_cliente');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3904 var msg = document.getElementById('mensagem_simulacao_cliente');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3905 Linha em branco usada para separar blocos do arquivo.
3906 if (!btn || !icone || !texto || !msg) return;Avalia a condição escrita nesta linha.
3907 Linha em branco usada para separar blocos do arquivo.
3908 if (carregando) {Avalia a condição escrita nesta linha.
3909 btn.disabled = true;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3910 btn.style.pointerEvents = 'none';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3911 icone.className = 'fa fa-spinner fa-spin';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3912 texto.innerText = 'Simulando...';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3913 msg.className = 'text-info';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3914 msg.innerText = 'Gerando simulação, aguarde...';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3915 return;Retorna o valor indicado pela linha.
3916 }Fecha ou delimita a estrutura iniciada anteriormente.
3917 Linha em branco usada para separar blocos do arquivo.
3918 btn.disabled = false;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3919 btn.style.pointerEvents = '';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3920 icone.className = 'fa fa-magic';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3921 texto.innerText = 'Simular';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3922 }Fecha ou delimita a estrutura iniciada anteriormente.
3923 Linha em branco usada para separar blocos do arquivo.
3924 function resetarModalSimulacaoCliente(){Declara a função e os parâmetros mostrados.
3925 var form = document.getElementById('form_simulacao_cliente');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3926 var imgOriginal = document.getElementById('preview_original_simulacao_cliente');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3927 var imgResultado = document.getElementById('preview_resultado_simulacao_cliente');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3928 var msg = document.getElementById('mensagem_simulacao_cliente');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3929 Linha em branco usada para separar blocos do arquivo.
3930 simulacaoEmAndamento = false;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3931 Linha em branco usada para separar blocos do arquivo.
3932 if (form) form.reset();Avalia a condição escrita nesta linha.
3933 if (imgOriginal) imgOriginal.src = adicionarCacheNaImagem(imagemPadrao);Avalia a condição escrita nesta linha.
3934 if (imgResultado) imgResultado.src = adicionarCacheNaImagem(imagemPadrao);Avalia a condição escrita nesta linha.
3935 Linha em branco usada para separar blocos do arquivo.
3936 if (msg) {Avalia a condição escrita nesta linha.
3937 msg.innerText = '';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3938 msg.className = '';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3939 }Fecha ou delimita a estrutura iniciada anteriormente.
3940 Linha em branco usada para separar blocos do arquivo.
3941 setEstadoBotao(false);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3942 aplicarMascaraTelefoneSimulador();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3943 }Fecha ou delimita a estrutura iniciada anteriormente.
3944 Linha em branco usada para separar blocos do arquivo.
3945 function inicializarSimuladorCliente(){Declara a função e os parâmetros mostrados.
3946 aplicarMascaraTelefoneSimulador();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3947 Linha em branco usada para separar blocos do arquivo.
3948 var imgOriginal = document.getElementById('preview_original_simulacao_cliente');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3949 var imgResultado = document.getElementById('preview_resultado_simulacao_cliente');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3950 Linha em branco usada para separar blocos do arquivo.
3951 if (imgOriginal && (!imgOriginal.getAttribute('src') || imgOriginal.getAttribute('src') === '')) {Avalia a condição escrita nesta linha.
3952 imgOriginal.src = adicionarCacheNaImagem(imagemPadrao);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3953 }Fecha ou delimita a estrutura iniciada anteriormente.
3954 Linha em branco usada para separar blocos do arquivo.
3955 if (imgResultado && (!imgResultado.getAttribute('src') || imgResultado.getAttribute('src') === '')) {Avalia a condição escrita nesta linha.
3956 imgResultado.src = adicionarCacheNaImagem(imagemPadrao);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3957 }Fecha ou delimita a estrutura iniciada anteriormente.
3958 }Fecha ou delimita a estrutura iniciada anteriormente.
3959 Linha em branco usada para separar blocos do arquivo.
3960 window.carregarPreviewSimulacaoCliente = function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3961 var campo = document.getElementById('foto_simulacao_cliente');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3962 var imgOriginal = document.getElementById('preview_original_simulacao_cliente');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3963 var imgResultado = document.getElementById('preview_resultado_simulacao_cliente');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3964 Linha em branco usada para separar blocos do arquivo.
3965 if (!campo || !imgOriginal || !imgResultado) return;Avalia a condição escrita nesta linha.
3966 Linha em branco usada para separar blocos do arquivo.
3967 if (!campo.files || !campo.files[0]) {Avalia a condição escrita nesta linha.
3968 imgOriginal.src = adicionarCacheNaImagem(imagemPadrao);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3969 imgResultado.src = adicionarCacheNaImagem(imagemPadrao);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3970 return;Retorna o valor indicado pela linha.
3971 }Fecha ou delimita a estrutura iniciada anteriormente.
3972 Linha em branco usada para separar blocos do arquivo.
3973 var arquivo = campo.files[0];Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3974 var reader = new FileReader();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3975 Linha em branco usada para separar blocos do arquivo.
3976 reader.onload = function(e){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3977 imgOriginal.src = e.target.result;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3978 imgResultado.src = adicionarCacheNaImagem(imagemPadrao);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3979 };Fecha ou delimita a estrutura iniciada anteriormente.
3980 Linha em branco usada para separar blocos do arquivo.
3981 reader.onerror = function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3982 imgOriginal.src = adicionarCacheNaImagem(imagemPadrao);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3983 imgResultado.src = adicionarCacheNaImagem(imagemPadrao);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3984 };Fecha ou delimita a estrutura iniciada anteriormente.
3985 Linha em branco usada para separar blocos do arquivo.
3986 reader.readAsDataURL(arquivo);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3987 };Fecha ou delimita a estrutura iniciada anteriormente.
3988 Linha em branco usada para separar blocos do arquivo.
3989 window.enviarSimulacaoCliente = function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3990 if (window.loadSwal) window.loadSwal();Avalia a condição escrita nesta linha.
3991 var form = document.getElementById('form_simulacao_cliente');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3992 var campo = document.getElementById('foto_simulacao_cliente');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3993 var nomeCampo = document.getElementById('nome_simulacao_cliente');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3994 var telefoneCampo = document.getElementById('telefone_simulacao_cliente');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3995 var msg = document.getElementById('mensagem_simulacao_cliente');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3996 var imgOriginal = document.getElementById('preview_original_simulacao_cliente');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3997 var imgResultado = document.getElementById('preview_resultado_simulacao_cliente');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
3998 Linha em branco usada para separar blocos do arquivo.
3999 if (simulacaoEmAndamento) return;Avalia a condição escrita nesta linha.
4000 if (!form || !campo || !msg || !imgOriginal || !imgResultado) return;Avalia a condição escrita nesta linha.
4001 Linha em branco usada para separar blocos do arquivo.
4002 var nome = nomeCampo ? nomeCampo.value.trim() : '';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4003 var telefone = telefoneCampo ? telefoneCampo.value.trim() : '';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4004 Linha em branco usada para separar blocos do arquivo.
4005 if (!nome || !telefone) {Avalia a condição escrita nesta linha.
4006 msg.className = 'text-danger';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4007 msg.innerText = 'Preencha nome e WhatsApp';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4008 return;Retorna o valor indicado pela linha.
4009 }Fecha ou delimita a estrutura iniciada anteriormente.
4010 Linha em branco usada para separar blocos do arquivo.
4011 if (telefone.replace(/\D/g, '').length < 10) {Avalia a condição escrita nesta linha.
4012 msg.className = 'text-danger';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4013 msg.innerText = 'Preencha um WhatsApp válido';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4014 return;Retorna o valor indicado pela linha.
4015 }Fecha ou delimita a estrutura iniciada anteriormente.
4016 Linha em branco usada para separar blocos do arquivo.
4017 if (!campo.files || !campo.files[0]) {Avalia a condição escrita nesta linha.
4018 msg.className = 'text-danger';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4019 msg.innerText = 'Selecione uma imagem para simular';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4020 return;Retorna o valor indicado pela linha.
4021 }Fecha ou delimita a estrutura iniciada anteriormente.
4022 Linha em branco usada para separar blocos do arquivo.
4023 simulacaoEmAndamento = true;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4024 setEstadoBotao(true);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4025 Linha em branco usada para separar blocos do arquivo.
4026 var formData = new FormData(form);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4027 Linha em branco usada para separar blocos do arquivo.
4028 fetch(urlSimulacaoCliente, {Inicia ou configura uma requisição assíncrona no navegador.
4029 method: 'POST',Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4030 body: formDataLinha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4031 })Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4032 .then(async function(response){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4033 var texto = await response.text();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4034 var dados = null;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4035 Linha em branco usada para separar blocos do arquivo.
4036 try {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4037 dados = JSON.parse(texto);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4038 } catch (e) {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4039 throw new Error(texto || 'Resposta inválida do servidor');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4040 }Fecha ou delimita a estrutura iniciada anteriormente.
4041 Linha em branco usada para separar blocos do arquivo.
4042 if (!response.ok || !dados || !retornoFoiSucesso(dados.status)) {Avalia a condição escrita nesta linha.
4043 throw new Error((dados && dados.mensagem) ? dados.mensagem : 'Erro ao processar a simulação');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4044 }Fecha ou delimita a estrutura iniciada anteriormente.
4045 Linha em branco usada para separar blocos do arquivo.
4046 var urlOriginal = '';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4047 var urlSimulada = '';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4048 Linha em branco usada para separar blocos do arquivo.
4049 if (dados.url_original) urlOriginal = normalizarUrlImagem(dados.url_original);Avalia a condição escrita nesta linha.
4050 else if (dados.foto_original) urlOriginal = montarUrlSimulacao(dados.foto_original);Avalia a condição escrita nesta linha.
4051 Linha em branco usada para separar blocos do arquivo.
4052 if (dados.url_simulada) urlSimulada = normalizarUrlImagem(dados.url_simulada);Avalia a condição escrita nesta linha.
4053 else if (dados.imagem_simulada) urlSimulada = montarUrlSimulacao(dados.imagem_simulada);Avalia a condição escrita nesta linha.
4054 Linha em branco usada para separar blocos do arquivo.
4055 if (!urlSimulada) throw new Error('A imagem simulada não foi retornada');Avalia a condição escrita nesta linha.
4056 Linha em branco usada para separar blocos do arquivo.
4057 if (urlOriginal) imgOriginal.src = adicionarCacheNaImagem(urlOriginal);Avalia a condição escrita nesta linha.
4058 imgResultado.src = adicionarCacheNaImagem(urlSimulada);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4059 Linha em branco usada para separar blocos do arquivo.
4060 fetch(urlCadastroCliente, {Inicia ou configura uma requisição assíncrona no navegador.
4061 method: 'POST',Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4062 body: new FormData(form)Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4063 }).catch(function(){});Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4064 Linha em branco usada para separar blocos do arquivo.
4065 msg.className = 'text-success';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4066 msg.innerText = 'Simulação enviada com sucesso';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4067 if (typeof window.jacyTrackAdsConversion === 'function') { window.jacyTrackAdsConversion('simulacao_protese_sucesso'); }Avalia a condição escrita nesta linha.
4068 })Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4069 .catch(function(erro){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4070 imgResultado.src = adicionarCacheNaImagem(imagemPadrao);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4071 msg.className = 'text-danger';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4072 msg.innerText = erro.message ? erro.message : 'Erro ao processar a simulação';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4073 })Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4074 .finally(function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4075 simulacaoEmAndamento = false;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4076 setEstadoBotao(false);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4077 });Fecha ou delimita a estrutura iniciada anteriormente.
4078 };Fecha ou delimita a estrutura iniciada anteriormente.
4079 Linha em branco usada para separar blocos do arquivo.
4080 document.addEventListener('DOMContentLoaded', function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4081 inicializarSimuladorCliente();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4082 });Fecha ou delimita a estrutura iniciada anteriormente.
4083 Linha em branco usada para separar blocos do arquivo.
4084 window.addEventListener('load', function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4085 inicializarSimuladorCliente();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4086 });Fecha ou delimita a estrutura iniciada anteriormente.
4087 Linha em branco usada para separar blocos do arquivo.
4088 document.addEventListener('click', function(ev){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4089 var abrir = ev.target.closest('[data-target="#modalSimulacaoCliente"], a[href="#modalSimulacaoCliente"]');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4090 if (abrir) {Avalia a condição escrita nesta linha.
4091 setTimeout(function(){ inicializarSimuladorCliente(); }, 80);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4092 }Fecha ou delimita a estrutura iniciada anteriormente.
4093 Linha em branco usada para separar blocos do arquivo.
4094 var fechar = ev.target.closest('#modalSimulacaoCliente [data-dismiss="modal"], #modalSimulacaoCliente .close');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4095 if (fechar) {Avalia a condição escrita nesta linha.
4096 setTimeout(function(){ resetarModalSimulacaoCliente(); }, 80);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4097 }Fecha ou delimita a estrutura iniciada anteriormente.
4098 });Fecha ou delimita a estrutura iniciada anteriormente.
4099 Linha em branco usada para separar blocos do arquivo.
4100 if (window.jQuery) {Avalia a condição escrita nesta linha.
4101 window.jQuery('#modalSimulacaoCliente').on('hidden.bs.modal', function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4102 resetarModalSimulacaoCliente();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4103 });Fecha ou delimita a estrutura iniciada anteriormente.
4104 Linha em branco usada para separar blocos do arquivo.
4105 window.jQuery('#modalSimulacaoCliente').on('shown.bs.modal', function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4106 inicializarSimuladorCliente();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4107 });Fecha ou delimita a estrutura iniciada anteriormente.
4108 }Fecha ou delimita a estrutura iniciada anteriormente.
4109})();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4110</script>Marca HTML presente na saída da página.
4111 Linha em branco usada para separar blocos do arquivo.
4112 Linha em branco usada para separar blocos do arquivo.
4113<script>Marca HTML presente na saída da página.
4114(function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4115 var frames = Array.prototype.slice.call(document.querySelectorAll('iframe.js-lazy-iframe[data-src]'));Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4116 if (!frames.length) return;Avalia a condição escrita nesta linha.
4117 Linha em branco usada para separar blocos do arquivo.
4118 function loadFrame(frame){Declara a função e os parâmetros mostrados.
4119 if (!frame || frame.dataset.loaded === '1') return;Avalia a condição escrita nesta linha.
4120 var src = frame.getAttribute('data-src');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4121 if (!src) return;Avalia a condição escrita nesta linha.
4122 frame.src = src;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4123 frame.dataset.loaded = '1';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4124 }Fecha ou delimita a estrutura iniciada anteriormente.
4125 Linha em branco usada para separar blocos do arquivo.
4126 if ('IntersectionObserver' in window) {Avalia a condição escrita nesta linha.
4127 var io = new IntersectionObserver(function(entries){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4128 entries.forEach(function(entry){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4129 if (!entry.isIntersecting) return;Avalia a condição escrita nesta linha.
4130 loadFrame(entry.target);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4131 io.unobserve(entry.target);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4132 });Fecha ou delimita a estrutura iniciada anteriormente.
4133 }, { rootMargin: '350px 0px', threshold: 0.01 });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4134 Linha em branco usada para separar blocos do arquivo.
4135 frames.forEach(function(frame){ io.observe(frame); });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4136 } else {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4137 frames.forEach(loadFrame);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4138 }Fecha ou delimita a estrutura iniciada anteriormente.
4139 Linha em branco usada para separar blocos do arquivo.
4140 document.addEventListener('shown.bs.modal', function(e){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4141 if (!e.target) return;Avalia a condição escrita nesta linha.
4142 var frame = e.target.querySelector('iframe.js-lazy-iframe[data-src]');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4143 if (frame) loadFrame(frame);Avalia a condição escrita nesta linha.
4144 });Fecha ou delimita a estrutura iniciada anteriormente.
4145 Linha em branco usada para separar blocos do arquivo.
4146 document.addEventListener('click', function(e){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4147 var opener = e.target.closest('[data-target="#empresa"], a[href="#empresa"], [data-target="#modalVideo"], a[href="#modalVideo"]');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4148 if (!opener) return;Avalia a condição escrita nesta linha.
4149 setTimeout(function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4150 frames.forEach(function(frame){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4151 if (frame.offsetParent !== null) loadFrame(frame);Avalia a condição escrita nesta linha.
4152 });Fecha ou delimita a estrutura iniciada anteriormente.
4153 }, 120);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4154 });Fecha ou delimita a estrutura iniciada anteriormente.
4155})();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4156</script>Marca HTML presente na saída da página.
4157 Linha em branco usada para separar blocos do arquivo.
4158<script>Marca HTML presente na saída da página.
4159(function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4160 var swalLoaded = false;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4161 Linha em branco usada para separar blocos do arquivo.
4162 function loadSwal(){Declara a função e os parâmetros mostrados.
4163 if (swalLoaded) return;Avalia a condição escrita nesta linha.
4164 swalLoaded = true;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4165 Linha em branco usada para separar blocos do arquivo.
4166 var s = document.createElement('script');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4167 s.src = 'https://cdn.jsdelivr.net/npm/sweetalert2@11';Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4168 s.defer = true;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4169 document.head.appendChild(s);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4170 }Fecha ou delimita a estrutura iniciada anteriormente.
4171 Linha em branco usada para separar blocos do arquivo.
4172 window.loadSwal = loadSwal;Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4173 Linha em branco usada para separar blocos do arquivo.
4174 if ('requestIdleCallback' in window) {Avalia a condição escrita nesta linha.
4175 requestIdleCallback(function(){ setTimeout(loadSwal, 10000); }, { timeout: 7000 });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4176 } else {Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4177 window.addEventListener('load', function(){ setTimeout(loadSwal, 10000); }, { once:true });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4178 }Fecha ou delimita a estrutura iniciada anteriormente.
4179 Linha em branco usada para separar blocos do arquivo.
4180 document.addEventListener('focusin', function(e){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4181 if (e.target.closest('#form_cadastro') || e.target.closest('#form_simulacao_cliente') || e.target.closest('#form')) {Avalia a condição escrita nesta linha.
4182 loadSwal();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4183 }Fecha ou delimita a estrutura iniciada anteriormente.
4184 });Fecha ou delimita a estrutura iniciada anteriormente.
4185 Linha em branco usada para separar blocos do arquivo.
4186 document.addEventListener('pointerdown', function(e){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4187 if (e.target.closest('#form_cadastro') || e.target.closest('#form_simulacao_cliente') || e.target.closest('#form')) {Avalia a condição escrita nesta linha.
4188 loadSwal();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4189 }Fecha ou delimita a estrutura iniciada anteriormente.
4190 }, { passive:true });Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4191})();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4192</script>Marca HTML presente na saída da página.
4193 Linha em branco usada para separar blocos do arquivo.
4194 Linha em branco usada para separar blocos do arquivo.
4195<script>Marca HTML presente na saída da página.
4196(function(){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4197 function marcarConversaoPorClique(rotulo){Declara a função e os parâmetros mostrados.
4198 if (typeof window.jacyTrackAdsConversion === 'function') {Avalia a condição escrita nesta linha.
4199 window.jacyTrackAdsConversion(rotulo);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4200 }Fecha ou delimita a estrutura iniciada anteriormente.
4201 }Fecha ou delimita a estrutura iniciada anteriormente.
4202 Linha em branco usada para separar blocos do arquivo.
4203 document.addEventListener('click', function(ev){Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4204 var alvo = ev.target.closest('a, button');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4205 if (!alvo) return;Avalia a condição escrita nesta linha.
4206 Linha em branco usada para separar blocos do arquivo.
4207 var href = (alvo.getAttribute('href') || '').toLowerCase();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4208 var id = (alvo.getAttribute('id') || '').toLowerCase();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4209 Linha em branco usada para separar blocos do arquivo.
4210 if (id === 'ctawhats' || href.indexOf('wa.me/') !== -1 || href.indexOf('api.whatsapp.com') !== -1) {Avalia a condição escrita nesta linha.
4211 marcarConversaoPorClique('clique_whatsapp_protese');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4212 return;Retorna o valor indicado pela linha.
4213 }Fecha ou delimita a estrutura iniciada anteriormente.
4214 Linha em branco usada para separar blocos do arquivo.
4215 if (id === 'ctaapp' || href.indexOf('/agendamentos') !== -1 || href.indexOf('agendamentos') !== -1) {Avalia a condição escrita nesta linha.
4216 marcarConversaoPorClique('clique_agendamento_protese');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4217 return;Retorna o valor indicado pela linha.
4218 }Fecha ou delimita a estrutura iniciada anteriormente.
4219 Linha em branco usada para separar blocos do arquivo.
4220 if (href.indexOf('abrir_simulador=1') !== -1 || href.indexOf('#modalsimulacaocliente') !== -1) {Avalia a condição escrita nesta linha.
4221 marcarConversaoPorClique('clique_simulacao_protese');Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4222 }Fecha ou delimita a estrutura iniciada anteriormente.
4223 }, true);Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4224})();Linha do arquivo original; deve ser lida junto com o bloco em que está inserida.
4225</script>Marca HTML presente na saída da página.
4226 Linha em branco usada para separar blocos do arquivo.
4227</body>Marca HTML presente na saída da página.
4228</html>Marca HTML presente na saída da página.

Navegação entre arquivos do grupo