import React, { useState, useMemo } from 'react'; // --- SVG Icon Components (Kept Sparkles for AI tips) --- const SparklesIcon = () => ( ); const BuildingOfficeIcon = () => ( ); // Main App component for the Rent Affordability Calculator function App() { // State variables to store user inputs and calculation results const [monthlyIncome, setMonthlyIncome] = useState(''); const [desiredRent, setDesiredRent] = useState(''); const [monthlyDebt, setMonthlyDebt] = useState(''); const [selectedState, setSelectedState] = useState(''); const [selectedCity, setSelectedCity] = useState(''); const [affordabilityResult, setAffordabilityResult] = useState(null); const [aiResponse, setAiResponse] = useState(''); const [loadingAI, setLoadingAI] = useState(false); const [showModal, setShowModal] = useState(false); const [modalMessage, setModalMessage] = useState(''); const [activeTab, setActiveTab] = useState('summary'); // State for Budgeting Tool const [needsPercent, setNeedsPercent] = useState(50); const [wantsPercent, setWantsPercent] = useState(30); const [savingsPercent, setSavingsPercent] = useState(20); // New state to track if a calculation has been run const [calculationDone, setCalculationDone] = useState(false); // Pre-defined data for states including Quality of Life metrics and cities const rentalMarketData = { states: { 'Alabama': { averageRent: 1040, type: 'affordable', historicalTrend: 'Generally affordable, steady growth.', qualityOfLife: { walkabilityScore: 'Low', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Car-dependent', averageCommuteTime: 25, greenSpaceAccess: 'Good', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 90 }, cities: [{ name: 'Birmingham', qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Mixed', averageCommuteTime: 20, greenSpaceAccess: 'Good', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 95 } }, { name: 'Montgomery', averageRent: 1000, qualityOfLife: { walkabilityScore: 'Low', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Car-dependent', averageCommuteTime: 22, greenSpaceAccess: 'Average', publicTransitAvailability: 'None', airQualityIndex: 'Good', costOfLivingIndex: 88 } }, { name: 'Huntsville', averageRent: 1100, qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Low', schoolRating: 'Above Average', amenityProximity: 'Good', averageCommuteTime: 18, greenSpaceAccess: 'Excellent', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 92 } }, { name: 'Mobile', averageRent: 950, qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Mixed', averageCommuteTime: 23, greenSpaceAccess: 'Good', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 90 } }, { name: 'Tuscaloosa', averageRent: 1000, qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Mixed', averageCommuteTime: 20, greenSpaceAccess: 'Average', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 91 } }, { name: 'Hoover', averageRent: 1300, qualityOfLife: { walkabilityScore: 'Low', crimeIndex: 'Very Low', schoolRating: 'Excellent', amenityProximity: 'Car-dependent', averageCommuteTime: 25, greenSpaceAccess: 'Excellent', publicTransitAvailability: 'None', airQualityIndex: 'Good', costOfLivingIndex: 105 } }, { name: 'Dothan', averageRent: 897, qualityOfLife: { walkabilityScore: 'Low', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Car-dependent', averageCommuteTime: 18, greenSpaceAccess: 'Good', publicTransitAvailability: 'None', airQualityIndex: 'Good', costOfLivingIndex: 85 } }, { name: 'Auburn', averageRent: 1100, qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Low', schoolRating: 'Excellent', amenityProximity: 'Good', averageCommuteTime: 15, greenSpaceAccess: 'Excellent', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 98 } }, { name: 'Decatur', averageRent: 752, qualityOfLife: { walkabilityScore: 'Low', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Car-dependent', averageCommuteTime: 20, greenSpaceAccess: 'Average', publicTransitAvailability: 'None', airQualityIndex: 'Good', costOfLivingIndex: 80 } }, { name: 'Madison', averageRent: 1250, qualityOfLife: { walkabilityScore: 'Low', crimeIndex: 'Very Low', schoolRating: 'Excellent', amenityProximity: 'Car-dependent', averageCommuteTime: 20, greenSpaceAccess: 'Excellent', publicTransitAvailability: 'None', airQualityIndex: 'Good', costOfLivingIndex: 100 } }] }, 'Alaska': { averageRent: 1500, type: 'mixed', historicalTrend: 'Stable, moderate growth.', qualityOfLife: { walkabilityScore: 'Low', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Limited', averageCommuteTime: 20, greenSpaceAccess: 'Excellent', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 125 }, cities: [{ name: 'Anchorage', averageRent: 1450, qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Mixed', averageCommuteTime: 20, greenSpaceAccess: 'Excellent', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 120 } }, { name: 'Fairbanks', averageRent: 1300, qualityOfLife: { walkabilityScore: 'Low', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Car-dependent', averageCommuteTime: 15, greenSpaceAccess: 'Excellent', publicTransitAvailability: 'None', airQualityIndex: 'Good', costOfLivingIndex: 130 } }, { name: 'Juneau', averageRent: 1600, qualityOfLife: { walkabilityScore: 'Low', crimeIndex: 'Low', schoolRating: 'Above Average', amenityProximity: 'Limited', averageCommuteTime: 10, greenSpaceAccess: 'Excellent', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 140 } }] }, 'Arizona': { averageRent: 1800, type: 'expensive', historicalTrend: 'High growth post-pandemic, now moderating.', qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Moderate', schoolRating: 'Above Average', amenityProximity: 'Car-dependent', averageCommuteTime: 28, greenSpaceAccess: 'Average', publicTransitAvailability: 'Limited', airQualityIndex: 'Moderate', costOfLivingIndex: 105 }, cities: [{ name: 'Phoenix', qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Moderate', schoolRating: 'Above Average', amenityProximity: 'Good', averageCommuteTime: 28, greenSpaceAccess: 'Average', publicTransitAvailability: 'Limited', airQualityIndex: 'Moderate', costOfLivingIndex: 105 } }, { name: 'Tucson', averageRent: 1400, qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Mixed', averageCommuteTime: 20, greenSpaceAccess: 'Good', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 98 } }, { name: 'Mesa', averageRent: 1700, qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Good', averageCommuteTime: 25, greenSpaceAccess: 'Average', publicTransitAvailability: 'Limited', airQualityIndex: 'Moderate', costOfLivingIndex: 100 } }, { name: 'Chandler', averageRent: 1800, qualityOfLife: { walkabilityScore: 'Low', crimeIndex: 'Low', schoolRating: 'Excellent', amenityProximity: 'Good', averageCommuteTime: 25, greenSpaceAccess: 'Good', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 110 } }, { name: 'Scottsdale', averageRent: 2200, qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Low', schoolRating: 'Excellent', amenityProximity: 'Good', averageCommuteTime: 20, greenSpaceAccess: 'Excellent', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 120 } }, { name: 'Glendale', averageRent: 1600, qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Mixed', averageCommuteTime: 25, greenSpaceAccess: 'Average', publicTransitAvailability: 'Limited', airQualityIndex: 'Moderate', costOfLivingIndex: 100 } }, { name: 'Gilbert', averageRent: 1900, qualityOfLife: { walkabilityScore: 'Low', crimeIndex: 'Very Low', schoolRating: 'Excellent', amenityProximity: 'Car-dependent', averageCommuteTime: 30, greenSpaceAccess: 'Good', publicTransitAvailability: 'None', airQualityIndex: 'Good', costOfLivingIndex: 115 } }, { name: 'Tempe', averageRent: 1750, qualityOfLife: { walkabilityScore: 'High', crimeIndex: 'Moderate', schoolRating: 'Above Average', amenityProximity: 'Good', averageCommuteTime: 20, greenSpaceAccess: 'Average', publicTransitAvailability: 'Good', airQualityIndex: 'Moderate', costOfLivingIndex: 108 } }, { name: 'Peoria', averageRent: 1700, qualityOfLife: { walkabilityScore: 'Low', crimeIndex: 'Low', schoolRating: 'Above Average', amenityProximity: 'Car-dependent', averageCommuteTime: 30, greenSpaceAccess: 'Good', publicTransitAvailability: 'None', airQualityIndex: 'Good', costOfLivingIndex: 102 } }, { name: 'Surprise', averageRent: 1600, qualityOfLife: { walkabilityScore: 'Low', crimeIndex: 'Low', schoolRating: 'Average', amenityProximity: 'Car-dependent', averageCommuteTime: 35, greenSpaceAccess: 'Average', publicTransitAvailability: 'None', airQualityIndex: 'Good', costOfLivingIndex: 98 } }] }, 'Arkansas': { averageRent: 931, type: 'affordable', historicalTrend: 'Consistently affordable, slight growth.', qualityOfLife: { walkabilityScore: 'Low', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Car-dependent', averageCommuteTime: 20, greenSpaceAccess: 'Good', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 85 }, cities: [{ name: 'Little Rock', qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Mixed', averageCommuteTime: 20, greenSpaceAccess: 'Good', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 90 } }, { name: 'Fort Smith', averageRent: 900, qualityOfLife: { walkabilityScore: 'Low', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Car-dependent', averageCommuteTime: 18, greenSpaceAccess: 'Average', publicTransitAvailability: 'None', airQualityIndex: 'Good', costOfLivingIndex: 82 } }, { name: 'Fayetteville', averageRent: 1100, qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Low', schoolRating: 'Excellent', amenityProximity: 'Good', averageCommuteTime: 15, greenSpaceAccess: 'Excellent', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 95 } }, { name: 'Springdale', averageRent: 1000, qualityOfLife: { walkabilityScore: 'Low', crimeIndex: 'Low', schoolRating: 'Above Average', amenityProximity: 'Car-dependent', averageCommuteTime: 18, greenSpaceAccess: 'Good', publicTransitAvailability: 'None', airQualityIndex: 'Good', costOfLivingIndex: 90 } }, { name: 'Jonesboro', averageRent: 950, qualityOfLife: { walkabilityScore: 'Low', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Car-dependent', averageCommuteTime: 17, greenSpaceAccess: 'Average', publicTransitAvailability: 'None', airQualityIndex: 'Good', costOfLivingIndex: 88 } }] }, 'California': { averageRent: 2424, type: 'expensive', historicalTrend: 'Historically expensive, some moderation in 2025.', qualityOfLife: { walkabilityScore: 'High', crimeIndex: 'Varies', schoolRating: 'Above Average', amenityProximity: 'Good', averageCommuteTime: 30, greenSpaceAccess: 'Good', publicTransitAvailability: 'Good', airQualityIndex: 'Moderate', costOfLivingIndex: 150 }, cities: [ { name: 'Los Angeles', averageRent: 2638, qualityOfLife: { walkabilityScore: 'High', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Excellent', averageCommuteTime: 35, greenSpaceAccess: 'Good', publicTransitAvailability: 'Good', airQualityIndex: 'Moderate', costOfLivingIndex: 160 } }, { name: 'San Diego', averageRent: 3203, qualityOfLife: { walkabilityScore: 'High', crimeIndex: 'Moderate', schoolRating: 'Above Average', amenityProximity: 'Good', averageCommuteTime: 25, greenSpaceAccess: 'Excellent', publicTransitAvailability: 'Medium', airQualityIndex: 'Good', costOfLivingIndex: 155 } }, { name: 'San Jose', averageRent: 3329, qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Low', schoolRating: 'Excellent', amenityProximity: 'Good', averageCommuteTime: 28, greenSpaceAccess: 'Good', publicTransitAvailability: 'Good', airQualityIndex: 'Good', costOfLivingIndex: 170 } }, { name: 'San Francisco', averageRent: 3411, qualityOfLife: { walkabilityScore: 'Very High', crimeIndex: 'Moderate', schoolRating: 'Excellent', amenityProximity: 'Excellent', averageCommuteTime: 30, greenSpaceAccess: 'Excellent', publicTransitAvailability: 'Excellent', airQualityIndex: 'Moderate', costOfLivingIndex: 180 } }, { name: 'Fresno', averageRent: 1500, qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'High', schoolRating: 'Average', amenityProximity: 'Mixed', averageCommuteTime: 20, greenSpaceAccess: 'Average', publicTransitAvailability: 'Limited', airQualityIndex: 'Moderate', costOfLivingIndex: 105 } }, { name: 'Sacramento', averageRent: 1800, qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Good', averageCommuteTime: 25, greenSpaceAccess: 'Good', publicTransitAvailability: 'Medium', airQualityIndex: 'Good', costOfLivingIndex: 115 } }, { name: 'Long Beach', averageRent: 2200, qualityOfLife: { walkabilityScore: 'High', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Good', averageCommuteTime: 30, greenSpaceAccess: 'Good', publicTransitAvailability: 'Good', airQualityIndex: 'Moderate', costOfLivingIndex: 140 } }, { name: 'Oakland', averageRent: 2768, qualityOfLife: { walkabilityScore: 'High', crimeIndex: 'High', schoolRating: 'Above Average', amenityProximity: 'Good', averageCommuteTime: 25, greenSpaceAccess: 'Good', publicTransitAvailability: 'Good', airQualityIndex: 'Moderate', costOfLivingIndex: 165 } }, { name: 'Bakersfield', averageRent: 1300, qualityOfLife: { walkabilityScore: 'Low', crimeIndex: 'Moderate', schoolRating: 'Below Average', amenityProximity: 'Car-dependent', averageCommuteTime: 20, greenSpaceAccess: 'Average', publicTransitAvailability: 'None', airQualityIndex: 'Moderate', costOfLivingIndex: 95 } }, { name: 'Anaheim', averageRent: 2300, qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Low', schoolRating: 'Above Average', amenityProximity: 'Good', averageCommuteTime: 28, greenSpaceAccess: 'Good', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 145 } } ] }, 'Colorado': { averageRent: 2000, type: 'mixed', historicalTrend: 'Saw some rent declines in 2025.', qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Moderate', schoolRating: 'Above Average', amenityProximity: 'Good', averageCommuteTime: 25, greenSpaceAccess: 'Excellent', publicTransitAvailability: 'Medium', airQualityIndex: 'Good', costOfLivingIndex: 115 }, cities: [{ name: 'Denver', averageRent: 1950, qualityOfLife: { walkabilityScore: 'High', crimeIndex: 'Moderate', schoolRating: 'Above Average', amenityProximity: 'Good', averageCommuteTime: 25, greenSpaceAccess: 'Excellent', publicTransitAvailability: 'Good', airQualityIndex: 'Good', costOfLivingIndex: 118 } }, { name: 'Colorado Springs', averageRent: 1500, qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Low', schoolRating: 'Average', amenityProximity: 'Mixed', averageCommuteTime: 20, greenSpaceAccess: 'Excellent', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 105 } }, { name: 'Aurora', averageRent: 1800, qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Good', averageCommuteTime: 28, greenSpaceAccess: 'Good', publicTransitAvailability: 'Medium', airQualityIndex: 'Good', costOfLivingIndex: 110 } }, { name: 'Fort Collins', averageRent: 1700, qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Low', schoolRating: 'Excellent', amenityProximity: 'Good', averageCommuteTime: 20, greenSpaceAccess: 'Excellent', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 112 } }, { name: 'Lakewood', averageRent: 1850, qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Low', schoolRating: 'Above Average', amenityProximity: 'Good', averageCommuteTime: 22, greenSpaceAccess: 'Good', publicTransitAvailability: 'Medium', airQualityIndex: 'Good', costOfLivingIndex: 115 } }] }, 'Connecticut': { averageRent: 1850, type: 'expensive', historicalTrend: 'Steady, above national average growth.', qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Low', schoolRating: 'Excellent', amenityProximity: 'Good', averageCommuteTime: 25, greenSpaceAccess: 'Good', publicTransitAvailability: 'Good', airQualityIndex: 'Good', costOfLivingIndex: 120 }, cities: [{ name: 'Bridgeport', averageRent: 1700, qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Good', averageCommuteTime: 25, greenSpaceAccess: 'Good', publicTransitAvailability: 'Good', airQualityIndex: 'Good', costOfLivingIndex: 115 } }, { name: 'New Haven', averageRent: 1800, qualityOfLife: { walkabilityScore: 'High', crimeIndex: 'Moderate', schoolRating: 'Above Average', amenityProximity: 'Good', averageCommuteTime: 20, greenSpaceAccess: 'Good', publicTransitAvailability: 'Good', airQualityIndex: 'Good', costOfLivingIndex: 125 } }, { name: 'Stamford', averageRent: 2400, qualityOfLife: { walkabilityScore: 'High', crimeIndex: 'Low', schoolRating: 'Excellent', amenityProximity: 'Excellent', averageCommuteTime: 30, greenSpaceAccess: 'Excellent', publicTransitAvailability: 'Good', airQualityIndex: 'Good', costOfLivingIndex: 150 } }, { name: 'Hartford', averageRent: 1600, qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'High', schoolRating: 'Average', amenityProximity: 'Good', averageCommuteTime: 20, greenSpaceAccess: 'Average', publicTransitAvailability: 'Good', airQualityIndex: 'Good', costOfLivingIndex: 110 } }, { name: 'Waterbury', averageRent: 1200, qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Moderate', schoolRating: 'Below Average', amenityProximity: 'Mixed', averageCommuteTime: 20, greenSpaceAccess: 'Average', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 100 } }] }, 'Delaware': { averageRent: 1700, type: 'expensive', historicalTrend: 'Consistent growth, relatively high.', qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Low', schoolRating: 'Above Average', amenityProximity: 'Good', averageCommuteTime: 25, greenSpaceAccess: 'Good', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 110 }, cities: [{ name: 'Wilmington', averageRent: 1650, qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Good', averageCommuteTime: 20, greenSpaceAccess: 'Good', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 108 } }, { name: 'Dover', averageRent: 1400, qualityOfLife: { walkabilityScore: 'Low', crimeIndex: 'Low', schoolRating: 'Average', amenityProximity: 'Car-dependent', averageCommuteTime: 18, greenSpaceAccess: 'Average', publicTransitAvailability: 'None', airQualityIndex: 'Good', costOfLivingIndex: 98 } }, { name: 'Newark', averageRent: 1500, qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Low', schoolRating: 'Excellent', amenityProximity: 'Good', averageCommuteTime: 20, greenSpaceAccess: 'Good', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 105 } }] }, 'Florida': { averageRent: 2501, type: 'expensive', historicalTrend: 'High growth post-pandemic, some cities seeing declines due to oversupply.', qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Good', averageCommuteTime: 28, greenSpaceAccess: 'Good', publicTransitAvailability: 'Medium', airQualityIndex: 'Good', costOfLivingIndex: 110 }, cities: [ { name: 'Jacksonville', averageRent: 1600, qualityOfLife: { walkabilityScore: 'Low', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Car-dependent', averageCommuteTime: 25, greenSpaceAccess: 'Good', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 95 } }, { name: 'Miami', averageRent: 2501, qualityOfLife: { walkabilityScore: 'High', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Excellent', averageCommuteTime: 35, greenSpaceAccess: 'Good', publicTransitAvailability: 'Good', airQualityIndex: 'Moderate', costOfLivingIndex: 120 } }, { name: 'Tampa', averageRent: 1900, qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Moderate', schoolRating: 'Above Average', amenityProximity: 'Good', averageCommuteTime: 25, greenSpaceAccess: 'Good', publicTransitAvailability: 'Medium', airQualityIndex: 'Good', costOfLivingIndex: 105 } }, { name: 'Orlando', averageRent: 1850, qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Good', averageCommuteTime: 28, greenSpaceAccess: 'Good', publicTransitAvailability: 'Medium', airQualityIndex: 'Good', costOfLivingIndex: 103 } }, { name: 'St. Petersburg', averageRent: 1800, qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Good', averageCommuteTime: 22, greenSpaceAccess: 'Excellent', publicTransitAvailability: 'Medium', airQualityIndex: 'Good', costOfLivingIndex: 100 } }, { name: 'Hialeah', averageRent: 2000, qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Mixed', averageCommuteTime: 30, greenSpaceAccess: 'Average', publicTransitAvailability: 'Limited', airQualityIndex: 'Moderate', costOfLivingIndex: 108 } }, { name: 'Fort Lauderdale', averageRent: 2300, qualityOfLife: { walkabilityScore: 'High', crimeIndex: 'Moderate', schoolRating: 'Above Average', amenityProximity: 'Good', averageCommuteTime: 30, greenSpaceAccess: 'Good', publicTransitAvailability: 'Good', airQualityIndex: 'Good', costOfLivingIndex: 115 } }, { name: 'Tallahassee', averageRent: 1400, qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Mixed', averageCommuteTime: 20, greenSpaceAccess: 'Good', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 92 } }, { name: 'Cape Coral', averageRent: 1700, qualityOfLife: { walkabilityScore: 'Low', crimeIndex: 'Low', schoolRating: 'Average', amenityProximity: 'Car-dependent', averageCommuteTime: 25, greenSpaceAccess: 'Good', publicTransitAvailability: 'None', airQualityIndex: 'Good', costOfLivingIndex: 98 } }, { name: 'Port St. Lucie', averageRent: 1900, qualityOfLife: { walkabilityScore: 'Low', crimeIndex: 'Low', schoolRating: 'Average', amenityProximity: 'Car-dependent', averageCommuteTime: 28, greenSpaceAccess: 'Good', publicTransitAvailability: 'None', airQualityIndex: 'Good', costOfLivingIndex: 100 } } ] }, 'Georgia': { averageRent: 1650, type: 'mixed', historicalTrend: 'Mixed growth, some areas moderating.', qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Good', averageCommuteTime: 28, greenSpaceAccess: 'Good', publicTransitAvailability: 'Medium', airQualityIndex: 'Good', costOfLivingIndex: 98 }, cities: [{ name: 'Atlanta', qualityOfLife: { walkabilityScore: 'High', crimeIndex: 'Moderate', schoolRating: 'Above Average', amenityProximity: 'Good', averageCommuteTime: 30, greenSpaceAccess: 'Good', publicTransitAvailability: 'Good', airQualityIndex: 'Good', costOfLivingIndex: 105 } }, { name: 'Augusta', averageRent: 1300, qualityOfLife: { walkabilityScore: 'Low', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Car-dependent', averageCommuteTime: 20, greenSpaceAccess: 'Average', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 88 } }, { name: 'Columbus', averageRent: 1200, qualityOfLife: { walkabilityScore: 'Low', crimeIndex: 'Moderate', averageCommuteTime: 18, greenSpaceAccess: 'Average', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 85 } }, { name: 'Savannah', averageRent: 1500, qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Moderate', schoolRating: 'Above Average', amenityProximity: 'Good', averageCommuteTime: 20, greenSpaceAccess: 'Excellent', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 95 } }, { name: 'Athens', averageRent: 1400, qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Low', schoolRating: 'Excellent', amenityProximity: 'Good', averageCommuteTime: 15, greenSpaceAccess: 'Excellent', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 92 } }] }, 'Hawaii': { averageRent: 2741, type: 'expensive', historicalTrend: 'Consistently the most expensive state.', qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Low', schoolRating: 'Average', amenityProximity: 'Good', averageCommuteTime: 25, greenSpaceAccess: 'Excellent', publicTransitAvailability: 'Good', airQualityIndex: 'Good', costOfLivingIndex: 180 }, cities: [{ name: 'Honolulu', averageRent: 2508, qualityOfLife: { walkabilityScore: 'High', crimeIndex: 'Low', schoolRating: 'Average', amenityProximity: 'Good', averageCommuteTime: 25, greenSpaceAccess: 'Excellent', publicTransitAvailability: 'Good', airQualityIndex: 'Good', costOfLivingIndex: 185 } }, { name: 'East Honolulu', averageRent: 2800, qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Very Low', schoolRating: 'Excellent', amenityProximity: 'Good', averageCommuteTime: 20, greenSpaceAccess: 'Excellent', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 190 } }] }, 'Idaho': { averageRent: 1550, type: 'mixed', historicalTrend: 'Strong growth, now stabilizing.', qualityOfLife: { walkabilityScore: 'Low', crimeIndex: 'Low', schoolRating: 'Average', amenityProximity: 'Car-dependent', averageCommuteTime: 20, greenSpaceAccess: 'Excellent', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 95 }, cities: [{ name: 'Boise', averageRent: 1600, qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Low', schoolRating: 'Above Average', amenityProximity: 'Mixed', averageCommuteTime: 20, greenSpaceAccess: 'Excellent', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 98 } }, { name: 'Meridian', averageRent: 1550, qualityOfLife: { walkabilityScore: 'Low', crimeIndex: 'Low', schoolRating: 'Above Average', amenityProximity: 'Car-dependent', averageCommuteTime: 22, greenSpaceAccess: 'Excellent', publicTransitAvailability: 'None', airQualityIndex: 'Good', costOfLivingIndex: 95 } }, { name: 'Nampa', averageRent: 1300, qualityOfLife: { walkabilityScore: 'Low', crimeIndex: 'Low', schoolRating: 'Average', amenityProximity: 'Car-dependent', averageCommuteTime: 20, greenSpaceAccess: 'Good', publicTransitAvailability: 'None', airQualityIndex: 'Good', costOfLivingIndex: 90 } }] }, 'Illinois': { averageRent: 1700, type: 'mixed', historicalTrend: 'Experienced significant rent increases in Chicago.', qualityOfLife: { walkabilityScore: 'High', crimeIndex: 'Moderate', schoolRating: 'Above Average', amenityProximity: 'Excellent', averageCommuteTime: 30, greenSpaceAccess: 'Good', publicTransitAvailability: 'Good', airQualityIndex: 'Moderate', costOfLivingIndex: 110 }, cities: [{ name: 'Chicago', averageRent: 1900 }, { name: 'Aurora', averageRent: 1400 }, { name: 'Joliet', averageRent: 1300 }, { name: 'Naperville', averageRent: 1900 }, { name: 'Rockford', averageRent: 1000 }] }, 'Indiana': { averageRent: 1200, type: 'affordable', historicalTrend: 'Affordable, steady growth.', qualityOfLife: { walkabilityScore: 'Low', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Car-dependent', averageCommuteTime: 22, greenSpaceAccess: 'Good', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 90 }, cities: [{ name: 'Indianapolis', averageRent: 1300 }, { name: 'Fort Wayne', averageRent: 1000 }, { name: 'Evansville', averageRent: 950 }, { name: 'South Bend', averageRent: 900 }, { name: 'Carmel', averageRent: 1600 }] }, 'Iowa': { averageRent: 955, type: 'affordable', historicalTrend: 'Consistently affordable, low growth.', qualityOfLife: { walkabilityScore: 'Low', crimeIndex: 'Low', schoolRating: 'Average', amenityProximity: 'Car-dependent', averageCommuteTime: 18, greenSpaceAccess: 'Good', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 85 }, cities: [{ name: 'Des Moines', averageRent: 1000 }, { name: 'Cedar Rapids', averageRent: 950 }, { name: 'Davenport', averageRent: 900 }] }, 'Kansas': { averageRent: 1100, type: 'affordable', historicalTrend: 'Affordable, stable.', qualityOfLife: { walkabilityScore: 'Low', crimeIndex: 'Low', schoolRating: 'Average', amenityProximity: 'Car-dependent', averageCommuteTime: 20, greenSpaceAccess: 'Good', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 88 }, cities: [{ name: 'Wichita', averageRent: 950 }, { name: 'Overland Park', averageRent: 1300 }, { name: 'Kansas City', averageRent: 1150 }] }, 'Kentucky': { averageRent: 1049, type: 'affordable', historicalTrend: 'Affordable, moderate growth.', qualityOfLife: { walkabilityScore: 'Low', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Car-dependent', averageCommuteTime: 20, greenSpaceAccess: 'Good', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 88 }, cities: [{ name: 'Louisville', averageRent: 1200 }, { name: 'Lexington', averageRent: 1100 }, { name: 'Bowling Green', averageRent: 950 }] }, 'Louisiana': { averageRent: 1051, type: 'affordable', historicalTrend: 'Affordable, stable.', qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'High', schoolRating: 'Below Average', amenityProximity: 'Mixed', averageCommuteTime: 25, greenSpaceAccess: 'Average', publicTransitAvailability: 'Limited', airQualityIndex: 'Moderate', costOfLivingIndex: 90 }, cities: [{ name: 'New Orleans', averageRent: 1400 }, { name: 'Baton Rouge', averageRent: 1100 }, { name: 'Shreveport', averageRent: 900 }] }, 'Maine': { averageRent: 1600, type: 'mixed', historicalTrend: 'Moderate growth, becoming less affordable.', qualityOfLife: { walkabilityScore: 'Low', crimeIndex: 'Low', schoolRating: 'Above Average', amenityProximity: 'Car-dependent', averageCommuteTime: 20, greenSpaceAccess: 'Excellent', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 105 }, cities: [{ name: 'Portland', averageRent: 1700 }, { name: 'Lewiston', averageRent: 1100 }] }, 'Maryland': { averageRent: 2000, type: 'expensive', historicalTrend: 'Consistent high growth.', qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Moderate', schoolRating: 'Excellent', amenityProximity: 'Good', averageCommuteTime: 30, greenSpaceAccess: 'Good', publicTransitAvailability: 'Good', airQualityIndex: 'Good', costOfLivingIndex: 120 }, cities: [{ name: 'Baltimore', averageRent: 1700 }, { name: 'Frederick', averageRent: 1900 }, { name: 'Rockville', averageRent: 2200 }] }, 'Massachusetts': { averageRent: 2804, type: 'expensive', historicalTrend: 'High demand, limited new housing.', qualityOfLife: { walkabilityScore: 'High', crimeIndex: 'Low', schoolRating: 'Excellent', amenityProximity: 'Excellent', averageCommuteTime: 30, greenSpaceAccess: 'Good', publicTransitAvailability: 'Excellent', airQualityIndex: 'Good', costOfLivingIndex: 140 }, cities: [{ name: 'Boston', averageRent: 2920 }, { name: 'Worcester', averageRent: 1800 }, { name: 'Springfield', averageRent: 1300 }] }, 'Michigan': { averageRent: 1300, type: 'affordable', historicalTrend: 'Affordable, steady growth.', qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Mixed', averageCommuteTime: 25, greenSpaceAccess: 'Good', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 90 }, cities: [{ name: 'Detroit', averageRent: 1200 }, { name: 'Grand Rapids', averageRent: 1350 }, { name: 'Warren', averageRent: 1100 }, { name: 'Sterling Heights', averageRent: 1250 }, { name: 'Ann Arbor', averageRent: 1700 }] }, 'Minnesota': { averageRent: 1500, type: 'mixed', historicalTrend: 'Moderate growth, diversified economy.', qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Low', schoolRating: 'Above Average', amenityProximity: 'Good', averageCommuteTime: 22, greenSpaceAccess: 'Excellent', publicTransitAvailability: 'Good', airQualityIndex: 'Good', costOfLivingIndex: 100 }, cities: [{ name: 'Minneapolis', averageRent: 1600 }, { name: 'St. Paul', averageRent: 1500 }, { name: 'Rochester', averageRent: 1400 }] }, 'Mississippi': { averageRent: 973, type: 'affordable', historicalTrend: 'Consistently affordable.', qualityOfLife: { walkabilityScore: 'Low', crimeIndex: 'Moderate', schoolRating: 'Below Average', amenityProximity: 'Car-dependent', averageCommuteTime: 20, greenSpaceAccess: 'Average', publicTransitAvailability: 'None', airQualityIndex: 'Good', costOfLivingIndex: 80 }, cities: [{ name: 'Jackson', averageRent: 1000 }, { name: 'Gulfport', averageRent: 900 }] }, 'Missouri': { averageRent: 1200, type: 'affordable', historicalTrend: 'Affordable, stable growth.', qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Mixed', averageCommuteTime: 22, greenSpaceAccess: 'Good', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 88 }, cities: [{ name: 'Kansas City', averageRent: 1300 }, { name: 'St. Louis', averageRent: 1250 }, { name: 'Springfield', averageRent: 950 }] }, 'Montana': { averageRent: 1600, type: 'mixed', historicalTrend: 'Strong growth, now moderating.', qualityOfLife: { walkabilityScore: 'Low', crimeIndex: 'Low', schoolRating: 'Average', amenityProximity: 'Car-dependent', averageCommuteTime: 18, greenSpaceAccess: 'Excellent', publicTransitAvailability: 'None', airQualityIndex: 'Good', costOfLivingIndex: 95 }, cities: [{ name: 'Billings', averageRent: 1200 }, { name: 'Missoula', averageRent: 1500 }] }, 'Nebraska': { averageRent: 1150, type: 'affordable', historicalTrend: 'Low growth.', qualityOfLife: { walkabilityScore: 'Low', crimeIndex: 'Low', schoolRating: 'Average', amenityProximity: 'Car-dependent', averageCommuteTime: 18, greenSpaceAccess: 'Good', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 88 }, cities: [{ name: 'Omaha', averageRent: 1100 }, { name: 'Lincoln', averageRent: 1000 }] }, 'Nevada': { averageRent: 1750, type: 'expensive', historicalTrend: 'High growth, now slowing.', qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Good', averageCommuteTime: 25, greenSpaceAccess: 'Average', publicTransitAvailability: 'Limited', airQualityIndex: 'Moderate', costOfLivingIndex: 105 }, cities: [{ name: 'Las Vegas', averageRent: 1700 }, { name: 'Henderson', averageRent: 1800 }, { name: 'Reno', averageRent: 1600 }] }, 'New Hampshire': { averageRent: 2107, type: 'expensive', historicalTrend: 'Consistently expensive, steady growth.', qualityOfLife: { walkabilityScore: 'Low', crimeIndex: 'Very Low', schoolRating: 'Excellent', amenityProximity: 'Car-dependent', averageCommuteTime: 25, greenSpaceAccess: 'Excellent', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 120 }, cities: [{ name: 'Manchester', averageRent: 1900 }, { name: 'Nashua', averageRent: 2000 }] }, 'New Jersey': { averageRent: 2027, type: 'expensive', historicalTrend: 'Consistently expensive, steady growth.', qualityOfLife: { walkabilityScore: 'High', crimeIndex: 'Low', schoolRating: 'Excellent', amenityProximity: 'Excellent', averageCommuteTime: 30, greenSpaceAccess: 'Good', publicTransitAvailability: 'Good', airQualityIndex: 'Good', costOfLivingIndex: 125 }, cities: [{ name: 'Newark', averageRent: 1800 }, { name: 'Jersey City', averageRent: 2800 }, { name: 'Paterson', averageRent: 1500 }, { name: 'Elizabeth', averageRent: 1700 }, { name: 'Trenton', averageRent: 1400 }] }, 'New Mexico': { averageRent: 1300, type: 'mixed', historicalTrend: 'Moderate growth, mixed affordability.', qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Mixed', averageCommuteTime: 20, greenSpaceAccess: 'Good', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 90 }, cities: [{ name: 'Albuquerque', averageRent: 1350 }, { name: 'Las Cruces', averageRent: 1000 }] }, 'New York': { averageRent: 2765, type: 'expensive', historicalTrend: 'Very expensive, especially NYC metro.', qualityOfLife: { walkabilityScore: 'Very High', crimeIndex: 'Moderate', schoolRating: 'Above Average', amenityProximity: 'Excellent', averageCommuteTime: 35, greenSpaceAccess: 'Good', publicTransitAvailability: 'Excellent', airQualityIndex: 'Good', costOfLivingIndex: 150 }, cities: [{ name: 'New York City', averageRent: 4035 }, { name: 'Buffalo', averageRent: 1300 }, { name: 'Rochester', averageRent: 1250 }, { name: 'Yonkers', averageRent: 2200 }, { name: 'Syracuse', averageRent: 1100 }, { name: 'Albany', averageRent: 1400 }, { name: 'New Rochelle', averageRent: 2500 }, { name: 'Mount Vernon', averageRent: 2000 }, { name: 'Schenectady', averageRent: 1150 }, { name: 'Utica', averageRent: 900 }] }, 'North Carolina': { averageRent: 1500, type: 'mixed', historicalTrend: 'Strong tech hub growth.', qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Moderate', schoolRating: 'Above Average', amenityProximity: 'Good', averageCommuteTime: 25, greenSpaceAccess: 'Good', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 95 }, cities: [{ name: 'Charlotte', averageRent: 1600 }, { name: 'Raleigh', averageRent: 1550 }, { name: 'Greensboro', averageRent: 1200 }, { name: 'Durham', averageRent: 1500 }, { name: 'Winston-Salem', averageRent: 1100 }] }, 'North Dakota': { averageRent: 935, type: 'affordable', historicalTrend: 'Consistently affordable, low growth.', qualityOfLife: { walkabilityScore: 'Low', crimeIndex: 'Low', schoolRating: 'Average', amenityProximity: 'Car-dependent', averageCommuteTime: 15, greenSpaceAccess: 'Good', publicTransitAvailability: 'None', airQualityIndex: 'Good', costOfLivingIndex: 90 }, cities: [{ name: 'Fargo', averageRent: 980 }, { name: 'Bismarck', averageRent: 950 }] }, 'Ohio': { averageRent: 1350, type: 'affordable', historicalTrend: 'Midwest increases (Cincinnati).', qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Mixed', averageCommuteTime: 22, greenSpaceAccess: 'Good', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 90 }, cities: [{ name: 'Columbus', averageRent: 1400 }, { name: 'Cleveland', averageRent: 1100 }, { name: 'Cincinnati', averageRent: 1460 }, { name: 'Toledo', averageRent: 900 }, { name: 'Akron', averageRent: 950 }] }, 'Oklahoma': { averageRent: 895, type: 'affordable', historicalTrend: 'Most affordable state.', qualityOfLife: { walkabilityScore: 'Low', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Car-dependent', averageCommuteTime: 18, greenSpaceAccess: 'Good', publicTransitAvailability: 'None', airQualityIndex: 'Good', costOfLivingIndex: 80 }, cities: [{ name: 'Oklahoma City', averageRent: 994 }, { name: 'Tulsa', averageRent: 1050 }, { name: 'Norman', averageRent: 900 }, { name: 'Broken Arrow', averageRent: 1100 }, { name: 'Lawton', averageRent: 772 }] }, 'Oregon': { averageRent: 1800, type: 'expensive', historicalTrend: 'High growth, now moderating.', qualityOfLife: { walkabilityScore: 'High', crimeIndex: 'Moderate', schoolRating: 'Above Average', amenityProximity: 'Good', averageCommuteTime: 25, greenSpaceAccess: 'Excellent', publicTransitAvailability: 'Good', airQualityIndex: 'Good', costOfLivingIndex: 115 }, cities: [{ name: 'Portland', averageRent: 1900 }, { name: 'Salem', averageRent: 1500 }, { name: 'Eugene', averageRent: 1400 }] }, 'Pennsylvania': { averageRent: 1500, type: 'mixed', historicalTrend: 'Moderate growth, mixed affordability.', qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Good', averageCommuteTime: 28, greenSpaceAccess: 'Good', publicTransitAvailability: 'Good', airQualityIndex: 'Good', costOfLivingIndex: 100 }, cities: [{ name: 'Philadelphia', averageRent: 1800 }, { name: 'Pittsburgh', averageRent: 1300 }, { name: 'Allentown', averageRent: 1400 }, { name: 'Erie', averageRent: 900 }, { name: 'Reading', averageRent: 1100 }] }, 'Rhode Island': { averageRent: 1900, type: 'expensive', historicalTrend: 'Consistent high growth.', qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Low', schoolRating: 'Above Average', amenityProximity: 'Good', averageCommuteTime: 20, greenSpaceAccess: 'Good', publicTransitAvailability: 'Good', airQualityIndex: 'Good', costOfLivingIndex: 115 }, cities: [{ name: 'Providence', averageRent: 1850 }, { name: 'Warwick', averageRent: 1700 }] }, 'South Carolina': { averageRent: 1400, type: 'mixed', historicalTrend: 'Moderate growth, mixed affordability.', qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Mixed', averageCommuteTime: 22, greenSpaceAccess: 'Good', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 90 }, cities: [{ name: 'Charleston', averageRent: 1700 }, { name: 'Columbia', averageRent: 1300 }, { name: 'North Charleston', averageRent: 1500 }] }, 'South Dakota': { averageRent: 974, type: 'affordable', historicalTrend: 'Consistently affordable.', qualityOfLife: { walkabilityScore: 'Low', crimeIndex: 'Low', schoolRating: 'Average', amenityProximity: 'Car-dependent', averageCommuteTime: 15, greenSpaceAccess: 'Good', publicTransitAvailability: 'None', airQualityIndex: 'Good', costOfLivingIndex: 85 }, cities: [{ name: 'Sioux Falls', averageRent: 1050 }, { name: 'Rapid City', averageRent: 1100 }] }, 'Tennessee': { averageRent: 1450, type: 'mixed', historicalTrend: 'Strong growth in metros, moderating.', qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Good', averageCommuteTime: 25, greenSpaceAccess: 'Good', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 95 }, cities: [{ name: 'Nashville', averageRent: 1800 }, { name: 'Memphis', averageRent: 1200 }, { name: 'Knoxville', averageRent: 1300 }, { name: 'Chattanooga', averageRent: 1250 }, { name: 'Clarksville', averageRent: 1100 }] }, 'Texas': { averageRent: 1600, type: 'mixed', historicalTrend: 'Mixed trends, Austin seeing declines.', qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Moderate', schoolRating: 'Average', amenityProximity: 'Good', averageCommuteTime: 28, greenSpaceAccess: 'Good', publicTransitAvailability: 'Medium', airQualityIndex: 'Moderate', costOfLivingIndex: 95 }, cities: [{ name: 'Houston', averageRent: 1500 }, { name: 'San Antonio', averageRent: 1300 }, { name: 'Dallas', averageRent: 1650 }, { name: 'Austin', averageRent: 1385 }, { name: 'Fort Worth', averageRent: 1400 }, { name: 'El Paso', averageRent: 1000 }, { name: 'Arlington', averageRent: 1450 }, { name: 'Corpus Christi', averageRent: 1100 }, { name: 'Plano', averageRent: 1800 }, { name: 'Laredo', averageRent: 950 }] }, 'Utah': { averageRent: 1700, type: 'expensive', historicalTrend: 'High growth, now stabilizing.', qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Low', schoolRating: 'Above Average', amenityProximity: 'Good', averageCommuteTime: 20, greenSpaceAccess: 'Excellent', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 105 }, cities: [{ name: 'Salt Lake City', averageRent: 1650 }, { name: 'West Valley City', averageRent: 1500 }, { name: 'Provo', averageRent: 1400 }] }, 'Vermont': { averageRent: 1700, type: 'mixed', historicalTrend: 'Moderate growth, expensive region.', qualityOfLife: { walkabilityScore: 'Low', crimeIndex: 'Very Low', schoolRating: 'Excellent', amenityProximity: 'Car-dependent', averageCommuteTime: 18, greenSpaceAccess: 'Excellent', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 110 }, cities: [{ name: 'Burlington', averageRent: 1800 }, { name: 'South Burlington', averageRent: 1750 }] }, 'Virginia': { averageRent: 1800, type: 'expensive', historicalTrend: 'Consistent high growth.', qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Low', schoolRating: 'Above Average', amenityProximity: 'Good', averageCommuteTime: 28, greenSpaceAccess: 'Good', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 105 }, cities: [{ name: 'Virginia Beach', averageRent: 1600 }, { name: 'Chesapeake', averageRent: 1700 }, { name: 'Norfolk', averageRent: 1500 }, { name: 'Richmond', averageRent: 1500 }, { name: 'Newport News', averageRent: 1400 }] }, 'Washington': { averageRent: 2965, type: 'expensive', historicalTrend: 'Strong tech economy, high demand.', qualityOfLife: { walkabilityScore: 'High', crimeIndex: 'Moderate', schoolRating: 'Above Average', amenityProximity: 'Excellent', averageCommuteTime: 30, greenSpaceAccess: 'Excellent', publicTransitAvailability: 'Good', airQualityIndex: 'Good', costOfLivingIndex: 130 }, cities: [{ name: 'Seattle', averageRent: 2934 }, { name: 'Spokane', averageRent: 1500 }, { name: 'Tacoma', averageRent: 1800 }] }, 'West Virginia': { averageRent: 914, type: 'affordable', historicalTrend: 'Consistently affordable, low growth.', qualityOfLife: { walkabilityScore: 'Low', crimeIndex: 'Low', schoolRating: 'Average', amenityProximity: 'Car-dependent', averageCommuteTime: 18, greenSpaceAccess: 'Good', publicTransitAvailability: 'None', airQualityIndex: 'Good', costOfLivingIndex: 80 }, cities: [{ name: 'Charleston', averageRent: 950 }, { name: 'Huntington', averageRent: 850 }] }, 'Wisconsin': { averageRent: 1300, type: 'affordable', historicalTrend: 'Affordable, steady growth.', qualityOfLife: { walkabilityScore: 'Medium', crimeIndex: 'Low', schoolRating: 'Average', amenityProximity: 'Mixed', averageCommuteTime: 20, greenSpaceAccess: 'Good', publicTransitAvailability: 'Limited', airQualityIndex: 'Good', costOfLivingIndex: 90 }, cities: [{ name: 'Milwaukee', averageRent: 1200 }, { name: 'Madison', averageRent: 1400 }] }, 'Wyoming': { averageRent: 1200, type: 'affordable', historicalTrend: 'Affordable, stable.', qualityOfLife: { walkabilityScore: 'Low', crimeIndex: 'Very Low', schoolRating: 'Average', amenityProximity: 'Car-dependent', averageCommuteTime: 15, greenSpaceAccess: 'Good', publicTransitAvailability: 'None', airQualityIndex: 'Good', costOfLivingIndex: 95 }, cities: [{ name: 'Cheyenne', averageRent: 1150 }, { name: 'Casper', averageRent: 1000 }] }, }, }; // Mapping for common city name variations to standardized forms const cityAliasMap = { 'st louis': 'St. Louis', 'st. louis': 'St. Louis', 'saint louis': 'St. Louis', 'la': 'Los Angeles', 'nyc': 'New York City', 'sf': 'San Francisco', 'kc': 'Kansas City', 'phx': 'Phoenix', 'nola': 'New Orleans', 'dc': 'Washington', 'atl': 'Atlanta', 'clt': 'Charlotte', 'raleigh nc': 'Raleigh', 'nash': 'Nashville', 'hou': 'Houston', 'sa': 'San Antonio', 'dal': 'Dallas', 'atx': 'Austin', 'dfw': 'Fort Worth', 'el paso': 'El Paso', 'cc': 'Corpus Christi', 'philly': 'Philadelphia', 'pitt': 'Pittsburgh', 'balt': 'Baltimore', 'bos': 'Boston', 'detroit': 'Detroit', 'minny': 'Minneapolis', 'st paul': 'St. Paul', 'okc': 'Oklahoma City', 'pdx': 'Portland', 'sea': 'Seattle', }; // Function to display a custom modal message const showCustomModal = (message) => { setModalMessage(message); setShowModal(true); }; // Function to close the custom modal const closeCustomModal = () => { setShowModal(false); setModalMessage(''); }; // Function to reset all inputs and results const handleReset = () => { setMonthlyIncome(''); setDesiredRent(''); setMonthlyDebt(''); setSelectedState(''); setSelectedCity(''); setAffordabilityResult(null); setAiResponse(''); setLoadingAI(false); setNeedsPercent(50); setWantsPercent(30); setSavingsPercent(20); setCalculationDone(false); setActiveTab('summary'); }; // Helper function to convert string to Title Case const toTitleCase = (str) => { if (!str) return ''; return str.replace( /\w\S*/g, function(txt) { return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase(); } ); }; // Helper function to get quality of life data const getQolData = () => { if (selectedState) { if (selectedCity) { const cityData = rentalMarketData.states[selectedState]?.cities.find( city => city.name.toLowerCase() === selectedCity.toLowerCase() ); return cityData?.qualityOfLife; } return rentalMarketData.states[selectedState]?.qualityOfLife; } return null; }; // Handles the calculation of affordability and triggers AI response const handleCalculate = async () => { const income = parseFloat(monthlyIncome); const rent = parseFloat(desiredRent); const debt = parseFloat(monthlyDebt) || 0; if (isNaN(income) || income <= 0) { showCustomModal('Please enter a valid monthly income.'); return; } if (isNaN(rent) || rent <= 0) { showCustomModal('Please enter a valid desired monthly rent.'); return; } if (isNaN(debt) || debt < 0) { showCustomModal('Please enter a valid monthly debt (or 0 if none).'); return; } setCalculationDone(true); let displayCityName = selectedCity.trim(); if (selectedState && displayCityName) { const normalizedCityFromAlias = cityAliasMap[displayCityName.toLowerCase()]; if (normalizedCityFromAlias) { displayCityName = normalizedCityFromAlias; } const foundCity = rentalMarketData.states[selectedState]?.cities.find( city => city.name.toLowerCase() === displayCityName.toLowerCase() ); if (foundCity) { displayCityName = foundCity.name; } else if (!normalizedCityFromAlias) { displayCityName = toTitleCase(displayCityName); } } setSelectedCity(displayCityName); const incomeAfterDebt = income - debt; if (incomeAfterDebt <= 0) { showCustomModal('Your income after monthly debt is zero or negative. Please review your inputs.'); return; } const rentToIncomeRatio = (rent / incomeAfterDebt) * 100; let status = ''; if (rentToIncomeRatio <= 30) { status = 'Affordable'; } else if (rentToIncomeRatio > 30 && rentToIncomeRatio <= 50) { status = 'Cost-Burdened'; } else { status = 'Severely Cost-Burdened'; } setAffordabilityResult({ ratio: rentToIncomeRatio.toFixed(2), status: status, incomeAfterDebt: incomeAfterDebt.toFixed(2), }); await callGeminiAPI(income, rent, debt, incomeAfterDebt, rentToIncomeRatio, status, displayCityName); }; // Function to call the Gemini API const callGeminiAPI = async (income, rent, debt, incomeAfterDebt, ratio, status, displayCity) => { setLoadingAI(true); setAiResponse(''); // ========================================== // INSERT YOUR API KEY BELOW // ========================================== const apiKey = "AIzaSyC1j2wT0AGAbbhg7UTOXfhuXESjtq19Crk"; // ========================================== let prompt = `As an AI-powered rental market assistant, analyze the following user input and provide actionable tips and insights based on current U.S. rental market trends and the user's financial situation. User's Monthly Income: $${income.toFixed(2)} User's Monthly Debt: $${debt.toFixed(2)} User's Income After Debt: $${incomeAfterDebt.toFixed(2)} User's Desired Monthly Rent: $${rent.toFixed(2)} Calculated Rent-to-Income Ratio (based on income after debt): ${ratio.toFixed(2)}% Affordability Status: ${status} Selected State: ${selectedState || 'Not specified'} Selected City: ${displayCity || 'Not specified'}`; try { let chatHistory = []; chatHistory.push({ role: "user", parts: [{ text: prompt }] }); const payload = { contents: chatHistory }; const apiUrl = `https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-preview-09-2025:generateContent?key=${apiKey}`; const response = await fetch(apiUrl, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(payload) }); const result = await response.json(); if (result.candidates && result.candidates.length > 0 && result.candidates[0].content && result.candidates[0].content.parts && result.candidates[0].content.parts.length > 0) { const text = result.candidates[0].content.parts[0].text; setAiResponse(text); } else { setAiResponse('Could not get AI insights. Please try again.'); } } catch (error) { setAiResponse('Failed to get AI insights due to an error.'); } finally { setLoadingAI(false); } }; // Function to render AI response with specific bolding and highlighting const renderAiTips = (text) => { const lines = text.split('\n'); return lines.map((line, index) => { const trimmedLine = line.trim(); if (trimmedLine === '' || trimmedLine.startsWith('**')) return null; const match = trimmedLine.match(/^(\d+\.\s)(.*?):(.*)/); if (match) { const boldPart = match[2].trim(); const restOfTip = match[3]; return (
{boldPart}:{restOfTip}
{simpleMatch[2]}
{trimmedLine}
; }); }; const budgetData = useMemo(() => { const incomeNum = parseFloat(monthlyIncome) || 0; const debtNum = parseFloat(monthlyDebt) || 0; const incomeAfterDebt = incomeNum > debtNum ? incomeNum - debtNum : 0; return { incomeAfterDebt: incomeAfterDebt.toFixed(2), needsAmount: (incomeAfterDebt * (needsPercent / 100)).toFixed(2), wantsAmount: (incomeAfterDebt * (wantsPercent / 100)).toFixed(2), savingsAmount: (incomeAfterDebt * (savingsPercent / 100)).toFixed(2), }; }, [monthlyIncome, monthlyDebt, needsPercent, wantsPercent, savingsPercent]); return (Analyze your budget, get AI-powered insights, and plan your next move.
Income After Debt: ${affordabilityResult.incomeAfterDebt}
Desired Rent of ${desiredRent} is {affordabilityResult.ratio}% of your available income.
Status: {affordabilityResult.status}
(A 30% ratio is generally considered affordable.)
Generating personalized tips...
Based on the 50/30/20 rule. Adjust the sliders to fit your lifestyle.
Rent, Utilities, Groceries
setNeedsPercent(parseInt(e.target.value))} className="w-full h-2 bg-slate-700 rounded-lg appearance-none cursor-pointer accent-sky-500" />${budgetData.needsAmount}
Dining, Entertainment
setWantsPercent(parseInt(e.target.value))} className="w-full h-2 bg-slate-700 rounded-lg appearance-none cursor-pointer accent-teal-500" />${budgetData.wantsAmount}
Investments, Debt Repayment
setSavingsPercent(parseInt(e.target.value))} className="w-full h-2 bg-slate-700 rounded-lg appearance-none cursor-pointer accent-indigo-500" />${budgetData.savingsAmount}
Total Budgeted: ${(parseFloat(budgetData.needsAmount) + parseFloat(budgetData.wantsAmount) + parseFloat(budgetData.savingsAmount)).toFixed(2)} / Available: ${budgetData.incomeAfterDebt}
The average rent in {selectedState} is around ${rentalMarketData.states[selectedState].averageRent}. {rentalMarketData.states[selectedState].historicalTrend}
Walkability: {getQolData().walkabilityScore}
Crime Index: {getQolData().crimeIndex}
School Rating: {getQolData().schoolRating}
Commute: {getQolData().averageCommuteTime} min
Cost of Living: {getQolData().costOfLivingIndex}
Green Space: {getQolData().greenSpaceAccess}
Note: These metrics are illustrative.
{modalMessage}