// ================================================================
// "سعد الشعلاني" — نسخة WordPress (SPA) عبر React UMD + Tailwind CDN
// الصفحات عبر Hash Router: #/ , #/songs , #/consulting , #/social , #/cinema , #/workshop
// ================================================================
function cn(...classes){ return classes.filter(Boolean).join(" "); }
const EMAIL_TO = "saadalshalani@gmail.com";
const WHATSAPP_NUMBER_RAW = "0096599718278";
const X_URL = "https://x.com/saadalshalani";
const BRAND = "سعد الشعلاني";
const PHONE_E164 = "+96599718278";
const TEL_LINK = `tel:${PHONE_E164}`;
function getRoute(){ const h = window.location.hash; if(!h || h==="#" || h==="#/") return "/"; return h.startsWith("#")?h.slice(1):h; }
function currentRouteId(){ const r=getRoute(); return r.startsWith("/")?r.slice(1):r; }
const buildAnchorUrl=(id)=>{ const base=location.href.split("#")[0]; const hash=location.hash||""; return `${base}${hash}${hash.includes(`#${id}`)?"":`#${id}`}`; };
function validateContact({phone,email,message}){
const errors=[];
if(!phone && !email) errors.push("يرجى إدخال الهاتف أو الإيميل على الأقل.");
if(!String(message).trim()) errors.push("يرجى كتابة تفاصيل الطلب.");
return { ok: errors.length===0, errors };
}
function buildWhatsAppLink(raw){ let d=String(raw).replace(/\D/g,""); if(d.startsWith("00")) d=d.slice(2); return `https://wa.me/${d}`; }
const WHATSAPP_LINK = buildWhatsAppLink(WHATSAPP_NUMBER_RAW);
function makeFallbackBanner(text){
const svg = `
`;
return "data:image/svg+xml;utf8,"+encodeURIComponent(svg);
}
// Icons
const Svg = ({children,...p}) => ();
const IconSparkles=(p)=>();
const IconMusic=(p)=>();
const IconMessage=(p)=>();
const IconShare=(p)=>();
const IconFilm=(p)=>();
const IconPhone=(p)=>();
const IconSend=(p)=>();
const IconCheck=(p)=>();
const IconMail=(p)=>();
const IconTwitter=(p)=>();
const IconMoon=(p)=>();
const IconSun=(p)=>();
const ThemeContext = React.createContext({ isDark:false, toggleTheme:()=>{} });
const useTheme=()=>React.useContext(ThemeContext);
function Button({variant="default", size="md", className, children, ...props}){
const { isDark }=useTheme();
const base="inline-flex items-center justify-center font-medium transition-colors focus:outline-none disabled:opacity-50 disabled:pointer-events-none rounded-2xl select-none active:scale-[.99]";
const sizes={ sm:"min-h-10 h-10 px-3 text-sm", md:"min-h-11 h-11 px-4", lg:"min-h-12 h-12 px-5 text-base" };
const variants={ default:"bg-gray-900 text-white hover:bg-gray-800", secondary:isDark?"bg-neutral-800 text-gray-100 hover:bg-neutral-700":"bg-gray-100 text-gray-900 hover:bg-gray-200", outline:isDark?"border border-neutral-700 hover:bg-neutral-800":"border border-gray-300 hover:bg-gray-50", ghost:isDark?"hover:bg-neutral-800":"hover:bg-gray-100" };
return ;
}
function Input(p){ const {isDark}=useTheme(); return ; }
function Textarea(p){ const {isDark}=useTheme(); return ; }
function Card({className="", children}){ const {isDark}=useTheme(); return
{children}
; }
function CardContent({className="", children}){ return {children}
; }
function ShareBar({anchorId, title}){
const url = buildAnchorUrl(anchorId);
const shareNative = async()=>{ if(!navigator.share){ alert("المشاركة غير مدعومة في هذا المتصفح. استخدم واتساب أو X بالأسفل."); return; } try{ await navigator.share({title, text:title, url}); }catch{} };
const links = ((u,t)=>({ whatsapp:`https://wa.me/?text=${encodeURIComponent(t)}%20${encodeURIComponent(u)}`, twitter:`https://twitter.com/intent/tweet?url=${encodeURIComponent(u)}&text=${encodeURIComponent(t)}` }))(url,title);
const openWin=(u)=>window.open(u,"_blank","noopener,noreferrer");
return (
);
}
async function sendViaFormSubmit({ section, name, phone, email, message }){
const payload={ section, name, phone, email, message, _subject:`طلب جديد – ${section}`, _template:"table", _captcha:"false", _honey:"" };
const res = await fetch(`https://formsubmit.co/ajax/${EMAIL_TO}`, { method:"POST", headers:{ "Content-Type":"application/json", Accept:"application/json" }, body: JSON.stringify(payload) });
if(!res.ok) throw new Error("send-failed"); return res.json();
}
function openMailtoFallback({ section, name, phone, email, message }){
const subject=`طلب جديد – ${section}`;
const lines=[`القسم: ${section}`, name?`الاسم: ${name}`:null, phone?`الهاتف: ${phone}`:null, email?`الإيميل: ${email}`:null, "", "الرسالة:", message].filter(Boolean);
const body=encodeURIComponent(lines.join("\\n"));
location.href=`mailto:${EMAIL_TO}?subject=${encodeURIComponent(subject)}&body=${body}`;
}
function ContactForm({ section }){
const [name,setName]=React.useState(""); const [phone,setPhone]=React.useState(""); const [email,setEmail]=React.useState(""); const [message,setMessage]=React.useState("");
const [sent,setSent]=React.useState(false); const [error,setError]=React.useState(""); const [sending,setSending]=React.useState(false);
const onSubmit=async(e)=>{
e.preventDefault(); setError("");
const { ok, errors } = validateContact({ phone, email, message }); if(!ok){ setError(errors[0]); return; }
try{ setSending(true); await sendViaFormSubmit({ section, name, phone, email, message }); setSent(true); }
catch{ try{ openMailtoFallback({ section, name, phone, email, message }); setSent(true);} catch{ setError("تعذّر إرسال الرسالة. جرّب لاحقاً أو تواصل عبر واتساب."); } }
finally{ setSending(false); setName(""); setPhone(""); setEmail(""); setMessage(""); }
};
if(sent) return (تم استلام رسالتك
سنتواصل معك قريباً.
);
return ();
}
function WorkshopForm(){
const [title,setTitle]=React.useState("أساسيات صناعة المحتوى"); const [date,setDate]=React.useState("2025-09-01"); const [tickets,setTickets]=React.useState(1);
const [name,setName]=React.useState(""); const [phone,setPhone]=React.useState(""); const [email,setEmail]=React.useState(""); const [notes,setNotes]=React.useState("");
const [sent,setSent]=React.useState(false); const [error,setError]=React.useState(""); const [sending,setSending]=React.useState(false);
const onSubmit=async(e)=>{ e.preventDefault(); setError(""); const msg=[`الاشتراك في ورشة: ${title}`,`التاريخ: ${date}`,`عدد المقاعد: ${tickets}`, notes?`ملاحظات: ${notes}`:null].filter(Boolean).join("\\n"); const {ok,errors}=validateContact({ phone, email, message:msg }); if(!ok){ setError(errors[0]); return; } try{ setSending=true; await sendViaFormSubmit({ section:`ورشة عمل – ${title} (${date})`, name, phone, email, message:msg }); setSent(true);} catch{ try{ openMailtoFallback({ section:`ورشة عمل – ${title} (${date})`, name, phone, email, message:msg }); setSent(true);} catch{ setError("تعذّر إرسال الطلب. جرّب لاحقاً أو تواصل عبر واتساب."); } } finally{ setSending(false); setName(""); setPhone(""); setEmail(""); setNotes(""); } };
if(sent) return (تم حجز مقعدك بنجاح
سنتواصل معك لتأكيد التفاصيل.
);
return ();
}
function WorkshopPage(){
const banner="https://images.unsplash.com/photo-1521737604893-d14cc237f11d?q=80&w=1600&auto=format&fit=crop"; const accent="from-violet-600 via-fuchsia-600 to-rose-600";
return (

{ e.currentTarget.onerror=null; e.currentTarget.src=makeFallbackBanner('ورشة عمل'); }}/>
ورشة عمل
تنظيم دورات وورش متخصصة في صناعة المحتوى
تفاصيل عامة
- أماكن محدودة — أولوية الحجز حسب الأسبقية.
- شهادة مشاركة بعد إتمام الورشة.
- إمكانية الدفع الإلكترونية أو تحويل بنكي.
);
}
function SectionBlock({ id, title, desc, features, Icon, accent, banner }){
return (

{ e.currentTarget.onerror=null; e.currentTarget.src=makeFallbackBanner(title); }}/>
{features.map((f,i)=>(- {f}
))}
);
}
const sectionsDef=[
{ id:"songs", title:"أغاني المناسبات", desc:"نكتب لك كلمات أصلية ونلحنها وننتجها بصوت وإحساس يناسب حفلك أو إعلانك.", features:["كتابة كلمات خاصة","تلحين وتوزيع موسيقي","تسجيل ومكس/ماستر","تسليم نسخ مختصرة للسوشيال"], Icon:IconMusic, accent:"from-fuchsia-600 via-pink-600 to-rose-600", banner:"https://images.unsplash.com/photo-1511379938547-c1f69419868d?q=80&w=1600&auto=format&fit=crop" },
{ id:"consulting", title:"استشارات إعلامية", desc:"نصنع معك إستراتيجية ظهور قوية: رسائل واضحة، خطة محتوى، وأدوات قياس فعّالة.", features:["بناء الهوية والقصة","خريطة محتوى 90 يوم","سيناريوهات مقابلات وبرامج","تدريب على الإلقاء والظهور"], Icon:IconMessage, accent:"from-sky-600 via-cyan-600 to-blue-600", banner:"https://images.unsplash.com/photo-1525182008055-f88b95ff7980?q=80&w=1600&auto=format&fit=crop" },
{ id:"social", title:"وسائل التواصل", desc:"إدارة حساباتك، إنتاج فيديوهات قصيرة، وإطلاق حملات تؤثر وتحوّل.", features:["إدارة ونشر وجدولة","تصميم ومونتاج رييلز/شورتس","إعلانات ممولة وقياس الأداء","كتابة كابتشنات مؤثرة"], Icon:IconShare, accent:"from-amber-600 via-orange-600 to-red-600", banner:"https://images.unsplash.com/photo-1551817958-20204d6ab1c4?q=80&w=1600&auto=format&fit=crop" },
{ id:"cinema", title:"سينما وأفلام", desc:"من الفكرة إلى الشاشة: كتابة سيناريو، تصوير، إخراج، مونتاج وتصحيح لوني.", features:["تطوير الفكرة والسكريبت","تصوير سينمائي وإخراج","مونتاج وصوت وتصحيح لون","بوستر وتوزيع رقمي"], Icon:IconFilm, accent:"from-emerald-600 via-teal-600 to-green-600", banner:"https://images.unsplash.com/photo-1517602302552-471fe67acf66?q=80&w=1600&auto=format&fit=crop" },
];
function HomePage(){
const { isDark } = React.useContext(ThemeContext);
return (
نصنع محتوى فني يحكي قصتك
أغاني المناسبات • استشارات إعلامية • وسائل التواصل • سينما وأفلام
معاينة فنية
Studio • Music • Media • Cinema
تصميم أنيق، متجاوب، سريع – جاهز للربط بأنظمة المراسلة.
);
}
function ThemeToggleButton({ compact=false }){
const { isDark, toggleTheme }=React.useContext(ThemeContext);
return ();
}
function SiteContent(){
const [route,setRoute]=React.useState(getRoute()); const routeId=currentRouteId();
const [isDark,setIsDark]=React.useState(false);
React.useEffect(()=>{ try{ const saved=localStorage.getItem("theme"); const prefers=window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches; setIsDark(saved ? saved==='dark' : !!prefers);}catch{} },[]);
React.useEffect(()=>{ try{ document.documentElement.classList.toggle('dark', isDark); document.documentElement.setAttribute('data-theme', isDark ? 'dark' : 'light'); localStorage.setItem('theme', isDark?'dark':'light'); }catch{} },[isDark]);
const toggleTheme=()=>setIsDark(d=>!d);
React.useEffect(()=>{ const onHash=()=>setRoute(getRoute()); window.addEventListener("hashchange", onHash); return ()=>window.removeEventListener("hashchange", onHash); },[]);
React.useEffect(()=>{ document.title = BRAND; },[]);
const isHome = route==="/" || routeId==="";
const section = sectionsDef.find(s=>s.id===routeId);
const rootBg = isDark ? "from-neutral-950 to-neutral-900 text-gray-100" : "from-white to-gray-50 text-gray-900";
const headerShell = isDark ? "backdrop-blur bg-neutral-900/70 border-b border-neutral-800" : "backdrop-blur bg-white/70 border-b";
return (
);
}
class ErrorBoundary extends React.Component{ constructor(p){ super(p); this.state={ hasError:false, error:null }; } static getDerivedStateFromError(e){ return { hasError:true, error:e }; } componentDidCatch(e,i){ console.error("UI Error:", e, i); } render(){ if(this.state.hasError){ return (حدث خطأ غير متوقع
{String(this.state.error)} );} return this.props.children; } }
function App(){ return (); }
document.title = BRAND;
const root = ReactDOM.createRoot(document.getElementById("root")); root.render();