<!DOCTYPE html>
<html lang="en" class="scroll-smooth">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Prime Handyman Service LLC | Premium Home Repairs & Maintenance</title>
<script src="https://cdn.tailwindcss.com"></script>
<script>
tailwind.config = {
theme: {
extend: {
colors: {
'prime-navy': '#1e3a5f',
'prime-gold': '#d4a84b',
}
}
}
}
</script>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet">
<style>
body {
font-family: 'Inter', sans-serif;
}
</style>
<script src="https://cdn.jsdelivr.net/npm/@supabase/supabase-js@2"></script>
</head>
<body class="bg-gray-50 text-gray-900 flex flex-col min-h-screen">
<header class="bg-white border-b border-gray-200 sticky top-0 z-50 shadow-sm">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 h-20 flex items-center justify-between">
<div class="flex items-center space-x-2">
<svg class="h-8 w-8 text-prime-gold" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
<path stroke-linecap="round" stroke-linejoin="round" d="M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.381-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z" />
</svg>
<span class="text-xl font-bold text-prime-navy tracking-tight">Prime Handyman</span>
</div>
<nav class="hidden md:flex space-x-8 items-center">
<a href="#services" class="text-gray-600 hover:text-prime-navy font-medium transition">Our Services</a>
<a href="#contact" class="bg-prime-navy text-white px-5 py-2.5 rounded-md font-medium hover:bg-opacity-90 transition shadow-sm border border-transparent hover:border-prime-gold">Get a Quote</a>
</nav>
</div>
</header>
<main class="flex-grow">
<section class="bg-prime-navy text-white py-20 lg:py-32 relative overflow-hidden">
<div class="absolute inset-0 bg-opacity-10 bg-[radial-gradient(#d4a84b_1px,transparent_1px)] [background-size:16px_16px]"></div>
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 relative z-10">
<div class="lg:w-2/3">
<span class="text-prime-gold uppercase tracking-widest font-semibold text-sm block mb-3">Premium Home Care & Upgrades</span>
<h1 class="text-4xl sm:text-5xl lg:text-6xl font-bold tracking-tight text-white mb-6">
Professional Property Solutions, <span class="text-prime-gold">Executed Perfectly.</span>
</h1>
<p class="text-lg sm:text-xl text-gray-300 mb-8 max-w-2xl">
From urgent residential repairs to seamless commercial installations, Prime Handyman Service LLC delivers elite craftsmanship to homeowners across Arizona.
</p>
<div class="flex flex-col sm:flex-row space-y-4 sm:space-y-0 sm:space-x-4">
<a href="#contact" class="bg-prime-gold text-prime-navy text-center font-bold px-8 py-4 rounded-md shadow-md hover:bg-white transition">
Schedule a Service
</a>
<a href="#services" class="border border-gray-400 text-center text-white font-medium px-8 py-4 rounded-md hover:bg-white hover:text-prime-navy transition">
Explore Services
</a>
</div>
</div>
</div>
</section>
<section id="services" class="py-20 bg-white">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="text-center max-w-3xl mx-auto mb-16">
<h2 class="text-3xl sm:text-4xl font-bold text-prime-navy mb-4">Our Professional Expertise</h2>
<div class="w-24 h-1 bg-prime-gold mx-auto mb-6"></div>
<p class="text-gray-600">We handle your property to-do list with licensed precision, high-quality materials, and exceptional customer service.</p>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
<div class="p-8 border border-gray-100 rounded-xl bg-gray-50 shadow-sm hover:shadow-md transition">
<div class="w-12 h-12 bg-prime-navy rounded-lg flex items-center justify-center text-prime-gold mb-6">
<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 5H6a2 2 0 00-2 2v11a2 2 0 002 2h11a2 2 0 002-2v-5m-1.414-9.414a2 2 0 112.828 2.828L11.828 15H9v-2.828l8.586-8.586z"></path></svg>
</div>
<h3 class="text-xl font-bold text-prime-navy mb-3">General Home Repairs</h3>
<p class="text-gray-600 text-sm leading-relaxed">Drywall patching, door adjustments, hardware upgrades, and structural touch-ups executed to flawless standards.</p>
</div>
<div class="p-8 border border-gray-100 rounded-xl bg-gray-50 shadow-sm hover:shadow-md transition">
<div class="w-12 h-12 bg-prime-navy rounded-lg flex items-center justify-center text-prime-gold mb-6">
<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 11H5m14 0a2 2 0 012 2v6a2 2 0 01-2 2H5a2 2 0 01-2-2v-6a2 2 0 012-2m14 0V9a2 2 0 00-2-2M5 11V9a2 2 0 012-2m0 0V5a2 2 0 012-2h6a2 2 0 012 2v2M7 7h10</path></svg>
</div>
<h3 class="text-xl font-bold text-prime-navy mb-3">Smart Appliance Installations</h3>
<p class="text-gray-600 text-sm leading-relaxed">Mounting modern smart TVs, configuring custom lighting fixtures, smart thermostats, and appliance hookups.</p>
</div>
<div class="p-8 border border-gray-100 rounded-xl bg-gray-50 shadow-sm hover:shadow-md transition">
<div class="w-12 h-12 bg-prime-navy rounded-lg flex items-center justify-center text-prime-gold mb-6">
<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6</path></svg>
</div>
<h3 class="text-xl font-bold text-prime-navy mb-3">Carpentry & Assembly</h3>
<p class="text-gray-600 text-sm leading-relaxed">Precision furniture assembly, custom shelving design, premium trim work, and detailed baseboard integration.</p>
</div>
</div>
</div>
</section>
<section id="contact" class="py-20 bg-gray-50 border-t border-gray-200">
<div class="max-w-3xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="bg-white rounded-2xl shadow-xl border border-gray-100 overflow-hidden p-8 sm:p-12">
<div class="text-center mb-10">
<h2 class="text-3xl font-bold text-prime-navy mb-2">Request an Estimate</h2>
<p class="text-gray-500 text-sm">Fill out the secure form below. Our operations team will respond within 2-4 business hours.</p>
</div>
<form id="leadForm" class="space-y-6">
<div class="grid grid-cols-1 sm:grid-cols-2 gap-6">
<div>
<label for="name" class="block text-sm font-semibold text-gray-700 mb-2">Full Name *</label>
<input type="text" id="name" required class="w-full px-4 py-3 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-prime-navy focus:border-prime-navy transition">
</div>
<div>
<label for="email" class="block text-sm font-semibold text-gray-700 mb-2">Email Address *</label>
<input type="email" id="email" required class="w-full px-4 py-3 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-prime-navy focus:border-prime-navy transition">
</div>
</div>
<div class="grid grid-cols-1 sm:grid-cols-2 gap-6">
<div>
<label for="phone" class="block text-sm font-semibold text-gray-700 mb-2">Phone Number *</label>
<input type="tel" id="phone" required class="w-full px-4 py-3 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-prime-navy focus:border-prime-navy transition">
</div>
<div>
<label for="zip" class="block text-sm font-semibold text-gray-700 mb-2">ZIP Code *</label>
<input type="text" id="zip" pattern="[0-9]{5}" required title="Five digit zip code" class="w-full px-4 py-3 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-prime-navy focus:border-prime-navy transition">
</div>
</div>
<div>
<label for="message" class="block text-sm font-semibold text-gray-700 mb-2">Project Details & Scope *</label>
<textarea id="message" rows="4" required placeholder="Please describe the repairs or installation services you need..." class="w-full px-4 py-3 border border-gray-300 rounded-lg shadow-sm focus:outline-none focus:ring-2 focus:ring-prime-navy focus:border-prime-navy transition"></textarea>
</div>
<div>
<button type="submit" id="submitBtn" class="w-full bg-prime-navy text-white font-bold py-4 rounded-lg shadow-md hover:bg-opacity-95 focus:outline-none focus:ring-4 focus:ring-blue-200 transition flex items-center justify-center space-x-2 disabled:opacity-50 disabled:cursor-not-allowed">
<span id="btnText">Submit Request</span>
<span id="spinner" class="hidden animate-spin rounded-full h-5 w-5 border-b-2 border-white"></span>
</button>
</div>
</form>
<div id="formAlert" class="mt-6 hidden p-4 rounded-lg text-sm font-medium transition-all duration-300"></div>
</div>
</div>
</section>
</main>
<footer class="bg-prime-navy text-gray-400 py-12 border-t border-gray-800">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 text-center sm:text-left flex flex-col sm:flex-row justify-between items-center space-y-4 sm:space-y-0">
<p class="text-sm">© 2026 Prime Handyman Service LLC. All rights reserved. Servicing Arizona.</p>
<p class="text-xs text-gray-500">Domain: <a href="https://prime-handyman-az.com" class="hover:underline text-prime-gold">prime-handyman-az.com</a></p>
</div>
</footer>
<script>
// 1. SUPABASE ARCHITECTURE CONFIGURATION
// Replace these empty strings with your actual client-side credentials from the Supabase Dashboard
const SUPABASE_URL = 'YOUR_SUPABASE_URL';
const SUPABASE_ANON_KEY = 'YOUR_SUPABASE_ANON_KEY';
let supabase = null;
// Gracefully initialize Supabase client if keys are present
if (SUPABASE_URL !== 'YOUR_SUPABASE_URL' && SUPABASE_ANON_KEY !== 'YOUR_SUPABASE_ANON_KEY') {
supabase = window.supabase.createClient(SUPABASE_URL, SUPABASE_ANON_KEY);
} else {
console.warn("PrimeOps CRM Alert: Supabase integration is currently inactive. Please insert your valid URL and Anon Key inside the script tag.");
}
// 2. DOM ELEMENT SELECTORS
const leadForm = document.getElementById('leadForm');
const submitBtn = document.getElementById('submitBtn');
const btnText = document.getElementById('btnText');
const spinner = document.getElementById('spinner');
const formAlert = document.getElementById('formAlert');
// 3. SECURE FORM SUBMISSION INTERACTION
leadForm.addEventListener('submit', async (e) => {
e.preventDefault();
// Guardrail check for configuration
if (!supabase) {
showAlert('Configuration Error: Supabase URL/Key placeholders have not been replaced.', 'error');
return;
}
// UI UX State: Disable submit workflow
setLoadingState(true);
hideAlert();
// Extract values directly from form schema
const submissionData = {
name: document.getElementById('name').value.trim(),
email: document.getElementById('email').value.trim(),
phone: document.getElementById('phone').value.trim(),
zip_code: document.getElementById('zip').value.trim(),
message: document.getElementById('message').value.trim(),
created_at: new Date().toISOString()
};
try {
// Post asynchronous insertion payload into Supabase custom table schema
const { error } = await supabase
.from('contact_submissions')
.insert([submissionData]);
if (error) throw error;
// UX Success Feedback Loop
showAlert('Thank you! Your request has been securely transmitted. A team coordinator will reach out shortly.', 'success');
leadForm.reset();
} catch (err) {
console.error('Database insertion breakdown:', err);
showAlert(`Submission failed: ${err.message || 'Please check connection properties and try again.'}`, 'error');
} finally {
// Return interface interaction status to original form parameters
setLoadingState(false);
}
});
// 4. INTERFACE HELPER METHODS
function setLoadingState(isLoading) {
submitBtn.disabled = isLoading;
if (isLoading) {
btnText.textContent = "Processing Request...";
spinner.classList.remove('hidden');
} else {
btnText.textContent = "Submit Request";
spinner.classList.add('hidden');
}
}
function showAlert(message, type) {
formAlert.textContent = message;
formAlert.classList.remove('hidden', 'bg-green-100', 'text-green-800', 'border', 'border-green-200', 'bg-red-100', 'text-red-800', 'border-red-200');
if (type === 'success') {
formAlert.classList.add('bg-green-100', 'text-green-800', 'border', 'border-green-200');
} else {
formAlert.classList.add('bg-red-100', 'text-red-800', 'border', 'border-red-200');
}
}
function hideAlert() {
formAlert.classList.add('hidden');
}
</script>
</body>
</html>