100 Commits
Author SHA1 Message Date
Hanson.xyz DevandClaude Opus 4.5 c2d5b2248d Add WebP conversion and garbage collection to MLS plugin
Image handling improvements:
- Convert PNG and images >500KB to WebP format
- Resize images wider than 1600px maintaining aspect ratio
- Check for .webp version before falling back to original
- WebP quality set to 80 (equivalent to JPEG 90%)

Garbage collection for disk space management:
- New MLS_Garbage_Collector class runs after each sync
- Only active when MLS_GC_DISK_THRESHOLD defined in wp-config
- Deletes image directories older than 24 hours, oldest first
- Stops when free space reaches 5GB or 2GB deleted per run
- Protects recently accessed images from deletion

Documentation:
- Added Garbage Collection section to README
- Updated Features list and File Structure

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-04 20:48:57 -06:00
Hanson.xyz DevandClaude Opus 4.5 25608a5327 Add db_content_updates directory for production sync
- Create db_content_updates/ for documenting database changes
- Add README with required document format and template
- Update CLAUDE.md with mandatory documentation requirement
- All content changes must be documented for production team

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-04 20:12:05 -06:00
Hanson.xyz DevandClaude Opus 4.5 f0ca867605 Add wp-config.php to gitignore, create dist template
- Remove wp-config.php from tracking (contains secrets)
- Add wp-config.php.dist as template for new installs

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-04 19:23:20 -06:00
Hanson.xyz Dev 91a90ea622 db 2026-01-04 17:51:00 -06:00
Hanson.xyz Dev acc8ac87a0 wip 2026-01-04 17:50:08 -06:00
Hanson.xyz DevandClaude Opus 4.5 7e45ce0756 Fix homeprozAjax not defined on properties page
Update localization condition to check for properties page template
instead of the removed property post type archive.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 13:14:21 -06:00
Hanson.xyz DevandClaude Opus 4.5 9bf45416d5 Add properties page template to replace CPT archive
Creates page-properties.php template and Properties page to handle
/properties/ URL after removing the property post type.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 13:13:01 -06:00
Hanson.xyz DevandClaude Opus 4.5 361007d36b Add homepage section ordering and switch to MLS-only data source
Homepage Improvements:
- Add Section Order tab with enable/disable toggles and order numbers
- Support up to 2 custom WYSIWYG content areas with titles
- All 4 sections (Service Cards, Property Types, Custom 1, Custom 2)
  can be reordered and toggled independently

Property Type Boxes:
- Convert to ACF repeater (remove MLS count queries)
- Add red accent color to icons
- Center-align icons, increase title size, add spacing

MLS Data Source:
- Remove property CPT and taxonomies (MLS Editor is now source of truth)
- Commercial section now pulls from MLS with priority:
  1. Featured (favorited) commercial properties
  2. HomeProz-listed commercial properties
  3. Random commercial/land/farm properties
- Featured Homes section updated to same priority order

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 13:00:33 -06:00
Hanson.xyz DevandClaude Opus 4.5 cf56d57225 Enable drag-drop sorting for Agents post type
- Add page-attributes support and make agent CPT hierarchical
- Add Simple Page Ordering plugin filter for agent sorting
- Update agent queries in archive-agent, page-about, and page-join
  to use menu_order instead of ACF agent_order field

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-30 11:51:58 -06:00
Hanson.xyz DevandClaude Opus 4.5 ce02635b57 Skip initial property list render when map will reposition
On fresh page load without URL state or filters, the map repositions
to fit all properties. Previously, the server-rendered property list
would briefly show before being replaced by viewport-filtered results.

Now we immediately show a spinner when we know the map will reposition,
preventing the flash of unfiltered content and unnecessary rendering.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-29 21:22:20 -06:00
Hanson.xyz DevandClaude Opus 4.5 eed01f2e04 Switch to 100% server-side map clustering
Removes client-side Leaflet MarkerCluster library in favor of
server-side clustering at all zoom levels:
- Zoom 1-8: Density dots
- Zoom 9-15: Server-generated numbered clusters
- Zoom 16+: Individual property markers

This prevents the visual issue where server-returned clusters were
being re-clustered by the client into a single merged marker.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-29 03:16:16 -06:00
Hanson.xyz DevandClaude Opus 4.5 f2a9b28ac2 Fix city/zip filtering and improve map hover behavior
MLS Query Changes:
- Use exact city/postal_code matching instead of radius search
- Fixes city filter returning 1700+ results instead of 97 for Ramsey

Cluster Endpoint:
- Parse "City, SS" format to extract city name before querying
- Fixes pins not showing when city filter applied

Property Filters JS:
- Always fit map bounds when filter changes (not just on no intersection)
- Fit bounds on initial page load when URL has filters
- Show temporary hover pin when marker is clustered or outside viewport
- Uses markerCluster.getVisibleParent() to detect clustered markers

Property Results:
- Add zip code parameter handling for URL filters

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-29 02:27:54 -06:00
Hanson.xyz DevandClaude Opus 4.5 5ca2e29c72 Add ghost text autocomplete location search to homepage hero
Replaces community dropdown with text input supporting city/ZIP search:
- Ghost text autocomplete shows inline suggestion as user types
- Tab to accept, auto-fill on blur, Enter uses partial match
- Geolocation button for "Use My Location" searches
- AJAX endpoint returns MN/IA cities and zipcodes with 1-hour cache
- MLS query now supports lat/lng/radius for distance-based filtering
- Updated Census Bureau 2023 Gazetteer data (32,329 US cities)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-29 00:50:45 -06:00
Hanson.xyz DevandClaude Opus 4.5 183e1b92c9 Add 6 reusable page templates with ACF integration
Introduces layout-focused templates for marketing pages:
- Content with Sidebar: 70/30 grid with callout boxes
- Alternating Blocks: Zigzag image/text sections
- Service Detail: Hero + features grid + FAQ accordion
- Card Grid: Configurable 2/3/4 column card layouts
- Long-Form Article: Clean reading layout with related links
- Landing Page: Conversion-focused with benefits and testimonial

