@aws505/sheetsite 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +105 -0
- package/dist/components/index.js +1696 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/index.mjs +1630 -0
- package/dist/components/index.mjs.map +1 -0
- package/dist/config/index.js +1840 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/index.mjs +1793 -0
- package/dist/config/index.mjs.map +1 -0
- package/dist/data/index.js +1296 -0
- package/dist/data/index.js.map +1 -0
- package/dist/data/index.mjs +1220 -0
- package/dist/data/index.mjs.map +1 -0
- package/dist/index.js +5433 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +5285 -0
- package/dist/index.mjs.map +1 -0
- package/dist/seo/index.js +187 -0
- package/dist/seo/index.js.map +1 -0
- package/dist/seo/index.mjs +155 -0
- package/dist/seo/index.mjs.map +1 -0
- package/dist/theme/index.js +552 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/index.mjs +526 -0
- package/dist/theme/index.mjs.map +1 -0
- package/package.json +96 -0
- package/src/components/index.ts +41 -0
- package/src/components/layout/Footer.tsx +234 -0
- package/src/components/layout/Header.tsx +134 -0
- package/src/components/sections/FAQ.tsx +178 -0
- package/src/components/sections/Gallery.tsx +107 -0
- package/src/components/sections/Hero.tsx +202 -0
- package/src/components/sections/Hours.tsx +225 -0
- package/src/components/sections/Services.tsx +216 -0
- package/src/components/sections/Testimonials.tsx +184 -0
- package/src/components/ui/Button.tsx +158 -0
- package/src/components/ui/Card.tsx +162 -0
- package/src/components/ui/Icons.tsx +508 -0
- package/src/config/index.ts +207 -0
- package/src/config/presets/generic.ts +153 -0
- package/src/config/presets/home-kitchen.ts +154 -0
- package/src/config/presets/index.ts +708 -0
- package/src/config/presets/professional.ts +165 -0
- package/src/config/presets/repair.ts +160 -0
- package/src/config/presets/restaurant.ts +162 -0
- package/src/config/presets/salon.ts +178 -0
- package/src/config/presets/tailor.ts +159 -0
- package/src/config/types.ts +314 -0
- package/src/data/csv-parser.ts +154 -0
- package/src/data/defaults.ts +202 -0
- package/src/data/google-drive.ts +148 -0
- package/src/data/index.ts +535 -0
- package/src/data/sheets.ts +709 -0
- package/src/data/types.ts +379 -0
- package/src/seo/index.ts +272 -0
- package/src/theme/colors.ts +351 -0
- package/src/theme/index.ts +249 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/theme/colors.ts","../src/data/types.ts","../src/data/csv-parser.ts","../src/data/google-drive.ts","../src/data/sheets.ts","../src/data/defaults.ts","../src/data/index.ts","../src/config/presets/tailor.ts","../src/config/presets/restaurant.ts","../src/config/presets/home-kitchen.ts","../src/config/presets/salon.ts","../src/config/presets/repair.ts","../src/config/presets/professional.ts","../src/config/presets/generic.ts","../src/config/presets/index.ts","../src/config/index.ts","../src/theme/index.ts","../src/components/layout/Header.tsx","../src/components/ui/Icons.tsx","../src/components/layout/Footer.tsx","../src/components/sections/Hero.tsx","../src/components/sections/Services.tsx","../src/components/sections/Testimonials.tsx","../src/components/sections/FAQ.tsx","../src/components/sections/Hours.tsx","../src/components/sections/Gallery.tsx","../src/components/ui/Button.tsx","../src/components/ui/Card.tsx","../src/seo/index.ts","../src/utils/index.ts"],"sourcesContent":["/**\n * Theme Color Palettes\n *\n * Pre-defined color palettes for different business types and styles.\n * Each palette follows Tailwind's color scale (50-950).\n */\n\nimport type { ColorPalette, ThemePreset } from '../config/types';\n\n/**\n * Warm Brown - Tailoring, leather, traditional crafts\n */\nexport const warmBrown: ColorPalette = {\n primary: {\n 50: '#faf8f6',\n 100: '#f2ede8',\n 200: '#e4d9ce',\n 300: '#d3c0ad',\n 400: '#bfa38a',\n 500: '#a68a6d',\n 600: '#8b7058',\n 700: '#735c49',\n 800: '#604d3f',\n 900: '#514237',\n 950: '#2b221c',\n },\n accent: {\n 50: '#fef3f2',\n 100: '#fee4e2',\n 200: '#fecdca',\n 300: '#fcaca5',\n 400: '#f87d71',\n 500: '#ef5544',\n 600: '#dc3626',\n 700: '#b92a1c',\n 800: '#99261b',\n 900: '#7f261d',\n 950: '#450f0a',\n },\n};\n\n/**\n * Cool Blue - Professional services, tech, trust\n */\nexport const coolBlue: ColorPalette = {\n primary: {\n 50: '#f0f7ff',\n 100: '#e0effe',\n 200: '#b9dffd',\n 300: '#7cc5fc',\n 400: '#36a8f8',\n 500: '#0c8de9',\n 600: '#006fc7',\n 700: '#0159a1',\n 800: '#064c85',\n 900: '#0b406e',\n 950: '#072849',\n },\n accent: {\n 50: '#f0fdf4',\n 100: '#dcfce7',\n 200: '#bbf7d0',\n 300: '#86efac',\n 400: '#4ade80',\n 500: '#22c55e',\n 600: '#16a34a',\n 700: '#15803d',\n 800: '#166534',\n 900: '#14532d',\n 950: '#052e16',\n },\n};\n\n/**\n * Earth Green - Natural, organic, outdoor\n */\nexport const earthGreen: ColorPalette = {\n primary: {\n 50: '#f4f9f4',\n 100: '#e5f2e7',\n 200: '#cce5d0',\n 300: '#a3d0ac',\n 400: '#72b381',\n 500: '#4f9760',\n 600: '#3d7a4c',\n 700: '#33613f',\n 800: '#2c4e35',\n 900: '#26412e',\n 950: '#112317',\n },\n accent: {\n 50: '#fefce8',\n 100: '#fef9c3',\n 200: '#fef08a',\n 300: '#fde047',\n 400: '#facc15',\n 500: '#eab308',\n 600: '#ca8a04',\n 700: '#a16207',\n 800: '#854d0e',\n 900: '#713f12',\n 950: '#422006',\n },\n};\n\n/**\n * Warm Amber - Food, hospitality, warmth\n */\nexport const warmAmber: ColorPalette = {\n primary: {\n 50: '#fffbeb',\n 100: '#fef3c7',\n 200: '#fde68a',\n 300: '#fcd34d',\n 400: '#fbbf24',\n 500: '#f59e0b',\n 600: '#d97706',\n 700: '#b45309',\n 800: '#92400e',\n 900: '#78350f',\n 950: '#451a03',\n },\n accent: {\n 50: '#fef2f2',\n 100: '#fee2e2',\n 200: '#fecaca',\n 300: '#fca5a5',\n 400: '#f87171',\n 500: '#ef4444',\n 600: '#dc2626',\n 700: '#b91c1c',\n 800: '#991b1b',\n 900: '#7f1d1d',\n 950: '#450a0a',\n },\n};\n\n/**\n * Elegant Gold - Luxury, formal, upscale\n */\nexport const elegantGold: ColorPalette = {\n primary: {\n 50: '#fdfcf7',\n 100: '#f9f5e7',\n 200: '#f2e9cb',\n 300: '#e8d7a5',\n 400: '#dcc07a',\n 500: '#cfaa58',\n 600: '#c09548',\n 700: '#a0783d',\n 800: '#826037',\n 900: '#6b4f31',\n 950: '#3b2a19',\n },\n accent: {\n 50: '#f8fafc',\n 100: '#f1f5f9',\n 200: '#e2e8f0',\n 300: '#cbd5e1',\n 400: '#94a3b8',\n 500: '#64748b',\n 600: '#475569',\n 700: '#334155',\n 800: '#1e293b',\n 900: '#0f172a',\n 950: '#020617',\n },\n};\n\n/**\n * Fresh Teal - Modern, creative, spa\n */\nexport const freshTeal: ColorPalette = {\n primary: {\n 50: '#f0fdfa',\n 100: '#ccfbf1',\n 200: '#99f6e4',\n 300: '#5eead4',\n 400: '#2dd4bf',\n 500: '#14b8a6',\n 600: '#0d9488',\n 700: '#0f766e',\n 800: '#115e59',\n 900: '#134e4a',\n 950: '#042f2e',\n },\n accent: {\n 50: '#fdf4ff',\n 100: '#fae8ff',\n 200: '#f5d0fe',\n 300: '#f0abfc',\n 400: '#e879f9',\n 500: '#d946ef',\n 600: '#c026d3',\n 700: '#a21caf',\n 800: '#86198f',\n 900: '#701a75',\n 950: '#4a044e',\n },\n};\n\n/**\n * Bold Red - Auto, sports, energy\n */\nexport const boldRed: ColorPalette = {\n primary: {\n 50: '#fef2f2',\n 100: '#fee2e2',\n 200: '#fecaca',\n 300: '#fca5a5',\n 400: '#f87171',\n 500: '#ef4444',\n 600: '#dc2626',\n 700: '#b91c1c',\n 800: '#991b1b',\n 900: '#7f1d1d',\n 950: '#450a0a',\n },\n accent: {\n 50: '#f8fafc',\n 100: '#f1f5f9',\n 200: '#e2e8f0',\n 300: '#cbd5e1',\n 400: '#94a3b8',\n 500: '#64748b',\n 600: '#475569',\n 700: '#334155',\n 800: '#1e293b',\n 900: '#0f172a',\n 950: '#020617',\n },\n};\n\n/**\n * Soft Pink - Beauty, feminine, delicate\n */\nexport const softPink: ColorPalette = {\n primary: {\n 50: '#fdf2f8',\n 100: '#fce7f3',\n 200: '#fbcfe8',\n 300: '#f9a8d4',\n 400: '#f472b6',\n 500: '#ec4899',\n 600: '#db2777',\n 700: '#be185d',\n 800: '#9d174d',\n 900: '#831843',\n 950: '#500724',\n },\n accent: {\n 50: '#faf5ff',\n 100: '#f3e8ff',\n 200: '#e9d5ff',\n 300: '#d8b4fe',\n 400: '#c084fc',\n 500: '#a855f7',\n 600: '#9333ea',\n 700: '#7e22ce',\n 800: '#6b21a8',\n 900: '#581c87',\n 950: '#3b0764',\n },\n};\n\n/**\n * Slate Gray - Minimalist, industrial\n */\nexport const slateGray: ColorPalette = {\n primary: {\n 50: '#f8fafc',\n 100: '#f1f5f9',\n 200: '#e2e8f0',\n 300: '#cbd5e1',\n 400: '#94a3b8',\n 500: '#64748b',\n 600: '#475569',\n 700: '#334155',\n 800: '#1e293b',\n 900: '#0f172a',\n 950: '#020617',\n },\n accent: {\n 50: '#ecfeff',\n 100: '#cffafe',\n 200: '#a5f3fc',\n 300: '#67e8f9',\n 400: '#22d3ee',\n 500: '#06b6d4',\n 600: '#0891b2',\n 700: '#0e7490',\n 800: '#155e75',\n 900: '#164e63',\n 950: '#083344',\n },\n};\n\n/**\n * Forest Green - Deep nature, sustainability\n */\nexport const forestGreen: ColorPalette = {\n primary: {\n 50: '#f0fdf4',\n 100: '#dcfce7',\n 200: '#bbf7d0',\n 300: '#86efac',\n 400: '#4ade80',\n 500: '#22c55e',\n 600: '#16a34a',\n 700: '#15803d',\n 800: '#166534',\n 900: '#14532d',\n 950: '#052e16',\n },\n accent: {\n 50: '#fffbeb',\n 100: '#fef3c7',\n 200: '#fde68a',\n 300: '#fcd34d',\n 400: '#fbbf24',\n 500: '#f59e0b',\n 600: '#d97706',\n 700: '#b45309',\n 800: '#92400e',\n 900: '#78350f',\n 950: '#451a03',\n },\n};\n\n/**\n * Map of theme presets to color palettes.\n */\nexport const themePalettes: Record<ThemePreset, ColorPalette> = {\n 'warm-brown': warmBrown,\n 'cool-blue': coolBlue,\n 'earth-green': earthGreen,\n 'warm-amber': warmAmber,\n 'elegant-gold': elegantGold,\n 'fresh-teal': freshTeal,\n 'bold-red': boldRed,\n 'soft-pink': softPink,\n 'slate-gray': slateGray,\n 'forest-green': forestGreen,\n};\n\n/**\n * Get a color palette by theme preset name.\n */\nexport function getColorPalette(preset: ThemePreset): ColorPalette {\n return themePalettes[preset] || themePalettes['cool-blue'];\n}\n","/**\n * SheetSite Data Types\n *\n * These types define the structure of data fetched from Google Sheets.\n * All data flows through these types, providing type safety across the entire site.\n */\n\nimport { z } from 'zod';\n\n// =============================================================================\n// BUSINESS INFO\n// =============================================================================\n\nexport const BusinessInfoSchema = z.object({\n name: z.string().min(1),\n tagline: z.string().optional(),\n description: z.string().optional(),\n aboutShort: z.string().optional(),\n aboutLong: z.string().optional(),\n\n // Contact\n phone: z.string().optional(),\n phoneAlt: z.string().optional(),\n email: z.string().email().optional().or(z.literal('')),\n\n // Address\n addressLine1: z.string().optional(),\n addressLine2: z.string().optional(),\n city: z.string().optional(),\n state: z.string().optional(),\n zip: z.string().optional(),\n country: z.string().default('USA'),\n\n // Location\n googleMapsUrl: z.string().url().optional().or(z.literal('')),\n mapsEmbedUrl: z.string().url().optional().or(z.literal('')),\n timezone: z.string().default('America/Los_Angeles'),\n\n // Images\n logoUrl: z.string().optional(),\n heroImageUrl: z.string().optional(),\n ogImageUrl: z.string().optional(),\n\n // Social\n socialYelp: z.string().url().optional().or(z.literal('')),\n socialInstagram: z.string().url().optional().or(z.literal('')),\n socialFacebook: z.string().url().optional().or(z.literal('')),\n socialTwitter: z.string().url().optional().or(z.literal('')),\n socialLinkedIn: z.string().url().optional().or(z.literal('')),\n socialYoutube: z.string().url().optional().or(z.literal('')),\n socialTiktok: z.string().url().optional().or(z.literal('')),\n\n // CTAs\n primaryCtaText: z.string().optional(),\n primaryCtaUrl: z.string().optional(),\n secondaryCtaText: z.string().optional(),\n secondaryCtaUrl: z.string().optional(),\n bookingUrl: z.string().url().optional().or(z.literal('')),\n\n // Banner\n bannerEnabled: z.boolean().default(false),\n bannerText: z.string().optional(),\n bannerUrl: z.string().optional(),\n\n // Business metadata\n priceRange: z.enum(['$', '$$', '$$$', '$$$$']).optional(),\n yearEstablished: z.number().optional(),\n licenseNumber: z.string().optional(),\n});\n\nexport type BusinessInfo = z.infer<typeof BusinessInfoSchema>;\n\n// =============================================================================\n// HOURS\n// =============================================================================\n\nexport const DayOfWeek = z.enum(['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday']);\nexport type DayOfWeek = z.infer<typeof DayOfWeek>;\n\nexport const HoursEntrySchema = z.object({\n day: DayOfWeek,\n open: z.string().optional(), // e.g., \"9:00 AM\"\n close: z.string().optional(), // e.g., \"5:00 PM\"\n closed: z.boolean().default(false),\n});\n\nexport type HoursEntry = z.infer<typeof HoursEntrySchema>;\n\nexport const HoursSchema = z.array(HoursEntrySchema);\nexport type Hours = z.infer<typeof HoursSchema>;\n\n// =============================================================================\n// SERVICES\n// =============================================================================\n\nexport const ServiceSchema = z.object({\n id: z.string().optional(),\n title: z.string().min(1),\n description: z.string().optional(),\n priceNote: z.string().optional(), // e.g., \"Starting at $15\" or \"Call for quote\"\n price: z.number().optional(), // Exact price if applicable\n duration: z.string().optional(), // e.g., \"30 min\"\n icon: z.string().optional(), // Icon identifier\n imageUrl: z.string().optional(),\n featured: z.boolean().default(false),\n sortOrder: z.number().default(0),\n category: z.string().optional(),\n});\n\nexport type Service = z.infer<typeof ServiceSchema>;\n\nexport const ServicesSchema = z.array(ServiceSchema);\nexport type Services = z.infer<typeof ServicesSchema>;\n\n// =============================================================================\n// GALLERY\n// =============================================================================\n\nexport const GalleryItemSchema = z.object({\n id: z.string().optional(),\n imageUrl: z.string().min(1),\n alt: z.string().optional(),\n caption: z.string().optional(),\n featured: z.boolean().default(false),\n sortOrder: z.number().default(0),\n category: z.string().optional(),\n});\n\nexport type GalleryItem = z.infer<typeof GalleryItemSchema>;\n\nexport const GallerySchema = z.array(GalleryItemSchema);\nexport type Gallery = z.infer<typeof GallerySchema>;\n\n// =============================================================================\n// TESTIMONIALS / REVIEWS\n// =============================================================================\n\nexport const TestimonialSchema = z.object({\n id: z.string().optional(),\n quote: z.string().min(1),\n name: z.string().min(1),\n context: z.string().optional(), // e.g., \"Wedding alterations\"\n rating: z.number().min(1).max(5).optional(),\n source: z.string().optional(), // e.g., \"Google\", \"Yelp\"\n date: z.string().optional(),\n imageUrl: z.string().optional(), // Reviewer photo\n featured: z.boolean().default(false),\n sortOrder: z.number().default(0),\n});\n\nexport type Testimonial = z.infer<typeof TestimonialSchema>;\n\nexport const TestimonialsSchema = z.array(TestimonialSchema);\nexport type Testimonials = z.infer<typeof TestimonialsSchema>;\n\n// =============================================================================\n// FAQ\n// =============================================================================\n\nexport const FAQItemSchema = z.object({\n id: z.string().optional(),\n question: z.string().min(1),\n answer: z.string().min(1),\n category: z.string().optional(),\n sortOrder: z.number().default(0),\n});\n\nexport type FAQItem = z.infer<typeof FAQItemSchema>;\n\nexport const FAQSchema = z.array(FAQItemSchema);\nexport type FAQ = z.infer<typeof FAQSchema>;\n\n// =============================================================================\n// TEAM MEMBERS (for businesses that want to showcase staff)\n// =============================================================================\n\nexport const TeamMemberSchema = z.object({\n id: z.string().optional(),\n name: z.string().min(1),\n role: z.string().optional(),\n bio: z.string().optional(),\n imageUrl: z.string().optional(),\n email: z.string().email().optional().or(z.literal('')),\n phone: z.string().optional(),\n sortOrder: z.number().default(0),\n});\n\nexport type TeamMember = z.infer<typeof TeamMemberSchema>;\n\nexport const TeamSchema = z.array(TeamMemberSchema);\nexport type Team = z.infer<typeof TeamSchema>;\n\n// =============================================================================\n// MENU ITEMS (for restaurants, cafes, food businesses)\n// =============================================================================\n\nexport const MenuItemSchema = z.object({\n id: z.string().optional(),\n name: z.string().min(1),\n description: z.string().optional(),\n price: z.number().optional(),\n priceNote: z.string().optional(),\n category: z.string().optional(),\n imageUrl: z.string().optional(),\n dietary: z.array(z.string()).optional(), // e.g., [\"vegetarian\", \"gluten-free\"]\n featured: z.boolean().default(false),\n available: z.boolean().default(true),\n sortOrder: z.number().default(0),\n});\n\nexport type MenuItem = z.infer<typeof MenuItemSchema>;\n\nexport const MenuSchema = z.array(MenuItemSchema);\nexport type Menu = z.infer<typeof MenuSchema>;\n\n// =============================================================================\n// PRODUCTS (for craft sellers, retail)\n// =============================================================================\n\nexport const ProductSchema = z.object({\n id: z.string().optional(),\n name: z.string().min(1),\n description: z.string().optional(),\n price: z.number().optional(),\n priceNote: z.string().optional(),\n category: z.string().optional(),\n imageUrl: z.string().optional(),\n images: z.array(z.string()).optional(),\n inStock: z.boolean().default(true),\n featured: z.boolean().default(false),\n sortOrder: z.number().default(0),\n sku: z.string().optional(),\n purchaseUrl: z.string().url().optional().or(z.literal('')),\n});\n\nexport type Product = z.infer<typeof ProductSchema>;\n\nexport const ProductsSchema = z.array(ProductSchema);\nexport type Products = z.infer<typeof ProductsSchema>;\n\n// =============================================================================\n// ANNOUNCEMENTS / SPECIALS\n// =============================================================================\n\nexport const AnnouncementSchema = z.object({\n id: z.string().optional(),\n title: z.string().min(1),\n content: z.string().optional(),\n imageUrl: z.string().optional(),\n linkUrl: z.string().optional(),\n linkText: z.string().optional(),\n startDate: z.string().optional(),\n endDate: z.string().optional(),\n active: z.boolean().default(true),\n sortOrder: z.number().default(0),\n});\n\nexport type Announcement = z.infer<typeof AnnouncementSchema>;\n\nexport const AnnouncementsSchema = z.array(AnnouncementSchema);\nexport type Announcements = z.infer<typeof AnnouncementsSchema>;\n\n// =============================================================================\n// COMPLETE SITE DATA\n// =============================================================================\n\nexport const SiteDataSchema = z.object({\n business: BusinessInfoSchema,\n hours: HoursSchema,\n services: ServicesSchema,\n gallery: GallerySchema,\n testimonials: TestimonialsSchema,\n faq: FAQSchema,\n team: TeamSchema.optional(),\n menu: MenuSchema.optional(),\n products: ProductsSchema.optional(),\n announcements: AnnouncementsSchema.optional(),\n});\n\nexport type SiteData = z.infer<typeof SiteDataSchema>;\n\n// =============================================================================\n// PARTIAL SITE DATA (for merging with defaults)\n// =============================================================================\n\nexport const PartialSiteDataSchema = z.object({\n business: BusinessInfoSchema.partial().optional(),\n hours: HoursSchema.optional(),\n services: ServicesSchema.optional(),\n gallery: GallerySchema.optional(),\n testimonials: TestimonialsSchema.optional(),\n faq: FAQSchema.optional(),\n team: TeamSchema.optional(),\n menu: MenuSchema.optional(),\n products: ProductsSchema.optional(),\n announcements: AnnouncementsSchema.optional(),\n});\n\nexport type PartialSiteData = z.infer<typeof PartialSiteDataSchema>;\n\n// =============================================================================\n// SHEET CONFIGURATION\n// =============================================================================\n\nexport type SheetMode = 'public_csv' | 'private_api';\n\nexport interface SheetTabConfig {\n name: string;\n required: boolean;\n csvUrl?: string;\n}\n\nexport interface PublicCsvConfig {\n mode: 'public_csv';\n tabs: {\n business: string;\n hours?: string;\n services?: string;\n gallery?: string;\n testimonials?: string;\n faq?: string;\n team?: string;\n menu?: string;\n products?: string;\n announcements?: string;\n };\n}\n\nexport interface PrivateApiConfig {\n mode: 'private_api';\n sheetId: string;\n clientEmail: string;\n privateKey: string;\n tabs?: {\n business?: string;\n hours?: string;\n services?: string;\n gallery?: string;\n testimonials?: string;\n faq?: string;\n team?: string;\n menu?: string;\n products?: string;\n announcements?: string;\n };\n}\n\n/**\n * Inline data configuration - pass data directly without Google Sheets.\n * This is useful for:\n * - Rapid prototyping\n * - Automated site generation from CSV/JSON leads\n * - Testing without network requests\n * - Demo sites with pre-populated content\n */\nexport interface InlineDataConfig {\n mode: 'inline';\n data: PartialSiteData;\n}\n\nexport type SheetConfig = PublicCsvConfig | PrivateApiConfig | InlineDataConfig;\n\n// =============================================================================\n// UTILITY TYPES\n// =============================================================================\n\nexport interface ContactFormData {\n name: string;\n email: string;\n phone?: string;\n service?: string;\n message: string;\n}\n\nexport interface ContactFormResult {\n success: boolean;\n messageId?: string;\n error?: string;\n}\n","/**\n * CSV Parser\n *\n * A robust CSV parser that handles:\n * - Quoted fields with embedded commas\n * - Escaped quotes within quoted fields\n * - Various line endings (CRLF, LF)\n * - Empty values\n * - Header normalization\n */\n\nexport interface ParsedRow {\n [key: string]: string;\n}\n\n/**\n * Parse a CSV string into an array of objects.\n * Headers are normalized: lowercased and spaces replaced with underscores.\n */\nexport function parseCSV(csvText: string): ParsedRow[] {\n const lines = csvText.split(/\\r?\\n/);\n if (lines.length < 2) return [];\n\n // Parse header row\n const headers = parseCSVLine(lines[0]).map(normalizeHeader);\n if (headers.length === 0) return [];\n\n const rows: ParsedRow[] = [];\n\n for (let i = 1; i < lines.length; i++) {\n const line = lines[i].trim();\n if (!line) continue;\n\n const values = parseCSVLine(line);\n const row: ParsedRow = {};\n\n for (let j = 0; j < headers.length; j++) {\n row[headers[j]] = values[j]?.trim() ?? '';\n }\n\n rows.push(row);\n }\n\n return rows;\n}\n\n/**\n * Parse a single CSV line, handling quoted fields correctly.\n */\nfunction parseCSVLine(line: string): string[] {\n const values: string[] = [];\n let current = '';\n let inQuotes = false;\n let i = 0;\n\n while (i < line.length) {\n const char = line[i];\n const nextChar = line[i + 1];\n\n if (inQuotes) {\n if (char === '\"') {\n if (nextChar === '\"') {\n // Escaped quote\n current += '\"';\n i += 2;\n } else {\n // End of quoted field\n inQuotes = false;\n i++;\n }\n } else {\n current += char;\n i++;\n }\n } else {\n if (char === '\"') {\n inQuotes = true;\n i++;\n } else if (char === ',') {\n values.push(current);\n current = '';\n i++;\n } else {\n current += char;\n i++;\n }\n }\n }\n\n // Push the last value\n values.push(current);\n\n return values;\n}\n\n/**\n * Normalize a header string:\n * - Convert to lowercase\n * - Replace spaces with underscores\n * - Remove special characters\n */\nexport function normalizeHeader(header: string): string {\n return header\n .toLowerCase()\n .trim()\n .replace(/\\s+/g, '_')\n .replace(/[^a-z0-9_]/g, '');\n}\n\n/**\n * Convert CSV rows to typed objects using a mapping function.\n */\nexport function mapRows<T>(\n rows: ParsedRow[],\n mapper: (row: ParsedRow, index: number) => T | null\n): T[] {\n return rows\n .map((row, index) => mapper(row, index))\n .filter((item): item is T => item !== null);\n}\n\n/**\n * Parse a boolean value from CSV (handles various formats).\n */\nexport function parseBoolean(value: string | undefined): boolean {\n if (!value) return false;\n const lower = value.toLowerCase().trim();\n return lower === 'true' || lower === 'yes' || lower === '1';\n}\n\n/**\n * Parse a number value from CSV.\n */\nexport function parseNumber(value: string | undefined): number | undefined {\n if (!value) return undefined;\n const num = parseFloat(value);\n return isNaN(num) ? undefined : num;\n}\n\n/**\n * Parse an integer value from CSV.\n */\nexport function parseInteger(value: string | undefined): number | undefined {\n if (!value) return undefined;\n const num = parseInt(value, 10);\n return isNaN(num) ? undefined : num;\n}\n\n/**\n * Parse a sort order, defaulting to 0.\n */\nexport function parseSortOrder(value: string | undefined): number {\n return parseInteger(value) ?? 0;\n}\n","/**\n * Google Drive URL Utilities\n *\n * Handles conversion of various Google Drive sharing URLs to direct image URLs.\n * This is essential because Google Drive sharing URLs don't work directly with\n * Next.js Image component or standard <img> tags.\n */\n\n/**\n * Convert a Google Drive sharing URL to a direct view URL.\n *\n * Supported input formats:\n * - https://drive.google.com/file/d/FILE_ID/view?usp=sharing\n * - https://drive.google.com/file/d/FILE_ID/view\n * - https://drive.google.com/open?id=FILE_ID\n * - https://drive.google.com/uc?id=FILE_ID\n * - https://drive.google.com/uc?export=view&id=FILE_ID\n *\n * Output format:\n * - https://drive.google.com/uc?export=view&id=FILE_ID\n */\nexport function normalizeGoogleDriveUrl(url: string | undefined): string | undefined {\n if (!url) return undefined;\n\n // If it's not a Google Drive URL, return as-is\n if (!url.includes('drive.google.com')) {\n return url;\n }\n\n // Extract the file ID using various patterns\n let fileId: string | null = null;\n\n // Pattern 1: /file/d/FILE_ID/\n const filePattern = /\\/file\\/d\\/([a-zA-Z0-9_-]+)/;\n const fileMatch = url.match(filePattern);\n if (fileMatch) {\n fileId = fileMatch[1];\n }\n\n // Pattern 2: ?id=FILE_ID or &id=FILE_ID\n if (!fileId) {\n const idPattern = /[?&]id=([a-zA-Z0-9_-]+)/;\n const idMatch = url.match(idPattern);\n if (idMatch) {\n fileId = idMatch[1];\n }\n }\n\n // Pattern 3: /open?id=FILE_ID\n if (!fileId) {\n const openPattern = /\\/open\\?id=([a-zA-Z0-9_-]+)/;\n const openMatch = url.match(openPattern);\n if (openMatch) {\n fileId = openMatch[1];\n }\n }\n\n if (!fileId) {\n // Could not extract file ID, return original URL\n return url;\n }\n\n // Return the normalized direct view URL\n return `https://drive.google.com/uc?export=view&id=${fileId}`;\n}\n\n/**\n * Get a thumbnail URL for a Google Drive file.\n *\n * @param url - Original Google Drive URL\n * @param size - Thumbnail size (default: 400)\n * @returns Thumbnail URL or undefined\n */\nexport function getGoogleDriveThumbnail(\n url: string | undefined,\n size: number = 400\n): string | undefined {\n if (!url) return undefined;\n\n if (!url.includes('drive.google.com')) {\n return url;\n }\n\n // Extract file ID\n const normalizedUrl = normalizeGoogleDriveUrl(url);\n if (!normalizedUrl) return undefined;\n\n const idMatch = normalizedUrl.match(/id=([a-zA-Z0-9_-]+)/);\n if (!idMatch) return undefined;\n\n return `https://drive.google.com/thumbnail?id=${idMatch[1]}&sz=w${size}`;\n}\n\n/**\n * Check if a URL is a Google Drive URL.\n */\nexport function isGoogleDriveUrl(url: string | undefined): boolean {\n if (!url) return false;\n return url.includes('drive.google.com');\n}\n\n/**\n * Extract the file ID from a Google Drive URL.\n */\nexport function extractGoogleDriveFileId(url: string | undefined): string | null {\n if (!url) return null;\n\n // Pattern 1: /file/d/FILE_ID/\n const filePattern = /\\/file\\/d\\/([a-zA-Z0-9_-]+)/;\n const fileMatch = url.match(filePattern);\n if (fileMatch) return fileMatch[1];\n\n // Pattern 2: ?id=FILE_ID or &id=FILE_ID\n const idPattern = /[?&]id=([a-zA-Z0-9_-]+)/;\n const idMatch = url.match(idPattern);\n if (idMatch) return idMatch[1];\n\n return null;\n}\n\n/**\n * Process all image URLs in an object, converting Google Drive URLs to direct URLs.\n * This is useful for processing entire data objects.\n */\nexport function processImageUrls<T extends Record<string, unknown>>(\n obj: T,\n imageFields: string[] = ['imageUrl', 'logoUrl', 'heroImageUrl', 'ogImageUrl']\n): T {\n const result = { ...obj };\n\n for (const field of imageFields) {\n if (field in result && typeof result[field] === 'string') {\n (result as Record<string, unknown>)[field] = normalizeGoogleDriveUrl(result[field] as string);\n }\n }\n\n return result;\n}\n\n/**\n * Process an array of objects, normalizing image URLs in each.\n */\nexport function processImageUrlsInArray<T extends Record<string, unknown>>(\n arr: T[],\n imageFields: string[] = ['imageUrl', 'image_url', 'url']\n): T[] {\n return arr.map((item) => processImageUrls(item, imageFields));\n}\n","/**\n * Google Sheets Integration\n *\n * Provides data fetching from Google Sheets in two modes:\n * 1. Public CSV: Fetch published sheets via CSV URLs (simpler, no auth)\n * 2. Private API: Fetch via Google Sheets API with service account (more secure)\n *\n * Both modes return the same SiteData structure.\n */\n\nimport {\n type SiteData,\n type PartialSiteData,\n type SheetConfig,\n type PublicCsvConfig,\n type PrivateApiConfig,\n type InlineDataConfig,\n type BusinessInfo,\n type HoursEntry,\n type Service,\n type GalleryItem,\n type Testimonial,\n type FAQItem,\n type TeamMember,\n type MenuItem,\n type Product,\n type Announcement,\n type DayOfWeek,\n} from './types';\nimport { parseCSV, type ParsedRow, parseBoolean, parseNumber, parseSortOrder } from './csv-parser';\nimport { normalizeGoogleDriveUrl } from './google-drive';\n\n// =============================================================================\n// CONFIGURATION\n// =============================================================================\n\nconst DEFAULT_REVALIDATE = 300; // 5 minutes\n\nexport interface FetchOptions {\n revalidate?: number;\n cache?: RequestCache;\n}\n\n// =============================================================================\n// PUBLIC CSV MODE\n// =============================================================================\n\n/**\n * Fetch data from a published Google Sheet CSV URL.\n */\nasync function fetchCSV(url: string, options: FetchOptions = {}): Promise<string> {\n const response = await fetch(url, {\n next: { revalidate: options.revalidate ?? DEFAULT_REVALIDATE },\n cache: options.cache,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to fetch CSV: ${response.status} ${response.statusText}`);\n }\n\n return response.text();\n}\n\n/**\n * Fetch and parse a CSV tab from a public sheet.\n */\nasync function fetchPublicTab<T>(\n url: string | undefined,\n parser: (rows: ParsedRow[]) => T,\n options: FetchOptions = {}\n): Promise<T | undefined> {\n if (!url) return undefined;\n\n try {\n const csvText = await fetchCSV(url, options);\n const rows = parseCSV(csvText);\n return parser(rows);\n } catch (error) {\n console.error(`Error fetching public tab from ${url}:`, error);\n return undefined;\n }\n}\n\n/**\n * Fetch all data from a public CSV configuration.\n */\nexport async function fetchPublicSheetData(\n config: PublicCsvConfig,\n options: FetchOptions = {}\n): Promise<PartialSiteData> {\n const [business, hours, services, gallery, testimonials, faq, team, menu, products, announcements] =\n await Promise.all([\n fetchPublicTab(config.tabs.business, parseBusinessRows, options),\n fetchPublicTab(config.tabs.hours, parseHoursRows, options),\n fetchPublicTab(config.tabs.services, parseServicesRows, options),\n fetchPublicTab(config.tabs.gallery, parseGalleryRows, options),\n fetchPublicTab(config.tabs.testimonials, parseTestimonialsRows, options),\n fetchPublicTab(config.tabs.faq, parseFAQRows, options),\n fetchPublicTab(config.tabs.team, parseTeamRows, options),\n fetchPublicTab(config.tabs.menu, parseMenuRows, options),\n fetchPublicTab(config.tabs.products, parseProductsRows, options),\n fetchPublicTab(config.tabs.announcements, parseAnnouncementsRows, options),\n ]);\n\n return {\n business,\n hours,\n services,\n gallery,\n testimonials,\n faq,\n team,\n menu,\n products,\n announcements,\n };\n}\n\n// =============================================================================\n// PRIVATE API MODE\n// =============================================================================\n\n/**\n * Create a JWT for Google Sheets API authentication.\n * Uses Web Crypto API - no external dependencies needed.\n */\nasync function createJWT(clientEmail: string, privateKey: string): Promise<string> {\n const now = Math.floor(Date.now() / 1000);\n\n const header = {\n alg: 'RS256',\n typ: 'JWT',\n };\n\n const payload = {\n iss: clientEmail,\n scope: 'https://www.googleapis.com/auth/spreadsheets.readonly',\n aud: 'https://oauth2.googleapis.com/token',\n iat: now,\n exp: now + 3600, // 1 hour\n };\n\n // Encode header and payload\n const encoder = new TextEncoder();\n const headerB64 = btoa(JSON.stringify(header))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=/g, '');\n const payloadB64 = btoa(JSON.stringify(payload))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=/g, '');\n\n const signInput = `${headerB64}.${payloadB64}`;\n\n // Parse PEM private key\n const pemContents = privateKey\n .replace(/-----BEGIN PRIVATE KEY-----/g, '')\n .replace(/-----END PRIVATE KEY-----/g, '')\n .replace(/\\\\n/g, '')\n .replace(/\\n/g, '')\n .replace(/\\s/g, '');\n\n const binaryKey = Uint8Array.from(atob(pemContents), (c) => c.charCodeAt(0));\n\n // Import key for signing\n const cryptoKey = await crypto.subtle.importKey(\n 'pkcs8',\n binaryKey,\n { name: 'RSASSA-PKCS1-v1_5', hash: 'SHA-256' },\n false,\n ['sign']\n );\n\n // Sign\n const signature = await crypto.subtle.sign(\n 'RSASSA-PKCS1-v1_5',\n cryptoKey,\n encoder.encode(signInput)\n );\n\n // Encode signature\n const signatureB64 = btoa(String.fromCharCode(...new Uint8Array(signature)))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=/g, '');\n\n return `${signInput}.${signatureB64}`;\n}\n\n/**\n * Get an access token for the Google Sheets API.\n */\nasync function getAccessToken(clientEmail: string, privateKey: string): Promise<string> {\n const jwt = await createJWT(clientEmail, privateKey);\n\n const response = await fetch('https://oauth2.googleapis.com/token', {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({\n grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',\n assertion: jwt,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to get access token: ${response.status}`);\n }\n\n const data = await response.json();\n return data.access_token;\n}\n\n/**\n * Fetch a single tab from the Google Sheets API.\n */\nasync function fetchPrivateTab<T>(\n sheetId: string,\n tabName: string,\n accessToken: string,\n parser: (rows: ParsedRow[]) => T\n): Promise<T | undefined> {\n try {\n const url = `https://sheets.googleapis.com/v4/spreadsheets/${sheetId}/values/${encodeURIComponent(tabName)}`;\n\n const response = await fetch(url, {\n headers: { Authorization: `Bearer ${accessToken}` },\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n // Tab doesn't exist, return undefined\n return undefined;\n }\n throw new Error(`Failed to fetch tab ${tabName}: ${response.status}`);\n }\n\n const data = await response.json();\n const values: string[][] = data.values || [];\n\n if (values.length < 2) return undefined;\n\n // Convert array format to objects\n const headers = values[0].map((h: string) =>\n h.toLowerCase().trim().replace(/\\s+/g, '_').replace(/[^a-z0-9_]/g, '')\n );\n const rows: ParsedRow[] = [];\n\n for (let i = 1; i < values.length; i++) {\n const row: ParsedRow = {};\n for (let j = 0; j < headers.length; j++) {\n row[headers[j]] = values[i][j]?.trim() ?? '';\n }\n rows.push(row);\n }\n\n return parser(rows);\n } catch (error) {\n console.error(`Error fetching private tab ${tabName}:`, error);\n return undefined;\n }\n}\n\n/**\n * Fetch all data from a private API configuration.\n */\nexport async function fetchPrivateSheetData(\n config: PrivateApiConfig,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n _options: FetchOptions = {}\n): Promise<PartialSiteData> {\n const accessToken = await getAccessToken(config.clientEmail, config.privateKey);\n\n const tabs = config.tabs || {};\n const sheetId = config.sheetId;\n\n const [business, hours, services, gallery, testimonials, faq, team, menu, products, announcements] =\n await Promise.all([\n fetchPrivateTab(sheetId, tabs.business || 'business', accessToken, parseBusinessRows),\n fetchPrivateTab(sheetId, tabs.hours || 'hours', accessToken, parseHoursRows),\n fetchPrivateTab(sheetId, tabs.services || 'services', accessToken, parseServicesRows),\n fetchPrivateTab(sheetId, tabs.gallery || 'gallery', accessToken, parseGalleryRows),\n fetchPrivateTab(sheetId, tabs.testimonials || 'testimonials', accessToken, parseTestimonialsRows),\n fetchPrivateTab(sheetId, tabs.faq || 'faq', accessToken, parseFAQRows),\n fetchPrivateTab(sheetId, tabs.team || 'team', accessToken, parseTeamRows),\n fetchPrivateTab(sheetId, tabs.menu || 'menu', accessToken, parseMenuRows),\n fetchPrivateTab(sheetId, tabs.products || 'products', accessToken, parseProductsRows),\n fetchPrivateTab(sheetId, tabs.announcements || 'announcements', accessToken, parseAnnouncementsRows),\n ]);\n\n return {\n business,\n hours,\n services,\n gallery,\n testimonials,\n faq,\n team,\n menu,\n products,\n announcements,\n };\n}\n\n// =============================================================================\n// INLINE DATA MODE\n// =============================================================================\n\n/**\n * Process inline data configuration.\n * Simply returns the provided data - no network requests needed.\n */\nexport function fetchInlineData(config: InlineDataConfig): PartialSiteData {\n return config.data;\n}\n\n// =============================================================================\n// UNIFIED FETCH\n// =============================================================================\n\n/**\n * Fetch site data using the provided configuration.\n * Automatically detects the mode and fetches accordingly.\n *\n * Supported modes:\n * - 'public_csv': Fetch from published Google Sheet CSV URLs\n * - 'private_api': Fetch via Google Sheets API with service account\n * - 'inline': Use provided data directly (no network requests)\n */\nexport async function fetchSheetData(\n config: SheetConfig,\n options: FetchOptions = {}\n): Promise<PartialSiteData> {\n switch (config.mode) {\n case 'public_csv':\n return fetchPublicSheetData(config, options);\n case 'private_api':\n return fetchPrivateSheetData(config, options);\n case 'inline':\n return fetchInlineData(config);\n }\n}\n\n// =============================================================================\n// ROW PARSERS\n// =============================================================================\n\n/**\n * Parse business info from rows (key-value format).\n */\nfunction parseBusinessRows(rows: ParsedRow[]): Partial<BusinessInfo> {\n const data: Record<string, string> = {};\n\n for (const row of rows) {\n const key = row.key?.toLowerCase().replace(/\\s+/g, '_');\n const value = row.value;\n if (key && value) {\n data[key] = value;\n }\n }\n\n return {\n name: data.name || data.business_name || '',\n tagline: data.tagline,\n description: data.description || data.about,\n aboutShort: data.about_short,\n aboutLong: data.about_long,\n phone: data.phone,\n phoneAlt: data.phone_alt || data.phone_secondary,\n email: data.email,\n addressLine1: data.address_line1 || data.address || data.street,\n addressLine2: data.address_line2,\n city: data.city,\n state: data.state,\n zip: data.zip || data.zipcode || data.postal_code,\n country: data.country || 'USA',\n googleMapsUrl: data.google_maps_url || data.maps_url,\n mapsEmbedUrl: data.maps_embed_url || data.embed_url,\n timezone: data.timezone || 'America/Los_Angeles',\n logoUrl: normalizeGoogleDriveUrl(data.logo_url || data.logo),\n heroImageUrl: normalizeGoogleDriveUrl(data.hero_image_url || data.hero_image || data.hero_photo_url),\n ogImageUrl: normalizeGoogleDriveUrl(data.og_image_url || data.og_image),\n socialYelp: data.social_yelp || data.yelp,\n socialInstagram: data.social_instagram || data.instagram,\n socialFacebook: data.social_facebook || data.facebook,\n socialTwitter: data.social_twitter || data.twitter,\n socialLinkedIn: data.social_linkedin || data.linkedin,\n socialYoutube: data.social_youtube || data.youtube,\n socialTiktok: data.social_tiktok || data.tiktok,\n primaryCtaText: data.primary_cta_text || data.cta_text,\n primaryCtaUrl: data.primary_cta_url || data.cta_url,\n secondaryCtaText: data.secondary_cta_text,\n secondaryCtaUrl: data.secondary_cta_url,\n bookingUrl: data.booking_url || data.booking_or_quote_url,\n bannerEnabled: parseBoolean(data.banner_enabled),\n bannerText: data.banner_text,\n bannerUrl: data.banner_url,\n priceRange: data.price_range as BusinessInfo['priceRange'],\n yearEstablished: parseNumber(data.year_established),\n licenseNumber: data.license_number,\n };\n}\n\n/**\n * Parse hours from rows.\n */\nfunction parseHoursRows(rows: ParsedRow[]): HoursEntry[] {\n const dayMap: Record<string, DayOfWeek> = {\n monday: 'monday',\n mon: 'monday',\n tuesday: 'tuesday',\n tue: 'tuesday',\n tues: 'tuesday',\n wednesday: 'wednesday',\n wed: 'wednesday',\n thursday: 'thursday',\n thu: 'thursday',\n thur: 'thursday',\n thurs: 'thursday',\n friday: 'friday',\n fri: 'friday',\n saturday: 'saturday',\n sat: 'saturday',\n sunday: 'sunday',\n sun: 'sunday',\n };\n\n return rows\n .map((row) => {\n const dayKey = (row.day || row.day_of_week || '').toLowerCase();\n const day = dayMap[dayKey];\n if (!day) return null;\n\n return {\n day,\n open: row.open || row.open_time || row.opens,\n close: row.close || row.close_time || row.closes,\n closed: parseBoolean(row.closed),\n };\n })\n .filter((entry): entry is HoursEntry => entry !== null);\n}\n\n/**\n * Parse services from rows.\n */\nfunction parseServicesRows(rows: ParsedRow[]): Service[] {\n return rows\n .map((row, index) => {\n const title = row.title || row.name || row.service;\n if (!title) return null;\n\n return {\n id: row.id || `service-${index}`,\n title,\n description: row.description || row.desc,\n priceNote: row.price_note || row.price_hint || row.pricing,\n price: parseNumber(row.price),\n duration: row.duration || row.time,\n icon: row.icon,\n imageUrl: normalizeGoogleDriveUrl(row.image_url || row.image),\n featured: parseBoolean(row.featured),\n sortOrder: parseSortOrder(row.sort_order || row.sort),\n category: row.category,\n };\n })\n .filter((service): service is Service => service !== null)\n .sort((a, b) => a.sortOrder - b.sortOrder);\n}\n\n/**\n * Parse gallery items from rows.\n */\nfunction parseGalleryRows(rows: ParsedRow[]): GalleryItem[] {\n return rows\n .map((row, index) => {\n const imageUrl = normalizeGoogleDriveUrl(row.image_url || row.url || row.image);\n if (!imageUrl) return null;\n\n return {\n id: row.id || `gallery-${index}`,\n imageUrl,\n alt: row.alt || row.alt_text || row.description || '',\n caption: row.caption,\n featured: parseBoolean(row.featured),\n sortOrder: parseSortOrder(row.sort_order || row.sort),\n category: row.category,\n };\n })\n .filter((item): item is GalleryItem => item !== null)\n .sort((a, b) => a.sortOrder - b.sortOrder);\n}\n\n/**\n * Parse testimonials from rows.\n */\nfunction parseTestimonialsRows(rows: ParsedRow[]): Testimonial[] {\n return rows\n .map((row, index) => {\n const quote = row.quote || row.text || row.review || row.testimonial;\n const name = row.name || row.author || row.reviewer;\n if (!quote || !name) return null;\n\n return {\n id: row.id || `testimonial-${index}`,\n quote,\n name,\n context: row.context || row.service,\n rating: parseNumber(row.rating),\n source: row.source || row.source_label || row.platform,\n date: row.date,\n imageUrl: normalizeGoogleDriveUrl(row.image_url || row.photo),\n featured: parseBoolean(row.featured),\n sortOrder: parseSortOrder(row.sort_order || row.sort),\n };\n })\n .filter((item): item is Testimonial => item !== null)\n .sort((a, b) => a.sortOrder - b.sortOrder);\n}\n\n/**\n * Parse FAQ items from rows.\n */\nfunction parseFAQRows(rows: ParsedRow[]): FAQItem[] {\n return rows\n .map((row, index) => {\n const question = row.question || row.q;\n const answer = row.answer || row.a;\n if (!question || !answer) return null;\n\n return {\n id: row.id || `faq-${index}`,\n question,\n answer,\n category: row.category,\n sortOrder: parseSortOrder(row.sort_order || row.sort),\n };\n })\n .filter((item): item is FAQItem => item !== null)\n .sort((a, b) => a.sortOrder - b.sortOrder);\n}\n\n/**\n * Parse team members from rows.\n */\nfunction parseTeamRows(rows: ParsedRow[]): TeamMember[] {\n return rows\n .map((row, index) => {\n const name = row.name;\n if (!name) return null;\n\n return {\n id: row.id || `team-${index}`,\n name,\n role: row.role || row.title || row.position,\n bio: row.bio || row.description,\n imageUrl: normalizeGoogleDriveUrl(row.image_url || row.photo || row.image),\n email: row.email,\n phone: row.phone,\n sortOrder: parseSortOrder(row.sort_order || row.sort),\n };\n })\n .filter((item): item is TeamMember => item !== null)\n .sort((a, b) => a.sortOrder - b.sortOrder);\n}\n\n/**\n * Parse menu items from rows.\n */\nfunction parseMenuRows(rows: ParsedRow[]): MenuItem[] {\n return rows\n .map((row, index) => {\n const name = row.name || row.item || row.title;\n if (!name) return null;\n\n const dietary = row.dietary || row.tags || row.dietary_tags;\n\n return {\n id: row.id || `menu-${index}`,\n name,\n description: row.description || row.desc,\n price: parseNumber(row.price),\n priceNote: row.price_note || row.pricing,\n category: row.category || row.section,\n imageUrl: normalizeGoogleDriveUrl(row.image_url || row.image),\n dietary: dietary ? dietary.split(',').map((s: string) => s.trim()) : undefined,\n featured: parseBoolean(row.featured),\n available: row.available !== undefined ? parseBoolean(row.available) : true,\n sortOrder: parseSortOrder(row.sort_order || row.sort),\n };\n })\n .filter((item): item is MenuItem => item !== null)\n .sort((a, b) => a.sortOrder - b.sortOrder);\n}\n\n/**\n * Parse products from rows.\n */\nfunction parseProductsRows(rows: ParsedRow[]): Product[] {\n const products = rows\n .map((row, index): Product | null => {\n const name = row.name || row.product || row.title;\n if (!name) return null;\n\n const images = row.images || row.additional_images;\n\n const product: Product = {\n name,\n featured: parseBoolean(row.featured),\n sortOrder: parseSortOrder(row.sort_order || row.sort),\n inStock: row.in_stock !== undefined ? parseBoolean(row.in_stock) : true,\n };\n\n if (row.id) product.id = row.id;\n else product.id = `product-${index}`;\n\n if (row.description || row.desc) product.description = row.description || row.desc;\n if (parseNumber(row.price) !== undefined) product.price = parseNumber(row.price);\n if (row.price_note || row.pricing) product.priceNote = row.price_note || row.pricing;\n if (row.category) product.category = row.category;\n\n const imageUrl = normalizeGoogleDriveUrl(row.image_url || row.image);\n if (imageUrl) product.imageUrl = imageUrl;\n\n if (images) {\n product.images = images\n .split(',')\n .map((s: string) => normalizeGoogleDriveUrl(s.trim()))\n .filter(Boolean) as string[];\n }\n\n if (row.sku) product.sku = row.sku;\n if (row.purchase_url || row.buy_url || row.shop_url) {\n product.purchaseUrl = row.purchase_url || row.buy_url || row.shop_url;\n }\n\n return product;\n })\n .filter((item): item is Product => item !== null);\n\n return products.sort((a, b) => a.sortOrder - b.sortOrder);\n}\n\n/**\n * Parse announcements from rows.\n */\nfunction parseAnnouncementsRows(rows: ParsedRow[]): Announcement[] {\n const announcements = rows\n .map((row, index): Announcement | null => {\n const title = row.title || row.headline;\n if (!title) return null;\n\n const announcement: Announcement = {\n title,\n sortOrder: parseSortOrder(row.sort_order || row.sort),\n active: row.active !== undefined ? parseBoolean(row.active) : true,\n };\n\n if (row.id) announcement.id = row.id;\n else announcement.id = `announcement-${index}`;\n\n if (row.content || row.description || row.body) {\n announcement.content = row.content || row.description || row.body;\n }\n\n const imageUrl = normalizeGoogleDriveUrl(row.image_url || row.image);\n if (imageUrl) announcement.imageUrl = imageUrl;\n\n if (row.link_url || row.url || row.link) {\n announcement.linkUrl = row.link_url || row.url || row.link;\n }\n if (row.link_text || row.cta) announcement.linkText = row.link_text || row.cta;\n if (row.start_date) announcement.startDate = row.start_date;\n if (row.end_date) announcement.endDate = row.end_date;\n\n return announcement;\n })\n .filter((item): item is Announcement => item !== null);\n\n return announcements.sort((a, b) => a.sortOrder - b.sortOrder);\n}\n\n// =============================================================================\n// MERGE WITH DEFAULTS\n// =============================================================================\n\n/**\n * Merge partial site data with defaults to create complete site data.\n */\nexport function mergeSiteData(\n partial: PartialSiteData,\n defaults: SiteData\n): SiteData {\n return {\n business: {\n ...defaults.business,\n ...partial.business,\n },\n hours: partial.hours ?? defaults.hours,\n services: partial.services ?? defaults.services,\n gallery: partial.gallery ?? defaults.gallery,\n testimonials: partial.testimonials ?? defaults.testimonials,\n faq: partial.faq ?? defaults.faq,\n team: partial.team ?? defaults.team,\n menu: partial.menu ?? defaults.menu,\n products: partial.products ?? defaults.products,\n announcements: partial.announcements ?? defaults.announcements,\n };\n}\n","/**\n * Default Site Data\n *\n * Provides fallback data when Google Sheets data is unavailable.\n * These defaults are used during development and as graceful fallbacks.\n */\n\nimport type { SiteData } from './types';\n\n/**\n * Create default site data with customizable business name.\n */\nexport function createDefaultSiteData(businessName: string = 'Your Business'): SiteData {\n return {\n business: {\n name: businessName,\n tagline: 'Quality Service You Can Trust',\n description: `Welcome to ${businessName}. We are dedicated to providing exceptional service to our community.`,\n aboutShort: `${businessName} has been serving our community with dedication and excellence.`,\n aboutLong: `${businessName} was founded with a simple mission: to provide outstanding service with a personal touch. Our team of experienced professionals is committed to exceeding your expectations every time.`,\n phone: '(555) 123-4567',\n email: 'info@example.com',\n addressLine1: '123 Main Street',\n city: 'Anytown',\n state: 'CA',\n zip: '12345',\n country: 'USA',\n timezone: 'America/Los_Angeles',\n primaryCtaText: 'Contact Us',\n priceRange: '$$',\n },\n hours: [\n { day: 'monday', open: '9:00 AM', close: '5:00 PM', closed: false },\n { day: 'tuesday', open: '9:00 AM', close: '5:00 PM', closed: false },\n { day: 'wednesday', open: '9:00 AM', close: '5:00 PM', closed: false },\n { day: 'thursday', open: '9:00 AM', close: '5:00 PM', closed: false },\n { day: 'friday', open: '9:00 AM', close: '5:00 PM', closed: false },\n { day: 'saturday', open: '10:00 AM', close: '3:00 PM', closed: false },\n { day: 'sunday', closed: true },\n ],\n services: [\n {\n id: 'service-1',\n title: 'Service One',\n description: 'Our primary service offering, designed to meet your needs.',\n priceNote: 'Starting at $50',\n sortOrder: 1,\n },\n {\n id: 'service-2',\n title: 'Service Two',\n description: 'Another excellent option for our valued customers.',\n priceNote: 'Call for pricing',\n sortOrder: 2,\n },\n {\n id: 'service-3',\n title: 'Service Three',\n description: 'A specialized service for unique requirements.',\n priceNote: 'Custom quote',\n sortOrder: 3,\n },\n ],\n gallery: [],\n testimonials: [\n {\n id: 'testimonial-1',\n quote: 'Excellent service! I highly recommend them to anyone looking for quality work.',\n name: 'Happy Customer',\n rating: 5,\n sortOrder: 1,\n },\n {\n id: 'testimonial-2',\n quote: 'Professional, timely, and great attention to detail. Will definitely return!',\n name: 'Satisfied Client',\n rating: 5,\n sortOrder: 2,\n },\n ],\n faq: [\n {\n id: 'faq-1',\n question: 'What are your hours of operation?',\n answer: 'We are open Monday through Friday from 9 AM to 5 PM, and Saturday from 10 AM to 3 PM. We are closed on Sundays.',\n sortOrder: 1,\n },\n {\n id: 'faq-2',\n question: 'How can I contact you?',\n answer: 'You can reach us by phone, email, or by filling out the contact form on our website. We typically respond within 24 hours.',\n sortOrder: 2,\n },\n {\n id: 'faq-3',\n question: 'Do you offer free estimates?',\n answer: 'Yes! We offer free estimates for all our services. Contact us to schedule a consultation.',\n sortOrder: 3,\n },\n ],\n };\n}\n\n/**\n * Default site data instance.\n */\nexport const DEFAULT_SITE_DATA = createDefaultSiteData();\n\n/**\n * Industry-specific default data generators.\n */\nexport const industryDefaults = {\n tailor: (): SiteData => ({\n ...createDefaultSiteData('Expert Tailoring'),\n services: [\n { id: 's1', title: 'Alterations', description: 'Expert alterations for all garments', priceNote: 'Starting at $15', sortOrder: 1 },\n { id: 's2', title: 'Hemming', description: 'Professional hemming for pants, skirts, and dresses', priceNote: 'From $12', sortOrder: 2 },\n { id: 's3', title: 'Wedding & Formal', description: 'Specialized alterations for wedding dresses and formal wear', priceNote: 'Custom quote', sortOrder: 3 },\n { id: 's4', title: 'Custom Tailoring', description: 'Made-to-measure suits and garments', priceNote: 'By consultation', sortOrder: 4 },\n ],\n faq: [\n { id: 'f1', question: 'How long do alterations take?', answer: 'Most alterations are completed within 3-5 business days. Rush service is available for an additional fee.', sortOrder: 1 },\n { id: 'f2', question: 'Do you work on leather or suede?', answer: 'Yes, we have experience with leather and suede garments. These require specialized care and may take longer.', sortOrder: 2 },\n { id: 'f3', question: 'Can you match fabric for repairs?', answer: 'We maintain an extensive fabric library and can often find close matches. Bring your garment in for assessment.', sortOrder: 3 },\n ],\n }),\n\n restaurant: (): SiteData => ({\n ...createDefaultSiteData('Local Restaurant'),\n services: [],\n menu: [\n { id: 'm1', name: 'Signature Dish', description: 'Our house specialty', price: 18.99, category: 'Entrees', sortOrder: 1 },\n { id: 'm2', name: 'Fresh Salad', description: 'Garden fresh ingredients', price: 12.99, category: 'Salads', sortOrder: 2 },\n { id: 'm3', name: 'Daily Special', description: 'Ask your server for today\\'s special', priceNote: 'Market price', category: 'Specials', sortOrder: 3 },\n ],\n faq: [\n { id: 'f1', question: 'Do you take reservations?', answer: 'Yes! We recommend reservations for parties of 4 or more, especially on weekends.', sortOrder: 1 },\n { id: 'f2', question: 'Do you offer takeout?', answer: 'Yes, we offer both takeout and delivery through our website.', sortOrder: 2 },\n { id: 'f3', question: 'Do you accommodate dietary restrictions?', answer: 'Absolutely! We have vegetarian, vegan, and gluten-free options. Please inform your server of any allergies.', sortOrder: 3 },\n ],\n }),\n\n salon: (): SiteData => ({\n ...createDefaultSiteData('Beauty Salon'),\n services: [\n { id: 's1', title: 'Haircut', description: 'Professional cut and style', priceNote: 'From $35', sortOrder: 1 },\n { id: 's2', title: 'Color Services', description: 'Full color, highlights, and balayage', priceNote: 'From $75', sortOrder: 2 },\n { id: 's3', title: 'Styling', description: 'Blowouts and special occasion styling', priceNote: 'From $45', sortOrder: 3 },\n { id: 's4', title: 'Treatments', description: 'Deep conditioning and keratin treatments', priceNote: 'From $50', sortOrder: 4 },\n ],\n faq: [\n { id: 'f1', question: 'Do I need an appointment?', answer: 'Appointments are recommended but we do accept walk-ins based on availability.', sortOrder: 1 },\n { id: 'f2', question: 'What is your cancellation policy?', answer: 'We require 24-hour notice for cancellations to avoid a cancellation fee.', sortOrder: 2 },\n { id: 'f3', question: 'Do you offer consultations?', answer: 'Yes! Free consultations are available for color services and major transformations.', sortOrder: 3 },\n ],\n }),\n\n homeKitchen: (): SiteData => ({\n ...createDefaultSiteData('Home Kitchen'),\n services: [],\n products: [\n { id: 'p1', name: 'Fresh Baked Goods', description: 'Made fresh daily', priceNote: 'Varies', category: 'Baked Goods', sortOrder: 1 },\n { id: 'p2', name: 'Preserves & Jams', description: 'Homemade with local ingredients', priceNote: 'From $8', category: 'Preserves', sortOrder: 2 },\n { id: 'p3', name: 'Custom Orders', description: 'Special occasion cakes and treats', priceNote: 'By quote', category: 'Custom', sortOrder: 3 },\n ],\n faq: [\n { id: 'f1', question: 'Do you accommodate dietary restrictions?', answer: 'Yes! We offer gluten-free, vegan, and sugar-free options. Please inquire about specific needs.', sortOrder: 1 },\n { id: 'f2', question: 'How far in advance should I order?', answer: 'For custom orders, we recommend at least 1 week notice. 2 weeks for large orders.', sortOrder: 2 },\n { id: 'f3', question: 'Do you deliver?', answer: 'Local delivery is available for orders over $25. Contact us for delivery area details.', sortOrder: 3 },\n ],\n }),\n\n repair: (): SiteData => ({\n ...createDefaultSiteData('Repair Shop'),\n services: [\n { id: 's1', title: 'Basic Repair', description: 'Standard repairs and fixes', priceNote: 'From $20', sortOrder: 1 },\n { id: 's2', title: 'Restoration', description: 'Full restoration services', priceNote: 'By quote', sortOrder: 2 },\n { id: 's3', title: 'Rush Service', description: 'Same-day or next-day service', priceNote: '+50%', sortOrder: 3 },\n { id: 's4', title: 'Custom Work', description: 'Specialized and custom requests', priceNote: 'By consultation', sortOrder: 4 },\n ],\n faq: [\n { id: 'f1', question: 'How long do repairs take?', answer: 'Standard repairs typically take 3-5 business days. Rush service is available.', sortOrder: 1 },\n { id: 'f2', question: 'Do you offer a warranty?', answer: 'Yes, all repairs come with a 90-day warranty against workmanship defects.', sortOrder: 2 },\n { id: 'f3', question: 'Do you provide estimates?', answer: 'Yes, we provide free estimates before beginning any work.', sortOrder: 3 },\n ],\n }),\n\n professional: (): SiteData => ({\n ...createDefaultSiteData('Professional Services'),\n services: [\n { id: 's1', title: 'Consultation', description: 'Initial consultation and assessment', priceNote: 'Free', sortOrder: 1 },\n { id: 's2', title: 'Standard Service', description: 'Our core service offering', priceNote: 'From $100', sortOrder: 2 },\n { id: 's3', title: 'Premium Package', description: 'Comprehensive service with priority support', priceNote: 'From $250', sortOrder: 3 },\n { id: 's4', title: 'Ongoing Support', description: 'Monthly retainer for continuous support', priceNote: 'Monthly', sortOrder: 4 },\n ],\n faq: [\n { id: 'f1', question: 'What is your availability?', answer: 'We maintain flexible hours to accommodate our clients. Contact us to schedule an appointment.', sortOrder: 1 },\n { id: 'f2', question: 'Do you offer remote services?', answer: 'Yes, many of our services can be provided remotely via video conference.', sortOrder: 2 },\n { id: 'f3', question: 'What forms of payment do you accept?', answer: 'We accept all major credit cards, checks, and bank transfers.', sortOrder: 3 },\n ],\n }),\n};\n","/**\n * SheetSite Data Module\n *\n * Provides all data-related functionality:\n * - Google Sheets integration (public CSV and private API modes)\n * - Type definitions for site data\n * - CSV parsing utilities\n * - Google Drive URL utilities\n * - Default data and fallbacks\n */\n\n// Types\nexport * from './types';\n\n// Google Sheets integration\nexport {\n fetchSheetData,\n fetchPublicSheetData,\n fetchPrivateSheetData,\n fetchInlineData,\n mergeSiteData,\n type FetchOptions,\n} from './sheets';\n\n// CSV parsing\nexport {\n parseCSV,\n normalizeHeader,\n mapRows,\n parseBoolean,\n parseNumber,\n parseInteger,\n parseSortOrder,\n type ParsedRow,\n} from './csv-parser';\n\n// Google Drive utilities\nexport {\n normalizeGoogleDriveUrl,\n getGoogleDriveThumbnail,\n isGoogleDriveUrl,\n extractGoogleDriveFileId,\n processImageUrls,\n processImageUrlsInArray,\n} from './google-drive';\n\n// Defaults\nexport {\n DEFAULT_SITE_DATA,\n createDefaultSiteData,\n industryDefaults,\n} from './defaults';\n\n// =============================================================================\n// CONVENIENCE FUNCTIONS\n// =============================================================================\n\nimport type { SheetConfig, SiteData, PartialSiteData } from './types';\nimport { fetchSheetData, mergeSiteData } from './sheets';\nimport { DEFAULT_SITE_DATA, createDefaultSiteData, industryDefaults } from './defaults';\n\n/**\n * In-memory cache for site data.\n */\nlet cachedSiteData: SiteData | null = null;\nlet cacheTimestamp: number = 0;\nconst CACHE_DURATION = 5 * 60 * 1000; // 5 minutes\n\n/**\n * Clear the in-memory cache.\n * Call this when you need to force a refresh.\n */\nexport function clearSiteDataCache(): void {\n cachedSiteData = null;\n cacheTimestamp = 0;\n}\n\n/**\n * Get site data with caching.\n * This is the primary function for fetching site data in your application.\n *\n * @param config - Sheet configuration (public CSV or private API)\n * @param defaults - Default data to merge with (optional)\n * @returns Complete site data\n */\nexport async function getSiteData(\n config: SheetConfig | undefined,\n defaults: SiteData = DEFAULT_SITE_DATA\n): Promise<SiteData> {\n // Check cache\n const now = Date.now();\n if (cachedSiteData && now - cacheTimestamp < CACHE_DURATION) {\n return cachedSiteData;\n }\n\n // If no config, return defaults\n if (!config) {\n return defaults;\n }\n\n try {\n const partialData = await fetchSheetData(config);\n const siteData = mergeSiteData(partialData, defaults);\n\n // Update cache\n cachedSiteData = siteData;\n cacheTimestamp = now;\n\n return siteData;\n } catch (error) {\n console.error('Error fetching site data:', error);\n return defaults;\n }\n}\n\n/**\n * Get site data with a custom default based on business type.\n *\n * @param config - Sheet configuration\n * @param businessName - Name of the business\n * @returns Complete site data\n */\nexport async function getSiteDataWithName(\n config: SheetConfig | undefined,\n businessName: string\n): Promise<SiteData> {\n const defaults = createDefaultSiteData(businessName);\n return getSiteData(config, defaults);\n}\n\n/**\n * Create a sheet configuration from environment variables.\n * This is a convenience function for common setup patterns.\n *\n * Expected environment variables for public CSV mode:\n * - SHEET_MODE=public_csv\n * - SHEET_CSV_URL_BUSINESS\n * - SHEET_CSV_URL_HOURS (optional)\n * - SHEET_CSV_URL_SERVICES (optional)\n * - SHEET_CSV_URL_GALLERY (optional)\n * - SHEET_CSV_URL_TESTIMONIALS (optional)\n * - SHEET_CSV_URL_FAQ (optional)\n * - SHEET_CSV_URL_TEAM (optional)\n * - SHEET_CSV_URL_MENU (optional)\n * - SHEET_CSV_URL_PRODUCTS (optional)\n * - SHEET_CSV_URL_ANNOUNCEMENTS (optional)\n *\n * Expected environment variables for private API mode:\n * - SHEET_MODE=private_api\n * - SHEET_ID\n * - GOOGLE_SERVICE_ACCOUNT_EMAIL\n * - GOOGLE_PRIVATE_KEY\n *\n * For inline mode, use createInlineConfig() instead.\n */\nexport function createSheetConfigFromEnv(): SheetConfig | undefined {\n const mode = process.env.SHEET_MODE;\n\n if (mode === 'public_csv') {\n const businessUrl = process.env.SHEET_CSV_URL_BUSINESS;\n if (!businessUrl) {\n console.warn('SHEET_CSV_URL_BUSINESS not set, using defaults');\n return undefined;\n }\n\n return {\n mode: 'public_csv',\n tabs: {\n business: businessUrl,\n hours: process.env.SHEET_CSV_URL_HOURS,\n services: process.env.SHEET_CSV_URL_SERVICES,\n gallery: process.env.SHEET_CSV_URL_GALLERY,\n testimonials: process.env.SHEET_CSV_URL_TESTIMONIALS,\n faq: process.env.SHEET_CSV_URL_FAQ,\n team: process.env.SHEET_CSV_URL_TEAM,\n menu: process.env.SHEET_CSV_URL_MENU,\n products: process.env.SHEET_CSV_URL_PRODUCTS,\n announcements: process.env.SHEET_CSV_URL_ANNOUNCEMENTS,\n },\n };\n }\n\n if (mode === 'private_api') {\n const sheetId = process.env.SHEET_ID;\n const clientEmail = process.env.GOOGLE_SERVICE_ACCOUNT_EMAIL;\n const privateKey = process.env.GOOGLE_PRIVATE_KEY;\n\n if (!sheetId || !clientEmail || !privateKey) {\n console.warn('Missing required environment variables for private API mode');\n return undefined;\n }\n\n return {\n mode: 'private_api',\n sheetId,\n clientEmail,\n privateKey,\n };\n }\n\n // No valid mode configured\n return undefined;\n}\n\n// =============================================================================\n// INLINE DATA UTILITIES\n// =============================================================================\n\nimport type { InlineDataConfig, BusinessInfo, HoursEntry, DayOfWeek } from './types';\n\n/**\n * Create an inline configuration for direct data injection.\n * This bypasses Google Sheets entirely and uses provided data directly.\n *\n * Ideal for:\n * - Automated site generation from CSV/JSON leads\n * - Rapid prototyping and demos\n * - Testing without network dependencies\n *\n * @example\n * ```ts\n * const config = createInlineConfig({\n * business: {\n * name: \"John's Tailor Shop\",\n * tagline: \"Expert Alterations\",\n * phone: \"555-123-4567\",\n * city: \"San Diego\",\n * state: \"CA\"\n * },\n * hours: [\n * { day: 'monday', open: '9:00 AM', close: '5:00 PM', closed: false }\n * ]\n * });\n *\n * const siteData = await getSiteData(config, industryDefaults.tailor());\n * ```\n */\nexport function createInlineConfig(data: PartialSiteData): InlineDataConfig {\n return {\n mode: 'inline',\n data,\n };\n}\n\n/**\n * Input format for lead data from scraped sources (e.g., Google Maps).\n * Designed to match common CSV export formats.\n */\nexport interface LeadData {\n // Required\n name: string;\n\n // Contact (at least phone recommended)\n phone?: string;\n phoneAlt?: string;\n email?: string;\n\n // Address - can be single field or split\n address?: string; // Full address string (will attempt to parse)\n addressLine1?: string;\n addressLine2?: string;\n city?: string;\n state?: string;\n zip?: string;\n country?: string;\n\n // Business info\n tagline?: string;\n description?: string;\n category?: string; // e.g., \"Tailor\", \"Restaurant\" - used for preset selection\n googleMapsUrl?: string;\n\n // Hours - can be structured or simple\n hours?: HoursEntry[] | SimpleHours;\n\n // Images\n heroImageUrl?: string;\n logoUrl?: string;\n galleryUrls?: string[];\n\n // Social proof\n rating?: number; // e.g., 4.5\n reviewCount?: number;\n testimonialQuote?: string;\n testimonialAuthor?: string;\n\n // Social links\n yelp?: string;\n instagram?: string;\n facebook?: string;\n twitter?: string;\n website?: string;\n\n // Additional\n yearEstablished?: number;\n priceRange?: '$' | '$$' | '$$$' | '$$$$';\n timezone?: string;\n}\n\n/**\n * Simple hours format for common patterns.\n */\nexport interface SimpleHours {\n weekdays?: { open: string; close: string };\n saturday?: { open: string; close: string } | 'closed';\n sunday?: { open: string; close: string } | 'closed';\n}\n\n/**\n * Convert simple hours format to HoursEntry array.\n */\nfunction parseSimpleHours(hours: SimpleHours): HoursEntry[] {\n const entries: HoursEntry[] = [];\n const weekdays: DayOfWeek[] = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday'];\n\n if (hours.weekdays) {\n for (const day of weekdays) {\n entries.push({\n day,\n open: hours.weekdays.open,\n close: hours.weekdays.close,\n closed: false,\n });\n }\n }\n\n if (hours.saturday) {\n entries.push(\n hours.saturday === 'closed'\n ? { day: 'saturday', closed: true }\n : { day: 'saturday', open: hours.saturday.open, close: hours.saturday.close, closed: false }\n );\n }\n\n if (hours.sunday) {\n entries.push(\n hours.sunday === 'closed'\n ? { day: 'sunday', closed: true }\n : { day: 'sunday', open: hours.sunday.open, close: hours.sunday.close, closed: false }\n );\n }\n\n return entries;\n}\n\n/**\n * Parse a full address string into components.\n * Handles common US address formats.\n */\nfunction parseAddressString(\n address: string\n): Pick<BusinessInfo, 'addressLine1' | 'city' | 'state' | 'zip'> {\n // Try to match: \"123 Main St, City, ST 12345\" or similar\n const parts = address.split(',').map((s) => s.trim());\n\n if (parts.length >= 3) {\n // Likely: Street, City, State ZIP\n const lastPart = parts[parts.length - 1];\n const stateZipMatch = lastPart.match(/^([A-Z]{2})\\s*(\\d{5}(?:-\\d{4})?)$/);\n\n if (stateZipMatch) {\n return {\n addressLine1: parts.slice(0, -2).join(', '),\n city: parts[parts.length - 2],\n state: stateZipMatch[1],\n zip: stateZipMatch[2],\n };\n }\n }\n\n if (parts.length === 2) {\n // Likely: Street, City ST ZIP\n const cityStateZipMatch = parts[1].match(/^(.+?)\\s+([A-Z]{2})\\s*(\\d{5}(?:-\\d{4})?)$/);\n if (cityStateZipMatch) {\n return {\n addressLine1: parts[0],\n city: cityStateZipMatch[1],\n state: cityStateZipMatch[2],\n zip: cityStateZipMatch[3],\n };\n }\n }\n\n // Fallback: just use as address line 1\n return { addressLine1: address };\n}\n\n/**\n * Create PartialSiteData from lead data (e.g., scraped from Google Maps).\n *\n * This is the primary function for converting CSV/JSON lead data into\n * a format suitable for SheetSite. It handles common data formats and\n * performs sensible normalization.\n *\n * @example\n * ```ts\n * const lead = {\n * name: \"John's Tailor Shop\",\n * phone: \"555-123-4567\",\n * address: \"123 Main St, San Diego, CA 92101\",\n * category: \"Tailor\",\n * rating: 4.8,\n * reviewCount: 67,\n * hours: {\n * weekdays: { open: '9:00 AM', close: '5:00 PM' },\n * saturday: { open: '10:00 AM', close: '3:00 PM' },\n * sunday: 'closed'\n * }\n * };\n *\n * const siteData = createSiteDataFromLead(lead);\n * const config = createInlineConfig(siteData);\n * ```\n */\nexport function createSiteDataFromLead(lead: LeadData): PartialSiteData {\n // Parse address if provided as single string\n const addressParts =\n lead.address && !lead.addressLine1 ? parseAddressString(lead.address) : {};\n\n // Build business info\n const business: Partial<BusinessInfo> = {\n name: lead.name,\n tagline: lead.tagline,\n description: lead.description,\n phone: lead.phone,\n phoneAlt: lead.phoneAlt,\n email: lead.email,\n addressLine1: lead.addressLine1 || addressParts.addressLine1,\n addressLine2: lead.addressLine2,\n city: lead.city || addressParts.city,\n state: lead.state || addressParts.state,\n zip: lead.zip || addressParts.zip,\n country: lead.country || 'USA',\n googleMapsUrl: lead.googleMapsUrl,\n timezone: lead.timezone || 'America/Los_Angeles',\n heroImageUrl: lead.heroImageUrl,\n logoUrl: lead.logoUrl,\n socialYelp: lead.yelp,\n socialInstagram: lead.instagram,\n socialFacebook: lead.facebook,\n socialTwitter: lead.twitter,\n yearEstablished: lead.yearEstablished,\n priceRange: lead.priceRange,\n };\n\n // Parse hours\n let hours: HoursEntry[] | undefined;\n if (lead.hours) {\n if (Array.isArray(lead.hours)) {\n hours = lead.hours;\n } else {\n hours = parseSimpleHours(lead.hours);\n }\n }\n\n // Build gallery from URLs\n const gallery = lead.galleryUrls?.map((url, i) => ({\n id: `gallery-${i}`,\n imageUrl: url,\n alt: `${lead.name} - Image ${i + 1}`,\n featured: false,\n sortOrder: i,\n }));\n\n // Build testimonial from rating/review data\n const testimonials =\n lead.testimonialQuote && lead.testimonialAuthor\n ? [\n {\n id: 'testimonial-1',\n quote: lead.testimonialQuote,\n name: lead.testimonialAuthor,\n rating: lead.rating,\n source: 'Google',\n featured: false,\n sortOrder: 0,\n },\n ]\n : lead.rating\n ? [\n {\n id: 'testimonial-1',\n quote: `Rated ${lead.rating}/5 on Google${lead.reviewCount ? ` based on ${lead.reviewCount} reviews` : ''}`,\n name: 'Google Reviews',\n rating: Math.round(lead.rating),\n source: 'Google',\n featured: false,\n sortOrder: 0,\n },\n ]\n : undefined;\n\n return {\n business,\n hours,\n gallery,\n testimonials,\n };\n}\n\n/**\n * Create a complete site configuration from lead data in one step.\n *\n * Combines createSiteDataFromLead with defaults for the specified business type.\n *\n * @param lead - Lead data from scraping\n * @param businessType - Business type for defaults (e.g., 'tailor', 'restaurant')\n * @returns Complete site data ready for rendering\n *\n * @example\n * ```ts\n * const lead = { name: \"Maria's Alterations\", phone: \"555-1234\", category: \"tailor\" };\n * const siteData = await createSiteFromLead(lead, 'tailor');\n * ```\n */\nexport async function createSiteFromLead(\n lead: LeadData,\n businessType?: string\n): Promise<SiteData> {\n const partialData = createSiteDataFromLead(lead);\n const config = createInlineConfig(partialData);\n\n // Get industry-specific defaults if available\n const type = businessType || lead.category?.toLowerCase().replace(/\\s+/g, '-');\n let defaults = DEFAULT_SITE_DATA;\n\n if (type) {\n const typeKey = type as keyof typeof industryDefaults;\n if (typeKey in industryDefaults) {\n defaults = industryDefaults[typeKey]();\n }\n }\n\n return getSiteData(config, defaults);\n}\n","/**\n * Tailor / Alterations Business Preset\n */\n\nimport type { BusinessPreset } from '../types';\n\nexport const tailorPreset: BusinessPreset = {\n type: 'tailor',\n name: 'Tailor & Alterations',\n description: 'Configuration for tailoring, alterations, and custom clothing businesses',\n\n config: {\n businessType: 'tailor',\n theme: {\n preset: 'warm-brown',\n borderRadius: 'md',\n shadows: 'md',\n },\n pages: {\n home: {\n enabled: true,\n sections: [\n 'hero',\n 'services',\n 'gallery',\n 'testimonials',\n 'hours',\n 'location',\n 'faq',\n ],\n },\n about: { enabled: true },\n services: { enabled: true, title: 'Our Services' },\n gallery: { enabled: true, title: 'Our Work' },\n faq: { enabled: true },\n contact: { enabled: true },\n privacy: { enabled: true },\n },\n seo: {\n titleTemplate: '%s | Expert Tailoring & Alterations',\n keywords: ['tailor', 'alterations', 'seamstress', 'hemming', 'custom clothing', 'wedding dress alterations'],\n jsonLdType: 'LocalBusiness',\n },\n contactForm: {\n enabled: true,\n fields: {\n name: true,\n email: true,\n phone: true,\n service: true,\n message: true,\n },\n },\n features: {\n mobileCallBar: true,\n openStatus: true,\n mapEmbed: true,\n socialLinks: true,\n },\n },\n\n defaults: {\n business: {\n tagline: 'Expert Alterations & Custom Tailoring',\n description: 'Professional tailoring services with attention to detail and quality craftsmanship.',\n priceRange: '$$',\n },\n services: [\n { id: 's1', title: 'Alterations', description: 'Expert alterations for all garments including pants, shirts, dresses, and jackets', priceNote: 'Starting at $15', icon: 'scissors', sortOrder: 1 },\n { id: 's2', title: 'Hemming', description: 'Professional hemming for pants, skirts, dresses, and curtains', priceNote: 'From $12', icon: 'ruler', sortOrder: 2 },\n { id: 's3', title: 'Wedding & Formal', description: 'Specialized alterations for wedding dresses, bridesmaids gowns, and formal wear', priceNote: 'Custom quote', icon: 'heart', sortOrder: 3 },\n { id: 's4', title: 'Repairs & Restoration', description: 'Zipper replacement, button repair, seam repair, and garment restoration', priceNote: 'From $10', icon: 'wrench', sortOrder: 4 },\n { id: 's5', title: 'Custom Tailoring', description: 'Made-to-measure suits, shirts, and garments tailored to your exact specifications', priceNote: 'By consultation', icon: 'sparkles', sortOrder: 5 },\n { id: 's6', title: 'Leather & Specialty', description: 'Expert work on leather, suede, and delicate fabrics', priceNote: 'Call for pricing', icon: 'star', sortOrder: 6 },\n ],\n faq: [\n { id: 'f1', question: 'How long do alterations typically take?', answer: 'Most alterations are completed within 3-5 business days. Rush service is available for an additional fee. Wedding and formal wear may require more time for multiple fittings.', sortOrder: 1 },\n { id: 'f2', question: 'Do you work on leather and suede?', answer: 'Yes, we have extensive experience with leather and suede garments. These materials require specialized care and techniques, so pricing and timing may vary.', sortOrder: 2 },\n { id: 'f3', question: 'What should I bring to my fitting?', answer: 'Please bring the shoes you plan to wear with the garment, and any undergarments that might affect the fit. For formal wear, bring accessories like belts or jewelry.', sortOrder: 3 },\n { id: 'f4', question: 'Do you offer wedding dress alterations?', answer: 'Absolutely! We specialize in wedding dress alterations including hemming, bustling, taking in or letting out, and adding embellishments. We recommend scheduling your first fitting 2-3 months before the wedding.', sortOrder: 4 },\n { id: 'f5', question: 'Can you match fabric for repairs?', answer: 'We maintain an extensive fabric library and can often find close matches for repairs and patches. Bring your garment in for a free assessment.', sortOrder: 5 },\n ],\n },\n\n sheetTemplate: {\n tabs: [\n {\n name: 'business',\n required: true,\n columns: [\n { name: 'key', description: 'Setting name', example: 'name', required: true },\n { name: 'value', description: 'Setting value', example: 'Expert Tailoring', required: true },\n ],\n },\n {\n name: 'hours',\n required: true,\n columns: [\n { name: 'day', description: 'Day of week', example: 'Monday', required: true },\n { name: 'open', description: 'Opening time', example: '9:00 AM', required: false },\n { name: 'close', description: 'Closing time', example: '6:00 PM', required: false },\n { name: 'closed', description: 'Is closed?', example: 'FALSE', required: false },\n ],\n },\n {\n name: 'services',\n required: true,\n columns: [\n { name: 'title', description: 'Service name', example: 'Alterations', required: true },\n { name: 'description', description: 'Service description', example: 'Expert alterations for all garments', required: false },\n { name: 'price_note', description: 'Pricing info', example: 'Starting at $15', required: false },\n { name: 'icon', description: 'Icon name', example: 'scissors', required: false },\n { name: 'sort', description: 'Display order', example: '1', required: false },\n ],\n },\n {\n name: 'gallery',\n required: false,\n columns: [\n { name: 'image_url', description: 'Image URL (Google Drive or direct)', example: 'https://drive.google.com/...', required: true },\n { name: 'alt', description: 'Image description', example: 'Wedding dress alteration', required: false },\n { name: 'caption', description: 'Caption text', example: 'Custom bridal alterations', required: false },\n { name: 'sort', description: 'Display order', example: '1', required: false },\n ],\n },\n {\n name: 'testimonials',\n required: false,\n columns: [\n { name: 'quote', description: 'Customer review', example: 'Amazing work on my wedding dress!', required: true },\n { name: 'name', description: 'Customer name', example: 'Sarah M.', required: true },\n { name: 'context', description: 'Service context', example: 'Wedding alterations', required: false },\n { name: 'rating', description: 'Star rating (1-5)', example: '5', required: false },\n { name: 'sort', description: 'Display order', example: '1', required: false },\n ],\n },\n {\n name: 'faq',\n required: false,\n columns: [\n { name: 'question', description: 'Question text', example: 'How long do alterations take?', required: true },\n { name: 'answer', description: 'Answer text', example: '3-5 business days typically', required: true },\n { name: 'sort', description: 'Display order', example: '1', required: false },\n ],\n },\n ],\n },\n\n iconSuggestions: ['scissors', 'ruler', 'heart', 'sparkles', 'star', 'wrench', 'shirt', 'dress'],\n\n imageSuggestions: [\n 'Professional tailor measuring fabric',\n 'Close-up of precise stitching',\n 'Wedding dress on mannequin',\n 'Organized tailor workshop',\n 'Before and after alterations',\n 'Happy customer with altered garment',\n ],\n};\n","/**\n * Restaurant / Cafe Business Preset\n */\n\nimport type { BusinessPreset } from '../types';\n\nexport const restaurantPreset: BusinessPreset = {\n type: 'restaurant',\n name: 'Restaurant & Cafe',\n description: 'Configuration for restaurants, cafes, and dining establishments',\n\n config: {\n businessType: 'restaurant',\n theme: {\n preset: 'warm-amber',\n borderRadius: 'lg',\n shadows: 'md',\n },\n pages: {\n home: {\n enabled: true,\n sections: [\n 'hero',\n 'menu',\n 'gallery',\n 'testimonials',\n 'hours',\n 'location',\n ],\n },\n about: { enabled: true, title: 'Our Story' },\n menu: { enabled: true, title: 'Menu' },\n gallery: { enabled: true, title: 'Gallery' },\n contact: { enabled: true },\n privacy: { enabled: true },\n },\n seo: {\n titleTemplate: '%s | Delicious Dining Experience',\n keywords: ['restaurant', 'dining', 'food', 'cuisine', 'local restaurant', 'family dining'],\n jsonLdType: 'Restaurant',\n },\n contactForm: {\n enabled: true,\n fields: {\n name: true,\n email: true,\n phone: true,\n service: false,\n message: true,\n },\n successMessage: 'Thank you for your message! We\\'ll get back to you soon.',\n },\n features: {\n mobileCallBar: true,\n openStatus: true,\n mapEmbed: true,\n socialLinks: true,\n bookingButton: true,\n },\n },\n\n defaults: {\n business: {\n tagline: 'Fresh, Delicious, Made with Love',\n description: 'Experience exceptional cuisine in a warm and welcoming atmosphere.',\n priceRange: '$$',\n },\n menu: [\n { id: 'm1', name: 'House Salad', description: 'Fresh mixed greens with house vinaigrette', price: 9.99, category: 'Starters', sortOrder: 1 },\n { id: 'm2', name: 'Soup of the Day', description: 'Ask your server for today\\'s selection', priceNote: 'Cup $5 / Bowl $8', category: 'Starters', sortOrder: 2 },\n { id: 'm3', name: 'Signature Pasta', description: 'House-made pasta with seasonal vegetables', price: 18.99, category: 'Entrees', sortOrder: 3 },\n { id: 'm4', name: 'Grilled Salmon', description: 'Fresh Atlantic salmon with lemon herb butter', price: 24.99, category: 'Entrees', sortOrder: 4 },\n { id: 'm5', name: 'Classic Burger', description: 'Half-pound beef patty with all the fixings', price: 15.99, category: 'Entrees', sortOrder: 5 },\n { id: 'm6', name: 'Chocolate Cake', description: 'Rich chocolate layer cake', price: 8.99, category: 'Desserts', sortOrder: 6 },\n ],\n faq: [\n { id: 'f1', question: 'Do you take reservations?', answer: 'Yes! We recommend reservations for parties of 4 or more, especially on weekends. You can call us or book online.', sortOrder: 1 },\n { id: 'f2', question: 'Do you offer takeout or delivery?', answer: 'Yes, we offer both takeout and delivery. Order through our website or your favorite delivery app.', sortOrder: 2 },\n { id: 'f3', question: 'Can you accommodate dietary restrictions?', answer: 'Absolutely! We have vegetarian, vegan, and gluten-free options. Please inform your server of any allergies or dietary needs.', sortOrder: 3 },\n { id: 'f4', question: 'Do you have a private dining room?', answer: 'Yes, we have a private dining room that seats up to 20 guests. Contact us for reservations and special event menus.', sortOrder: 4 },\n { id: 'f5', question: 'Is there parking available?', answer: 'Yes, we have a parking lot behind the restaurant with free parking for guests.', sortOrder: 5 },\n ],\n },\n\n sheetTemplate: {\n tabs: [\n {\n name: 'business',\n required: true,\n columns: [\n { name: 'key', description: 'Setting name', example: 'name', required: true },\n { name: 'value', description: 'Setting value', example: 'The Local Kitchen', required: true },\n ],\n },\n {\n name: 'hours',\n required: true,\n columns: [\n { name: 'day', description: 'Day of week', example: 'Monday', required: true },\n { name: 'open', description: 'Opening time', example: '11:00 AM', required: false },\n { name: 'close', description: 'Closing time', example: '10:00 PM', required: false },\n { name: 'closed', description: 'Is closed?', example: 'FALSE', required: false },\n ],\n },\n {\n name: 'menu',\n required: true,\n columns: [\n { name: 'name', description: 'Item name', example: 'Grilled Salmon', required: true },\n { name: 'description', description: 'Item description', example: 'Fresh Atlantic salmon with herbs', required: false },\n { name: 'price', description: 'Price (number)', example: '24.99', required: false },\n { name: 'price_note', description: 'Price note', example: 'Market price', required: false },\n { name: 'category', description: 'Menu section', example: 'Entrees', required: false },\n { name: 'dietary', description: 'Dietary tags (comma-separated)', example: 'gluten-free, dairy-free', required: false },\n { name: 'featured', description: 'Is featured?', example: 'TRUE', required: false },\n { name: 'sort', description: 'Display order', example: '1', required: false },\n ],\n },\n {\n name: 'gallery',\n required: false,\n columns: [\n { name: 'image_url', description: 'Image URL', example: 'https://drive.google.com/...', required: true },\n { name: 'alt', description: 'Image description', example: 'Signature pasta dish', required: false },\n { name: 'caption', description: 'Caption text', example: 'Our famous house-made pasta', required: false },\n { name: 'sort', description: 'Display order', example: '1', required: false },\n ],\n },\n {\n name: 'testimonials',\n required: false,\n columns: [\n { name: 'quote', description: 'Customer review', example: 'Best pasta in town!', required: true },\n { name: 'name', description: 'Customer name', example: 'John D.', required: true },\n { name: 'rating', description: 'Star rating (1-5)', example: '5', required: false },\n { name: 'source', description: 'Review source', example: 'Yelp', required: false },\n { name: 'sort', description: 'Display order', example: '1', required: false },\n ],\n },\n {\n name: 'faq',\n required: false,\n columns: [\n { name: 'question', description: 'Question text', example: 'Do you take reservations?', required: true },\n { name: 'answer', description: 'Answer text', example: 'Yes, we recommend them for parties of 4+', required: true },\n { name: 'sort', description: 'Display order', example: '1', required: false },\n ],\n },\n ],\n },\n\n iconSuggestions: ['utensils', 'chef-hat', 'wine', 'coffee', 'pizza', 'salad', 'cake', 'soup'],\n\n imageSuggestions: [\n 'Beautiful plated dish',\n 'Cozy restaurant interior',\n 'Chef preparing food',\n 'Happy diners at table',\n 'Bar or drink selection',\n 'Outdoor patio seating',\n ],\n};\n","/**\n * Home Kitchen / Cottage Food Business Preset\n */\n\nimport type { BusinessPreset } from '../types';\n\nexport const homeKitchenPreset: BusinessPreset = {\n type: 'home-kitchen',\n name: 'Home Kitchen & Cottage Food',\n description: 'Configuration for home-based food businesses, cottage food producers, and bakers',\n\n config: {\n businessType: 'home-kitchen',\n theme: {\n preset: 'warm-amber',\n borderRadius: 'lg',\n shadows: 'sm',\n },\n pages: {\n home: {\n enabled: true,\n sections: [\n 'hero',\n 'products',\n 'how-it-works',\n 'gallery',\n 'testimonials',\n 'faq',\n 'contact-form',\n ],\n },\n about: { enabled: true, title: 'My Story' },\n products: { enabled: true, title: 'Products' },\n gallery: { enabled: true, title: 'Gallery' },\n faq: { enabled: true },\n contact: { enabled: true },\n privacy: { enabled: true },\n },\n seo: {\n titleTemplate: '%s | Homemade with Love',\n keywords: ['homemade', 'cottage food', 'baked goods', 'local', 'handmade', 'artisan'],\n jsonLdType: 'LocalBusiness',\n },\n contactForm: {\n enabled: true,\n fields: {\n name: true,\n email: true,\n phone: true,\n service: false,\n message: true,\n },\n successMessage: 'Thank you for your order inquiry! I\\'ll get back to you within 24 hours.',\n },\n features: {\n mobileCallBar: true,\n openStatus: false, // Often by appointment\n socialLinks: true,\n bookingButton: true,\n },\n },\n\n defaults: {\n business: {\n tagline: 'Homemade Goodness, Made with Love',\n description: 'Delicious homemade treats crafted with quality ingredients and care.',\n priceRange: '$$',\n },\n products: [\n { id: 'p1', name: 'Signature Cookies', description: 'Our famous chocolate chip cookies', price: 3.50, priceNote: 'per cookie or $18/dozen', category: 'Cookies', featured: true, sortOrder: 1 },\n { id: 'p2', name: 'Fresh Bread', description: 'Artisan sourdough baked fresh', price: 8, priceNote: 'per loaf', category: 'Bread', sortOrder: 2 },\n { id: 'p3', name: 'Seasonal Pie', description: 'Made with fresh, seasonal fruit', price: 25, priceNote: '9-inch pie', category: 'Pies', sortOrder: 3 },\n { id: 'p4', name: 'Custom Cake', description: 'Birthday, celebration, or special occasion cakes', priceNote: 'Starting at $45', category: 'Cakes', sortOrder: 4 },\n { id: 'p5', name: 'Homemade Jam', description: 'Small-batch preserves with local fruit', price: 8, priceNote: '8 oz jar', category: 'Preserves', sortOrder: 5 },\n ],\n faq: [\n { id: 'f1', question: 'How do I place an order?', answer: 'You can place an order through the contact form on this website, by texting or calling, or through our social media pages. I\\'ll confirm availability and arrange pickup or delivery.', sortOrder: 1 },\n { id: 'f2', question: 'How far in advance should I order?', answer: 'For standard items, 2-3 days notice is usually sufficient. For custom cakes or large orders, please give at least 1-2 weeks notice.', sortOrder: 2 },\n { id: 'f3', question: 'Do you accommodate dietary restrictions?', answer: 'Yes! I offer gluten-free, dairy-free, and vegan options for many items. Please mention any allergies or dietary needs when ordering.', sortOrder: 3 },\n { id: 'f4', question: 'Do you deliver?', answer: 'I offer local pickup from my home and delivery within a 10-mile radius for orders over $25. Delivery fees may apply.', sortOrder: 4 },\n { id: 'f5', question: 'What forms of payment do you accept?', answer: 'I accept cash, Venmo, PayPal, and Zelle. Payment is due at pickup or delivery.', sortOrder: 5 },\n { id: 'f6', question: 'Are you licensed?', answer: 'Yes! I operate under my state\\'s cottage food law, which allows me to produce and sell specific homemade food items directly to consumers.', sortOrder: 6 },\n ],\n },\n\n sheetTemplate: {\n tabs: [\n {\n name: 'business',\n required: true,\n columns: [\n { name: 'key', description: 'Setting name', example: 'name', required: true },\n { name: 'value', description: 'Setting value', example: 'Sweet Home Bakery', required: true },\n ],\n },\n {\n name: 'products',\n required: true,\n columns: [\n { name: 'name', description: 'Product name', example: 'Chocolate Chip Cookies', required: true },\n { name: 'description', description: 'Product description', example: 'Classic cookies with premium chocolate', required: false },\n { name: 'price', description: 'Price (number)', example: '18', required: false },\n { name: 'price_note', description: 'Price details', example: 'per dozen', required: false },\n { name: 'category', description: 'Product category', example: 'Cookies', required: false },\n { name: 'image_url', description: 'Product image', example: 'https://drive.google.com/...', required: false },\n { name: 'featured', description: 'Is featured?', example: 'TRUE', required: false },\n { name: 'in_stock', description: 'Currently available?', example: 'TRUE', required: false },\n { name: 'sort', description: 'Display order', example: '1', required: false },\n ],\n },\n {\n name: 'gallery',\n required: false,\n columns: [\n { name: 'image_url', description: 'Image URL', example: 'https://drive.google.com/...', required: true },\n { name: 'alt', description: 'Image description', example: 'Fresh baked cookies', required: false },\n { name: 'caption', description: 'Caption text', example: 'Straight from the oven', required: false },\n { name: 'sort', description: 'Display order', example: '1', required: false },\n ],\n },\n {\n name: 'testimonials',\n required: false,\n columns: [\n { name: 'quote', description: 'Customer review', example: 'The best cookies I\\'ve ever had!', required: true },\n { name: 'name', description: 'Customer name', example: 'Lisa M.', required: true },\n { name: 'context', description: 'Order context', example: 'Birthday party order', required: false },\n { name: 'rating', description: 'Star rating (1-5)', example: '5', required: false },\n { name: 'sort', description: 'Display order', example: '1', required: false },\n ],\n },\n {\n name: 'faq',\n required: false,\n columns: [\n { name: 'question', description: 'Question text', example: 'How do I order?', required: true },\n { name: 'answer', description: 'Answer text', example: 'Contact me through the form...', required: true },\n { name: 'sort', description: 'Display order', example: '1', required: false },\n ],\n },\n ],\n },\n\n iconSuggestions: ['cake', 'cookie', 'bread', 'heart', 'sparkles', 'star', 'gift', 'home'],\n\n imageSuggestions: [\n 'Beautifully decorated custom cake',\n 'Fresh-baked cookies cooling on rack',\n 'Artisan bread with golden crust',\n 'Colorful cupcake display',\n 'Homemade jam jars with labels',\n 'Kitchen workspace with ingredients',\n ],\n};\n","/**\n * Salon / Beauty Business Preset\n */\n\nimport type { BusinessPreset } from '../types';\n\nexport const salonPreset: BusinessPreset = {\n type: 'salon',\n name: 'Hair Salon & Beauty',\n description: 'Configuration for hair salons, beauty parlors, and styling businesses',\n\n config: {\n businessType: 'salon',\n theme: {\n preset: 'soft-pink',\n borderRadius: 'lg',\n shadows: 'md',\n },\n pages: {\n home: {\n enabled: true,\n sections: [\n 'hero',\n 'services',\n 'team',\n 'gallery',\n 'testimonials',\n 'hours',\n 'location',\n ],\n },\n about: { enabled: true },\n services: { enabled: true, title: 'Services & Pricing' },\n team: { enabled: true, title: 'Our Stylists' },\n gallery: { enabled: true, title: 'Our Work' },\n contact: { enabled: true },\n privacy: { enabled: true },\n },\n seo: {\n titleTemplate: '%s | Hair Salon & Beauty',\n keywords: ['hair salon', 'haircut', 'color', 'highlights', 'styling', 'beauty', 'blowout'],\n jsonLdType: 'HealthAndBeautyBusiness',\n },\n contactForm: {\n enabled: true,\n fields: {\n name: true,\n email: true,\n phone: true,\n service: true,\n message: true,\n },\n },\n features: {\n mobileCallBar: true,\n openStatus: true,\n mapEmbed: true,\n socialLinks: true,\n bookingButton: true,\n },\n },\n\n defaults: {\n business: {\n tagline: 'Where Style Meets Expertise',\n description: 'Experience the art of hair styling with our talented team of professionals.',\n priceRange: '$$',\n },\n services: [\n { id: 's1', title: 'Women\\'s Haircut', description: 'Cut, shampoo, and style', priceNote: 'From $45', icon: 'scissors', sortOrder: 1 },\n { id: 's2', title: 'Men\\'s Haircut', description: 'Precision cut and style', priceNote: 'From $30', icon: 'scissors', sortOrder: 2 },\n { id: 's3', title: 'Single Process Color', description: 'Full head single color application', priceNote: 'From $75', icon: 'palette', sortOrder: 3 },\n { id: 's4', title: 'Highlights', description: 'Partial or full highlights', priceNote: 'From $95', icon: 'sun', sortOrder: 4 },\n { id: 's5', title: 'Balayage', description: 'Hand-painted highlights for a natural look', priceNote: 'From $150', icon: 'paintbrush', sortOrder: 5 },\n { id: 's6', title: 'Blowout', description: 'Shampoo and professional blowout', priceNote: 'From $40', icon: 'wind', sortOrder: 6 },\n { id: 's7', title: 'Deep Conditioning', description: 'Intensive hair treatment', priceNote: 'From $25', icon: 'sparkles', sortOrder: 7 },\n { id: 's8', title: 'Special Occasion', description: 'Updos and formal styling', priceNote: 'From $65', icon: 'star', sortOrder: 8 },\n ],\n team: [\n { id: 't1', name: 'Stylist Name', role: 'Senior Stylist', bio: 'With over 10 years of experience, specializing in color and cutting.', sortOrder: 1 },\n { id: 't2', name: 'Stylist Name', role: 'Color Specialist', bio: 'Expert in balayage, highlights, and creative color techniques.', sortOrder: 2 },\n ],\n faq: [\n { id: 'f1', question: 'Do I need an appointment?', answer: 'Appointments are strongly recommended to ensure we can give you our full attention. Walk-ins are welcome based on availability.', sortOrder: 1 },\n { id: 'f2', question: 'What is your cancellation policy?', answer: 'We require 24-hour notice for cancellations or rescheduling. Late cancellations may incur a fee.', sortOrder: 2 },\n { id: 'f3', question: 'Do you offer consultations?', answer: 'Yes! We offer free consultations for color services and major transformations. This helps us understand your goals and create a plan.', sortOrder: 3 },\n { id: 'f4', question: 'What products do you use?', answer: 'We use professional-grade products from top brands. Ask your stylist about our current product lines.', sortOrder: 4 },\n { id: 'f5', question: 'How should I prepare for my appointment?', answer: 'Come with clean, dry hair unless otherwise instructed. Feel free to bring photos of styles you love!', sortOrder: 5 },\n ],\n },\n\n sheetTemplate: {\n tabs: [\n {\n name: 'business',\n required: true,\n columns: [\n { name: 'key', description: 'Setting name', example: 'name', required: true },\n { name: 'value', description: 'Setting value', example: 'Luxe Hair Studio', required: true },\n ],\n },\n {\n name: 'hours',\n required: true,\n columns: [\n { name: 'day', description: 'Day of week', example: 'Monday', required: true },\n { name: 'open', description: 'Opening time', example: '10:00 AM', required: false },\n { name: 'close', description: 'Closing time', example: '7:00 PM', required: false },\n { name: 'closed', description: 'Is closed?', example: 'FALSE', required: false },\n ],\n },\n {\n name: 'services',\n required: true,\n columns: [\n { name: 'title', description: 'Service name', example: 'Women\\'s Haircut', required: true },\n { name: 'description', description: 'Service description', example: 'Cut, shampoo, and style', required: false },\n { name: 'price_note', description: 'Pricing info', example: 'From $45', required: false },\n { name: 'duration', description: 'Service duration', example: '60 min', required: false },\n { name: 'icon', description: 'Icon name', example: 'scissors', required: false },\n { name: 'category', description: 'Service category', example: 'Cuts', required: false },\n { name: 'sort', description: 'Display order', example: '1', required: false },\n ],\n },\n {\n name: 'team',\n required: false,\n columns: [\n { name: 'name', description: 'Stylist name', example: 'Sarah Johnson', required: true },\n { name: 'role', description: 'Role/title', example: 'Senior Stylist', required: false },\n { name: 'bio', description: 'Short bio', example: 'Specializing in color for 10+ years', required: false },\n { name: 'image_url', description: 'Photo URL', example: 'https://drive.google.com/...', required: false },\n { name: 'sort', description: 'Display order', example: '1', required: false },\n ],\n },\n {\n name: 'gallery',\n required: false,\n columns: [\n { name: 'image_url', description: 'Image URL', example: 'https://drive.google.com/...', required: true },\n { name: 'alt', description: 'Image description', example: 'Balayage transformation', required: false },\n { name: 'caption', description: 'Caption text', example: 'Sun-kissed balayage', required: false },\n { name: 'sort', description: 'Display order', example: '1', required: false },\n ],\n },\n {\n name: 'testimonials',\n required: false,\n columns: [\n { name: 'quote', description: 'Customer review', example: 'Best haircut I\\'ve ever had!', required: true },\n { name: 'name', description: 'Customer name', example: 'Amanda R.', required: true },\n { name: 'rating', description: 'Star rating (1-5)', example: '5', required: false },\n { name: 'sort', description: 'Display order', example: '1', required: false },\n ],\n },\n {\n name: 'faq',\n required: false,\n columns: [\n { name: 'question', description: 'Question text', example: 'Do I need an appointment?', required: true },\n { name: 'answer', description: 'Answer text', example: 'Appointments are recommended...', required: true },\n { name: 'sort', description: 'Display order', example: '1', required: false },\n ],\n },\n ],\n },\n\n iconSuggestions: ['scissors', 'palette', 'sparkles', 'sun', 'wind', 'star', 'heart', 'user'],\n\n imageSuggestions: [\n 'Before and after hair transformation',\n 'Stylist working on client',\n 'Beautiful balayage result',\n 'Salon interior',\n 'Product display',\n 'Special occasion updo',\n ],\n};\n","/**\n * Repair Shop Business Preset\n * For shoe repair, electronics repair, watch repair, etc.\n */\n\nimport type { BusinessPreset } from '../types';\n\nexport const repairPreset: BusinessPreset = {\n type: 'shoe-repair',\n name: 'Repair Shop',\n description: 'Configuration for repair shops (shoe, electronics, watch, etc.)',\n\n config: {\n businessType: 'shoe-repair',\n theme: {\n preset: 'warm-brown',\n borderRadius: 'md',\n shadows: 'md',\n },\n pages: {\n home: {\n enabled: true,\n sections: [\n 'hero',\n 'services',\n 'how-it-works',\n 'gallery',\n 'testimonials',\n 'hours',\n 'location',\n 'faq',\n ],\n },\n about: { enabled: true },\n services: { enabled: true, title: 'Our Services' },\n gallery: { enabled: true, title: 'Our Work' },\n faq: { enabled: true },\n contact: { enabled: true },\n privacy: { enabled: true },\n },\n seo: {\n titleTemplate: '%s | Expert Repair Services',\n keywords: ['repair', 'restoration', 'fix', 'local repair shop', 'quality repairs'],\n jsonLdType: 'LocalBusiness',\n },\n contactForm: {\n enabled: true,\n fields: {\n name: true,\n email: true,\n phone: true,\n service: true,\n message: true,\n },\n },\n features: {\n mobileCallBar: true,\n openStatus: true,\n mapEmbed: true,\n socialLinks: true,\n },\n },\n\n defaults: {\n business: {\n tagline: 'Quality Repairs, Trusted Service',\n description: 'Expert repair services with attention to detail and fair pricing.',\n priceRange: '$$',\n },\n services: [\n { id: 's1', title: 'Basic Repair', description: 'Standard repairs and fixes', priceNote: 'From $20', icon: 'wrench', sortOrder: 1 },\n { id: 's2', title: 'Restoration', description: 'Full restoration to like-new condition', priceNote: 'By quote', icon: 'sparkles', sortOrder: 2 },\n { id: 's3', title: 'Cleaning & Care', description: 'Professional cleaning and maintenance', priceNote: 'From $15', icon: 'droplet', sortOrder: 3 },\n { id: 's4', title: 'Custom Work', description: 'Specialized modifications and custom requests', priceNote: 'By consultation', icon: 'star', sortOrder: 4 },\n { id: 's5', title: 'Rush Service', description: 'Same-day or next-day service', priceNote: '+50%', icon: 'clock', sortOrder: 5 },\n ],\n faq: [\n { id: 'f1', question: 'How long do repairs typically take?', answer: 'Standard repairs are usually completed within 3-5 business days. Rush service is available for urgent needs at an additional cost.', sortOrder: 1 },\n { id: 'f2', question: 'Do you provide free estimates?', answer: 'Yes! We provide free estimates for all repairs. Just bring in your item for an assessment.', sortOrder: 2 },\n { id: 'f3', question: 'Do you offer a warranty on repairs?', answer: 'Yes, all our repairs come with a 90-day warranty against workmanship defects.', sortOrder: 3 },\n { id: 'f4', question: 'What brands do you work with?', answer: 'We work with all major brands and have experience with both common and specialty items.', sortOrder: 4 },\n { id: 'f5', question: 'Can you match colors/materials?', answer: 'We maintain an extensive inventory and can often match colors and materials closely. Bring in your item for assessment.', sortOrder: 5 },\n ],\n },\n\n sheetTemplate: {\n tabs: [\n {\n name: 'business',\n required: true,\n columns: [\n { name: 'key', description: 'Setting name', example: 'name', required: true },\n { name: 'value', description: 'Setting value', example: 'Quality Repair Shop', required: true },\n ],\n },\n {\n name: 'hours',\n required: true,\n columns: [\n { name: 'day', description: 'Day of week', example: 'Monday', required: true },\n { name: 'open', description: 'Opening time', example: '9:00 AM', required: false },\n { name: 'close', description: 'Closing time', example: '6:00 PM', required: false },\n { name: 'closed', description: 'Is closed?', example: 'FALSE', required: false },\n ],\n },\n {\n name: 'services',\n required: true,\n columns: [\n { name: 'title', description: 'Service name', example: 'Basic Repair', required: true },\n { name: 'description', description: 'Service description', example: 'Standard repairs and fixes', required: false },\n { name: 'price_note', description: 'Pricing info', example: 'From $20', required: false },\n { name: 'icon', description: 'Icon name', example: 'wrench', required: false },\n { name: 'sort', description: 'Display order', example: '1', required: false },\n ],\n },\n {\n name: 'gallery',\n required: false,\n columns: [\n { name: 'image_url', description: 'Image URL', example: 'https://drive.google.com/...', required: true },\n { name: 'alt', description: 'Image description', example: 'Before and after repair', required: false },\n { name: 'caption', description: 'Caption text', example: 'Restored to like-new condition', required: false },\n { name: 'sort', description: 'Display order', example: '1', required: false },\n ],\n },\n {\n name: 'testimonials',\n required: false,\n columns: [\n { name: 'quote', description: 'Customer review', example: 'Amazing work! Like new again.', required: true },\n { name: 'name', description: 'Customer name', example: 'Mike T.', required: true },\n { name: 'context', description: 'Service context', example: 'Watch restoration', required: false },\n { name: 'rating', description: 'Star rating (1-5)', example: '5', required: false },\n { name: 'sort', description: 'Display order', example: '1', required: false },\n ],\n },\n {\n name: 'faq',\n required: false,\n columns: [\n { name: 'question', description: 'Question text', example: 'How long do repairs take?', required: true },\n { name: 'answer', description: 'Answer text', example: '3-5 business days typically', required: true },\n { name: 'sort', description: 'Display order', example: '1', required: false },\n ],\n },\n ],\n },\n\n iconSuggestions: ['wrench', 'hammer', 'sparkles', 'clock', 'star', 'shield', 'check', 'tool'],\n\n imageSuggestions: [\n 'Before and after repair shots',\n 'Craftsman at work',\n 'Organized workshop',\n 'Close-up of quality workmanship',\n 'Tools of the trade',\n 'Happy customer with repaired item',\n ],\n};\n","/**\n * Professional Services Business Preset\n * For accountants, lawyers, consultants, etc.\n */\n\nimport type { BusinessPreset } from '../types';\n\nexport const professionalPreset: BusinessPreset = {\n type: 'accountant',\n name: 'Professional Services',\n description: 'Configuration for accountants, lawyers, consultants, and other professional service providers',\n\n config: {\n businessType: 'accountant',\n theme: {\n preset: 'cool-blue',\n borderRadius: 'md',\n shadows: 'sm',\n },\n pages: {\n home: {\n enabled: true,\n sections: [\n 'hero',\n 'services',\n 'about-preview',\n 'testimonials',\n 'faq',\n 'contact-form',\n ],\n },\n about: { enabled: true },\n services: { enabled: true, title: 'Our Services' },\n team: { enabled: true, title: 'Our Team' },\n faq: { enabled: true },\n contact: { enabled: true },\n privacy: { enabled: true },\n },\n seo: {\n titleTemplate: '%s | Professional Services',\n keywords: ['professional services', 'consulting', 'expert advice', 'local business'],\n jsonLdType: 'ProfessionalService',\n },\n contactForm: {\n enabled: true,\n fields: {\n name: true,\n email: true,\n phone: true,\n service: true,\n message: true,\n },\n successMessage: 'Thank you for your inquiry. We\\'ll be in touch within one business day.',\n },\n features: {\n mobileCallBar: true,\n openStatus: true,\n mapEmbed: true,\n socialLinks: true,\n bookingButton: true,\n },\n },\n\n defaults: {\n business: {\n tagline: 'Expert Guidance You Can Trust',\n description: 'Professional services delivered with expertise, integrity, and a personal touch.',\n priceRange: '$$$',\n },\n services: [\n { id: 's1', title: 'Initial Consultation', description: 'Comprehensive assessment of your needs and goals', priceNote: 'Free', icon: 'chat', sortOrder: 1 },\n { id: 's2', title: 'Core Services', description: 'Our primary service offering tailored to your needs', priceNote: 'From $150/hour', icon: 'briefcase', sortOrder: 2 },\n { id: 's3', title: 'Comprehensive Package', description: 'Full-service solution with ongoing support', priceNote: 'Custom quote', icon: 'package', sortOrder: 3 },\n { id: 's4', title: 'Ongoing Support', description: 'Monthly retainer for continuous guidance', priceNote: 'From $500/month', icon: 'calendar', sortOrder: 4 },\n ],\n team: [\n { id: 't1', name: 'Principal Name', role: 'Principal / Founder', bio: 'Over 20 years of experience helping clients achieve their goals.', sortOrder: 1 },\n { id: 't2', name: 'Associate Name', role: 'Senior Associate', bio: 'Specialized expertise in key service areas.', sortOrder: 2 },\n ],\n faq: [\n { id: 'f1', question: 'What is your availability?', answer: 'We maintain flexible hours to accommodate our clients\\' schedules. Evening and weekend appointments are available upon request.', sortOrder: 1 },\n { id: 'f2', question: 'Do you offer remote consultations?', answer: 'Yes, we offer both in-person and virtual consultations via video conference for your convenience.', sortOrder: 2 },\n { id: 'f3', question: 'What are your fees?', answer: 'Fees vary based on the complexity of services required. We provide detailed fee estimates after our initial consultation.', sortOrder: 3 },\n { id: 'f4', question: 'What forms of payment do you accept?', answer: 'We accept checks, credit cards, and bank transfers. Payment plans may be available for certain services.', sortOrder: 4 },\n { id: 'f5', question: 'How do I get started?', answer: 'Contact us to schedule a free initial consultation. We\\'ll discuss your needs and how we can help.', sortOrder: 5 },\n ],\n },\n\n sheetTemplate: {\n tabs: [\n {\n name: 'business',\n required: true,\n columns: [\n { name: 'key', description: 'Setting name', example: 'name', required: true },\n { name: 'value', description: 'Setting value', example: 'Smith & Associates', required: true },\n ],\n },\n {\n name: 'hours',\n required: true,\n columns: [\n { name: 'day', description: 'Day of week', example: 'Monday', required: true },\n { name: 'open', description: 'Opening time', example: '9:00 AM', required: false },\n { name: 'close', description: 'Closing time', example: '5:00 PM', required: false },\n { name: 'closed', description: 'Is closed?', example: 'FALSE', required: false },\n ],\n },\n {\n name: 'services',\n required: true,\n columns: [\n { name: 'title', description: 'Service name', example: 'Tax Preparation', required: true },\n { name: 'description', description: 'Service description', example: 'Individual and business tax returns', required: false },\n { name: 'price_note', description: 'Pricing info', example: 'From $200', required: false },\n { name: 'icon', description: 'Icon name', example: 'calculator', required: false },\n { name: 'sort', description: 'Display order', example: '1', required: false },\n ],\n },\n {\n name: 'team',\n required: false,\n columns: [\n { name: 'name', description: 'Team member name', example: 'John Smith, CPA', required: true },\n { name: 'role', description: 'Role/title', example: 'Principal', required: false },\n { name: 'bio', description: 'Short bio', example: '20+ years of experience...', required: false },\n { name: 'image_url', description: 'Photo URL', example: 'https://drive.google.com/...', required: false },\n { name: 'email', description: 'Direct email', example: 'john@example.com', required: false },\n { name: 'sort', description: 'Display order', example: '1', required: false },\n ],\n },\n {\n name: 'testimonials',\n required: false,\n columns: [\n { name: 'quote', description: 'Client testimonial', example: 'Exceptional service and expertise.', required: true },\n { name: 'name', description: 'Client name', example: 'David L.', required: true },\n { name: 'context', description: 'Service context', example: 'Tax planning', required: false },\n { name: 'rating', description: 'Star rating (1-5)', example: '5', required: false },\n { name: 'sort', description: 'Display order', example: '1', required: false },\n ],\n },\n {\n name: 'faq',\n required: false,\n columns: [\n { name: 'question', description: 'Question text', example: 'What are your fees?', required: true },\n { name: 'answer', description: 'Answer text', example: 'Fees vary based on complexity...', required: true },\n { name: 'sort', description: 'Display order', example: '1', required: false },\n ],\n },\n ],\n },\n\n iconSuggestions: ['briefcase', 'calculator', 'scale', 'shield', 'document', 'chart', 'users', 'check'],\n\n imageSuggestions: [\n 'Professional headshots',\n 'Modern office interior',\n 'Team meeting',\n 'Client consultation',\n 'Professional at work',\n 'Office building exterior',\n ],\n};\n","/**\n * Generic Business Preset\n * A flexible starting point for any business type\n */\n\nimport type { BusinessPreset } from '../types';\n\nexport const genericPreset: BusinessPreset = {\n type: 'generic',\n name: 'Generic Business',\n description: 'A flexible configuration that works for most business types',\n\n config: {\n businessType: 'generic',\n theme: {\n preset: 'cool-blue',\n borderRadius: 'md',\n shadows: 'md',\n },\n pages: {\n home: {\n enabled: true,\n sections: [\n 'hero',\n 'services',\n 'testimonials',\n 'hours',\n 'location',\n 'faq',\n ],\n },\n about: { enabled: true },\n services: { enabled: true },\n gallery: { enabled: true },\n faq: { enabled: true },\n contact: { enabled: true },\n privacy: { enabled: true },\n },\n seo: {\n titleTemplate: '%s | Quality Service',\n keywords: ['local business', 'professional service', 'quality'],\n jsonLdType: 'LocalBusiness',\n },\n contactForm: {\n enabled: true,\n fields: {\n name: true,\n email: true,\n phone: true,\n service: true,\n message: true,\n },\n },\n features: {\n mobileCallBar: true,\n openStatus: true,\n mapEmbed: true,\n socialLinks: true,\n },\n },\n\n defaults: {\n business: {\n tagline: 'Quality Service You Can Trust',\n description: 'We are dedicated to providing exceptional service to our community.',\n priceRange: '$$',\n },\n services: [\n { id: 's1', title: 'Service One', description: 'Our primary service offering', priceNote: 'Contact for pricing', sortOrder: 1 },\n { id: 's2', title: 'Service Two', description: 'Another excellent option', priceNote: 'Contact for pricing', sortOrder: 2 },\n { id: 's3', title: 'Service Three', description: 'Specialized service for unique needs', priceNote: 'Contact for pricing', sortOrder: 3 },\n ],\n faq: [\n { id: 'f1', question: 'What are your hours?', answer: 'Please check our hours section above or contact us for current availability.', sortOrder: 1 },\n { id: 'f2', question: 'How can I contact you?', answer: 'You can reach us by phone, email, or through the contact form on this website.', sortOrder: 2 },\n { id: 'f3', question: 'Do you offer free estimates?', answer: 'Yes, we provide free estimates for most services. Contact us to schedule.', sortOrder: 3 },\n ],\n },\n\n sheetTemplate: {\n tabs: [\n {\n name: 'business',\n required: true,\n columns: [\n { name: 'key', description: 'Setting name', example: 'name', required: true },\n { name: 'value', description: 'Setting value', example: 'Your Business Name', required: true },\n ],\n },\n {\n name: 'hours',\n required: true,\n columns: [\n { name: 'day', description: 'Day of week', example: 'Monday', required: true },\n { name: 'open', description: 'Opening time', example: '9:00 AM', required: false },\n { name: 'close', description: 'Closing time', example: '5:00 PM', required: false },\n { name: 'closed', description: 'Is closed?', example: 'FALSE', required: false },\n ],\n },\n {\n name: 'services',\n required: true,\n columns: [\n { name: 'title', description: 'Service name', example: 'Main Service', required: true },\n { name: 'description', description: 'Service description', example: 'Description of the service', required: false },\n { name: 'price_note', description: 'Pricing info', example: 'From $50', required: false },\n { name: 'icon', description: 'Icon name', example: 'star', required: false },\n { name: 'sort', description: 'Display order', example: '1', required: false },\n ],\n },\n {\n name: 'gallery',\n required: false,\n columns: [\n { name: 'image_url', description: 'Image URL', example: 'https://drive.google.com/...', required: true },\n { name: 'alt', description: 'Image description', example: 'Image description', required: false },\n { name: 'caption', description: 'Caption text', example: 'Photo caption', required: false },\n { name: 'sort', description: 'Display order', example: '1', required: false },\n ],\n },\n {\n name: 'testimonials',\n required: false,\n columns: [\n { name: 'quote', description: 'Customer review', example: 'Great service!', required: true },\n { name: 'name', description: 'Customer name', example: 'John D.', required: true },\n { name: 'rating', description: 'Star rating (1-5)', example: '5', required: false },\n { name: 'sort', description: 'Display order', example: '1', required: false },\n ],\n },\n {\n name: 'faq',\n required: false,\n columns: [\n { name: 'question', description: 'Question text', example: 'Common question?', required: true },\n { name: 'answer', description: 'Answer text', example: 'The answer...', required: true },\n { name: 'sort', description: 'Display order', example: '1', required: false },\n ],\n },\n ],\n },\n\n iconSuggestions: ['star', 'check', 'heart', 'sparkles', 'shield', 'clock', 'phone', 'mail'],\n\n imageSuggestions: [\n 'Professional team photo',\n 'Service in action',\n 'Happy customers',\n 'Business storefront',\n 'Quality workmanship',\n 'Before and after results',\n ],\n};\n","/**\n * Business Type Presets\n *\n * Pre-configured setups for different business types.\n * Each preset includes theme, pages, SEO, and default content.\n */\n\nimport type { BusinessPreset, BusinessType } from '../types';\nimport { tailorPreset } from './tailor';\nimport { restaurantPreset } from './restaurant';\nimport { homeKitchenPreset } from './home-kitchen';\nimport { salonPreset } from './salon';\nimport { repairPreset } from './repair';\nimport { professionalPreset } from './professional';\nimport { genericPreset } from './generic';\n\n// Re-export individual presets\nexport { tailorPreset } from './tailor';\nexport { restaurantPreset } from './restaurant';\nexport { homeKitchenPreset } from './home-kitchen';\nexport { salonPreset } from './salon';\nexport { repairPreset } from './repair';\nexport { professionalPreset } from './professional';\nexport { genericPreset } from './generic';\n\n/**\n * Map of all available presets by business type.\n */\nexport const presets: Record<string, BusinessPreset> = {\n // Direct mappings\n 'tailor': tailorPreset,\n 'restaurant': restaurantPreset,\n 'home-kitchen': homeKitchenPreset,\n 'salon': salonPreset,\n 'shoe-repair': repairPreset,\n 'accountant': professionalPreset,\n 'generic': genericPreset,\n\n // Aliases - map similar business types to their closest preset\n 'alterations': tailorPreset,\n 'seamstress': tailorPreset,\n 'dry-cleaner': tailorPreset,\n\n 'cafe': restaurantPreset,\n 'bakery': homeKitchenPreset,\n 'food-truck': restaurantPreset,\n 'catering': restaurantPreset,\n\n 'barbershop': salonPreset,\n 'spa': salonPreset,\n 'nail-salon': salonPreset,\n 'pet-grooming': salonPreset,\n\n 'craft-seller': homeKitchenPreset,\n 'boutique': genericPreset,\n 'florist': genericPreset,\n 'gift-shop': genericPreset,\n\n 'cleaning': repairPreset,\n 'landscaping': repairPreset,\n 'handyman': repairPreset,\n 'plumber': repairPreset,\n 'electrician': repairPreset,\n 'hvac': repairPreset,\n 'moving': repairPreset,\n 'pest-control': repairPreset,\n\n 'auto-repair': repairPreset,\n 'auto-detail': repairPreset,\n 'tire-shop': repairPreset,\n\n 'lawyer': professionalPreset,\n 'real-estate': professionalPreset,\n 'insurance': professionalPreset,\n 'consulting': professionalPreset,\n\n 'personal-trainer': genericPreset,\n 'yoga-studio': genericPreset,\n 'martial-arts': genericPreset,\n 'chiropractor': professionalPreset,\n 'massage': salonPreset,\n\n 'tutoring': professionalPreset,\n 'music-lessons': genericPreset,\n 'photography': genericPreset,\n 'videography': genericPreset,\n 'event-planning': genericPreset,\n};\n\n/**\n * Get a preset by business type.\n * Falls back to generic preset if type is not found.\n */\nexport function getPreset(type: BusinessType | string): BusinessPreset {\n return presets[type] || genericPreset;\n}\n\n/**\n * Get a list of all supported business types with their display names.\n */\nexport function getSupportedBusinessTypes(): Array<{ type: BusinessType; name: string; description: string }> {\n const uniquePresets = new Map<string, BusinessPreset>();\n\n // Get unique presets (avoid duplicates from aliases)\n for (const preset of Object.values(presets)) {\n if (!uniquePresets.has(preset.type)) {\n uniquePresets.set(preset.type, preset);\n }\n }\n\n return Array.from(uniquePresets.values()).map((preset) => ({\n type: preset.type,\n name: preset.name,\n description: preset.description,\n }));\n}\n\n/**\n * Business type categories for organization.\n */\nexport const businessCategories = {\n 'Service Businesses': [\n 'tailor',\n 'shoe-repair',\n 'dry-cleaner',\n 'salon',\n 'barbershop',\n 'spa',\n 'nail-salon',\n 'pet-grooming',\n ],\n 'Food & Beverage': [\n 'restaurant',\n 'cafe',\n 'bakery',\n 'food-truck',\n 'home-kitchen',\n 'catering',\n ],\n 'Retail': [\n 'craft-seller',\n 'boutique',\n 'florist',\n 'gift-shop',\n ],\n 'Home Services': [\n 'cleaning',\n 'landscaping',\n 'handyman',\n 'plumber',\n 'electrician',\n 'hvac',\n 'moving',\n 'pest-control',\n ],\n 'Auto Services': [\n 'auto-repair',\n 'auto-detail',\n 'tire-shop',\n ],\n 'Professional Services': [\n 'accountant',\n 'lawyer',\n 'real-estate',\n 'insurance',\n 'consulting',\n ],\n 'Health & Wellness': [\n 'personal-trainer',\n 'yoga-studio',\n 'martial-arts',\n 'chiropractor',\n 'massage',\n ],\n 'Education & Creative': [\n 'tutoring',\n 'music-lessons',\n 'photography',\n 'videography',\n 'event-planning',\n ],\n};\n\n/**\n * Recommend a business type based on keywords.\n * Enhanced with comprehensive keyword mappings for common Google Maps categories\n * and variations found in scraped lead data.\n *\n * @param keywords - Array of keywords (business name, category, description)\n * @returns The recommended BusinessType\n *\n * @example\n * ```ts\n * recommendBusinessType(['tailor', 'alterations']) // => 'tailor'\n * recommendBusinessType(['Pizza Restaurant']) // => 'restaurant'\n * recommendBusinessType([\"Maria's Hair Salon\"]) // => 'salon'\n * ```\n */\nexport function recommendBusinessType(keywords: string[]): BusinessType {\n const lowerKeywords = keywords.map((k) => k.toLowerCase());\n\n // Comprehensive keyword mapping - ordered by specificity\n // More specific matches should come first\n const keywordMap: Record<string, BusinessType> = {\n // ==========================================================================\n // TAILOR / ALTERATIONS\n // ==========================================================================\n 'tailor': 'tailor',\n 'tailor shop': 'tailor',\n 'tailoring': 'tailor',\n 'alterations': 'tailor',\n 'alteration': 'tailor',\n 'seamstress': 'tailor',\n 'sewing': 'tailor',\n 'hemming': 'tailor',\n 'clothing repair': 'tailor',\n 'suit alterations': 'tailor',\n 'dress alterations': 'tailor',\n 'wedding dress': 'tailor',\n 'bridal alterations': 'tailor',\n 'custom suits': 'tailor',\n 'bespoke': 'tailor',\n\n // Dry cleaning (maps to tailor preset)\n 'dry cleaner': 'dry-cleaner',\n 'dry cleaning': 'dry-cleaner',\n 'laundry': 'dry-cleaner',\n 'laundromat': 'dry-cleaner',\n 'cleaners': 'dry-cleaner',\n\n // ==========================================================================\n // RESTAURANT / FOOD SERVICE\n // ==========================================================================\n 'restaurant': 'restaurant',\n 'dining': 'restaurant',\n 'eatery': 'restaurant',\n 'bistro': 'restaurant',\n 'brasserie': 'restaurant',\n 'trattoria': 'restaurant',\n 'pizzeria': 'restaurant',\n 'pizza': 'restaurant',\n 'mexican restaurant': 'restaurant',\n 'italian restaurant': 'restaurant',\n 'chinese restaurant': 'restaurant',\n 'thai restaurant': 'restaurant',\n 'indian restaurant': 'restaurant',\n 'japanese restaurant': 'restaurant',\n 'sushi': 'restaurant',\n 'ramen': 'restaurant',\n 'pho': 'restaurant',\n 'taqueria': 'restaurant',\n 'burrito': 'restaurant',\n 'burger': 'restaurant',\n 'steakhouse': 'restaurant',\n 'seafood': 'restaurant',\n 'grill': 'restaurant',\n 'bbq': 'restaurant',\n 'barbecue': 'restaurant',\n 'diner': 'restaurant',\n 'deli': 'restaurant',\n 'sandwich': 'restaurant',\n 'sub shop': 'restaurant',\n\n // Cafe / Coffee\n 'cafe': 'cafe',\n 'café': 'cafe',\n 'coffee shop': 'cafe',\n 'coffee house': 'cafe',\n 'coffeehouse': 'cafe',\n 'espresso': 'cafe',\n 'tea house': 'cafe',\n 'tea room': 'cafe',\n 'juice bar': 'cafe',\n 'smoothie': 'cafe',\n\n // Food truck\n 'food truck': 'food-truck',\n 'food cart': 'food-truck',\n 'mobile food': 'food-truck',\n\n // Catering\n 'catering': 'catering',\n 'caterer': 'catering',\n 'event catering': 'catering',\n\n // ==========================================================================\n // BAKERY / HOME KITCHEN\n // ==========================================================================\n 'bakery': 'bakery',\n 'baker': 'bakery',\n 'baking': 'bakery',\n 'bread': 'bakery',\n 'pastry': 'bakery',\n 'pastries': 'bakery',\n 'patisserie': 'bakery',\n 'donut': 'bakery',\n 'doughnut': 'bakery',\n 'bagel': 'bakery',\n\n // Home kitchen / Cottage food\n 'home kitchen': 'home-kitchen',\n 'cottage food': 'home-kitchen',\n 'homemade': 'home-kitchen',\n 'home baked': 'home-kitchen',\n 'cookies': 'home-kitchen',\n 'cakes': 'home-kitchen',\n 'cupcakes': 'home-kitchen',\n 'custom cakes': 'home-kitchen',\n 'wedding cakes': 'home-kitchen',\n 'desserts': 'home-kitchen',\n 'tamales': 'home-kitchen',\n 'empanadas': 'home-kitchen',\n 'meal prep': 'home-kitchen',\n\n // ==========================================================================\n // SALON / BEAUTY\n // ==========================================================================\n 'salon': 'salon',\n 'hair salon': 'salon',\n 'hair stylist': 'salon',\n 'hairdresser': 'salon',\n 'hairstylist': 'salon',\n 'beauty salon': 'salon',\n 'beauty parlor': 'salon',\n 'beautician': 'salon',\n 'cosmetologist': 'salon',\n 'hair cutting': 'salon',\n 'haircut': 'salon',\n 'hair coloring': 'salon',\n 'highlights': 'salon',\n 'blowout': 'salon',\n 'extensions': 'salon',\n 'braiding': 'salon',\n 'weave': 'salon',\n 'locs': 'salon',\n 'dreadlocks': 'salon',\n\n // Barbershop\n 'barber': 'barbershop',\n 'barbershop': 'barbershop',\n 'barber shop': 'barbershop',\n \"men's haircut\": 'barbershop',\n 'fade': 'barbershop',\n 'lineup': 'barbershop',\n\n // Spa\n 'spa': 'spa',\n 'day spa': 'spa',\n 'med spa': 'spa',\n 'medical spa': 'spa',\n 'facial': 'spa',\n 'facials': 'spa',\n 'skincare': 'spa',\n 'esthetician': 'spa',\n 'aesthetician': 'spa',\n 'waxing': 'spa',\n 'laser hair': 'spa',\n\n // Nail salon\n 'nail salon': 'nail-salon',\n 'nail': 'nail-salon',\n 'nails': 'nail-salon',\n 'manicure': 'nail-salon',\n 'pedicure': 'nail-salon',\n 'gel nails': 'nail-salon',\n 'acrylic nails': 'nail-salon',\n\n // Massage\n 'massage': 'massage',\n 'massage therapy': 'massage',\n 'massage therapist': 'massage',\n 'deep tissue': 'massage',\n 'swedish massage': 'massage',\n 'thai massage': 'massage',\n 'sports massage': 'massage',\n 'reflexology': 'massage',\n\n // Pet grooming\n 'pet grooming': 'pet-grooming',\n 'dog grooming': 'pet-grooming',\n 'pet groomer': 'pet-grooming',\n 'dog groomer': 'pet-grooming',\n 'cat grooming': 'pet-grooming',\n 'mobile grooming': 'pet-grooming',\n\n // ==========================================================================\n // REPAIR / SHOE REPAIR\n // ==========================================================================\n 'shoe repair': 'shoe-repair',\n 'shoe shop': 'shoe-repair',\n 'cobbler': 'shoe-repair',\n 'leather repair': 'shoe-repair',\n 'boot repair': 'shoe-repair',\n 'heel repair': 'shoe-repair',\n 'sole repair': 'shoe-repair',\n 'shoe shine': 'shoe-repair',\n 'luggage repair': 'shoe-repair',\n 'purse repair': 'shoe-repair',\n 'bag repair': 'shoe-repair',\n\n // ==========================================================================\n // HOME SERVICES\n // ==========================================================================\n // Cleaning\n 'cleaning': 'cleaning',\n 'cleaning service': 'cleaning',\n 'house cleaning': 'cleaning',\n 'home cleaning': 'cleaning',\n 'maid service': 'cleaning',\n 'maid': 'cleaning',\n 'janitorial': 'cleaning',\n 'carpet cleaning': 'cleaning',\n 'window cleaning': 'cleaning',\n 'pressure washing': 'cleaning',\n 'power washing': 'cleaning',\n\n // Landscaping\n 'landscaping': 'landscaping',\n 'landscaper': 'landscaping',\n 'lawn care': 'landscaping',\n 'lawn service': 'landscaping',\n 'lawn mowing': 'landscaping',\n 'gardening': 'landscaping',\n 'gardener': 'landscaping',\n 'tree service': 'landscaping',\n 'tree trimming': 'landscaping',\n 'irrigation': 'landscaping',\n 'sprinkler': 'landscaping',\n\n // Handyman\n 'handyman': 'handyman',\n 'handy man': 'handyman',\n 'home repair': 'handyman',\n 'home maintenance': 'handyman',\n 'general contractor': 'handyman',\n 'remodeling': 'handyman',\n 'renovation': 'handyman',\n\n // Plumber\n 'plumber': 'plumber',\n 'plumbing': 'plumber',\n 'plumber service': 'plumber',\n 'drain': 'plumber',\n 'sewer': 'plumber',\n 'water heater': 'plumber',\n\n // Electrician\n 'electrician': 'electrician',\n 'electrical': 'electrician',\n 'electric': 'electrician',\n 'electrical contractor': 'electrician',\n 'wiring': 'electrician',\n 'panel': 'electrician',\n\n // HVAC\n 'hvac': 'hvac',\n 'air conditioning': 'hvac',\n 'ac repair': 'hvac',\n 'heating': 'hvac',\n 'furnace': 'hvac',\n 'ventilation': 'hvac',\n\n // Moving\n 'moving': 'moving',\n 'movers': 'moving',\n 'moving company': 'moving',\n 'relocation': 'moving',\n 'hauling': 'moving',\n 'junk removal': 'moving',\n\n // Pest control\n 'pest control': 'pest-control',\n 'exterminator': 'pest-control',\n 'pest': 'pest-control',\n 'termite': 'pest-control',\n 'rodent': 'pest-control',\n 'bed bug': 'pest-control',\n\n // ==========================================================================\n // AUTO SERVICES\n // ==========================================================================\n 'auto repair': 'auto-repair',\n 'auto shop': 'auto-repair',\n 'car repair': 'auto-repair',\n 'mechanic': 'auto-repair',\n 'automotive': 'auto-repair',\n 'auto service': 'auto-repair',\n 'transmission': 'auto-repair',\n 'brake': 'auto-repair',\n 'oil change': 'auto-repair',\n 'tune up': 'auto-repair',\n 'smog': 'auto-repair',\n 'emissions': 'auto-repair',\n\n // Auto detail\n 'auto detail': 'auto-detail',\n 'car detail': 'auto-detail',\n 'auto detailing': 'auto-detail',\n 'car detailing': 'auto-detail',\n 'car wash': 'auto-detail',\n 'mobile detail': 'auto-detail',\n\n // Tire shop\n 'tire shop': 'tire-shop',\n 'tire': 'tire-shop',\n 'tires': 'tire-shop',\n 'tire service': 'tire-shop',\n 'wheel': 'tire-shop',\n 'alignment': 'tire-shop',\n\n // ==========================================================================\n // PROFESSIONAL SERVICES\n // ==========================================================================\n // Accountant\n 'accountant': 'accountant',\n 'accounting': 'accountant',\n 'bookkeeper': 'accountant',\n 'bookkeeping': 'accountant',\n 'tax': 'accountant',\n 'tax preparation': 'accountant',\n 'tax preparer': 'accountant',\n 'cpa': 'accountant',\n 'enrolled agent': 'accountant',\n\n // Lawyer\n 'lawyer': 'lawyer',\n 'attorney': 'lawyer',\n 'law firm': 'lawyer',\n 'law office': 'lawyer',\n 'legal': 'lawyer',\n 'legal services': 'lawyer',\n 'immigration': 'lawyer',\n 'divorce': 'lawyer',\n 'criminal defense': 'lawyer',\n 'personal injury': 'lawyer',\n 'bankruptcy': 'lawyer',\n 'estate planning': 'lawyer',\n 'notary': 'lawyer',\n\n // Real estate\n 'real estate': 'real-estate',\n 'realtor': 'real-estate',\n 'realty': 'real-estate',\n 'real estate agent': 'real-estate',\n 'real estate broker': 'real-estate',\n 'property management': 'real-estate',\n\n // Insurance\n 'insurance': 'insurance',\n 'insurance agent': 'insurance',\n 'insurance agency': 'insurance',\n 'insurance broker': 'insurance',\n 'life insurance': 'insurance',\n 'auto insurance': 'insurance',\n 'health insurance': 'insurance',\n 'medicare': 'insurance',\n\n // Consulting\n 'consultant': 'consulting',\n 'consulting': 'consulting',\n 'business consultant': 'consulting',\n 'management consultant': 'consulting',\n 'advisor': 'consulting',\n 'financial advisor': 'consulting',\n\n // ==========================================================================\n // HEALTH & WELLNESS\n // ==========================================================================\n // Personal trainer\n 'personal trainer': 'personal-trainer',\n 'personal training': 'personal-trainer',\n 'fitness trainer': 'personal-trainer',\n 'fitness': 'personal-trainer',\n 'gym': 'personal-trainer',\n 'crossfit': 'personal-trainer',\n 'boot camp': 'personal-trainer',\n\n // Yoga\n 'yoga': 'yoga-studio',\n 'yoga studio': 'yoga-studio',\n 'yoga instructor': 'yoga-studio',\n 'pilates': 'yoga-studio',\n 'meditation': 'yoga-studio',\n\n // Martial arts\n 'martial arts': 'martial-arts',\n 'karate': 'martial-arts',\n 'taekwondo': 'martial-arts',\n 'jiu jitsu': 'martial-arts',\n 'bjj': 'martial-arts',\n 'mma': 'martial-arts',\n 'boxing': 'martial-arts',\n 'kickboxing': 'martial-arts',\n 'kung fu': 'martial-arts',\n 'judo': 'martial-arts',\n 'self defense': 'martial-arts',\n\n // Chiropractor\n 'chiropractor': 'chiropractor',\n 'chiropractic': 'chiropractor',\n 'spine': 'chiropractor',\n 'back pain': 'chiropractor',\n\n // ==========================================================================\n // RETAIL\n // ==========================================================================\n // Craft seller\n 'craft': 'craft-seller',\n 'crafts': 'craft-seller',\n 'handmade': 'craft-seller',\n 'artisan': 'craft-seller',\n 'etsy': 'craft-seller',\n 'handcraft': 'craft-seller',\n 'jewelry maker': 'craft-seller',\n 'candle': 'craft-seller',\n 'soap maker': 'craft-seller',\n 'pottery': 'craft-seller',\n\n // Boutique\n 'boutique': 'boutique',\n 'clothing store': 'boutique',\n 'fashion': 'boutique',\n 'apparel': 'boutique',\n 'women clothing': 'boutique',\n 'consignment': 'boutique',\n 'thrift': 'boutique',\n 'vintage': 'boutique',\n\n // Florist\n 'florist': 'florist',\n 'flower shop': 'florist',\n 'flowers': 'florist',\n 'floral': 'florist',\n 'floral design': 'florist',\n\n // Gift shop\n 'gift shop': 'gift-shop',\n 'gift store': 'gift-shop',\n 'gifts': 'gift-shop',\n 'souvenir': 'gift-shop',\n 'novelty': 'gift-shop',\n\n // ==========================================================================\n // EDUCATION & CREATIVE\n // ==========================================================================\n // Tutoring\n 'tutor': 'tutoring',\n 'tutoring': 'tutoring',\n 'tutoring service': 'tutoring',\n 'learning center': 'tutoring',\n 'test prep': 'tutoring',\n 'sat prep': 'tutoring',\n 'math tutor': 'tutoring',\n 'english tutor': 'tutoring',\n 'homework help': 'tutoring',\n\n // Music lessons\n 'music lessons': 'music-lessons',\n 'music teacher': 'music-lessons',\n 'music school': 'music-lessons',\n 'piano lessons': 'music-lessons',\n 'guitar lessons': 'music-lessons',\n 'voice lessons': 'music-lessons',\n 'singing lessons': 'music-lessons',\n 'drum lessons': 'music-lessons',\n 'violin lessons': 'music-lessons',\n\n // Photography\n 'photographer': 'photography',\n 'photography': 'photography',\n 'photo studio': 'photography',\n 'portrait': 'photography',\n 'wedding photographer': 'photography',\n 'headshot': 'photography',\n\n // Videography\n 'videographer': 'videography',\n 'videography': 'videography',\n 'video production': 'videography',\n 'video editor': 'videography',\n 'filmmaker': 'videography',\n\n // Event planning\n 'event planner': 'event-planning',\n 'event planning': 'event-planning',\n 'wedding planner': 'event-planning',\n 'party planner': 'event-planning',\n 'event coordinator': 'event-planning',\n 'event venue': 'event-planning',\n };\n\n // Check each keyword against the map\n for (const keyword of lowerKeywords) {\n // First, try exact matches\n if (keywordMap[keyword]) {\n return keywordMap[keyword];\n }\n\n // Then, try partial matches (keyword contains key or key contains keyword)\n for (const [key, type] of Object.entries(keywordMap)) {\n if (keyword.includes(key) || key.includes(keyword)) {\n return type;\n }\n }\n }\n\n return 'generic';\n}\n","/**\n * SheetSite Configuration Module\n *\n * Provides configuration types, business type presets, and utilities\n * for setting up and customizing websites.\n */\n\n// Types\nexport * from './types';\n\n// Presets\nexport {\n presets,\n getPreset,\n getSupportedBusinessTypes,\n businessCategories,\n recommendBusinessType,\n tailorPreset,\n restaurantPreset,\n homeKitchenPreset,\n salonPreset,\n repairPreset,\n professionalPreset,\n genericPreset,\n} from './presets';\n\n// =============================================================================\n// CONFIGURATION UTILITIES\n// =============================================================================\n\nimport type {\n SiteConfig,\n BusinessType,\n BusinessPreset,\n ThemePreset,\n PageConfig,\n HomeSectionType,\n} from './types';\nimport { getPreset } from './presets';\n\n/**\n * Create a site configuration from a business preset.\n * Allows overriding specific values.\n */\nexport function createSiteConfig(\n businessType: BusinessType | string,\n overrides?: Partial<SiteConfig>\n): SiteConfig {\n const preset = getPreset(businessType);\n const config = { ...preset.config };\n\n if (overrides) {\n // Merge theme\n if (overrides.theme) {\n config.theme = { ...config.theme, ...overrides.theme };\n }\n\n // Merge pages\n if (overrides.pages) {\n config.pages = { ...config.pages, ...overrides.pages } as SiteConfig['pages'];\n }\n\n // Merge SEO\n if (overrides.seo) {\n config.seo = { ...config.seo, ...overrides.seo };\n }\n\n // Merge contact form\n if (overrides.contactForm) {\n config.contactForm = { ...config.contactForm, ...overrides.contactForm };\n }\n\n // Merge features\n if (overrides.features) {\n config.features = { ...config.features, ...overrides.features };\n }\n\n // Simple overrides\n if (overrides.siteUrl) config.siteUrl = overrides.siteUrl;\n if (overrides.customClasses) {\n config.customClasses = { ...config.customClasses, ...overrides.customClasses };\n }\n }\n\n return config;\n}\n\n/**\n * Get the sheet template for a business type.\n * Useful for generating documentation or Google Sheet templates.\n */\nexport function getSheetTemplate(businessType: BusinessType | string): BusinessPreset['sheetTemplate'] {\n const preset = getPreset(businessType);\n return preset.sheetTemplate;\n}\n\n/**\n * Get default data for a business type.\n */\nexport function getDefaultData(businessType: BusinessType | string): BusinessPreset['defaults'] {\n const preset = getPreset(businessType);\n return preset.defaults;\n}\n\n/**\n * Get icon suggestions for a business type.\n */\nexport function getIconSuggestions(businessType: BusinessType | string): string[] {\n const preset = getPreset(businessType);\n return preset.iconSuggestions;\n}\n\n/**\n * Get image suggestions for a business type.\n */\nexport function getImageSuggestions(businessType: BusinessType | string): string[] {\n const preset = getPreset(businessType);\n return preset.imageSuggestions;\n}\n\n/**\n * Validate a site configuration.\n */\nexport function validateSiteConfig(config: SiteConfig): { valid: boolean; errors: string[] } {\n const errors: string[] = [];\n\n // Check required fields\n if (!config.businessType) {\n errors.push('businessType is required');\n }\n\n if (!config.pages?.home) {\n errors.push('pages.home configuration is required');\n }\n\n if (!config.theme) {\n errors.push('theme configuration is required');\n }\n\n // Check home page sections\n if (config.pages?.home?.sections) {\n const validSections: HomeSectionType[] = [\n 'hero', 'services', 'menu', 'products', 'gallery',\n 'testimonials', 'team', 'faq', 'hours', 'location',\n 'contact-form', 'cta', 'how-it-works', 'announcements', 'about-preview',\n ];\n\n for (const section of config.pages.home.sections) {\n if (!validSections.includes(section)) {\n errors.push(`Invalid home section: ${section}`);\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n\n// =============================================================================\n// THEME HELPERS\n// =============================================================================\n\n/**\n * Get available theme presets.\n */\nexport const themePresets: ThemePreset[] = [\n 'warm-brown',\n 'cool-blue',\n 'earth-green',\n 'warm-amber',\n 'elegant-gold',\n 'fresh-teal',\n 'bold-red',\n 'soft-pink',\n 'slate-gray',\n 'forest-green',\n];\n\n/**\n * Get a description for a theme preset.\n */\nexport function getThemeDescription(preset: ThemePreset): string {\n const descriptions: Record<ThemePreset, string> = {\n 'warm-brown': 'Warm, earthy tones perfect for tailoring, leather goods, and traditional crafts',\n 'cool-blue': 'Professional and trustworthy, ideal for professional services and tech',\n 'earth-green': 'Natural and organic, great for eco-friendly, outdoor, and health businesses',\n 'warm-amber': 'Welcoming and appetizing, perfect for food, hospitality, and home businesses',\n 'elegant-gold': 'Luxurious and sophisticated, suited for upscale and formal businesses',\n 'fresh-teal': 'Modern and creative, ideal for spas, creative studios, and wellness',\n 'bold-red': 'Energetic and urgent, great for automotive, sports, and action-oriented businesses',\n 'soft-pink': 'Gentle and feminine, perfect for beauty, weddings, and delicate services',\n 'slate-gray': 'Minimalist and industrial, suited for modern, urban businesses',\n 'forest-green': 'Deep and natural, ideal for outdoor, nature, and sustainability-focused businesses',\n };\n\n return descriptions[preset];\n}\n\n/**\n * Recommend a theme based on business type.\n */\nexport function recommendTheme(businessType: BusinessType | string): ThemePreset {\n const preset = getPreset(businessType);\n return preset.config.theme.preset || 'cool-blue';\n}\n","/**\n * SheetSite Theme Module\n *\n * Provides theming utilities, color palettes, and Tailwind CSS configuration helpers.\n */\n\nimport type { ThemeConfig, ThemePreset, ColorPalette, FontConfig } from '../config/types';\nexport { getColorPalette, themePalettes } from './colors';\nexport * from './colors';\n\n// =============================================================================\n// FONT CONFIGURATIONS\n// =============================================================================\n\n/**\n * Recommended font pairings.\n */\nexport const fontPairings: Record<string, FontConfig> = {\n classic: {\n heading: 'Playfair Display',\n body: 'Inter',\n },\n modern: {\n heading: 'Inter',\n body: 'Inter',\n },\n elegant: {\n heading: 'Cormorant Garamond',\n body: 'Lato',\n },\n friendly: {\n heading: 'Nunito',\n body: 'Open Sans',\n },\n professional: {\n heading: 'Merriweather',\n body: 'Source Sans Pro',\n },\n bold: {\n heading: 'Montserrat',\n body: 'Roboto',\n },\n};\n\n// =============================================================================\n// TAILWIND CONFIGURATION GENERATOR\n// =============================================================================\n\n/**\n * Generate Tailwind CSS theme extension from a theme configuration.\n */\nexport function generateTailwindTheme(config: ThemeConfig): object {\n const { getColorPalette } = require('./colors');\n const palette = config.preset ? getColorPalette(config.preset) : null;\n\n // Merge custom colors with preset\n const colors = {\n primary: {\n ...(palette?.primary || {}),\n ...(config.colors?.primary || {}),\n },\n accent: {\n ...(palette?.accent || {}),\n ...(config.colors?.accent || {}),\n },\n };\n\n return {\n colors,\n fontFamily: config.fonts\n ? {\n heading: [config.fonts.heading, 'serif'],\n body: [config.fonts.body, 'sans-serif'],\n ...(config.fonts.accent ? { accent: [config.fonts.accent, 'sans-serif'] } : {}),\n }\n : undefined,\n borderRadius: config.borderRadius\n ? {\n DEFAULT: getBorderRadiusValue(config.borderRadius),\n }\n : undefined,\n boxShadow: config.shadows\n ? {\n DEFAULT: getShadowValue(config.shadows),\n }\n : undefined,\n };\n}\n\n/**\n * Generate a complete Tailwind config object.\n */\nexport function generateTailwindConfig(config: ThemeConfig): object {\n const themeExtend = generateTailwindTheme(config);\n\n return {\n theme: {\n extend: themeExtend,\n },\n };\n}\n\n/**\n * Generate CSS custom properties from a theme configuration.\n * Useful for CSS-in-JS or custom styling.\n */\nexport function generateCSSVariables(config: ThemeConfig): Record<string, string> {\n const { getColorPalette } = require('./colors');\n const palette = config.preset ? getColorPalette(config.preset) : null;\n const variables: Record<string, string> = {};\n\n // Add color variables\n if (palette) {\n for (const [shade, color] of Object.entries(palette.primary)) {\n variables[`--color-primary-${shade}`] = color as string;\n }\n for (const [shade, color] of Object.entries(palette.accent)) {\n variables[`--color-accent-${shade}`] = color as string;\n }\n }\n\n // Add custom colors\n if (config.colors?.primary) {\n for (const [shade, color] of Object.entries(config.colors.primary)) {\n variables[`--color-primary-${shade}`] = color;\n }\n }\n if (config.colors?.accent) {\n for (const [shade, color] of Object.entries(config.colors.accent)) {\n variables[`--color-accent-${shade}`] = color;\n }\n }\n\n // Add font variables\n if (config.fonts) {\n if (config.fonts.heading) {\n variables['--font-heading'] = config.fonts.heading;\n }\n if (config.fonts.body) {\n variables['--font-body'] = config.fonts.body;\n }\n if (config.fonts.accent) {\n variables['--font-accent'] = config.fonts.accent;\n }\n }\n\n return variables;\n}\n\n/**\n * Generate the CSS string for custom properties.\n */\nexport function generateCSSVariablesString(config: ThemeConfig): string {\n const variables = generateCSSVariables(config);\n const lines = Object.entries(variables).map(([key, value]) => ` ${key}: ${value};`);\n return `:root {\\n${lines.join('\\n')}\\n}`;\n}\n\n// =============================================================================\n// HELPERS\n// =============================================================================\n\nfunction getBorderRadiusValue(size: ThemeConfig['borderRadius']): string {\n const values: Record<NonNullable<ThemeConfig['borderRadius']>, string> = {\n none: '0',\n sm: '0.125rem',\n md: '0.375rem',\n lg: '0.5rem',\n xl: '0.75rem',\n full: '9999px',\n };\n return values[size || 'md'];\n}\n\nfunction getShadowValue(size: ThemeConfig['shadows']): string {\n const values: Record<NonNullable<ThemeConfig['shadows']>, string> = {\n none: 'none',\n sm: '0 1px 2px 0 rgb(0 0 0 / 0.05)',\n md: '0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)',\n lg: '0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)',\n };\n return values[size || 'md'];\n}\n\n// =============================================================================\n// THEME UTILITIES\n// =============================================================================\n\n/**\n * Get the primary color for a given shade.\n */\nexport function getPrimaryColor(config: ThemeConfig, shade: keyof ColorPalette['primary'] = 600): string {\n const { getColorPalette } = require('./colors');\n\n // Check custom colors first\n if (config.colors?.primary?.[shade]) {\n return config.colors.primary[shade];\n }\n\n // Fall back to preset\n if (config.preset) {\n const palette = getColorPalette(config.preset);\n return palette.primary[shade];\n }\n\n // Default\n return '#0c8de9'; // cool-blue 500\n}\n\n/**\n * Get the accent color for a given shade.\n */\nexport function getAccentColor(config: ThemeConfig, shade: keyof ColorPalette['accent'] = 600): string {\n const { getColorPalette } = require('./colors');\n\n // Check custom colors first\n if (config.colors?.accent?.[shade]) {\n return config.colors.accent[shade];\n }\n\n // Fall back to preset\n if (config.preset) {\n const palette = getColorPalette(config.preset);\n return palette.accent[shade];\n }\n\n // Default\n return '#16a34a'; // green 600\n}\n\n/**\n * Recommend a font pairing for a business type.\n */\nexport function recommendFontPairing(businessType: string): FontConfig {\n const recommendations: Record<string, string> = {\n tailor: 'classic',\n restaurant: 'elegant',\n 'home-kitchen': 'friendly',\n salon: 'modern',\n accountant: 'professional',\n lawyer: 'professional',\n 'auto-repair': 'bold',\n 'shoe-repair': 'classic',\n generic: 'modern',\n };\n\n const pairingName = recommendations[businessType] || 'modern';\n return fontPairings[pairingName];\n}\n","/**\n * Header Component\n *\n * A responsive header with navigation and mobile menu.\n */\n\n'use client';\n\nimport React, { useState } from 'react';\nimport type { BusinessInfo } from '../../data/types';\nimport { MenuIcon, XIcon, PhoneIcon } from '../ui/Icons';\n\nexport interface NavItem {\n label: string;\n href: string;\n}\n\nexport interface HeaderProps {\n business: BusinessInfo;\n navigation?: NavItem[];\n sticky?: boolean;\n transparent?: boolean;\n showPhone?: boolean;\n className?: string;\n}\n\nconst defaultNavigation: NavItem[] = [\n { label: 'Home', href: '/' },\n { label: 'Services', href: '/services' },\n { label: 'Gallery', href: '/gallery' },\n { label: 'About', href: '/about' },\n { label: 'Contact', href: '/contact' },\n];\n\n/**\n * Header component.\n */\nexport function Header({\n business,\n navigation = defaultNavigation,\n sticky = true,\n transparent = false,\n showPhone = true,\n className = '',\n}: HeaderProps) {\n const [mobileMenuOpen, setMobileMenuOpen] = useState(false);\n\n return (\n <header\n className={`\n ${sticky ? 'sticky top-0 z-50' : ''}\n ${transparent ? 'bg-transparent' : 'bg-white shadow-sm'}\n ${className}\n `}\n >\n <nav className=\"container mx-auto px-4\">\n <div className=\"flex items-center justify-between h-16\">\n {/* Logo / Business Name */}\n <a href=\"/\" className=\"flex items-center\">\n {business.logoUrl ? (\n <img\n src={business.logoUrl}\n alt={business.name}\n className=\"h-10 w-auto\"\n />\n ) : (\n <span className=\"text-xl font-bold text-gray-900\">{business.name}</span>\n )}\n </a>\n\n {/* Desktop Navigation */}\n <div className=\"hidden md:flex items-center space-x-8\">\n {navigation.map((item) => (\n <a\n key={item.href}\n href={item.href}\n className=\"text-gray-600 hover:text-primary-600 font-medium transition-colors\"\n >\n {item.label}\n </a>\n ))}\n\n {/* Phone Button */}\n {showPhone && business.phone && (\n <a\n href={`tel:${business.phone.replace(/\\D/g, '')}`}\n className=\"inline-flex items-center px-4 py-2 bg-primary-600 text-white rounded-lg hover:bg-primary-700 transition-colors\"\n >\n <PhoneIcon size={18} className=\"mr-2\" />\n {business.phone}\n </a>\n )}\n </div>\n\n {/* Mobile Menu Button */}\n <button\n className=\"md:hidden p-2 rounded-lg hover:bg-gray-100\"\n onClick={() => setMobileMenuOpen(!mobileMenuOpen)}\n aria-label={mobileMenuOpen ? 'Close menu' : 'Open menu'}\n >\n {mobileMenuOpen ? <XIcon size={24} /> : <MenuIcon size={24} />}\n </button>\n </div>\n\n {/* Mobile Navigation */}\n {mobileMenuOpen && (\n <div className=\"md:hidden py-4 border-t\">\n {navigation.map((item) => (\n <a\n key={item.href}\n href={item.href}\n className=\"block py-2 text-gray-600 hover:text-primary-600 font-medium\"\n onClick={() => setMobileMenuOpen(false)}\n >\n {item.label}\n </a>\n ))}\n {showPhone && business.phone && (\n <a\n href={`tel:${business.phone.replace(/\\D/g, '')}`}\n className=\"flex items-center py-2 text-primary-600 font-medium\"\n >\n <PhoneIcon size={18} className=\"mr-2\" />\n {business.phone}\n </a>\n )}\n </div>\n )}\n </nav>\n </header>\n );\n}\n\nexport default Header;\n","/**\n * Icon Library\n *\n * SVG icons for common use cases across business websites.\n * All icons use currentColor for easy theming.\n */\n\nimport React from 'react';\n\nexport interface IconProps {\n className?: string;\n size?: number;\n 'aria-hidden'?: boolean;\n}\n\nconst defaultProps: IconProps = {\n className: '',\n size: 24,\n 'aria-hidden': true,\n};\n\n// =============================================================================\n// GENERAL ICONS\n// =============================================================================\n\nexport function PhoneIcon({ className = '', size = 24, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n {...props}\n >\n <path d=\"M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07 19.5 19.5 0 0 1-6-6 19.79 19.79 0 0 1-3.07-8.67A2 2 0 0 1 4.11 2h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L8.09 9.91a16 16 0 0 0 6 6l1.27-1.27a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z\" />\n </svg>\n );\n}\n\nexport function MailIcon({ className = '', size = 24, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n {...props}\n >\n <rect width=\"20\" height=\"16\" x=\"2\" y=\"4\" rx=\"2\" />\n <path d=\"m22 7-8.97 5.7a1.94 1.94 0 0 1-2.06 0L2 7\" />\n </svg>\n );\n}\n\nexport function MapPinIcon({ className = '', size = 24, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n {...props}\n >\n <path d=\"M20 10c0 6-8 12-8 12s-8-6-8-12a8 8 0 0 1 16 0Z\" />\n <circle cx=\"12\" cy=\"10\" r=\"3\" />\n </svg>\n );\n}\n\nexport function ClockIcon({ className = '', size = 24, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n {...props}\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <polyline points=\"12 6 12 12 16 14\" />\n </svg>\n );\n}\n\nexport function StarIcon({ className = '', size = 24, filled = false, ...props }: IconProps & { filled?: boolean }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill={filled ? 'currentColor' : 'none'}\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n {...props}\n >\n <polygon points=\"12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2\" />\n </svg>\n );\n}\n\nexport function ChevronDownIcon({ className = '', size = 24, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n {...props}\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n );\n}\n\nexport function ChevronRightIcon({ className = '', size = 24, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n {...props}\n >\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n );\n}\n\nexport function MenuIcon({ className = '', size = 24, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n {...props}\n >\n <line x1=\"4\" x2=\"20\" y1=\"12\" y2=\"12\" />\n <line x1=\"4\" x2=\"20\" y1=\"6\" y2=\"6\" />\n <line x1=\"4\" x2=\"20\" y1=\"18\" y2=\"18\" />\n </svg>\n );\n}\n\nexport function XIcon({ className = '', size = 24, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n {...props}\n >\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n );\n}\n\nexport function CheckIcon({ className = '', size = 24, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n {...props}\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n );\n}\n\n// =============================================================================\n// SERVICE ICONS\n// =============================================================================\n\nexport function ScissorsIcon({ className = '', size = 24, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n {...props}\n >\n <circle cx=\"6\" cy=\"6\" r=\"3\" />\n <path d=\"M8.12 8.12 12 12\" />\n <path d=\"M20 4 8.12 15.88\" />\n <circle cx=\"6\" cy=\"18\" r=\"3\" />\n <path d=\"M14.8 14.8 20 20\" />\n </svg>\n );\n}\n\nexport function WrenchIcon({ className = '', size = 24, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n {...props}\n >\n <path d=\"M14.7 6.3a1 1 0 0 0 0 1.4l1.6 1.6a1 1 0 0 0 1.4 0l3.77-3.77a6 6 0 0 1-7.94 7.94l-6.91 6.91a2.12 2.12 0 0 1-3-3l6.91-6.91a6 6 0 0 1 7.94-7.94l-3.76 3.76z\" />\n </svg>\n );\n}\n\nexport function SparklesIcon({ className = '', size = 24, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n {...props}\n >\n <path d=\"m12 3-1.912 5.813a2 2 0 0 1-1.275 1.275L3 12l5.813 1.912a2 2 0 0 1 1.275 1.275L12 21l1.912-5.813a2 2 0 0 1 1.275-1.275L21 12l-5.813-1.912a2 2 0 0 1-1.275-1.275L12 3Z\" />\n <path d=\"M5 3v4\" />\n <path d=\"M19 17v4\" />\n <path d=\"M3 5h4\" />\n <path d=\"M17 19h4\" />\n </svg>\n );\n}\n\nexport function HeartIcon({ className = '', size = 24, filled = false, ...props }: IconProps & { filled?: boolean }) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill={filled ? 'currentColor' : 'none'}\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n {...props}\n >\n <path d=\"M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z\" />\n </svg>\n );\n}\n\nexport function UtensilsIcon({ className = '', size = 24, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n {...props}\n >\n <path d=\"M3 2v7c0 1.1.9 2 2 2h4a2 2 0 0 0 2-2V2\" />\n <path d=\"M7 2v20\" />\n <path d=\"M21 15V2v0a5 5 0 0 0-5 5v6c0 1.1.9 2 2 2h3Zm0 0v7\" />\n </svg>\n );\n}\n\nexport function CakeIcon({ className = '', size = 24, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n {...props}\n >\n <path d=\"M20 21v-8a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v8\" />\n <path d=\"M4 16s.5-1 2-1 2.5 2 4 2 2.5-2 4-2 2.5 2 4 2 2-1 2-1\" />\n <path d=\"M2 21h20\" />\n <path d=\"M7 8v3\" />\n <path d=\"M12 8v3\" />\n <path d=\"M17 8v3\" />\n <path d=\"M7 4h.01\" />\n <path d=\"M12 4h.01\" />\n <path d=\"M17 4h.01\" />\n </svg>\n );\n}\n\nexport function BriefcaseIcon({ className = '', size = 24, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n {...props}\n >\n <rect width=\"20\" height=\"14\" x=\"2\" y=\"7\" rx=\"2\" ry=\"2\" />\n <path d=\"M16 21V5a2 2 0 0 0-2-2h-4a2 2 0 0 0-2 2v16\" />\n </svg>\n );\n}\n\n// =============================================================================\n// SOCIAL ICONS\n// =============================================================================\n\nexport function YelpIcon({ className = '', size = 24, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n className={className}\n {...props}\n >\n <path d=\"M20.16 12.73l-3.29 1.47c-.64.28-1.31-.26-1.2-.97l.52-3.4c.08-.56.49-.98 1.03-1.04l3.39-.38c.7-.08 1.22.58 1 1.23l-1.07 2.62c-.14.35-.36.41-.38.47zM14.13 15.58l-.52 3.4c-.11.7.55 1.25 1.2.97l3.29-1.47c.02-.06.24-.12.38-.47l1.07-2.62c.22-.65-.3-1.31-1-1.23l-3.39.38c-.54.06-.95.48-1.03 1.04zM10.98 3.05c-.47-.6-1.37-.5-1.7.2l-3.6 7.51c-.24.5-.01 1.1.51 1.33l2.63 1.21c.62.28 1.3-.2 1.27-.89l-.33-7.97c-.02-.56-.3-1.01-.78-1.39zM8.37 14.35l-2.63-1.21c-.52-.23-.75-.83-.51-1.33l3.6-7.51c.33-.7 1.23-.8 1.7-.2.48.38.76.83.78 1.39l.33 7.97c.03.69-.65 1.17-1.27.89zM10.04 16.42l-3.22 1.8c-.62.35-1.36-.14-1.28-.86l.44-3.52c.06-.53.42-.95.92-1.08l3.02-.78c.69-.18 1.32.43 1.09 1.1l-1.24 3.06c-.14.33-.38.34-.42.34-.04 0-.18-.01-.31.04v-.1z\" />\n </svg>\n );\n}\n\nexport function InstagramIcon({ className = '', size = 24, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n {...props}\n >\n <rect width=\"20\" height=\"20\" x=\"2\" y=\"2\" rx=\"5\" ry=\"5\" />\n <path d=\"M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z\" />\n <line x1=\"17.5\" x2=\"17.51\" y1=\"6.5\" y2=\"6.5\" />\n </svg>\n );\n}\n\nexport function FacebookIcon({ className = '', size = 24, ...props }: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n {...props}\n >\n <path d=\"M18 2h-3a5 5 0 0 0-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 0 1 1-1h3z\" />\n </svg>\n );\n}\n\n// =============================================================================\n// ICON MAP\n// =============================================================================\n\n/**\n * Map of icon names to components.\n * Use this to render icons dynamically based on string names.\n */\nexport const iconMap: Record<string, React.FC<IconProps>> = {\n phone: PhoneIcon,\n mail: MailIcon,\n email: MailIcon,\n 'map-pin': MapPinIcon,\n location: MapPinIcon,\n clock: ClockIcon,\n time: ClockIcon,\n star: StarIcon,\n 'chevron-down': ChevronDownIcon,\n 'chevron-right': ChevronRightIcon,\n menu: MenuIcon,\n x: XIcon,\n close: XIcon,\n check: CheckIcon,\n scissors: ScissorsIcon,\n wrench: WrenchIcon,\n tool: WrenchIcon,\n sparkles: SparklesIcon,\n heart: HeartIcon,\n utensils: UtensilsIcon,\n food: UtensilsIcon,\n cake: CakeIcon,\n briefcase: BriefcaseIcon,\n yelp: YelpIcon,\n instagram: InstagramIcon,\n facebook: FacebookIcon,\n};\n\n/**\n * Get an icon component by name.\n */\nexport function getIcon(name: string): React.FC<IconProps> | null {\n return iconMap[name.toLowerCase()] || null;\n}\n\n/**\n * Render an icon by name.\n */\nexport function Icon({ name, ...props }: IconProps & { name: string }) {\n const IconComponent = getIcon(name);\n if (!IconComponent) return null;\n return <IconComponent {...props} />;\n}\n","/**\n * Footer Component\n *\n * A comprehensive footer with business info, links, and social icons.\n */\n\nimport React from 'react';\nimport type { BusinessInfo, HoursEntry } from '../../data/types';\nimport {\n PhoneIcon,\n MailIcon,\n MapPinIcon,\n ClockIcon,\n FacebookIcon,\n InstagramIcon,\n YelpIcon,\n} from '../ui/Icons';\n\nexport interface FooterLink {\n label: string;\n href: string;\n}\n\nexport interface FooterProps {\n business: BusinessInfo;\n hours?: HoursEntry[];\n quickLinks?: FooterLink[];\n showHours?: boolean;\n showSocial?: boolean;\n variant?: 'simple' | 'columns' | 'centered';\n className?: string;\n}\n\nconst defaultQuickLinks: FooterLink[] = [\n { label: 'Home', href: '/' },\n { label: 'Services', href: '/services' },\n { label: 'About', href: '/about' },\n { label: 'Contact', href: '/contact' },\n { label: 'Privacy Policy', href: '/privacy' },\n];\n\nconst dayNames: Record<string, string> = {\n monday: 'Mon',\n tuesday: 'Tue',\n wednesday: 'Wed',\n thursday: 'Thu',\n friday: 'Fri',\n saturday: 'Sat',\n sunday: 'Sun',\n};\n\n/**\n * Footer component.\n */\nexport function Footer({\n business,\n hours = [],\n quickLinks = defaultQuickLinks,\n showHours = true,\n showSocial = true,\n variant = 'columns',\n className = '',\n}: FooterProps) {\n const currentYear = new Date().getFullYear();\n\n const socialLinks = [\n { url: business.socialYelp, icon: YelpIcon, label: 'Yelp' },\n { url: business.socialInstagram, icon: InstagramIcon, label: 'Instagram' },\n { url: business.socialFacebook, icon: FacebookIcon, label: 'Facebook' },\n ].filter((link) => link.url);\n\n if (variant === 'simple') {\n return (\n <footer className={`bg-gray-900 text-white py-8 ${className}`}>\n <div className=\"container mx-auto px-4 text-center\">\n <p className=\"text-lg font-semibold mb-2\">{business.name}</p>\n {business.phone && <p className=\"text-gray-400\">{business.phone}</p>}\n <p className=\"text-gray-500 text-sm mt-4\">\n © {currentYear} {business.name}. All rights reserved.\n </p>\n </div>\n </footer>\n );\n }\n\n if (variant === 'centered') {\n return (\n <footer className={`bg-gray-900 text-white py-12 ${className}`}>\n <div className=\"container mx-auto px-4 text-center\">\n <p className=\"text-2xl font-bold mb-4\">{business.name}</p>\n {business.tagline && <p className=\"text-gray-400 mb-6\">{business.tagline}</p>}\n\n <div className=\"flex flex-wrap justify-center gap-6 mb-8\">\n {quickLinks.map((link) => (\n <a\n key={link.href}\n href={link.href}\n className=\"text-gray-400 hover:text-white transition-colors\"\n >\n {link.label}\n </a>\n ))}\n </div>\n\n {showSocial && socialLinks.length > 0 && (\n <div className=\"flex justify-center gap-4 mb-8\">\n {socialLinks.map((link) => (\n <a\n key={link.label}\n href={link.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"p-2 bg-gray-800 rounded-full hover:bg-gray-700 transition-colors\"\n aria-label={link.label}\n >\n <link.icon size={20} />\n </a>\n ))}\n </div>\n )}\n\n <p className=\"text-gray-500 text-sm\">\n © {currentYear} {business.name}. All rights reserved.\n </p>\n </div>\n </footer>\n );\n }\n\n // Default: columns variant\n return (\n <footer className={`bg-gray-900 text-white py-12 ${className}`}>\n <div className=\"container mx-auto px-4\">\n <div className=\"grid md:grid-cols-3 gap-8\">\n {/* Business Info */}\n <div>\n <h3 className=\"text-xl font-bold mb-4\">{business.name}</h3>\n {business.addressLine1 && (\n <div className=\"flex items-start text-gray-400 mb-3\">\n <MapPinIcon size={18} className=\"mr-2 mt-1 flex-shrink-0\" />\n <div>\n <p>{business.addressLine1}</p>\n {business.addressLine2 && <p>{business.addressLine2}</p>}\n <p>\n {business.city}, {business.state} {business.zip}\n </p>\n </div>\n </div>\n )}\n {business.phone && (\n <a\n href={`tel:${business.phone.replace(/\\D/g, '')}`}\n className=\"flex items-center text-gray-400 hover:text-white mb-3\"\n >\n <PhoneIcon size={18} className=\"mr-2\" />\n {business.phone}\n </a>\n )}\n {business.email && (\n <a\n href={`mailto:${business.email}`}\n className=\"flex items-center text-gray-400 hover:text-white\"\n >\n <MailIcon size={18} className=\"mr-2\" />\n {business.email}\n </a>\n )}\n </div>\n\n {/* Quick Links */}\n <div>\n <h3 className=\"text-lg font-semibold mb-4\">Quick Links</h3>\n <ul className=\"space-y-2\">\n {quickLinks.map((link) => (\n <li key={link.href}>\n <a\n href={link.href}\n className=\"text-gray-400 hover:text-white transition-colors\"\n >\n {link.label}\n </a>\n </li>\n ))}\n </ul>\n\n {showSocial && socialLinks.length > 0 && (\n <div className=\"flex gap-3 mt-6\">\n {socialLinks.map((link) => (\n <a\n key={link.label}\n href={link.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"p-2 bg-gray-800 rounded-full hover:bg-gray-700 transition-colors\"\n aria-label={link.label}\n >\n <link.icon size={20} />\n </a>\n ))}\n </div>\n )}\n </div>\n\n {/* Hours */}\n {showHours && hours.length > 0 && (\n <div>\n <h3 className=\"text-lg font-semibold mb-4 flex items-center\">\n <ClockIcon size={18} className=\"mr-2\" />\n Hours\n </h3>\n <ul className=\"space-y-1 text-gray-400\">\n {hours.map((entry) => (\n <li key={entry.day} className=\"flex justify-between\">\n <span>{dayNames[entry.day]}</span>\n <span>\n {entry.closed ? 'Closed' : `${entry.open} - ${entry.close}`}\n </span>\n </li>\n ))}\n </ul>\n </div>\n )}\n </div>\n\n {/* Bottom Bar */}\n <div className=\"mt-12 pt-8 border-t border-gray-800 text-center text-gray-500 text-sm\">\n <p>© {currentYear} {business.name}. All rights reserved.</p>\n </div>\n </div>\n </footer>\n );\n}\n\nexport default Footer;\n","/**\n * Hero Section Component\n *\n * A prominent hero section for the top of pages.\n * Supports various layouts and customization options.\n */\n\n'use client';\n\nimport React from 'react';\nimport type { BusinessInfo } from '../../data/types';\nimport { PhoneIcon, MapPinIcon, ClockIcon } from '../ui/Icons';\n\nexport interface HeroProps {\n business: BusinessInfo;\n variant?: 'centered' | 'left' | 'split';\n showOpenStatus?: boolean;\n isOpen?: boolean;\n todayHours?: string;\n backgroundImage?: string;\n overlay?: boolean;\n className?: string;\n}\n\n/**\n * Hero section component.\n */\nexport function Hero({\n business,\n variant = 'centered',\n showOpenStatus = true,\n isOpen,\n todayHours,\n backgroundImage,\n overlay = true,\n className = '',\n}: HeroProps) {\n const bgStyle = backgroundImage\n ? { backgroundImage: `url(${backgroundImage})` }\n : undefined;\n\n const handleCallClick = () => {\n if (business.phone) {\n window.location.href = `tel:${business.phone.replace(/\\D/g, '')}`;\n }\n };\n\n const handleDirectionsClick = () => {\n if (business.googleMapsUrl) {\n window.open(business.googleMapsUrl, '_blank');\n } else {\n const address = [\n business.addressLine1,\n business.city,\n business.state,\n business.zip,\n ]\n .filter(Boolean)\n .join(', ');\n window.open(`https://www.google.com/maps/search/?api=1&query=${encodeURIComponent(address)}`, '_blank');\n }\n };\n\n const handlePrimaryClick = () => {\n if (business.primaryCtaUrl) {\n if (business.primaryCtaUrl.startsWith('http')) {\n window.open(business.primaryCtaUrl, '_blank');\n } else if (business.primaryCtaUrl.startsWith('mailto:')) {\n window.location.href = business.primaryCtaUrl;\n } else {\n window.location.href = business.primaryCtaUrl;\n }\n } else if (business.bookingUrl) {\n window.open(business.bookingUrl, '_blank');\n } else if (business.email) {\n window.location.href = `mailto:${business.email}`;\n }\n };\n\n return (\n <section\n className={`\n relative min-h-[500px] flex items-center\n ${backgroundImage ? 'bg-cover bg-center' : 'bg-gradient-to-br from-primary-600 to-primary-800'}\n ${className}\n `}\n style={bgStyle}\n >\n {/* Overlay */}\n {overlay && backgroundImage && (\n <div className=\"absolute inset-0 bg-black/50\" />\n )}\n\n {/* Content */}\n <div className=\"relative z-10 container mx-auto px-4 py-16\">\n <div\n className={`\n ${variant === 'centered' ? 'text-center max-w-3xl mx-auto' : ''}\n ${variant === 'left' ? 'max-w-2xl' : ''}\n ${variant === 'split' ? 'grid md:grid-cols-2 gap-8 items-center' : ''}\n `}\n >\n <div>\n {/* Open Status */}\n {showOpenStatus && isOpen !== undefined && (\n <div className=\"mb-4\">\n <span\n className={`\n inline-flex items-center px-3 py-1 rounded-full text-sm font-medium\n ${isOpen ? 'bg-green-100 text-green-800' : 'bg-red-100 text-red-800'}\n `}\n >\n <span\n className={`w-2 h-2 rounded-full mr-2 ${isOpen ? 'bg-green-500' : 'bg-red-500'}`}\n />\n {isOpen ? 'Open Now' : 'Closed'}\n {todayHours && <span className=\"ml-2 opacity-75\">· {todayHours}</span>}\n </span>\n </div>\n )}\n\n {/* Business Name */}\n <h1 className=\"text-4xl md:text-5xl lg:text-6xl font-bold text-white mb-4\">\n {business.name}\n </h1>\n\n {/* Tagline */}\n {business.tagline && (\n <p className=\"text-xl md:text-2xl text-white/90 mb-6\">\n {business.tagline}\n </p>\n )}\n\n {/* Description */}\n {business.aboutShort && (\n <p className=\"text-lg text-white/80 mb-8 max-w-xl\">\n {business.aboutShort}\n </p>\n )}\n\n {/* Trust Signals */}\n <div className=\"flex flex-wrap justify-center gap-4 mb-8\">\n {['Quality Work', 'Fair Prices', 'Fast Service'].map((signal) => (\n <div key={signal} className=\"flex items-center text-white/90\">\n <svg className=\"w-5 h-5 text-accent-400 mr-2\" fill=\"currentColor\" viewBox=\"0 0 20 20\">\n <path\n fillRule=\"evenodd\"\n d=\"M10 18a8 8 0 100-16 8 8 0 000 16zm3.707-9.293a1 1 0 00-1.414-1.414L9 10.586 7.707 9.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4z\"\n clipRule=\"evenodd\"\n />\n </svg>\n <span className=\"text-sm font-medium\">{signal}</span>\n </div>\n ))}\n </div>\n\n {/* CTA Buttons */}\n <div className=\"flex flex-col sm:flex-row gap-4 justify-center\">\n {business.phone && (\n <button\n onClick={handleCallClick}\n className=\"inline-flex items-center justify-center px-6 py-3 bg-white text-primary-700 font-semibold rounded-lg hover:bg-gray-100 transition-colors\"\n >\n <PhoneIcon size={20} className=\"mr-2\" />\n Call Now\n </button>\n )}\n\n {(business.addressLine1 || business.googleMapsUrl) && (\n <button\n onClick={handleDirectionsClick}\n className=\"inline-flex items-center justify-center px-6 py-3 border-2 border-white text-white font-semibold rounded-lg hover:bg-white/10 transition-colors\"\n >\n <MapPinIcon size={20} className=\"mr-2\" />\n Get Directions\n </button>\n )}\n\n {(business.primaryCtaUrl || business.bookingUrl || business.email) && (\n <button\n onClick={handlePrimaryClick}\n className=\"inline-flex items-center justify-center px-6 py-3 bg-accent-500 text-white font-semibold rounded-lg hover:bg-accent-600 transition-colors\"\n >\n {business.primaryCtaText || 'Contact Us'}\n </button>\n )}\n </div>\n </div>\n\n {/* Split layout - right side could show an image or additional content */}\n {variant === 'split' && (\n <div className=\"hidden md:block\">\n {/* Placeholder for hero image or additional content */}\n </div>\n )}\n </div>\n </div>\n </section>\n );\n}\n\nexport default Hero;\n","/**\n * Services Section Component\n *\n * Displays a grid of services offered by the business.\n */\n\nimport React from 'react';\nimport type { Service } from '../../data/types';\nimport { Icon } from '../ui/Icons';\n\nexport interface ServicesProps {\n services: Service[];\n title?: string;\n subtitle?: string;\n columns?: 2 | 3 | 4;\n showPrices?: boolean;\n showIcons?: boolean;\n variant?: 'cards' | 'list' | 'minimal';\n limit?: number;\n className?: string;\n}\n\n/**\n * Services section component.\n */\nexport function Services({\n services,\n title = 'Our Services',\n subtitle,\n columns = 3,\n showPrices = true,\n showIcons = true,\n variant = 'cards',\n limit,\n className = '',\n}: ServicesProps) {\n const displayedServices = limit ? services.slice(0, limit) : services;\n\n const gridCols = {\n 2: 'md:grid-cols-2',\n 3: 'md:grid-cols-2 lg:grid-cols-3',\n 4: 'md:grid-cols-2 lg:grid-cols-4',\n };\n\n if (variant === 'list') {\n return (\n <section className={`py-16 ${className}`}>\n <div className=\"container mx-auto px-4\">\n <SectionHeader title={title} subtitle={subtitle} />\n <div className=\"max-w-3xl mx-auto divide-y divide-gray-200\">\n {displayedServices.map((service) => (\n <ServiceListItem\n key={service.id || service.title}\n service={service}\n showPrice={showPrices}\n showIcon={showIcons}\n />\n ))}\n </div>\n </div>\n </section>\n );\n }\n\n if (variant === 'minimal') {\n return (\n <section className={`py-16 ${className}`}>\n <div className=\"container mx-auto px-4\">\n <SectionHeader title={title} subtitle={subtitle} />\n <div className={`grid gap-6 ${gridCols[columns]}`}>\n {displayedServices.map((service) => (\n <ServiceMinimalCard\n key={service.id || service.title}\n service={service}\n showPrice={showPrices}\n />\n ))}\n </div>\n </div>\n </section>\n );\n }\n\n // Default: cards variant\n return (\n <section className={`py-16 bg-gray-50 ${className}`}>\n <div className=\"container mx-auto px-4\">\n <SectionHeader title={title} subtitle={subtitle} />\n <div className={`grid gap-6 ${gridCols[columns]}`}>\n {displayedServices.map((service) => (\n <ServiceCard\n key={service.id || service.title}\n service={service}\n showPrice={showPrices}\n showIcon={showIcons}\n />\n ))}\n </div>\n </div>\n </section>\n );\n}\n\n/**\n * Section header.\n */\nfunction SectionHeader({ title, subtitle }: { title: string; subtitle?: string }) {\n return (\n <div className=\"text-center mb-12\">\n <h2 className=\"text-3xl md:text-4xl font-bold text-gray-900 mb-4\">{title}</h2>\n {subtitle && (\n <p className=\"text-lg text-gray-600 max-w-2xl mx-auto\">{subtitle}</p>\n )}\n </div>\n );\n}\n\n/**\n * Service card component.\n */\nfunction ServiceCard({\n service,\n showPrice,\n showIcon,\n}: {\n service: Service;\n showPrice: boolean;\n showIcon: boolean;\n}) {\n return (\n <div className=\"bg-white rounded-lg shadow-md p-6 hover:shadow-lg transition-shadow\">\n {showIcon && service.icon && (\n <div className=\"w-12 h-12 bg-primary-100 rounded-lg flex items-center justify-center mb-4\">\n <Icon name={service.icon} size={24} className=\"text-primary-600\" />\n </div>\n )}\n <h3 className=\"text-xl font-semibold text-gray-900 mb-2\">{service.title}</h3>\n {service.description && (\n <p className=\"text-gray-600 mb-4\">{service.description}</p>\n )}\n {showPrice && service.priceNote && (\n <p className=\"text-primary-600 font-medium\">{service.priceNote}</p>\n )}\n {showPrice && service.price && !service.priceNote && (\n <p className=\"text-primary-600 font-medium\">${service.price.toFixed(2)}</p>\n )}\n </div>\n );\n}\n\n/**\n * Service list item component.\n */\nfunction ServiceListItem({\n service,\n showPrice,\n showIcon,\n}: {\n service: Service;\n showPrice: boolean;\n showIcon: boolean;\n}) {\n return (\n <div className=\"py-4 flex items-start justify-between\">\n <div className=\"flex items-start\">\n {showIcon && service.icon && (\n <div className=\"w-10 h-10 bg-primary-100 rounded-lg flex items-center justify-center mr-4 flex-shrink-0\">\n <Icon name={service.icon} size={20} className=\"text-primary-600\" />\n </div>\n )}\n <div>\n <h3 className=\"text-lg font-semibold text-gray-900\">{service.title}</h3>\n {service.description && (\n <p className=\"text-gray-600 text-sm mt-1\">{service.description}</p>\n )}\n </div>\n </div>\n {showPrice && (service.priceNote || service.price) && (\n <div className=\"text-right ml-4 flex-shrink-0\">\n <p className=\"text-primary-600 font-medium\">\n {service.priceNote || `$${service.price?.toFixed(2)}`}\n </p>\n </div>\n )}\n </div>\n );\n}\n\n/**\n * Minimal service card component.\n */\nfunction ServiceMinimalCard({\n service,\n showPrice,\n}: {\n service: Service;\n showPrice: boolean;\n}) {\n return (\n <div className=\"p-4 border border-gray-200 rounded-lg hover:border-primary-300 transition-colors\">\n <div className=\"flex items-center justify-between\">\n <h3 className=\"font-semibold text-gray-900\">{service.title}</h3>\n {showPrice && (service.priceNote || service.price) && (\n <span className=\"text-primary-600 text-sm font-medium\">\n {service.priceNote || `$${service.price?.toFixed(2)}`}\n </span>\n )}\n </div>\n {service.description && (\n <p className=\"text-gray-600 text-sm mt-2\">{service.description}</p>\n )}\n </div>\n );\n}\n\nexport default Services;\n","/**\n * Testimonials Section Component\n *\n * Displays customer reviews and testimonials.\n */\n\nimport React from 'react';\nimport type { Testimonial } from '../../data/types';\nimport { StarIcon } from '../ui/Icons';\n\nexport interface TestimonialsProps {\n testimonials: Testimonial[];\n title?: string;\n subtitle?: string;\n columns?: 1 | 2 | 3;\n showRatings?: boolean;\n variant?: 'cards' | 'quotes' | 'minimal';\n limit?: number;\n className?: string;\n}\n\n/**\n * Testimonials section component.\n */\nexport function Testimonials({\n testimonials,\n title = 'What Our Customers Say',\n subtitle,\n columns = 3,\n showRatings = true,\n variant = 'cards',\n limit,\n className = '',\n}: TestimonialsProps) {\n const displayedTestimonials = limit ? testimonials.slice(0, limit) : testimonials;\n\n const gridCols = {\n 1: 'max-w-2xl mx-auto',\n 2: 'md:grid-cols-2 max-w-4xl mx-auto',\n 3: 'md:grid-cols-2 lg:grid-cols-3',\n };\n\n return (\n <section className={`py-16 ${className}`}>\n <div className=\"container mx-auto px-4\">\n {/* Header */}\n <div className=\"text-center mb-12\">\n <h2 className=\"text-3xl md:text-4xl font-bold text-gray-900 mb-4\">{title}</h2>\n {subtitle && (\n <p className=\"text-lg text-gray-600 max-w-2xl mx-auto\">{subtitle}</p>\n )}\n </div>\n\n {/* Testimonials Grid */}\n <div className={`grid gap-6 ${gridCols[columns]}`}>\n {displayedTestimonials.map((testimonial) => (\n <TestimonialCard\n key={testimonial.id || testimonial.name}\n testimonial={testimonial}\n showRating={showRatings}\n variant={variant}\n />\n ))}\n </div>\n </div>\n </section>\n );\n}\n\n/**\n * Individual testimonial card.\n */\nfunction TestimonialCard({\n testimonial,\n showRating,\n variant,\n}: {\n testimonial: Testimonial;\n showRating: boolean;\n variant: TestimonialsProps['variant'];\n}) {\n if (variant === 'quotes') {\n return (\n <div className=\"text-center\">\n <QuoteIcon className=\"w-10 h-10 text-primary-200 mx-auto mb-4\" />\n <blockquote className=\"text-lg text-gray-700 italic mb-4\">\n \"{testimonial.quote}\"\n </blockquote>\n {showRating && testimonial.rating && (\n <StarRating rating={testimonial.rating} className=\"justify-center mb-2\" />\n )}\n <div className=\"font-semibold text-gray-900\">{testimonial.name}</div>\n {testimonial.context && (\n <div className=\"text-sm text-gray-500\">{testimonial.context}</div>\n )}\n </div>\n );\n }\n\n if (variant === 'minimal') {\n return (\n <div className=\"border-l-4 border-primary-500 pl-4\">\n <blockquote className=\"text-gray-700 mb-2\">\n \"{testimonial.quote}\"\n </blockquote>\n <div className=\"flex items-center gap-2\">\n <span className=\"font-semibold text-gray-900\">{testimonial.name}</span>\n {showRating && testimonial.rating && (\n <StarRating rating={testimonial.rating} size={14} />\n )}\n </div>\n </div>\n );\n }\n\n // Default: cards variant\n return (\n <div className=\"bg-white rounded-lg shadow p-6\">\n {showRating && testimonial.rating && (\n <StarRating rating={testimonial.rating} className=\"mb-3\" />\n )}\n <blockquote className=\"text-gray-700 mb-4\">\n \"{testimonial.quote}\"\n </blockquote>\n <div className=\"flex items-center\">\n {testimonial.imageUrl && (\n <img\n src={testimonial.imageUrl}\n alt={testimonial.name}\n className=\"w-10 h-10 rounded-full mr-3 object-cover\"\n />\n )}\n <div>\n <div className=\"font-semibold text-gray-900\">{testimonial.name}</div>\n {testimonial.context && (\n <div className=\"text-sm text-gray-500\">{testimonial.context}</div>\n )}\n {testimonial.source && (\n <div className=\"text-xs text-gray-400\">via {testimonial.source}</div>\n )}\n </div>\n </div>\n </div>\n );\n}\n\n/**\n * Star rating component.\n */\nfunction StarRating({\n rating,\n size = 18,\n className = '',\n}: {\n rating: number;\n size?: number;\n className?: string;\n}) {\n return (\n <div className={`flex ${className}`} aria-label={`${rating} out of 5 stars`}>\n {[1, 2, 3, 4, 5].map((star) => (\n <StarIcon\n key={star}\n size={size}\n filled={star <= rating}\n className={star <= rating ? 'text-yellow-400' : 'text-gray-300'}\n />\n ))}\n </div>\n );\n}\n\n/**\n * Quote icon.\n */\nfunction QuoteIcon({ className }: { className?: string }) {\n return (\n <svg className={className} fill=\"currentColor\" viewBox=\"0 0 24 24\">\n <path d=\"M14.017 21v-7.391c0-5.704 3.731-9.57 8.983-10.609l.995 2.151c-2.432.917-3.995 3.638-3.995 5.849h4v10h-9.983zm-14.017 0v-7.391c0-5.704 3.748-9.57 9-10.609l.996 2.151c-2.433.917-3.996 3.638-3.996 5.849h3.983v10h-9.983z\" />\n </svg>\n );\n}\n\nexport default Testimonials;\n","/**\n * FAQ Section Component\n *\n * Displays frequently asked questions in an accordion format.\n */\n\n'use client';\n\nimport React, { useState } from 'react';\nimport type { FAQItem } from '../../data/types';\nimport { ChevronDownIcon } from '../ui/Icons';\n\nexport interface FAQProps {\n items: FAQItem[];\n title?: string;\n subtitle?: string;\n variant?: 'accordion' | 'cards' | 'simple';\n defaultOpen?: number | number[];\n allowMultiple?: boolean;\n className?: string;\n}\n\n/**\n * FAQ section component.\n */\nexport function FAQ({\n items,\n title = 'Frequently Asked Questions',\n subtitle,\n variant = 'accordion',\n defaultOpen = 0,\n allowMultiple = false,\n className = '',\n}: FAQProps) {\n const initialOpen = Array.isArray(defaultOpen) ? defaultOpen : [defaultOpen];\n const [openItems, setOpenItems] = useState<number[]>(initialOpen);\n\n const toggleItem = (index: number) => {\n if (allowMultiple) {\n setOpenItems((prev) =>\n prev.includes(index)\n ? prev.filter((i) => i !== index)\n : [...prev, index]\n );\n } else {\n setOpenItems((prev) =>\n prev.includes(index) ? [] : [index]\n );\n }\n };\n\n if (variant === 'cards') {\n return (\n <section className={`py-16 ${className}`}>\n <div className=\"container mx-auto px-4\">\n <SectionHeader title={title} subtitle={subtitle} />\n <div className=\"grid md:grid-cols-2 gap-6 max-w-4xl mx-auto\">\n {items.map((item) => (\n <FAQCard key={item.id || item.question} item={item} />\n ))}\n </div>\n </div>\n </section>\n );\n }\n\n if (variant === 'simple') {\n return (\n <section className={`py-16 ${className}`}>\n <div className=\"container mx-auto px-4\">\n <SectionHeader title={title} subtitle={subtitle} />\n <div className=\"max-w-3xl mx-auto space-y-8\">\n {items.map((item) => (\n <FAQSimple key={item.id || item.question} item={item} />\n ))}\n </div>\n </div>\n </section>\n );\n }\n\n // Default: accordion variant\n return (\n <section className={`py-16 bg-gray-50 ${className}`}>\n <div className=\"container mx-auto px-4\">\n <SectionHeader title={title} subtitle={subtitle} />\n <div className=\"max-w-3xl mx-auto\">\n {items.map((item, index) => (\n <FAQAccordionItem\n key={item.id || item.question}\n item={item}\n isOpen={openItems.includes(index)}\n onToggle={() => toggleItem(index)}\n />\n ))}\n </div>\n </div>\n </section>\n );\n}\n\n/**\n * Section header.\n */\nfunction SectionHeader({ title, subtitle }: { title: string; subtitle?: string }) {\n return (\n <div className=\"text-center mb-12\">\n <h2 className=\"text-3xl md:text-4xl font-bold text-gray-900 mb-4\">{title}</h2>\n {subtitle && (\n <p className=\"text-lg text-gray-600 max-w-2xl mx-auto\">{subtitle}</p>\n )}\n </div>\n );\n}\n\n/**\n * Accordion FAQ item.\n */\nfunction FAQAccordionItem({\n item,\n isOpen,\n onToggle,\n}: {\n item: FAQItem;\n isOpen: boolean;\n onToggle: () => void;\n}) {\n return (\n <div className=\"border-b border-gray-200 last:border-b-0\">\n <button\n className=\"w-full py-4 flex items-center justify-between text-left focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-offset-2 rounded\"\n onClick={onToggle}\n aria-expanded={isOpen}\n >\n <span className=\"text-lg font-medium text-gray-900 pr-4\">{item.question}</span>\n <ChevronDownIcon\n size={20}\n className={`flex-shrink-0 text-gray-500 transition-transform duration-200 ${\n isOpen ? 'rotate-180' : ''\n }`}\n />\n </button>\n <div\n className={`overflow-hidden transition-all duration-200 ${\n isOpen ? 'max-h-96 pb-4' : 'max-h-0'\n }`}\n >\n <p className=\"text-gray-600\">{item.answer}</p>\n </div>\n </div>\n );\n}\n\n/**\n * Card FAQ item.\n */\nfunction FAQCard({ item }: { item: FAQItem }) {\n return (\n <div className=\"bg-white rounded-lg shadow p-6\">\n <h3 className=\"text-lg font-semibold text-gray-900 mb-2\">{item.question}</h3>\n <p className=\"text-gray-600\">{item.answer}</p>\n </div>\n );\n}\n\n/**\n * Simple FAQ item.\n */\nfunction FAQSimple({ item }: { item: FAQItem }) {\n return (\n <div>\n <h3 className=\"text-lg font-semibold text-gray-900 mb-2\">{item.question}</h3>\n <p className=\"text-gray-600\">{item.answer}</p>\n </div>\n );\n}\n\nexport default FAQ;\n","/**\n * Hours Section Component\n *\n * Displays business hours with today highlighted.\n */\n\nimport React from 'react';\nimport type { HoursEntry, DayOfWeek } from '../../data/types';\nimport { ClockIcon } from '../ui/Icons';\n\nexport interface HoursProps {\n hours: HoursEntry[];\n title?: string;\n highlightToday?: boolean;\n variant?: 'card' | 'inline' | 'minimal';\n timezone?: string;\n className?: string;\n}\n\nconst dayOrder: DayOfWeek[] = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday'];\n\nconst dayNames: Record<DayOfWeek, string> = {\n monday: 'Monday',\n tuesday: 'Tuesday',\n wednesday: 'Wednesday',\n thursday: 'Thursday',\n friday: 'Friday',\n saturday: 'Saturday',\n sunday: 'Sunday',\n};\n\nconst dayAbbrev: Record<DayOfWeek, string> = {\n monday: 'Mon',\n tuesday: 'Tue',\n wednesday: 'Wed',\n thursday: 'Thu',\n friday: 'Fri',\n saturday: 'Sat',\n sunday: 'Sun',\n};\n\n/**\n * Get today's day of week.\n */\nfunction getTodayDay(timezone?: string): DayOfWeek {\n const now = timezone\n ? new Date(new Date().toLocaleString('en-US', { timeZone: timezone }))\n : new Date();\n const jsDay = now.getDay();\n // JavaScript: 0 = Sunday, 1 = Monday, etc.\n return dayOrder[(jsDay + 6) % 7];\n}\n\n/**\n * Hours section component.\n */\nexport function Hours({\n hours,\n title = 'Hours',\n highlightToday = true,\n variant = 'card',\n timezone,\n className = '',\n}: HoursProps) {\n const todayDay = getTodayDay(timezone);\n\n // Sort hours by day order\n const sortedHours = [...hours].sort(\n (a, b) => dayOrder.indexOf(a.day) - dayOrder.indexOf(b.day)\n );\n\n if (variant === 'inline') {\n return (\n <div className={`flex flex-wrap gap-4 ${className}`}>\n {sortedHours.map((entry) => (\n <HoursInlineItem\n key={entry.day}\n entry={entry}\n isToday={highlightToday && entry.day === todayDay}\n />\n ))}\n </div>\n );\n }\n\n if (variant === 'minimal') {\n return (\n <div className={`space-y-1 ${className}`}>\n {sortedHours.map((entry) => (\n <HoursMinimalItem\n key={entry.day}\n entry={entry}\n isToday={highlightToday && entry.day === todayDay}\n />\n ))}\n </div>\n );\n }\n\n // Default: card variant\n return (\n <div className={`bg-white rounded-lg shadow p-6 ${className}`}>\n <div className=\"flex items-center mb-4\">\n <ClockIcon size={24} className=\"text-primary-600 mr-2\" />\n <h3 className=\"text-xl font-semibold text-gray-900\">{title}</h3>\n </div>\n <div className=\"space-y-2\">\n {sortedHours.map((entry) => (\n <HoursCardItem\n key={entry.day}\n entry={entry}\n isToday={highlightToday && entry.day === todayDay}\n />\n ))}\n </div>\n </div>\n );\n}\n\n/**\n * Card variant item.\n */\nfunction HoursCardItem({ entry, isToday }: { entry: HoursEntry; isToday: boolean }) {\n return (\n <div\n className={`flex justify-between py-1 ${\n isToday ? 'bg-primary-50 -mx-2 px-2 rounded font-medium' : ''\n }`}\n >\n <span className={isToday ? 'text-primary-700' : 'text-gray-600'}>\n {dayNames[entry.day]}\n {isToday && <span className=\"ml-2 text-xs\">(Today)</span>}\n </span>\n <span className={isToday ? 'text-primary-700' : 'text-gray-900'}>\n {entry.closed ? 'Closed' : `${entry.open} - ${entry.close}`}\n </span>\n </div>\n );\n}\n\n/**\n * Inline variant item.\n */\nfunction HoursInlineItem({ entry, isToday }: { entry: HoursEntry; isToday: boolean }) {\n return (\n <div\n className={`text-center px-3 py-2 rounded ${\n isToday ? 'bg-primary-100 ring-2 ring-primary-500' : 'bg-gray-100'\n }`}\n >\n <div className={`text-sm font-medium ${isToday ? 'text-primary-700' : 'text-gray-500'}`}>\n {dayAbbrev[entry.day]}\n </div>\n <div className={`text-sm ${isToday ? 'text-primary-900' : 'text-gray-900'}`}>\n {entry.closed ? 'Closed' : `${entry.open?.split(' ')[0]}-${entry.close?.split(' ')[0]}`}\n </div>\n </div>\n );\n}\n\n/**\n * Minimal variant item.\n */\nfunction HoursMinimalItem({ entry, isToday }: { entry: HoursEntry; isToday: boolean }) {\n return (\n <div className={`text-sm ${isToday ? 'font-semibold text-primary-600' : 'text-gray-600'}`}>\n <span className=\"inline-block w-20\">{dayAbbrev[entry.day]}</span>\n <span>{entry.closed ? 'Closed' : `${entry.open} - ${entry.close}`}</span>\n </div>\n );\n}\n\n/**\n * Get today's hours text.\n */\nexport function getTodayHours(hours: HoursEntry[], timezone?: string): string | null {\n const todayDay = getTodayDay(timezone);\n const todayHours = hours.find((h) => h.day === todayDay);\n\n if (!todayHours) return null;\n if (todayHours.closed) return 'Closed today';\n return `${todayHours.open} - ${todayHours.close}`;\n}\n\n/**\n * Check if currently open.\n */\nexport function isCurrentlyOpen(hours: HoursEntry[], timezone?: string): boolean {\n const todayDay = getTodayDay(timezone);\n const todayHours = hours.find((h) => h.day === todayDay);\n\n if (!todayHours || todayHours.closed) return false;\n if (!todayHours.open || !todayHours.close) return false;\n\n const now = timezone\n ? new Date(new Date().toLocaleString('en-US', { timeZone: timezone }))\n : new Date();\n\n const currentMinutes = now.getHours() * 60 + now.getMinutes();\n const openMinutes = parseTimeToMinutes(todayHours.open);\n const closeMinutes = parseTimeToMinutes(todayHours.close);\n\n if (openMinutes === null || closeMinutes === null) return false;\n\n return currentMinutes >= openMinutes && currentMinutes < closeMinutes;\n}\n\n/**\n * Parse time string to minutes since midnight.\n */\nfunction parseTimeToMinutes(time: string): number | null {\n const match = time.match(/(\\d{1,2}):?(\\d{2})?\\s*(AM|PM)?/i);\n if (!match) return null;\n\n let hours = parseInt(match[1], 10);\n const minutes = parseInt(match[2] || '0', 10);\n const period = match[3]?.toUpperCase();\n\n if (period === 'PM' && hours !== 12) hours += 12;\n if (period === 'AM' && hours === 12) hours = 0;\n\n return hours * 60 + minutes;\n}\n\nexport default Hours;\n","/**\n * Gallery Section Component\n *\n * Displays a grid of images.\n */\n\n'use client';\n\nimport React, { useState } from 'react';\nimport type { GalleryItem } from '../../data/types';\n\nexport interface GalleryProps {\n items: GalleryItem[];\n title?: string;\n subtitle?: string;\n columns?: 2 | 3 | 4;\n variant?: 'grid' | 'masonry' | 'carousel';\n showCaptions?: boolean;\n limit?: number;\n className?: string;\n}\n\n/**\n * Gallery section component.\n */\nexport function Gallery({\n items,\n title = 'Gallery',\n subtitle,\n columns = 3,\n variant = 'grid',\n showCaptions = true,\n limit,\n className = '',\n}: GalleryProps) {\n const displayedItems = limit ? items.slice(0, limit) : items;\n const [failedImages, setFailedImages] = useState<Set<string>>(new Set());\n\n const handleImageError = (id: string) => {\n setFailedImages((prev) => new Set(prev).add(id));\n };\n\n const gridCols = {\n 2: 'grid-cols-1 sm:grid-cols-2',\n 3: 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-3',\n 4: 'grid-cols-1 sm:grid-cols-2 lg:grid-cols-4',\n };\n\n return (\n <section className={`py-16 ${className}`}>\n <div className=\"container mx-auto px-4\">\n {/* Header */}\n {(title || subtitle) && (\n <div className=\"text-center mb-12\">\n {title && (\n <h2 className=\"text-3xl md:text-4xl font-bold text-gray-900 mb-4\">{title}</h2>\n )}\n {subtitle && (\n <p className=\"text-lg text-gray-600 max-w-2xl mx-auto\">{subtitle}</p>\n )}\n </div>\n )}\n\n {/* Gallery Grid */}\n <div className={`grid gap-4 ${gridCols[columns]}`}>\n {displayedItems.map((item) => {\n const itemId = item.id || item.imageUrl;\n const hasFailed = failedImages.has(itemId);\n\n return (\n <div\n key={itemId}\n className=\"group relative aspect-square overflow-hidden rounded-lg bg-gray-100\"\n >\n {hasFailed ? (\n <div className=\"absolute inset-0 flex items-center justify-center text-gray-400\">\n <span>Image unavailable</span>\n </div>\n ) : (\n <>\n <img\n src={item.imageUrl}\n alt={item.alt || ''}\n loading=\"lazy\"\n className=\"w-full h-full object-cover transition-transform duration-300 group-hover:scale-105\"\n onError={() => handleImageError(itemId)}\n />\n {/* Caption overlay */}\n {showCaptions && item.caption && (\n <div className=\"absolute inset-0 bg-gradient-to-t from-black/60 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-300\">\n <div className=\"absolute bottom-0 left-0 right-0 p-4\">\n <p className=\"text-white text-sm\">{item.caption}</p>\n </div>\n </div>\n )}\n </>\n )}\n </div>\n );\n })}\n </div>\n </div>\n </section>\n );\n}\n\nexport default Gallery;\n","/**\n * Button Component\n *\n * A versatile button component with multiple variants and sizes.\n */\n\nimport React from 'react';\n\nexport interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: 'primary' | 'secondary' | 'outline' | 'ghost' | 'link';\n size?: 'sm' | 'md' | 'lg';\n fullWidth?: boolean;\n loading?: boolean;\n leftIcon?: React.ReactNode;\n rightIcon?: React.ReactNode;\n}\n\n/**\n * Get CSS classes for button variants and sizes.\n */\nfunction getButtonClasses(props: Pick<ButtonProps, 'variant' | 'size' | 'fullWidth' | 'disabled'>): string {\n const { variant = 'primary', size = 'md', fullWidth, disabled } = props;\n\n const baseClasses = [\n 'inline-flex items-center justify-center',\n 'font-medium',\n 'transition-colors duration-200',\n 'focus:outline-none focus:ring-2 focus:ring-offset-2',\n disabled ? 'opacity-50 cursor-not-allowed' : '',\n fullWidth ? 'w-full' : '',\n ];\n\n // Variant classes\n const variantClasses: Record<NonNullable<ButtonProps['variant']>, string> = {\n primary: 'bg-primary-600 text-white hover:bg-primary-700 focus:ring-primary-500',\n secondary: 'bg-primary-100 text-primary-700 hover:bg-primary-200 focus:ring-primary-500',\n outline: 'border-2 border-primary-600 text-primary-600 hover:bg-primary-50 focus:ring-primary-500',\n ghost: 'text-primary-600 hover:bg-primary-100 focus:ring-primary-500',\n link: 'text-primary-600 hover:underline focus:ring-primary-500 p-0',\n };\n\n // Size classes\n const sizeClasses: Record<NonNullable<ButtonProps['size']>, string> = {\n sm: 'text-sm px-3 py-1.5 rounded',\n md: 'text-base px-4 py-2 rounded-md',\n lg: 'text-lg px-6 py-3 rounded-lg',\n };\n\n return [\n ...baseClasses,\n variantClasses[variant],\n variant !== 'link' ? sizeClasses[size] : '',\n ]\n .filter(Boolean)\n .join(' ');\n}\n\n/**\n * Button component with multiple variants and sizes.\n */\nexport function Button({\n variant = 'primary',\n size = 'md',\n fullWidth = false,\n loading = false,\n leftIcon,\n rightIcon,\n children,\n disabled,\n className = '',\n ...props\n}: ButtonProps) {\n const classes = getButtonClasses({ variant, size, fullWidth, disabled: disabled || loading });\n\n return (\n <button\n className={`${classes} ${className}`}\n disabled={disabled || loading}\n {...props}\n >\n {loading ? (\n <LoadingSpinner size={size} />\n ) : (\n <>\n {leftIcon && <span className=\"mr-2\">{leftIcon}</span>}\n {children}\n {rightIcon && <span className=\"ml-2\">{rightIcon}</span>}\n </>\n )}\n </button>\n );\n}\n\n/**\n * Loading spinner for button loading state.\n */\nfunction LoadingSpinner({ size }: { size: ButtonProps['size'] }) {\n const sizeClasses = {\n sm: 'w-4 h-4',\n md: 'w-5 h-5',\n lg: 'w-6 h-6',\n };\n\n return (\n <svg\n className={`animate-spin ${sizeClasses[size || 'md']}`}\n xmlns=\"http://www.w3.org/2000/svg\"\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n >\n <circle\n className=\"opacity-25\"\n cx=\"12\"\n cy=\"12\"\n r=\"10\"\n stroke=\"currentColor\"\n strokeWidth=\"4\"\n />\n <path\n className=\"opacity-75\"\n fill=\"currentColor\"\n d=\"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4zm2 5.291A7.962 7.962 0 014 12H0c0 3.042 1.135 5.824 3 7.938l3-2.647z\"\n />\n </svg>\n );\n}\n\n/**\n * Link styled as a button.\n */\nexport interface ButtonLinkProps extends React.AnchorHTMLAttributes<HTMLAnchorElement> {\n variant?: ButtonProps['variant'];\n size?: ButtonProps['size'];\n fullWidth?: boolean;\n leftIcon?: React.ReactNode;\n rightIcon?: React.ReactNode;\n}\n\nexport function ButtonLink({\n variant = 'primary',\n size = 'md',\n fullWidth = false,\n leftIcon,\n rightIcon,\n children,\n className = '',\n ...props\n}: ButtonLinkProps) {\n const classes = getButtonClasses({ variant, size, fullWidth, disabled: false });\n\n return (\n <a className={`${classes} ${className}`} {...props}>\n {leftIcon && <span className=\"mr-2\">{leftIcon}</span>}\n {children}\n {rightIcon && <span className=\"ml-2\">{rightIcon}</span>}\n </a>\n );\n}\n","/**\n * Card Component\n *\n * A flexible card component for displaying content in a contained box.\n */\n\nimport React from 'react';\n\nexport interface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: 'default' | 'elevated' | 'outlined' | 'filled';\n padding?: 'none' | 'sm' | 'md' | 'lg';\n hover?: boolean;\n}\n\n/**\n * Get CSS classes for card variants.\n */\nfunction getCardClasses(props: Pick<CardProps, 'variant' | 'padding' | 'hover'>): string {\n const { variant = 'default', padding = 'md', hover = false } = props;\n\n const baseClasses = ['rounded-lg', 'overflow-hidden'];\n\n // Variant classes\n const variantClasses: Record<NonNullable<CardProps['variant']>, string> = {\n default: 'bg-white shadow',\n elevated: 'bg-white shadow-lg',\n outlined: 'bg-white border border-gray-200',\n filled: 'bg-gray-50',\n };\n\n // Padding classes\n const paddingClasses: Record<NonNullable<CardProps['padding']>, string> = {\n none: '',\n sm: 'p-3',\n md: 'p-5',\n lg: 'p-8',\n };\n\n // Hover effect\n const hoverClasses = hover\n ? 'transition-all duration-200 hover:shadow-lg hover:-translate-y-1'\n : '';\n\n return [\n ...baseClasses,\n variantClasses[variant],\n paddingClasses[padding],\n hoverClasses,\n ]\n .filter(Boolean)\n .join(' ');\n}\n\n/**\n * Card component for containing content.\n */\nexport function Card({\n variant = 'default',\n padding = 'md',\n hover = false,\n children,\n className = '',\n ...props\n}: CardProps) {\n const classes = getCardClasses({ variant, padding, hover });\n\n return (\n <div className={`${classes} ${className}`} {...props}>\n {children}\n </div>\n );\n}\n\n/**\n * Card header section.\n */\nexport interface CardHeaderProps extends React.HTMLAttributes<HTMLDivElement> {\n title?: string;\n subtitle?: string;\n action?: React.ReactNode;\n}\n\nexport function CardHeader({\n title,\n subtitle,\n action,\n children,\n className = '',\n ...props\n}: CardHeaderProps) {\n return (\n <div className={`flex items-start justify-between ${className}`} {...props}>\n <div>\n {title && <h3 className=\"text-lg font-semibold text-gray-900\">{title}</h3>}\n {subtitle && <p className=\"mt-1 text-sm text-gray-500\">{subtitle}</p>}\n {children}\n </div>\n {action && <div className=\"flex-shrink-0 ml-4\">{action}</div>}\n </div>\n );\n}\n\n/**\n * Card body section.\n */\nexport function CardBody({\n children,\n className = '',\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div className={`mt-4 ${className}`} {...props}>\n {children}\n </div>\n );\n}\n\n/**\n * Card footer section.\n */\nexport function CardFooter({\n children,\n className = '',\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div className={`mt-4 pt-4 border-t border-gray-100 ${className}`} {...props}>\n {children}\n </div>\n );\n}\n\n/**\n * Card image section.\n */\nexport interface CardImageProps extends React.ImgHTMLAttributes<HTMLImageElement> {\n aspectRatio?: 'square' | 'video' | 'wide' | 'auto';\n}\n\nexport function CardImage({\n aspectRatio = 'video',\n className = '',\n alt = '',\n ...props\n}: CardImageProps) {\n const aspectClasses: Record<NonNullable<CardImageProps['aspectRatio']>, string> = {\n square: 'aspect-square',\n video: 'aspect-video',\n wide: 'aspect-[2/1]',\n auto: '',\n };\n\n return (\n <div className={`-m-5 mb-4 ${aspectClasses[aspectRatio]} overflow-hidden`}>\n <img\n className={`w-full h-full object-cover ${className}`}\n alt={alt}\n {...props}\n />\n </div>\n );\n}\n","/**\n * SheetSite SEO Module\n *\n * Utilities for generating SEO metadata, JSON-LD structured data,\n * sitemaps, and robots.txt.\n */\n\nimport type { BusinessInfo, HoursEntry, SiteData } from '../data/types';\n\n// =============================================================================\n// METADATA GENERATION\n// =============================================================================\n\nexport interface MetadataOptions {\n titleTemplate?: string;\n baseUrl?: string;\n}\n\n/**\n * Generate metadata for a page.\n */\nexport function generateMetadata(\n business: BusinessInfo,\n pageTitle?: string,\n pageDescription?: string,\n options: MetadataOptions = {}\n) {\n const { titleTemplate = '%s', baseUrl } = options;\n\n const title = pageTitle\n ? titleTemplate.replace('%s', pageTitle)\n : business.name;\n\n const description = pageDescription || business.description || business.aboutShort || '';\n\n const locationString = [business.city, business.state].filter(Boolean).join(', ');\n\n return {\n title,\n description,\n keywords: [\n business.name,\n locationString,\n // Add more keywords based on business type\n ].filter(Boolean),\n openGraph: {\n title,\n description,\n type: 'website',\n ...(baseUrl && { url: baseUrl }),\n ...(business.ogImageUrl && { images: [{ url: business.ogImageUrl }] }),\n },\n twitter: {\n card: 'summary_large_image',\n title,\n description,\n ...(business.ogImageUrl && { images: [business.ogImageUrl] }),\n },\n };\n}\n\n// =============================================================================\n// JSON-LD STRUCTURED DATA\n// =============================================================================\n\nexport type JsonLdType =\n | 'LocalBusiness'\n | 'Restaurant'\n | 'Store'\n | 'ProfessionalService'\n | 'HealthAndBeautyBusiness'\n | 'FoodEstablishment'\n | 'HomeAndConstructionBusiness'\n | 'AutomotiveBusiness';\n\n/**\n * Convert 12-hour time to 24-hour format for JSON-LD.\n */\nfunction convertTo24Hour(time: string): string {\n const match = time.match(/(\\d{1,2}):?(\\d{2})?\\s*(AM|PM)?/i);\n if (!match) return time;\n\n let hours = parseInt(match[1], 10);\n const minutes = match[2] || '00';\n const period = match[3]?.toUpperCase();\n\n if (period === 'PM' && hours !== 12) hours += 12;\n if (period === 'AM' && hours === 12) hours = 0;\n\n return `${hours.toString().padStart(2, '0')}:${minutes}`;\n}\n\n/**\n * Generate opening hours specification for JSON-LD.\n */\nfunction generateOpeningHoursSpec(hours: HoursEntry[]) {\n const dayMap: Record<string, string> = {\n monday: 'Monday',\n tuesday: 'Tuesday',\n wednesday: 'Wednesday',\n thursday: 'Thursday',\n friday: 'Friday',\n saturday: 'Saturday',\n sunday: 'Sunday',\n };\n\n return hours\n .filter((h) => !h.closed && h.open && h.close)\n .map((h) => ({\n '@type': 'OpeningHoursSpecification',\n dayOfWeek: dayMap[h.day],\n opens: convertTo24Hour(h.open!),\n closes: convertTo24Hour(h.close!),\n }));\n}\n\n/**\n * Generate JSON-LD structured data for a local business.\n */\nexport function generateLocalBusinessJsonLd(\n data: SiteData,\n options: {\n type?: JsonLdType;\n baseUrl?: string;\n } = {}\n): object {\n const { business, hours, testimonials } = data;\n const { type = 'LocalBusiness', baseUrl } = options;\n\n const address = {\n '@type': 'PostalAddress',\n streetAddress: [business.addressLine1, business.addressLine2].filter(Boolean).join(', '),\n addressLocality: business.city,\n addressRegion: business.state,\n postalCode: business.zip,\n addressCountry: business.country || 'US',\n };\n\n const jsonLd: Record<string, unknown> = {\n '@context': 'https://schema.org',\n '@type': type,\n name: business.name,\n description: business.description || business.aboutShort,\n ...(baseUrl && { url: baseUrl }),\n ...(business.phone && { telephone: business.phone }),\n ...(business.email && { email: business.email }),\n ...(business.logoUrl && { logo: business.logoUrl }),\n ...(business.heroImageUrl && { image: business.heroImageUrl }),\n ...(business.addressLine1 && { address }),\n ...(business.priceRange && { priceRange: business.priceRange }),\n ...(hours.length > 0 && { openingHoursSpecification: generateOpeningHoursSpec(hours) }),\n };\n\n // Add aggregate rating if testimonials exist\n if (testimonials.length > 0) {\n const ratings = testimonials.filter((t) => t.rating).map((t) => t.rating!);\n if (ratings.length > 0) {\n const avgRating = ratings.reduce((a, b) => a + b, 0) / ratings.length;\n jsonLd.aggregateRating = {\n '@type': 'AggregateRating',\n ratingValue: avgRating.toFixed(1),\n reviewCount: ratings.length,\n bestRating: 5,\n worstRating: 1,\n };\n }\n }\n\n return jsonLd;\n}\n\n/**\n * Generate the script tag content for JSON-LD.\n */\nexport function generateJsonLdScript(jsonLd: object): string {\n return JSON.stringify(jsonLd, null, 2);\n}\n\n// =============================================================================\n// SITEMAP GENERATION\n// =============================================================================\n\nexport interface SitemapUrl {\n loc: string;\n lastmod?: string;\n changefreq?: 'always' | 'hourly' | 'daily' | 'weekly' | 'monthly' | 'yearly' | 'never';\n priority?: number;\n}\n\n/**\n * Generate sitemap URLs for common pages.\n */\nexport function generateSitemapUrls(\n baseUrl: string,\n pages: string[] = ['/', '/services', '/gallery', '/about', '/contact', '/faq', '/privacy']\n): SitemapUrl[] {\n const now = new Date().toISOString().split('T')[0];\n\n return pages.map((page) => ({\n loc: `${baseUrl}${page}`,\n lastmod: now,\n changefreq: page === '/' ? 'weekly' : 'monthly',\n priority: page === '/' ? 1.0 : 0.8,\n }));\n}\n\n/**\n * Generate XML sitemap content.\n */\nexport function generateSitemapXml(urls: SitemapUrl[]): string {\n const urlEntries = urls\n .map(\n (url) => `\n <url>\n <loc>${url.loc}</loc>\n ${url.lastmod ? `<lastmod>${url.lastmod}</lastmod>` : ''}\n ${url.changefreq ? `<changefreq>${url.changefreq}</changefreq>` : ''}\n ${url.priority !== undefined ? `<priority>${url.priority}</priority>` : ''}\n </url>`\n )\n .join('');\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\">\n${urlEntries}\n</urlset>`;\n}\n\n// =============================================================================\n// ROBOTS.TXT GENERATION\n// =============================================================================\n\n/**\n * Generate robots.txt content.\n */\nexport function generateRobotsTxt(baseUrl?: string): string {\n return `User-agent: *\nAllow: /\n${baseUrl ? `\\nSitemap: ${baseUrl}/sitemap.xml` : ''}`;\n}\n\n// =============================================================================\n// CANONICAL URL HELPERS\n// =============================================================================\n\n/**\n * Generate canonical URL.\n */\nexport function getCanonicalUrl(baseUrl: string, path: string): string {\n const cleanPath = path.startsWith('/') ? path : `/${path}`;\n return `${baseUrl}${cleanPath}`;\n}\n\n// =============================================================================\n// META TAGS HELPERS\n// =============================================================================\n\n/**\n * Generate common meta tags as an object.\n */\nexport function generateCommonMetaTags(business: BusinessInfo) {\n const location = [business.city, business.state].filter(Boolean).join(', ');\n\n return {\n 'geo.region': business.state ? `US-${business.state}` : undefined,\n 'geo.placename': business.city,\n 'og:locale': 'en_US',\n 'og:site_name': business.name,\n 'twitter:card': 'summary_large_image',\n ...(location && { 'geo.position': location }),\n };\n}\n","/**\n * SheetSite Utilities\n *\n * Common utility functions for formatting, validation, and helpers.\n */\n\nimport type { BusinessInfo, HoursEntry } from '../data/types';\n\n// =============================================================================\n// PHONE FORMATTING\n// =============================================================================\n\n/**\n * Format a phone number to (XXX) XXX-XXXX format.\n */\nexport function formatPhone(phone: string | undefined): string {\n if (!phone) return '';\n\n // Remove all non-digits\n const digits = phone.replace(/\\D/g, '');\n\n // Handle different lengths\n if (digits.length === 10) {\n return `(${digits.slice(0, 3)}) ${digits.slice(3, 6)}-${digits.slice(6)}`;\n }\n if (digits.length === 11 && digits[0] === '1') {\n return `(${digits.slice(1, 4)}) ${digits.slice(4, 7)}-${digits.slice(7)}`;\n }\n\n return phone;\n}\n\n/**\n * Get a tel: link from a phone number.\n */\nexport function getPhoneLink(phone: string | undefined): string {\n if (!phone) return '';\n const digits = phone.replace(/\\D/g, '');\n return `tel:${digits}`;\n}\n\n// =============================================================================\n// ADDRESS FORMATTING\n// =============================================================================\n\n/**\n * Format a complete address string.\n */\nexport function formatAddress(business: BusinessInfo): string {\n const parts = [\n business.addressLine1,\n business.addressLine2,\n `${business.city || ''}, ${business.state || ''} ${business.zip || ''}`.trim(),\n ].filter(Boolean);\n\n return parts.join(', ');\n}\n\n/**\n * Get a Google Maps URL for an address.\n */\nexport function getGoogleMapsUrl(business: BusinessInfo): string {\n if (business.googleMapsUrl) return business.googleMapsUrl;\n\n const address = formatAddress(business);\n return `https://www.google.com/maps/search/?api=1&query=${encodeURIComponent(address)}`;\n}\n\n/**\n * Get a Google Maps directions URL.\n */\nexport function getDirectionsUrl(business: BusinessInfo): string {\n const address = formatAddress(business);\n return `https://www.google.com/maps/dir/?api=1&destination=${encodeURIComponent(address)}`;\n}\n\n// =============================================================================\n// STRING UTILITIES\n// =============================================================================\n\n/**\n * Convert a string to a URL-friendly slug.\n */\nexport function slugify(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^\\w\\s-]/g, '')\n .replace(/\\s+/g, '-')\n .replace(/--+/g, '-')\n .trim();\n}\n\n/**\n * Truncate text to a maximum length with ellipsis.\n */\nexport function truncate(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text;\n return text.slice(0, maxLength - 3).trim() + '...';\n}\n\n/**\n * Get initials from a name.\n */\nexport function getInitials(name: string): string {\n return name\n .split(' ')\n .map((n) => n[0])\n .join('')\n .toUpperCase()\n .slice(0, 2);\n}\n\n/**\n * Capitalize the first letter of a string.\n */\nexport function capitalize(text: string): string {\n return text.charAt(0).toUpperCase() + text.slice(1);\n}\n\n/**\n * Convert snake_case to Title Case.\n */\nexport function snakeToTitle(text: string): string {\n return text\n .split('_')\n .map(capitalize)\n .join(' ');\n}\n\n// =============================================================================\n// VALIDATION\n// =============================================================================\n\n/**\n * Validate an email address.\n */\nexport function isValidEmail(email: string): boolean {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n return emailRegex.test(email);\n}\n\n/**\n * Validate a phone number (basic check for 10+ digits).\n */\nexport function isValidPhone(phone: string): boolean {\n const digits = phone.replace(/\\D/g, '');\n return digits.length >= 10;\n}\n\n/**\n * Validate a URL.\n */\nexport function isValidUrl(url: string): boolean {\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n}\n\n// =============================================================================\n// CLASS NAME UTILITIES\n// =============================================================================\n\n/**\n * Combine class names, filtering out falsy values.\n */\nexport function cn(...classes: (string | undefined | null | false)[]): string {\n return classes.filter(Boolean).join(' ');\n}\n\n// =============================================================================\n// CURRENCY FORMATTING\n// =============================================================================\n\n/**\n * Format a number as currency.\n */\nexport function formatCurrency(\n amount: number,\n currency: string = 'USD',\n locale: string = 'en-US'\n): string {\n return new Intl.NumberFormat(locale, {\n style: 'currency',\n currency,\n }).format(amount);\n}\n\n/**\n * Format a price for display (handles various formats).\n */\nexport function formatPrice(price: number | string | undefined): string {\n if (price === undefined || price === null || price === '') return '';\n\n if (typeof price === 'string') {\n // If it's already formatted (contains $), return as-is\n if (price.includes('$')) return price;\n // Try to parse as number\n const num = parseFloat(price);\n if (isNaN(num)) return price;\n price = num;\n }\n\n return formatCurrency(price);\n}\n\n// =============================================================================\n// DATE/TIME UTILITIES\n// =============================================================================\n\n/**\n * Get the current day of the week.\n */\nexport function getCurrentDay(timezone?: string): string {\n const days = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'];\n const now = timezone\n ? new Date(new Date().toLocaleString('en-US', { timeZone: timezone }))\n : new Date();\n return days[now.getDay()];\n}\n\n/**\n * Check if currently within business hours.\n */\nexport function isWithinHours(\n hours: HoursEntry[],\n timezone?: string\n): boolean {\n const today = getCurrentDay(timezone);\n const todayHours = hours.find((h) => h.day === today);\n\n if (!todayHours || todayHours.closed || !todayHours.open || !todayHours.close) {\n return false;\n }\n\n const now = timezone\n ? new Date(new Date().toLocaleString('en-US', { timeZone: timezone }))\n : new Date();\n\n const currentMinutes = now.getHours() * 60 + now.getMinutes();\n\n const openMinutes = parseTimeString(todayHours.open);\n const closeMinutes = parseTimeString(todayHours.close);\n\n if (openMinutes === null || closeMinutes === null) return false;\n\n return currentMinutes >= openMinutes && currentMinutes < closeMinutes;\n}\n\n/**\n * Parse a time string to minutes since midnight.\n */\nfunction parseTimeString(time: string): number | null {\n const match = time.match(/(\\d{1,2}):?(\\d{2})?\\s*(AM|PM)?/i);\n if (!match) return null;\n\n let hours = parseInt(match[1], 10);\n const minutes = parseInt(match[2] || '0', 10);\n const period = match[3]?.toUpperCase();\n\n if (period === 'PM' && hours !== 12) hours += 12;\n if (period === 'AM' && hours === 12) hours = 0;\n\n return hours * 60 + minutes;\n}\n\n// =============================================================================\n// ENVIRONMENT HELPERS\n// =============================================================================\n\n/**\n * Check if running on the server.\n */\nexport function isServer(): boolean {\n return typeof window === 'undefined';\n}\n\n/**\n * Check if running in development mode.\n */\nexport function isDevelopment(): boolean {\n return process.env.NODE_ENV === 'development';\n}\n\n/**\n * Check if running in production mode.\n */\nexport function isProduction(): boolean {\n return process.env.NODE_ENV === 'production';\n}\n\n/**\n * Get an environment variable with optional default.\n */\nexport function getEnvVar(key: string, defaultValue?: string): string | undefined {\n return process.env[key] || defaultValue;\n}\n\n/**\n * Require an environment variable (throws if not set).\n */\nexport function requireEnvVar(key: string): string {\n const value = process.env[key];\n if (!value) {\n throw new Error(`Missing required environment variable: ${key}`);\n }\n return value;\n}\n"],"mappings":"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","names":["getColorPalette","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","jsx","jsxs","useState","jsx","jsxs","useState","SectionHeader","jsx","jsxs","dayNames","useState","jsx","jsxs","Fragment","jsx","jsxs","jsx","jsxs"]}
|