Descrição
(55) 99960-2481 | (55) 3317-0129 | $(document).ready(function(){
// Toggle password functionality
$('[data-toggle-password-topo]').off('click.topoToggle').on('click.topoToggle', function() {
var container = $(this).closest('.password-toggle-topo-container');
var passwordInput = container.find('input[type="password"], input[type="text"]');
var showIcon = $(this).find('.show-password');
var hideIcon = $(this).find('.hide-password');
if (passwordInput.length) {
if (passwordInput.attr('type') === 'password') {
passwordInput.attr('type', 'text');
showIcon.hide();
hideIcon.show();
} else {
passwordInput.attr('type', 'password');
showIcon.show();
hideIcon.hide();
}
}
});
// Prevenir que o dropdown feche ao clicar no formulário
$('.dropdown-menu.dropdown-login').on('click', function(e) {
e.stopPropagation();
});
}); account_circle LOGIN account_circle lock Permanecer conectado Esqueceu a senha? ENTRAR ou Entrar com Chave de Segurança (function () {
var passkeyBtn = document.getElementById('btnPasskeyLoginTopo');
var status = document.getElementById('passkey-status-topo');
if (!passkeyBtn) return;
if (!window.PublicKeyCredential) {
passkeyBtn.disabled = true;
status.textContent = 'Passkey não suportada neste navegador.';
return;
}
passkeyBtn.addEventListener('click', async function () {
passkeyBtn.disabled = true;
status.className = 'text-center text-muted mt-2 mb-0';
status.textContent = 'Aguardando autenticador…';
try {
var optRes = await fetch('/arrematante/passkey/login/options', {
method: 'POST',
headers: { 'X-Requested-With': 'XMLHttpRequest' }
});
if (!optRes.ok) throw new Error('Falha ao obter opções.');
var args = await optRes.json();
var pubKey = args.publicKey;
pubKey.challenge = _b64ToBuffer(pubKey.challenge);
if (pubKey.allowCredentials) {
pubKey.allowCredentials = pubKey.allowCredentials.map(function (c) {
return Object.assign({}, c, { id: _b64ToBuffer(c.id) });
});
}
var assertion = await navigator.credentials.get({ publicKey: pubKey });
var body = {
id: assertion.id,
rawId: _bufToB64(assertion.rawId),
type: assertion.type,
response: {
clientDataJSON: _bufToB64(assertion.response.clientDataJSON),
authenticatorData: _bufToB64(assertion.response.authenticatorData),
signature: _bufToB64(assertion.response.signature),
userHandle: assertion.response.userHandle ? _bufToB64(assertion.response.userHandle) : null
}
};
var verRes = await fetch('/arrematante/passkey/login/verify', {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'X-Requested-With': 'XMLHttpRequest' },
body: JSON.stringify(body),
redirect: 'follow'
});
if (verRes.redirected) {
window.location.href = verRes.url;
return;
}
if (verRes.ok) {
window.location.href = '/arrematante/painel-controle';
return;
}
var err = await verRes.json().catch(function () { return {}; });
throw new Error(err.error || 'Falha na autenticação.');
} catch (e) {
status.className = 'text-center text-danger mt-2 mb-0';
status.textContent = e.name === 'NotAllowedError' ? 'Operação cancelada.' : (e.message || 'Erro.');
passkeyBtn.disabled = false;
}
});
function _b64ToBuffer(b64url) {
var b64 = b64url.replace(/-/g, '+').replace(/_/g, '/');
while (b64.length % 4) b64 += '=';
var bin = atob(b64);
var buf = new Uint8Array(bin.length);
for (var i = 0; i < bin.length; i++) buf[i] = bin.charCodeAt(i);
return buf.buffer;
}
function _bufToB64(buf) {
var bytes = new Uint8Array(buf);
var bin = '';
bytes.forEach(function (b) { bin += String.fromCharCode(b); });
return btoa(bin).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');
}
})(); CADASTRE-SE Santa Maria Leilões - Leilões Judiciais e Extrajudiciais Toggle navigation HOME LEILÕES VENDA DIRETA QUEM SOMOS QUERO VENDER CONTATO search IMÓVEIS 25 itens DIVERSOS 6 itens VEÍCULOS 6 itens EQUIPAMENTOS 5 itens MÁQUINAS 4 itens ELETRÔNICOS 3 itens ANIMAIS 0 itens ROUPAS E CALÇADOS 0 itens SUCATAS 0 itens /* Garantir que os botões do carrossel sejam sempre visíveis */
.carousel-btn {
display: flex !important;
position: absolute;
z-index: 1000;
background: rgba(255, 255, 255, 0.95) !important;
border: none !important;
border-radius: 50% !important;
width: 50px;
height: 50px;
align-items: center;
justify-content: center;
font-size: 20px;
color: #007bff !important;
cursor: pointer;
transition: all 0.3s ease;
box-shadow: 0 4px 15px rgba(0,0,0,0.15) !important;
}
.carousel-btn:hover {
background: white !important;
transform: scale(1.1);
box-shadow: 0 6px 20px rgba(0,0,0,0.2) !important;
}
.carousel-btn-prev {
left: 10px !important;
top: 50%;
transform: translateY(-50%);
}
.carousel-btn-next {
right: 10px !important;
top: 50%;
transform: translateY(-50%);
}
/* Garantir o posicionamento correto do wrapper */
.categoria-carousel-wrapper {
position: relative !important;
min-height: 120px;
} let currentPosition = 0;
let cardWidth = 0;
let visibleCards = 0;
let totalCards = 0;
function initCarousel() {
const container = document.getElementById('categoria-carousel');
const track = document.getElementById('carousel-track');
const cards = track ? track.querySelectorAll('.categoria-card') : [];
const prevBtn = document.querySelector('.carousel-btn-prev');
const nextBtn = document.querySelector('.carousel-btn-next');
if (!container || !track || cards.length === 0) {
console.log('Carrossel de categorias: Elementos não encontrados ou sem cards');
return;
}
// Resetar posição para o início
currentPosition = 0;
track.style.transform = 'translateX(0)';
totalCards = cards.length;
// Calcular dimensões considerando larguras variáveis dos cards
const containerWidth = container.offsetWidth;
// Calcular largura total necessária para todos os cards
let totalCardsWidth = 0;
let maxCardWidth = 0;
cards.forEach((card, index) => {
const cardStyle = getComputedStyle(card);
const cardWidth = card.offsetWidth + parseFloat(cardStyle.marginLeft) + parseFloat(cardStyle.marginRight);
totalCardsWidth += cardWidth;
maxCardWidth = Math.max(maxCardWidth, cardWidth);
// Para o gap entre os cards (15px conforme CSS)
if (index < cards.length - 1) {
totalCardsWidth += 15;
}
});
// Usar a maior largura de card como referência para navegação
cardWidth = maxCardWidth || 150; // fallback
// Calcular quantos cards cabem visualmente (mais conservador)
visibleCards = Math.floor(containerWidth / cardWidth);
// Verificar se o conteúdo transborda o container
const needsCarousel = totalCardsWidth > containerWidth;
// Sempre mostrar os botões inicialmente
if (prevBtn && nextBtn) {
prevBtn.style.display = 'flex';
nextBtn.style.display = 'flex';
// Verificar se realmente precisa dos botões baseado no overflow
if (!needsCarousel) {
// Se não transbordar, centralizar cards e desabilitar botões
track.style.justifyContent = 'center';
prevBtn.style.opacity = '0.3';
nextBtn.style.opacity = '0.3';
prevBtn.style.cursor = 'not-allowed';
nextBtn.style.cursor = 'not-allowed';
prevBtn.disabled = true;
nextBtn.disabled = true;
} else {
// Habilitar navegação
track.style.justifyContent = 'flex-start';
prevBtn.disabled = false;
nextBtn.disabled = false;
// Ajustar visibleCards baseado na necessidade real
visibleCards = Math.max(1, Math.floor(totalCards * containerWidth / totalCardsWidth));
}
}
updateButtonsState();
}
function scrollCarousel(direction) {
const track = document.getElementById('carousel-track');
const prevBtn = document.querySelector('.carousel-btn-prev');
const nextBtn = document.querySelector('.carousel-btn-next');
// Não fazer nada se os botões estão desabilitados
if ((direction === 'prev' && prevBtn && prevBtn.disabled) ||
(direction === 'next' && nextBtn && nextBtn.disabled)) {
return;
}
const maxPosition = Math.max(0, totalCards - visibleCards);
if (direction === 'next' && currentPosition < maxPosition) {
currentPosition++;
} else if (direction === 'prev' && currentPosition > 0) {
currentPosition--;
}
const translateX = -(currentPosition * cardWidth);
track.style.transform = `translateX(${translateX}px)`;
updateButtonsState();
}
function updateButtonsState() {
const prevBtn = document.querySelector('.carousel-btn-prev');
const nextBtn = document.querySelector('.carousel-btn-next');
const maxPosition = Math.max(0, totalCards - visibleCards);
if (prevBtn && nextBtn) {
// Se os botões estão desabilitados (sem necessidade de carrossel), não alterar estado
if (prevBtn.disabled) {
return;
}
// Atualizar estado dos botões baseado na posição atual
if (currentPosition === 0) {
prevBtn.style.opacity = '0.5';
prevBtn.style.cursor = 'not-allowed';
} else {
prevBtn.style.opacity = '1';
prevBtn.style.cursor = 'pointer';
}
if (currentPosition >= maxPosition) {
nextBtn.style.opacity = '0.5';
nextBtn.style.cursor = 'not-allowed';
} else {
nextBtn.style.opacity = '1';
nextBtn.style.cursor = 'pointer';
}
}
}
// Inicializar quando a página carregar
document.addEventListener('DOMContentLoaded', function() {
// Delay pequeno para garantir que os estilos CSS foram aplicados
setTimeout(initCarousel, 100);
});
// Garantir inicialização após carregamento completo
window.addEventListener('load', function() {
setTimeout(initCarousel, 200);
});
// Reinicializar no resize
window.addEventListener('resize', function() {
// Resetar para o início
currentPosition = 0;
const track = document.getElementById('carousel-track');
if (track) {
track.style.transform = 'translateX(0)';
track.style.justifyContent = 'flex-start';
}
// Resetar estado dos botões
const prevBtn = document.querySelector('.carousel-btn-prev');
const nextBtn = document.querySelector('.carousel-btn-next');
if (prevBtn && nextBtn) {
prevBtn.disabled = false;
nextBtn.disabled = false;
prevBtn.style.opacity = '1';
nextBtn.style.opacity = '1';
prevBtn.style.cursor = 'pointer';
nextBtn.style.cursor = 'pointer';
}
// Delay para garantir que as dimensões sejam recalculadas
setTimeout(initCarousel, 150);
Perguntas frequentes
Como funciona a compra deste terreno em leilão?
O imóvel é arrematado por quem der o maior lance, respeitado o lance mínimo do edital. Leia sempre o edital e a matrícula antes de dar lance: eles trazem as regras, os prazos, as dívidas que acompanham o imóvel e a situação de posse.
Quais custos existem além do valor do lance?
Além do lance, o arrematante costuma pagar comissão do leiloeiro (em geral 5%), ITBI, custas de registro e, dependendo do edital, IPTU e condomínio atrasados e a desocupação. Some tudo antes de definir seu lance máximo.
O imóvel pode estar ocupado?
Pode. O imóvel de leilão pode estar ocupado pelo antigo proprietário, por inquilino ou por terceiros. Quem ocupa muda o prazo e o custo da desocupação — verifique a situação de posse no edital antes de arrematar.