Each template has corresponding ACF field groups for content
management. Sample pages created under /page-template-examples/.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-18 00:50:33 -06:00
Hanson.xyz Dev d11e8bfd4c Update bd JSONL 2025-12-17 18:00:58 -06:00
Hanson.xyz Dev b8d9c8aee7 Add sticky filter improvements and unified filter input styling
- Change sticky filter visibility check to use reset button position
- Add reset button to sticky filter (centered, below filter grid)
- Reset filters now resets map to initial position if no results
- Unify select/input styling: same height, black background, consistent borders
2025-12-17 17:36:38 -06:00
Hanson.xyz DevandClaude 564d556a8c Add US geo data tables, filter bounds API, and URL hash state management
- Add mls_geo_cities and mls_geo_zipcodes tables with 29,880 cities and 33,144 zip codes
- Add get_filter_bounds() method to reposition map when filters don't intersect current view
- Move all URL state (filters, page, scroll, map position) to hash to avoid WordPress 404s
- Add filter bounds AJAX endpoint for map repositioning on filter change

Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-17 15:07:33 -06:00
Hanson.xyz Dev 5522d18ada Improve pin click behavior: scroll to card if exists, pan map if not
- When clicking a pin, check if property card exists in loaded results
- If card exists: scroll to it smoothly and highlight (no map pan)
- If card doesn't exist: pan map to center on pin, reload results
- Add isCardScroll flag to ignore stray map events during card scroll
- Skip scroll reset in InfiniteScroll when pin-triggered pan
2025-12-17 03:53:52 -06:00
Hanson.xyz Dev 63b8fec917 Add sessionStorage caching for AJAX requests and URL state restoration
- Add unified AjaxCache for all AJAX responses (5 min expiry)
- Cache key based on request params (minus nonce), coordinates rounded to 4 decimals
- Clean expired cache entries on page load
- URL hash stores page, scroll, lat/lng/zoom for state restoration
- Bulk load pages in parallel on restore, use cache when available
- Add min-height 100vh to property results in map view
- Change all scroll animations to instant
2025-12-17 03:42:49 -06:00
Hanson.xyz DevandClaude 1c81fd6766 Add scroll-triggered image loading with 1000px distance limit
- Trigger image loader on scroll events (debounced 50ms)
- Only load images within 1000px of viewport edges
- Images further away wait until user scrolls closer

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-17 02:47:47 -06:00
Hanson.xyz DevandClaude 51a5c3e166 Add sequential image loader with viewport prioritization
- Load property card images 2 at a time instead of all at once
- Prioritize images in viewport, then by distance from viewport
- Single execution guard prevents concurrent loading runs
- Gracefully handles DOM removal (cleared grid aborts pending loads)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-17 02:45:10 -06:00
Hanson.xyz DevandClaude dfad0f57e6 Add hover pins for clustered properties, disable grouping under 30 markers
- Add data-lat/data-lng attributes to MLS property cards
- Create temporary highlighted pin on card hover when marker is clustered
- Show individual pins (no grouping) when <= 30 properties in viewport
- Add markerLayer for unclustered markers to bypass client-side clustering
- Show loading spinner immediately on map move to abort image loads

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-17 02:31:23 -06:00
Hanson.xyz DevandClaude 8cd630593d Fix scroll position on map viewport change
Scroll to bottom of .property-filters minus masthead height when
map viewport changes and results refresh. Only scrolls upward,
never down. Uses instant scroll behavior.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-17 02:13:25 -06:00
Hanson.xyz DevandClaude ecc182ebf9 Rewrite infinite scroll to use card-based virtual scrolling
- Measure page positions via first card's getBoundingClientRect
  (page wrappers use display:contents so have no box)
- Convert individual cards to placeholders when scrolling away
  (store HTML in jQuery data, set fixed dimensions, empty content)
- Restore cards from placeholders when scrolling back
- Calculate current page based on which page's top is closest
  to viewport bottom without being below it
