diff --git a/app/views/public/landing_pages/show.html.erb b/app/views/public/landing_pages/show.html.erb index 2ee2d418b..93fc2e06a 100644 --- a/app/views/public/landing_pages/show.html.erb +++ b/app/views/public/landing_pages/show.html.erb @@ -2,19 +2,21 @@ - + <%= @landing_host&.page_title.presence || 'Atendimento WhatsApp' %> @@ -123,9 +244,20 @@ logo

<%= @landing_host.page_title %>

+

<%= @landing_host.page_subtitle&.gsub("\n", "
")&.html_safe %>

+ +
+ Oferta expira em + 10:00 +
+ -
Pagina segura · atendimento humano
+ +
+ + Página segura e atendimento humano +
@@ -141,6 +273,58 @@ const params = new URLSearchParams(window.location.search); const clickKey = "lp_click_id_" + window.location.hostname; + + // --- Timer Logic --- + function startTimer() { + const timerElement = document.getElementById("countdownTimer"); + if (!timerElement) return; + + // 10 minutes from now (in seconds) + let totalSeconds = 10 * 60; + + // Check if we already have a timer running in session storage to persist across refresh + const sessionKey = "lp_timer_" + window.location.hostname; + const savedTime = sessionStorage.getItem(sessionKey); + const savedTimestamp = sessionStorage.getItem(sessionKey + "_ts"); + + if (savedTime && savedTimestamp) { + const elapsed = Math.floor((Date.now() - parseInt(savedTimestamp)) / 1000); + const remaining = parseInt(savedTime) - elapsed; + if (remaining > 0) { + totalSeconds = remaining; + } + } + + const interval = setInterval(() => { + if (totalSeconds <= 0) { + clearInterval(interval); + timerElement.innerText = "00:00"; + timerElement.classList.add("alert"); // Change color to red/alert + return; + } + + const minutes = Math.floor(totalSeconds / 60); + const seconds = totalSeconds % 60; + + const formattedMinutes = minutes.toString().padStart(2, '0'); + const formattedSeconds = seconds.toString().padStart(2, '0'); + + timerElement.innerText = `${formattedMinutes}:${formattedSeconds}`; + + // Persist in case of refresh + sessionStorage.setItem(sessionKey, totalSeconds.toString()); + sessionStorage.setItem(sessionKey + "_ts", Date.now().toString()); + + if (totalSeconds <= 60) { + timerElement.classList.add("alert"); // Final minute warning + } + + totalSeconds--; + }, 1000); + } + + startTimer(); + // ------------------- function getClickId() { const fromUrl = params.get("click_id") || params.get("clickid") || params.get("utm_id") || params.get("gclid"); diff --git a/progresso/2026-03-03_landing_page_ux_improvement.md b/progresso/2026-03-03_landing_page_ux_improvement.md new file mode 100644 index 000000000..6b95a89e5 --- /dev/null +++ b/progresso/2026-03-03_landing_page_ux_improvement.md @@ -0,0 +1,26 @@ +# Objetivo +Melhorar o design e as conversões da Landing Page (`show.html.erb`), focando em interface moderna ("glassmorphism"), eliminação de scroll desnecessário, e implementação de gatilhos psicológicos de urgência (cronômetro). + +# Contexto +A página antiga do iachat para atendimento de WhatsApp possuía um design simples. Como arquiteto e UX expert, a refatoração visual manteve a performance de um arquivo único (HTML/CSS inline leve) mas modernizou a apresentação utilizando as variáveis de cores dinâmicas para gerar maior apelo visual e Call-to-Action. + +# Passos Realizados +1. Refatoração do layout com responsividade fluida via CSS `clamp()` para as fontes e paddings. O body passou a ter `overflow: hidden` na maioria das telas modernas para manter o formato "above-the-fold". +2. Aplicação de visual premium no card de contato usando `backdrop-filter: blur()`, reduzindo contraste chapado e gerando sensação de profundidade. +3. Adição de um Cronômetro regressivo ("Oferta expira em 10:00") que utiliza `sessionStorage` para manter a persistência entre recarregamentos de página. +4. Animação de "brilho" (shine) contínuo e pulso na sombra (`box-shadow`) do botão do WhatsApp para destacar de forma definitiva o CTA. + +# Arquivos Alterados +- `app/views/public/landing_pages/show.html.erb` + +# Variáveis / Features +- `countdownTimer`: Elemento e classe no JS nativo adicionado. +- `sessionKey = "lp_timer_"`: Controle por hostname para evitar resets de timer na mesma sessão. + +# Como Validar +1. Abrir no navegador a URL de teste local de algum Landing Host (/lp/[hostname]). +2. Testar o redimensionamento de janela; o layout não deve forçar scroll a não ser que a altura seja criticamente pequena (ex: < 500px). +3. Aguardar os 10 minutos (ou editar session storage) para validar a cor vermelha piscante do cronômetro finalizado. + +# Como Reverter +Executar no terminal raiz: `git checkout app/views/public/landing_pages/show.html.erb` caso ainda não tenha "commitado", ou usar o git revert correspondente.