import { useState } from 'react';
interface SquarespaceWidgetProps {
companyName?: string;
companyPhone?: string;
companyEmail?: string;
primaryColor?: string;
accentColor?: string;
showCTA?: boolean;
compact?: boolean;
}
export function SquarespaceWidget({
companyName = "Home Builders Pro",
companyPhone = "(555) 123-4567",
companyEmail = "info@homebuilders.com",
primaryColor = "#3b82f6",
accentColor = "#1e40af",
showCTA = true,
compact = false
}: SquarespaceWidgetProps) {
const [activeStep, setActiveStep] = useState<number | null>(null);
const homeImprovementProcess = [
{
id: 1,
title: "Initial Consultation",
description: "We discuss your vision, needs, and budget to create a tailored plan for your project.",
icon: "💬",
duration: "1-2 days",
details: [
"In-home assessment and measurements",
"Discussion of your goals and preferences",
"Budget planning and timeline overview",
"Initial design concepts and ideas"
]
},
{
id: 2,
title: "Design & Planning",
description: "Our team creates detailed designs and obtains all necessary permits and approvals.",
icon: "📐",
duration: "1-2 weeks",
details: [
"3D renderings and detailed plans",
"Material selection and sourcing",
"Permit applications and approvals",
"Final contract and timeline confirmation"
]
},
{
id: 3,
title: "Preparation & Setup",
description: "We prepare your space and set up our work area with safety measures in place.",
icon: "🔧",
duration: "1-2 days",
details: [
"Site protection and safety setup",
"Material delivery and staging",
"Utility marking and disconnection if needed",
"Final walkthrough and project kickoff"
]
},
{
id: 4,
title: "Construction & Installation",
description: "Our skilled craftsmen bring your vision to life with quality workmanship.",
icon: "🏗️",
duration: "2-8 weeks",
details: [
"Daily progress updates and communication",
"Quality control at each phase",
"Regular cleanup and site maintenance",
"Flexible scheduling around your needs"
]
},
{
id: 5,
title: "Final Inspection & Completion",
description: "We ensure everything meets our high standards and your complete satisfaction.",
icon: "✅",
duration: "1-2 days",
details: [
"Comprehensive quality inspection",
"Final walkthrough with you",
"Touch-ups and final adjustments",
"Warranty and maintenance information"
]
}
];
const generateSquarespaceCode = () => {
return `<!-- Home Improvement Process Widget for Squarespace -->
<style>
.hiw-widget {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
line-height: 1.6;
color: #333;
max-width: 1200px;
margin: 0 auto;
padding: 2rem 1rem;
--primary-color: ${primaryColor};
--accent-color: ${accentColor};
}
.hiw-widget * {
box-sizing: border-box;
}
.hiw-header {
text-align: center;
margin-bottom: 3rem;
}
.hiw-company-name {
display: flex;
align-items: center;
justify-content: center;
gap: 0.5rem;
font-size: 1.5rem;
font-weight: 600;
margin-bottom: 1rem;
color: var(--primary-color);
}
.hiw-title {
font-size: ${compact ? '1.75rem' : '2.25rem'};
font-weight: 700;
margin-bottom: 1rem;
color: #1a1a1a;
}
.hiw-subtitle {
font-size: ${compact ? '1rem' : '1.125rem'};
color: #6b7280;
max-width: 42rem;
margin: 0 auto;
}
${showCTA ? `
.hiw-cta-banner {
background: linear-gradient(to right, ${primaryColor}08, ${accentColor}08);
border: 2px solid ${primaryColor}40;
border-radius: 0.75rem;
padding: 2rem;
margin-bottom: 3rem;
display: flex;
align-items: center;
justify-content: space-between;
flex-wrap: wrap;
gap: 1.5rem;
}
.hiw-cta-content h3 {
font-size: 1.25rem;
font-weight: 600;
margin-bottom: 0.5rem;
color: #1a1a1a;
}
.hiw-cta-buttons {
display: flex;
gap: 0.75rem;
flex-wrap: wrap;
}
.hiw-btn {
padding: 0.75rem 1.5rem;
border-radius: 0.5rem;
font-weight: 500;
text-decoration: none;
display: inline-flex;
align-items: center;
gap: 0.5rem;
cursor: pointer;
border: none;
transition: all 0.2s;
font-size: 0.875rem;
}
.hiw-btn-primary {
background-color: var(--primary-color);
color: white;
}
.hiw-btn-outline {
border: 2px solid var(--primary-color);
color: var(--primary-color);
background: white;
}
.hiw-btn:hover {
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
}
` : ''}
.hiw-process-header {
text-align: center;
margin-bottom: 2rem;
}
.hiw-process-header h2 {
font-size: ${compact ? '1.5rem' : '1.875rem'};
font-weight: 700;
margin-bottom: 0.5rem;
color: #1a1a1a;
}
.hiw-step {
background: white;
border: 1px solid #e5e7eb;
border-radius: 0.75rem;
padding: ${compact ? '1.5rem' : '2rem'};
margin-bottom: 1rem;
cursor: pointer;
transition: all 0.2s;
border-left: 4px solid var(--primary-color);
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
}
.hiw-step:hover {
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
}
.hiw-step-active {
border-color: var(--primary-color);
box-shadow: 0 0 0 3px ${primaryColor}20;
}
.hiw-step-header {
display: flex;
align-items: flex-start;
gap: 1rem;
margin-bottom: 1rem;
}
.hiw-step-icon {
font-size: 1.5rem;
width: 3rem;
height: 3rem;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
background: ${primaryColor}15;
flex-shrink: 0;
}
.hiw-step-content {
flex: 1;
}
.hiw-step-title {
font-size: ${compact ? '1.125rem' : '1.25rem'};
font-weight: 600;
margin-bottom: 0.5rem;
color: #1a1a1a;
}
.hiw-step-duration {
background: #f3f4f6;
color: #374151;
padding: 0.25rem 0.75rem;
border-radius: 1rem;
font-size: 0.875rem;
margin-left: 1rem;
display: inline-block;
}
.hiw-step-description {
color: #6b7280;
margin-bottom: 1rem;
font-size: ${compact ? '0.875rem' : '1rem'};
}
.hiw-step-details {
list-style: none;
padding: 0;
margin: 0;
}
.hiw-step-details li {
padding: 0.25rem 0;
padding-left: 1rem;
position: relative;
font-size: 0.875rem;
color: #4b5563;
}
.hiw-step-details li:before {
content: "•";
color: var(--primary-color);
position: absolute;
left: 0;
font-weight: bold;
}
.hiw-timeline-summary {
background: white;
border: 1px solid #e5e7eb;
border-radius: 0.75rem;
padding: 2rem;
margin-bottom: 2rem;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
}
.hiw-timeline-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(${compact ? '120px' : '150px'}, 1fr));
gap: 1rem;
margin-bottom: 1.5rem;
}
.hiw-timeline-item {
text-align: center;
}
.hiw-timeline-icon {
width: 3rem;
height: 3rem;
margin: 0 auto 0.5rem;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-size: 1.25rem;
background: ${primaryColor}15;
}
.hiw-timeline-notice {
background: ${primaryColor}08;
padding: 1rem;
border-radius: 0.5rem;
display: flex;
align-items: flex-start;
gap: 0.5rem;
color: ${accentColor};
}
.hiw-trust-indicators {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 1.5rem;
}
.hiw-trust-item {
background: white;
border: 1px solid #e5e7eb;
border-radius: 0.75rem;
padding: 1.5rem;
text-align: center;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
}
.hiw-trust-icon {
font-size: 2rem;
margin-bottom: 0.5rem;
}
.hiw-trust-title {
font-weight: 600;
margin-bottom: 0.25rem;
color: #1a1a1a;
}
@media (max-width: 768px) {
.hiw-widget {
padding: 1rem 0.5rem;
}
${showCTA ? `
.hiw-cta-banner {
flex-direction: column;
text-align: center;
padding: 1.5rem;
}
` : ''}
.hiw-step-header {
flex-direction: column;
text-align: center;
}
.hiw-timeline-grid {
grid-template-columns: repeat(2, 1fr);
}
.hiw-step {
padding: 1rem;
}
}
</style>
<div class="hiw-widget">
<!-- Header -->
<div class="hiw-header">
<div class="hiw-company-name">
🏠 ${companyName}
</div>
<h1 class="hiw-title">Our Proven Process</h1>
<p class="hiw-subtitle">
From initial consultation to final walkthrough, we guide you through every step
of your home improvement journey with transparency and expertise.
</p>
</div>
${showCTA ? `
<!-- CTA Banner -->
<div class="hiw-cta-banner">
<div class="hiw-cta-content">
<h3>Ready to Get Started?</h3>
<p style="color: #6b7280; margin: 0;">Schedule your free consultation and let's bring your vision to life.</p>
</div>
<div class="hiw-cta-buttons">
<a href="tel:${companyPhone}" class="hiw-btn hiw-btn-primary">
📅 Schedule Consultation
</a>
<a href="tel:${companyPhone}" class="hiw-btn hiw-btn-outline">
📞 Call Now
</a>
</div>
</div>
` : ''}
<!-- Process Steps -->
<div class="hiw-process-section">
<div class="hiw-process-header">
<h2>How We Work</h2>
<p style="color: #6b7280; margin: 0;">${compact ? 'Our step-by-step process' : 'Click on any step to learn more about what to expect'}</p>
</div>
<div class="hiw-steps">
${homeImprovementProcess.map(step => `
<div class="hiw-step" onclick="toggleStep(${step.id})">
<div class="hiw-step-header">
<div class="hiw-step-icon">${step.icon}</div>
<div class="hiw-step-content">
<div style="display: flex; align-items: center; flex-wrap: wrap; gap: 0.5rem;">
<h3 class="hiw-step-title">${step.title}</h3>
<span class="hiw-step-duration">${step.duration}</span>
</div>
<p class="hiw-step-description">${step.description}</p>
<ul class="hiw-step-details" id="details-${step.id}" style="display: none;">
${step.details.map(detail => `<li>${detail}</li>`).join('')}
</ul>
</div>
</div>
</div>
`).join('')}
</div>
</div>
<!-- Timeline Summary -->
<div class="hiw-timeline-summary">
<h3 style="font-size: ${compact ? '1.125rem' : '1.25rem'}; font-weight: 600; margin-bottom: 1rem; color: #1a1a1a;">Project Timeline Overview</h3>
<div class="hiw-timeline-grid">
${homeImprovementProcess.map(step => `
<div class="hiw-timeline-item">
<div class="hiw-timeline-icon">${step.icon}</div>
<div style="font-size: ${compact ? '0.75rem' : '0.875rem'}; font-weight: 500; margin-bottom: 0.25rem; color: #1a1a1a;">${compact ? step.title.split(' ')[0] : step.title}</div>
<div style="background: #f3f4f6; color: #374151; padding: 0.25rem 0.5rem; border-radius: 1rem; font-size: 0.75rem; display: inline-block;">
${step.duration}
</div>
</div>
`).join('')}
</div>
<div class="hiw-timeline-notice">
<div>
📅 <strong>Typical Project Duration: 4-12 weeks</strong>
<br><small style="margin-left: 1.5rem;">Timeline varies based on project scope and complexity. We'll provide a detailed schedule during consultation.</small>
</div>
</div>
</div>
<!-- Trust Indicators -->
<div class="hiw-trust-indicators">
<div class="hiw-trust-item">
<div class="hiw-trust-icon">⭐</div>
<h4 class="hiw-trust-title">5-Star Rated</h4>
<p style="font-size: ${compact ? '0.75rem' : '0.875rem'}; color: #6b7280; margin: 0;">Over 200 happy customers</p>
</div>
<div class="hiw-trust-item">
<div class="hiw-trust-icon">🏆</div>
<h4 class="hiw-trust-title">Award Winning</h4>
<p style="font-size: ${compact ? '0.75rem' : '0.875rem'}; color: #6b7280; margin: 0;">Best contractor 2023</p>
</div>
<div class="hiw-trust-item">
<div class="hiw-trust-icon">🛡️</div>
<h4 class="hiw-trust-title">Fully Licensed</h4>
<p style="font-size: ${compact ? '0.75rem' : '0.875rem'}; color: #6b7280; margin: 0;">Insured & bonded</p>
</div>
</div>
${showCTA ? `
<!-- Bottom CTA -->
<div style="text-align: center; padding-top: 2rem; border-top: 1px solid #e5e7eb; margin-top: 2rem;">
<p style="color: #6b7280; margin-bottom: 1rem;">
Ready to transform your home? Let's discuss your project today.
</p>
<div style="display: flex; gap: 0.75rem; justify-content: center; flex-wrap: wrap;">
<a href="mailto:${companyEmail}?subject=Free Quote Request" class="hiw-btn hiw-btn-primary">
Get Free Quote
</a>
<a href="tel:${companyPhone}" class="hiw-btn hiw-btn-outline">
${companyPhone}
</a>
</div>
</div>
` : ''}
</div>
<script>
let activeStep = null;
function toggleStep(stepId) {
const details = document.getElementById('details-' + stepId);
const step = details.closest('.hiw-step');
if (activeStep === stepId) {
// Close current step
details.style.display = 'none';
step.classList.remove('hiw-step-active');
activeStep = null;
} else {
// Close previous step if any
if (activeStep !== null) {
const prevDetails = document.getElementById('details-' + activeStep);
const prevStep = prevDetails.closest('.hiw-step');
prevDetails.style.display = 'none';
prevStep.classList.remove('hiw-step-active');
}
// Open new step
details.style.display = 'block';
step.classList.add('hiw-step-active');
activeStep = stepId;
}
}
</script>`;
};
return (
<div className="bg-white rounded-lg border p-6">
<h3 className="text-lg mb-4">Squarespace Code Preview</h3>
<p className="text-muted-foreground mb-4">
This is how your widget will look when embedded in Squarespace. The code below contains everything needed - just copy and paste it into a code block.
</p>
{/* Widget Preview */}
<div className="border rounded-lg p-4 mb-6 bg-gray-50">
<div
className="w-full mx-auto space-y-8 max-w-4xl"
style={{
'--primary-color': primaryColor,
'--accent-color': accentColor
} as React.CSSProperties}
>
{/* Header */}
<div className="text-center space-y-4">
<div className="flex items-center justify-center gap-2 mb-4" style={{ color: primaryColor }}>
<span className="text-2xl">🏠</span>
<span className="text-2xl font-semibold">{companyName}</span>
</div>
<h1 className={`${compact ? 'text-2xl' : 'text-3xl'} font-bold`}>Our Proven Process</h1>
<p className={`${compact ? 'text-base' : 'text-lg'} text-muted-foreground max-w-2xl mx-auto`}>
From initial consultation to final walkthrough, we guide you through every step
of your home improvement journey with transparency and expertise.
</p>
</div>
{/* Process Steps Preview */}
<div className="space-y-4">
{homeImprovementProcess.map((step, index) => (
<div
key={step.id}
className="bg-white border rounded-lg p-4 border-l-4 cursor-pointer hover:shadow-md transition-all"
style={{ borderLeftColor: primaryColor }}
onClick={() => setActiveStep(activeStep === step.id ? null : step.id)}
>
<div className="flex items-start gap-4">
<div
className="w-12 h-12 rounded-full flex items-center justify-center text-xl flex-shrink-0"
style={{ backgroundColor: `${primaryColor}15` }}
>
{step.icon}
</div>
<div className="flex-1">
<div className="flex items-center gap-3 mb-2">
<h3 className="font-semibold">{step.title}</h3>
<span className="bg-gray-100 text-gray-800 px-3 py-1 rounded-full text-sm">
{step.duration}
</span>
</div>
<p className="text-muted-foreground mb-2">{step.description}</p>
{activeStep === step.id && (
<ul className="space-y-1">
{step.details.map((detail, idx) => (
<li key={idx} className="flex items-start gap-2 text-sm">
<span style={{ color: primaryColor }}>•</span>
<span>{detail}</span>
</li>
))}
</ul>
)}
</div>
</div>
</div>
))}
</div>
</div>
</div>
{/* Copy Code Button */}
<div className="flex justify-end">
<button
onClick={() => navigator.clipboard.writeText(generateSquarespaceCode())}
className="px-4 py-2 bg-blue-600 text-white rounded-lg hover:bg-blue-700 transition-colors"
>
Copy Squarespace Code
</button>
</div>
</div>
);
}