- DLP (Desired Loaded Pages) = [CP-2, CP-1, CP, CP+1, CP+2]
- Load one page at a time via AJAX

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-17 02:02:35 -06:00
Hanson.xyz Dev 02cc7f2dfb Remove Search button from filter bar, keep only Reset 2025-12-16 15:20:40 -06:00
Hanson.xyz Dev 8aeb33ed2c Add sticky filter form below map on desktop
- Create property-filters-sticky.php with compact filter layout
- Add StickyFilters JS module with IntersectionObserver
- Show sticky filter with 200ms fade when main filter scrolls out of view
- Hide sticky filter instantly when main filter scrolls back into view
- Bidirectional sync between main and sticky filter forms
- Changes in either form trigger the same filterProperties() call
- Desktop map view only (>= 1024px)
2025-12-16 14:55:43 -06:00
Hanson.xyz Dev 9228a1f1ea Enable infinite scroll on mobile view
- Remove desktop-only restriction from InfiniteScroll.init()
- Auto-detect container: .property-list-container (desktop map) or #property-results (mobile/grid)
- Hide pagination on all screen sizes when infinite scroll is enabled
- Reinitialize infinite scroll after all AJAX filter loads (not just desktop)
2025-12-16 14:38:21 -06:00
Hanson.xyz Dev bc39aa19dc Add 500px prefetch zone for earlier infinite scroll loading
- Add 500px bottom padding when more pages exist (hidden on last page)
- Trigger next page load when viewport enters last 500px of content or padding
- Add checkImmediateLoad() to chain page loads if viewport still in zone
- Runs immediately after page 1 and after each subsequent page loads
- Enables rapid sequential loading when user scrolls far or has tall viewport
2025-12-16 14:27:17 -06:00
Hanson.xyz Dev 53d3c41917 Change infinite scroll to use window scroll instead of container
- Remove overflow-y:auto and max-height constraints from property list
- Use viewport-based IntersectionObserver (root: null) instead of container
- Track and maintain max grid height to prevent layout shift on scroll up
- Clear max height only on filter/map change (not on normal scroll)
- Update scroll anchor methods to use window.scrollY/scrollBy
- Mobile continues to use pagination (desktop only infinite scroll)
2025-12-16 14:21:29 -06:00
Hanson.xyz DevandClaude 761384ee1b Add request queue to prevent map/filter race conditions
- Add RequestQueue module with 200ms debounce and request cancellation
- Queue cluster requests to abort pending when new viewport/filter changes
- Queue property list requests to prevent stale data rendering
- Track request IDs to discard responses from cancelled requests
- Error handler ignores aborted requests (intentional cancellation)

Fixes issue where changing filters then zooming map before load complete
would render pins from previous filter state.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-16 14:02:53 -06:00
Hanson.xyz DevandClaude cf181d01b3 Implement lower-priority UX enhancements
- Add subtle noise texture overlay for luxury feel (body::before)
- Optimize mobile homepage: service cards 2-up layout, reduced padding/sizes
- Add agent contact details section above gallery/listings on profile pages
- Create Join Our Team recruitment page with benefits grid and team preview
- Enhance Buyers/Sellers guide cards with visual section, gradient backgrounds

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-16 13:45:46 -06:00
Hanson.xyz DevandClaude 0487bd1dcf Implement high priority features: filters, property type boxes, email routing
- Expanded search filters: MLS property types dropdown, MLS cities (50+ listings), zip code text input
- Property type showcase boxes: 5-category grid on homepage with icons, descriptions, counts
- Multi-recipient email: Primary to office@, CC to info@, sender confirmation receipt enabled
- Added helper functions: homeproz_get_mls_property_types(), homeproz_get_mls_cities()
- Updated FEATURES_PENDING with completion status

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-16 13:21:23 -06:00
Hanson.xyz DevandClaude ecdd75c307 Add client action items tracking section for final delivery
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-16 13:08:59 -06:00
Hanson.xyz DevandClaude 07a8d1756e Implement launch blockers and MLS state filter
- Add MLS state filter for MN/IA only queries
- Add property inquiry form auto-population with read-only display
- Update broker info and office hours in footer
- Remove Bridge Realty text from about page
- Update service area to Minnesota and Iowa
- Add HomeProz listing identification (is_homeproz column)
- Add dynamic featured listings on front page
- Add gallery thumbnail preloading and loading spinners
- Update FEATURES_PENDING with completion status

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-16 13:07:12 -06:00
Hanson.xyz DevandClaude 15449b9131 Add single MLS property view and image security improvements
- Add single-property-mls.php template with full gallery support
- Route /properties/?listing=XXX to single property view
- Add HMAC-signed URLs for image endpoint (bot protection)
- Add MySQL advisory lock for image downloads (prevent stampede)
- Add infinite scroll module for property list (desktop map view)
- Load card images immediately on DOM ready (no scroll detection)
- Add cards_only AJAX parameter for infinite scroll

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-16 10:43:04 -06:00
Hanson.xyz DevandClaude acd606bb03 Sync property list with map viewport
Major changes:
- Property list now updates when map pans/zooms
- Properties sorted by distance from map center (closest first)
- Shows "X properties in view" when viewport filtering active
- Min 30 properties required before grouping kicks in
- Added rule to CLAUDE.md: no commits unless asked

Backend:
- MLS_Query: Added bounds filtering and distance-based sorting
- AJAX handler: Accepts bounds/center, sorts by distance when provided

Frontend:
- Map move triggers property list refresh with same viewport
- Loop prevention flag to avoid map->filter->map recursion
- Resets to page 1 when viewport changes

Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-16 01:27:44 -06:00
Hanson.xyz DevandClaude 9337a3cbc7 Start numbered clusters at zoom 9 instead of 12
- Zoom 1-5: Dense density dots
- Zoom 6-8: Normal density dots
- Zoom 9-15: Numbered clusters
- Zoom 16+: Individual markers

Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-16 01:07:26 -06:00
Hanson.xyz DevandClaude 8c44e07bc4 Use zoom-relative density coloring with warm palette
- Density thresholds now scale with zoom level:
  zoom 3: ~600 = high, zoom 7: ~150 = high, zoom 11: ~40 = high
- Warm color palette: green -> lime -> gold -> amber -> burnt orange
- 20% transparency on all dots for softer appearance
- Softer borders and shadows on dots

