last_edit / frontend /content_v2.html
Moharek
Deploy Moharek GEO Platform
a74b879
Raw
History Blame Contribute Delete
28.3 kB
<!DOCTYPE html>
<html lang="ar" dir="rtl">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<title>توليد المحتوى الذكي — منصة محرك GEO</title>
<link href="https://fonts.googleapis.com/css2?family=Cairo:wght@300;400;500;600;700;800;900&family=Inter:wght@400;600;700&family=Teko:wght@300..700&display=swap" rel="stylesheet">
<link rel="stylesheet" href="/theme.css">
<style>
:root {
--bg: #071f21;
--surface: rgba(255, 255, 255, 0.04);
--blue: #5fd4dc;
--gold: #c8f04e;
--red: #ff4d4d;
--emerald: #4ade80;
--purple: #9370db;
--orange: #fbbf24;
--cyan: #5fd4dc;
--text: #ffffff;
--muted: rgba(255, 255, 255, 0.5);
--dim: rgba(255, 255, 255, 0.3);
--border: rgba(255, 255, 255, 0.08);
--glass: rgba(255, 255, 255, 0.035);
--hero-grad: linear-gradient(135deg, #fff 0%, #c8f04e 45%, #5fd4dc 100%);
--accent-grad: linear-gradient(135deg, #c8f04e 0%, #5fd4dc 100%);
--gold-grad: linear-gradient(135deg, #c8f04e 0%, #fbbf24 100%);
--accent: #c8f04e;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
body {
background: var(--bg);
color: var(--text);
font-family: 'Cairo', 'Inter', sans-serif;
direction: rtl;
overflow-x: hidden;
line-height: 1.6;
}
/* Animated Background */
.bg-mesh{position:fixed;inset:0;z-index:-2;
background:radial-gradient(circle at 10% 10%,rgba(59,130,246,.12) 0%,transparent 40%),
radial-gradient(circle at 90% 90%,rgba(251,191,36,.1) 0%,transparent 40%),
radial-gradient(circle at 50% 50%,rgba(239,68,68,.06) 0%,transparent 60%);
filter:blur(100px);animation:meshMove 20s infinite alternate ease-in-out}
@keyframes meshMove{0%{transform:scale(1) translate(0,0)}100%{transform:scale(1.1) translate(2%,2%)}}
.bg-grid {
position: fixed; inset: 0; z-index: -1;
background-image:
linear-gradient(rgba(255,255,255,0.02) 1px, transparent 1px),
linear-gradient(90deg, rgba(255,255,255,0.02) 1px, transparent 1px);
background-size: 40px 40px;
pointer-events: none;
}
/* Navigation */
nav {
position: sticky; top: 0; z-index: 1000;
background: rgba(5, 7, 10, 0.8);
backdrop-filter: blur(20px);
border-bottom: 1px solid var(--border);
height: 80px; display: flex; align-items: center;
}
.nav-inner {
max-width: 1400px; margin: 0 auto; width: 100%; padding: 0 40px;
display: flex; justify-content: space-between; align-items: center;
}
.nav-links { display: flex; gap: 30px; align-items: center; }
.nav-link {
color: var(--muted); text-decoration: none;
font-weight: 700; font-size: 15px; transition: 0.3s;
position: relative;
}
.nav-link:hover, .nav-link.active { color: var(--text); }
.nav-link.active::after {
content: ''; position: absolute; bottom: -10px; left: 0; right: 0;
height: 2px; background: var(--accent); border-radius: 2px;
}
/* User Menu */
.nav-user { display: flex; align-items: center; gap: 15px; }
.user-info { text-align: right; line-height: 1.2; }
.user-name { font-weight: 800; font-size: 14px; color: #fff; }
.user-email { font-size: 11px; color: var(--muted); }
.user-avatar {
width: 40px; height: 40px; border-radius: 12px;
background: var(--accent-grad);
display: flex; align-items: center; justify-content: center;
font-weight: 900; color: #000; font-size: 18px;
box-shadow: 0 0 20px rgba(59, 130, 246, 0.3);
}
.logout-btn {
background: rgba(239, 68, 68, 0.1); border: 1px solid rgba(239, 68, 68, 0.3);
color: var(--red); padding: 8px 24px; border-radius: 100px;
font-size: 13px; font-weight: 700; cursor: pointer; transition: 0.3s;
}
.logout-btn:hover { background: var(--red); color: #fff; }
/* Main Layout */
.page-container {
max-width: 1400px; margin: 0 auto; padding: 40px;
}
/* Premium Header Card */
.header-card {
background: linear-gradient(165deg, rgba(15, 20, 25, 0.9), rgba(5, 7, 10, 0.95));
border: 1px solid var(--border);
border-radius: 24px; padding: 60px; text-align: center;
margin-bottom: 40px; position: relative; overflow: hidden;
backdrop-filter: blur(20px);
}
.header-cardHeader {
display: inline-block; padding: 6px 16px; border-radius: 100px;
background: rgba(0, 212, 255, 0.1); border: 1px solid rgba(0, 212, 255, 0.2);
color: var(--accent); font-size: 12px; font-weight: 800;
text-transform: uppercase; letter-spacing: 2px; margin-bottom: 20px;
}
.header-title {
font-size: 56px; font-weight: 900; margin-bottom: 16px;
background: var(--hero-grad);
background-clip: text;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
letter-spacing: -1.5px;
}
.header-subtitle {
font-size: 18px; color: var(--muted); max-width: 700px; margin: 0 auto 30px;
}
/* KPI Grid */
.kpi-grid {
display: grid; grid-template-columns: repeat(4, 1fr); gap: 20px;
margin-bottom: 40px;
}
.kpi-card {
background: var(--glass); border: 1px solid var(--border);
border-radius: 20px; padding: 24px; text-align: center;
transition: 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}
.kpi-card:hover {
transform: translateY(-5px); border-color: var(--accent);
box-shadow: 0 10px 30px rgba(0, 212, 255, 0.1);
}
.kpi-val {
font-size: 32px; font-weight: 900; margin-bottom: 4px;
font-family: 'Teko', sans-serif; letter-spacing: 1px;
background: var(--accent-grad);
background-clip: text;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
.kpi-label { font-size: 12px; color: var(--muted); font-weight: 700; text-transform: uppercase; }
/* Tools / Tabs Section */
.tools-wrapper {
display: grid; grid-template-columns: 350px 1fr; gap: 30px;
}
/* Sidebar Tabs */
.sidebar-tabs {
background: var(--glass); border: 1px solid var(--border);
border-radius: 20px; padding: 15px; height: fit-content;
display: flex; flex-direction: column; gap: 8px;
}
.tab-btn {
display: flex; align-items: center; gap: 15px;
padding: 16px 20px; border-radius: 12px;
background: transparent; border: none;
color: var(--muted); font-family: 'Cairo'; font-weight: 700; font-size: 14px;
cursor: pointer; transition: 0.3s; text-align: right;
width: 100%;
}
.tab-btn:hover { background: rgba(255, 255, 255, 0.05); color: #fff; }
.tab-btn.active {
background: var(--accent-grad); color: #000;
box-shadow: 0 4px 15px rgba(59, 130, 246, 0.2);
}
/* Content Area */
.workspace-panel {
background: var(--glass); border: 1px solid var(--border);
border-radius: 20px; padding: 40px; min-height: 600px;
}
.form-title { font-size: 24px; font-weight: 800; color: #fff; margin-bottom: 24px; }
.form-group { margin-bottom: 20px; }
.form-label { display: block; font-size: 12px; font-weight: 800; color: var(--blue); margin-bottom: 8px; }
.input, .select, .textarea {
width: 100%; background: rgba(0, 0, 0, 0.3); border: 1px solid var(--border);
border-radius: 10px; padding: 14px 18px; color: #fff; font-family: 'Cairo';
}
.btn-main {
width: 100%; height: 56px; border-radius: 100px; border: none;
background: var(--accent-grad); color: #000; font-weight: 900;
cursor: pointer; transition: 0.3s;
}
.btn-main:hover { transform: scale(1.05); box-shadow: 0 15px 40px rgba(59, 130, 246, 0.4); }
.result-viewer {
margin-top: 30px; padding: 30px; background: rgba(0,0,0,0.4);
border-radius: 16px; border: 1px solid var(--border);
}
.hidden { display: none !important; }
.progress-container { margin-top: 20px; display: none; }
.progress-track { height: 6px; background: rgba(255,255,255,0.05); border-radius: 10px; overflow: hidden; }
.progress-fill { height: 6px; width: 0%; background: var(--accent-grad); transition: width 0.4s ease; border-radius: 10px; }
.badge {
padding: 4px 10px; border-radius: 6px; font-size: 11px; font-weight: 800;
background: rgba(59, 130, 246, 0.1); color: var(--blue); border: 1px solid rgba(59, 130, 246, 0.2);
}
@keyframes fadeIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } }
.animate { animation: fadeIn 0.6s ease-out forwards; }
</style>
</head>
<body>
<div class="bg-mesh"></div>
<div class="bg-grid"></div>
<nav>
<div class="nav-inner">
<div class="nav-links">
<a href="/portal.html" class="nav-link">لوحة التحكم</a>
<a href="/jobs.html" class="nav-link">المهام</a>
<a href="/search.html" class="nav-link">الذكاء</a>
<a href="/content_v2.html" class="nav-link active">المحتوى</a>
<a href="/recommendations.html" class="nav-link">العروض</a>
</div>
<div class="nav-user">
<div class="user-info">
<div class="user-name" id="userNameNav">مستخدم</div>
<div class="user-email" id="userEmailNav">user@mohrek.com</div>
</div>
<div class="user-avatar" id="userAvatarNav">M</div>
<button class="logout-btn" onclick="logout()">خروج</button>
</div>
</div>
</nav>
<div class="page-container">
<header class="header-card animate">
<span class="header-cardHeader">CONTENT INTELLIGENCE v2.0</span>
<h1 class="header-title">توليد المحتوى الذكي</h1>
<p class="header-subtitle">استخدم الذكاء الاصطناعي لإنشاء محتوى فائق الجودة يتوافق مع معايير GEO و SEO.</p>
<div class="kpi-grid">
<div class="kpi-card"><div class="kpi-val" id="articlesCount">0</div><div class="kpi-label">مقالات مُنشأة</div></div>
<div class="kpi-card"><div class="kpi-val" id="descriptionsCount">0</div><div class="kpi-label">أوصاف منتجات</div></div>
<div class="kpi-card"><div class="kpi-val" id="schemaCount">0</div><div class="kpi-label">بيانات Schema</div></div>
<div class="kpi-card"><div class="kpi-val" id="aiScore">--</div><div class="kpi-label">متوسط درجة AI</div></div>
</div>
</header>
<div class="tools-wrapper animate" style="animation-delay:0.2s">
<div class="sidebar-tabs">
<button class="tab-btn active" data-tab="generate" onclick="switchTab('generate')"> محرر المقالات</button>
<button class="tab-btn" data-tab="optimize" onclick="switchTab('optimize')">⚡ محسّن المحتوى</button>
<button class="tab-btn" data-tab="faqs" onclick="switchTab('faqs')"> الأسئلة الشائعة</button>
<button class="tab-btn" data-tab="semantic" onclick="switchTab('semantic')"> التحليل الدلالي</button>
<button class="tab-btn" data-tab="identity" onclick="switchTab('identity')"> الهوية الذكية</button>
<button class="tab-btn" data-tab="schema" onclick="switchTab('schema')"> البيانات المنظمة</button>
<button class="btn-main" style="height:44px; margin-top:20px; font-size:12px; background:rgba(255,255,255,0.05); color:#fff" id="connect-research-btn">🔗 ربط البحث</button>
</div>
<main class="workspace-panel">
<div id="active-research-status" style="margin-bottom:20px; font-size:12px; color:var(--muted)"></div>
<div id="tab-generate" class="tab-content">
<h2 class="form-title">إنشاء مقالة احترافية</h2>
<div class="form-group">
<label class="form-label">الكلمة المفتاحية أو الموضوع</label>
<input type="text" class="input" id="gen-keyword" placeholder="مثلاً: أفضل العبايات الخليجية">
</div>
<div style="display:grid; grid-template-columns:1fr 1fr; gap:20px">
<div class="form-group">
<label class="form-label">اللغة</label>
<select class="select" id="gen-lang"><option value="ar">العربية</option><option value="en">English</option></select>
</div>
<div class="form-group">
<label class="form-label">المحرك</label>
<select class="select" id="gen-backend"><option value="groq">Groq</option><option value="openai">OpenAI</option></select>
</div>
</div>
<button class="btn-main" id="gen-btn">إنتاج محتوى ذكي 🚀</button>
<div id="gen-progress" class="progress-container">
<div class="progress-track"><div class="progress-fill" id="gen-progressBar"></div></div>
<div style="font-size:11px; margin-top:8px" id="gen-stageLabel">جارٍ التوليد...</div>
</div>
<div id="gen-result" class="result-viewer hidden">
<div id="gen-title" style="font-weight:900; font-size:20px; color:var(--accent); margin-bottom:15px"></div>
<div id="gen-content" style="line-height:1.8"></div>
</div>
</div>
<div id="tab-optimize" class="tab-content hidden">
<h2 class="form-title">تحسين المحتوى</h2>
<div class="form-group">
<label class="form-label">المحتوى</label>
<textarea class="textarea" id="opt-content" rows="10"></textarea>
</div>
<div class="form-group">
<label class="form-label">الكلمة المفتاحية</label>
<input type="text" class="input" id="opt-keyword">
</div>
<button class="btn-main" id="opt-btn">تحسين الآن ⚡</button>
<div id="opt-result" class="result-viewer hidden">
<div id="opt-score" style="font-size:24px; font-weight:900; margin-bottom:15px"></div>
<div id="opt-content-out"></div>
</div>
</div>
<div id="tab-faqs" class="tab-content hidden">
<h2 class="form-title">توليد الأسئلة الشائعة</h2>
<input type="text" class="input" id="faq-topic" placeholder="الموضوع">
<button class="btn-main" id="faq-btn" style="margin-top:20px">توليد ❓</button>
<div id="faq-result" class="result-viewer hidden"><div id="faq-list"></div></div>
</div>
<div id="tab-semantic" class="tab-content hidden">
<h2 class="form-title">التحليل الدلالي</h2>
<textarea class="textarea" id="sem-content" rows="8"></textarea>
<button class="btn-main" id="sem-btn" style="margin-top:20px">تحليل 🕸️</button>
<div id="sem-result" class="result-viewer hidden"><div id="sem-entities"></div></div>
</div>
<div id="tab-identity" class="tab-content hidden">
<h2 class="form-title">هوية العلامة التجارية</h2>
<button class="btn-main" id="identity-btn">توليد الهوية 🎨</button>
<div id="identity-result" class="result-viewer hidden"><div id="identity-hook"></div></div>
</div>
<div id="tab-schema" class="tab-content hidden">
<h2 class="form-title">البيانات المنظمة</h2>
</div>
</main>
</div>
</div>
<!-- Modals -->
<div id="research-modal" class="hidden" style="position:fixed; inset:0; background:rgba(0,0,0,0.8); z-index:2000; display:none; align-items:center; justify-content:center">
<div style="background:var(--surface); padding:40px; border-radius:24px; width:90%; max-width:500px; border:1px solid var(--border); max-height:80vh; overflow-y:auto">
<h3 style="font-size:20px; font-weight:800; margin-bottom:20px; color:#fff">مستودع الأبحاث</h3>
<div id="research-list" style="margin-top:20px"></div>
<button class="btn-main" style="margin-top:20px" onclick="document.getElementById('research-modal').classList.add('hidden'); document.getElementById('research-modal').style.display='none'">إغلاق</button>
</div>
</div>
<script>
const token = localStorage.getItem('token');
// if (!token) window.location.href = '/login.html';
// Load user info
async function loadUserInfo() {
try {
const res = await fetch('http://localhost:8001/api/users/me', {
headers: { 'Authorization': `Bearer ${token}` }
});
const data = await res.json();
if (data.ok && data.user) {
document.getElementById('userNameNav').textContent = data.user.email.split('@')[0];
document.getElementById('userEmailNav').textContent = data.user.email;
document.getElementById('userAvatarNav').textContent = data.user.email[0].toUpperCase();
}
} catch (e) {
console.error('Failed to load user info:', e);
}
}
loadUserInfo();
function switchTab(id) {
document.querySelectorAll('.tab-btn').forEach(b => b.classList.toggle('active', b.dataset.tab === id));
document.querySelectorAll('.tab-content').forEach(c => c.classList.toggle('hidden', c.id !== 'tab-' + id));
}
function logout() { localStorage.removeItem('token'); window.location.href = '/'; }
async function apiCall(path, body) {
try {
const res = await fetch(path, {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${token}` },
body: JSON.stringify({
...body,
api_keys: {
groq: localStorage.getItem('geo_groq_key'),
openai: localStorage.getItem('geo_openai_key')
}
})
});
if (!res.ok) {
console.error(`API error: ${res.status} ${res.statusText}`);
return { ok: false, error: `HTTP ${res.status}` };
}
return await res.json();
} catch (e) {
console.error('API call failed:', e);
return { ok: false, error: e.message };
}
}
// Generate Article
if (document.getElementById('gen-btn')) {
document.getElementById('gen-btn').onclick = async () => {
const btn = document.getElementById('gen-btn');
const keyword = document.getElementById('gen-keyword').value.trim();
if (!keyword) {
alert('يرجى إدخال كلمة مفتاحية');
return;
}
btn.disabled = true;
btn.textContent = 'جارٍ التوليد...';
document.getElementById('gen-progress').style.display = 'block';
document.getElementById('gen-progressBar').style.width = '30%';
const data = await apiCall('/api/content/generate', {
keyword: keyword,
lang: document.getElementById('gen-lang').value,
prefer_backend: document.getElementById('gen-backend').value
});
btn.disabled = false;
btn.textContent = 'إنتاج محتوى ذكي 🚀';
document.getElementById('gen-progress').style.display = 'none';
if (data.ok && data.result) {
document.getElementById('gen-result').classList.remove('hidden');
document.getElementById('gen-title').textContent = data.result.title || 'بدون عنوان';
document.getElementById('gen-content').innerHTML = (data.result.content || '').replace(/\n/g, '<br>');
} else {
alert('خطأ: ' + (data.error || 'فشل التوليد'));
}
};
}
// Optimize Content
if (document.getElementById('opt-btn')) {
document.getElementById('opt-btn').onclick = async () => {
const content = document.getElementById('opt-content').value.trim();
const keyword = document.getElementById('opt-keyword').value.trim();
if (!content || !keyword) {
alert('يرجى إدخال المحتوى والكلمة المفتاحية');
return;
}
const btn = document.getElementById('opt-btn');
btn.disabled = true;
btn.textContent = 'جارٍ التحسين...';
const data = await apiCall('/api/content/optimize', {
content: content,
keyword: keyword
});
btn.disabled = false;
btn.textContent = 'تحسين الآن ⚡';
if (data.ok && data.result) {
document.getElementById('opt-result').classList.remove('hidden');
document.getElementById('opt-score').textContent = `درجة التحسين: ${data.result.score || 'N/A'}`;
document.getElementById('opt-content-out').innerHTML = (data.result.optimized_content || '').replace(/\n/g, '<br>');
} else {
alert('خطأ: ' + (data.error || 'فشل التحسين'));
}
};
}
// Generate FAQs
if (document.getElementById('faq-btn')) {
document.getElementById('faq-btn').onclick = async () => {
const topic = document.getElementById('faq-topic').value.trim();
if (!topic) {
alert('يرجى إدخال الموضوع');
return;
}
const btn = document.getElementById('faq-btn');
btn.disabled = true;
btn.textContent = 'جارٍ التوليد...';
const data = await apiCall('/api/content/faqs', { topic: topic });
btn.disabled = false;
btn.textContent = 'توليد ❓';
if (data.ok && data.result && data.result.faqs) {
document.getElementById('faq-result').classList.remove('hidden');
document.getElementById('faq-list').innerHTML = data.result.faqs
.map(f => `<div style="margin-bottom:20px; padding:15px; background:rgba(255,255,255,0.05); border-radius:10px"><b>س: ${f.question}</b><br><br>ج: ${f.answer}</div>`)
.join('');
} else {
alert('خطأ: ' + (data.error || 'فشل التوليد'));
}
};
}
// Semantic Analysis
if (document.getElementById('sem-btn')) {
document.getElementById('sem-btn').onclick = async () => {
const content = document.getElementById('sem-content').value.trim();
if (!content) {
alert('يرجى إدخال المحتوى');
return;
}
const btn = document.getElementById('sem-btn');
btn.disabled = true;
btn.textContent = 'جارٍ التحليل...';
const data = await apiCall('/api/content/semantic', { content: content });
btn.disabled = false;
btn.textContent = 'تحليل 🕸️';
if (data.ok && data.result) {
document.getElementById('sem-result').classList.remove('hidden');
const entities = data.result.entities || [];
document.getElementById('sem-entities').innerHTML = entities
.map(e => `<span class="badge" style="margin:5px; display:inline-block">${e.text || e}</span>`)
.join('');
} else {
alert('خطأ: ' + (data.error || 'فشل التحليل'));
}
};
}
// Brand Identity
if (document.getElementById('identity-btn')) {
document.getElementById('identity-btn').onclick = async () => {
const btn = document.getElementById('identity-btn');
btn.disabled = true;
btn.textContent = 'جارٍ التوليد...';
const data = await apiCall('/api/content/identity', {});
btn.disabled = false;
btn.textContent = 'توليد الهوية 🎨';
if (data.ok && data.result) {
document.getElementById('identity-result').classList.remove('hidden');
document.getElementById('identity-hook').textContent = data.result.brand_hook || 'لم يتم التوليد';
} else {
alert('خطأ: ' + (data.error || 'فشل التوليد'));
}
};
}
// Research Connection
if (document.getElementById('connect-research-btn')) {
document.getElementById('connect-research-btn').onclick = () => {
const modal = document.getElementById('research-modal');
modal.classList.remove('hidden');
modal.style.display = 'flex';
};
}
</script>
</body>
</html>