import { AnimatedLogo } from '@/components/animated-logo' import { RollingPhrases } from '@/components/rolling-phrases' /** @description Services page with home page style structure */ 'use client' import { AnimatedLogo } from '@/components/animated-logo' import { RollingPhrases } from '@/components/rolling-phrases' /** @description Services page with home page style structure */ import { useState, useEffect } from 'react' interface Service { id: string name: string description: string duration_minutes: number base_price: number category: string requires_dual_artist: boolean is_active: boolean } export default function ServiciosPage() { const [services, setServices] = useState([]) const [loading, setLoading] = useState(true) useEffect(() => { fetchServices() }, []) const fetchServices = async () => { try { const response = await fetch('/api/services') const data = await response.json() if (data.success) { setServices(data.services.filter((s: Service) => s.is_active)) } } catch (error) { console.error('Error fetching services:', error) } finally { setLoading(false) } } const formatCurrency = (amount: number) => { return new Intl.NumberFormat('es-MX', { style: 'currency', currency: 'MXN' }).format(amount) } const formatDuration = (minutes: number) => { const hours = Math.floor(minutes / 60) const mins = minutes % 60 if (hours > 0) { return mins > 0 ? `${hours}h ${mins}min` : `${hours}h` } return `${mins} min` } const getCategoryTitle = (category: string) => { const titles: Record = { core: 'CORE EXPERIENCES - El corazón de Anchor 23', nails: 'NAIL COUTURE - Técnica invisible. Resultado impecable.', hair: 'HAIR FINISHING RITUALS', lashes: 'LASH & BROW RITUALS - Mirada definida con sutileza.', brows: 'LASH & BROW RITUALS - Mirada definida con sutileza.', events: 'EVENT EXPERIENCES - Agenda especial', permanent: 'PERMANENT RITUALS - Agenda limitada · Especialista certificada' } return titles[category] || category } const getCategoryDescription = (category: string) => { const descriptions: Record = { core: 'Rituales conscientes donde el tiempo se desacelera. Cada experiencia está diseñada para mujeres que valoran el silencio, la atención absoluta y los resultados impecables.', nails: 'En Anchor 23 no eliges técnicas. Cada decisión se toma internamente para lograr un resultado elegante, duradero y natural. No ofrecemos servicios de mantenimiento ni correcciones.', hair: 'Disponibles únicamente para clientas con experiencia Anchor el mismo día.', lashes: '', brows: '', events: 'Agenda especial para ocasiones selectas.', permanent: '' } return descriptions[category] || '' } const groupedServices = services.reduce((acc, service) => { if (!acc[service.category]) { acc[service.category] = [] } acc[service.category].push(service) return acc }, {} as Record) const categoryOrder = ['core', 'nails', 'hair', 'lashes', 'brows', 'events', 'permanent'] if (loading) { return (

Nuestros Servicios

Cargando servicios...

) } return ( <>

Servicios

Anchor:23

Imagen Servicios

Experiencias

Criterio antes que cantidad

Anchor 23 es un espacio privado donde el tiempo se desacelera. Aquí, cada experiencia está diseñada para mujeres que valoran el silencio, la atención absoluta y los resultados impecables.

No trabajamos con volumen. Trabajamos con intención.

Nuestros Servicios

{categoryOrder.map(category => { const categoryServices = groupedServices[category] if (!categoryServices || categoryServices.length === 0) return null return (

{getCategoryTitle(category)}

{getCategoryDescription(category) && (

{getCategoryDescription(category)}

)}
{categoryServices.map((service) => (
{service.name}
{service.description && (

{service.description}

)}
⏳ {formatDuration(service.duration_minutes)} {service.requires_dual_artist && ( Dual Artist )}
{formatCurrency(service.base_price)} Reservar
))}
) })}

Lo que Define Anchor 23

No ofrecemos retoques ni servicios aislados
No trabajamos con prisas
No explicamos de más
No negociamos estándares
Cada experiencia está pensada para durar, sentirse y recordarse
) }