This makes the same property count appear as "low density" when
zoomed out (seeing 25k properties) but "high density" when zoomed
in (seeing only nearby properties).

Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-16 01:04:16 -06:00
Hanson.xyz DevandClaude 7c3c322449 Replace heatmap with density dots for all zoom levels
Remove Leaflet.heat in favor of consistent density dot visualization:
- Zoom 1-5: Density dots with 40% more density (24px spacing)
- Zoom 6-11: Density dots with normal spacing (40px)
- Zoom 12-15: Numbered cluster circles
- Zoom 16+: Individual property markers

Density dots provide clearer visualization than heatmap blobs for
high-density property data.

Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-16 00:58:59 -06:00
Hanson.xyz DevandClaude 93d5b01111 Add tiered map visualization based on zoom level
- Zoom 3-7: Heatmap overlay showing property density
- Zoom 8-11: Density dots (small colored circles without numbers)
- Zoom 12-15: Numbered cluster circles
- Zoom 16+: Individual property markers

Backend returns different data types (heatmap/density/clusters/markers)
based on zoom level. Frontend uses Leaflet.heat for heatmap and custom
divIcons for density dots with color gradient based on count.

Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-16 00:53:21 -06:00
Hanson.xyz DevandClaude 1c728ec60e Fix clustering density with pixel-based grid calculation
Replace geohash precision mapping with dynamic grid sizing based on
target pixel spacing (60px between cluster centers). Uses Leaflet/OSM
tile math to calculate degrees-per-pixel at each zoom level, adjusted
for Mercator projection at the viewport's center latitude.

At zoom 7, this gives ~52km cells and ~150 clusters statewide,
properly separating Minneapolis from St. Cloud.

Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-16 00:31:11 -06:00
Hanson.xyz DevandClaude ae0fc65e4e Fix: Remove paged from formData to prevent ?paged= in URL
The formData object was getting paged added, which then got included
in the URL query params by updateUrl(). Now paged is only sent in
the AJAX POST data, not added to formData.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-16 00:19:39 -06:00
Hanson.xyz DevandClaude fe29eb74c4 Fix server-rendered pagination links to use hash format
Update paginate_links() in both property-results.php and ajax-handlers.php
to generate #page=N links instead of ?paged=N query parameters.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-16 00:10:29 -06:00
Hanson.xyz DevandClaude b7eb0de882 Use hash values for AJAX pagination instead of query params
Prevents conflicts with WordPress server-side pagination handling.
URLs now use #page=2 format instead of ?paged=2.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-16 00:07:20 -06:00
Hanson.xyz DevandClaude 1862cef42a Add server-side clustering for map with 30k+ properties
- Remove 1000 property limit from count display
- Add MLS_Cluster class for geohash-based server-side clustering
- Add AJAX endpoint for dynamic cluster loading based on viewport/zoom
- Update property-results.php and ajax-handlers.php to use efficient counting
- Update map JavaScript to fetch clusters dynamically as user pans/zooms
- Server returns clusters at low zoom, individual markers at high zoom
- Fixes property count showing 1000 instead of actual ~30k properties

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-16 00:04:22 -06:00
Hanson.xyz DevandClaude 30eb593020 Add loading spinner for property card images
- Show spinning loader while images load
- Lazy load images as cards enter viewport (with 200px buffer)
- Use data-bg attribute to defer background-image loading
- MutationObserver detects AJAX-loaded content
- Spinner hides when image loads or on error
- Fallback to placeholder on load error

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-15 23:48:59 -06:00
Hanson.xyz DevandClaude 72b932b25e Add on-demand media URL refresh for expired MLS Grid tokens
MLS Grid media URLs expire after ~24 hours. Instead of running
scheduled syncs, this adds on-demand refresh when images are requested:

- Add is_url_expired() to parse expires timestamp from media URLs
- Add refresh_media_urls() to fetch fresh URLs from API for one listing
- Add get_property_media() API method using ListingId filter
- Image endpoint checks URL expiration before fetching
- If expired, refreshes URLs from API then proceeds with fetch

This is more efficient than scheduled full syncs because:
- Only refreshes URLs for listings actually being viewed
- Zero overhead for unviewed listings
- Scales naturally with traffic

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-15 23:45:44 -06:00
Hanson.xyz DevandClaude 4db53b607c Add WebP thumbnail endpoint for MLS property images
- Create MLS_Image_Endpoint class with on-demand thumbnail generation
- Use ImageMagick to convert images to WebP format
- Thumbnail sizes: 800px (thumb) and 1800px (full), maintain aspect ratio
- Only downsize images, never upsize
- Cache thumbnails in wp-content/uploads/mls-thumbnails/
- Add mls_get_image_url() helper function (1-based index)
- Update property cards to display thumbnail as background-cover image
- Long cache headers (1 year) with ETag support

URL format: /mls-image/{listing_key}/{index}/{size}/

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-15 23:28:59 -06:00
Hanson.xyz DevandClaude 198c9b9091 Add marker clustering and responsive full-width layout
- Integrate Leaflet.markercluster for map performance with large datasets
- Add brand-colored cluster markers (small/medium/large sizes)
- Reduce individual pin size to 17x22px
- Implement LayoutCalculator for dynamic content centering
- Full-width property archive with constrained filters/hero
- Map max 33% width, cards exactly 400px each
- JS calculates optimal column count and sets CSS custom properties

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-15 22:59:57 -06:00
Hanson.xyz DevandClaude fc018ca604 Integrate MLS listings with property map and add smart sync
Property Map:
- Replace ACF-based property display with MLS database queries
- Use real lat/lng coordinates from MLS (100% coverage)
- Create property-card-mls.php template for MLS property cards
- Update AJAX handler to filter MLS properties

