diff --git a/db_content_updates/2026-01-05_SEO_albert_lea_landing_page.md b/db_content_updates/2026-01-05_SEO_albert_lea_landing_page.md new file mode 100644 index 00000000..839a9ed4 --- /dev/null +++ b/db_content_updates/2026-01-05_SEO_albert_lea_landing_page.md @@ -0,0 +1,129 @@ +# Database Content Update: SEO - Albert Lea Landing Page + +**Date:** 2026-01-05 +**Author:** Claude (automated) +**Summary:** Configure Albert Lea page as SEO landing page with city template + +## Overview + +This update configures the existing Albert Lea page (ID 15) as an SEO-optimized city landing page that displays MLS listings for Albert Lea. + +## Changes Made + +### 1. Update Albert Lea Page Slug + +Change the URL from `/albert-lea/` to `/albert-lea-homes/` for better SEO targeting. + +```sql +UPDATE wp_posts +SET post_name = 'albert-lea-homes' +WHERE ID = 15; +``` + +**WP-CLI Alternative:** +```bash +wp post update 15 --post_name=albert-lea-homes --allow-root +``` + +### 2. Set Page Template + +Assign the City Landing Page template to the Albert Lea page. + +```sql +-- First check if template meta exists +SELECT * FROM wp_postmeta WHERE post_id = 15 AND meta_key = '_wp_page_template'; + +-- If exists, update: +UPDATE wp_postmeta +SET meta_value = 'page-city-landing.php' +WHERE post_id = 15 AND meta_key = '_wp_page_template'; + +-- If not exists, insert: +INSERT INTO wp_postmeta (post_id, meta_key, meta_value) +VALUES (15, '_wp_page_template', 'page-city-landing.php'); +``` + +**WP-CLI Alternative:** +```bash +wp post meta update 15 _wp_page_template page-city-landing.php --allow-root +``` + +### 3. Add Yoast SEO Meta + +Add optimized meta title and description for the page. + +```sql +INSERT INTO wp_postmeta (post_id, meta_key, meta_value) VALUES +(15, '_yoast_wpseo_title', 'Albert Lea Homes for Sale | HomeProz Real Estate'), +(15, '_yoast_wpseo_metadesc', 'Find homes for sale in Albert Lea, MN. Browse current listings, view property details, and connect with local real estate experts at HomeProz.'); +``` + +**WP-CLI Alternative:** +```bash +wp post meta add 15 _yoast_wpseo_title "Albert Lea Homes for Sale | HomeProz Real Estate" --allow-root +wp post meta add 15 _yoast_wpseo_metadesc "Find homes for sale in Albert Lea, MN. Browse current listings, view property details, and connect with local real estate experts at HomeProz." --allow-root +``` + +### 4. Flush Rewrite Rules + +Required after changing page slugs to update permalinks. + +```bash +wp rewrite flush --allow-root +``` + +## Dependencies + +- Theme files must be deployed first: + - `wp-content/themes/homeproz/page-city-landing.php` + - `wp-content/themes/homeproz/page-city-landing.scss` + - `wp-content/themes/homeproz/inc/yoast-seo.php` + - `wp-content/themes/homeproz/inc/acf-fields.php` (updated) + - `wp-content/themes/homeproz/functions.php` (updated) + - `wp-content/themes/homeproz/dist/` (rebuilt assets) + +## Verification + +After applying changes, verify: + +1. **Page loads correctly:** + ``` + https://[domain]/albert-lea-homes/ + ``` + +2. **Template is active:** + ```bash + wp post meta get 15 _wp_page_template --allow-root + # Should output: page-city-landing.php + ``` + +3. **Yoast meta is set:** + ```bash + wp post meta get 15 _yoast_wpseo_title --allow-root + wp post meta get 15 _yoast_wpseo_metadesc --allow-root + ``` + +4. **MLS sitemap accessible:** + ``` + https://[domain]/mls-listings-sitemap.xml + ``` + +## Rollback + +To revert these changes: + +```sql +-- Restore original slug +UPDATE wp_posts SET post_name = 'albert-lea' WHERE ID = 15; + +-- Remove template assignment +DELETE FROM wp_postmeta WHERE post_id = 15 AND meta_key = '_wp_page_template'; + +-- Remove Yoast meta +DELETE FROM wp_postmeta WHERE post_id = 15 AND meta_key IN ('_yoast_wpseo_title', '_yoast_wpseo_metadesc'); +``` + +Then flush rewrite rules: +```bash +wp rewrite flush --allow-root +``` diff --git a/db_content_updates/2026-01-06_agent-testimonials.md b/db_content_updates/2026-01-06_agent-testimonials.md new file mode 100644 index 00000000..d9dc4597 --- /dev/null +++ b/db_content_updates/2026-01-06_agent-testimonials.md @@ -0,0 +1,56 @@ +# Agent Testimonials Feature + +**Date**: 2026-01-06 +**Type**: ACF Field Addition + +## Summary + +Added a new "Testimonials" tab to the Agent Details ACF field group, allowing agents to display client testimonials on their profile pages. + +## Changes Made + +### ACF Field Group: Agent Details (group_agent_details) + +Added new tab and repeater field: + +**New Tab**: Testimonials (field_agent_tab_testimonials) +- Position: After Social Media tab, before Settings tab + +**New Repeater Field**: agent_testimonials (field_agent_testimonials) +- Type: Repeater +- Layout: Block +- Max rows: 20 + +**Sub-fields**: +1. `quote` (field_testimonial_quote) - Textarea, required + - The testimonial text from the client +2. `client_name` (field_testimonial_client_name) - Text, required + - Client's name (e.g., "John D." or "John Doe") +3. `context` (field_testimonial_context) - Text, optional + - Context like "Albert Lea Buyer" or "First-time Homeowner" + +## Template Changes + +Updated `single-agent.php` to display testimonials section between biography and gallery. + +## Styling + +Added testimonials styles to `template-parts/agent/single-agent.scss`: +- Two-column grid on desktop, single column on mobile +- Card styling with accent border-left +- Quote icon with italicized text +- Attribution with client name and optional context + +## How to Add Testimonials + +1. Go to Agents in WordPress admin +2. Edit an agent +3. Click the "Testimonials" tab +4. Click "Add Testimonial" +5. Enter the quote text, client name, and optionally a context +6. Save the agent + +## Dependencies + +- Requires ACF Pro (repeater field) +- Theme must be built after deployment (`npm run build`) diff --git a/db_content_updates/2026-01-06_favicon-management.md b/db_content_updates/2026-01-06_favicon-management.md new file mode 100644 index 00000000..ff54615e --- /dev/null +++ b/db_content_updates/2026-01-06_favicon-management.md @@ -0,0 +1,81 @@ +# Favicon Management Feature + +**Date**: 2026-01-06 +**Type**: ACF Field Addition + Theme Feature + +## Summary + +Added favicon management through Theme Options. Site administrators can upload a source image that gets automatically converted to all required favicon sizes using ImageMagick. + +## ACF Field Group Changes + +### Theme Options (group_theme_options) + +Added new "Branding" tab (before Advanced tab): + +**New Tab**: Branding (field_theme_tab_branding) + +**New Fields**: +1. `theme_favicon_source` (field_theme_favicon_source) - Image field + - Return format: ID + - Mime types: png, webp + - Minimum dimensions: 256x256 pixels + - Instructions: Upload square image at least 512x512 + +2. `theme_favicon_status` (field_theme_favicon_status) - Message field + - Shows instructions about saving to generate favicons + +## Generated Files + +When a favicon source is uploaded and saved, the following files are generated in `/wp-content/uploads/favicon/`: + +| File | Size | Purpose | +|------|------|---------| +| favicon.ico | 16x16, 32x32, 48x48 | Legacy browsers | +| favicon-16x16.png | 16x16 | Standard favicon | +| favicon-32x32.png | 32x32 | Standard favicon | +| favicon-48x48.png | 48x48 | Standard favicon | +| apple-touch-icon.png | 180x180 | iOS home screen | +| android-chrome-192x192.png | 192x192 | Android/Chrome | +| android-chrome-512x512.png | 512x512 | Android/Chrome splash | +| mstile-150x150.png | 150x150 | Windows tiles | +| site.webmanifest | - | PWA manifest | +| browserconfig.xml | - | Windows tile config | + +## Theme Files Added/Modified + +### New File: `inc/favicon.php` +- ACF save hook for favicon processing +- ImageMagick conversion functions +- Web manifest generation +- HTML head output with cache busting +- Disables WordPress Site Icon (Customizer) + +### Modified: `functions.php` +- Added `require_once` for `inc/favicon.php` + +### Modified: `inc/acf-fields.php` +- Added Branding tab with favicon fields + +## Server Requirements + +- **ImageMagick**: Must be installed with `convert` command available +- Admin notice displays if ImageMagick is not found + +## How to Use + +1. Go to Theme Options in WordPress admin +2. Click the "Branding" tab +3. Upload a square PNG or WebP image (minimum 256x256, recommended 512x512) +4. Save the Theme Options +5. Favicons are automatically generated and output in the HTML head + +## Cache Busting + +Favicon URLs include a version query parameter based on file modification time to ensure browsers load updated favicons when changed. + +## Dependencies + +- ACF Pro +- ImageMagick on server +- Theme must include favicon.php diff --git a/db_content_updates/2026-01-06_mls-ssl-skip-config.md b/db_content_updates/2026-01-06_mls-ssl-skip-config.md new file mode 100644 index 00000000..7c541968 --- /dev/null +++ b/db_content_updates/2026-01-06_mls-ssl-skip-config.md @@ -0,0 +1,39 @@ +# MLS Grid SSL Verification Skip + +**Date**: 2026-01-06 +**Type**: Server Configuration (wp-config.php) + +Note: This is not a database change, but a server-level configuration change. Documented here for production sync purposes. + +## Issue + +MLS Grid's media CDN (`media.mlsgrid.com`) has an expired SSL certificate, causing all image fetches to fail with SSL handshake errors. This resulted in 404 errors for property images on the site. + +## Solution + +Enable the `MLS_SKIP_SSL_VERIFY` option that was added in commit `0fd8b71`. + +## Change Required + +Add to `wp-config.php` (after MLS Grid API settings): + +```php +// Skip SSL verification for MLS Grid media (their cert is expired) +define( 'MLS_SKIP_SSL_VERIFY', true ); +``` + +## Security Note + +This disables SSL certificate verification only for MLS Grid media downloads. This is acceptable because: +1. The data being fetched is public property images (not sensitive) +2. The alternative is completely broken image functionality +3. This should be reverted once MLS Grid renews their certificate + +## Verification + +After applying, test an image URL: +```bash +curl -I "https://[site]/mls-image/[listing_key]/1/thumb/?sig=[signature]" +``` + +Should return `HTTP 200` with `content-type: image/webp`. diff --git a/wp-content/plugins/mls-by-hansonxyz/cli/class-mls-cli.php b/wp-content/plugins/mls-by-hansonxyz/cli/class-mls-cli.php index dbc8ebf5..d43f78f8 100755 --- a/wp-content/plugins/mls-by-hansonxyz/cli/class-mls-cli.php +++ b/wp-content/plugins/mls-by-hansonxyz/cli/class-mls-cli.php @@ -191,24 +191,62 @@ class MLS_CLI { private function show_rate_limits() { $rate_limiter = $this->plugin->get_rate_limiter(); $status = $rate_limiter->get_status(); + $summary = $rate_limiter->get_usage_summary(); - WP_CLI::line('=== Rate Limits ==='); + WP_CLI::line('=== MLS Grid Rate Limits ==='); + WP_CLI::line(''); + + // Requests + WP_CLI::line('Requests:'); WP_CLI::line(sprintf( - 'Hourly: %d / %d requests (%d remaining)', - $status['hourly']['used'], - $status['hourly']['limit'], - $status['hourly']['remaining'] + ' Hourly: %s / %s (%s%%)', + number_format($status['hourly']['used']), + number_format($status['hourly']['limit']), + $summary['requests_hourly_pct'] )); WP_CLI::line(sprintf( - 'Daily: %d / %d requests (%d remaining)', - $status['daily']['used'], - $status['daily']['limit'], - $status['daily']['remaining'] + ' Daily: %s / %s (%s%%)', + number_format($status['daily']['used']), + number_format($status['daily']['limit']), + $summary['requests_daily_pct'] + )); + WP_CLI::line(''); + + // Data transfer + WP_CLI::line('Data Transfer:'); + WP_CLI::line(sprintf( + ' Hourly: %s / %s (%s%%)', + size_format($status['data_hourly']['used']), + size_format($status['data_hourly']['limit']), + $summary['data_hourly_pct'] )); WP_CLI::line(sprintf( - 'Data: %s / 4GB this hour', - size_format($status['bytes_this_hour']) + ' Daily: %s / %s (%s%%)', + size_format($status['data_daily']['used']), + size_format($status['data_daily']['limit']), + $summary['data_daily_pct'] )); + WP_CLI::line(sprintf( + ' Remaining today: %s GB', + $summary['data_daily_remaining_gb'] + )); + WP_CLI::line(''); + + // Warnings + if ($rate_limiter->is_approaching_limit(0.7)) { + WP_CLI::warning('Approaching rate limits (>70% used)'); + } + if ($rate_limiter->is_approaching_limit(0.9)) { + WP_CLI::error('Critical: Near rate limit threshold (>90% used)', false); + } + + // Sync pacing info + WP_CLI::line('Sync Pacing:'); + WP_CLI::line(sprintf( + ' Min interval: %s seconds between API requests', + number_format(MLS_Rate_Limiter::SYNC_MIN_INTERVAL_MS / 1000, 2) + )); + WP_CLI::line(' (Ensures max 50%% of daily quota used even if sync runs 24h)'); WP_CLI::line(''); } diff --git a/wp-content/plugins/mls-by-hansonxyz/includes/class-mls-cluster.php b/wp-content/plugins/mls-by-hansonxyz/includes/class-mls-cluster.php index 06414b86..a2cccccb 100755 --- a/wp-content/plugins/mls-by-hansonxyz/includes/class-mls-cluster.php +++ b/wp-content/plugins/mls-by-hansonxyz/includes/class-mls-cluster.php @@ -250,7 +250,8 @@ class MLS_Cluster { // Build WHERE clause // Exclude properties with invalid coordinates from map display - $where = array('mlg_can_view = 1', 'latitude IS NOT NULL', 'longitude IS NOT NULL', 'coordinates_invalid = 0'); + // Also exclude properties with no price or price < 100 (invalid data) + $where = array('mlg_can_view = 1', 'latitude IS NOT NULL', 'longitude IS NOT NULL', 'coordinates_invalid = 0', 'list_price >= 100'); $values = array(); // Add state filter (MN, IA only) @@ -484,6 +485,11 @@ class MLS_Cluster { $street = implode(' ', $address_parts); $full_address = $street ? $street . ', ' . $property->city : $property->city; + // Get image URL with signature + $image_url = function_exists('mls_get_image_url') + ? mls_get_image_url($property->listing_key, 1, 'thumb') + : ''; + $markers[] = array( 'id' => $property->listing_key, 'lat' => (float) $property->latitude, @@ -495,6 +501,7 @@ class MLS_Cluster { 'baths' => $property->bathrooms_total, 'sqft' => $property->living_area, 'status' => $property->standard_status, + 'image' => $image_url, ); } @@ -572,8 +579,8 @@ class MLS_Cluster { global $wpdb; $table = $this->db->properties_table(); - // Exclude properties with invalid coordinates - $where = array('mlg_can_view = 1', 'latitude IS NOT NULL', 'longitude IS NOT NULL', 'coordinates_invalid = 0'); + // Exclude properties with invalid coordinates or invalid price + $where = array('mlg_can_view = 1', 'latitude IS NOT NULL', 'longitude IS NOT NULL', 'coordinates_invalid = 0', 'list_price >= 100'); $values = array(); // Add state filter (MN, IA only) diff --git a/wp-content/plugins/mls-by-hansonxyz/includes/class-mls-manual-property.php b/wp-content/plugins/mls-by-hansonxyz/includes/class-mls-manual-property.php new file mode 100755 index 00000000..f8236b89 --- /dev/null +++ b/wp-content/plugins/mls-by-hansonxyz/includes/class-mls-manual-property.php @@ -0,0 +1,1256 @@ +db = $db ?: new MLS_DB(); + + // Load geocoder if available + if (class_exists('MLS_Geocoder')) { + $this->geocoder = new MLS_Geocoder(); + } + + $this->init_hooks(); + } + + /** + * Initialize hooks + */ + private function init_hooks() { + // Register CPT + add_action('init', array($this, 'register_post_type')); + + // Register ACF fields + add_action('acf/init', array($this, 'register_acf_fields')); + + // Sync to database on save + add_action('acf/save_post', array($this, 'sync_to_database'), 20); + + // Delete from database on trash/delete + add_action('wp_trash_post', array($this, 'on_trash_post')); + add_action('before_delete_post', array($this, 'on_delete_post')); + + // Restore from trash + add_action('untrashed_post', array($this, 'on_untrash_post')); + + // Admin columns + add_filter('manage_manual_property_posts_columns', array($this, 'add_admin_columns')); + add_action('manage_manual_property_posts_custom_column', array($this, 'render_admin_columns'), 10, 2); + add_filter('manage_edit-manual_property_sortable_columns', array($this, 'sortable_columns')); + + // Admin row actions + add_filter('post_row_actions', array($this, 'add_row_actions'), 10, 2); + + // Clone from MLS AJAX handlers + add_action('wp_ajax_mls_search_for_clone', array($this, 'ajax_search_for_clone')); + add_action('wp_ajax_mls_clone_listing', array($this, 'ajax_clone_listing')); + + // Admin scripts + add_action('admin_enqueue_scripts', array($this, 'enqueue_admin_scripts')); + + // Add clone button to admin + add_action('edit_form_top', array($this, 'render_clone_button')); + } + + /** + * Register the Custom Post Type + */ + public function register_post_type() { + $labels = array( + 'name' => 'Manual Properties', + 'singular_name' => 'Manual Property', + 'menu_name' => 'Manual Properties', + 'add_new' => 'Add Property', + 'add_new_item' => 'Add New Property', + 'edit_item' => 'Edit Property', + 'new_item' => 'New Property', + 'view_item' => 'View Property', + 'search_items' => 'Search Properties', + 'not_found' => 'No properties found', + 'not_found_in_trash' => 'No properties found in trash', + 'all_items' => 'All Properties', + ); + + $args = array( + 'labels' => $labels, + 'public' => false, + 'show_ui' => true, + 'show_in_menu' => true, + 'menu_position' => 26, + 'menu_icon' => 'dashicons-building', + 'capability_type' => 'post', + 'hierarchical' => false, + 'supports' => array('title'), + 'has_archive' => false, + 'rewrite' => false, + 'query_var' => false, + 'show_in_rest' => false, + ); + + register_post_type('manual_property', $args); + } + + /** + * Register ACF fields programmatically + */ + public function register_acf_fields() { + if (!function_exists('acf_add_local_field_group')) { + return; + } + + acf_add_local_field_group(array( + 'key' => 'group_manual_property', + 'title' => 'Property Details', + 'fields' => $this->get_field_definitions(), + 'location' => array( + array( + array( + 'param' => 'post_type', + 'operator' => '==', + 'value' => 'manual_property', + ), + ), + ), + 'menu_order' => 0, + 'position' => 'normal', + 'style' => 'default', + 'label_placement' => 'top', + 'instruction_placement' => 'label', + )); + } + + /** + * Get ACF field definitions + */ + private function get_field_definitions() { + return array( + // Tab: Basic Info + array( + 'key' => 'field_mp_tab_basic', + 'label' => 'Basic Info', + 'type' => 'tab', + ), + array( + 'key' => 'field_mp_listing_id', + 'label' => 'MLS #', + 'name' => 'listing_id', + 'type' => 'text', + 'instructions' => 'Optional. If set, this listing will override any MLS-synced listing with the same MLS ID.', + ), + array( + 'key' => 'field_mp_standard_status', + 'label' => 'Status', + 'name' => 'standard_status', + 'type' => 'select', + 'choices' => array( + 'Active' => 'Active', + 'Pending' => 'Pending', + 'Sold' => 'Sold', + 'Cancelled' => 'Cancelled', + 'Expired' => 'Expired', + 'Withdrawn' => 'Withdrawn', + ), + 'default_value' => 'Active', + 'required' => 1, + ), + array( + 'key' => 'field_mp_list_price', + 'label' => 'List Price', + 'name' => 'list_price', + 'type' => 'number', + 'prepend' => '$', + 'min' => 0, + ), + array( + 'key' => 'field_mp_close_price', + 'label' => 'Close Price', + 'name' => 'close_price', + 'type' => 'number', + 'prepend' => '$', + 'min' => 0, + 'instructions' => 'Final sale price (for sold properties).', + ), + array( + 'key' => 'field_mp_property_type', + 'label' => 'Property Type', + 'name' => 'property_type', + 'type' => 'select', + 'choices' => array( + 'Residential' => 'Residential', + 'Land' => 'Land', + 'Commercial' => 'Commercial', + 'Multi-Family' => 'Multi-Family', + 'Farm' => 'Farm', + ), + 'default_value' => 'Residential', + ), + array( + 'key' => 'field_mp_property_sub_type', + 'label' => 'Property Subtype', + 'name' => 'property_sub_type', + 'type' => 'text', + 'instructions' => 'E.g., Single Family, Townhouse, Condo, etc.', + ), + array( + 'key' => 'field_mp_is_homeproz', + 'label' => 'HomeProz Listing', + 'name' => 'is_homeproz', + 'type' => 'true_false', + 'message' => 'This is a HomeProz listing', + 'default_value' => 1, + 'ui' => 1, + ), + array( + 'key' => 'field_mp_is_featured', + 'label' => 'Featured Listing', + 'name' => 'is_featured', + 'type' => 'true_false', + 'message' => 'Feature this listing on the homepage', + 'default_value' => 0, + 'ui' => 1, + ), + + // Tab: Location + array( + 'key' => 'field_mp_tab_location', + 'label' => 'Location', + 'type' => 'tab', + ), + array( + 'key' => 'field_mp_full_address', + 'label' => 'Full Address', + 'name' => 'full_address', + 'type' => 'text', + 'instructions' => 'Enter the full address. City, state, zip, and coordinates will be auto-filled via geocoding.', + 'placeholder' => '123 Main St, Albert Lea, MN 56007', + ), + array( + 'key' => 'field_mp_unit_number', + 'label' => 'Unit Number', + 'name' => 'unit_number', + 'type' => 'text', + ), + array( + 'key' => 'field_mp_city', + 'label' => 'City', + 'name' => 'city', + 'type' => 'text', + 'instructions' => 'Auto-filled from geocoding, but can be edited.', + ), + array( + 'key' => 'field_mp_state', + 'label' => 'State', + 'name' => 'state_or_province', + 'type' => 'text', + 'default_value' => 'MN', + ), + array( + 'key' => 'field_mp_postal_code', + 'label' => 'ZIP Code', + 'name' => 'postal_code', + 'type' => 'text', + ), + array( + 'key' => 'field_mp_county', + 'label' => 'County', + 'name' => 'county', + 'type' => 'text', + ), + array( + 'key' => 'field_mp_latitude', + 'label' => 'Latitude', + 'name' => 'latitude', + 'type' => 'number', + 'step' => 'any', + 'instructions' => 'Auto-filled from geocoding.', + ), + array( + 'key' => 'field_mp_longitude', + 'label' => 'Longitude', + 'name' => 'longitude', + 'type' => 'number', + 'step' => 'any', + 'instructions' => 'Auto-filled from geocoding.', + ), + + // Tab: Property Details + array( + 'key' => 'field_mp_tab_details', + 'label' => 'Details', + 'type' => 'tab', + ), + array( + 'key' => 'field_mp_beds', + 'label' => 'Bedrooms', + 'name' => 'bedrooms_total', + 'type' => 'number', + 'min' => 0, + ), + array( + 'key' => 'field_mp_baths', + 'label' => 'Bathrooms', + 'name' => 'bathrooms_total', + 'type' => 'number', + 'min' => 0, + 'step' => 0.5, + ), + array( + 'key' => 'field_mp_baths_full', + 'label' => 'Full Bathrooms', + 'name' => 'bathrooms_full', + 'type' => 'number', + 'min' => 0, + ), + array( + 'key' => 'field_mp_baths_half', + 'label' => 'Half Bathrooms', + 'name' => 'bathrooms_half', + 'type' => 'number', + 'min' => 0, + ), + array( + 'key' => 'field_mp_sqft', + 'label' => 'Square Feet', + 'name' => 'living_area', + 'type' => 'number', + 'min' => 0, + 'append' => 'sq ft', + ), + array( + 'key' => 'field_mp_lot_acres', + 'label' => 'Lot Size (Acres)', + 'name' => 'lot_size_area', + 'type' => 'number', + 'min' => 0, + 'step' => 0.01, + ), + array( + 'key' => 'field_mp_year_built', + 'label' => 'Year Built', + 'name' => 'year_built', + 'type' => 'number', + 'min' => 1800, + 'max' => 2100, + ), + array( + 'key' => 'field_mp_stories', + 'label' => 'Stories', + 'name' => 'stories', + 'type' => 'number', + 'min' => 0, + ), + array( + 'key' => 'field_mp_garage', + 'label' => 'Garage Spaces', + 'name' => 'garage_spaces', + 'type' => 'number', + 'min' => 0, + ), + array( + 'key' => 'field_mp_style', + 'label' => 'Architectural Style', + 'name' => 'architectural_style', + 'type' => 'text', + ), + + // Tab: Description + array( + 'key' => 'field_mp_tab_description', + 'label' => 'Description', + 'type' => 'tab', + ), + array( + 'key' => 'field_mp_remarks', + 'label' => 'Public Description', + 'name' => 'public_remarks', + 'type' => 'textarea', + 'rows' => 6, + ), + array( + 'key' => 'field_mp_private_remarks', + 'label' => 'Private Notes', + 'name' => 'private_remarks', + 'type' => 'textarea', + 'rows' => 3, + 'instructions' => 'Internal notes (not shown on frontend).', + ), + + // Tab: Media + array( + 'key' => 'field_mp_tab_media', + 'label' => 'Media', + 'type' => 'tab', + ), + array( + 'key' => 'field_mp_gallery', + 'label' => 'Property Photos', + 'name' => 'gallery', + 'type' => 'gallery', + 'return_format' => 'array', + 'preview_size' => 'medium', + 'library' => 'all', + 'min' => 0, + 'max' => 50, + 'instructions' => 'Upload property photos. First image is the primary photo.', + ), + + // Tab: Agent + array( + 'key' => 'field_mp_tab_agent', + 'label' => 'Agent', + 'type' => 'tab', + ), + array( + 'key' => 'field_mp_agent', + 'label' => 'Listing Agent', + 'name' => 'agent', + 'type' => 'post_object', + 'post_type' => array('agent'), + 'return_format' => 'id', + 'allow_null' => 1, + ), + array( + 'key' => 'field_mp_co_agent', + 'label' => 'Co-Listing Agent', + 'name' => 'co_list_agent', + 'type' => 'post_object', + 'post_type' => array('agent'), + 'return_format' => 'id', + 'allow_null' => 1, + ), + + // Tab: Dates + array( + 'key' => 'field_mp_tab_dates', + 'label' => 'Dates', + 'type' => 'tab', + ), + array( + 'key' => 'field_mp_list_date', + 'label' => 'List Date', + 'name' => 'list_date', + 'type' => 'date_picker', + 'display_format' => 'F j, Y', + 'return_format' => 'Y-m-d', + ), + array( + 'key' => 'field_mp_contract_date', + 'label' => 'Contract Date', + 'name' => 'contract_date', + 'type' => 'date_picker', + 'display_format' => 'F j, Y', + 'return_format' => 'Y-m-d', + ), + array( + 'key' => 'field_mp_close_date', + 'label' => 'Close Date', + 'name' => 'close_date', + 'type' => 'date_picker', + 'display_format' => 'F j, Y', + 'return_format' => 'Y-m-d', + ), + array( + 'key' => 'field_mp_expiration_date', + 'label' => 'Expiration Date', + 'name' => 'expiration_date', + 'type' => 'date_picker', + 'display_format' => 'F j, Y', + 'return_format' => 'Y-m-d', + ), + + // Tab: Additional + array( + 'key' => 'field_mp_tab_additional', + 'label' => 'Additional', + 'type' => 'tab', + ), + array( + 'key' => 'field_mp_virtual_tour', + 'label' => 'Virtual Tour URL', + 'name' => 'virtual_tour_url', + 'type' => 'url', + ), + array( + 'key' => 'field_mp_directions', + 'label' => 'Directions', + 'name' => 'directions', + 'type' => 'textarea', + 'rows' => 3, + ), + array( + 'key' => 'field_mp_hoa_fee', + 'label' => 'HOA/Association Fee', + 'name' => 'association_fee', + 'type' => 'number', + 'prepend' => '$', + 'append' => '/month', + 'min' => 0, + ), + ); + } + + /** + * Sync property data to database on save + */ + public function sync_to_database($post_id) { + // Only for manual_property + if (get_post_type($post_id) !== 'manual_property') { + return; + } + + // Skip autosave + if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) { + return; + } + + // Skip revisions + if (wp_is_post_revision($post_id)) { + return; + } + + // Skip if trashed + if (get_post_status($post_id) === 'trash') { + return; + } + + global $wpdb; + + // Generate listing key + $listing_key = 'MANUAL-' . $post_id; + + // Geocode address if changed + $full_address = get_field('full_address', $post_id); + $this->maybe_geocode_address($post_id, $full_address); + + // Parse address components + $address_parts = $this->parse_address($full_address); + + // Get gallery photos count + $gallery = get_field('gallery', $post_id); + $photos_count = is_array($gallery) ? count($gallery) : 0; + + // Prepare data + $data = array( + 'wp_post_id' => $post_id, + 'listing_key' => $listing_key, + 'listing_id' => get_field('listing_id', $post_id) ?: null, + 'standard_status' => get_field('standard_status', $post_id) ?: 'Active', + 'list_price' => get_field('list_price', $post_id) ?: null, + 'close_price' => get_field('close_price', $post_id) ?: null, + 'original_list_price' => get_field('list_price', $post_id) ?: null, + 'street_number' => $address_parts['street_number'] ?? null, + 'street_name' => $address_parts['street_name'] ?? null, + 'street_suffix' => $address_parts['street_suffix'] ?? null, + 'unit_number' => get_field('unit_number', $post_id) ?: null, + 'full_address' => $full_address ?: null, + 'city' => get_field('city', $post_id) ?: null, + 'state_or_province' => get_field('state_or_province', $post_id) ?: 'MN', + 'postal_code' => get_field('postal_code', $post_id) ?: null, + 'county' => get_field('county', $post_id) ?: null, + 'latitude' => get_field('latitude', $post_id) ?: null, + 'longitude' => get_field('longitude', $post_id) ?: null, + 'property_type' => get_field('property_type', $post_id) ?: null, + 'property_sub_type' => get_field('property_sub_type', $post_id) ?: null, + 'bedrooms_total' => get_field('bedrooms_total', $post_id) ?: null, + 'bathrooms_total' => get_field('bathrooms_total', $post_id) ?: null, + 'bathrooms_full' => get_field('bathrooms_full', $post_id) ?: null, + 'bathrooms_half' => get_field('bathrooms_half', $post_id) ?: null, + 'living_area' => get_field('living_area', $post_id) ?: null, + 'lot_size_area' => get_field('lot_size_area', $post_id) ?: null, + 'lot_size_units' => 'Acres', + 'year_built' => get_field('year_built', $post_id) ?: null, + 'stories' => get_field('stories', $post_id) ?: null, + 'garage_spaces' => get_field('garage_spaces', $post_id) ?: null, + 'architectural_style' => get_field('architectural_style', $post_id) ?: null, + 'public_remarks' => get_field('public_remarks', $post_id) ?: null, + 'private_remarks' => get_field('private_remarks', $post_id) ?: null, + 'directions' => get_field('directions', $post_id) ?: null, + 'list_agent_post_id' => get_field('agent', $post_id) ?: null, + 'co_list_agent_post_id' => get_field('co_list_agent', $post_id) ?: null, + 'is_homeproz' => get_field('is_homeproz', $post_id) ? 1 : 0, + 'is_featured' => get_field('is_featured', $post_id) ? 1 : 0, + 'virtual_tour_url' => get_field('virtual_tour_url', $post_id) ?: null, + 'association_fee' => get_field('association_fee', $post_id) ?: null, + 'list_date' => get_field('list_date', $post_id) ?: null, + 'contract_date' => get_field('contract_date', $post_id) ?: null, + 'close_date' => get_field('close_date', $post_id) ?: null, + 'expiration_date' => get_field('expiration_date', $post_id) ?: null, + 'photos_count' => $photos_count, + ); + + // Check if record exists + $table = $this->db->manual_properties_table(); + $exists = $wpdb->get_var($wpdb->prepare( + "SELECT id FROM {$table} WHERE wp_post_id = %d", + $post_id + )); + + if ($exists) { + $wpdb->update($table, $data, array('wp_post_id' => $post_id)); + } else { + $wpdb->insert($table, $data); + } + } + + /** + * Geocode address if changed + */ + private function maybe_geocode_address($post_id, $full_address) { + if (!$this->geocoder || empty($full_address)) { + return; + } + + // Check if address changed + $stored_address = get_post_meta($post_id, '_geocoded_address', true); + if ($stored_address === $full_address) { + return; // Already geocoded + } + + // Geocode the address + $result = $this->geocoder->geocode($full_address); + if (!$result) { + return; + } + + // Update fields + if (!empty($result['city'])) { + update_field('city', $result['city'], $post_id); + } + if (!empty($result['state'])) { + update_field('state_or_province', $result['state'], $post_id); + } + if (!empty($result['postal_code'])) { + update_field('postal_code', $result['postal_code'], $post_id); + } + if (!empty($result['county'])) { + update_field('county', $result['county'], $post_id); + } + if (!empty($result['latitude'])) { + update_field('latitude', $result['latitude'], $post_id); + } + if (!empty($result['longitude'])) { + update_field('longitude', $result['longitude'], $post_id); + } + + // Mark as geocoded + update_post_meta($post_id, '_geocoded_address', $full_address); + } + + /** + * Parse address string into components + */ + private function parse_address($address) { + if (empty($address)) { + return array(); + } + + $parts = array(); + + // Try to extract street number + if (preg_match('/^(\d+)\s+/', $address, $matches)) { + $parts['street_number'] = $matches[1]; + $address = trim(substr($address, strlen($matches[0]))); + } + + // Try to extract street suffix from common patterns + $suffixes = array('St', 'Street', 'Ave', 'Avenue', 'Blvd', 'Boulevard', 'Dr', 'Drive', 'Ln', 'Lane', 'Rd', 'Road', 'Way', 'Ct', 'Court', 'Cir', 'Circle', 'Pl', 'Place'); + foreach ($suffixes as $suffix) { + if (preg_match('/^(.+?)\s+(' . preg_quote($suffix, '/') . ')\b/i', $address, $matches)) { + $parts['street_name'] = $matches[1]; + $parts['street_suffix'] = $matches[2]; + break; + } + } + + return $parts; + } + + /** + * Handle post trash + */ + public function on_trash_post($post_id) { + if (get_post_type($post_id) !== 'manual_property') { + return; + } + + global $wpdb; + $table = $this->db->manual_properties_table(); + + // Update status to indicate trashed (optional: could also delete) + $wpdb->update( + $table, + array('standard_status' => 'Withdrawn'), + array('wp_post_id' => $post_id) + ); + } + + /** + * Handle post delete + */ + public function on_delete_post($post_id) { + if (get_post_type($post_id) !== 'manual_property') { + return; + } + + global $wpdb; + $table = $this->db->manual_properties_table(); + + $wpdb->delete($table, array('wp_post_id' => $post_id)); + } + + /** + * Handle post restore from trash + */ + public function on_untrash_post($post_id) { + if (get_post_type($post_id) !== 'manual_property') { + return; + } + + // Re-sync to database + $this->sync_to_database($post_id); + } + + /** + * Add admin columns + */ + public function add_admin_columns($columns) { + $new_columns = array(); + + foreach ($columns as $key => $value) { + $new_columns[$key] = $value; + if ($key === 'title') { + $new_columns['mp_status'] = 'Status'; + $new_columns['mp_price'] = 'Price'; + $new_columns['mp_city'] = 'City'; + $new_columns['mp_homeproz'] = 'HomeProz'; + $new_columns['mp_featured'] = 'Featured'; + $new_columns['mp_view'] = 'View'; + } + } + + // Remove date column, move to end + if (isset($new_columns['date'])) { + unset($new_columns['date']); + $new_columns['date'] = 'Date'; + } + + return $new_columns; + } + + /** + * Render admin column values + */ + public function render_admin_columns($column, $post_id) { + switch ($column) { + case 'mp_status': + $status = get_field('standard_status', $post_id); + $status_colors = array( + 'Active' => '#28a745', + 'Pending' => '#ffc107', + 'Sold' => '#6c757d', + 'Cancelled' => '#dc3545', + 'Expired' => '#6c757d', + 'Withdrawn' => '#6c757d', + ); + $color = $status_colors[$status] ?? '#6c757d'; + echo '' . esc_html($status) . ''; + break; + + case 'mp_price': + $price = get_field('list_price', $post_id); + echo $price ? '$' . number_format($price) : '-'; + break; + + case 'mp_city': + echo esc_html(get_field('city', $post_id) ?: '-'); + break; + + case 'mp_homeproz': + echo get_field('is_homeproz', $post_id) ? 'Yes' : 'No'; + break; + + case 'mp_featured': + echo get_field('is_featured', $post_id) ? 'Yes' : 'No'; + break; + + case 'mp_view': + $listing_key = 'MANUAL-' . $post_id; + $url = add_query_arg('listing', $listing_key, home_url('/properties/')); + echo 'View'; + break; + } + } + + /** + * Make columns sortable + */ + public function sortable_columns($columns) { + $columns['mp_status'] = 'mp_status'; + $columns['mp_price'] = 'mp_price'; + $columns['mp_city'] = 'mp_city'; + return $columns; + } + + /** + * Add row actions + */ + public function add_row_actions($actions, $post) { + if ($post->post_type !== 'manual_property') { + return $actions; + } + + // Add view link + $listing_key = 'MANUAL-' . $post->ID; + $url = add_query_arg('listing', $listing_key, home_url('/properties/')); + $actions['view_property'] = 'View Property'; + + return $actions; + } + + /** + * Enqueue admin scripts + */ + public function enqueue_admin_scripts($hook) { + global $post_type; + + if ($post_type !== 'manual_property') { + return; + } + + wp_enqueue_script( + 'mls-manual-property-admin', + MLS_PLUGIN_URL . 'admin/js/manual-property.js', + array('jquery'), + MLS_PLUGIN_VERSION, + true + ); + + wp_localize_script('mls-manual-property-admin', 'mlsManualProperty', array( + 'ajaxUrl' => admin_url('admin-ajax.php'), + 'nonce' => wp_create_nonce('mls_clone_listing'), + )); + + wp_enqueue_style( + 'mls-manual-property-admin', + MLS_PLUGIN_URL . 'admin/css/manual-property.css', + array(), + MLS_PLUGIN_VERSION + ); + } + + /** + * Render clone button on add new page + */ + public function render_clone_button($post) { + if ($post->post_type !== 'manual_property') { + return; + } + + // Only show on new posts + if ($post->post_status !== 'auto-draft') { + return; + } + + ?> +
+

Clone from MLS Listing

+

Enter an MLS ID to copy data from an existing MLS listing:

+ + + +
+ $property->listing_key, + 'listing_id' => $property->listing_id, + 'address' => trim($property->street_number . ' ' . $property->street_name . ' ' . $property->street_suffix), + 'city' => $property->city, + 'price' => $property->list_price, + )); + } + + /** + * AJAX: Clone MLS listing + */ + public function ajax_clone_listing() { + check_ajax_referer('mls_clone_listing', 'nonce'); + + if (!current_user_can('edit_posts')) { + wp_send_json_error('Unauthorized'); + } + + $listing_key = sanitize_text_field($_POST['listing_key'] ?? ''); + $post_id = intval($_POST['post_id'] ?? 0); + + if (empty($listing_key) || !$post_id) { + wp_send_json_error('Missing parameters'); + } + + $property = mls_get_property($listing_key); + if (!$property) { + wp_send_json_error('Listing not found'); + } + + // Clone field values + $this->clone_property_fields($post_id, $property); + + // Clone images + $images_imported = $this->clone_property_images($post_id, $listing_key); + + wp_send_json_success(array( + 'message' => 'Listing cloned successfully', + 'images_imported' => $images_imported, + )); + } + + /** + * Clone property fields from MLS listing + */ + private function clone_property_fields($post_id, $property) { + // Update post title and change status from auto-draft to publish + $address = trim($property->street_number . ' ' . $property->street_name . ' ' . $property->street_suffix); + $title = $address . ', ' . $property->city . ', ' . $property->state_or_province . ' ' . $property->postal_code; + wp_update_post(array( + 'ID' => $post_id, + 'post_title' => $title, + 'post_status' => 'publish', + )); + + // Map MLS fields to ACF fields + $field_map = array( + 'listing_id' => $property->listing_id, + 'standard_status' => $property->standard_status, + 'list_price' => $property->list_price, + 'close_price' => $property->close_price, + 'property_type' => $property->property_type, + 'property_sub_type' => $property->property_sub_type, + 'is_homeproz' => $property->is_homeproz ? 1 : 0, + 'full_address' => $address . ', ' . $property->city . ', ' . $property->state_or_province . ' ' . $property->postal_code, + 'unit_number' => $property->unit_number, + 'city' => $property->city, + 'state_or_province' => $property->state_or_province, + 'postal_code' => $property->postal_code, + 'county' => $property->county, + 'latitude' => $property->latitude, + 'longitude' => $property->longitude, + 'bedrooms_total' => $property->bedrooms_total, + 'bathrooms_total' => $property->bathrooms_total, + 'bathrooms_full' => $property->bathrooms_full, + 'bathrooms_half' => $property->bathrooms_half, + 'living_area' => $property->living_area, + 'lot_size_area' => $property->lot_size_area, + 'year_built' => $property->year_built, + 'garage_spaces' => $property->garage_spaces, + 'public_remarks' => $property->public_remarks, + 'directions' => $property->directions, + 'list_date' => $property->listing_contract_date, + 'close_date' => $property->close_date, + ); + + foreach ($field_map as $field_name => $value) { + if ($value !== null && $value !== '') { + update_field($field_name, $value, $post_id); + } + } + + // Match and set listing agent by MLS ID + if (!empty($property->list_agent_mls_id)) { + $agent_post_id = $this->find_agent_by_mls_id($property->list_agent_mls_id); + if ($agent_post_id) { + update_field('agent', $agent_post_id, $post_id); + } + } + + // Match and set co-listing agent by MLS ID + if (!empty($property->co_list_agent_mls_id)) { + $co_agent_post_id = $this->find_agent_by_mls_id($property->co_list_agent_mls_id); + if ($co_agent_post_id) { + update_field('co_list_agent', $co_agent_post_id, $post_id); + } + } + + // Mark the geocoded address + update_post_meta($post_id, '_geocoded_address', $field_map['full_address']); + } + + /** + * Clone property images from MLS listing + */ + private function clone_property_images($post_id, $listing_key) { + // Get all images for the listing (fetch up to 20 on-demand) + $media = mls_get_property_images($listing_key, 20); + + if (empty($media)) { + return 0; + } + + $attachment_ids = array(); + $imported = 0; + + foreach ($media as $item) { + // Try local_url first, then use the image endpoint URL which fetches on-demand + $image_url = null; + + if (!empty($item->local_url)) { + $image_url = $item->local_url; + } elseif (function_exists('mls_get_image_url')) { + // Use the image endpoint which will fetch on-demand and return the image + $image_url = mls_get_image_url($listing_key, $item->media_order, 'full'); + } + + if (empty($image_url)) { + continue; + } + + // Download image to media library + $attachment_id = $this->sideload_image($image_url, $post_id); + if ($attachment_id) { + $attachment_ids[] = $attachment_id; + $imported++; + } + + // Limit to 20 images to avoid timeout + if ($imported >= 20) { + break; + } + } + + // Update gallery field + if (!empty($attachment_ids)) { + update_field('gallery', $attachment_ids, $post_id); + } + + return $imported; + } + + /** + * Find an Agent CPT post by MLS ID + * + * @param string $mls_id The agent's MLS ID + * @return int|null Agent post ID or null if not found + */ + private function find_agent_by_mls_id($mls_id) { + if (empty($mls_id)) { + return null; + } + + $agent_query = new WP_Query(array( + 'post_type' => 'agent', + 'posts_per_page' => 1, + 'post_status' => 'publish', + 'meta_query' => array( + array( + 'key' => 'agent_mls_id', + 'value' => $mls_id, + 'compare' => '=', + ), + ), + )); + + $agent_id = null; + if ($agent_query->have_posts()) { + $agent_id = $agent_query->posts[0]->ID; + } + wp_reset_postdata(); + + return $agent_id; + } + + /** + * Sideload image to media library + */ + private function sideload_image($url, $post_id) { + require_once ABSPATH . 'wp-admin/includes/media.php'; + require_once ABSPATH . 'wp-admin/includes/file.php'; + require_once ABSPATH . 'wp-admin/includes/image.php'; + + // Download file + $tmp = download_url($url); + if (is_wp_error($tmp)) { + return 0; + } + + // Get filename from URL + $filename = basename(parse_url($url, PHP_URL_PATH)); + + $file_array = array( + 'name' => $filename, + 'tmp_name' => $tmp, + ); + + // Sideload to media library + $attachment_id = media_handle_sideload($file_array, $post_id); + + if (is_wp_error($attachment_id)) { + @unlink($tmp); + return 0; + } + + return $attachment_id; + } + + /** + * Get all manual property listing IDs that should override MLS + * + * @return array Array of MLS IDs (listing_id) that have manual overrides + */ + public static function get_override_listing_ids() { + global $wpdb; + + $db = new MLS_DB(); + $table = $db->manual_properties_table(); + + // Check if table exists + $table_exists = $wpdb->get_var($wpdb->prepare( + "SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = %s AND TABLE_NAME = %s", + DB_NAME, + $table + )); + + if (!$table_exists) { + return array(); + } + + $ids = $wpdb->get_col( + "SELECT listing_id FROM {$table} + WHERE listing_id IS NOT NULL + AND listing_id != '' + AND standard_status NOT IN ('Withdrawn')" + ); + + return array_filter($ids); + } + + /** + * Get images for a manual property + * + * @param string $listing_key Manual property listing key (MANUAL-xxx) + * @return array Array of image objects compatible with MLS media format + */ + public static function get_manual_property_images($listing_key) { + // Extract post ID from listing key + if (strpos($listing_key, 'MANUAL-') !== 0) { + return array(); + } + + $post_id = (int) str_replace('MANUAL-', '', $listing_key); + if (!$post_id) { + return array(); + } + + $gallery = get_field('gallery', $post_id); + if (empty($gallery) || !is_array($gallery)) { + return array(); + } + + $images = array(); + $order = 0; + + foreach ($gallery as $image) { + $order++; + $images[] = (object) array( + 'id' => $image['ID'], + 'listing_key' => $listing_key, + 'media_key' => 'manual-' . $image['ID'], + 'media_type' => 'Photo', + 'media_order' => $order, + 'media_url' => $image['url'], + 'local_path' => get_attached_file($image['ID']), + 'local_url' => $image['url'], + 'file_size' => filesize(get_attached_file($image['ID'])) ?: null, + 'mime_type' => $image['mime_type'], + 'image_width' => $image['width'], + 'image_height' => $image['height'], + 'downloaded_at' => get_the_date('Y-m-d H:i:s', $image['ID']), + 'download_status' => 'complete', + ); + } + + return $images; + } + + /** + * Get a manual property by listing key or listing ID + * + * @param string $identifier Listing key (MANUAL-xxx) or listing_id + * @return object|null + */ + public static function get_manual_property($identifier) { + global $wpdb; + + $db = new MLS_DB(); + $table = $db->manual_properties_table(); + + // Check if table exists + $table_exists = $wpdb->get_var($wpdb->prepare( + "SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = %s AND TABLE_NAME = %s", + DB_NAME, + $table + )); + + if (!$table_exists) { + return null; + } + + // Try by listing_key first + $property = $wpdb->get_row($wpdb->prepare( + "SELECT * FROM {$table} WHERE listing_key = %s", + $identifier + )); + + if (!$property) { + // Try by listing_id + $property = $wpdb->get_row($wpdb->prepare( + "SELECT * FROM {$table} WHERE listing_id = %s", + $identifier + )); + } + + return $property; + } +} diff --git a/wp-content/plugins/mls-by-hansonxyz/includes/class-mls-media-handler.php b/wp-content/plugins/mls-by-hansonxyz/includes/class-mls-media-handler.php index 976fafa2..f439e784 100755 --- a/wp-content/plugins/mls-by-hansonxyz/includes/class-mls-media-handler.php +++ b/wp-content/plugins/mls-by-hansonxyz/includes/class-mls-media-handler.php @@ -464,6 +464,9 @@ class MLS_Media_Handler { * Uses MySQL advisory lock to ensure only one request downloads * a specific image at a time (prevents stampede on cold cache). * + * Respects daily data budget - if approaching limit, will skip fetch + * and return null (graceful degradation). + * * @param object $media Media record * @return string|null Local URL on success, null on failure */ @@ -474,6 +477,17 @@ class MLS_Media_Handler { return null; } + // Check daily data budget before fetching + $rate_limiter = mls_plugin()->get_rate_limiter(); + if (!$rate_limiter->can_fetch_image()) { + $this->logger->warning('Daily data budget exhausted, skipping image fetch', array( + 'listing_key' => $media->listing_key, + 'media_key' => $media->media_key, + 'remaining_bytes' => $rate_limiter->get_daily_data_remaining(), + )); + return null; + } + // Advisory lock key - unique per media record $lock_name = 'mls_media_' . $media->id; $lock_timeout = 35; // Slightly longer than HTTP timeout @@ -516,9 +530,16 @@ class MLS_Media_Handler { } // Download the image - $response = wp_remote_get($media->media_url, array( + $request_args = array( 'timeout' => 30, - )); + ); + + // Allow skipping SSL verification if configured (for expired certs) + if (defined('MLS_SKIP_SSL_VERIFY') && MLS_SKIP_SSL_VERIFY) { + $request_args['sslverify'] = false; + } + + $response = wp_remote_get($media->media_url, $request_args); if (is_wp_error($response)) { $this->logger->warning('Media fetch failed', array( @@ -545,6 +566,10 @@ class MLS_Media_Handler { return null; } + // Record bytes downloaded against daily data cap + $bytes_downloaded = strlen($body); + $rate_limiter->record_data_transfer($bytes_downloaded); + // Determine extension $content_type = wp_remote_retrieve_header($response, 'content-type'); $extension = $this->get_extension_from_content_type($content_type, $media->media_url); @@ -598,7 +623,7 @@ class MLS_Media_Handler { $this->logger->debug('Media fetched and cached', array( 'listing_key' => $media->listing_key, 'media_key' => $media->media_key, - 'original_size' => strlen($body), + 'bytes_downloaded' => $bytes_downloaded, 'final_size' => $final_size, 'converted' => $conversion['converted'], )); diff --git a/wp-content/plugins/mls-by-hansonxyz/includes/class-mls-query.php b/wp-content/plugins/mls-by-hansonxyz/includes/class-mls-query.php index e9033a18..f13d1e7d 100755 --- a/wp-content/plugins/mls-by-hansonxyz/includes/class-mls-query.php +++ b/wp-content/plugins/mls-by-hansonxyz/includes/class-mls-query.php @@ -164,6 +164,9 @@ class MLS_Query { /** * Get properties matching criteria * + * Queries both MLS and manual properties, excluding MLS entries + * that have manual overrides. + * * @param array $args Query arguments * @return array Property objects */ @@ -190,6 +193,7 @@ class MLS_Query { 'year_built_max' => null, 'listing_key' => null, 'listing_id' => null, + 'agent_mls_id' => null, // Filter by list_agent_mls_id 'search' => null, // Search in address/remarks 'bounds' => null, // Map bounds: array(sw_lat, sw_lng, ne_lat, ne_lng) 'center' => null, // Map center for distance sort: array(lat, lng) @@ -199,11 +203,15 @@ class MLS_Query { 'orderby' => 'modification_timestamp', 'order' => 'DESC', 'include_media' => false, + 'include_manual' => true, // Include manual properties 'fields' => '*', // Specific fields or * ); $args = wp_parse_args($args, $defaults); + // Get manual override IDs to exclude from MLS query + $override_ids = $args['include_manual'] ? $this->get_manual_override_listing_ids() : array(); + // Build query $table = $this->db->properties_table(); @@ -218,7 +226,8 @@ class MLS_Query { $sql = "SELECT {$select} FROM {$table}"; // WHERE conditions - $where = array('mlg_can_view = 1'); + // Exclude properties with no price or price < 100 (invalid data) + $where = array('mlg_can_view = 1', 'list_price >= 100'); $values = array(); // Add state filter (MN and IA only) @@ -230,6 +239,12 @@ class MLS_Query { // Exclude TBD addresses $where[] = $this->get_tbd_exclusion_filter(); + // Exclude MLS properties that have manual overrides + if (!empty($override_ids)) { + $placeholders = implode(',', array_fill(0, count($override_ids), '%s')); + $where[] = $wpdb->prepare("listing_id NOT IN ({$placeholders})", $override_ids); + } + if ($args['status']) { $where[] = 'standard_status = %s'; $values[] = $args['status']; @@ -270,6 +285,11 @@ class MLS_Query { $values[] = $args['county']; } + if ($args['agent_mls_id']) { + $where[] = 'list_agent_mls_id = %s'; + $values[] = $args['agent_mls_id']; + } + if ($args['min_price']) { $where[] = 'list_price >= %d'; $values[] = (int) $args['min_price']; @@ -397,9 +417,59 @@ class MLS_Query { $values[] = (int) $args['limit']; $values[] = (int) $args['offset']; - // Execute + // Execute MLS query $results = $wpdb->get_results($wpdb->prepare($sql, $values)); + // Query manual properties with same filters + if ($args['include_manual']) { + $manual_results = $this->get_manual_properties($args); + if (!empty($manual_results)) { + // Merge manual properties with MLS results + $results = array_merge($manual_results, $results); + + // Re-sort: HomeProz first, then featured, then by orderby + $featured_ids = !empty($args['featured_ids']) ? (array) $args['featured_ids'] : array(); + $order_desc = strtoupper($args['order']) !== 'ASC'; + $orderby = $args['orderby']; + + usort($results, function($a, $b) use ($featured_ids, $order_desc, $orderby) { + // 1. HomeProz listings first + $a_homeproz = !empty($a->is_homeproz) ? 1 : 0; + $b_homeproz = !empty($b->is_homeproz) ? 1 : 0; + if ($a_homeproz !== $b_homeproz) { + return $b_homeproz - $a_homeproz; + } + + // 2. Featured listings second + $a_featured = in_array($a->listing_id, $featured_ids) || !empty($a->is_featured) ? 1 : 0; + $b_featured = in_array($b->listing_id, $featured_ids) || !empty($b->is_featured) ? 1 : 0; + if ($a_featured !== $b_featured) { + return $b_featured - $a_featured; + } + + // 3. Order by specified field + $a_val = isset($a->$orderby) ? $a->$orderby : ''; + $b_val = isset($b->$orderby) ? $b->$orderby : ''; + + if ($a_val === $b_val) { + return 0; + } + + // Compare as numbers if numeric + if (is_numeric($a_val) && is_numeric($b_val)) { + $cmp = ($a_val < $b_val) ? -1 : 1; + } else { + $cmp = strcmp($a_val, $b_val); + } + + return $order_desc ? -$cmp : $cmp; + }); + + // Apply offset and limit after merge + $results = array_slice($results, (int) $args['offset'], (int) $args['limit']); + } + } + // Include media if requested if ($args['include_media'] && $results) { foreach ($results as &$property) { @@ -410,15 +480,169 @@ class MLS_Query { return $results; } + /** + * Get manual properties matching criteria + * + * @param array $args Query arguments (same as get_properties) + * @return array Manual property objects + */ + private function get_manual_properties($args) { + global $wpdb; + + $table = $this->db->manual_properties_table(); + + // Check if table exists + $table_exists = $wpdb->get_var($wpdb->prepare( + "SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = %s AND TABLE_NAME = %s", + DB_NAME, + $table + )); + + if (!$table_exists) { + return array(); + } + + $sql = "SELECT * FROM {$table}"; + $where = array("standard_status != 'Withdrawn'"); + $values = array(); + + if ($args['status']) { + $where[] = 'standard_status = %s'; + $values[] = $args['status']; + } + + if ($args['property_type']) { + $where[] = 'property_type = %s'; + $values[] = $args['property_type']; + } + + if ($args['city']) { + $where[] = 'city = %s'; + $values[] = $args['city']; + } + + if ($args['county']) { + $where[] = 'county = %s'; + $values[] = $args['county']; + } + + if ($args['postal_code']) { + $where[] = 'postal_code = %s'; + $values[] = $args['postal_code']; + } + + if ($args['min_price']) { + $where[] = 'list_price >= %d'; + $values[] = (int) $args['min_price']; + } + + if ($args['max_price']) { + $where[] = 'list_price <= %d'; + $values[] = (int) $args['max_price']; + } + + if ($args['min_beds']) { + $where[] = 'bedrooms_total >= %d'; + $values[] = (int) $args['min_beds']; + } + + if ($args['max_beds']) { + $where[] = 'bedrooms_total <= %d'; + $values[] = (int) $args['max_beds']; + } + + if ($args['min_baths']) { + $where[] = 'bathrooms_total >= %d'; + $values[] = (int) $args['min_baths']; + } + + if ($args['listing_key']) { + $where[] = 'listing_key = %s'; + $values[] = $args['listing_key']; + } + + if ($args['listing_id']) { + $where[] = 'listing_id = %s'; + $values[] = $args['listing_id']; + } + + if ($args['search']) { + $search_term = '%' . $wpdb->esc_like($args['search']) . '%'; + $where[] = '(full_address LIKE %s OR city LIKE %s OR public_remarks LIKE %s OR listing_id LIKE %s)'; + $values[] = $search_term; + $values[] = $search_term; + $values[] = $search_term; + $values[] = $search_term; + } + + // Map bounds filtering + if ($args['bounds'] && is_array($args['bounds']) && count($args['bounds']) === 4) { + list($sw_lat, $sw_lng, $ne_lat, $ne_lng) = $args['bounds']; + $where[] = 'latitude BETWEEN %f AND %f'; + $where[] = 'longitude BETWEEN %f AND %f'; + $where[] = 'latitude IS NOT NULL'; + $where[] = 'longitude IS NOT NULL'; + $values[] = (float) $sw_lat; + $values[] = (float) $ne_lat; + $values[] = (float) $sw_lng; + $values[] = (float) $ne_lng; + } + + // Radius search for manual properties + if ($args['center_lat'] && $args['center_lng']) { + $lat = (float) $args['center_lat']; + $lng = (float) $args['center_lng']; + $radius = (int) $args['radius']; + + // Use simple bounding box for manual properties (no spatial index) + $lat_delta = $radius / 69.0; + $lng_delta = $radius / (69.0 * cos(deg2rad($lat))); + + $where[] = 'latitude BETWEEN %f AND %f'; + $where[] = 'longitude BETWEEN %f AND %f'; + $values[] = $lat - $lat_delta; + $values[] = $lat + $lat_delta; + $values[] = $lng - $lng_delta; + $values[] = $lng + $lng_delta; + } + + $sql .= ' WHERE ' . implode(' AND ', $where); + + // Execute + if (!empty($values)) { + $results = $wpdb->get_results($wpdb->prepare($sql, $values)); + } else { + $results = $wpdb->get_results($sql); + } + + // Normalize results to match MLS schema + foreach ($results as $key => $property) { + $results[$key] = $this->normalize_manual_property($property); + } + + return $results; + } + /** * Get a single property * + * Checks manual properties first (for overrides), then MLS. + * * @param string $identifier Listing key or listing ID + * @param bool $skip_manual_override Skip manual property override (for A/B testing) * @return object|null Property object */ - public function get_property($identifier) { + public function get_property($identifier, $skip_manual_override = false) { global $wpdb; + // Check manual properties first (they can override MLS) + if (!$skip_manual_override) { + $manual = $this->get_manual_property($identifier); + if ($manual) { + return $manual; + } + } + $table = $this->db->properties_table(); // Try listing_key first @@ -435,18 +659,193 @@ class MLS_Query { )); } + // If found by listing_id, check if there's a manual override + if (!$skip_manual_override && $property && $property->listing_id) { + $override_ids = $this->get_manual_override_listing_ids(); + if (in_array($property->listing_id, $override_ids)) { + // Manual override exists, return the manual version + return $this->get_manual_property($property->listing_id); + } + } + return $property; } + /** + * Get a manual property by listing key or listing ID + * + * @param string $identifier Listing key (MANUAL-xxx) or listing_id + * @return object|null Property object normalized to match MLS schema + */ + private function get_manual_property($identifier) { + global $wpdb; + + $table = $this->db->manual_properties_table(); + + // Check if table exists + $table_exists = $wpdb->get_var($wpdb->prepare( + "SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = %s AND TABLE_NAME = %s", + DB_NAME, + $table + )); + + if (!$table_exists) { + return null; + } + + // Try by listing_key first (MANUAL-xxx format) + $property = $wpdb->get_row($wpdb->prepare( + "SELECT * FROM {$table} WHERE listing_key = %s AND standard_status != 'Withdrawn'", + $identifier + )); + + if (!$property) { + // Try by listing_id (MLS ID for overrides) + $property = $wpdb->get_row($wpdb->prepare( + "SELECT * FROM {$table} WHERE listing_id = %s AND standard_status != 'Withdrawn'", + $identifier + )); + } + + if ($property) { + // Normalize to match MLS schema + $property = $this->normalize_manual_property($property); + } + + return $property; + } + + /** + * Normalize a manual property to match MLS schema + * + * @param object $property Manual property row + * @return object Normalized property + */ + private function normalize_manual_property($property) { + global $wpdb; + + // Set defaults for MLS-specific fields + $property->originating_system = 'manual'; + $property->mls_status = null; + $property->mlg_can_view = 1; + $property->original_list_price = $property->original_list_price ?? $property->list_price; + + // For manual properties linked to MLS, use the MLS status and days_on_market + // If not in MLS (no listing_id or MLS listing not found), default to Closed + $property->days_on_market = null; // Default to null (won't display) + + if (!empty($property->listing_id)) { + $mls_table = $this->db->properties_table(); + $mls_data = $wpdb->get_row($wpdb->prepare( + "SELECT standard_status, days_on_market FROM {$mls_table} WHERE listing_id = %s AND mlg_can_view = 1", + $property->listing_id + )); + + if ($mls_data) { + $property->standard_status = $mls_data->standard_status; + $property->mls_status = $mls_data->standard_status; + $property->days_on_market = $mls_data->days_on_market; + } else { + // MLS listing no longer exists - assume Closed + $property->standard_status = 'Closed'; + } + } else { + // No MLS link - pure manual property, assume Closed + $property->standard_status = 'Closed'; + } + + // Get agent info from linked Agent CPT + if (!empty($property->list_agent_post_id)) { + $agent_name = get_the_title($property->list_agent_post_id); + $agent_mls_id = get_field('mls_id', $property->list_agent_post_id); + $property->list_agent_name = $agent_name; + $property->list_agent_mls_id = $agent_mls_id; + $property->list_agent_key = null; + } else { + $property->list_agent_name = null; + $property->list_agent_mls_id = null; + $property->list_agent_key = null; + } + + // Office info (manual listings are HomeProz) + $property->list_office_key = null; + $property->list_office_mls_id = $property->is_homeproz ? (defined('MLS_HOMEPROZ_OFFICE_ID') ? MLS_HOMEPROZ_OFFICE_ID : null) : null; + $property->list_office_name = $property->is_homeproz ? 'HomeProz Real Estate' : null; + + // Date fields + $property->modification_timestamp = $property->updated_at; + $property->photos_change_timestamp = $property->updated_at; + $property->listing_contract_date = $property->list_date; + // days_on_market is set above from MLS data (or null if not in MLS) + $property->media_expires_at = null; + $property->coordinates_invalid = 0; + + // Location column for spatial queries (null for manual) + $property->location = null; + + // Raw data + $property->raw_data = null; + + // Mark as manual for frontend display logic + $property->is_manual = 1; + + return $property; + } + + /** + * Get listing IDs that have manual overrides + * + * @return array Array of MLS listing_id values + */ + private function get_manual_override_listing_ids() { + global $wpdb; + + // Cache result for this request + static $override_ids = null; + if ($override_ids !== null) { + return $override_ids; + } + + $table = $this->db->manual_properties_table(); + + // Check if table exists + $table_exists = $wpdb->get_var($wpdb->prepare( + "SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = %s AND TABLE_NAME = %s", + DB_NAME, + $table + )); + + if (!$table_exists) { + $override_ids = array(); + return $override_ids; + } + + $override_ids = $wpdb->get_col( + "SELECT listing_id FROM {$table} + WHERE listing_id IS NOT NULL + AND listing_id != '' + AND standard_status != 'Withdrawn'" + ); + + return array_filter($override_ids); + } + /** * Get media for a property * + * Handles both MLS and manual properties. + * * @param string $listing_key Listing key * @return array Media objects */ public function get_property_media($listing_key) { global $wpdb; + // Check if this is a manual property + if (strpos($listing_key, 'MANUAL-') === 0) { + return MLS_Manual_Property::get_manual_property_images($listing_key); + } + return $wpdb->get_results($wpdb->prepare( "SELECT * FROM {$this->db->media_table()} WHERE listing_key = %s @@ -540,15 +939,23 @@ class MLS_Query { /** * Get property count * + * Counts both MLS and manual properties. + * * @param array $args Filter arguments (same as get_properties) * @return int Count */ public function get_count($args = array()) { global $wpdb; + $include_manual = !isset($args['include_manual']) || $args['include_manual']; + + // Get override IDs to exclude from MLS count + $override_ids = $include_manual ? $this->get_manual_override_listing_ids() : array(); + $table = $this->db->properties_table(); - $where = array('mlg_can_view = 1'); + // Exclude properties with no price or price < 100 (invalid data) + $where = array('mlg_can_view = 1', 'list_price >= 100'); $values = array(); // Add state filter (MN and IA only) @@ -560,6 +967,12 @@ class MLS_Query { // Exclude TBD addresses $where[] = $this->get_tbd_exclusion_filter(); + // Exclude MLS properties that have manual overrides + if (!empty($override_ids)) { + $placeholders = implode(',', array_fill(0, count($override_ids), '%s')); + $where[] = $wpdb->prepare("listing_id NOT IN ({$placeholders})", $override_ids); + } + if (!empty($args['status'])) { $where[] = 'standard_status = %s'; $values[] = $args['status']; @@ -636,6 +1049,116 @@ class MLS_Query { $sql = "SELECT COUNT(*) FROM {$table} WHERE " . implode(' AND ', $where); + if (!empty($values)) { + $mls_count = (int) $wpdb->get_var($wpdb->prepare($sql, $values)); + } else { + $mls_count = (int) $wpdb->get_var($sql); + } + + // Add manual property count + if ($include_manual) { + $manual_count = $this->get_manual_count($args); + return $mls_count + $manual_count; + } + + return $mls_count; + } + + /** + * Get manual property count + * + * @param array $args Filter arguments + * @return int Count + */ + private function get_manual_count($args) { + global $wpdb; + + $table = $this->db->manual_properties_table(); + + // Check if table exists + $table_exists = $wpdb->get_var($wpdb->prepare( + "SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = %s AND TABLE_NAME = %s", + DB_NAME, + $table + )); + + if (!$table_exists) { + return 0; + } + + $where = array("standard_status != 'Withdrawn'"); + $values = array(); + + if (!empty($args['status'])) { + $where[] = 'standard_status = %s'; + $values[] = $args['status']; + } + + if (!empty($args['property_type'])) { + $where[] = 'property_type = %s'; + $values[] = $args['property_type']; + } + + if (!empty($args['city'])) { + $where[] = 'city = %s'; + $values[] = $args['city']; + } elseif (!empty($args['postal_code'])) { + $where[] = 'postal_code = %s'; + $values[] = $args['postal_code']; + } elseif (!empty($args['center_lat']) && !empty($args['center_lng'])) { + $lat = (float) $args['center_lat']; + $lng = (float) $args['center_lng']; + $radius = !empty($args['radius']) ? (int) $args['radius'] : 30; + $lat_delta = $radius / 69.0; + $lng_delta = $radius / (69.0 * cos(deg2rad($lat))); + + $where[] = 'latitude BETWEEN %f AND %f'; + $where[] = 'longitude BETWEEN %f AND %f'; + $values[] = $lat - $lat_delta; + $values[] = $lat + $lat_delta; + $values[] = $lng - $lng_delta; + $values[] = $lng + $lng_delta; + } + + if (!empty($args['county'])) { + $where[] = 'county = %s'; + $values[] = $args['county']; + } + + if (!empty($args['min_price'])) { + $where[] = 'list_price >= %d'; + $values[] = (int) $args['min_price']; + } + + if (!empty($args['max_price'])) { + $where[] = 'list_price <= %d'; + $values[] = (int) $args['max_price']; + } + + if (!empty($args['min_beds'])) { + $where[] = 'bedrooms_total >= %d'; + $values[] = (int) $args['min_beds']; + } + + if (!empty($args['min_baths'])) { + $where[] = 'bathrooms_total >= %d'; + $values[] = (int) $args['min_baths']; + } + + if (!empty($args['bounds']) && is_array($args['bounds']) && count($args['bounds']) === 4) { + list($sw_lat, $sw_lng, $ne_lat, $ne_lng) = $args['bounds']; + $where[] = 'latitude BETWEEN %f AND %f'; + $where[] = 'longitude BETWEEN %f AND %f'; + $where[] = 'latitude IS NOT NULL'; + $where[] = 'longitude IS NOT NULL'; + $values[] = (float) $sw_lat; + $values[] = (float) $ne_lat; + $values[] = (float) $sw_lng; + $values[] = (float) $ne_lng; + } + + $sql = "SELECT COUNT(*) FROM {$table} WHERE " . implode(' AND ', $where); + if (!empty($values)) { return (int) $wpdb->get_var($wpdb->prepare($sql, $values)); } @@ -785,8 +1308,8 @@ class MLS_Query { $table = $this->db->properties_table(); - // Exclude properties with invalid coordinates from map bounds - $where = array('mlg_can_view = 1', 'latitude IS NOT NULL', 'longitude IS NOT NULL', 'coordinates_invalid = 0'); + // Exclude properties with invalid coordinates or invalid price from map bounds + $where = array('mlg_can_view = 1', 'latitude IS NOT NULL', 'longitude IS NOT NULL', 'coordinates_invalid = 0', 'list_price >= 100'); $values = array(); // Add state filter (MN and IA only) diff --git a/wp-content/plugins/mls-by-hansonxyz/includes/class-mls-rate-limiter.php b/wp-content/plugins/mls-by-hansonxyz/includes/class-mls-rate-limiter.php index ba55d3e8..166abb8c 100755 --- a/wp-content/plugins/mls-by-hansonxyz/includes/class-mls-rate-limiter.php +++ b/wp-content/plugins/mls-by-hansonxyz/includes/class-mls-rate-limiter.php @@ -2,11 +2,15 @@ /** * Rate limiter class for MLS Grid API compliance * - * MLS Grid Rate Limits: - * - 2 requests per second - * - 7,200 requests per hour - * - 40,000 requests per day - * - 4GB data per hour + * MLS Grid Rate Limits (warning thresholds): + * - 4 requests per second (suspension at 6) + * - 7,200 requests per hour (suspension at 18,000) + * - 40,000 requests per 24 hours (suspension at 60,000) + * - 3GB data per hour / 40GB per 24 hours (suspension at 4GB/60GB) + * + * Our strategy: Throttle sync operations to use max 50% of daily quota + * even if running continuously for 24 hours. This leaves 50% budget + * for on-demand image fetches and other operations. */ if (!defined('ABSPATH')) { @@ -16,17 +20,36 @@ if (!defined('ABSPATH')) { class MLS_Rate_Limiter { /** - * Rate limit constants + * MLS Grid absolute limits (for reference) + */ + const MLSGRID_LIMIT_PER_SECOND = 4; + const MLSGRID_LIMIT_PER_HOUR = 7200; + const MLSGRID_LIMIT_PER_DAY = 40000; + const MLSGRID_BYTES_PER_HOUR = 3221225472; // 3GB + const MLSGRID_BYTES_PER_DAY = 42949672960; // 40GB + + /** + * Sync operation limits (50% of daily quota paced over 24 hours) + * + * Goal: If sync ran continuously for 24h, use max 50% of daily quota + * - 20,000 requests / 86,400 seconds = 0.23 RPS (~4.3s between requests) + * - 20GB data / 86,400 seconds = ~243KB/s average + */ + const SYNC_REQUESTS_PER_DAY = 20000; // 50% of 40,000 + const SYNC_BYTES_PER_DAY = 21474836480; // 20GB (50% of 40GB) + const SYNC_MIN_INTERVAL_MS = 4320; // 86400000ms / 20000 = 4.32s between requests + + /** + * Rate limit constants (used for tracking against MLS Grid limits) */ - const LIMIT_PER_SECOND = 2; const LIMIT_PER_HOUR = 7200; const LIMIT_PER_DAY = 40000; - const LIMIT_BYTES_PER_HOUR = 4294967296; // 4GB + const LIMIT_BYTES_PER_HOUR = 3221225472; // 3GB + const LIMIT_BYTES_PER_DAY = 42949672960; // 40GB /** * Window types */ - const WINDOW_SECOND = 'second'; const WINDOW_HOUR = 'hour'; const WINDOW_DAY = 'day'; @@ -52,14 +75,18 @@ class MLS_Rate_Limiter { /** * Check if we can make a request (and wait if needed) * + * For sync operations, this enforces the 50% daily quota pacing. + * The minimum interval between requests ensures that even continuous + * syncing won't exceed 50% of the daily quota. + * * @param bool $wait Whether to wait if rate limited * @return bool True if request can proceed */ public function check_and_wait($wait = true) { - // Check per-second limit (most restrictive) - $this->enforce_per_second_limit(); + // Enforce sync pacing (4.32s between requests for 50% daily quota) + $this->enforce_sync_pacing(); - // Check hourly limit + // Check hourly limit (hard stop if approaching MLS Grid limits) if (!$this->check_limit(self::WINDOW_HOUR, self::LIMIT_PER_HOUR)) { if ($wait) { $this->wait_for_window(self::WINDOW_HOUR); @@ -68,7 +95,7 @@ class MLS_Rate_Limiter { } } - // Check daily limit + // Check daily limit (hard stop if approaching MLS Grid limits) if (!$this->check_limit(self::WINDOW_DAY, self::LIMIT_PER_DAY)) { if ($wait) { $this->wait_for_window(self::WINDOW_DAY); @@ -81,11 +108,14 @@ class MLS_Rate_Limiter { } /** - * Enforce per-second rate limit + * Enforce sync operation pacing + * + * Ensures minimum interval between sync requests so that + * 24 hours of continuous syncing uses max 50% of daily quota. */ - private function enforce_per_second_limit() { + private function enforce_sync_pacing() { $now = microtime(true); - $min_interval = 1.0 / self::LIMIT_PER_SECOND; // 0.5 seconds + $min_interval = self::SYNC_MIN_INTERVAL_MS / 1000.0; // Convert ms to seconds (4.32s) if ($this->last_request_time > 0) { $elapsed = $now - $this->last_request_time; @@ -141,9 +171,6 @@ class MLS_Rate_Limiter { $now = current_time('timestamp'); switch ($window_type) { - case self::WINDOW_SECOND: - return gmdate('Y-m-d H:i:s', $now); - case self::WINDOW_HOUR: return gmdate('Y-m-d H:00:00', $now); @@ -261,6 +288,9 @@ class MLS_Rate_Limiter { * @return array Rate limit status */ public function get_status() { + $bytes_hour = $this->get_bytes_this_hour(); + $bytes_day = $this->get_bytes_today(); + return array( 'hourly' => array( 'used' => $this->get_window_count(self::WINDOW_HOUR), @@ -272,7 +302,18 @@ class MLS_Rate_Limiter { 'limit' => self::LIMIT_PER_DAY, 'remaining' => max(0, self::LIMIT_PER_DAY - $this->get_window_count(self::WINDOW_DAY)), ), - 'bytes_this_hour' => $this->get_bytes_this_hour(), + 'data_hourly' => array( + 'used' => $bytes_hour, + 'limit' => self::LIMIT_BYTES_PER_HOUR, + 'remaining' => max(0, self::LIMIT_BYTES_PER_HOUR - $bytes_hour), + ), + 'data_daily' => array( + 'used' => $bytes_day, + 'limit' => self::LIMIT_BYTES_PER_DAY, + 'remaining' => max(0, self::LIMIT_BYTES_PER_DAY - $bytes_day), + ), + // Legacy fields for backward compatibility + 'bytes_this_hour' => $bytes_hour, 'bytes_limit' => self::LIMIT_BYTES_PER_HOUR, ); } @@ -282,7 +323,7 @@ class MLS_Rate_Limiter { * * @return int Bytes */ - private function get_bytes_this_hour() { + public function get_bytes_this_hour() { global $wpdb; $window_start = $this->get_window_start(self::WINDOW_HOUR); @@ -297,6 +338,103 @@ class MLS_Rate_Limiter { return $bytes ? (int) $bytes : 0; } + /** + * Get bytes transferred today + * + * @return int Bytes + */ + public function get_bytes_today() { + global $wpdb; + + $window_start = $this->get_window_start(self::WINDOW_DAY); + + $bytes = $wpdb->get_var($wpdb->prepare( + "SELECT bytes_transferred FROM {$this->db->rate_limits_table()} + WHERE window_type = %s AND window_start = %s", + self::WINDOW_DAY, + $window_start + )); + + return $bytes ? (int) $bytes : 0; + } + + /** + * Get remaining daily data budget + * + * @return int Remaining bytes + */ + public function get_daily_data_remaining() { + return max(0, self::LIMIT_BYTES_PER_DAY - $this->get_bytes_today()); + } + + /** + * Check if we can fetch an image based on remaining daily data budget + * + * @param int $estimated_bytes Estimated size of image (default 400KB) + * @return bool True if we have budget for this image + */ + public function can_fetch_image($estimated_bytes = 409600) { + return $this->get_daily_data_remaining() > $estimated_bytes; + } + + /** + * Record data transfer (for image downloads, separate from API requests) + * + * This tracks bytes against the daily data cap without incrementing + * the request count (since image fetches aren't API requests). + * + * @param int $bytes Bytes transferred + */ + public function record_data_transfer($bytes) { + global $wpdb; + + if ($bytes <= 0) { + return; + } + + // Record for hourly window (data only, no request count) + $this->increment_data_only(self::WINDOW_HOUR, $bytes); + + // Record for daily window (data only, no request count) + $this->increment_data_only(self::WINDOW_DAY, $bytes); + } + + /** + * Increment data transfer for a window without incrementing request count + * + * @param string $window_type Window type + * @param int $bytes Bytes transferred + */ + private function increment_data_only($window_type, $bytes) { + global $wpdb; + + $window_start = $this->get_window_start($window_type); + + // Try to update existing record + $updated = $wpdb->query($wpdb->prepare( + "UPDATE {$this->db->rate_limits_table()} + SET bytes_transferred = bytes_transferred + %d + WHERE window_type = %s AND window_start = %s", + $bytes, + $window_type, + $window_start + )); + + // If no record existed, insert new one (request_count = 0 since this is data-only) + if (0 === $updated) { + $wpdb->insert( + $this->db->rate_limits_table(), + array( + 'window_type' => $window_type, + 'window_start' => $window_start, + 'request_count' => 0, + 'bytes_transferred' => $bytes, + ), + array('%s', '%s', '%d', '%d') + ); + } + } + /** * Check if we're approaching rate limits * @@ -308,8 +446,26 @@ class MLS_Rate_Limiter { $hourly_pct = $status['hourly']['used'] / $status['hourly']['limit']; $daily_pct = $status['daily']['used'] / $status['daily']['limit']; + $data_daily_pct = $status['data_daily']['used'] / $status['data_daily']['limit']; - return $hourly_pct >= $threshold || $daily_pct >= $threshold; + return $hourly_pct >= $threshold || $daily_pct >= $threshold || $data_daily_pct >= $threshold; + } + + /** + * Get a summary of current usage for logging/display + * + * @return array Summary with percentages + */ + public function get_usage_summary() { + $status = $this->get_status(); + + return array( + 'requests_hourly_pct' => round(($status['hourly']['used'] / $status['hourly']['limit']) * 100, 1), + 'requests_daily_pct' => round(($status['daily']['used'] / $status['daily']['limit']) * 100, 1), + 'data_hourly_pct' => round(($status['data_hourly']['used'] / $status['data_hourly']['limit']) * 100, 1), + 'data_daily_pct' => round(($status['data_daily']['used'] / $status['data_daily']['limit']) * 100, 1), + 'data_daily_remaining_gb' => round($status['data_daily']['remaining'] / 1073741824, 2), + ); } /** diff --git a/wp-content/themes/homeproz/archive-property.php b/wp-content/themes/homeproz/archive-property.php index 25fbe019..b5280497 100755 --- a/wp-content/themes/homeproz/archive-property.php +++ b/wp-content/themes/homeproz/archive-property.php @@ -41,9 +41,140 @@ if ($near_me_mode) { $hero_bg = get_field('properties_hero_background', 'option'); $has_bg_class = $hero_bg ? 'has-background' : ''; $bg_style = $hero_bg ? 'style="background-image: url(' . esc_url($hero_bg) . ');"' : ''; + + // Get MLS property types and cities for mobile filters + $property_types = homeproz_get_mls_property_types(); + $mls_cities = homeproz_get_mls_cities(50); + $current_type = isset($_GET['property_type']) ? sanitize_text_field($_GET['property_type']) : ''; + $current_location = isset($_GET['city']) ? sanitize_text_field($_GET['city']) : ''; + $current_zip = isset($_GET['zip']) ? sanitize_text_field($_GET['zip']) : ''; + $current_min_price = isset($_GET['min_price']) ? intval($_GET['min_price']) : ''; + $current_max_price = isset($_GET['max_price']) ? intval($_GET['max_price']) : ''; + $current_beds = isset($_GET['beds']) ? intval($_GET['beds']) : ''; ?> + + +
+ +
+ +
+ + +
+ +
+
+
+ + +
+
+ 0 properties +
+ +
+ + +
+ +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ Reset +
+
+
+ + +
+ +
+
+ Loading properties... +
+
+
+
+
+ + -
> +
>
@@ -71,7 +202,7 @@ if ($near_me_mode) { -
+
diff --git a/wp-content/themes/homeproz/dist/.vite/manifest.json b/wp-content/themes/homeproz/dist/.vite/manifest.json old mode 100755 new mode 100644 diff --git a/wp-content/themes/homeproz/dist/assets/editor.css b/wp-content/themes/homeproz/dist/assets/editor.css old mode 100755 new mode 100644 diff --git a/wp-content/themes/homeproz/dist/assets/editor.js b/wp-content/themes/homeproz/dist/assets/editor.js old mode 100755 new mode 100644 diff --git a/wp-content/themes/homeproz/dist/assets/main.css b/wp-content/themes/homeproz/dist/assets/main.css old mode 100755 new mode 100644 index 1e245521..bbd49406 --- a/wp-content/themes/homeproz/dist/assets/main.css +++ b/wp-content/themes/homeproz/dist/assets/main.css @@ -1,2 +1,2 @@ *,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }/*! tailwindcss v3.4.18 | MIT License | https://tailwindcss.com - */*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.visible{visibility:visible}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.block{display:block}.flex{display:flex}.table{display:table}.grid{display:grid}.hidden{display:none}.flex-shrink{flex-shrink:1}.border-collapse{border-collapse:collapse}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.resize{resize:both}.border{border-width:1px}.uppercase{text-transform:uppercase}.italic{font-style:italic}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.outline{outline-style:solid}.grayscale{--tw-grayscale: grayscale(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.site-header{position:sticky;top:0;z-index:100;background-color:var(--color-bg-dark);border-bottom:1px solid var(--color-border)}.header-container{padding-top:1rem;padding-bottom:1rem}.header-inner{display:flex;align-items:center;justify-content:space-between;gap:2rem}.site-branding{flex-shrink:0}.site-branding .custom-logo-link{display:block}.site-branding .custom-logo-link img{max-height:60px;width:auto}.site-branding .site-title-link{text-decoration:none}.site-branding .site-title{font-family:var(--font-display);font-size:1.5rem;color:var(--color-text);letter-spacing:.02em}.main-navigation{display:none;flex-grow:1;justify-content:center}@media (min-width: 1024px){.main-navigation{display:flex}}.main-navigation .nav-menu{display:flex;align-items:center;gap:2rem;list-style:none;margin:0;padding:0}.main-navigation .menu-item a{display:block;padding:.5rem 0;color:var(--color-text-muted);font-size:.875rem;font-weight:500;text-transform:uppercase;letter-spacing:.05em;text-decoration:none}.main-navigation .menu-item a:hover{color:var(--color-text)}.main-navigation .menu-item.current-menu-item a,.main-navigation .menu-item.current_page_item a{color:var(--color-accent-light)}.menu-toggle{display:flex;flex-direction:column;justify-content:center;align-items:center;width:44px;height:44px;padding:0;background:transparent;border:none;cursor:pointer}@media (min-width: 1024px){.menu-toggle{display:none}}.menu-toggle .menu-toggle-icon{display:flex;flex-direction:column;gap:5px}.menu-toggle .bar{display:block;width:24px;height:2px;background-color:var(--color-text)}.menu-toggle[aria-expanded=true] .bar:nth-child(1){transform:translateY(7px) rotate(45deg)}.menu-toggle[aria-expanded=true] .bar:nth-child(2){opacity:0}.menu-toggle[aria-expanded=true] .bar:nth-child(3){transform:translateY(-7px) rotate(-45deg)}.header-cta{display:none;flex-shrink:0}@media (min-width: 1024px){.header-cta{display:flex;align-items:center;gap:.75rem}}.header-cta .header-social{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;border:1px solid var(--color-border);border-radius:.25rem;color:var(--color-text-muted);text-decoration:none}.header-cta .header-social:hover{border-color:var(--color-accent);color:var(--color-accent-light)}.header-cta .header-social svg{width:18px;height:18px}.header-cta .header-phone{display:inline-flex;align-items:center;padding:.625rem 1.25rem;background-color:var(--color-accent);color:#fff;font-size:.875rem;font-weight:600;text-decoration:none;border-radius:.25rem}.header-cta .header-phone:hover{background-color:var(--color-accent-hover);color:#fff}.mobile-navigation{display:none;position:absolute;top:100%;left:0;right:0;background-color:var(--color-bg-card);border-bottom:1px solid var(--color-border);padding:1rem}.mobile-navigation.is-open{display:block}@media (min-width: 1024px){.mobile-navigation{display:none!important}}.mobile-navigation .mobile-nav-menu{list-style:none;margin:0;padding:0}.mobile-navigation .menu-item{border-bottom:1px solid var(--color-border)}.mobile-navigation .menu-item:last-child{border-bottom:none}.mobile-navigation .menu-item a{display:block;padding:1rem 0;color:var(--color-text);font-size:1rem;text-decoration:none}.mobile-navigation .menu-item a:hover{color:var(--color-accent-light)}.mobile-navigation .mobile-menu-cta{margin-top:1.5rem;padding-top:1.5rem;border-top:1px solid var(--color-border)}.mobile-navigation .mobile-menu-cta .btn,.mobile-navigation .mobile-menu-cta .comment-form .form-submit input[type=submit],.comment-form .form-submit .mobile-navigation .mobile-menu-cta input[type=submit]{display:block;width:100%;text-align:center}.site-footer{background-color:var(--color-bg-card);border-top:1px solid var(--color-border);margin-top:auto}.footer-container{padding-top:3rem;padding-bottom:1.5rem}.footer-inner{display:grid;grid-template-columns:1fr;gap:2rem}@media (min-width: 768px){.footer-inner{grid-template-columns:repeat(2,1fr)}}@media (min-width: 1024px){.footer-inner{grid-template-columns:1.5fr 1fr 1.25fr 1fr;gap:2rem}}.footer-column{min-width:0}.footer-heading{font-family:var(--font-body);font-size:.875rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text);margin-bottom:1.25rem}.footer-about .footer-logo{margin-bottom:1rem}.footer-about .footer-logo img{max-height:50px;width:auto}.footer-about .footer-logo .site-title{font-family:var(--font-display);font-size:1.25rem;color:var(--color-text)}.footer-about .footer-tagline{font-size:.875rem;color:var(--color-text-muted);margin-bottom:1.25rem;line-height:1.6}.footer-social{display:flex;gap:1rem}.footer-social a{display:flex;align-items:center;justify-content:center;width:40px;height:40px;background-color:var(--color-bg-dark);border-radius:.25rem;color:var(--color-text-muted)}.footer-social a:hover{background-color:var(--color-accent);color:#fff}.footer-social a svg{width:20px;height:20px}.footer-links .footer-menu{list-style:none;margin:0;padding:0}.footer-links .menu-item{margin-bottom:.75rem}.footer-links .menu-item:last-child{margin-bottom:0}.footer-links .menu-item a{color:var(--color-text-muted);font-size:.9375rem;text-decoration:none}.footer-links .menu-item a:hover{color:var(--color-accent-light)}.contact-list{list-style:none;margin:0;padding:0}.contact-item{display:flex;align-items:flex-start;gap:.75rem;margin-bottom:1rem;font-size:.9375rem}.contact-item:last-child{margin-bottom:0}.contact-item svg{flex-shrink:0;color:var(--color-accent);margin-top:.125rem}.contact-item a{color:var(--color-text-muted);text-decoration:none}.contact-item a:hover{color:var(--color-accent-light)}.contact-item span{color:var(--color-text-muted)}.footer-hours .hours-list{list-style:none;margin:0;padding:0}.footer-hours .hours-item{display:flex;justify-content:space-between;gap:1rem;margin-bottom:.5rem;font-size:.875rem}.footer-hours .hours-item:last-child{margin-bottom:0}.footer-hours .hours-day{color:var(--color-text-muted)}.footer-hours .hours-time{color:var(--color-text);text-align:right}.footer-legal{display:flex;flex-direction:column;align-items:center;gap:1.25rem;padding-top:2rem;margin-top:2rem;border-top:1px solid var(--color-border)}.footer-legal-inner{display:flex;flex-wrap:wrap;justify-content:center;gap:1.5rem}@media (max-width: 640px){.footer-legal-inner{gap:1rem}}.legal-item{display:flex;align-items:center;gap:.5rem;padding:.5rem 1rem;background-color:var(--color-bg-dark);border:1px solid var(--color-border);border-radius:.25rem;color:var(--color-text-muted);font-size:.8125rem;text-decoration:none}.legal-item:hover{border-color:var(--color-accent);color:var(--color-accent-light)}.legal-item:hover svg{color:var(--color-accent)}.legal-item svg{flex-shrink:0;color:var(--color-text-muted)}@media (max-width: 640px){.legal-item{width:calc(50% - .5rem);justify-content:center;padding:.625rem .75rem;font-size:.75rem}}.footer-license{margin:0;font-size:.75rem;color:var(--color-sold);text-align:center}.footer-association-logos{display:flex;align-items:center;justify-content:center;gap:2rem;margin-top:1rem}.footer-association-logos .association-logo{height:40px;width:auto;opacity:.7}.footer-association-logos .association-logo:hover{opacity:1}@media (max-width: 640px){.footer-association-logos{gap:1.5rem}.footer-association-logos .association-logo{height:32px}}.footer-temp-link{text-align:center;padding:1rem 0;margin-top:1.5rem;border-top:2px dashed var(--color-accent);border-bottom:2px dashed var(--color-accent)}.footer-temp-link a{display:inline-block;padding:.75rem 2rem;background-color:var(--color-accent);color:#fff;font-size:.875rem;font-weight:700;letter-spacing:.1em;text-decoration:none;border-radius:.25rem}.footer-temp-link a:hover{background-color:var(--color-accent-hover);color:#fff}.footer-bottom{padding-top:1.5rem;margin-top:2rem;border-top:1px solid var(--color-border);text-align:center}.footer-bottom-text{margin:0;font-size:.8125rem;color:var(--color-text-muted)}.footer-bottom-text a{color:var(--color-text-muted);text-decoration:none}.footer-bottom-text a:hover{color:var(--color-accent-light)}.page-content{padding:2rem 0 4rem}.page-header{margin-bottom:2rem;padding-bottom:1.5rem;border-bottom:1px solid var(--color-border)}.page-title{margin-bottom:0}.entry-content{max-width:800px}.entry-content>*:first-child{margin-top:0}.entry-content>*:last-child{margin-bottom:0}.entry-content h2,.entry-content h3,.entry-content h4,.entry-content h5,.entry-content h6{margin-top:2rem}.entry-content ul,.entry-content ol{margin-bottom:1rem;padding-left:1.5rem}.entry-content ul li,.entry-content ol li{margin-bottom:.5rem}.entry-content blockquote{margin:1.5rem 0;padding:1rem 1.5rem;border-left:4px solid var(--color-accent);background-color:var(--color-bg-card)}.entry-content blockquote p:last-child{margin-bottom:0}.entry-content table{width:100%;margin-bottom:1rem;border-collapse:collapse}.entry-content table th,.entry-content table td{padding:.75rem;border:1px solid var(--color-border);text-align:left}.entry-content table th{background-color:var(--color-bg-card);font-weight:600;color:var(--color-text)}.entry-content img{max-width:100%;height:auto;border-radius:.25rem}.entry-content code{padding:.125rem .375rem;background-color:var(--color-bg-card);border-radius:.25rem;font-size:.875em}.entry-content pre{margin-bottom:1rem;padding:1rem;background-color:var(--color-bg-card);border-radius:.25rem;overflow-x:auto}.entry-content pre code{padding:0;background:none}.page-links{margin-top:2rem;padding-top:1rem;border-top:1px solid var(--color-border);font-weight:500}.page-links .page-numbers{display:inline-block;padding:.25rem .5rem;margin:0 .25rem;background-color:var(--color-bg-card);border-radius:.25rem;color:var(--color-text-muted);text-decoration:none}.page-links .page-numbers.current,.page-links .page-numbers:hover{background-color:var(--color-accent);color:#fff}.archive-header{margin-bottom:2rem;padding:2rem 0;border-bottom:1px solid var(--color-border)}.archive-title{margin-bottom:0}.posts-grid{display:grid;grid-template-columns:1fr;gap:2rem;padding:2rem 0}@media (min-width: 768px){.posts-grid{grid-template-columns:repeat(2,1fr)}}@media (min-width: 1024px){.posts-grid{grid-template-columns:repeat(3,1fr)}}.post-card{display:flex;flex-direction:column}.post-card-image{display:block;aspect-ratio:16/10;overflow:hidden}.post-card-image img{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.post-card-content{display:flex;flex-direction:column;flex-grow:1;padding:1.25rem}.post-card-header{margin-bottom:.75rem}.post-card-meta{margin-bottom:.5rem}.post-card-meta time{font-size:.8125rem;color:var(--color-text-muted)}.post-card-title{font-family:var(--font-body);font-size:1.125rem;font-weight:600;line-height:1.4;margin-bottom:0}.post-card-title a{color:var(--color-text);text-decoration:none}.post-card-title a:hover{color:var(--color-accent-light)}.post-card-excerpt{flex-grow:1;margin-bottom:1rem}.post-card-excerpt p{font-size:.9375rem;color:var(--color-text-muted);margin-bottom:0;line-height:1.6}.post-card-link{display:inline-flex;align-items:center;gap:.5rem;font-size:.875rem;font-weight:600;color:var(--color-accent-light);text-decoration:none}.post-card-link:hover{color:var(--color-accent-hover)}.post-card-link svg{width:16px;height:16px}.pagination,.nav-links{display:flex;justify-content:center;align-items:center;gap:.5rem;padding:2rem 0;flex-wrap:wrap}.pagination .page-numbers,.nav-links .page-numbers{display:inline-flex;align-items:center;justify-content:center;min-width:40px;height:40px;padding:0 .75rem;background-color:var(--color-bg-card);border-radius:.25rem;color:var(--color-text-muted);text-decoration:none;font-size:.875rem;font-weight:500}.pagination .page-numbers.current,.nav-links .page-numbers.current{background-color:var(--color-accent);color:#fff}.pagination .page-numbers:hover:not(.current):not(.dots),.nav-links .page-numbers:hover:not(.current):not(.dots){background-color:var(--color-border);color:var(--color-text)}.pagination .page-numbers.dots,.nav-links .page-numbers.dots{background:none;cursor:default}.pagination .prev,.pagination .next,.nav-links .prev,.nav-links .next{padding:0 1rem}.no-posts{text-align:center;padding:4rem 0;color:var(--color-text-muted)}.Single_Post .single-post-main{padding:0}.Single_Post .single-post-hero{width:100%;max-height:60vh;overflow:hidden}.Single_Post .single-post-hero img{width:100%;height:auto;-o-object-fit:cover;object-fit:cover}.Single_Post .single-post-section{padding:4rem 0;background-color:var(--color-bg-dark)}@media (max-width: 768px){.Single_Post .single-post-section{padding:3rem 0}}.Single_Post .single-post-layout{display:grid;grid-template-columns:1fr 320px;gap:3rem}@media (max-width: 1024px){.Single_Post .single-post-layout{grid-template-columns:1fr;gap:3rem}}.Single_Post .related-posts-section{padding:4rem 0;background-color:var(--color-bg-card)}@media (max-width: 768px){.Single_Post .related-posts-section{padding:3rem 0}}.Single_Post .related-posts-header{text-align:center;margin-bottom:2rem}.Single_Post .related-posts-title{font-family:var(--font-display);font-size:1.875rem;color:var(--color-text);margin-bottom:0}.Single_Post .related-posts-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:1.5rem}@media (max-width: 1024px){.Single_Post .related-posts-grid{grid-template-columns:repeat(2,1fr)}}@media (max-width: 640px){.Single_Post .related-posts-grid{grid-template-columns:1fr}}.single-post{padding:0;max-width:none}.post-header{margin-bottom:2rem}.post-meta{display:flex;align-items:center;gap:.5rem;margin-bottom:1rem;font-size:.875rem;color:var(--color-text-muted)}.post-meta time{color:var(--color-text-muted)}.post-meta .meta-separator{color:var(--color-border)}.post-meta .post-categories a{color:var(--color-accent-light);text-decoration:none}.post-meta .post-categories a:hover{color:var(--color-accent-hover)}.post-title{font-size:2.5rem;margin-bottom:0}@media (max-width: 768px){.post-title{font-size:2rem}}.post-featured-image{margin-bottom:2rem;border-radius:.5rem;overflow:hidden}.post-featured-image img{width:100%;height:auto;display:block}.post-footer{margin-top:3rem;padding-top:1.5rem;border-top:1px solid var(--color-border)}.post-tags{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem}.post-tags .tags-label{font-size:.875rem;font-weight:500;color:var(--color-text-muted)}.post-tags .tag-link{display:inline-block;padding:.25rem .75rem;background-color:var(--color-bg-card);border-radius:.25rem;font-size:.8125rem;color:var(--color-text-muted);text-decoration:none}.post-tags .tag-link:hover{background-color:var(--color-accent);color:#fff}.post-navigation{margin-top:3rem;padding:1.5rem 0;border-top:1px solid var(--color-border);border-bottom:1px solid var(--color-border)}.post-navigation .nav-links{display:grid;grid-template-columns:1fr;gap:1.5rem}@media (min-width: 640px){.post-navigation .nav-links{grid-template-columns:1fr 1fr}}.post-navigation .nav-previous a,.post-navigation .nav-next a{display:block;text-decoration:none}.post-navigation .nav-next{text-align:right}.post-navigation .nav-subtitle{display:block;font-size:.8125rem;color:var(--color-text-muted);margin-bottom:.25rem}.post-navigation .nav-title{display:block;font-size:1rem;font-weight:500;color:var(--color-text);line-height:1.4}.post-navigation a:hover .nav-title{color:var(--color-accent-light)}.comments-area{margin-top:3rem;padding-top:2rem;border-top:1px solid var(--color-border)}.comments-title{margin-bottom:1.5rem}.comment-list{list-style:none;margin:0;padding:0}.comment-list .comment{margin-bottom:1.5rem;padding-bottom:1.5rem;border-bottom:1px solid var(--color-border)}.comment-list .comment:last-child{border-bottom:none}.comment-list .comment-body{display:flex;gap:1rem}.comment-list .comment-author{flex-shrink:0}.comment-list .comment-author img{border-radius:50%}.comment-list .comment-content{flex-grow:1}.comment-list .fn{font-weight:600;color:var(--color-text)}.comment-list .comment-metadata{margin-bottom:.5rem;font-size:.8125rem;color:var(--color-text-muted)}.comment-list .comment-metadata a{color:var(--color-text-muted);text-decoration:none}.comment-list .comment-metadata a:hover{color:var(--color-accent-light)}.comment-respond{margin-top:2rem}.comment-reply-title{margin-bottom:1rem}.comment-form label{display:block;margin-bottom:.5rem;font-size:.875rem;font-weight:500;color:var(--color-text)}.comment-form input[type=text],.comment-form input[type=email],.comment-form input[type=url],.comment-form textarea{margin-bottom:1rem}.comment-form .form-submit{margin-top:1rem}.error-404{text-align:center;padding:4rem 0;max-width:600px;margin:0 auto}.error-header{margin-bottom:2rem}.error-title{font-size:8rem;line-height:1;color:var(--color-accent);margin-bottom:.5rem}@media (max-width: 640px){.error-title{font-size:5rem}}.error-subtitle{font-size:1.5rem;font-weight:500;color:var(--color-text);margin-bottom:0}.error-content{margin-bottom:2rem}.error-content p{font-size:1rem;color:var(--color-text-muted)}.error-actions{display:flex;justify-content:center;gap:1rem;margin-top:1.5rem;flex-wrap:wrap}.error-search{margin-top:2rem;padding-top:2rem;border-top:1px solid var(--color-border)}.error-search p{margin-bottom:1rem;color:var(--color-text-muted)}.search-form{display:flex;max-width:400px;margin:0 auto}.search-form .search-field{flex-grow:1;border-radius:.25rem 0 0 .25rem}.search-form .search-submit{flex-shrink:0;padding:.75rem 1.25rem;background-color:var(--color-accent);color:#fff;border:none;border-radius:0 .25rem .25rem 0;font-weight:600;cursor:pointer}.search-form .search-submit:hover{background-color:var(--color-accent-hover)}.Home_Page .homepage-main{padding:0}.Home_Page .hero-desktop-only{display:none}@media (min-width: 1450px){.Home_Page .hero-desktop-only{display:block}}.Home_Page .hero-mobile-only{display:block}@media (min-width: 1450px){.Home_Page .hero-mobile-only{display:none}}.Home_Page .section-header{text-align:center;margin-bottom:3rem}@media (max-width: 768px){.Home_Page .section-header{margin-bottom:2rem}}.Home_Page .section-title{font-family:var(--font-display);font-size:2.25rem;color:var(--color-text);margin-bottom:.75rem}@media (max-width: 768px){.Home_Page .section-title{font-size:1.875rem}}.Home_Page .section-subtitle{font-size:1.125rem;color:var(--color-text-muted);max-width:600px;margin:0 auto}.Home_Page .section-footer{text-align:center;margin-top:2.5rem}.Home_Page .featured-properties-section{padding:4rem 0;background-color:var(--color-bg-card)}@media (max-width: 768px){.Home_Page .featured-properties-section{padding:3rem 0}}.Home_Page .featured-properties-section--alt{background-color:var(--color-bg-dark)}.Home_Page .property-grid--3col{display:grid;grid-template-columns:repeat(3,1fr);gap:1.5rem}@media (max-width: 1024px){.Home_Page .property-grid--3col{grid-template-columns:repeat(2,1fr)}}@media (max-width: 640px){.Home_Page .property-grid--3col{grid-template-columns:1fr}}.Home_Page .no-properties-message{text-align:center;color:var(--color-text-muted);font-size:1.125rem;padding:3rem 0}.About_Page .about-page-main{padding:0}.About_Page .about-story-section{padding:4rem 0;background-color:var(--color-bg-dark)}@media (max-width: 768px){.About_Page .about-story-section{padding:3rem 0}}.About_Page .about-story-layout{display:grid;grid-template-columns:1fr 2fr;gap:3rem;align-items:center}@media (max-width: 1300px){.About_Page .about-story-layout{grid-template-columns:1fr;gap:2rem}}.About_Page .about-story-image img{width:100%;height:auto;border-radius:.5rem;display:block}@media (max-width: 1300px){.About_Page .about-story-image{max-width:500px;margin:0 auto}}.About_Page .about-story-content h2,.About_Page .about-story-content h3{font-family:var(--font-display);color:var(--color-text);margin-top:2rem}.About_Page .about-story-content h2:first-child,.About_Page .about-story-content h3:first-child{margin-top:0}.About_Page .about-story-content p{font-size:1.125rem;line-height:1.8;color:var(--color-text-muted)}.About_Page .about-values-section{padding:4rem 0;background-color:var(--color-bg-card)}@media (max-width: 768px){.About_Page .about-values-section{padding:3rem 0}}.About_Page .about-values-header{text-align:center;margin-bottom:3rem}.About_Page .about-values-title{font-family:var(--font-display);font-size:2.25rem;color:var(--color-text);margin-bottom:0}@media (max-width: 768px){.About_Page .about-values-title{font-size:1.875rem}}.About_Page .about-team-section{padding:4rem 0;background-color:var(--color-bg-dark)}@media (max-width: 768px){.About_Page .about-team-section{padding:3rem 0}}.About_Page .about-team-header{text-align:center;margin-bottom:3rem}.About_Page .about-team-title{font-family:var(--font-display);font-size:2.25rem;color:var(--color-text);margin-bottom:.75rem}@media (max-width: 768px){.About_Page .about-team-title{font-size:1.875rem}}.About_Page .about-team-subtitle{font-size:1.125rem;color:var(--color-text-muted);max-width:600px;margin:0 auto}.About_Page .about-broker-section{padding:3rem 0;background-color:var(--color-bg-card);border-top:1px solid var(--color-border)}.About_Page .about-broker-content{text-align:center}.About_Page .about-broker-title{font-family:var(--font-display);font-size:1.25rem;color:var(--color-text);margin-bottom:.5rem}.About_Page .about-broker-text{font-size:.9375rem;color:var(--color-text-muted);margin-bottom:0}.Join_Page .join-page-main{padding:0}.Join_Page .join-why-section{padding:4rem 0;background-color:var(--color-bg-dark)}@media (max-width: 768px){.Join_Page .join-why-section{padding:3rem 0}}.Join_Page .join-intro{max-width:800px;margin:0 auto 3rem;text-align:center}.Join_Page .join-intro p{font-size:1.125rem;line-height:1.8;color:var(--color-text-muted)}.Join_Page .join-benefits-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:1.5rem}@media (max-width: 1024px){.Join_Page .join-benefits-grid{grid-template-columns:repeat(2,1fr)}}@media (max-width: 640px){.Join_Page .join-benefits-grid{grid-template-columns:1fr;gap:1rem}}.Join_Page .join-benefit-card{background-color:var(--color-bg-card);border:1px solid var(--color-border);border-radius:.5rem;padding:1.5rem;text-align:center}.Join_Page .join-benefit-card:hover{border-color:var(--color-accent)}.Join_Page .join-benefit-icon{display:flex;align-items:center;justify-content:center;width:64px;height:64px;margin:0 auto 1rem;background-color:#9f37301a;border-radius:50%;color:var(--color-accent)}.Join_Page .join-benefit-title{font-family:var(--font-display);font-size:1.25rem;color:var(--color-text);margin-bottom:.5rem}.Join_Page .join-benefit-text{font-size:.9375rem;color:var(--color-text-muted);line-height:1.6;margin-bottom:0}.Join_Page .join-team-section{padding:4rem 0;background-color:var(--color-bg-card)}@media (max-width: 768px){.Join_Page .join-team-section{padding:3rem 0}}.Join_Page .join-team-header{text-align:center;margin-bottom:2.5rem}.Join_Page .join-team-title{font-family:var(--font-display);font-size:2.25rem;color:var(--color-text);margin-bottom:.5rem}@media (max-width: 768px){.Join_Page .join-team-title{font-size:1.875rem}}.Join_Page .join-team-subtitle{font-size:1.125rem;color:var(--color-text-muted)}.Join_Page .join-team-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:2rem;margin-bottom:2rem}@media (max-width: 1024px){.Join_Page .join-team-grid{grid-template-columns:repeat(2,1fr)}}@media (max-width: 640px){.Join_Page .join-team-grid{grid-template-columns:repeat(2,1fr);gap:1rem}}.Join_Page .join-team-member{text-align:center}.Join_Page .join-team-photo{width:120px;height:120px;margin:0 auto 1rem;border-radius:50%;overflow:hidden;border:3px solid var(--color-border)}.Join_Page .join-team-photo img{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}@media (max-width: 640px){.Join_Page .join-team-photo{width:80px;height:80px;margin-bottom:.75rem}}.Join_Page .join-team-placeholder{width:100%;height:100%;display:flex;align-items:center;justify-content:center;background-color:var(--color-bg-dark);color:var(--color-text-muted)}.Join_Page .join-team-name{font-family:var(--font-display);font-size:1.125rem;color:var(--color-text);margin-bottom:.25rem}@media (max-width: 640px){.Join_Page .join-team-name{font-size:1rem}}.Join_Page .join-team-role{font-size:.875rem;color:var(--color-accent);margin-bottom:0}@media (max-width: 640px){.Join_Page .join-team-role{font-size:.75rem}}.Join_Page .join-team-cta{text-align:center}.Contact_Page .contact-page-main{padding:0}.Contact_Page .contact-section{padding:4rem 0;background-color:var(--color-bg-dark)}@media (max-width: 768px){.Contact_Page .contact-section{padding:3rem 0}}.Contact_Page .contact-grid{display:grid;grid-template-columns:1fr 1fr;gap:3rem}@media (max-width: 1024px){.Contact_Page .contact-grid{grid-template-columns:1fr;gap:2rem}}.Contact_Page .contact-form-wrapper{background-color:var(--color-bg-card);padding:2rem;border-radius:.5rem}.Contact_Page .contact-form-title{font-family:var(--font-display);font-size:1.5rem;color:var(--color-text);margin-bottom:1.5rem}.Contact_Page .contact-form-notice{color:var(--color-text-muted);font-style:italic;margin-bottom:1.5rem}.Contact_Page .property-inquiry-display{background-color:var(--color-bg-dark);border:1px solid var(--color-border);border-left:3px solid var(--color-accent);padding:1rem 1.25rem;margin-bottom:1.5rem;border-radius:.25rem}.Contact_Page .property-inquiry-label{font-size:.75rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-muted);margin-bottom:.25rem}.Contact_Page .property-inquiry-value{font-size:.9375rem;color:var(--color-text);line-height:1.4}.Contact_Page .property-inquiry-value a{color:var(--color-accent-light);text-decoration:none}.Contact_Page .property-inquiry-value a:hover{text-decoration:underline}.Contact_Page .contact-form .form-group{margin-bottom:1.25rem}.Contact_Page .contact-form label{display:block;font-size:.875rem;font-weight:600;color:var(--color-text);margin-bottom:.5rem}.Contact_Page .contact-form label .required{color:var(--color-accent)}.Contact_Page .contact-form input,.Contact_Page .contact-form textarea{width:100%}.Contact_Page .contact-form button[type=submit]{width:100%;margin-top:.5rem}.Contact_Page .wpcf7-form .form-group,.Contact_Page .wpcf7-form p{margin-bottom:1.25rem}.Contact_Page .wpcf7-form label{display:block;font-size:.875rem;font-weight:600;color:var(--color-text);margin-bottom:.5rem}.Contact_Page .wpcf7-form br{display:none}.Contact_Page .wpcf7-form input[type=text],.Contact_Page .wpcf7-form input[type=email],.Contact_Page .wpcf7-form input[type=tel],.Contact_Page .wpcf7-form textarea{width:100%}.Contact_Page .wpcf7-form input[type=submit]{width:100%;margin-top:.5rem;background-color:var(--color-accent);color:#fff;padding:.75rem 1.5rem;font-weight:600;font-size:.875rem;text-transform:uppercase;letter-spacing:.05em;border-radius:.25rem;border:none;cursor:pointer}.Contact_Page .wpcf7-form input[type=submit]:hover{background-color:var(--color-accent-hover)}.Contact_Page .wpcf7-form .wpcf7-response-output{margin:1rem 0 0;padding:1rem;border-radius:.25rem}.Contact_Page .wpcf7-form .wpcf7-mail-sent-ok{background-color:var(--color-success);color:#fff;border:none}.Contact_Page .wpcf7-form .wpcf7-validation-errors,.Contact_Page .wpcf7-form .wpcf7-mail-sent-ng{background-color:var(--color-accent);color:#fff;border:none}.Contact_Page .contact-info-wrapper{display:flex;flex-direction:column}.Contact_Page .contact-info-title{font-family:var(--font-display);font-size:1.5rem;color:var(--color-text);margin-bottom:1.5rem}.Contact_Page .contact-info-list{display:flex;flex-direction:column;gap:1.5rem;margin-bottom:2rem}.Contact_Page .contact-info-item{display:flex;gap:1rem}.Contact_Page .contact-info-icon{flex-shrink:0;width:48px;height:48px;display:flex;align-items:center;justify-content:center;background-color:var(--color-bg-card);border-radius:.5rem;color:var(--color-accent);text-decoration:none}.Contact_Page .contact-info-icon:hover{background-color:var(--color-accent);color:#fff}.Contact_Page .contact-info-content{flex:1}.Contact_Page .contact-info-label{font-family:Times New Roman,Times,serif;font-size:1rem;font-weight:600;color:var(--color-text);margin-bottom:.25rem}.Contact_Page .contact-info-value{font-size:.9375rem;color:var(--color-text-muted);margin-bottom:0;line-height:1.5}.Contact_Page .contact-info-value a{color:var(--color-text-muted)}.Contact_Page .contact-info-value a:hover{color:var(--color-accent-light)}.Contact_Page .contact-map{border-radius:.5rem;overflow:hidden;background-color:var(--color-bg-card)}.Contact_Page .contact-map iframe{display:block}.Contact_Page .contact-additional-content{padding:3rem 0;background-color:var(--color-bg-card)}.Contact_Page .contact-additional-content .entry-content{max-width:800px;margin:0 auto}.Blog_Archive .archive-main,.Archive_Page .archive-main{padding:0}.Blog_Archive .archive-content-section,.Archive_Page .archive-content-section{padding:4rem 0;background-color:var(--color-bg-dark)}@media (max-width: 768px){.Blog_Archive .archive-content-section,.Archive_Page .archive-content-section{padding:3rem 0}}.Blog_Archive .archive-layout,.Archive_Page .archive-layout{display:grid;grid-template-columns:1fr 320px;gap:3rem}@media (max-width: 1024px){.Blog_Archive .archive-layout,.Archive_Page .archive-layout{grid-template-columns:1fr;gap:3rem}}.Blog_Archive .posts-grid,.Archive_Page .posts-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:1.5rem}@media (max-width: 768px){.Blog_Archive .posts-grid,.Archive_Page .posts-grid{grid-template-columns:1fr}}.Blog_Archive .no-posts-message,.Archive_Page .no-posts-message{text-align:center;padding:3rem;background-color:var(--color-bg-card);border-radius:.5rem}.Blog_Archive .no-posts-message h2,.Archive_Page .no-posts-message h2{font-family:var(--font-display);font-size:1.5rem;color:var(--color-text);margin-bottom:.5rem}.Blog_Archive .no-posts-message p,.Archive_Page .no-posts-message p{color:var(--color-text-muted);margin-bottom:0}.Blog_Archive .navigation.pagination,.Archive_Page .navigation.pagination{margin-top:3rem}.Blog_Archive .navigation.pagination .nav-links,.Archive_Page .navigation.pagination .nav-links{display:flex;justify-content:center;align-items:center;gap:.5rem;flex-wrap:wrap}.Blog_Archive .navigation.pagination .page-numbers,.Archive_Page .navigation.pagination .page-numbers{display:inline-flex;align-items:center;justify-content:center;min-width:40px;height:40px;padding:0 .75rem;background-color:var(--color-bg-card);color:var(--color-text-muted);border-radius:.25rem;font-size:.875rem}.Blog_Archive .navigation.pagination .page-numbers:hover,.Archive_Page .navigation.pagination .page-numbers:hover,.Blog_Archive .navigation.pagination .page-numbers.current,.Archive_Page .navigation.pagination .page-numbers.current{background-color:var(--color-accent);color:#fff}.Blog_Archive .navigation.pagination .page-numbers svg,.Archive_Page .navigation.pagination .page-numbers svg{width:16px;height:16px}.Blog_Archive .navigation.pagination .prev,.Blog_Archive .navigation.pagination .next,.Archive_Page .navigation.pagination .prev,.Archive_Page .navigation.pagination .next{display:inline-flex;align-items:center;gap:.5rem}@media (max-width: 1024px){.Blog_Archive .archive-sidebar,.Archive_Page .archive-sidebar{max-width:400px}}.property-inquiry-page-main .property-inquiry-section{padding:3rem 0}.property-inquiry-page-main .property-inquiry-grid{display:grid;gap:2rem}@media (min-width: 1024px){.property-inquiry-page-main .property-inquiry-grid{grid-template-columns:1fr 400px;gap:3rem}}.property-inquiry-page-main .property-inquiry-form-wrapper{background-color:var(--color-bg-card);padding:2rem;border-radius:.5rem;border:1px solid var(--color-border)}.property-inquiry-page-main .property-inquiry-preview .preview-title{font-family:Inter,Droid Sans,Arial,sans-serif;font-size:1.2rem;font-weight:700;color:var(--color-text);margin-bottom:1rem}.property-inquiry-page-main .wpcf7-form .form-group,.property-inquiry-page-main .property-inquiry-form .form-group,.property-inquiry-page-main .wpcf7-form .form-row,.property-inquiry-page-main .property-inquiry-form .form-row{margin-bottom:1.5rem}.property-inquiry-page-main .wpcf7-form .form-row-2col,.property-inquiry-page-main .property-inquiry-form .form-row-2col{display:grid;gap:1rem}@media (min-width: 640px){.property-inquiry-page-main .wpcf7-form .form-row-2col,.property-inquiry-page-main .property-inquiry-form .form-row-2col{grid-template-columns:1fr 1fr}}.property-inquiry-page-main .wpcf7-form .form-row-2col .form-group,.property-inquiry-page-main .property-inquiry-form .form-row-2col .form-group{margin-bottom:0}.property-inquiry-page-main .wpcf7-form label,.property-inquiry-page-main .property-inquiry-form label{display:block;font-size:.875rem;font-weight:500;color:var(--color-text);margin-bottom:.5rem}.property-inquiry-page-main .wpcf7-form input[type=text],.property-inquiry-page-main .wpcf7-form input[type=email],.property-inquiry-page-main .wpcf7-form input[type=tel],.property-inquiry-page-main .wpcf7-form textarea,.property-inquiry-page-main .property-inquiry-form input[type=text],.property-inquiry-page-main .property-inquiry-form input[type=email],.property-inquiry-page-main .property-inquiry-form input[type=tel],.property-inquiry-page-main .property-inquiry-form textarea{width:100%;padding:.75rem 1rem;background-color:var(--color-bg-dark);border:1px solid var(--color-border);border-radius:.375rem;color:var(--color-text);font-size:1rem}.property-inquiry-page-main .wpcf7-form input[type=text]:focus,.property-inquiry-page-main .wpcf7-form input[type=email]:focus,.property-inquiry-page-main .wpcf7-form input[type=tel]:focus,.property-inquiry-page-main .wpcf7-form textarea:focus,.property-inquiry-page-main .property-inquiry-form input[type=text]:focus,.property-inquiry-page-main .property-inquiry-form input[type=email]:focus,.property-inquiry-page-main .property-inquiry-form input[type=tel]:focus,.property-inquiry-page-main .property-inquiry-form textarea:focus{outline:none;border-color:var(--color-accent)}.property-inquiry-page-main .wpcf7-form input[type=text]::-moz-placeholder,.property-inquiry-page-main .wpcf7-form input[type=email]::-moz-placeholder,.property-inquiry-page-main .wpcf7-form input[type=tel]::-moz-placeholder,.property-inquiry-page-main .wpcf7-form textarea::-moz-placeholder,.property-inquiry-page-main .property-inquiry-form input[type=text]::-moz-placeholder,.property-inquiry-page-main .property-inquiry-form input[type=email]::-moz-placeholder,.property-inquiry-page-main .property-inquiry-form input[type=tel]::-moz-placeholder,.property-inquiry-page-main .property-inquiry-form textarea::-moz-placeholder{color:var(--color-text-muted)}.property-inquiry-page-main .wpcf7-form input[type=text]::placeholder,.property-inquiry-page-main .wpcf7-form input[type=email]::placeholder,.property-inquiry-page-main .wpcf7-form input[type=tel]::placeholder,.property-inquiry-page-main .wpcf7-form textarea::placeholder,.property-inquiry-page-main .property-inquiry-form input[type=text]::placeholder,.property-inquiry-page-main .property-inquiry-form input[type=email]::placeholder,.property-inquiry-page-main .property-inquiry-form input[type=tel]::placeholder,.property-inquiry-page-main .property-inquiry-form textarea::placeholder{color:var(--color-text-muted)}.property-inquiry-page-main .wpcf7-form textarea,.property-inquiry-page-main .property-inquiry-form textarea{resize:vertical;min-height:100px}.property-inquiry-page-main .wpcf7-form textarea.readonly-message,.property-inquiry-page-main .wpcf7-form textarea[readonly],.property-inquiry-page-main .wpcf7-form .readonly-message-display,.property-inquiry-page-main .property-inquiry-form textarea.readonly-message,.property-inquiry-page-main .property-inquiry-form textarea[readonly],.property-inquiry-page-main .property-inquiry-form .readonly-message-display{background-color:#9f37301a;border:1px solid var(--color-accent);border-radius:.375rem;color:var(--color-text);cursor:default;padding:.75rem 1rem;font-size:1rem;line-height:1.6;white-space:pre-wrap}.property-inquiry-page-main .wpcf7-form .required,.property-inquiry-page-main .property-inquiry-form .required{color:var(--color-accent)}.property-inquiry-page-main .wpcf7-form .btn-lg,.property-inquiry-page-main .property-inquiry-form .btn-lg{width:100%;padding:1rem 2rem;font-size:1rem}.inquiry-thank-you-page-main .thank-you-section{padding:3rem 0}.inquiry-thank-you-page-main .thank-you-content{max-width:600px;margin:0 auto;text-align:center}.inquiry-thank-you-page-main .thank-you-message{margin-bottom:2.5rem}.inquiry-thank-you-page-main .thank-you-message .thank-you-icon{color:var(--color-success);margin-bottom:1.5rem}.inquiry-thank-you-page-main .thank-you-message h2{font-family:var(--font-display);font-size:1.75rem;color:var(--color-text);margin-bottom:1rem}.inquiry-thank-you-page-main .thank-you-message p{color:var(--color-text-muted);line-height:1.7}.inquiry-thank-you-page-main .thank-you-property{margin-bottom:2.5rem}.inquiry-thank-you-page-main .thank-you-property h3{font-size:1rem;font-weight:500;color:var(--color-text-muted);margin-bottom:1rem}.inquiry-thank-you-page-main .thank-you-property .property-card-minimal{text-align:left}.inquiry-thank-you-page-main .thank-you-actions{display:flex;flex-direction:column;gap:1rem}@media (min-width: 480px){.inquiry-thank-you-page-main .thank-you-actions{flex-direction:row;justify-content:center}}.inquiry-thank-you-page-main .thank-you-actions .btn,.inquiry-thank-you-page-main .thank-you-actions .comment-form .form-submit input[type=submit],.comment-form .form-submit .inquiry-thank-you-page-main .thank-you-actions input[type=submit]{display:inline-flex;align-items:center;justify-content:center;gap:.5rem}.inquiry-thank-you-page-main .thank-you-actions .btn-outline{background-color:transparent;border:2px solid var(--color-border);color:var(--color-text)}.inquiry-thank-you-page-main .thank-you-actions .btn-outline:hover{border-color:var(--color-accent);color:var(--color-accent)}.property-card-minimal{background-color:var(--color-bg-card);border-radius:.5rem;overflow:hidden;border:1px solid var(--color-border)}.property-card-minimal .property-card-minimal-link{display:flex;text-decoration:none;color:inherit}.property-card-minimal .property-card-minimal-link:hover .property-card-minimal-image img{transform:scale(1.05)}.property-card-minimal .property-card-minimal-image{position:relative;width:140px;min-width:140px;height:120px;overflow:hidden;background-color:var(--color-bg-dark)}.property-card-minimal .property-card-minimal-image img{width:100%;height:100%;-o-object-fit:cover;object-fit:cover;transition:transform .3s ease}.property-card-minimal .property-card-minimal-image .badge{position:absolute;top:8px;left:8px;font-size:.625rem;padding:.25rem .5rem}.property-card-minimal .property-card-minimal-placeholder{width:100%;height:100%;display:flex;align-items:center;justify-content:center;color:var(--color-text-muted)}.property-card-minimal .property-card-minimal-content{padding:1rem;flex:1;display:flex;flex-direction:column;justify-content:center}.property-card-minimal .property-card-minimal-price{font-family:var(--font-display);font-size:1.25rem;color:var(--color-text);margin-bottom:.25rem}.property-card-minimal .property-card-minimal-address{margin-bottom:.5rem}.property-card-minimal .property-card-minimal-address .street{display:block;font-size:.875rem;color:var(--color-text);font-weight:500}.property-card-minimal .property-card-minimal-address .city-state{display:block;font-size:.75rem;color:var(--color-text-muted)}.property-card-minimal .property-card-minimal-meta{display:flex;gap:.75rem;font-size:.75rem;color:var(--color-text-muted);margin-bottom:.25rem}.property-card-minimal .property-card-minimal-meta span{display:flex;align-items:center;gap:.25rem}.property-card-minimal .property-card-minimal-mls{font-size:.625rem;color:var(--color-text-muted);text-transform:uppercase;letter-spacing:.05em}.badge-active{background-color:var(--color-success);color:#fff}.badge-pending{background-color:var(--color-warning);color:#000}.badge-sold{background-color:var(--color-sold);color:#fff}.contact-agent-page-main .contact-agent-section{padding:3rem 0}.contact-agent-page-main .contact-agent-grid{display:grid;gap:2rem}@media (min-width: 1024px){.contact-agent-page-main .contact-agent-grid{grid-template-columns:1fr 360px;gap:3rem}}.contact-agent-page-main .contact-agent-form-wrapper{background-color:var(--color-bg-card);padding:2rem;border-radius:.5rem;border:1px solid var(--color-border)}.contact-agent-page-main .contact-agent-preview .preview-title{font-family:Inter,Droid Sans,Arial,sans-serif;font-size:1rem;font-weight:600;color:var(--color-text-muted);margin-bottom:1rem;text-transform:uppercase;letter-spacing:.05em}.contact-agent-page-main .agent-preview-card{background-color:var(--color-bg-card);border-radius:.5rem;border:1px solid var(--color-border);overflow:hidden}.contact-agent-page-main .agent-preview-photo{aspect-ratio:1;overflow:hidden;background-color:var(--color-bg-dark)}.contact-agent-page-main .agent-preview-photo img{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.contact-agent-page-main .agent-preview-placeholder{width:100%;height:100%;display:flex;align-items:center;justify-content:center;color:var(--color-text-muted)}.contact-agent-page-main .agent-preview-info{padding:1.25rem}.contact-agent-page-main .agent-preview-title{display:block;font-size:.75rem;text-transform:uppercase;letter-spacing:.1em;color:var(--color-accent);margin-bottom:.25rem;font-weight:600}.contact-agent-page-main .agent-preview-name{font-family:var(--font-display);font-size:1.375rem;color:var(--color-text);margin-bottom:1rem}.contact-agent-page-main .agent-preview-contact{display:flex;flex-direction:column;gap:.5rem}.contact-agent-page-main .agent-preview-link{display:inline-flex;align-items:center;gap:.5rem;font-size:.875rem;color:var(--color-text-muted);text-decoration:none}.contact-agent-page-main .agent-preview-link svg{color:var(--color-accent);flex-shrink:0}.contact-agent-page-main .agent-preview-link:hover{color:var(--color-accent-light)}.contact-agent-page-main .agent-preview-profile-link{display:flex;align-items:center;justify-content:center;gap:.5rem;padding:1rem;background-color:var(--color-bg-dark);border-top:1px solid var(--color-border);font-size:.875rem;font-weight:600;color:var(--color-accent);text-decoration:none;text-transform:uppercase;letter-spacing:.05em}.contact-agent-page-main .agent-preview-profile-link:hover{color:var(--color-accent-hover);background-color:#9f37301a}.contact-agent-page-main .wpcf7-form .form-group,.contact-agent-page-main .contact-agent-form .form-group,.contact-agent-page-main .wpcf7-form .form-row,.contact-agent-page-main .contact-agent-form .form-row{margin-bottom:1.5rem}.contact-agent-page-main .wpcf7-form .form-row-2col,.contact-agent-page-main .contact-agent-form .form-row-2col{display:grid;gap:1rem}@media (min-width: 640px){.contact-agent-page-main .wpcf7-form .form-row-2col,.contact-agent-page-main .contact-agent-form .form-row-2col{grid-template-columns:1fr 1fr}}.contact-agent-page-main .wpcf7-form .form-row-2col .form-group,.contact-agent-page-main .contact-agent-form .form-row-2col .form-group{margin-bottom:0}.contact-agent-page-main .wpcf7-form label,.contact-agent-page-main .contact-agent-form label{display:block;font-size:.875rem;font-weight:500;color:var(--color-text);margin-bottom:.5rem}.contact-agent-page-main .wpcf7-form input[type=text],.contact-agent-page-main .wpcf7-form input[type=email],.contact-agent-page-main .wpcf7-form input[type=tel],.contact-agent-page-main .wpcf7-form textarea,.contact-agent-page-main .contact-agent-form input[type=text],.contact-agent-page-main .contact-agent-form input[type=email],.contact-agent-page-main .contact-agent-form input[type=tel],.contact-agent-page-main .contact-agent-form textarea{width:100%;padding:.75rem 1rem;background-color:var(--color-bg-dark);border:1px solid var(--color-border);border-radius:.375rem;color:var(--color-text);font-size:1rem}.contact-agent-page-main .wpcf7-form input[type=text]:focus,.contact-agent-page-main .wpcf7-form input[type=email]:focus,.contact-agent-page-main .wpcf7-form input[type=tel]:focus,.contact-agent-page-main .wpcf7-form textarea:focus,.contact-agent-page-main .contact-agent-form input[type=text]:focus,.contact-agent-page-main .contact-agent-form input[type=email]:focus,.contact-agent-page-main .contact-agent-form input[type=tel]:focus,.contact-agent-page-main .contact-agent-form textarea:focus{outline:none;border-color:var(--color-accent)}.contact-agent-page-main .wpcf7-form input[type=text]::-moz-placeholder,.contact-agent-page-main .wpcf7-form input[type=email]::-moz-placeholder,.contact-agent-page-main .wpcf7-form input[type=tel]::-moz-placeholder,.contact-agent-page-main .wpcf7-form textarea::-moz-placeholder,.contact-agent-page-main .contact-agent-form input[type=text]::-moz-placeholder,.contact-agent-page-main .contact-agent-form input[type=email]::-moz-placeholder,.contact-agent-page-main .contact-agent-form input[type=tel]::-moz-placeholder,.contact-agent-page-main .contact-agent-form textarea::-moz-placeholder{color:var(--color-text-muted)}.contact-agent-page-main .wpcf7-form input[type=text]::placeholder,.contact-agent-page-main .wpcf7-form input[type=email]::placeholder,.contact-agent-page-main .wpcf7-form input[type=tel]::placeholder,.contact-agent-page-main .wpcf7-form textarea::placeholder,.contact-agent-page-main .contact-agent-form input[type=text]::placeholder,.contact-agent-page-main .contact-agent-form input[type=email]::placeholder,.contact-agent-page-main .contact-agent-form input[type=tel]::placeholder,.contact-agent-page-main .contact-agent-form textarea::placeholder{color:var(--color-text-muted)}.contact-agent-page-main .wpcf7-form textarea,.contact-agent-page-main .contact-agent-form textarea{resize:vertical;min-height:100px}.contact-agent-page-main .wpcf7-form .readonly-message-display,.contact-agent-page-main .contact-agent-form .readonly-message-display{background-color:#9f37301a;border:1px solid var(--color-accent);border-radius:.375rem;color:var(--color-text);cursor:default;padding:.75rem 1rem;font-size:1rem;line-height:1.6;white-space:pre-wrap}.contact-agent-page-main .wpcf7-form .required,.contact-agent-page-main .contact-agent-form .required{color:var(--color-accent)}.contact-agent-page-main .wpcf7-form .btn-lg,.contact-agent-page-main .contact-agent-form .btn-lg{width:100%;padding:1rem 2rem;font-size:1rem}.sidebar-widgets{display:flex;flex-direction:column;gap:2rem}.sidebar-widget{background-color:var(--color-bg-card);padding:1.5rem;border-radius:.5rem}.widget-title{font-family:var(--font-display);font-size:1.125rem;color:var(--color-text);margin-bottom:1rem;padding-bottom:.75rem;border-bottom:1px solid var(--color-border)}.widget-search .search-form{display:flex;gap:.5rem}.widget-search .search-field{flex:1}.widget-search .search-submit{flex-shrink:0;padding:.75rem 1rem;background-color:var(--color-accent);color:#fff;border:none;border-radius:.25rem;cursor:pointer}.widget-search .search-submit:hover{background-color:var(--color-accent-hover)}.category-list{list-style:none;margin:0;padding:0}.category-list li{padding:.5rem 0;border-bottom:1px solid var(--color-border)}.category-list li:last-child{border-bottom:none;padding-bottom:0}.category-list a{display:flex;justify-content:space-between;align-items:center;color:var(--color-text-muted);font-size:.9375rem}.category-list a:hover{color:var(--color-accent-light)}.category-list .count{font-size:.8125rem;color:var(--color-sold)}.recent-posts-list{list-style:none;margin:0;padding:0}.recent-posts-list li{padding:.75rem 0;border-bottom:1px solid var(--color-border)}.recent-posts-list li:last-child{border-bottom:none;padding-bottom:0}.recent-posts-list a{display:block;color:var(--color-text);font-size:.9375rem;font-weight:500;line-height:1.4;margin-bottom:.25rem}.recent-posts-list a:hover{color:var(--color-accent-light)}.recent-posts-list .post-date{display:block;font-size:.8125rem;color:var(--color-sold)}.widget-cta{background-color:var(--color-accent);text-align:center}.widget-cta .widget-title{color:#fff;border-bottom-color:#fff3}.widget-cta p{color:#ffffffe6;font-size:.9375rem;margin-bottom:1rem}.widget-cta .btn-primary,.widget-cta .comment-form .form-submit input[type=submit],.comment-form .form-submit .widget-cta input[type=submit]{background-color:#fff;color:var(--color-accent)}.widget-cta .btn-primary:hover,.widget-cta .comment-form .form-submit input[type=submit]:hover,.comment-form .form-submit .widget-cta input[type=submit]:hover{background-color:var(--color-text)}.widget-cta .btn-small{padding:.5rem 1rem;font-size:.8125rem}.full-width-main{padding:0}.full-width-hero{width:100%;max-height:50vh;overflow:hidden}.full-width-hero img{width:100%;height:auto;-o-object-fit:cover;object-fit:cover}.full-width-content .page-header{padding:3rem 0 2rem}.full-width-content .page-title{font-size:2.5rem;margin-bottom:0}@media (max-width: 768px){.full-width-content .page-title{font-size:2rem}}.full-width-content .entry-content--wide{padding-bottom:4rem}.full-width-content .entry-content--wide>.alignfull{max-width:none}.full-width-content .entry-content--wide>.alignwide{max-width:calc(var(--container-max) + 200px);margin-left:auto;margin-right:auto}.landing-page-site{display:flex;flex-direction:column;min-height:100vh}.landing-header{padding:1rem 0;background-color:var(--color-bg-card);border-bottom:1px solid var(--color-border)}.landing-header-content{text-align:center}.landing-logo{display:inline-block}.landing-logo .custom-logo{max-height:40px;width:auto}.landing-logo .site-title{font-family:var(--font-display);font-size:1.5rem;color:var(--color-text)}.landing-main{flex:1;padding:0}.landing-content .entry-content>*:first-child{margin-top:0}.landing-content .entry-content>.alignfull{max-width:none;width:100vw;margin-left:calc(-50vw + 50%)}.landing-footer{padding:1.5rem 0;background-color:var(--color-bg-card);border-top:1px solid var(--color-border)}.landing-footer-text{text-align:center;font-size:.875rem;color:var(--color-text-muted);margin:0}.landing-footer-links{display:inline-block;margin-left:1rem;padding-left:1rem;border-left:1px solid var(--color-border)}.landing-footer-links a{color:var(--color-text-muted)}.landing-footer-links a:hover{color:var(--color-accent-light)}.Search_Page .search-main{padding:0}.Search_Page .search-content-section{padding:4rem 0;background-color:var(--color-bg-dark)}@media (max-width: 768px){.Search_Page .search-content-section{padding:3rem 0}}.Search_Page .search-form-wrapper{max-width:600px;margin:0 auto 2rem}.Search_Page .search-form-wrapper .search-form{display:flex;gap:.5rem}.Search_Page .search-form-wrapper .search-field{flex:1;padding:1rem 1.25rem;font-size:1rem}.Search_Page .search-form-wrapper .search-submit{padding:1rem 1.5rem;background-color:var(--color-accent);color:#fff;border:none;border-radius:.25rem;font-weight:600;cursor:pointer}.Search_Page .search-form-wrapper .search-submit:hover{background-color:var(--color-accent-hover)}.Search_Page .search-results-count{text-align:center;color:var(--color-text-muted);margin-bottom:2rem}.Search_Page .search-results{display:flex;flex-direction:column;gap:1.5rem;max-width:800px;margin:0 auto}.Search_Page .search-result-item{display:flex;gap:1.5rem;padding:1.5rem;background-color:var(--color-bg-card);border-radius:.5rem}@media (max-width: 640px){.Search_Page .search-result-item{flex-direction:column;gap:1rem}}.Search_Page .search-result-image{flex-shrink:0}.Search_Page .search-result-image img{width:120px;height:90px;-o-object-fit:cover;object-fit:cover;border-radius:.25rem}@media (max-width: 640px){.Search_Page .search-result-image img{width:100%;height:200px}}.Search_Page .search-result-content{flex:1}.Search_Page .search-result-meta{display:flex;align-items:center;gap:1rem;margin-bottom:.5rem;font-size:.8125rem}.Search_Page .search-result-type{display:inline-block;padding:.125rem .5rem;background-color:var(--color-accent);color:#fff;border-radius:.25rem;font-size:.6875rem;text-transform:uppercase;letter-spacing:.05em}.Search_Page .search-result-date{color:var(--color-text-muted)}.Search_Page .search-result-title{font-family:var(--font-display);font-size:1.25rem;margin-bottom:.5rem}.Search_Page .search-result-title a{color:var(--color-text)}.Search_Page .search-result-title a:hover{color:var(--color-accent-light)}.Search_Page .search-result-excerpt{font-size:.9375rem;color:var(--color-text-muted);line-height:1.6;margin-bottom:.75rem}.Search_Page .search-result-excerpt p{margin:0}.Search_Page .search-result-link{display:inline-flex;align-items:center;gap:.5rem;font-size:.875rem;font-weight:600;color:var(--color-accent-light)}.Search_Page .search-result-link:hover{color:var(--color-accent-hover)}.Search_Page .no-results-message{text-align:center;padding:3rem;background-color:var(--color-bg-card);border-radius:.5rem;max-width:500px;margin:0 auto}.Search_Page .no-results-message h2{font-family:var(--font-display);font-size:1.5rem;color:var(--color-text);margin-bottom:.5rem}.Search_Page .no-results-message p{color:var(--color-text-muted);margin-bottom:1.5rem}.Search_Page .no-results-actions{display:flex;justify-content:center;gap:1rem;flex-wrap:wrap}.Search_Page .navigation.pagination{margin-top:3rem;max-width:800px;margin-left:auto;margin-right:auto}.Search_Page .navigation.pagination .nav-links{display:flex;justify-content:center;align-items:center;gap:.5rem;flex-wrap:wrap}.Search_Page .navigation.pagination .page-numbers{display:inline-flex;align-items:center;justify-content:center;min-width:40px;height:40px;padding:0 .75rem;background-color:var(--color-bg-card);color:var(--color-text-muted);border-radius:.25rem;font-size:.875rem}.Search_Page .navigation.pagination .page-numbers:hover,.Search_Page .navigation.pagination .page-numbers.current{background-color:var(--color-accent);color:#fff}.communities-page-main{padding:0}.communities-grid-section{padding:4rem 0;background-color:var(--color-bg-card)}.communities-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:1.5rem}@media (max-width: 1024px){.communities-grid{grid-template-columns:repeat(3,1fr)}}@media (max-width: 768px){.communities-grid{grid-template-columns:repeat(2,1fr)}}@media (max-width: 480px){.communities-grid{grid-template-columns:1fr}}.community-card{display:block;background-color:var(--color-bg-dark);border:1px solid var(--color-border);border-radius:.5rem;padding:1.5rem;text-decoration:none;transition:border-color .2s ease,transform .2s ease}.community-card:hover{border-color:var(--color-accent);transform:translateY(-2px)}.community-card:hover .community-card-arrow{transform:translate(4px)}.community-card-content{display:flex;flex-direction:column;gap:.5rem}.community-card-title{font-family:var(--font-display);font-size:1.25rem;color:var(--color-text);margin:0}.community-card-count{font-size:.875rem;color:var(--color-text-muted)}.community-card-arrow{margin-top:.5rem;color:var(--color-accent);transition:transform .2s ease}.communities-about-section{padding:4rem 0;background-color:var(--color-bg-dark)}.communities-about-content{max-width:800px;margin:0 auto;text-align:center}.communities-about-content h2{font-family:var(--font-display);font-size:2rem;color:var(--color-text);margin-bottom:1.5rem}.communities-about-content p{font-size:1.125rem;color:var(--color-text-muted);line-height:1.7;margin-bottom:1rem}.communities-about-content p:last-child{margin-bottom:0}.no-communities-message{text-align:center;color:var(--color-text-muted);font-size:1.125rem;padding:3rem 0}.community-page-main{padding:0}.community-about-section{padding:4rem 0;background-color:var(--color-bg-card)}.community-about-content{max-width:800px;margin:0 auto}.community-about-content h2,.community-about-content h3,.community-about-content h4{font-family:var(--font-display);color:var(--color-text)}.community-about-content p{font-size:1.125rem;color:var(--color-text-muted);line-height:1.7}.community-about-content ul,.community-about-content ol{color:var(--color-text-muted);margin-bottom:1rem;padding-left:1.5rem}.community-about-content li{margin-bottom:.5rem}.community-properties-section{padding:4rem 0;background-color:var(--color-bg-dark)}.community-properties-section .section-header{text-align:center;margin-bottom:3rem}.community-properties-section .section-title{font-family:var(--font-display);font-size:2.25rem;color:var(--color-text);margin-bottom:.75rem}.community-properties-section .section-subtitle{font-size:1.125rem;color:var(--color-text-muted)}.community-properties-section .section-footer{text-align:center;margin-top:2.5rem}.community-properties-section .property-grid--3col{display:grid;grid-template-columns:repeat(3,1fr);gap:1.5rem}@media (max-width: 1024px){.community-properties-section .property-grid--3col{grid-template-columns:repeat(2,1fr)}}@media (max-width: 640px){.community-properties-section .property-grid--3col{grid-template-columns:1fr}}.community-properties-section .no-properties-message{text-align:center;color:var(--color-text-muted);font-size:1.125rem;padding:3rem 0}.community-properties-section .no-properties-message a{color:var(--color-accent-light)}.community-properties-section .no-properties-message a:hover{color:var(--color-accent-hover)}.resources-page-main{padding:0}.resources-featured-section{padding:4rem 0;background-color:var(--color-bg-dark)}.resources-featured-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:2rem}@media (max-width: 768px){.resources-featured-grid{grid-template-columns:1fr}}.resource-featured-card{position:relative;display:flex;flex-direction:column;background-color:var(--color-bg-card);border:1px solid var(--color-border);border-radius:.5rem;overflow:hidden;cursor:pointer}.resource-featured-card:hover{border-color:var(--color-accent)}.resource-featured-card:hover .resource-featured-visual{background-size:110%}.resource-featured-card:hover .btn,.resource-featured-card:hover .comment-form .form-submit input[type=submit],.comment-form .form-submit .resource-featured-card:hover input[type=submit]{background-color:var(--color-accent-hover)}@media (min-width: 640px){.resource-featured-card{flex-direction:row}}.resource-card-link-overlay{position:absolute;top:0;left:0;right:0;bottom:0;z-index:1}.resource-featured-visual{position:relative;display:flex;align-items:center;justify-content:center;min-height:200px;background-size:100%;background-position:center}@media (min-width: 640px){.resource-featured-visual{width:200px;min-height:280px;flex-shrink:0}}.resource-featured-visual:before{content:"";position:absolute;top:0;left:0;right:0;bottom:0}.resource-featured-card--buyer .resource-featured-visual{background:linear-gradient(135deg,#1a1a1a,#2d1f1f,#3d2a2a)}.resource-featured-card--buyer .resource-featured-visual:before{background:radial-gradient(circle at 30% 70%,rgba(159,55,48,.2) 0%,transparent 50%)}.resource-featured-card--seller .resource-featured-visual{background:linear-gradient(135deg,#1a1a1a,#1f2d1f,#2a3d2a)}.resource-featured-card--seller .resource-featured-visual:before{background:radial-gradient(circle at 70% 30%,rgba(46,125,50,.2) 0%,transparent 50%)}.resource-featured-badge{position:absolute;top:1rem;left:1rem;padding:.25rem .75rem;background-color:var(--color-accent);color:#fff;font-size:.625rem;font-weight:600;text-transform:uppercase;letter-spacing:.1em;border-radius:.25rem}.resource-featured-icon-large{position:relative;display:flex;align-items:center;justify-content:center;width:120px;height:120px;background-color:#0000004d;border-radius:50%;color:var(--color-accent)}@media (max-width: 639px){.resource-featured-icon-large{width:100px;height:100px}.resource-featured-icon-large svg{width:60px;height:60px}}.resource-featured-content{flex:1;padding:1.5rem;display:flex;flex-direction:column}@media (min-width: 640px){.resource-featured-content{padding:2rem}}.resource-featured-title{font-family:var(--font-display);font-size:1.5rem;color:var(--color-text);margin-bottom:.75rem}@media (min-width: 640px){.resource-featured-title{font-size:1.75rem}}.resource-featured-description{font-size:.9375rem;color:var(--color-text-muted);line-height:1.6;margin-bottom:1rem}.resource-featured-highlights{list-style:none;padding:0;margin:0 0 1.5rem;display:grid;grid-template-columns:repeat(2,1fr);gap:.5rem}.resource-featured-highlights li{display:flex;align-items:center;gap:.5rem;font-size:.8125rem;color:var(--color-text-muted)}.resource-featured-highlights li:before{content:"";width:6px;height:6px;background-color:var(--color-accent);border-radius:50%;flex-shrink:0}@media (max-width: 480px){.resource-featured-highlights{grid-template-columns:1fr}}.resources-additional-section{padding:4rem 0;background-color:var(--color-bg-dark)}.resources-additional-section .section-header{text-align:center;margin-bottom:3rem}.resources-additional-section .section-title{font-family:var(--font-display);font-size:2.25rem;color:var(--color-text);margin-bottom:.75rem}.resources-additional-section .section-subtitle{font-size:1.125rem;color:var(--color-text-muted)}.resources-additional-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:1.5rem}@media (max-width: 992px){.resources-additional-grid{grid-template-columns:repeat(2,1fr)}}@media (max-width: 640px){.resources-additional-grid{grid-template-columns:1fr}}.resource-card{position:relative;background-color:var(--color-bg-card);border:1px solid var(--color-border);border-radius:.5rem;padding:1.5rem;cursor:pointer}.resource-card:hover{border-color:var(--color-accent)}.resource-card-icon{display:flex;align-items:center;justify-content:center;width:56px;height:56px;margin-bottom:1rem;background-color:#9f37301a;border-radius:.5rem;color:var(--color-accent)}.resource-card-title{font-family:var(--font-display);font-size:1.25rem;color:var(--color-text);margin-bottom:.5rem}.resource-card-description{font-size:.875rem;color:var(--color-text-muted);line-height:1.5;margin-bottom:0}.resource-page-main{padding:0}.resource-content-section{padding:4rem 0;background-color:var(--color-bg-card)}.resource-content-layout{display:grid;grid-template-columns:1fr 320px;gap:3rem}@media (max-width: 992px){.resource-content-layout{grid-template-columns:1fr}}.resource-content h2,.resource-content h3,.resource-content h4{font-family:var(--font-display);color:var(--color-text);margin-top:2rem;margin-bottom:1rem}.resource-content h2:first-child,.resource-content h3:first-child,.resource-content h4:first-child{margin-top:0}.resource-content h2{font-size:1.75rem}.resource-content h3{font-size:1.5rem}.resource-content h4{font-size:1.25rem}.resource-content p{font-size:1.125rem;color:var(--color-text-muted);line-height:1.7}.resource-content ul,.resource-content ol{color:var(--color-text-muted);margin-bottom:1.5rem;padding-left:1.5rem;font-size:1.125rem;line-height:1.7}.resource-content li{margin-bottom:.5rem}.resource-content blockquote{border-left:4px solid var(--color-accent);padding-left:1.5rem;margin:1.5rem 0;font-style:italic;color:var(--color-text-muted)}@media (max-width: 992px){.resource-sidebar{order:-1}}.resource-sidebar-sticky{position:sticky;top:100px}@media (max-width: 992px){.resource-sidebar-sticky{position:static}}.resource-sidebar-card{background-color:var(--color-bg-dark);border:1px solid var(--color-border);border-radius:.5rem;padding:1.5rem;margin-bottom:1.5rem}.resource-sidebar-card h3{font-family:var(--font-display);font-size:1.25rem;color:var(--color-text);margin-bottom:.75rem}.resource-sidebar-card p{font-size:.875rem;color:var(--color-text-muted);margin-bottom:1rem}.resource-sidebar-phone{text-align:center;margin-top:1rem;margin-bottom:0}.resource-sidebar-phone a{color:var(--color-accent-light)}.resource-sidebar-phone a:hover{color:var(--color-accent-hover)}.resource-sidebar-links{list-style:none;padding:0;margin:0}.resource-sidebar-links li{margin-bottom:.5rem}.resource-sidebar-links li:last-child{margin-bottom:0}.resource-sidebar-links a{color:var(--color-text-muted);font-size:.875rem}.resource-sidebar-links a:hover{color:var(--color-accent-light)}.mortgage-calculator-main{padding-bottom:4rem}.mortgage-calculator-layout{display:grid;grid-template-columns:1fr;gap:2rem;padding-top:2rem}@media (min-width: 1024px){.mortgage-calculator-layout{grid-template-columns:1fr 350px;gap:3rem}}.calculator-widget{background-color:var(--color-bg-card);border-radius:.5rem;padding:2rem;margin-bottom:2rem}@media (max-width: 640px){.calculator-widget{padding:1.5rem}}.calculator-form{display:flex;flex-direction:column;gap:2rem}@media (min-width: 768px){.calculator-form{flex-direction:row;gap:3rem}}.calculator-inputs{flex:1;display:flex;flex-direction:column;gap:1.25rem}.input-group label{display:block;font-family:Times New Roman,Times,serif;font-size:.875rem;font-weight:700;color:var(--color-text);margin-bottom:.5rem}.input-row{display:flex;gap:.75rem}.input-row .input-currency{flex:2}.input-row .input-percent{flex:1;min-width:80px}.input-wrapper{position:relative;display:flex;align-items:center}.input-wrapper input,.input-wrapper select{width:100%;padding:.75rem 1rem;background-color:#000;border:1px solid var(--color-border);border-radius:.25rem;color:var(--color-text);font-size:1rem;font-family:inherit}.input-wrapper input:focus,.input-wrapper select:focus{outline:none;border-color:var(--color-accent)}.input-wrapper select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23B0B0B0' stroke-width='2'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right .75rem center;padding-right:2.5rem;cursor:pointer}.input-wrapper.input-currency input{padding-left:1.75rem}.input-wrapper.input-currency .input-prefix{position:absolute;left:.75rem;color:var(--color-text-muted);pointer-events:none}.input-wrapper.input-percent input{padding-right:2rem}.input-wrapper.input-percent .input-suffix{position:absolute;right:.75rem;color:var(--color-text-muted);pointer-events:none}.calculator-results{flex:1;display:flex;flex-direction:column;justify-content:center}@media (min-width: 768px){.calculator-results{padding-left:2rem;border-left:1px solid var(--color-border)}}@media (max-width: 767px){.calculator-results{padding-top:1.5rem;border-top:1px solid var(--color-border)}}.result-main{text-align:center;margin-bottom:1.5rem}.result-main .result-label{display:block;font-size:.875rem;color:var(--color-text-muted);margin-bottom:.5rem}@media (min-width: 1024px){.result-main .result-label{font-size:1.4rem}}.result-main .result-value{display:block;font-family:var(--font-display);font-size:2.5rem;color:var(--color-accent-light);line-height:1.2}@media (max-width: 640px){.result-main .result-value{font-size:2rem}}@media (min-width: 1024px){.result-main .result-value{font-size:3.125rem}}.result-breakdown{display:flex;flex-direction:column;gap:.75rem}.breakdown-item{display:flex;justify-content:space-between;align-items:center;padding:.5rem 0;border-bottom:1px solid var(--color-border)}.breakdown-item:last-child{border-bottom:none}.breakdown-item .breakdown-label{font-size:.875rem;color:var(--color-text-muted)}.breakdown-item .breakdown-value{font-size:.9375rem;font-weight:600;color:var(--color-text)}.calculator-guide,.calculator-notes{margin-bottom:2rem}.calculator-guide .section-title,.calculator-notes .section-title{font-size:1.25rem;margin-bottom:1.25rem;padding-bottom:.75rem;border-bottom:1px solid var(--color-border)}.guide-content p,.notes-content p{color:var(--color-text-muted);line-height:1.7;margin-bottom:1rem}.guide-list,.notes-list{list-style:none;margin:0;padding:0}.guide-list li,.notes-list li{position:relative;padding-left:1.5rem;margin-bottom:.75rem;color:var(--color-text-muted);line-height:1.6}.guide-list li:before,.notes-list li:before{content:"";position:absolute;left:0;top:.5rem;width:6px;height:6px;background-color:var(--color-accent);border-radius:50%}.guide-list li strong,.notes-list li strong{color:var(--color-text)}.mortgage-calculator-sidebar{display:flex;flex-direction:column;gap:1.5rem}@media (min-width: 1024px){.mortgage-calculator-sidebar{align-self:start}}.mortgage-calculator-sidebar .sidebar-widget{background-color:var(--color-bg-card);border-radius:.5rem;padding:1.5rem}.mortgage-calculator-sidebar .widget-title{font-family:Times New Roman,Times,serif;font-size:18px;font-weight:700;margin-bottom:1rem;padding-bottom:.75rem;border-bottom:1px solid var(--color-border)}.tips-list{list-style:none;margin:0;padding:0}.tips-list li{position:relative;padding-left:1.25rem;margin-bottom:.875rem;font-size:.9375rem;color:var(--color-text-muted);line-height:1.5}.tips-list li:before{content:"";position:absolute;left:0;top:.5rem;width:5px;height:5px;background-color:var(--color-accent);border-radius:50%}.tips-list li:last-child{margin-bottom:0}.help-text{font-size:.9375rem;color:var(--color-text-muted);line-height:1.6;margin-bottom:1.25rem}.btn-block{display:block;width:100%;text-align:center}.resource-links{list-style:none;margin:0;padding:0}.resource-links li{margin-bottom:.625rem}.resource-links li:last-child{margin-bottom:0}.resource-links a{color:var(--color-text-muted);font-size:.9375rem;text-decoration:none}.resource-links a:hover{color:var(--color-accent-light)}.property-card{display:flex;flex-direction:column;height:100%;max-height:525px;background-color:var(--color-bg-dark);border:1px solid var(--color-accent);border-radius:.5rem;overflow:hidden;position:relative;cursor:pointer;transition:transform .2s ease,box-shadow .2s ease,border-color .2s ease}.property-card:hover{border-color:var(--color-accent-hover);transform:translateY(-4px);box-shadow:0 12px 24px #0006}.property-card:hover .property-card-link{color:var(--color-accent-hover)}.property-card-link-overlay{position:absolute;top:0;left:0;right:0;bottom:0;z-index:1}.property-card-image{display:block;position:relative;aspect-ratio:16/10;overflow:hidden;background-color:var(--color-bg-dark);background-size:cover;background-position:center;background-repeat:no-repeat}.property-card-image.has-image{background-color:var(--color-bg-card)}.property-card-image.is-loaded .property-card-spinner{display:none}.property-card-image img{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.property-card-spinner{position:absolute;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;background-color:var(--color-bg-card)}.property-card-spinner .spinner{width:32px;height:32px;border:3px solid var(--color-border);border-top-color:var(--color-accent);border-radius:50%;animation:card-spin .8s linear infinite}@keyframes card-spin{to{transform:rotate(360deg)}}.property-card-placeholder{width:100%;height:100%;display:flex;align-items:center;justify-content:center;background-color:var(--color-bg-dark);color:var(--color-border)}.property-card-badge{position:absolute;top:.75rem;left:.75rem}.property-card-content{display:flex;flex-direction:column;flex-grow:1;padding:1.25rem}.property-card-price{font-family:var(--font-display);font-size:1.5rem;color:var(--color-text);margin-bottom:.5rem}.property-card-title{font-family:var(--font-body);font-size:1rem;font-weight:500;line-height:1.4;margin-bottom:.75rem;color:var(--color-text-muted)}.property-card-specs{display:flex;flex-wrap:wrap;gap:1rem;list-style:none;margin:0 0 .75rem;padding:0}.spec-item{display:flex;align-items:center;gap:.375rem;font-size:.875rem;color:var(--color-text-muted)}.spec-item svg{color:var(--color-accent);flex-shrink:0}.property-card-excerpt{flex-grow:1;font-size:.875rem;color:var(--color-sold);margin-bottom:1rem;line-height:1.5}.property-card-link{display:inline-flex;align-items:center;gap:.5rem;font-size:.875rem;font-weight:600;color:var(--color-accent-light);text-decoration:none;margin-top:auto}.property-card-link:hover{color:var(--color-accent-hover)}.property-card-link svg{width:16px;height:16px}.properties-grid{display:grid;grid-template-columns:1fr;gap:1.5rem;padding:1.5rem 0}@media (min-width: 640px){.properties-grid{grid-template-columns:repeat(2,1fr)}}@media (min-width: 1024px){.properties-grid{grid-template-columns:repeat(3,1fr);gap:2rem}}.properties-meta{display:flex;justify-content:space-between;align-items:center;padding:1rem 0;border-bottom:1px solid var(--color-border)}.properties-count{font-size:.9375rem;color:var(--color-text-muted)}.properties-count strong{color:var(--color-text)}.no-properties{text-align:center;padding:4rem 0;color:var(--color-text-muted)}.no-properties h3{color:var(--color-text);margin-bottom:.5rem}.no-properties p{margin-bottom:1.5rem}.archive-hero{position:relative;background-color:var(--color-bg-card);background-size:cover;background-position:center;background-repeat:no-repeat;padding:3rem 0}.archive-hero.has-background{padding:4rem 0}@media (max-width: 768px){.archive-hero.has-background{padding:3rem 0}}.archive-hero .container{position:relative;z-index:2}.archive-hero-overlay{position:absolute;top:0;left:0;right:0;bottom:0;background:linear-gradient(to bottom,#0a0a0abf,#0a0a0aa6);z-index:1}.archive-hero-title{margin-bottom:.5rem}.has-background .archive-hero-title{text-shadow:0 2px 4px rgba(0,0,0,.3)}.archive-hero-subtitle{font-size:1.125rem;color:var(--color-text-muted);margin-bottom:0;max-width:600px}.has-background .archive-hero-subtitle{color:var(--color-text);opacity:.9;text-shadow:0 1px 2px rgba(0,0,0,.3)}.view-toggle{display:flex;gap:.5rem;margin-bottom:1.5rem}.view-toggle-btn{display:inline-flex;align-items:center;gap:.5rem;padding:.5rem 1rem;font-size:.875rem;font-weight:500;color:var(--color-text-muted);background-color:var(--color-bg-card);border:1px solid var(--color-border);border-radius:.25rem;text-decoration:none;transition:all .15s ease}.view-toggle-btn:hover{color:var(--color-text);border-color:var(--color-accent)}.view-toggle-btn.active{color:var(--color-text);background-color:var(--color-accent);border-color:var(--color-accent)}.view-toggle-btn svg{flex-shrink:0}.view-toggle-btn.view-toggle-nearme{margin-left:auto}.property-map-layout{display:none}@media (min-width: 1024px){.is-map-view .property-map-layout{display:grid;grid-template-columns:minmax(300px,33%) 1fr;gap:2rem;width:var(--layout-width, 100%);max-width:100%;margin-left:auto;margin-right:auto}}.grid-view-container{display:block}.grid-view-container .view-toggle{display:none}@media (min-width: 1024px){.grid-view-container .view-toggle{display:flex}.grid-view-container{display:none}.is-grid-view .grid-view-container{display:block;width:var(--layout-width, 100%);max-width:100%;margin-left:auto;margin-right:auto}}.property-sidebar{position:relative}@media (min-width: 1024px){.property-sidebar{padding-bottom:20px}.property-sidebar-content{position:sticky;top:100px}}.property-sidebar-content .view-toggle{margin-bottom:1.4rem}.property-map{width:100%;height:200px;background-color:var(--color-bg-card);border-radius:.5rem;overflow:hidden;border:1px solid var(--color-border)}@media (min-width: 1024px){.property-map{height:calc(50vh - 75px)}}.property-list-container .properties-meta{padding-top:0;padding-bottom:0}.property-list-container .properties-grid{grid-template-columns:1fr}@media (min-width: 640px){.property-list-container .properties-grid{grid-template-columns:repeat(2,1fr)}}@media (min-width: 1024px){.property-list-container .properties-grid{grid-template-columns:repeat(var(--card-columns, 2),minmax(350px,1fr));gap:1.5rem}.is-map-view .property-list-container #property-results{min-height:100vh}.grid-view-container .properties-grid{grid-template-columns:repeat(var(--card-columns, 3),400px);gap:1.5rem}}.property-marker{background:transparent}.property-marker .marker-pin{width:16px;height:16px;border-radius:50% 50% 50% 0;background:var(--color-accent);position:absolute;transform:rotate(-45deg);left:50%;top:50%;margin:-11px 0 0 -8px;box-shadow:0 1px 4px #0000004d}.property-marker .marker-pin:after{content:"";width:7px;height:7px;margin:4px 0 0 4px;background:var(--color-bg-dark);position:absolute;border-radius:50%}.property-marker.property-marker-amber .marker-pin{background:#f59e0b}.property-marker.property-marker-blue .marker-pin{background:#3b82f6}.marker-cluster{background-clip:padding-box;border-radius:50%}.marker-cluster div{width:32px;height:32px;margin-left:4px;margin-top:4px;text-align:center;border-radius:50%;font-weight:600;font-size:12px;display:flex;align-items:center;justify-content:center}.marker-cluster span{line-height:1}.marker-cluster-small{background-color:#78787873}.marker-cluster-medium{background-color:#c8505080}.marker-cluster-large{background-color:#dc2828b3}.marker-cluster-small div{width:22px;height:22px;margin-left:4px;margin-top:4px}.marker-cluster-medium div{width:27px;height:27px;margin-left:4px;margin-top:4px}.marker-cluster-large div{width:32px;height:32px;margin-left:4px;margin-top:4px}.marker-cluster-small div,.marker-cluster-medium div,.marker-cluster-large div{color:#000;font-weight:800;font-size:12px;opacity:1}.density-dot-container{background:transparent!important;border:none!important}.density-dot{border-radius:50%;border:1px solid rgba(0,0,0,.15);box-shadow:0 1px 2px #0003;cursor:pointer;transition:transform .15s ease,box-shadow .15s ease}.density-dot:hover{transform:scale(1.4);box-shadow:0 2px 4px #0000004d}.density-tooltip,.cluster-tooltip{font-family:var(--font-body);font-size:.75rem;padding:.25rem .5rem;background:#1e1e1ee6;color:#fff;border:none;border-radius:.25rem}.property-card-highlighted{border-color:#f59e0b!important;box-shadow:0 0 0 2px #f59e0b4d}.map-popup{font-family:var(--font-body);padding:.25rem}.map-popup strong{font-size:1rem;color:var(--color-accent)}.map-popup span{font-size:.875rem;color:#666}.map-popup a{display:inline-block;margin-top:.5rem;font-size:.875rem;color:var(--color-accent);font-weight:500}.map-popup a:hover{text-decoration:underline}.leaflet-popup-content-wrapper{border-radius:.5rem}.leaflet-popup-tip-container{margin-top:-1px}.property-archive-main>.container{max-width:none;padding-top:2rem;padding-left:var(--container-padding);padding-right:var(--container-padding)}.property-archive-main .archive-hero .container{max-width:var(--container-max)}.property-archive-main .property-filters{max-width:var(--container-max);margin-left:auto;margin-right:auto}.property-filters{background-color:var(--color-bg-card);border-radius:.5rem;padding:1.5rem;margin-bottom:1.5rem}.filters-form{display:block}.filters-row{display:grid;grid-template-columns:repeat(2,1fr);gap:.75rem}@media (min-width: 768px){.filters-row{grid-template-columns:repeat(4,1fr)}}@media (min-width: 1100px){.filters-row{grid-template-columns:repeat(7,1fr)}}.filter-item{display:flex;flex-direction:column;gap:.375rem}.filter-item-button .btn,.filter-item-button .comment-form .form-submit input[type=submit],.comment-form .form-submit .filter-item-button input[type=submit]{width:100%;padding:.625rem 1rem}.filter-label{font-size:.8125rem;font-weight:500;color:var(--color-text);text-transform:uppercase;letter-spacing:.03em}.filter-select,.filter-input{width:100%;height:2.75rem;padding:0 .75rem;background-color:#000;border:1px solid var(--color-border);border-radius:.25rem;color:var(--color-text);font-size:.9375rem;box-sizing:border-box}.filter-select:focus,.filter-input:focus{outline:none;border-color:var(--color-accent)}.filter-select{padding-right:2rem;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23B0B0B0' stroke-width='2'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right .75rem center}.filter-input::-moz-placeholder{color:var(--color-text-muted);opacity:.7}.filter-input::placeholder{color:var(--color-text-muted);opacity:.7}.filter-item-zip{max-width:120px}@media (max-width: 768px){.filter-item-zip{max-width:none}}.property-filters.is-loading{pointer-events:none;opacity:.7}.property-filters-sticky{display:none}@media (min-width: 1024px){.property-filters-sticky{margin-top:1rem;background-color:var(--color-bg-card);border-radius:.5rem;padding:.75rem;border:1px solid var(--color-border);opacity:0;visibility:hidden;transition:opacity .2s ease}.property-filters-sticky.is-visible{display:block;opacity:1;visibility:visible}.property-filters-sticky.is-hiding{opacity:0;visibility:hidden;transition:none}}.filters-sticky-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:.5rem}@media (min-width: 1024px){.filters-sticky-grid{grid-template-columns:repeat(3,1fr)}}.filter-item-sticky .filter-select,.filter-item-sticky .filter-input{width:100%;height:2.25rem;padding:0 .625rem;font-size:.8125rem;background-color:#000;border:1px solid var(--color-border);border-radius:.25rem;color:var(--color-text);box-sizing:border-box}.filter-item-sticky .filter-select:focus,.filter-item-sticky .filter-input:focus{outline:none;border-color:var(--color-accent)}.filter-item-sticky .filter-select{padding-right:1.75rem;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23B0B0B0' stroke-width='2'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right .5rem center}.filter-item-sticky-zip .filter-input::-moz-placeholder{color:var(--color-text-muted);opacity:.7}.filter-item-sticky-zip .filter-input::placeholder{color:var(--color-text-muted);opacity:.7}.filters-sticky-reset{display:flex;justify-content:center;margin-top:.75rem;padding-top:.75rem;border-top:1px solid var(--color-border)}.filters-sticky-reset .btn,.filters-sticky-reset .comment-form .form-submit input[type=submit],.comment-form .form-submit .filters-sticky-reset input[type=submit]{padding:.5rem 1.5rem;font-size:.8125rem}.property-results-loading{display:flex;justify-content:center;align-items:center;padding:4rem 0}.property-results-loading .spinner{width:40px;height:40px;border:3px solid var(--color-border);border-top-color:var(--color-accent);border-radius:50%;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.server-cluster{cursor:pointer}.server-cluster:hover div{transform:scale(1.1);transition:transform .15s ease}.cluster-tooltip{background-color:var(--color-bg-card);border:1px solid var(--color-border);border-radius:.375rem;color:var(--color-text);font-family:var(--font-body);font-size:.8125rem;padding:.5rem .75rem;line-height:1.4;box-shadow:0 2px 8px #00000026}.cluster-tooltip:before{border-top-color:var(--color-border)}.infinite-scroll-page{display:contents}.property-card.is-placeholder{background:var(--color-surface, #1a1a1a);border:1px solid var(--color-border, #333);border-radius:.5rem}.infinite-scroll-placeholder{grid-column:1/-1;background:transparent}.infinite-scroll-sentinel{height:1px;visibility:hidden;pointer-events:none}.infinite-scroll-padding{height:0;pointer-events:none}.infinite-scroll-loader{display:none;justify-content:center;align-items:center;padding:1.5rem;grid-column:1/-1}.infinite-scroll-loader.is-loading{display:flex}.infinite-scroll-loader .spinner{width:24px;height:24px;border:2px solid var(--color-border);border-top-color:var(--color-accent);border-radius:50%;animation:spin .8s linear infinite}.infinite-scroll-enabled .pagination,#property-results.infinite-scroll-enabled .pagination{display:none!important}.is-near-me-mode .property-map-layout,.is-near-me-mode .grid-view-container,.is-near-me-mode .property-filters{display:none}.near-me-overlay{padding:4rem 1rem;display:flex;align-items:center;justify-content:center;min-height:400px}.near-me-prompt{text-align:center;max-width:400px}.near-me-icon{display:flex;justify-content:center;margin-bottom:1.5rem;color:var(--color-accent)}.near-me-icon svg{animation:pulse-location 2s ease-in-out infinite}@keyframes pulse-location{0%,to{opacity:1;transform:scale(1)}50%{opacity:.7;transform:scale(1.05)}}.near-me-title{font-size:1.5rem;margin-bottom:.75rem;color:var(--color-text)}.near-me-message{color:var(--color-text-muted);margin-bottom:2rem;line-height:1.6}.near-me-overlay.has-error .near-me-icon{color:var(--color-text-muted)}.near-me-overlay.has-error .near-me-icon svg{animation:none}.user-location-marker{position:relative}.user-location-dot{position:absolute;top:50%;left:50%;width:12px;height:12px;background:var(--color-accent);border:2px solid white;border-radius:50%;transform:translate(-50%,-50%);box-shadow:0 2px 4px #0000004d}.user-location-pulse{position:absolute;top:50%;left:50%;width:24px;height:24px;background:rgba(var(--color-accent-rgb, 181, 101, 29),.3);border-radius:50%;transform:translate(-50%,-50%);animation:user-location-pulse 2s ease-out infinite}@keyframes user-location-pulse{0%{transform:translate(-50%,-50%) scale(.5);opacity:1}to{transform:translate(-50%,-50%) scale(2);opacity:0}}.property-gallery{margin-bottom:2rem}.gallery-main{position:relative;margin-bottom:.75rem}.gallery-main-image{display:block;width:100%;padding:0;border:none;background:none;cursor:pointer;border-radius:.5rem;overflow:hidden}.gallery-main-image img{width:100%;height:auto;aspect-ratio:16/10;-o-object-fit:cover;object-fit:cover;display:block}.gallery-count{position:absolute;bottom:1rem;right:1rem;display:flex;align-items:center;gap:.5rem;padding:.5rem 1rem;background-color:#000000bf;border-radius:.25rem;color:#fff;font-size:.875rem;font-weight:500}.gallery-playback-btn{position:absolute;bottom:1rem;left:1rem;display:flex;align-items:center;justify-content:center;width:40px;height:40px;padding:0;background-color:#000000bf;border:none;border-radius:.25rem;color:#fff;cursor:pointer;z-index:2}.gallery-playback-btn .icon-play{display:none}.gallery-playback-btn .icon-pause{display:block}.gallery-playback-btn:not(.is-playing) .icon-play{display:block}.gallery-playback-btn:not(.is-playing) .icon-pause{display:none}.gallery-playback-btn:hover{background-color:#000000e6}.gallery-thumbnails-container{display:flex;align-items:center;gap:.5rem}@media (max-width: 1023px){.gallery-thumbnails-container{max-width:88vw;margin:auto}}.gallery-thumbnails-viewport{flex:1;overflow:hidden}.gallery-thumbnails{display:flex;gap:.5rem}.gallery-thumbnail{position:relative;flex-shrink:0;width:calc((100% - 2rem)/5);padding:0;border:2px solid transparent;background:var(--color-bg-card);cursor:pointer;border-radius:.25rem;overflow:hidden}@media (max-width: 640px){.gallery-thumbnail{width:calc((100% - 1.5rem)/4)}}.gallery-thumbnail.is-active{border-color:var(--color-accent)}.gallery-thumbnail img{width:100%;aspect-ratio:1;-o-object-fit:cover;object-fit:cover;display:block;opacity:1;transition:opacity .2s ease}.gallery-thumbnail.is-loading img{opacity:0}.gallery-thumbnail.is-loading .thumbnail-spinner{display:flex}.thumbnail-spinner{position:absolute;top:0;right:0;bottom:0;left:0;display:none;align-items:center;justify-content:center;background:var(--color-bg-card)}.thumbnail-spinner .spinner{width:20px;height:20px;border:2px solid var(--color-border);border-top-color:var(--color-accent);border-radius:50%;animation:thumbnail-spin .8s linear infinite}@keyframes thumbnail-spin{to{transform:rotate(360deg)}}.gallery-thumbnails-nav{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;background-color:var(--color-bg-card);border:1px solid var(--color-border);border-radius:.25rem;color:var(--color-text);cursor:pointer}.gallery-thumbnails-nav:hover:not(:disabled){background-color:var(--color-accent);border-color:var(--color-accent);color:#fff}.gallery-thumbnails-nav:disabled{opacity:.3;cursor:not-allowed}.gallery-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;height:400px;background-color:var(--color-bg-card);border-radius:.5rem;color:var(--color-text-muted)}.gallery-placeholder svg{margin-bottom:1rem}.gallery-placeholder p{margin:0}.gallery-lightbox{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1000;display:none}.gallery-lightbox[aria-hidden=false]{display:block}.lightbox-overlay{position:absolute;top:0;right:0;bottom:0;left:0;background-color:#000000f2}.lightbox-container{position:relative;display:flex;align-items:center;justify-content:center;height:100%;padding:4rem 1rem}.lightbox-close{position:absolute;top:1rem;right:1rem;z-index:10;padding:.5rem;background:none;border:none;color:#fff;cursor:pointer;opacity:.8}.lightbox-close:hover{opacity:1}.lightbox-nav{position:absolute;top:50%;transform:translateY(-50%);z-index:10;padding:1rem;background-color:#ffffff1a;border:none;border-radius:50%;color:#fff;cursor:pointer;opacity:.8}.lightbox-nav:hover{opacity:1;background-color:#fff3}.lightbox-nav.lightbox-prev{left:1rem}.lightbox-nav.lightbox-next{right:1rem}.lightbox-image-container{max-width:90vw;max-height:calc(100vh - 8rem);display:flex;align-items:center;justify-content:center}.lightbox-image{max-width:100%;max-height:calc(100vh - 8rem);-o-object-fit:contain;object-fit:contain}.lightbox-counter{position:absolute;bottom:1rem;left:50%;transform:translate(-50%);padding:.5rem 1rem;background-color:#000000bf;border-radius:.25rem;color:#fff;font-size:.875rem}.breadcrumbs{background-color:var(--color-bg-card);padding:1rem 0;border-bottom:1px solid var(--color-border)}.breadcrumb-list{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;list-style:none;margin:0;padding:0;font-size:.875rem}.breadcrumb-list li{display:flex;align-items:center}.breadcrumb-list li:not(:last-child):after{content:"/";margin-left:.5rem;color:var(--color-text-muted)}.breadcrumb-list li a{color:var(--color-text-muted);text-decoration:none}.breadcrumb-list li a:hover{color:var(--color-accent-light)}.breadcrumb-list li:last-child{color:var(--color-text)}.single-property-main{padding-bottom:4rem}.property-address-header{padding-top:2rem;padding-bottom:1.5rem}.property-address-title{font-size:2rem;margin-bottom:0;color:var(--color-text)}@media (max-width: 768px){.property-address-title{font-size:1.5rem}}.single-property-layout{display:grid;grid-template-columns:1fr;gap:2rem}@media (min-width: 1024px){.single-property-layout{grid-template-columns:1fr 350px;gap:3rem}}.section-title{font-size:1.25rem;margin-bottom:1.25rem;padding-bottom:.75rem;border-bottom:1px solid var(--color-border)}.property-specs-section{margin-bottom:2rem}@media (max-width: 1023px){.property-specs-section{background-color:var(--color-bg-card);padding:1.5rem;border-radius:.5rem}}.property-specs-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:.75rem 1.5rem;list-style:none;margin:0;padding:0}@media (min-width: 1024px){.property-specs-grid{grid-template-columns:repeat(3,1fr);gap:1rem}}.property-specs-grid .spec-item{display:flex;flex-direction:row;justify-content:space-between;align-items:center;gap:.5rem;padding:.5rem 0;border-bottom:1px solid var(--color-border)}@media (min-width: 1024px){.property-specs-grid .spec-item{flex-direction:column;align-items:flex-start;justify-content:flex-start;gap:.25rem;padding:1rem;background-color:var(--color-bg-card);border-radius:.25rem;border-bottom:none}}.spec-label{font-size:.875rem;color:var(--color-text-muted)}@media (min-width: 1024px){.spec-label{font-size:.75rem;text-transform:uppercase;letter-spacing:.05em}}.spec-value{font-size:1rem;font-weight:600;color:var(--color-text)}@media (min-width: 1024px){.spec-value{font-size:1.25rem}}.property-documents{margin-bottom:2rem}.documents-list{display:flex;flex-wrap:wrap;justify-content:center;gap:1rem;list-style:none;margin:0;padding:0}.document-item{margin:0}.document-link{display:inline-flex;align-items:center;gap:.5rem}.document-link svg{flex-shrink:0}.document-ext{font-size:.75rem;opacity:.7;text-transform:uppercase}.property-description{margin-bottom:2rem}.property-short-desc{font-size:1.125rem;color:var(--color-text);margin-bottom:1rem}.property-full-desc{color:var(--color-text-muted);line-height:1.7}.property-features{margin-bottom:2rem}.features-list{display:grid;grid-template-columns:repeat(2,1fr);gap:.75rem;list-style:none;margin:0;padding:0}@media (min-width: 640px){.features-list{grid-template-columns:repeat(3,1fr)}}.feature-item{display:flex;align-items:center;gap:.5rem;font-size:.9375rem;color:var(--color-text-muted)}.feature-item svg{flex-shrink:0;color:var(--color-success)}.single-property-sidebar{display:flex;flex-direction:column;gap:1.5rem}@media (min-width: 1024px){.single-property-sidebar{align-self:start}}.sidebar-widget{background-color:var(--color-bg-card);border-radius:.5rem;padding:1.5rem}.widget-title{font-family:Times New Roman,Times,serif;font-size:18px;font-weight:700;margin-bottom:1rem;padding-bottom:.75rem;border-bottom:1px solid var(--color-border)}.property-header-widget .property-header-top{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;margin-bottom:.75rem}.property-header-widget .property-title{font-family:var(--font-display);font-size:1.75rem;color:var(--color-text);margin-bottom:.5rem;line-height:1.2}.property-header-widget .property-mls{font-size:.8125rem;color:var(--color-sold);margin-bottom:0}.badge-type-residential{background-color:#93c5fd;color:#1e3a5f}.badge-type-commercial{background-color:var(--color-accent);color:#fff}.badge-type-land{background-color:#86efac;color:#14532d}.badge-type-multi-family{background-color:#c4b5fd;color:#3b1d66}.property-documents-widget .sidebar-documents-list{display:flex;flex-direction:column;gap:.75rem}.property-documents-widget .document-btn{display:flex;align-items:center;gap:.625rem;width:100%;padding:.75rem 1rem;background-color:var(--color-accent);border:none;border-radius:.25rem;color:#fff;text-decoration:none;font-weight:600;font-size:.875rem;cursor:pointer}.property-documents-widget .document-btn:hover{background-color:var(--color-accent-hover);color:#fff}.property-documents-widget .document-btn svg{flex-shrink:0;stroke:#fff}.property-documents-widget .document-btn-label{flex:1;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.property-documents-widget .document-btn-ext{flex-shrink:0;font-size:.625rem;font-weight:700;text-transform:uppercase;background-color:#0003;color:#fff;padding:.1875rem .375rem;border-radius:.1875rem;letter-spacing:.03em}.agent-card{padding:1.5rem}.agent-info-link{display:block;text-decoration:none;color:inherit;border-radius:.375rem;margin:-.5rem -.5rem 1rem;padding:.5rem}.agent-info-link:hover{background-color:var(--color-bg-dark)}.agent-info-link:hover .agent-name{color:var(--color-accent-light)}.agent-info-link .agent-info{margin-bottom:0}.agent-card-header{margin-bottom:1.25rem;padding-bottom:1rem;border-bottom:1px solid var(--color-border)}.agent-card-title{font-size:1.125rem;margin-bottom:0}.agent-info{display:flex;align-items:center;gap:1rem;margin-bottom:1.5rem}.agent-avatar{flex-shrink:0;background-color:#000;border-radius:50%}.agent-avatar img{width:64px;height:64px;border-radius:50%;-o-object-fit:cover;object-fit:cover}.agent-avatar-placeholder{width:64px;height:64px;display:flex;align-items:center;justify-content:center;background-color:#000;border-radius:50%;color:var(--color-text-muted)}.agent-name{font-weight:600;color:var(--color-text);margin-bottom:.25rem}.agent-role{font-size:.8125rem;color:var(--color-text-muted);margin-bottom:0}.agent-contact{display:flex;flex-direction:column;gap:.75rem}.agent-contact .btn,.agent-contact .comment-form .form-submit input[type=submit],.comment-form .form-submit .agent-contact input[type=submit]{display:flex;align-items:center;justify-content:center;gap:.5rem;width:100%}.agent-card-footer{margin-top:1.5rem;padding-top:1rem;border-top:1px solid var(--color-border)}.agent-card-note{font-size:.8125rem;color:var(--color-text-muted);text-align:center;margin-bottom:0}.property-inquiry-card .inquiry-note{font-size:.9375rem;color:var(--color-text-muted);margin-bottom:1rem;line-height:1.5}.property-inquiry-card .btn-block{display:flex;width:100%;text-align:center;justify-content:center}.generic-contact-card .contact-note{font-size:.9375rem;color:var(--color-text-muted);margin-bottom:1.25rem;line-height:1.5}.generic-contact-card .generic-contact-actions{display:flex;flex-direction:column;gap:.75rem}.generic-contact-card .btn-block{display:flex;width:100%;text-align:center;justify-content:center}body.lightbox-open{overflow:hidden}.Single_Property_MLS .property-breadcrumb{padding:1rem 0;font-size:.875rem;color:var(--color-text-muted)}.Single_Property_MLS .property-breadcrumb a{color:var(--color-text-muted);text-decoration:none}.Single_Property_MLS .property-breadcrumb a:hover{color:var(--color-accent-light)}.Single_Property_MLS .property-breadcrumb .separator{margin:0 .5rem}.Single_Property_MLS .property-breadcrumb .current{color:var(--color-text)}.Single_Property_MLS .property-gallery-section{margin-bottom:2rem}.Single_Property_MLS .property-gallery-main{border-radius:.5rem;overflow:hidden;background-color:var(--color-bg-card);margin-bottom:1rem}.Single_Property_MLS .property-gallery-main .gallery-main-image{width:100%;height:auto;max-height:500px;-o-object-fit:cover;object-fit:cover;display:block}.Single_Property_MLS .property-gallery-main .gallery-placeholder{display:flex;align-items:center;justify-content:center;height:300px;color:var(--color-text-muted)}.Single_Property_MLS .property-gallery-thumbs{display:flex;gap:.5rem;overflow-x:auto;padding-bottom:.5rem}.Single_Property_MLS .gallery-thumb{flex-shrink:0;width:80px;height:60px;border-radius:.25rem;overflow:hidden;border:2px solid transparent;cursor:pointer;padding:0;background:none}.Single_Property_MLS .gallery-thumb.is-active{border-color:var(--color-accent)}.Single_Property_MLS .gallery-thumb:hover{border-color:var(--color-accent-light)}.Single_Property_MLS .gallery-thumb img{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.Single_Property_MLS .gallery-thumb.gallery-more{display:flex;align-items:center;justify-content:center;background-color:var(--color-bg-card);color:var(--color-text);font-weight:600;font-size:.875rem}.Single_Property_MLS .property-location-section{margin-bottom:2rem}.Single_Property_MLS .property-address-link{margin-bottom:.75rem}.Single_Property_MLS .property-address-link a{color:#ef4444;text-decoration:none;font-weight:700}.Single_Property_MLS .property-address-link a:hover{text-decoration:underline}.Single_Property_MLS .property-directions-text{color:var(--color-text-muted);line-height:1.6;margin-bottom:1rem}.Single_Property_MLS .property-location-map{border-radius:.5rem;overflow:hidden}.Single_Property_MLS .property-location-map iframe{display:block}.Single_Property_MLS .property-agent-widget .agent-name{font-weight:600;margin-bottom:.25rem}.Single_Property_MLS .property-agent-widget .office-name{font-size:.875rem;color:var(--color-text-muted);margin-bottom:1rem}.Single_Property_MLS .property-share-widget .share-buttons{display:flex;gap:.75rem}.Single_Property_MLS .property-share-widget .share-btn{display:flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:.375rem;background-color:var(--color-bg-dark);color:var(--color-text-muted);border:none;cursor:pointer;text-decoration:none;transition:background-color .2s,color .2s}.Single_Property_MLS .property-share-widget .share-btn:hover{background-color:var(--color-accent);color:#fff}.Single_Property_MLS .property-share-widget .share-btn.copied{background-color:var(--color-success);color:#fff}.Single_Property_MLS .badge-type{background-color:var(--color-bg-dark);color:var(--color-text)}.Single_Agent{padding-bottom:4rem}.Single_Agent .agent-header{background-color:var(--color-bg-card);padding:3rem 0;border-bottom:1px solid var(--color-border)}.Single_Agent .agent-header-layout{display:flex;flex-direction:column;align-items:center;gap:2rem;text-align:center}@media (min-width: 768px){.Single_Agent .agent-header-layout{flex-direction:row;text-align:left;align-items:flex-start}}.Single_Agent .agent-photo-wrapper{flex-shrink:0;background-color:#000}.Single_Agent .agent-photo{width:200px;height:200px;border-radius:.5rem;-o-object-fit:cover;object-fit:cover;border:3px solid var(--color-border)}@media (min-width: 768px){.Single_Agent .agent-photo{width:240px;height:240px}}.Single_Agent .agent-photo-placeholder{width:200px;height:200px;display:flex;align-items:center;justify-content:center;background-color:var(--color-bg-dark);border-radius:.5rem;border:3px solid var(--color-border);color:var(--color-text-muted)}@media (min-width: 768px){.Single_Agent .agent-photo-placeholder{width:240px;height:240px}}.Single_Agent .agent-info-wrapper{flex:1}.Single_Agent .agent-info-content{display:flex;flex-direction:column;align-items:center}@media (min-width: 768px){.Single_Agent .agent-info-content{align-items:flex-start}}.Single_Agent .agent-title-label{font-size:.75rem;text-transform:uppercase;letter-spacing:.1em;color:var(--color-accent);margin-bottom:.5rem;font-weight:600}.Single_Agent .agent-name{font-size:2.5rem;font-family:var(--font-heading);margin-bottom:.5rem;line-height:1.1}@media (min-width: 768px){.Single_Agent .agent-name{font-size:3rem}}.Single_Agent .agent-license{font-size:.875rem;color:var(--color-text-muted);margin-bottom:1.5rem}.Single_Agent .agent-credentials{font-size:.875rem;color:var(--color-text-muted);line-height:1.6;margin-bottom:1.5rem;margin-top:0}.Single_Agent .agent-contact-actions{display:flex;flex-wrap:wrap;gap:.75rem;margin-bottom:1.5rem;justify-content:center}@media (min-width: 768px){.Single_Agent .agent-contact-actions{justify-content:flex-start}}.Single_Agent .agent-contact-actions .btn,.Single_Agent .agent-contact-actions .comment-form .form-submit input[type=submit],.comment-form .form-submit .Single_Agent .agent-contact-actions input[type=submit]{display:inline-flex;align-items:center;gap:.5rem}.Single_Agent .agent-social-links{display:flex;gap:.75rem}.Single_Agent .social-link{display:flex;align-items:center;justify-content:center;width:40px;height:40px;background-color:var(--color-bg-dark);border-radius:.25rem;color:var(--color-text-muted);text-decoration:none}.Single_Agent .social-link:hover{background-color:var(--color-accent);color:#fff}.Single_Agent .social-link svg{width:20px;height:20px}.Single_Agent .agent-content-layout{display:grid;grid-template-columns:1fr;gap:2rem;padding-top:2rem}@media (min-width: 1024px){.Single_Agent .agent-content-layout{grid-template-columns:1fr 350px;gap:3rem}}.Single_Agent .agent-main-content{min-width:0}.Single_Agent .agent-section{margin-bottom:2.5rem}.Single_Agent .agent-section:last-child{margin-bottom:0}.Single_Agent .section-title{font-size:1.25rem;margin-bottom:1.25rem;padding-bottom:.75rem;border-bottom:1px solid var(--color-border)}.Single_Agent .agent-contact-details{background-color:var(--color-bg-card);border-radius:.5rem;padding:1.5rem}.Single_Agent .agent-contact-details .contact-details-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:1rem}@media (max-width: 1400px){.Single_Agent .agent-contact-details .contact-details-grid{grid-template-columns:repeat(2,1fr)}}@media (max-width: 800px){.Single_Agent .agent-contact-details .contact-details-grid{grid-template-columns:1fr}}.Single_Agent .agent-contact-details .contact-detail-item{display:flex;align-items:center;gap:1rem;padding:1rem;background-color:var(--color-bg-dark);border:1px solid var(--color-border);border-radius:.375rem;text-decoration:none;color:inherit}.Single_Agent .agent-contact-details .contact-detail-item:hover{border-color:var(--color-accent);background-color:#9f37301a}.Single_Agent .agent-contact-details .contact-detail-item svg{flex-shrink:0;color:var(--color-accent)}.Single_Agent .agent-contact-details .contact-detail-content{display:flex;flex-direction:column;min-width:0}.Single_Agent .agent-contact-details .contact-detail-label{font-size:.75rem;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-muted);margin-bottom:.125rem}.Single_Agent .agent-contact-details .contact-detail-value{font-size:1rem;color:var(--color-text);word-break:break-word}.Single_Agent .agent-bio .agent-short-bio{font-size:1.125rem;color:var(--color-text);line-height:1.6;margin-bottom:1.5rem}.Single_Agent .agent-bio .agent-full-bio{color:var(--color-text-muted);line-height:1.7}.Single_Agent .agent-bio .agent-full-bio p{margin-bottom:1rem}.Single_Agent .agent-bio .agent-full-bio p:last-child{margin-bottom:0}.Single_Agent .agent-gallery-section .agent-gallery-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:1rem}@media (min-width: 640px){.Single_Agent .agent-gallery-section .agent-gallery-grid{grid-template-columns:repeat(3,1fr)}}.Single_Agent .agent-gallery-section .gallery-item{display:block;aspect-ratio:4/3;overflow:hidden;border-radius:.375rem;border:1px solid var(--color-border)}.Single_Agent .agent-gallery-section .gallery-item:hover img{transform:scale(1.05)}.Single_Agent .agent-gallery-section .gallery-item img{width:100%;height:100%;-o-object-fit:cover;object-fit:cover;transition:transform .3s ease}.Single_Agent .agent-listings .agent-listings-grid{display:grid;grid-template-columns:1fr;gap:1.5rem;margin-bottom:1.5rem}@media (min-width: 640px){.Single_Agent .agent-listings .agent-listings-grid{grid-template-columns:repeat(2,1fr)}}@media (min-width: 1200px){.Single_Agent .agent-listings .agent-listings-grid{grid-template-columns:repeat(3,1fr)}}.Single_Agent .agent-listings .agent-listings-cta{text-align:center}.Single_Agent .agent-sidebar{display:flex;flex-direction:column;gap:1.5rem}@media (min-width: 1024px){.Single_Agent .agent-sidebar{align-self:start}}.Single_Agent .sidebar-widget{background-color:var(--color-bg-card);border-radius:.5rem;padding:1.5rem}.Single_Agent .widget-title{font-size:1rem;font-weight:600;margin-bottom:1rem;padding-bottom:.75rem;border-bottom:1px solid var(--color-border)}.Single_Agent .agent-contact-card .contact-list{list-style:none;margin:0;padding:0}.Single_Agent .agent-contact-card .contact-item{display:flex;align-items:flex-start;gap:.75rem;padding:.75rem 0;border-bottom:1px solid var(--color-border)}.Single_Agent .agent-contact-card .contact-item:first-child{padding-top:0}.Single_Agent .agent-contact-card .contact-item:last-child{padding-bottom:0;border-bottom:none}.Single_Agent .agent-contact-card .contact-item svg{flex-shrink:0;margin-top:.125rem;color:var(--color-accent)}.Single_Agent .agent-contact-card .contact-item>div{flex:1;min-width:0}.Single_Agent .agent-contact-card .contact-label{display:block;font-size:.75rem;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-muted);margin-bottom:.25rem}.Single_Agent .agent-contact-card a{color:var(--color-text);text-decoration:none;word-break:break-word}.Single_Agent .agent-contact-card a:hover{color:var(--color-accent-light)}.Single_Agent .agent-quick-contact .widget-note{font-size:.9375rem;color:var(--color-text-muted);margin-bottom:1rem;line-height:1.5}.Single_Agent .agent-quick-contact .btn-block{display:block;width:100%;text-align:center}.Single_Agent .agent-gallery{margin-bottom:2rem}.Single_Agent .agent-gallery-thumbs-slider .slick-track{display:flex;gap:.5rem}.Single_Agent .agent-gallery-thumbs-slider .slick-slide{outline:none;margin-right:.5rem}.Single_Agent .agent-gallery-thumbs-slider .slick-prev,.Single_Agent .agent-gallery-thumbs-slider .slick-next{position:absolute;top:50%;transform:translateY(-50%);z-index:10;display:flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;background-color:var(--color-bg-card);border:1px solid var(--color-border);border-radius:50%;color:var(--color-text);cursor:pointer}.Single_Agent .agent-gallery-thumbs-slider .slick-prev:hover,.Single_Agent .agent-gallery-thumbs-slider .slick-next:hover{background-color:var(--color-accent);border-color:var(--color-accent);color:#fff}.Single_Agent .agent-gallery-thumbs-slider .slick-prev.slick-disabled,.Single_Agent .agent-gallery-thumbs-slider .slick-next.slick-disabled{opacity:.3;cursor:not-allowed}.Single_Agent .agent-gallery-thumbs-slider .slick-prev{left:-16px}.Single_Agent .agent-gallery-thumbs-slider .slick-next{right:-16px}.Single_Agent .agent-gallery-thumb{width:100px;height:100px;padding:0;border:2px solid transparent;background:var(--color-bg-card);cursor:pointer;border-radius:.375rem;overflow:hidden;transition:border-color .2s ease,transform .2s ease}@media (min-width: 1000px){.Single_Agent .agent-gallery-thumb{width:150px;height:150px}}.Single_Agent .agent-gallery-thumb:hover{border-color:var(--color-accent);transform:scale(1.05)}.Single_Agent .agent-gallery-thumb img{width:100%;height:100%;-o-object-fit:cover;object-fit:cover;display:block}.Single_Agent .agent-gallery-lightbox{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1000;display:none}.Single_Agent .agent-gallery-lightbox[aria-hidden=false]{display:block}.Single_Agent .agent-gallery-lightbox .lightbox-overlay{position:absolute;top:0;right:0;bottom:0;left:0;background-color:#000000f2}.Single_Agent .agent-gallery-lightbox .lightbox-container{position:relative;display:flex;align-items:center;justify-content:center;height:100%;padding:4rem 1rem}.Single_Agent .agent-gallery-lightbox .lightbox-close{position:absolute;top:1rem;right:1rem;z-index:10;padding:.5rem;background:none;border:none;color:#fff;cursor:pointer;opacity:.8}.Single_Agent .agent-gallery-lightbox .lightbox-close:hover{opacity:1}.Single_Agent .agent-gallery-lightbox .lightbox-nav{position:absolute;top:50%;transform:translateY(-50%);z-index:10;padding:1rem;background-color:#ffffff1a;border:none;border-radius:50%;color:#fff;cursor:pointer;opacity:.8}.Single_Agent .agent-gallery-lightbox .lightbox-nav:hover{opacity:1;background-color:#fff3}.Single_Agent .agent-gallery-lightbox .lightbox-nav.lightbox-prev{left:1rem}.Single_Agent .agent-gallery-lightbox .lightbox-nav.lightbox-next{right:1rem}.Single_Agent .agent-gallery-lightbox .lightbox-image-container{max-width:90vw;max-height:calc(100vh - 8rem);display:flex;align-items:center;justify-content:center}.Single_Agent .agent-gallery-lightbox .lightbox-image{max-width:100%;max-height:calc(100vh - 8rem);-o-object-fit:contain;object-fit:contain}.Single_Agent .agent-gallery-lightbox .lightbox-counter{position:absolute;bottom:1rem;left:50%;transform:translate(-50%);padding:.5rem 1rem;background-color:#000000bf;border-radius:.25rem;color:#fff;font-size:.875rem}.Agents_Archive .agents-section{padding:1.125rem 0 5.875rem}.Agents_Archive .agents-grid{display:grid;grid-template-columns:1fr;gap:2rem}@media (min-width: 640px){.Agents_Archive .agents-grid{grid-template-columns:repeat(2,1fr)}}@media (min-width: 1024px){.Agents_Archive .agents-grid{grid-template-columns:repeat(3,1fr)}}@media (min-width: 1280px){.Agents_Archive .agents-grid{grid-template-columns:repeat(4,1fr)}}.Agents_Archive .agent-card-item{background-color:var(--color-bg-card);border-radius:.5rem;overflow:hidden;display:flex;flex-direction:column;transition:transform .2s ease,box-shadow .2s ease}.Agents_Archive .agent-card-item:hover{transform:translateY(-4px);box-shadow:0 12px 24px #0006}.Agents_Archive .agent-card-item:hover:not(:has(.agent-action-btn:not(.agent-action-profile):hover)) .agent-action-profile{background-color:var(--color-accent);color:#fff}.Agents_Archive .agent-card-link{display:block;text-decoration:none;color:inherit;flex:1}.Agents_Archive .agent-card-link:hover .agent-card-image img{transform:scale(1.05)}.Agents_Archive .agent-card-link:hover .agent-card-name{color:var(--color-accent-light)}.Agents_Archive .agent-card-image{aspect-ratio:1/1;overflow:hidden;background-color:var(--color-bg-dark)}.Agents_Archive .agent-card-image img{width:100%;height:100%;-o-object-fit:cover;object-fit:cover;transition:transform .3s ease}.Agents_Archive .agent-card-placeholder{width:100%;height:100%;display:flex;align-items:center;justify-content:center;color:var(--color-text-muted)}.Agents_Archive .agent-card-content{padding:1.25rem}.Agents_Archive .agent-card-title-label{font-size:.75rem;text-transform:uppercase;letter-spacing:.1em;color:var(--color-accent);margin-bottom:.375rem;font-weight:600}.Agents_Archive .agent-card-name{font-size:1.25rem;font-family:var(--font-display);margin-bottom:.5rem;line-height:1.2}.Agents_Archive .agent-card-bio{font-size:.875rem;color:var(--color-text-muted);line-height:1.5;margin-bottom:0;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.Agents_Archive .agent-card-actions{display:flex;align-items:center;gap:.5rem;padding:0 1.25rem 1.25rem;margin-top:auto}.Agents_Archive .agent-action-btn{display:flex;align-items:center;justify-content:center;gap:.375rem;height:40px;padding:0 .75rem;background-color:transparent;border:2px solid var(--color-accent);border-radius:.25rem;color:var(--color-accent);text-decoration:none;font-size:.8125rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em}.Agents_Archive .agent-action-btn:hover{background-color:var(--color-accent);color:#fff}.Agents_Archive .agent-action-btn:not(.agent-action-profile){width:40px;padding:0}.Agents_Archive .agent-action-btn.agent-action-profile{flex:1}.Agents_Archive .no-agents-message{text-align:center;padding:3rem;color:var(--color-text-muted)}.Agents_Archive .no-agents-message p{margin-bottom:0}.hero-section--split{display:flex;min-height:70vh;max-height:725px;width:100%}@media (max-width: 768px){.hero-section--split{flex-direction:column;max-height:none}}.hero-section--split.hero-section--small{min-height:300px;max-height:400px}@media (max-width: 768px){.hero-section--split.hero-section--small{max-height:none}}.hero-section--split.hero-section--small .hero-section-title{font-size:2.5rem}@media (max-width: 768px){.hero-section--split.hero-section--small .hero-section-title{font-size:2rem}}.hero-section--split.hero-section--small .hero-section-logo{max-width:280px;margin-bottom:1.5rem}.hero-split-content{width:40%;max-width:800px;background-color:var(--color-bg-dark);display:flex;flex-direction:column;align-items:center;justify-content:center;padding:3rem}@media (max-width: 1024px){.hero-split-content{width:45%;max-width:none;padding:2rem}}@media (max-width: 768px){.hero-split-content{width:100%;padding:3rem 1.5rem;order:2}}.hero-split-image{flex:1;background-size:cover;background-position:center center;background-repeat:no-repeat;position:relative;overflow:hidden}@media (max-width: 768px){.hero-split-image{width:100%;flex:none;height:300px;order:1}}.hero-split-inner{max-width:420px;text-align:center}@media (max-width: 768px){.hero-split-inner{margin:0 auto}}.hero-section-logo{display:block;max-width:320px;height:auto;margin:0 auto 2rem}@media (max-width: 768px){.hero-section-logo{max-width:280px;margin-bottom:1.5rem}}.hero-section-title{font-family:var(--font-display);font-size:3rem;color:var(--color-text);margin-bottom:1.25rem;line-height:1.1}@media (max-width: 1024px){.hero-section-title{font-size:2.5rem}}@media (max-width: 768px){.hero-section-title{font-size:2.25rem;margin-bottom:1rem}}.hero-section-subtitle{font-size:1.125rem;color:var(--color-text-muted);margin-bottom:2rem;line-height:1.6}@media (max-width: 768px){.hero-section-subtitle{font-size:1rem;margin-bottom:1.5rem}}.hero-section-actions{display:flex;flex-wrap:wrap;gap:1rem;justify-content:center}.hero-location-search{margin-bottom:2rem}.hero-location-search-inner{display:flex;gap:0;background-color:var(--color-bg-card);border-radius:.5rem;overflow:visible;box-shadow:0 4px 20px #0000004d}@media (max-width: 480px){.hero-location-search-inner{flex-wrap:wrap}}.hero-location-input-wrap{flex:1;position:relative;min-width:180px}@media (max-width: 480px){.hero-location-input-wrap{flex:1 1 100%}}.hero-location-input{width:100%;padding:.875rem 1rem;font-size:1rem;font-family:var(--font-body);color:var(--color-text);background-color:var(--color-bg-card);border:none;outline:none}.hero-location-input::-moz-placeholder{color:var(--color-text-muted)}.hero-location-input::placeholder{color:var(--color-text-muted)}.hero-location-input:focus{box-shadow:inset 0 0 0 2px var(--color-accent)}@media (max-width: 480px){.hero-location-input{text-align:center;border-radius:.5rem .5rem 0 0}}.hero-location-input.has-error{animation:shake .3s ease-in-out;box-shadow:inset 0 0 0 2px var(--color-accent)}@keyframes shake{0%,to{transform:translate(0)}25%{transform:translate(-4px)}75%{transform:translate(4px)}}.hero-location-ghost{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;overflow:hidden;white-space:nowrap;display:none;align-items:center;box-sizing:border-box;padding:.875rem 1rem;font-size:1rem;font-family:var(--font-body);line-height:1.5}.hero-location-ghost .ghost-typed{opacity:0}.hero-location-ghost .ghost-completion{color:var(--color-text-muted);opacity:.6}.hero-location-dropdown{display:none;position:absolute;top:100%;left:0;right:0;background-color:var(--color-bg-card);border-radius:0 0 .5rem .5rem;box-shadow:0 8px 24px #0006;z-index:100;max-height:280px;overflow-y:auto}.hero-location-item{display:flex;align-items:center;gap:.75rem;padding:.75rem 1rem;cursor:pointer;color:var(--color-text)}.hero-location-item:hover,.hero-location-item.is-focused{background-color:var(--color-bg-dark)}.hero-location-item strong{color:var(--color-accent-light)}.hero-location-item-icon{flex-shrink:0;color:var(--color-text-muted);display:flex;align-items:center}.hero-location-item-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.hero-location-no-results{padding:1rem;color:var(--color-text-muted);text-align:center;font-size:.875rem}.hero-geolocation-btn{display:flex;align-items:center;justify-content:center;padding:.875rem;background-color:var(--color-bg-dark);border:none;color:var(--color-text-muted);cursor:pointer;border-radius:0}.hero-geolocation-btn:hover{background-color:var(--color-accent);color:#fff}.hero-geolocation-btn.is-loading{opacity:.6;cursor:wait}.hero-geolocation-btn.is-loading svg{animation:spin 1s linear infinite}@media (max-width: 480px){.hero-geolocation-btn{flex:1}}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.hero-search-btn{display:flex;align-items:center;gap:.5rem;padding:.875rem 1.25rem;border-radius:0 .5rem .5rem 0;white-space:nowrap}.hero-search-btn svg{flex-shrink:0}@media (max-width: 480px){.hero-search-btn{flex:1;justify-content:center;border-radius:0 0 .5rem}}.hero-section--card{position:relative;display:flex;align-items:center;justify-content:flex-start;background-color:var(--color-bg-dark);background-size:cover;background-position:center;background-repeat:no-repeat;min-height:70vh;max-height:725px;padding:4rem 0}@media (max-width: 768px){.hero-section--card{min-height:auto;max-height:none;padding:3rem 0;justify-content:center}}.hero-section--card.hero-section--small{min-height:300px;max-height:400px;padding:2rem 0}.hero-section--card.hero-section--small .hero-section-title{font-size:2.25rem}@media (max-width: 768px){.hero-section--card.hero-section--small .hero-section-title{font-size:1.8rem}}.hero-section--card.hero-section--small .hero-card{padding:1.5rem}.hero-card{background-color:#0a0a0ad9;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border-radius:1rem;padding:2.375rem;width:520px;text-align:center;border:1px solid var(--color-border);position:absolute;top:50%;left:50vw;transform:translate(-50%,-50%)}@media (min-width: 1800px){.hero-card{left:calc(50vw - 410px)}}@media (min-width: 1650px) and (max-width: 1799px){.hero-card{left:32vw}}@media (min-width: 1500px) and (max-width: 1649px){.hero-card{left:410px}}@media (max-width: 768px){.hero-card{position:relative;top:auto;left:auto;transform:none;padding:1.125rem 2.375rem;margin:0 auto;border-radius:.75rem;width:calc(100% - 2rem);max-width:520px}}.hero-section--card .hero-section-logo{display:block;max-width:360px;height:auto;margin:0 auto 1.75rem}@media (max-width: 768px){.hero-section--card .hero-section-logo{max-width:280px;margin-bottom:1.25rem}}.hero-section--card .hero-section-title{font-family:var(--font-display);font-size:2.475rem;color:var(--color-text);margin-bottom:1.8125rem;line-height:1.1}@media (max-width: 1450px){.hero-section--card .hero-section-title{font-size:42px}}@media (max-width: 768px){.hero-section--card .hero-section-title{font-size:1.6rem;margin-bottom:.875rem}}@media (max-width: 600px){.hero-section--card .hero-section-title{font-size:1.5rem}}.hero-section--card .hero-section-subtitle{font-size:1rem;color:var(--color-text-muted);margin-bottom:1.75rem;line-height:1.6}@media (max-width: 768px){.hero-section--card .hero-section-subtitle{font-size:.9rem;margin-bottom:1.25rem}}@media (max-width: 650px){.hero-section--card .hero-section-subtitle{font-size:.775rem}}.hero-section--card .hero-section-actions{display:flex;flex-wrap:wrap;gap:.875rem;justify-content:center}.hero-section--card .hero-location-search{margin-bottom:1.75rem}.hero-section--card .hero-location-search-inner{display:flex;gap:0;background-color:var(--color-bg-card);border-radius:.5rem;overflow:visible}@media (max-width: 480px){.hero-section--card .hero-location-search-inner{flex-wrap:wrap}}.hero-section--card .hero-location-input-wrap{flex:1;position:relative}@media (max-width: 480px){.hero-section--card .hero-location-input-wrap{flex:1 1 100%}}.hero-section--card .hero-location-input{width:100%;padding:.75rem .875rem;font-size:.9rem;font-family:var(--font-body);color:var(--color-text);background-color:var(--color-bg-card);border:none;outline:none}.hero-section--card .hero-location-input::-moz-placeholder{color:var(--color-text-muted)}.hero-section--card .hero-location-input::placeholder{color:var(--color-text-muted)}.hero-section--card .hero-location-input:focus{box-shadow:inset 0 0 0 2px var(--color-accent)}@media (max-width: 480px){.hero-section--card .hero-location-input{text-align:center;border-radius:.5rem .5rem 0 0}}.hero-section--card .hero-location-input.has-error{animation:shake-card .3s ease-in-out;box-shadow:inset 0 0 0 2px var(--color-accent)}@keyframes shake-card{0%,to{transform:translate(0)}25%{transform:translate(-4px)}75%{transform:translate(4px)}}.hero-section--card .hero-location-ghost{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;overflow:hidden;white-space:nowrap;display:none;align-items:center;box-sizing:border-box;padding:.75rem .875rem;font-size:.9rem;font-family:var(--font-body);line-height:1.5}.hero-section--card .hero-location-ghost .ghost-typed{opacity:0}.hero-section--card .hero-location-ghost .ghost-completion{color:var(--color-text-muted);opacity:.6}.hero-section--card .hero-location-dropdown{font-size:.9rem}.hero-section--card .hero-geolocation-btn{padding:.75rem}@media (max-width: 480px){.hero-section--card .hero-geolocation-btn{flex:1}}.hero-section--card .hero-search-btn{display:flex;align-items:center;gap:.5rem;padding:.75rem 1rem;border-radius:0 .5rem .5rem 0;white-space:nowrap;font-size:.8rem}@media (max-width: 480px){.hero-section--card .hero-search-btn{flex:1;justify-content:center;border-radius:0 0 .5rem}}.cta-section{padding:4rem 0}@media (max-width: 768px){.cta-section{padding:3rem 0}}.cta-section--default{background-color:var(--color-bg-card)}.cta-section--accent{background-color:var(--color-accent)}.cta-section--accent .cta-section-title{color:#fff}.cta-section--accent .cta-section-text{color:#ffffffe6}.cta-section--accent .btn-primary,.cta-section--accent .comment-form .form-submit input[type=submit],.comment-form .form-submit .cta-section--accent input[type=submit]{background-color:#fff;color:var(--color-accent)}.cta-section--accent .btn-primary:hover,.cta-section--accent .comment-form .form-submit input[type=submit]:hover,.comment-form .form-submit .cta-section--accent input[type=submit]:hover,.cta-section--accent .btn-primary:active,.cta-section--accent .comment-form .form-submit input[type=submit]:active,.comment-form .form-submit .cta-section--accent input[type=submit]:active{background-color:var(--color-text);color:#000}.cta-section-content{text-align:center;max-width:700px;margin:0 auto}.cta-section-title{font-family:var(--font-display);font-size:2.25rem;color:var(--color-text);margin-bottom:1rem}@media (max-width: 768px){.cta-section-title{font-size:1.875rem}}.cta-section-text{font-size:1.125rem;color:var(--color-text-muted);margin-bottom:1.5rem}.testimonial{background-color:var(--color-bg-card);border-radius:.5rem;padding:2rem;margin:0}.testimonial-quote{position:relative;margin-bottom:1.5rem}.testimonial-quote p{font-size:1.125rem;color:var(--color-text);line-height:1.7;font-style:italic;margin:0;padding-left:3.5rem}@media (max-width: 640px){.testimonial-quote p{font-size:1rem;padding-left:0;padding-top:3rem}}.testimonial-quote-icon{position:absolute;top:0;left:0;color:var(--color-accent);opacity:.5}@media (max-width: 640px){.testimonial-quote-icon{top:0;left:0}}.testimonial-footer{display:flex;flex-direction:column;gap:.25rem;padding-left:3.5rem}@media (max-width: 640px){.testimonial-footer{padding-left:0}}.testimonial-name{font-style:normal;font-weight:600;color:var(--color-text);font-size:.9375rem}.testimonial-location{font-size:.8125rem;color:var(--color-text-muted)}.testimonials-section{padding:4rem 0;background-color:var(--color-bg-dark)}@media (max-width: 768px){.testimonials-section{padding:3rem 0}}.testimonials-section-header{text-align:center;margin-bottom:3rem}.testimonials-section-title{font-family:var(--font-display);font-size:2.25rem;color:var(--color-text);margin-bottom:.75rem}@media (max-width: 768px){.testimonials-section-title{font-size:1.875rem}}.testimonials-section-subtitle{font-size:1.125rem;color:var(--color-text-muted);max-width:600px;margin:0 auto}.testimonials-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:2rem}@media (max-width: 768px){.testimonials-grid{grid-template-columns:1fr}}.feature-block{text-align:center;padding:1.5rem}.feature-block-icon{display:flex;align-items:center;justify-content:center;width:80px;height:80px;margin:0 auto 1.25rem;border-radius:50%;background-color:var(--color-bg-card);color:var(--color-accent)}.feature-block-title{font-family:var(--font-display);font-size:1.25rem;color:var(--color-text);margin-bottom:.75rem}.feature-block-text{font-size:.9375rem;color:var(--color-text-muted);line-height:1.6;margin-bottom:0}.features-section{padding:4rem 0;background-color:var(--color-bg-dark)}@media (max-width: 768px){.features-section{padding:3rem 0}}.features-section-header{text-align:center;margin-bottom:3rem}.features-section-title{font-family:var(--font-display);font-size:2.25rem;color:var(--color-text);margin-bottom:.75rem}@media (max-width: 768px){.features-section-title{font-size:1.875rem}}.features-section-subtitle{font-size:1.125rem;color:var(--color-text-muted);max-width:600px;margin:0 auto}.features-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:2rem}@media (max-width: 768px){.features-grid{grid-template-columns:1fr;gap:1.5rem}}.service-cards-section{padding:5rem 0;background-color:var(--color-bg-card)}@media (max-width: 640px){.service-cards-section{padding:2.5rem 0}}.service-cards-header{text-align:center;margin-bottom:3rem}@media (max-width: 640px){.service-cards-header{margin-bottom:1.5rem}}.service-cards-title{font-family:var(--font-display);font-size:2.5rem;color:var(--color-text);margin-bottom:1rem}@media (max-width: 768px){.service-cards-title{font-size:2rem}}@media (max-width: 640px){.service-cards-title{font-size:1.5rem;margin-bottom:.5rem}}.service-cards-subtitle{font-size:1.125rem;color:var(--color-text-muted);max-width:600px;margin:0 auto}@media (max-width: 640px){.service-cards-subtitle{font-size:.875rem}}.service-cards-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:2rem}@media (max-width: 992px){.service-cards-grid{grid-template-columns:repeat(2,1fr)}}@media (max-width: 640px){.service-cards-grid{grid-template-columns:repeat(2,1fr);gap:.75rem}}.service-card{position:relative;background-color:var(--color-bg-dark);border:1px solid var(--color-border);border-radius:.5rem;padding:2rem;text-align:center;cursor:pointer}.service-card:hover{border-color:var(--color-accent)}.service-card:hover .service-card-btn{background-color:var(--color-accent);color:var(--color-text)}@media (max-width: 640px){.service-card{padding:1rem}}.service-card-link-overlay{position:absolute;top:0;left:0;right:0;bottom:0;z-index:1}.service-card-icon{display:flex;align-items:center;justify-content:center;width:80px;height:80px;margin:0 auto 1.5rem;background-color:#9f37301a;border-radius:50%;color:var(--color-accent)}@media (max-width: 640px){.service-card-icon{width:48px;height:48px;margin-bottom:.75rem}.service-card-icon svg{width:24px;height:24px}}.service-card-title{font-family:var(--font-display);font-size:1.5rem;color:var(--color-text);margin-bottom:1rem}@media (max-width: 640px){.service-card-title{font-size:1rem;margin-bottom:.5rem}}.service-card-description{font-size:1rem;color:var(--color-text-muted);margin-bottom:1.5rem;line-height:1.6}@media (max-width: 640px){.service-card-description{font-size:.75rem;margin-bottom:.75rem;line-height:1.4}}.service-card-btn{display:inline-flex;align-items:center;gap:.5rem}.service-card-btn svg{transition:transform .2s ease}.service-card-btn:hover svg{transform:translate(4px)}@media (max-width: 640px){.service-card-btn{font-size:.75rem;padding:.5rem .75rem}.service-card-btn svg{width:14px;height:14px}}.btn-outline{background-color:transparent;border:2px solid var(--color-accent);color:var(--color-accent)}.btn-outline:hover{background-color:var(--color-accent);color:var(--color-text)}.property-type-boxes{padding:4rem 0;background-color:var(--color-bg-card)}@media (max-width: 768px){.property-type-boxes{padding:3rem 0}}.type-boxes-grid{display:grid;grid-template-columns:repeat(5,1fr);gap:1.5rem}@media (max-width: 1200px){.type-boxes-grid{grid-template-columns:repeat(3,1fr)}}@media (max-width: 768px){.type-boxes-grid{grid-template-columns:repeat(2,1fr);gap:1rem}}@media (max-width: 480px){.type-boxes-grid{grid-template-columns:1fr}}.type-box{display:flex;flex-direction:column;align-items:center;text-align:center;padding:1.75rem 1.5rem;background-color:var(--color-bg-dark);border:1px solid var(--color-border);border-radius:.5rem;text-decoration:none;transition:all .2s ease}.type-box:hover{border-color:var(--color-accent);transform:translateY(-2px)}.type-box:hover .type-box-arrow{opacity:1;transform:translate(0)}@media (max-width: 768px){.type-box{padding:1.25rem 1rem}}.type-box-icon{display:flex;justify-content:center;color:var(--color-accent);margin-bottom:1.25rem;transition:color .2s ease}.type-box-icon svg{display:block}@media (max-width: 768px){.type-box-icon{margin-bottom:1rem}.type-box-icon svg{width:28px;height:28px}}.type-box-content{flex:1;display:flex;flex-direction:column;align-items:center}.type-box-title{font-family:var(--font-display);font-size:1.375rem;font-weight:400;color:var(--color-text);margin-bottom:.625rem}@media (max-width: 768px){.type-box-title{font-size:1.125rem;margin-bottom:.5rem}}.type-box-description{font-size:.8125rem;color:var(--color-text-muted);line-height:1.5;margin-bottom:0}@media (max-width: 768px){.type-box-description{font-size:.75rem}}.type-box-arrow{align-self:center;color:var(--color-accent);opacity:0;transform:translate(-8px);transition:all .2s ease;margin-top:1rem}@media (max-width: 768px){.type-box-arrow{display:none}}.custom-content-section{padding:4rem 0;background-color:var(--color-bg)}@media (max-width: 768px){.custom-content-section{padding:3rem 0}}.custom-content-section:nth-of-type(2n){background-color:var(--color-bg-card)}.custom-content-body{max-width:900px;margin:0 auto;font-size:1rem;line-height:1.7;color:var(--color-text)}.custom-content-body h2,.custom-content-body h3,.custom-content-body h4,.custom-content-body h5,.custom-content-body h6{font-family:var(--font-display);color:var(--color-text);margin-top:2rem;margin-bottom:1rem}.custom-content-body h2:first-child,.custom-content-body h3:first-child,.custom-content-body h4:first-child,.custom-content-body h5:first-child,.custom-content-body h6:first-child{margin-top:0}.custom-content-body h2{font-size:1.75rem}.custom-content-body h3{font-size:1.5rem}.custom-content-body h4{font-size:1.25rem}.custom-content-body p{margin-bottom:1.25rem}.custom-content-body p:last-child{margin-bottom:0}.custom-content-body a{color:var(--color-accent);text-decoration:underline}.custom-content-body a:hover{color:var(--color-accent-hover)}.custom-content-body ul,.custom-content-body ol{margin-bottom:1.25rem;padding-left:1.5rem}.custom-content-body ul li,.custom-content-body ol li{margin-bottom:.5rem}.custom-content-body ul{list-style-type:disc}.custom-content-body ol{list-style-type:decimal}.custom-content-body blockquote{border-left:4px solid var(--color-accent);padding-left:1.5rem;margin:1.5rem 0;font-style:italic;color:var(--color-text-muted)}.custom-content-body img{max-width:100%;height:auto;border-radius:.5rem;margin:1.5rem 0}.custom-content-body .alignleft{float:left;margin-right:1.5rem;margin-bottom:1rem}.custom-content-body .alignright{float:right;margin-left:1.5rem;margin-bottom:1rem}.custom-content-body .aligncenter{display:block;margin-left:auto;margin-right:auto}.custom-content-body:after{content:"";display:table;clear:both}.Content_Sidebar .content-sidebar-section{padding:4rem 0}.Content_Sidebar .content-sidebar-layout{display:grid;grid-template-columns:1fr;gap:3rem}@media (min-width: 992px){.Content_Sidebar .content-sidebar-layout{grid-template-columns:7fr 3fr}}.Content_Sidebar .content-sidebar-main h2,.Content_Sidebar .content-sidebar-main h3,.Content_Sidebar .content-sidebar-main h4{margin-top:1.5rem;margin-bottom:.75rem}.Content_Sidebar .content-sidebar-main p{margin-bottom:1rem;line-height:1.7}.Content_Sidebar .content-sidebar-main ul,.Content_Sidebar .content-sidebar-main ol{margin-bottom:1rem;padding-left:1.5rem}.Content_Sidebar .content-sidebar-aside{display:flex;flex-direction:column;gap:1.5rem}.Content_Sidebar .sidebar-callout-box{background:var(--color-surface, #1a1a1a);border:1px solid var(--color-border, #333);border-radius:8px;padding:1.5rem}.Content_Sidebar .sidebar-callout-box .sidebar-callout-title{font-size:1.125rem;margin-bottom:.75rem;color:var(--color-accent, #c45c26)}.Content_Sidebar .sidebar-callout-box .sidebar-callout-content{font-size:.9375rem;color:var(--color-text-muted, #aaa);margin-bottom:1rem}.Content_Sidebar .sidebar-callout-box .sidebar-callout-content p:last-child{margin-bottom:0}.Alternating_Blocks .alternating-blocks-section{padding:2rem 0}.Alternating_Blocks .alternating-block{padding:3rem 0}.Alternating_Blocks .alternating-block:nth-child(2n){background:var(--color-surface, #1a1a1a)}.Alternating_Blocks .alternating-block-inner{display:grid;grid-template-columns:1fr;gap:2rem;align-items:center}@media (min-width: 768px){.Alternating_Blocks .alternating-block-inner{grid-template-columns:1fr 1fr;gap:4rem}.Alternating_Blocks .alternating-block--reverse .alternating-block-inner{direction:rtl}.Alternating_Blocks .alternating-block--reverse .alternating-block-inner>*{direction:ltr}}.Alternating_Blocks .alternating-block-image img{width:100%;height:auto;border-radius:8px}.Alternating_Blocks .alternating-block-title{font-size:1.75rem;margin-bottom:1rem}.Alternating_Blocks .alternating-block-text{color:var(--color-text-muted, #aaa);margin-bottom:1.5rem}.Alternating_Blocks .alternating-block-text p{margin-bottom:1rem}.Service_Detail .service-intro-section{padding:3rem 0;max-width:800px;margin:0 auto}.Service_Detail .service-intro-section .service-intro-content{font-size:1.125rem;line-height:1.8}.Service_Detail .service-features-section{padding:3rem 0;background:var(--color-surface, #1a1a1a)}.Service_Detail .service-features-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:2rem}.Service_Detail .service-feature-card{background:var(--color-bg, #0a0a0a);border:1px solid var(--color-border, #333);border-radius:8px;padding:2rem;text-align:center}.Service_Detail .service-feature-icon{color:var(--color-accent, #c45c26);margin-bottom:1rem}.Service_Detail .service-feature-title{font-size:1.25rem;margin-bottom:.5rem}.Service_Detail .service-feature-desc{color:var(--color-text-muted, #aaa);font-size:.9375rem}.Service_Detail .service-faq-section{padding:4rem 0;max-width:800px;margin:0 auto}.Service_Detail .service-faq-heading{font-size:2rem;margin-bottom:2rem;text-align:center}.Service_Detail .service-faq-list{display:flex;flex-direction:column;gap:1rem}.Service_Detail .service-faq-item{background:var(--color-surface, #1a1a1a);border:1px solid var(--color-border, #333);border-radius:8px;overflow:hidden}.Service_Detail .service-faq-item[open] .service-faq-question:after{transform:rotate(180deg)}.Service_Detail .service-faq-question{padding:1.25rem 1.5rem;font-weight:600;cursor:pointer;display:flex;justify-content:space-between;align-items:center;list-style:none}.Service_Detail .service-faq-question::-webkit-details-marker{display:none}.Service_Detail .service-faq-question:after{content:"";border:solid var(--color-accent, #c45c26);border-width:0 2px 2px 0;padding:4px;transform:rotate(45deg);transition:transform .2s}.Service_Detail .service-faq-answer{padding:0 1.5rem 1.25rem;color:var(--color-text-muted, #aaa)}.Card_Grid .card-grid-section{padding:4rem 0}.Card_Grid .card-grid-intro{max-width:800px;margin:0 auto 3rem;text-align:center}.Card_Grid .card-grid{display:grid;gap:2rem}.Card_Grid .card-grid.card-grid--2col{grid-template-columns:repeat(auto-fit,minmax(300px,1fr))}@media (min-width: 768px){.Card_Grid .card-grid.card-grid--2col{grid-template-columns:repeat(2,1fr)}}.Card_Grid .card-grid.card-grid--3col{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}@media (min-width: 992px){.Card_Grid .card-grid.card-grid--3col{grid-template-columns:repeat(3,1fr)}}.Card_Grid .card-grid.card-grid--4col{grid-template-columns:repeat(auto-fit,minmax(240px,1fr))}@media (min-width: 1200px){.Card_Grid .card-grid.card-grid--4col{grid-template-columns:repeat(4,1fr)}}.Card_Grid .grid-card{background:var(--color-surface, #1a1a1a);border:1px solid var(--color-border, #333);border-radius:8px;overflow:hidden;transition:transform .2s,box-shadow .2s}.Card_Grid .grid-card:hover{transform:translateY(-4px);box-shadow:0 8px 24px #0000004d}.Card_Grid .grid-card-image{aspect-ratio:16/10;overflow:hidden}.Card_Grid .grid-card-image img{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.Card_Grid .grid-card-content{padding:1.5rem}.Card_Grid .grid-card-title{font-size:1.25rem;margin-bottom:.5rem}.Card_Grid .grid-card-desc{color:var(--color-text-muted, #aaa);font-size:.9375rem;margin-bottom:1rem}.Card_Grid .grid-card-link{color:var(--color-accent, #c45c26);font-weight:500}.Card_Grid .grid-card-link:hover{text-decoration:underline}.Long_Form_Article .article-breadcrumbs{padding:1rem 0;background:var(--color-surface, #1a1a1a);border-bottom:1px solid var(--color-border, #333)}.Long_Form_Article .breadcrumb-list{display:flex;align-items:center;gap:.5rem;list-style:none;padding:0;margin:0;font-size:.875rem}.Long_Form_Article .breadcrumb-list li:not(:last-child):after{content:"/";margin-left:.5rem;color:var(--color-text-muted, #666)}.Long_Form_Article .breadcrumb-list a{color:var(--color-text-muted, #aaa)}.Long_Form_Article .breadcrumb-list a:hover{color:var(--color-accent, #c45c26)}.Long_Form_Article .breadcrumb-current{color:var(--color-text, #fff)}.Long_Form_Article .article-content-wrapper{padding:4rem 0}.Long_Form_Article .article-header{max-width:800px;margin:0 auto 3rem;text-align:center}.Long_Form_Article .article-title{font-size:2.5rem;margin-bottom:1rem}@media (min-width: 768px){.Long_Form_Article .article-title{font-size:3rem}}.Long_Form_Article .article-subtitle{font-size:1.25rem;color:var(--color-text-muted, #aaa)}.Long_Form_Article .article-body{max-width:800px;margin:0 auto;font-size:1.0625rem;line-height:1.8}.Long_Form_Article .article-body h2{font-size:1.75rem;margin:2.5rem 0 1rem}.Long_Form_Article .article-body h3{font-size:1.375rem;margin:2rem 0 .75rem}.Long_Form_Article .article-body p{margin-bottom:1.25rem}.Long_Form_Article .article-body ul,.Long_Form_Article .article-body ol{margin-bottom:1.25rem;padding-left:1.5rem}.Long_Form_Article .article-body li{margin-bottom:.5rem}.Long_Form_Article .article-body blockquote{border-left:4px solid var(--color-accent, #c45c26);padding-left:1.5rem;margin:2rem 0;font-style:italic;color:var(--color-text-muted, #aaa)}.Long_Form_Article .article-related{max-width:800px;margin:3rem auto 0;padding-top:2rem;border-top:1px solid var(--color-border, #333)}.Long_Form_Article .article-related-heading{font-size:1.25rem;margin-bottom:1rem}.Long_Form_Article .article-related-list{list-style:none;padding:0}.Long_Form_Article .article-related-list li{margin-bottom:.5rem}.Long_Form_Article .article-related-list a{color:var(--color-accent, #c45c26)}.Long_Form_Article .article-related-list a:hover{text-decoration:underline}.Landing_Page .landing-hero{min-height:60vh;display:flex;align-items:center;justify-content:center;text-align:center;position:relative;background-size:cover;background-position:center;background-color:var(--color-surface, #1a1a1a)}.Landing_Page .landing-hero.has-background{color:#fff}.Landing_Page .landing-hero-overlay{position:absolute;top:0;right:0;bottom:0;left:0;background:#0009}.Landing_Page .landing-hero-content{position:relative;z-index:1;max-width:800px;padding:3rem 1rem}.Landing_Page .landing-hero-title{font-size:2.5rem;margin-bottom:1rem}@media (min-width: 768px){.Landing_Page .landing-hero-title{font-size:3.5rem}}.Landing_Page .landing-hero-subtitle{font-size:1.25rem;margin-bottom:2rem;opacity:.9}.Landing_Page .landing-hero-cta{font-size:1.125rem;padding:1rem 2.5rem}.Landing_Page .landing-benefits-section{padding:4rem 0;background:var(--color-bg, #0a0a0a)}.Landing_Page .landing-benefits-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:2rem;text-align:center}.Landing_Page .landing-benefit{padding:1.5rem}.Landing_Page .landing-benefit-icon{color:var(--color-accent, #c45c26);margin-bottom:1rem}.Landing_Page .landing-benefit-title{font-size:1.25rem;margin-bottom:.5rem}.Landing_Page .landing-benefit-desc{color:var(--color-text-muted, #aaa);font-size:.9375rem}.Landing_Page .landing-testimonial-section{padding:4rem 0;background:var(--color-surface, #1a1a1a)}.Landing_Page .landing-testimonial{max-width:800px;margin:0 auto;text-align:center}.Landing_Page .landing-testimonial-quote{font-size:1.5rem;font-style:italic;line-height:1.6;margin-bottom:1.5rem}@media (min-width: 768px){.Landing_Page .landing-testimonial-quote{font-size:1.75rem}}.Landing_Page .landing-testimonial-footer{display:flex;flex-direction:column;gap:.25rem}.Landing_Page .landing-testimonial-author{font-weight:600;font-style:normal}.Landing_Page .landing-testimonial-title{color:var(--color-text-muted, #aaa);font-size:.875rem}:root{--color-bg-dark: #0A0A0A;--color-bg-card: #161616;--color-accent: #9F3730;--color-accent-hover: #C8473F;--color-accent-light: #BF524B;--color-text: #F5F5F5;--color-text-muted: #B0B0B0;--color-border: #2A2A2A;--color-success: #2E7D32;--color-warning: #F9A825;--color-sold: #757575;--font-display: "Abril Fatface", Georgia, serif;--font-body: "Inter", "Droid Sans", Arial, sans-serif;--container-max: 1400px;--container-padding: 1.5rem;--transition-fast: .15s ease}html{font-size:16px;scroll-behavior:smooth}body{font-family:var(--font-body);background-color:var(--color-bg-dark);color:var(--color-text-muted);line-height:1.6;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}h1,h2,h3,h4,h5,h6{font-family:var(--font-display);color:var(--color-text);font-weight:400;line-height:1.2;margin-bottom:1rem}h1{font-size:3rem}h2{font-size:2.25rem}h3{font-size:1.875rem}h4{font-size:1.5rem}h5{font-size:1.25rem}h6{font-size:1.125rem}p{margin-bottom:1rem}a{color:var(--color-accent-light);text-decoration:none}a:hover{color:var(--color-accent-hover)}.container{max-width:var(--container-max);margin-left:auto;margin-right:auto;padding-left:var(--container-padding);padding-right:var(--container-padding)}.site-main{min-height:50vh}.btn,.comment-form .form-submit input[type=submit]{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;padding:.75rem 1.5rem;font-family:var(--font-body);font-weight:600;font-size:.875rem;text-transform:uppercase;letter-spacing:.05em;border-radius:.25rem;border:none;cursor:pointer}.btn svg,.comment-form .form-submit input[type=submit] svg{flex-shrink:0}.btn-primary,.comment-form .form-submit input[type=submit]{background-color:var(--color-accent);color:#fff}.btn-primary:hover,.comment-form .form-submit input[type=submit]:hover{background-color:var(--color-accent-hover);color:#fff}.btn-secondary{background-color:transparent;border:2px solid var(--color-accent);color:var(--color-accent)}.btn-secondary:hover{background-color:var(--color-accent);color:#fff}.btn-sm{padding:.5rem 1rem;font-size:.75rem;gap:.375rem}.badge{display:inline-block;padding:.25rem .75rem;font-size:.75rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;border-radius:.25rem}.badge-success{background-color:var(--color-success);color:#fff}.badge-warning{background-color:var(--color-warning);color:#000}.badge-muted{background-color:var(--color-sold);color:#fff}.badge-type{background-color:#1e40af;color:#dbeafe}.badge-active{background-color:#065f46;color:#d1fae5}.badge-pending{background-color:#92400e;color:#fef3c7}.badge-sold{background-color:#374151;color:#d1d5db}.card{background-color:var(--color-bg-card);border-radius:.5rem;overflow:hidden}input[type=text],input[type=email],input[type=tel],input[type=number],input[type=search],textarea,select{width:100%;padding:.75rem 1rem;background-color:#000;border:1px solid var(--color-border);border-radius:.25rem;color:var(--color-text);font-family:var(--font-body);font-size:1rem}input[type=text]::-moz-placeholder,input[type=email]::-moz-placeholder,input[type=tel]::-moz-placeholder,input[type=number]::-moz-placeholder,input[type=search]::-moz-placeholder,textarea::-moz-placeholder,select::-moz-placeholder{color:var(--color-sold)}input[type=text]::placeholder,input[type=email]::placeholder,input[type=tel]::placeholder,input[type=number]::placeholder,input[type=search]::placeholder,textarea::placeholder,select::placeholder{color:var(--color-sold)}input[type=text]:focus,input[type=email]:focus,input[type=tel]:focus,input[type=number]:focus,input[type=search]:focus,textarea:focus,select:focus{outline:none;border-color:var(--color-accent)}.wpcf7 br{display:none}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.mt-0{margin-top:0}.mb-0{margin-bottom:0}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.alignwide{max-width:calc(var(--container-max) + 200px)}.alignfull{width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw}.wp-block-image img{max-width:100%;height:auto}@media (max-width: 768px){:root{--container-padding: 1rem}h1{font-size:2.25rem}h2{font-size:1.875rem}h3{font-size:1.5rem}}::view-transition-old(root),::view-transition-new(root){animation:none}.has-title-animations .about-team-title,.has-title-animations .about-broker-title,.has-title-animations .about-story-content h2,.has-title-animations .about-story-content h3,.has-title-animations .contact-form-title,.has-title-animations .contact-info-title,.has-title-animations .join-team-title,.has-title-animations .join-benefit-title,.has-title-animations .section-title,.has-title-animations .resource-featured-title,.has-title-animations .resource-card-title{display:inline-block;transition:letter-spacing .2s ease,transform .2s ease;cursor:default}.has-title-animations .about-team-title:hover,.has-title-animations .about-broker-title:hover,.has-title-animations .about-story-content h2:hover,.has-title-animations .about-story-content h3:hover,.has-title-animations .contact-form-title:hover,.has-title-animations .contact-info-title:hover,.has-title-animations .join-team-title:hover,.has-title-animations .join-benefit-title:hover,.has-title-animations .section-title:hover,.has-title-animations .resource-featured-title:hover,.has-title-animations .resource-card-title:hover{letter-spacing:.02em;transform:translate(2px)} + */*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.visible{visibility:visible}.collapse{visibility:collapse}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.block{display:block}.flex{display:flex}.table{display:table}.grid{display:grid}.hidden{display:none}.flex-shrink{flex-shrink:1}.border-collapse{border-collapse:collapse}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.resize{resize:both}.border{border-width:1px}.uppercase{text-transform:uppercase}.italic{font-style:italic}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.outline{outline-style:solid}.grayscale{--tw-grayscale: grayscale(100%);filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.site-header{position:sticky;top:0;z-index:100;background-color:var(--color-bg-dark);border-bottom:1px solid var(--color-border)}.header-container{padding-top:1rem;padding-bottom:1rem}.header-inner{display:flex;align-items:center;justify-content:space-between;gap:2rem}.site-branding{flex-shrink:0}.site-branding .custom-logo-link{display:block}.site-branding .custom-logo-link img{max-height:60px;width:auto}.site-branding .site-title-link{text-decoration:none}.site-branding .site-title{font-family:var(--font-display);font-size:1.5rem;color:var(--color-text);letter-spacing:.02em}.main-navigation{display:none;flex-grow:1;justify-content:center}@media (min-width: 1024px){.main-navigation{display:flex}}.main-navigation .nav-menu{display:flex;align-items:center;gap:2rem;list-style:none;margin:0;padding:0}.main-navigation .menu-item a{display:block;padding:.5rem 0;color:var(--color-text-muted);font-size:.875rem;font-weight:500;text-transform:uppercase;letter-spacing:.05em;text-decoration:none}.main-navigation .menu-item a:hover{color:var(--color-text)}.main-navigation .menu-item.current-menu-item a,.main-navigation .menu-item.current_page_item a{color:var(--color-accent-light)}.menu-toggle{display:flex;flex-direction:column;justify-content:center;align-items:center;width:44px;height:44px;padding:0;background:transparent;border:none;cursor:pointer}@media (min-width: 1024px){.menu-toggle{display:none}}.menu-toggle .menu-toggle-icon{display:flex;flex-direction:column;gap:5px}.menu-toggle .bar{display:block;width:24px;height:2px;background-color:var(--color-text)}.menu-toggle[aria-expanded=true] .bar:nth-child(1){transform:translateY(7px) rotate(45deg)}.menu-toggle[aria-expanded=true] .bar:nth-child(2){opacity:0}.menu-toggle[aria-expanded=true] .bar:nth-child(3){transform:translateY(-7px) rotate(-45deg)}.header-cta{display:none;flex-shrink:0}@media (min-width: 1024px){.header-cta{display:flex;align-items:center;gap:.75rem}}.header-cta .header-social{display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;border:1px solid var(--color-border);border-radius:.25rem;color:var(--color-text-muted);text-decoration:none}.header-cta .header-social:hover{border-color:var(--color-accent);color:var(--color-accent-light)}.header-cta .header-social svg{width:18px;height:18px}.header-cta .header-phone{display:inline-flex;align-items:center;padding:.625rem 1.25rem;background-color:var(--color-accent);color:#fff;font-size:.875rem;font-weight:600;text-decoration:none;border-radius:.25rem}.header-cta .header-phone:hover{background-color:var(--color-accent-hover);color:#fff}.mobile-navigation{display:none;position:absolute;top:100%;left:0;right:0;background-color:var(--color-bg-card);border-bottom:1px solid var(--color-border);padding:1rem}.mobile-navigation.is-open{display:block}@media (min-width: 1024px){.mobile-navigation{display:none!important}}.mobile-navigation .mobile-nav-menu{list-style:none;margin:0;padding:0}.mobile-navigation .menu-item{border-bottom:1px solid var(--color-border)}.mobile-navigation .menu-item:last-child{border-bottom:none}.mobile-navigation .menu-item a{display:block;padding:1rem 0;color:var(--color-text);font-size:1rem;text-decoration:none}.mobile-navigation .menu-item a:hover{color:var(--color-accent-light)}.mobile-navigation .mobile-menu-cta{margin-top:1.5rem;padding-top:1.5rem;border-top:1px solid var(--color-border)}.mobile-navigation .mobile-menu-cta .btn,.mobile-navigation .mobile-menu-cta .comment-form .form-submit input[type=submit],.comment-form .form-submit .mobile-navigation .mobile-menu-cta input[type=submit]{display:block;width:100%;text-align:center}.site-footer{background-color:var(--color-bg-card);border-top:1px solid var(--color-border);margin-top:auto}.footer-container{padding-top:3rem;padding-bottom:1.5rem}.footer-inner{display:grid;grid-template-columns:1fr;gap:2rem}@media (min-width: 768px){.footer-inner{grid-template-columns:repeat(2,1fr)}}@media (min-width: 1024px){.footer-inner{grid-template-columns:1.5fr 1fr 1.25fr 1fr;gap:2rem}}.footer-column{min-width:0}.footer-heading{font-family:var(--font-body);font-size:.875rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text);margin-bottom:1.25rem}.footer-about .footer-logo{margin-bottom:1rem}.footer-about .footer-logo img{max-height:50px;width:auto}.footer-about .footer-logo .site-title{font-family:var(--font-display);font-size:1.25rem;color:var(--color-text)}.footer-about .footer-tagline{font-size:.875rem;color:var(--color-text-muted);margin-bottom:1.25rem;line-height:1.6}.footer-social{display:flex;gap:1rem}.footer-social a{display:flex;align-items:center;justify-content:center;width:40px;height:40px;background-color:var(--color-bg-dark);border-radius:.25rem;color:var(--color-text-muted)}.footer-social a:hover{background-color:var(--color-accent);color:#fff}.footer-social a svg{width:20px;height:20px}.footer-links .footer-menu{list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;gap:.5rem 1.5rem}@media (max-width: 767px){.footer-links .footer-menu{gap:.5rem 1rem}}.footer-links .menu-item a{color:var(--color-text-muted);font-size:.9375rem;text-decoration:none}.footer-links .menu-item a:hover{color:var(--color-accent-light)}.contact-list{list-style:none;margin:0;padding:0}.contact-item{display:flex;align-items:flex-start;gap:.75rem;margin-bottom:1rem;font-size:.9375rem}.contact-item:last-child{margin-bottom:0}.contact-item svg{flex-shrink:0;color:var(--color-accent);margin-top:.125rem}.contact-item a{color:var(--color-text-muted);text-decoration:none}.contact-item a:hover{color:var(--color-accent-light)}.contact-item span{color:var(--color-text-muted)}.footer-hours .hours-list{list-style:none;margin:0;padding:0}.footer-hours .hours-item{display:flex;justify-content:space-between;gap:1rem;margin-bottom:.5rem;font-size:.875rem}.footer-hours .hours-item:last-child{margin-bottom:0}.footer-hours .hours-day{color:var(--color-text-muted)}.footer-hours .hours-time{color:var(--color-text);text-align:right}.footer-legal{display:flex;flex-direction:column;align-items:center;gap:1.25rem;padding-top:2rem;margin-top:2rem;border-top:1px solid var(--color-border)}.footer-legal-inner{display:flex;flex-wrap:wrap;justify-content:center;gap:1.5rem}@media (max-width: 640px){.footer-legal-inner{gap:1rem}}.legal-item{display:flex;align-items:center;gap:.5rem;padding:.5rem 1rem;background-color:var(--color-bg-dark);border:1px solid var(--color-border);border-radius:.25rem;color:var(--color-text-muted);font-size:.8125rem;text-decoration:none}.legal-item:hover{border-color:var(--color-accent);color:var(--color-accent-light)}.legal-item:hover svg{color:var(--color-accent)}.legal-item svg{flex-shrink:0;color:var(--color-text-muted)}@media (max-width: 640px){.legal-item{width:calc(50% - .5rem);justify-content:center;padding:.625rem .75rem;font-size:.75rem}}.footer-license{margin:0;font-size:.75rem;color:var(--color-sold);text-align:center}.footer-association-logos{display:flex;align-items:center;justify-content:center;gap:2rem;margin-top:1rem}.footer-association-logos .association-logo{height:40px;width:auto;opacity:.7}.footer-association-logos .association-logo:hover{opacity:1}@media (max-width: 640px){.footer-association-logos{gap:1.5rem}.footer-association-logos .association-logo{height:32px}}.footer-temp-link{text-align:center;padding:1rem 0;margin-top:1.5rem;border-top:2px dashed var(--color-accent);border-bottom:2px dashed var(--color-accent)}.footer-temp-link a{display:inline-block;padding:.75rem 2rem;background-color:var(--color-accent);color:#fff;font-size:.875rem;font-weight:700;letter-spacing:.1em;text-decoration:none;border-radius:.25rem}.footer-temp-link a:hover{background-color:var(--color-accent-hover);color:#fff}.footer-bottom{padding-top:1.5rem;margin-top:2rem;border-top:1px solid var(--color-border);text-align:center}.footer-bottom-text{margin:0;font-size:.8125rem;color:var(--color-text-muted)}.footer-bottom-text a{color:var(--color-text-muted);text-decoration:none}.footer-bottom-text a:hover{color:var(--color-accent-light)}.page-content{padding:2rem 0 4rem}.page-header{margin-bottom:2rem;padding-bottom:1.5rem;border-bottom:1px solid var(--color-border)}.page-title{margin-bottom:0}.entry-content{max-width:800px}.entry-content>*:first-child{margin-top:0}.entry-content>*:last-child{margin-bottom:0}.entry-content h2,.entry-content h3,.entry-content h4,.entry-content h5,.entry-content h6{margin-top:2rem}.entry-content ul,.entry-content ol{margin-bottom:1rem;padding-left:1.5rem}.entry-content ul li,.entry-content ol li{margin-bottom:.5rem}.entry-content blockquote{margin:1.5rem 0;padding:1rem 1.5rem;border-left:4px solid var(--color-accent);background-color:var(--color-bg-card)}.entry-content blockquote p:last-child{margin-bottom:0}.entry-content table{width:100%;margin-bottom:1rem;border-collapse:collapse}.entry-content table th,.entry-content table td{padding:.75rem;border:1px solid var(--color-border);text-align:left}.entry-content table th{background-color:var(--color-bg-card);font-weight:600;color:var(--color-text)}.entry-content img{max-width:100%;height:auto;border-radius:.25rem}.entry-content code{padding:.125rem .375rem;background-color:var(--color-bg-card);border-radius:.25rem;font-size:.875em}.entry-content pre{margin-bottom:1rem;padding:1rem;background-color:var(--color-bg-card);border-radius:.25rem;overflow-x:auto}.entry-content pre code{padding:0;background:none}.page-links{margin-top:2rem;padding-top:1rem;border-top:1px solid var(--color-border);font-weight:500}.page-links .page-numbers{display:inline-block;padding:.25rem .5rem;margin:0 .25rem;background-color:var(--color-bg-card);border-radius:.25rem;color:var(--color-text-muted);text-decoration:none}.page-links .page-numbers.current,.page-links .page-numbers:hover{background-color:var(--color-accent);color:#fff}.archive-header{margin-bottom:2rem;padding:2rem 0;border-bottom:1px solid var(--color-border)}.archive-title{margin-bottom:0}.posts-grid{display:grid;grid-template-columns:1fr;gap:2rem;padding:2rem 0}@media (min-width: 768px){.posts-grid{grid-template-columns:repeat(2,1fr)}}@media (min-width: 1024px){.posts-grid{grid-template-columns:repeat(3,1fr)}}.post-card{display:flex;flex-direction:column}.post-card-image{display:block;aspect-ratio:16/10;overflow:hidden}.post-card-image img{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.post-card-content{display:flex;flex-direction:column;flex-grow:1;padding:1.25rem}.post-card-header{margin-bottom:.75rem}.post-card-meta{margin-bottom:.5rem}.post-card-meta time{font-size:.8125rem;color:var(--color-text-muted)}.post-card-title{font-family:var(--font-body);font-size:1.125rem;font-weight:600;line-height:1.4;margin-bottom:0}.post-card-title a{color:var(--color-text);text-decoration:none}.post-card-title a:hover{color:var(--color-accent-light)}.post-card-excerpt{flex-grow:1;margin-bottom:1rem}.post-card-excerpt p{font-size:.9375rem;color:var(--color-text-muted);margin-bottom:0;line-height:1.6}.post-card-link{display:inline-flex;align-items:center;gap:.5rem;font-size:.875rem;font-weight:600;color:var(--color-accent-light);text-decoration:none}.post-card-link:hover{color:var(--color-accent-hover)}.post-card-link svg{width:16px;height:16px}.pagination,.nav-links{display:flex;justify-content:center;align-items:center;gap:.5rem;padding:2rem 0;flex-wrap:wrap}.pagination .page-numbers,.nav-links .page-numbers{display:inline-flex;align-items:center;justify-content:center;min-width:40px;height:40px;padding:0 .75rem;background-color:var(--color-bg-card);border-radius:.25rem;color:var(--color-text-muted);text-decoration:none;font-size:.875rem;font-weight:500}.pagination .page-numbers.current,.nav-links .page-numbers.current{background-color:var(--color-accent);color:#fff}.pagination .page-numbers:hover:not(.current):not(.dots),.nav-links .page-numbers:hover:not(.current):not(.dots){background-color:var(--color-border);color:var(--color-text)}.pagination .page-numbers.dots,.nav-links .page-numbers.dots{background:none;cursor:default}.pagination .prev,.pagination .next,.nav-links .prev,.nav-links .next{padding:0 1rem}.no-posts{text-align:center;padding:4rem 0;color:var(--color-text-muted)}.Single_Post .single-post-main{padding:0}.Single_Post .single-post-hero{width:100%;max-height:60vh;overflow:hidden}.Single_Post .single-post-hero img{width:100%;height:auto;-o-object-fit:cover;object-fit:cover}.Single_Post .single-post-section{padding:4rem 0;background-color:var(--color-bg-dark)}@media (max-width: 768px){.Single_Post .single-post-section{padding:3rem 0}}.Single_Post .single-post-layout{display:grid;grid-template-columns:1fr 320px;gap:3rem}@media (max-width: 1024px){.Single_Post .single-post-layout{grid-template-columns:1fr;gap:3rem}}.Single_Post .related-posts-section{padding:4rem 0;background-color:var(--color-bg-card)}@media (max-width: 768px){.Single_Post .related-posts-section{padding:3rem 0}}.Single_Post .related-posts-header{text-align:center;margin-bottom:2rem}.Single_Post .related-posts-title{font-family:var(--font-display);font-size:1.875rem;color:var(--color-text);margin-bottom:0}.Single_Post .related-posts-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:1.5rem}@media (max-width: 1024px){.Single_Post .related-posts-grid{grid-template-columns:repeat(2,1fr)}}@media (max-width: 640px){.Single_Post .related-posts-grid{grid-template-columns:1fr}}.single-post{padding:0;max-width:none}.post-header{margin-bottom:2rem}.post-meta{display:flex;align-items:center;gap:.5rem;margin-bottom:1rem;font-size:.875rem;color:var(--color-text-muted)}.post-meta time{color:var(--color-text-muted)}.post-meta .meta-separator{color:var(--color-border)}.post-meta .post-categories a{color:var(--color-accent-light);text-decoration:none}.post-meta .post-categories a:hover{color:var(--color-accent-hover)}.post-title{font-size:2.5rem;margin-bottom:0}@media (max-width: 768px){.post-title{font-size:2rem}}.post-featured-image{margin-bottom:2rem;border-radius:.5rem;overflow:hidden}.post-featured-image img{width:100%;height:auto;display:block}.post-footer{margin-top:3rem;padding-top:1.5rem;border-top:1px solid var(--color-border)}.post-tags{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem}.post-tags .tags-label{font-size:.875rem;font-weight:500;color:var(--color-text-muted)}.post-tags .tag-link{display:inline-block;padding:.25rem .75rem;background-color:var(--color-bg-card);border-radius:.25rem;font-size:.8125rem;color:var(--color-text-muted);text-decoration:none}.post-tags .tag-link:hover{background-color:var(--color-accent);color:#fff}.post-navigation{margin-top:3rem;padding:1.5rem 0;border-top:1px solid var(--color-border);border-bottom:1px solid var(--color-border)}.post-navigation .nav-links{display:grid;grid-template-columns:1fr;gap:1.5rem}@media (min-width: 640px){.post-navigation .nav-links{grid-template-columns:1fr 1fr}}.post-navigation .nav-previous a,.post-navigation .nav-next a{display:block;text-decoration:none}.post-navigation .nav-next{text-align:right}.post-navigation .nav-subtitle{display:block;font-size:.8125rem;color:var(--color-text-muted);margin-bottom:.25rem}.post-navigation .nav-title{display:block;font-size:1rem;font-weight:500;color:var(--color-text);line-height:1.4}.post-navigation a:hover .nav-title{color:var(--color-accent-light)}.comments-area{margin-top:3rem;padding-top:2rem;border-top:1px solid var(--color-border)}.comments-title{margin-bottom:1.5rem}.comment-list{list-style:none;margin:0;padding:0}.comment-list .comment{margin-bottom:1.5rem;padding-bottom:1.5rem;border-bottom:1px solid var(--color-border)}.comment-list .comment:last-child{border-bottom:none}.comment-list .comment-body{display:flex;gap:1rem}.comment-list .comment-author{flex-shrink:0}.comment-list .comment-author img{border-radius:50%}.comment-list .comment-content{flex-grow:1}.comment-list .fn{font-weight:600;color:var(--color-text)}.comment-list .comment-metadata{margin-bottom:.5rem;font-size:.8125rem;color:var(--color-text-muted)}.comment-list .comment-metadata a{color:var(--color-text-muted);text-decoration:none}.comment-list .comment-metadata a:hover{color:var(--color-accent-light)}.comment-respond{margin-top:2rem}.comment-reply-title{margin-bottom:1rem}.comment-form label{display:block;margin-bottom:.5rem;font-size:.875rem;font-weight:500;color:var(--color-text)}.comment-form input[type=text],.comment-form input[type=email],.comment-form input[type=url],.comment-form textarea{margin-bottom:1rem}.comment-form .form-submit{margin-top:1rem}.error-404{text-align:center;padding:4rem 0;max-width:600px;margin:0 auto}.error-header{margin-bottom:2rem}.error-title{font-size:8rem;line-height:1;color:var(--color-accent);margin-bottom:.5rem}@media (max-width: 640px){.error-title{font-size:5rem}}.error-subtitle{font-size:1.5rem;font-weight:500;color:var(--color-text);margin-bottom:0}.error-content{margin-bottom:2rem}.error-content p{font-size:1rem;color:var(--color-text-muted)}.error-actions{display:flex;justify-content:center;gap:1rem;margin-top:1.5rem;flex-wrap:wrap}.error-search{margin-top:2rem;padding-top:2rem;border-top:1px solid var(--color-border)}.error-search p{margin-bottom:1rem;color:var(--color-text-muted)}.search-form{display:flex;max-width:400px;margin:0 auto}.search-form .search-field{flex-grow:1;border-radius:.25rem 0 0 .25rem}.search-form .search-submit{flex-shrink:0;padding:.75rem 1.25rem;background-color:var(--color-accent);color:#fff;border:none;border-radius:0 .25rem .25rem 0;font-weight:600;cursor:pointer}.search-form .search-submit:hover{background-color:var(--color-accent-hover)}.Home_Page .homepage-main{padding:0}.Home_Page .hero-desktop-only{display:none}@media (min-width: 1450px){.Home_Page .hero-desktop-only{display:block}}.Home_Page .hero-mobile-only{display:block}@media (min-width: 1450px){.Home_Page .hero-mobile-only{display:none}}.Home_Page .section-header{text-align:center;margin-bottom:3rem}@media (max-width: 768px){.Home_Page .section-header{margin-bottom:2rem}}.Home_Page .section-title{font-family:var(--font-display);font-size:2.25rem;color:var(--color-text);margin-bottom:.75rem}@media (max-width: 768px){.Home_Page .section-title{font-size:1.875rem}}.Home_Page .section-subtitle{font-size:1.125rem;color:var(--color-text-muted);max-width:600px;margin:0 auto}.Home_Page .section-footer{text-align:center;margin-top:2.5rem}.Home_Page .featured-properties-section{padding:4rem 0;background-color:var(--color-bg-card)}@media (max-width: 768px){.Home_Page .featured-properties-section{padding:3rem 0}}.Home_Page .featured-properties-section--alt{background-color:var(--color-bg-dark)}.Home_Page .property-grid--3col{display:grid;grid-template-columns:repeat(3,1fr);gap:1.5rem}@media (max-width: 1024px){.Home_Page .property-grid--3col{grid-template-columns:repeat(2,1fr)}}@media (max-width: 640px){.Home_Page .property-grid--3col{grid-template-columns:1fr}}.Home_Page .no-properties-message{text-align:center;color:var(--color-text-muted);font-size:1.125rem;padding:3rem 0}.About_Page .about-page-main{padding:0}.About_Page .about-story-section{padding:4rem 0;background-color:var(--color-bg-dark)}@media (max-width: 768px){.About_Page .about-story-section{padding:3rem 0}}.About_Page .about-story-layout{display:grid;grid-template-columns:1fr 2fr;gap:3rem;align-items:center}@media (max-width: 1300px){.About_Page .about-story-layout{grid-template-columns:1fr;gap:2rem}}.About_Page .about-story-image img{width:100%;height:auto;border-radius:.5rem;display:block}@media (max-width: 1300px){.About_Page .about-story-image{max-width:500px;margin:0 auto}}.About_Page .about-story-content h2,.About_Page .about-story-content h3{font-family:var(--font-display);color:var(--color-text);margin-top:2rem}.About_Page .about-story-content h2:first-child,.About_Page .about-story-content h3:first-child{margin-top:0}.About_Page .about-story-content p{font-size:1.125rem;line-height:1.8;color:var(--color-text-muted)}.About_Page .about-values-section{padding:4rem 0;background-color:var(--color-bg-card)}@media (max-width: 768px){.About_Page .about-values-section{padding:3rem 0}}.About_Page .about-values-header{text-align:center;margin-bottom:3rem}.About_Page .about-values-title{font-family:var(--font-display);font-size:2.25rem;color:var(--color-text);margin-bottom:0}@media (max-width: 768px){.About_Page .about-values-title{font-size:1.875rem}}.About_Page .about-team-section{padding:4rem 0;background-color:var(--color-bg-dark)}@media (max-width: 768px){.About_Page .about-team-section{padding:3rem 0}}.About_Page .about-team-header{text-align:center;margin-bottom:3rem}.About_Page .about-team-title{font-family:var(--font-display);font-size:2.25rem;color:var(--color-text);margin-bottom:.75rem}@media (max-width: 768px){.About_Page .about-team-title{font-size:1.875rem}}.About_Page .about-team-subtitle{font-size:1.125rem;color:var(--color-text-muted);max-width:600px;margin:0 auto}.About_Page .agents-grid{display:flex;flex-wrap:wrap;justify-content:center;gap:2rem}.About_Page .agents-grid .agent-card-item{width:100%}@media (min-width: 640px){.About_Page .agents-grid .agent-card-item{width:calc(50% - 1rem)}}@media (min-width: 1024px){.About_Page .agents-grid .agent-card-item{width:calc(33.333% - 1.334rem)}}@media (min-width: 1280px){.About_Page .agents-grid .agent-card-item{width:calc(25% - 1.5rem)}}.About_Page .about-broker-section{padding:3rem 0;background-color:var(--color-bg-card);border-top:1px solid var(--color-border)}.About_Page .about-broker-content{text-align:center}.About_Page .about-broker-title{font-family:var(--font-display);font-size:1.25rem;color:var(--color-text);margin-bottom:.5rem}.About_Page .about-broker-text{font-size:.9375rem;color:var(--color-text-muted);margin-bottom:0}.Join_Page .join-page-main{padding:0}.Join_Page .join-why-section{padding:4rem 0;background-color:var(--color-bg-dark)}@media (max-width: 768px){.Join_Page .join-why-section{padding:3rem 0}}.Join_Page .join-intro{max-width:800px;margin:0 auto 3rem;text-align:center}.Join_Page .join-intro p{font-size:1.125rem;line-height:1.8;color:var(--color-text-muted)}.Join_Page .join-benefits-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:1.5rem}@media (max-width: 1024px){.Join_Page .join-benefits-grid{grid-template-columns:repeat(2,1fr)}}@media (max-width: 640px){.Join_Page .join-benefits-grid{grid-template-columns:1fr;gap:1rem}}.Join_Page .join-benefit-card{background-color:var(--color-bg-card);border:1px solid var(--color-border);border-radius:.5rem;padding:1.5rem;text-align:center}.Join_Page .join-benefit-card:hover{border-color:var(--color-accent)}.Join_Page .join-benefit-icon{display:flex;align-items:center;justify-content:center;width:64px;height:64px;margin:0 auto 1rem;background-color:#9f37301a;border-radius:50%;color:var(--color-accent)}.Join_Page .join-benefit-title{font-family:var(--font-display);font-size:1.25rem;color:var(--color-text);margin-bottom:.5rem}.Join_Page .join-benefit-text{font-size:.9375rem;color:var(--color-text-muted);line-height:1.6;margin-bottom:0}.Join_Page .join-team-section{padding:4rem 0;background-color:var(--color-bg-card)}@media (max-width: 768px){.Join_Page .join-team-section{padding:3rem 0}}.Join_Page .join-team-header{text-align:center;margin-bottom:2.5rem}.Join_Page .join-team-title{font-family:var(--font-display);font-size:2.25rem;color:var(--color-text);margin-bottom:.5rem}@media (max-width: 768px){.Join_Page .join-team-title{font-size:1.875rem}}.Join_Page .join-team-subtitle{font-size:1.125rem;color:var(--color-text-muted)}.Join_Page .join-team-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:2rem;margin-bottom:2rem}@media (max-width: 1024px){.Join_Page .join-team-grid{grid-template-columns:repeat(2,1fr)}}@media (max-width: 640px){.Join_Page .join-team-grid{grid-template-columns:repeat(2,1fr);gap:1rem}}.Join_Page .join-team-member{text-align:center}.Join_Page .join-team-photo{width:120px;height:120px;margin:0 auto 1rem;border-radius:50%;overflow:hidden;border:3px solid var(--color-border)}.Join_Page .join-team-photo img{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}@media (max-width: 640px){.Join_Page .join-team-photo{width:80px;height:80px;margin-bottom:.75rem}}.Join_Page .join-team-placeholder{width:100%;height:100%;display:flex;align-items:center;justify-content:center;background-color:var(--color-bg-dark);color:var(--color-text-muted)}.Join_Page .join-team-name{font-family:var(--font-display);font-size:1.125rem;color:var(--color-text);margin-bottom:.25rem}@media (max-width: 640px){.Join_Page .join-team-name{font-size:1rem}}.Join_Page .join-team-role{font-size:.875rem;color:var(--color-accent);margin-bottom:0}@media (max-width: 640px){.Join_Page .join-team-role{font-size:.75rem}}.Join_Page .join-team-cta{text-align:center}.Contact_Page .contact-page-main{padding:0}.Contact_Page .contact-section{padding:4rem 0;background-color:var(--color-bg-dark)}@media (max-width: 768px){.Contact_Page .contact-section{padding:3rem 0}}.Contact_Page .contact-grid{display:grid;grid-template-columns:1fr 1fr;gap:3rem}@media (max-width: 1024px){.Contact_Page .contact-grid{grid-template-columns:1fr;gap:2rem}}.Contact_Page .contact-form-wrapper{background-color:var(--color-bg-card);padding:2rem;border-radius:.5rem}.Contact_Page .contact-form-title{font-family:var(--font-display);font-size:1.5rem;color:var(--color-text);margin-bottom:1.5rem}.Contact_Page .contact-form-notice{color:var(--color-text-muted);font-style:italic;margin-bottom:1.5rem}.Contact_Page .property-inquiry-display{background-color:var(--color-bg-dark);border:1px solid var(--color-border);border-left:3px solid var(--color-accent);padding:1rem 1.25rem;margin-bottom:1.5rem;border-radius:.25rem}.Contact_Page .property-inquiry-label{font-size:.75rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-muted);margin-bottom:.25rem}.Contact_Page .property-inquiry-value{font-size:.9375rem;color:var(--color-text);line-height:1.4}.Contact_Page .property-inquiry-value a{color:var(--color-accent-light);text-decoration:none}.Contact_Page .property-inquiry-value a:hover{text-decoration:underline}.Contact_Page .contact-form .form-group{margin-bottom:1.25rem}.Contact_Page .contact-form label{display:block;font-size:.875rem;font-weight:600;color:var(--color-text);margin-bottom:.5rem}.Contact_Page .contact-form label .required{color:var(--color-accent)}.Contact_Page .contact-form input,.Contact_Page .contact-form textarea{width:100%}.Contact_Page .contact-form button[type=submit]{width:100%;margin-top:.5rem}.Contact_Page .wpcf7-form .form-group,.Contact_Page .wpcf7-form p{margin-bottom:1.25rem}.Contact_Page .wpcf7-form label{display:block;font-size:.875rem;font-weight:600;color:var(--color-text);margin-bottom:.5rem}.Contact_Page .wpcf7-form br{display:none}.Contact_Page .wpcf7-form input[type=text],.Contact_Page .wpcf7-form input[type=email],.Contact_Page .wpcf7-form input[type=tel],.Contact_Page .wpcf7-form textarea{width:100%}.Contact_Page .wpcf7-form input[type=submit]{width:100%;margin-top:.5rem;background-color:var(--color-accent);color:#fff;padding:.75rem 1.5rem;font-weight:600;font-size:.875rem;text-transform:uppercase;letter-spacing:.05em;border-radius:.25rem;border:none;cursor:pointer}.Contact_Page .wpcf7-form input[type=submit]:hover{background-color:var(--color-accent-hover)}.Contact_Page .wpcf7-form .wpcf7-response-output{margin:1rem 0 0;padding:1rem;border-radius:.25rem}.Contact_Page .wpcf7-form .wpcf7-mail-sent-ok{background-color:var(--color-success);color:#fff;border:none}.Contact_Page .wpcf7-form .wpcf7-validation-errors,.Contact_Page .wpcf7-form .wpcf7-mail-sent-ng{background-color:var(--color-accent);color:#fff;border:none}.Contact_Page .contact-info-wrapper{display:flex;flex-direction:column}.Contact_Page .contact-info-title{font-family:var(--font-display);font-size:1.5rem;color:var(--color-text);margin-bottom:1.5rem}.Contact_Page .contact-info-list{display:flex;flex-direction:column;gap:1.5rem;margin-bottom:2rem}.Contact_Page .contact-info-item{display:flex;gap:1rem}.Contact_Page .contact-info-icon{flex-shrink:0;width:48px;height:48px;display:flex;align-items:center;justify-content:center;background-color:var(--color-bg-card);border-radius:.5rem;color:var(--color-accent);text-decoration:none}.Contact_Page .contact-info-icon:hover{background-color:var(--color-accent);color:#fff}.Contact_Page .contact-info-content{flex:1}.Contact_Page .contact-info-label{font-family:Times New Roman,Times,serif;font-size:1rem;font-weight:600;color:var(--color-text);margin-bottom:.25rem}.Contact_Page .contact-info-value{font-size:.9375rem;color:var(--color-text-muted);margin-bottom:0;line-height:1.5}.Contact_Page .contact-info-value a{color:var(--color-text-muted)}.Contact_Page .contact-info-value a:hover{color:var(--color-accent-light)}.Contact_Page .contact-map{border-radius:.5rem;overflow:hidden;background-color:var(--color-bg-card)}.Contact_Page .contact-map iframe{display:block}.Contact_Page .contact-additional-content{padding:3rem 0;background-color:var(--color-bg-card)}.Contact_Page .contact-additional-content .entry-content{max-width:800px;margin:0 auto}.Blog_Archive .archive-main,.Archive_Page .archive-main{padding:0}.Blog_Archive .archive-content-section,.Archive_Page .archive-content-section{padding:4rem 0;background-color:var(--color-bg-dark)}@media (max-width: 768px){.Blog_Archive .archive-content-section,.Archive_Page .archive-content-section{padding:3rem 0}}.Blog_Archive .archive-layout,.Archive_Page .archive-layout{display:grid;grid-template-columns:1fr 320px;gap:3rem}@media (max-width: 1024px){.Blog_Archive .archive-layout,.Archive_Page .archive-layout{grid-template-columns:1fr;gap:3rem}}.Blog_Archive .posts-grid,.Archive_Page .posts-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:1.5rem}@media (max-width: 768px){.Blog_Archive .posts-grid,.Archive_Page .posts-grid{grid-template-columns:1fr}}.Blog_Archive .no-posts-message,.Archive_Page .no-posts-message{text-align:center;padding:3rem;background-color:var(--color-bg-card);border-radius:.5rem}.Blog_Archive .no-posts-message h2,.Archive_Page .no-posts-message h2{font-family:var(--font-display);font-size:1.5rem;color:var(--color-text);margin-bottom:.5rem}.Blog_Archive .no-posts-message p,.Archive_Page .no-posts-message p{color:var(--color-text-muted);margin-bottom:0}.Blog_Archive .navigation.pagination,.Archive_Page .navigation.pagination{margin-top:3rem}.Blog_Archive .navigation.pagination .nav-links,.Archive_Page .navigation.pagination .nav-links{display:flex;justify-content:center;align-items:center;gap:.5rem;flex-wrap:wrap}.Blog_Archive .navigation.pagination .page-numbers,.Archive_Page .navigation.pagination .page-numbers{display:inline-flex;align-items:center;justify-content:center;min-width:40px;height:40px;padding:0 .75rem;background-color:var(--color-bg-card);color:var(--color-text-muted);border-radius:.25rem;font-size:.875rem}.Blog_Archive .navigation.pagination .page-numbers:hover,.Archive_Page .navigation.pagination .page-numbers:hover,.Blog_Archive .navigation.pagination .page-numbers.current,.Archive_Page .navigation.pagination .page-numbers.current{background-color:var(--color-accent);color:#fff}.Blog_Archive .navigation.pagination .page-numbers svg,.Archive_Page .navigation.pagination .page-numbers svg{width:16px;height:16px}.Blog_Archive .navigation.pagination .prev,.Blog_Archive .navigation.pagination .next,.Archive_Page .navigation.pagination .prev,.Archive_Page .navigation.pagination .next{display:inline-flex;align-items:center;gap:.5rem}@media (max-width: 1024px){.Blog_Archive .archive-sidebar,.Archive_Page .archive-sidebar{max-width:400px}}.property-inquiry-page-main .property-inquiry-section{padding:3rem 0}.property-inquiry-page-main .property-inquiry-grid{display:grid;gap:2rem}@media (min-width: 1024px){.property-inquiry-page-main .property-inquiry-grid{grid-template-columns:1fr 400px;gap:3rem}}.property-inquiry-page-main .property-inquiry-form-wrapper{background-color:var(--color-bg-card);padding:2rem;border-radius:.5rem;border:1px solid var(--color-border)}.property-inquiry-page-main .property-inquiry-preview .preview-title{font-family:Inter,Droid Sans,Arial,sans-serif;font-size:1.2rem;font-weight:700;color:var(--color-text);margin-bottom:1rem}.property-inquiry-page-main .wpcf7-form .form-group,.property-inquiry-page-main .property-inquiry-form .form-group,.property-inquiry-page-main .wpcf7-form .form-row,.property-inquiry-page-main .property-inquiry-form .form-row{margin-bottom:1.5rem}.property-inquiry-page-main .wpcf7-form .form-row-2col,.property-inquiry-page-main .property-inquiry-form .form-row-2col{display:grid;gap:1rem}@media (min-width: 640px){.property-inquiry-page-main .wpcf7-form .form-row-2col,.property-inquiry-page-main .property-inquiry-form .form-row-2col{grid-template-columns:1fr 1fr}}.property-inquiry-page-main .wpcf7-form .form-row-2col .form-group,.property-inquiry-page-main .property-inquiry-form .form-row-2col .form-group{margin-bottom:0}.property-inquiry-page-main .wpcf7-form label,.property-inquiry-page-main .property-inquiry-form label{display:block;font-size:.875rem;font-weight:500;color:var(--color-text);margin-bottom:.5rem}.property-inquiry-page-main .wpcf7-form input[type=text],.property-inquiry-page-main .wpcf7-form input[type=email],.property-inquiry-page-main .wpcf7-form input[type=tel],.property-inquiry-page-main .wpcf7-form textarea,.property-inquiry-page-main .property-inquiry-form input[type=text],.property-inquiry-page-main .property-inquiry-form input[type=email],.property-inquiry-page-main .property-inquiry-form input[type=tel],.property-inquiry-page-main .property-inquiry-form textarea{width:100%;padding:.75rem 1rem;background-color:var(--color-bg-dark);border:1px solid var(--color-border);border-radius:.375rem;color:var(--color-text);font-size:1rem}.property-inquiry-page-main .wpcf7-form input[type=text]:focus,.property-inquiry-page-main .wpcf7-form input[type=email]:focus,.property-inquiry-page-main .wpcf7-form input[type=tel]:focus,.property-inquiry-page-main .wpcf7-form textarea:focus,.property-inquiry-page-main .property-inquiry-form input[type=text]:focus,.property-inquiry-page-main .property-inquiry-form input[type=email]:focus,.property-inquiry-page-main .property-inquiry-form input[type=tel]:focus,.property-inquiry-page-main .property-inquiry-form textarea:focus{outline:none;border-color:var(--color-accent)}.property-inquiry-page-main .wpcf7-form input[type=text]::-moz-placeholder,.property-inquiry-page-main .wpcf7-form input[type=email]::-moz-placeholder,.property-inquiry-page-main .wpcf7-form input[type=tel]::-moz-placeholder,.property-inquiry-page-main .wpcf7-form textarea::-moz-placeholder,.property-inquiry-page-main .property-inquiry-form input[type=text]::-moz-placeholder,.property-inquiry-page-main .property-inquiry-form input[type=email]::-moz-placeholder,.property-inquiry-page-main .property-inquiry-form input[type=tel]::-moz-placeholder,.property-inquiry-page-main .property-inquiry-form textarea::-moz-placeholder{color:var(--color-text-muted)}.property-inquiry-page-main .wpcf7-form input[type=text]::placeholder,.property-inquiry-page-main .wpcf7-form input[type=email]::placeholder,.property-inquiry-page-main .wpcf7-form input[type=tel]::placeholder,.property-inquiry-page-main .wpcf7-form textarea::placeholder,.property-inquiry-page-main .property-inquiry-form input[type=text]::placeholder,.property-inquiry-page-main .property-inquiry-form input[type=email]::placeholder,.property-inquiry-page-main .property-inquiry-form input[type=tel]::placeholder,.property-inquiry-page-main .property-inquiry-form textarea::placeholder{color:var(--color-text-muted)}.property-inquiry-page-main .wpcf7-form textarea,.property-inquiry-page-main .property-inquiry-form textarea{resize:vertical;min-height:100px}.property-inquiry-page-main .wpcf7-form textarea.readonly-message,.property-inquiry-page-main .wpcf7-form textarea[readonly],.property-inquiry-page-main .wpcf7-form .readonly-message-display,.property-inquiry-page-main .property-inquiry-form textarea.readonly-message,.property-inquiry-page-main .property-inquiry-form textarea[readonly],.property-inquiry-page-main .property-inquiry-form .readonly-message-display{background-color:#9f37301a;border:1px solid var(--color-accent);border-radius:.375rem;color:var(--color-text);cursor:default;padding:.75rem 1rem;font-size:1rem;line-height:1.6;white-space:pre-wrap}.property-inquiry-page-main .wpcf7-form .required,.property-inquiry-page-main .property-inquiry-form .required{color:var(--color-accent)}.property-inquiry-page-main .wpcf7-form .btn-lg,.property-inquiry-page-main .property-inquiry-form .btn-lg{width:100%;padding:1rem 2rem;font-size:1rem}.inquiry-thank-you-page-main .thank-you-section{padding:3rem 0}.inquiry-thank-you-page-main .thank-you-content{max-width:600px;margin:0 auto;text-align:center}.inquiry-thank-you-page-main .thank-you-message{margin-bottom:2.5rem}.inquiry-thank-you-page-main .thank-you-message .thank-you-icon{color:var(--color-success);margin-bottom:1.5rem}.inquiry-thank-you-page-main .thank-you-message h2{font-family:var(--font-display);font-size:1.75rem;color:var(--color-text);margin-bottom:1rem}.inquiry-thank-you-page-main .thank-you-message p{color:var(--color-text-muted);line-height:1.7}.inquiry-thank-you-page-main .thank-you-property{margin-bottom:2.5rem}.inquiry-thank-you-page-main .thank-you-property h3{font-size:1rem;font-weight:500;color:var(--color-text-muted);margin-bottom:1rem}.inquiry-thank-you-page-main .thank-you-property .property-card-minimal{text-align:left}.inquiry-thank-you-page-main .thank-you-actions{display:flex;flex-direction:column;gap:1rem}@media (min-width: 480px){.inquiry-thank-you-page-main .thank-you-actions{flex-direction:row;justify-content:center}}.inquiry-thank-you-page-main .thank-you-actions .btn,.inquiry-thank-you-page-main .thank-you-actions .comment-form .form-submit input[type=submit],.comment-form .form-submit .inquiry-thank-you-page-main .thank-you-actions input[type=submit]{display:inline-flex;align-items:center;justify-content:center;gap:.5rem}.inquiry-thank-you-page-main .thank-you-actions .btn-outline{background-color:transparent;border:2px solid var(--color-border);color:var(--color-text)}.inquiry-thank-you-page-main .thank-you-actions .btn-outline:hover{border-color:var(--color-accent);color:var(--color-accent)}.property-card-minimal{background-color:var(--color-bg-card);border-radius:.5rem;overflow:hidden;border:1px solid var(--color-border)}.property-card-minimal .property-card-minimal-link{display:flex;text-decoration:none;color:inherit}.property-card-minimal .property-card-minimal-link:hover .property-card-minimal-image img{transform:scale(1.05)}.property-card-minimal .property-card-minimal-image{position:relative;width:140px;min-width:140px;height:120px;overflow:hidden;background-color:var(--color-bg-dark)}.property-card-minimal .property-card-minimal-image img{width:100%;height:100%;-o-object-fit:cover;object-fit:cover;transition:transform .3s ease}.property-card-minimal .property-card-minimal-image .badge{position:absolute;top:8px;left:8px;font-size:.625rem;padding:.25rem .5rem}.property-card-minimal .property-card-minimal-placeholder{width:100%;height:100%;display:flex;align-items:center;justify-content:center;color:var(--color-text-muted)}.property-card-minimal .property-card-minimal-content{padding:1rem;flex:1;display:flex;flex-direction:column;justify-content:center}.property-card-minimal .property-card-minimal-price{font-family:var(--font-display);font-size:1.25rem;color:var(--color-text);margin-bottom:.25rem}.property-card-minimal .property-card-minimal-address{margin-bottom:.5rem}.property-card-minimal .property-card-minimal-address .street{display:block;font-size:.875rem;color:var(--color-text);font-weight:500}.property-card-minimal .property-card-minimal-address .city-state{display:block;font-size:.75rem;color:var(--color-text-muted)}.property-card-minimal .property-card-minimal-meta{display:flex;gap:.75rem;font-size:.75rem;color:var(--color-text-muted);margin-bottom:.25rem}.property-card-minimal .property-card-minimal-meta span{display:flex;align-items:center;gap:.25rem}.property-card-minimal .property-card-minimal-mls{font-size:.625rem;color:var(--color-text-muted);text-transform:uppercase;letter-spacing:.05em}.badge-active{background-color:var(--color-success);color:#fff}.badge-pending{background-color:var(--color-warning);color:#000}.badge-sold{background-color:var(--color-sold);color:#fff}.contact-agent-page-main .contact-agent-section{padding:3rem 0}.contact-agent-page-main .contact-agent-grid{display:grid;gap:2rem}@media (min-width: 1024px){.contact-agent-page-main .contact-agent-grid{grid-template-columns:1fr 360px;gap:3rem}}.contact-agent-page-main .contact-agent-form-wrapper{background-color:var(--color-bg-card);padding:2rem;border-radius:.5rem;border:1px solid var(--color-border)}.contact-agent-page-main .contact-agent-preview .preview-title{font-family:Inter,Droid Sans,Arial,sans-serif;font-size:1rem;font-weight:600;color:var(--color-text-muted);margin-bottom:1rem;text-transform:uppercase;letter-spacing:.05em}.contact-agent-page-main .agent-preview-card{background-color:var(--color-bg-card);border-radius:.5rem;border:1px solid var(--color-border);overflow:hidden}.contact-agent-page-main .agent-preview-photo{aspect-ratio:1;overflow:hidden;background-color:var(--color-bg-dark)}.contact-agent-page-main .agent-preview-photo img{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.contact-agent-page-main .agent-preview-placeholder{width:100%;height:100%;display:flex;align-items:center;justify-content:center;color:var(--color-text-muted)}.contact-agent-page-main .agent-preview-info{padding:1.25rem}.contact-agent-page-main .agent-preview-title{display:block;font-size:.75rem;text-transform:uppercase;letter-spacing:.1em;color:var(--color-accent);margin-bottom:.25rem;font-weight:600}.contact-agent-page-main .agent-preview-name{font-family:var(--font-display);font-size:1.375rem;color:var(--color-text);margin-bottom:1rem}.contact-agent-page-main .agent-preview-contact{display:flex;flex-direction:column;gap:.5rem}.contact-agent-page-main .agent-preview-link{display:inline-flex;align-items:center;gap:.5rem;font-size:.875rem;color:var(--color-text-muted);text-decoration:none}.contact-agent-page-main .agent-preview-link svg{color:var(--color-accent);flex-shrink:0}.contact-agent-page-main .agent-preview-link:hover{color:var(--color-accent-light)}.contact-agent-page-main .agent-preview-profile-link{display:flex;align-items:center;justify-content:center;gap:.5rem;padding:1rem;background-color:var(--color-bg-dark);border-top:1px solid var(--color-border);font-size:.875rem;font-weight:600;color:var(--color-accent);text-decoration:none;text-transform:uppercase;letter-spacing:.05em}.contact-agent-page-main .agent-preview-profile-link:hover{color:var(--color-accent-hover);background-color:#9f37301a}.contact-agent-page-main .wpcf7-form .form-group,.contact-agent-page-main .contact-agent-form .form-group,.contact-agent-page-main .wpcf7-form .form-row,.contact-agent-page-main .contact-agent-form .form-row{margin-bottom:1.5rem}.contact-agent-page-main .wpcf7-form .form-row-2col,.contact-agent-page-main .contact-agent-form .form-row-2col{display:grid;gap:1rem}@media (min-width: 640px){.contact-agent-page-main .wpcf7-form .form-row-2col,.contact-agent-page-main .contact-agent-form .form-row-2col{grid-template-columns:1fr 1fr}}.contact-agent-page-main .wpcf7-form .form-row-2col .form-group,.contact-agent-page-main .contact-agent-form .form-row-2col .form-group{margin-bottom:0}.contact-agent-page-main .wpcf7-form label,.contact-agent-page-main .contact-agent-form label{display:block;font-size:.875rem;font-weight:500;color:var(--color-text);margin-bottom:.5rem}.contact-agent-page-main .wpcf7-form input[type=text],.contact-agent-page-main .wpcf7-form input[type=email],.contact-agent-page-main .wpcf7-form input[type=tel],.contact-agent-page-main .wpcf7-form textarea,.contact-agent-page-main .contact-agent-form input[type=text],.contact-agent-page-main .contact-agent-form input[type=email],.contact-agent-page-main .contact-agent-form input[type=tel],.contact-agent-page-main .contact-agent-form textarea{width:100%;padding:.75rem 1rem;background-color:var(--color-bg-dark);border:1px solid var(--color-border);border-radius:.375rem;color:var(--color-text);font-size:1rem}.contact-agent-page-main .wpcf7-form input[type=text]:focus,.contact-agent-page-main .wpcf7-form input[type=email]:focus,.contact-agent-page-main .wpcf7-form input[type=tel]:focus,.contact-agent-page-main .wpcf7-form textarea:focus,.contact-agent-page-main .contact-agent-form input[type=text]:focus,.contact-agent-page-main .contact-agent-form input[type=email]:focus,.contact-agent-page-main .contact-agent-form input[type=tel]:focus,.contact-agent-page-main .contact-agent-form textarea:focus{outline:none;border-color:var(--color-accent)}.contact-agent-page-main .wpcf7-form input[type=text]::-moz-placeholder,.contact-agent-page-main .wpcf7-form input[type=email]::-moz-placeholder,.contact-agent-page-main .wpcf7-form input[type=tel]::-moz-placeholder,.contact-agent-page-main .wpcf7-form textarea::-moz-placeholder,.contact-agent-page-main .contact-agent-form input[type=text]::-moz-placeholder,.contact-agent-page-main .contact-agent-form input[type=email]::-moz-placeholder,.contact-agent-page-main .contact-agent-form input[type=tel]::-moz-placeholder,.contact-agent-page-main .contact-agent-form textarea::-moz-placeholder{color:var(--color-text-muted)}.contact-agent-page-main .wpcf7-form input[type=text]::placeholder,.contact-agent-page-main .wpcf7-form input[type=email]::placeholder,.contact-agent-page-main .wpcf7-form input[type=tel]::placeholder,.contact-agent-page-main .wpcf7-form textarea::placeholder,.contact-agent-page-main .contact-agent-form input[type=text]::placeholder,.contact-agent-page-main .contact-agent-form input[type=email]::placeholder,.contact-agent-page-main .contact-agent-form input[type=tel]::placeholder,.contact-agent-page-main .contact-agent-form textarea::placeholder{color:var(--color-text-muted)}.contact-agent-page-main .wpcf7-form textarea,.contact-agent-page-main .contact-agent-form textarea{resize:vertical;min-height:100px}.contact-agent-page-main .wpcf7-form .readonly-message-display,.contact-agent-page-main .contact-agent-form .readonly-message-display{background-color:#9f37301a;border:1px solid var(--color-accent);border-radius:.375rem;color:var(--color-text);cursor:default;padding:.75rem 1rem;font-size:1rem;line-height:1.6;white-space:pre-wrap}.contact-agent-page-main .wpcf7-form .required,.contact-agent-page-main .contact-agent-form .required{color:var(--color-accent)}.contact-agent-page-main .wpcf7-form .btn-lg,.contact-agent-page-main .contact-agent-form .btn-lg{width:100%;padding:1rem 2rem;font-size:1rem}.sidebar-widgets{display:flex;flex-direction:column;gap:2rem}.sidebar-widget{background-color:var(--color-bg-card);padding:1.5rem;border-radius:.5rem}.widget-title{font-family:var(--font-display);font-size:1.125rem;color:var(--color-text);margin-bottom:1rem;padding-bottom:.75rem;border-bottom:1px solid var(--color-border)}.widget-search .search-form{display:flex;gap:.5rem}.widget-search .search-field{flex:1}.widget-search .search-submit{flex-shrink:0;padding:.75rem 1rem;background-color:var(--color-accent);color:#fff;border:none;border-radius:.25rem;cursor:pointer}.widget-search .search-submit:hover{background-color:var(--color-accent-hover)}.category-list{list-style:none;margin:0;padding:0}.category-list li{padding:.5rem 0;border-bottom:1px solid var(--color-border)}.category-list li:last-child{border-bottom:none;padding-bottom:0}.category-list a{display:flex;justify-content:space-between;align-items:center;color:var(--color-text-muted);font-size:.9375rem}.category-list a:hover{color:var(--color-accent-light)}.category-list .count{font-size:.8125rem;color:var(--color-sold)}.recent-posts-list{list-style:none;margin:0;padding:0}.recent-posts-list li{padding:.75rem 0;border-bottom:1px solid var(--color-border)}.recent-posts-list li:last-child{border-bottom:none;padding-bottom:0}.recent-posts-list a{display:block;color:var(--color-text);font-size:.9375rem;font-weight:500;line-height:1.4;margin-bottom:.25rem}.recent-posts-list a:hover{color:var(--color-accent-light)}.recent-posts-list .post-date{display:block;font-size:.8125rem;color:var(--color-sold)}.widget-cta{background-color:var(--color-accent);text-align:center}.widget-cta .widget-title{color:#fff;border-bottom-color:#fff3}.widget-cta p{color:#ffffffe6;font-size:.9375rem;margin-bottom:1rem}.widget-cta .btn-primary,.widget-cta .comment-form .form-submit input[type=submit],.comment-form .form-submit .widget-cta input[type=submit]{background-color:#fff;color:var(--color-accent)}.widget-cta .btn-primary:hover,.widget-cta .comment-form .form-submit input[type=submit]:hover,.comment-form .form-submit .widget-cta input[type=submit]:hover{background-color:var(--color-text)}.widget-cta .btn-small{padding:.5rem 1rem;font-size:.8125rem}.full-width-main{padding:0}.full-width-hero{width:100%;max-height:50vh;overflow:hidden}.full-width-hero img{width:100%;height:auto;-o-object-fit:cover;object-fit:cover}.full-width-content .page-header{padding:3rem 0 2rem}.full-width-content .page-title{font-size:2.5rem;margin-bottom:0}@media (max-width: 768px){.full-width-content .page-title{font-size:2rem}}.full-width-content .entry-content--wide{padding-bottom:4rem}.full-width-content .entry-content--wide>.alignfull{max-width:none}.full-width-content .entry-content--wide>.alignwide{max-width:calc(var(--container-max) + 200px);margin-left:auto;margin-right:auto}.landing-page-site{display:flex;flex-direction:column;min-height:100vh}.landing-header{padding:1rem 0;background-color:var(--color-bg-card);border-bottom:1px solid var(--color-border)}.landing-header-content{text-align:center}.landing-logo{display:inline-block}.landing-logo .custom-logo{max-height:40px;width:auto}.landing-logo .site-title{font-family:var(--font-display);font-size:1.5rem;color:var(--color-text)}.landing-main{flex:1;padding:0}.landing-content .entry-content>*:first-child{margin-top:0}.landing-content .entry-content>.alignfull{max-width:none;width:100vw;margin-left:calc(-50vw + 50%)}.landing-footer{padding:1.5rem 0;background-color:var(--color-bg-card);border-top:1px solid var(--color-border)}.landing-footer-text{text-align:center;font-size:.875rem;color:var(--color-text-muted);margin:0}.landing-footer-links{display:inline-block;margin-left:1rem;padding-left:1rem;border-left:1px solid var(--color-border)}.landing-footer-links a{color:var(--color-text-muted)}.landing-footer-links a:hover{color:var(--color-accent-light)}.Search_Page .search-main{padding:0}.Search_Page .search-content-section{padding:4rem 0;background-color:var(--color-bg-dark)}@media (max-width: 768px){.Search_Page .search-content-section{padding:3rem 0}}.Search_Page .search-form-wrapper{max-width:600px;margin:0 auto 2rem}.Search_Page .search-form-wrapper .search-form{display:flex;gap:.5rem}.Search_Page .search-form-wrapper .search-field{flex:1;padding:1rem 1.25rem;font-size:1rem}.Search_Page .search-form-wrapper .search-submit{padding:1rem 1.5rem;background-color:var(--color-accent);color:#fff;border:none;border-radius:.25rem;font-weight:600;cursor:pointer}.Search_Page .search-form-wrapper .search-submit:hover{background-color:var(--color-accent-hover)}.Search_Page .search-results-count{text-align:center;color:var(--color-text-muted);margin-bottom:2rem}.Search_Page .search-results{display:flex;flex-direction:column;gap:1.5rem;max-width:800px;margin:0 auto}.Search_Page .search-result-item{display:flex;gap:1.5rem;padding:1.5rem;background-color:var(--color-bg-card);border-radius:.5rem}@media (max-width: 640px){.Search_Page .search-result-item{flex-direction:column;gap:1rem}}.Search_Page .search-result-image{flex-shrink:0}.Search_Page .search-result-image img{width:120px;height:90px;-o-object-fit:cover;object-fit:cover;border-radius:.25rem}@media (max-width: 640px){.Search_Page .search-result-image img{width:100%;height:200px}}.Search_Page .search-result-content{flex:1}.Search_Page .search-result-meta{display:flex;align-items:center;gap:1rem;margin-bottom:.5rem;font-size:.8125rem}.Search_Page .search-result-type{display:inline-block;padding:.125rem .5rem;background-color:var(--color-accent);color:#fff;border-radius:.25rem;font-size:.6875rem;text-transform:uppercase;letter-spacing:.05em}.Search_Page .search-result-date{color:var(--color-text-muted)}.Search_Page .search-result-title{font-family:var(--font-display);font-size:1.25rem;margin-bottom:.5rem}.Search_Page .search-result-title a{color:var(--color-text)}.Search_Page .search-result-title a:hover{color:var(--color-accent-light)}.Search_Page .search-result-excerpt{font-size:.9375rem;color:var(--color-text-muted);line-height:1.6;margin-bottom:.75rem}.Search_Page .search-result-excerpt p{margin:0}.Search_Page .search-result-link{display:inline-flex;align-items:center;gap:.5rem;font-size:.875rem;font-weight:600;color:var(--color-accent-light)}.Search_Page .search-result-link:hover{color:var(--color-accent-hover)}.Search_Page .no-results-message{text-align:center;padding:3rem;background-color:var(--color-bg-card);border-radius:.5rem;max-width:500px;margin:0 auto}.Search_Page .no-results-message h2{font-family:var(--font-display);font-size:1.5rem;color:var(--color-text);margin-bottom:.5rem}.Search_Page .no-results-message p{color:var(--color-text-muted);margin-bottom:1.5rem}.Search_Page .no-results-actions{display:flex;justify-content:center;gap:1rem;flex-wrap:wrap}.Search_Page .navigation.pagination{margin-top:3rem;max-width:800px;margin-left:auto;margin-right:auto}.Search_Page .navigation.pagination .nav-links{display:flex;justify-content:center;align-items:center;gap:.5rem;flex-wrap:wrap}.Search_Page .navigation.pagination .page-numbers{display:inline-flex;align-items:center;justify-content:center;min-width:40px;height:40px;padding:0 .75rem;background-color:var(--color-bg-card);color:var(--color-text-muted);border-radius:.25rem;font-size:.875rem}.Search_Page .navigation.pagination .page-numbers:hover,.Search_Page .navigation.pagination .page-numbers.current{background-color:var(--color-accent);color:#fff}.communities-page-main{padding:0}.communities-grid-section{padding:4rem 0;background-color:var(--color-bg-card)}.communities-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:1.5rem}@media (max-width: 1024px){.communities-grid{grid-template-columns:repeat(3,1fr)}}@media (max-width: 768px){.communities-grid{grid-template-columns:repeat(2,1fr)}}@media (max-width: 480px){.communities-grid{grid-template-columns:1fr}}.community-card{display:block;background-color:var(--color-bg-dark);border:1px solid var(--color-border);border-radius:.5rem;padding:1.5rem;text-decoration:none;transition:border-color .2s ease,transform .2s ease}.community-card:hover{border-color:var(--color-accent);transform:translateY(-2px)}.community-card:hover .community-card-arrow{transform:translate(4px)}.community-card-content{display:flex;flex-direction:column;gap:.5rem}.community-card-title{font-family:var(--font-display);font-size:1.25rem;color:var(--color-text);margin:0}.community-card-count{font-size:.875rem;color:var(--color-text-muted)}.community-card-arrow{margin-top:.5rem;color:var(--color-accent);transition:transform .2s ease}.communities-about-section{padding:4rem 0;background-color:var(--color-bg-dark)}.communities-about-content{max-width:800px;margin:0 auto;text-align:center}.communities-about-content h2{font-family:var(--font-display);font-size:2rem;color:var(--color-text);margin-bottom:1.5rem}.communities-about-content p{font-size:1.125rem;color:var(--color-text-muted);line-height:1.7;margin-bottom:1rem}.communities-about-content p:last-child{margin-bottom:0}.no-communities-message{text-align:center;color:var(--color-text-muted);font-size:1.125rem;padding:3rem 0}.community-page-main{padding:0}.community-about-section{padding:4rem 0;background-color:var(--color-bg-card)}.community-about-content{max-width:800px;margin:0 auto}.community-about-content h2,.community-about-content h3,.community-about-content h4{font-family:var(--font-display);color:var(--color-text)}.community-about-content p{font-size:1.125rem;color:var(--color-text-muted);line-height:1.7}.community-about-content ul,.community-about-content ol{color:var(--color-text-muted);margin-bottom:1rem;padding-left:1.5rem}.community-about-content li{margin-bottom:.5rem}.community-properties-section{padding:4rem 0;background-color:var(--color-bg-dark)}.community-properties-section .section-header{text-align:center;margin-bottom:3rem}.community-properties-section .section-title{font-family:var(--font-display);font-size:2.25rem;color:var(--color-text);margin-bottom:.75rem}.community-properties-section .section-subtitle{font-size:1.125rem;color:var(--color-text-muted)}.community-properties-section .section-footer{text-align:center;margin-top:2.5rem}.community-properties-section .property-grid--3col{display:grid;grid-template-columns:repeat(3,1fr);gap:1.5rem}@media (max-width: 1024px){.community-properties-section .property-grid--3col{grid-template-columns:repeat(2,1fr)}}@media (max-width: 640px){.community-properties-section .property-grid--3col{grid-template-columns:1fr}}.community-properties-section .no-properties-message{text-align:center;color:var(--color-text-muted);font-size:1.125rem;padding:3rem 0}.community-properties-section .no-properties-message a{color:var(--color-accent-light)}.community-properties-section .no-properties-message a:hover{color:var(--color-accent-hover)}.resources-page-main{padding:0}.resources-featured-section{padding:4rem 0;background-color:var(--color-bg-dark)}.resources-featured-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:2rem}@media (max-width: 768px){.resources-featured-grid{grid-template-columns:1fr}}.resource-featured-card{position:relative;display:flex;flex-direction:column;background-color:var(--color-bg-card);border:1px solid var(--color-border);border-radius:.5rem;overflow:hidden;cursor:pointer}.resource-featured-card:hover{border-color:var(--color-accent)}.resource-featured-card:hover .resource-featured-visual{background-size:110%}.resource-featured-card:hover .btn,.resource-featured-card:hover .comment-form .form-submit input[type=submit],.comment-form .form-submit .resource-featured-card:hover input[type=submit]{background-color:var(--color-accent-hover)}@media (min-width: 640px){.resource-featured-card{flex-direction:row}}.resource-card-link-overlay{position:absolute;top:0;left:0;right:0;bottom:0;z-index:1}.resource-featured-visual{position:relative;display:flex;align-items:center;justify-content:center;min-height:200px;background-size:100%;background-position:center}@media (min-width: 640px){.resource-featured-visual{width:200px;min-height:280px;flex-shrink:0}}.resource-featured-visual:before{content:"";position:absolute;top:0;left:0;right:0;bottom:0}.resource-featured-card--buyer .resource-featured-visual{background:linear-gradient(135deg,#1a1a1a,#2d1f1f,#3d2a2a)}.resource-featured-card--buyer .resource-featured-visual:before{background:radial-gradient(circle at 30% 70%,rgba(159,55,48,.2) 0%,transparent 50%)}.resource-featured-card--seller .resource-featured-visual{background:linear-gradient(135deg,#1a1a1a,#1f2d1f,#2a3d2a)}.resource-featured-card--seller .resource-featured-visual:before{background:radial-gradient(circle at 70% 30%,rgba(46,125,50,.2) 0%,transparent 50%)}.resource-featured-badge{position:absolute;top:1rem;left:1rem;padding:.25rem .75rem;background-color:var(--color-accent);color:#fff;font-size:.625rem;font-weight:600;text-transform:uppercase;letter-spacing:.1em;border-radius:.25rem}.resource-featured-icon-large{position:relative;display:flex;align-items:center;justify-content:center;width:120px;height:120px;background-color:#0000004d;border-radius:50%;color:var(--color-accent)}@media (max-width: 639px){.resource-featured-icon-large{width:100px;height:100px}.resource-featured-icon-large svg{width:60px;height:60px}}.resource-featured-content{flex:1;padding:1.5rem;display:flex;flex-direction:column}@media (min-width: 640px){.resource-featured-content{padding:2rem}}.resource-featured-title{font-family:var(--font-display);font-size:1.5rem;color:var(--color-text);margin-bottom:.75rem}@media (min-width: 640px){.resource-featured-title{font-size:1.75rem}}.resource-featured-description{font-size:.9375rem;color:var(--color-text-muted);line-height:1.6;margin-bottom:1rem}.resource-featured-highlights{list-style:none;padding:0;margin:0 0 1.5rem;display:grid;grid-template-columns:repeat(2,1fr);gap:.5rem}.resource-featured-highlights li{display:flex;align-items:center;gap:.5rem;font-size:.8125rem;color:var(--color-text-muted)}.resource-featured-highlights li:before{content:"";width:6px;height:6px;background-color:var(--color-accent);border-radius:50%;flex-shrink:0}@media (max-width: 480px){.resource-featured-highlights{grid-template-columns:1fr}}.resources-additional-section{padding:4rem 0;background-color:var(--color-bg-dark)}.resources-additional-section .section-header{text-align:center;margin-bottom:3rem}.resources-additional-section .section-title{font-family:var(--font-display);font-size:2.25rem;color:var(--color-text);margin-bottom:.75rem}.resources-additional-section .section-subtitle{font-size:1.125rem;color:var(--color-text-muted)}.resources-additional-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:1.5rem}@media (max-width: 992px){.resources-additional-grid{grid-template-columns:repeat(2,1fr)}}@media (max-width: 640px){.resources-additional-grid{grid-template-columns:1fr}}.resource-card{position:relative;background-color:var(--color-bg-card);border:1px solid var(--color-border);border-radius:.5rem;padding:1.5rem;cursor:pointer}.resource-card:hover{border-color:var(--color-accent)}.resource-card-icon{display:flex;align-items:center;justify-content:center;width:56px;height:56px;margin-bottom:1rem;background-color:#9f37301a;border-radius:.5rem;color:var(--color-accent)}.resource-card-title{font-family:var(--font-display);font-size:1.25rem;color:var(--color-text);margin-bottom:.5rem}.resource-card-description{font-size:.875rem;color:var(--color-text-muted);line-height:1.5;margin-bottom:0}.resource-page-main{padding:0}.resource-content-section{padding:4rem 0;background-color:var(--color-bg-card)}.resource-content-layout{display:grid;grid-template-columns:1fr 320px;gap:3rem}@media (max-width: 992px){.resource-content-layout{grid-template-columns:1fr}}.resource-content h2,.resource-content h3,.resource-content h4{font-family:var(--font-display);color:var(--color-text);margin-top:2rem;margin-bottom:1rem}.resource-content h2:first-child,.resource-content h3:first-child,.resource-content h4:first-child{margin-top:0}.resource-content h2{font-size:1.75rem}.resource-content h3{font-size:1.5rem}.resource-content h4{font-size:1.25rem}.resource-content p{font-size:1.125rem;color:var(--color-text-muted);line-height:1.7}.resource-content ul,.resource-content ol{color:var(--color-text-muted);margin-bottom:1.5rem;padding-left:1.5rem;font-size:1.125rem;line-height:1.7}.resource-content li{margin-bottom:.5rem}.resource-content blockquote{border-left:4px solid var(--color-accent);padding-left:1.5rem;margin:1.5rem 0;font-style:italic;color:var(--color-text-muted)}@media (max-width: 992px){.resource-sidebar{order:-1}}.resource-sidebar-sticky{position:sticky;top:100px}@media (max-width: 992px){.resource-sidebar-sticky{position:static}}.resource-sidebar-card{background-color:var(--color-bg-dark);border:1px solid var(--color-border);border-radius:.5rem;padding:1.5rem;margin-bottom:1.5rem}.resource-sidebar-card h3{font-family:var(--font-display);font-size:1.25rem;color:var(--color-text);margin-bottom:.75rem}.resource-sidebar-card p{font-size:.875rem;color:var(--color-text-muted);margin-bottom:1rem}.resource-sidebar-phone{text-align:center;margin-top:1rem;margin-bottom:0}.resource-sidebar-phone a{color:var(--color-accent-light)}.resource-sidebar-phone a:hover{color:var(--color-accent-hover)}.resource-sidebar-links{list-style:none;padding:0;margin:0}.resource-sidebar-links li{margin-bottom:.5rem}.resource-sidebar-links li:last-child{margin-bottom:0}.resource-sidebar-links a{color:var(--color-text-muted);font-size:.875rem}.resource-sidebar-links a:hover{color:var(--color-accent-light)}.mortgage-calculator-main{padding-bottom:4rem}.mortgage-calculator-layout{display:grid;grid-template-columns:1fr;gap:2rem;padding-top:2rem}@media (min-width: 1024px){.mortgage-calculator-layout{grid-template-columns:1fr 350px;gap:3rem}}.calculator-widget{background-color:var(--color-bg-card);border-radius:.5rem;padding:2rem;margin-bottom:2rem}@media (max-width: 640px){.calculator-widget{padding:1.5rem}}.calculator-form{display:flex;flex-direction:column;gap:2rem}@media (min-width: 768px){.calculator-form{flex-direction:row;gap:3rem}}.calculator-inputs{flex:1;display:flex;flex-direction:column;gap:1.25rem}.input-group label{display:block;font-family:Times New Roman,Times,serif;font-size:.875rem;font-weight:700;color:var(--color-text);margin-bottom:.5rem}.input-row{display:flex;gap:.75rem}.input-row .input-currency{flex:2}.input-row .input-percent{flex:1;min-width:80px}.input-wrapper{position:relative;display:flex;align-items:center}.input-wrapper input,.input-wrapper select{width:100%;padding:.75rem 1rem;background-color:#000;border:1px solid var(--color-border);border-radius:.25rem;color:var(--color-text);font-size:1rem;font-family:inherit}.input-wrapper input:focus,.input-wrapper select:focus{outline:none;border-color:var(--color-accent)}.input-wrapper select{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23B0B0B0' stroke-width='2'%3E%3Cpolyline points='6 9 12 15 18 9'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right .75rem center;padding-right:2.5rem;cursor:pointer}.input-wrapper.input-currency input{padding-left:1.75rem}.input-wrapper.input-currency .input-prefix{position:absolute;left:.75rem;color:var(--color-text-muted);pointer-events:none}.input-wrapper.input-percent input{padding-right:2rem}.input-wrapper.input-percent .input-suffix{position:absolute;right:.75rem;color:var(--color-text-muted);pointer-events:none}.calculator-results{flex:1;display:flex;flex-direction:column;justify-content:center}@media (min-width: 768px){.calculator-results{padding-left:2rem;border-left:1px solid var(--color-border)}}@media (max-width: 767px){.calculator-results{padding-top:1.5rem;border-top:1px solid var(--color-border)}}.result-main{text-align:center;margin-bottom:1.5rem}.result-main .result-label{display:block;font-size:.875rem;color:var(--color-text-muted);margin-bottom:.5rem}@media (min-width: 1024px){.result-main .result-label{font-size:1.4rem}}.result-main .result-value{display:block;font-family:var(--font-display);font-size:2.5rem;color:var(--color-accent-light);line-height:1.2}@media (max-width: 640px){.result-main .result-value{font-size:2rem}}@media (min-width: 1024px){.result-main .result-value{font-size:3.125rem}}.result-breakdown{display:flex;flex-direction:column;gap:.75rem}.breakdown-item{display:flex;justify-content:space-between;align-items:center;padding:.5rem 0;border-bottom:1px solid var(--color-border)}.breakdown-item:last-child{border-bottom:none}.breakdown-item .breakdown-label{font-size:.875rem;color:var(--color-text-muted)}.breakdown-item .breakdown-value{font-size:.9375rem;font-weight:600;color:var(--color-text)}.calculator-guide,.calculator-notes{margin-bottom:2rem}.calculator-guide .section-title,.calculator-notes .section-title{font-size:1.25rem;margin-bottom:1.25rem;padding-bottom:.75rem;border-bottom:1px solid var(--color-border)}.guide-content p,.notes-content p{color:var(--color-text-muted);line-height:1.7;margin-bottom:1rem}.guide-list,.notes-list{list-style:none;margin:0;padding:0}.guide-list li,.notes-list li{position:relative;padding-left:1.5rem;margin-bottom:.75rem;color:var(--color-text-muted);line-height:1.6}.guide-list li:before,.notes-list li:before{content:"";position:absolute;left:0;top:.5rem;width:6px;height:6px;background-color:var(--color-accent);border-radius:50%}.guide-list li strong,.notes-list li strong{color:var(--color-text)}.mortgage-calculator-sidebar{display:flex;flex-direction:column;gap:1.5rem}@media (min-width: 1024px){.mortgage-calculator-sidebar{align-self:start}}.mortgage-calculator-sidebar .sidebar-widget{background-color:var(--color-bg-card);border-radius:.5rem;padding:1.5rem}.mortgage-calculator-sidebar .widget-title{font-family:Times New Roman,Times,serif;font-size:18px;font-weight:700;margin-bottom:1rem;padding-bottom:.75rem;border-bottom:1px solid var(--color-border)}.tips-list{list-style:none;margin:0;padding:0}.tips-list li{position:relative;padding-left:1.25rem;margin-bottom:.875rem;font-size:.9375rem;color:var(--color-text-muted);line-height:1.5}.tips-list li:before{content:"";position:absolute;left:0;top:.5rem;width:5px;height:5px;background-color:var(--color-accent);border-radius:50%}.tips-list li:last-child{margin-bottom:0}.help-text{font-size:.9375rem;color:var(--color-text-muted);line-height:1.6;margin-bottom:1.25rem}.btn-block{display:block;width:100%;text-align:center}.resource-links{list-style:none;margin:0;padding:0}.resource-links li{margin-bottom:.625rem}.resource-links li:last-child{margin-bottom:0}.resource-links a{color:var(--color-text-muted);font-size:.9375rem;text-decoration:none}.resource-links a:hover{color:var(--color-accent-light)}.property-card{display:flex;flex-direction:column;height:100%;max-height:525px;background-color:var(--color-bg-dark);border:1px solid var(--color-accent);border-radius:.5rem;overflow:hidden;position:relative;cursor:pointer;transition:transform .2s ease,box-shadow .2s ease,border-color .2s ease}.property-card:hover{border-color:var(--color-accent-hover);transform:translateY(-4px);box-shadow:0 12px 24px #0006}.property-card:hover .property-card-link{color:var(--color-accent-hover)}.property-card-link-overlay{position:absolute;top:0;left:0;right:0;bottom:0;z-index:1}.property-card-image{display:block;position:relative;aspect-ratio:16/10;overflow:hidden;background-color:var(--color-bg-dark);background-size:cover;background-position:center;background-repeat:no-repeat}.property-card-image.has-image{background-color:var(--color-bg-card)}.property-card-image.is-loaded .property-card-spinner{display:none}.property-card-image img{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.property-card-spinner{position:absolute;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;background-color:var(--color-bg-card)}.property-card-spinner .spinner{width:32px;height:32px;border:3px solid var(--color-border);border-top-color:var(--color-accent);border-radius:50%;animation:card-spin .8s linear infinite}@keyframes card-spin{to{transform:rotate(360deg)}}.property-card-placeholder{width:100%;height:100%;display:flex;align-items:center;justify-content:center;background-color:var(--color-bg-dark);color:var(--color-border)}.property-card-badge{position:absolute;top:.75rem;left:.75rem}.property-card-content{display:flex;flex-direction:column;flex-grow:1;padding:1.25rem}.property-card-price{font-family:var(--font-display);font-size:1.5rem;color:var(--color-text);margin-bottom:.5rem}.property-card-title{font-family:var(--font-body);font-size:1rem;font-weight:500;line-height:1.4;margin-bottom:.75rem;color:var(--color-text-muted)}.property-card-specs{display:flex;flex-wrap:wrap;gap:1rem;list-style:none;margin:0 0 .75rem;padding:0}.spec-item{display:flex;align-items:center;gap:.375rem;font-size:.875rem;color:var(--color-text-muted)}.spec-item svg{color:var(--color-accent);flex-shrink:0}.property-card-excerpt{flex-grow:1;font-size:.875rem;color:var(--color-sold);margin-bottom:1rem;line-height:1.5}.property-card-link{display:inline-flex;align-items:center;gap:.5rem;font-size:.875rem;font-weight:600;color:var(--color-accent-light);text-decoration:none;margin-top:auto}.property-card-link:hover{color:var(--color-accent-hover)}.property-card-link svg{width:16px;height:16px}.properties-grid{display:grid;grid-template-columns:1fr;gap:1.5rem;padding:1.5rem 0}@media (min-width: 640px){.properties-grid{grid-template-columns:repeat(2,1fr)}}@media (min-width: 1024px){.properties-grid{grid-template-columns:repeat(3,1fr);gap:2rem}}.properties-meta{display:flex;justify-content:space-between;align-items:center;padding:1rem 0;border-bottom:1px solid var(--color-border)}.properties-count{font-size:.9375rem;color:var(--color-text-muted)}.properties-count strong{color:var(--color-text)}.no-properties{text-align:center;padding:4rem 0;color:var(--color-text-muted)}.no-properties h3{color:var(--color-text);margin-bottom:.5rem}.no-properties p{margin-bottom:1.5rem}.archive-hero{position:relative;background-color:var(--color-bg-card);background-size:cover;background-position:center;background-repeat:no-repeat;padding:3rem 0}.archive-hero.has-background{padding:4rem 0}@media (max-width: 768px){.archive-hero.has-background{padding:3rem 0}}.archive-hero .container{position:relative;z-index:2}.archive-hero-overlay{position:absolute;top:0;left:0;right:0;bottom:0;background:linear-gradient(to bottom,#0a0a0abf,#0a0a0aa6);z-index:1}.archive-hero-title{margin-bottom:.5rem}.has-background .archive-hero-title{text-shadow:0 2px 4px rgba(0,0,0,.3)}.archive-hero-subtitle{font-size:1.125rem;color:var(--color-text-muted);margin-bottom:0;max-width:600px}.has-background .archive-hero-subtitle{color:var(--color-text);opacity:.9;text-shadow:0 1px 2px rgba(0,0,0,.3)}.view-toggle{display:flex;gap:.5rem;margin-bottom:1.5rem}.view-toggle-btn{display:inline-flex;align-items:center;gap:.5rem;padding:.5rem 1rem;font-size:.875rem;font-weight:500;color:var(--color-text-muted);background-color:var(--color-bg-card);border:1px solid var(--color-border);border-radius:.25rem;text-decoration:none;transition:all .15s ease}.view-toggle-btn:hover{color:var(--color-text);border-color:var(--color-accent)}.view-toggle-btn.active{color:var(--color-text);background-color:var(--color-accent);border-color:var(--color-accent)}.view-toggle-btn svg{flex-shrink:0}.view-toggle-btn.view-toggle-nearme{margin-left:auto}.property-map-layout{display:none}@media (min-width: 1024px){.is-map-view .property-map-layout{display:grid;grid-template-columns:minmax(300px,33%) 1fr;gap:2rem;width:var(--layout-width, 100%);max-width:100%;margin-left:auto;margin-right:auto}}.grid-view-container{display:block}.grid-view-container .view-toggle{display:none}@media (min-width: 1024px){.grid-view-container .view-toggle{display:flex}.grid-view-container{display:none}.is-grid-view .grid-view-container{display:block;width:var(--layout-width, 100%);max-width:100%;margin-left:auto;margin-right:auto}}.property-sidebar{position:relative}@media (min-width: 1024px){.property-sidebar{padding-bottom:20px}.property-sidebar-content{position:sticky;top:100px}}.property-sidebar-content .view-toggle{margin-bottom:1.4rem}.property-map{width:100%;height:200px;background-color:var(--color-bg-card);border-radius:.5rem;overflow:hidden;border:1px solid var(--color-border)}@media (min-width: 1024px){.property-map{height:calc(50vh - 75px)}}.property-list-container .properties-meta{padding-top:0;padding-bottom:0}.property-list-container .properties-grid{grid-template-columns:1fr}@media (min-width: 640px){.property-list-container .properties-grid{grid-template-columns:repeat(2,1fr)}}@media (min-width: 1024px){.property-list-container .properties-grid{grid-template-columns:repeat(var(--card-columns, 2),minmax(350px,1fr));gap:1.5rem}.is-map-view .property-list-container #property-results{min-height:100vh}.grid-view-container .properties-grid{grid-template-columns:repeat(var(--card-columns, 3),400px);gap:1.5rem}}.property-marker{background:transparent}.property-marker .marker-pin{width:16px;height:16px;border-radius:50% 50% 50% 0;background:var(--color-accent);position:absolute;transform:rotate(-45deg);left:50%;top:50%;margin:-11px 0 0 -8px;box-shadow:0 1px 4px #0000004d}.property-marker .marker-pin:after{content:"";width:7px;height:7px;margin:4px 0 0 4px;background:var(--color-bg-dark);position:absolute;border-radius:50%}.property-marker.property-marker-amber .marker-pin{background:#f59e0b}.property-marker.property-marker-blue .marker-pin{background:#3b82f6}.marker-cluster{background-clip:padding-box;border-radius:50%}.marker-cluster div{width:32px;height:32px;margin-left:4px;margin-top:4px;text-align:center;border-radius:50%;font-weight:600;font-size:12px;display:flex;align-items:center;justify-content:center}.marker-cluster span{line-height:1}.marker-cluster-small{background-color:#78787873}.marker-cluster-medium{background-color:#c8505080}.marker-cluster-large{background-color:#dc2828b3}.marker-cluster-small div{width:22px;height:22px;margin-left:4px;margin-top:4px}.marker-cluster-medium div{width:27px;height:27px;margin-left:4px;margin-top:4px}.marker-cluster-large div{width:32px;height:32px;margin-left:4px;margin-top:4px}.marker-cluster-small div,.marker-cluster-medium div,.marker-cluster-large div{color:#000;font-weight:800;font-size:12px;opacity:1}.density-dot-container{background:transparent!important;border:none!important}.density-dot{border-radius:50%;border:1px solid rgba(0,0,0,.15);box-shadow:0 1px 2px #0003;cursor:pointer;transition:transform .15s ease,box-shadow .15s ease}.density-dot:hover{transform:scale(1.4);box-shadow:0 2px 4px #0000004d}.density-tooltip,.cluster-tooltip{font-family:var(--font-body);font-size:.75rem;padding:.25rem .5rem;background:#1e1e1ee6;color:#fff;border:none;border-radius:.25rem}.property-card-highlighted{border-color:#f59e0b!important;box-shadow:0 0 0 2px #f59e0b4d}.map-popup{font-family:var(--font-body);padding:.25rem}.map-popup strong{font-size:1rem;color:var(--color-accent)}.map-popup span{font-size:.875rem;color:#666}.map-popup a{display:inline-block;margin-top:.5rem;font-size:.875rem;color:var(--color-accent);font-weight:500}.map-popup a:hover{text-decoration:underline}.leaflet-popup-content-wrapper{border-radius:.5rem}.leaflet-popup-tip-container{margin-top:-1px}.property-archive-main>.container{max-width:none;padding-top:2rem;padding-left:var(--container-padding);padding-right:var(--container-padding)}.property-archive-main .archive-hero .container{max-width:var(--container-max)}.property-archive-main .property-filters{max-width:var(--container-max);margin-left:auto;margin-right:auto}.property-filters{background-color:var(--color-bg-card);border-radius:.5rem;padding:1.5rem;margin-bottom:1.5rem}.filters-form{display:block}.filters-row{display:grid;grid-template-columns:repeat(2,1fr);gap:.75rem}@media (min-width: 768px){.filters-row{grid-template-columns:repeat(4,1fr)}}@media (min-width: 1100px){.filters-row{grid-template-columns:repeat(7,1fr)}}.filter-item{display:flex;flex-direction:column;gap:.375rem}.filter-item-button .btn,.filter-item-button .comment-form .form-submit input[type=submit],.comment-form .form-submit .filter-item-button input[type=submit]{width:100%;padding:.625rem 1rem}.filter-label{font-size:.8125rem;font-weight:500;color:var(--color-text);text-transform:uppercase;letter-spacing:.03em}.filter-select,.filter-input{width:100%;height:2.75rem;padding:0 .75rem;background-color:#000;border:1px solid var(--color-border);border-radius:.25rem;color:var(--color-text);font-size:.9375rem;box-sizing:border-box}.filter-select:focus,.filter-input:focus{outline:none;border-color:var(--color-accent)}.filter-select{padding-right:2rem;cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%23B0B0B0' stroke-width='2'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right .75rem center}.filter-input::-moz-placeholder{color:var(--color-text-muted);opacity:.7}.filter-input::placeholder{color:var(--color-text-muted);opacity:.7}.filter-item-zip{max-width:120px}@media (max-width: 768px){.filter-item-zip{max-width:none}}.property-filters.is-loading{pointer-events:none;opacity:.7}.property-filters-sticky{display:none}@media (min-width: 1024px){.property-filters-sticky{margin-top:1rem;background-color:var(--color-bg-card);border-radius:.5rem;padding:.75rem;border:1px solid var(--color-border);opacity:0;visibility:hidden;transition:opacity .2s ease}.property-filters-sticky.is-visible{display:block;opacity:1;visibility:visible}.property-filters-sticky.is-hiding{opacity:0;visibility:hidden;transition:none}}.filters-sticky-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:.5rem}@media (min-width: 1024px){.filters-sticky-grid{grid-template-columns:repeat(3,1fr)}}.filter-item-sticky .filter-select,.filter-item-sticky .filter-input{width:100%;height:2.25rem;padding:0 .625rem;font-size:.8125rem;background-color:#000;border:1px solid var(--color-border);border-radius:.25rem;color:var(--color-text);box-sizing:border-box}.filter-item-sticky .filter-select:focus,.filter-item-sticky .filter-input:focus{outline:none;border-color:var(--color-accent)}.filter-item-sticky .filter-select{padding-right:1.75rem;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%23B0B0B0' stroke-width='2'%3E%3Cpolyline points='6 9 12 15 18 9'%3E%3C/polyline%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right .5rem center}.filter-item-sticky-zip .filter-input::-moz-placeholder{color:var(--color-text-muted);opacity:.7}.filter-item-sticky-zip .filter-input::placeholder{color:var(--color-text-muted);opacity:.7}.filters-sticky-reset{display:flex;justify-content:center;margin-top:.75rem;padding-top:.75rem;border-top:1px solid var(--color-border)}.filters-sticky-reset .btn,.filters-sticky-reset .comment-form .form-submit input[type=submit],.comment-form .form-submit .filters-sticky-reset input[type=submit]{padding:.5rem 1.5rem;font-size:.8125rem}.property-results-loading{display:flex;justify-content:center;align-items:center;padding:4rem 0}.property-results-loading .spinner{width:40px;height:40px;border:3px solid var(--color-border);border-top-color:var(--color-accent);border-radius:50%;animation:spin .8s linear infinite}.server-cluster{cursor:pointer}.server-cluster:hover div{transform:scale(1.1);transition:transform .15s ease}.cluster-tooltip{background-color:var(--color-bg-card);border:1px solid var(--color-border);border-radius:.375rem;color:var(--color-text);font-family:var(--font-body);font-size:.8125rem;padding:.5rem .75rem;line-height:1.4;box-shadow:0 2px 8px #00000026}.cluster-tooltip:before{border-top-color:var(--color-border)}.infinite-scroll-page{display:contents}.property-card.is-placeholder{background:var(--color-surface, #1a1a1a);border:1px solid var(--color-border, #333);border-radius:.5rem}.infinite-scroll-placeholder{grid-column:1/-1;background:transparent}.infinite-scroll-sentinel{height:1px;visibility:hidden;pointer-events:none}.infinite-scroll-padding{height:0;pointer-events:none}.infinite-scroll-loader{display:none;justify-content:center;align-items:center;padding:1.5rem;grid-column:1/-1}.infinite-scroll-loader.is-loading{display:flex}.infinite-scroll-loader .spinner{width:24px;height:24px;border:2px solid var(--color-border);border-top-color:var(--color-accent);border-radius:50%;animation:spin .8s linear infinite}.infinite-scroll-enabled .pagination,#property-results.infinite-scroll-enabled .pagination{display:none!important}.is-near-me-mode .property-map-layout,.is-near-me-mode .grid-view-container,.is-near-me-mode .property-filters{display:none}.near-me-overlay{padding:4rem 1rem;display:flex;align-items:center;justify-content:center;min-height:400px}.near-me-prompt{text-align:center;max-width:400px}.near-me-icon{display:flex;justify-content:center;margin-bottom:1.5rem;color:var(--color-accent)}.near-me-icon svg{animation:pulse-location 2s ease-in-out infinite}@keyframes pulse-location{0%,to{opacity:1;transform:scale(1)}50%{opacity:.7;transform:scale(1.05)}}.near-me-title{font-size:1.5rem;margin-bottom:.75rem;color:var(--color-text)}.near-me-message{color:var(--color-text-muted);margin-bottom:2rem;line-height:1.6}.near-me-overlay.has-error .near-me-icon{color:var(--color-text-muted)}.near-me-overlay.has-error .near-me-icon svg{animation:none}.user-location-marker{position:relative}.user-location-dot{position:absolute;top:50%;left:50%;width:12px;height:12px;background:var(--color-accent);border:2px solid white;border-radius:50%;transform:translate(-50%,-50%);box-shadow:0 2px 4px #0000004d}.user-location-pulse{position:absolute;top:50%;left:50%;width:24px;height:24px;background:rgba(var(--color-accent-rgb, 181, 101, 29),.3);border-radius:50%;transform:translate(-50%,-50%);animation:user-location-pulse 2s ease-out infinite}@keyframes user-location-pulse{0%{transform:translate(-50%,-50%) scale(.5);opacity:1}to{transform:translate(-50%,-50%) scale(2);opacity:0}}.mobile-map-view{display:none}@media (max-width: 1023px){.mobile-map-view{display:block;position:fixed;top:0;left:0;right:0;bottom:0;z-index:50}.desktop-only{display:none!important}}.mobile-map-container{position:absolute;top:0;left:0;right:0;bottom:0;background-color:var(--color-bg-dark)}.mobile-map-container .leaflet-container{width:100%;height:100%}.mobile-bottom-sheet{position:absolute;left:0;right:0;bottom:0;background-color:var(--color-bg-dark);border-radius:1rem 1rem 0 0;border-top:3px solid var(--color-accent);box-shadow:0 -8px 30px #00000080;z-index:1000;display:flex;flex-direction:column;transition:height .3s ease-out;will-change:height;max-height:calc(100vh - 60px)}.mobile-bottom-sheet[data-state=collapsed]{height:120px}.mobile-bottom-sheet[data-state=expanded]{height:calc(100vh - 60px)}.mobile-bottom-sheet.is-dragging{transition:none}.sheet-drag-handle{flex-shrink:0;display:flex;justify-content:center;align-items:center;padding:.75rem;cursor:grab;touch-action:none}.sheet-drag-handle:active{cursor:grabbing}.sheet-handle-bar{width:36px;height:4px;background-color:var(--color-border);border-radius:2px}.sheet-header{flex-shrink:0;display:flex;align-items:center;justify-content:space-between;padding:0 1rem .75rem;border-bottom:1px solid var(--color-border);cursor:pointer;-webkit-user-select:none;-moz-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent}.sheet-property-count{font-size:1rem;font-weight:600;color:var(--color-text)}.sheet-property-count span{color:var(--color-accent)}.sheet-filter-toggle{display:inline-flex;align-items:center;gap:.5rem;padding:.5rem .75rem;font-size:.875rem;font-weight:500;color:var(--color-text-muted);background-color:var(--color-bg-dark);border:1px solid var(--color-border);border-radius:.375rem;cursor:pointer}.sheet-filter-toggle:hover,.sheet-filter-toggle.is-active{color:var(--color-text);border-color:var(--color-accent)}.sheet-filter-toggle.is-active{background-color:#9f37301a}.sheet-content{flex:1;overflow-y:auto;overflow-x:hidden;overscroll-behavior:contain;-webkit-overflow-scrolling:touch}.sheet-filters{padding:1rem;background-color:var(--color-bg-dark);border-bottom:1px solid var(--color-border);display:none}.sheet-filters.is-visible{display:block}.sheet-filters-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:.75rem}.sheet-filter-item{display:flex;flex-direction:column;gap:.25rem}.sheet-filter-item label{font-size:.75rem;font-weight:500;color:var(--color-text-muted);text-transform:uppercase;letter-spacing:.05em}.sheet-filter-item.sheet-filter-reset{justify-content:flex-end}.sheet-filter-item.sheet-filter-reset .btn,.sheet-filter-item.sheet-filter-reset .comment-form .form-submit input[type=submit],.comment-form .form-submit .sheet-filter-item.sheet-filter-reset input[type=submit]{width:100%}.sheet-filter-select{width:100%;padding:.625rem 2rem .625rem .75rem;font-size:.875rem;color:var(--color-text);background-color:var(--color-bg-card);border:1px solid var(--color-border);border-radius:.375rem;-webkit-appearance:none;-moz-appearance:none;appearance:none;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%239ca3af' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right .75rem center}.sheet-filter-select:focus{outline:none;border-color:var(--color-accent)}.sheet-property-list{padding:.75rem}.sheet-property-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.75rem;padding:2rem;color:var(--color-text-muted);font-size:.875rem}.sheet-property-card{display:flex;gap:.75rem;padding:.75rem;background-color:var(--color-bg-dark);border:1px solid var(--color-border);border-radius:.5rem;margin-bottom:.75rem;text-decoration:none;color:inherit}.sheet-property-card:last-child{margin-bottom:0}.sheet-property-card:hover,.sheet-property-card.is-highlighted{border-color:var(--color-accent)}.sheet-property-card.is-highlighted{background-color:#9f37301a}.sheet-card-image{flex-shrink:0;width:100px;height:80px;background-color:var(--color-bg-card);background-size:cover;background-position:center;border-radius:.375rem;position:relative;overflow:hidden}.sheet-card-image.is-loading{display:flex;align-items:center;justify-content:center}.sheet-card-badge{position:absolute;top:.25rem;left:.25rem;padding:.125rem .375rem;font-size:.625rem;font-weight:600;text-transform:uppercase;border-radius:.25rem;background-color:var(--color-active);color:#fff}.sheet-card-badge.badge-pending{background-color:var(--color-pending)}.sheet-card-badge.badge-sold{background-color:var(--color-sold)}.sheet-card-content{flex:1;min-width:0;display:flex;flex-direction:column;justify-content:center}.sheet-card-price{font-size:1rem;font-weight:700;color:var(--color-text);margin-bottom:.125rem}.sheet-card-address{font-size:.8125rem;color:var(--color-text-muted);margin-bottom:.25rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sheet-card-specs{display:flex;gap:.75rem;font-size:.75rem;color:var(--color-text-muted)}.sheet-card-specs span{display:flex;align-items:center;gap:.25rem}.sheet-no-properties{text-align:center;padding:2rem 1rem;color:var(--color-text-muted)}.sheet-no-properties svg{width:48px;height:48px;margin-bottom:1rem;opacity:.5}.sheet-no-properties p{margin:0;font-size:.9375rem}.mobile-map-popup .leaflet-popup-content-wrapper{background-color:var(--color-bg-card);border-radius:.5rem;padding:0;box-shadow:0 2px 10px #0000004d}.mobile-map-popup .leaflet-popup-content{margin:0;min-width:200px}.mobile-map-popup .leaflet-popup-tip{background-color:var(--color-bg-card)}.mobile-popup-card{padding:.75rem}.mobile-popup-price{font-size:1rem;font-weight:700;color:var(--color-text);margin-bottom:.25rem}.mobile-popup-address{font-size:.8125rem;color:var(--color-text-muted);margin-bottom:.5rem}.mobile-popup-link{display:inline-flex;align-items:center;gap:.25rem;font-size:.8125rem;font-weight:600;color:var(--color-accent);text-decoration:none}.mobile-popup-link:hover{color:var(--color-accent-light)}.spinner{width:24px;height:24px;border:2px solid var(--color-border);border-top-color:var(--color-accent);border-radius:50%;animation:spin .8s linear infinite}@keyframes spin{to{transform:rotate(360deg)}}.mobile-marker{background:none;border:none}.mobile-marker-inner{display:flex;align-items:center;justify-content:center;padding:.25rem .5rem;background-color:var(--color-bg-card);border:2px solid var(--color-accent);border-radius:.25rem;color:var(--color-text);font-size:.75rem;font-weight:700;white-space:nowrap;box-shadow:0 2px 6px #0000004d}.mobile-marker-inner:after{content:"";position:absolute;bottom:-6px;left:50%;transform:translate(-50%);border-left:6px solid transparent;border-right:6px solid transparent;border-top:6px solid var(--color-accent)}.mobile-cluster-marker{background:none;border:none}.mobile-cluster-inner{display:flex;align-items:center;justify-content:center;width:40px;height:40px;background-color:var(--color-accent);border:3px solid rgba(255,255,255,.8);border-radius:50%;color:#fff;font-size:.875rem;font-weight:700;box-shadow:0 2px 8px #0000004d}@media (max-width: 1023px){body:has(.mobile-map-view) .site-header{display:none}body:has(.mobile-map-view) .site-footer{display:none}body:has(.mobile-map-view) .site-main{padding:0}}.property-gallery{margin-bottom:2rem}.gallery-main{position:relative;margin-bottom:.75rem}.gallery-main-image{display:block;width:100%;padding:0;border:none;background:none;cursor:pointer;border-radius:.5rem;overflow:hidden}.gallery-main-image img{width:100%;height:auto;aspect-ratio:16/10;-o-object-fit:cover;object-fit:cover;display:block}.gallery-count{position:absolute;bottom:1rem;right:1rem;display:flex;align-items:center;gap:.5rem;padding:.5rem 1rem;background-color:#000000bf;border-radius:.25rem;color:#fff;font-size:.875rem;font-weight:500}.gallery-playback-btn{position:absolute;bottom:1rem;left:1rem;display:flex;align-items:center;justify-content:center;width:40px;height:40px;padding:0;background-color:#000000bf;border:none;border-radius:.25rem;color:#fff;cursor:pointer;z-index:2}.gallery-playback-btn .icon-play{display:none}.gallery-playback-btn .icon-pause{display:block}.gallery-playback-btn:not(.is-playing) .icon-play{display:block}.gallery-playback-btn:not(.is-playing) .icon-pause{display:none}.gallery-playback-btn:hover{background-color:#000000e6}.gallery-thumbnails-container{display:flex;align-items:center;gap:.5rem}@media (max-width: 1023px){.gallery-thumbnails-container{max-width:88vw;margin:auto}}.gallery-thumbnails-viewport{flex:1;overflow:hidden}.gallery-thumbnails{display:flex;gap:.5rem}.gallery-thumbnail{position:relative;flex-shrink:0;width:calc((100% - 2rem)/5);padding:0;border:2px solid transparent;background:var(--color-bg-card);cursor:pointer;border-radius:.25rem;overflow:hidden}@media (max-width: 640px){.gallery-thumbnail{width:calc((100% - 1.5rem)/4)}}.gallery-thumbnail.is-active{border-color:var(--color-accent)}.gallery-thumbnail img{width:100%;aspect-ratio:1;-o-object-fit:cover;object-fit:cover;display:block;opacity:1;transition:opacity .2s ease}.gallery-thumbnail.is-loading img{opacity:0}.gallery-thumbnail.is-loading .thumbnail-spinner{display:flex}.thumbnail-spinner{position:absolute;top:0;right:0;bottom:0;left:0;display:none;align-items:center;justify-content:center;background:var(--color-bg-card)}.thumbnail-spinner .spinner{width:20px;height:20px;border:2px solid var(--color-border);border-top-color:var(--color-accent);border-radius:50%;animation:thumbnail-spin .8s linear infinite}@keyframes thumbnail-spin{to{transform:rotate(360deg)}}.gallery-thumbnails-nav{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;background-color:var(--color-bg-card);border:1px solid var(--color-border);border-radius:.25rem;color:var(--color-text);cursor:pointer}.gallery-thumbnails-nav:hover:not(:disabled){background-color:var(--color-accent);border-color:var(--color-accent);color:#fff}.gallery-thumbnails-nav:disabled{opacity:.3;cursor:not-allowed}.gallery-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;height:400px;background-color:var(--color-bg-card);border-radius:.5rem;color:var(--color-text-muted)}.gallery-placeholder svg{margin-bottom:1rem}.gallery-placeholder p{margin:0}.gallery-lightbox{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1000;display:none}.gallery-lightbox[aria-hidden=false]{display:block}.lightbox-overlay{position:absolute;top:0;right:0;bottom:0;left:0;background-color:#000000f2}.lightbox-container{position:relative;display:flex;align-items:center;justify-content:center;height:100%;padding:4rem 1rem}.lightbox-close{position:absolute;top:1rem;right:1rem;z-index:10;padding:.5rem;background:none;border:none;color:#fff;cursor:pointer;opacity:.8}.lightbox-close:hover{opacity:1}.lightbox-nav{position:absolute;top:50%;transform:translateY(-50%);z-index:10;padding:1rem;background-color:#ffffff1a;border:none;border-radius:50%;color:#fff;cursor:pointer;opacity:.8}.lightbox-nav:hover{opacity:1;background-color:#fff3}.lightbox-nav.lightbox-prev{left:1rem}.lightbox-nav.lightbox-next{right:1rem}.lightbox-image-container{max-width:90vw;max-height:calc(100vh - 8rem);display:flex;align-items:center;justify-content:center}.lightbox-image{max-width:100%;max-height:calc(100vh - 8rem);-o-object-fit:contain;object-fit:contain}.lightbox-counter{position:absolute;bottom:1rem;left:50%;transform:translate(-50%);padding:.5rem 1rem;background-color:#000000bf;border-radius:.25rem;color:#fff;font-size:.875rem}.breadcrumbs{background-color:var(--color-bg-card);padding:1rem 0;border-bottom:1px solid var(--color-border)}.breadcrumb-list{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;list-style:none;margin:0;padding:0;font-size:.875rem}.breadcrumb-list li{display:flex;align-items:center}.breadcrumb-list li:not(:last-child):after{content:"/";margin-left:.5rem;color:var(--color-text-muted)}.breadcrumb-list li a{color:var(--color-text-muted);text-decoration:none}.breadcrumb-list li a:hover{color:var(--color-accent-light)}.breadcrumb-list li:last-child{color:var(--color-text)}.single-property-main{padding-bottom:4rem}.property-address-header{padding-top:2rem;padding-bottom:1.5rem}.property-address-title{font-size:2rem;margin-bottom:0;color:var(--color-text)}@media (max-width: 768px){.property-address-title{font-size:1.5rem}}.single-property-layout{display:grid;grid-template-columns:1fr;gap:2rem}@media (min-width: 1024px){.single-property-layout{grid-template-columns:1fr 350px;gap:3rem}}.section-title{font-size:1.25rem;margin-bottom:1.25rem;padding-bottom:.75rem;border-bottom:1px solid var(--color-border)}.property-specs-section{margin-bottom:2rem}@media (max-width: 1023px){.property-specs-section{background-color:var(--color-bg-card);padding:1.5rem;border-radius:.5rem}}.property-specs-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:.75rem 1.5rem;list-style:none;margin:0;padding:0}@media (min-width: 1024px){.property-specs-grid{grid-template-columns:repeat(3,1fr);gap:1rem}}.property-specs-grid .spec-item{display:flex;flex-direction:row;justify-content:space-between;align-items:center;gap:.5rem;padding:.5rem 0;border-bottom:1px solid var(--color-border)}@media (min-width: 1024px){.property-specs-grid .spec-item{flex-direction:column;align-items:flex-start;justify-content:flex-start;gap:.25rem;padding:1rem;background-color:var(--color-bg-card);border-radius:.25rem;border-bottom:none}}.spec-label{font-size:.875rem;color:var(--color-text-muted)}@media (min-width: 1024px){.spec-label{font-size:.75rem;text-transform:uppercase;letter-spacing:.05em}}.spec-value{font-size:1rem;font-weight:600;color:var(--color-text)}@media (min-width: 1024px){.spec-value{font-size:1.25rem}}.property-documents{margin-bottom:2rem}.documents-list{display:flex;flex-wrap:wrap;justify-content:center;gap:1rem;list-style:none;margin:0;padding:0}.document-item{margin:0}.document-link{display:inline-flex;align-items:center;gap:.5rem}.document-link svg{flex-shrink:0}.document-ext{font-size:.75rem;opacity:.7;text-transform:uppercase}.property-description{margin-bottom:2rem}.property-short-desc{font-size:1.125rem;color:var(--color-text);margin-bottom:1rem}.property-full-desc{color:var(--color-text-muted);line-height:1.7}.property-features{margin-bottom:2rem}.features-list{display:grid;grid-template-columns:repeat(2,1fr);gap:.75rem;list-style:none;margin:0;padding:0}@media (min-width: 640px){.features-list{grid-template-columns:repeat(3,1fr)}}.feature-item{display:flex;align-items:center;gap:.5rem;font-size:.9375rem;color:var(--color-text-muted)}.feature-item svg{flex-shrink:0;color:var(--color-success)}.single-property-sidebar{display:flex;flex-direction:column;gap:1.5rem}@media (min-width: 1024px){.single-property-sidebar{align-self:start}}.sidebar-widget{background-color:var(--color-bg-card);border-radius:.5rem;padding:1.5rem}.widget-title{font-family:Times New Roman,Times,serif;font-size:18px;font-weight:700;margin-bottom:1rem;padding-bottom:.75rem;border-bottom:1px solid var(--color-border)}.property-header-widget .property-header-top{display:flex;flex-wrap:wrap;align-items:center;gap:.5rem;margin-bottom:.75rem}.property-header-widget .property-title{font-family:var(--font-display);font-size:1.75rem;color:var(--color-text);margin-bottom:.5rem;line-height:1.2}.property-header-widget .property-mls{font-size:.8125rem;color:var(--color-sold);margin-bottom:0}.badge-type-residential{background-color:#93c5fd;color:#1e3a5f}.badge-type-commercial{background-color:var(--color-accent);color:#fff}.badge-type-land{background-color:#86efac;color:#14532d}.badge-type-multi-family{background-color:#c4b5fd;color:#3b1d66}.property-documents-widget .sidebar-documents-list{display:flex;flex-direction:column;gap:.75rem}.property-documents-widget .document-btn{display:flex;align-items:center;gap:.625rem;width:100%;padding:.75rem 1rem;background-color:var(--color-accent);border:none;border-radius:.25rem;color:#fff;text-decoration:none;font-weight:600;font-size:.875rem;cursor:pointer}.property-documents-widget .document-btn:hover{background-color:var(--color-accent-hover);color:#fff}.property-documents-widget .document-btn svg{flex-shrink:0;stroke:#fff}.property-documents-widget .document-btn-label{flex:1;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.property-documents-widget .document-btn-ext{flex-shrink:0;font-size:.625rem;font-weight:700;text-transform:uppercase;background-color:#0003;color:#fff;padding:.1875rem .375rem;border-radius:.1875rem;letter-spacing:.03em}.agent-card{padding:1.5rem}.agent-info-link{display:block;text-decoration:none;color:inherit;border-radius:.375rem;margin:-.5rem -.5rem 1rem;padding:.5rem}.agent-info-link:hover{background-color:var(--color-bg-dark)}.agent-info-link:hover .agent-name{color:var(--color-accent-light)}.agent-info-link .agent-info{margin-bottom:0}.agent-card-header{margin-bottom:1.25rem;padding-bottom:1rem;border-bottom:1px solid var(--color-border)}.agent-card-title{font-size:1.125rem;margin-bottom:0}.agent-info{display:flex;align-items:center;gap:1rem;margin-bottom:1.5rem}.agent-avatar{flex-shrink:0;background-color:#000;border-radius:50%}.agent-avatar img{width:64px;height:64px;border-radius:50%;-o-object-fit:cover;object-fit:cover}.agent-avatar-placeholder{width:64px;height:64px;display:flex;align-items:center;justify-content:center;background-color:#000;border-radius:50%;color:var(--color-text-muted)}.agent-name{font-weight:600;color:var(--color-text);margin-bottom:.25rem}.agent-role{font-size:.8125rem;color:var(--color-text-muted);margin-bottom:0}.agent-contact{display:flex;flex-direction:column;gap:.75rem}.agent-contact .btn,.agent-contact .comment-form .form-submit input[type=submit],.comment-form .form-submit .agent-contact input[type=submit]{display:flex;align-items:center;justify-content:center;gap:.5rem;width:100%}.agent-card-footer{margin-top:1.5rem;padding-top:1rem;border-top:1px solid var(--color-border)}.agent-card-note{font-size:.8125rem;color:var(--color-text-muted);text-align:center;margin-bottom:0}.property-inquiry-card .inquiry-note{font-size:.9375rem;color:var(--color-text-muted);margin-bottom:1rem;line-height:1.5}.property-inquiry-card .btn-block{display:flex;width:100%;text-align:center;justify-content:center}.generic-contact-card .contact-note{font-size:.9375rem;color:var(--color-text-muted);margin-bottom:1.25rem;line-height:1.5}.generic-contact-card .generic-contact-actions{display:flex;flex-direction:column;gap:.75rem}.generic-contact-card .btn-block{display:flex;width:100%;text-align:center;justify-content:center}body.lightbox-open{overflow:hidden}.Single_Property_MLS .property-breadcrumb{padding:1rem 0;font-size:.875rem;color:var(--color-text-muted)}.Single_Property_MLS .property-breadcrumb a{color:var(--color-text-muted);text-decoration:none}.Single_Property_MLS .property-breadcrumb a:hover{color:var(--color-accent-light)}.Single_Property_MLS .property-breadcrumb .separator{margin:0 .5rem}.Single_Property_MLS .property-breadcrumb .current{color:var(--color-text)}.Single_Property_MLS .property-gallery-section{margin-bottom:2rem}.Single_Property_MLS .property-gallery-main{border-radius:.5rem;overflow:hidden;background-color:var(--color-bg-card);margin-bottom:1rem}.Single_Property_MLS .property-gallery-main .gallery-main-image{width:100%;height:auto;max-height:500px;-o-object-fit:cover;object-fit:cover;display:block}.Single_Property_MLS .property-gallery-main .gallery-placeholder{display:flex;align-items:center;justify-content:center;height:300px;color:var(--color-text-muted)}.Single_Property_MLS .property-gallery-thumbs{display:flex;gap:.5rem;overflow-x:auto;padding-bottom:.5rem}.Single_Property_MLS .gallery-thumb{flex-shrink:0;width:80px;height:60px;border-radius:.25rem;overflow:hidden;border:2px solid transparent;cursor:pointer;padding:0;background:none}.Single_Property_MLS .gallery-thumb.is-active{border-color:var(--color-accent)}.Single_Property_MLS .gallery-thumb:hover{border-color:var(--color-accent-light)}.Single_Property_MLS .gallery-thumb img{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.Single_Property_MLS .gallery-thumb.gallery-more{display:flex;align-items:center;justify-content:center;background-color:var(--color-bg-card);color:var(--color-text);font-weight:600;font-size:.875rem}.Single_Property_MLS .property-location-section{margin-bottom:2rem}.Single_Property_MLS .property-address-link{margin-bottom:.75rem}.Single_Property_MLS .property-address-link a{color:#ef4444;text-decoration:none;font-weight:700}.Single_Property_MLS .property-address-link a:hover{text-decoration:underline}.Single_Property_MLS .property-directions-text{color:var(--color-text-muted);line-height:1.6;margin-bottom:1rem}.Single_Property_MLS .property-location-map{border-radius:.5rem;overflow:hidden}.Single_Property_MLS .property-location-map iframe{display:block}.Single_Property_MLS .property-agent-widget .agent-name{font-weight:600;margin-bottom:.25rem}.Single_Property_MLS .property-agent-widget .office-name{font-size:.875rem;color:var(--color-text-muted);margin-bottom:1rem}.Single_Property_MLS .property-agent-widget .agent-intro{font-size:.875rem;color:var(--color-text-muted);margin-bottom:1rem;line-height:1.5}.Single_Property_MLS .property-share-widget .share-buttons{display:flex;gap:.75rem}.Single_Property_MLS .property-share-widget .share-btn{display:flex;align-items:center;justify-content:center;width:40px;height:40px;border-radius:.375rem;background-color:var(--color-bg-dark);color:var(--color-text-muted);border:none;cursor:pointer;text-decoration:none;transition:background-color .2s,color .2s}.Single_Property_MLS .property-share-widget .share-btn:hover{background-color:var(--color-accent);color:#fff}.Single_Property_MLS .property-share-widget .share-btn.copied{background-color:var(--color-success);color:#fff}.Single_Property_MLS .badge-type{background-color:var(--color-bg-dark);color:var(--color-text)}.Single_Agent{padding-bottom:4rem}.Single_Agent .agent-header{background-color:var(--color-bg-card);padding:3rem 0;border-bottom:1px solid var(--color-border)}.Single_Agent .agent-header-layout{display:flex;flex-direction:column;align-items:center;gap:2rem;text-align:center}@media (min-width: 768px){.Single_Agent .agent-header-layout{flex-direction:row;text-align:left;align-items:flex-start}}.Single_Agent .agent-photo-wrapper{flex-shrink:0;background-color:#000}.Single_Agent .agent-photo{width:200px;height:200px;border-radius:.5rem;-o-object-fit:cover;object-fit:cover;border:3px solid var(--color-border)}@media (min-width: 768px){.Single_Agent .agent-photo{width:240px;height:240px}}.Single_Agent .agent-photo-placeholder{width:200px;height:200px;display:flex;align-items:center;justify-content:center;background-color:var(--color-bg-dark);border-radius:.5rem;border:3px solid var(--color-border);color:var(--color-text-muted)}@media (min-width: 768px){.Single_Agent .agent-photo-placeholder{width:240px;height:240px}}.Single_Agent .agent-info-wrapper{flex:1}.Single_Agent .agent-info-content{display:flex;flex-direction:column;align-items:center}@media (min-width: 768px){.Single_Agent .agent-info-content{align-items:flex-start}}.Single_Agent .agent-title-label{font-size:.75rem;text-transform:uppercase;letter-spacing:.1em;color:var(--color-accent);margin-bottom:.5rem;font-weight:600}.Single_Agent .agent-name{font-size:2.5rem;font-family:var(--font-heading);margin-bottom:.5rem;line-height:1.1}@media (min-width: 768px){.Single_Agent .agent-name{font-size:3rem}}.Single_Agent .agent-license{font-size:.875rem;color:var(--color-text-muted);margin-bottom:1.5rem}.Single_Agent .agent-credentials{font-size:.875rem;color:var(--color-text-muted);line-height:1.6;margin-bottom:1.5rem;margin-top:0}.Single_Agent .agent-contact-actions{display:flex;flex-wrap:wrap;gap:.75rem;margin-bottom:1.5rem;justify-content:center}@media (min-width: 768px){.Single_Agent .agent-contact-actions{justify-content:flex-start}}@media (max-width: 767px){.Single_Agent .agent-contact-actions{flex-direction:column;align-items:center}.Single_Agent .agent-contact-actions .btn,.Single_Agent .agent-contact-actions .comment-form .form-submit input[type=submit],.comment-form .form-submit .Single_Agent .agent-contact-actions input[type=submit]{min-width:275px;justify-content:center}}.Single_Agent .agent-contact-actions .btn,.Single_Agent .agent-contact-actions .comment-form .form-submit input[type=submit],.comment-form .form-submit .Single_Agent .agent-contact-actions input[type=submit]{display:inline-flex;align-items:center;gap:.5rem}.Single_Agent .agent-social-links{display:flex;gap:.75rem}.Single_Agent .social-link{display:flex;align-items:center;justify-content:center;width:40px;height:40px;background-color:var(--color-bg-dark);border-radius:.25rem;color:var(--color-text-muted);text-decoration:none}.Single_Agent .social-link:hover{background-color:var(--color-accent);color:#fff}.Single_Agent .social-link svg{width:20px;height:20px}.Single_Agent .agent-content-layout{display:grid;grid-template-columns:1fr;gap:2rem;padding-top:2rem}@media (min-width: 1024px){.Single_Agent .agent-content-layout{grid-template-columns:1fr 350px;gap:3rem}}.Single_Agent .agent-main-content{min-width:0}.Single_Agent .agent-section{margin-bottom:2.5rem}.Single_Agent .agent-section:last-child{margin-bottom:0}.Single_Agent .section-title{font-size:1.25rem;margin-bottom:1.25rem;padding-bottom:.75rem;border-bottom:1px solid var(--color-border)}.Single_Agent .agent-contact-details{background-color:var(--color-bg-card);border-radius:.5rem;padding:1.5rem}.Single_Agent .agent-contact-details .contact-details-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:1rem}@media (max-width: 1400px){.Single_Agent .agent-contact-details .contact-details-grid{grid-template-columns:repeat(2,1fr)}}@media (max-width: 800px){.Single_Agent .agent-contact-details .contact-details-grid{grid-template-columns:1fr}}.Single_Agent .agent-contact-details .contact-detail-item{display:flex;align-items:center;gap:1rem;padding:1rem;background-color:var(--color-bg-dark);border:1px solid var(--color-border);border-radius:.375rem;text-decoration:none;color:inherit}.Single_Agent .agent-contact-details .contact-detail-item:hover{border-color:var(--color-accent);background-color:#9f37301a}.Single_Agent .agent-contact-details .contact-detail-item svg{flex-shrink:0;color:var(--color-accent)}.Single_Agent .agent-contact-details .contact-detail-content{display:flex;flex-direction:column;min-width:0}.Single_Agent .agent-contact-details .contact-detail-label{font-size:.75rem;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-muted);margin-bottom:.125rem}.Single_Agent .agent-contact-details .contact-detail-value{font-size:1rem;color:var(--color-text);word-break:break-word}.Single_Agent .agent-bio .agent-short-bio{font-size:1.125rem;color:var(--color-text);line-height:1.6;margin-bottom:1.5rem}.Single_Agent .agent-bio .agent-full-bio{color:var(--color-text-muted);line-height:1.7}.Single_Agent .agent-bio .agent-full-bio p{margin-bottom:1rem}.Single_Agent .agent-bio .agent-full-bio p:last-child{margin-bottom:0}.Single_Agent .agent-testimonials .testimonials-grid{display:grid;grid-template-columns:1fr;gap:1.5rem}@media (min-width: 768px){.Single_Agent .agent-testimonials .testimonials-grid{grid-template-columns:repeat(2,1fr)}}.Single_Agent .agent-testimonials .testimonial-card{background-color:var(--color-bg-card);border-radius:.5rem;padding:1.5rem;margin:0;border-left:3px solid var(--color-accent);display:flex;flex-direction:column;gap:1rem}.Single_Agent .agent-testimonials .testimonial-quote{position:relative}.Single_Agent .agent-testimonials .testimonial-quote .quote-icon{position:absolute;top:0;left:0;width:24px;height:24px;color:var(--color-accent);opacity:.3}.Single_Agent .agent-testimonials .testimonial-quote p{margin:0;padding-left:2rem;font-size:1rem;line-height:1.7;color:var(--color-text);font-style:italic}.Single_Agent .agent-testimonials .testimonial-attribution{padding-left:2rem;display:flex;flex-wrap:wrap;align-items:baseline;gap:.25rem .5rem}.Single_Agent .agent-testimonials .client-name{font-size:.9375rem;font-weight:600;color:var(--color-text);font-style:normal}.Single_Agent .agent-testimonials .client-context{font-size:.8125rem;color:var(--color-text-muted)}.Single_Agent .agent-testimonials .client-context:before{content:"-";margin-right:.5rem}.Single_Agent .agent-gallery-section .agent-gallery-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:1rem}@media (min-width: 640px){.Single_Agent .agent-gallery-section .agent-gallery-grid{grid-template-columns:repeat(3,1fr)}}.Single_Agent .agent-gallery-section .gallery-item{display:block;aspect-ratio:4/3;overflow:hidden;border-radius:.375rem;border:1px solid var(--color-border)}.Single_Agent .agent-gallery-section .gallery-item:hover img{transform:scale(1.05)}.Single_Agent .agent-gallery-section .gallery-item img{width:100%;height:100%;-o-object-fit:cover;object-fit:cover;transition:transform .3s ease}.Single_Agent .agent-listings .agent-listings-grid{display:grid;grid-template-columns:1fr;gap:1.5rem;margin-bottom:1.5rem}@media (min-width: 640px){.Single_Agent .agent-listings .agent-listings-grid{grid-template-columns:repeat(2,1fr)}}@media (min-width: 1200px){.Single_Agent .agent-listings .agent-listings-grid{grid-template-columns:repeat(3,1fr)}}.Single_Agent .agent-listings .agent-listings-cta{text-align:center}.Single_Agent .agent-sidebar{display:flex;flex-direction:column;gap:1.5rem}@media (min-width: 1024px){.Single_Agent .agent-sidebar{align-self:start}}.Single_Agent .sidebar-widget{background-color:var(--color-bg-card);border-radius:.5rem;padding:1.5rem}.Single_Agent .widget-title{font-size:1rem;font-weight:600;margin-bottom:1rem;padding-bottom:.75rem;border-bottom:1px solid var(--color-border)}.Single_Agent .agent-contact-card .contact-list{list-style:none;margin:0;padding:0}.Single_Agent .agent-contact-card .contact-item{display:flex;align-items:flex-start;gap:.75rem;padding:.75rem 0;border-bottom:1px solid var(--color-border)}.Single_Agent .agent-contact-card .contact-item:first-child{padding-top:0}.Single_Agent .agent-contact-card .contact-item:last-child{padding-bottom:0;border-bottom:none}.Single_Agent .agent-contact-card .contact-item svg{flex-shrink:0;margin-top:.125rem;color:var(--color-accent)}.Single_Agent .agent-contact-card .contact-item>div{flex:1;min-width:0}.Single_Agent .agent-contact-card .contact-label{display:block;font-size:.75rem;text-transform:uppercase;letter-spacing:.05em;color:var(--color-text-muted);margin-bottom:.25rem}.Single_Agent .agent-contact-card a{color:var(--color-text);text-decoration:none;word-break:break-word}.Single_Agent .agent-contact-card a:hover{color:var(--color-accent-light)}.Single_Agent .agent-quick-contact .widget-note{font-size:.9375rem;color:var(--color-text-muted);margin-bottom:1rem;line-height:1.5}.Single_Agent .agent-quick-contact .btn-block{display:block;width:100%;text-align:center}.Single_Agent .agent-gallery{margin-bottom:2rem}.Single_Agent .agent-gallery-thumbs-slider .slick-track{display:flex;gap:.5rem}.Single_Agent .agent-gallery-thumbs-slider .slick-slide{outline:none;margin-right:.5rem}.Single_Agent .agent-gallery-thumbs-slider .slick-prev,.Single_Agent .agent-gallery-thumbs-slider .slick-next{position:absolute;top:50%;transform:translateY(-50%);z-index:10;display:flex;align-items:center;justify-content:center;width:32px;height:32px;padding:0;background-color:var(--color-bg-card);border:1px solid var(--color-border);border-radius:50%;color:var(--color-text);cursor:pointer}.Single_Agent .agent-gallery-thumbs-slider .slick-prev:hover,.Single_Agent .agent-gallery-thumbs-slider .slick-next:hover{background-color:var(--color-accent);border-color:var(--color-accent);color:#fff}.Single_Agent .agent-gallery-thumbs-slider .slick-prev.slick-disabled,.Single_Agent .agent-gallery-thumbs-slider .slick-next.slick-disabled{opacity:.3;cursor:not-allowed}.Single_Agent .agent-gallery-thumbs-slider .slick-prev{left:-16px}.Single_Agent .agent-gallery-thumbs-slider .slick-next{right:-16px}.Single_Agent .agent-gallery-thumb{width:100px;height:100px;padding:0;border:2px solid transparent;background:var(--color-bg-card);cursor:pointer;border-radius:.375rem;overflow:hidden;transition:border-color .2s ease,transform .2s ease}@media (min-width: 1000px){.Single_Agent .agent-gallery-thumb{width:150px;height:150px}}.Single_Agent .agent-gallery-thumb:hover{border-color:var(--color-accent);transform:scale(1.05)}.Single_Agent .agent-gallery-thumb img{width:100%;height:100%;-o-object-fit:cover;object-fit:cover;display:block}.Single_Agent .agent-gallery-lightbox{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1000;display:none}.Single_Agent .agent-gallery-lightbox[aria-hidden=false]{display:block}.Single_Agent .agent-gallery-lightbox .lightbox-overlay{position:absolute;top:0;right:0;bottom:0;left:0;background-color:#000000f2}.Single_Agent .agent-gallery-lightbox .lightbox-container{position:relative;display:flex;align-items:center;justify-content:center;height:100%;padding:4rem 1rem}.Single_Agent .agent-gallery-lightbox .lightbox-close{position:absolute;top:1rem;right:1rem;z-index:10;padding:.5rem;background:none;border:none;color:#fff;cursor:pointer;opacity:.8}.Single_Agent .agent-gallery-lightbox .lightbox-close:hover{opacity:1}.Single_Agent .agent-gallery-lightbox .lightbox-nav{position:absolute;top:50%;transform:translateY(-50%);z-index:10;padding:1rem;background-color:#ffffff1a;border:none;border-radius:50%;color:#fff;cursor:pointer;opacity:.8}.Single_Agent .agent-gallery-lightbox .lightbox-nav:hover{opacity:1;background-color:#fff3}.Single_Agent .agent-gallery-lightbox .lightbox-nav.lightbox-prev{left:1rem}.Single_Agent .agent-gallery-lightbox .lightbox-nav.lightbox-next{right:1rem}.Single_Agent .agent-gallery-lightbox .lightbox-image-container{max-width:90vw;max-height:calc(100vh - 8rem);display:flex;align-items:center;justify-content:center}.Single_Agent .agent-gallery-lightbox .lightbox-image{max-width:100%;max-height:calc(100vh - 8rem);-o-object-fit:contain;object-fit:contain}.Single_Agent .agent-gallery-lightbox .lightbox-counter{position:absolute;bottom:1rem;left:50%;transform:translate(-50%);padding:.5rem 1rem;background-color:#000000bf;border-radius:.25rem;color:#fff;font-size:.875rem}.Agents_Archive .agents-section{padding:1.125rem 0 5.875rem}.Agents_Archive .agents-grid{display:grid;grid-template-columns:1fr;gap:2rem}@media (min-width: 640px){.Agents_Archive .agents-grid{grid-template-columns:repeat(2,1fr)}}@media (min-width: 1024px){.Agents_Archive .agents-grid{grid-template-columns:repeat(3,1fr)}}@media (min-width: 1280px){.Agents_Archive .agents-grid{grid-template-columns:repeat(4,1fr)}}.Agents_Archive .agent-card-item{background-color:var(--color-bg-card);border-radius:.5rem;overflow:hidden;display:flex;flex-direction:column;transition:transform .2s ease,box-shadow .2s ease}.Agents_Archive .agent-card-item:hover{transform:translateY(-4px);box-shadow:0 12px 24px #0006}.Agents_Archive .agent-card-item:hover:not(:has(.agent-action-btn:not(.agent-action-profile):hover)) .agent-action-profile{background-color:var(--color-accent);color:#fff}.Agents_Archive .agent-card-link{display:block;text-decoration:none;color:inherit;flex:1}.Agents_Archive .agent-card-link:hover .agent-card-image img{transform:scale(1.05)}.Agents_Archive .agent-card-link:hover .agent-card-name{color:var(--color-accent-light)}.Agents_Archive .agent-card-image{aspect-ratio:1/1;overflow:hidden;background-color:var(--color-bg-dark)}.Agents_Archive .agent-card-image img{width:100%;height:100%;-o-object-fit:cover;object-fit:cover;transition:transform .3s ease}.Agents_Archive .agent-card-placeholder{width:100%;height:100%;display:flex;align-items:center;justify-content:center;color:var(--color-text-muted)}.Agents_Archive .agent-card-content{padding:1.25rem}.Agents_Archive .agent-card-title-label{font-size:.75rem;text-transform:uppercase;letter-spacing:.1em;color:var(--color-accent);margin-bottom:.375rem;font-weight:600}.Agents_Archive .agent-card-name{font-size:1.25rem;font-family:var(--font-display);margin-bottom:.5rem;line-height:1.2}.Agents_Archive .agent-card-bio{font-size:.875rem;color:var(--color-text-muted);line-height:1.5;margin-bottom:0;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}.Agents_Archive .agent-card-actions{display:flex;align-items:center;gap:.5rem;padding:0 1.25rem 1.25rem;margin-top:auto}.Agents_Archive .agent-action-btn{display:flex;align-items:center;justify-content:center;gap:.375rem;height:40px;padding:0 .75rem;background-color:transparent;border:2px solid var(--color-accent);border-radius:.25rem;color:var(--color-accent);text-decoration:none;font-size:.8125rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em}.Agents_Archive .agent-action-btn:hover{background-color:var(--color-accent);color:#fff}.Agents_Archive .agent-action-btn:not(.agent-action-profile){width:40px;padding:0}.Agents_Archive .agent-action-btn.agent-action-profile{flex:1}.Agents_Archive .no-agents-message{text-align:center;padding:3rem;color:var(--color-text-muted)}.Agents_Archive .no-agents-message p{margin-bottom:0}.hero-section--split{display:flex;min-height:70vh;max-height:725px;width:100%}@media (max-width: 768px){.hero-section--split{flex-direction:column;max-height:none}}.hero-section--split.hero-section--small{min-height:300px;max-height:400px}@media (max-width: 768px){.hero-section--split.hero-section--small{max-height:none}}.hero-section--split.hero-section--small .hero-section-title{font-size:2.5rem}@media (max-width: 768px){.hero-section--split.hero-section--small .hero-section-title{font-size:2rem}}.hero-section--split.hero-section--small .hero-section-logo{max-width:280px;margin-bottom:1.5rem}.hero-split-content{width:40%;max-width:800px;background-color:var(--color-bg-dark);display:flex;flex-direction:column;align-items:center;justify-content:center;padding:3rem}@media (max-width: 1024px){.hero-split-content{width:45%;max-width:none;padding:2rem}}@media (max-width: 768px){.hero-split-content{width:100%;padding:3rem 1.5rem;order:2}}.hero-split-image{flex:1;background-size:cover;background-position:center center;background-repeat:no-repeat;position:relative;overflow:hidden}@media (max-width: 768px){.hero-split-image{width:100%;flex:none;height:300px;order:1}}.hero-split-inner{max-width:420px;text-align:center}@media (max-width: 768px){.hero-split-inner{margin:0 auto}}.hero-section-logo{display:block;max-width:320px;height:auto;margin:0 auto 2rem}@media (max-width: 768px){.hero-section-logo{max-width:280px;margin-bottom:1.5rem}}.hero-section-title{font-family:var(--font-display);font-size:3rem;color:var(--color-text);margin-bottom:1.25rem;line-height:1.1}@media (max-width: 1024px){.hero-section-title{font-size:2.5rem}}@media (max-width: 768px){.hero-section-title{font-size:2.25rem;margin-bottom:1rem}}.hero-section-subtitle{font-size:1.125rem;color:var(--color-text-muted);margin-bottom:2rem;line-height:1.6}@media (max-width: 768px){.hero-section-subtitle{font-size:1rem;margin-bottom:1.5rem}}.hero-section-actions{display:flex;flex-wrap:wrap;gap:1rem;justify-content:center}.hero-location-search{margin-bottom:2rem}.hero-location-search-inner{display:flex;gap:0;background-color:var(--color-bg-card);border-radius:.5rem;overflow:visible;box-shadow:0 4px 20px #0000004d}@media (max-width: 480px){.hero-location-search-inner{flex-wrap:wrap}}.hero-location-input-wrap{flex:1;position:relative;min-width:180px}@media (max-width: 480px){.hero-location-input-wrap{flex:1 1 100%}}.hero-location-input{width:100%;padding:.875rem 1rem;font-size:1rem;font-family:var(--font-body);color:var(--color-text);background-color:var(--color-bg-card);border:none;outline:none}.hero-location-input::-moz-placeholder{color:var(--color-text-muted)}.hero-location-input::placeholder{color:var(--color-text-muted)}.hero-location-input:focus{box-shadow:inset 0 0 0 2px var(--color-accent)}@media (max-width: 480px){.hero-location-input{text-align:center;border-radius:.5rem .5rem 0 0}}.hero-location-input.has-error{animation:shake .3s ease-in-out;box-shadow:inset 0 0 0 2px var(--color-accent)}@keyframes shake{0%,to{transform:translate(0)}25%{transform:translate(-4px)}75%{transform:translate(4px)}}.hero-location-ghost{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;overflow:hidden;white-space:nowrap;display:none;align-items:center;box-sizing:border-box;padding:.875rem 1rem;font-size:1rem;font-family:var(--font-body);line-height:1.5}.hero-location-ghost .ghost-typed{opacity:0}.hero-location-ghost .ghost-completion{color:var(--color-text-muted);opacity:.6}.hero-location-dropdown{display:none;position:absolute;top:100%;left:0;right:0;background-color:var(--color-bg-card);border-radius:0 0 .5rem .5rem;box-shadow:0 8px 24px #0006;z-index:100;max-height:280px;overflow-y:auto}.hero-location-item{display:flex;align-items:center;gap:.75rem;padding:.75rem 1rem;cursor:pointer;color:var(--color-text)}.hero-location-item:hover,.hero-location-item.is-focused{background-color:var(--color-bg-dark)}.hero-location-item strong{color:var(--color-accent-light)}.hero-location-item-icon{flex-shrink:0;color:var(--color-text-muted);display:flex;align-items:center}.hero-location-item-label{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.hero-location-no-results{padding:1rem;color:var(--color-text-muted);text-align:center;font-size:.875rem}.hero-geolocation-btn{display:flex;align-items:center;justify-content:center;padding:.875rem;background-color:var(--color-bg-dark);border:none;color:var(--color-text-muted);cursor:pointer;border-radius:0}.hero-geolocation-btn:hover{background-color:var(--color-accent);color:#fff}.hero-geolocation-btn.is-loading{opacity:.6;cursor:wait}.hero-geolocation-btn.is-loading svg{animation:spin 1s linear infinite}@media (max-width: 480px){.hero-geolocation-btn{flex:1}}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.hero-search-btn{display:flex;align-items:center;gap:.5rem;padding:.875rem 1.25rem;border-radius:0 .5rem .5rem 0;white-space:nowrap}.hero-search-btn svg{flex-shrink:0}@media (max-width: 480px){.hero-search-btn{flex:1;justify-content:center;border-radius:0 0 .5rem}}.hero-section--card{position:relative;display:flex;align-items:center;justify-content:flex-start;background-color:var(--color-bg-dark);background-size:cover;background-position:center;background-repeat:no-repeat;min-height:70vh;max-height:725px;padding:4rem 0}@media (max-width: 768px){.hero-section--card{min-height:auto;max-height:none;padding:3rem 0;justify-content:center}}.hero-section--card.hero-section--small{min-height:300px;max-height:400px;padding:2rem 0}.hero-section--card.hero-section--small .hero-section-title{font-size:2.25rem}@media (max-width: 768px){.hero-section--card.hero-section--small .hero-section-title{font-size:1.8rem}}.hero-section--card.hero-section--small .hero-card{padding:1.5rem}.hero-card{background-color:#0a0a0ad9;-webkit-backdrop-filter:blur(8px);backdrop-filter:blur(8px);border-radius:1rem;padding:2.375rem;width:520px;text-align:center;border:1px solid var(--color-border);position:absolute;top:50%;left:50vw;transform:translate(-50%,-50%)}@media (min-width: 1800px){.hero-card{left:calc(50vw - 410px)}}@media (min-width: 1650px) and (max-width: 1799px){.hero-card{left:32vw}}@media (min-width: 1500px) and (max-width: 1649px){.hero-card{left:410px}}@media (max-width: 768px){.hero-card{position:relative;top:auto;left:auto;transform:none;padding:1.125rem 2.375rem;margin:0 auto;border-radius:.75rem;width:calc(100% - 2rem);max-width:520px}}.hero-mobile-only .hero-section--card{min-height:max(70vh,auto);padding:20px 0;justify-content:center}.hero-mobile-only .hero-section--card .hero-card{position:relative;top:auto;left:auto;transform:none;max-width:520px;margin:0 auto}@media (max-width: 768px){.hero-mobile-only .hero-section--card .hero-card{width:calc(100% - 2rem)}}@media (min-height: 700px) and (max-height: 960px){.hero-mobile-only .hero-section--card .hero-card{margin-top:20px;margin-bottom:auto}}@media (max-height: 700px){.hero-mobile-only .hero-section--card .hero-card{transform:scale(.9)}}.hero-section--card .hero-section-logo{display:block;max-width:360px;height:auto;margin:0 auto 1.75rem}@media (max-width: 768px){.hero-section--card .hero-section-logo{max-width:280px;margin-bottom:1.25rem}}.hero-section--card .hero-section-title{font-family:var(--font-display);font-size:2.475rem;color:var(--color-text);margin-bottom:1.8125rem;line-height:1.1}@media (max-width: 1450px){.hero-section--card .hero-section-title{font-size:42px}}@media (max-width: 768px){.hero-section--card .hero-section-title{font-size:1.6rem;margin-bottom:.875rem}}@media (max-width: 600px){.hero-section--card .hero-section-title{font-size:1.5rem}}.hero-section--card .hero-section-subtitle{font-size:1rem;color:var(--color-text-muted);margin-bottom:1.75rem;line-height:1.6}@media (max-width: 768px){.hero-section--card .hero-section-subtitle{font-size:.9rem;margin-bottom:1.25rem}}@media (max-width: 650px){.hero-section--card .hero-section-subtitle{font-size:.775rem}}.hero-section--card .hero-section-actions{display:flex;flex-wrap:wrap;gap:.875rem;justify-content:center}@media (max-width: 549px){.hero-section--card .hero-section-actions{flex-direction:column;width:100%}.hero-section--card .hero-section-actions .btn,.hero-section--card .hero-section-actions .comment-form .form-submit input[type=submit],.comment-form .form-submit .hero-section--card .hero-section-actions input[type=submit]{width:100%;justify-content:center}}.hero-section--card .hero-location-search{margin-bottom:1.75rem}.hero-section--card .hero-location-search-inner{display:flex;gap:0;background-color:var(--color-bg-card);border-radius:.5rem;overflow:visible}@media (max-width: 480px){.hero-section--card .hero-location-search-inner{flex-wrap:wrap}}.hero-section--card .hero-location-input-wrap{flex:1;position:relative}@media (max-width: 480px){.hero-section--card .hero-location-input-wrap{flex:1 1 100%}}.hero-section--card .hero-location-input{width:100%;padding:.75rem .875rem;font-size:.9rem;font-family:var(--font-body);color:var(--color-text);background-color:var(--color-bg-card);border:none;outline:none}.hero-section--card .hero-location-input::-moz-placeholder{color:var(--color-text-muted)}.hero-section--card .hero-location-input::placeholder{color:var(--color-text-muted)}.hero-section--card .hero-location-input:focus{box-shadow:inset 0 0 0 2px var(--color-accent)}@media (max-width: 480px){.hero-section--card .hero-location-input{text-align:center;border-radius:.5rem .5rem 0 0}}.hero-section--card .hero-location-input.has-error{animation:shake-card .3s ease-in-out;box-shadow:inset 0 0 0 2px var(--color-accent)}@keyframes shake-card{0%,to{transform:translate(0)}25%{transform:translate(-4px)}75%{transform:translate(4px)}}.hero-section--card .hero-location-ghost{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;overflow:hidden;white-space:nowrap;display:none;align-items:center;box-sizing:border-box;padding:.75rem .875rem;font-size:.9rem;font-family:var(--font-body);line-height:1.5}.hero-section--card .hero-location-ghost .ghost-typed{opacity:0}.hero-section--card .hero-location-ghost .ghost-completion{color:var(--color-text-muted);opacity:.6}.hero-section--card .hero-location-dropdown{font-size:.9rem}.hero-section--card .hero-geolocation-btn{padding:.75rem}@media (max-width: 480px){.hero-section--card .hero-geolocation-btn{flex:1}}.hero-section--card .hero-search-btn{display:flex;align-items:center;gap:.5rem;padding:.75rem 1rem;border-radius:0 .5rem .5rem 0;white-space:nowrap;font-size:.8rem}@media (max-width: 480px){.hero-section--card .hero-search-btn{flex:1;justify-content:center;border-radius:0 0 .5rem}}.cta-section{padding:4rem 0}@media (max-width: 768px){.cta-section{padding:3rem 0}}.cta-section--default{background-color:var(--color-bg-card)}.cta-section--accent{background-color:var(--color-accent)}.cta-section--accent .cta-section-title{color:#fff}.cta-section--accent .cta-section-text{color:#ffffffe6}.cta-section--accent .btn-primary,.cta-section--accent .comment-form .form-submit input[type=submit],.comment-form .form-submit .cta-section--accent input[type=submit]{background-color:#fff;color:var(--color-accent)}.cta-section--accent .btn-primary:hover,.cta-section--accent .comment-form .form-submit input[type=submit]:hover,.comment-form .form-submit .cta-section--accent input[type=submit]:hover,.cta-section--accent .btn-primary:active,.cta-section--accent .comment-form .form-submit input[type=submit]:active,.comment-form .form-submit .cta-section--accent input[type=submit]:active{background-color:var(--color-text);color:#000}.cta-section-content{text-align:center;max-width:700px;margin:0 auto}.cta-section-title{font-family:var(--font-display);font-size:2.25rem;color:var(--color-text);margin-bottom:1rem}@media (max-width: 768px){.cta-section-title{font-size:1.875rem}}.cta-section-text{font-size:1.125rem;color:var(--color-text-muted);margin-bottom:1.5rem}.testimonial{background-color:var(--color-bg-card);border-radius:.5rem;padding:2rem;margin:0}.testimonial-quote{position:relative;margin-bottom:1.5rem}.testimonial-quote p{font-size:1.125rem;color:var(--color-text);line-height:1.7;font-style:italic;margin:0;padding-left:3.5rem}@media (max-width: 640px){.testimonial-quote p{font-size:1rem;padding-left:0;padding-top:3rem}}.testimonial-quote-icon{position:absolute;top:0;left:0;color:var(--color-accent);opacity:.5}@media (max-width: 640px){.testimonial-quote-icon{top:0;left:0}}.testimonial-footer{display:flex;flex-direction:column;gap:.25rem;padding-left:3.5rem}@media (max-width: 640px){.testimonial-footer{padding-left:0}}.testimonial-name{font-style:normal;font-weight:600;color:var(--color-text);font-size:.9375rem}.testimonial-location{font-size:.8125rem;color:var(--color-text-muted)}.testimonials-section{padding:4rem 0;background-color:var(--color-bg-dark)}@media (max-width: 768px){.testimonials-section{padding:3rem 0}}.testimonials-section-header{text-align:center;margin-bottom:3rem}.testimonials-section-title{font-family:var(--font-display);font-size:2.25rem;color:var(--color-text);margin-bottom:.75rem}@media (max-width: 768px){.testimonials-section-title{font-size:1.875rem}}.testimonials-section-subtitle{font-size:1.125rem;color:var(--color-text-muted);max-width:600px;margin:0 auto}.testimonials-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:2rem}@media (max-width: 768px){.testimonials-grid{grid-template-columns:1fr}}.feature-block{text-align:center;padding:1.5rem}.feature-block-icon{display:flex;align-items:center;justify-content:center;width:80px;height:80px;margin:0 auto 1.25rem;border-radius:50%;background-color:var(--color-bg-card);color:var(--color-accent)}.feature-block-title{font-family:var(--font-display);font-size:1.25rem;color:var(--color-text);margin-bottom:.75rem}.feature-block-text{font-size:.9375rem;color:var(--color-text-muted);line-height:1.6;margin-bottom:0}.features-section{padding:4rem 0;background-color:var(--color-bg-dark)}@media (max-width: 768px){.features-section{padding:3rem 0}}.features-section-header{text-align:center;margin-bottom:3rem}.features-section-title{font-family:var(--font-display);font-size:2.25rem;color:var(--color-text);margin-bottom:.75rem}@media (max-width: 768px){.features-section-title{font-size:1.875rem}}.features-section-subtitle{font-size:1.125rem;color:var(--color-text-muted);max-width:600px;margin:0 auto}.features-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:2rem}@media (max-width: 768px){.features-grid{grid-template-columns:1fr;gap:1.5rem}}.service-cards-section{padding:5rem 0;background-color:var(--color-bg-card)}@media (max-width: 640px){.service-cards-section{padding:2.5rem 0}}.service-cards-header{text-align:center;margin-bottom:3rem}@media (max-width: 640px){.service-cards-header{margin-bottom:1.5rem}}.service-cards-title{font-family:var(--font-display);font-size:2.5rem;color:var(--color-text);margin-bottom:1rem}@media (max-width: 768px){.service-cards-title{font-size:2rem}}@media (max-width: 640px){.service-cards-title{font-size:1.5rem;margin-bottom:.5rem}}.service-cards-subtitle{font-size:1.125rem;color:var(--color-text-muted);max-width:600px;margin:0 auto}@media (max-width: 640px){.service-cards-subtitle{font-size:.875rem}}.service-cards-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:2rem}@media (max-width: 992px){.service-cards-grid{grid-template-columns:repeat(2,1fr)}}@media (max-width: 640px){.service-cards-grid{grid-template-columns:repeat(2,1fr);gap:.75rem}}@media (max-width: 599px){.service-cards-grid{grid-template-columns:1fr;gap:1rem}}.service-card{position:relative;background-color:var(--color-bg-dark);border:1px solid var(--color-border);border-radius:.5rem;padding:2rem;text-align:center;cursor:pointer}.service-card:hover{border-color:var(--color-accent)}.service-card:hover .service-card-btn{background-color:var(--color-accent);color:var(--color-text)}@media (max-width: 640px){.service-card{padding:1rem}}.service-card-link-overlay{position:absolute;top:0;left:0;right:0;bottom:0;z-index:1}.service-card-icon{display:flex;align-items:center;justify-content:center;width:80px;height:80px;margin:0 auto 1.5rem;background-color:#9f37301a;border-radius:50%;color:var(--color-accent)}@media (max-width: 640px){.service-card-icon{width:48px;height:48px;margin-bottom:.75rem}.service-card-icon svg{width:24px;height:24px}}.service-card-title{font-family:var(--font-display);font-size:1.5rem;color:var(--color-text);margin-bottom:1rem}@media (max-width: 640px){.service-card-title{font-size:1rem;margin-bottom:.5rem}}.service-card-description{font-size:1rem;color:var(--color-text-muted);margin-bottom:1.5rem;line-height:1.6}@media (max-width: 640px){.service-card-description{font-size:.75rem;margin-bottom:.75rem;line-height:1.4}}.service-card-btn{display:inline-flex;align-items:center;gap:.5rem}.service-card-btn svg{transition:transform .2s ease}.service-card-btn:hover svg{transform:translate(4px)}@media (max-width: 640px){.service-card-btn{font-size:.75rem;padding:.5rem .75rem}.service-card-btn svg{width:14px;height:14px}}.btn-outline{background-color:transparent;border:2px solid var(--color-accent);color:var(--color-accent)}.btn-outline:hover{background-color:var(--color-accent);color:var(--color-text)}.property-type-boxes{padding:4rem 0;background-color:var(--color-bg-card)}@media (max-width: 768px){.property-type-boxes{padding:3rem 0}}.type-boxes-grid{display:grid;grid-template-columns:repeat(5,1fr);gap:1.5rem}@media (max-width: 1200px){.type-boxes-grid{grid-template-columns:repeat(3,1fr)}}@media (max-width: 768px){.type-boxes-grid{grid-template-columns:repeat(2,1fr);gap:1rem}}@media (max-width: 480px){.type-boxes-grid{grid-template-columns:1fr}}.type-box{display:flex;flex-direction:column;align-items:center;text-align:center;padding:1.75rem 1.5rem;background-color:var(--color-bg-dark);border:1px solid var(--color-border);border-radius:.5rem;text-decoration:none;transition:all .2s ease}.type-box:hover{border-color:var(--color-accent);transform:translateY(-2px)}.type-box:hover .type-box-arrow{opacity:1;transform:translate(0)}@media (max-width: 768px){.type-box{padding:1.25rem 1rem}}.type-box-icon{display:flex;justify-content:center;color:var(--color-accent);margin-bottom:1.25rem;transition:color .2s ease}.type-box-icon svg{display:block}@media (max-width: 768px){.type-box-icon{margin-bottom:1rem}.type-box-icon svg{width:28px;height:28px}}.type-box-content{flex:1;display:flex;flex-direction:column;align-items:center}.type-box-title{font-family:var(--font-display);font-size:1.375rem;font-weight:400;color:var(--color-text);margin-bottom:.625rem}@media (max-width: 768px){.type-box-title{font-size:1.125rem;margin-bottom:.5rem}}.type-box-description{font-size:.8125rem;color:var(--color-text-muted);line-height:1.5;margin-bottom:0}@media (max-width: 768px){.type-box-description{font-size:.75rem}}.type-box-arrow{align-self:center;color:var(--color-accent);opacity:0;transform:translate(-8px);transition:all .2s ease;margin-top:1rem}@media (max-width: 768px){.type-box-arrow{display:none}}.custom-content-section{padding:4rem 0;background-color:var(--color-bg)}@media (max-width: 768px){.custom-content-section{padding:3rem 0}}.custom-content-section:nth-of-type(2n){background-color:var(--color-bg-card)}.custom-content-body{max-width:900px;margin:0 auto;font-size:1rem;line-height:1.7;color:var(--color-text)}.custom-content-body h2,.custom-content-body h3,.custom-content-body h4,.custom-content-body h5,.custom-content-body h6{font-family:var(--font-display);color:var(--color-text);margin-top:2rem;margin-bottom:1rem}.custom-content-body h2:first-child,.custom-content-body h3:first-child,.custom-content-body h4:first-child,.custom-content-body h5:first-child,.custom-content-body h6:first-child{margin-top:0}.custom-content-body h2{font-size:1.75rem}.custom-content-body h3{font-size:1.5rem}.custom-content-body h4{font-size:1.25rem}.custom-content-body p{margin-bottom:1.25rem}.custom-content-body p:last-child{margin-bottom:0}.custom-content-body a{color:var(--color-accent);text-decoration:underline}.custom-content-body a:hover{color:var(--color-accent-hover)}.custom-content-body ul,.custom-content-body ol{margin-bottom:1.25rem;padding-left:1.5rem}.custom-content-body ul li,.custom-content-body ol li{margin-bottom:.5rem}.custom-content-body ul{list-style-type:disc}.custom-content-body ol{list-style-type:decimal}.custom-content-body blockquote{border-left:4px solid var(--color-accent);padding-left:1.5rem;margin:1.5rem 0;font-style:italic;color:var(--color-text-muted)}.custom-content-body img{max-width:100%;height:auto;border-radius:.5rem;margin:1.5rem 0}.custom-content-body .alignleft{float:left;margin-right:1.5rem;margin-bottom:1rem}.custom-content-body .alignright{float:right;margin-left:1.5rem;margin-bottom:1rem}.custom-content-body .aligncenter{display:block;margin-left:auto;margin-right:auto}.custom-content-body:after{content:"";display:table;clear:both}.Content_Sidebar .content-sidebar-section{padding:4rem 0}.Content_Sidebar .content-sidebar-layout{display:grid;grid-template-columns:1fr;gap:3rem}@media (min-width: 992px){.Content_Sidebar .content-sidebar-layout{grid-template-columns:7fr 3fr}}.Content_Sidebar .content-sidebar-main h2,.Content_Sidebar .content-sidebar-main h3,.Content_Sidebar .content-sidebar-main h4{margin-top:1.5rem;margin-bottom:.75rem}.Content_Sidebar .content-sidebar-main p{margin-bottom:1rem;line-height:1.7}.Content_Sidebar .content-sidebar-main ul,.Content_Sidebar .content-sidebar-main ol{margin-bottom:1rem;padding-left:1.5rem}.Content_Sidebar .content-sidebar-aside{display:flex;flex-direction:column;gap:1.5rem}.Content_Sidebar .sidebar-callout-box{background:var(--color-surface, #1a1a1a);border:1px solid var(--color-border, #333);border-radius:8px;padding:1.5rem}.Content_Sidebar .sidebar-callout-box .sidebar-callout-title{font-size:1.125rem;margin-bottom:.75rem;color:var(--color-accent, #c45c26)}.Content_Sidebar .sidebar-callout-box .sidebar-callout-content{font-size:.9375rem;color:var(--color-text-muted, #aaa);margin-bottom:1rem}.Content_Sidebar .sidebar-callout-box .sidebar-callout-content p:last-child{margin-bottom:0}.Alternating_Blocks .alternating-blocks-section{padding:2rem 0}.Alternating_Blocks .alternating-block{padding:3rem 0}.Alternating_Blocks .alternating-block:nth-child(2n){background:var(--color-surface, #1a1a1a)}.Alternating_Blocks .alternating-block-inner{display:grid;grid-template-columns:1fr;gap:2rem;align-items:center}@media (min-width: 768px){.Alternating_Blocks .alternating-block-inner{grid-template-columns:1fr 1fr;gap:4rem}.Alternating_Blocks .alternating-block--reverse .alternating-block-inner{direction:rtl}.Alternating_Blocks .alternating-block--reverse .alternating-block-inner>*{direction:ltr}}.Alternating_Blocks .alternating-block-image img{width:100%;height:auto;border-radius:8px}.Alternating_Blocks .alternating-block-title{font-size:1.75rem;margin-bottom:1rem}.Alternating_Blocks .alternating-block-text{color:var(--color-text-muted, #aaa);margin-bottom:1.5rem}.Alternating_Blocks .alternating-block-text p{margin-bottom:1rem}.Service_Detail .service-intro-section{padding:3rem 0;max-width:800px;margin:0 auto}.Service_Detail .service-intro-section .service-intro-content{font-size:1.125rem;line-height:1.8}.Service_Detail .service-features-section{padding:3rem 0;background:var(--color-surface, #1a1a1a)}.Service_Detail .service-features-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:2rem}.Service_Detail .service-feature-card{background:var(--color-bg, #0a0a0a);border:1px solid var(--color-border, #333);border-radius:8px;padding:2rem;text-align:center}.Service_Detail .service-feature-icon{color:var(--color-accent, #c45c26);margin-bottom:1rem}.Service_Detail .service-feature-title{font-size:1.25rem;margin-bottom:.5rem}.Service_Detail .service-feature-desc{color:var(--color-text-muted, #aaa);font-size:.9375rem}.Service_Detail .service-faq-section{padding:4rem 0;max-width:800px;margin:0 auto}.Service_Detail .service-faq-heading{font-size:2rem;margin-bottom:2rem;text-align:center}.Service_Detail .service-faq-list{display:flex;flex-direction:column;gap:1rem}.Service_Detail .service-faq-item{background:var(--color-surface, #1a1a1a);border:1px solid var(--color-border, #333);border-radius:8px;overflow:hidden}.Service_Detail .service-faq-item[open] .service-faq-question:after{transform:rotate(180deg)}.Service_Detail .service-faq-question{padding:1.25rem 1.5rem;font-weight:600;cursor:pointer;display:flex;justify-content:space-between;align-items:center;list-style:none}.Service_Detail .service-faq-question::-webkit-details-marker{display:none}.Service_Detail .service-faq-question:after{content:"";border:solid var(--color-accent, #c45c26);border-width:0 2px 2px 0;padding:4px;transform:rotate(45deg);transition:transform .2s}.Service_Detail .service-faq-answer{padding:0 1.5rem 1.25rem;color:var(--color-text-muted, #aaa)}.Card_Grid .card-grid-section{padding:4rem 0}.Card_Grid .card-grid-intro{max-width:800px;margin:0 auto 3rem;text-align:center}.Card_Grid .card-grid{display:grid;gap:2rem}.Card_Grid .card-grid.card-grid--2col{grid-template-columns:repeat(auto-fit,minmax(300px,1fr))}@media (min-width: 768px){.Card_Grid .card-grid.card-grid--2col{grid-template-columns:repeat(2,1fr)}}.Card_Grid .card-grid.card-grid--3col{grid-template-columns:repeat(auto-fit,minmax(280px,1fr))}@media (min-width: 992px){.Card_Grid .card-grid.card-grid--3col{grid-template-columns:repeat(3,1fr)}}.Card_Grid .card-grid.card-grid--4col{grid-template-columns:repeat(auto-fit,minmax(240px,1fr))}@media (min-width: 1200px){.Card_Grid .card-grid.card-grid--4col{grid-template-columns:repeat(4,1fr)}}.Card_Grid .grid-card{background:var(--color-surface, #1a1a1a);border:1px solid var(--color-border, #333);border-radius:8px;overflow:hidden;transition:transform .2s,box-shadow .2s}.Card_Grid .grid-card:hover{transform:translateY(-4px);box-shadow:0 8px 24px #0000004d}.Card_Grid .grid-card-image{aspect-ratio:16/10;overflow:hidden}.Card_Grid .grid-card-image img{width:100%;height:100%;-o-object-fit:cover;object-fit:cover}.Card_Grid .grid-card-content{padding:1.5rem}.Card_Grid .grid-card-title{font-size:1.25rem;margin-bottom:.5rem}.Card_Grid .grid-card-desc{color:var(--color-text-muted, #aaa);font-size:.9375rem;margin-bottom:1rem}.Card_Grid .grid-card-link{color:var(--color-accent, #c45c26);font-weight:500}.Card_Grid .grid-card-link:hover{text-decoration:underline}.Long_Form_Article .article-breadcrumbs{padding:1rem 0;background:var(--color-surface, #1a1a1a);border-bottom:1px solid var(--color-border, #333)}.Long_Form_Article .breadcrumb-list{display:flex;align-items:center;gap:.5rem;list-style:none;padding:0;margin:0;font-size:.875rem}.Long_Form_Article .breadcrumb-list li:not(:last-child):after{content:"/";margin-left:.5rem;color:var(--color-text-muted, #666)}.Long_Form_Article .breadcrumb-list a{color:var(--color-text-muted, #aaa)}.Long_Form_Article .breadcrumb-list a:hover{color:var(--color-accent, #c45c26)}.Long_Form_Article .breadcrumb-current{color:var(--color-text, #fff)}.Long_Form_Article .article-content-wrapper{padding:4rem 0}.Long_Form_Article .article-header{max-width:800px;margin:0 auto 3rem;text-align:center}.Long_Form_Article .article-title{font-size:2.5rem;margin-bottom:1rem}@media (min-width: 768px){.Long_Form_Article .article-title{font-size:3rem}}.Long_Form_Article .article-subtitle{font-size:1.25rem;color:var(--color-text-muted, #aaa)}.Long_Form_Article .article-body{max-width:800px;margin:0 auto;font-size:1.0625rem;line-height:1.8}.Long_Form_Article .article-body h2{font-size:1.75rem;margin:2.5rem 0 1rem}.Long_Form_Article .article-body h3{font-size:1.375rem;margin:2rem 0 .75rem}.Long_Form_Article .article-body p{margin-bottom:1.25rem}.Long_Form_Article .article-body ul,.Long_Form_Article .article-body ol{margin-bottom:1.25rem;padding-left:1.5rem}.Long_Form_Article .article-body li{margin-bottom:.5rem}.Long_Form_Article .article-body blockquote{border-left:4px solid var(--color-accent, #c45c26);padding-left:1.5rem;margin:2rem 0;font-style:italic;color:var(--color-text-muted, #aaa)}.Long_Form_Article .article-related{max-width:800px;margin:3rem auto 0;padding-top:2rem;border-top:1px solid var(--color-border, #333)}.Long_Form_Article .article-related-heading{font-size:1.25rem;margin-bottom:1rem}.Long_Form_Article .article-related-list{list-style:none;padding:0}.Long_Form_Article .article-related-list li{margin-bottom:.5rem}.Long_Form_Article .article-related-list a{color:var(--color-accent, #c45c26)}.Long_Form_Article .article-related-list a:hover{text-decoration:underline}.Landing_Page .landing-hero{min-height:60vh;display:flex;align-items:center;justify-content:center;text-align:center;position:relative;background-size:cover;background-position:center;background-color:var(--color-surface, #1a1a1a)}.Landing_Page .landing-hero.has-background{color:#fff}.Landing_Page .landing-hero-overlay{position:absolute;top:0;right:0;bottom:0;left:0;background:#0009}.Landing_Page .landing-hero-content{position:relative;z-index:1;max-width:800px;padding:3rem 1rem}.Landing_Page .landing-hero-title{font-size:2.5rem;margin-bottom:1rem}@media (min-width: 768px){.Landing_Page .landing-hero-title{font-size:3.5rem}}.Landing_Page .landing-hero-subtitle{font-size:1.25rem;margin-bottom:2rem;opacity:.9}.Landing_Page .landing-hero-cta{font-size:1.125rem;padding:1rem 2.5rem}.Landing_Page .landing-benefits-section{padding:4rem 0;background:var(--color-bg, #0a0a0a)}.Landing_Page .landing-benefits-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:2rem;text-align:center}.Landing_Page .landing-benefit{padding:1.5rem}.Landing_Page .landing-benefit-icon{color:var(--color-accent, #c45c26);margin-bottom:1rem}.Landing_Page .landing-benefit-title{font-size:1.25rem;margin-bottom:.5rem}.Landing_Page .landing-benefit-desc{color:var(--color-text-muted, #aaa);font-size:.9375rem}.Landing_Page .landing-testimonial-section{padding:4rem 0;background:var(--color-surface, #1a1a1a)}.Landing_Page .landing-testimonial{max-width:800px;margin:0 auto;text-align:center}.Landing_Page .landing-testimonial-quote{font-size:1.5rem;font-style:italic;line-height:1.6;margin-bottom:1.5rem}@media (min-width: 768px){.Landing_Page .landing-testimonial-quote{font-size:1.75rem}}.Landing_Page .landing-testimonial-footer{display:flex;flex-direction:column;gap:.25rem}.Landing_Page .landing-testimonial-author{font-weight:600;font-style:normal}.Landing_Page .landing-testimonial-title{color:var(--color-text-muted, #aaa);font-size:.875rem}.City_Landing_Page .city-hero{background-color:var(--color-primary);color:var(--color-white);padding:4rem 0;text-align:center}.City_Landing_Page .city-hero-title{font-size:2.5rem;font-weight:700;margin:0 0 .5rem}@media (min-width: 768px){.City_Landing_Page .city-hero-title{font-size:3rem}}.City_Landing_Page .city-hero-subtitle{font-size:1.25rem;margin:0 0 .5rem;opacity:.9}.City_Landing_Page .city-hero-count{font-size:1rem;margin:0;opacity:.8}.City_Landing_Page .city-about{padding:3rem 0;background-color:var(--color-surface)}.City_Landing_Page .city-about-content{max-width:800px;margin:0 auto}.City_Landing_Page .city-about-content h2,.City_Landing_Page .city-about-content h3{color:var(--color-primary);margin-top:1.5rem}.City_Landing_Page .city-about-content h2:first-child,.City_Landing_Page .city-about-content h3:first-child{margin-top:0}.City_Landing_Page .city-about-content ul{padding-left:1.5rem}.City_Landing_Page .city-about-content ul li{margin-bottom:.5rem}.City_Landing_Page .city-about-content p{line-height:1.7;color:var(--color-text)}.City_Landing_Page .city-listings{padding:3rem 0 4rem}.City_Landing_Page .city-listings .section-header{text-align:center;margin-bottom:2rem}.City_Landing_Page .city-listings .section-title{font-size:1.75rem;color:var(--color-primary);margin:0}@media (min-width: 768px){.City_Landing_Page .city-listings .section-title{font-size:2rem}}.City_Landing_Page .city-listings-cta{text-align:center;margin-top:2.5rem}.City_Landing_Page .city-listings-cta .btn,.City_Landing_Page .city-listings-cta .comment-form .form-submit input[type=submit],.comment-form .form-submit .City_Landing_Page .city-listings-cta input[type=submit]{display:inline-flex;align-items:center;gap:.5rem}.City_Landing_Page .city-no-listings{padding:3rem 0;text-align:center}.City_Landing_Page .city-no-listings p{font-size:1.125rem;color:var(--color-text-muted)}.City_Landing_Page .city-no-listings a{color:var(--color-accent)}.City_Landing_Page .city-no-listings a:hover{text-decoration:underline}.City_Landing_Page .property-grid-4{display:grid;gap:1.5rem;grid-template-columns:1fr}@media (min-width: 640px){.City_Landing_Page .property-grid-4{grid-template-columns:repeat(2,1fr)}}@media (min-width: 1024px){.City_Landing_Page .property-grid-4{grid-template-columns:repeat(3,1fr)}}@media (min-width: 1280px){.City_Landing_Page .property-grid-4{grid-template-columns:repeat(4,1fr)}}:root{--color-bg-dark: #0A0A0A;--color-bg-card: #161616;--color-accent: #9F3730;--color-accent-hover: #C8473F;--color-accent-light: #BF524B;--color-text: #F5F5F5;--color-text-muted: #B0B0B0;--color-border: #2A2A2A;--color-success: #2E7D32;--color-warning: #F9A825;--color-sold: #757575;--font-display: "Abril Fatface", Georgia, serif;--font-body: "Inter", "Droid Sans", Arial, sans-serif;--container-max: 1400px;--container-padding: 1.5rem;--transition-fast: .15s ease}html{font-size:16px;scroll-behavior:smooth}body{font-family:var(--font-body);background-color:var(--color-bg-dark);color:var(--color-text-muted);line-height:1.6;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}h1,h2,h3,h4,h5,h6{font-family:var(--font-display);color:var(--color-text);font-weight:400;line-height:1.2;margin-bottom:1rem}h1{font-size:3rem}h2{font-size:2.25rem}h3{font-size:1.875rem}h4{font-size:1.5rem}h5{font-size:1.25rem}h6{font-size:1.125rem}p{margin-bottom:1rem}a{color:var(--color-accent-light);text-decoration:none}a:hover{color:var(--color-accent-hover)}.container{max-width:var(--container-max);margin-left:auto;margin-right:auto;padding-left:var(--container-padding);padding-right:var(--container-padding)}.site-main{min-height:50vh}.btn,.comment-form .form-submit input[type=submit]{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;padding:.75rem 1.5rem;font-family:var(--font-body);font-weight:600;font-size:.875rem;text-transform:uppercase;letter-spacing:.05em;border-radius:.25rem;border:none;cursor:pointer}.btn svg,.comment-form .form-submit input[type=submit] svg{flex-shrink:0}.btn-primary,.comment-form .form-submit input[type=submit]{background-color:var(--color-accent);color:#fff}.btn-primary:hover,.comment-form .form-submit input[type=submit]:hover{background-color:var(--color-accent-hover);color:#fff}.btn-secondary{background-color:transparent;border:2px solid var(--color-accent);color:var(--color-accent)}.btn-secondary:hover{background-color:var(--color-accent);color:#fff}.btn-sm{padding:.5rem 1rem;font-size:.75rem;gap:.375rem}.badge{display:inline-block;padding:.25rem .75rem;font-size:.75rem;font-weight:600;text-transform:uppercase;letter-spacing:.05em;border-radius:.25rem}.badge-success{background-color:var(--color-success);color:#fff}.badge-warning{background-color:var(--color-warning);color:#000}.badge-muted{background-color:var(--color-sold);color:#fff}.badge-type{background-color:#1e40af;color:#dbeafe}.badge-active{background-color:#065f46;color:#d1fae5}.badge-pending{background-color:#92400e;color:#fef3c7}.badge-sold{background-color:#374151;color:#d1d5db}.card{background-color:var(--color-bg-card);border-radius:.5rem;overflow:hidden}input[type=text],input[type=email],input[type=tel],input[type=number],input[type=search],textarea,select{width:100%;padding:.75rem 1rem;background-color:#000;border:1px solid var(--color-border);border-radius:.25rem;color:var(--color-text);font-family:var(--font-body);font-size:1rem}input[type=text]::-moz-placeholder,input[type=email]::-moz-placeholder,input[type=tel]::-moz-placeholder,input[type=number]::-moz-placeholder,input[type=search]::-moz-placeholder,textarea::-moz-placeholder,select::-moz-placeholder{color:var(--color-sold)}input[type=text]::placeholder,input[type=email]::placeholder,input[type=tel]::placeholder,input[type=number]::placeholder,input[type=search]::placeholder,textarea::placeholder,select::placeholder{color:var(--color-sold)}input[type=text]:focus,input[type=email]:focus,input[type=tel]:focus,input[type=number]:focus,input[type=search]:focus,textarea:focus,select:focus{outline:none;border-color:var(--color-accent)}.wpcf7 br{display:none}.text-center{text-align:center}.text-left{text-align:left}.text-right{text-align:right}.mt-0{margin-top:0}.mb-0{margin-bottom:0}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.alignwide{max-width:calc(var(--container-max) + 200px)}.alignfull{width:100vw;position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw}.wp-block-image img{max-width:100%;height:auto}@media (max-width: 768px){:root{--container-padding: 1rem}h1{font-size:2.25rem}h2{font-size:1.875rem}h3{font-size:1.5rem}}::view-transition-old(root),::view-transition-new(root){animation:none}.has-title-animations .about-team-title,.has-title-animations .about-broker-title,.has-title-animations .about-story-content h2,.has-title-animations .about-story-content h3,.has-title-animations .contact-form-title,.has-title-animations .contact-info-title,.has-title-animations .join-team-title,.has-title-animations .join-benefit-title,.has-title-animations .section-title,.has-title-animations .resource-featured-title,.has-title-animations .resource-card-title{display:inline-block;transition:letter-spacing .2s ease,transform .2s ease;cursor:default}.has-title-animations .about-team-title:hover,.has-title-animations .about-broker-title:hover,.has-title-animations .about-story-content h2:hover,.has-title-animations .about-story-content h3:hover,.has-title-animations .contact-form-title:hover,.has-title-animations .contact-info-title:hover,.has-title-animations .join-team-title:hover,.has-title-animations .join-benefit-title:hover,.has-title-animations .section-title:hover,.has-title-animations .resource-featured-title:hover,.has-title-animations .resource-card-title:hover{letter-spacing:.02em;transform:translate(2px)} diff --git a/wp-content/themes/homeproz/dist/assets/main.js b/wp-content/themes/homeproz/dist/assets/main.js old mode 100755 new mode 100644 index 010e6eb6..7d37efa5 --- a/wp-content/themes/homeproz/dist/assets/main.js +++ b/wp-content/themes/homeproz/dist/assets/main.js @@ -1 +1 @@ -(function(r){var P=r(".menu-toggle"),n=r(".mobile-navigation");P.length&&(P.on("click",function(){var s=r(this).attr("aria-expanded")==="true";r(this).attr("aria-expanded",!s),n.toggleClass("is-open"),s?r("body").removeClass("mobile-menu-open"):r("body").addClass("mobile-menu-open")}),r(document).on("keydown",function(s){s.key==="Escape"&&n.hasClass("is-open")&&(P.attr("aria-expanded","false"),n.removeClass("is-open"),r("body").removeClass("mobile-menu-open"))}),r(document).on("click",function(s){n.hasClass("is-open")&&!r(s.target).closest(".mobile-navigation").length&&!r(s.target).closest(".menu-toggle").length&&(P.attr("aria-expanded","false"),n.removeClass("is-open"),r("body").removeClass("mobile-menu-open"))}))})(jQuery);(function(r){var P=6e3,n=1450,s=1e3,c=[],h=0,f=null,v=!1,u=!1,m=null;function y(){if(r(".Home_Page").length&&(m=r(".hero-split-image"),!!m.length)){var l=m.data("gallery-images");!l||!l.length||(c=l,I(),r(window).on("resize",o(I,150)))}}function I(){var l=r(window).width();l>=n?v||t():v&&e()}function t(){v=!0,u||(i(),u=!0),f=setInterval(a,P)}function e(){v=!1,f&&(clearInterval(f),f=null)}function i(){r.each(c,function(l,d){var p=new Image;p.src=d})}function a(){h=(h+1)%c.length;var l=c[h],d=r('
');d.css({position:"absolute",top:0,left:0,right:0,bottom:0,"background-image":"url("+l+")","background-size":"cover","background-position":"center center","background-repeat":"no-repeat",opacity:0,transform:"scale(1.02)",transition:"opacity "+s+"ms ease-in-out, transform "+s+"ms ease-in-out","z-index":1}),m.css("position","relative"),m.append(d),d[0].offsetHeight,d.css({opacity:1,transform:"scale(1)"}),setTimeout(function(){m.css("background-image","url("+l+")"),d.remove()},s)}function o(l,d){var p;return function(){var g=this,b=arguments;clearTimeout(p),p=setTimeout(function(){l.apply(g,b)},d)}}r(document).ready(y)})(jQuery);(function(r){var P=2,n=null,s=!1;function c(){var m=r(".hero-location-search");m.length&&(v(),m.each(function(){h(r(this))}))}function h(m){var y=m.find(".hero-location-input"),I=m.find('input[name="city"]'),t=m.find('input[name="zip"]'),e=m.find(".hero-geolocation-btn"),i=r('');y.after(i),f(y,i);var a=null;function o(b){if(!n||b.length=P){var x=b,w=a.label.substring(x.length),C=''+u(x)+''+u(w)+"";i.html(C).show()}else i.empty().hide(),a=null}function d(){return a?(y.val(a.label),a.type==="city"?(I.val(a.label),t.val("")):(t.val(a.value),I.val("")),i.empty().hide(),a=null,!0):!1}function p(){var b=y.val().trim();if(I.val()||t.val())return!0;var x=g(b);if(x)return y.val(x.label),x.type==="city"?(I.val(x.label),t.val("")):(t.val(x.value),I.val("")),!0;if(a)return y.val(a.label),a.type==="city"?(I.val(a.label),t.val("")):(t.val(a.value),I.val("")),!0;var w=o(b);return w?(y.val(w.label),w.type==="city"?(I.val(w.label),t.val("")):(t.val(w.value),I.val("")),!0):!1}function g(b){if(!n||!b)return null;for(var x=b.toLowerCase(),w=0;w0;c--){var h=Math.floor(Math.random()*(c+1)),f=s[c];s[c]=s[h],s[h]=f}return s},renderListings:function(){if(!this.listings||this.listings.length===0){this.grid.hide(),this.emptyMessage.show();return}for(var n=[],s=[],c=0;c',n.bedrooms&&(h+='
  • '+n.bedrooms+" "+s+"
  • "),n.bathrooms&&(h+='
  • '+n.bathrooms+" "+c+"
  • "),n.sqft&&(h+='
  • '+n.sqft.toLocaleString()+" sqft
  • "),h+=""),'
    Active
    '+this.escapeHtml(n.price_formatted)+'

    '+this.escapeHtml(n.address)+"

    "+h+'View Details
    '},escapeHtml:function(n){if(!n)return"";var s=document.createElement("div");return s.textContent=n,s.innerHTML}};r(document).ready(function(){P.init()})}})(jQuery);(function(r){var P={PREFIX:"HOMEPROZ_AJAX_",EXPIRY_MS:3e5,init:function(){this.cleanExpired()},cleanExpired:function(){try{for(var t=Date.now(),e=[],i=0;ithis.EXPIRY_MS&&e.push(a)}catch{e.push(a)}}e.forEach(function(l){sessionStorage.removeItem(l)})}catch{}},normalizeData:function(t){var e={};for(var i in t)if(i!=="nonce"){var a=t[i];Array.isArray(a)?e[i]=a.map(function(o){return typeof o=="number"?Math.round(o*1e4)/1e4:o}):e[i]=a}return e},getKey:function(t){for(var e=this.normalizeData(t),i=JSON.stringify(e),a=0,o=0;othis.EXPIRY_MS?(sessionStorage.removeItem(e),null):a.data}catch{return null}},set:function(t,e){try{var i=this.getKey(t),a={time:Date.now(),data:e};sessionStorage.setItem(i,JSON.stringify(a))}catch{}}};P.init();var n={pending:{clusters:null,properties:null},timeouts:{clusters:null,properties:null},requestIds:{clusters:0,properties:0},debounceDelay:200,queue:function(t,e,i,a,o){var l=this;this.timeouts[t]&&(clearTimeout(this.timeouts[t]),this.timeouts[t]=null),this.pending[t]&&(this.pending[t].abort(),this.pending[t]=null),this.requestIds[t]++;var d=this.requestIds[t];this.timeouts[t]=setTimeout(function(){l.timeouts[t]=null;var p=e(d);p&&p.then&&(l.pending[t]=p,p.done(function(g){d===l.requestIds[t]&&i(g,d)}),p.fail(function(g,b,x){o&&d===l.requestIds[t]&&b!=="abort"&&o(g,b,x)}),p.always(function(){l.pending[t]===p&&(l.pending[t]=null),a&&d===l.requestIds[t]&&a()}))},this.debounceDelay)},cancel:function(t){var e=t?[t]:["clusters","properties"],i=this;e.forEach(function(a){i.timeouts[a]&&(clearTimeout(i.timeouts[a]),i.timeouts[a]=null),i.pending[a]&&(i.pending[a].abort(),i.pending[a]=null)})},isLoading:function(t){return!!(this.pending[t]||this.timeouts[t])}},s={map:null,markers:{},markerData:{},densityLayer:null,clusterLayer:null,markerLayer:null,selectedPropertyId:null,isPinClickPan:!1,hoveredPropertyId:null,temporaryHoverMarker:null,baseZIndex:400,currentFilters:{},currentMode:null,initialCenter:[45,-93.5],initialZoom:7,needsInitialFit:!1,init:function(t,e){var i=r("#property-map");if(!(!i.length||typeof L>"u")){this.currentFilters=t||{},this.needsInitialFit=!e,this.map=L.map("property-map").setView([45,-93.5],7),L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",{attribution:'© OpenStreetMap'}).addTo(this.map),this.densityLayer=L.layerGroup().addTo(this.map),this.clusterLayer=L.layerGroup().addTo(this.map),this.markerLayer=L.layerGroup().addTo(this.map);var a=this;this.map.on("moveend zoomend",function(){a.loadClusters(),setTimeout(function(){h.updateUrlState()},400)}),this.bindCardHoverEvents(),this.initStickyBoundary(),this.needsInitialFit?this.fitToAllProperties():this.loadClusters()}},fitToAllProperties:function(){var t=this;r.ajax({url:homeprozAjax.ajaxUrl,type:"GET",data:{action:"homeproz_get_filter_bounds",property_type:this.currentFilters.property_type||"",city:this.currentFilters.city||"",min_price:this.currentFilters.min_price||"",max_price:this.currentFilters.max_price||"",min_beds:this.currentFilters.min_beds||""},success:function(e){if(e.success&&e.data){var i=e.data,a=(i.ne_lat-i.sw_lat)*.15,o=(i.ne_lng-i.sw_lng)*.15,l=L.latLngBounds([i.sw_lat-a,i.sw_lng-o],[i.ne_lat+a,i.ne_lng+o]);t.map.fitBounds(l)}else t.loadClusters();t.needsInitialFit=!1},error:function(){t.loadClusters(),t.needsInitialFit=!1}})},initStickyBoundary:function(){},loadClusters:function(){if(this.map){var t=this,e=this.map.getBounds(),i=this.map.getCenter(),a=this.map.getZoom(),o=[e.getSouthWest().lat,e.getSouthWest().lng,e.getNorthEast().lat,e.getNorthEast().lng],l=[i.lat,i.lng],d={action:"mls_get_clusters",zoom:a,bounds:o,status:this.currentFilters.status||"Active",property_type:this.currentFilters.property_type||"",city:this.currentFilters.city||"",min_price:this.currentFilters.min_price||"",max_price:this.currentFilters.max_price||"",min_beds:this.currentFilters.min_beds||""};h.updateFromMap(o,l);var p=P.get(d);if(p&&p.success){var g=p.data;switch(this.currentMode=g.type,g.type){case"density":this.renderDensity(g.dots);break;case"clusters":this.renderClusters(g.clusters);break;case"markers":this.renderMarkers(g.markers);break}return}n.queue("clusters",function(b){return r.ajax({url:homeprozMapData.clusterEndpoint,type:"GET",data:d})},function(b,x){if(b.success){P.set(d,b);var w=b.data;switch(t.currentMode=w.type,w.type){case"density":t.renderDensity(w.dots);break;case"clusters":t.renderClusters(w.clusters);break;case"markers":t.renderMarkers(w.markers);break}}})}},clearAllLayers:function(){this.densityLayer.clearLayers(),this.clusterLayer.clearLayers(),this.markerLayer.clearLayers(),this.markers={},this.temporaryHoverMarker&&(this.map.removeLayer(this.temporaryHoverMarker),this.temporaryHoverMarker=null)},renderDensity:function(t){this.clearAllLayers(),this.selectedPropertyId=null,this.isPinClickPan=!1,r(".property-card").removeClass("property-card-highlighted");var e=this,i=this.map.getZoom();t.forEach(function(a){var o=e.getDensityColor(a.count,i),l=e.getDensitySize(a.count,i),d=L.divIcon({html:'
    ',className:"density-dot-container",iconSize:[l,l],iconAnchor:[l/2,l/2]}),p=L.marker([a.lat,a.lng],{icon:d});p.on("click",function(){e.map.setView([a.lat,a.lng],e.map.getZoom()+2)}),p.bindTooltip(a.count+" properties",{className:"density-tooltip"}),e.densityLayer.addLayer(p)})},getDensityThreshold:function(t){return Math.max(40,Math.round(600/Math.pow(1.4,t-3)))},getDensityColor:function(t,e){var i=this.getDensityThreshold(e),a=t/i;return a>=1.5?"rgba(180, 83, 9, 0.8)":a>=1?"rgba(217, 119, 6, 0.8)":a>=.6?"rgba(245, 158, 11, 0.8)":a>=.3?"rgba(234, 179, 8, 0.8)":a>=.15?"rgba(132, 204, 22, 0.8)":"rgba(34, 197, 94, 0.8)"},getDensitySize:function(t,e){var i=this.getDensityThreshold(e),a=t/i;return a>=1.5?11:a>=1?10:a>=.6?8:a>=.3?7:6},renderClusters:function(t){this.clearAllLayers(),this.selectedPropertyId=null,this.isPinClickPan=!1,r(".property-card").removeClass("property-card-highlighted");var e=this;t.forEach(function(i){var a="small",o=30;i.count>200?(a="large",o=40):i.count>=100&&(a="medium",o=35);var l=L.divIcon({html:"
    "+i.count+"
    ",className:"marker-cluster marker-cluster-"+a+" server-cluster",iconSize:L.point(o,o)}),d=L.marker([i.lat,i.lng],{icon:l});d.on("click",function(){e.map.setView([i.lat,i.lng],e.map.getZoom()+2)});var p="$"+e.formatNumber(i.min_price);i.max_price!==i.min_price&&(p+=" - $"+e.formatNumber(i.max_price)),d.bindTooltip(i.count+" properties
    "+p,{className:"cluster-tooltip"}),e.clusterLayer.addLayer(d)})},renderMarkers:function(t){var e=this.selectedPropertyId;this.clearAllLayers(),this.hoveredPropertyId=null;var i=this,a=[];t.forEach(function(o,l){if(o.lat&&o.lng){var d=o.id===e,p=d?"amber":"red",g=L.marker([o.lat,o.lng],{icon:i.createIcon(p),zIndexOffset:d?1e4:i.baseZIndex+l});g.propertyId=o.id,g.defaultZIndex=i.baseZIndex+l,i.markerData[o.id]={lat:o.lat,lng:o.lng,price:o.price,address:o.address},g.bindPopup('
    '+o.price+"
    "+o.address+'
    View Details
    '),g.on("click",function(b){i.onMarkerClick(o.id)}),a.push(g),i.markers[o.id]=g}}),a.forEach(function(o){i.markerLayer.addLayer(o)}),this.isPinClickPan=!1,e&&this.markers[e]?this.selectedPropertyId=e:(this.selectedPropertyId=null,r(".property-card").removeClass("property-card-highlighted"))},updateFilters:function(t){this.currentFilters=t||{},this.loadClusters()},formatNumber:function(t){return t.toString().replace(/\B(?=(\d{3})+(?!\d))/g,",")},createIcon:function(t){return t=t||"red",L.divIcon({className:"property-marker property-marker-"+t,html:'
    ',iconSize:[17,22],iconAnchor:[8,22],popupAnchor:[0,-22]})},onMarkerClick:function(t){var e=this;if(this.selectedPropertyId!==t){this.selectedPropertyId&&(this.setMarkerColor(this.selectedPropertyId,"red"),this.resetMarkerZIndex(this.selectedPropertyId),r("#property-"+this.selectedPropertyId).removeClass("property-card-highlighted"));var i=this.markerData[t];if(i){this.selectedPropertyId=t,this.setMarkerColor(t,"amber"),this.setMarkerZIndex(t,1e4);var a=r("#property-"+t);a.length?(a.addClass("property-card-highlighted"),this.isCardScroll=!0,r("html, body").animate({scrollTop:a.offset().top-120},300,function(){setTimeout(function(){e.isCardScroll=!1},100)})):(this.isPinClickPan=!0,this.map.panTo([i.lat,i.lng]))}}},flashCard:function(t){t.removeClass("property-card-highlighted"),setTimeout(function(){t.addClass("property-card-highlighted"),setTimeout(function(){t.removeClass("property-card-highlighted"),setTimeout(function(){t.addClass("property-card-highlighted")},150)},150)},50)},setMarkerColor:function(t,e){var i=this.markers[t];i&&i.setIcon(this.createIcon(e))},setMarkerZIndex:function(t,e){var i=this.markers[t];i&&i.setZIndexOffset(e)},resetMarkerZIndex:function(t){var e=this.markers[t];e&&e.setZIndexOffset(e.defaultZIndex)},bindCardHoverEvents:function(){var t=this;r(document).on("mouseenter",".property-card[data-property-id]",function(){var e=r(this),i=e.data("property-id");if(i!==t.selectedPropertyId){t.hoveredPropertyId=i;var a=t.markers[i],o=!1;if(a){var l=a.getLatLng(),d=t.map.getBounds().contains(l);d?(t.setMarkerColor(i,"blue"),t.setMarkerZIndex(i,9e3)):o=!0}else o=!0;if(o){var p=e.data("lat"),g=e.data("lng");p&&g&&t.map&&(t.temporaryHoverMarker&&t.map.removeLayer(t.temporaryHoverMarker),t.temporaryHoverMarker=L.marker([p,g],{icon:t.createIcon("blue"),zIndexOffset:15e3}),t.temporaryHoverMarker.addTo(t.map))}}}),r(document).on("mouseleave",".property-card[data-property-id]",function(){var e=r(this).data("property-id");e!==t.selectedPropertyId&&(t.hoveredPropertyId===e&&(t.hoveredPropertyId=null),t.temporaryHoverMarker&&(t.map.removeLayer(t.temporaryHoverMarker),t.temporaryHoverMarker=null),t.markers[e]&&(t.setMarkerColor(e,"red"),t.resetMarkerZIndex(e)))})}},c={$mainFilter:null,$stickyFilter:null,$mainForm:null,$stickyForm:null,$resetButton:null,$masthead:null,scrollTimeout:null,isVisible:!1,init:function(){window.innerWidth<1024||!r(".is-map-view").length||(this.$mainFilter=r("#property-filters"),this.$stickyFilter=r("#property-filters-sticky"),this.$mainForm=this.$mainFilter.find(".filters-form"),this.$stickyForm=this.$stickyFilter.find(".filters-form-sticky"),this.$resetButton=this.$mainFilter.find(".filter-item-button .btn"),this.$masthead=r("#masthead"),!(!this.$mainFilter.length||!this.$stickyFilter.length||!this.$resetButton.length)&&(this.setupScrollHandler(),this.bindEvents(),this.checkVisibility()))},setupScrollHandler:function(){var t=this;r(window).on("scroll.stickyFilters",function(){clearTimeout(t.scrollTimeout),t.scrollTimeout=setTimeout(function(){t.checkVisibility()},50)})},checkVisibility:function(){var t=this.$masthead.length?this.$masthead.outerHeight():0,e=t+10,i=this.$resetButton[0].getBoundingClientRect();i.bottom1||t.scroll>0)&&(this.pendingRestoreState=t))},restoreState:function(){var t=this.pendingRestoreState;if(t){this.pendingRestoreState=null;var e=this.getFormData();if(s.currentFilters={status:"Active",property_type:e.property_type||"",city:e.city||"",min_price:e.min_price||"",max_price:e.max_price||"",min_beds:e.beds||""},t.lat!==null&&t.lng!==null&&t.zoom!==null&&s.map){s.map.off("moveend zoomend"),s.map.setView([t.lat,t.lng],t.zoom);var i=s.map.getBounds(),a=s.map.getCenter();this.mapBounds=[i.getSouthWest().lat,i.getSouthWest().lng,i.getNorthEast().lat,i.getNorthEast().lng],this.mapCenter=[a.lat,a.lng],s.loadClusters(),setTimeout(function(){s.map.on("moveend zoomend",function(){s.loadClusters(),setTimeout(function(){h.updateUrlState()},400)})},100)}else s.map&&s.fitToAllProperties();t.page>1?this.bulkLoadPages(t.page,t.scroll):t.scroll>0&&(window.scrollTo({top:t.scroll,behavior:"instant"}),r(window).trigger("scroll"))}},bulkLoadPages:function(t,e){var i=this,a=this.getFormData();u.isRestoring=!0;for(var o=[],l=1;l<=t+1;l++)o.push(l);var d={action:"homeproz_filter_properties",nonce:homeprozAjax.nonce,property_type:a.property_type,city:a.city,zip:a.zip,min_price:a.min_price,max_price:a.max_price,beds:a.beds,cards_only:"true"};this.mapBounds&&(d.bounds=this.mapBounds),this.mapCenter&&(d.center=this.mapCenter);var p=[],g=[];if(o.forEach(function(x){var w=r.extend({},d,{paged:x}),C=P.get(w);C&&C.success&&C.data&&C.data.html?p.push({page:x,html:C.data.html,max_pages:C.data.max_pages||1}):g.push(x)}),g.length===0){this.renderBulkResults(p,t,e);return}this.$results.html('
    ');var b=g.map(function(x){var w=r.extend({},d,{paged:x});return r.ajax({url:homeprozAjax.ajaxUrl,type:"POST",data:w}).then(function(C){var k={page:x,html:C.success?C.data.html:"",max_pages:C.success?C.data.max_pages:0};return C.success&&P.set(w,C),k})});r.when.apply(r,b).done(function(){var x=b.length===1?[arguments[0]]:Array.prototype.slice.call(arguments),w=p.concat(x);i.renderBulkResults(w,t,e)}).fail(function(){u.isRestoring=!1,i.filterProperties(1,!1)})},renderBulkResults:function(t,e,i){t.sort(function(l,d){return l.page-d.page});var a=t[0]?t[0].max_pages:1,o='

    Loading...

    ';o+='
    ',t.forEach(function(l){l.html&&l.page<=a&&(o+='
    ',o+=l.html,o+="
    ")}),o+="
    ",this.$results.html(o),u.currentPage=Math.min(e+1,a),u.maxPages=a,u.pages={},t.forEach(function(l){l.page<=a&&(u.pages[l.page]={state:"populated"})}),i>0&&window.scrollTo({top:i,behavior:"instant"}),u.isRestoring=!1,r(window).trigger("scroll"),typeof y<"u"&&y.process()},updateFromMap:function(t,e){s.isCardScroll||(this.mapBounds=t,this.mapCenter=e,this.isMapUpdate=!0,s.isPinClickPan||this.clearPinSelection(),this.$results.html('
    '),u.isEnabled&&m.reset(s.isPinClickPan),u.currentPage=1,this._scrollBlocked=!0,this.clearScrollFromUrl(),this.filterProperties(1,!1))},clearScrollFromUrl:function(){var t=window.location.hash.replace("#","");if(t){var e=t.split("&").filter(function(a){return!a.startsWith("scroll=")}),i=e.length?"#"+e.join("&"):"";history.replaceState(null,"",window.location.pathname+window.location.search+i)}},clearPinSelection:function(){s.selectedPropertyId&&(s.setMarkerColor(s.selectedPropertyId,"red"),s.resetMarkerZIndex(s.selectedPropertyId),r("#property-"+s.selectedPropertyId).removeClass("property-card-highlighted"),s.selectedPropertyId=null)},getPageFromHash:function(){var t=this.getStateFromHash();return t?t.page:1},filterProperties:function(t,e){e=e!==!1,t=t||1;var i=this,a=this.getFormData();this.$filters.addClass("is-loading"),this.isFirstLoad&&this.$results.html('
    ');var o={action:"homeproz_filter_properties",nonce:homeprozAjax.nonce,property_type:a.property_type,city:a.city,zip:a.zip,min_price:a.min_price,max_price:a.max_price,beds:a.beds,paged:t};this.mapBounds&&(o.bounds=this.mapBounds),this.mapCenter&&(o.center=this.mapCenter);var l=this.isMapUpdate;this.isMapUpdate=!1,n.queue("properties",function(d){return r.ajax({url:homeprozAjax.ajaxUrl,type:"POST",data:o})},function(d,p){d.success&&(i.$results.html(d.data.html),i.isFirstLoad=!1,d.data.filters&&!l&&s.updateFilters(d.data.filters),typeof v<"u"&&v.calculate(),m.destroy(),setTimeout(function(){m.init()},100),e&&i.updateUrl(a,t),s.selectedPropertyId?setTimeout(function(){var g=r("#property-"+s.selectedPropertyId);g.length&&(window.scrollTo({top:g.offset().top-120,behavior:"instant"}),g.addClass("property-card-highlighted"))},150):t>1&&window.scrollTo({top:i.$filters.offset().top-100,behavior:"instant"}))},function(){i.$filters.removeClass("is-loading")},function(){i.$results.html('

    Error

    Something went wrong. Please try again.

    ')})},getFormData:function(){return{property_type:this.$form.find('[name="property_type"]').val()||"",city:this.$form.find('[name="city"]').val()||"",zip:this.$form.find('[name="zip"]').val()||"",min_price:this.$form.find('[name="min_price"]').val()||"",max_price:this.$form.find('[name="max_price"]').val()||"",beds:this.$form.find('[name="beds"]').val()||""}},getFormState:function(){return this.getFormData()},setFormFromState:function(t){for(var e in t)this.$form.find('[name="'+e+'"]').val(t[e])},updateUrl:function(t,e){var i=!f.isMapView||window.innerWidth=this.breakpoint,this.isAboveBreakpoint&&this.isMapView&&typeof homeprozMapData<"u"){var e=h.getFormData(),i={status:"Active",property_type:e.property_type||"",city:e.city||"",min_price:e.min_price||"",max_price:e.max_price||"",min_beds:e.beds||""},a=h.pendingRestoreState&&h.pendingRestoreState.lat!==null,o=e.city||e.zip||e.property_type||e.min_price||e.max_price||e.beds,l=typeof homeprozMapData<"u"&&homeprozMapData.isNearMeMode,d=a||o||l;d||r("#property-results").html('
    '),s.init(i,d),this.mapInitialized=!0,h.pendingRestoreState?h.restoreState():o&&h.onFilterChange()}var p;r(window).on("resize",function(){clearTimeout(p),p=setTimeout(function(){t.handleResize()},150)})},handleResize:function(){var t=this.isAboveBreakpoint;this.isAboveBreakpoint=window.innerWidth>=this.breakpoint;var e=r(".property-archive-main");if(t&&!this.isAboveBreakpoint&&u.isEnabled&&m.destroy(),!t&&this.isAboveBreakpoint){if(this.isMapView){if(e.removeClass("is-grid-view").addClass("is-map-view"),!this.mapInitialized&&typeof homeprozMapData<"u"){var i=h.getFormData(),a={status:"Active",property_type:i.property_type||"",city:i.city||"",min_price:i.min_price||"",max_price:i.max_price||"",min_beds:i.beds||""},o=h.pendingRestoreState&&h.pendingRestoreState.lat!==null,l=i.city||i.zip||i.property_type||i.min_price||i.max_price||i.beds,d=typeof homeprozMapData<"u"&&homeprozMapData.isNearMeMode,p=o||l||d;p||r("#property-results").html('
    '),s.init(a,p),this.mapInitialized=!0,h.pendingRestoreState&&h.restoreState()}else s.map&&setTimeout(function(){s.map.invalidateSize()},100);setTimeout(function(){m.init()},200)}else e.removeClass("is-map-view").addClass("is-grid-view");typeof v<"u"&&setTimeout(function(){v.calculate()},150)}},setMapView:function(t){this.isMapView=t}},v={cardWidth:400,cardGap:24,mapGap:32,mapRatio:.33,breakpoint:1024,containerPadding:24,init:function(){this.calculate();var t=this,e;r(window).on("resize",function(){clearTimeout(e),e=setTimeout(function(){t.calculate()},100)})},calculate:function(){if(window.innerWidth .container"),i=t.hasClass("is-map-view"),a=e.width();i?this.calculateMapLayout(a):this.calculateGridLayout(a)},calculateMapLayout:function(t){for(var e=5;e>=2;e--){var i=e*this.cardWidth+(e-1)*this.cardGap,a=(this.mapGap+i)/(1-this.mapRatio);if(a<=t){this.setProperties(a,e,".property-map-layout"),this.setProperties(a,e,".property-list-container");return}}this.setProperties(t,1,".property-map-layout"),this.setProperties(t,1,".property-list-container")},calculateGridLayout:function(t){for(var e=6;e>=1;e--){var i=e*this.cardWidth+(e-1)*this.cardGap;if(i<=t){this.setProperties(i,e,".grid-view-container");return}}this.setProperties(this.cardWidth,1,".grid-view-container")},setProperties:function(t,e,i){var a=r(i);a.length&&(a.css("--layout-width",t+"px"),a.css("--card-columns",e))},clearProperties:function(){r(".property-map-layout, .grid-view-container, .property-list-container").css({"--layout-width":"","--card-columns":""})}},u={pages:{},totalPages:0,totalPosts:0,currentPage:1,pendingPage:null,isEnabled:!1,isRestoring:!1,cardsPerPage:12},m={$container:null,$grid:null,scrollTimeout:null,init:function(){if(window.innerWidth>=1024&&r(".is-map-view").length?this.$container=r(".property-list-container"):this.$container=r("#property-results"),this.$grid=this.$container.find(".properties-grid"),!(!this.$container.length||!this.$grid.length)){var t=this.$container.find(".properties-meta"),e=t.find(".properties-count strong").text().replace(/,/g,"");u.totalPosts=parseInt(e)||0,u.totalPages=Math.ceil(u.totalPosts/u.cardsPerPage),!(u.totalPages<=1)&&(u.pages={},u.pendingPage=null,this.wrapInitialCards(),this.bindScrollHandler(),u.isEnabled=!0,this.$container.addClass("infinite-scroll-enabled"),this.syncPages())}},wrapInitialCards:function(){var t=this.$grid.find(".property-card");if(t.length){var e=r('
    ');t.wrapAll(e),u.pages[1]={state:"populated"}}},bindScrollHandler:function(){var t=this;r(window).on("scroll.infiniteScroll",function(){clearTimeout(t.scrollTimeout),t.scrollTimeout=setTimeout(function(){t.syncPages(),h.updateUrlState()},100)}),r(window).on("wheel.infiniteScroll",function(){h._scrollBlocked=!1})},syncPages:function(){if(!(!this.$grid||!u.isEnabled)&&!u.isRestoring){var t=u.totalPages,e=this.calculateCurrentPage();e>t-2&&(e=t-2),e<1&&(e=1),u.currentPage=e;var i=[e-2,e-1,e,e+1,e+2];i=i.filter(function(o){return o>=1&&o<=t});var a=this.getReferenceCardDimensions();this.ensurePagesExist(i),this.loadFirstUnloaded(i),this.syncPageStates(i,a)}},calculateCurrentPage:function(){var t=window.scrollY||window.pageYOffset,e=t+window.innerHeight,i=this.$grid.find(".infinite-scroll-page");if(!i.length)return 1;var a=1,o=1/0;return i.each(function(){var l=r(this),d=parseInt(l.data("page")),p=l.find(".property-card").first();if(p.length){var g=p[0].getBoundingClientRect(),b=g.top+t;if(b<=e){var x=e-b;x
    ');e.insertPageInOrder(o,i),u.pages[i]||(u.pages[i]={state:"empty"})}})},insertPageInOrder:function(t,e){var i=this.$grid.find(".infinite-scroll-page"),a=!1;i.each(function(){var o=parseInt(r(this).data("page"));if(eo&&window.scrollTo({top:o,behavior:"instant"})}}},destroy:function(){u.isEnabled&&(r(window).off("scroll.infiniteScroll"),clearTimeout(this.scrollTimeout),this.$container&&this.$container.removeClass("infinite-scroll-enabled"),this.$grid&&(this.$grid.find('.infinite-scroll-page[data-state="populated"]').children().unwrap(),this.$grid.find('.infinite-scroll-page[data-state="placeholder"]').remove()),u.pages={},u.pendingPage=null,u.isEnabled=!1)}},y={_isRunning:!1,_activeLoads:0,MAX_PARALLEL:2,LOAD_DISTANCE:1e3,init:function(){this.process(),this.bindScrollEvent()},bindScrollEvent:function(){var t=this,e;r(window).on("scroll",function(){clearTimeout(e),e=setTimeout(function(){t.process()},50)})},process:function(){this._isRunning||(this._isRunning=!0,this._activeLoads=0,this._processNext())},_getNextElement:function(){var t=r(".property-card-image[data-bg]");if(!t.length)return null;var e=window.pageYOffset||document.documentElement.scrollTop,i=e,a=e+window.innerHeight,o=this.LOAD_DISTANCE,l=[],d=[];return t.each(function(){var p=this.getBoundingClientRect(),g=p.top+e,b=g+p.height;if(b>=i&&g<=a)l.push({el:this,position:g});else{var x;g>a?x=g-a:x=i-b,x<=o&&d.push({el:this,distance:x})}}),l.sort(function(p,g){return p.position-g.position}),d.sort(function(p,g){return p.distance-g.distance}),l.length?l[0].el:d.length?d[0].el:null},_processNext:function(){for(var t=this;this._activeLoads"u"||!homeprozMapData.isNearMeMode||(this.$overlay=r("#near-me-overlay"),this.$title=r("#near-me-title"),this.$message=r("#near-me-message"),this.$main=r(".property-archive-main"),this.$nearMeBtn=r(".view-toggle-nearme"),this.$overlay.length&&this.requestLocation())},requestLocation:function(){var t=this;if(!navigator.geolocation){console.log("[NearMe] Geolocation not supported"),this.showError("Location services are not supported by your browser.");return}navigator.geolocation.getCurrentPosition(function(e){t.onLocationSuccess(e)},function(e){console.log("[NearMe] Geolocation error:",e.code,e.message),t.onLocationError(e)},{enableHighAccuracy:!1,timeout:15e3,maximumAge:3e5})},onLocationSuccess:function(t){var e=t.coords.latitude,i=t.coords.longitude,a=this;console.log("[NearMe] Location:",e.toFixed(4),i.toFixed(4)),this.$title.text("Finding nearby properties..."),this.$message.text("Calculating the best view for your area."),r.ajax({url:homeprozMapData.clusterEndpoint,type:"POST",data:{action:"homeproz_calculate_near_me_zoom",lat:e,lng:i},success:function(o){var l=9;o.success&&o.data&&o.data.zoom&&(l=o.data.zoom,console.log("[NearMe] Zoom:",l,"("+o.data.count+" properties)")),a.showMapWithLocation(e,i,l)},error:function(o,l,d){console.log("[NearMe] Zoom calculation failed:",d),a.showMapWithLocation(e,i,9)}})},showMapWithLocation:function(t,e,i){var a=this;this.userLocation={lat:t,lng:e},this.$main.removeClass("is-near-me-mode"),this.$overlay.fadeOut(300,function(){r(this).remove()});var o=0,l=setInterval(function(){o++,typeof s<"u"&&s.map&&(clearInterval(l),s.map.invalidateSize(),setTimeout(function(){s.map.setView([t,e],i);var d=L.divIcon({className:"user-location-marker",html:'
    ',iconSize:[24,24],iconAnchor:[12,12]});L.marker([t,e],{icon:d}).addTo(s.map).bindPopup("Your location"),s.loadClusters(),a.setupViewportMonitoring(),a.updateNearMeButtonState()},100))},100);setTimeout(function(){o>0&&clearInterval(l)},5e3)},setupViewportMonitoring:function(){var t=this;s.map&&s.map.on("moveend",function(){t.updateNearMeButtonState()})},updateNearMeButtonState:function(){if(!(!this.userLocation||!s.map)){var t=s.map.getBounds(),e=L.latLng(this.userLocation.lat,this.userLocation.lng),i=t.contains(e);i?this.$nearMeBtn.addClass("active"):this.$nearMeBtn.removeClass("active")}},onLocationError:function(t){var e="Unable to determine your location.";switch(t.code){case t.PERMISSION_DENIED:e="Location access was denied. Please enable location services or click the button below to browse all properties.";break;case t.POSITION_UNAVAILABLE:e="Your location could not be determined. Please try again or browse all properties.";break;case t.TIMEOUT:e="Location request timed out. Please try again or browse all properties.";break}this.showError(e)},showError:function(t){this.$overlay.addClass("has-error"),this.$title.text("Location unavailable"),this.$message.text(t)}};r(function(){typeof homeprozMapData<"u"&&homeprozMapData.isNearMeMode&&I.init(),h.init(),f.init(),v.init(),y.init(),c.init(),setTimeout(function(){m.init()},300)})})(jQuery);(function(r){var P={$gallery:null,$lightbox:null,$mainImage:null,$mainImageContainer:null,$thumbnails:null,$thumbnailsContainer:null,$thumbnailsViewport:null,$playbackBtn:null,$prevBtn:null,$nextBtn:null,$lightboxImage:null,$lightboxImageContainer:null,$lightboxCounter:null,images:[],currentIndex:0,isPlaying:!0,isTransitioning:!1,autoplayInterval:null,autoplayDelay:5e3,fadeDuration:1e3,slideDuration:300,thumbnailsPerPage:5,thumbnailPage:0,swipeStartX:0,swipeStartY:0,swipeThreshold:50,isSwiping:!1,init:function(){if(!(!r(".Single_Property").length&&!r(".Single_Property_MLS").length)&&(this.$gallery=r(".property-gallery"),this.$lightbox=r("#property-lightbox"),!!this.$gallery.length)){this.$mainImageContainer=this.$gallery.find(".gallery-main-image"),this.$mainImage=this.$mainImageContainer.find("img"),this.$thumbnailsContainer=this.$gallery.find(".gallery-thumbnails-container"),this.$thumbnailsViewport=this.$gallery.find(".gallery-thumbnails-viewport"),this.$thumbnails=this.$gallery.find(".gallery-thumbnail"),this.$playbackBtn=this.$gallery.find(".gallery-playback-btn"),this.$prevBtn=this.$gallery.find(".gallery-thumbnails-prev"),this.$nextBtn=this.$gallery.find(".gallery-thumbnails-next"),this.$lightboxImage=this.$lightbox.find(".lightbox-image"),this.$lightboxImageContainer=this.$lightbox.find(".lightbox-image-container"),this.$lightboxCounter=this.$lightbox.find(".lightbox-current");var n=r("#gallery-images-data");if(n.length)try{this.images=JSON.parse(n.text())}catch{console.error("PropertyGallery: Failed to parse gallery data");return}if(!(!this.images||this.images.length===0)){if(!this.$mainImage.length||!this.$lightboxImage.length){console.error("PropertyGallery: Missing required elements");return}this.calculateThumbnailsPerPage(),this.bindEvents(),this.bindSwipeEvents(),this.updateThumbnailNavigation(),this.setupThumbnailLoading(),this.preloadThumbnailPages(0,2),this.images.length>1&&this.startAutoplay()}}},calculateThumbnailsPerPage:function(){r(window).width()<=640?this.thumbnailsPerPage=4:this.thumbnailsPerPage=5},bindEvents:function(){var n=this;this.$thumbnails.on("click",function(s){s.stopPropagation();var c=parseInt(r(this).data("index"));n.stopAutoplay(),n.setMainImage(c,!1)}),this.$playbackBtn.on("click",function(s){s.stopPropagation(),s.preventDefault(),n.isPlaying?n.stopAutoplay():n.startAutoplay()}),this.$prevBtn.on("click",function(){n.stopAutoplay(),n.prevThumbnailPage()}),this.$nextBtn.on("click",function(){n.stopAutoplay(),n.nextThumbnailPage()}),this.$gallery.find("[data-lightbox-trigger]").on("click",function(s){if(n.isSwiping){n.isSwiping=!1;return}n.stopAutoplay(),n.openLightbox(n.currentIndex)}),this.$lightbox.find(".lightbox-close, .lightbox-overlay, .lightbox-container").on("click",function(s){(s.target===this||r(this).hasClass("lightbox-close"))&&n.closeLightbox()}),this.$lightbox.find(".lightbox-prev").on("click",function(){n.slideLightboxImage("prev")}),this.$lightbox.find(".lightbox-next").on("click",function(){n.slideLightboxImage("next")}),r(document).on("keydown",function(s){if(n.$lightbox.is('[aria-hidden="false"]'))switch(s.key){case"Escape":n.closeLightbox();break;case"ArrowLeft":n.slideLightboxImage("prev");break;case"ArrowRight":n.slideLightboxImage("next");break}}),r(window).on("resize",function(){n.calculateThumbnailsPerPage(),n.updateThumbnailNavigation()})},bindSwipeEvents:function(){var n=this;this.$mainImageContainer[0].addEventListener("touchstart",function(s){n.handleSwipeStart(s)},{passive:!0}),this.$mainImageContainer[0].addEventListener("touchend",function(s){n.handleMainGallerySwipeEnd(s)},{passive:!0}),this.$lightboxImageContainer[0].addEventListener("touchstart",function(s){n.handleSwipeStart(s)},{passive:!0}),this.$lightboxImageContainer[0].addEventListener("touchend",function(s){n.handleLightboxSwipeEnd(s)},{passive:!0})},handleSwipeStart:function(n){n.touches.length===1&&(this.swipeStartX=n.touches[0].clientX,this.swipeStartY=n.touches[0].clientY)},handleMainGallerySwipeEnd:function(n){if(n.changedTouches.length===1){var s=n.changedTouches[0].clientX-this.swipeStartX,c=n.changedTouches[0].clientY-this.swipeStartY;Math.abs(s)>Math.abs(c)&&Math.abs(s)>this.swipeThreshold&&(this.isSwiping=!0,this.stopAutoplay(),s>0?this.slideMainImage("prev"):this.slideMainImage("next"))}},handleLightboxSwipeEnd:function(n){if(n.changedTouches.length===1){var s=n.changedTouches[0].clientX-this.swipeStartX,c=n.changedTouches[0].clientY-this.swipeStartY;Math.abs(s)>Math.abs(c)&&Math.abs(s)>this.swipeThreshold&&(s>0?this.slideLightboxImage("prev"):this.slideLightboxImage("next"))}},startAutoplay:function(){var n=this;this.images.length<=1||(this.isPlaying=!0,this.$playbackBtn.addClass("is-playing"),this.$playbackBtn.attr("aria-label","Pause slideshow"),this.autoplayInterval=setInterval(function(){n.advanceImage()},this.autoplayDelay))},stopAutoplay:function(){this.isPlaying=!1,this.$playbackBtn.removeClass("is-playing"),this.$playbackBtn.attr("aria-label","Play slideshow"),this.autoplayInterval&&(clearInterval(this.autoplayInterval),this.autoplayInterval=null)},advanceImage:function(){if(!this.isTransitioning){var n=this.currentIndex+1;n>=this.images.length&&(n=0),this.setMainImage(n,!0)}},slideMainImage:function(n){var s=this;if(!(this.isTransitioning||this.images.length<=1)){var c;n==="prev"?(c=this.currentIndex-1,c<0&&(c=this.images.length-1)):(c=this.currentIndex+1,c>=this.images.length&&(c=0));var h=this.images[c];if(!h||!h.url){console.error("PropertyGallery: Invalid main image at index",c);return}this.isTransitioning=!0;var f=n==="next"?"100%":"-100%",v=n==="next"?"-100%":"100%",u=r('');u.attr("src",h.url),u.attr("alt",h.alt||"Property photo"),u.css({position:"absolute",top:0,left:0,width:"100%",height:"100%","object-fit":"cover",transform:"translateX("+f+")","z-index":2,"border-radius":"0.5rem"}),this.$mainImageContainer.css({position:"relative",overflow:"hidden"}),this.$mainImageContainer.append(u),this.$mainImage.css({transition:"transform "+this.slideDuration+"ms ease-out"}),u.css({transition:"transform "+this.slideDuration+"ms ease-out"}),u[0].offsetHeight,this.$mainImage.css("transform","translateX("+v+")"),u.css("transform","translateX(0)"),setTimeout(function(){s.$mainImage.attr("src",h.url),s.$mainImage.attr("alt",h.alt||"Property photo"),s.$mainImage.css({transition:"",transform:""}),u.remove(),s.isTransitioning=!1},this.slideDuration),this.currentIndex=c,this.$thumbnails.removeClass("is-active"),this.$thumbnails.filter('[data-index="'+c+'"]').addClass("is-active"),this.scrollToThumbnail(c)}},setMainImage:function(n,s){var c=this;if(!(n<0||n>=this.images.length)&&!this.isTransitioning){var h=this.images[n];if(!h||!h.url){console.error("PropertyGallery: Invalid image data at index",n);return}if(s){this.isTransitioning=!0;var f=r('');f.attr("src",h.url),f.attr("alt",h.alt||"Property photo"),f.css({position:"absolute",top:0,left:0,width:"100%",height:"100%","object-fit":"cover",opacity:0,transform:"scale(1.02)",transition:"opacity "+this.fadeDuration+"ms ease-in-out, transform "+this.fadeDuration+"ms ease-in-out","z-index":2,"border-radius":"0.5rem"}),this.$mainImageContainer.css("position","relative"),this.$mainImageContainer.append(f),f[0].offsetHeight,f.css({opacity:1,transform:"scale(1)"}),setTimeout(function(){c.$mainImage.attr("src",h.url),c.$mainImage.attr("alt",h.alt||"Property photo"),f.remove(),c.isTransitioning=!1},this.fadeDuration)}else this.$mainImage.attr("src",h.url),this.$mainImage.attr("alt",h.alt||"Property photo");this.currentIndex=n,this.$thumbnails.removeClass("is-active"),this.$thumbnails.filter('[data-index="'+n+'"]').addClass("is-active"),this.scrollToThumbnail(n)}},scrollToThumbnail:function(n){var s=Math.floor(n/this.thumbnailsPerPage);s!==this.thumbnailPage&&(this.thumbnailPage=s,this.scrollThumbnails())},scrollThumbnails:function(){var n=this.$gallery.find(".gallery-thumbnails"),s=this.$thumbnails.first().outerWidth(!0),c=this.thumbnailPage*this.thumbnailsPerPage*s;n.css("transform","translateX(-"+c+"px)"),this.updateThumbnailNavigation()},updateThumbnailNavigation:function(){var n=Math.ceil(this.images.length/this.thumbnailsPerPage);this.$prevBtn.prop("disabled",this.thumbnailPage===0),this.$nextBtn.prop("disabled",this.thumbnailPage>=n-1),n<=1?(this.$prevBtn.hide(),this.$nextBtn.hide()):(this.$prevBtn.show(),this.$nextBtn.show())},prevThumbnailPage:function(){this.thumbnailPage>0&&(this.thumbnailPage--,this.scrollThumbnails(),this.preloadPrevThumbnailPage())},nextThumbnailPage:function(){var n=Math.ceil(this.images.length/this.thumbnailsPerPage);this.thumbnailPage=this.images.length&&(c=0));var h=this.images[c];if(!h||!h.url){console.error("PropertyGallery: Invalid lightbox image at index",c);return}this.isTransitioning=!0;var f=n==="next"?"100%":"-100%",v=n==="next"?"-100%":"100%",u=r('');u.attr("src",h.url),u.attr("alt",h.alt||"Property photo"),u.css({position:"absolute","max-width":"100%","max-height":"calc(100vh - 8rem)","object-fit":"contain",transform:"translateX("+f+")",left:"50%",top:"50%","margin-left":"-45vw","margin-top":"calc(-50vh + 4rem)"}),this.$lightboxImageContainer.css({position:"relative",overflow:"hidden"}),this.$lightboxImageContainer.append(u),this.$lightboxImage.css({transition:"transform "+this.slideDuration+"ms ease-out"}),u.css({transition:"transform "+this.slideDuration+"ms ease-out"}),u[0].offsetHeight,this.$lightboxImage.css("transform","translateX("+v+")"),u.css("transform","translateX(0)"),setTimeout(function(){s.$lightboxImage.attr("src",h.url),s.$lightboxImage.attr("alt",h.alt||"Property photo"),s.$lightboxImage.css({transition:"",transform:""}),u.remove(),s.isTransitioning=!1,s.$lightboxCounter.text(c+1)},this.slideDuration),this.currentIndex=c}},prevImage:function(){this.slideLightboxImage("prev")},nextImage:function(){this.slideLightboxImage("next")},updateLightboxImage:function(){var n=this.images[this.currentIndex];if(!n||!n.url){console.error("PropertyGallery: Invalid lightbox image at index",this.currentIndex);return}this.$lightboxImage.attr("src",n.url),this.$lightboxImage.attr("alt",n.alt||"Property photo"),this.$lightboxCounter.text(this.currentIndex+1)},setupThumbnailLoading:function(){this.$thumbnails.each(function(){var n=r(this),s=n.find("img");n.addClass("is-loading"),n.find(".thumbnail-spinner").length||n.append('
    '),s[0].complete?n.removeClass("is-loading"):(s.on("load",function(){n.removeClass("is-loading")}),s.on("error",function(){n.removeClass("is-loading")}))})},preloadThumbnailPages:function(n,s){for(var c=this,h=n*this.thumbnailsPerPage,f=Math.min((n+s)*this.thumbnailsPerPage,this.images.length),v=h;v=0&&this.preloadThumbnailPages(n,1)}};r(function(){P.init()})})(jQuery);(function(r){if(r(".Single_Agent").length){var P={$gallery:null,$thumbsSlider:null,$thumbs:null,$lightbox:null,$lightboxImage:null,$lightboxCounter:null,images:[],currentIndex:0,isTransitioning:!1,slideDuration:300,init:function(){if(this.$gallery=r(".agent-gallery"),!!this.$gallery.length){this.$thumbsSlider=this.$gallery.find(".agent-gallery-thumbs-slider"),this.$thumbs=this.$gallery.find(".agent-gallery-thumb"),this.$lightbox=this.$gallery.find(".agent-gallery-lightbox"),this.$lightboxImage=this.$lightbox.find(".lightbox-image"),this.$lightboxCounter=this.$lightbox.find(".lightbox-current");var n=this.$gallery.find(".agent-gallery-data");if(n.length)try{this.images=JSON.parse(n.text())}catch{console.error("Failed to parse gallery data");return}this.images.length!==0&&(this.initSlick(),this.bindEvents())}},initSlick:function(){this.$thumbsSlider.slick({slidesToShow:6,slidesToScroll:3,arrows:!0,dots:!1,infinite:!1,speed:300,autoplay:!1,variableWidth:!1,prevArrow:'',nextArrow:'',responsive:[{breakpoint:768,settings:{slidesToShow:4,slidesToScroll:2}},{breakpoint:480,settings:{slidesToShow:3,slidesToScroll:2}}]})},bindEvents:function(){var n=this;this.$thumbs.on("click",function(){var s=parseInt(r(this).data("index"));n.openLightbox(s)}),this.$lightbox.find(".lightbox-close, .lightbox-overlay, .lightbox-container").on("click",function(s){(s.target===this||r(this).hasClass("lightbox-close"))&&n.closeLightbox()}),this.$lightbox.find(".lightbox-prev").on("click",function(){n.slideLightboxImage("prev")}),this.$lightbox.find(".lightbox-next").on("click",function(){n.slideLightboxImage("next")}),r(document).on("keydown",function(s){if(n.$lightbox.is('[aria-hidden="false"]'))switch(s.key){case"Escape":n.closeLightbox();break;case"ArrowLeft":n.slideLightboxImage("prev");break;case"ArrowRight":n.slideLightboxImage("next");break}}),this.bindSwipeEvents()},bindSwipeEvents:function(){var n=this,s=0,c=50,h=this.$lightbox.find(".lightbox-image-container");h[0].addEventListener("touchstart",function(f){f.touches.length===1&&(s=f.touches[0].clientX)},{passive:!0}),h[0].addEventListener("touchend",function(f){if(f.changedTouches.length===1){var v=f.changedTouches[0].clientX-s;Math.abs(v)>c&&(v>0?n.slideLightboxImage("prev"):n.slideLightboxImage("next"))}},{passive:!0})},openLightbox:function(n){this.currentIndex=n,this.updateLightboxImage(),this.$lightbox.attr("aria-hidden","false"),r("body").addClass("lightbox-open")},closeLightbox:function(){this.$lightbox.attr("aria-hidden","true"),r("body").removeClass("lightbox-open")},slideLightboxImage:function(n){var s=this;if(!(this.isTransitioning||this.images.length<=1)){var c;n==="prev"?(c=this.currentIndex-1,c<0&&(c=this.images.length-1)):(c=this.currentIndex+1,c>=this.images.length&&(c=0)),this.isTransitioning=!0;var h=this.images[c],f=n==="next"?"100%":"-100%",v=n==="next"?"-100%":"100%",u=this.$lightbox.find(".lightbox-image-container"),m=r('');m.attr("src",h.url),m.attr("alt",h.alt||"Gallery photo"),m.css({position:"absolute","max-width":"100%","max-height":"calc(100vh - 8rem)","object-fit":"contain",transform:"translateX("+f+")",left:"50%",top:"50%","margin-left":"-45vw","margin-top":"calc(-50vh + 4rem)"}),u.css({position:"relative",overflow:"hidden"}),u.append(m),this.$lightboxImage.css("transition","transform "+this.slideDuration+"ms ease-out"),m.css("transition","transform "+this.slideDuration+"ms ease-out"),m[0].offsetHeight,this.$lightboxImage.css("transform","translateX("+v+")"),m.css("transform","translateX(0)"),setTimeout(function(){s.$lightboxImage.attr("src",h.url),s.$lightboxImage.attr("alt",h.alt||"Gallery photo"),s.$lightboxImage.css({transition:"",transform:""}),m.remove(),s.isTransitioning=!1,s.$lightboxCounter.text(c+1)},this.slideDuration),this.currentIndex=c}},updateLightboxImage:function(){var n=this.images[this.currentIndex];this.$lightboxImage.attr("src",n.url),this.$lightboxImage.attr("alt",n.alt||"Gallery photo"),this.$lightboxCounter.text(this.currentIndex+1)}};r(function(){P.init()})}})(jQuery);(function(r){if(!r(".mortgage-calculator-main").length)return;let P=!1;r.fn.currencyInput=function(s=!0){return this.data("ci_show_symbol",s),P||(P=!0,r.fn._CIOriginalVal=r.fn.val,r.fn.val=function(h){if(r(this).data("_currencyInput"))if(arguments.length===0){var f=r(this)._CIOriginalVal();if(f=="")return"";var v=parseInt(f.replace(/[^0-9]/g,""));return v}else{if(h=String(h).replace(/[^0-9]/g,""),h!=""){var u=parseInt(h).toLocaleString("en-US",{style:"currency",currency:"USD",minimumFractionDigits:0,maximumFractionDigits:0});return r(this).data("ci_show_symbol")||(u=u.replace("$","")),r(this)._CIOriginalVal(u)}return r(this)._CIOriginalVal(h)}else if(r(this).data("_percentInput"))if(arguments.length===0){var f=r(this)._CIOriginalVal();if(f=="")return"";var v=parseFloat(f.replace(/[^0-9.]/g,""));return isNaN(v)?"":v}else{h=String(h).replace(/[^0-9.]/g,"");var m=h.split(".");return m.length>2&&(h=m[0]+"."+m.slice(1).join("")),r(this)._CIOriginalVal(h)}else return arguments.length===0?r(this)._CIOriginalVal():r(this)._CIOriginalVal(h)}),this.data("_currencyInput")?this:(this.data("_currencyInput",!0),this.on("focus",function(){r(this).select()}),this.on("input",function(h){var f=this.selectionStart,v=r(this)._CIOriginalVal(),u=v.length;r(this).val(v);var m=r(this)._CIOriginalVal().length;m>u?f+=m-u:m2&&(v=u[0]+"."+u.slice(1).join("")),r(this)._CIOriginalVal(v);var m=v.length;m0){var h=c/s*100;this.$downPaymentPercent._CIOriginalVal(h.toFixed(1))}},syncDownPaymentFromPercent:function(){var s=this.$homePrice.val(),c=this.$downPaymentPercent.val();if(s&&s>0&&c!==""&&c>=0){var h=Math.round(s*c/100);this.$downPayment.val(h)}},calculate:function(){var s=this.$homePrice.val()||0,c=this.$downPayment.val()||0,h=parseInt(this.$loanTerm.val(),10),f=this.$interestRate.val()||0,v=s-c;v<0&&(v=0);var u=f/100/12,m=h*12,y=0,I=0;if(v>0&&u>0&&m>0){var t=Math.pow(1+u,m);y=v*(u*t)/(t-1),I=y*m-v}else v>0&&u===0&&(y=v/m,I=0);this.$monthlyPayment.text(this.formatCurrencyDisplay(y)),this.$principalInterest.text(this.formatCurrencyDisplay(y)),this.$loanAmount.text(this.formatCurrencyDisplay(v)),this.$totalInterest.text(this.formatCurrencyDisplay(I))}};r(document).ready(function(){n.init()})})(jQuery);(function(r){r(function(){})})(jQuery); +(function(a){var w=a(".menu-toggle"),s=a(".mobile-navigation");w.length&&(w.on("click",function(){var e=a(this).attr("aria-expanded")==="true";a(this).attr("aria-expanded",!e),s.toggleClass("is-open"),e?a("body").removeClass("mobile-menu-open"):a("body").addClass("mobile-menu-open")}),a(document).on("keydown",function(e){e.key==="Escape"&&s.hasClass("is-open")&&(w.attr("aria-expanded","false"),s.removeClass("is-open"),a("body").removeClass("mobile-menu-open"))}),a(document).on("click",function(e){s.hasClass("is-open")&&!a(e.target).closest(".mobile-navigation").length&&!a(e.target).closest(".menu-toggle").length&&(w.attr("aria-expanded","false"),s.removeClass("is-open"),a("body").removeClass("mobile-menu-open"))}))})(jQuery);(function(a){var w=6e3,s=1450,e=1e3,o=[],l=0,d=null,f=!1,c=!1,m=null;function v(){if(a(".Home_Page").length&&(m=a(".hero-split-image"),!!m.length)){var u=m.data("gallery-images");!u||!u.length||(o=u,P(),a(window).on("resize",h(P,150)))}}function P(){var u=a(window).width();u>=s?f||t():f&&i()}function t(){f=!0,c||(r(),c=!0),d=setInterval(n,w)}function i(){f=!1,d&&(clearInterval(d),d=null)}function r(){a.each(o,function(u,p){var g=new Image;g.src=p})}function n(){l=(l+1)%o.length;var u=o[l],p=a('
    ');p.css({position:"absolute",top:0,left:0,right:0,bottom:0,"background-image":"url("+u+")","background-size":"cover","background-position":"center center","background-repeat":"no-repeat",opacity:0,transform:"scale(1.02)",transition:"opacity "+e+"ms ease-in-out, transform "+e+"ms ease-in-out","z-index":1}),m.css("position","relative"),m.append(p),p[0].offsetHeight,p.css({opacity:1,transform:"scale(1)"}),setTimeout(function(){m.css("background-image","url("+u+")"),p.remove()},e)}function h(u,p){var g;return function(){var y=this,b=arguments;clearTimeout(g),g=setTimeout(function(){u.apply(y,b)},p)}}a(document).ready(v)})(jQuery);(function(a){var w=2,s=null,e=!1;function o(){var m=a(".hero-location-search");m.length&&(f(),m.each(function(){l(a(this))}))}function l(m){var v=m.find(".hero-location-input"),P=m.find('input[name="city"]'),t=m.find('input[name="zip"]'),i=m.find(".hero-geolocation-btn"),r=a('');v.after(r),d(v,r);var n=null;function h(b){if(!s||b.length=w){var x=b,I=n.label.substring(x.length),_=''+c(x)+''+c(I)+"";r.html(_).show()}else r.empty().hide(),n=null}function p(){return n?(v.val(n.label),n.type==="city"?(P.val(n.label),t.val("")):(t.val(n.value),P.val("")),r.empty().hide(),n=null,!0):!1}function g(){var b=v.val().trim();if(P.val()||t.val())return!0;var x=y(b);if(x)return v.val(x.label),x.type==="city"?(P.val(x.label),t.val("")):(t.val(x.value),P.val("")),!0;if(n)return v.val(n.label),n.type==="city"?(P.val(n.label),t.val("")):(t.val(n.value),P.val("")),!0;var I=h(b);return I?(v.val(I.label),I.type==="city"?(P.val(I.label),t.val("")):(t.val(I.value),P.val("")),!0):!1}function y(b){if(!s||!b)return null;for(var x=b.toLowerCase(),I=0;I0;o--){var l=Math.floor(Math.random()*(o+1)),d=e[o];e[o]=e[l],e[l]=d}return e},renderListings:function(){if(!this.listings||this.listings.length===0){this.grid.hide(),this.emptyMessage.show();return}for(var s=[],e=[],o=0;o',s.bedrooms&&(l+='
  • '+s.bedrooms+" "+e+"
  • "),s.bathrooms&&(l+='
  • '+s.bathrooms+" "+o+"
  • "),s.sqft&&(l+='
  • '+s.sqft.toLocaleString()+" sqft
  • "),l+=""),'
    Active
    '+this.escapeHtml(s.price_formatted)+'

    '+this.escapeHtml(s.address)+"

    "+l+'View Details
    '},escapeHtml:function(s){if(!s)return"";var e=document.createElement("div");return e.textContent=s,e.innerHTML}};a(document).ready(function(){w.init()})}})(jQuery);(function(a){var w={PREFIX:"HOMEPROZ_AJAX_",EXPIRY_MS:3e5,init:function(){this.cleanExpired()},cleanExpired:function(){try{for(var t=Date.now(),i=[],r=0;rthis.EXPIRY_MS&&i.push(n)}catch{i.push(n)}}i.forEach(function(u){sessionStorage.removeItem(u)})}catch{}},normalizeData:function(t){var i={};for(var r in t)if(r!=="nonce"){var n=t[r];Array.isArray(n)?i[r]=n.map(function(h){return typeof h=="number"?Math.round(h*1e4)/1e4:h}):i[r]=n}return i},getKey:function(t){for(var i=this.normalizeData(t),r=JSON.stringify(i),n=0,h=0;hthis.EXPIRY_MS?(sessionStorage.removeItem(i),null):n.data}catch{return null}},set:function(t,i){try{var r=this.getKey(t),n={time:Date.now(),data:i};sessionStorage.setItem(r,JSON.stringify(n))}catch{}}};w.init();var s={pending:{clusters:null,properties:null},timeouts:{clusters:null,properties:null},requestIds:{clusters:0,properties:0},debounceDelay:200,queue:function(t,i,r,n,h){var u=this;this.timeouts[t]&&(clearTimeout(this.timeouts[t]),this.timeouts[t]=null),this.pending[t]&&(this.pending[t].abort(),this.pending[t]=null),this.requestIds[t]++;var p=this.requestIds[t];this.timeouts[t]=setTimeout(function(){u.timeouts[t]=null;var g=i(p);g&&g.then&&(u.pending[t]=g,g.done(function(y){p===u.requestIds[t]&&r(y,p)}),g.fail(function(y,b,x){h&&p===u.requestIds[t]&&b!=="abort"&&h(y,b,x)}),g.always(function(){u.pending[t]===g&&(u.pending[t]=null),n&&p===u.requestIds[t]&&n()}))},this.debounceDelay)},cancel:function(t){var i=t?[t]:["clusters","properties"],r=this;i.forEach(function(n){r.timeouts[n]&&(clearTimeout(r.timeouts[n]),r.timeouts[n]=null),r.pending[n]&&(r.pending[n].abort(),r.pending[n]=null)})},isLoading:function(t){return!!(this.pending[t]||this.timeouts[t])}},e={map:null,markers:{},markerData:{},densityLayer:null,clusterLayer:null,markerLayer:null,selectedPropertyId:null,isPinClickPan:!1,hoveredPropertyId:null,temporaryHoverMarker:null,baseZIndex:400,currentFilters:{},currentMode:null,initialCenter:[45,-93.5],initialZoom:7,needsInitialFit:!1,init:function(t,i){var r=a("#property-map");if(!(!r.length||typeof L>"u")){this.currentFilters=t||{},this.needsInitialFit=!i,this.map=L.map("property-map").setView([45,-93.5],7),L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",{attribution:'© OpenStreetMap'}).addTo(this.map),this.densityLayer=L.layerGroup().addTo(this.map),this.clusterLayer=L.layerGroup().addTo(this.map),this.markerLayer=L.layerGroup().addTo(this.map);var n=this;this.map.on("moveend zoomend",function(){n.loadClusters(),setTimeout(function(){l.updateUrlState()},400)}),this.bindCardHoverEvents(),this.initStickyBoundary(),this.needsInitialFit?this.fitToAllProperties():this.loadClusters()}},fitToAllProperties:function(){var t=this;a.ajax({url:homeprozAjax.ajaxUrl,type:"GET",data:{action:"homeproz_get_filter_bounds",property_type:this.currentFilters.property_type||"",city:this.currentFilters.city||"",min_price:this.currentFilters.min_price||"",max_price:this.currentFilters.max_price||"",min_beds:this.currentFilters.min_beds||""},success:function(i){if(i.success&&i.data){var r=i.data,n=(r.ne_lat-r.sw_lat)*.15,h=(r.ne_lng-r.sw_lng)*.15,u=L.latLngBounds([r.sw_lat-n,r.sw_lng-h],[r.ne_lat+n,r.ne_lng+h]);t.map.fitBounds(u)}else t.loadClusters();t.needsInitialFit=!1},error:function(){t.loadClusters(),t.needsInitialFit=!1}})},initStickyBoundary:function(){},loadClusters:function(){if(this.map){var t=this,i=this.map.getBounds(),r=this.map.getCenter(),n=this.map.getZoom(),h=[i.getSouthWest().lat,i.getSouthWest().lng,i.getNorthEast().lat,i.getNorthEast().lng],u=[r.lat,r.lng],p={action:"mls_get_clusters",zoom:n,bounds:h,status:this.currentFilters.status||"Active",property_type:this.currentFilters.property_type||"",city:this.currentFilters.city||"",min_price:this.currentFilters.min_price||"",max_price:this.currentFilters.max_price||"",min_beds:this.currentFilters.min_beds||""};l.updateFromMap(h,u);var g=w.get(p);if(g&&g.success){var y=g.data;switch(this.currentMode=y.type,y.type){case"density":this.renderDensity(y.dots);break;case"clusters":this.renderClusters(y.clusters);break;case"markers":this.renderMarkers(y.markers);break}return}s.queue("clusters",function(b){return a.ajax({url:homeprozMapData.clusterEndpoint,type:"GET",data:p})},function(b,x){if(b.success){w.set(p,b);var I=b.data;switch(t.currentMode=I.type,I.type){case"density":t.renderDensity(I.dots);break;case"clusters":t.renderClusters(I.clusters);break;case"markers":t.renderMarkers(I.markers);break}}})}},clearAllLayers:function(){this.densityLayer.clearLayers(),this.clusterLayer.clearLayers(),this.markerLayer.clearLayers(),this.markers={},this.temporaryHoverMarker&&(this.map.removeLayer(this.temporaryHoverMarker),this.temporaryHoverMarker=null)},renderDensity:function(t){this.clearAllLayers(),this.selectedPropertyId=null,this.isPinClickPan=!1,a(".property-card").removeClass("property-card-highlighted");var i=this,r=this.map.getZoom();t.forEach(function(n){var h=i.getDensityColor(n.count,r),u=i.getDensitySize(n.count,r),p=L.divIcon({html:'
    ',className:"density-dot-container",iconSize:[u,u],iconAnchor:[u/2,u/2]}),g=L.marker([n.lat,n.lng],{icon:p});g.on("click",function(){i.map.setView([n.lat,n.lng],i.map.getZoom()+2)}),g.bindTooltip(n.count+" properties",{className:"density-tooltip"}),i.densityLayer.addLayer(g)})},getDensityThreshold:function(t){return Math.max(40,Math.round(600/Math.pow(1.4,t-3)))},getDensityColor:function(t,i){var r=this.getDensityThreshold(i),n=t/r;return n>=1.5?"rgba(180, 83, 9, 0.8)":n>=1?"rgba(217, 119, 6, 0.8)":n>=.6?"rgba(245, 158, 11, 0.8)":n>=.3?"rgba(234, 179, 8, 0.8)":n>=.15?"rgba(132, 204, 22, 0.8)":"rgba(34, 197, 94, 0.8)"},getDensitySize:function(t,i){var r=this.getDensityThreshold(i),n=t/r;return n>=1.5?11:n>=1?10:n>=.6?8:n>=.3?7:6},renderClusters:function(t){this.clearAllLayers(),this.selectedPropertyId=null,this.isPinClickPan=!1,a(".property-card").removeClass("property-card-highlighted");var i=this;t.forEach(function(r){var n="small",h=30;r.count>200?(n="large",h=40):r.count>=100&&(n="medium",h=35);var u=L.divIcon({html:"
    "+r.count+"
    ",className:"marker-cluster marker-cluster-"+n+" server-cluster",iconSize:L.point(h,h)}),p=L.marker([r.lat,r.lng],{icon:u});p.on("click",function(){i.map.setView([r.lat,r.lng],i.map.getZoom()+2)});var g="$"+i.formatNumber(r.min_price);r.max_price!==r.min_price&&(g+=" - $"+i.formatNumber(r.max_price)),p.bindTooltip(r.count+" properties
    "+g,{className:"cluster-tooltip"}),i.clusterLayer.addLayer(p)})},renderMarkers:function(t){var i=this.selectedPropertyId;this.clearAllLayers(),this.hoveredPropertyId=null;var r=this,n=[];t.forEach(function(h,u){if(h.lat&&h.lng){var p=h.id===i,g=p?"amber":"red",y=L.marker([h.lat,h.lng],{icon:r.createIcon(g),zIndexOffset:p?1e4:r.baseZIndex+u});y.propertyId=h.id,y.defaultZIndex=r.baseZIndex+u,r.markerData[h.id]={lat:h.lat,lng:h.lng,price:h.price,address:h.address},y.bindPopup('
    '+h.price+"
    "+h.address+'
    View Details
    '),y.on("click",function(b){r.onMarkerClick(h.id)}),n.push(y),r.markers[h.id]=y}}),n.forEach(function(h){r.markerLayer.addLayer(h)}),this.isPinClickPan=!1,i&&this.markers[i]?this.selectedPropertyId=i:(this.selectedPropertyId=null,a(".property-card").removeClass("property-card-highlighted"))},updateFilters:function(t){this.currentFilters=t||{},this.loadClusters()},formatNumber:function(t){return t.toString().replace(/\B(?=(\d{3})+(?!\d))/g,",")},createIcon:function(t){return t=t||"red",L.divIcon({className:"property-marker property-marker-"+t,html:'
    ',iconSize:[17,22],iconAnchor:[8,22],popupAnchor:[0,-22]})},onMarkerClick:function(t){var i=this;if(this.selectedPropertyId!==t){this.selectedPropertyId&&(this.setMarkerColor(this.selectedPropertyId,"red"),this.resetMarkerZIndex(this.selectedPropertyId),a("#property-"+this.selectedPropertyId).removeClass("property-card-highlighted"));var r=this.markerData[t];if(r){this.selectedPropertyId=t,this.setMarkerColor(t,"amber"),this.setMarkerZIndex(t,1e4);var n=a("#property-"+t);n.length?(n.addClass("property-card-highlighted"),this.isCardScroll=!0,a("html, body").animate({scrollTop:n.offset().top-120},300,function(){setTimeout(function(){i.isCardScroll=!1},100)})):(this.isPinClickPan=!0,this.map.panTo([r.lat,r.lng]))}}},flashCard:function(t){t.removeClass("property-card-highlighted"),setTimeout(function(){t.addClass("property-card-highlighted"),setTimeout(function(){t.removeClass("property-card-highlighted"),setTimeout(function(){t.addClass("property-card-highlighted")},150)},150)},50)},setMarkerColor:function(t,i){var r=this.markers[t];r&&r.setIcon(this.createIcon(i))},setMarkerZIndex:function(t,i){var r=this.markers[t];r&&r.setZIndexOffset(i)},resetMarkerZIndex:function(t){var i=this.markers[t];i&&i.setZIndexOffset(i.defaultZIndex)},bindCardHoverEvents:function(){var t=this;a(document).on("mouseenter",".property-card[data-property-id]",function(){var i=a(this),r=i.data("property-id");if(r!==t.selectedPropertyId){t.hoveredPropertyId=r;var n=t.markers[r],h=!1;if(n){var u=n.getLatLng(),p=t.map.getBounds().contains(u);p?(t.setMarkerColor(r,"blue"),t.setMarkerZIndex(r,9e3)):h=!0}else h=!0;if(h){var g=i.data("lat"),y=i.data("lng");g&&y&&t.map&&(t.temporaryHoverMarker&&t.map.removeLayer(t.temporaryHoverMarker),t.temporaryHoverMarker=L.marker([g,y],{icon:t.createIcon("blue"),zIndexOffset:15e3}),t.temporaryHoverMarker.addTo(t.map))}}}),a(document).on("mouseleave",".property-card[data-property-id]",function(){var i=a(this).data("property-id");i!==t.selectedPropertyId&&(t.hoveredPropertyId===i&&(t.hoveredPropertyId=null),t.temporaryHoverMarker&&(t.map.removeLayer(t.temporaryHoverMarker),t.temporaryHoverMarker=null),t.markers[i]&&(t.setMarkerColor(i,"red"),t.resetMarkerZIndex(i)))})}},o={$mainFilter:null,$stickyFilter:null,$mainForm:null,$stickyForm:null,$resetButton:null,$masthead:null,scrollTimeout:null,isVisible:!1,init:function(){window.innerWidth<1024||!a(".is-map-view").length||(this.$mainFilter=a("#property-filters"),this.$stickyFilter=a("#property-filters-sticky"),this.$mainForm=this.$mainFilter.find(".filters-form"),this.$stickyForm=this.$stickyFilter.find(".filters-form-sticky"),this.$resetButton=this.$mainFilter.find(".filter-item-button .btn"),this.$masthead=a("#masthead"),!(!this.$mainFilter.length||!this.$stickyFilter.length||!this.$resetButton.length)&&(this.setupScrollHandler(),this.bindEvents(),this.checkVisibility()))},setupScrollHandler:function(){var t=this;a(window).on("scroll.stickyFilters",function(){clearTimeout(t.scrollTimeout),t.scrollTimeout=setTimeout(function(){t.checkVisibility()},50)})},checkVisibility:function(){var t=this.$masthead.length?this.$masthead.outerHeight():0,i=t+10,r=this.$resetButton[0].getBoundingClientRect();r.bottom1||t.scroll>0)&&(this.pendingRestoreState=t))},restoreState:function(){var t=this.pendingRestoreState;if(t){this.pendingRestoreState=null;var i=this.getFormData();if(e.currentFilters={status:"Active",property_type:i.property_type||"",city:i.city||"",min_price:i.min_price||"",max_price:i.max_price||"",min_beds:i.beds||""},t.lat!==null&&t.lng!==null&&t.zoom!==null&&e.map){e.map.off("moveend zoomend"),e.map.setView([t.lat,t.lng],t.zoom);var r=e.map.getBounds(),n=e.map.getCenter();this.mapBounds=[r.getSouthWest().lat,r.getSouthWest().lng,r.getNorthEast().lat,r.getNorthEast().lng],this.mapCenter=[n.lat,n.lng],e.loadClusters(),setTimeout(function(){e.map.on("moveend zoomend",function(){e.loadClusters(),setTimeout(function(){l.updateUrlState()},400)})},100)}else e.map&&e.fitToAllProperties();t.page>1?this.bulkLoadPages(t.page,t.scroll):t.scroll>0&&(window.scrollTo({top:t.scroll,behavior:"instant"}),a(window).trigger("scroll"))}},bulkLoadPages:function(t,i){var r=this,n=this.getFormData();c.isRestoring=!0;for(var h=[],u=1;u<=t+1;u++)h.push(u);var p={action:"homeproz_filter_properties",nonce:homeprozAjax.nonce,property_type:n.property_type,city:n.city,zip:n.zip,min_price:n.min_price,max_price:n.max_price,beds:n.beds,cards_only:"true"};this.mapBounds&&(p.bounds=this.mapBounds),this.mapCenter&&(p.center=this.mapCenter);var g=[],y=[];if(h.forEach(function(x){var I=a.extend({},p,{paged:x}),_=w.get(I);_&&_.success&&_.data&&_.data.html?g.push({page:x,html:_.data.html,max_pages:_.data.max_pages||1}):y.push(x)}),y.length===0){this.renderBulkResults(g,t,i);return}this.$results.html('
    ');var b=y.map(function(x){var I=a.extend({},p,{paged:x});return a.ajax({url:homeprozAjax.ajaxUrl,type:"POST",data:I}).then(function(_){var C={page:x,html:_.success?_.data.html:"",max_pages:_.success?_.data.max_pages:0};return _.success&&w.set(I,_),C})});a.when.apply(a,b).done(function(){var x=b.length===1?[arguments[0]]:Array.prototype.slice.call(arguments),I=g.concat(x);r.renderBulkResults(I,t,i)}).fail(function(){c.isRestoring=!1,r.filterProperties(1,!1)})},renderBulkResults:function(t,i,r){t.sort(function(u,p){return u.page-p.page});var n=t[0]?t[0].max_pages:1,h='

    Loading...

    ';h+='
    ',t.forEach(function(u){u.html&&u.page<=n&&(h+='
    ',h+=u.html,h+="
    ")}),h+="
    ",this.$results.html(h),c.currentPage=Math.min(i+1,n),c.maxPages=n,c.pages={},t.forEach(function(u){u.page<=n&&(c.pages[u.page]={state:"populated"})}),r>0&&window.scrollTo({top:r,behavior:"instant"}),c.isRestoring=!1,a(window).trigger("scroll"),typeof v<"u"&&v.process()},updateFromMap:function(t,i){e.isCardScroll||(this.mapBounds=t,this.mapCenter=i,this.isMapUpdate=!0,e.isPinClickPan||this.clearPinSelection(),this.$results.html('
    '),c.isEnabled&&m.reset(e.isPinClickPan),c.currentPage=1,this._scrollBlocked=!0,this.clearScrollFromUrl(),this.filterProperties(1,!1))},clearScrollFromUrl:function(){var t=window.location.hash.replace("#","");if(t){var i=t.split("&").filter(function(n){return!n.startsWith("scroll=")}),r=i.length?"#"+i.join("&"):"";history.replaceState(null,"",window.location.pathname+window.location.search+r)}},clearPinSelection:function(){e.selectedPropertyId&&(e.setMarkerColor(e.selectedPropertyId,"red"),e.resetMarkerZIndex(e.selectedPropertyId),a("#property-"+e.selectedPropertyId).removeClass("property-card-highlighted"),e.selectedPropertyId=null)},getPageFromHash:function(){var t=this.getStateFromHash();return t?t.page:1},filterProperties:function(t,i){i=i!==!1,t=t||1;var r=this,n=this.getFormData();this.$filters.addClass("is-loading"),this.isFirstLoad&&this.$results.html('
    ');var h={action:"homeproz_filter_properties",nonce:homeprozAjax.nonce,property_type:n.property_type,city:n.city,zip:n.zip,min_price:n.min_price,max_price:n.max_price,beds:n.beds,paged:t};this.mapBounds&&(h.bounds=this.mapBounds),this.mapCenter&&(h.center=this.mapCenter);var u=this.isMapUpdate;this.isMapUpdate=!1,s.queue("properties",function(p){return a.ajax({url:homeprozAjax.ajaxUrl,type:"POST",data:h})},function(p,g){p.success&&(r.$results.html(p.data.html),r.isFirstLoad=!1,p.data.filters&&!u&&e.updateFilters(p.data.filters),typeof f<"u"&&f.calculate(),m.destroy(),setTimeout(function(){m.init()},100),i&&r.updateUrl(n,t),e.selectedPropertyId?setTimeout(function(){var y=a("#property-"+e.selectedPropertyId);y.length&&(window.scrollTo({top:y.offset().top-120,behavior:"instant"}),y.addClass("property-card-highlighted"))},150):t>1&&window.scrollTo({top:r.$filters.offset().top-100,behavior:"instant"}))},function(){r.$filters.removeClass("is-loading")},function(){r.$results.html('

    Error

    Something went wrong. Please try again.

    ')})},getFormData:function(){return{property_type:this.$form.find('[name="property_type"]').val()||"",city:this.$form.find('[name="city"]').val()||"",zip:this.$form.find('[name="zip"]').val()||"",min_price:this.$form.find('[name="min_price"]').val()||"",max_price:this.$form.find('[name="max_price"]').val()||"",beds:this.$form.find('[name="beds"]').val()||""}},getFormState:function(){return this.getFormData()},setFormFromState:function(t){for(var i in t)this.$form.find('[name="'+i+'"]').val(t[i])},updateUrl:function(t,i){var r=!d.isMapView||window.innerWidth=this.breakpoint,this.isAboveBreakpoint&&this.isMapView&&typeof homeprozMapData<"u"){var i=l.getFormData(),r={status:"Active",property_type:i.property_type||"",city:i.city||"",min_price:i.min_price||"",max_price:i.max_price||"",min_beds:i.beds||""},n=l.pendingRestoreState&&l.pendingRestoreState.lat!==null,h=i.city||i.zip||i.property_type||i.min_price||i.max_price||i.beds,u=typeof homeprozMapData<"u"&&homeprozMapData.isNearMeMode,p=n||h||u;p||a("#property-results").html('
    '),e.init(r,p),this.mapInitialized=!0,l.pendingRestoreState?l.restoreState():h&&l.onFilterChange()}var g;a(window).on("resize",function(){clearTimeout(g),g=setTimeout(function(){t.handleResize()},150)})},handleResize:function(){var t=this.isAboveBreakpoint;this.isAboveBreakpoint=window.innerWidth>=this.breakpoint;var i=a(".property-archive-main");if(t&&!this.isAboveBreakpoint&&c.isEnabled&&m.destroy(),!t&&this.isAboveBreakpoint){if(this.isMapView){if(i.removeClass("is-grid-view").addClass("is-map-view"),!this.mapInitialized&&typeof homeprozMapData<"u"){var r=l.getFormData(),n={status:"Active",property_type:r.property_type||"",city:r.city||"",min_price:r.min_price||"",max_price:r.max_price||"",min_beds:r.beds||""},h=l.pendingRestoreState&&l.pendingRestoreState.lat!==null,u=r.city||r.zip||r.property_type||r.min_price||r.max_price||r.beds,p=typeof homeprozMapData<"u"&&homeprozMapData.isNearMeMode,g=h||u||p;g||a("#property-results").html('
    '),e.init(n,g),this.mapInitialized=!0,l.pendingRestoreState&&l.restoreState()}else e.map&&setTimeout(function(){e.map.invalidateSize()},100);setTimeout(function(){m.init()},200)}else i.removeClass("is-map-view").addClass("is-grid-view");typeof f<"u"&&setTimeout(function(){f.calculate()},150)}},setMapView:function(t){this.isMapView=t}},f={cardWidth:400,cardGap:24,mapGap:32,mapRatio:.33,breakpoint:1024,containerPadding:24,init:function(){this.calculate();var t=this,i;a(window).on("resize",function(){clearTimeout(i),i=setTimeout(function(){t.calculate()},100)})},calculate:function(){if(window.innerWidth .container"),r=t.hasClass("is-map-view"),n=i.width();r?this.calculateMapLayout(n):this.calculateGridLayout(n)},calculateMapLayout:function(t){for(var i=5;i>=2;i--){var r=i*this.cardWidth+(i-1)*this.cardGap,n=(this.mapGap+r)/(1-this.mapRatio);if(n<=t){this.setProperties(n,i,".property-map-layout"),this.setProperties(n,i,".property-list-container");return}}this.setProperties(t,1,".property-map-layout"),this.setProperties(t,1,".property-list-container")},calculateGridLayout:function(t){for(var i=6;i>=1;i--){var r=i*this.cardWidth+(i-1)*this.cardGap;if(r<=t){this.setProperties(r,i,".grid-view-container");return}}this.setProperties(this.cardWidth,1,".grid-view-container")},setProperties:function(t,i,r){var n=a(r);n.length&&(n.css("--layout-width",t+"px"),n.css("--card-columns",i))},clearProperties:function(){a(".property-map-layout, .grid-view-container, .property-list-container").css({"--layout-width":"","--card-columns":""})}},c={pages:{},totalPages:0,totalPosts:0,currentPage:1,pendingPage:null,isEnabled:!1,isRestoring:!1,cardsPerPage:12},m={$container:null,$grid:null,scrollTimeout:null,init:function(){if(window.innerWidth>=1024&&a(".is-map-view").length?this.$container=a(".property-list-container"):this.$container=a("#property-results"),this.$grid=this.$container.find(".properties-grid"),!(!this.$container.length||!this.$grid.length)){var t=this.$container.find(".properties-meta"),i=t.find(".properties-count strong").text().replace(/,/g,"");c.totalPosts=parseInt(i)||0,c.totalPages=Math.ceil(c.totalPosts/c.cardsPerPage),!(c.totalPages<=1)&&(c.pages={},c.pendingPage=null,this.wrapInitialCards(),this.bindScrollHandler(),c.isEnabled=!0,this.$container.addClass("infinite-scroll-enabled"),this.syncPages())}},wrapInitialCards:function(){var t=this.$grid.find(".property-card");if(t.length){var i=a('
    ');t.wrapAll(i),c.pages[1]={state:"populated"}}},bindScrollHandler:function(){var t=this;a(window).on("scroll.infiniteScroll",function(){clearTimeout(t.scrollTimeout),t.scrollTimeout=setTimeout(function(){t.syncPages(),l.updateUrlState()},100)}),a(window).on("wheel.infiniteScroll",function(){l._scrollBlocked=!1})},syncPages:function(){if(!(!this.$grid||!c.isEnabled)&&!c.isRestoring){var t=c.totalPages,i=this.calculateCurrentPage();i>t-2&&(i=t-2),i<1&&(i=1),c.currentPage=i;var r=[i-2,i-1,i,i+1,i+2];r=r.filter(function(h){return h>=1&&h<=t});var n=this.getReferenceCardDimensions();this.ensurePagesExist(r),this.loadFirstUnloaded(r),this.syncPageStates(r,n)}},calculateCurrentPage:function(){var t=window.scrollY||window.pageYOffset,i=t+window.innerHeight,r=this.$grid.find(".infinite-scroll-page");if(!r.length)return 1;var n=1,h=1/0;return r.each(function(){var u=a(this),p=parseInt(u.data("page")),g=u.find(".property-card").first();if(g.length){var y=g[0].getBoundingClientRect(),b=y.top+t;if(b<=i){var x=i-b;x
    ');i.insertPageInOrder(h,r),c.pages[r]||(c.pages[r]={state:"empty"})}})},insertPageInOrder:function(t,i){var r=this.$grid.find(".infinite-scroll-page"),n=!1;r.each(function(){var h=parseInt(a(this).data("page"));if(ih&&window.scrollTo({top:h,behavior:"instant"})}}},destroy:function(){c.isEnabled&&(a(window).off("scroll.infiniteScroll"),clearTimeout(this.scrollTimeout),this.$container&&this.$container.removeClass("infinite-scroll-enabled"),this.$grid&&(this.$grid.find('.infinite-scroll-page[data-state="populated"]').children().unwrap(),this.$grid.find('.infinite-scroll-page[data-state="placeholder"]').remove()),c.pages={},c.pendingPage=null,c.isEnabled=!1)}},v={_isRunning:!1,_activeLoads:0,MAX_PARALLEL:2,LOAD_DISTANCE:1e3,init:function(){this.process(),this.bindScrollEvent()},bindScrollEvent:function(){var t=this,i;a(window).on("scroll",function(){clearTimeout(i),i=setTimeout(function(){t.process()},50)})},process:function(){this._isRunning||(this._isRunning=!0,this._activeLoads=0,this._processNext())},_getNextElement:function(){var t=a(".property-card-image[data-bg]");if(!t.length)return null;var i=window.pageYOffset||document.documentElement.scrollTop,r=i,n=i+window.innerHeight,h=this.LOAD_DISTANCE,u=[],p=[];return t.each(function(){var g=this.getBoundingClientRect(),y=g.top+i,b=y+g.height;if(b>=r&&y<=n)u.push({el:this,position:y});else{var x;y>n?x=y-n:x=r-b,x<=h&&p.push({el:this,distance:x})}}),u.sort(function(g,y){return g.position-y.position}),p.sort(function(g,y){return g.distance-y.distance}),u.length?u[0].el:p.length?p[0].el:null},_processNext:function(){for(var t=this;this._activeLoads"u"||!homeprozMapData.isNearMeMode||(this.$overlay=a("#near-me-overlay"),this.$title=a("#near-me-title"),this.$message=a("#near-me-message"),this.$main=a(".property-archive-main"),this.$nearMeBtn=a(".view-toggle-nearme"),this.$overlay.length&&this.requestLocation())},requestLocation:function(){var t=this;if(!navigator.geolocation){console.log("[NearMe] Geolocation not supported"),this.showError("Location services are not supported by your browser.");return}navigator.geolocation.getCurrentPosition(function(i){t.onLocationSuccess(i)},function(i){console.log("[NearMe] Geolocation error:",i.code,i.message),t.onLocationError(i)},{enableHighAccuracy:!1,timeout:15e3,maximumAge:3e5})},onLocationSuccess:function(t){var i=t.coords.latitude,r=t.coords.longitude,n=this;console.log("[NearMe] Location:",i.toFixed(4),r.toFixed(4)),this.$title.text("Finding nearby properties..."),this.$message.text("Calculating the best view for your area."),a.ajax({url:homeprozMapData.clusterEndpoint,type:"POST",data:{action:"homeproz_calculate_near_me_zoom",lat:i,lng:r},success:function(h){var u=9;h.success&&h.data&&h.data.zoom&&(u=h.data.zoom,console.log("[NearMe] Zoom:",u,"("+h.data.count+" properties)")),n.showMapWithLocation(i,r,u)},error:function(h,u,p){console.log("[NearMe] Zoom calculation failed:",p),n.showMapWithLocation(i,r,9)}})},showMapWithLocation:function(t,i,r){var n=this;this.userLocation={lat:t,lng:i},this.$main.removeClass("is-near-me-mode"),this.$overlay.fadeOut(300,function(){a(this).remove()});var h=0,u=setInterval(function(){h++,typeof e<"u"&&e.map&&(clearInterval(u),e.map.invalidateSize(),setTimeout(function(){e.map.setView([t,i],r);var p=L.divIcon({className:"user-location-marker",html:'
    ',iconSize:[24,24],iconAnchor:[12,12]});L.marker([t,i],{icon:p}).addTo(e.map).bindPopup("Your location"),e.loadClusters(),n.setupViewportMonitoring(),n.updateNearMeButtonState()},100))},100);setTimeout(function(){h>0&&clearInterval(u)},5e3)},setupViewportMonitoring:function(){var t=this;e.map&&e.map.on("moveend",function(){t.updateNearMeButtonState()})},updateNearMeButtonState:function(){if(!(!this.userLocation||!e.map)){var t=e.map.getBounds(),i=L.latLng(this.userLocation.lat,this.userLocation.lng),r=t.contains(i);r?this.$nearMeBtn.addClass("active"):this.$nearMeBtn.removeClass("active")}},onLocationError:function(t){var i="Unable to determine your location.";switch(t.code){case t.PERMISSION_DENIED:i="Location access was denied. Please enable location services or click the button below to browse all properties.";break;case t.POSITION_UNAVAILABLE:i="Your location could not be determined. Please try again or browse all properties.";break;case t.TIMEOUT:i="Location request timed out. Please try again or browse all properties.";break}this.showError(i)},showError:function(t){this.$overlay.addClass("has-error"),this.$title.text("Location unavailable"),this.$message.text(t)}};a(function(){typeof homeprozMapData<"u"&&homeprozMapData.isNearMeMode&&P.init(),l.init(),d.init(),f.init(),v.init(),o.init(),setTimeout(function(){m.init()},300)})})(jQuery);(function(a){if(!(window.innerWidth>=1024)){var w={$sheet:null,$handle:null,$content:null,$filters:null,$filterToggle:null,$propertyList:null,$propertyCount:null,states:{collapsed:120,expanded:null},currentState:"collapsed",isDragging:!1,startY:0,startHeight:0,currentHeight:0,lastY:0,lastTime:0,velocity:0,init:function(){this.$sheet=a("#mobile-bottom-sheet"),this.$sheet.length&&(this.$handle=a("#sheet-drag-handle"),this.$content=a("#sheet-content"),this.$filters=a("#sheet-filters"),this.$filterToggle=a("#sheet-filter-toggle"),this.$propertyList=a("#sheet-property-list"),this.$propertyCount=a("#mobile-property-count"),this.calculateHeights(),this.bindEvents(),this.setState("collapsed"))},calculateHeights:function(){var e=window.innerHeight;this.states.expanded=e-60},bindEvents:function(){var e=this;this.$handle.on("touchstart",function(o){e.onDragStart(o)}),a(document).on("touchmove",function(o){e.isDragging&&e.onDragMove(o)}),a(document).on("touchend touchcancel",function(o){e.isDragging&&e.onDragEnd(o)}),this.$handle.on("click",function(){e.isDragging||e.cycleState()}),this.$filterToggle.on("click",function(o){o.stopPropagation(),e.toggleFilters()}),this.$sheet.find(".sheet-header").on("click",function(o){a(o.target).closest("#sheet-filter-toggle").length||e.cycleState()}),a(".sheet-filter-select").on("change",function(){e.onFilterChange()}),a(window).on("resize",function(){e.calculateHeights(),e.setState(e.currentState,!0)}),this.$content.on("touchmove",function(o){e.currentState==="expanded"&&o.stopPropagation()})},onDragStart:function(e){this.isDragging=!0,this.startY=e.touches[0].clientY,this.lastY=this.startY,this.lastTime=Date.now(),this.startHeight=this.$sheet.height(),this.velocity=0,this.$sheet.addClass("is-dragging")},onDragMove:function(e){if(this.isDragging){var o=e.touches[0].clientY,l=Date.now(),d=this.startY-o,f=this.startHeight+d,c=l-this.lastTime;c>0&&(this.velocity=(this.lastY-o)/c),this.lastY=o,this.lastTime=l;var m=this.states.collapsed,v=this.states.expanded;f=Math.max(m,Math.min(v,f)),this.currentHeight=f,this.$sheet.css("height",f+"px"),e.preventDefault()}},onDragEnd:function(e){if(this.isDragging){this.isDragging=!1,this.$sheet.removeClass("is-dragging");var o=this.startY-this.lastY,l=.5,d=50;Math.abs(this.velocity)>l?this.velocity>0?this.setState("expanded"):this.setState("collapsed"):Math.abs(o)>d?o>0?this.setState("expanded"):this.setState("collapsed"):this.setState(this.currentState)}},cycleState:function(){this.currentState==="collapsed"?this.setState("expanded"):this.setState("collapsed")},setState:function(e,o){this.currentState=e,this.$sheet.attr("data-state",e);var l=this.states[e];if(o&&this.$sheet.addClass("is-dragging"),this.$sheet.css("height",l+"px"),o){var d=this;requestAnimationFrame(function(){d.$sheet.removeClass("is-dragging")})}},toggleFilters:function(){this.$filters.toggleClass("is-visible"),this.$filterToggle.toggleClass("is-active"),this.$filters.hasClass("is-visible")&&this.currentState==="collapsed"&&this.setState("expanded")},onFilterChange:function(){var e=this.getFilters();s.updateFilters(e)},getFilters:function(){return{property_type:a("#mobile-filter-type").val()||"",city:a("#mobile-filter-city").val()||"",min_beds:a("#mobile-filter-beds").val()||"",min_price:a("#mobile-filter-min-price").val()||"",max_price:a("#mobile-filter-max-price").val()||""}},updateCount:function(e){this.$propertyCount.text(e)},showLoading:function(){this.$propertyList.html('
    Loading properties...
    ')},renderProperties:function(e,o){var l=this,d="";!e||e.length===0?(d='

    Zoom in to see individual properties

    ',o||this.updateCount(0)):(e.forEach(function(f){d+=l.renderPropertyCard(f)}),this.updateCount(e.length)),this.$propertyList.html(d)},renderPropertyCard:function(e){var o="badge-active";e.status==="Pending"?o="badge-pending":(e.status==="Closed"||e.status==="Sold")&&(o="badge-sold");var l=e.image||"",d=l?"background-image: url("+l+")":"",f=[];e.beds&&f.push(e.beds+" bed"),e.baths&&f.push(e.baths+" bath"),e.sqft&&f.push(Number(e.sqft).toLocaleString()+" sqft");var c=e.price||"$0";return'
    '+(e.status?''+e.status+"":"")+'
    '+c+'
    '+(e.address||"Property")+'
    '+f.join(" • ")+"
    "}},s={map:null,markerLayer:null,clusterLayer:null,densityLayer:null,currentFilters:{},currentMode:null,debounceTimer:null,init:function(){var e=a("#mobile-property-map");if(!(!e.length||typeof L>"u")){this.currentFilters=this.getFiltersFromUrl(),this.map=L.map("mobile-property-map",{zoomControl:!1}).setView([45,-93.5],7),L.control.zoom({position:"topright"}).addTo(this.map),L.tileLayer("https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",{attribution:"© OSM"}).addTo(this.map),this.densityLayer=L.layerGroup().addTo(this.map),this.clusterLayer=L.layerGroup().addTo(this.map),this.markerLayer=L.layerGroup().addTo(this.map);var o=this;this.map.on("moveend zoomend",function(){o.onMapMove()}),this.fitToAllProperties()}},getFiltersFromUrl:function(){var e=new URLSearchParams(window.location.search);return{property_type:e.get("property_type")||"",city:e.get("city")||"",min_beds:e.get("beds")||"",min_price:e.get("min_price")||"",max_price:e.get("max_price")||"",status:"Active"}},onMapMove:function(){var e=this;clearTimeout(this.debounceTimer),this.debounceTimer=setTimeout(function(){e.loadClusters()},150)},fitToAllProperties:function(){var e=this;a.ajax({url:homeprozAjax.ajaxUrl,type:"GET",data:{action:"homeproz_get_filter_bounds",property_type:this.currentFilters.property_type||"",city:this.currentFilters.city||"",min_price:this.currentFilters.min_price||"",max_price:this.currentFilters.max_price||"",min_beds:this.currentFilters.min_beds||""},success:function(o){if(o.success&&o.data){var l=o.data,d=(l.ne_lat-l.sw_lat)*.15,f=(l.ne_lng-l.sw_lng)*.15,c=L.latLngBounds([l.sw_lat-d,l.sw_lng-f],[l.ne_lat+d,l.ne_lng+f]);e.map.fitBounds(c)}else e.loadClusters()},error:function(){e.loadClusters()}})},updateFilters:function(e){this.currentFilters=a.extend({},this.currentFilters,e),this.fitToAllProperties()},loadClusters:function(){if(this.map){var e=this,o=this.map.getBounds(),l=this.map.getZoom(),d=[o.getSouthWest().lat,o.getSouthWest().lng,o.getNorthEast().lat,o.getNorthEast().lng];w.showLoading(),a.ajax({url:homeprozAjax.ajaxUrl,type:"GET",data:{action:"mls_get_clusters",zoom:l,bounds:d,status:this.currentFilters.status||"Active",property_type:this.currentFilters.property_type||"",city:this.currentFilters.city||"",min_price:this.currentFilters.min_price||"",max_price:this.currentFilters.max_price||"",min_beds:this.currentFilters.min_beds||""},success:function(f){if(f.success&&f.data){var c=f.data;switch(e.currentMode=c.type,c.type){case"density":e.renderDensity(c.dots),w.updateCount(c.total||0),w.renderProperties([],!0);break;case"clusters":e.renderClusters(c.clusters),w.updateCount(c.total||0),w.renderProperties([],!0);break;case"markers":e.renderMarkers(c.markers),w.renderProperties(c.markers);break}}},error:function(){w.renderProperties([])}})}},clearAllLayers:function(){this.densityLayer.clearLayers(),this.clusterLayer.clearLayers(),this.markerLayer.clearLayers()},renderDensity:function(e){this.clearAllLayers();var o=this,l=this.map.getZoom();e.forEach(function(d){var f=o.getDensityColor(d.count,l),c=o.getDensitySize(d.count,l),m=L.divIcon({html:'
    ',className:"density-dot-container",iconSize:[c,c],iconAnchor:[c/2,c/2]}),v=L.marker([d.lat,d.lng],{icon:m});v.on("click",function(){o.map.setView([d.lat,d.lng],o.map.getZoom()+2)}),v.bindTooltip(d.count+" properties",{className:"density-tooltip"}),o.densityLayer.addLayer(v)})},getDensityColor:function(e,o){var l=Math.max(40,Math.round(600/Math.pow(1.4,o-3))),d=e/l;return d>=1.5?"rgba(180, 83, 9, 0.8)":d>=1?"rgba(217, 119, 6, 0.8)":d>=.6?"rgba(245, 158, 11, 0.8)":d>=.3?"rgba(234, 179, 8, 0.8)":d>=.15?"rgba(132, 204, 22, 0.8)":"rgba(34, 197, 94, 0.8)"},getDensitySize:function(e,o){var l=Math.max(40,Math.round(600/Math.pow(1.4,o-3))),d=e/l;return d>=1.5?11:d>=1?10:d>=.6?8:d>=.3?7:6},renderClusters:function(e){this.clearAllLayers();var o=this;e.forEach(function(l){var d="small",f=30;l.count>200?(d="large",f=40):l.count>=100&&(d="medium",f=35);var c=L.divIcon({html:"
    "+l.count+"
    ",className:"marker-cluster marker-cluster-"+d+" server-cluster",iconSize:L.point(f,f)}),m=L.marker([l.lat,l.lng],{icon:c});m.on("click",function(){o.map.setView([l.lat,l.lng],o.map.getZoom()+2)});var v="$"+o.formatNumber(l.min_price);l.max_price!==l.min_price&&(v+=" - $"+o.formatNumber(l.max_price)),m.bindTooltip(l.count+" properties
    "+v,{className:"cluster-tooltip"}),o.clusterLayer.addLayer(m)})},renderMarkers:function(e){this.clearAllLayers();var o=this;e.forEach(function(l,d){if(!(!l.lat||!l.lng)){var f=o.formatPrice(l.price),c=L.divIcon({className:"mobile-marker",html:'
    '+f+"
    ",iconSize:[70,28],iconAnchor:[35,28]}),m=L.marker([l.lat,l.lng],{icon:c,zIndexOffset:d});m.on("click",function(){window.location.href=l.url}),o.markerLayer.addLayer(m)}})},formatPrice:function(e){return typeof e=="string"&&(e=parseInt(e.replace(/[^0-9]/g,""),10)),e=Number(e),isNaN(e)?"$0":e>=1e6?"$"+(e/1e6).toFixed(1)+"M":e>=1e3?"$"+Math.round(e/1e3)+"k":"$"+e},formatNumber:function(e){return e.toString().replace(/\B(?=(\d{3})+(?!\d))/g,",")}};a(document).ready(function(){window.innerWidth<1024&&(w.init(),s.init())}),window.MobileSheet=w,window.MobileMap=s}})(jQuery);(function(a){var w={$gallery:null,$lightbox:null,$mainImage:null,$mainImageContainer:null,$thumbnails:null,$thumbnailsContainer:null,$thumbnailsViewport:null,$playbackBtn:null,$prevBtn:null,$nextBtn:null,$lightboxImage:null,$lightboxImageContainer:null,$lightboxCounter:null,images:[],currentIndex:0,isPlaying:!0,isTransitioning:!1,autoplayInterval:null,autoplayDelay:5e3,fadeDuration:1e3,slideDuration:300,thumbnailsPerPage:5,thumbnailPage:0,swipeStartX:0,swipeStartY:0,swipeThreshold:50,isSwiping:!1,init:function(){if(!(!a(".Single_Property").length&&!a(".Single_Property_MLS").length)&&(this.$gallery=a(".property-gallery"),this.$lightbox=a("#property-lightbox"),!!this.$gallery.length)){this.$mainImageContainer=this.$gallery.find(".gallery-main-image"),this.$mainImage=this.$mainImageContainer.find("img"),this.$thumbnailsContainer=this.$gallery.find(".gallery-thumbnails-container"),this.$thumbnailsViewport=this.$gallery.find(".gallery-thumbnails-viewport"),this.$thumbnails=this.$gallery.find(".gallery-thumbnail"),this.$playbackBtn=this.$gallery.find(".gallery-playback-btn"),this.$prevBtn=this.$gallery.find(".gallery-thumbnails-prev"),this.$nextBtn=this.$gallery.find(".gallery-thumbnails-next"),this.$lightboxImage=this.$lightbox.find(".lightbox-image"),this.$lightboxImageContainer=this.$lightbox.find(".lightbox-image-container"),this.$lightboxCounter=this.$lightbox.find(".lightbox-current");var s=a("#gallery-images-data");if(s.length)try{this.images=JSON.parse(s.text())}catch{console.error("PropertyGallery: Failed to parse gallery data");return}if(!(!this.images||this.images.length===0)){if(!this.$mainImage.length||!this.$lightboxImage.length){console.error("PropertyGallery: Missing required elements");return}this.calculateThumbnailsPerPage(),this.bindEvents(),this.bindSwipeEvents(),this.updateThumbnailNavigation(),this.setupThumbnailLoading(),this.preloadThumbnailPages(0,2),this.images.length>1&&this.startAutoplay()}}},calculateThumbnailsPerPage:function(){a(window).width()<=640?this.thumbnailsPerPage=4:this.thumbnailsPerPage=5},bindEvents:function(){var s=this;this.$thumbnails.on("click",function(e){e.stopPropagation();var o=parseInt(a(this).data("index"));s.stopAutoplay(),s.setMainImage(o,!1)}),this.$playbackBtn.on("click",function(e){e.stopPropagation(),e.preventDefault(),s.isPlaying?s.stopAutoplay():s.startAutoplay()}),this.$prevBtn.on("click",function(){s.stopAutoplay(),s.prevThumbnailPage()}),this.$nextBtn.on("click",function(){s.stopAutoplay(),s.nextThumbnailPage()}),this.$gallery.find("[data-lightbox-trigger]").on("click",function(e){if(s.isSwiping){s.isSwiping=!1;return}s.stopAutoplay(),s.openLightbox(s.currentIndex)}),this.$lightbox.find(".lightbox-close, .lightbox-overlay, .lightbox-container").on("click",function(e){(e.target===this||a(this).hasClass("lightbox-close"))&&s.closeLightbox()}),this.$lightbox.find(".lightbox-prev").on("click",function(){s.slideLightboxImage("prev")}),this.$lightbox.find(".lightbox-next").on("click",function(){s.slideLightboxImage("next")}),a(document).on("keydown",function(e){if(s.$lightbox.is('[aria-hidden="false"]'))switch(e.key){case"Escape":s.closeLightbox();break;case"ArrowLeft":s.slideLightboxImage("prev");break;case"ArrowRight":s.slideLightboxImage("next");break}}),a(window).on("resize",function(){s.calculateThumbnailsPerPage(),s.updateThumbnailNavigation()})},bindSwipeEvents:function(){var s=this;this.$mainImageContainer[0].addEventListener("touchstart",function(e){s.handleSwipeStart(e)},{passive:!0}),this.$mainImageContainer[0].addEventListener("touchend",function(e){s.handleMainGallerySwipeEnd(e)},{passive:!0}),this.$lightboxImageContainer[0].addEventListener("touchstart",function(e){s.handleSwipeStart(e)},{passive:!0}),this.$lightboxImageContainer[0].addEventListener("touchend",function(e){s.handleLightboxSwipeEnd(e)},{passive:!0})},handleSwipeStart:function(s){s.touches.length===1&&(this.swipeStartX=s.touches[0].clientX,this.swipeStartY=s.touches[0].clientY)},handleMainGallerySwipeEnd:function(s){if(s.changedTouches.length===1){var e=s.changedTouches[0].clientX-this.swipeStartX,o=s.changedTouches[0].clientY-this.swipeStartY;Math.abs(e)>Math.abs(o)&&Math.abs(e)>this.swipeThreshold&&(this.isSwiping=!0,this.stopAutoplay(),e>0?this.slideMainImage("prev"):this.slideMainImage("next"))}},handleLightboxSwipeEnd:function(s){if(s.changedTouches.length===1){var e=s.changedTouches[0].clientX-this.swipeStartX,o=s.changedTouches[0].clientY-this.swipeStartY;Math.abs(e)>Math.abs(o)&&Math.abs(e)>this.swipeThreshold&&(e>0?this.slideLightboxImage("prev"):this.slideLightboxImage("next"))}},startAutoplay:function(){var s=this;this.images.length<=1||(this.isPlaying=!0,this.$playbackBtn.addClass("is-playing"),this.$playbackBtn.attr("aria-label","Pause slideshow"),this.autoplayInterval=setInterval(function(){s.advanceImage()},this.autoplayDelay))},stopAutoplay:function(){this.isPlaying=!1,this.$playbackBtn.removeClass("is-playing"),this.$playbackBtn.attr("aria-label","Play slideshow"),this.autoplayInterval&&(clearInterval(this.autoplayInterval),this.autoplayInterval=null)},advanceImage:function(){if(!this.isTransitioning){var s=this.currentIndex+1;s>=this.images.length&&(s=0),this.setMainImage(s,!0)}},slideMainImage:function(s){var e=this;if(!(this.isTransitioning||this.images.length<=1)){var o;s==="prev"?(o=this.currentIndex-1,o<0&&(o=this.images.length-1)):(o=this.currentIndex+1,o>=this.images.length&&(o=0));var l=this.images[o];if(!l||!l.url){console.error("PropertyGallery: Invalid main image at index",o);return}this.isTransitioning=!0;var d=s==="next"?"100%":"-100%",f=s==="next"?"-100%":"100%",c=a('');c.attr("src",l.url),c.attr("alt",l.alt||"Property photo"),c.css({position:"absolute",top:0,left:0,width:"100%",height:"100%","object-fit":"cover",transform:"translateX("+d+")","z-index":2,"border-radius":"0.5rem"}),this.$mainImageContainer.css({position:"relative",overflow:"hidden"}),this.$mainImageContainer.append(c),this.$mainImage.css({transition:"transform "+this.slideDuration+"ms ease-out"}),c.css({transition:"transform "+this.slideDuration+"ms ease-out"}),c[0].offsetHeight,this.$mainImage.css("transform","translateX("+f+")"),c.css("transform","translateX(0)"),setTimeout(function(){e.$mainImage.attr("src",l.url),e.$mainImage.attr("alt",l.alt||"Property photo"),e.$mainImage.css({transition:"",transform:""}),c.remove(),e.isTransitioning=!1},this.slideDuration),this.currentIndex=o,this.$thumbnails.removeClass("is-active"),this.$thumbnails.filter('[data-index="'+o+'"]').addClass("is-active"),this.scrollToThumbnail(o)}},setMainImage:function(s,e){var o=this;if(!(s<0||s>=this.images.length)&&!this.isTransitioning){var l=this.images[s];if(!l||!l.url){console.error("PropertyGallery: Invalid image data at index",s);return}if(e){this.isTransitioning=!0;var d=a('');d.attr("src",l.url),d.attr("alt",l.alt||"Property photo"),d.css({position:"absolute",top:0,left:0,width:"100%",height:"100%","object-fit":"cover",opacity:0,transform:"scale(1.02)",transition:"opacity "+this.fadeDuration+"ms ease-in-out, transform "+this.fadeDuration+"ms ease-in-out","z-index":2,"border-radius":"0.5rem"}),this.$mainImageContainer.css("position","relative"),this.$mainImageContainer.append(d),d[0].offsetHeight,d.css({opacity:1,transform:"scale(1)"}),setTimeout(function(){o.$mainImage.attr("src",l.url),o.$mainImage.attr("alt",l.alt||"Property photo"),d.remove(),o.isTransitioning=!1},this.fadeDuration)}else this.$mainImage.attr("src",l.url),this.$mainImage.attr("alt",l.alt||"Property photo");this.currentIndex=s,this.$thumbnails.removeClass("is-active"),this.$thumbnails.filter('[data-index="'+s+'"]').addClass("is-active"),this.scrollToThumbnail(s)}},scrollToThumbnail:function(s){var e=Math.floor(s/this.thumbnailsPerPage);e!==this.thumbnailPage&&(this.thumbnailPage=e,this.scrollThumbnails())},scrollThumbnails:function(){var s=this.$gallery.find(".gallery-thumbnails"),e=this.$thumbnails.first().outerWidth(!0),o=this.thumbnailPage*this.thumbnailsPerPage*e;s.css("transform","translateX(-"+o+"px)"),this.updateThumbnailNavigation()},updateThumbnailNavigation:function(){var s=Math.ceil(this.images.length/this.thumbnailsPerPage);this.$prevBtn.prop("disabled",this.thumbnailPage===0),this.$nextBtn.prop("disabled",this.thumbnailPage>=s-1),s<=1?(this.$prevBtn.hide(),this.$nextBtn.hide()):(this.$prevBtn.show(),this.$nextBtn.show())},prevThumbnailPage:function(){this.thumbnailPage>0&&(this.thumbnailPage--,this.scrollThumbnails(),this.preloadPrevThumbnailPage())},nextThumbnailPage:function(){var s=Math.ceil(this.images.length/this.thumbnailsPerPage);this.thumbnailPage=this.images.length&&(o=0));var l=this.images[o];if(!l||!l.url){console.error("PropertyGallery: Invalid lightbox image at index",o);return}this.isTransitioning=!0;var d=s==="next"?"100%":"-100%",f=s==="next"?"-100%":"100%",c=a('');c.attr("src",l.url),c.attr("alt",l.alt||"Property photo"),c.css({position:"absolute","max-width":"100%","max-height":"calc(100vh - 8rem)","object-fit":"contain",transform:"translateX("+d+")",left:"50%",top:"50%","margin-left":"-45vw","margin-top":"calc(-50vh + 4rem)"}),this.$lightboxImageContainer.css({position:"relative",overflow:"hidden"}),this.$lightboxImageContainer.append(c),this.$lightboxImage.css({transition:"transform "+this.slideDuration+"ms ease-out"}),c.css({transition:"transform "+this.slideDuration+"ms ease-out"}),c[0].offsetHeight,this.$lightboxImage.css("transform","translateX("+f+")"),c.css("transform","translateX(0)"),setTimeout(function(){e.$lightboxImage.attr("src",l.url),e.$lightboxImage.attr("alt",l.alt||"Property photo"),e.$lightboxImage.css({transition:"",transform:""}),c.remove(),e.isTransitioning=!1,e.$lightboxCounter.text(o+1)},this.slideDuration),this.currentIndex=o}},prevImage:function(){this.slideLightboxImage("prev")},nextImage:function(){this.slideLightboxImage("next")},updateLightboxImage:function(){var s=this.images[this.currentIndex];if(!s||!s.url){console.error("PropertyGallery: Invalid lightbox image at index",this.currentIndex);return}this.$lightboxImage.attr("src",s.url),this.$lightboxImage.attr("alt",s.alt||"Property photo"),this.$lightboxCounter.text(this.currentIndex+1)},setupThumbnailLoading:function(){this.$thumbnails.each(function(){var s=a(this),e=s.find("img");s.addClass("is-loading"),s.find(".thumbnail-spinner").length||s.append('
    '),e[0].complete?s.removeClass("is-loading"):(e.on("load",function(){s.removeClass("is-loading")}),e.on("error",function(){s.removeClass("is-loading")}))})},preloadThumbnailPages:function(s,e){for(var o=this,l=s*this.thumbnailsPerPage,d=Math.min((s+e)*this.thumbnailsPerPage,this.images.length),f=l;f=0&&this.preloadThumbnailPages(s,1)}};a(function(){w.init()})})(jQuery);(function(a){if(a(".Single_Agent").length){var w={$gallery:null,$thumbsSlider:null,$thumbs:null,$lightbox:null,$lightboxImage:null,$lightboxCounter:null,images:[],currentIndex:0,isTransitioning:!1,slideDuration:300,init:function(){if(this.$gallery=a(".agent-gallery"),!!this.$gallery.length){this.$thumbsSlider=this.$gallery.find(".agent-gallery-thumbs-slider"),this.$thumbs=this.$gallery.find(".agent-gallery-thumb"),this.$lightbox=this.$gallery.find(".agent-gallery-lightbox"),this.$lightboxImage=this.$lightbox.find(".lightbox-image"),this.$lightboxCounter=this.$lightbox.find(".lightbox-current");var s=this.$gallery.find(".agent-gallery-data");if(s.length)try{this.images=JSON.parse(s.text())}catch{console.error("Failed to parse gallery data");return}this.images.length!==0&&(this.initSlick(),this.bindEvents())}},initSlick:function(){this.$thumbsSlider.slick({slidesToShow:6,slidesToScroll:3,arrows:!0,dots:!1,infinite:!1,speed:300,autoplay:!1,variableWidth:!1,prevArrow:'',nextArrow:'',responsive:[{breakpoint:768,settings:{slidesToShow:4,slidesToScroll:2}},{breakpoint:480,settings:{slidesToShow:3,slidesToScroll:2}}]})},bindEvents:function(){var s=this;this.$thumbs.on("click",function(){var e=parseInt(a(this).data("index"));s.openLightbox(e)}),this.$lightbox.find(".lightbox-close, .lightbox-overlay, .lightbox-container").on("click",function(e){(e.target===this||a(this).hasClass("lightbox-close"))&&s.closeLightbox()}),this.$lightbox.find(".lightbox-prev").on("click",function(){s.slideLightboxImage("prev")}),this.$lightbox.find(".lightbox-next").on("click",function(){s.slideLightboxImage("next")}),a(document).on("keydown",function(e){if(s.$lightbox.is('[aria-hidden="false"]'))switch(e.key){case"Escape":s.closeLightbox();break;case"ArrowLeft":s.slideLightboxImage("prev");break;case"ArrowRight":s.slideLightboxImage("next");break}}),this.bindSwipeEvents()},bindSwipeEvents:function(){var s=this,e=0,o=50,l=this.$lightbox.find(".lightbox-image-container");l[0].addEventListener("touchstart",function(d){d.touches.length===1&&(e=d.touches[0].clientX)},{passive:!0}),l[0].addEventListener("touchend",function(d){if(d.changedTouches.length===1){var f=d.changedTouches[0].clientX-e;Math.abs(f)>o&&(f>0?s.slideLightboxImage("prev"):s.slideLightboxImage("next"))}},{passive:!0})},openLightbox:function(s){this.currentIndex=s,this.updateLightboxImage(),this.$lightbox.attr("aria-hidden","false"),a("body").addClass("lightbox-open")},closeLightbox:function(){this.$lightbox.attr("aria-hidden","true"),a("body").removeClass("lightbox-open")},slideLightboxImage:function(s){var e=this;if(!(this.isTransitioning||this.images.length<=1)){var o;s==="prev"?(o=this.currentIndex-1,o<0&&(o=this.images.length-1)):(o=this.currentIndex+1,o>=this.images.length&&(o=0)),this.isTransitioning=!0;var l=this.images[o],d=s==="next"?"100%":"-100%",f=s==="next"?"-100%":"100%",c=this.$lightbox.find(".lightbox-image-container"),m=a('');m.attr("src",l.url),m.attr("alt",l.alt||"Gallery photo"),m.css({position:"absolute","max-width":"100%","max-height":"calc(100vh - 8rem)","object-fit":"contain",transform:"translateX("+d+")",left:"50%",top:"50%","margin-left":"-45vw","margin-top":"calc(-50vh + 4rem)"}),c.css({position:"relative",overflow:"hidden"}),c.append(m),this.$lightboxImage.css("transition","transform "+this.slideDuration+"ms ease-out"),m.css("transition","transform "+this.slideDuration+"ms ease-out"),m[0].offsetHeight,this.$lightboxImage.css("transform","translateX("+f+")"),m.css("transform","translateX(0)"),setTimeout(function(){e.$lightboxImage.attr("src",l.url),e.$lightboxImage.attr("alt",l.alt||"Gallery photo"),e.$lightboxImage.css({transition:"",transform:""}),m.remove(),e.isTransitioning=!1,e.$lightboxCounter.text(o+1)},this.slideDuration),this.currentIndex=o}},updateLightboxImage:function(){var s=this.images[this.currentIndex];this.$lightboxImage.attr("src",s.url),this.$lightboxImage.attr("alt",s.alt||"Gallery photo"),this.$lightboxCounter.text(this.currentIndex+1)}};a(function(){w.init()})}})(jQuery);(function(a){if(!a(".mortgage-calculator-main").length)return;let w=!1;a.fn.currencyInput=function(e=!0){return this.data("ci_show_symbol",e),w||(w=!0,a.fn._CIOriginalVal=a.fn.val,a.fn.val=function(l){if(a(this).data("_currencyInput"))if(arguments.length===0){var d=a(this)._CIOriginalVal();if(d=="")return"";var f=parseInt(d.replace(/[^0-9]/g,""));return f}else{if(l=String(l).replace(/[^0-9]/g,""),l!=""){var c=parseInt(l).toLocaleString("en-US",{style:"currency",currency:"USD",minimumFractionDigits:0,maximumFractionDigits:0});return a(this).data("ci_show_symbol")||(c=c.replace("$","")),a(this)._CIOriginalVal(c)}return a(this)._CIOriginalVal(l)}else if(a(this).data("_percentInput"))if(arguments.length===0){var d=a(this)._CIOriginalVal();if(d=="")return"";var f=parseFloat(d.replace(/[^0-9.]/g,""));return isNaN(f)?"":f}else{l=String(l).replace(/[^0-9.]/g,"");var m=l.split(".");return m.length>2&&(l=m[0]+"."+m.slice(1).join("")),a(this)._CIOriginalVal(l)}else return arguments.length===0?a(this)._CIOriginalVal():a(this)._CIOriginalVal(l)}),this.data("_currencyInput")?this:(this.data("_currencyInput",!0),this.on("focus",function(){a(this).select()}),this.on("input",function(l){var d=this.selectionStart,f=a(this)._CIOriginalVal(),c=f.length;a(this).val(f);var m=a(this)._CIOriginalVal().length;m>c?d+=m-c:m2&&(f=c[0]+"."+c.slice(1).join("")),a(this)._CIOriginalVal(f);var m=f.length;m0){var l=o/e*100;this.$downPaymentPercent._CIOriginalVal(l.toFixed(1))}},syncDownPaymentFromPercent:function(){var e=this.$homePrice.val(),o=this.$downPaymentPercent.val();if(e&&e>0&&o!==""&&o>=0){var l=Math.round(e*o/100);this.$downPayment.val(l)}},calculate:function(){var e=this.$homePrice.val()||0,o=this.$downPayment.val()||0,l=parseInt(this.$loanTerm.val(),10),d=this.$interestRate.val()||0,f=e-o;f<0&&(f=0);var c=d/100/12,m=l*12,v=0,P=0;if(f>0&&c>0&&m>0){var t=Math.pow(1+c,m);v=f*(c*t)/(t-1),P=v*m-f}else f>0&&c===0&&(v=f/m,P=0);this.$monthlyPayment.text(this.formatCurrencyDisplay(v)),this.$principalInterest.text(this.formatCurrencyDisplay(v)),this.$loanAmount.text(this.formatCurrencyDisplay(f)),this.$totalInterest.text(this.formatCurrencyDisplay(P))}};a(document).ready(function(){s.init()})})(jQuery);(function(a){a(function(){})})(jQuery); diff --git a/wp-content/themes/homeproz/functions.php b/wp-content/themes/homeproz/functions.php index 9059f4b2..14c7c93a 100755 --- a/wp-content/themes/homeproz/functions.php +++ b/wp-content/themes/homeproz/functions.php @@ -47,6 +47,12 @@ require_once HOMEPROZ_DIR . '/inc/schema-markup.php'; // Contact Form 7 hooks (agent email routing) require_once HOMEPROZ_DIR . '/inc/wpcf7-hooks.php'; +// Yoast SEO customizations (sitemap, meta) +require_once HOMEPROZ_DIR . '/inc/yoast-seo.php'; + +// Favicon management +require_once HOMEPROZ_DIR . '/inc/favicon.php'; + /** * Send no-cache headers for HTML pages * Prevents browser/proxy caching of dynamic content diff --git a/wp-content/themes/homeproz/inc/acf-fields.php b/wp-content/themes/homeproz/inc/acf-fields.php index 97d2e0e9..846778cc 100755 --- a/wp-content/themes/homeproz/inc/acf-fields.php +++ b/wp-content/themes/homeproz/inc/acf-fields.php @@ -625,6 +625,62 @@ function homeproz_register_acf_fields() { 'instructions' => 'Copyright text shown in footer. Year is added automatically.', 'default_value' => 'HomeProz Real Estate LLC. All rights reserved.', ), + + // Branding Tab + array( + 'key' => 'field_theme_tab_branding', + 'label' => 'Branding', + 'name' => '', + 'type' => 'tab', + 'placement' => 'left', + ), + array( + 'key' => 'field_theme_favicon_source', + 'label' => 'Favicon Source Image', + 'name' => 'theme_favicon_source', + 'type' => 'image', + 'instructions' => 'Upload a square image (PNG or WebP) at least 512x512 pixels. This will be automatically converted to all required favicon sizes. After saving, favicons are generated and stored in /wp-content/uploads/favicon/.', + 'required' => 0, + 'return_format' => 'id', + 'preview_size' => 'thumbnail', + 'library' => 'all', + 'mime_types' => 'png, webp', + 'min_width' => 256, + 'min_height' => 256, + ), + array( + 'key' => 'field_theme_favicon_status', + 'label' => 'Favicon Status', + 'name' => 'theme_favicon_status', + 'type' => 'message', + 'message' => 'Save the page after uploading a new favicon source to generate all favicon sizes.', + 'new_lines' => 'wpautop', + ), + + // Advanced Tab + array( + 'key' => 'field_theme_tab_advanced', + 'label' => 'Advanced', + 'name' => '', + 'type' => 'tab', + 'placement' => 'left', + ), + array( + 'key' => 'field_theme_header_scripts', + 'label' => 'Header Scripts', + 'name' => 'theme_header_scripts', + 'type' => 'textarea', + 'instructions' => 'Add tracking scripts (Google Analytics, Meta Pixel, etc.) to be included in the page header. You must include the complete code including <script></script> tags. This content is output exactly as entered.', + 'rows' => 10, + 'placeholder' => ' + +', + ), ), 'location' => array( array( @@ -1380,6 +1436,52 @@ function homeproz_register_acf_fields() { ), ), + // Testimonials Tab + array( + 'key' => 'field_agent_tab_testimonials', + 'label' => 'Testimonials', + 'name' => '', + 'type' => 'tab', + 'placement' => 'top', + ), + array( + 'key' => 'field_agent_testimonials', + 'label' => 'Client Testimonials', + 'name' => 'agent_testimonials', + 'type' => 'repeater', + 'instructions' => 'Add testimonials from clients who have worked with this agent.', + 'min' => 0, + 'max' => 20, + 'layout' => 'block', + 'button_label' => 'Add Testimonial', + 'sub_fields' => array( + array( + 'key' => 'field_testimonial_quote', + 'label' => 'Quote', + 'name' => 'quote', + 'type' => 'textarea', + 'required' => 1, + 'instructions' => 'The testimonial text from the client.', + 'rows' => 4, + ), + array( + 'key' => 'field_testimonial_client_name', + 'label' => 'Client Name', + 'name' => 'client_name', + 'type' => 'text', + 'required' => 1, + 'instructions' => 'Client\'s name (e.g., "John D." or "John Doe")', + ), + array( + 'key' => 'field_testimonial_context', + 'label' => 'Context', + 'name' => 'context', + 'type' => 'text', + 'instructions' => 'Optional context (e.g., "Albert Lea Buyer", "First-time Homeowner")', + ), + ), + ), + // Settings Tab array( 'key' => 'field_agent_tab_settings', @@ -1925,6 +2027,69 @@ function homeproz_register_acf_fields() { 'position' => 'normal', 'active' => true, )); + + // City Landing Page Field Group + acf_add_local_field_group(array( + 'key' => 'group_city_landing', + 'title' => 'City Landing Page Settings', + 'fields' => array( + array( + 'key' => 'field_city_name', + 'label' => 'City Name', + 'name' => 'city_name', + 'type' => 'text', + 'instructions' => 'Enter the city name exactly as it appears in MLS data. Leave blank to use the page title.', + ), + array( + 'key' => 'field_city_intro_content', + 'label' => 'Introduction Content', + 'name' => 'city_intro_content', + 'type' => 'wysiwyg', + 'instructions' => 'Custom content about this city/area. If left empty, the page content will be used.', + 'tabs' => 'all', + 'toolbar' => 'full', + 'media_upload' => 1, + ), + array( + 'key' => 'field_city_listings_heading', + 'label' => 'Listings Section Heading', + 'name' => 'listings_section_heading', + 'type' => 'text', + 'instructions' => 'Leave blank for default: "Homes for Sale in [City]"', + ), + array( + 'key' => 'field_city_max_listings', + 'label' => 'Maximum Listings to Show', + 'name' => 'max_listings_to_show', + 'type' => 'number', + 'instructions' => 'How many listings to display on this page', + 'default_value' => 8, + 'min' => 1, + 'max' => 20, + ), + array( + 'key' => 'field_city_show_all_text', + 'label' => 'Show All Button Text', + 'name' => 'show_all_button_text', + 'type' => 'text', + 'instructions' => 'Leave blank for default: "View All [City] Listings"', + ), + ), + 'location' => array( + array( + array( + 'param' => 'page_template', + 'operator' => '==', + 'value' => 'page-city-landing.php', + ), + ), + ), + 'menu_order' => 0, + 'position' => 'normal', + 'style' => 'default', + 'label_placement' => 'top', + 'active' => true, + )); } add_action('acf/init', 'homeproz_register_acf_fields'); diff --git a/wp-content/themes/homeproz/inc/favicon.php b/wp-content/themes/homeproz/inc/favicon.php new file mode 100644 index 00000000..cc1d2c3d --- /dev/null +++ b/wp-content/themes/homeproz/inc/favicon.php @@ -0,0 +1,371 @@ + $upload_dir['basedir'] . '/favicon', + 'url' => $upload_dir['baseurl'] . '/favicon', + ); +} + +/** + * Process favicon when Theme Options are saved + */ +add_action('acf/save_post', 'homeproz_process_favicon', 20); +function homeproz_process_favicon($post_id) { + // Only process on options page + if ($post_id !== 'options') { + return; + } + + $favicon_source_id = get_field('theme_favicon_source', 'option'); + + if (!$favicon_source_id) { + return; + } + + // Get the source image path + $source_path = get_attached_file($favicon_source_id); + + if (!$source_path || !file_exists($source_path)) { + return; + } + + // Check if we need to regenerate (compare source modification time) + $paths = homeproz_get_favicon_paths(); + $version_file = $paths['dir'] . '/.version'; + $source_mtime = filemtime($source_path); + + if (file_exists($version_file)) { + $stored_version = file_get_contents($version_file); + if ($stored_version === $favicon_source_id . ':' . $source_mtime) { + // Already processed this version + return; + } + } + + // Generate favicons + $result = homeproz_generate_favicons($source_path); + + if ($result) { + // Store version to avoid re-processing + file_put_contents($version_file, $favicon_source_id . ':' . $source_mtime); + } +} + +/** + * Generate all favicon sizes using ImageMagick + */ +function homeproz_generate_favicons($source_path) { + $paths = homeproz_get_favicon_paths(); + $favicon_dir = $paths['dir']; + + // Create directory if it doesn't exist + if (!file_exists($favicon_dir)) { + wp_mkdir_p($favicon_dir); + } + + // Check if ImageMagick is available + $convert_path = trim(shell_exec('which convert 2>/dev/null')); + if (empty($convert_path)) { + error_log('HomeProz Favicon: ImageMagick convert command not found'); + return false; + } + + // Verify source image dimensions + $image_info = getimagesize($source_path); + if (!$image_info || $image_info[0] < 256 || $image_info[1] < 256) { + error_log('HomeProz Favicon: Source image must be at least 256x256 pixels'); + return false; + } + + $source_escaped = escapeshellarg($source_path); + + // Define all the sizes we need to generate + $png_sizes = array( + 'favicon-16x16.png' => 16, + 'favicon-32x32.png' => 32, + 'favicon-48x48.png' => 48, + 'apple-touch-icon.png' => 180, + 'android-chrome-192x192.png' => 192, + 'android-chrome-512x512.png' => 512, + 'mstile-150x150.png' => 150, + ); + + $success = true; + + // Generate PNG files + foreach ($png_sizes as $filename => $size) { + $output_path = $favicon_dir . '/' . $filename; + $output_escaped = escapeshellarg($output_path); + + // Use ImageMagick to resize with high quality + $cmd = sprintf( + '%s %s -resize %dx%d -gravity center -background transparent -extent %dx%d %s 2>&1', + escapeshellarg($convert_path), + $source_escaped, + $size, + $size, + $size, + $size, + $output_escaped + ); + + exec($cmd, $output, $return_var); + + if ($return_var !== 0) { + error_log('HomeProz Favicon: Failed to generate ' . $filename . ': ' . implode("\n", $output)); + $success = false; + } + } + + // Generate favicon.ico (multi-resolution ICO file) + $ico_path = $favicon_dir . '/favicon.ico'; + $ico_escaped = escapeshellarg($ico_path); + + // Create temporary files for ICO sizes + $temp_16 = $favicon_dir . '/temp-16.png'; + $temp_32 = $favicon_dir . '/temp-32.png'; + $temp_48 = $favicon_dir . '/temp-48.png'; + + // Generate temp files + foreach (array(16 => $temp_16, 32 => $temp_32, 48 => $temp_48) as $size => $temp_path) { + $cmd = sprintf( + '%s %s -resize %dx%d -gravity center -background transparent -extent %dx%d %s 2>&1', + escapeshellarg($convert_path), + $source_escaped, + $size, + $size, + $size, + $size, + escapeshellarg($temp_path) + ); + exec($cmd, $output, $return_var); + } + + // Combine into ICO + $cmd = sprintf( + '%s %s %s %s %s 2>&1', + escapeshellarg($convert_path), + escapeshellarg($temp_16), + escapeshellarg($temp_32), + escapeshellarg($temp_48), + $ico_escaped + ); + exec($cmd, $output, $return_var); + + // Clean up temp files + @unlink($temp_16); + @unlink($temp_32); + @unlink($temp_48); + + if ($return_var !== 0) { + error_log('HomeProz Favicon: Failed to generate favicon.ico: ' . implode("\n", $output)); + $success = false; + } + + // Generate web manifest + homeproz_generate_web_manifest($favicon_dir); + + // Generate browserconfig.xml for Windows + homeproz_generate_browserconfig($favicon_dir); + + return $success; +} + +/** + * Generate site.webmanifest file + */ +function homeproz_generate_web_manifest($favicon_dir) { + $paths = homeproz_get_favicon_paths(); + + $manifest = array( + 'name' => get_bloginfo('name'), + 'short_name' => 'HomeProz', + 'icons' => array( + array( + 'src' => $paths['url'] . '/android-chrome-192x192.png', + 'sizes' => '192x192', + 'type' => 'image/png', + ), + array( + 'src' => $paths['url'] . '/android-chrome-512x512.png', + 'sizes' => '512x512', + 'type' => 'image/png', + ), + ), + 'theme_color' => '#0A0A0A', + 'background_color' => '#0A0A0A', + 'display' => 'standalone', + ); + + $manifest_path = $favicon_dir . '/site.webmanifest'; + file_put_contents($manifest_path, json_encode($manifest, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES)); +} + +/** + * Generate browserconfig.xml for Windows tiles + */ +function homeproz_generate_browserconfig($favicon_dir) { + $paths = homeproz_get_favicon_paths(); + + $xml = ' + + + + + #0A0A0A + + +'; + + $config_path = $favicon_dir . '/browserconfig.xml'; + file_put_contents($config_path, $xml); +} + +/** + * Output favicon HTML in head + */ +add_action('wp_head', 'homeproz_output_favicon_html', 2); +function homeproz_output_favicon_html() { + $favicon_source_id = get_field('theme_favicon_source', 'option'); + + if (!$favicon_source_id) { + return; + } + + $paths = homeproz_get_favicon_paths(); + $favicon_dir = $paths['dir']; + $favicon_url = $paths['url']; + + // Check if favicons exist + if (!file_exists($favicon_dir . '/favicon.ico')) { + return; + } + + // Get version for cache busting (use directory modification time) + $version = filemtime($favicon_dir . '/favicon.ico'); + + echo "\n\n"; + + // Standard favicons + echo '' . "\n"; + echo '' . "\n"; + echo '' . "\n"; + echo '' . "\n"; + + // Apple Touch Icon + echo '' . "\n"; + + // Android/Chrome + echo '' . "\n"; + + // Microsoft + echo '' . "\n"; + echo '' . "\n"; +} + +/** + * Disable WordPress Site Icon from Customizer to avoid conflicts + */ +add_action('customize_register', 'homeproz_disable_site_icon', 20); +function homeproz_disable_site_icon($wp_customize) { + // Remove the site icon control + $wp_customize->remove_control('site_icon'); +} + +/** + * Remove default WordPress site icon output + */ +add_action('init', 'homeproz_remove_default_site_icon'); +function homeproz_remove_default_site_icon() { + // Remove site icon from wp_head + remove_action('wp_head', 'wp_site_icon', 99); +} + +/** + * Filter to disable site icon in REST API responses + */ +add_filter('get_site_icon_url', 'homeproz_filter_site_icon_url', 10, 3); +function homeproz_filter_site_icon_url($url, $size, $blog_id) { + $favicon_source_id = get_field('theme_favicon_source', 'option'); + + if ($favicon_source_id) { + $paths = homeproz_get_favicon_paths(); + + // Return appropriate size + if ($size <= 16) { + return $paths['url'] . '/favicon-16x16.png'; + } elseif ($size <= 32) { + return $paths['url'] . '/favicon-32x32.png'; + } elseif ($size <= 48) { + return $paths['url'] . '/favicon-48x48.png'; + } elseif ($size <= 150) { + return $paths['url'] . '/mstile-150x150.png'; + } elseif ($size <= 180) { + return $paths['url'] . '/apple-touch-icon.png'; + } elseif ($size <= 192) { + return $paths['url'] . '/android-chrome-192x192.png'; + } else { + return $paths['url'] . '/android-chrome-512x512.png'; + } + } + + return $url; +} + +/** + * Admin notice if ImageMagick is not available + */ +add_action('admin_notices', 'homeproz_favicon_admin_notice'); +function homeproz_favicon_admin_notice() { + // Only show on theme options page + $screen = get_current_screen(); + if (!$screen || $screen->id !== 'toplevel_page_theme-options') { + return; + } + + $convert_path = trim(shell_exec('which convert 2>/dev/null')); + if (empty($convert_path)) { + echo '

    Favicon Generation: ImageMagick is not installed on this server. Favicon generation will not work until ImageMagick is available.

    '; + } +} + +/** + * Force regenerate favicons (can be called manually or via WP-CLI) + */ +function homeproz_regenerate_favicons() { + $favicon_source_id = get_field('theme_favicon_source', 'option'); + + if (!$favicon_source_id) { + return false; + } + + $source_path = get_attached_file($favicon_source_id); + + if (!$source_path || !file_exists($source_path)) { + return false; + } + + // Delete version file to force regeneration + $paths = homeproz_get_favicon_paths(); + @unlink($paths['dir'] . '/.version'); + + return homeproz_generate_favicons($source_path); +} diff --git a/wp-content/themes/homeproz/inc/template-functions.php b/wp-content/themes/homeproz/inc/template-functions.php index 88de008f..cba65822 100755 --- a/wp-content/themes/homeproz/inc/template-functions.php +++ b/wp-content/themes/homeproz/inc/template-functions.php @@ -43,6 +43,14 @@ function homeproz_get_page_class() { return 'About_Page'; } + if (is_page_template('page-team.php') || is_page('team')) { + return 'Team_Page'; + } + + if (is_page_template('page-results.php') || is_page('results')) { + return 'Results_Page'; + } + if (is_page_template('page-contact.php') || is_page('contact')) { return 'Contact_Page'; } @@ -106,27 +114,6 @@ function homeproz_excerpt_more($more) { } add_filter('excerpt_more', 'homeproz_excerpt_more'); -/** - * Get property status badge class - * - * @param string $status The property status - * @return string CSS class for the badge - */ -function homeproz_get_status_class($status) { - $status = strtolower($status); - - switch ($status) { - case 'active': - return 'badge-success'; - case 'pending': - return 'badge-warning'; - case 'sold': - return 'badge-muted'; - default: - return 'badge-default'; - } -} - /** * Format price for display * @@ -250,38 +237,30 @@ function homeproz_get_featured_mls_listings($count = 3) { $added_keys = array(); $listings = array(); - // 1. Get featured MLS IDs from the override system (FIRST PRIORITY) - $featured_mls_ids = function_exists('homeproz_get_featured_mls_ids') - ? homeproz_get_featured_mls_ids() - : array(); + // 1. Get featured properties (is_featured = 1 in MLS database) + $type_placeholders = implode(',', array_fill(0, count($residential_types), '%s')); + $featured_query = $wpdb->prepare( + "SELECT listing_key, listing_id, list_price, street_number, street_name, street_suffix, + city, state_or_province, postal_code, bedrooms_total, bathrooms_total, + living_area, standard_status, property_type, photos_count + FROM {$table} + WHERE is_featured = 1 + AND property_type IN ({$type_placeholders}) + AND standard_status = 'Active' + AND mlg_can_view = 1 + AND photos_count > 0 + ORDER BY modification_timestamp DESC", + ...$residential_types + ); + $featured_listings = $wpdb->get_results($featured_query); - // Add featured residential listings first - if (!empty($featured_mls_ids)) { - $id_placeholders = implode(',', array_fill(0, count($featured_mls_ids), '%s')); - $type_placeholders = implode(',', array_fill(0, count($residential_types), '%s')); - $featured_query = $wpdb->prepare( - "SELECT listing_key, listing_id, list_price, street_number, street_name, street_suffix, - city, state_or_province, postal_code, bedrooms_total, bathrooms_total, - living_area, standard_status, property_type, photos_count - FROM {$table} - WHERE listing_id IN ({$id_placeholders}) - AND property_type IN ({$type_placeholders}) - AND standard_status = 'Active' - AND mlg_can_view = 1 - AND photos_count > 0 - ORDER BY modification_timestamp DESC", - ...array_merge($featured_mls_ids, $residential_types) - ); - $featured_listings = $wpdb->get_results($featured_query); - - foreach ($featured_listings as $listing) { - if (count($listings) >= $count) break; - $listings[] = homeproz_format_mls_listing_for_json($listing, false); - $added_keys[] = $listing->listing_key; - } + foreach ($featured_listings as $listing) { + if (count($listings) >= $count) break; + $listings[] = homeproz_format_mls_listing_for_json($listing, false); + $added_keys[] = $listing->listing_key; } - // 2. Add HomeProz residential listings (if we need more) + // 2. Add HomeProz Active residential listings (if we need more) if (count($listings) < $count) { $type_placeholders = implode(',', array_fill(0, count($residential_types), '%s')); $exclude_clause = ''; @@ -315,7 +294,41 @@ function homeproz_get_featured_mls_listings($count = 3) { } } - // 3. Fill remaining slots with random residential listings + // 3. Add HomeProz Pending residential listings (if we need more) + if (count($listings) < $count) { + $type_placeholders = implode(',', array_fill(0, count($residential_types), '%s')); + $exclude_clause = ''; + if (!empty($added_keys)) { + $key_placeholders = implode(',', array_fill(0, count($added_keys), '%s')); + $exclude_clause = $wpdb->prepare(" AND listing_key NOT IN ({$key_placeholders})", ...$added_keys); + } + + $homeproz_pending_query = $wpdb->prepare( + "SELECT listing_key, listing_id, list_price, street_number, street_name, street_suffix, + city, state_or_province, postal_code, bedrooms_total, bathrooms_total, + living_area, standard_status, property_type, photos_count + FROM {$table} + WHERE is_homeproz = 1 + AND property_type IN ({$type_placeholders}) + AND standard_status = 'Pending' + AND mlg_can_view = 1 + AND COALESCE(street_name, '') NOT REGEXP '\\\\bTBD\\\\b' + AND COALESCE(street_number, '') NOT REGEXP '\\\\bTBD\\\\b' + AND photos_count > 0 + {$exclude_clause} + ORDER BY modification_timestamp DESC", + ...$residential_types + ); + $homeproz_pending_listings = $wpdb->get_results($homeproz_pending_query); + + foreach ($homeproz_pending_listings as $listing) { + if (count($listings) >= $count) break; + $listings[] = homeproz_format_mls_listing_for_json($listing, true); + $added_keys[] = $listing->listing_key; + } + } + + // 4. Fill remaining slots with random residential listings if (count($listings) < $count) { $needed = $count - count($listings); $type_placeholders = implode(',', array_fill(0, count($residential_types), '%s')); @@ -376,34 +389,26 @@ function homeproz_get_featured_commercial_listings($count = 3) { $added_keys = array(); $listings = array(); - // 1. Get featured MLS IDs from the override system - $featured_mls_ids = function_exists('homeproz_get_featured_mls_ids') - ? homeproz_get_featured_mls_ids() - : array(); + // 1. Get featured properties (is_featured = 1 in MLS database) + $featured_query = $wpdb->prepare( + "SELECT listing_key, listing_id, list_price, street_number, street_name, street_suffix, + city, state_or_province, postal_code, bedrooms_total, bathrooms_total, + living_area, standard_status, property_type, photos_count + FROM {$table} + WHERE is_featured = 1 + AND property_type IN ({$type_placeholders}) + AND standard_status = 'Active' + AND mlg_can_view = 1 + AND photos_count > 0 + ORDER BY modification_timestamp DESC", + ...$commercial_types + ); + $featured_listings = $wpdb->get_results($featured_query); - // Add featured commercial listings first - if (!empty($featured_mls_ids)) { - $id_placeholders = implode(',', array_fill(0, count($featured_mls_ids), '%s')); - $featured_query = $wpdb->prepare( - "SELECT listing_key, listing_id, list_price, street_number, street_name, street_suffix, - city, state_or_province, postal_code, bedrooms_total, bathrooms_total, - living_area, standard_status, property_type, photos_count - FROM {$table} - WHERE listing_id IN ({$id_placeholders}) - AND property_type IN ({$type_placeholders}) - AND standard_status = 'Active' - AND mlg_can_view = 1 - AND photos_count > 0 - ORDER BY modification_timestamp DESC", - ...array_merge($featured_mls_ids, $commercial_types) - ); - $featured_listings = $wpdb->get_results($featured_query); - - foreach ($featured_listings as $listing) { - if (count($listings) >= $count) break; - $listings[] = homeproz_format_mls_listing_for_json($listing, false); - $added_keys[] = $listing->listing_key; - } + foreach ($featured_listings as $listing) { + if (count($listings) >= $count) break; + $listings[] = homeproz_format_mls_listing_for_json($listing, false); + $added_keys[] = $listing->listing_key; } // 2. Add HomeProz commercial listings (if we need more) @@ -495,18 +500,8 @@ function homeproz_format_mls_listing_for_json($listing, $is_homeproz = false) { $full_address .= ', ' . $listing->state_or_province; } - // Check for MLS override (custom featured photo) - $listing_id = isset($listing->listing_id) ? $listing->listing_id : null; - $override = function_exists('homeproz_get_mls_override') ? homeproz_get_mls_override($listing_id) : null; - - // Get image URL - use override if available, otherwise MLS image - if ($override && !empty($override['featured_photo'])) { - $image_url = isset($override['featured_photo']['sizes']['medium_large']) - ? $override['featured_photo']['sizes']['medium_large'] - : $override['featured_photo']['url']; - } else { - $image_url = mls_get_image_url($listing->listing_key, 1, 'thumb'); - } + // Get image URL from MLS + $image_url = mls_get_image_url($listing->listing_key, 1, 'thumb'); return array( 'listing_key' => $listing->listing_key, @@ -698,3 +693,115 @@ function homeproz_admin_bar_edit_link($wp_admin_bar) { } add_action('admin_bar_menu', 'homeproz_admin_bar_edit_link', 80); +/** + * Format property description with smart paragraph breaks and auto-linked URLs + * + * - Detects embedded headers: if a line has punctuation but ends without punctuation, + * the trailing unpunctuated text is split out as a header + * - Adds paragraph breaks between lines, except when both lines start with + * non-alphanumeric characters (preserves bullet lists) + * - Auto-links URLs with target="_blank" + * + * @param string $text The description text + * @return string Formatted HTML + */ +function homeproz_format_property_description($text) { + if (empty($text)) { + return ''; + } + + // Escape HTML first + $text = esc_html($text); + + // Normalize line endings + $text = str_replace("\r\n", "\n", $text); + $text = str_replace("\r", "\n", $text); + + // Split into lines + $lines = explode("\n", $text); + $processed_lines = array(); + + // First pass: detect embedded headers + // Rule: if a line contains punctuation but the text after the last punctuation + // doesn't end with punctuation, that trailing text is likely a header + foreach ($lines as $line) { + $trimmed = trim($line); + + // Skip empty lines + if ($trimmed === '') { + $processed_lines[] = $line; + continue; + } + + // Check for pattern: sentence ending with punctuation, followed by unpunctuated text + // e.g., "...modern conveniences. On the Scenic Shell Rock River" + if (preg_match('/^(.+[.!?])(\s+)([A-Z].*)$/u', $trimmed, $matches)) { + $before = $matches[1]; // text up to and including last punctuation + $after = $matches[3]; // text after the punctuation (starts with capital) + + // Only split if the trailing text doesn't end with punctuation + $after_trimmed = trim($after); + if (!empty($after_trimmed) && !preg_match('/[.!?]$/', $after_trimmed)) { + // This is an embedded header - split it out with blank line + $processed_lines[] = $before; + $processed_lines[] = ''; + $processed_lines[] = $after; + continue; + } + } + + $processed_lines[] = $line; + } + + // Second pass: add paragraph breaks between non-list lines + $result = array(); + $count = count($processed_lines); + + for ($i = 0; $i < $count; $i++) { + $current_line = $processed_lines[$i]; + $result[] = $current_line; + + // Check if we need to add an extra newline after this line + if ($i < $count - 1) { + $next_line = $processed_lines[$i + 1]; + + // Skip empty lines + if (trim($current_line) === '' || trim($next_line) === '') { + continue; + } + + // Check first character of each line (after trimming) + $current_first = substr(ltrim($current_line), 0, 1); + $next_first = substr(ltrim($next_line), 0, 1); + + // If both lines start with non-alphanumeric (like bullets), keep them together + $current_is_list = !ctype_alnum($current_first); + $next_is_list = !ctype_alnum($next_first); + + if (!($current_is_list && $next_is_list)) { + // Add extra newline to create paragraph break + $result[] = ''; + } + } + } + + // Join lines back together + $text = implode("\n", $result); + + // Auto-link URLs (before wpautop to avoid breaking tags) + $url_pattern = '/(https?:\/\/[^\s<>\[\]]+)/i'; + $text = preg_replace_callback($url_pattern, function($matches) { + $url = $matches[1]; + // Remove trailing punctuation that's likely not part of URL + $trailing = ''; + if (preg_match('/([.,;:!?\)]+)$/', $url, $punct)) { + $trailing = $punct[1]; + $url = substr($url, 0, -strlen($trailing)); + } + return '' . $url . '' . $trailing; + }, $text); + + // Convert to paragraphs + return wpautop($text); +} + diff --git a/wp-content/themes/homeproz/inc/theme-setup.php b/wp-content/themes/homeproz/inc/theme-setup.php index f6ef6836..1cba3452 100755 --- a/wp-content/themes/homeproz/inc/theme-setup.php +++ b/wp-content/themes/homeproz/inc/theme-setup.php @@ -79,6 +79,26 @@ function homeproz_theme_color_meta() { } add_action('wp_head', 'homeproz_theme_color_meta', 1); +/** + * Output custom header scripts from Theme Options + * + * Allows site admin to add tracking scripts (Google Analytics, etc.) + * Scripts are output exactly as entered - must include own script tags. + */ +function homeproz_header_scripts() { + if (!function_exists('get_field')) { + return; + } + + $header_scripts = get_field('theme_header_scripts', 'option'); + + if (!empty($header_scripts)) { + // Output exactly as entered - no escaping, no wrapping + echo "\n" . $header_scripts . "\n"; + } +} +add_action('wp_head', 'homeproz_header_scripts', 5); + /** * Register custom block pattern category */ diff --git a/wp-content/themes/homeproz/inc/yoast-seo.php b/wp-content/themes/homeproz/inc/yoast-seo.php new file mode 100644 index 00000000..cf55f26e --- /dev/null +++ b/wp-content/themes/homeproz/inc/yoast-seo.php @@ -0,0 +1,182 @@ + + ' . home_url('/?homeproz_mls_sitemap=1') . ' + ' . date('c') . ' + '; + + return $sitemap_custom_items; +} + +/** + * Register custom sitemap for MLS listings + */ +add_action('init', 'homeproz_register_mls_sitemap'); +function homeproz_register_mls_sitemap() { + global $wpseo_sitemaps; + + if (isset($wpseo_sitemaps) && is_object($wpseo_sitemaps)) { + $wpseo_sitemaps->register_sitemap('mls-listings', 'homeproz_generate_mls_sitemap'); + } +} + +/** + * Alternative: Handle custom sitemap via rewrite rule + */ +add_action('init', 'homeproz_mls_sitemap_rewrite'); +function homeproz_mls_sitemap_rewrite() { + add_rewrite_rule( + '^mls-listings-sitemap\.xml$', + 'index.php?homeproz_mls_sitemap=1', + 'top' + ); +} + +add_filter('query_vars', 'homeproz_mls_sitemap_query_vars'); +function homeproz_mls_sitemap_query_vars($vars) { + $vars[] = 'homeproz_mls_sitemap'; + return $vars; +} + +add_action('template_redirect', 'homeproz_render_mls_sitemap', 1); +function homeproz_render_mls_sitemap() { + if (!get_query_var('homeproz_mls_sitemap')) { + return; + } + + global $wpdb; + + // Clean any output buffers + while (ob_get_level()) { + ob_end_clean(); + } + + // Send headers + status_header(200); + header('Content-Type: application/xml; charset=UTF-8'); + header('X-Robots-Tag: noindex, follow'); + + echo '' . "\n"; + echo '' . "\n"; + + // Get properties where HomeProz is the listing office + $table_name = $wpdb->prefix . 'mls_properties'; + $table_exists = $wpdb->get_var("SHOW TABLES LIKE '{$table_name}'"); + + if ($table_exists) { + $properties = $wpdb->get_results(" + SELECT listing_key, modification_timestamp + FROM {$table_name} + WHERE (list_office_name LIKE '%HomeProz%' OR list_office_name LIKE '%Home Proz%') + AND standard_status IN ('Active', 'Pending') + ORDER BY modification_timestamp DESC + "); + + if ($properties) { + foreach ($properties as $property) { + $url = home_url('/properties/?listing=' . urlencode($property->listing_key)); + $lastmod = $property->modification_timestamp ? date('c', strtotime($property->modification_timestamp)) : date('c'); + + echo " \n"; + echo " " . esc_url($url) . "\n"; + echo " " . esc_html($lastmod) . "\n"; + echo " daily\n"; + echo " 0.7\n"; + echo " \n"; + } + } + } + + echo ''; + exit; +} + +/** + * Exclude specific pages from sitemap + * + * Excludes thank you pages, template examples, and utility pages. + */ +add_filter('wpseo_exclude_from_sitemap_by_post_ids', 'homeproz_exclude_pages_from_sitemap'); +function homeproz_exclude_pages_from_sitemap($excluded_posts) { + // Get pages to exclude by slug + $exclude_slugs = array( + 'inquiry-thank-you', + 'contact-thank-you', + 'page-template-examples', + 'content-sidebar', + 'alternating-blocks', + 'service-detail', + 'card-grid', + 'long-form-article', + 'landing-page', + 'sample-page', + 'home-page-alt', + ); + + foreach ($exclude_slugs as $slug) { + $page = get_page_by_path($slug); + if ($page) { + $excluded_posts[] = $page->ID; + } + } + + return $excluded_posts; +} + +/** + * Set noindex for thank you and utility pages via Yoast + */ +add_action('wp_head', 'homeproz_noindex_utility_pages', 1); +function homeproz_noindex_utility_pages() { + if (!is_page()) { + return; + } + + $noindex_slugs = array( + 'inquiry-thank-you', + 'contact-thank-you', + 'page-template-examples', + 'content-sidebar', + 'alternating-blocks', + 'service-detail', + 'card-grid', + 'long-form-article', + 'landing-page', + 'sample-page', + 'home-page-alt', + ); + + global $post; + if ($post && in_array($post->post_name, $noindex_slugs)) { + echo '' . "\n"; + } +} + +/** + * Flush rewrite rules on theme activation to register sitemap URL + */ +add_action('after_switch_theme', 'homeproz_flush_rewrite_rules_for_sitemap'); +function homeproz_flush_rewrite_rules_for_sitemap() { + homeproz_mls_sitemap_rewrite(); + flush_rewrite_rules(); +} diff --git a/wp-content/themes/homeproz/node_modules/.package-lock.json b/wp-content/themes/homeproz/node_modules/.package-lock.json index 7a2ffc36..2ed9cc63 100755 --- a/wp-content/themes/homeproz/node_modules/.package-lock.json +++ b/wp-content/themes/homeproz/node_modules/.package-lock.json @@ -17,12 +17,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@esbuild/linux-x64": { + "node_modules/@esbuild/linux-arm64": { "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", "cpu": [ - "x64" + "arm64" ], "dev": true, "license": "MIT", @@ -148,12 +148,12 @@ "@parcel/watcher-win32-x64": "2.5.1" } }, - "node_modules/@parcel/watcher-linux-x64-glibc": { + "node_modules/@parcel/watcher-linux-arm64-glibc": { "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", - "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", "cpu": [ - "x64" + "arm64" ], "dev": true, "license": "MIT", @@ -169,12 +169,47 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.53.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.53.3.tgz", - "integrity": "sha512-3EhFi1FU6YL8HTUJZ51imGJWEX//ajQPfqWLI3BQq4TlvHy4X0MOr5q3D2Zof/ka0d5FNdPwZXm3Yyib/UEd+w==", + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", "cpu": [ - "x64" + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.53.3.tgz", + "integrity": "sha512-RGrFLWgMhSxRs/EWJMIFM1O5Mzuz3Xy3/mnxJp/5cVhZ2XoCAxJnmNsEyeMJtpK+wu0FJFWz+QF4mjCA7AUQ3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.53.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.53.3.tgz", + "integrity": "sha512-kASyvfBEWYPEwe0Qv4nfu6pNkITLTb32p4yTgzFCocHnJLAHs+9LjUu9ONIhvfT/5lv4YS5muBHyuV84epBo/A==", + "cpu": [ + "arm64" ], "dev": true, "license": "MIT", @@ -312,6 +347,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.25", "caniuse-lite": "^1.0.30001754", @@ -658,6 +694,7 @@ "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "dev": true, "license": "MIT", + "peer": true, "bin": { "jiti": "bin/jiti.js" } @@ -865,6 +902,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -1157,6 +1195,7 @@ "integrity": "sha512-N+7WK20/wOr7CzA2snJcUSSNTCzeCGUTFY3OgeQP3mZ1aj9NMQ0mSTXwlrnd89j33zzQJGqIN52GIOmYrfq46A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", @@ -1371,6 +1410,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, diff --git a/wp-content/themes/homeproz/node_modules/@esbuild/linux-arm64/README.md b/wp-content/themes/homeproz/node_modules/@esbuild/linux-arm64/README.md new file mode 100644 index 00000000..0d52dd1f --- /dev/null +++ b/wp-content/themes/homeproz/node_modules/@esbuild/linux-arm64/README.md @@ -0,0 +1,3 @@ +# esbuild + +This is the Linux ARM 64-bit binary for esbuild, a JavaScript bundler and minifier. See https://github.com/evanw/esbuild for details. diff --git a/wp-content/themes/homeproz/node_modules/@esbuild/linux-x64/bin/esbuild b/wp-content/themes/homeproz/node_modules/@esbuild/linux-arm64/bin/esbuild similarity index 53% rename from wp-content/themes/homeproz/node_modules/@esbuild/linux-x64/bin/esbuild rename to wp-content/themes/homeproz/node_modules/@esbuild/linux-arm64/bin/esbuild index 288f7689..bc38e73e 100755 Binary files a/wp-content/themes/homeproz/node_modules/@esbuild/linux-x64/bin/esbuild and b/wp-content/themes/homeproz/node_modules/@esbuild/linux-arm64/bin/esbuild differ diff --git a/wp-content/themes/homeproz/node_modules/@esbuild/linux-x64/package.json b/wp-content/themes/homeproz/node_modules/@esbuild/linux-arm64/package.json old mode 100755 new mode 100644 similarity index 66% rename from wp-content/themes/homeproz/node_modules/@esbuild/linux-x64/package.json rename to wp-content/themes/homeproz/node_modules/@esbuild/linux-arm64/package.json index b70b09ec..945123d6 --- a/wp-content/themes/homeproz/node_modules/@esbuild/linux-x64/package.json +++ b/wp-content/themes/homeproz/node_modules/@esbuild/linux-arm64/package.json @@ -1,7 +1,7 @@ { - "name": "@esbuild/linux-x64", + "name": "@esbuild/linux-arm64", "version": "0.21.5", - "description": "The Linux 64-bit binary for esbuild, a JavaScript bundler.", + "description": "The Linux ARM 64-bit binary for esbuild, a JavaScript bundler.", "repository": { "type": "git", "url": "git+https://github.com/evanw/esbuild.git" @@ -15,6 +15,6 @@ "linux" ], "cpu": [ - "x64" + "arm64" ] } diff --git a/wp-content/themes/homeproz/node_modules/@esbuild/linux-x64/README.md b/wp-content/themes/homeproz/node_modules/@esbuild/linux-x64/README.md deleted file mode 100755 index b2f19300..00000000 --- a/wp-content/themes/homeproz/node_modules/@esbuild/linux-x64/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# esbuild - -This is the Linux 64-bit binary for esbuild, a JavaScript bundler and minifier. See https://github.com/evanw/esbuild for details. diff --git a/wp-content/themes/homeproz/node_modules/@parcel/watcher-linux-x64-glibc/LICENSE b/wp-content/themes/homeproz/node_modules/@parcel/watcher-linux-arm64-glibc/LICENSE old mode 100755 new mode 100644 similarity index 100% rename from wp-content/themes/homeproz/node_modules/@parcel/watcher-linux-x64-glibc/LICENSE rename to wp-content/themes/homeproz/node_modules/@parcel/watcher-linux-arm64-glibc/LICENSE diff --git a/wp-content/themes/homeproz/node_modules/@parcel/watcher-linux-arm64-glibc/README.md b/wp-content/themes/homeproz/node_modules/@parcel/watcher-linux-arm64-glibc/README.md new file mode 100644 index 00000000..c797dacb --- /dev/null +++ b/wp-content/themes/homeproz/node_modules/@parcel/watcher-linux-arm64-glibc/README.md @@ -0,0 +1 @@ +This is the linux-arm64-glibc build of @parcel/watcher. See https://github.com/parcel-bundler/watcher for details. \ No newline at end of file diff --git a/wp-content/themes/homeproz/node_modules/@parcel/watcher-linux-x64-glibc/package.json b/wp-content/themes/homeproz/node_modules/@parcel/watcher-linux-arm64-glibc/package.json old mode 100755 new mode 100644 similarity index 90% rename from wp-content/themes/homeproz/node_modules/@parcel/watcher-linux-x64-glibc/package.json rename to wp-content/themes/homeproz/node_modules/@parcel/watcher-linux-arm64-glibc/package.json index 866de56f..4da272e9 --- a/wp-content/themes/homeproz/node_modules/@parcel/watcher-linux-x64-glibc/package.json +++ b/wp-content/themes/homeproz/node_modules/@parcel/watcher-linux-arm64-glibc/package.json @@ -1,5 +1,5 @@ { - "name": "@parcel/watcher-linux-x64-glibc", + "name": "@parcel/watcher-linux-arm64-glibc", "version": "2.5.1", "main": "watcher.node", "repository": { @@ -25,7 +25,7 @@ "linux" ], "cpu": [ - "x64" + "arm64" ], "libc": [ "glibc" diff --git a/wp-content/themes/homeproz/node_modules/@parcel/watcher-linux-arm64-glibc/watcher.node b/wp-content/themes/homeproz/node_modules/@parcel/watcher-linux-arm64-glibc/watcher.node new file mode 100644 index 00000000..aec5b036 Binary files /dev/null and b/wp-content/themes/homeproz/node_modules/@parcel/watcher-linux-arm64-glibc/watcher.node differ diff --git a/wp-content/themes/homeproz/node_modules/@parcel/watcher-linux-arm64-musl/LICENSE b/wp-content/themes/homeproz/node_modules/@parcel/watcher-linux-arm64-musl/LICENSE new file mode 100644 index 00000000..7fb9bc95 --- /dev/null +++ b/wp-content/themes/homeproz/node_modules/@parcel/watcher-linux-arm64-musl/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017-present Devon Govett + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/wp-content/themes/homeproz/node_modules/@parcel/watcher-linux-arm64-musl/README.md b/wp-content/themes/homeproz/node_modules/@parcel/watcher-linux-arm64-musl/README.md new file mode 100644 index 00000000..a776fb0c --- /dev/null +++ b/wp-content/themes/homeproz/node_modules/@parcel/watcher-linux-arm64-musl/README.md @@ -0,0 +1 @@ +This is the linux-arm64-musl build of @parcel/watcher. See https://github.com/parcel-bundler/watcher for details. \ No newline at end of file diff --git a/wp-content/themes/homeproz/node_modules/@parcel/watcher-linux-arm64-musl/package.json b/wp-content/themes/homeproz/node_modules/@parcel/watcher-linux-arm64-musl/package.json new file mode 100644 index 00000000..0a922b9c --- /dev/null +++ b/wp-content/themes/homeproz/node_modules/@parcel/watcher-linux-arm64-musl/package.json @@ -0,0 +1,33 @@ +{ + "name": "@parcel/watcher-linux-arm64-musl", + "version": "2.5.1", + "main": "watcher.node", + "repository": { + "type": "git", + "url": "https://github.com/parcel-bundler/watcher.git" + }, + "description": "A native C++ Node module for querying and subscribing to filesystem events. Used by Parcel 2.", + "license": "MIT", + "publishConfig": { + "access": "public" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "files": [ + "watcher.node" + ], + "engines": { + "node": ">= 10.0.0" + }, + "os": [ + "linux" + ], + "cpu": [ + "arm64" + ], + "libc": [ + "musl" + ] +} diff --git a/wp-content/themes/homeproz/node_modules/@parcel/watcher-linux-arm64-musl/watcher.node b/wp-content/themes/homeproz/node_modules/@parcel/watcher-linux-arm64-musl/watcher.node new file mode 100644 index 00000000..7a9c05e4 Binary files /dev/null and b/wp-content/themes/homeproz/node_modules/@parcel/watcher-linux-arm64-musl/watcher.node differ diff --git a/wp-content/themes/homeproz/node_modules/@parcel/watcher-linux-x64-glibc/README.md b/wp-content/themes/homeproz/node_modules/@parcel/watcher-linux-x64-glibc/README.md deleted file mode 100755 index 0214354c..00000000 --- a/wp-content/themes/homeproz/node_modules/@parcel/watcher-linux-x64-glibc/README.md +++ /dev/null @@ -1 +0,0 @@ -This is the linux-x64-glibc build of @parcel/watcher. See https://github.com/parcel-bundler/watcher for details. \ No newline at end of file diff --git a/wp-content/themes/homeproz/node_modules/@parcel/watcher-linux-x64-glibc/watcher.node b/wp-content/themes/homeproz/node_modules/@parcel/watcher-linux-x64-glibc/watcher.node deleted file mode 100755 index ee86362d..00000000 Binary files a/wp-content/themes/homeproz/node_modules/@parcel/watcher-linux-x64-glibc/watcher.node and /dev/null differ diff --git a/wp-content/themes/homeproz/node_modules/@rollup/rollup-linux-arm64-gnu/README.md b/wp-content/themes/homeproz/node_modules/@rollup/rollup-linux-arm64-gnu/README.md new file mode 100644 index 00000000..48e68cb4 --- /dev/null +++ b/wp-content/themes/homeproz/node_modules/@rollup/rollup-linux-arm64-gnu/README.md @@ -0,0 +1,3 @@ +# `@rollup/rollup-linux-arm64-gnu` + +This is the **aarch64-unknown-linux-gnu** binary for `rollup` diff --git a/wp-content/themes/homeproz/node_modules/@rollup/rollup-linux-x64-gnu/package.json b/wp-content/themes/homeproz/node_modules/@rollup/rollup-linux-arm64-gnu/package.json old mode 100755 new mode 100644 similarity index 72% rename from wp-content/themes/homeproz/node_modules/@rollup/rollup-linux-x64-gnu/package.json rename to wp-content/themes/homeproz/node_modules/@rollup/rollup-linux-arm64-gnu/package.json index 8bd324fb..a829b7d4 --- a/wp-content/themes/homeproz/node_modules/@rollup/rollup-linux-x64-gnu/package.json +++ b/wp-content/themes/homeproz/node_modules/@rollup/rollup-linux-arm64-gnu/package.json @@ -1,14 +1,14 @@ { - "name": "@rollup/rollup-linux-x64-gnu", + "name": "@rollup/rollup-linux-arm64-gnu", "version": "4.53.3", "os": [ "linux" ], "cpu": [ - "x64" + "arm64" ], "files": [ - "rollup.linux-x64-gnu.node" + "rollup.linux-arm64-gnu.node" ], "description": "Native bindings for Rollup", "author": "Lukas Taegert-Atkinson", @@ -21,5 +21,5 @@ "libc": [ "glibc" ], - "main": "./rollup.linux-x64-gnu.node" + "main": "./rollup.linux-arm64-gnu.node" } \ No newline at end of file diff --git a/wp-content/themes/homeproz/node_modules/@rollup/rollup-linux-arm64-gnu/rollup.linux-arm64-gnu.node b/wp-content/themes/homeproz/node_modules/@rollup/rollup-linux-arm64-gnu/rollup.linux-arm64-gnu.node new file mode 100644 index 00000000..9f827ee9 Binary files /dev/null and b/wp-content/themes/homeproz/node_modules/@rollup/rollup-linux-arm64-gnu/rollup.linux-arm64-gnu.node differ diff --git a/wp-content/themes/homeproz/node_modules/@rollup/rollup-linux-arm64-musl/README.md b/wp-content/themes/homeproz/node_modules/@rollup/rollup-linux-arm64-musl/README.md new file mode 100644 index 00000000..3db2751a --- /dev/null +++ b/wp-content/themes/homeproz/node_modules/@rollup/rollup-linux-arm64-musl/README.md @@ -0,0 +1,3 @@ +# `@rollup/rollup-linux-arm64-musl` + +This is the **aarch64-unknown-linux-musl** binary for `rollup` diff --git a/wp-content/themes/homeproz/node_modules/@rollup/rollup-linux-arm64-musl/package.json b/wp-content/themes/homeproz/node_modules/@rollup/rollup-linux-arm64-musl/package.json new file mode 100644 index 00000000..400615a8 --- /dev/null +++ b/wp-content/themes/homeproz/node_modules/@rollup/rollup-linux-arm64-musl/package.json @@ -0,0 +1,25 @@ +{ + "name": "@rollup/rollup-linux-arm64-musl", + "version": "4.53.3", + "os": [ + "linux" + ], + "cpu": [ + "arm64" + ], + "files": [ + "rollup.linux-arm64-musl.node" + ], + "description": "Native bindings for Rollup", + "author": "Lukas Taegert-Atkinson", + "homepage": "https://rollupjs.org/", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/rollup/rollup.git" + }, + "libc": [ + "musl" + ], + "main": "./rollup.linux-arm64-musl.node" +} \ No newline at end of file diff --git a/wp-content/themes/homeproz/node_modules/@rollup/rollup-linux-arm64-musl/rollup.linux-arm64-musl.node b/wp-content/themes/homeproz/node_modules/@rollup/rollup-linux-arm64-musl/rollup.linux-arm64-musl.node new file mode 100644 index 00000000..21af5290 Binary files /dev/null and b/wp-content/themes/homeproz/node_modules/@rollup/rollup-linux-arm64-musl/rollup.linux-arm64-musl.node differ diff --git a/wp-content/themes/homeproz/node_modules/@rollup/rollup-linux-x64-gnu/README.md b/wp-content/themes/homeproz/node_modules/@rollup/rollup-linux-x64-gnu/README.md deleted file mode 100755 index cabe280f..00000000 --- a/wp-content/themes/homeproz/node_modules/@rollup/rollup-linux-x64-gnu/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# `@rollup/rollup-linux-x64-gnu` - -This is the **x86_64-unknown-linux-gnu** binary for `rollup` diff --git a/wp-content/themes/homeproz/node_modules/@rollup/rollup-linux-x64-gnu/rollup.linux-x64-gnu.node b/wp-content/themes/homeproz/node_modules/@rollup/rollup-linux-x64-gnu/rollup.linux-x64-gnu.node deleted file mode 100755 index 2dede932..00000000 Binary files a/wp-content/themes/homeproz/node_modules/@rollup/rollup-linux-x64-gnu/rollup.linux-x64-gnu.node and /dev/null differ diff --git a/wp-content/themes/homeproz/package-lock.json b/wp-content/themes/homeproz/package-lock.json index fbc34b52..3fdf7818 100755 --- a/wp-content/themes/homeproz/package-lock.json +++ b/wp-content/themes/homeproz/package-lock.json @@ -1246,6 +1246,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.25", "caniuse-lite": "^1.0.30001754", @@ -1607,6 +1608,7 @@ "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "dev": true, "license": "MIT", + "peer": true, "bin": { "jiti": "bin/jiti.js" } @@ -1814,6 +1816,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -2106,6 +2109,7 @@ "integrity": "sha512-N+7WK20/wOr7CzA2snJcUSSNTCzeCGUTFY3OgeQP3mZ1aj9NMQ0mSTXwlrnd89j33zzQJGqIN52GIOmYrfq46A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "chokidar": "^4.0.0", "immutable": "^5.0.2", @@ -2320,6 +2324,7 @@ "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, diff --git a/wp-content/themes/homeproz/page-city-landing.php b/wp-content/themes/homeproz/page-city-landing.php new file mode 100644 index 00000000..3ae932a0 --- /dev/null +++ b/wp-content/themes/homeproz/page-city-landing.php @@ -0,0 +1,137 @@ + $city_name, + 'status' => 'Active', + 'limit' => $max_listings, + 'orderby' => 'list_price', + 'order' => 'DESC', + )); +} + +// Count total listings for this city +$total_listings = 0; +if (function_exists('mls_get_property_count')) { + $total_listings = mls_get_property_count(array( + 'city' => $city_name, + 'status' => 'Active', + )); +} + +// Properties search URL filtered by city +$search_url = add_query_arg('city', urlencode($city_name), home_url('/properties/')); +?> + +
    + + +
    +
    +

    Real Estate

    +

    Find homes for sale in , Minnesota

    + 0) : ?> +

    active available

    + +
    +
    + + + +
    +
    +
    + + + + + +
    +
    +
    + + + + +
    +
    +
    +

    +
    + +
    + +
    + + count($listings)) : ?> + + +
    +
    + +
    +
    +

    No active listings in at this time. Check back soon or browse all properties.

    +
    +
    + + + + 'Looking for a Home in ' . $city_name . '?', + 'text' => 'Our local agents know ' . $city_name . ' inside and out. Let us help you find the perfect property.', + 'button_text' => 'Contact an Agent', + 'button_url' => home_url('/contact/'), + 'style' => 'accent', + )); + ?> + +
    + + + + 0) : ?> +
    +

    Client Testimonials

    +
    + +
    +
    + +

    +
    +
    + + + + +
    +
    + +
    +
    + + 0) { diff --git a/wp-content/themes/homeproz/src/main.js b/wp-content/themes/homeproz/src/main.js index 7820eaa0..fffdf9d9 100755 --- a/wp-content/themes/homeproz/src/main.js +++ b/wp-content/themes/homeproz/src/main.js @@ -12,6 +12,7 @@ import '../template-parts/components/hero-section.js'; import '../template-parts/components/hero-location-search.js'; import '../template-parts/home/featured-listings.js'; import '../template-parts/property/property-filters.js'; +import '../template-parts/property/mobile-map.js'; import '../template-parts/property/property-gallery.js'; import '../template-parts/agent/agent-gallery.js'; import '../template-parts/content/content-mortgage-calculator.js'; diff --git a/wp-content/themes/homeproz/src/main.scss b/wp-content/themes/homeproz/src/main.scss index 747b373e..182d52ce 100755 --- a/wp-content/themes/homeproz/src/main.scss +++ b/wp-content/themes/homeproz/src/main.scss @@ -27,6 +27,7 @@ @import '../template-parts/content/content-mortgage-calculator.scss'; @import '../template-parts/property/property-card.scss'; @import '../template-parts/property/property-filters.scss'; +@import '../template-parts/property/mobile-map.scss'; @import '../template-parts/property/property-gallery.scss'; @import '../template-parts/property/single-property.scss'; @import '../template-parts/agent/single-agent.scss'; @@ -44,6 +45,7 @@ // Import page templates @import '../page-templates/page-templates.scss'; +@import '../page-city-landing.scss'; // ============================================ // CSS Custom Properties (Design Tokens) diff --git a/wp-content/themes/homeproz/template-parts/agent/single-agent.scss b/wp-content/themes/homeproz/template-parts/agent/single-agent.scss index 241fec8b..05eb6ed6 100755 --- a/wp-content/themes/homeproz/template-parts/agent/single-agent.scss +++ b/wp-content/themes/homeproz/template-parts/agent/single-agent.scss @@ -125,6 +125,16 @@ justify-content: flex-start; } + @media (max-width: 767px) { + flex-direction: column; + align-items: center; + + .btn { + min-width: 275px; + justify-content: center; + } + } + .btn { display: inline-flex; align-items: center; @@ -280,6 +290,78 @@ } } + // Testimonials Section + .agent-testimonials { + .testimonials-grid { + display: grid; + grid-template-columns: 1fr; + gap: 1.5rem; + + @media (min-width: 768px) { + grid-template-columns: repeat(2, 1fr); + } + } + + .testimonial-card { + background-color: var(--color-bg-card); + border-radius: 0.5rem; + padding: 1.5rem; + margin: 0; + border-left: 3px solid var(--color-accent); + display: flex; + flex-direction: column; + gap: 1rem; + } + + .testimonial-quote { + position: relative; + + .quote-icon { + position: absolute; + top: 0; + left: 0; + width: 24px; + height: 24px; + color: var(--color-accent); + opacity: 0.3; + } + + p { + margin: 0; + padding-left: 2rem; + font-size: 1rem; + line-height: 1.7; + color: var(--color-text); + font-style: italic; + } + } + + .testimonial-attribution { + padding-left: 2rem; + display: flex; + flex-wrap: wrap; + align-items: baseline; + gap: 0.25rem 0.5rem; + } + + .client-name { + font-size: 0.9375rem; + font-weight: 600; + color: var(--color-text); + font-style: normal; + } + + .client-context { + font-size: 0.8125rem; + color: var(--color-text-muted); + + &::before { + content: '-'; + margin-right: 0.5rem; + } + } + } + // Gallery Section .agent-gallery-section { .agent-gallery-grid { diff --git a/wp-content/themes/homeproz/template-parts/components/hero-section-card.scss b/wp-content/themes/homeproz/template-parts/components/hero-section-card.scss index c65bfd72..79098078 100755 --- a/wp-content/themes/homeproz/template-parts/components/hero-section-card.scss +++ b/wp-content/themes/homeproz/template-parts/components/hero-section-card.scss @@ -91,6 +91,39 @@ } } +// When inside hero-mobile-only, use flexbox centering instead of absolute +// This ensures the hero section grows to fit the card + padding +.hero-mobile-only .hero-section--card { + // Override to use flexbox centering - parent grows to fit content + min-height: max(70vh, auto); + padding: 20px 0; // 20px top + 20px bottom = 40px total buffer + justify-content: center; // Center the card horizontally + + .hero-card { + position: relative; + top: auto; + left: auto; + transform: none; + max-width: 520px; + margin: 0 auto; // Ensure horizontal centering + + @media (max-width: 768px) { + width: calc(100% - 2rem); + } + + // Ensure top margin on medium-short viewports (700-960px) + @media (min-height: 700px) and (max-height: 960px) { + margin-top: 20px; + margin-bottom: auto; + } + + // Scale down on short viewports + @media (max-height: 700px) { + transform: scale(0.9); + } + } +} + .hero-section--card .hero-section-logo { display: block; max-width: 360px; @@ -145,6 +178,16 @@ flex-wrap: wrap; gap: 0.875rem; justify-content: center; + + @media (max-width: 549px) { + flex-direction: column; + width: 100%; + + .btn { + width: 100%; + justify-content: center; + } + } } .hero-section--card .hero-location-search { diff --git a/wp-content/themes/homeproz/template-parts/components/service-cards.scss b/wp-content/themes/homeproz/template-parts/components/service-cards.scss index d64bea94..abc8f3aa 100755 --- a/wp-content/themes/homeproz/template-parts/components/service-cards.scss +++ b/wp-content/themes/homeproz/template-parts/components/service-cards.scss @@ -62,6 +62,11 @@ grid-template-columns: repeat(2, 1fr); gap: 0.75rem; } + + @media (max-width: 599px) { + grid-template-columns: 1fr; + gap: 1rem; + } } .service-card { diff --git a/wp-content/themes/homeproz/template-parts/content/content-about.scss b/wp-content/themes/homeproz/template-parts/content/content-about.scss index 1b28f801..7de48b3d 100755 --- a/wp-content/themes/homeproz/template-parts/content/content-about.scss +++ b/wp-content/themes/homeproz/template-parts/content/content-about.scss @@ -122,6 +122,30 @@ margin: 0 auto; } + // Team grid - centered even when not full width + .agents-grid { + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: 2rem; + + .agent-card-item { + width: 100%; + + @media (min-width: 640px) { + width: calc(50% - 1rem); + } + + @media (min-width: 1024px) { + width: calc(33.333% - 1.334rem); + } + + @media (min-width: 1280px) { + width: calc(25% - 1.5rem); + } + } + } + // Broker Section .about-broker-section { padding: 3rem 0; diff --git a/wp-content/themes/homeproz/template-parts/footer/site-footer.scss b/wp-content/themes/homeproz/template-parts/footer/site-footer.scss index b936bc6d..f066b786 100755 --- a/wp-content/themes/homeproz/template-parts/footer/site-footer.scss +++ b/wp-content/themes/homeproz/template-parts/footer/site-footer.scss @@ -103,23 +103,22 @@ list-style: none; margin: 0; padding: 0; + display: flex; + flex-wrap: wrap; + gap: 0.5rem 1.5rem; + + @media (max-width: 767px) { + gap: 0.5rem 1rem; + } } - .menu-item { - margin-bottom: 0.75rem; + .menu-item a { + color: var(--color-text-muted); + font-size: 0.9375rem; + text-decoration: none; - &:last-child { - margin-bottom: 0; - } - - a { - color: var(--color-text-muted); - font-size: 0.9375rem; - text-decoration: none; - - &:hover { - color: var(--color-accent-light); - } + &:hover { + color: var(--color-accent-light); } } } diff --git a/wp-content/themes/homeproz/template-parts/property/mobile-map.js b/wp-content/themes/homeproz/template-parts/property/mobile-map.js new file mode 100644 index 00000000..1846a0fa --- /dev/null +++ b/wp-content/themes/homeproz/template-parts/property/mobile-map.js @@ -0,0 +1,750 @@ +/** + * Mobile Map View JavaScript + * + * Bottom sheet interface for mobile property browsing + * Uses same AJAX endpoints as desktop map for consistency + * + * @package HomeProz + */ + +(function($) { + 'use strict'; + + // Only run on mobile viewports + if (window.innerWidth >= 1024) { + return; + } + + /** + * Mobile Bottom Sheet Manager + */ + var MobileSheet = { + $sheet: null, + $handle: null, + $content: null, + $filters: null, + $filterToggle: null, + $propertyList: null, + $propertyCount: null, + + // Sheet states and heights (2 states only) + states: { + collapsed: 120, + expanded: null // Calculated as 100vh - 60px + }, + currentState: 'collapsed', + + // Drag handling + isDragging: false, + startY: 0, + startHeight: 0, + currentHeight: 0, + lastY: 0, + lastTime: 0, + velocity: 0, + + /** + * Initialize the sheet + */ + init: function() { + this.$sheet = $('#mobile-bottom-sheet'); + if (!this.$sheet.length) return; + + this.$handle = $('#sheet-drag-handle'); + this.$content = $('#sheet-content'); + this.$filters = $('#sheet-filters'); + this.$filterToggle = $('#sheet-filter-toggle'); + this.$propertyList = $('#sheet-property-list'); + this.$propertyCount = $('#mobile-property-count'); + + // Calculate dynamic heights + this.calculateHeights(); + + // Bind events + this.bindEvents(); + + // Set initial state + this.setState('collapsed'); + }, + + /** + * Calculate viewport-dependent heights + */ + calculateHeights: function() { + var vh = window.innerHeight; + this.states.expanded = vh - 60; + }, + + /** + * Bind all events + */ + bindEvents: function() { + var self = this; + + // Drag handle events (touch) + this.$handle.on('touchstart', function(e) { + self.onDragStart(e); + }); + + $(document).on('touchmove', function(e) { + if (self.isDragging) { + self.onDragMove(e); + } + }); + + $(document).on('touchend touchcancel', function(e) { + if (self.isDragging) { + self.onDragEnd(e); + } + }); + + // Handle tap on drag handle to cycle states + this.$handle.on('click', function() { + if (!self.isDragging) { + self.cycleState(); + } + }); + + // Filter toggle + this.$filterToggle.on('click', function(e) { + e.stopPropagation(); // Prevent header click from firing + self.toggleFilters(); + }); + + // Header click to expand/collapse (except when clicking filter button) + this.$sheet.find('.sheet-header').on('click', function(e) { + // Only toggle if not clicking the filter button + if (!$(e.target).closest('#sheet-filter-toggle').length) { + self.cycleState(); + } + }); + + // Filter changes + $('.sheet-filter-select').on('change', function() { + self.onFilterChange(); + }); + + // Recalculate on resize + $(window).on('resize', function() { + self.calculateHeights(); + self.setState(self.currentState, true); + }); + + // Prevent body scroll when sheet is expanded + this.$content.on('touchmove', function(e) { + if (self.currentState === 'expanded') { + e.stopPropagation(); + } + }); + }, + + /** + * Start dragging + */ + onDragStart: function(e) { + this.isDragging = true; + this.startY = e.touches[0].clientY; + this.lastY = this.startY; + this.lastTime = Date.now(); + this.startHeight = this.$sheet.height(); + this.velocity = 0; + this.$sheet.addClass('is-dragging'); + }, + + /** + * Handle drag move + */ + onDragMove: function(e) { + if (!this.isDragging) return; + + var currentY = e.touches[0].clientY; + var currentTime = Date.now(); + var deltaY = this.startY - currentY; + var newHeight = this.startHeight + deltaY; + + // Calculate velocity (pixels per millisecond) + var timeDelta = currentTime - this.lastTime; + if (timeDelta > 0) { + this.velocity = (this.lastY - currentY) / timeDelta; + } + this.lastY = currentY; + this.lastTime = currentTime; + + // Clamp height + var minHeight = this.states.collapsed; + var maxHeight = this.states.expanded; + newHeight = Math.max(minHeight, Math.min(maxHeight, newHeight)); + + this.currentHeight = newHeight; + this.$sheet.css('height', newHeight + 'px'); + + // Prevent default to stop page scroll + e.preventDefault(); + }, + + /** + * End dragging - snap based on gesture direction and velocity + */ + onDragEnd: function(e) { + if (!this.isDragging) return; + + this.isDragging = false; + this.$sheet.removeClass('is-dragging'); + + var totalDelta = this.startY - this.lastY; // Positive = swiped up + + // Use velocity for quick swipes, or distance for slow drags + var velocityThreshold = 0.5; // pixels per ms + var distanceThreshold = 50; // pixels + + if (Math.abs(this.velocity) > velocityThreshold) { + // Fast swipe - use velocity direction + if (this.velocity > 0) { + this.setState('expanded'); + } else { + this.setState('collapsed'); + } + } else if (Math.abs(totalDelta) > distanceThreshold) { + // Slow drag - use direction + if (totalDelta > 0) { + this.setState('expanded'); + } else { + this.setState('collapsed'); + } + } else { + // Small movement - snap back to current state + this.setState(this.currentState); + } + }, + + /** + * Toggle state on tap + */ + cycleState: function() { + if (this.currentState === 'collapsed') { + this.setState('expanded'); + } else { + this.setState('collapsed'); + } + }, + + /** + * Set sheet state + */ + setState: function(state, skipAnimation) { + this.currentState = state; + this.$sheet.attr('data-state', state); + + var height = this.states[state]; + if (skipAnimation) { + this.$sheet.addClass('is-dragging'); + } + this.$sheet.css('height', height + 'px'); + if (skipAnimation) { + // Remove after a frame to allow CSS to apply + var self = this; + requestAnimationFrame(function() { + self.$sheet.removeClass('is-dragging'); + }); + } + + }, + + /** + * Toggle filters visibility + */ + toggleFilters: function() { + this.$filters.toggleClass('is-visible'); + this.$filterToggle.toggleClass('is-active'); + + // Expand sheet if collapsed and filters are being shown + if (this.$filters.hasClass('is-visible') && this.currentState === 'collapsed') { + this.setState('expanded'); + } + }, + + /** + * Handle filter change + */ + onFilterChange: function() { + var filters = this.getFilters(); + MobileMap.updateFilters(filters); + }, + + /** + * Get current filter values + */ + getFilters: function() { + return { + property_type: $('#mobile-filter-type').val() || '', + city: $('#mobile-filter-city').val() || '', + min_beds: $('#mobile-filter-beds').val() || '', + min_price: $('#mobile-filter-min-price').val() || '', + max_price: $('#mobile-filter-max-price').val() || '' + }; + }, + + /** + * Update property count display + */ + updateCount: function(count) { + this.$propertyCount.text(count); + }, + + /** + * Show loading state in property list + */ + showLoading: function() { + this.$propertyList.html( + '
    ' + + '
    ' + + 'Loading properties...' + + '
    ' + ); + }, + + /** + * Render property cards in the list + * @param {Array} properties - Property data array + * @param {boolean} skipCountUpdate - Don't update count (for density/cluster mode) + */ + renderProperties: function(properties, skipCountUpdate) { + var self = this; + var html = ''; + + if (!properties || properties.length === 0) { + html = '
    ' + + '' + + '' + + '' + + '' + + '

    Zoom in to see individual properties

    ' + + '
    '; + if (!skipCountUpdate) { + this.updateCount(0); + } + } else { + properties.forEach(function(prop) { + html += self.renderPropertyCard(prop); + }); + this.updateCount(properties.length); + } + + this.$propertyList.html(html); + }, + + /** + * Render a single property card + */ + renderPropertyCard: function(prop) { + var statusClass = 'badge-active'; + if (prop.status === 'Pending') { + statusClass = 'badge-pending'; + } else if (prop.status === 'Closed' || prop.status === 'Sold') { + statusClass = 'badge-sold'; + } + + // Use image URL from API (includes signature for auth) + var imageUrl = prop.image || ''; + var imageStyle = imageUrl ? 'background-image: url(' + imageUrl + ')' : ''; + + var specs = []; + if (prop.beds) specs.push(prop.beds + ' bed'); + if (prop.baths) specs.push(prop.baths + ' bath'); + if (prop.sqft) specs.push(Number(prop.sqft).toLocaleString() + ' sqft'); + + // Price comes pre-formatted from API (e.g., "$375,000") + var priceFormatted = prop.price || '$0'; + + return '' + + '
    ' + + (prop.status ? '' + prop.status + '' : '') + + '
    ' + + '
    ' + + '
    ' + priceFormatted + '
    ' + + '
    ' + (prop.address || 'Property') + '
    ' + + '
    ' + specs.join(' • ') + '
    ' + + '
    ' + + '
    '; + }, + + }; + + /** + * Mobile Map Manager + * Uses same clustering logic and endpoints as desktop map + */ + var MobileMap = { + map: null, + markerLayer: null, + clusterLayer: null, + densityLayer: null, + currentFilters: {}, + currentMode: null, + debounceTimer: null, + + /** + * Initialize the mobile map + */ + init: function() { + var $container = $('#mobile-property-map'); + if (!$container.length || typeof L === 'undefined') { + return; + } + + // Get initial filters from URL params + this.currentFilters = this.getFiltersFromUrl(); + + // Initialize map + this.map = L.map('mobile-property-map', { + zoomControl: false + }).setView([45.0, -93.5], 7); + + // Add zoom control to top-right + L.control.zoom({ + position: 'topright' + }).addTo(this.map); + + // Add OpenStreetMap tiles + L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { + attribution: '© OSM' + }).addTo(this.map); + + // Create layers for different visualization modes + this.densityLayer = L.layerGroup().addTo(this.map); + this.clusterLayer = L.layerGroup().addTo(this.map); + this.markerLayer = L.layerGroup().addTo(this.map); + + // Bind map events + var self = this; + this.map.on('moveend zoomend', function() { + self.onMapMove(); + }); + + // Initial load - fit to all properties + this.fitToAllProperties(); + }, + + /** + * Get filters from URL params + */ + getFiltersFromUrl: function() { + var params = new URLSearchParams(window.location.search); + return { + property_type: params.get('property_type') || '', + city: params.get('city') || '', + min_beds: params.get('beds') || '', + min_price: params.get('min_price') || '', + max_price: params.get('max_price') || '', + status: 'Active' + }; + }, + + /** + * Handle map move/zoom - debounced + */ + onMapMove: function() { + var self = this; + clearTimeout(this.debounceTimer); + this.debounceTimer = setTimeout(function() { + self.loadClusters(); + }, 150); + }, + + /** + * Fit map to show all properties + */ + fitToAllProperties: function() { + var self = this; + + $.ajax({ + url: homeprozAjax.ajaxUrl, + type: 'GET', + data: { + action: 'homeproz_get_filter_bounds', + property_type: this.currentFilters.property_type || '', + city: this.currentFilters.city || '', + min_price: this.currentFilters.min_price || '', + max_price: this.currentFilters.max_price || '', + min_beds: this.currentFilters.min_beds || '' + }, + success: function(response) { + if (response.success && response.data) { + var bounds = response.data; + var latPadding = (bounds.ne_lat - bounds.sw_lat) * 0.15; + var lngPadding = (bounds.ne_lng - bounds.sw_lng) * 0.15; + + var paddedBounds = L.latLngBounds( + [bounds.sw_lat - latPadding, bounds.sw_lng - lngPadding], + [bounds.ne_lat + latPadding, bounds.ne_lng + lngPadding] + ); + + self.map.fitBounds(paddedBounds); + } else { + self.loadClusters(); + } + }, + error: function() { + self.loadClusters(); + } + }); + }, + + /** + * Update filters and reload + */ + updateFilters: function(filters) { + this.currentFilters = $.extend({}, this.currentFilters, filters); + this.fitToAllProperties(); + }, + + /** + * Load clusters/markers based on current viewport + */ + loadClusters: function() { + if (!this.map) return; + + var self = this; + var bounds = this.map.getBounds(); + var zoom = this.map.getZoom(); + + var boundsArray = [ + bounds.getSouthWest().lat, + bounds.getSouthWest().lng, + bounds.getNorthEast().lat, + bounds.getNorthEast().lng + ]; + + MobileSheet.showLoading(); + + $.ajax({ + url: homeprozAjax.ajaxUrl, + type: 'GET', + data: { + action: 'mls_get_clusters', + zoom: zoom, + bounds: boundsArray, + status: this.currentFilters.status || 'Active', + property_type: this.currentFilters.property_type || '', + city: this.currentFilters.city || '', + min_price: this.currentFilters.min_price || '', + max_price: this.currentFilters.max_price || '', + min_beds: this.currentFilters.min_beds || '' + }, + success: function(response) { + if (response.success && response.data) { + var data = response.data; + self.currentMode = data.type; + + switch (data.type) { + case 'density': + self.renderDensity(data.dots); + MobileSheet.updateCount(data.total || 0); + MobileSheet.renderProperties([], true); // Skip count update + break; + case 'clusters': + self.renderClusters(data.clusters); + MobileSheet.updateCount(data.total || 0); + MobileSheet.renderProperties([], true); // Skip count update + break; + case 'markers': + self.renderMarkers(data.markers); + MobileSheet.renderProperties(data.markers); + break; + } + } + }, + error: function() { + MobileSheet.renderProperties([]); + } + }); + }, + + /** + * Clear all layers + */ + clearAllLayers: function() { + this.densityLayer.clearLayers(); + this.clusterLayer.clearLayers(); + this.markerLayer.clearLayers(); + }, + + /** + * Render density dots (low zoom levels) + */ + renderDensity: function(dots) { + this.clearAllLayers(); + var self = this; + var zoom = this.map.getZoom(); + + dots.forEach(function(dot) { + var color = self.getDensityColor(dot.count, zoom); + var size = self.getDensitySize(dot.count, zoom); + + var icon = L.divIcon({ + html: '
    ', + className: 'density-dot-container', + iconSize: [size, size], + iconAnchor: [size / 2, size / 2] + }); + + var marker = L.marker([dot.lat, dot.lng], { icon: icon }); + + marker.on('click', function() { + self.map.setView([dot.lat, dot.lng], self.map.getZoom() + 2); + }); + + marker.bindTooltip(dot.count + ' properties', { + className: 'density-tooltip' + }); + + self.densityLayer.addLayer(marker); + }); + }, + + /** + * Get density color based on count and zoom + */ + getDensityColor: function(count, zoom) { + var threshold = Math.max(40, Math.round(600 / Math.pow(1.4, zoom - 3))); + var ratio = count / threshold; + + if (ratio >= 1.5) return 'rgba(180, 83, 9, 0.8)'; + if (ratio >= 1.0) return 'rgba(217, 119, 6, 0.8)'; + if (ratio >= 0.6) return 'rgba(245, 158, 11, 0.8)'; + if (ratio >= 0.3) return 'rgba(234, 179, 8, 0.8)'; + if (ratio >= 0.15) return 'rgba(132, 204, 22, 0.8)'; + return 'rgba(34, 197, 94, 0.8)'; + }, + + /** + * Get density size based on count and zoom + */ + getDensitySize: function(count, zoom) { + var threshold = Math.max(40, Math.round(600 / Math.pow(1.4, zoom - 3))); + var ratio = count / threshold; + + if (ratio >= 1.5) return 11; + if (ratio >= 1.0) return 10; + if (ratio >= 0.6) return 8; + if (ratio >= 0.3) return 7; + return 6; + }, + + /** + * Render clusters (medium zoom levels) + */ + renderClusters: function(clusters) { + this.clearAllLayers(); + var self = this; + + clusters.forEach(function(cluster) { + var size = 'small'; + var iconSize = 30; + if (cluster.count > 200) { + size = 'large'; + iconSize = 40; + } else if (cluster.count >= 100) { + size = 'medium'; + iconSize = 35; + } + + var icon = L.divIcon({ + html: '
    ' + cluster.count + '
    ', + className: 'marker-cluster marker-cluster-' + size + ' server-cluster', + iconSize: L.point(iconSize, iconSize) + }); + + var marker = L.marker([cluster.lat, cluster.lng], { icon: icon }); + + marker.on('click', function() { + self.map.setView([cluster.lat, cluster.lng], self.map.getZoom() + 2); + }); + + var priceRange = '$' + self.formatNumber(cluster.min_price); + if (cluster.max_price !== cluster.min_price) { + priceRange += ' - $' + self.formatNumber(cluster.max_price); + } + marker.bindTooltip(cluster.count + ' properties
    ' + priceRange, { + className: 'cluster-tooltip' + }); + + self.clusterLayer.addLayer(marker); + }); + }, + + /** + * Render individual markers (high zoom levels) + */ + renderMarkers: function(properties) { + this.clearAllLayers(); + var self = this; + + properties.forEach(function(prop, index) { + if (!prop.lat || !prop.lng) return; + + // Create price marker + var priceLabel = self.formatPrice(prop.price); + + var icon = L.divIcon({ + className: 'mobile-marker', + html: '
    ' + priceLabel + '
    ', + iconSize: [70, 28], + iconAnchor: [35, 28] + }); + + var marker = L.marker([prop.lat, prop.lng], { + icon: icon, + zIndexOffset: index + }); + + marker.on('click', function() { + // Navigate directly to property page + window.location.href = prop.url; + }); + + self.markerLayer.addLayer(marker); + }); + }, + + /** + * Format price for marker label display + * Accepts either a number or formatted string like "$375,000" + */ + formatPrice: function(price) { + // If price is a string, strip non-numeric characters + if (typeof price === 'string') { + price = parseInt(price.replace(/[^0-9]/g, ''), 10); + } + price = Number(price); + if (isNaN(price)) return '$0'; + if (price >= 1000000) { + return '$' + (price / 1000000).toFixed(1) + 'M'; + } else if (price >= 1000) { + return '$' + Math.round(price / 1000) + 'k'; + } + return '$' + price; + }, + + /** + * Format number with commas + */ + formatNumber: function(num) { + return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ','); + } + }; + + // Initialize on document ready + $(document).ready(function() { + // Only init on mobile + if (window.innerWidth < 1024) { + MobileSheet.init(); + MobileMap.init(); + } + }); + + // Expose for external access + window.MobileSheet = MobileSheet; + window.MobileMap = MobileMap; + +})(jQuery); diff --git a/wp-content/themes/homeproz/template-parts/property/mobile-map.scss b/wp-content/themes/homeproz/template-parts/property/mobile-map.scss new file mode 100644 index 00000000..8f30e610 --- /dev/null +++ b/wp-content/themes/homeproz/template-parts/property/mobile-map.scss @@ -0,0 +1,488 @@ +/** + * Mobile Map View Styles + * + * Bottom sheet interface for mobile property browsing with map + * + * @package HomeProz + */ + +// Only show mobile map view below 1024px +.mobile-map-view { + display: none; + + @media (max-width: 1023px) { + display: block; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 50; + } +} + +// Hide desktop-only elements on mobile +.desktop-only { + @media (max-width: 1023px) { + display: none !important; + } +} + +// Full-screen map container +.mobile-map-container { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: var(--color-bg-dark); + + // Leaflet map fills container + .leaflet-container { + width: 100%; + height: 100%; + } +} + +// Bottom Sheet +.mobile-bottom-sheet { + position: absolute; + left: 0; + right: 0; + bottom: 0; + background-color: var(--color-bg-dark); + border-radius: 1rem 1rem 0 0; + border-top: 3px solid var(--color-accent); + box-shadow: 0 -8px 30px rgba(0, 0, 0, 0.5); + z-index: 1000; // Must be higher than Leaflet controls (800) + display: flex; + flex-direction: column; + transition: height 0.3s ease-out; + will-change: height; + max-height: calc(100vh - 60px); // Leave space for map peek + + // Sheet states (2 states: collapsed and expanded) + &[data-state="collapsed"] { + height: 120px; + } + + &[data-state="expanded"] { + height: calc(100vh - 60px); + } + + // Disable transitions when dragging + &.is-dragging { + transition: none; + } +} + +// Drag Handle +.sheet-drag-handle { + flex-shrink: 0; + display: flex; + justify-content: center; + align-items: center; + padding: 0.75rem; + cursor: grab; + touch-action: none; + + &:active { + cursor: grabbing; + } +} + +.sheet-handle-bar { + width: 36px; + height: 4px; + background-color: var(--color-border); + border-radius: 2px; +} + +// Sheet Header +.sheet-header { + flex-shrink: 0; + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 1rem 0.75rem; + border-bottom: 1px solid var(--color-border); + cursor: pointer; + user-select: none; + -webkit-tap-highlight-color: transparent; +} + +.sheet-property-count { + font-size: 1rem; + font-weight: 600; + color: var(--color-text); + + span { + color: var(--color-accent); + } +} + +.sheet-filter-toggle { + display: inline-flex; + align-items: center; + gap: 0.5rem; + padding: 0.5rem 0.75rem; + font-size: 0.875rem; + font-weight: 500; + color: var(--color-text-muted); + background-color: var(--color-bg-dark); + border: 1px solid var(--color-border); + border-radius: 0.375rem; + cursor: pointer; + + &:hover, + &.is-active { + color: var(--color-text); + border-color: var(--color-accent); + } + + &.is-active { + background-color: rgba(159, 55, 48, 0.1); + } +} + +// Sheet Content (scrollable area) +.sheet-content { + flex: 1; + overflow-y: auto; + overflow-x: hidden; + overscroll-behavior: contain; + -webkit-overflow-scrolling: touch; +} + +// Filters Section +.sheet-filters { + padding: 1rem; + background-color: var(--color-bg-dark); + border-bottom: 1px solid var(--color-border); + display: none; // Hidden by default + + &.is-visible { + display: block; + } +} + +.sheet-filters-grid { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 0.75rem; +} + +.sheet-filter-item { + display: flex; + flex-direction: column; + gap: 0.25rem; + + label { + font-size: 0.75rem; + font-weight: 500; + color: var(--color-text-muted); + text-transform: uppercase; + letter-spacing: 0.05em; + } + + &.sheet-filter-reset { + justify-content: flex-end; + + .btn { + width: 100%; + } + } +} + +.sheet-filter-select { + width: 100%; + padding: 0.625rem 0.75rem; + font-size: 0.875rem; + color: var(--color-text); + background-color: var(--color-bg-card); + border: 1px solid var(--color-border); + border-radius: 0.375rem; + appearance: none; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%239ca3af' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: right 0.75rem center; + padding-right: 2rem; + + &:focus { + outline: none; + border-color: var(--color-accent); + } +} + +// Property List +.sheet-property-list { + padding: 0.75rem; +} + +.sheet-property-loading { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 0.75rem; + padding: 2rem; + color: var(--color-text-muted); + font-size: 0.875rem; +} + +// Mobile property cards (compact horizontal layout) +.sheet-property-card { + display: flex; + gap: 0.75rem; + padding: 0.75rem; + background-color: var(--color-bg-dark); + border: 1px solid var(--color-border); + border-radius: 0.5rem; + margin-bottom: 0.75rem; + text-decoration: none; + color: inherit; + + &:last-child { + margin-bottom: 0; + } + + &:hover, + &.is-highlighted { + border-color: var(--color-accent); + } + + &.is-highlighted { + background-color: rgba(159, 55, 48, 0.1); + } +} + +.sheet-card-image { + flex-shrink: 0; + width: 100px; + height: 80px; + background-color: var(--color-bg-card); + background-size: cover; + background-position: center; + border-radius: 0.375rem; + position: relative; + overflow: hidden; + + &.is-loading { + display: flex; + align-items: center; + justify-content: center; + } +} + +.sheet-card-badge { + position: absolute; + top: 0.25rem; + left: 0.25rem; + padding: 0.125rem 0.375rem; + font-size: 0.625rem; + font-weight: 600; + text-transform: uppercase; + border-radius: 0.25rem; + background-color: var(--color-active); + color: white; + + &.badge-pending { + background-color: var(--color-pending); + } + + &.badge-sold { + background-color: var(--color-sold); + } +} + +.sheet-card-content { + flex: 1; + min-width: 0; + display: flex; + flex-direction: column; + justify-content: center; +} + +.sheet-card-price { + font-size: 1rem; + font-weight: 700; + color: var(--color-text); + margin-bottom: 0.125rem; +} + +.sheet-card-address { + font-size: 0.8125rem; + color: var(--color-text-muted); + margin-bottom: 0.25rem; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.sheet-card-specs { + display: flex; + gap: 0.75rem; + font-size: 0.75rem; + color: var(--color-text-muted); + + span { + display: flex; + align-items: center; + gap: 0.25rem; + } +} + +// Empty state +.sheet-no-properties { + text-align: center; + padding: 2rem 1rem; + color: var(--color-text-muted); + + svg { + width: 48px; + height: 48px; + margin-bottom: 1rem; + opacity: 0.5; + } + + p { + margin: 0; + font-size: 0.9375rem; + } +} + +// Map marker popup (simplified for mobile) +.mobile-map-popup { + .leaflet-popup-content-wrapper { + background-color: var(--color-bg-card); + border-radius: 0.5rem; + padding: 0; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.3); + } + + .leaflet-popup-content { + margin: 0; + min-width: 200px; + } + + .leaflet-popup-tip { + background-color: var(--color-bg-card); + } +} + +.mobile-popup-card { + padding: 0.75rem; +} + +.mobile-popup-price { + font-size: 1rem; + font-weight: 700; + color: var(--color-text); + margin-bottom: 0.25rem; +} + +.mobile-popup-address { + font-size: 0.8125rem; + color: var(--color-text-muted); + margin-bottom: 0.5rem; +} + +.mobile-popup-link { + display: inline-flex; + align-items: center; + gap: 0.25rem; + font-size: 0.8125rem; + font-weight: 600; + color: var(--color-accent); + text-decoration: none; + + &:hover { + color: var(--color-accent-light); + } +} + +// Spinner (reuse existing) +.spinner { + width: 24px; + height: 24px; + border: 2px solid var(--color-border); + border-top-color: var(--color-accent); + border-radius: 50%; + animation: spin 0.8s linear infinite; +} + +@keyframes spin { + to { + transform: rotate(360deg); + } +} + +// Custom map markers +.mobile-marker { + background: none; + border: none; +} + +.mobile-marker-inner { + display: flex; + align-items: center; + justify-content: center; + padding: 0.25rem 0.5rem; + background-color: var(--color-bg-card); + border: 2px solid var(--color-accent); + border-radius: 0.25rem; + color: var(--color-text); + font-size: 0.75rem; + font-weight: 700; + white-space: nowrap; + box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3); + + &::after { + content: ''; + position: absolute; + bottom: -6px; + left: 50%; + transform: translateX(-50%); + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-top: 6px solid var(--color-accent); + } +} + +.mobile-cluster-marker { + background: none; + border: none; +} + +.mobile-cluster-inner { + display: flex; + align-items: center; + justify-content: center; + width: 40px; + height: 40px; + background-color: var(--color-accent); + border: 3px solid rgba(255, 255, 255, 0.8); + border-radius: 50%; + color: white; + font-size: 0.875rem; + font-weight: 700; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3); +} + +// Adjust layout when mobile map is active +@media (max-width: 1023px) { + // When mobile map view exists, hide header/footer for full-screen map + body:has(.mobile-map-view) { + .site-header { + display: none; + } + + .site-footer { + display: none; + } + + .site-main { + padding: 0; + } + } +} diff --git a/wp-content/themes/homeproz/template-parts/property/single-property-mls.php b/wp-content/themes/homeproz/template-parts/property/single-property-mls.php index 404eb586..773c2f11 100755 --- a/wp-content/themes/homeproz/template-parts/property/single-property-mls.php +++ b/wp-content/themes/homeproz/template-parts/property/single-property-mls.php @@ -105,6 +105,12 @@ if ($lot_size) { $agent_name = $property->list_agent_name; $office_name = $property->list_office_name; +// Check if this is a HomeProz listing +$is_homeproz_listing = false; +if ($office_name) { + $is_homeproz_listing = (stripos($office_name, 'HomeProz') !== false || stripos($office_name, 'Home Proz') !== false); +} + // Set page title to property address $mls_page_title = $full_address; if ($price) { @@ -407,19 +413,22 @@ get_header(); diff --git a/wp-content/themes/homeproz/template-parts/property/single-property.scss b/wp-content/themes/homeproz/template-parts/property/single-property.scss index 3f0be6b5..4940804e 100755 --- a/wp-content/themes/homeproz/template-parts/property/single-property.scss +++ b/wp-content/themes/homeproz/template-parts/property/single-property.scss @@ -660,6 +660,13 @@ body.lightbox-open { color: var(--color-text-muted); margin-bottom: 1rem; } + + .agent-intro { + font-size: 0.875rem; + color: var(--color-text-muted); + margin-bottom: 1rem; + line-height: 1.5; + } } // Share Widget