// Featured Projects — 6 case studies, editorial grid with hover reveal const Projects = () => { const [filter, setFilter] = React.useState('All'); const [hover, setHover] = React.useState(null); const projects = [ { id: 'P-001', name: 'The Laurel Coast', location: 'Naples, FL', type: 'Ground-Up', category: 'Resort', year: '2024', scope: 'Ground-up 186-key beachfront resort with two signature restaurants, rooftop bar, and full-service spa.', stats: [['186', 'keys'], ['$142M', 'value'], ['24 mo', 'duration']], imgDesc: 'Oceanfront view of a 5-story contemporary resort at golden hour; white stucco, shell-colored louvers, palm-lined pool deck in foreground.', }, { id: 'P-002', name: 'Magnolia House Renovation', location: 'Charleston, SC', type: 'Renovation / PIP', category: 'Boutique Hotel', year: '2023', scope: 'Full guestroom PIP across 94 keys in a historic Charleston property. Operated at 71% occupancy through duration.', stats: [['94', 'keys'], ['$18M', 'value'], ['11 mo', 'live-hotel']], imgDesc: 'Restored historic hotel facade in downtown Charleston; wrought iron balconies, hurricane shutters, cobblestone sidewalk.', }, { id: 'P-003', name: 'Hammock Dunes Spa Pavilion', location: 'Amelia Island, FL', type: 'Amenity Buildout', category: 'Spa', year: '2023', scope: 'Standalone 14,000 sf spa and wellness pavilion with saltwater hydrotherapy, 8 treatment rooms, and outdoor yoga platform.', stats: [['14K sf', 'program'], ['$9.2M', 'value'], ['9 mo', 'duration']], imgDesc: 'Teak-clad spa pavilion nestled between sea oats and palmetto; clerestory windows, reflecting pool at entrance.', }, { id: 'P-004', name: 'Tybee Beach Club', location: 'Tybee Island, GA', type: 'Ground-Up', category: 'Beach Club', year: '2022', scope: 'Private beach club with member dining, bathhouse, pool complex, and event lawn. V-zone foundation.', stats: [['22K sf', 'program'], ['$14M', 'value'], ['CCCL', 'permit']], imgDesc: 'Low-slung beach club on stilts over dunes; weathered cypress, galvanized roof, loungers on a bleached wood deck.', }, { id: 'P-005', name: 'Kiawah Brand Repositioning', location: 'Kiawah Island, SC', type: 'Renovation / PIP', category: 'Resort', year: '2025', scope: 'Flag conversion from independent to major soft brand. 248 keys, all public spaces, two restaurants, spa refresh.', stats: [['248', 'keys'], ['$34M', 'value'], ['14 mo', 'live-hotel']], imgDesc: 'Resort lobby interior during soft-brand conversion; double-height atrium, terrazzo floors, custom millwork reception.', }, { id: 'P-006', name: 'Savannah Harbor Marina', location: 'Savannah, GA', type: 'Ground-Up', category: 'Marina / F&B', year: '2024', scope: 'Marina clubhouse with 120-seat dockside restaurant, ship store, and 60-slip expansion. DEP-permitted.', stats: [['60', 'slips'], ['$22M', 'value'], ['18 mo', 'duration']], imgDesc: 'Dockside restaurant and marina with sailboats at dusk; string lights, covered deck, Savannah skyline in background.', }, ]; const filters = ['All', 'Ground-Up', 'Renovation / PIP', 'Amenity Buildout']; const visible = filter === 'All' ? projects : projects.filter(p => p.type === filter); return (
── (04) · Selected Work

Six from the
last three seasons.

{filters.map(f => ( ))}
{String(visible.length).padStart(2, '0')} projects
{visible.map((p, i) => { // Editorial grid: alternating column spans for rhythm const layout = [ { col: '1 / 8', feature: true }, { col: '9 / 13', feature: false }, { col: '1 / 5', feature: false }, { col: '6 / 13', feature: true }, { col: '1 / 8', feature: true }, { col: '9 / 13', feature: false }, ][i] || { col: '1 / 13', feature: false }; const isHover = hover === p.id; return (
setHover(p.id)} onMouseLeave={() => setHover(null)} style={{ gridColumn: layout.col, cursor: 'pointer', '--reveal-delay': `${i * 60}ms`, }} >
{p.id} · {p.year}
{p.name}
Case study →
{p.location}
{p.type} · {p.category}
{p.stats[0][0]} {p.stats[0][1]}

{p.scope}

); })}
Project binder with full references, ownership references, and brand QA reports available under NDA.
{ e.currentTarget.style.background = 'var(--navy-900)'; e.currentTarget.style.color = 'var(--bone-100)'; }} onMouseLeave={e => { e.currentTarget.style.background = 'transparent'; e.currentTarget.style.color = 'var(--navy-900)'; }} > Request binder →
); }; window.Projects = Projects;