{"id":1957,"date":"2025-10-21T14:30:35","date_gmt":"2025-10-21T17:30:35","guid":{"rendered":"https:\/\/soudelos.com.br\/site\/?page_id=1957"},"modified":"2026-03-27T14:18:46","modified_gmt":"2026-03-27T17:18:46","slug":"imoveis","status":"publish","type":"page","link":"https:\/\/soudelos.com.br\/site\/index.php\/imoveis\/","title":{"rendered":"Im\u00f3veis"},"content":{"rendered":"<div id=\"pl-1957\"  class=\"panel-layout\" ><div id=\"pg-1957-0\"  class=\"panel-grid panel-has-style\" ><div class=\"siteorigin-panels-stretch panel-row-style panel-row-style-for-1957-0\" data-stretch-type=\"full-width-stretch\" data-overlay-opactity=\"1\" ><div id=\"pgc-1957-0-0\"  class=\"panel-grid-cell\" ><div id=\"panel-1957-0-0-0\" class=\"widget_text so-panel widget widget_custom_html panel-first-child\" data-index=\"0\" ><div class=\"textwidget custom-html-widget\"><section class=\"imoveis-section\">\n\n    <!-- HEADER -->\n    <div class=\"imoveis-header\">\n        <span class=\"section-subtitle\">EXCLUSIVIDADE E SOFISTICA\u00c7\u00c3O<\/span>\n        <h2>Nossos Im\u00f3veis<\/h2>\n        <p>Resid\u00eancias planejadas para quem busca o melhor da vida<\/p>\n    <\/div>\n\n    <!-- BARRA DE BUSCA -->\n    <div class=\"imoveis-searchbar\">\n        <div class=\"search-input\">\n            <i class=\"fas fa-search\"><\/i>\n            <input type=\"text\" id=\"searchInput\" placeholder=\"Buscar im\u00f3veis...\" \/>\n        <\/div>\n        <select id=\"citySelect\">\n            <option value=\"\">Cidade<\/option>\n            <option value=\"Jo\u00e3o Pessoa\">Jo\u00e3o Pessoa<\/option>\n            <option value=\"Miami\">Miami<\/option>\n        <\/select>\n        <select id=\"neighborhoodSelect\">\n            <option value=\"\">Bairro<\/option>\n            <option value=\"Altiplano\">Altiplano<\/option>\n            <option value=\"Cabo Branco\">Cabo Branco<\/option>\n            <option value=\"Bessa\">Bessa<\/option>\n            <option value=\"Mana\u00edra\">Mana\u00edra<\/option>\n            <option value=\"Tamba\u00fa\">Tamba\u00fa<\/option>\n            <option value=\"Miramar\">Miramar<\/option>\n            <option value=\"Brickell\">Brickell<\/option>\n        <\/select>\n        <select id=\"typeSelect\">\n            <option value=\"\">Tipo<\/option>\n            <option value=\"APARTAMENTO\">Apartamento<\/option>\n            <option value=\"CASA\">Casa<\/option>\n            <option value=\"STUDIO\">Studio<\/option>\n        <\/select>\n    <\/div>\n\n    <!-- TABS -->\n    <div class=\"imoveis-tabs\">\n        <button class=\"tab active\" data-tab=\"lancamentos\">Lan\u00e7amentos<\/button>\n        <button class=\"tab\" data-tab=\"vendas\">\u00c0 Venda<\/button>\n        <button class=\"tab\" data-tab=\"construcao\">Em Constru\u00e7\u00e3o<\/button>\n    <\/div>\n\n    <!-- CONTE\u00daDO REAL (JS) -->\n    <div id=\"realContent\" style=\"display:none\"><\/div>\n\n    <!-- SKELETON LOADING -->\n    <div id=\"skeletonGrid\" class=\"launch-grid\">\n        <div class=\"skeleton-card\"><\/div>\n        <div class=\"skeleton-card\"><\/div>\n        <div class=\"skeleton-card\"><\/div>\n        <div class=\"skeleton-card\"><\/div>\n        <div class=\"skeleton-card\"><\/div>\n        <div class=\"skeleton-card\"><\/div>\n    <\/div>\n\n<\/section>\n\n<script>\n    (function() {\n        'use strict';\n        \n        const CONFIG = {\n            apiUrl: 'https:\/\/soudelos.com.br\/site\/wp-json\/wp\/v2',\n            categoriaLancamentos: 33,\n            categoriaVendas: 43,     \n            cacheKey: 'delos_cache_v2',\n            cacheDuration: 10 * 60 * 1000, \n            fallbackImage: 'data:image\/svg+xml,%3Csvg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"384\" height=\"480\" viewBox=\"0 0 384 480\"%3E%3Crect width=\"384\" height=\"480\" fill=\"%23f0f0f0\"\/%3E%3Ctext x=\"50%25\" y=\"50%25\" font-family=\"Arial\" font-size=\"16\" text-anchor=\"middle\" fill=\"%23999\"%3EDelos Im\u00f3veis%3C\/text%3E%3C\/svg%3E',\n            imageWidth: 384,\n            imageHeight: 480\n        };\n        \n        \/\/ Estado da aplica\u00e7\u00e3o\n        let appData = { lancamentos: [], vendas: [] };\n        let filteredData = { lancamentos: [], vendas: [] };\n        \n        const cache = {\n            get() {\n                try {\n                    const cached = localStorage.getItem(CONFIG.cacheKey);\n                    if (!cached) return null;\n                    \n                    const { data, timestamp } = JSON.parse(cached);\n                    if (Date.now() - timestamp > CONFIG.cacheDuration) {\n                        localStorage.removeItem(CONFIG.cacheKey);\n                        return null;\n                    }\n                    return data;\n                } catch {\n                    return null;\n                }\n            },\n            \n            set(data) {\n                try {\n                    localStorage.setItem(CONFIG.cacheKey, JSON.stringify({\n                        data: data,\n                        timestamp: Date.now()\n                    }));\n                } catch (e) {\n                    console.warn('\u26a0\ufe0f Cache n\u00e3o salvo');\n                }\n            }\n        };\n        \n        \/\/ Fun\u00e7\u00e3o para ler par\u00e2metros da URL\n        function getUrlParameter(name) {\n            name = name.replace(\/[\\[]\/, '\\\\[').replace(\/[\\]]\/, '\\\\]');\n            var regex = new RegExp('[\\\\?&]' + name + '=([^&#]*)');\n            var results = regex.exec(location.search);\n            return results === null ? '' : decodeURIComponent(results[1].replace(\/\\+\/g, ' '));\n        }\n        \n        \/\/ Fun\u00e7\u00e3o para aplicar filtro da URL\n        function applyUrlFilter() {\n            const filtro = getUrlParameter('filtro');\n            \n            if (!filtro) return;\n            \n            console.log('Aplicando filtro da URL:', filtro);\n            \n            \/\/ Mapeia o filtro para o tipo correspondente\n            let tipoFiltro = '';\n            \n            switch(filtro.toLowerCase()) {\n                case 'apartamento':\n                    tipoFiltro = 'APARTAMENTO';\n                    break;\n                case 'casa':\n                    tipoFiltro = 'CASA';\n                    break;\n                case 'studio':\n                    tipoFiltro = 'STUDIO';\n                    break;\n                case 'lancamento':\n                    \/\/ Ativa a aba de lan\u00e7amentos\n                    setTimeout(() => {\n                        const lancamentosTab = document.querySelector('.tab[data-tab=\"lancamentos\"]');\n                        if (lancamentosTab) {\n                            lancamentosTab.click();\n                        }\n                    }, 500);\n                    return;\n                case 'investimento':\n                    \/\/ Para investimentos, ativa a aba de vendas\n                    setTimeout(() => {\n                        const vendasTab = document.querySelector('.tab[data-tab=\"vendas\"]');\n                        if (vendasTab) {\n                            vendasTab.click();\n                        }\n                    }, 500);\n                    return;\n            }\n            \n            \/\/ Se for um tipo espec\u00edfico, aplica no select\n            if (tipoFiltro) {\n                \/\/ Pequeno delay para garantir que o select existe\n                setTimeout(() => {\n                    const typeSelect = document.getElementById('typeSelect');\n                    if (typeSelect) {\n                        typeSelect.value = tipoFiltro;\n                        \n                        \/\/ Dispara o evento de change para aplicar o filtro\n                        const event = new Event('change', { bubbles: true });\n                        typeSelect.dispatchEvent(event);\n                        \n                        \/\/ Mostra um indicador visual\n                        mostrarIndicadorFiltro(filtro);\n                    }\n                }, 500);\n            }\n        }\n        \n        \/\/ Fun\u00e7\u00e3o para mostrar indicador visual do filtro ativo\n        function mostrarIndicadorFiltro(filtro) {\n            const filtrosAtivos = document.querySelectorAll('.active-filters');\n            filtrosAtivos.forEach(el => {\n                el.innerHTML = `\n                    <span class=\"filtro-ativo-indicator\">\n                        <i class=\"fas fa-filter\"><\/i> Filtrando: ${filtro}\n                        <button onclick=\"window.location.href=window.location.pathname\">Limpar filtro<\/button>\n                    <\/span>\n                `;\n            });\n        }\n        \n        setTimeout(() => {\n            init();\n        }, 10);\n        \n        async function init() {\n            try {\n                const cached = cache.get();\n                if (cached) {\n                    appData = cached;\n                    filteredData = { lancamentos: [...cached.lancamentos], vendas: [...cached.vendas] };\n                    renderContent(cached);\n                    loadFullStyles();\n                    setupEventListeners();\n                    applyUrlFilter(); \/\/ Aplica filtro da URL ap\u00f3s renderizar\n                    return;\n                }\n                \n                const [lancamentos, vendas] = await Promise.all([\n                    fetchPostsByCategory(CONFIG.categoriaLancamentos, 'LAN\u00c7AMENTO'),\n                    fetchPostsByCategory(CONFIG.categoriaVendas, 'VENDA')\n                ]);\n                \n                appData = { lancamentos, vendas };\n                filteredData = { lancamentos: [...lancamentos], vendas: [...vendas] };\n                \n                cache.set(appData);\n                renderContent(appData);\n                loadFullStyles();\n                setupEventListeners();\n                applyUrlFilter(); \/\/ Aplica filtro da URL ap\u00f3s renderizar\n                \n            } catch (error) {\n                console.error('\u274c Erro:', error);\n                showError();\n            }\n        }\n        \n        async function fetchPostsByCategory(categoryId, tipo) {\n            try {\n                const response = await fetch(\n                    `${CONFIG.apiUrl}\/posts?categories=${categoryId}&per_page=20&_embed`\n                );\n                \n                if (!response.ok) throw new Error(`HTTP ${response.status}`);\n                \n                const posts = await response.json();\n                \n                return posts.map(post => ({\n                    id: post.id,\n                    title: cleanText(post.title?.rendered || 'Im\u00f3vel'),\n                    excerpt: cleanText(post.excerpt?.rendered || post.content?.rendered || '').substring(0, 120) + '...',\n                    image: extractImage(post),\n                    type: extractType(post),\n                    status: tipo,\n                    location: extractLocation(post),\n                    city: extractCity(post),\n                    neighborhood: extractNeighborhood(post),\n                    price: extractPrice(post, tipo),\n                    features: extractFeatures(post, tipo),\n                    link: post.link\n                }));\n                \n            } catch (error) {\n                console.warn(`\u26a0\ufe0f Erro na categoria ${categoryId}:`, error);\n                return [];\n            }\n        }\n        \n        function extractImage(post) {\n            if (post._embedded?.['wp:featuredmedia']?.[0]?.source_url) {\n                let imageUrl = post._embedded['wp:featuredmedia'][0].source_url;\n                if (imageUrl.includes('wp-content')) {\n                    imageUrl = imageUrl.replace(\/-(\\d+)x(\\d+)(?=\\.\\w+)\/, '');\n                }\n                return imageUrl;\n            }\n            \n            const imgMatch = post.content?.rendered?.match(\/<img[^>]+src=\"([^\">]+)\"\/);\n            return imgMatch?.[1] || CONFIG.fallbackImage;\n        }\n        \n        function extractCity(post) {\n            const content = post.content?.rendered || '';\n            \n            const cityMatch = content.match(\/Cidade<\\\/div>\\s*<div[^>]*>([^<]+)<\\\/div>\/i);\n            if (cityMatch && cityMatch[1]) {\n                return cityMatch[1].trim();\n            }\n            \n            if (content.includes('Jo\u00e3o Pessoa')) return 'Jo\u00e3o Pessoa';\n            if (content.includes('Miami')) return 'Miami';\n            \n            return 'Jo\u00e3o Pessoa';\n        }\n        \n        function extractNeighborhood(post) {\n            const content = post.content?.rendered || '';\n            \n            const neighborhoodMatch = content.match(\/Bairro<\\\/div>\\s*<div[^>]*>([^<]+)<\\\/div>\/i);\n            if (neighborhoodMatch && neighborhoodMatch[1]) {\n                return neighborhoodMatch[1].trim();\n            }\n            \n            const bairros = ['Altiplano', 'Cabo Branco', 'Bessa', 'Mana\u00edra', 'Tamba\u00fa', 'Miramar', 'Brickell'];\n            for (const bairro of bairros) {\n                if (content.includes(bairro)) {\n                    return bairro;\n                }\n            }\n            \n            return '';\n        }\n        \n        function extractType(post) {\n            const content = post.content?.rendered || '';\n            \n            const typeMatch = content.match(\/Tipo<\\\/div>\\s*<div[^>]*>.*?<span[^>]*>([^<]+)<\\\/span>\/i);\n            if (typeMatch && typeMatch[1]) {\n                const type = typeMatch[1].trim().toUpperCase();\n                if (type.includes('APARTAMENTO')) return 'APARTAMENTO';\n                if (type.includes('CASA')) return 'CASA';\n                if (type.includes('STUDIO')) return 'STUDIO';\n                return type;\n            }\n            \n            const title = (post.title?.rendered || '').toLowerCase();\n            if (content.includes('apartamento') || title.includes('apartamento')) return 'APARTAMENTO';\n            if (content.includes('casa') || title.includes('casa')) return 'CASA';\n            if (content.includes('studio') || title.includes('studio')) return 'STUDIO';\n            \n            return 'APARTAMENTO';\n        }\n        \n        function extractLocation(post) {\n            const content = (post.content?.rendered || '').toLowerCase();\n            \n            const bairros = {\n                'bessa': 'Bessa, Jo\u00e3o Pessoa\/PB',\n                'mana\u00edra': 'Mana\u00edra, Jo\u00e3o Pessoa\/PB',\n                'tamba\u00fa': 'Tamba\u00fa, Jo\u00e3o Pessoa\/PB',\n                'miramar': 'Miramar, Jo\u00e3o Pessoa\/PB',\n                'altiplano': 'Altiplano, Jo\u00e3o Pessoa\/PB',\n                'cabo branco': 'Cabo Branco, Jo\u00e3o Pessoa\/PB',\n                'cabedelo': 'Cabedelo\/PB',\n                'brickell': 'Brickell, Miami\/FL',\n                'miami': 'Miami\/FL'\n            };\n            \n            for (const [bairro, localizacao] of Object.entries(bairros)) {\n                if (content.includes(bairro)) {\n                    return localizacao;\n                }\n            }\n            \n            return 'Jo\u00e3o Pessoa\/PB';\n        }\n        \n        function extractPrice(post, tipo) {\n            if (tipo === 'LAN\u00c7AMENTO') {\n                return 'Sob consulta';\n            }\n            \n            const content = post.content?.rendered || '';\n            \n            \/\/ Procura por pre\u00e7os no formato brasileiro: R$ 1.234.567,89\n            const priceMatch = content.match(\/R\\$\\s*((?:\\d{1,3}\\.)*\\d{1,3},\\d{2})\/i);\n            \n            if (priceMatch) {\n                let valorStr = priceMatch[1];\n                let semPontos = valorStr.replace(\/\\.\/g, '');\n                let valorNumerico = semPontos.replace(',', '.');\n                let valor = parseFloat(valorNumerico);\n                \n                if (!isNaN(valor)) {\n                    return valor.toLocaleString('pt-BR', {\n                        style: 'currency',\n                        currency: 'BRL',\n                        minimumFractionDigits: 2,\n                        maximumFractionDigits: 2\n                    });\n                }\n            }\n            \n            const fallbackMatch = content.match(\/R\\$\\s*([\\d\\.,]+)\/i);\n            if (fallbackMatch) {\n                let valorStr = fallbackMatch[1];\n                valorStr = valorStr.replace(\/[^\\d.,]\/g, '');\n                \n                if (valorStr.includes(',') && valorStr.includes('.')) {\n                    valorStr = valorStr.replace(\/\\.\/g, '').replace(',', '.');\n                } else if (valorStr.includes(',') && !valorStr.includes('.')) {\n                    valorStr = valorStr.replace(',', '.');\n                } else if (valorStr.includes('.') && !valorStr.includes(',')) {\n                    const parts = valorStr.split('.');\n                    if (parts.length === 3) {\n                        valorStr = valorStr.replace(\/\\.\/g, '');\n                    }\n                }\n                \n                let valor = parseFloat(valorStr);\n                \n                if (!isNaN(valor)) {\n                    return valor.toLocaleString('pt-BR', {\n                        style: 'currency',\n                        currency: 'BRL',\n                        minimumFractionDigits: 2,\n                        maximumFractionDigits: 2\n                    });\n                }\n            }\n            \n            return 'Sob consulta';\n        }\n        \n        function extractFeatures(post, tipo) {\n            const content = (post.content?.rendered || '').toLowerCase();\n            const features = {};\n            \n            if (tipo === 'LAN\u00c7AMENTO') {\n                return features;\n            }\n            \n            const areaMatch = content.match(\/(\\d+)\\s*m\u00b2\/);\n            if (areaMatch) features.area = `${areaMatch[1]}m\u00b2`;\n            \n            const quartosMatch = content.match(\/(\\d+)(?:\\s*-\\s*(\\d+))?\\s*quartos?\/i);\n            if (quartosMatch) {\n                if (quartosMatch[2]) {\n                    features.quartos = `${quartosMatch[1]}-${quartosMatch[2]}`;\n                } else {\n                    features.quartos = quartosMatch[1];\n                }\n            }\n            \n            const vagasMatch = content.match(\/(\\d+)(?:\\s*-\\s*(\\d+))?\\s*vagas?\/i);\n            if (vagasMatch) {\n                if (vagasMatch[2]) {\n                    features.vagas = `${vagasMatch[1]}-${vagasMatch[2]}`;\n                } else {\n                    features.vagas = vagasMatch[1];\n                }\n            }\n            \n            return features;\n        }\n        \n        function cleanText(text) {\n            return text.replace(\/<[^>]+>\/g, '').trim();\n        }\n        \n        function renderContent(data) {\n            const realContent = document.getElementById('realContent');\n            const filtro = getUrlParameter('filtro');\n            const filtroMensagem = filtro ? `\n                <span class=\"filtro-ativo-indicator\">\n                    <i class=\"fas fa-filter\"><\/i> Filtrando: ${filtro}\n                    <button onclick=\"window.location.href=window.location.pathname\">Limpar filtro<\/button>\n                <\/span>\n            ` : '';\n            \n            realContent.innerHTML = `\n                <div class=\"section active\" id=\"lancamentosSection\">\n                    <div class=\"results-section\">\n                        <div class=\"results-count\">${data.lancamentos.length} lan\u00e7amentos exclusivos<\/div>\n                        <span class=\"active-filters\" id=\"lancamentosFilters\">${filtroMensagem}<\/span>\n                    <\/div>\n                    <div class=\"launch-grid\" id=\"lancamentosGrid\">\n                        ${renderCards(data.lancamentos, 'lancamento')}\n                    <\/div>\n                <\/div>\n                \n                <div class=\"section\" id=\"vendasSection\" style=\"display: none;\">\n                    <div class=\"results-section\">\n                        <div class=\"results-count\">${data.vendas.length} im\u00f3veis dispon\u00edveis<\/div>\n                        <span class=\"active-filters\" id=\"vendasFilters\">${filtroMensagem}<\/span>\n                    <\/div>\n                    <div class=\"launch-grid\" id=\"vendasGrid\">\n                        ${renderCards(data.vendas, 'venda')}\n                    <\/div>\n                <\/div>\n                <div class=\"section\" id=\"construcaoSection\" style=\"display: none;\">\n                    <div class=\"results-section\">\n                        <div class=\"results-count\">0 obras em constru\u00e7\u00e3o<\/div>\n                    <\/div>\n                    <div class=\"no-results\">\n                        <i class=\"fas fa-hard-hat\"><\/i>\n                        <h3>Em breve<\/h3>\n                        <p>Novos empreendimentos em constru\u00e7\u00e3o ser\u00e3o anunciados em breve<\/p>\n                    <\/div>\n                <\/div>\n            `;\n\n            realContent.style.display = 'block';\n            document.getElementById('skeletonGrid').style.display = 'none';\n            \n            setupTabs();\n        }\n        \n        function renderCards(imoveis, tipo) {\n            if (imoveis.length === 0) {\n                return `<div class=\"no-results\">Nenhum im\u00f3vel encontrado<\/div>`;\n            }\n            \n            return imoveis.map(imovel => `\n                <div class=\"launch-card ${tipo === 'lancamento' ? 'lancamento-card' : 'venda-card'}\" onclick=\"window.open('${imovel.link}', '_blank')\">\n                    <div class=\"launch-image-container\">\n                        <div class=\"launch-badge ${tipo === 'lancamento' ? 'lancamento' : 'venda'}\">${imovel.status}<\/div>\n                        <img decoding=\"async\" src=\"${imovel.image}\" \n                             alt=\"${imovel.title}\" \n                             class=\"launch-image\" \n                             width=\"${CONFIG.imageWidth}\"\n                             height=\"${CONFIG.imageHeight}\"\n                             loading=\"eager\"\n                             onerror=\"this.src='${CONFIG.fallbackImage}'; this.onerror=null;\">\n                    <\/div>\n                    <div class=\"launch-content\">\n                        <div class=\"launch-type\">${imovel.type}<\/div>\n                        <h3 class=\"launch-name\">${imovel.title}<\/h3>\n                        <div class=\"launch-location\">\n                            <i class=\"fas fa-map-marker-alt\"><\/i> ${imovel.location}\n                        <\/div>\n                        <p class=\"launch-description\">${imovel.excerpt}<\/p>\n                        \n                        ${tipo === 'venda' && Object.keys(imovel.features).length > 0 ? `\n                            <div class=\"property-features\">\n                                ${Object.entries(imovel.features).map(([key, value]) => `\n                                    <div class=\"feature-item\">\n                                        <span class=\"feature-label\">${key === 'area' ? '\u00c1rea \u00fatil' : \n                                                                      key === 'quartos' ? 'Quartos' : \n                                                                      key === 'vagas' ? 'Vagas' : key}<\/span>\n                                        <span class=\"feature-value\">${value}<\/span>\n                                    <\/div>\n                                `).join('')}\n                            <\/div>\n                        ` : ''}\n                        \n                        <div class=\"price-footer\">\n                            <div class=\"${tipo === 'lancamento' ? 'launch-price' : 'sale-price'}\">\n                                ${imovel.price}\n                            <\/div>\n                        <\/div>\n                    <\/div>\n                <\/div>\n            `).join('');\n        }\n        \n        function setupTabs() {\n            const tabs = document.querySelectorAll('.tab');\n            const sections = ['lancamentosSection', 'vendasSection', 'construcaoSection'];\n            \n            tabs.forEach((tab, index) => {\n                tab.addEventListener('click', () => {\n                    tabs.forEach(t => t.classList.remove('active'));\n                    tab.classList.add('active');\n                    sections.forEach((sectionId, i) => {\n                        const section = document.getElementById(sectionId);\n                        if (section) {\n                            section.style.display = i === index ? 'block' : 'none';\n                        }\n                    });\n                    applyFilters();\n                });\n            });\n        }\n        \n        function setupEventListeners() {\n            const searchInput = document.getElementById('searchInput');\n            const citySelect = document.getElementById('citySelect');\n            const neighborhoodSelect = document.getElementById('neighborhoodSelect');\n            const typeSelect = document.getElementById('typeSelect');\n            \n            function applyFilters() {\n                const searchTerm = searchInput?.value.toLowerCase() || '';\n                const city = citySelect?.value || '';\n                const neighborhood = neighborhoodSelect?.value || '';\n                const type = typeSelect?.value || '';\n                \n                filteredData.lancamentos = appData.lancamentos.filter(imovel => {\n                    return filterImovel(imovel, searchTerm, city, neighborhood, type);\n                });\n                \n                filteredData.vendas = appData.vendas.filter(imovel => {\n                    return filterImovel(imovel, searchTerm, city, neighborhood, type);\n                });\n                \n                updateGrids();\n            }\n            \n            function filterImovel(imovel, searchTerm, city, neighborhood, type) {\n                if (type && imovel.type !== type) return false;\n                if (city && !imovel.location.toLowerCase().includes(city.toLowerCase())) return false;\n                if (neighborhood && !imovel.location.toLowerCase().includes(neighborhood.toLowerCase())) return false;\n                \n                if (searchTerm) {\n                    const searchableText = `${imovel.title} ${imovel.location} ${imovel.type}`.toLowerCase();\n                    if (!searchableText.includes(searchTerm)) return false;\n                }\n                \n                return true;\n            }\n            \n            function updateGrids() {\n                const lancamentosGrid = document.getElementById('lancamentosGrid');\n                const vendasGrid = document.getElementById('vendasGrid');\n                const lancamentosCount = document.querySelector('#lancamentosSection .results-count');\n                const vendasCount = document.querySelector('#vendasSection .results-count');\n                \n                if (lancamentosGrid) {\n                    lancamentosGrid.innerHTML = renderCards(filteredData.lancamentos, 'lancamento');\n                    if (lancamentosCount) {\n                        lancamentosCount.textContent = `${filteredData.lancamentos.length} lan\u00e7amentos exclusivos`;\n                    }\n                }\n                \n                if (vendasGrid) {\n                    vendasGrid.innerHTML = renderCards(filteredData.vendas, 'venda');\n                    if (vendasCount) {\n                        vendasCount.textContent = `${filteredData.vendas.length} im\u00f3veis dispon\u00edveis`;\n                    }\n                }\n            }\n            \n            let timeout;\n            const debouncedApplyFilters = () => {\n                clearTimeout(timeout);\n                timeout = setTimeout(applyFilters, 300);\n            };\n            \n            if (searchInput) searchInput.addEventListener('input', debouncedApplyFilters);\n            if (citySelect) citySelect.addEventListener('change', applyFilters);\n            if (neighborhoodSelect) neighborhoodSelect.addEventListener('change', applyFilters);\n            if (typeSelect) typeSelect.addEventListener('change', applyFilters);\n        }\n        \n        function loadFullStyles() {\n            const styles = `\n                .section { animation: fadeIn 0.3s ease; }\n                \n                @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }\n                \n                .no-results {\n                    text-align: center;\n                    padding: 60px 40px;\n                    background: white;\n                    border-radius: 20px;\n                    box-shadow: 0 10px 30px rgba(12, 49, 104, 0.05);\n                    grid-column: 1 \/ -1;\n                }\n                \n                .no-results i {\n                    font-size: 48px;\n                    color: #CBD5E0;\n                    margin-bottom: 20px;\n                }\n                \n                .no-results h3 {\n                    color: #0C3168;\n                    margin-bottom: 10px;\n                    font-size: 20px;\n                    font-weight: 500;\n                }\n                \n                .no-results p {\n                    color: #718096;\n                    font-size: 14px;\n                }\n                \n                .filtro-ativo-indicator {\n                    background: #0C3168;\n                    color: white;\n                    padding: 8px 16px;\n                    border-radius: 50px;\n                    font-size: 13px;\n                    display: inline-flex;\n                    align-items: center;\n                    gap: 8px;\n                }\n                \n                .filtro-ativo-indicator i {\n                    font-size: 14px;\n                }\n                \n                .filtro-ativo-indicator button {\n                    background: rgba(255,255,255,0.2);\n                    border: none;\n                    color: white;\n                    padding: 4px 8px;\n                    border-radius: 50px;\n                    cursor: pointer;\n                    font-size: 12px;\n                    transition: all 0.3s ease;\n                    font-family: inherit;\n                }\n                \n                .filtro-ativo-indicator button:hover {\n                    background: rgba(255,255,255,0.3);\n                }\n                \n                .active-filters {\n                    color: #0C3168;\n                    font-size: 14px;\n                }\n            `;\n            \n            const styleEl = document.createElement('style');\n            styleEl.textContent = styles;\n            document.head.appendChild(styleEl);\n        }\n        \n        function showError() {\n            document.getElementById('skeletonGrid').innerHTML = `\n                <div style=\"grid-column: 1\/-1; text-align: center; padding: 60px;\">\n                    <div style=\"color: #C53030; margin-bottom: 20px;\">\n                        <i class=\"fas fa-exclamation-triangle\" style=\"font-size: 3rem;\"><\/i>\n                    <\/div>\n                    <h3 style=\"color: #0C3168; margin-bottom: 10px; font-weight: 500;\">Erro ao carregar<\/h3>\n                    <p style=\"color: #718096; margin-bottom: 20px;\">Tente recarregar a p\u00e1gina<\/p>\n                    <button onclick=\"window.location.reload()\" style=\"\n                        background: #0C3168; \n                        color: white; \n                        border: none; \n                        padding: 12px 24px; \n                        border-radius: 50px; \n                        cursor: pointer;\n                        font-weight: 500;\n                        font-size: 14px;\n                        transition: all 0.3s ease;\n                    \"\n                    onmouseover=\"this.style.background='#08234b'; this.style.transform='translateY(-2px)';\"\n                    onmouseout=\"this.style.background='#0C3168'; this.style.transform='translateY(0)';\">\n                        <i class=\"fas fa-redo\"><\/i> Recarregar\n                    <\/button>\n                <\/div>\n            `;\n        }\n    })();\n<\/script>\n\n<style>\n\n\/* ============================= *\/\n\/* SE\u00c7\u00c3O PRINCIPAL - ELEG\u00c2NCIA *\/\n\/* ============================= *\/\n\n.imoveis-section {\n    background: #e6f0fa;\n    padding: 90px 20px;\n    font-family: 'Lato', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Arial, sans-serif;\n}\n\n\/* ============================= *\/\n\/* HEADER SOFISTICADO *\/\n\/* ============================= *\/\n\n.imoveis-header {\n    text-align: center;\n    margin-bottom: 45px;\n    max-width: 800px;\n    margin-left: auto;\n    margin-right: auto;\n}\n\n.section-subtitle {\n    display: block;\n    font-size: 12px;\n    letter-spacing: 3px;\n    color: #0C3168;\n    text-transform: uppercase;\n    font-weight: 600;\n    margin-bottom: 15px;\n}\n\n.imoveis-header h2 {\n    font-size: 42px;\n    font-weight: 300;\n    color: #0C3168;\n    margin: 0 0 12px 0;\n    letter-spacing: -0.02em;\n    line-height: 1.1;\n}\n\n.imoveis-header p {\n    color: #4a6a8a;\n    font-size: 16px;\n    margin: 0;\n}\n\n\/* ============================= *\/\n\/* SEARCH BAR REFINADA *\/\n\/* ============================= *\/\n\n.imoveis-searchbar {\n    max-width: 1200px;\n    margin: 0 auto 40px;\n    display: flex;\n    gap: 12px;\n    background: white;\n    padding: 16px;\n    border-radius: 60px;\n    flex-wrap: wrap;\n    box-shadow: 0 15px 35px rgba(12, 49, 104, 0.08);\n    border: 1px solid rgba(12, 49, 104, 0.1);\n}\n\n.search-input {\n    flex: 1;\n    display: flex;\n    align-items: center;\n    background: #f8faff;\n    border-radius: 50px;\n    padding: 10px 18px;\n}\n\n.search-input i {\n    color: #0C3168;\n    margin-right: 10px;\n    font-size: 16px;\n    opacity: 0.6;\n}\n\n.search-input input {\n    border: none;\n    outline: none;\n    width: 100%;\n    font-size: 14px;\n    background: transparent;\n    color: #2b2b2b !important;\n}\n\n.search-input input::placeholder {\n    color: #8a9bb5 !important;\n    font-weight: 300;\n}\n\n.imoveis-searchbar select {\n    border: none;\n    background: #f8faff;\n    padding: 10px 18px;\n    border-radius: 50px;\n    min-width: 120px;\n    color: #0C3168 !important;\n    font-size: 14px;\n    cursor: pointer;\n    outline: none;\n    transition: all 0.2s ease;\n}\n\n.imoveis-searchbar select:hover {\n    background: #edf2fa;\n}\n\n\/* ============================= *\/\n\/* TABS ELEGANTES *\/\n\/* ============================= *\/\n\n.imoveis-tabs {\n    display: flex;\n    justify-content: center;\n    gap: 8px;\n    margin-bottom: 45px;\n}\n\n.imoveis-section .tab {\n    padding: 12px 28px;\n    border-radius: 50px;\n    border: none;\n    background: white;\n    cursor: pointer;\n    transition: all 0.3s ease;\n    color: #4a6a8a !important;\n    font-weight: 500;\n    font-size: 14px;\n    letter-spacing: 0.3px;\n    box-shadow: 0 2px 8px rgba(12, 49, 104, 0.03);\n}\n\n.imoveis-section .tab:hover {\n    background: #f8faff;\n    color: #0C3168 !important;\n    transform: translateY(-2px);\n    box-shadow: 0 8px 20px rgba(12, 49, 104, 0.08);\n}\n\n.imoveis-section .tab.active {\n    background: #0C3168;\n    color: #ffffff !important;\n    box-shadow: 0 10px 25px rgba(12, 49, 104, 0.2);\n}\n\n\/* ============================= *\/\n\/* RESULTADOS SECTION *\/\n\/* ============================= *\/\n\n.imoveis-section .results-section {\n    display: flex;\n    justify-content: space-between;\n    align-items: center;\n    margin-bottom: 30px;\n    padding: 20px 25px;\n    background: white;\n    border-radius: 20px;\n    box-shadow: 0 5px 20px rgba(12, 49, 104, 0.03);\n    flex-wrap: wrap;\n    gap: 15px;\n    border: 1px solid rgba(12, 49, 104, 0.05);\n}\n\n.imoveis-section .results-count {\n    font-size: 15px;\n    color: #0C3168 !important;\n    font-weight: 500;\n    letter-spacing: 0.2px;\n}\n\n\/* ============================= *\/\n\/* GRID - CARDS COM IMAGENS 384x480 *\/\n\/* ============================= *\/\n\n.launch-grid {\n    display: grid;\n    grid-template-columns: repeat(auto-fit, minmax(384px, max-content));\n    gap: 35px;\n    justify-content: center;\n}\n\n\/* ============================= *\/\n\/* CARD PRINCIPAL - BASE *\/\n\/* ============================= *\/\n\n.launch-card {\n    background: white;\n    border-radius: 24px;\n    overflow: hidden;\n    box-shadow: 0 15px 35px rgba(12, 49, 104, 0.05);\n    transition: all 0.4s cubic-bezier(0.165, 0.84, 0.44, 1);\n    cursor: pointer;\n    border: 1px solid rgba(12, 49, 104, 0.08);\n    position: relative;\n    display: flex;\n    flex-direction: column;\n    width: fit-content;\n    max-width: 384px;\n}\n\n.launch-card:hover {\n    transform: translateY(-8px);\n    box-shadow: 0 25px 50px rgba(12, 49, 104, 0.12);\n    border-color: rgba(12, 49, 104, 0.2);\n}\n\n\/* ============================= *\/\n\/* CARD PRINCIPAL - VENDAS *\/\n\/* ============================= *\/\n\n.venda-card {\n    min-height: 720px;\n}\n\n\/* ============================= *\/\n\/* CARD PRINCIPAL - LAN\u00c7AMENTOS *\/\n\/* ============================= *\/\n\n.lancamento-card {\n    min-height: auto;\n}\n\n\/* ============================= *\/\n\/* IMAGENS - PROPOR\u00c7\u00c3O FIXA 384x480 *\/\n\/* ============================= *\/\n\n.launch-image-container {\n    width: 384px;\n    height: 480px;\n    position: relative;\n    flex-shrink: 0;\n    background: #f0f5fd;\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    overflow: hidden;\n}\n\n.launch-badge {\n    position: absolute;\n    top: 18px;\n    left: 18px;\n    padding: 8px 16px;\n    border-radius: 50px;\n    font-size: 11px;\n    font-weight: 600;\n    z-index: 10;\n    text-transform: uppercase;\n    letter-spacing: 0.5px;\n    box-shadow: 0 4px 12px rgba(0,0,0,0.1);\n}\n\n.launch-badge.lancamento {\n    background: #0C3168;\n    color: white;\n}\n\n.launch-badge.venda {\n    background: #C53030;\n    color: white;\n}\n\n.launch-image {\n    width: 384px;\n    height: 480px;\n    object-fit: cover;\n    background: #f0f5fd;\n    transition: transform 0.7s cubic-bezier(0.165, 0.84, 0.44, 1);\n    display: block;\n}\n\n.launch-image[src*=\"svg\"] {\n    object-fit: scale-down;\n    padding: 40px;\n}\n\n.launch-card:hover .launch-image {\n    transform: scale(1.05);\n}\n\n\/* ============================= *\/\n\/* CONTE\u00daDO DO CARD *\/\n\/* ============================= *\/\n\n.launch-content {\n    padding: 25px;\n    flex: 1;\n    display: flex;\n    flex-direction: column;\n}\n\n.launch-type {\n    color: #8a9bb5;\n    font-size: 12px;\n    margin-bottom: 6px;\n    text-transform: uppercase;\n    letter-spacing: 1px;\n}\n\n.launch-name {\n    color: #0C3168;\n    font-size: 20px;\n    font-weight: 600;\n    margin-bottom: 12px;\n    line-height: 1.4;\n}\n\n\/* Apenas cards de venda t\u00eam altura m\u00ednima para o t\u00edtulo *\/\n.venda-card .launch-name {\n    min-height: 55px;\n}\n\n.launch-location {\n    color: #4a6a8a;\n    font-size: 15px;\n    margin-bottom: 15px;\n    display: flex;\n    align-items: center;\n    gap: 8px;\n}\n\n.launch-location i {\n    color: #0C3168;\n    font-size: 15px;\n    opacity: 0.7;\n}\n\n.launch-description {\n    color: #718096;\n    font-size: 15px;\n    line-height: 1.6;\n    margin-bottom: 18px;\n    display: -webkit-box;\n    -webkit-line-clamp: 2;\n    -webkit-box-orient: vertical;\n    overflow: hidden;\n}\n\n\/* Apenas cards de venda t\u00eam altura m\u00ednima para a descri\u00e7\u00e3o *\/\n.venda-card .launch-description {\n    min-height: 48px;\n}\n\n\/* ============================= *\/\n\/* FEATURES *\/\n\/* ============================= *\/\n\n.property-features {\n    display: grid;\n    grid-template-columns: repeat(2, 1fr);\n    gap: 15px;\n    margin-bottom: 20px;\n    padding: 20px 0;\n    border-top: 1px solid rgba(12, 49, 104, 0.1);\n    border-bottom: 1px solid rgba(12, 49, 104, 0.1);\n    min-height: 90px;\n}\n\n.feature-item {\n    display: flex;\n    flex-direction: column;\n    gap: 4px;\n}\n\n.feature-label {\n    color: #8a9bb5;\n    font-size: 13px;\n    text-transform: uppercase;\n    letter-spacing: 0.5px;\n}\n\n.feature-value {\n    color: #0C3168;\n    font-size: 16px;\n    font-weight: 600;\n}\n\n\/* ============================= *\/\n\/* PRE\u00c7OS - SEMPRE NO FOOTER *\/\n\/* ============================= *\/\n\n.price-footer {\n    margin-top: auto;\n}\n\n.launch-price, .sale-price {\n    padding: 16px;\n    border-radius: 50px;\n    font-weight: 600;\n    text-align: center;\n    font-size: 18px;\n    letter-spacing: 0.3px;\n    width: 100%;\n}\n\n.launch-price {\n    background: #f0f5fd;\n    color: #0C3168;\n    border: 1px solid rgba(12, 49, 104, 0.15);\n}\n\n.sale-price {\n    background: #fef2f2;\n    color: #C53030;\n    border: 1px solid rgba(197, 48, 48, 0.15);\n}\n\n\/* ============================= *\/\n\/* SKELETON *\/\n\/* ============================= *\/\n\n.skeleton-card {\n    height: 720px;\n    width: 384px;\n    background: linear-gradient(90deg, #f0f5fd, #f8faff, #f0f5fd);\n    background-size: 200% 100%;\n    animation: skeleton 1.5s infinite;\n    border-radius: 24px;\n}\n\n@keyframes skeleton {\n    0% { background-position: 200% 0; }\n    100% { background-position: -200% 0; }\n}\n\n\/* ============================= *\/\n\/* RESPONSIVO *\/\n\/* ============================= *\/\n\n@media (max-width: 1024px) {\n    .imoveis-header h2 {\n        font-size: 36px;\n    }\n    \n    .launch-grid {\n        grid-template-columns: repeat(auto-fit, minmax(350px, max-content));\n        gap: 30px;\n    }\n}\n\n@media (max-width: 768px) {\n    .imoveis-section {\n        padding: 70px 15px;\n    }\n    \n    .imoveis-header h2 {\n        font-size: 32px;\n    }\n    \n    .imoveis-searchbar {\n        border-radius: 30px;\n        padding: 15px;\n    }\n    \n    .imoveis-searchbar select {\n        min-width: 100%;\n    }\n    \n    .launch-grid {\n        grid-template-columns: 1fr;\n        gap: 30px;\n        justify-items: center;\n    }\n    \n    .launch-card {\n        max-width: 384px;\n        width: 100%;\n    }\n    \n    .launch-image-container,\n    .launch-image {\n        width: 100%;\n        height: auto;\n        aspect-ratio: 384\/480;\n    }\n    \n    .venda-card {\n        min-height: auto;\n    }\n    \n    .results-section {\n        flex-direction: column;\n        text-align: center;\n        padding: 20px;\n    }\n}\n\n@media (max-width: 480px) {\n    .imoveis-header h2 {\n        font-size: 28px;\n    }\n    \n    .imoveis-tabs {\n        flex-direction: column;\n        padding: 0 20px;\n    }\n    \n    .imoveis-section .tab {\n        width: 100%;\n    }\n    \n    .launch-content {\n        padding: 20px;\n    }\n    \n    .launch-name {\n        font-size: 18px;\n    }\n    \n    .launch-price, .sale-price {\n        font-size: 16px;\n        padding: 14px;\n    }\n}\n\n\/* ============================= *\/\n\/* SEGURAN\u00c7A *\/\n\/* ============================= *\/\n\n.imoveis-section button,\n.imoveis-section select,\n.imoveis-section input {\n    font-family: inherit;\n}\n\n.imoveis-section * {\n    text-shadow: none !important;\n}\n\n<\/style><\/div><\/div><div id=\"panel-1957-0-0-1\" class=\"widget_text so-panel widget widget_custom_html panel-last-child\" data-index=\"1\" ><div class=\"textwidget custom-html-widget\"><html lang=\"pt-BR\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>WhatsApp Direto - Delos Im\u00f3veis<\/title>\n    <link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.5.0\/css\/all.min.css\">\n    <style>\n        .whatsapp-float {\n            position: fixed !important;\n            bottom: 30px !important;\n            right: 30px !important;\n            z-index: 999999 !important;\n        }\n\n        .whatsapp-button {\n            width: 70px !important;\n            height: 70px !important;\n            background: #25D366 !important;\n            border-radius: 50% !important;\n            display: flex !important;\n            align-items: center !important;\n            justify-content: center !important;\n            cursor: pointer !important;\n            box-shadow: 0 8px 30px rgba(37, 211, 102, 0.4) !important;\n            transition: all 0.3s ease !important;\n            text-decoration: none !important;\n            border: none !important;\n            padding: 0 !important;\n            margin: 0 !important;\n        }\n\n        \/* CORRE\u00c7\u00c3O DO \u00cdCONE FONT AWESOME *\/\n        .whatsapp-button i {\n            color: #ffffff !important;\n            font-size: 38px !important;\n            line-height: 1 !important;\n            margin: 0 !important;\n            padding: 0 !important;\n            font-family: \"Font Awesome 6 Brands\" !important;\n            font-weight: 400 !important;\n            font-style: normal !important;\n        }\n\n        .whatsapp-button:hover {\n            transform: scale(1.1) !important;\n            background: #128C7E !important;\n        }\n\n        .whatsapp-button:hover i {\n            color: #ffffff !important;\n        }\n\n        .whatsapp-tooltip {\n            display: none !important;\n        }\n\n        @keyframes whatsappPulse {\n            0% { \n                box-shadow: 0 0 0 0 rgba(37, 211, 102, 0.7) !important; \n            }\n            70% { \n                box-shadow: 0 0 0 15px rgba(37, 211, 102, 0) !important; \n            }\n            100% { \n                box-shadow: 0 0 0 0 rgba(37, 211, 102, 0) !important; \n            }\n        }\n\n        .whatsapp-pulse {\n            animation: whatsappPulse 2s infinite !important;\n        }\n\n        @media (max-width: 768px) {\n            .whatsapp-float {\n                bottom: 20px !important;\n                right: 20px !important;\n            }\n            \n            .whatsapp-button {\n                width: 60px !important;\n                height: 60px !important;\n            }\n            \n            .whatsapp-button i {\n                font-size: 32px !important;\n            }\n        }\n\n        @media (max-width: 480px) {\n            .whatsapp-float {\n                bottom: 15px !important;\n                right: 15px !important;\n            }\n            \n            .whatsapp-button {\n                width: 55px !important;\n                height: 55px !important;\n            }\n            \n            .whatsapp-button i {\n                font-size: 28px !important;\n            }\n        }\n\n        .whatsapp-float * {\n            box-sizing: border-box !important;\n        }\n\n        a.whatsapp-button {\n            font-family: inherit !important;\n            text-decoration: none !important;\n        }\n    <\/style>\n<\/head>\n<body>\n    <div class=\"whatsapp-float\">\n        <a href=\"https:\/\/wa.me\/5583996431517?text=Ol\u00e1! Gostaria de mais informa\u00e7\u00f5es sobre os im\u00f3veis Delos\" \n           class=\"whatsapp-button whatsapp-pulse\" \n           target=\"_blank\"\n           id=\"whatsappButton\">\n            <i class=\"fab fa-whatsapp\"><\/i>\n        <\/a>\n    <\/div>\n\n    <script>\n        document.addEventListener('DOMContentLoaded', function() {\n            const whatsappBtn = document.getElementById('whatsappButton');\n            const whatsappIcon = document.querySelector('.whatsapp-button i');\n            if (whatsappBtn) {\n                whatsappBtn.style.cssText = `\n                    width: 70px !important;\n                    height: 70px !important;\n                    background: #25D366 !important;\n                    border-radius: 50% !important;\n                    display: flex !important;\n                    align-items: center !important;\n                    justify-content: center !important;\n                    cursor: pointer !important;\n                    box-shadow: 0 8px 30px rgba(37, 211, 102, 0.4) !important;\n                    text-decoration: none !important;\n                    border: none !important;\n                    position: fixed !important;\n                    bottom: 30px !important;\n                    right: 30px !important;\n                    z-index: 999999 !important;\n                    padding: 0 !important;\n                    margin: 0 !important;\n                `;\n            }\n            \n            if (whatsappIcon) {\n                whatsappIcon.style.cssText = `\n                    color: white !important;\n                    font-size: 38px !important;\n                    font-family: \"Font Awesome 6 Brands\" !important;\n                    font-weight: 400 !important;\n                    font-style: normal !important;\n                    line-height: 1 !important;\n                    margin: 0 !important;\n                    padding: 0 !important;\n                `;\n            }\n        });\n        class WhatsAppDirect {\n            constructor() {\n                this.button = document.getElementById('whatsappButton');\n                this.isLoading = false;\n                \n                this.init();\n            }\n            \n            init() {\n                if (this.button) {\n                    this.button.addEventListener('click', (e) => {\n                        this.handleClick(e);\n                    });\n                    \n                    this.addHoverEffects();\n                }\n            }\n            \n            handleClick(e) {\n                if (this.isLoading) {\n                    e.preventDefault();\n                    return;\n                }\n              \n                this.trackClick();\n            }\n            \n            addHoverEffects() {\n                if (!this.button) return;\n                \n                let pulseInterval;\n                \n                this.button.addEventListener('mouseenter', () => {\n                    this.button.classList.remove('whatsapp-pulse');\n                    \n                    pulseInterval = setInterval(() => {\n                        this.button.style.transform = 'scale(1.05)';\n                        setTimeout(() => {\n                            if (this.button) {\n                                this.button.style.transform = 'scale(1.1)';\n                            }\n                        }, 150);\n                    }, 300);\n                });\n                \n                this.button.addEventListener('mouseleave', () => {\n                    this.button.classList.add('whatsapp-pulse');\n                    this.button.style.transform = '';\n                    \n                    if (pulseInterval) {\n                        clearInterval(pulseInterval);\n                    }\n                });\n            }\n            \n            trackClick() {\n                if (typeof gtag !== 'undefined') {\n                    gtag('event', 'whatsapp_click', {\n                        'event_category': 'engagement',\n                        'event_label': 'whatsapp_float_button'\n                    });\n                }\n                \n                console.log('WhatsApp Click - N\u00famero: 83 99643-1517');\n            }\n            \n            updatePhoneNumber(newNumber) {\n                const cleanNumber = newNumber.replace(\/\\D\/g, '');\n                const whatsappUrl = `https:\/\/wa.me\/55${cleanNumber}?text=Ol\u00e1! Gostaria de mais informa\u00e7\u00f5es sobre os im\u00f3veis Delos`;\n                this.button.setAttribute('href', whatsappUrl);\n                \n                console.log('N\u00famero do WhatsApp atualizado para:', newNumber);\n            }\n            \n            updateMessage(newMessage) {\n                const currentHref = this.button.getAttribute('href');\n                const newHref = currentHref.replace(\/text=.*?(?=&|$)\/, `text=${encodeURIComponent(newMessage)}`);\n                this.button.setAttribute('href', newHref);\n            }\n        }\n        \n        function initWhatsAppDirect() {\n            if (window.whatsAppDirectInstance) {\n                return window.whatsAppDirectInstance;\n            }\n            \n            const whatsappDirect = new WhatsAppDirect();\n            window.whatsAppDirectInstance = whatsappDirect;\n            return window.whatsAppDirectInstance;\n        }\n        \n        if (document.readyState === 'loading') {\n            document.addEventListener('DOMContentLoaded', initWhatsAppDirect);\n        } else {\n            initWhatsAppDirect();\n        }\n        \n        if (typeof jQuery !== 'undefined') {\n            jQuery(document).ready(function($) {\n                initWhatsAppDirect();\n            });\n        }\n    <\/script>\n<\/body>\n<\/html><\/div><\/div><\/div><\/div><\/div><\/div>","protected":false},"excerpt":{"rendered":"<p>EXCLUSIVIDADE E SOFISTICA\u00c7\u00c3O Nossos Im\u00f3veis Resid\u00eancias planejadas para quem busca o melhor da vida Cidade Jo\u00e3o Pessoa Miami Bairro Altiplano [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"page-templates\/full-width.php","meta":{"footnotes":""},"class_list":["post-1957","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Im\u00f3veis - Delos Imobili\u00e1ria<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/soudelos.com.br\/site\/index.php\/imoveis\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Im\u00f3veis - Delos Imobili\u00e1ria\" \/>\n<meta property=\"og:description\" content=\"EXCLUSIVIDADE E SOFISTICA\u00c7\u00c3O Nossos Im\u00f3veis Resid\u00eancias planejadas para quem busca o melhor da vida Cidade Jo\u00e3o Pessoa Miami Bairro Altiplano [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/soudelos.com.br\/site\/index.php\/imoveis\/\" \/>\n<meta property=\"og:site_name\" content=\"Delos Imobili\u00e1ria\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-27T17:18:46+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. tempo de leitura\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minuto\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/soudelos.com.br\/site\/index.php\/imoveis\/\",\"url\":\"https:\/\/soudelos.com.br\/site\/index.php\/imoveis\/\",\"name\":\"Im\u00f3veis - Delos Imobili\u00e1ria\",\"isPartOf\":{\"@id\":\"https:\/\/soudelos.com.br\/site\/#website\"},\"datePublished\":\"2025-10-21T17:30:35+00:00\",\"dateModified\":\"2026-03-27T17:18:46+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/soudelos.com.br\/site\/index.php\/imoveis\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/soudelos.com.br\/site\/index.php\/imoveis\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/soudelos.com.br\/site\/index.php\/imoveis\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"In\u00edcio\",\"item\":\"https:\/\/soudelos.com.br\/site\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Im\u00f3veis\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/soudelos.com.br\/site\/#website\",\"url\":\"https:\/\/soudelos.com.br\/site\/\",\"name\":\"Delos Imobili\u00e1ria\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/soudelos.com.br\/site\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/soudelos.com.br\/site\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/soudelos.com.br\/site\/#organization\",\"name\":\"Delos Imobili\u00e1ria\",\"url\":\"https:\/\/soudelos.com.br\/site\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/soudelos.com.br\/site\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/soudelos.com.br\/site\/wp-content\/uploads\/2026\/02\/cropped-Screenshot-2025-05-21-at-14-29-51-Logo-Delos-Logo-Delos-Vetor.pdf2_-removebg-preview-1-1.png\",\"contentUrl\":\"https:\/\/soudelos.com.br\/site\/wp-content\/uploads\/2026\/02\/cropped-Screenshot-2025-05-21-at-14-29-51-Logo-Delos-Logo-Delos-Vetor.pdf2_-removebg-preview-1-1.png\",\"width\":150,\"height\":50,\"caption\":\"Delos Imobili\u00e1ria\"},\"image\":{\"@id\":\"https:\/\/soudelos.com.br\/site\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.instagram.com\/soudelos\/\",\"https:\/\/www.youtube.com\/@soudelos\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Im\u00f3veis - Delos Imobili\u00e1ria","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/soudelos.com.br\/site\/index.php\/imoveis\/","og_locale":"pt_BR","og_type":"article","og_title":"Im\u00f3veis - Delos Imobili\u00e1ria","og_description":"EXCLUSIVIDADE E SOFISTICA\u00c7\u00c3O Nossos Im\u00f3veis Resid\u00eancias planejadas para quem busca o melhor da vida Cidade Jo\u00e3o Pessoa Miami Bairro Altiplano [&hellip;]","og_url":"https:\/\/soudelos.com.br\/site\/index.php\/imoveis\/","og_site_name":"Delos Imobili\u00e1ria","article_modified_time":"2026-03-27T17:18:46+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. tempo de leitura":"1 minuto"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/soudelos.com.br\/site\/index.php\/imoveis\/","url":"https:\/\/soudelos.com.br\/site\/index.php\/imoveis\/","name":"Im\u00f3veis - Delos Imobili\u00e1ria","isPartOf":{"@id":"https:\/\/soudelos.com.br\/site\/#website"},"datePublished":"2025-10-21T17:30:35+00:00","dateModified":"2026-03-27T17:18:46+00:00","breadcrumb":{"@id":"https:\/\/soudelos.com.br\/site\/index.php\/imoveis\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/soudelos.com.br\/site\/index.php\/imoveis\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/soudelos.com.br\/site\/index.php\/imoveis\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"In\u00edcio","item":"https:\/\/soudelos.com.br\/site\/"},{"@type":"ListItem","position":2,"name":"Im\u00f3veis"}]},{"@type":"WebSite","@id":"https:\/\/soudelos.com.br\/site\/#website","url":"https:\/\/soudelos.com.br\/site\/","name":"Delos Imobili\u00e1ria","description":"","publisher":{"@id":"https:\/\/soudelos.com.br\/site\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/soudelos.com.br\/site\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/soudelos.com.br\/site\/#organization","name":"Delos Imobili\u00e1ria","url":"https:\/\/soudelos.com.br\/site\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/soudelos.com.br\/site\/#\/schema\/logo\/image\/","url":"https:\/\/soudelos.com.br\/site\/wp-content\/uploads\/2026\/02\/cropped-Screenshot-2025-05-21-at-14-29-51-Logo-Delos-Logo-Delos-Vetor.pdf2_-removebg-preview-1-1.png","contentUrl":"https:\/\/soudelos.com.br\/site\/wp-content\/uploads\/2026\/02\/cropped-Screenshot-2025-05-21-at-14-29-51-Logo-Delos-Logo-Delos-Vetor.pdf2_-removebg-preview-1-1.png","width":150,"height":50,"caption":"Delos Imobili\u00e1ria"},"image":{"@id":"https:\/\/soudelos.com.br\/site\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.instagram.com\/soudelos\/","https:\/\/www.youtube.com\/@soudelos"]}]}},"_links":{"self":[{"href":"https:\/\/soudelos.com.br\/site\/index.php\/wp-json\/wp\/v2\/pages\/1957","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/soudelos.com.br\/site\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/soudelos.com.br\/site\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/soudelos.com.br\/site\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/soudelos.com.br\/site\/index.php\/wp-json\/wp\/v2\/comments?post=1957"}],"version-history":[{"count":0,"href":"https:\/\/soudelos.com.br\/site\/index.php\/wp-json\/wp\/v2\/pages\/1957\/revisions"}],"wp:attachment":[{"href":"https:\/\/soudelos.com.br\/site\/index.php\/wp-json\/wp\/v2\/media?parent=1957"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}