MLS Plugin Enhancements:
- Add 'wp mls run' smart sync command (auto-detects full/incremental/resume)
- Add database index migrations for lat/lng and composite search indexes
- Add comprehensive README.md documentation

Documentation:
- Update site README.md with sysadmin quick reference
- Add FEATURES_PENDING_12_15.md tracking client feature requests

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-15 22:32:41 -06:00
Hanson.xyz DevandClaude b9cddd2f64 Refactor MLS sync to Active/Pending only with on-demand media
Major changes to sync strategy following MLS Grid best practices:

- Initial sync now fetches only Active/Pending properties (~30K vs 1.3M)
- Replication (incremental) fetches all changes, deletes non-Active/Pending
- On-demand media fetching replaces background queue (avoids rate limits)
- Media downloaded and cached when first viewed, not during sync
- Updated CLI commands: wp mls media status/fetch/clear
- Comprehensive documentation with troubleshooting guide

This fixes the "Value out of range" API error caused by high $skip values.

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-15 08:25:37 -06:00
Hanson.xyz DevandClaude Opus 4.5 6eadf3d266 Add queue-based media download system with rate limiting
- Add download_status, retry_after, queued_at columns to mls_media table
- Add mls_media_log table for download attempt tracking
- Rewrite media handler to queue downloads instead of immediate download
- Add 700ms delay between downloads (25% buffer over 2/sec limit)
- Add 3-hour backoff for rate-limited (429) responses
- Add max 5 attempts before marking as permanently failed
- Add wp mls media command: status, process, reset, logs
- Deprecate wp mls sync media in favor of wp mls media process
- Update documentation with queue system details and cron examples

