@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/components/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"],"sourcesContent":["/**\n * SheetSite Component Library\n *\n * Pre-built React components for building small business websites.\n * All components are designed to work with SheetSite data types.\n */\n\n// Layout Components\nexport { Header } from './layout/Header';\nexport type { HeaderProps, NavItem } from './layout/Header';\n\nexport { Footer } from './layout/Footer';\nexport type { FooterProps, FooterLink } from './layout/Footer';\n\n// Section Components\nexport { Hero } from './sections/Hero';\nexport type { HeroProps } from './sections/Hero';\n\nexport { Services } from './sections/Services';\nexport type { ServicesProps } from './sections/Services';\n\nexport { Testimonials } from './sections/Testimonials';\nexport type { TestimonialsProps } from './sections/Testimonials';\n\nexport { FAQ } from './sections/FAQ';\nexport type { FAQProps } from './sections/FAQ';\n\nexport { Hours, getTodayHours, isCurrentlyOpen } from './sections/Hours';\nexport type { HoursProps } from './sections/Hours';\n\nexport { Gallery } from './sections/Gallery';\nexport type { GalleryProps } from './sections/Gallery';\n\n// UI Components\nexport { Button, ButtonLink } from './ui/Button';\nexport type { ButtonProps, ButtonLinkProps } from './ui/Button';\n\nexport { Card, CardHeader, CardBody, CardFooter, CardImage } from './ui/Card';\nexport type { CardProps, CardHeaderProps, CardImageProps } from './ui/Card';\n\nexport * from './ui/Icons';\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"],"mappings":"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","names":["import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","SectionHeader","import_jsx_runtime","dayNames","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime"]}
|