"use client" import { Icon } from "@iconify/react" import { addDays, format, startOfDay } from "date-fns" import { fr } from "date-fns/locale" import { cn } from "@/lib/utils" const ACCENT = "#FBBC04" const SLOTS = ["09:00", "09:30", "10:00", "11:30", "14:00", "15:30"] as const const SELECTED_SLOT = "10:00" function buildDays() { const base = startOfDay(new Date()) return Array.from({ length: 5 }, (_, index) => { const date = addDays(base, index + 1) return { key: format(date, "yyyy-MM-dd"), weekday: format(date, "EEE", { locale: fr }), day: format(date, "d", { locale: fr }), busy: index === 2, } }) } /** Page de réservation type Calendly — aperçu statique sur les disponibilités réelles. */ export function UlticalSchedulingDemo() { const days = buildDays() const selectedDay = days.find((day) => !day.busy) ?? days[0]! return (
Camille Visiteur

Rendez-vous découverte

  • 30 minutes
  • Visio UltiMeet (lien généré)
  • Europe/Paris (GMT+2)

Les créneaux occupés sont masqués automatiquement d'après votre agenda CalDAV — aucune double réservation.

Choisissez un créneau

{days.map((day) => { const active = day.key === selectedDay.key return (
{day.weekday} {day.day}
) })}
{SLOTS.map((slot) => { const selected = slot === SELECTED_SLOT return ( ) })}

Page de réservation publique — disponibilités free/busy, rien n'est réservé.

) }