Media downloads are now separate from property sync:
1. wp mls sync full/incremental - syncs properties, queues media
2. wp mls media process - downloads queued media with rate limiting

Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-14 22:52:58 -06:00
Hanson.xyz DevandClaude Opus 4.5 b62867d834 Add sync recovery commands for interrupted syncs
- Add wp mls recovery list to show resumable syncs
- Add wp mls recovery auto to auto-resume most recent failed sync
- Add wp mls recovery cleanup to mark stale syncs (>1hr) as failed
- Track last_next_link during incremental sync pagination
- Add get_resumable_syncs(), cleanup_stale_syncs(), auto_resume() methods

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-14 22:33:27 -06:00
Hanson.xyz DevandClaude Opus 4.5 5e4ebfb99e Add verbose mode, progress indicators, and missing media log
- Add --verbose flag to sync commands for detailed API request/response output
- Add progress indicators (.=#xPpE|) for compact sync output
- Implement exponential backoff (1s, 2s, 4s, 8s, 16s) for media downloads
- Log failed media downloads to wp-content/uploads/mls-missing-media.log
- Add 'wp mls cache missing' command to view/clear the log
- Retry on rate limit (429) and server errors (5xx)
- Update documentation with new features

Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-14 22:20:41 -06:00
Hanson.xyz DevandClaude Opus 4.5 6556479417 Add MLS by HansonXyz plugin for MLS Grid API integration
Features:
- Full sync of NorthStar MLS properties via MLS Grid API v2
- Incremental sync using ModificationTimestamp
- Local media download and storage
- Rate limit compliance (2 req/sec, 7200/hr, 40000/day)
- Sync state tracking with resume capability
- WP-CLI commands: test, sync, status, stats, cache
- Admin settings page with manual sync triggers
- Public API functions: mls_get_properties, mls_get_property, etc.

Database tables:
- mls_properties: Listing data with full field mapping
- mls_media: Downloaded images
- mls_sync_state: Sync progress tracking
- mls_rate_limits: API usage tracking
- mls_sync_log: Debug logging

Documentation:
- docs/CLAUDE.md: AI development guide
- docs/API.md: MLS Grid API reference
- docs/USAGE.md: User documentation

Tested: Connection, auth, sync 10 records, media download verified

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-14 21:24:38 -06:00
Hanson.xyz DevandClaude ec5a309555 Streamline CLAUDE.md
Remove completed decisions, outdated planning details, and verbose
documentation. Keep only essential rules and reference info.

Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-01 01:29:44 -06:00
Hanson.xyz DevandClaude d1185184bf Fix mobile layout for property detail pages
- Gallery thumbnails: constrain container to 88vw on mobile to prevent overflow
- Property specs: show as compact two-column list in single card on mobile,
  keep boxed grid layout on desktop

Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-01 01:27:00 -06:00
Hanson.xyz DevandClaude f6c750170b Make contact page icons clickable links
- Map icon links to Google Maps
- Phone icon links to tel: URL
- Email icon links to mailto: URL
- Added hover effect on icon buttons
- Also fixed CF7 br tags display issue

Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-01 01:11:27 -06:00
Hanson.xyz DevandClaude e68426bb3d Fix CF7 form label layout on contact page
Changed label to flex column layout and hide br tags that CF7
inserts between label text and input fields.

Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-01 01:09:43 -06:00
Hanson.xyz DevandClaude d676cad93f Fix agent-info-link not covering bottom margin
Adjusted negative margins so the clickable link area stays within
proper bounds and doesn't overlap the spacing below agent-info.

Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-01 01:07:40 -06:00
Hanson.xyz DevandClaude 217c6ce8d6 Add Facebook and TikTok social links to header
- Added social icon links before phone button in header CTA area
- Icons styled with border, hover effects matching site aesthetic
- Only visible on desktop (>= 1024px) alongside phone button
- Uses theme options for URLs (same as footer)

Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-01 01:06:29 -06:00
Hanson.xyz DevandClaude f438d4fff7 Fix homepage location search to use property_location param
Changed select name from 'location' to 'property_location' to match
the property archive filter parameter.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-01 01:03:00 -06:00
Hanson.xyz DevandClaude 32dd7eff9a Filter location dropdowns to only show active/pending property locations
- Add homeproz_get_active_locations() helper function
- Only shows locations that have properties with Active or Pending status
- Applied to homepage community dropdown and properties page location filter
- Sold properties no longer count toward location visibility

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-01 00:59:48 -06:00
Hanson.xyz DevandClaude 761a08ee86 Unify hero styling across pages, update service cards
Hero changes:
- Remove top padding from .site-main (was causing inconsistent gaps)
- Remove margin-bottom and border from archive-hero
- Add padding-top to property archive container
- Change resources section background to --color-bg-dark

Service cards:
- Replace "Find a Rental" with "Resources & Guides"
- Reorder: Find a Home, Sell Your Home, Resources & Guides
- Update subtitle to remove rental reference
- Add book icon for resources card

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-01 00:56:58 -06:00
Hanson.xyz DevandClaude ea2be47f99 Make archive hero margin responsive
- No margin below hero on mobile/tablet (< 1200px)
- 2rem margin below hero on desktop (>= 1200px)
- Consistent hero styling across all interior pages

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-01 00:41:30 -06:00
Hanson.xyz DevandClaude cf0debb970 Add currency and percentage input plugins to mortgage calculator
- Currency inputs auto-format with thousand separators on input
- Only allows numeric characters (strips letters, symbols, etc.)
- .val() returns raw integer for calculations
- Percentage inputs allow only numbers and one decimal point
- Select all on focus for easy replacement
- Maintains cursor position while typing
- Real-time sync between down payment dollar and percent fields

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-01 00:37:22 -06:00
Hanson.xyz DevandClaude ebbc9ec03b Change form input backgrounds to solid black sitewide
Updated global form styles in main.scss and mortgage calculator inputs
to use #000 background instead of color variables.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-01 00:30:58 -06:00
Hanson.xyz DevandClaude 9963446486 Add mortgage calculator page with interactive widget
- Two-column layout matching property details page pattern
- Real-time mortgage calculation with principal, interest, loan amount, and total interest
- Input formatting with currency/percentage display
- Down payment syncs between dollar amount and percentage
- Sidebar with quick tips, help contact widget, and related resources
- "How to Use" and "Keep in Mind" sections with practical guidance
- Widget titles use Times New Roman 18px bold to match existing styles

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-01 00:29:57 -06:00
Hanson.xyz DevandClaude cbeca7c6d8 UI/UX improvements: gallery autoplay, clickable cards, footer legal section
Property details page:
- Move address to header above gallery
- Add property type badges (blue residential, red commercial)
- Gallery autoplay with play/pause button, 5-second interval
- Fade transitions for autoplay, slide transitions for swipe
- Thumbnail navigation with sync
- Swipe support in gallery and lightbox
- Widget titles: 18px Times New Roman bold
- Remove breadcrumbs

Layout and styling:
- Container width: 1400px
- Contact page map 50% taller (375px)
- Contact info labels: Times New Roman 16px
- Agent photo backgrounds solid black
- CTA accent button hover: black text

Clickable components:
- Service cards fully clickable with stretched links
- Resource cards fully clickable with stretched links
- Addresses link to Google Maps (contact page, footer)

Footer updates:
- Add Send Us a Message link with paper airplane icon
- Replace credentials with legal section
- Privacy Policy, Fair Housing, MLS Disclaimer, Brokerage Disclosure links
- Credits: Web Design by HansonXyz

Other:
- Install Classic Editor plugin

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-01 00:24:34 -06:00
Hanson.xyz DevandClaude 837b3219fb Standardize interior page heroes with ACF customization
- Enhance archive-hero to support optional background images
- Add Page Hero ACF fields (title, subtitle, background) for all pages
- Add Properties Page hero settings in Theme Options
- Update all page templates to use consistent archive-hero style
- Resource pages now use archive-hero with featured image fallback

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 22:51:04 -06:00
Hanson.xyz DevandClaude 4be4edb4ad Add rotating hero image gallery for desktop breakpoint
- Add 5 new hero images to assets/images/hero-gallery/
- Create hero-section.js with image rotation (6s interval)
- Only preload/animate at >= 1450px to save mobile bandwidth
- Fade transition with slight grow effect
- Add overflow:hidden to prevent scrollbar during transition
- Images use 30% right crop via transform system

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 22:38:34 -06:00
Hanson.xyz DevandClaude 1a4d41def6 Implement dual hero designs with responsive switching
Hero System:
- Design 1 (Card Overlay): Semi-transparent card over full image
- Design 2 (Two-Column Split): Text left, image right
- Homepage switches: Card < 1450px, Split >= 1450px
- Alt page (/home-page-alt/) uses Card design only

Image Transform System:
- New PHP helper for on-demand image cropping via ImageMagick
- Caches transformed images with mtime-based invalidation
- Supports crop percentage (positive=right, negative=left)

Hero Improvements:
- Full-width split layout with image hugging right edge
- Card design: responsive positioning with breakpoints at 1400/1650/1800px
- Cropped logo variant (bottom 35px removed for cleaner look)
- Golden hour hero image with 30-35% right crop

Footer:
- Added temporary "HOME PAGE ALT" link for client comparison

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 21:55:29 -06:00
Hanson.xyz DevandClaude 8da4b16633 Style property cards with red border and dark background
Matches service cards styling:
- Dark background (--color-bg-dark)
- Red accent border (--color-accent)
- Rounded corners with overflow hidden

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 20:09:29 -06:00
Hanson.xyz DevandClaude f696f125a6 Brighten hero subtitle text
Changed from muted (#B0B0B0) to primary text color (#F5F5F5)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 20:07:27 -06:00
Hanson.xyz DevandClaude ff25ffcceb Increase hero logo size and make background transparent
- Doubled logo max-width from 200px to 400px
- Created logo-transparent.webp with transparent background
- Used flood fill to preserve internal black elements

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 20:06:44 -06:00
Hanson.xyz DevandClaude 38dd0c4866 Add logo above hero title on homepage
- Added logo parameter to hero-section.php component
- Added .hero-section-logo CSS (200px max-width, centered)
- Updated front-page.php to pass logo.webp to hero

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 20:04:57 -06:00
Hanson.xyz Dev ae46667a7c Revert "Replace header text logo with image logo"
This reverts commit b35731164d.
2025-11-30 20:02:48 -06:00
Hanson.xyz DevandClaude b35731164d Replace header text logo with image logo
- Use logo.webp from assets/images
- Logo height: 50px
- Negative margin (-4px) to fit within existing header height

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 20:01:59 -06:00
Hanson.xyz DevandClaude d7b0861d4e Home page hero: add max-height 725px
🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 19:59:04 -06:00
Hanson.xyz DevandClaude 8bea4b611d Simplify filter bar: 7 equal-width items in clean grid
- 7 columns at 1200px+ (all items on one row)
- 4 columns at 768-1200px
- 2 columns at 0-768px
- Each item (Type, Location, Beds, Min, Max, Search, Reset) is equal width
- Removed complex nested structures

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 19:55:28 -06:00
Hanson.xyz DevandClaude 775c57a678 Property filters overhaul: status sorting, simplified UI
- Remove status dropdown (always show all properties)
- Remove sort dropdown (use status-based sorting)
- Sort order: Active > Pending > Sold, then by modified date
- Map view: half height, 2-column property grid
- Beds field same width as others
- Add CLAUDE.md documentation for property system

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 19:52:50 -06:00
Hanson.xyz DevandClaude 1dd874091c Redesign property filters layout: single row, better proportions
- All filters now on one row at 1200px+
- Beds field narrower (70px) for single-digit values
- Price range wider with compact $Xk format
- Sort, Search, Reset moved inline after price range
- Shorter labels: Type, Status, Beds, Sort
- Responsive: 2-col mobile, 4-col tablet, full row desktop

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 19:43:44 -06:00
Hanson.xyz DevandClaude cefcd0f98d Fix property filters AJAX: correct script handle for wp_localize_script
Changed 'homeproz-main' to 'homeproz-script' so homeprozAjax variable
is actually attached to the correct script and available on the page.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 19:40:36 -06:00
Hanson.xyz DevandClaude 1344d994be Fix duplicate headers on agents archive page
- Removed subtitle from hero section (title only)
- Replaced section-header with simpler page-intro component
- Combined intro text with agent count display
- Updated SCSS with page-intro styles

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 19:25:07 -06:00
Hanson.xyz DevandClaude 3998623fc7 Improve hero and agents page layout
- Hero small variant: 55px top/bottom padding, 225px min-height
- Agents page: Added section header with title, subtitle, and border separator
- Provides visual separation between hero and content grid

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 19:22:02 -06:00
Hanson.xyz DevandClaude ce5e3bb472 Fix agent listing query to work without meta fields
The previous WP_Query with meta_query required agent_order to exist,
which excluded agents that hadn't been edited since the field was added.

Changed to simpler approach: fetch all published agents with get_posts(),
filter disabled in PHP, sort by order (defaulting to 10) then alphabetically.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 19:19:11 -06:00
Hanson.xyz DevandClaude c2c2703568 Update CLAUDE.md with CPT, ACF, and feature documentation
- Added Agent CPT to theme structure and page class reference
- Documented Property CPT with all ACF fields and taxonomies
- Documented Agent CPT with ACF fields and disabled behavior
- Added Theme Options (ACF Options Page) documentation
- Documented contact page property inquiry feature
- Updated open decisions (Agents decision resolved)
- Updated notes section

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 19:11:57 -06:00
Hanson.xyz DevandClaude 42a06a5435 Add agent listing page with ordering and disabled agent support
- Added agent_order (number) and agent_disabled (toggle) ACF fields
- Created archive-agent.php template for /agents/ listing page
  - Queries only active agents, ordered by agent_order then title
  - Grid layout with agent cards showing photo, name, title, bio
  - Contact action buttons (phone, email, profile)
- Added "Agents" link to footer fallback menu
- Updated single-agent.php to return 404 for disabled agents
- Updated property-agent.php to handle disabled agents:
  - Shows agent name and photo (for historical reference)
  - Replaces agent contact with office phone number
  - Removes Agent Profile button and email
  - Adds "Contact Us" button linking to contact form
- Added archive-agent.scss with responsive grid styles

Admin can now:
- Set display order for agents (lower numbers first)
- Disable agents who have left (hides from listing, 404s profile)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 19:10:38 -06:00
Hanson.xyz DevandClaude 220ae51df8 Make agent info block clickable, add Agent Profile button
- Wrapped agent avatar/name/title in single clickable link to profile
- Added Agent Profile button between Call and Email buttons
- Added hover styles for agent info link block

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 18:49:40 -06:00
Hanson.xyz DevandClaude e5220dcf88 Add agent selection to properties with contact integration
- Changed listing_agent ACF field from user type to post_object (Agent CPT)
- Assigned random agents to all existing properties
- Updated property-agent.php template to:
  - Pull agent data from Agent CPT (photo, phone, email, title)
  - Link agent name to their profile page
  - Show generic contact card when no agent assigned
  - Always show "Request Information" widget linking to contact page
- Added property inquiry flow:
  - Contact links include ?property=PropertyName GET parameter
  - Contact page pre-fills message with property inquiry text
  - JS handles CF7 textarea pre-fill if plugin is active
- Added styles for new property-inquiry-card and generic-contact-card widgets

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 18:46:12 -06:00
Hanson.xyz DevandClaude ef12be70ca Add Agent CPT with single-agent profile template
- Created Agent custom post type with ACF fields (phone, email, website, title, license, bio, gallery, social links repeater)
- Added single-agent.php template with modern profile layout: header with photo/contact buttons/social links, biography section, photo gallery, current listings, sidebar contact card
- Created single-agent.scss with responsive styling matching HomeProz dark theme
- Updated single-property.php sidebar: moved property header widget, added document downloads with primary button styling
- Imported 4 agents from homeprozrealestate.com with profile images
- Added agent scrape scripts for reference

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-30 18:38:49 -06:00
Hanson.xyz Dev fd0693e526 Phase 8 structural enhancements: Communities, Resources, Footer
Completed tasks:
- html-7jz: Added Communities section with landing page and community template
- html-t8u: Added Resources section with Buyer's Guide and Seller's Guide
- html-3nq: Enhanced footer with office hours, professional logos, license info

New files:
- page-communities.php: Communities landing page listing all locations
- template-community.php: Individual community page template
- page-resources.php: Resources hub with featured guides
- template-resource.php: Individual resource/guide page template
- content-communities.scss, content-resources.scss: Styles for new pages

WordPress changes:
- Created Communities page with 3 child pages (Albert Lea, Austin, Glenville)
- Created Resources page with 2 child pages (Buyer's Guide, Seller's Guide)
- Added Communities and Resources to primary navigation menu
- Added new location terms for communities

Footer enhancements:
- Office hours section (4-column grid now)
- Professional association logos (REALTOR, Equal Housing)
- License number display
2025-11-30 02:47:16 -06:00
Hanson.xyz Dev 23a7155955 Homepage structural enhancements from RHR analysis
Phase 8 P1 tasks completed:
- Added location search dropdown to hero section (html-98b)
- Added service cards section with Buy/Rent/Sell options (html-5bw)
- Separated Featured Homes and Commercial/Land into distinct sections (html-2fp)

Changes:
- hero-section.php: New show_location_search option with community dropdown
- service-cards.php/scss: New component with 3 service cards
- front-page.php: Hero with search, service cards, separate property sections
- Added community terms: Glenville, Emmons, Clarks Grove, Alden, Hartland, Geneva
2025-11-30 02:33:25 -06:00
Hanson.xyz Dev 5b629bdbab Update design docs with RHR competitor structural changes
DESIGN-DOCUMENT.md v1.1:
- Expanded site architecture with Communities and Resources sections
- Updated navigation: Properties | Communities | About | Resources | Contact
- Hero now includes location search dropdown
- Added Service Cards section (Buy/Rent/Sell)
- Separated Residential and Commercial listings on homepage
- Property archive now includes map view (split layout)
- Added Community page template specs
- Added Resources page template specs
- Enhanced footer with office hours, pro logos, license numbers

IMPLEMENTATION-PLAN.md v1.6:
- Added Phase 8: RHR Structural Enhancements
- New templates: page-communities.php, page-resources.php, template-community.php, template-resource.php
- ACF field specs for community and resource pages
- Linked beads issues for tracking
2025-11-30 02:29:02 -06:00
Hanson.xyz Dev 562a0bd5b0 Competitor analysis: Robert Hoffman Realty site scrape and comparison
- Created Playwright scraper for JS-rendered Wix sites
- Scraped homepage, listings, contact, and team pages with screenshots
- Wrote detailed ANALYSIS.md comparing RHR structure to HomeProz design
- Key recommendations: add community pages, map view, property type separation
2025-11-30 02:22:01 -06:00
Hanson.xyz Dev afcf6042cd Configure beads git hooks and sync settings 2025-11-30 01:56:12 -06:00
Hanson.xyz Dev 5e2bb8585a Initialize beads issue tracking and update git policy
- Initialize beads (.beads/ directory)
- Add Claude Code hooks for SessionStart/PreCompact
- Update CLAUDE.md to clarify all build artifacts are committed
- Update .gitignore to allow node_modules and dist
2025-11-30 01:55:50 -06:00
Hanson.xyz Dev 3c76e76068 ACF Pro: Upgrade from free, add Documents repeater field with download buttons 2025-11-28 17:49:39 -06:00
Hanson.xyz Dev be833efe62 Single property: Revert to original layout, remove sticky from sidebar 2025-11-28 17:31:05 -06:00
Hanson.xyz Dev dd006f51dc Single property: Fixed contact sidebar, full-width content area 2025-11-28 17:29:29 -06:00