{"id":15370,"date":"2026-02-15T20:33:51","date_gmt":"2026-02-15T23:33:51","guid":{"rendered":"https:\/\/guilhermegodoy.com\/?page_id=15370"},"modified":"2026-02-18T00:25:48","modified_gmt":"2026-02-18T03:25:48","slug":"well-last-forever","status":"publish","type":"page","link":"https:\/\/guilhermegodoy.com\/en\/well-last-forever\/","title":{"rendered":"We&#039;ll Last Forever \u2013 The paradox of &#039;forever&#039; in Dark-Pop and Soul"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"15370\" class=\"elementor elementor-15370\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7c5c06b e-con-full e-flex e-con e-parent\" data-id=\"7c5c06b\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0262e98 elementor-widget elementor-widget-html\" data-id=\"0262e98\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!DOCTYPE html>\r\n<html lang=\"pt-BR\">\r\n<head>\r\n  <meta charset=\"UTF-8\" \/>\r\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1, viewport-fit=cover\" \/>\r\n\r\n  <!-- \u2550\u2550\u2550 SEO b\u00e1sico \u2550\u2550\u2550 -->\r\n  <title>We'll Last Forever \u2013 Guilherme Godoy<\/title>\r\n  <meta name=\"description\" content=\"Novo lan\u00e7amento de Guilherme Godoy. Se todas as moedas podem comprar o tempo, algumas te aprisionar\u00e3o pela eternidade. Ou\u00e7a agora.\">\r\n  <link rel=\"canonical\" href=\"https:\/\/guilhermegodoy.com\/well-last-forever\/\">\r\n\r\n  <!-- \u2550\u2550\u2550 Open Graph \/ redes sociais \u2550\u2550\u2550 -->\r\n  <meta property=\"og:type\"        content=\"music.song\">\r\n  <meta property=\"og:title\"       content=\"We'll Last Forever \u2013 Guilherme Godoy\">\r\n  <meta property=\"og:description\" content=\"Se todas as moedas podem comprar o tempo, algumas te aprisionar\u00e3o pela eternidade.\">\r\n  <meta property=\"og:url\"         content=\"https:\/\/guilhermegodoy.com\/well-last-forever\/\">\r\n  <meta property=\"og:image\"       content=\"https:\/\/guilhermegodoy.com\/wp-content\/uploads\/2025\/10\/wwWell-Last-Forever-final-scaled.webp\">\r\n  <meta property=\"og:image:width\"  content=\"1200\">\r\n  <meta property=\"og:image:height\" content=\"1800\">\r\n  <meta property=\"og:locale\"      content=\"pt_BR\">\r\n  <meta property=\"og:site_name\"   content=\"Guilherme Godoy\">\r\n\r\n  <!-- Twitter Card -->\r\n  <meta name=\"twitter:card\"        content=\"summary_large_image\">\r\n  <meta name=\"twitter:title\"       content=\"We'll Last Forever \u2013 Guilherme Godoy\">\r\n  <meta name=\"twitter:description\" content=\"Se todas as moedas podem comprar o tempo, algumas te aprisionar\u00e3o pela eternidade.\">\r\n  <meta name=\"twitter:image\"       content=\"https:\/\/guilhermegodoy.com\/wp-content\/uploads\/2025\/10\/wwWell-Last-Forever-final-scaled.webp\">\r\n\r\n  <!-- \u2550\u2550\u2550 Schema.org \u2013 MusicRecording \u2550\u2550\u2550 -->\r\n  <script type=\"application\/ld+json\">\r\n  {\r\n    \"@context\": \"https:\/\/schema.org\",\r\n    \"@type\": \"MusicRecording\",\r\n    \"name\": \"We'll Last Forever\",\r\n    \"byArtist\": {\r\n      \"@type\": \"MusicGroup\",\r\n      \"name\": \"Guilherme Godoy\",\r\n      \"url\": \"https:\/\/guilhermegodoy.com\"\r\n    },\r\n    \"image\": \"https:\/\/guilhermegodoy.com\/wp-content\/uploads\/2025\/10\/wwWell-Last-Forever-final-scaled.webp\",\r\n    \"description\": \"Se todas as moedas podem comprar o tempo, algumas te aprisionar\u00e3o pela eternidade.\",\r\n    \"sameAs\": [\"https:\/\/linktr.ee\/guilhermemgodoy\"]\r\n  }\r\n  <\/script>\r\n\r\n  <!-- \u2550\u2550\u2550 Pr\u00e9-carregamento cr\u00edtico \u2550\u2550\u2550 -->\r\n  <link rel=\"preload\" as=\"image\"\r\n        href=\"https:\/\/guilhermegodoy.com\/wp-content\/uploads\/2025\/10\/wwWell-Last-Forever-final-scaled.webp\"\r\n        imagesrcset=\"https:\/\/guilhermegodoy.com\/wp-content\/uploads\/2025\/10\/wwWell-Last-Forever-final-scaled.webp 1200w\"\r\n        imagesizes=\"(min-width: 900px) 50vw, 100vw\"\r\n        fetchpriority=\"high\">\r\n  <link rel=\"preload\" as=\"image\" href=\"https:\/\/guilhermegodoy.com\/wp-content\/uploads\/2025\/10\/Well-Last-Forever-moeda-do-infinito-1.webp\">\r\n\r\n  <style>\r\n    \/* \u2500\u2500 Reset + prote\u00e7\u00f5es \u2500\u2500 *\/\r\n    *, *::before, *::after { margin: 0; padding: 0; box-sizing: border-box; }\r\n    html, body { width: 100%; max-width: 100%; overflow-x: clip; }\r\n    @supports not (overflow: clip) { html, body { overflow-x: hidden; } }\r\n    body {\r\n      font-family: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;\r\n      -webkit-tap-highlight-color: transparent;\r\n      background: #0c0c0f;\r\n    }\r\n\r\n    :root {\r\n      --ink: #0c0c0f; --ink2: #121217;\r\n      --red: #ff2e2e; --red-d: #b61e1e;\r\n      --maxw: 1200px;\r\n    }\r\n\r\n    \/* \u2500\u2500 Hero \u2500\u2500 *\/\r\n    #wlf-hero.wlf {\r\n      position: relative;\r\n      display: grid;\r\n      place-items: center;\r\n      min-height: 90vh;\r\n      background:\r\n        radial-gradient(1200px 650px at 65% 35%, rgba(255,46,46,0.06), transparent 70%),\r\n        radial-gradient(900px 600px at 30% 70%, rgba(255,255,255,0.04), transparent 70%),\r\n        linear-gradient(180deg, var(--ink) 0%, var(--ink2) 100%);\r\n      color: #fff;\r\n      width: 100%;\r\n      contain: layout paint;\r\n      overflow: hidden;\r\n      padding:\r\n        clamp(7rem, 12vh, 10rem)\r\n        calc(clamp(1rem, 3vw, 2rem) + env(safe-area-inset-left, 0px))\r\n        clamp(1rem, 3vw, 2rem)\r\n        calc(clamp(1rem, 3vw, 2rem) + env(safe-area-inset-right, 0px));\r\n    }\r\n    .wlf * { max-width: 100%; }\r\n\r\n    \/* \u2500\u2500 Part\u00edculas \u2500\u2500 *\/\r\n    .wlf__particles {\r\n      position: absolute; inset: 0; width: 100%; height: 100%;\r\n      pointer-events: none; z-index: 0; opacity: 0.2;\r\n      will-change: transform;\r\n    }\r\n    @media (prefers-reduced-motion: reduce) { .wlf__particles { display: none; } }\r\n\r\n    \/* \u2500\u2500 Grid interno \u2500\u2500 *\/\r\n    .wlf__inner {\r\n      position: relative; z-index: 1;\r\n      width: 100%; max-width: var(--maxw); margin-inline: auto;\r\n      display: grid; gap: clamp(2rem, 4vw, 3.5rem);\r\n      grid-template-columns: 1fr; align-items: center;\r\n    }\r\n    @media (min-width: 900px) {\r\n      .wlf__inner { grid-template-columns: 1fr 1fr; gap: clamp(3rem, 5vw, 4rem); }\r\n    }\r\n\r\n    \/* \u2500\u2500 Ordem mobile\/desktop \u2500\u2500 *\/\r\n    .wlf__figure { order: 2; }   \/* mobile: aparece depois do copy *\/\r\n    .wlf__copy   { order: 1; }   \/* mobile: aparece primeiro       *\/\r\n    @media (min-width: 900px) {\r\n      .wlf__figure { order: 0; } \/* desktop: volta ao fluxo normal *\/\r\n      .wlf__copy   { order: 0; }\r\n    }\r\n\r\n    \/* \u2500\u2500 Figura \/ imagem da capa \u2500\u2500 *\/\r\n    .wlf__figure {\r\n      position: relative; aspect-ratio: 4\/5;\r\n      margin: 0 auto; max-width: 600px; width: 100%;\r\n      border-radius: 20px; overflow: hidden;\r\n      box-shadow: 0 40px 120px rgba(0,0,0,0.55);\r\n      will-change: transform;\r\n    }\r\n    @media (min-width: 900px) { .wlf__figure { max-width: 700px; margin: 0; } }\r\n\r\n    .wlf__figure img {\r\n      width: 100%; height: 100%;\r\n      object-fit: cover; object-position: center 50%;\r\n      display: block;\r\n      animation: wlfKen 28s ease-in-out infinite alternate;\r\n      will-change: transform;\r\n    }\r\n    @keyframes wlfKen { to { transform: scale(1.20); } }\r\n\r\n    \/* \u2500\u2500 Copy \u2500\u2500 *\/\r\n    .wlf__copy {\r\n      display: flex; flex-direction: column; align-items: center;\r\n      gap: clamp(1.2rem, 2.5vw, 1.8rem); max-width: 600px; margin: 0 auto;\r\n    }\r\n    @media (min-width: 900px) { .wlf__copy { align-items: flex-start; margin: 0; } }\r\n\r\n    .wlf__header-group { text-align: center; width: 100%; }\r\n    @media (min-width: 900px) { .wlf__header-group { text-align: left; } }\r\n\r\n    .wlf__title {\r\n      margin: 0 0 0.8rem;\r\n      font-family: ui-serif, Georgia, serif; font-weight: 700;\r\n      font-size: clamp(2.4rem, 7vw, 3.8rem);\r\n      line-height: 1.15; \/* valor relativo, nunca px fixo *\/\r\n      letter-spacing: 0.02em;\r\n      text-shadow: 0 0 18px rgba(255,46,46,0.22), 0 3px 6px rgba(0,0,0,0.4);\r\n    }\r\n    .wlf__subtitle {\r\n      margin: 0; color: #e6e6e6;\r\n      font-size: clamp(1.05rem, 2.5vw, 1.2rem);\r\n      font-weight: 400; opacity: 0.92; letter-spacing: 0.01em;\r\n    }\r\n\r\n    \/* \u2500\u2500 CTAs \u2500\u2500 *\/\r\n    .wlf__ctas {\r\n      display: flex; gap: clamp(0.8rem, 2vw, 1rem);\r\n      flex-wrap: wrap; justify-content: center; width: 100%;\r\n    }\r\n    @media (min-width: 900px) { .wlf__ctas { justify-content: flex-start; } }\r\n\r\n    .wlf__btn {\r\n      text-decoration: none; border-radius: 999px;\r\n      font-weight: 800; font-size: clamp(0.85rem, 2vw, 0.95rem);\r\n      letter-spacing: 0.08em; text-transform: uppercase;\r\n      padding: clamp(0.95rem, 2.2vw, 1.1rem) clamp(1.4rem, 3.2vw, 1.8rem);\r\n      transition: transform 0.2s ease, box-shadow 0.2s ease;\r\n      display: inline-block; text-align: center;\r\n      color: #fff;\r\n      background: radial-gradient(120% 120% at 50% 0%, var(--red) 0%, var(--red-d) 70%);\r\n      box-shadow: 0 16px 36px rgba(255,46,46,0.30), inset 0 0 18px rgba(255,255,255,0.12);\r\n      border: 1px solid rgba(255,46,46,0.35);\r\n      \/* foco vis\u00edvel *\/\r\n      outline-offset: 3px;\r\n    }\r\n    .wlf__btn:hover { transform: translateY(-2px) scale(1.02); box-shadow: 0 20px 42px rgba(255,46,46,0.35), inset 0 0 18px rgba(255,255,255,0.15); }\r\n    .wlf__btn:focus-visible { outline: 2px solid #fff; }\r\n\r\n    \/* \u2500\u2500 Dial \u2500\u2500 *\/\r\n    .wlf__dial {\r\n      width: 100%; max-width: 540px;\r\n      display: flex; flex-direction: column; gap: clamp(1rem, 2vw, 1.3rem);\r\n    }\r\n    .dial-container {\r\n      position: relative; width: 100%; height: 80px;\r\n      display: flex; align-items: center;\r\n      perspective: 700px; overflow: visible;\r\n    }\r\n    .track {\r\n      position: absolute; width: 100%; height: 12px; border-radius: 999px;\r\n      background: linear-gradient(90deg, rgba(255,255,255,0.14), rgba(255,255,255,0.08));\r\n      border: 1px solid rgba(255,255,255,0.18);\r\n      box-shadow: inset 0 0 12px rgba(255,46,46,0.18);\r\n    }\r\n    .coin {\r\n      position: absolute; width: 64px; height: 64px; border-radius: 50%;\r\n      cursor: grab;\r\n      border: 2px solid rgba(255,255,255,0.35);\r\n      background:\r\n        radial-gradient(circle at 30% 30%, rgba(255,255,255,0.2), transparent),\r\n        linear-gradient(135deg, #3a3a3f, #2a2a2f);\r\n      box-shadow:\r\n        0 0 12px rgba(255,46,46,0.35),\r\n        0 8px 24px rgba(0,0,0,0.5),\r\n        inset 0 2px 8px rgba(255,255,255,0.15),\r\n        inset 0 -2px 8px rgba(0,0,0,0.3);\r\n      display: flex; align-items: center; justify-content: center;\r\n      top: 50%; left: 0;\r\n      transform:\r\n        translateY(-50%)\r\n        translateX(var(--dx, 0px))\r\n        rotate(var(--tilt, 0deg))\r\n        rotateZ(var(--spinZ, 0deg))\r\n        rotateY(var(--spinY, 0deg));\r\n      transform-style: preserve-3d;\r\n      touch-action: none; will-change: transform;\r\n      transition: box-shadow 0.2s;\r\n      z-index: 10;\r\n      \/* foco vis\u00edvel *\/\r\n      outline-offset: 4px;\r\n    }\r\n    .coin:focus-visible { outline: 2px solid #fff; }\r\n    .coin:active { cursor: grabbing; }\r\n    .coin-img {\r\n      display: block; width: 100%; height: 100%;\r\n      object-fit: contain; backface-visibility: hidden; pointer-events: none;\r\n    }\r\n\r\n    .hint {\r\n      margin: 0; opacity: 0.7; font-size: clamp(0.88rem, 2vw, 0.95rem);\r\n      text-align: center; font-weight: 500; letter-spacing: 0.01em;\r\n    }\r\n    @media (min-width: 900px) { .hint { text-align: left; } }\r\n\r\n    .quote {\r\n      margin: 0; text-align: center;\r\n      font-family: ui-serif, Georgia, serif;\r\n      font-size: clamp(1.05rem, 2.3vw, 1.15rem); font-weight: 600;\r\n      color: #ffd2d2; opacity: 0.95; min-height: 1.4em;\r\n      transition: opacity 0.25s ease, transform 0.25s ease;\r\n      font-style: italic; letter-spacing: 0.01em;\r\n    }\r\n    @media (min-width: 900px) { .quote { text-align: left; } }\r\n\r\n    \/* \u2500\u2500 Reduced motion \u2500\u2500 *\/\r\n    @media (prefers-reduced-motion: reduce) {\r\n      .wlf__figure img { animation: none !important; }\r\n      .coin { transition: none !important; animation: none !important; }\r\n      * { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; }\r\n    }\r\n\r\n    \/* \u2500\u2500 Pulso sutil da moeda \u2500\u2500 *\/\r\n    .coin { animation: coinGlow 3s infinite alternate ease-in-out; }\r\n    @keyframes coinGlow {\r\n      0%   { box-shadow: 0 0 12px rgba(255,46,46,0.35), 0 8px 24px rgba(0,0,0,0.5),  inset 0 2px 8px rgba(255,255,255,0.15); }\r\n      100% { box-shadow: 0 0 20px rgba(255,46,46,0.60), 0 12px 32px rgba(0,0,0,0.6), inset 0 2px 12px rgba(255,255,255,0.25); }\r\n    }\r\n  <\/style>\r\n<\/head>\r\n<body>\r\n  <main>\r\n    <section id=\"wlf-hero\" class=\"wlf\" aria-label=\"We'll Last Forever \u2013 lan\u00e7amento\">\r\n      <canvas class=\"wlf__particles\" aria-hidden=\"true\"><\/canvas>\r\n      <div class=\"wlf__inner\">\r\n\r\n        <!-- Capa do lan\u00e7amento -->\r\n        <figure class=\"wlf__figure\">\r\n          <!--\r\n            srcset: oferece vers\u00f5es menores para dispositivos menores.\r\n            Como s\u00f3 temos uma URL real, listamos a mesma; substitua pelos\r\n            crops gerados pelo WordPress (ex: -600x750.webp, -900x1125.webp).\r\n            sizes: no desktop ocupa ~50 vw; no mobile, ~100 vw.\r\n          -->\r\n          <img data-recalc-dims=\"1\" fetchpriority=\"high\"\r\n            src=\"https:\/\/i0.wp.com\/guilhermegodoy.com\/wp-content\/uploads\/2025\/10\/wwWell-Last-Forever-final-scaled.webp?resize=800%2C1000&#038;strip=all&#038;quality=85&#038;ssl=1\"\r\n            srcset=\"\r\n              https:\/\/guilhermegodoy.com\/wp-content\/uploads\/2025\/10\/wwWell-Last-Forever-final-scaled.webp 1200w\r\n            \"\r\n            sizes=\"(min-width: 900px) 50vw, 100vw\"\r\n            alt=\"Capa de We'll Last Forever, lan\u00e7amento de Guilherme Godoy \u2014 figura sombria segurando uma moeda dourada em fundo escuro\"\r\n            width=\"800\" height=\"1000\"\r\n            decoding=\"async\" loading=\"eager\">\r\n          <figcaption class=\"sr-only\">Capa do lan\u00e7amento \"We'll Last Forever\" de Guilherme Godoy<\/figcaption>\r\n        <\/figure>\r\n\r\n        <!-- Copy principal -->\r\n        <div class=\"wlf__copy\">\r\n          <div class=\"wlf__header-group\">\r\n            <h1 class=\"wlf__title\" style=\"line-height:1;\">We'll Last Forever<\/h1>\r\n            <p class=\"wlf__subtitle\">Se todas as moedas podem comprar o tempo, algumas te aprisionar\u00e3o pela eternidade.<\/p>\r\n          <\/div>\r\n\r\n          <!-- Dial interativo -->\r\n          <div class=\"wlf__dial\">\r\n            <div class=\"dial-container\">\r\n              <div class=\"track\"><\/div>\r\n              <!-- aria-hidden no elemento visual; o conte\u00fado acess\u00edvel est\u00e1 no live region abaixo -->\r\n              <div class=\"coin\" id=\"coin\"\r\n                   role=\"slider\"\r\n                   aria-label=\"Slider de frases\"\r\n                   aria-valuemin=\"0\" aria-valuemax=\"10\" aria-valuenow=\"5\"\r\n                   aria-describedby=\"quote\"\r\n                   tabindex=\"0\">\r\n                <img data-recalc-dims=\"1\"\r\n                  src=\"https:\/\/i0.wp.com\/guilhermegodoy.com\/wp-content\/uploads\/2025\/10\/Well-Last-Forever-moeda-do-infinito-1.webp?resize=64%2C64&#038;strip=all&#038;quality=85&#038;ssl=1\"\r\n                  alt=\"\"\r\n                  class=\"coin-img\"\r\n                  width=\"64\" height=\"64\"\r\n                  loading=\"eager\" decoding=\"async\">\r\n              <\/div>\r\n            <\/div>\r\n            <p class=\"hint\" id=\"coin-hint\">Arraste a moeda \u2013 o eterno tem algo a dizer.<\/p>\r\n            <!-- aria-live para anunciar mudan\u00e7as de frase a leitores de tela -->\r\n            <p class=\"quote\" id=\"quote\" aria-live=\"polite\" aria-atomic=\"true\">Voc\u00ea tem sede de qu\u00ea?<\/p>\r\n          <\/div>\r\n\r\n          <!-- CTA -->\r\n          <div class=\"wlf__ctas\">\r\n            <a class=\"wlf__btn\" href=\"https:\/\/linktr.ee\/guilhermemgodoy#518392328\" target=\"_blank\" rel=\"noopener noreferrer\" aria-label=\"Ouvir We&#039;ll Last Forever agora no seu servi\u00e7o de streaming (abre em nova aba)\">\r\n              OUVIR AGORA\r\n            <\/a>\r\n          <\/div>\r\n        <\/div><!-- \/.wlf__copy -->\r\n\r\n      <\/div>\r\n    <\/section>\r\n  <\/main>\r\n\r\n  <!-- \u2500\u2500 Classe utilit\u00e1ria para texto vis\u00edvel apenas para screen readers \u2500\u2500 -->\r\n  <style>\r\n    .sr-only {\r\n      position: absolute; width: 1px; height: 1px;\r\n      padding: 0; margin: -1px; overflow: hidden;\r\n      clip: rect(0,0,0,0); white-space: nowrap; border: 0;\r\n    }\r\n  <\/style>\r\n\r\n  <script>\r\n    (function() {\r\n      \/\/ ===== PART\u00cdCULAS =====\r\n      if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) {\r\n        const cvs = document.querySelector('.wlf__particles');\r\n        if (cvs) {\r\n          const ctx = cvs.getContext('2d');\r\n          let W, H, particles = [];\r\n\r\n          function resizeCanvas() {\r\n            W = cvs.clientWidth; H = cvs.clientHeight;\r\n            cvs.width = W; cvs.height = H;\r\n            initParticles();\r\n          }\r\n          function initParticles() {\r\n            particles = Array.from({ length: 18 }, () => ({\r\n              x: Math.random() * W, y: Math.random() * H,\r\n              r: Math.random() * 1.6 + 0.4,\r\n              vx: (Math.random() - 0.5) * 0.2,\r\n              vy: (Math.random() - 0.5) * 0.2,\r\n              a: Math.random() * 0.4 + 0.2\r\n            }));\r\n          }\r\n          function drawParticles() {\r\n            ctx.clearRect(0, 0, W, H);\r\n            for (const p of particles) {\r\n              p.x += p.vx; p.y += p.vy;\r\n              if (p.x < -10) p.x = W + 10; if (p.x > W + 10) p.x = -10;\r\n              if (p.y < -10) p.y = H + 10; if (p.y > H + 10) p.y = -10;\r\n              ctx.beginPath();\r\n              ctx.arc(p.x, p.y, p.r, 0, Math.PI * 2);\r\n              ctx.fillStyle = `rgba(255,46,46,${p.a})`;\r\n              ctx.fill();\r\n            }\r\n            requestAnimationFrame(drawParticles);\r\n          }\r\n          let resizeTimer;\r\n          window.addEventListener('resize', () => {\r\n            clearTimeout(resizeTimer);\r\n            resizeTimer = setTimeout(resizeCanvas, 100);\r\n          }, { passive: true });\r\n          resizeCanvas(); drawParticles();\r\n        }\r\n      }\r\n\r\n      \/\/ ===== DIAL =====\r\n      const coin = document.getElementById('coin');\r\n      if (!coin) return;\r\n\r\n      const container = coin.parentElement;\r\n      const quoteEl   = document.getElementById('quote');\r\n\r\n      const bands = [\r\n        { t: 0.05, q: 'Nada \u00e9 de gra\u00e7a.',              v: 0  },\r\n        { t: 0.15, q: 'Tempo n\u00e3o negocia perd\u00e3o.',      v: 1  },\r\n        { t: 0.25, q: 'Cada segundo \u00e9 uma decis\u00e3o.',    v: 2  },\r\n        { t: 0.35, q: 'Ambi\u00e7\u00e3o devora os fracos.',      v: 3  },\r\n        { t: 0.45, q: 'Gan\u00e2ncia \u00e9 fome eterna.',        v: 4  },\r\n        { t: 0.55, q: 'Toda conquista tem um pre\u00e7o.',   v: 5  },\r\n        { t: 0.65, q: 'O trono exige sacrif\u00edcios.',     v: 6  },\r\n        { t: 0.75, q: 'Poder \u00e9 v\u00edcio sem cura.',        v: 7  },\r\n        { t: 0.85, q: 'Uma coroa pesa em muitas almas.',v: 8  },\r\n        { t: 0.95, q: 'Dom\u00ednio tem pre\u00e7o de sangue.',   v: 9  },\r\n        { t: 1.01, q: 'Poder cobra juros altos.',       v: 10 }\r\n      ];\r\n\r\n      let isDragging = false;\r\n      let coinSize   = 64;\r\n      let spinY      = 0;\r\n      let lastBand   = -1;\r\n      let currentPercent = 0.5;\r\n\r\n      function setQuote(bandIndex) {\r\n        if (bandIndex === lastBand) return;\r\n        lastBand = bandIndex;\r\n        const newQuote = bands[Math.max(0, bandIndex)].q;\r\n        if (quoteEl.textContent === newQuote) return;\r\n        quoteEl.style.opacity   = '0';\r\n        quoteEl.style.transform = 'translateY(-6px)';\r\n        setTimeout(() => {\r\n          quoteEl.textContent     = newQuote;\r\n          quoteEl.style.opacity   = '1';\r\n          quoteEl.style.transform = 'translateY(0)';\r\n        }, 120);\r\n        coin.setAttribute('aria-valuenow', bands[Math.max(0, bandIndex)].v);\r\n      }\r\n\r\n      function updatePosition(clientX) {\r\n        const rect  = container.getBoundingClientRect();\r\n        const maxDx = Math.max(1, rect.width - coinSize);\r\n        let dx      = clientX - rect.left - coinSize \/ 2;\r\n        dx          = Math.max(0, Math.min(dx, maxDx));\r\n        currentPercent = dx \/ maxDx;\r\n\r\n        coin.style.setProperty('--dx',   dx + 'px');\r\n        coin.style.setProperty('--tilt', ((currentPercent - 0.5) * 20) + 'deg');\r\n\r\n        const bandIndex = bands.findIndex(b => currentPercent < b.t);\r\n        setQuote(bandIndex);\r\n      }\r\n\r\n      function spinCoin() {\r\n        spinY += 360;\r\n        coin.style.setProperty('--spinY', spinY + 'deg');\r\n        coin.style.transition = 'transform 600ms cubic-bezier(0.2, 0.8, 0.2, 1)';\r\n        setTimeout(() => { coin.style.transition = 'none'; }, 620);\r\n      }\r\n\r\n      function centerCoin() {\r\n        recalcCoinSize();\r\n        const rect  = container.getBoundingClientRect();\r\n        const maxDx = Math.max(1, rect.width - coinSize);\r\n        coin.style.setProperty('--dx',   (maxDx \/ 2) + 'px');\r\n        coin.style.setProperty('--tilt', '0deg');\r\n        coin.setAttribute('aria-valuenow', '5');\r\n        lastBand = -1;\r\n        currentPercent = 0.5;\r\n      }\r\n\r\n      function recalcCoinSize() { coinSize = coin.offsetWidth || 64; }\r\n\r\n      \/\/ \u2500\u2500 Intera\u00e7\u00e3o por teclado (requisito ARIA slider) \u2500\u2500\r\n      coin.addEventListener('keydown', (e) => {\r\n        const step = 1 \/ bands.length;\r\n        let changed = false;\r\n        if (e.key === 'ArrowRight' || e.key === 'ArrowUp') {\r\n          currentPercent = Math.min(1, currentPercent + step);\r\n          changed = true;\r\n        } else if (e.key === 'ArrowLeft' || e.key === 'ArrowDown') {\r\n          currentPercent = Math.max(0, currentPercent - step);\r\n          changed = true;\r\n        } else if (e.key === 'Home') {\r\n          currentPercent = 0; changed = true;\r\n        } else if (e.key === 'End') {\r\n          currentPercent = 1; changed = true;\r\n        }\r\n        if (!changed) return;\r\n        e.preventDefault();\r\n        recalcCoinSize();\r\n        const rect  = container.getBoundingClientRect();\r\n        const maxDx = Math.max(1, rect.width - coinSize);\r\n        const dx    = currentPercent * maxDx;\r\n        coin.style.setProperty('--dx',   dx + 'px');\r\n        coin.style.setProperty('--tilt', ((currentPercent - 0.5) * 20) + 'deg');\r\n        const bandIndex = bands.findIndex(b => currentPercent < b.t);\r\n        setQuote(bandIndex);\r\n      });\r\n\r\n      \/\/ \u2500\u2500 Ponteiros \/ toque \u2500\u2500\r\n      function onPointerDown(e) {\r\n        isDragging = true;\r\n        recalcCoinSize();\r\n        spinCoin();\r\n        const x = e.clientX ?? e.touches?.[0]?.clientX;\r\n        if (typeof x === 'number') updatePosition(x);\r\n        e.preventDefault();\r\n      }\r\n      function onPointerMove(e) {\r\n        if (!isDragging) return;\r\n        const x = e.clientX ?? e.touches?.[0]?.clientX;\r\n        if (typeof x === 'number') requestAnimationFrame(() => updatePosition(x));\r\n        e.preventDefault();\r\n      }\r\n      function onPointerUp() { isDragging = false; }\r\n\r\n      if (window.PointerEvent) {\r\n        coin.addEventListener('pointerdown',   onPointerDown, { passive: false });\r\n        window.addEventListener('pointermove', onPointerMove, { passive: false });\r\n        window.addEventListener('pointerup',   onPointerUp,   { passive: true  });\r\n        window.addEventListener('pointercancel', onPointerUp, { passive: true  });\r\n      } else {\r\n        coin.addEventListener('mousedown',       onPointerDown);\r\n        window.addEventListener('mousemove',     onPointerMove);\r\n        window.addEventListener('mouseup',       onPointerUp);\r\n        coin.addEventListener('touchstart',      onPointerDown, { passive: false });\r\n        window.addEventListener('touchmove',     onPointerMove, { passive: false });\r\n        window.addEventListener('touchend',      onPointerUp,   { passive: true });\r\n      }\r\n\r\n      let resizeTimeout;\r\n      window.addEventListener('resize', () => {\r\n        clearTimeout(resizeTimeout);\r\n        resizeTimeout = setTimeout(centerCoin, 100);\r\n      }, { passive: true });\r\n\r\n      setTimeout(centerCoin, 50);\r\n    })();\r\n  <\/script>\r\n<\/body>\r\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-6166405 e-con-full e-flex e-con e-parent\" data-id=\"6166405\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ea81919 elementor-widget elementor-widget-html\" data-id=\"ea81919\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!DOCTYPE html>\r\n<html lang=\"pt-BR\">\r\n<head>\r\n  <meta charset=\"UTF-8\" \/>\r\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, viewport-fit=cover\" \/>\r\n  <title>We'll Last Forever \u2013 Duas faces da mesma chama | Guilherme Godoy<\/title>\r\n  \r\n  <!-- SEO Meta Tags -->\r\n  <meta name=\"description\" content=\"O grito e o eco. Um estudo sobre o paradoxo do para sempre e as duas faces da mesma chama. Ou\u00e7a as duas vers\u00f5es de We'll Last Forever.\">\r\n  <meta name=\"keywords\" content=\"We'll Last Forever, Guilherme Godoy, m\u00fasica eletr\u00f4nica, dark pop, duas vers\u00f5es\">\r\n  <meta name=\"author\" content=\"Guilherme Godoy\">\r\n  <meta name=\"robots\" content=\"index, follow, max-image-preview:large\">\r\n  <link rel=\"canonical\" href=\"https:\/\/guilhermegodoy.com\/well-last-forever\">\r\n  \r\n  <!-- Open Graph \/ Facebook -->\r\n  <meta property=\"og:type\" content=\"music.song\">\r\n  <meta property=\"og:url\" content=\"https:\/\/guilhermegodoy.com\/well-last-forever\">\r\n  <meta property=\"og:title\" content=\"We'll Last Forever \u2013 Duas faces da mesma chama\">\r\n  <meta property=\"og:description\" content=\"O grito e o eco. O que acontece quando a gente se perde de si mesmo tentando alcan\u00e7ar o topo.\">\r\n  <meta property=\"og:image\" content=\"https:\/\/guilhermegodoy.com\/wp-content\/uploads\/2025\/10\/wwWell-Last-Forever-final-scaled.webp\">\r\n  <meta property=\"og:image:width\" content=\"1200\">\r\n  <meta property=\"og:image:height\" content=\"630\">\r\n  <meta property=\"og:site_name\" content=\"Guilherme Godoy\">\r\n  <meta property=\"og:locale\" content=\"pt_BR\">\r\n  \r\n  <!-- Twitter Card -->\r\n  <meta name=\"twitter:card\" content=\"summary_large_image\">\r\n  <meta name=\"twitter:title\" content=\"We'll Last Forever \u2013 Duas faces da mesma chama\">\r\n  <meta name=\"twitter:description\" content=\"O grito e o eco. Duas vers\u00f5es da mesma dor.\">\r\n  <meta name=\"twitter:image\" content=\"https:\/\/guilhermegodoy.com\/wp-content\/uploads\/2025\/10\/wwWell-Last-Forever-final-scaled.webp\">\r\n  \r\n  <!-- Music Meta Tags -->\r\n  <meta property=\"music:musician\" content=\"https:\/\/open.spotify.com\/artist\/6BVO1rZmwdcigBJk7uPU94\">\r\n  <meta property=\"music:release_date\" content=\"2025-10-29\">\r\n  \r\n  <meta name=\"theme-color\" content=\"#0b0b0e\">\r\n  \r\n  <!-- Preconnect to external domains for faster loading -->\r\n  <link rel=\"preconnect\" href=\"https:\/\/open.spotify.com\" crossorigin>\r\n  <link rel=\"preconnect\" href=\"https:\/\/www.youtube.com\" crossorigin>\r\n  <link rel=\"preconnect\" href=\"https:\/\/www.tiktok.com\" crossorigin>\r\n  <link rel=\"preconnect\" href=\"https:\/\/cdnjs.cloudflare.com\" crossorigin>\r\n  \r\n  <!-- Preload critical resources -->\r\n  <link rel=\"preload\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.0.0-beta3\/css\/all.min.css\" as=\"style\">\r\n  \r\n  <!-- DNS Prefetch for better performance -->\r\n  <link rel=\"dns-prefetch\" href=\"https:\/\/i0.wp.com\">\r\n  <link rel=\"dns-prefetch\" href=\"https:\/\/www.youtube-nocookie.com\">\r\n  \r\n  <!-- Font Awesome - async load -->\r\n  <link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.0.0-beta3\/css\/all.min.css\" media=\"print\" onload=\"this.media='all'; this.onload=null;\">\r\n  <noscript><link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.0.0-beta3\/css\/all.min.css\"><\/noscript>\r\n\r\n  <!-- Structured Data (Schema.org) -->\r\n  <script type=\"application\/ld+json\">\r\n  {\r\n    \"@context\": \"https:\/\/schema.org\",\r\n    \"@type\": \"MusicRecording\",\r\n    \"name\": \"We'll Last Forever\",\r\n    \"description\": \"Duas faces da mesma chama. O grito e o eco.\",\r\n    \"datePublished\": \"2025-10-29\",\r\n    \"byArtist\": {\r\n      \"@type\": \"MusicGroup\",\r\n      \"name\": \"Guilherme Godoy\",\r\n      \"url\": \"https:\/\/guilhermegodoy.com\"\r\n    },\r\n    \"recordingOf\": {\r\n      \"@type\": \"MusicComposition\",\r\n      \"name\": \"We'll Last Forever\",\r\n      \"composer\": {\r\n        \"@type\": \"Person\",\r\n        \"name\": \"Guilherme Godoy\"\r\n      }\r\n    },\r\n    \"inAlbum\": {\r\n      \"@type\": \"MusicAlbum\",\r\n      \"name\": \"We'll Last Forever Singles\"\r\n    }\r\n  }\r\n  <\/script>\r\n\r\n  <style>\r\n    \/* ===== VARI\u00c1VEIS DE SISTEMA ===== *\/\r\n    :root {\r\n      --bg: #0b0b0e;\r\n      --bg-card: #131318;\r\n      --bg-quote: #1a1a20;\r\n      --text-main: #f0f0f0;\r\n      --text-muted: #b0b0b5;\r\n      --text-subtle: #666666;\r\n      --red: #ff3b3b;\r\n      --red-glow: rgba(255, 59, 59, 0.15);\r\n      --border: #222222;\r\n      --font-sans: 'Inter', system-ui, -apple-system, sans-serif;\r\n      --font-serif: 'Georgia', ui-serif, serif;\r\n      --transition: 0.3s cubic-bezier(0.25, 0.8, 0.25, 1);\r\n    }\r\n\r\n    * { \r\n      margin: 0; \r\n      padding: 0; \r\n      box-sizing: border-box; \r\n    }\r\n\r\n    html, body {\r\n      max-width: 100%;\r\n      overflow-x: hidden;\r\n    }\r\n\r\n    body {\r\n      background: var(--bg);\r\n      font-family: var(--font-sans);\r\n      color: var(--text-main);\r\n      line-height: 1.6;\r\n      -webkit-font-smoothing: antialiased;\r\n      -moz-osx-font-smoothing: grayscale;\r\n      position: relative;\r\n    }\r\n\r\n    \/* Textura de Ru\u00eddo *\/\r\n    body::after {\r\n      content: \"\";\r\n      position: fixed;\r\n      top: 0; \r\n      left: 0; \r\n      width: 100%; \r\n      height: 100%;\r\n      background-image: url('data:image\/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMDAiIGhlaWdodD0iMzAwIj48ZmlsdGVyIGlkPSJmIj48ZmVUdXJidWxlbmNlIHR5cGU9ImZyYWN0YWxOb2lzZSIgYmFzZUZyZXF1ZW5jeT0iLjc1IiBudW1PY3RhdmVzPSIzIiAvPjwvZmlsdGVyPjxyZWN0IHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbHRlcj0idXJsKCNmKSIgb3BhY2l0eT0iMC4wMjUiIC8+PC9zdmc+');\r\n      pointer-events: none;\r\n      z-index: 9999;\r\n      opacity: 0.25;\r\n      will-change: opacity;\r\n    }\r\n\r\n    .container {\r\n      max-width: 1140px; \r\n      margin: 0 auto;\r\n      padding: clamp(3rem, 8vw, 6rem) clamp(1.5rem, 5vw, 2rem);\r\n      position: relative;\r\n      z-index: 10;\r\n    }\r\n\r\n    \/* Anima\u00e7\u00e3o de Entrada *\/\r\n    .fade-in {\r\n      animation: riseUp 1s cubic-bezier(0.2, 0.8, 0.2, 1) forwards;\r\n      opacity: 0;\r\n      transform: translateY(20px);\r\n      will-change: opacity, transform;\r\n    }\r\n    .fade-in:nth-child(2) { animation-delay: 0.1s; }\r\n    .fade-in:nth-child(3) { animation-delay: 0.2s; }\r\n    .fade-in:nth-child(4) { animation-delay: 0.3s; }\r\n    .fade-in:nth-child(5) { animation-delay: 0.4s; }\r\n\r\n    .fade-in.animated {\r\n      will-change: auto;\r\n    }\r\n\r\n    @keyframes riseUp {\r\n      to { opacity: 1; transform: translateY(0); }\r\n    }\r\n\r\n    \/* T\u00edtulos *\/\r\n    h2 {\r\n      font-size: clamp(1.8rem, 8vw, 2.8rem);\r\n      font-weight: 600;\r\n      letter-spacing: -0.02em;\r\n      margin-bottom: 1.5rem;\r\n      position: relative;\r\n      display: inline-block;\r\n      font-family: var(--font-serif);\r\n    }\r\n    h2::after {\r\n      content: '';\r\n      position: absolute;\r\n      bottom: -8px;\r\n      left: 0;\r\n      width: 80px;\r\n      height: 3px;\r\n      background: var(--red);\r\n      border-radius: 4px;\r\n    }\r\n\r\n    h2.centered {\r\n      text-align: center;\r\n      display: inline-block;\r\n      position: relative;\r\n      width: 100%;\r\n    }\r\n    h2.centered::after {\r\n      left: 50% !important;\r\n      transform: translateX(-50%) !important;\r\n    }\r\n\r\n    p {\r\n      color: var(--text-muted);\r\n      font-size: 1.15rem;\r\n      margin-bottom: 1.5rem;\r\n      max-width: 800px;\r\n    }\r\n\r\n    .highlight {\r\n      color: var(--red);\r\n      font-weight: 500;\r\n    }\r\n\r\n    \/* ===== GRID DE VERS\u00d5ES ===== *\/\r\n    .versions-grid {\r\n      display: grid;\r\n      grid-template-columns: 1fr 1fr;\r\n      gap: 2.5rem;\r\n      margin: 4rem 0;\r\n    }\r\n    @media (max-width: 768px) {\r\n      .versions-grid { \r\n        grid-template-columns: 1fr; \r\n        gap: 2rem; \r\n      }\r\n    }\r\n\r\n    .version-card {\r\n      background: var(--bg-card);\r\n      border-radius: 32px;\r\n      padding: clamp(2rem, 5vw, 2.5rem) clamp(1.5rem, 5vw, 2rem);\r\n      border: 1px solid var(--border);\r\n      transition: var(--transition);\r\n      box-shadow: 0 20px 40px -10px rgba(0, 0, 0, 0.8);\r\n      display: flex;\r\n      flex-direction: column;\r\n    }\r\n    .version-card:hover {\r\n      border-color: rgba(255, 59, 59, 0.4);\r\n      box-shadow: 0 30px 60px -12px var(--red-glow);\r\n      transform: translateY(-6px);\r\n    }\r\n\r\n    .card-tag {\r\n      display: inline-flex;\r\n      background: rgba(255, 59, 59, 0.08);\r\n      color: var(--red);\r\n      padding: 0.35rem 1.2rem;\r\n      border-radius: 30px;\r\n      font-size: 0.85rem;\r\n      font-weight: 600;\r\n      letter-spacing: 0.08em;\r\n      text-transform: uppercase;\r\n      margin-bottom: 1.5rem;\r\n      border: 1px solid rgba(255, 59, 59, 0.2);\r\n      align-self: flex-start;\r\n    }\r\n\r\n    .card-title {\r\n      font-size: 2.2rem;\r\n      font-weight: 600;\r\n      margin-bottom: 0.5rem;\r\n      font-family: var(--font-serif);\r\n      line-height: 1.1;\r\n    }\r\n\r\n    .card-date {\r\n      color: var(--text-subtle);\r\n      font-size: 0.95rem;\r\n      margin-bottom: 1.5rem;\r\n      letter-spacing: 0.05em;\r\n      text-transform: uppercase;\r\n    }\r\n\r\n    .card-description {\r\n      color: var(--text-muted);\r\n      margin-bottom: 2.5rem;\r\n      font-size: 1.05rem;\r\n      flex: 1;\r\n    }\r\n\r\n    \/* === SPOTIFY EMBED - OTIMIZADO RESPONSIVO === *\/\r\n    .spotify-embed {\r\n      border-radius: 12px;\r\n      overflow: visible;\r\n      margin-top: auto;\r\n      background: #000;\r\n      border: 1px solid #2a2a2a;\r\n      width: 100%;\r\n      position: relative;\r\n      height: 154px;\r\n    }\r\n    \r\n    \/* Desktop\/Tablet: player expandido (352px) com artwork *\/\r\n    @media (min-width: 640px) {\r\n      .spotify-embed {\r\n        height: 234px;\r\n      }\r\n    }\r\n    \r\n    \/* Skeleton loader *\/\r\n    .spotify-embed::before {\r\n      content: '';\r\n      position: absolute;\r\n      inset: 0;\r\n      background: linear-gradient(\r\n        90deg,\r\n        #1a1a1a 25%,\r\n        #2a2a2a 50%,\r\n        #1a1a1a 75%\r\n      );\r\n      background-size: 200% 100%;\r\n      animation: loading 1.5s infinite;\r\n      z-index: 0;\r\n      border-radius: 12px;\r\n    }\r\n    \r\n    .spotify-embed.loaded::before {\r\n      display: none;\r\n    }\r\n    \r\n    @keyframes loading {\r\n      0% { background-position: 200% 0; }\r\n      100% { background-position: -200% 0; }\r\n    }\r\n    \r\n    .spotify-embed iframe {\r\n      display: block;\r\n      width: 100%;\r\n      height: 100%;\r\n      border: none;\r\n      border-radius: 12px;\r\n      position: relative;\r\n      z-index: 1;\r\n    }\r\n\r\n    \/* ===== REFLEX\u00c3O DA MOEDA ===== *\/\r\n    .coin-reflection {\r\n      background: linear-gradient(145deg, #0f0f14, #16161e);\r\n      border-radius: 32px;\r\n      padding: clamp(3rem, 6vw, 4rem) clamp(1.5rem, 5vw, 3rem);\r\n      margin: 5rem 0;\r\n      border: 1px solid #2a2a30;\r\n      text-align: center;\r\n      box-shadow: inset 0 0 0 1px rgba(255, 59, 59, 0.05), 0 20px 40px rgba(0,0,0,0.5);\r\n    }\r\n    \r\n    .coin-image-wrapper {\r\n      display: flex;\r\n      justify-content: center;\r\n      margin-bottom: 2.5rem;\r\n      min-height: 130px;\r\n    }\r\n    \r\n    .coin-image-wrapper img {\r\n      width: 130px;\r\n      height: 130px;\r\n      object-fit: contain;\r\n      border-radius: 50%;\r\n      box-shadow: 0 15px 30px rgba(0,0,0,0.8), 0 0 35px rgba(255,59,59,0.25);\r\n      animation: floatCoin 6s ease-in-out infinite;\r\n      will-change: transform;\r\n    }\r\n\r\n    @keyframes floatCoin {\r\n      0% { transform: translateY(0px) rotate(0deg); }\r\n      50% { transform: translateY(-12px) rotate(3deg); }\r\n      100% { transform: translateY(0px) rotate(0deg); }\r\n    }\r\n\r\n    .coin-reflection p {\r\n      font-size: clamp(1.4rem, 6vw, 1.8rem);\r\n      font-weight: 400;\r\n      font-family: var(--font-serif);\r\n      color: var(--text-main);\r\n      line-height: 1.4;\r\n      max-width: 800px;\r\n      margin: 0 auto;\r\n    }\r\n    \r\n    .coin-reflection .small {\r\n      font-size: 0.95rem;\r\n      color: var(--red);\r\n      text-transform: uppercase;\r\n      letter-spacing: 0.2em;\r\n      margin-top: 2rem;\r\n      display: block;\r\n    }\r\n\r\n    \/* ===== BLOCO DE CITA\u00c7\u00c3O ===== *\/\r\n    .quote-block {\r\n      background: var(--bg-quote);\r\n      padding: 2.5rem;\r\n      border-radius: 24px;\r\n      margin: 4rem 0;\r\n      border-left: 4px solid var(--red);\r\n      box-shadow: 0 10px 30px rgba(0,0,0,0.3);\r\n    }\r\n    \r\n    .quote-block p {\r\n      font-size: clamp(1.2rem, 5vw, 1.4rem);\r\n      font-style: italic;\r\n      font-family: var(--font-serif);\r\n      color: var(--text-main);\r\n      margin-bottom: 1rem;\r\n    }\r\n    \r\n    .quote-author {\r\n      color: var(--red);\r\n      font-weight: 500;\r\n      font-size: 0.95rem;\r\n      letter-spacing: 0.05em;\r\n    }\r\n\r\n    \/* ===== SE\u00c7\u00c3O COM V\u00cdDEO YOUTUBE ===== *\/\r\n    .dual-layout {\r\n      display: grid;\r\n      grid-template-columns: 1fr;\r\n      gap: 2rem;\r\n      margin: 5rem 0;\r\n      align-items: center;\r\n    }\r\n    @media (min-width: 850px) {\r\n      .dual-layout { \r\n        grid-template-columns: 1fr 340px; \r\n        gap: 3rem;\r\n      }\r\n    }\r\n    \r\n    \/* === YOUTUBE EMBED - OTIMIZADO === *\/\r\n    .video-wrapper {\r\n      width: 100%;\r\n      max-width: 340px;\r\n      margin: 0 auto;\r\n      border-radius: 24px;\r\n      overflow: hidden;\r\n      box-shadow: 0 20px 50px rgba(0,0,0,0.6);\r\n      border: 1px solid var(--border);\r\n      background: #000;\r\n      transition: var(--transition);\r\n      position: relative;\r\n      aspect-ratio: 9 \/ 16;\r\n    }\r\n    \r\n    .video-wrapper::before {\r\n      content: '';\r\n      position: absolute;\r\n      inset: 0;\r\n      background: linear-gradient(\r\n        135deg,\r\n        #1a1a1a 0%,\r\n        #0a0a0a 100%\r\n      );\r\n      z-index: 0;\r\n    }\r\n    \r\n    .video-wrapper iframe {\r\n      width: 100%;\r\n      height: 100%;\r\n      display: block;\r\n      border: none;\r\n      position: relative;\r\n      z-index: 1;\r\n    }\r\n\r\n    .video-wrapper:hover {\r\n      border-color: rgba(255, 59, 59, 0.4);\r\n      box-shadow: 0 25px 60px -10px var(--red-glow);\r\n    }\r\n\r\n    \/* ===== LETRA ===== *\/\r\n    .lyrics-section {\r\n      background: #0e0e12;\r\n      border-radius: 40px;\r\n      padding: clamp(3rem, 6vw, 5rem) clamp(1.5rem, 4vw, 3rem);\r\n      margin: 5rem 0 3rem;\r\n      border: 1px solid var(--border);\r\n      box-shadow: 0 20px 50px rgba(0,0,0,0.6);\r\n    }\r\n    \r\n    .lyrics {\r\n      font-family: var(--font-serif);\r\n      font-size: clamp(1.1rem, 4vw, 1.25rem);\r\n      line-height: 1.6; \r\n      color: #999999;\r\n      text-align: center;\r\n      max-width: 650px;\r\n      margin: 0 auto;\r\n    }\r\n    \r\n    .lyrics p {\r\n      margin-bottom: 1.5rem; \r\n    }\r\n    \r\n    .lyrics p:last-child {\r\n      margin-bottom: 0;\r\n    }\r\n    \r\n    \/* === SISTEMA DE PALAVRAS PULSANTES === *\/\r\n    .pulse-keyword {\r\n      color: inherit;\r\n      transition: color 0.5s ease;\r\n      animation: emberPulse 6s infinite alternate ease-in-out;\r\n      will-change: color, text-shadow;\r\n    }\r\n\r\n    .pulse-keyword.d1 { animation-delay: 0s; }\r\n    .pulse-keyword.d2 { animation-delay: -2s; }\r\n    .pulse-keyword.d3 { animation-delay: -4s; }\r\n    .pulse-keyword.d4 { animation-delay: -5.5s; }\r\n\r\n    @keyframes emberPulse {\r\n      0%, 50% { \r\n        color: inherit; \r\n        text-shadow: none; \r\n      }\r\n      85%, 100% { \r\n        color: var(--red); \r\n        text-shadow: 0 0 12px rgba(255, 59, 59, 0.6); \r\n      }\r\n    }\r\n\r\n\r\n    \/* ===== TIKTOK SECTION ===== *\/\r\n    .tiktok-title {\r\n      text-align: center;\r\n      display: inline-block;\r\n      position: relative;\r\n      width: 100%;\r\n    }\r\n    \r\n    .tiktok-title::after {\r\n      left: 50% !important;\r\n      transform: translateX(-50%) !important;\r\n    }\r\n    \r\n    @media (min-width: 850px) {\r\n      .tiktok-title { text-align: left; }\r\n      .tiktok-title::after { left: 0 !important; transform: none !important; }\r\n    }\r\n\r\n    .lazy-section {\r\n      opacity: 0;\r\n      transform: translateY(50px);\r\n      transition: opacity 1s cubic-bezier(0.2, 0.8, 0.2, 1), \r\n                  transform 1s cubic-bezier(0.2, 0.8, 0.2, 1);\r\n      will-change: opacity, transform;\r\n    }\r\n    \r\n    .lazy-section.is-visible {\r\n      opacity: 1;\r\n      transform: translateY(0);\r\n      will-change: auto;\r\n    }\r\n\r\n    .tiktok-section {\r\n      margin: 5rem 0;\r\n      display: flex;\r\n      justify-content: center;\r\n    }\r\n    \r\n    .tiktok-card {\r\n      background: linear-gradient(145deg, #131318, #0a0a0c);\r\n      border: 1px solid #222222;\r\n      border-radius: 32px;\r\n      \/* Mobile: sem padding lateral \u2014 o embed ocupa toda a largura dispon\u00edvel *\/\r\n      padding: 2rem 0 0;\r\n      max-width: 950px;\r\n      width: 100%;\r\n      display: flex;\r\n      flex-direction: column;\r\n      align-items: center;\r\n      text-align: center;\r\n      gap: 0;\r\n      position: relative;\r\n      overflow: hidden;\r\n      box-shadow: 0 20px 50px rgba(0,0,0,0.5);\r\n      transition: 0.3s cubic-bezier(0.25, 0.8, 0.25, 1);\r\n    }\r\n\r\n    \/* Desktop: padding normal + layout horizontal *\/\r\n    @media (min-width: 850px) {\r\n      .tiktok-card {\r\n        padding: clamp(2rem, 5vw, 4rem) clamp(1.5rem, 5vw, 3rem);\r\n        flex-direction: row;\r\n        text-align: left;\r\n        align-items: center;\r\n        justify-content: space-between;\r\n        gap: 3rem;\r\n      }\r\n    }\r\n    \r\n    .tiktok-card:hover {\r\n      border-color: rgba(255, 59, 59, 0.3);\r\n      box-shadow: 0 30px 60px -10px rgba(255, 59, 59, 0.15);\r\n    }\r\n    \r\n    .tiktok-card::before {\r\n      content: '';\r\n      position: absolute;\r\n      top: -50px; \r\n      left: 50%;\r\n      transform: translateX(-50%);\r\n      width: 200px; \r\n      height: 200px;\r\n      background: rgba(255, 59, 59, 0.12);\r\n      filter: blur(80px);\r\n      border-radius: 50%;\r\n      pointer-events: none;\r\n    }\r\n    \r\n    .tiktok-content {\r\n      flex: 1;\r\n      display: flex;\r\n      flex-direction: column;\r\n      align-items: center;\r\n      \/* Mobile: padding lateral interno para o texto *\/\r\n      padding: 0 1.5rem 2rem;\r\n      width: 100%;\r\n    }\r\n    \r\n    @media (min-width: 850px) {\r\n      .tiktok-content {\r\n        align-items: flex-start;\r\n        padding: 0;\r\n        width: auto;\r\n      }\r\n    }\r\n\r\n    \/* BOT\u00c3O TIKTOK *\/\r\n    .tiktok-btn {\r\n      display: inline-flex;\r\n      align-items: center;\r\n      gap: 0.8rem;\r\n      background: #ff3b3b;\r\n      color: #ffffff;\r\n      padding: 1rem 2.5rem;\r\n      border-radius: 50px;\r\n      font-weight: 700;\r\n      text-decoration: none;\r\n      text-transform: uppercase;\r\n      letter-spacing: 0.05em;\r\n      transition: transform 0.2s, box-shadow 0.2s;\r\n      min-height: 44px;\r\n      min-width: 44px;\r\n    }\r\n    \r\n    .tiktok-btn:hover,\r\n    .tiktok-btn:focus {\r\n      transform: scale(1.05);\r\n      box-shadow: 0 10px 25px rgba(255, 59, 59, 0.4);\r\n      outline: 2px solid rgba(255, 59, 59, 0.5);\r\n      outline-offset: 2px;\r\n    }\r\n    \r\n    .tiktok-btn:active {\r\n      transform: scale(0.98);\r\n    }\r\n\r\n    .tiktok-icon {\r\n      font-size: 3.5rem;\r\n      color: #f0f0f0;\r\n      text-shadow: 2px 2px 0 #ff0050, -2px -2px 0 #00f2fe;\r\n      margin-bottom: 1.5rem;\r\n    }\r\n\r\n    \/* ===================================================\r\n       TIKTOK EMBED: dar espa\u00e7o real no mobile\r\n       A card cede padding lateral \u2192 wrapper ocupa tudo.\r\n       O iframe do TikTok (~325px) cabe sem comprimir.\r\n       =================================================== *\/\r\n    .tiktok-embed-wrapper {\r\n      width: 100%;\r\n      \/* Sem max-width no mobile: iframe tem espa\u00e7o de sobra *\/\r\n      border-radius: 0 0 28px 28px; \/* arredonda s\u00f3 embaixo no mobile *\/\r\n      box-shadow: 0 15px 35px rgba(0,0,0,0.8);\r\n      flex-shrink: 0;\r\n      background: #000;\r\n      position: relative;\r\n      display: flex;\r\n      justify-content: center;\r\n      align-items: flex-start;\r\n      overflow: hidden;\r\n      min-height: 420px;\r\n    }\r\n    \r\n    @media (min-width: 640px) {\r\n      .tiktok-embed-wrapper {\r\n        max-width: 325px;\r\n        min-height: 740px;\r\n        border-radius: 16px;\r\n      }\r\n    }\r\n\r\n    \/* Skeleton loader *\/\r\n    .tiktok-embed-wrapper::before {\r\n      content: '';\r\n      position: absolute;\r\n      inset: 0;\r\n      background: linear-gradient(\r\n        90deg,\r\n        #1a1a1a 25%,\r\n        #2a2a2a 50%,\r\n        #1a1a1a 75%\r\n      );\r\n      background-size: 200% 100%;\r\n      animation: loading 1.5s infinite;\r\n      border-radius: 16px;\r\n      \/* CR\u00cdTICO: pointer-events:none n\u00e3o atrapalha o iframe abaixo *\/\r\n      pointer-events: none;\r\n    }\r\n    \r\n    .tiktok-embed-wrapper.loaded::before {\r\n      display: none;\r\n    }\r\n    \r\n    .tiktok-embed-wrapper blockquote {\r\n      margin: 0 !important;\r\n      padding: 0 !important;\r\n      border: none !important;\r\n      width: 100% !important;\r\n      min-width: 0 !important;\r\n      overflow: visible !important;\r\n    }\r\n    \r\n    .tiktok-embed-wrapper iframe {\r\n      max-width: 100% !important;\r\n      border-radius: 0 0 28px 28px;\r\n    }\r\n    \r\n    @media (min-width: 640px) {\r\n      .tiktok-embed-wrapper iframe {\r\n        border-radius: 16px;\r\n      }\r\n    }\r\n\r\n\r\n    \/* ===== EXPERI\u00caNCIA IMERSIVA (CANVAS) ===== *\/\r\n    .immersive-header {\r\n      margin: 6rem 0 2rem;\r\n      display: flex;\r\n      flex-direction: column;\r\n      align-items: center;\r\n    }\r\n    \r\n    @media (min-width: 850px) {\r\n      .immersive-header { margin: 8rem 0 2rem; }\r\n    }\r\n    \r\n    .immersive-fullwidth-wrapper {\r\n      width: 99%;\r\n      position: relative;\r\n      left: 49.7%;\r\n      transform: translateX(-50%);\r\n    }\r\n\r\n    .immersive-container {\r\n      position: relative;\r\n      width: 100%;\r\n      height: 40vh;\r\n      min-height: 300px;\r\n      max-height: 600px;\r\n      background: #050507;\r\n      border-radius: 0;\r\n      border-top: 1px solid #222222;\r\n      border-bottom: 1px solid #222222;\r\n      overflow: hidden;\r\n      cursor: crosshair;\r\n      box-shadow: inset 0 0 100px rgba(0,0,0,0.9);\r\n      \/* CR\u00cdTICO: touch-action:pan-y permite scroll normal mas bloqueia pan-x\r\n         Troca: none \u2192 pan-y mant\u00e9m scroll da p\u00e1gina, mas no canvas usamos\r\n         uma overlay que captura o touch ap\u00f3s o scroll parar *\/\r\n      touch-action: pan-y;\r\n    }\r\n\r\n    \/* ===================================================\r\n       FIX 2: TEXTO IMERSIVO - VIS\u00cdVEL POR PADR\u00c3O NO MOBILE\r\n       \r\n       Problema: o texto s\u00f3 aparecia com .is-active (requer \r\n       intera\u00e7\u00e3o). No mobile, o usu\u00e1rio n\u00e3o sabia que devia \r\n       tocar E mover o dedo.\r\n       \r\n       Solu\u00e7\u00e3o em 3 camadas:\r\n       1. Texto vis\u00edvel por padr\u00e3o (baixa opacidade)\r\n       2. Brilha quando a se\u00e7\u00e3o entra no viewport (.in-view)  \r\n       3. Explode de vermelho na intera\u00e7\u00e3o (.is-active)\r\n       =================================================== *\/\r\n    .immersive-text {\r\n      position: absolute;\r\n      top: 50%;\r\n      left: 50%;\r\n      transform: translate(-50%, -50%);\r\n      font-family: 'Georgia', ui-serif, serif;\r\n      font-size: clamp(1.5rem, 8vw, 3rem);\r\n      \/* Vis\u00edvel por padr\u00e3o em baixa opacidade *\/\r\n      color: rgba(180, 180, 185, 0.35);\r\n      text-align: center;\r\n      line-height: 1.4;\r\n      pointer-events: none;\r\n      z-index: 3; \/* Acima do canvas de part\u00edculas *\/\r\n      transition: color 1.2s ease, text-shadow 1.2s ease;\r\n      width: 90%;\r\n      will-change: color, text-shadow;\r\n    }\r\n\r\n    \/* Est\u00e1gio 2: se\u00e7\u00e3o entrou no viewport \u2192 texto fica mais vis\u00edvel *\/\r\n    .immersive-container.in-view .immersive-text {\r\n      color: rgba(220, 220, 225, 0.55);\r\n    }\r\n\r\n    \/* Est\u00e1gio 3: intera\u00e7\u00e3o ativa \u2192 vermelho + glow *\/\r\n    .immersive-container.is-active .immersive-text {\r\n      color: rgba(255, 59, 59, 0.9);\r\n      text-shadow: 0 0 30px rgba(255, 59, 59, 0.6);\r\n    }\r\n\r\n    \/* Dica de intera\u00e7\u00e3o: pisca suavemente para indicar que \u00e9 t\u00e1til *\/\r\n    .immersive-hint {\r\n      position: absolute;\r\n      bottom: 20px;\r\n      left: 50%;\r\n      transform: translateX(-50%);\r\n      font-size: 0.75rem;\r\n      color: rgba(255, 255, 255, 0.2);\r\n      letter-spacing: 0.15em;\r\n      text-transform: uppercase;\r\n      pointer-events: none;\r\n      z-index: 4;\r\n      animation: hintPulse 2.5s ease-in-out infinite;\r\n      \/* Some ap\u00f3s a primeira intera\u00e7\u00e3o *\/\r\n      transition: opacity 0.5s ease;\r\n    }\r\n\r\n    .immersive-container.is-active .immersive-hint {\r\n      opacity: 0;\r\n    }\r\n\r\n    @keyframes hintPulse {\r\n      0%, 100% { opacity: 0.15; }\r\n      50% { opacity: 0.45; }\r\n    }\r\n    \r\n    canvas#ember-canvas {\r\n      position: absolute;\r\n      top: 0; \r\n      left: 0;\r\n      width: 100%; \r\n      height: 100%;\r\n      z-index: 2;\r\n      pointer-events: none;\r\n      will-change: transform;\r\n    }\r\n\r\n    hr {\r\n      border: none;\r\n      height: 1px;\r\n      background: linear-gradient(90deg, transparent, rgba(255, 59, 59, 0.3), transparent);\r\n      margin: 5rem 0;\r\n    }\r\n\r\n    .subtle {\r\n      color: var(--text-subtle);\r\n      font-size: 0.9rem;\r\n      letter-spacing: 0.05em;\r\n      text-transform: uppercase;\r\n    }\r\n\r\n    \/* ===== FOOTER CENTRALIZADO ===== *\/\r\n    footer {\r\n      text-align: center;\r\n      width: 100%;\r\n    }\r\n\r\n    footer p {\r\n      color: var(--text-subtle);\r\n      font-size: 0.9rem;\r\n      letter-spacing: 0.05em;\r\n      text-transform: uppercase;\r\n      margin: 0 auto;\r\n      max-width: 100%;\r\n    }\r\n\r\n    footer span {\r\n      display: block;\r\n      margin-top: 1rem;\r\n      color: #444;\r\n    }\r\n\r\n    \/* === PREFERS-REDUCED-MOTION === *\/\r\n    @media (prefers-reduced-motion: reduce) {\r\n      *,\r\n      *::before,\r\n      *::after {\r\n        animation-duration: 0.01ms !important;\r\n        animation-iteration-count: 1 !important;\r\n        transition-duration: 0.01ms !important;\r\n      }\r\n      \r\n      .fade-in { \r\n        animation: none; \r\n        opacity: 1; \r\n        transform: translateY(0); \r\n      }\r\n      \r\n      .version-card:hover, \r\n      .video-wrapper:hover { \r\n        transform: none; \r\n      }\r\n      \r\n      .coin-image-wrapper img { \r\n        animation: none; \r\n      }\r\n      \r\n      .pulse-keyword { \r\n        animation: none; \r\n        color: var(--red); \r\n      }\r\n      \r\n      .lazy-section { \r\n        opacity: 1; \r\n        transform: none; \r\n        transition: none; \r\n      }\r\n      \r\n      .tiktok-btn:hover { \r\n        transform: none; \r\n      }\r\n\r\n      \/* Texto imersivo: sempre vis\u00edvel sem anima\u00e7\u00e3o *\/\r\n      .immersive-text {\r\n        color: rgba(255, 59, 59, 0.7) !important;\r\n        text-shadow: none !important;\r\n        transition: none !important;\r\n      }\r\n    }\r\n  <\/style>\r\n<\/head>\r\n<body>\r\n  <main id=\"main-content\" class=\"container\">\r\n\r\n    <header class=\"fade-in\">\r\n      <h2>We'll Last Forever<\/h2>\r\n      <p style=\"font-size: clamp(1.2rem, 3vw, 1.4rem); line-height: 1.5; color: var(--text-main);\">\r\n        Duas faces da mesma chama. <span class=\"highlight\">O grito<\/span> e <span class=\"highlight\">o eco<\/span> \u2013 o que acontece quando a gente se perde de si mesmo tentando alcan\u00e7ar o que achava que era o topo.\r\n      <\/p>\r\n    <\/header>\r\n\r\n    <div class=\"versions-grid fade-in\">\r\n      <article class=\"version-card\">\r\n        <span class=\"card-tag\">Pele Noturna<\/span>\r\n        <h3 class=\"card-title\">O Grito<\/h3>\r\n        <time class=\"card-date\" datetime=\"2025-10-29\">29 de Outubro de 2025<\/time>\r\n        <p class=\"card-description\">\r\n          Quando a m\u00e1quina ainda est\u00e1 quente. A vers\u00e3o que nasce do esgotamento, da urg\u00eancia de dizer algo antes que o peito exploda. Crua, el\u00e9trica, sem filtro.\r\n        <\/p>\r\n        <div class=\"spotify-embed\" data-track=\"6K9LMfA6r3vQnuNkrtN9sX\">\r\n          <noscript>\r\n            <a href=\"https:\/\/open.spotify.com\/track\/6K9LMfA6r3vQnuNkrtN9sX\" target=\"_blank\" rel=\"noopener\">\r\n              Ou\u00e7a no Spotify\r\n            <\/a>\r\n          <\/noscript>\r\n        <\/div>\r\n      <\/article>\r\n\r\n      <article class=\"version-card\">\r\n        <span class=\"card-tag\">Pele Dourada<\/span>\r\n        <h3 class=\"card-title\">O Eco<\/h3>\r\n        <time class=\"card-date\" datetime=\"2026-01-23\">23 de Janeiro de 2026<\/time>\r\n        <p class=\"card-description\">\r\n          A mesma dor, agora vista de longe. O groove quente n\u00e3o apaga a cela \u2013 s\u00f3 a torna habit\u00e1vel. Uma prova de que o tempo n\u00e3o cura, ele ressignifica.\r\n        <\/p>\r\n        <div class=\"spotify-embed\" data-track=\"541jbUA4f2inbpLhlKLxXz\">\r\n          <noscript>\r\n            <a href=\"https:\/\/open.spotify.com\/track\/541jbUA4f2inbpLhlKLxXz\" target=\"_blank\" rel=\"noopener\">\r\n              Ou\u00e7a no Spotify\r\n            <\/a>\r\n          <\/noscript>\r\n        <\/div>\r\n      <\/article>\r\n    <\/div>\r\n\r\n    <section class=\"coin-reflection fade-in\" aria-label=\"Reflex\u00e3o sobre a ilus\u00e3o do tempo\">\r\n      <div class=\"coin-image-wrapper\">\r\n        <img loading=\"lazy\" src=\"https:\/\/i0.wp.com\/guilhermegodoy.com\/wp-content\/uploads\/2025\/10\/Well-Last-Forever-moeda-do-infinito-1.webp\" alt=\"Moeda met\u00e1lica escura com s\u00edmbolo do infinito representando a ilus\u00e3o do tempo e o paradoxo do para sempre\" width=\"130\" height=\"130\" decoding=\"async\" title=\"\">\r\n      <\/div>\r\n      <p>\"O refr\u00e3o de We'll Last Forever me veio \u00e0 mente durante a noite. Eu fazia um <i>'balan\u00e7o da vida'<\/i>, estava chovendo muito e essa m\u00fasica foi, literalmente, escrita sob os trov\u00f5es.\"<\/p>\r\n      <span class=\"small\" role=\"doc-subtitle\">\u2014 Guilherme Godoy<\/span>\r\n    <\/section>\r\n\r\n    <hr class=\"fade-in\" role=\"presentation\" \/>\r\n\r\n    <section class=\"fade-in\">\r\n      <h2>O que queima aqui<\/h2>\r\n      <p>\r\n        Esta n\u00e3o \u00e9 uma can\u00e7\u00e3o sobre amor. \u00c9 sobre <span class=\"highlight\">o labirinto<\/span> que a gente constr\u00f3i quando esconde quem \u00e9 para caber em lugares que n\u00e3o foram feitos para a gente.\r\n      <\/p>\r\n      <p>\r\n        Existe um jogo silencioso onde voc\u00ea troca peda\u00e7os de si por valida\u00e7\u00e3o. Quanto mais voc\u00ea enterra o que sente, mais sobe. A ambi\u00e7\u00e3o vira uma moeda \u2013 voc\u00ea d\u00e1 suas noites, sua sa\u00fade, sua capacidade de sentir, e em troca recebe um t\u00edtulo, um n\u00famero, uma falsa sensa\u00e7\u00e3o de ser ouvido. E o po\u00e7o continua l\u00e1, porque o buraco \u00e9 existencial.\r\n      <\/p>\r\n      <p>\r\n        <em>\"I am concealing, got ambitions to ignite \/ But every time I end with poison in my eyes\"<\/em> \u2013 voc\u00ea acende o pr\u00f3prio pavio e depois reclama da queimadura.\r\n      <\/p>\r\n    <\/section>\r\n\r\n    <aside class=\"quote-block fade-in\" role=\"complementary\">\r\n      <p>\"This city's breathing, but it never calls my name\"<\/p>\r\n      <div class=\"quote-author\">\u2014 A cidade usa o meu pulso e ignora o meu rosto \u2013 e minha voz.<\/div>\r\n    <\/aside>\r\n\r\n    <section class=\"dual-layout fade-in\">\r\n      <div class=\"dual-text\">\r\n        <h2>Por que duas peles?<\/h2>\r\n        <p>\r\n          A <span class=\"highlight\">vers\u00e3o noturna<\/span> nasceu no meio da tempestade \u2013 quando o cansa\u00e7o ainda era uma brasa, quando cada batida refletia o aperto no peito. \u00c9 o som de quem ainda est\u00e1 <em>\"trapped inside a flame\"<\/em>.\r\n        <\/p>\r\n        <p>\r\n          A <span class=\"highlight\">vers\u00e3o dourada<\/span> veio depois, com o afastamento. A mesma letra, agora num ritmo que quase faz a gente esquecer a dor \u2013 mas n\u00e3o faz. Porque com o tempo a gente aprende a conviver com as cicatrizes, a contar a hist\u00f3ria com um sorriso. Mas a cela continua l\u00e1. S\u00f3 que agora a gente pendurou um quadro na parede.\r\n        <\/p>\r\n        <p>\r\n          Duas faces da mesma moeda. E uma verdade que a m\u00fasica n\u00e3o esconde: o \"para sempre\" n\u00e3o \u00e9 promessa \u2013 \u00e9 pris\u00e3o. A pergunta \u00e9: <i>o que voc\u00ea trocou para chegar at\u00e9 aqui?<\/i>\r\n        <\/p>\r\n      <\/div>\r\n      \r\n      <div class=\"video-wrapper\" data-video=\"MOAjNj6_yv0\">\r\n        <noscript>\r\n          <a href=\"https:\/\/www.youtube.com\/watch?v=MOAjNj6_yv0\" target=\"_blank\" rel=\"noopener\">\r\n            Assista o visualizer no YouTube\r\n          <\/a>\r\n        <\/noscript>\r\n      <\/div>\r\n    <\/section>\r\n\r\n    <section class=\"lyrics-section fade-in\">\r\n      <h2 class=\"centered\" style=\"display: block; margin-bottom: 2.5rem;\">Letra<\/h2>\r\n      <div class=\"lyrics\" role=\"article\" aria-label=\"Letra da m\u00fasica We'll Last Forever\">\r\n        <p>\r\n          I gotta know, I'm gonna place it in my head<br>\r\n          To build <span class=\"pulse-keyword d1\">empires<\/span>, spread your message everywhere<br>\r\n          I'm dealing <span class=\"pulse-keyword d2\">visions<\/span>, haunting me through every night<br>\r\n          A shadow kissed me, brought its <span class=\"pulse-keyword d3\">darkness<\/span> to my life\r\n        <\/p>\r\n\r\n        <p class=\"chorus\">\r\n          Hold tight, don't break a <span class=\"pulse-keyword d4\">promise<\/span><br>\r\n          I'm <span class=\"pulse-keyword d1\">bleeding<\/span> in this tale, right now<br>\r\n          I take my stand on the streets<br>\r\n          To chase the <span class=\"pulse-keyword d2\">light<\/span>\r\n        <\/p>\r\n\r\n        <p class=\"chorus\">\r\n          Hide your <span class=\"pulse-keyword d3\">feelings<\/span> to hear the sound<br>\r\n          <span class=\"pulse-keyword d4\">Illusions<\/span> will hold the ground<br>\r\n          We'll last <span class=\"pulse-keyword d1\">forever<\/span>, last forever, say you\r\n        <\/p>\r\n\r\n        <p>\r\n          I am concealing, got ambitions to ignite<br>\r\n          But every time I end with <span class=\"pulse-keyword d2\">poison<\/span> in my eyes, why<br>\r\n          We'll last <span class=\"pulse-keyword d3\">forever<\/span>, last forever, tell me\r\n        <\/p>\r\n\r\n        <p>\r\n          The rain keeps falling like it knows what I <span class=\"pulse-keyword d4\">regret<\/span><br>\r\n          I walk through <span class=\"pulse-keyword d1\">echoes<\/span> of a night I haven't met<br>\r\n          This city's breathing, but it never calls my name<br>\r\n          I'm the <span class=\"pulse-keyword d2\">devil's voice<\/span> trapped inside a <span class=\"pulse-keyword d3\">flame<\/span>\r\n        <\/p>\r\n\r\n        <p class=\"chorus\">\r\n          Stand still, don't lose your meaning<br>\r\n          These <span class=\"pulse-keyword d4\">ghosts<\/span>, they know me far too well<br>\r\n          I wear my <span class=\"pulse-keyword d1\">wounds<\/span> like warnings I can't tell\r\n        <\/p>\r\n\r\n        <p>\r\n          Gifting wisdom as <span class=\"pulse-keyword d2\">shadows<\/span> take their light<br>\r\n          Time bends to my command, bowing to my <span class=\"pulse-keyword d3\">desire<\/span><br>\r\n          Unveiling what's mine<br>\r\n          While others claim the <span class=\"pulse-keyword d4\">fire<\/span>\r\n        <\/p>\r\n\r\n        <p class=\"chorus\">\r\n          Hold tight, don't lose your calm<br>\r\n          I'm <span class=\"pulse-keyword d1\">bleeding<\/span> in this tale of life<br>\r\n          I take my breath on the streets<br>\r\n          To steal the <span class=\"pulse-keyword d2\">night<\/span>\r\n        <\/p>\r\n\r\n        <p class=\"chorus\">\r\n          Hide your <span class=\"pulse-keyword d3\">feelings<\/span> to hear the sound<br>\r\n          <span class=\"pulse-keyword d4\">Illusions<\/span> will hold the ground<br>\r\n          We'll last <span class=\"pulse-keyword d1\">forever<\/span>, last forever, say you\r\n        <\/p>\r\n\r\n        <p>\r\n          I am concealing, got ambitions to ignite<br>\r\n          But every time I end with <span class=\"pulse-keyword d2\">poison<\/span> in my eyes, why<br>\r\n          We'll last <span class=\"pulse-keyword d3\">forever<\/span>, last forever, tell me\r\n        <\/p>\r\n      <\/div>\r\n    <\/section>\r\n\r\n  <\/main>\r\n\r\n  <div class=\"lazy-section\" id=\"experiencia-interativa\">\r\n    \r\n    <div class=\"container\" style=\"padding-bottom: 0; padding-top: 0;\">\r\n      <hr role=\"presentation\" \/>\r\n\r\n      <section class=\"tiktok-section\">\r\n        <div class=\"tiktok-card\">\r\n          \r\n          <div class=\"tiktok-content\">\r\n            <i class=\"fab fa-tiktok tiktok-icon\" aria-hidden=\"true\"><\/i>\r\n            <h2 class=\"tiktok-title\" style=\"font-family: 'Georgia', serif; font-size: clamp(1.8rem, 8vw, 2.8rem); color: #f0f0f0; margin-bottom: 1.5rem;\">\r\n              Vista a Pele\r\n            <\/h2>\r\n            <p style=\"color: #b0b0b5; font-size: 1.15rem; max-width: 500px; margin-bottom: 1.5rem; line-height: 1.6;\">\r\n              A eternidade \u00e9 para ser vivida. Use o efeito oficial de <em>We'll Last Forever<\/em> e descubra seu \"eu imortal\".\r\n            <\/p>\r\n            <a href=\"https:\/\/vt.tiktok.com\/ZS9JWMvpfLvF6-NWOPH\/\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"tiktok-btn\" aria-label=\"Testar efeito We&#039;ll Last Forever no TikTok (abre em nova aba)\">\r\n              Testar Efeito <i class=\"fas fa-external-link-alt\" style=\"font-size: 0.9em; margin-left: 5px;\" aria-hidden=\"true\"><\/i>\r\n            <\/a>\r\n          <\/div>\r\n\r\n          <div class=\"tiktok-embed-wrapper\" data-tiktok=\"7571488197126016277\">\r\n            <noscript>\r\n              <a href=\"https:\/\/www.tiktok.com\/@guilhermemgodoy\/video\/7571488197126016277\" target=\"_blank\" rel=\"noopener\">\r\n                Ver v\u00eddeo no TikTok\r\n              <\/a>\r\n            <\/noscript>\r\n          <\/div>\r\n\r\n        <\/div>\r\n      <\/section>\r\n\r\n      <section class=\"immersive-header\">\r\n        <h2 class=\"centered\" style=\"font-family: 'Georgia', serif; font-size: clamp(1.8rem, 8vw, 2.8rem); color: #f0f0f0; margin-bottom: 1.5rem;\">\r\n          O que resta da chama\r\n        <\/h2>\r\n        <p style=\"text-align: center; margin: 0 auto 3rem; max-width: 600px; color: #b0b0b5;\">\r\n          Passe o dedo (ou o mouse) sobre as cinzas para afast\u00e1-las e revelar o que o tempo n\u00e3o conseguiu apagar.\r\n        <\/p>\r\n      <\/section>\r\n    <\/div>\r\n\r\n    <div class=\"immersive-fullwidth-wrapper\">\r\n      <div class=\"immersive-container\" id=\"immersive-box\" role=\"img\" aria-label=\"Experi\u00eancia interativa: afaste as cinzas para revelar a mensagem\">\r\n        <div class=\"immersive-text\">\r\n          \"N\u00e3o h\u00e1 eternidade<br>sem sacrif\u00edcio.\"\r\n        <\/div>\r\n        <!-- Dica visual de intera\u00e7\u00e3o \u2014 some ap\u00f3s o primeiro toque -->\r\n        <div class=\"immersive-hint\" aria-hidden=\"true\">\r\n          \u2726 toque para revelar \u2726\r\n        <\/div>\r\n        <canvas id=\"ember-canvas\"><\/canvas>\r\n      <\/div>\r\n    <\/div>\r\n\r\n  <\/div>\r\n\r\n  <footer class=\"container\" style=\"padding: 4rem 2rem 2rem; text-align: center;\">\r\n    <p class=\"subtle\">\r\n      Escrita em algum lugar entre o esgotamento e o recome\u00e7o.\r\n    <\/p>\r\n    <span style=\"display: block; margin-top: 1rem; color: #444; font-size: 0.9rem;\">\r\n      \u00a9 2026 Guilherme Godoy \/ VIBESYNK\r\n    <\/span>\r\n  <\/footer>\r\n\r\n  <script>\r\n    \/\/ ====================================================\r\n    \/\/ UTILIT\u00c1RIO: detectar mobile (sem UA sniffing)\r\n    \/\/ ====================================================\r\n    const isMobile = window.matchMedia('(max-width: 768px)').matches\r\n      || ('ontouchstart' in window && window.innerWidth < 900);\r\n\r\n    \/\/ ====================================================\r\n    \/\/ Remove will-change ap\u00f3s anima\u00e7\u00f5es de entrada\r\n    \/\/ ====================================================\r\n    document.addEventListener('DOMContentLoaded', function() {\r\n      const fadeIns = document.querySelectorAll('.fade-in');\r\n      fadeIns.forEach(el => {\r\n        el.addEventListener('animationend', function() {\r\n          this.classList.add('animated');\r\n        }, { once: true });\r\n      });\r\n    });\r\n\r\n    \/\/ ====================================================\r\n    \/\/ LAZY LOADING COM INTERSECTION OBSERVER\r\n    \/\/ ====================================================\r\n    (function() {\r\n      if (!('IntersectionObserver' in window)) {\r\n        loadAllEmbeds();\r\n        initEmbers();\r\n        return;\r\n      }\r\n\r\n      const lazySection = document.getElementById('experiencia-interativa');\r\n      let canvasInitialized = false;\r\n\r\n      const sectionObserver = new IntersectionObserver((entries) => {\r\n        entries.forEach(entry => {\r\n          if (entry.isIntersecting) {\r\n            entry.target.classList.add('is-visible');\r\n            \r\n            if (!canvasInitialized) {\r\n              if (window.requestIdleCallback) {\r\n                requestIdleCallback(() => initEmbers(), { timeout: 2000 });\r\n              } else {\r\n                setTimeout(initEmbers, 100);\r\n              }\r\n              canvasInitialized = true;\r\n            }\r\n            sectionObserver.unobserve(entry.target);\r\n          }\r\n        });\r\n      }, { \r\n        root: null, \r\n        rootMargin: '50px', \r\n        threshold: 0.1 \r\n      });\r\n\r\n      if (lazySection) {\r\n        sectionObserver.observe(lazySection);\r\n      }\r\n\r\n      \/\/ Observer para embeds (Spotify, YouTube, TikTok)\r\n      const embedObserver = new IntersectionObserver((entries) => {\r\n        entries.forEach(entry => {\r\n          if (entry.isIntersecting) {\r\n            loadEmbed(entry.target);\r\n            embedObserver.unobserve(entry.target);\r\n          }\r\n        });\r\n      }, {\r\n        root: null,\r\n        rootMargin: '200px',\r\n        threshold: 0.01\r\n      });\r\n\r\n      document.querySelectorAll('.spotify-embed, .video-wrapper, .tiktok-embed-wrapper').forEach(el => {\r\n        embedObserver.observe(el);\r\n      });\r\n\r\n    })();\r\n\r\n    \/\/ ====================================================\r\n    \/\/ CARREGAR EMBEDS\r\n    \/\/ ====================================================\r\n    function loadEmbed(element) {\r\n\r\n      \/\/ --- SPOTIFY ---\r\n      if (element.classList.contains('spotify-embed')) {\r\n        const trackId = element.getAttribute('data-track');\r\n        if (!trackId) return;\r\n\r\n        const iframe = document.createElement('iframe');\r\n        iframe.setAttribute('data-testid', 'embed-iframe');\r\n        iframe.style.borderRadius = '12px';\r\n        iframe.src = `https:\/\/open.spotify.com\/embed\/track\/${trackId}?utm_source=generator&theme=0`;\r\n        iframe.width = '100%';\r\n        iframe.height = window.innerWidth >= 640 ? '352' : '232';\r\n        iframe.frameBorder = '0';\r\n        iframe.allowFullscreen = true;\r\n        iframe.allow = 'autoplay; clipboard-write; encrypted-media; fullscreen; picture-in-picture';\r\n        iframe.loading = 'lazy';\r\n        iframe.onload = () => element.classList.add('loaded');\r\n        element.appendChild(iframe);\r\n      }\r\n\r\n      \/\/ --- YOUTUBE ---\r\n      if (element.classList.contains('video-wrapper')) {\r\n        const videoId = element.getAttribute('data-video');\r\n        if (!videoId) return;\r\n\r\n        const iframe = document.createElement('iframe');\r\n        iframe.src = `https:\/\/www.youtube-nocookie.com\/embed\/${videoId}?rel=0&modestbranding=1`;\r\n        iframe.title = \"We'll Last Forever - Visualizer\";\r\n        iframe.allow = 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture';\r\n        iframe.allowFullscreen = true;\r\n        iframe.loading = 'lazy';\r\n        iframe.style.border = 'none';\r\n        element.appendChild(iframe);\r\n      }\r\n\r\n      if (element.classList.contains('tiktok-embed-wrapper')) {\r\n        const videoId = element.getAttribute('data-tiktok');\r\n        if (!videoId) return;\r\n\r\n        const blockquote = document.createElement('blockquote');\r\n        blockquote.className = 'tiktok-embed';\r\n        blockquote.setAttribute('cite', `https:\/\/www.tiktok.com\/@guilhermemgodoy\/video\/${videoId}`);\r\n        blockquote.setAttribute('data-video-id', videoId);\r\n        blockquote.setAttribute('data-theme', 'dark');\r\n        blockquote.style.cssText = 'max-width:100%;min-width:0;width:100%;';\r\n\r\n        const section = document.createElement('section');\r\n        const link = document.createElement('a');\r\n        link.target = '_blank';\r\n        link.href = 'https:\/\/www.tiktok.com\/@guilhermemgodoy?refer=embed';\r\n        link.textContent = '@guilhermemgodoy';\r\n        section.appendChild(link);\r\n        blockquote.appendChild(section);\r\n        element.appendChild(blockquote);\r\n\r\n        \/\/ Carregar script do TikTok\r\n        if (!window.tiktokEmbedLoaded) {\r\n          const script = document.createElement('script');\r\n          script.async = true;\r\n          script.src = 'https:\/\/www.tiktok.com\/embed.js';\r\n          script.onload = () => {\r\n            window.tiktokEmbedLoaded = true;\r\n            element.classList.add('loaded');\r\n          };\r\n          document.body.appendChild(script);\r\n        } else {\r\n          element.classList.add('loaded');\r\n        }\r\n      }\r\n    }\r\n\r\n    function loadAllEmbeds() {\r\n      document.querySelectorAll('.spotify-embed, .video-wrapper, .tiktok-embed-wrapper').forEach(loadEmbed);\r\n    }\r\n\r\n    \/\/ ====================================================\r\n    \/\/ FIX 2 + FIX 3: CANVAS DE PART\u00cdCULAS \u2014 CORRIGIDO\r\n    \/\/\r\n    \/\/ Fix 2 (texto imersivo): Quando o container entra no\r\n    \/\/   viewport, adiciona .in-view \u2192 texto fica vis\u00edvel.\r\n    \/\/   Intera\u00e7\u00e3o j\u00e1 activa .is-active para o vermelho.\r\n    \/\/\r\n    \/\/ Fix 3 (performance mobile):\r\n    \/\/   - shadowBlur ELIMINADO no mobile (era o maior culpado)\r\n    \/\/   - Part\u00edculas: 35 no mobile vs 100+ no desktop\r\n    \/\/   - Glow simplificado: radialGradient em vez de shadowBlur\r\n    \/\/   - Touch com passive:true e throttle agressivo (32ms)\r\n    \/\/   - devicePixelRatio limitado a 1 no mobile\r\n    \/\/   - Batch de ctx.save\/restore eliminado\r\n    \/\/ ====================================================\r\n    function initEmbers() {\r\n      const canvas = document.getElementById('ember-canvas');\r\n      if (!canvas) return;\r\n\r\n      const prefersReducedMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;\r\n      const container = document.getElementById('immersive-box');\r\n\r\n      \/\/ Pixel ratio: no mobile limita a 1 para n\u00e3o dobrar o trabalho de renderiza\u00e7\u00e3o\r\n      const dpr = isMobile ? 1 : Math.min(window.devicePixelRatio || 1, 2);\r\n\r\n      const ctx = canvas.getContext('2d', {\r\n        alpha: true,\r\n        desynchronized: true \/\/ Non-blocking no mobile\r\n      });\r\n\r\n      let width, height;\r\n      let particles = [];\r\n      let animationFrameId = null;\r\n      let mouse = { x: -9999, y: -9999, radius: isMobile ? 90 : 130 };\r\n      let isRunning = false;\r\n\r\n      \/\/ ---- Observer: text reveal quando container entra no viewport ----\r\n      const containerObserver = new IntersectionObserver((entries) => {\r\n        entries.forEach(entry => {\r\n          if (entry.isIntersecting) {\r\n            container.classList.add('in-view');\r\n            containerObserver.unobserve(container);\r\n          }\r\n        });\r\n      }, { threshold: 0.3 });\r\n      containerObserver.observe(container);\r\n\r\n      \/\/ ---- Resize debounced ----\r\n      let resizeTimeout;\r\n      function handleResize() {\r\n        clearTimeout(resizeTimeout);\r\n        resizeTimeout = setTimeout(resize, 250);\r\n      }\r\n\r\n      function resize() {\r\n        width = container.clientWidth;\r\n        height = container.clientHeight;\r\n        \/\/ Aplica DPR para canvas n\u00edtido mas sem custo extra no mobile\r\n        canvas.width = Math.round(width * dpr);\r\n        canvas.height = Math.round(height * dpr);\r\n        canvas.style.width = width + 'px';\r\n        canvas.style.height = height + 'px';\r\n        if (dpr !== 1) ctx.scale(dpr, dpr);\r\n\r\n        particles = [];\r\n        createParticles();\r\n      }\r\n\r\n      window.addEventListener('resize', handleResize, { passive: true });\r\n\r\n      \/\/ ---- Classe de part\u00edcula \u2014 simplificada para mobile ----\r\n      class Ember {\r\n        constructor() {\r\n          this.reset(true);\r\n        }\r\n\r\n        reset(initial) {\r\n          this.x = Math.random() * width;\r\n          \/\/ Distribui no espa\u00e7o todo se inicial, sen\u00e3o come\u00e7a por baixo\r\n          this.y = initial\r\n            ? Math.random() * (height + 100)\r\n            : height + Math.random() * 20 + 5;\r\n          this.size = Math.random() * 2.2 + 0.4;\r\n          this.speedY = Math.random() * 1.3 + 0.4;\r\n          this.speedX = (Math.random() - 0.5) * 0.9;\r\n          this.opacity = Math.random() * 0.75 + 0.2;\r\n          \/\/ Cor pr\u00e9-calculada: evita string concat a cada frame\r\n          this.color = `rgba(255,${40 + Math.floor(Math.random()*30)},${40 + Math.floor(Math.random()*20)},${this.opacity.toFixed(2)})`;\r\n        }\r\n\r\n        update() {\r\n          this.y -= this.speedY;\r\n          this.x += this.speedX;\r\n\r\n          \/\/ Intera\u00e7\u00e3o com cursor\/dedo\r\n          const dx = mouse.x - this.x;\r\n          const dy = mouse.y - this.y;\r\n          \/\/ Dist\u00e2ncia\u00b2 evita sqrt (mais r\u00e1pido)\r\n          const dist2 = dx * dx + dy * dy;\r\n          const r2 = mouse.radius * mouse.radius;\r\n\r\n          if (dist2 < r2 && dist2 > 0) {\r\n            const dist = Math.sqrt(dist2);\r\n            const force = (mouse.radius - dist) \/ mouse.radius;\r\n            this.x -= (dx \/ dist) * force * 6;\r\n            this.y -= (dy \/ dist) * force * 6;\r\n          }\r\n\r\n          \/\/ Reposiciona part\u00edcula quando sai da tela\r\n          if (this.y < -10 || this.x < -15 || this.x > width + 15) {\r\n            this.reset(false);\r\n          }\r\n        }\r\n\r\n        \/\/ Desktop: glow com radialGradient (mais bonito que shadowBlur, igualmente r\u00e1pido)\r\n        draw() {\r\n          ctx.globalAlpha = this.opacity;\r\n          ctx.fillStyle = this.color;\r\n          ctx.beginPath();\r\n          ctx.arc(this.x, this.y, this.size, 0, 6.2832);\r\n          ctx.fill();\r\n        }\r\n\r\n        \/\/ Mobile: sem glow algum \u2014 apenas c\u00edrculo puro (m\u00e1xima performance)\r\n        drawSimple() {\r\n          ctx.globalAlpha = this.opacity;\r\n          ctx.fillStyle = this.color;\r\n          ctx.beginPath();\r\n          ctx.arc(this.x, this.y, this.size, 0, 6.2832);\r\n          ctx.fill();\r\n        }\r\n      }\r\n\r\n      \/\/ No desktop, fazemos um leve glow sem shadowBlur:\r\n      \/\/ usamos um segundo arco maior e mais transparente\r\n      function drawWithGlow(p) {\r\n        \/\/ Part\u00edcula interna \u2014 opaca\r\n        ctx.globalAlpha = p.opacity;\r\n        ctx.fillStyle = p.color;\r\n        ctx.beginPath();\r\n        ctx.arc(p.x, p.y, p.size, 0, 6.2832);\r\n        ctx.fill();\r\n        \/\/ Halo externo \u2014 sutil\r\n        ctx.globalAlpha = p.opacity * 0.2;\r\n        ctx.fillStyle = 'rgba(255,59,59,1)';\r\n        ctx.beginPath();\r\n        ctx.arc(p.x, p.y, p.size * 2.5, 0, 6.2832);\r\n        ctx.fill();\r\n      }\r\n\r\n      function createParticles() {\r\n        let count;\r\n        if (prefersReducedMotion) {\r\n          count = 0; \/\/ Sem part\u00edculas se reduced motion\r\n        } else if (isMobile) {\r\n          count = 35; \/\/ MOBILE: m\u00ednimo vi\u00e1vel, suave\r\n        } else {\r\n          const density = Math.floor((width * height) \/ 8000);\r\n          count = Math.min(density, 120);\r\n        }\r\n\r\n        for (let i = 0; i < count; i++) {\r\n          particles.push(new Ember());\r\n        }\r\n      }\r\n\r\n      resize();\r\n\r\n      \/\/ ---- Loop de anima\u00e7\u00e3o ----\r\n      function animate() {\r\n        ctx.clearRect(0, 0, width, height);\r\n        ctx.globalAlpha = 1;\r\n\r\n        const len = particles.length;\r\n        for (let i = 0; i < len; i++) {\r\n          particles[i].update();\r\n          if (isMobile) {\r\n            particles[i].drawSimple();\r\n          } else {\r\n            drawWithGlow(particles[i]);\r\n          }\r\n        }\r\n\r\n        \/\/ Reseta globalAlpha para n\u00e3o afectar outros elementos\r\n        ctx.globalAlpha = 1;\r\n\r\n        animationFrameId = requestAnimationFrame(animate);\r\n      }\r\n\r\n      function startAnimation() {\r\n        if (!isRunning && !prefersReducedMotion) {\r\n          isRunning = true;\r\n          animate();\r\n        }\r\n      }\r\n\r\n      function stopAnimation() {\r\n        if (animationFrameId) {\r\n          cancelAnimationFrame(animationFrameId);\r\n          animationFrameId = null;\r\n        }\r\n        isRunning = false;\r\n      }\r\n\r\n      startAnimation();\r\n\r\n      \/\/ ---- Visibilidade da aba ----\r\n      document.addEventListener('visibilitychange', () => {\r\n        if (document.hidden) {\r\n          stopAnimation();\r\n        } else {\r\n          startAnimation();\r\n        }\r\n      });\r\n\r\n      \/\/ ---- Eventos de mouse\/touch com throttle ----\r\n      \/\/ FIX: throttle de 32ms no mobile (30fps \u00e9 suficiente para intera\u00e7\u00e3o)\r\n      const throttleMs = isMobile ? 32 : 16;\r\n      let lastEventTime = 0;\r\n\r\n      function getEventCoords(e) {\r\n        if (e.touches && e.touches.length > 0) {\r\n          return { clientX: e.touches[0].clientX, clientY: e.touches[0].clientY };\r\n        }\r\n        return { clientX: e.clientX, clientY: e.clientY };\r\n      }\r\n\r\n      function updateMouse(e) {\r\n        const now = performance.now();\r\n        if (now - lastEventTime < throttleMs) return;\r\n        lastEventTime = now;\r\n\r\n        const rect = container.getBoundingClientRect();\r\n        const { clientX, clientY } = getEventCoords(e);\r\n\r\n        mouse.x = clientX - rect.left;\r\n        mouse.y = clientY - rect.top;\r\n        container.classList.add('is-active');\r\n      }\r\n\r\n      function resetMouse() {\r\n        \/\/ Delay no mobile para que o \u00faltimo \"wiggle\" das part\u00edculas seja vis\u00edvel\r\n        setTimeout(() => {\r\n          mouse.x = -9999;\r\n          mouse.y = -9999;\r\n        }, isMobile ? 400 : 0);\r\n        container.classList.remove('is-active');\r\n      }\r\n\r\n      \/\/ ---- Listeners ----\r\n      \/\/ Mouse (desktop)\r\n      container.addEventListener('mousemove', updateMouse, { passive: true });\r\n      container.addEventListener('mouseleave', resetMouse, { passive: true });\r\n\r\n      \/\/ Touch (mobile)\r\n      \/\/ IMPORTANTE: n\u00e3o usamos touch-action:none para n\u00e3o bloquear scroll da p\u00e1gina.\r\n      \/\/ Aqui capturamos touchmove mas deixamos o scroll funcionar normalmente.\r\n      container.addEventListener('touchstart', (e) => {\r\n        updateMouse(e);\r\n        \/\/ N\u00e3o chama preventDefault() \u2192 scroll da p\u00e1gina funciona normalmente\r\n      }, { passive: true });\r\n\r\n      container.addEventListener('touchmove', (e) => {\r\n        updateMouse(e);\r\n        \/\/ N\u00e3o bloqueia scroll \u2014 o usu\u00e1rio pode scrollar E interagir\r\n      }, { passive: true });\r\n\r\n      container.addEventListener('touchend', resetMouse, { passive: true });\r\n      container.addEventListener('touchcancel', resetMouse, { passive: true });\r\n    }\r\n\r\n    \/\/ ====================================================\r\n    \/\/ Polyfill requestIdleCallback\r\n    \/\/ ====================================================\r\n    window.requestIdleCallback = window.requestIdleCallback || function(cb, options) {\r\n      const start = Date.now();\r\n      return setTimeout(function() {\r\n        cb({\r\n          didTimeout: false,\r\n          timeRemaining: function() {\r\n            return Math.max(0, 50 - (Date.now() - start));\r\n          }\r\n        });\r\n      }, options && options.timeout ? Math.min(options.timeout, 50) : 1);\r\n    };\r\n\r\n  <\/script>\r\n\r\n<\/body>\r\n<\/html>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Discover We&#039;ll Last Forever. A song about the labyrinth of ambition and the paradox of time, divided into two sonic layers: Nocturnal and Golden.<\/p>","protected":false},"author":1,"featured_media":15379,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"googlesitekit_rrm_CAowkqXdCw:productID":"","footnotes":""},"class_list":["post-15370","page","type-page","status-publish","has-post-thumbnail","hentry"],"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/Pe15U7-3ZU","_links":{"self":[{"href":"https:\/\/guilhermegodoy.com\/en\/wp-json\/wp\/v2\/pages\/15370","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/guilhermegodoy.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/guilhermegodoy.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/guilhermegodoy.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/guilhermegodoy.com\/en\/wp-json\/wp\/v2\/comments?post=15370"}],"version-history":[{"count":0,"href":"https:\/\/guilhermegodoy.com\/en\/wp-json\/wp\/v2\/pages\/15370\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/guilhermegodoy.com\/en\/wp-json\/wp\/v2\/media\/15379"}],"wp:attachment":[{"href":"https:\/\/guilhermegodoy.com\/en\/wp-json\/wp\/v2\/media?parent=15370"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}