/* --- ESTRUTURA GERAL --- */
.dna-testim-section {
--dna-duration: 600ms;
--dna-ease: cubic-bezier(0.25, 0.8, 0.25, 1);
width: 100%;
max-width: 1500px;
margin: 0 auto;
padding: 40px 20px;
box-sizing: border-box;
font-family: 'Poppins', sans-serif;
position: relative;
overflow: hidden;
background: transparent;
}
.dna-testim-viewport {
width: 100%;
position: relative;
overflow: hidden;
overflow: clip;
touch-action: pan-y pinch-zoom;
-webkit-mask-image: linear-gradient(
to right,
black 85%,
transparent 100%
);
mask-image: linear-gradient(
to right,
black 85%,
transparent 100%
);
}
.dna-testim-track {
display: flex;
gap: 10px;
width: max-content;
transform: translateX(0);
}
/* --- CARDS --- */
.dna-testim-card {
width: 500px;
flex-shrink: 0;
min-height: 420px;
border-radius: 16px;
padding: 50px 40px;
box-sizing: border-box;
position: relative;
z-index: 1;
background: #ffffff;
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.06);
border: 1px solid #eaeaea;
display: flex;
flex-direction: column;
justify-content: space-between;
overflow: hidden;
cursor: pointer;
transition:
border-color var(--dna-duration) var(--dna-ease);
}
.dna-testim-card:focus-visible {
outline: 3px solid #b99661;
outline-offset: -4px;
}
.dna-card-gradient {
position: absolute;
inset: 0;
background: linear-gradient(
135deg,
#171f38 0%,
#2c3b69 100%
);
opacity: 0;
z-index: -1;
pointer-events: none;
transition:
opacity var(--dna-duration) var(--dna-ease);
}
.dna-testim-card.active {
border-color: transparent;
}
.dna-testim-card.active .dna-card-gradient {
opacity: 1;
}
/* --- LOGOS --- */
#dnaTrack .dna-card-logos {
position: relative;
width: 180px;
max-width: 100%;
height: 72px;
flex-shrink: 0;
margin-bottom: 26px;
}
#dnaTrack .dna-card-logos img {
position: absolute;
top: 50%;
left: 0;
transform: translateY(-50%);
width: 124.2px !important;
height: 44.16px !important;
max-width: 100% !important;
max-height: 44.16px !important;
object-fit: contain !important;
object-position: left center;
margin: 0 !important;
padding: 0 !important;
border: 0;
transition:
opacity var(--dna-duration) var(--dna-ease);
}
.dna-logo-dark {
opacity: 1;
}
.dna-logo-light {
opacity: 0;
}
.dna-testim-card.active .dna-logo-dark {
opacity: 0;
}
.dna-testim-card.active .dna-logo-light {
opacity: 1;
}
.filter-white {
filter: brightness(0) invert(1);
}
/* --- TEXTOS --- */
.dna-testim-title {
font-size: 2.4rem;
font-weight: 700;
line-height: 1.2;
margin: 0 0 20px;
color: #171f38;
transition:
color var(--dna-duration) var(--dna-ease);
}
.dna-testim-text {
font-size: 1.5rem;
line-height: 1.8;
color: #475569;
margin: 0 0 30px;
flex-grow: 1;
transition:
color var(--dna-duration) var(--dna-ease);
}
/* --- AUTORES --- */
.dna-testim-author {
display: flex;
align-items: center;
gap: 15px;
color: #171f38;
transition:
color var(--dna-duration) var(--dna-ease);
}
.dna-testim-author img {
width: 50px;
height: 50px;
flex-shrink: 0;
border-radius: 50%;
object-fit: cover;
}
.dna-author-info {
display: flex;
flex-direction: row;
flex-wrap: wrap;
gap: 6px;
font-size: 1.2rem;
}
.dna-author-name {
font-weight: 700;
}
.dna-author-role {
opacity: 0.8;
}
.dna-testim-card.active .dna-testim-title,
.dna-testim-card.active .dna-testim-text,
.dna-testim-card.active .dna-testim-author {
color: #ffffff !important;
}
/* --- BOTÃO ASSISTIR AO CASE --- */
.dna-testim-section .dna-case-button {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 10px;
margin: 24px 0 0;
padding: 12px 18px;
min-height: 44px;
border: 1px solid currentColor;
border-radius: 8px;
background: transparent;
color: #171f38;
font-family: inherit;
font-size: 14px;
font-weight: 600;
line-height: 1.2;
cursor: pointer;
box-shadow: none;
transition:
color var(--dna-duration) var(--dna-ease),
border-color var(--dna-duration) var(--dna-ease),
background-color 0.2s ease;
}
.dna-testim-card.active .dna-case-button {
color: #ffffff;
}
.dna-testim-section .dna-case-button:hover {
background: #ddbd8b;
border-color: #ddbd8b;
color: #171f38;
}
.dna-testim-section .dna-case-button:focus-visible {
outline: 3px solid #ddbd8b;
outline-offset: 4px;
}
.dna-case-button svg {
width: 22px;
height: 22px;
flex-shrink: 0;
}
/* --- SETAS CENTRALIZADAS --- */
.dna-testim-controls {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
gap: 25px;
margin-top: 30px;
}
.dna-arrow-btn {
background: transparent !important;
border: none !important;
border-radius: 0 !important;
padding: 7px !important;
margin: 0 !important;
box-shadow: none !important;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
width: 44px !important;
height: 44px !important;
box-sizing: border-box;
transition:
transform 0.2s ease,
opacity 0.2s ease;
}
.dna-arrow-btn:hover {
transform: scale(1.15);
opacity: 0.7;
}
.dna-arrow-btn:active {
transform: scale(0.95);
}
.dna-arrow-btn:focus-visible {
outline: 2px solid #2c3b69;
outline-offset: 3px;
}
.dna-arrow-btn img {
display: block;
width: 30px;
height: auto;
object-fit: contain;
}
.dna-arrow-left img {
transform: scaleX(-1);
}
/* --- POPUP --- */
.dna-case-dialog {
width: min(960px, calc(100vw - 32px));
max-width: none;
max-height: calc(100dvh - 32px);
margin: auto;
padding: 0;
border: 0;
border-radius: 16px;
background: #10172b;
color: #ffffff;
font-family: 'Poppins', sans-serif;
box-shadow: 0 24px 80px rgba(0, 0, 0, 0.4);
overflow: auto;
box-sizing: border-box;
}
.dna-case-dialog::backdrop {
background: rgba(5, 9, 20, 0.85);
}
.dna-case-dialog .dna-case-header {
display: flex;
align-items: center;
justify-content: flex-end;
gap: 16px;
padding: 4px 12px;
}
.dna-case-dialog .dna-case-close {
display: flex;
align-items: center;
justify-content: center;
flex: 0 0 40px;
width: 40px;
height: 40px;
margin: 0;
padding: 0;
border: 0;
border-radius: 8px;
background: transparent;
color: #ffffff;
font-size: 30px;
line-height: 1;
cursor: pointer;
box-shadow: none;
}
.dna-case-dialog .dna-case-close:hover {
background: rgba(255, 255, 255, 0.12);
}
.dna-case-dialog .dna-case-close:focus-visible {
outline: 2px solid #ddbd8b;
}
.dna-case-player {
width: 100%;
aspect-ratio: 16 / 9;
background: #000000;
}
.dna-case-player iframe {
display: block;
width: 100%;
height: 100%;
border: 0;
}
/* O contador aparece apenas no mobile. */
.dna-testim-count {
display: none;
}
/* --- MOBILE MAIS COMPACTO --- */
@media (max-width: 768px) {
.dna-testim-section {
padding: 16px;
}
.dna-testim-section .dna-testim-viewport {
-webkit-mask-image: none;
mask-image: none;
}
.dna-testim-section .dna-testim-track {
width: 100%;
gap: 16px;
align-items: stretch;
}
.dna-testim-section .dna-testim-card {
flex: 0 0 100%;
width: 100%;
min-width: 0;
max-width: none;
min-height: 0;
padding: 20px;
border-radius: 16px;
}
#dnaTrack .dna-card-logos {
height: 44px;
margin-bottom: 12px;
}
.dna-testim-section .dna-testim-title {
margin: 0 0 12px;
font-size: 18px;
font-weight: 600;
line-height: 1.3;
overflow-wrap: anywhere;
}
.dna-testim-section .dna-testim-text {
margin: 0 0 18px;
font-size: 13px;
font-weight: 400;
line-height: 1.55;
overflow-wrap: anywhere;
}
.dna-testim-section .dna-testim-author {
align-items: center;
gap: 10px;
}
.dna-testim-section .dna-testim-author img {
width: 36px;
height: 36px;
}
.dna-testim-section .dna-author-info {
min-width: 0;
flex: 1;
flex-direction: column;
gap: 3px;
font-size: 12px;
line-height: 1.4;
overflow-wrap: anywhere;
}
.dna-testim-section .dna-author-role {
font-size: 11.5px;
font-weight: 400;
line-height: 1.4;
}
.dna-testim-section .dna-case-button {
box-sizing: border-box;
width: 100%;
min-height: 44px;
margin-top: 14px;
padding: 10px 12px;
font-size: 13px;
}
.dna-testim-section .dna-testim-controls {
gap: 22px;
margin-top: 14px;
}
.dna-testim-section .dna-testim-count {
display: block;
margin: 6px 0 0;
color: #475569;
font-size: 12px;
font-weight: 500;
line-height: 1.5;
text-align: center;
}
}
@media (prefers-reduced-motion: reduce) {
.dna-testim-section {
--dna-duration: 0ms;
}
}
(() => {
function iniciarDepoimentos() {
const track = document.getElementById('dnaTrack');
const prevBtn = document.getElementById('dnaPrev');
const nextBtn = document.getElementById('dnaNext');
const dialog = document.getElementById('dnaCaseDialog');
const frame = document.getElementById('dnaCaseFrame');
const closeBtn = document.getElementById('dnaCaseClose');
const count = document.getElementById('dnaCount');
if (
!track ||
!prevBtn ||
!nextBtn ||
!dialog ||
!frame ||
!closeBtn ||
!count
) {
return;
}
if (track.dataset.initialized === 'true') return;
track.dataset.initialized = 'true';
const section = track.closest('.dna-testim-section');
const viewport = section.querySelector('.dna-testim-viewport');
const mobileQuery = window.matchMedia('(max-width: 768px)');
function obterPassoNavegacao() {
return mobileQuery.matches ? 1 : 2;
}
const depoimentos = [
{
id: "mrv",
empresa: "MRV",
logoDark: "https://dnadevendas.com.br/wp-content/uploads/2026/10/mrv.webp",
logoLight: "https://dnadevendas.com.br/wp-content/uploads/2026/10/MRV-branco.webp",
filterClass: "",
foto: "https://dnadevendas.com.br/wp-content/uploads/2026/10/Eduardo.png",
nome: "Eduardo Barreto",
cargo: "| Diretor Executivo de Comercial",
titulo: "Alta de 30% no VGV e recorde histórico de receita",
texto: "A DNA criou para a MRV o Projeto Acelera, muito mais que um modelo de gestão, um jeito de gerir o processo de Vendas. A DNA põe a mão na massa, vai fundo nos aspectos necessários. Tivemos 30% de crescimento do VGV, além da previsão de record histórico de receita líquida para o terceiro trimestre. Os resultados apareceram numericamente e estatisticamente, ficamos muito felizes com essa parceria.",
video: "https://www.youtube.com/watch?v=qCbvq_NRBsM"
},
{
id: "camil",
empresa: "Camil",
logoDark: "https://dnadevendas.com.br/wp-content/uploads/2026/11/Camil-cor.webp",
logoLight: "https://dnadevendas.com.br/wp-content/uploads/2026/11/Camil-branco.webp",
filterClass: "",
foto: "https://dnadevendas.com.br/wp-content/uploads/2026/11/Felipe-Camil.webp",
nome: "Felipe Mendes",
cargo: "| Gerente Regional de São Paulo",
titulo: "Capacitação comercial que supera expectativas",
texto: "Mais uma vez, a DNA de Vendas superou todas as nossas expectativas. Já tivemos outras oportunidades de participar de eventos e treinamentos junto com a nossa equipe, e essa experiência reforçou o valor da parceria. Agradecemos a participação e a colaboração de todo o time.",
video: "https://www.youtube.com/watch?v=V0suJife-0I"
},
{
id: "natura",
empresa: "Natura",
logoDark: "https://dnadevendas.com.br/wp-content/uploads/2026/11/Natura-cor.webp",
logoLight: "https://dnadevendas.com.br/wp-content/uploads/2026/11/Natura-branco.webp",
filterClass: "",
foto: "https://dnadevendas.com.br/wp-content/uploads/2026/11/Priscila-Natura.webp",
nome: "Priscila Izzo",
cargo: "| Coordenadora de Marketing de Relacionamento",
titulo: "Mais engajamento e motivação para fortalecer o time comercial",
texto: "A parceria com a DNA de Vendas trouxe novas reflexões e provocações sobre temas que nossos supervisores já conhecem. O trabalho reforçou o engajamento e a motivação da equipe, incentivando cada pessoa a fazer mais e melhor na rotina comercial.",
video: "https://www.youtube.com/watch?v=ysZWLvizZS4"
},
{
id: "jsl",
empresa: "JSL",
logoDark: "https://dnadevendas.com.br/wp-content/uploads/2026/11/JSL-cor.webp",
logoLight: "https://dnadevendas.com.br/wp-content/uploads/2026/11/JSL-Branco.webp",
filterClass: "",
foto: "https://dnadevendas.com.br/wp-content/uploads/2026/11/Leonardo-JSL.webp",
nome: "Leonardo Morgon",
cargo: "| Diretor de Novos Negócios",
titulo: "Um time comercial mais engajado e preparado para gerar valor ao cliente",
texto: "O workshop da DNA de Vendas trouxe novas ferramentas e um olhar mais estratégico para nossa atuação comercial. Revisitamos técnicas e reforçamos a importância de entender as necessidades de cada cliente para construir soluções que agreguem valor. Foi uma experiência enriquecedora, que fortaleceu o engajamento da equipe.",
video: "https://www.youtube.com/watch?v=DVQqDgeJDpo"
},
{
id: "medicalway",
empresa: "Medicalway",
logoDark: "https://dnadevendas.com.br/wp-content/uploads/2026/10/medicalway.webp",
logoLight: "https://dnadevendas.com.br/wp-content/uploads/2026/10/medicalway.webp",
filterClass: "filter-white",
foto: "https://dnadevendas.com.br/wp-content/uploads/2026/10/Antonio.png",
nome: "Antônio Mello",
cargo: "| CEO",
titulo: "Aumento de 30% no faturamento com forecast de crescimento em 6x",
texto: "Buscamos no mercado a melhor consultoria para reestruturar a equipe da Medicalway e chegamos na DNA de Vendas. A gente já teve um aumento de 30% no faturamento mas também teremos um crescimento a longo prazo, onde planejamos crescer 6x o faturamento atual. Nossa equipe é mais agressiva, mais controlada com dados, mais produtiva e com mais satisfação profissional.",
video: "https://youtu.be/n34WXfW7I4g"
},
{
id: "trisul",
empresa: "Trisul",
logoDark: "https://dnadevendas.com.br/wp-content/uploads/2026/11/trisul-cor.webp",
logoLight: "https://dnadevendas.com.br/wp-content/uploads/2026/11/trisul-branca.webp",
filterClass: "",
foto: "https://dnadevendas.com.br/wp-content/uploads/2026/11/Andre-trisul.webp",
nome: "André Quinzeiro",
cargo: "| Gerente de Coordenadores de Vendas",
titulo: "Vendas acima da projeção nos novos lançamentos",
texto: "Buscávamos uma empresa séria para capacitar nossos gestores e encontramos na DNA de Vendas a experiência de mercado e a abordagem dinâmica de que precisávamos. O treinamento entregou mais do que esperávamos e queremos construir uma parceria de longo prazo.",
video: "https://www.youtube.com/watch?v=wbbzHg5G5xs"
},
{
id: "allianca",
empresa: "Alliança",
logoDark: "https://dnadevendas.com.br/wp-content/uploads/2026/11/allianca-cor.webp",
logoLight: "https://dnadevendas.com.br/wp-content/uploads/2026/11/allianca-branca.webp",
filterClass: "",
foto: "https://dnadevendas.com.br/wp-content/uploads/2026/11/Mariana-Allianca.webp",
nome: "Mariana Indiani",
cargo: "| Gerente Executiva",
titulo: "Uma nova cultura comercial que já se reflete nas vendas",
texto: "Estamos transformando a forma como nossa liderança e nossa equipe enxergam vendas. A DNA de Vendas trouxe um conteúdo atual e uma linguagem próxima das pessoas, apoiando essa mudança e a preparação do time para oferecer o atendimento de excelência que nosso público merece.",
video: "https://www.youtube.com/watch?v=WwnnQbrw8Qg"
},
{
id: "moderna",
empresa: "Moderna",
logoDark: "https://dnadevendas.com.br/wp-content/uploads/2026/11/moderna-cor.webp",
logoLight: "https://dnadevendas.com.br/wp-content/uploads/2026/11/moderna-branca.webp",
filterClass: "",
foto: "https://dnadevendas.com.br/wp-content/uploads/2026/11/Mauricio-Moderna.webp",
nome: "Maurício Lufti",
cargo: "| Gerente Comercial",
titulo: "Engajamento que mobiliza o time comercial",
texto: "As dinâmicas conduzidas pela DNA de Vendas fizeram a diferença na nossa convenção. Foi possível perceber um engajamento real da equipe, com participação e envolvimento nas atividades. O trabalho conseguiu trazer a energia de que precisávamos para esse encontro.",
video: "https://www.youtube.com/watch?v=NivgjUQqEu0&t=98s"
},
{
id: "randon",
empresa: "Randon — Centro Oeste Implementos",
logoDark: "https://dnadevendas.com.br/wp-content/uploads/2026/11/randon-cor.webp",
logoLight: "https://dnadevendas.com.br/wp-content/uploads/2026/11/randon-branca.webp",
filterClass: "",
foto: "https://dnadevendas.com.br/wp-content/uploads/2026/11/Claudinei-randon.webp",
nome: "Claudinei Batista",
cargo: "| Coordenador de Consórcio",
titulo: "Mais protagonismo para transformar a cultura de vendas",
texto: "Encontramos na DNA de Vendas o que buscávamos: desenvolver uma cultura comercial mais proativa, com profissionais assumindo o protagonismo em vendas. O treinamento trouxe essa visão para nossa realidade e reforçou a responsabilidade de cada pessoa pelos resultados.",
video: "https://www.youtube.com/watch?v=MK3TGX8iG5s&t=49s"
},
{
id: "swile",
empresa: "Swile",
logoDark: "https://dnadevendas.com.br/wp-content/uploads/2026/11/Swile-cor.webp",
logoLight: "https://dnadevendas.com.br/wp-content/uploads/2026/11/Swile-branco.webp",
filterClass: "",
foto: "https://dnadevendas.com.br/wp-content/uploads/2026/11/Pedro-swile.webp",
nome: "Pedro Mauad",
cargo: "| Gestor Regional",
titulo: "Novas abordagens para criar conexões e vender melhor",
texto: "O treinamento da DNA de Vendas trouxe um olhar voltado à nossa performance comercial. Trabalhamos novas formas de abordagem e a importância de construir relacionamentos, ampliando nossa preparação para conversar com os clientes e aproveitar melhor as oportunidades nos eventos.",
video: "https://www.youtube.com/watch?v=W5dOjurkHVM&t=89s"
},
{
id: "messer",
empresa: "Messer",
logoDark: "https://dnadevendas.com.br/wp-content/uploads/2026/11/messer-cor.webp",
logoLight: "https://dnadevendas.com.br/wp-content/uploads/2026/11/messer-branca.webp",
filterClass: "",
foto: "https://dnadevendas.com.br/wp-content/uploads/2026/11/Kati-messer.webp",
nome: "Kati Torri",
cargo: "| Executiva de Marketing",
titulo: "200% de aumento nos resultados de marketing digital",
texto: "Com a DNA For Marketing, estruturamos nosso marketing digital e criamos uma sinergia entre as áreas de Marketing, BI, Segmentos e Vendas. Essa parceria trouxe um aumento de 200% nos resultados de marketing digital, com o apoio especializado de uma agência que entende nosso negócio.",
video: "https://www.youtube.com/watch?v=9UePwiVQSzY"
},
{
id: "flytour",
empresa: "Flytour",
logoDark: "https://dnadevendas.com.br/wp-content/uploads/2026/11/flytour-cor.webp",
logoLight: "https://dnadevendas.com.br/wp-content/uploads/2026/11/flytour-branca.webp",
filterClass: "",
foto: "https://dnadevendas.com.br/wp-content/uploads/2026/11/Sergio-Flytour.webp",
nome: "Sérgio Santana",
cargo: "| Gerente de Vendas",
titulo: "Processo comercial alinhado e recordes de vendas",
texto: "Precisávamos alinhar nossos executivos, padronizar a prospecção e capacitar também os gestores. Com a DNA de Vendas, estruturamos esse trabalho e colocamos os aprendizados em prática. Hoje, já colhemos resultados expressivos, com crescimento e recordes de vendas na nossa rede.",
video: "https://www.youtube.com/watch?v=nJiq-2qa0GY"
},
{
id: "eurochem",
empresa: "EuroChem",
logoDark: "https://dnadevendas.com.br/wp-content/uploads/2026/11/eurochem-cor.webp",
logoLight: "https://dnadevendas.com.br/wp-content/uploads/2026/11/eurochem-branca.webp",
filterClass: "",
foto: "https://dnadevendas.com.br/wp-content/uploads/2026/11/Gabriele-euro.webp",
nome: "Gabriele Oliveira",
cargo: "| Gerente de Desenvolvimento de Mercado",
titulo: "Um time técnico mais conectado à estratégia de vendas",
texto: "Nosso desafio era direcionar uma equipe com forte conhecimento agronômico para uma atuação mais comercial. A DNA de Vendas conectou o treinamento à nossa realidade e aos desafios do time, gerando mais coesão, alinhamento com a estratégia e foco nos resultados.",
video: "https://www.youtube.com/watch?v=QsFSCYRRYRI"
},
{
id: "brinox",
empresa: "Brinox",
logoDark: "https://dnadevendas.com.br/wp-content/uploads/2026/11/brinox-cor.webp",
logoLight: "https://dnadevendas.com.br/wp-content/uploads/2026/11/brinox-branco.webp",
filterClass: "",
foto: "https://dnadevendas.com.br/wp-content/uploads/2026/11/Paula-Brinox.webp",
nome: "Paula Massoud",
cargo: "| Gerente Comercial",
titulo: "Mais engajamento e tempo para liderar com estratégia",
texto: "A Certificação em Liderança da DNA de Vendas ampliou minha visão e melhorou minha comunicação com a equipe. Passei a usar a inteligência artificial para organizar planos de ação, feedbacks e reuniões. Ganhei tempo para atuar estrategicamente, e o time ficou mais engajado, com conversas mais produtivas e melhores entregas.",
video: "https://www.youtube.com/watch?v=zg51Qv03sX0"
}
];
const casos = new Map(
depoimentos.map(item => [item.id, item])
);
const escapar = valor => String(valor).replace(
/[&"']/g,
caractere => ({
'&': '&',
'': '>',
'"': '"',
"'": '''
}[caractere])
);
/* --- MONTA OS CARDS --- */
track.innerHTML = depoimentos.map((item, index) => `
${escapar(item.titulo)}
${escapar(item.texto)}
`).join('');
let isAnimating = false;
let gesture = null;
let ignoreClickUntil = 0;
let ultimoFoco = null;
let overflowAnterior = '';
let focarAposMovimento = false;
/* --- ATUALIZA CARD E CONTADOR --- */
function ativarCard(target) {
Array.from(track.children).forEach(card => {
const ativo = card === target;
card.classList.toggle('active', ativo);
card.setAttribute('aria-current', String(ativo));
card.tabIndex = ativo ? 0 : -1;
card.querySelector('.dna-case-button').tabIndex =
ativo ? 0 : -1;
});
const indice = depoimentos.findIndex(
item => item.id === target.dataset.company
);
count.textContent = `${indice + 1} de ${depoimentos.length}`;
}
function obterDuracao() {
const valor = getComputedStyle(section)
.getPropertyValue('--dna-duration')
.trim();
const numero = parseFloat(valor);
if (!Number.isFinite(numero)) return 600;
return valor.endsWith('ms') ? numero : numero * 1000;
}
function animarAte(posicao, concluir) {
const duracao = obterDuracao();
let terminou = false;
let timer;
function finalizar(event) {
if (
event &&
(
event.target !== track ||
event.propertyName !== 'transform'
)
) {
return;
}
if (terminou) return;
terminou = true;
clearTimeout(timer);
track.removeEventListener(
'transitionend',
finalizar
);
track.removeEventListener(
'transitioncancel',
finalizar
);
track.style.transition = 'none';
concluir();
viewport.scrollLeft = 0;
section.scrollLeft = 0;
void track.offsetWidth;
isAnimating = false;
if (focarAposMovimento) {
focarAposMovimento = false;
track.firstElementChild.focus({
preventScroll: true
});
}
}
if (duracao === 0) {
track.style.transition = 'none';
track.style.transform = `translateX(${posicao}px)`;
finalizar();
return;
}
track.addEventListener(
'transitionend',
finalizar
);
track.addEventListener(
'transitioncancel',
finalizar
);
track.style.transition =
`transform ${duracao}ms var(--dna-ease)`;
track.style.transform = `translateX(${posicao}px)`;
timer = setTimeout(finalizar, duracao + 100);
}
/* --- MOVIMENTAÇÃO --- */
function mover(passos) {
if (isAnimating || passos === 0) return;
const cards = Array.from(track.children);
const quantidade = Math.min(
Math.abs(passos),
cards.length - 1
);
if (quantidade 0) {
const target = cards[quantidade];
const distancia =
target.getBoundingClientRect().left -
cards[0].getBoundingClientRect().left;
ativarCard(target);
animarAte(-distancia, () => {
cards.slice(0, quantidade).forEach(card => {
track.appendChild(card);
});
track.style.transform = 'translateX(0)';
});
} else {
const anteriores = cards.slice(-quantidade);
const target = anteriores[0];
const primeiroAtual = cards[0];
track.style.transition = 'none';
track.prepend(...anteriores);
const distancia =
primeiroAtual.getBoundingClientRect().left -
target.getBoundingClientRect().left;
track.style.transform =
`translateX(-${distancia}px)`;
void track.offsetWidth;
ativarCard(target);
animarAte(0, () => {
track.style.transform = 'translateX(0)';
});
}
}
/* --- SETAS --- */
nextBtn.addEventListener('click', () => {
mover(obterPassoNavegacao());
});
prevBtn.addEventListener('click', () => {
mover(-obterPassoNavegacao());
});
function atualizarControles() {
const mobile = mobileQuery.matches;
prevBtn.setAttribute(
'aria-label',
mobile ? 'Voltar um depoimento' : 'Voltar dois depoimentos'
);
nextBtn.setAttribute(
'aria-label',
mobile ? 'Avançar um depoimento' : 'Avançar dois depoimentos'
);
gesture = null;
}
mobileQuery.addEventListener('change', atualizarControles);
atualizarControles();
ativarCard(track.firstElementChild);
function selecionarCard(card) {
if (
!card ||
!track.contains(card) ||
isAnimating
) {
return;
}
const index = Array.from(track.children).indexOf(card);
if (index > 0) mover(index);
}
/* --- ENDEREÇO DO VÍDEO --- */
function urlDoVideo(endereco) {
const url = new URL(endereco);
const id = url.hostname === 'youtu.be'
? url.pathname.split('/').filter(Boolean)[0]
: url.searchParams.get('v');
if (!id || !/^[A-Za-z0-9_-]{11}$/.test(id)) {
return null;
}
const tempo =
url.searchParams.get('t') ||
url.searchParams.get('start') ||
'0';
const partes = tempo.match(
/^(?:(\d+)h)?(?:(\d+)m)?(?:(\d+)s)?$/i
);
const inicio = /^\d+$/.test(tempo)
? Number(tempo)
: partes
? Number(partes[1] || 0) * 3600 +
Number(partes[2] || 0) * 60 +
Number(partes[3] || 0)
: 0;
const embed = new URL(
`https://www.youtube-nocookie.com/embed/${id}`
);
embed.searchParams.set('autoplay', '1');
embed.searchParams.set('rel', '0');
embed.searchParams.set('playsinline', '1');
if (inicio > 0) {
embed.searchParams.set('start', String(inicio));
}
return embed.href;
}
/* --- POPUP DO CASE --- */
function abrirCase(botao) {
const item = casos.get(botao.dataset.case);
if (!item || dialog.open) return;
const endereco = urlDoVideo(item.video);
if (!endereco) return;
gesture = null;
ultimoFoco = botao;
overflowAnterior = document.body.style.overflow;
dialog.setAttribute(
'aria-label',
`Vídeo do case de ${item.empresa}`
);
frame.title = `Case de ${item.empresa}`;
frame.src = endereco;
dialog.showModal();
document.body.style.overflow = 'hidden';
closeBtn.focus({ preventScroll: true });
}
closeBtn.addEventListener('click', () => {
dialog.close();
});
dialog.addEventListener('click', event => {
if (event.target !== dialog) return;
const rect = dialog.getBoundingClientRect();
const foraDoPopup =
event.clientX rect.right ||
event.clientY rect.bottom;
if (foraDoPopup) {
dialog.close();
}
});
dialog.addEventListener('close', () => {
frame.removeAttribute('src');
document.body.style.overflow = overflowAnterior;
if (ultimoFoco?.isConnected) {
ultimoFoco.focus({ preventScroll: true });
}
});
/* --- CLIQUES NOS CARDS --- */
track.addEventListener('click', event => {
if (performance.now() {
if (event.target.closest('button')) return;
if (
event.key === 'ArrowRight' ||
event.key === 'ArrowLeft'
) {
event.preventDefault();
if (!isAnimating) {
focarAposMovimento = true;
mover(
event.key === 'ArrowRight' ? 1 : -1
);
}
return;
}
if (
event.key !== 'Enter' &&
event.key !== ' '
) {
return;
}
const card = event.target.closest('.dna-testim-card');
if (!card) return;
event.preventDefault();
selecionarCard(card);
});
/* --- DESLIZAR COM O DEDO --- */
viewport.addEventListener('pointerdown', event => {
if (
isAnimating ||
dialog.open ||
event.isPrimary === false
) {
return;
}
if (
event.pointerType !== 'touch' &&
event.pointerType !== 'pen'
) {
return;
}
gesture = {
id: event.pointerId,
x: event.clientX,
y: event.clientY
};
}, { passive: true });
window.addEventListener('pointerup', event => {
if (
!gesture ||
gesture.id !== event.pointerId
) {
return;
}
const inicio = gesture;
gesture = null;
const dx = event.clientX - inicio.x;
const dy = event.clientY - inicio.y;
if (Math.abs(dx) 10) {
ignoreClickUntil = performance.now() + 400;
}
const limite = Math.min(
70,
viewport.clientWidth * 0.15
);
if (Math.abs(dx) >= limite) {
mover(
dx {
if (
gesture &&
gesture.id === event.pointerId
) {
gesture = null;
}
}, { passive: true });
}
if (document.readyState === 'loading') {
document.addEventListener(
'DOMContentLoaded',
iniciarDepoimentos,
{ once: true }
);
} else {
iniciarDepoimentos();
}
})();