feat: Introduce course marketing features with dedicated metadata, image generation, and UI in both studio and experience apps.
This commit is contained in:
@@ -0,0 +1,174 @@
|
||||
"use client";
|
||||
|
||||
import React from "react";
|
||||
import { Course, getImageUrl } from "@/lib/api";
|
||||
import {
|
||||
Target,
|
||||
Zap,
|
||||
Clock,
|
||||
Award,
|
||||
CheckCircle2,
|
||||
Info,
|
||||
Calendar,
|
||||
Users
|
||||
} from "lucide-react";
|
||||
|
||||
interface AboutCourseProps {
|
||||
course: Course;
|
||||
instructors: any[];
|
||||
}
|
||||
|
||||
export default function AboutCourse({ course, instructors }: AboutCourseProps) {
|
||||
const meta = course.marketing_metadata || {};
|
||||
|
||||
return (
|
||||
<div className="space-y-24 pb-20 animate-in fade-in duration-1000">
|
||||
|
||||
{/* ── HERO GRID ── */}
|
||||
<div className="grid grid-cols-1 lg:grid-cols-12 gap-12 items-center">
|
||||
<div className="lg:col-span-12">
|
||||
<div className="relative aspect-[21/9] rounded-[3rem] overflow-hidden border border-slate-200 dark:border-white/5 shadow-2xl group">
|
||||
{course.course_image_url ? (
|
||||
<img
|
||||
src={getImageUrl(course.course_image_url)}
|
||||
alt={course.title}
|
||||
className="w-full h-full object-cover group-hover:scale-105 transition-transform duration-[4s]"
|
||||
/>
|
||||
) : (
|
||||
<div className="absolute inset-0 bg-gradient-to-br from-blue-600 to-indigo-900 flex items-center justify-center">
|
||||
<h1 className="text-4xl font-black text-white/20 uppercase tracking-[0.5em]">{course.title}</h1>
|
||||
</div>
|
||||
)}
|
||||
<div className="absolute inset-0 bg-gradient-to-t from-black/80 via-black/20 to-transparent" />
|
||||
<div className="absolute bottom-12 left-12 right-12">
|
||||
<div className="flex items-center gap-4 mb-4">
|
||||
<span className="px-4 py-1.5 bg-blue-600/20 backdrop-blur-md border border-blue-500/30 text-blue-400 rounded-full text-[10px] font-black uppercase tracking-widest shadow-xl shadow-blue-500/20">
|
||||
Official Curriculum
|
||||
</span>
|
||||
{course.pacing_mode && (
|
||||
<span className="px-4 py-1.5 bg-white/10 backdrop-blur-md border border-white/10 text-white rounded-full text-[10px] font-black uppercase tracking-widest">
|
||||
{course.pacing_mode.replace("_", " ")}
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
<h1 className="text-5xl lg:text-7xl font-black text-white tracking-tighter drop-shadow-2xl">{course.title}</h1>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* ── MANIFESTO GRID ── */}
|
||||
<div className="grid grid-cols-1 lg:grid-cols-3 gap-16">
|
||||
|
||||
{/* Right: Core Meta */}
|
||||
<div className="lg:col-span-1 space-y-12">
|
||||
<div className="glass-premium p-10 rounded-[2.5rem] border-white/5 space-y-8 shadow-xl">
|
||||
<div className="space-y-2">
|
||||
<span className="text-[10px] font-black uppercase tracking-[0.3em] text-blue-500">Key Information</span>
|
||||
<div className="flex flex-col gap-6 pt-4">
|
||||
<div className="flex items-center gap-4">
|
||||
<div className="w-12 h-12 rounded-2xl bg-blue-500/10 flex items-center justify-center text-blue-500 border border-blue-500/20">
|
||||
<Clock size={20} />
|
||||
</div>
|
||||
<div>
|
||||
<p className="text-[10px] font-black uppercase tracking-widest text-slate-500 dark:text-gray-500">Duration</p>
|
||||
<p className="text-sm font-black text-slate-900 dark:text-white">{meta.duration || "Self-paced immersion"}</p>
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex items-center gap-4">
|
||||
<div className="w-12 h-12 rounded-2xl bg-indigo-500/10 flex items-center justify-center text-indigo-500 border border-indigo-500/20">
|
||||
<Award size={20} />
|
||||
</div>
|
||||
<div>
|
||||
<p className="text-[10px] font-black uppercase tracking-widest text-slate-500 dark:text-gray-500">Certification</p>
|
||||
<p className="text-sm font-black text-slate-900 dark:text-white uppercase tracking-tight">{meta.certification_info || "Accredited Certificate"}</p>
|
||||
</div>
|
||||
</div>
|
||||
<div className="flex items-center gap-4">
|
||||
<div className="w-12 h-12 rounded-2xl bg-amber-500/10 flex items-center justify-center text-amber-500 border border-amber-500/20">
|
||||
<Zap size={20} />
|
||||
</div>
|
||||
<div>
|
||||
<p className="text-[10px] font-black uppercase tracking-widest text-slate-500 dark:text-gray-500">Passing Grade</p>
|
||||
<p className="text-sm font-black text-slate-900 dark:text-white">{course.passing_percentage}% Proficiency</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="space-y-6">
|
||||
<h4 className="text-[10px] font-black uppercase tracking-[0.4em] text-slate-400 dark:text-gray-500 flex items-center gap-3">
|
||||
<Users size={16} /> Course Faculty
|
||||
</h4>
|
||||
<div className="space-y-4">
|
||||
{instructors.map((inst) => (
|
||||
<div key={inst.id} className="flex items-center gap-5 p-5 glass-premium rounded-[1.5rem] border-white/5 hover:bg-white/10 transition-all group">
|
||||
<div className="w-14 h-14 rounded-[1.25rem] bg-gradient-to-br from-blue-600 to-indigo-700 flex items-center justify-center text-white text-xl font-black shadow-lg shadow-blue-500/20 group-hover:scale-110 transition-transform">
|
||||
{inst.full_name?.charAt(0) || inst.email?.charAt(0)}
|
||||
</div>
|
||||
<div>
|
||||
<h5 className="font-black text-slate-900 dark:text-white tracking-tight">{inst.full_name}</h5>
|
||||
<p className="text-[10px] font-black uppercase tracking-widest text-blue-500 mt-1">{inst.role || "Instructor"}</p>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Left: Objectives & Manifesto */}
|
||||
<div className="lg:col-span-2 space-y-16">
|
||||
<section className="space-y-8">
|
||||
<div className="space-y-3">
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="w-10 h-10 rounded-xl bg-blue-600 text-white flex items-center justify-center shadow-lg shadow-blue-600/30">
|
||||
<Target size={20} />
|
||||
</div>
|
||||
<h3 className="text-2xl font-black uppercase tracking-tighter text-slate-900 dark:text-white">Learning Objectives</h3>
|
||||
</div>
|
||||
<div className="prose dark:prose-invert max-w-none">
|
||||
<p className="text-lg leading-relaxed text-slate-600 dark:text-gray-400 font-medium italic">
|
||||
{meta.objectives || "Comprehensive learning path designed to master core concepts and advanced applications."}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="grid grid-cols-1 md:grid-cols-2 gap-8 pt-8">
|
||||
<div className="p-8 bg-slate-50 dark:bg-white/5 rounded-[2rem] border border-slate-100 dark:border-white/5 space-y-4">
|
||||
<h4 className="text-[10px] font-black uppercase tracking-[0.3em] text-amber-500 flex items-center gap-2">
|
||||
<Zap size={14} /> Prerequisites
|
||||
</h4>
|
||||
<p className="text-sm font-bold text-slate-700 dark:text-gray-300 leading-relaxed">
|
||||
{meta.requirements || "No specific prerequisites required. An open mind and dedication to learning are the only things needed to succeed."}
|
||||
</p>
|
||||
</div>
|
||||
<div className="p-8 bg-indigo-50/50 dark:bg-indigo-500/5 rounded-[2rem] border border-indigo-100/50 dark:border-indigo-500/10 space-y-4">
|
||||
<h4 className="text-[10px] font-black uppercase tracking-[0.3em] text-indigo-500 flex items-center gap-2">
|
||||
<Info size={14} /> Curriculum Insight
|
||||
</h4>
|
||||
<p className="text-sm font-bold text-indigo-900/60 dark:text-indigo-400/60 leading-relaxed">
|
||||
Each module is structured to provide both theoretical knowledge and practical applications in real-world scenarios.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section className="space-y-8 border-t border-slate-100 dark:border-white/5 pt-16">
|
||||
<div className="flex items-center gap-3">
|
||||
<div className="w-10 h-10 rounded-xl bg-indigo-600 text-white flex items-center justify-center shadow-lg shadow-indigo-600/30">
|
||||
<CheckCircle2 size={20} />
|
||||
</div>
|
||||
<h3 className="text-2xl font-black uppercase tracking-tighter text-slate-900 dark:text-white">The Modules Deep-Dive</h3>
|
||||
</div>
|
||||
<div className="p-10 glass-premium rounded-[2.5rem] border-white/5 bg-gradient-to-br from-white/5 to-transparent">
|
||||
<p className="text-lg leading-relaxed text-slate-600 dark:text-gray-400 font-medium">
|
||||
{meta.modules_summary || "Explore the rich content structured across multiple interactive modules. Each section builds upon the previous one to ensure a cohesive learning experience."}
|
||||
</p>
|
||||
</div>
|
||||
</section>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user