YOUR TRUSTED LUBBOCK REALTOR

"I enjoy helping families fulfill the American dream of homeownership"

VIEW LISTINGS

About Christopher

Christopher Brooks - Real Estate Agent

Relationships First, Always

Christopher Brooks brings a fresh perspective to Lubbock real estate, grounded in genuine relationships and unwavering integrity. With a background in student housing and residential leasing, Christopher understands the housing market from every angle.

"For me, it's all about my client. Treat them exactly like you'd want to be treated and the rest will take care of itself."

A 25-year-old Lubbock native with deep community roots, Christopher serves on five committees with the Lubbock Association of Realtors and is a Master Mason with John Sayles Masonic Lodge. His strong work ethic, instilled from age 15, drives his commitment to putting clients first.

Whether you're a first-time buyer, growing family, retiree, or real estate investor, Christopher's goal is simple: help you achieve your dreams while treating you exactly as he'd want to be treated.

How I Can Help You

🏠

First-Time Home Buyers

Navigate the exciting journey of homeownership with confidence. I'll guide you through every step, from pre-approval to closing, making your first home purchase smooth and stress-free.

📈

Real Estate Investment

Build your passive income portfolio with strategic property investments. I'll help you identify opportunities that align with your financial goals and market conditions.

🔄

Upsizing & Downsizing

Whether you're growing your family or simplifying for retirement, I'll help you find the perfect home that fits your changing lifestyle and needs.

💰

Home Selling

Get top dollar for your property with strategic marketing and pricing. My local market expertise ensures your home sells quickly and for the best possible price.

🏘️

Lubbock Area Expert

Born and raised in the area, I know Lubbock's neighborhoods, schools, and communities inside and out. Let my local knowledge work for you.

🤝

Relationship-Based Service

You're not just a transaction - you're a relationship. I'm committed to being your real estate resource for life, long after closing day.

Featured Properties

Coming Soon!

I'm working on bringing you the latest Lubbock area listings directly to this website. In the meantime, feel free to contact me for current available properties.

View Available Properties

Let's Connect

Ready to Start Your Journey?

📱
Call or Text:
(325) 260-0144
🏢
Office:
EXIT Realty of Lubbock
2405 W. Loop 289 Suite 100
Lubbock, TX 79407
🌐

Send Me a Message

📋 Debug Info:
✅ Dynamic Toast Fix: ACTIVE
✅ Spacebar Fix: ACTIVE
🕒 Updated:
doesn't exist if (!document.getElementById('toast-container')) { this.container = document.createElement('div'); this.container.id = 'toast-container'; this.container.className = 'toast-container'; this.container.setAttribute('aria-live', 'polite'); this.container.setAttribute('aria-atomic', 'true'); document.body.appendChild(this.container); } else { this.container = document.getElementById('toast-container'); } } show(options = {}) { const defaults = { title: '✨ Thank you!', message: "Christopher will contact you within 24 hours to discuss your real estate needs.", type: 'success', duration: 5000, showAgent: true, agentName: 'Christopher Brooks', agentImage: 'images/headshot.jpg' }; const config = { ...defaults, ...options }; // Prevent duplicate toasts const existingToast = this.toasts.find(t => t.message === config.message && !t.dismissed); if (existingToast) return; const toast = this.createToast(config); this.container.appendChild(toast.element); // Force reflow for animation void toast.element.offsetHeight; // Add active class for animation requestAnimationFrame(() => { toast.element.classList.add('toast-active'); }); // Set up auto-dismiss if (config.duration > 0) { toast.timeout = setTimeout(() => { this.dismiss(toast); }, config.duration); } this.toasts.push(toast); return toast; } createToast(config) { const toastElement = document.createElement('div'); toastElement.className = `toast toast-${config.type}`; toastElement.setAttribute('role', 'alert'); // Create toast HTML structure toastElement.innerHTML = `
${this.getIcon(config.type)}

${config.title}

${config.message}

