| import React, { useState } from 'react'; |
| import { User, Calendar, Stethoscope, AlertTriangle, Save, ChevronRight, ArrowLeft } from 'lucide-react'; |
| import { sessionStore } from '../store/sessionStore'; |
| import { savePatientRecord } from '../store/patientIdStore'; |
|
|
| interface PatientHistoryFormProps { |
| onContinue: () => void; |
| onBack: () => void; |
| patientID?: string | undefined; |
| autoGeneratedPatientId?: string | undefined; |
| } |
| export function PatientHistoryForm({ |
| onContinue, |
| onBack, |
| patientID, |
| autoGeneratedPatientId |
| }: PatientHistoryFormProps) { |
| const [formData, setFormData] = useState({ |
| |
| name: '', |
| age: '', |
| bloodGroup: '', |
| parity: '', |
| pregnancyStatus: '', |
| gestationalAgeWeeks: '', |
| monthsSinceLastDelivery: '', |
| monthsSinceAbortion: '', |
| menstrualStatus: '', |
| sexualHistory: '', |
| hpvStatus: '', |
| hpvVaccination: '', |
| patientProfileNotes: '', |
| |
| postCoitalBleeding: false, |
| interMenstrualBleeding: false, |
| persistentDischarge: false, |
| symptomsNotes: '', |
| |
| papSmearResult: '', |
| hpvDnaTypes: '', |
| pastProcedures: { |
| biopsy: false, |
| leep: false, |
| cryotherapy: false, |
| none: false |
| }, |
| screeningNotes: '', |
| |
| smoking: '', |
| immunosuppression: { |
| hiv: false, |
| steroids: false, |
| none: false |
| }, |
| riskFactorsNotes: '' |
| }); |
| const handleInputChange = (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>) => { |
| const { name, value, type } = e.target as any; |
| |
| |
| if (type === 'checkbox') { |
| const checked = (e.target as HTMLInputElement).checked; |
| setFormData(prev => ({ |
| ...prev, |
| [name]: checked |
| })); |
| } else if (name === 'pregnancyStatus') { |
| setFormData(prev => ({ |
| ...prev, |
| pregnancyStatus: value, |
| gestationalAgeWeeks: value === 'Pregnant' ? prev.gestationalAgeWeeks : '', |
| monthsSinceLastDelivery: value === 'Postpartum' ? prev.monthsSinceLastDelivery : '', |
| monthsSinceAbortion: value === 'Post-abortion' ? prev.monthsSinceAbortion : '' |
| })); |
| } else { |
| |
| setFormData(prev => ({ |
| ...prev, |
| [name]: value |
| })); |
| } |
| }; |
| const handleNestedCheckboxChange = (category: 'pastProcedures' | 'immunosuppression', field: string) => { |
| if (category === 'pastProcedures') { |
| setFormData(prev => ({ |
| ...prev, |
| pastProcedures: { |
| ...prev.pastProcedures, |
| [field]: !prev.pastProcedures[field as keyof typeof prev.pastProcedures] |
| } |
| })); |
| return; |
| } |
|
|
| |
| setFormData(prev => ({ |
| ...prev, |
| immunosuppression: { |
| ...prev.immunosuppression, |
| [field]: !prev.immunosuppression[field as keyof typeof prev.immunosuppression] |
| } |
| })); |
| }; |
| const handleSave = () => { |
| console.log('Saving patient history:', formData); |
| |
| if (autoGeneratedPatientId && formData.name) { |
| const examDate = new Date().toISOString().split('T')[0]; |
| savePatientRecord({ |
| id: autoGeneratedPatientId, |
| name: formData.name, |
| examDate: examDate |
| }); |
| |
| sessionStore.merge({ |
| patientInfo: { |
| id: autoGeneratedPatientId, |
| name: formData.name, |
| examDate: examDate |
| } |
| }); |
| } |
| }; |
| const handleSaveAndContinue = () => { |
| handleSave(); |
| onContinue(); |
| }; |
|
|
| |
| React.useEffect(() => { |
| const session = sessionStore.get(); |
| if (session.patientHistory) { |
| setFormData(prev => ({ |
| ...prev, |
| ...session.patientHistory |
| })); |
| } |
| }, []); |
|
|
| |
| React.useEffect(() => { |
| sessionStore.merge({ patientHistory: formData as any }); |
| |
| }, [JSON.stringify(formData)]); |
| return <div className="w-full max-w-8xl mx-auto p-4 md:p-6 lg:p-10"> |
| <div className="mb-4 md:mb-6 lg:mb-8 flex flex-col md:flex-row md:items-center md:justify-between gap-3 md:gap-0"> |
| <h2 className="text-xl md:text-2xl lg:text-3xl font-bold text-[#0A2540]"> |
| Patient Information & Clinical History |
| </h2> |
| <div className="flex items-center gap-2 text-xs md:text-sm text-gray-500 bg-white px-3 md:px-4 py-2 rounded-lg shadow-sm whitespace-nowrap"> |
| <span>Patient ID:</span> |
| <span className="font-mono font-bold text-[#0A2540]"> |
| {autoGeneratedPatientId || patientID || 'New - unsaved'} |
| </span> |
| </div> |
| </div> |
| |
| <form className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4 md:gap-6 lg:gap-8"> |
| {/* SECTION 1: Patient Profile */} |
| <div className="bg-white rounded-xl shadow-sm border border-gray-100 overflow-hidden flex flex-col h-full"> |
| <div className="bg-blue-50/50 p-3 md:p-4 border-b border-blue-100 flex items-center gap-2 md:gap-3"> |
| <div className="w-8 h-8 md:w-10 md:h-10 rounded-full bg-blue-100 text-blue-600 flex items-center justify-center flex-shrink-0"> |
| <User className="w-4 h-4 md:w-5 md:h-5" /> |
| </div> |
| <h3 className="font-bold text-sm md:text-base text-[#0A2540]">Patient Name</h3> |
| <input type="text" name="name" value={formData.name} onChange={handleInputChange} className="w-full px-3 md:px-4 py-2 md:py-3 text-sm md:text-base bg-gray-50 border border-gray-200 rounded-lg focus:ring-2 focus:ring-[#05998c] focus:border-transparent outline-none transition-all" placeholder="Full name" /> |
| </div> |
| |
| <div className="p-4 md:p-6 lg:p-8 space-y-4 md:space-y-5 lg:space-y-6 flex-1"> |
| <div className="grid grid-cols-3 gap-2 md:gap-3 lg:gap-4"> |
| <div> |
| <label className="block text-xs font-semibold text-gray-500 uppercase mb-1"> |
| Age |
| </label> |
| <input value={formData.age} onChange={handleInputChange} type="number" name="age" className="w-full px-3 md:px-4 py-2 md:py-3 text-sm md:text-base bg-gray-50 border border-gray-200 rounded-lg focus:ring-2 focus:ring-[#4ECDC4] focus:border-transparent outline-none transition-all" placeholder="Yrs" /> |
| </div> |
| |
| <div> |
| <label className="block text-xs font-semibold text-gray-500 uppercase mb-1"> |
| Blood Group |
| </label> |
| <select value={formData.bloodGroup} onChange={handleInputChange} name="bloodGroup" className="w-full px-4 py-3 text-base bg-gray-50 border border-gray-200 rounded-lg focus:ring-2 focus:ring-[#4ECDC4] focus:border-transparent outline-none transition-all"> |
| <option value="">Select</option> |
| <option value="A+">A+</option> |
| <option value="A-">A-</option> |
| <option value="B+">B+</option> |
| <option value="B-">B-</option> |
| <option value="AB+">AB+</option> |
| <option value="AB-">AB-</option> |
| <option value="O+">O+</option> |
| <option value="O-">O-</option> |
| </select> |
| </div> |
| |
| <div> |
| <label className="block text-xs font-semibold text-gray-500 uppercase mb-1"> |
| Parity |
| </label> |
| <input value={formData.parity} onChange={handleInputChange} type="text" name="parity" className="w-full px-4 py-3 text-base bg-gray-50 border border-gray-200 rounded-lg focus:ring-2 focus:ring-[#4ECDC4] focus:border-transparent outline-none transition-all" placeholder="G P A" /> |
| </div> |
| </div> |
| |
| <div> |
| <label className="block text-sm font-semibold text-gray-500 uppercase mb-2">Pregnancy / Recent Pregnancy Status</label> |
| <div className="space-y-2"> |
| {['Pregnant', 'Not pregnant', 'Postpartum', 'Post-abortion', 'Unknown'].map(status => ( |
| <label key={status} className="flex items-center gap-3 p-2 rounded-lg hover:bg-gray-50 cursor-pointer border border-transparent hover:border-gray-100 transition-all"> |
| <input type="radio" name="pregnancyStatus" value={status} checked={formData.pregnancyStatus === status} onChange={handleInputChange} className="w-4 h-4 text-[#4ECDC4] focus:ring-[#4ECDC4]" /> |
| <span className="text-base text-gray-700">{status}</span> |
| </label> |
| ))} |
| </div> |
| |
| {formData.pregnancyStatus === 'Pregnant' && ( |
| <div className="mt-3"> |
| <label className="block text-xs font-semibold text-gray-500 uppercase mb-1">Gestational age (weeks)</label> |
| <input |
| type="number" |
| name="gestationalAgeWeeks" |
| value={formData.gestationalAgeWeeks} |
| onChange={handleInputChange} |
| className="w-full px-3 py-2 bg-gray-50 border border-gray-200 rounded-lg focus:ring-2 focus:ring-[#4ECDC4] focus:border-transparent outline-none transition-all text-sm" |
| placeholder="Enter weeks" |
| /> |
| </div> |
| )} |
| |
| {formData.pregnancyStatus === 'Postpartum' && ( |
| <div className="mt-3"> |
| <label className="block text-xs font-semibold text-gray-500 uppercase mb-1">Months since last delivery</label> |
| <input |
| type="number" |
| name="monthsSinceLastDelivery" |
| value={formData.monthsSinceLastDelivery} |
| onChange={handleInputChange} |
| className="w-full px-3 py-2 bg-gray-50 border border-gray-200 rounded-lg focus:ring-2 focus:ring-[#4ECDC4] focus:border-transparent outline-none transition-all text-sm" |
| placeholder="Enter months" |
| /> |
| </div> |
| )} |
| |
| {formData.pregnancyStatus === 'Post-abortion' && ( |
| <div className="mt-3"> |
| <label className="block text-xs font-semibold text-gray-500 uppercase mb-1">Months since abortion</label> |
| <input |
| type="number" |
| name="monthsSinceAbortion" |
| value={formData.monthsSinceAbortion} |
| onChange={handleInputChange} |
| className="w-full px-3 py-2 bg-gray-50 border border-gray-200 rounded-lg focus:ring-2 focus:ring-[#4ECDC4] focus:border-transparent outline-none transition-all text-sm" |
| placeholder="Enter months" |
| /> |
| </div> |
| )} |
| </div> |
| |
| <div> |
| <label className="block text-sm font-semibold text-gray-500 uppercase mb-2">Menstrual Status</label> |
| <select |
| name="menstrualStatus" |
| value={formData.menstrualStatus} |
| onChange={handleInputChange} |
| className="w-full px-3 py-2 bg-gray-50 border border-gray-200 rounded-lg focus:ring-2 focus:ring-[#4ECDC4] focus:border-transparent outline-none transition-all text-sm" |
| > |
| <option value="">Select</option> |
| <option value="Premenarchal">Premenarchal</option> |
| <option value="Reproductive age">Reproductive age</option> |
| <option value="Currently menstruating">Currently menstruating</option> |
| <option value="Perimenopausal">Perimenopausal</option> |
| <option value="Postmenopausal">Postmenopausal</option> |
| </select> |
| </div> |
| |
| <div className="pt-4 border-t border-gray-100"> |
| <label className="block text-sm font-semibold text-gray-500 uppercase mb-2">Additional Notes</label> |
| <textarea name="patientProfileNotes" value={formData.patientProfileNotes} onChange={handleInputChange} rows={3} className="w-full px-4 py-3 text-base bg-gray-50 border border-gray-200 rounded-lg focus:ring-2 focus:ring-[#4ECDC4] focus:border-transparent outline-none transition-all resize-none" placeholder="Add any additional notes about patient profile..." /> |
| </div> |
| </div> |
| </div> |
| |
| {/* SECTION 2: Presenting Symptoms */} |
| <div className="bg-white rounded-xl shadow-sm border border-gray-100 overflow-hidden flex flex-col h-full"> |
| <div className="bg-indigo-50/50 p-4 border-b border-indigo-100 flex items-center gap-3"> |
| <div className="w-10 h-10 rounded-full bg-indigo-100 text-indigo-600 flex items-center justify-center"> |
| <Calendar className="w-5 h-5" /> |
| </div> |
| <h3 className="font-bold text-[#0A2540]">Presenting Symptoms</h3> |
| </div> |
| |
| <div className="p-8 space-y-4 flex-1"> |
| <div> |
| <label className="block text-sm font-semibold text-gray-500 uppercase mb-2">Sexual History</label> |
| <input |
| type="text" |
| name="sexualHistory" |
| value={formData.sexualHistory} |
| onChange={handleInputChange} |
| className="w-full px-3 py-2 bg-gray-50 border border-gray-200 rounded-lg focus:ring-2 focus:ring-[#4ECDC4] focus:border-transparent outline-none transition-all text-sm" |
| placeholder="e.g. Sexually active, Duration of relationship, etc." |
| /> |
| </div> |
| |
| <div> |
| <label className="block text-sm font-semibold text-gray-500 uppercase mb-2">HPV Status</label> |
| <div className="flex flex-wrap gap-2"> |
| {['Positive', 'Negative', 'Unknown'].map(status => ( |
| <label key={status} className="flex-1 min-w-[80px] text-center cursor-pointer"> |
| <input type="radio" name="hpvStatus" value={status} checked={formData.hpvStatus === status} onChange={handleInputChange} className="peer sr-only" /> |
| <div className="px-3 py-1.5 rounded-md text-sm font-medium bg-gray-50 text-gray-600 border border-gray-200 peer-checked:bg-[#0A2540] peer-checked:text-white peer-checked:border-[#0A2540] transition-all"> |
| {status} |
| </div> |
| </label> |
| ))} |
| </div> |
| </div> |
| |
| <div> |
| <label className="block text-sm font-semibold text-gray-500 uppercase mb-2">HPV Vaccination</label> |
| <div className="flex gap-4"> |
| {['Yes', 'No', 'Unknown'].map(opt => ( |
| <label key={opt} className="flex items-center gap-2 cursor-pointer"> |
| <input type="radio" name="hpvVaccination" value={opt} checked={formData.hpvVaccination === opt} onChange={handleInputChange} className="w-4 h-4 text-[#4ECDC4] focus:ring-[#4ECDC4]" /> |
| <span className="text-base text-gray-700">{opt}</span> |
| </label> |
| ))} |
| </div> |
| </div> |
| |
| <label className="flex items-start gap-3 p-4 rounded-lg border border-gray-100 hover:border-[#4ECDC4]/50 hover:bg-teal-50/10 cursor-pointer transition-all"> |
| <div className="flex items-center h-5"> |
| <input |
| type="checkbox" |
| name="postCoitalBleeding" |
| checked={formData.postCoitalBleeding} |
| onChange={handleInputChange} |
| className="w-5 h-5 rounded text-[#4ECDC4] focus:ring-[#4ECDC4] border-gray-300" /> |
| </div> |
| <div> |
| <span className="block text-base font-medium text-gray-900"> |
| Post-coital bleeding |
| </span> |
| <span className="block text-sm text-gray-500 mt-0.5"> |
| Bleeding after intercourse |
| </span> |
| </div> |
| </label> |
| |
| <label className="flex items-start gap-3 p-4 rounded-lg border border-gray-100 hover:border-[#4ECDC4]/50 hover:bg-teal-50/10 cursor-pointer transition-all"> |
| <div className="flex items-center h-5"> |
| <input |
| type="checkbox" |
| name="interMenstrualBleeding" |
| checked={formData.interMenstrualBleeding} |
| onChange={handleInputChange} |
| className="w-5 h-5 rounded text-[#4ECDC4] focus:ring-[#4ECDC4] border-gray-300" /> |
| </div> |
| <div> |
| <span className="block text-base font-medium text-gray-900"> |
| Inter-menstrual / Post-menopausal |
| </span> |
| <span className="block text-sm text-gray-500 mt-0.5"> |
| Irregular bleeding patterns |
| </span> |
| </div> |
| </label> |
| |
| <label className="flex items-start gap-3 p-3 rounded-lg border border-gray-100 hover:border-[#4ECDC4]/50 hover:bg-teal-50/10 cursor-pointer transition-all"> |
| <div className="flex items-center h-5"> |
| <input |
| type="checkbox" |
| name="persistentDischarge" |
| checked={formData.persistentDischarge} |
| onChange={handleInputChange} |
| className="w-5 h-5 rounded text-[#4ECDC4] focus:ring-[#4ECDC4] border-gray-300" /> |
| </div> |
| <div> |
| <span className="block text-sm font-medium text-gray-900"> |
| Persistent discharge |
| </span> |
| <span className="block text-xs text-gray-500 mt-0.5"> |
| Unusual color or odor |
| </span> |
| </div> |
| </label> |
| |
| <div className="pt-4 border-t border-gray-100"> |
| <label className="block text-xs font-semibold text-gray-500 uppercase mb-2"> |
| Additional Notes |
| </label> |
| <textarea name="symptomsNotes" value={formData.symptomsNotes} onChange={handleInputChange} rows={3} className="w-full px-3 py-2 bg-gray-50 border border-gray-200 rounded-lg focus:ring-2 focus:ring-[#4ECDC4] focus:border-transparent outline-none transition-all resize-none text-sm" placeholder="Add any additional notes about symptoms..." /> |
| </div> |
| </div> |
| </div> |
| |
| {/* SECTION 3: Screening History */} |
| <div className="bg-white rounded-xl shadow-sm border border-gray-100 overflow-hidden flex flex-col h-full"> |
| <div className="bg-teal-50/50 p-4 border-b border-teal-100 flex items-center gap-3"> |
| <div className="w-10 h-10 rounded-full bg-teal-100 text-teal-700 flex items-center justify-center"> |
| <Stethoscope className="w-5 h-5" /> |
| </div> |
| <h3 className="font-bold text-[#0A2540]">Screening History</h3> |
| </div> |
| |
| <div className="p-8 space-y-6 flex-1"> |
| <div> |
| <label className="block text-xs font-semibold text-gray-500 uppercase mb-2">Pap Smear Result</label> |
| <div className="space-y-2"> |
| {['ASC-US', 'LSIL', 'HSIL', 'Normal', 'Not Done'].map(result => ( |
| <label key={result} className="flex items-center justify-between p-2 rounded-lg hover:bg-gray-50 cursor-pointer border border-transparent hover:border-gray-100 transition-all group"> |
| <span className="text-sm text-gray-700 group-hover:text-[#0A2540]">{result}</span> |
| <input type="radio" name="papSmearResult" value={result} checked={formData.papSmearResult === result} onChange={handleInputChange} className="w-4 h-4 text-[#4ECDC4] focus:ring-[#4ECDC4]" /> |
| </label> |
| ))} |
| </div> |
| </div> |
| |
| <div> |
| <label className="block text-xs font-semibold text-gray-500 uppercase mb-1">HPV DNA (High-risk)</label> |
| <input type="text" name="hpvDnaTypes" value={formData.hpvDnaTypes} onChange={handleInputChange} className="w-full px-3 py-2 bg-gray-50 border border-gray-200 rounded-lg focus:ring-2 focus:ring-[#4ECDC4] focus:border-transparent outline-none transition-all" placeholder="e.g. Type 16, 18" /> |
| </div> |
| |
| <div> |
| <label className="block text-xs font-semibold text-gray-500 uppercase mb-2"> |
| Past Procedures |
| </label> |
| <div className="grid grid-cols-2 gap-2"> |
| {['Biopsy', 'LEEP', 'Cryotherapy', 'None'].map(proc => <label key={proc} className="flex items-center gap-2 cursor-pointer"> |
| <input type="checkbox" checked={formData.pastProcedures[proc.toLowerCase() as keyof typeof formData.pastProcedures]} onChange={() => handleNestedCheckboxChange('pastProcedures', proc.toLowerCase())} className="w-4 h-4 rounded text-[#4ECDC4] focus:ring-[#4ECDC4] border-gray-300" /> |
| <span className="text-sm text-gray-700">{proc}</span> |
| </label>)} |
| </div> |
| </div> |
| |
| <div className="pt-4 border-t border-gray-100"> |
| <label className="block text-xs font-semibold text-gray-500 uppercase mb-2"> |
| Additional Notes |
| </label> |
| <textarea name="screeningNotes" value={formData.screeningNotes} onChange={handleInputChange} rows={3} className="w-full px-3 py-2 bg-gray-50 border border-gray-200 rounded-lg focus:ring-2 focus:ring-[#4ECDC4] focus:border-transparent outline-none transition-all resize-none text-sm" placeholder="Add any additional notes about screening history..." /> |
| </div> |
| </div> |
| </div> |
| |
| {/* SECTION 4: Risk Factors */} |
| <div className="bg-white rounded-xl shadow-sm border border-gray-100 overflow-hidden flex flex-col h-full"> |
| <div className="bg-rose-50/50 p-4 border-b border-rose-100 flex items-center gap-3"> |
| <div className="w-10 h-10 rounded-full bg-rose-100 text-rose-600 flex items-center justify-center"> |
| <AlertTriangle className="w-5 h-5" /> |
| </div> |
| <h3 className="font-bold text-[#0A2540]">Risk Factors</h3> |
| </div> |
| |
| <div className="p-8 space-y-6 flex-1"> |
| <div> |
| <label className="block text-xs font-semibold text-gray-500 uppercase mb-3">Smoking History</label> |
| <div className="flex gap-2"> |
| <label className="flex-1 cursor-pointer"> |
| <input type="radio" name="smoking" value="Yes" checked={formData.smoking === 'Yes'} onChange={handleInputChange} className="peer sr-only" /> |
| <div className="flex items-center justify-center gap-2 px-4 py-3 rounded-lg border border-gray-200 text-gray-600 hover:bg-gray-50 peer-checked:bg-rose-50 peer-checked:border-rose-200 peer-checked:text-rose-700 transition-all"> |
| <span className="font-medium">Yes</span> |
| </div> |
| </label> |
| <label className="flex-1 cursor-pointer"> |
| <input type="radio" name="smoking" value="No" checked={formData.smoking === 'No'} onChange={handleInputChange} className="peer sr-only" /> |
| <div className="flex items-center justify-center gap-2 px-4 py-3 rounded-lg border border-gray-200 text-gray-600 hover:bg-gray-50 peer-checked:bg-green-50 peer-checked:border-green-200 peer-checked:text-green-700 transition-all"> |
| <span className="font-medium">No</span> |
| </div> |
| </label> |
| </div> |
| </div> |
| |
| <div> |
| <label className="block text-xs font-semibold text-gray-500 uppercase mb-3"> |
| Immunosuppression |
| </label> |
| <div className="space-y-3"> |
| <label className="flex items-center p-3 rounded-lg border border-gray-200 hover:border-gray-300 cursor-pointer transition-all bg-gray-50/50"> |
| <input type="checkbox" checked={formData.immunosuppression.hiv} onChange={() => handleNestedCheckboxChange('immunosuppression', 'hiv')} className="w-5 h-5 rounded text-[#4ECDC4] focus:ring-[#4ECDC4] border-gray-300" /> |
| <span className="ml-3 text-sm font-medium text-gray-700"> |
| HIV Positive |
| </span> |
| </label> |
| |
| <label className="flex items-center p-3 rounded-lg border border-gray-200 hover:border-gray-300 cursor-pointer transition-all bg-gray-50/50"> |
| <input type="checkbox" checked={formData.immunosuppression.steroids} onChange={() => handleNestedCheckboxChange('immunosuppression', 'steroids')} className="w-5 h-5 rounded text-[#4ECDC4] focus:ring-[#4ECDC4] border-gray-300" /> |
| <span className="ml-3 text-sm font-medium text-gray-700"> |
| Chronic Steroid Use |
| </span> |
| </label> |
| |
| <label className="flex items-center p-3 rounded-lg border border-gray-200 hover:border-gray-300 cursor-pointer transition-all bg-gray-50/50"> |
| <input type="checkbox" checked={formData.immunosuppression.none} onChange={() => handleNestedCheckboxChange('immunosuppression', 'none')} className="w-5 h-5 rounded text-[#4ECDC4] focus:ring-[#4ECDC4] border-gray-300" /> |
| <span className="ml-3 text-sm font-medium text-gray-700"> |
| None known |
| </span> |
| </label> |
| </div> |
| </div> |
| |
| <div className="pt-4 border-t border-gray-100"> |
| <label className="block text-xs font-semibold text-gray-500 uppercase mb-2"> |
| Additional Notes |
| </label> |
| <textarea name="riskFactorsNotes" value={formData.riskFactorsNotes} onChange={handleInputChange} rows={3} className="w-full px-3 py-2 bg-gray-50 border border-gray-200 rounded-lg focus:ring-2 focus:ring-[#4ECDC4] focus:border-transparent outline-none transition-all resize-none text-sm" placeholder="Add any additional notes about risk factors..." /> |
| </div> |
| </div> |
| </div> |
| </form> |
| |
| <div className="mt-6 md:mt-8 flex flex-col md:flex-row md:justify-between gap-3 md:gap-4"> |
| <button onClick={onBack} className="px-4 md:px-6 py-2 md:py-3 rounded-xl text-gray-600 font-medium hover:bg-gray-100 transition-colors text-sm md:text-base flex items-center justify-center md:justify-start gap-2"> |
| <ArrowLeft className="w-4 h-4 md:w-5 md:h-5" /> |
| <span className="hidden md:inline">Back to Registry</span> |
| <span className="inline md:hidden">Back</span> |
| </button> |
| |
| <div className="flex flex-col md:flex-row gap-3 md:gap-4"> |
| <button onClick={handleSave} className="px-4 md:px-6 py-2 md:py-3 rounded-xl text-gray-600 font-medium hover:bg-gray-100 transition-colors text-sm md:text-base"> |
| Save Draft |
| </button> |
| |
| <button onClick={handleSaveAndContinue} className="px-6 md:px-8 py-2 md:py-3 rounded-xl bg-[#05998c] text-white font-bold shadow-lg shadow-teal-500/20 hover:bg-[#047569] hover:shadow-teal-500/30 transition-all flex items-center justify-center gap-2 text-sm md:text-base"> |
| <Save className="w-4 h-4 md:w-5 md:h-5" /> |
| Save & Continue |
| <ChevronRight className="w-4 h-4 md:w-5 md:h-5" /> |
| </button> |
| </div> |
| </div> |
| </div>; |
| } |