tebyan-medical-backend / frontend /components /recommendations-section.tsx
رغد
feat: complete platform — auth, deployment, hardening
344e369
raw
history blame
8.26 kB
"use client"
import { motion } from "framer-motion"
import type { AnalysisResult } from "@/app/page"
interface RecommendationsSectionProps {
result: AnalysisResult | null
}
const categoryIcons = [
<svg key="0" className="w-6 h-6" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth="1.5">
<path strokeLinecap="round" strokeLinejoin="round" d="M12 8.25v-1.5m0 1.5c-1.355 0-2.697.056-4.024.166C6.845 8.51 6 9.473 6 10.608v2.513m6-4.87c1.355 0 2.697.055 4.024.165C17.155 8.51 18 9.473 18 10.608v2.513m-3-4.87v-1.5m-6 1.5v-1.5m12 9.75l-1.5.75a3.354 3.354 0 01-3 0 3.354 3.354 0 00-3 0 3.354 3.354 0 01-3 0 3.354 3.354 0 00-3 0 3.354 3.354 0 01-3 0L3 16.5m15-3.38a48.474 48.474 0 00-6-.37c-2.032 0-4.034.125-6 .37m12 0c.39.049.777.102 1.163.16 1.07.16 1.837 1.094 1.837 2.175v5.17c0 .62-.504 1.124-1.125 1.124H4.125A1.125 1.125 0 013 20.625v-5.17c0-1.08.768-2.014 1.837-2.174A47.78 47.78 0 016 13.12M12.265 3.11a.375.375 0 11-.53 0L12 2.845l.265.265zm-3 0a.375.375 0 11-.53 0L9 2.845l.265.265zm6 0a.375.375 0 11-.53 0L15 2.845l.265.265z" />
</svg>,
<svg key="1" className="w-6 h-6" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth="1.5">
<path strokeLinecap="round" strokeLinejoin="round" d="M15.59 14.37a6 6 0 01-5.84 7.38v-4.8m5.84-2.58a14.98 14.98 0 006.16-12.12A14.98 14.98 0 009.631 8.41m5.96 5.96a14.926 14.926 0 01-5.841 2.58m-.119-8.54a6 6 0 00-7.381 5.84h4.8m2.581-5.84a14.927 14.927 0 00-2.58 5.84m2.699 2.7c-.103.021-.207.041-.311.06a15.09 15.09 0 01-2.448-2.448 14.9 14.9 0 01.06-.312m-2.24 2.39a4.493 4.493 0 00-1.757 4.306 4.493 4.493 0 004.306-1.758M16.5 9a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0z" />
</svg>,
<svg key="2" className="w-6 h-6" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth="1.5">
<path strokeLinecap="round" strokeLinejoin="round" d="M21.752 15.002A9.718 9.718 0 0118 15.75c-5.385 0-9.75-4.365-9.75-9.75 0-1.33.266-2.597.748-3.752A9.753 9.753 0 003 11.25C3 16.635 7.365 21 12.75 21a9.753 9.753 0 009.002-5.998z" />
</svg>,
<svg key="3" className="w-6 h-6" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth="1.5">
<path strokeLinecap="round" strokeLinejoin="round" d="M15.362 5.214A8.252 8.252 0 0112 21 8.25 8.25 0 016.038 7.048 8.287 8.287 0 009 9.6a8.983 8.983 0 013.361-6.867 8.21 8.21 0 003 2.48z" />
<path strokeLinecap="round" strokeLinejoin="round" d="M12 18a3.75 3.75 0 00.495-7.467 5.99 5.99 0 00-1.925 3.546 5.974 5.974 0 01-2.133-1A3.75 3.75 0 0012 18z" />
</svg>,
]
const cardColors = ["gradient-primary", "gradient-secondary", "bg-accent", "bg-primary/80"]
export function RecommendationsSection({ result }: RecommendationsSectionProps) {
if (!result) return null
const groups = result.report?.tips_categorized ?? []
if (groups.length === 0) return null
return (
<motion.section
initial={{ opacity: 0, y: 40 }}
animate={{ opacity: 1, y: 0 }}
transition={{ duration: 0.7, delay: 0.1 }}
className="py-24 relative bg-muted/30"
>
{/* Background */}
<div className="absolute inset-0 overflow-hidden">
<motion.div
animate={{ scale: [1, 1.1, 1], rotate: [0, 5, 0] }}
transition={{ duration: 30, repeat: Infinity, ease: "easeInOut" }}
className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 w-[1000px] h-[1000px] rounded-full bg-gradient-to-br from-primary/5 to-secondary/5 blur-3xl"
/>
</div>
<div className="container mx-auto px-6 relative z-10">
{/* Section Header */}
<motion.div
initial={{ opacity: 0, y: 30 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.8 }}
className="text-center mb-16"
>
<span className="inline-block px-4 py-2 rounded-full glass text-sm text-muted-foreground mb-4">
نصائح مخصصة لك
</span>
<h2 className="text-3xl md:text-4xl font-bold text-foreground mb-4 text-balance">
توصيات لتحسين صحتك
</h2>
<p className="text-lg text-muted-foreground max-w-2xl mx-auto text-pretty">
بناءً على نتائج تحليلك، إليك مجموعة من النصائح والتوصيات لتحسين صحتك العامة
</p>
</motion.div>
{/* Recommendations Grid */}
<div className="grid md:grid-cols-2 gap-8">
{groups.map((group, index) => (
<motion.div
key={index}
initial={{ opacity: 0, y: 30 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.6, delay: index * 0.15 }}
className="glass-strong rounded-3xl p-8 shadow-soft hover:shadow-glow-primary transition-all duration-500"
>
{/* Header */}
<div className="flex items-center gap-4 mb-6">
<div className={`w-14 h-14 rounded-2xl ${cardColors[index % cardColors.length]} flex items-center justify-center text-primary-foreground`}>
{categoryIcons[index % categoryIcons.length]}
</div>
<h3 className="text-xl font-bold text-foreground">
{group.category}
</h3>
</div>
{/* Checklist */}
<ul className="space-y-4">
{group.tips.map((tip, i) => (
<motion.li
key={i}
initial={{ opacity: 0, x: -20 }}
whileInView={{ opacity: 1, x: 0 }}
viewport={{ once: true }}
transition={{ delay: index * 0.1 + i * 0.1 }}
className="flex items-start gap-3 group cursor-pointer"
>
<div className="w-6 h-6 rounded-lg border-2 border-border flex items-center justify-center shrink-0 mt-0.5 group-hover:border-primary group-hover:bg-primary/10 transition-all duration-300">
<motion.svg
initial={{ scale: 0 }}
whileHover={{ scale: 1 }}
className="w-4 h-4 text-primary-foreground"
fill="none"
viewBox="0 0 24 24"
stroke="currentColor"
strokeWidth="2"
>
<path strokeLinecap="round" strokeLinejoin="round" d="M4.5 12.75l6 6 9-13.5" />
</motion.svg>
</div>
<span className="text-muted-foreground group-hover:text-foreground transition-colors leading-relaxed">
{tip}
</span>
</motion.li>
))}
</ul>
</motion.div>
))}
</div>
{/* CTA */}
<motion.div
initial={{ opacity: 0, y: 30 }}
whileInView={{ opacity: 1, y: 0 }}
viewport={{ once: true }}
transition={{ duration: 0.8, delay: 0.4 }}
className="text-center mt-12"
>
<p className="text-muted-foreground mb-6">
هذه التوصيات مبنية على نتائج تحليلك وليست بديلاً عن استشارة الطبيب المختص
</p>
<motion.a
href="#"
whileHover={{ scale: 1.05 }}
whileTap={{ scale: 0.95 }}
className="inline-flex items-center gap-2 px-8 py-4 rounded-2xl glass text-foreground font-semibold hover:bg-card/80 transition-all duration-300"
>
<svg className="w-5 h-5" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth="2">
<path strokeLinecap="round" strokeLinejoin="round" d="M6.75 3v2.25M17.25 3v2.25M3 18.75V7.5a2.25 2.25 0 012.25-2.25h13.5A2.25 2.25 0 0121 7.5v11.25m-18 0A2.25 2.25 0 005.25 21h13.5A2.25 2.25 0 0021 18.75m-18 0v-7.5A2.25 2.25 0 015.25 9h13.5A2.25 2.25 0 0121 11.25v7.5" />
</svg>
<span>احجز موعداً مع طبيب</span>
</motion.a>
</motion.div>
</div>
</motion.section>
)
}