${config.showAgent ? this.getAgentInfo(config) : ''}
`; const toast = { element: toastElement, config: config, timeout: null, dismissed: false, message: config.message }; // Event listeners const closeBtn = toastElement.querySelector('.toast-close'); closeBtn.addEventListener('click', () => this.dismiss(toast)); // Pause auto-dismiss on hover toastElement.addEventListener('mouseenter', () => { if (toast.timeout) { clearTimeout(toast.timeout); const progressBar = toastElement.querySelector('.toast-progress-bar'); if (progressBar) { progressBar.style.animationPlayState = 'paused'; } } }); toastElement.addEventListener('mouseleave', () => { if (config.duration > 0 && !toast.dismissed) { const progressBar = toastElement.querySelector('.toast-progress-bar'); if (progressBar) { progressBar.style.animationPlayState = 'running'; } const remainingTime = config.duration * 0.3; // Approximate remaining time toast.timeout = setTimeout(() => { this.dismiss(toast); }, remainingTime); } }); return toast; } getIcon(type) { const icons = { success: ` `, error: ` `, info: ` ` }; return icons[type] || icons.success; } getAgentInfo(config) { return `
${config.agentName} ${config.agentName}
`; } dismiss(toast) { if (toast.dismissed) return; toast.dismissed = true; if (toast.timeout) { clearTimeout(toast.timeout); } // Remove active class for exit animation toast.element.classList.remove('toast-active'); toast.element.classList.add('toast-dismissing'); // Remove from DOM after animation setTimeout(() => { if (toast.element.parentNode) { toast.element.parentNode.removeChild(toast.element); } // Remove from toasts array const index = this.toasts.indexOf(toast); if (index > -1) { this.toasts.splice(index, 1); } }, 300); } success(message, title) { this.show({ message, type: 'success', title }); } error(message, title) { this.show({ message, type: 'error', title }); } info(message, title) { this.show({ message, type: 'info', title }); } } // Initialize enhanced toast notification system const toast = new ToastNotification(); // Mobile menu toggle const mobileToggle = document.getElementById('mobileToggle'); const navMenu = document.getElementById('navMenu'); mobileToggle.addEventListener('click', () => { navMenu.classList.toggle('active'); }); // Smooth scrolling for navigation links document.querySelectorAll('a[href^="#"]').forEach(anchor => { anchor.addEventListener('click', function (e) { e.preventDefault(); const target = document.querySelector(this.getAttribute('href')); if (target) { target.scrollIntoView({ behavior: 'smooth', block: 'start' }); // Close mobile menu if open navMenu.classList.remove('active'); } }); }); // Enhanced header scroll effects let lastScrollY = window.scrollY; let ticking = false; function updateHeader() { const header = document.querySelector('.header'); const scrollY = window.scrollY; const heroHeight = document.querySelector('.hero').offsetHeight; if (scrollY > 100) { header.classList.add('scrolled'); header.style.background = 'rgba(45, 55, 72, 0.98)'; header.style.backdropFilter = 'blur(10px)'; header.style.webkitBackdropFilter = 'blur(10px)'; } else { header.classList.remove('scrolled'); header.style.background = 'linear-gradient(135deg, var(--primary-dark), var(--secondary-dark))'; header.style.backdropFilter = 'none'; header.style.webkitBackdropFilter = 'none'; } // Hide/show header on scroll if (scrollY > lastScrollY && scrollY > 100) { header.classList.add('hidden'); } else { header.classList.remove('hidden'); } // Update body class for text contrast if (scrollY < heroHeight - 100) { document.body.classList.add('scrolled-hero'); } else { document.body.classList.remove('scrolled-hero'); } // Check if we need light header text if (scrollY > heroHeight - 200) { header.classList.add('light-bg'); } else { header.classList.remove('light-bg'); } lastScrollY = scrollY; ticking = false; } window.addEventListener('scroll', () => { if (!ticking) { window.requestAnimationFrame(updateHeader); ticking = true; } }); // Parallax effect for hero section background only function updateParallax() { const scrolled = window.pageYOffset; const heroBg = document.querySelector('.hero::before'); // Only apply parallax to background, not the hero container if (heroBg && scrolled < window.innerHeight) { // Update CSS variable for background transform document.documentElement.style.setProperty('--parallax-offset', `${scrolled * 0.3}px`); } } // Throttled scroll event for performance let parallaxTicking = false; window.addEventListener('scroll', () => { if (!parallaxTicking) { window.requestAnimationFrame(() => { updateParallax(); parallaxTicking = false; }); parallaxTicking = true; } }); // Scroll indicator click const scrollIndicator = document.getElementById('scrollIndicator'); if (scrollIndicator) { scrollIndicator.addEventListener('click', () => { document.getElementById('about').scrollIntoView({ behavior: 'smooth' }); }); } // Add CSS for input ripple effect const style = document.createElement('style'); style.textContent = ` .input-ripple { position: absolute; top: 50%; left: 50%; width: 0; height: 0; border-radius: 50%; background: rgba(212, 175, 55, 0.3); transform: translate(-50%, -50%); animation: ripple-expand 1s ease-out; pointer-events: none; } @keyframes ripple-expand { to { width: 200px; height: 200px; opacity: 0; } } .form-group { position: relative; overflow: hidden; } body.loaded { opacity: 1; } body { opacity: 0; transition: opacity 0.6s ease-out; } `; document.head.appendChild(style); // Form submission handling with Netlify Forms document.getElementById('contactForm').addEventListener('submit', function(e) { e.preventDefault(); // Get form data const formData = new FormData(this); const data = {}; for (let [key, value] of formData.entries()) { data[key] = value; } // Disable submit button and show loading state const submitButton = this.querySelector('button[type="submit"]'); const originalText = submitButton.textContent; submitButton.disabled = true; submitButton.textContent = 'Sending...'; // Track form submission in Google Analytics gtag('event', 'form_submit', { event_category: 'engagement', event_label: 'contact_form', value: 1 }); // Submit to Netlify with enhanced security const secureFormData = window.BBSecurity ? window.BBSecurity.secureFormData(new FormData(this)) : new FormData(this); fetch('/', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', 'X-Requested-With': 'XMLHttpRequest' }, body: new URLSearchParams(secureFormData).toString() }) .then((response) => { if (!response.ok) { throw new Error('Network response was not ok'); } // Show enhanced success toast with Christopher's info toast.show({ title: '✨ Thank you for reaching out!', message: 'Christopher will contact you within 24 hours to discuss your real estate needs. Feel free to call or text him directly at (325) 260-0144 or email christopher@exitlubbock.com.', type: 'success', duration: 6000, showAgent: true }); // Reset form this.reset(); // Remove focused class from form groups document.querySelectorAll('.form-group.focused').forEach(group => { group.classList.remove('focused'); }); }) .catch((error) => { console.error('Error:', error); // Show enhanced error toast with Christopher's contact info toast.show({ title: 'Oops! Something went wrong', message: 'We encountered an issue sending your message. Please try again or contact Christopher directly at (325) 260-0144 or email christopher@exitlubbock.com.', type: 'error', duration: 8000, showAgent: true }); }) .finally(() => { // Re-enable submit button submitButton.disabled = false; submitButton.textContent = originalText; }); }); // Track CTA button clicks document.querySelectorAll('.cta-button').forEach(button => { button.addEventListener('click', function(e) { gtag('event', 'click', { event_category: 'engagement', event_label: 'cta_button', value: 1 }); }); }); // Track navigation clicks document.querySelectorAll('.nav-menu a').forEach(link => { link.addEventListener('click', function(e) { gtag('event', 'click', { event_category: 'navigation', event_label: this.textContent.toLowerCase(), value: 1 }); }); }); // Enhanced Intersection Observer for animations const animationObserverOptions = { threshold: 0.1, rootMargin: '0px 0px -50px 0px' }; const animationObserver = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { // Add animate class for various animation types if (entry.target.classList.contains('fade-in-up') || entry.target.classList.contains('fade-in-left') || entry.target.classList.contains('fade-in-right') || entry.target.classList.contains('scale-in')) { entry.target.classList.add('animate'); } // Stagger animations for service cards if (entry.target.classList.contains('services-grid')) { const cards = entry.target.querySelectorAll('.stagger-item'); cards.forEach((card, index) => { setTimeout(() => { card.classList.add('animate'); }, index * 100); }); } // Animate counters if present const counters = entry.target.querySelectorAll('.counter'); counters.forEach(counter => { animateCounter(counter); }); // Stop observing after animation animationObserver.unobserve(entry.target); } }); }, animationObserverOptions); // Observe elements with animation classes document.querySelectorAll('.fade-in-up, .fade-in-left, .fade-in-right, .scale-in, .services-grid').forEach(element => { animationObserver.observe(element); }); // Counter animation function function animateCounter(counter) { const target = parseInt(counter.getAttribute('data-target')); const duration = 2000; const step = target / (duration / 16); let current = 0; const updateCounter = () => { current += step; if (current < target) { counter.textContent = Math.floor(current); requestAnimationFrame(updateCounter); } else { counter.textContent = target; } }; updateCounter(); } // Image lazy loading with fade effect const imageObserver = new IntersectionObserver((entries) => { entries.forEach(entry => { if (entry.isIntersecting) { const img = entry.target; if (img.dataset.src) { img.src = img.dataset.src; img.classList.add('loaded'); imageObserver.unobserve(img); } } }); }); document.querySelectorAll('img[data-src]').forEach(img => { imageObserver.observe(img); }); // Enhanced form interactions const formInputs = document.querySelectorAll('.form-group input, .form-group textarea, .form-group select'); formInputs.forEach(input => { // Add floating label effect input.addEventListener('focus', () => { input.parentElement.classList.add('focused'); }); input.addEventListener('blur', () => { if (!input.value) { input.parentElement.classList.remove('focused'); } }); // Add ripple effect on focus input.addEventListener('focus', (e) => { const ripple = document.createElement('span'); ripple.className = 'input-ripple'; input.parentElement.appendChild(ripple); setTimeout(() => { ripple.remove(); }, 1000); }); }); // Smooth page load transition window.addEventListener('load', () => { // Hide loader const loader = document.getElementById('pageLoader'); if (loader) { loader.style.opacity = '0'; setTimeout(() => { loader.style.display = 'none'; }, 500); } document.body.classList.add('loaded'); // Add page transition class to main content const mainContent = document.querySelector('main') || document.body; mainContent.classList.add('page-transition', 'active'); }); // Performance optimization: Debounce function function debounce(func, wait) { let timeout; return function executedFunction(...args) { const later = () => { clearTimeout(timeout); func(...args); }; clearTimeout(timeout); timeout = setTimeout(later, wait); }; } // Add smooth hover effects to all interactive elements document.addEventListener('DOMContentLoaded', () => { // Add hover-lift class to elements that should lift on hover const hoverElements = document.querySelectorAll('.contact-item, .footer-links a'); hoverElements.forEach(el => { el.classList.add('hover-lift'); }); }); // Page loader handling window.addEventListener('load', () => { setTimeout(() => { const loader = document.getElementById('pageLoader'); if (loader) { loader.style.opacity = '0'; setTimeout(() => { loader.style.display = 'none'; }, 500); } }, 300); }); // Initialize scroll-based text contrast on page load document.addEventListener('DOMContentLoaded', () => { updateHeader(); // Add dynamic text class to elements that need contrast adjustment const dynamicTextElements = document.querySelectorAll('.section-title, .about-content h3, .service-card h3'); dynamicTextElements.forEach(el => { el.classList.add('dynamic-text'); }); }); // Smooth scroll behavior for better UX document.documentElement.style.scrollBehavior = 'smooth';