{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "doctor-appointment-scheduler",
  "title": "Doctor Appointment Scheduler",
  "type": "registry:block",
  "files": [
    {
      "path": "packages/registry-react/blocks/doctor-appointment-scheduler/DoctorAppointmentScheduler.tsx",
      "content": "'use client'\n\nimport * as React from 'react'\nimport {\n  BadgeCheck,\n  Building2,\n  Calendar,\n  CalendarCheck,\n  CalendarDays,\n  Check,\n  CheckCircle2,\n  ChevronLeft,\n  ChevronRight,\n  Clock,\n  CreditCard,\n  FileText,\n  HeartPulse,\n  Info,\n  Lock,\n  MapPin,\n  Phone,\n  RotateCcw,\n  ShieldCheck,\n  Star,\n  Stethoscope,\n  Sun,\n  Sunset,\n  User,\n  Video,\n} from 'lucide-react'\nimport { cn } from '@/lib/utils'\nimport { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@/components/ui/card'\nimport { Input } from '@/components/ui/input'\nimport { RadioGroup, RadioGroupItem } from '@/components/ui/radio-group'\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'\nimport { Separator } from '@/components/ui/separator'\nimport { Textarea } from '@/components/ui/textarea'\n\nexport interface DoctorAppointmentSchedulerProps {\n  doctorName?: string\n  doctorTitle?: string\n  doctorAvatar?: string\n  specialty?: string\n  clinicName?: string\n  clinicAddress?: string\n  rating?: number\n  reviewCount?: number\n  insurances?: string[]\n  initialDate?: string\n  initialTime?: string\n  initialVisitType?: 'in-person' | 'telehealth'\n  initialReason?: string\n  className?: string\n}\n\n// Hardcoded week selector data\nconst weekDays = [\n  { id: '2026-08-24', weekday: 'Mon', day: '24', month: 'Aug', fullDate: 'Monday, Aug 24, 2026', slotsCount: 6 },\n  { id: '2026-08-25', weekday: 'Tue', day: '25', month: 'Aug', fullDate: 'Tuesday, Aug 25, 2026', slotsCount: 8 },\n  { id: '2026-08-26', weekday: 'Wed', day: '26', month: 'Aug', fullDate: 'Wednesday, Aug 26, 2026', slotsCount: 5 },\n  { id: '2026-08-27', weekday: 'Thu', day: '27', month: 'Aug', fullDate: 'Thursday, Aug 27, 2026', slotsCount: 8 },\n  { id: '2026-08-28', weekday: 'Fri', day: '28', month: 'Aug', fullDate: 'Friday, Aug 28, 2026', slotsCount: 7 },\n  { id: '2026-08-29', weekday: 'Sat', day: '29', month: 'Aug', fullDate: 'Saturday, Aug 29, 2026', slotsCount: 4 },\n]\n\n// Available Time Slots\nconst morningSlots = ['09:00 AM', '09:30 AM', '10:15 AM', '11:00 AM']\nconst afternoonSlots = ['02:00 PM', '02:45 PM', '03:30 PM', '04:15 PM']\n\n// Reasons for consultation\nconst visitReasons = [\n  {\n    value: 'annual-checkup',\n    label: 'Annual Checkup',\n    description: 'Routine wellness & cardiovascular health screening',\n    copay: '$25.00',\n  },\n  {\n    value: 'follow-up',\n    label: 'Follow-up',\n    description: 'Post-treatment evaluation & diagnostic review',\n    copay: '$20.00',\n  },\n  {\n    value: 'chest-pain',\n    label: 'Chest Pain Consultation',\n    description: 'Comprehensive symptom evaluation & urgent diagnostics',\n    copay: '$30.00',\n  },\n  {\n    value: 'medication-review',\n    label: 'Medication Review',\n    description: 'Prescription adjustment & therapeutic monitoring',\n    copay: '$15.00',\n  },\n  {\n    value: 'hypertension-evaluation',\n    label: 'Hypertension Evaluation',\n    description: 'Blood pressure assessment & ongoing care plan',\n    copay: '$25.00',\n  },\n]\n\nexport function DoctorAppointmentScheduler({\n  doctorName = 'Dr. Marcus Thorne, MD, FACC',\n  doctorTitle = 'Board-Certified Cardiologist · Cedars-Sinai Heart Institute',\n  doctorAvatar = 'https://images.unsplash.com/photo-1622253692010-333f2da6031d?q=80&w=320&auto=format&fit=crop',\n  specialty = 'Cardiology & Internal Medicine',\n  clinicName = 'Cedars-Sinai Medical Plaza',\n  clinicAddress = 'Cedars-Sinai Medical Plaza, Suite 400, Los Angeles, CA',\n  rating = 4.9,\n  reviewCount = 240,\n  insurances = ['BlueCross BlueShield', 'Aetna', 'UnitedHealthcare', 'Medicare', 'Cigna'],\n  initialDate = '2026-08-27',\n  initialTime = '10:15 AM',\n  initialVisitType = 'in-person',\n  initialReason = 'chest-pain',\n  className,\n}: DoctorAppointmentSchedulerProps) {\n  // State\n  const [selectedDate, setSelectedDate] = React.useState(initialDate)\n  const [selectedTime, setSelectedTime] = React.useState(initialTime)\n  const [visitType, setVisitType] = React.useState<'in-person' | 'telehealth'>(initialVisitType)\n  const [selectedReason, setSelectedReason] = React.useState(initialReason)\n  const [patientName, setPatientName] = React.useState('Sarah Jenkins')\n  const [patientPhone, setPatientPhone] = React.useState('+1 (555) 382-9104')\n  const [insurancePolicy, setInsurancePolicy] = React.useState('BCBS-90481240')\n  const [notes, setNotes] = React.useState('Occasional mild tightness after morning workouts; seeking ECG review.')\n  const [isBooked, setIsBooked] = React.useState(false)\n  const [calendarAdded, setCalendarAdded] = React.useState(false)\n  const bookingReference = 'APT-84920'\n\n  // Computed helpers\n  const currentDateObj = React.useMemo(() => {\n    return weekDays.find((d) => d.id === selectedDate) || weekDays[3]\n  }, [selectedDate])\n\n  const currentReasonObj = React.useMemo(() => {\n    return visitReasons.find((r) => r.value === selectedReason) || visitReasons[2]\n  }, [selectedReason])\n\n  const selectedSlotFormatted = `${currentDateObj.weekday}, ${currentDateObj.month} ${currentDateObj.day} at ${selectedTime}`\n\n  const locationText =\n    visitType === 'in-person' ? 'In-Person · Room 402, Cedars-Sinai Plaza' : 'Video Telehealth · Secure HIPAA Link'\n\n  function handleBook() {\n    if (!patientName.trim() || !patientPhone.trim()) return\n    setIsBooked(true)\n  }\n\n  function handleReset() {\n    setIsBooked(false)\n    setCalendarAdded(false)\n  }\n\n  function handleAddToCalendar() {\n    setCalendarAdded(true)\n  }\n\n  return (\n    <div data-slot=\"doctor-appointment-scheduler\" className={cn('mx-auto w-full max-w-6xl space-y-6', className)}>\n      {/* 1. Doctor Profile Hero Card */}\n      <Card className=\"border-border bg-card overflow-hidden shadow-xs\">\n        <CardContent className=\"p-6 md:p-8\">\n          <div className=\"flex flex-col gap-6 md:flex-row md:items-center md:justify-between\">\n            {/* Left: Avatar + Core Bio */}\n            <div className=\"flex flex-col items-start gap-5 sm:flex-row sm:items-center\">\n              <div className=\"relative shrink-0\">\n                <Avatar className=\"border-primary/20 bg-muted size-20 rounded-2xl border-2 shadow-xs md:size-24\">\n                  <AvatarImage src={doctorAvatar} alt={doctorName} className=\"rounded-2xl object-cover\" />\n                  <AvatarFallback className=\"bg-primary/10 text-primary rounded-2xl text-lg font-bold\">\n                    MT\n                  </AvatarFallback>\n                </Avatar>\n                <div className=\"border-success/30 bg-success/10 text-success text-success absolute -right-1.5 -bottom-1.5 flex items-center gap-1 rounded-full border px-2 py-0.5 text-xs font-semibold backdrop-blur-sm\">\n                  <span className=\"bg-success size-1.5 animate-pulse rounded-full\" />\n                  <span>Available</span>\n                </div>\n              </div>\n\n              <div className=\"space-y-2\">\n                <div className=\"flex flex-wrap items-center gap-2\">\n                  <h1 className=\"text-foreground text-xl font-bold tracking-tight md:text-2xl\">{doctorName}</h1>\n                  <BadgeCheck className=\"text-primary size-5 shrink-0\" aria-label=\"Verified Doctor\" />\n                </div>\n\n                <p className=\"text-muted-foreground text-xs font-normal md:text-sm\">{doctorTitle}</p>\n\n                <div className=\"flex flex-wrap items-center gap-2 pt-0.5\">\n                  <Badge wrap variant=\"secondary\" className=\"text-xs font-medium\">\n                    {specialty}\n                  </Badge>\n                  <Badge wrap variant=\"outline\" className=\"text-muted-foreground border-border text-xs font-medium\">\n                    16+ Yrs Experience\n                  </Badge>\n                  <Badge wrap variant=\"outline\" className=\"text-muted-foreground border-border text-xs font-medium\">\n                    Cedars-Sinai Affiliated\n                  </Badge>\n                </div>\n              </div>\n            </div>\n\n            {/* Right: Rating, Clinic & Insurance Highlights */}\n            <div className=\"border-border/80 bg-muted/30 flex shrink-0 flex-col gap-2.5 rounded-xl border p-4 md:max-w-xs\">\n              <div className=\"flex items-center justify-between gap-3\">\n                <div className=\"text-foreground flex items-center gap-1.5\">\n                  <Star className=\"fill-warning text-warning size-4 shrink-0\" />\n                  <span className=\"text-sm font-bold tabular-nums\">{rating}</span>\n                  <span className=\"text-muted-foreground text-xs\">({reviewCount} reviews)</span>\n                </div>\n                <span className=\"text-success text-xs font-medium\">Top Rated</span>\n              </div>\n\n              <div className=\"text-muted-foreground flex items-start gap-2 text-xs\">\n                <MapPin className=\"text-primary mt-0.5 size-3.5 shrink-0\" />\n                <span className=\"line-clamp-2 leading-relaxed\">{clinicAddress}</span>\n              </div>\n\n              <div className=\"text-muted-foreground flex items-start gap-2 text-xs\">\n                <ShieldCheck className=\"text-success mt-0.5 size-3.5 shrink-0\" />\n                <span className=\"line-clamp-2 leading-relaxed\">\n                  Accepts BlueCross, Aetna, UnitedHealthcare, Medicare\n                </span>\n              </div>\n            </div>\n          </div>\n        </CardContent>\n      </Card>\n\n      {/* 2. Interactive Booking Flow (2-Column) */}\n      <div className=\"grid grid-cols-1 items-start gap-6 lg:grid-cols-12\">\n        {/* Left Column: Calendar & Slot Picker (7 Cols) */}\n        <div className=\"space-y-6 lg:col-span-7\">\n          {/* Step 1: Visit Type Selection */}\n          <div className=\"space-y-3\">\n            <div className=\"flex items-center gap-2\">\n              <div className=\"bg-primary/10 text-primary flex size-6 items-center justify-center rounded-full text-xs font-bold\">\n                1\n              </div>\n              <h2 className=\"text-foreground text-sm font-semibold\">Select Visit Type</h2>\n            </div>\n\n            <RadioGroup\n              value={visitType}\n              onValueChange={(val) => setVisitType(val as 'in-person' | 'telehealth')}\n              className=\"grid grid-cols-1 gap-3 sm:grid-cols-2\"\n            >\n              <label\n                htmlFor=\"visit-in-person-react\"\n                className={cn(\n                  'flex cursor-pointer items-start gap-3.5 rounded-xl border p-4 transition-colors duration-150',\n                  visitType === 'in-person'\n                    ? 'border-primary bg-primary/5 ring-primary/30 shadow-xs ring-1'\n                    : 'border-border bg-card hover:bg-muted/40',\n                )}\n              >\n                <RadioGroupItem id=\"visit-in-person-react\" value=\"in-person\" className=\"mt-0.5\" />\n                <div className=\"min-w-0 flex-1 space-y-1\">\n                  <div className=\"flex items-center gap-1.5\">\n                    <Building2 className=\"text-primary size-4 shrink-0\" />\n                    <span className=\"text-foreground text-sm font-semibold\">In-Person Visit</span>\n                  </div>\n                  <p className=\"text-muted-foreground text-xs leading-relaxed\">\n                    Cedars-Sinai Medical Plaza, Suite 400 · In-office diagnostics & exam\n                  </p>\n                </div>\n              </label>\n\n              <label\n                htmlFor=\"visit-telehealth-react\"\n                className={cn(\n                  'flex cursor-pointer items-start gap-3.5 rounded-xl border p-4 transition-colors duration-150',\n                  visitType === 'telehealth'\n                    ? 'border-primary bg-primary/5 ring-primary/30 shadow-xs ring-1'\n                    : 'border-border bg-card hover:bg-muted/40',\n                )}\n              >\n                <RadioGroupItem id=\"visit-telehealth-react\" value=\"telehealth\" className=\"mt-0.5\" />\n                <div className=\"min-w-0 flex-1 space-y-1\">\n                  <div className=\"flex items-center gap-1.5\">\n                    <Video className=\"text-primary size-4 shrink-0\" />\n                    <span className=\"text-foreground text-sm font-semibold\">Video Telehealth</span>\n                  </div>\n                  <p className=\"text-muted-foreground text-xs leading-relaxed\">\n                    HD video consultation · HIPAA link sent via SMS & email\n                  </p>\n                </div>\n              </label>\n            </RadioGroup>\n          </div>\n\n          {/* Step 2: Reason for Visit */}\n          <div className=\"space-y-3\">\n            <div className=\"flex items-center gap-2\">\n              <div className=\"bg-primary/10 text-primary flex size-6 items-center justify-center rounded-full text-xs font-bold\">\n                2\n              </div>\n              <h2 className=\"text-foreground text-sm font-semibold\">Reason for Visit</h2>\n            </div>\n\n            <Select value={selectedReason} onValueChange={setSelectedReason}>\n              <SelectTrigger className=\"bg-card border-border h-11 w-full rounded-xl px-4 text-sm font-medium\">\n                <SelectValue placeholder=\"Choose a clinical reason for consultation\" />\n              </SelectTrigger>\n              <SelectContent className=\"border-border bg-popover rounded-xl\">\n                {visitReasons.map((reason) => (\n                  <SelectItem key={reason.value} value={reason.value} className=\"cursor-pointer px-3 py-2.5 text-sm\">\n                    <div className=\"flex flex-col gap-0.5\">\n                      <span className=\"text-foreground font-medium\">{reason.label}</span>\n                      <span className=\"text-muted-foreground text-xs\">{reason.description}</span>\n                    </div>\n                  </SelectItem>\n                ))}\n              </SelectContent>\n            </Select>\n          </div>\n\n          {/* Step 3: Date Carousel / Week Selector */}\n          <div className=\"space-y-3\">\n            <div className=\"flex items-center justify-between\">\n              <div className=\"flex items-center gap-2\">\n                <div className=\"bg-primary/10 text-primary flex size-6 items-center justify-center rounded-full text-xs font-bold\">\n                  3\n                </div>\n                <h2 className=\"text-foreground text-sm font-semibold\">Select Date</h2>\n              </div>\n\n              <div className=\"flex items-center gap-2\">\n                <span className=\"text-muted-foreground text-xs font-medium\">August 2026</span>\n                <div className=\"flex items-center gap-1\">\n                  <Button\n                    variant=\"outline\"\n                    size=\"icon-sm\"\n                    className=\"border-border size-7 rounded-lg\"\n                    aria-label=\"Previous week\"\n                  >\n                    <ChevronLeft className=\"size-3.5\" />\n                  </Button>\n                  <Button\n                    variant=\"outline\"\n                    size=\"icon-sm\"\n                    className=\"border-border size-7 rounded-lg\"\n                    aria-label=\"Next week\"\n                  >\n                    <ChevronRight className=\"size-3.5\" />\n                  </Button>\n                </div>\n              </div>\n            </div>\n\n            {/* 6-Day Carousel Strip */}\n            <div className=\"grid grid-cols-3 gap-2 sm:grid-cols-6\">\n              {weekDays.map((day) => {\n                const isSelected = selectedDate === day.id\n                return (\n                  <button\n                    key={day.id}\n                    type=\"button\"\n                    className={cn(\n                      'focus-visible:ring-primary flex cursor-pointer flex-col items-center justify-center rounded-xl border p-3 text-center transition-colors duration-150 outline-none focus-visible:ring-2',\n                      isSelected\n                        ? 'border-primary bg-primary text-primary-foreground ring-primary/20 font-semibold shadow-xs ring-2'\n                        : 'border-border bg-card hover:bg-muted/50 text-foreground',\n                    )}\n                    onClick={() => setSelectedDate(day.id)}\n                  >\n                    <span\n                      className={cn(\n                        'text-xs font-medium tracking-wider uppercase',\n                        isSelected ? 'text-primary-foreground/90' : 'text-muted-foreground',\n                      )}\n                    >\n                      {day.weekday}\n                    </span>\n                    <span className=\"my-0.5 text-xl font-bold tabular-nums\">{day.day}</span>\n                    <span\n                      className={cn('text-xs font-medium', isSelected ? 'text-primary-foreground/80' : 'text-success')}\n                    >\n                      {day.slotsCount} slots\n                    </span>\n                  </button>\n                )\n              })}\n            </div>\n          </div>\n\n          {/* Step 4: Available Time Slots Grid */}\n          <div className=\"space-y-4\">\n            <div className=\"flex items-center justify-between\">\n              <div className=\"flex items-center gap-2\">\n                <div className=\"bg-primary/10 text-primary flex size-6 items-center justify-center rounded-full text-xs font-bold\">\n                  4\n                </div>\n                <h2 className=\"text-foreground text-sm font-semibold\">Available Time Slots</h2>\n              </div>\n              <span className=\"text-muted-foreground text-xs tabular-nums\">\n                8 slots on {currentDateObj.weekday}, {currentDateObj.month} {currentDateObj.day}\n              </span>\n            </div>\n\n            {/* Morning Section */}\n            <div className=\"border-border/70 bg-card space-y-2 rounded-xl border p-4\">\n              <div className=\"text-foreground flex items-center gap-1.5 text-xs font-semibold tracking-wide uppercase\">\n                <Sun className=\"text-warning size-3.5\" />\n                <span>Morning Slots</span>\n              </div>\n              <div className=\"grid grid-cols-2 gap-2 pt-1 sm:grid-cols-4\">\n                {morningSlots.map((slot) => {\n                  const isSelected = selectedTime === slot\n                  return (\n                    <button\n                      key={slot}\n                      type=\"button\"\n                      className={cn(\n                        'focus-visible:ring-primary flex cursor-pointer items-center justify-center rounded-lg border px-3 py-2.5 text-sm font-medium tabular-nums transition-colors duration-150 outline-none focus-visible:ring-2',\n                        isSelected\n                          ? 'border-primary bg-primary text-primary-foreground ring-primary/30 font-semibold shadow-xs ring-2'\n                          : 'border-border bg-background hover:bg-muted/60 text-foreground',\n                      )}\n                      onClick={() => setSelectedTime(slot)}\n                    >\n                      {slot}\n                    </button>\n                  )\n                })}\n              </div>\n            </div>\n\n            {/* Afternoon Section */}\n            <div className=\"border-border/70 bg-card space-y-2 rounded-xl border p-4\">\n              <div className=\"text-foreground flex items-center gap-1.5 text-xs font-semibold tracking-wide uppercase\">\n                <Sunset className=\"size-3.5 text-orange-500\" />\n                <span>Afternoon Slots</span>\n              </div>\n              <div className=\"grid grid-cols-2 gap-2 pt-1 sm:grid-cols-4\">\n                {afternoonSlots.map((slot) => {\n                  const isSelected = selectedTime === slot\n                  return (\n                    <button\n                      key={slot}\n                      type=\"button\"\n                      className={cn(\n                        'focus-visible:ring-primary flex cursor-pointer items-center justify-center rounded-lg border px-3 py-2.5 text-sm font-medium tabular-nums transition-colors duration-150 outline-none focus-visible:ring-2',\n                        isSelected\n                          ? 'border-primary bg-primary text-primary-foreground ring-primary/30 font-semibold shadow-xs ring-2'\n                          : 'border-border bg-background hover:bg-muted/60 text-foreground',\n                      )}\n                      onClick={() => setSelectedTime(slot)}\n                    >\n                      {slot}\n                    </button>\n                  )\n                })}\n              </div>\n            </div>\n          </div>\n        </div>\n\n        {/* Right Column: Appointment Summary Card (5 Cols) */}\n        <div className=\"lg:col-span-5\">\n          <div className=\"sticky top-6\">\n            {/* State A: Active Booking Form Summary */}\n            {!isBooked ? (\n              <Card className=\"border-border bg-card overflow-hidden shadow-xs\">\n                <CardHeader className=\"border-border/70 bg-muted/20 border-b pb-3\">\n                  <div className=\"flex items-center justify-between\">\n                    <div className=\"space-y-0.5\">\n                      <CardTitle className=\"text-foreground text-base font-bold\">Appointment Summary</CardTitle>\n                      <CardDescription className=\"text-muted-foreground text-xs\">\n                        Live schedule & patient registration\n                      </CardDescription>\n                    </div>\n                    <Badge\n                      wrap\n                      variant=\"outline\"\n                      className=\"border-success/30 bg-success/10 text-success gap-1.5 text-xs font-medium\"\n                    >\n                      <span className=\"bg-success size-1.5 animate-pulse rounded-full\" />\n                      <span>Slot Held: 09:48</span>\n                    </Badge>\n                  </div>\n                </CardHeader>\n\n                <CardContent className=\"space-y-4 p-5\">\n                  {/* Selected Slot Readout Banner */}\n                  <div className=\"border-primary/25 bg-primary/5 space-y-2.5 rounded-xl border p-4\">\n                    <div className=\"flex items-start gap-2.5\">\n                      <CalendarCheck className=\"text-primary mt-0.5 size-4 shrink-0\" />\n                      <div className=\"space-y-0.5\">\n                        <p className=\"text-muted-foreground text-xs font-medium\">Selected Slot</p>\n                        <p className=\"text-foreground text-sm font-bold tabular-nums\">{selectedSlotFormatted}</p>\n                      </div>\n                    </div>\n\n                    <div className=\"border-primary/15 flex items-start gap-2.5 border-t pt-1\">\n                      {visitType === 'in-person' ? (\n                        <Building2 className=\"text-primary mt-0.5 size-4 shrink-0\" />\n                      ) : (\n                        <Video className=\"text-primary mt-0.5 size-4 shrink-0\" />\n                      )}\n                      <div className=\"space-y-0.5\">\n                        <p className=\"text-muted-foreground text-xs font-medium\">Location / Mode</p>\n                        <p className=\"text-foreground text-xs font-medium\">{locationText}</p>\n                      </div>\n                    </div>\n\n                    <div className=\"border-primary/15 flex items-start gap-2.5 border-t pt-1\">\n                      <Stethoscope className=\"text-primary mt-0.5 size-4 shrink-0\" />\n                      <div className=\"space-y-0.5\">\n                        <p className=\"text-muted-foreground text-xs font-medium\">Visit Type</p>\n                        <p className=\"text-foreground text-xs font-medium\">{currentReasonObj.label}</p>\n                      </div>\n                    </div>\n                  </div>\n\n                  {/* Estimated Copay Readout */}\n                  <div className=\"border-border/80 bg-muted/40 flex items-center justify-between rounded-xl border p-3.5\">\n                    <div className=\"flex items-center gap-2\">\n                      <ShieldCheck className=\"text-success size-4 shrink-0\" />\n                      <div className=\"space-y-0.5\">\n                        <p className=\"text-muted-foreground text-xs font-medium\">Estimated Copay</p>\n                        <p className=\"text-foreground text-xs font-semibold\">BlueCross PPO In-Network</p>\n                      </div>\n                    </div>\n                    <div className=\"text-right\">\n                      <span className=\"text-foreground text-base font-bold tabular-nums\">{currentReasonObj.copay}</span>\n                      <p className=\"text-muted-foreground text-xs\">Covered at 90%</p>\n                    </div>\n                  </div>\n\n                  <Separator className=\"my-2\" />\n\n                  {/* Patient Details Form */}\n                  <div className=\"space-y-3\">\n                    <p className=\"text-muted-foreground text-xs font-semibold tracking-wider uppercase\">\n                      Patient Information\n                    </p>\n\n                    <div className=\"space-y-1.5\">\n                      <label htmlFor=\"sched-patient-name-react\" className=\"text-foreground text-xs font-medium\">\n                        Full Name <span className=\"text-destructive\">*</span>\n                      </label>\n                      <Input\n                        id=\"sched-patient-name-react\"\n                        value={patientName}\n                        onChange={(e) => setPatientName(e.target.value)}\n                        placeholder=\"e.g. Sarah Jenkins\"\n                        className=\"h-9 text-xs\"\n                      />\n                    </div>\n\n                    <div className=\"grid grid-cols-1 gap-2.5 sm:grid-cols-2\">\n                      <div className=\"space-y-1.5\">\n                        <label htmlFor=\"sched-patient-phone-react\" className=\"text-foreground text-xs font-medium\">\n                          Phone Number <span className=\"text-destructive\">*</span>\n                        </label>\n                        <Input\n                          id=\"sched-patient-phone-react\"\n                          value={patientPhone}\n                          onChange={(e) => setPatientPhone(e.target.value)}\n                          placeholder=\"+1 (555) 382-9104\"\n                          className=\"h-9 text-xs tabular-nums\"\n                        />\n                      </div>\n\n                      <div className=\"space-y-1.5\">\n                        <label htmlFor=\"sched-insurance-react\" className=\"text-foreground text-xs font-medium\">\n                          Insurance Policy #\n                        </label>\n                        <Input\n                          id=\"sched-insurance-react\"\n                          value={insurancePolicy}\n                          onChange={(e) => setInsurancePolicy(e.target.value)}\n                          placeholder=\"BCBS-90481240\"\n                          className=\"h-9 font-mono text-xs uppercase\"\n                        />\n                      </div>\n                    </div>\n\n                    <div className=\"space-y-1.5\">\n                      <label htmlFor=\"sched-notes-react\" className=\"text-foreground text-xs font-medium\">\n                        Clinical Symptoms / Notes\n                      </label>\n                      <Textarea\n                        id=\"sched-notes-react\"\n                        value={notes}\n                        onValueChange={(v) => setNotes(v)}\n                        rows={2}\n                        placeholder=\"Briefly describe your symptoms or current medications...\"\n                        className=\"text-xs leading-relaxed\"\n                      />\n                    </div>\n                  </div>\n                </CardContent>\n\n                <CardFooter className=\"border-border/60 bg-muted/10 flex flex-col gap-3 border-t p-5 pt-0\">\n                  <Button className=\"h-11 w-full rounded-xl text-sm font-semibold shadow-xs\" onClick={handleBook}>\n                    <CalendarCheck className=\"mr-2 size-4 shrink-0\" />\n                    <span>Confirm & Book Appointment</span>\n                  </Button>\n\n                  <div className=\"text-muted-foreground flex items-center justify-center gap-1.5 text-xs\">\n                    <Lock className=\"text-success size-3 shrink-0\" />\n                    <span>256-bit encrypted · HIPAA compliant · Free cancellation up to 24h</span>\n                  </div>\n                </CardFooter>\n              </Card>\n            ) : (\n              /* State B: Confirmed Appointment Screen */\n              <Card className=\"border-success/30 bg-success/5 overflow-hidden shadow-xs\">\n                <CardHeader className=\"pt-6 pb-3 text-center\">\n                  <div className=\"border-success/30 bg-success/10 text-success ring-success/10 text-success mx-auto mb-2 flex size-12 items-center justify-center rounded-full border ring-4\">\n                    <CheckCircle2 className=\"size-6\" />\n                  </div>\n                  <CardTitle className=\"text-foreground text-lg font-bold\">Appointment Confirmed!</CardTitle>\n                  <CardDescription className=\"text-muted-foreground text-xs\">\n                    Confirmation #{bookingReference} dispatched to {patientPhone}\n                  </CardDescription>\n                </CardHeader>\n\n                <CardContent className=\"space-y-4 p-5\">\n                  <div className=\"border-border bg-card space-y-3 rounded-xl border p-4 text-xs\">\n                    <div className=\"border-border/80 flex items-center justify-between border-b pb-2\">\n                      <span className=\"text-muted-foreground\">Physician</span>\n                      <span className=\"text-foreground font-semibold\">{doctorName}</span>\n                    </div>\n                    <div className=\"border-border/80 flex items-center justify-between border-b pb-2\">\n                      <span className=\"text-muted-foreground\">Date & Time</span>\n                      <span className=\"text-foreground font-semibold tabular-nums\">{selectedSlotFormatted}</span>\n                    </div>\n                    <div className=\"border-border/80 flex items-center justify-between border-b pb-2\">\n                      <span className=\"text-muted-foreground\">Location</span>\n                      <span className=\"text-foreground font-semibold\">{locationText}</span>\n                    </div>\n                    <div className=\"border-border/80 flex items-center justify-between border-b pb-2\">\n                      <span className=\"text-muted-foreground\">Visit Type</span>\n                      <span className=\"text-foreground font-semibold\">{currentReasonObj.label}</span>\n                    </div>\n                    <div className=\"border-border/80 flex items-center justify-between border-b pb-2\">\n                      <span className=\"text-muted-foreground\">Patient</span>\n                      <span className=\"text-foreground font-semibold\">{patientName}</span>\n                    </div>\n                    <div className=\"flex items-center justify-between\">\n                      <span className=\"text-muted-foreground\">Est. Copay Due</span>\n                      <span className=\"text-foreground font-bold tabular-nums\">{currentReasonObj.copay}</span>\n                    </div>\n                  </div>\n\n                  <div className=\"bg-muted/40 border-border/80 text-muted-foreground space-y-1 rounded-xl border p-3 text-xs\">\n                    <p className=\"text-foreground flex items-center gap-1.5 font-medium\">\n                      <Info className=\"text-primary size-3.5 shrink-0\" />\n                      Pre-Appointment Instructions\n                    </p>\n                    <p className=\"leading-relaxed\">\n                      Please arrive 15 minutes early with your photo ID and active insurance card. For telehealth, join\n                      link activates 10 minutes prior to visit.\n                    </p>\n                  </div>\n                </CardContent>\n\n                <CardFooter className=\"flex flex-col gap-2.5 p-5 pt-0\">\n                  <Button\n                    variant=\"outline\"\n                    className=\"border-border h-10 w-full rounded-xl text-xs font-semibold\"\n                    disabled={calendarAdded}\n                    onClick={handleAddToCalendar}\n                  >\n                    {calendarAdded ? (\n                      <Check className=\"text-success mr-1.5 size-3.5\" />\n                    ) : (\n                      <Calendar className=\"mr-1.5 size-3.5\" />\n                    )}\n                    <span>{calendarAdded ? 'Added to Calendar' : 'Add to Google / Apple Calendar'}</span>\n                  </Button>\n\n                  <Button\n                    variant=\"ghost\"\n                    className=\"text-muted-foreground hover:text-foreground h-9 w-full text-xs font-medium\"\n                    onClick={handleReset}\n                  >\n                    <RotateCcw className=\"mr-1.5 size-3\" />\n                    <span>Schedule Another Appointment</span>\n                  </Button>\n                </CardFooter>\n              </Card>\n            )}\n          </div>\n        </div>\n      </div>\n    </div>\n  )\n}\n\nexport default DoctorAppointmentScheduler\n",
      "type": "registry:block",
      "target": "~/components/blocks/DoctorAppointmentScheduler.tsx"
    }
  ],
  "dependencies": [
    "lucide-react"
  ],
  "devDependencies": [],
  "registryDependencies": [
    "https://uipkge.dev/r/react/avatar.json",
    "https://uipkge.dev/r/react/badge.json",
    "https://uipkge.dev/r/react/button.json",
    "https://uipkge.dev/r/react/card.json",
    "https://uipkge.dev/r/react/input.json",
    "https://uipkge.dev/r/react/radio-group.json",
    "https://uipkge.dev/r/react/select.json",
    "https://uipkge.dev/r/react/separator.json",
    "https://uipkge.dev/r/react/textarea.json"
  ],
  "description": "Zocdoc and Epic style specialist doctor appointment booking scheduler: physician profile hero card with rating, clinic address, and insurance badges, interactive visit type selector, reason for visit dropdown, date carousel with daily availability indicators, morning and afternoon time slot picker, live appointment summary readout with copay estimate, patient registration inputs, and booking confirmation flow.",
  "categories": [
    "healthcare",
    "app",
    "clinical",
    "forms"
  ]
}