Update index.html
Browse files- index.html +157 -7
index.html
CHANGED
|
@@ -5,7 +5,7 @@
|
|
| 5 |
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
| 6 |
<title>Genisi AI</title>
|
| 7 |
|
| 8 |
-
<!-- Font Awesome 6
|
| 9 |
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css">
|
| 10 |
|
| 11 |
<link href="https://fonts.googleapis.com/css2?family=Cairo:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet"/>
|
|
@@ -22,6 +22,7 @@
|
|
| 22 |
--text: #e8eaf2; --text2: #9aa3be; --text3: #5c6480;
|
| 23 |
--user-bubble: #1a2340; --bot-bubble: #161920;
|
| 24 |
--danger: #f75f5f;
|
|
|
|
| 25 |
--radius: 28px; --radius-sm: 18px; --radius-pill: 50px;
|
| 26 |
--sidebar-w: 280px; --tr: 0.3s cubic-bezier(.4,0,.2,1);
|
| 27 |
}
|
|
@@ -50,7 +51,6 @@
|
|
| 50 |
.s-logo img{width:36px;height:36px;border-radius:12px;object-fit:cover; box-shadow: 0 4px 12px var(--accent-soft);}
|
| 51 |
.s-logo-name{font-size:1.2rem;font-weight:700;background:linear-gradient(135deg,var(--accent),var(--accent2));-webkit-background-clip:text;-webkit-text-fill-color:transparent}
|
| 52 |
|
| 53 |
-
/* أيقونات Font Awesome داخل الأزرار */
|
| 54 |
.btn-new i { font-size: 1rem; }
|
| 55 |
.btn-new{margin:12px 16px;padding:12px 16px;background:linear-gradient(135deg,var(--accent),var(--accent2));
|
| 56 |
color:#fff;border:none;border-radius:var(--radius-pill);cursor:pointer;font-family:'Cairo',sans-serif;
|
|
@@ -81,6 +81,32 @@
|
|
| 81 |
.topbar{height:70px;padding:0 24px;display:flex;align-items:center;gap:16px; flex-shrink:0}
|
| 82 |
.topbar-title{flex:1;font-size:1.05rem;font-weight:600;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
| 83 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 84 |
/* CHAT AREA */
|
| 85 |
.chat-area{flex:1;overflow-y:auto;padding:20px 0 40px;display:flex;flex-direction:column; scroll-behavior: smooth;}
|
| 86 |
.welcome{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;
|
|
@@ -116,8 +142,8 @@
|
|
| 116 |
.msg-row.user .bubble{background:var(--user-bubble);border:none; border-top-right-radius:6px}
|
| 117 |
[dir="rtl"] .msg-row.user .bubble { border-top-right-radius:var(--radius); border-top-left-radius:6px; }
|
| 118 |
|
| 119 |
-
/*
|
| 120 |
-
.
|
| 121 |
@keyframes spinPulse { 0% { transform: scale(0.8) rotate(0deg); opacity: 0.5; } 50% { transform: scale(1.2) rotate(90deg); opacity: 1; filter: drop-shadow(0 0 5px var(--accent)); } 100% { transform: scale(0.8) rotate(180deg); opacity: 0.5; } }
|
| 122 |
|
| 123 |
/* IMAGE SKELETON LOADING */
|
|
@@ -239,6 +265,8 @@
|
|
| 239 |
.w-title { font-size: 1.8rem; }
|
| 240 |
.chips { gap: 8px; }
|
| 241 |
.chip { font-size: .82rem; padding: 8px 14px; }
|
|
|
|
|
|
|
| 242 |
}
|
| 243 |
</style>
|
| 244 |
</head>
|
|
@@ -267,6 +295,32 @@
|
|
| 267 |
<main class="main">
|
| 268 |
<div class="topbar">
|
| 269 |
<button class="btn-icon" onclick="toggleSidebar()"><i class="fas fa-bars"></i></button>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 270 |
<div class="topbar-title" id="topbar-title">Genisi AI</div>
|
| 271 |
</div>
|
| 272 |
|
|
@@ -404,6 +458,86 @@ let activeChatId = null;
|
|
| 404 |
let isGenerating = false;
|
| 405 |
let pendingFiles = [];
|
| 406 |
let currentAbortController = null;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 407 |
|
| 408 |
// Markdown renderer
|
| 409 |
const renderer = new marked.Renderer();
|
|
@@ -658,7 +792,13 @@ async function sendMessage(){
|
|
| 658 |
const response = await fetch('/chat', {
|
| 659 |
method: 'POST',
|
| 660 |
headers: {'Content-Type':'application/json'},
|
| 661 |
-
body: JSON.stringify({
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 662 |
signal: currentAbortController.signal
|
| 663 |
});
|
| 664 |
|
|
@@ -681,12 +821,12 @@ async function sendMessage(){
|
|
| 681 |
if (isImageRequest && !fullBotResponse.includes('<img')) {
|
| 682 |
htmlToRender += '<div class="skeleton-img"><i class="fas fa-palette"></i> جاري التخيل والتصميم...</div>';
|
| 683 |
}
|
| 684 |
-
botContentDiv.innerHTML = htmlToRender + '<span class="
|
| 685 |
}
|
| 686 |
scrollToBottom();
|
| 687 |
}
|
| 688 |
|
| 689 |
-
const cursor = botContentDiv.querySelector('.
|
| 690 |
if (cursor) cursor.remove();
|
| 691 |
|
| 692 |
if (fullBotResponse.includes('<div style="text-align:center;') && fullBotResponse.includes('<img')) {
|
|
@@ -791,6 +931,16 @@ function appendMemBadge(count, total){
|
|
| 791 |
applyTheme(localStorage.getItem('genisi_theme')||'dark');
|
| 792 |
document.getElementById('lang-select').value = currentLang;
|
| 793 |
applyI18n();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 794 |
</script>
|
| 795 |
</body>
|
| 796 |
</html>
|
|
|
|
| 5 |
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
| 6 |
<title>Genisi AI</title>
|
| 7 |
|
| 8 |
+
<!-- Font Awesome 6 -->
|
| 9 |
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css">
|
| 10 |
|
| 11 |
<link href="https://fonts.googleapis.com/css2?family=Cairo:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap" rel="stylesheet"/>
|
|
|
|
| 22 |
--text: #e8eaf2; --text2: #9aa3be; --text3: #5c6480;
|
| 23 |
--user-bubble: #1a2340; --bot-bubble: #161920;
|
| 24 |
--danger: #f75f5f;
|
| 25 |
+
--flash-color: #ffd700; --pro-color: #7c5cf7;
|
| 26 |
--radius: 28px; --radius-sm: 18px; --radius-pill: 50px;
|
| 27 |
--sidebar-w: 280px; --tr: 0.3s cubic-bezier(.4,0,.2,1);
|
| 28 |
}
|
|
|
|
| 51 |
.s-logo img{width:36px;height:36px;border-radius:12px;object-fit:cover; box-shadow: 0 4px 12px var(--accent-soft);}
|
| 52 |
.s-logo-name{font-size:1.2rem;font-weight:700;background:linear-gradient(135deg,var(--accent),var(--accent2));-webkit-background-clip:text;-webkit-text-fill-color:transparent}
|
| 53 |
|
|
|
|
| 54 |
.btn-new i { font-size: 1rem; }
|
| 55 |
.btn-new{margin:12px 16px;padding:12px 16px;background:linear-gradient(135deg,var(--accent),var(--accent2));
|
| 56 |
color:#fff;border:none;border-radius:var(--radius-pill);cursor:pointer;font-family:'Cairo',sans-serif;
|
|
|
|
| 81 |
.topbar{height:70px;padding:0 24px;display:flex;align-items:center;gap:16px; flex-shrink:0}
|
| 82 |
.topbar-title{flex:1;font-size:1.05rem;font-weight:600;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
| 83 |
|
| 84 |
+
/* 🌟 MODEL SELECTOR (جديد) */
|
| 85 |
+
.model-selector{position:relative;display:flex;align-items:center;gap:10px;padding:8px 16px;
|
| 86 |
+
background:var(--surface2);border:1px solid var(--border);border-radius:var(--radius-pill);
|
| 87 |
+
cursor:pointer;transition:all var(--tr);user-select:none;}
|
| 88 |
+
.model-selector:hover{background:var(--surface3);border-color:var(--accent);}
|
| 89 |
+
.model-selector i{font-size:1.1rem;}
|
| 90 |
+
.model-selector .fa-bolt{color:var(--flash-color);}
|
| 91 |
+
.model-selector .fa-crown{color:var(--pro-color);}
|
| 92 |
+
.model-selector span{font-weight:600;font-size:0.9rem;}
|
| 93 |
+
.model-selector .fa-chevron-down{font-size:0.8rem;color:var(--text3);transition:transform var(--tr);}
|
| 94 |
+
.model-dropdown{position:absolute;top:calc(100% + 8px);left:0;background:var(--surface);
|
| 95 |
+
border:1px solid var(--border);border-radius:var(--radius-sm);padding:8px;min-width:180px;
|
| 96 |
+
box-shadow:0 10px 30px rgba(0,0,0,0.3);z-index:100;opacity:0;visibility:hidden;
|
| 97 |
+
transform:translateY(-10px);transition:all var(--tr);}
|
| 98 |
+
[dir="rtl"] .model-dropdown{left:auto;right:0;}
|
| 99 |
+
.model-dropdown.show{opacity:1;visibility:visible;transform:translateY(0);}
|
| 100 |
+
.model-option{display:flex;align-items:center;gap:12px;padding:10px 14px;border-radius:var(--radius-sm);
|
| 101 |
+
cursor:pointer;transition:background var(--tr);}
|
| 102 |
+
.model-option:hover{background:var(--surface2);}
|
| 103 |
+
.model-option.active{background:var(--accent-soft);}
|
| 104 |
+
.model-option i{width:20px;}
|
| 105 |
+
.model-info{flex:1;}
|
| 106 |
+
.model-name{font-weight:600;font-size:0.95rem;}
|
| 107 |
+
.model-desc{font-size:0.75rem;color:var(--text3);}
|
| 108 |
+
.model-badge{padding:2px 8px;background:var(--accent);color:#fff;border-radius:var(--radius-pill);font-size:0.65rem;font-weight:700;}
|
| 109 |
+
|
| 110 |
/* CHAT AREA */
|
| 111 |
.chat-area{flex:1;overflow-y:auto;padding:20px 0 40px;display:flex;flex-direction:column; scroll-behavior: smooth;}
|
| 112 |
.welcome{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;
|
|
|
|
| 142 |
.msg-row.user .bubble{background:var(--user-bubble);border:none; border-top-right-radius:6px}
|
| 143 |
[dir="rtl"] .msg-row.user .bubble { border-top-right-radius:var(--radius); border-top-left-radius:6px; }
|
| 144 |
|
| 145 |
+
/* GENISI STREAMING EFFECT */
|
| 146 |
+
.genisi-cursor { display: inline-block; width: 14px; height: 14px; margin-inline-start: 6px; background: linear-gradient(135deg, var(--accent), var(--accent2)); mask-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 0l2.5 9.5L24 12l-9.5 2.5L12 24l-2.5-9.5L0 12l9.5-2.5z"/></svg>'); -webkit-mask-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 0l2.5 9.5L24 12l-9.5 2.5L12 24l-2.5-9.5L0 12l9.5-2.5z"/></svg>'); mask-size: cover; -webkit-mask-size: cover; animation: spinPulse 1s infinite linear; transform-origin: center; vertical-align: middle; }
|
| 147 |
@keyframes spinPulse { 0% { transform: scale(0.8) rotate(0deg); opacity: 0.5; } 50% { transform: scale(1.2) rotate(90deg); opacity: 1; filter: drop-shadow(0 0 5px var(--accent)); } 100% { transform: scale(0.8) rotate(180deg); opacity: 0.5; } }
|
| 148 |
|
| 149 |
/* IMAGE SKELETON LOADING */
|
|
|
|
| 265 |
.w-title { font-size: 1.8rem; }
|
| 266 |
.chips { gap: 8px; }
|
| 267 |
.chip { font-size: .82rem; padding: 8px 14px; }
|
| 268 |
+
.model-selector span { display: none; }
|
| 269 |
+
.model-selector { padding: 8px 12px; }
|
| 270 |
}
|
| 271 |
</style>
|
| 272 |
</head>
|
|
|
|
| 295 |
<main class="main">
|
| 296 |
<div class="topbar">
|
| 297 |
<button class="btn-icon" onclick="toggleSidebar()"><i class="fas fa-bars"></i></button>
|
| 298 |
+
|
| 299 |
+
<!-- 🌟 MODEL SELECTOR (جديد) -->
|
| 300 |
+
<div class="model-selector" onclick="toggleModelDropdown(event)">
|
| 301 |
+
<i id="model-icon" class="fas fa-bolt"></i>
|
| 302 |
+
<span id="model-name">Flash</span>
|
| 303 |
+
<i class="fas fa-chevron-down"></i>
|
| 304 |
+
<div class="model-dropdown" id="model-dropdown">
|
| 305 |
+
<div class="model-option" data-model="flash" onclick="selectModel('flash', event)">
|
| 306 |
+
<i class="fas fa-bolt" style="color: var(--flash-color);"></i>
|
| 307 |
+
<div class="model-info">
|
| 308 |
+
<div class="model-name">Genisi Flash ⚡</div>
|
| 309 |
+
<div class="model-desc">سريع، مثالي للمهام اليومية</div>
|
| 310 |
+
</div>
|
| 311 |
+
<span class="model-badge" style="background: var(--flash-color);">Fast</span>
|
| 312 |
+
</div>
|
| 313 |
+
<div class="model-option" data-model="pro" onclick="selectModel('pro', event)">
|
| 314 |
+
<i class="fas fa-crown" style="color: var(--pro-color);"></i>
|
| 315 |
+
<div class="model-info">
|
| 316 |
+
<div class="model-name">Genisi Pro 💎</div>
|
| 317 |
+
<div class="model-desc">متقدم، تحليل عميق وإبداع</div>
|
| 318 |
+
</div>
|
| 319 |
+
<span class="model-badge" style="background: var(--pro-color);">Pro</span>
|
| 320 |
+
</div>
|
| 321 |
+
</div>
|
| 322 |
+
</div>
|
| 323 |
+
|
| 324 |
<div class="topbar-title" id="topbar-title">Genisi AI</div>
|
| 325 |
</div>
|
| 326 |
|
|
|
|
| 458 |
let isGenerating = false;
|
| 459 |
let pendingFiles = [];
|
| 460 |
let currentAbortController = null;
|
| 461 |
+
let currentModel = 'flash'; // 🌟 النموذج الافتراضي
|
| 462 |
+
|
| 463 |
+
// 🌟 دوال إدارة النموذج
|
| 464 |
+
function toggleModelDropdown(event) {
|
| 465 |
+
event.stopPropagation();
|
| 466 |
+
const dropdown = document.getElementById('model-dropdown');
|
| 467 |
+
dropdown.classList.toggle('show');
|
| 468 |
+
|
| 469 |
+
// إغلاق القائمة عند النقر خارجها
|
| 470 |
+
if (dropdown.classList.contains('show')) {
|
| 471 |
+
setTimeout(() => {
|
| 472 |
+
document.addEventListener('click', closeModelDropdown);
|
| 473 |
+
}, 0);
|
| 474 |
+
}
|
| 475 |
+
}
|
| 476 |
+
|
| 477 |
+
function closeModelDropdown() {
|
| 478 |
+
document.getElementById('model-dropdown').classList.remove('show');
|
| 479 |
+
document.removeEventListener('click', closeModelDropdown);
|
| 480 |
+
}
|
| 481 |
+
|
| 482 |
+
function selectModel(model, event) {
|
| 483 |
+
event.stopPropagation();
|
| 484 |
+
currentModel = model;
|
| 485 |
+
|
| 486 |
+
const icon = document.getElementById('model-icon');
|
| 487 |
+
const name = document.getElementById('model-name');
|
| 488 |
+
const options = document.querySelectorAll('.model-option');
|
| 489 |
+
|
| 490 |
+
// تحديث الأيقونة والنص
|
| 491 |
+
if (model === 'flash') {
|
| 492 |
+
icon.className = 'fas fa-bolt';
|
| 493 |
+
name.textContent = 'Flash';
|
| 494 |
+
} else {
|
| 495 |
+
icon.className = 'fas fa-crown';
|
| 496 |
+
name.textContent = 'Pro';
|
| 497 |
+
}
|
| 498 |
+
|
| 499 |
+
// تحديث الحالة النشطة
|
| 500 |
+
options.forEach(opt => {
|
| 501 |
+
opt.classList.remove('active');
|
| 502 |
+
if (opt.dataset.model === model) {
|
| 503 |
+
opt.classList.add('active');
|
| 504 |
+
}
|
| 505 |
+
});
|
| 506 |
+
|
| 507 |
+
// حفظ التفضيل
|
| 508 |
+
localStorage.setItem('genisi_model', model);
|
| 509 |
+
|
| 510 |
+
// إغلاق القائمة
|
| 511 |
+
closeModelDropdown();
|
| 512 |
+
|
| 513 |
+
// إظهار رسالة تأكيد صغيرة (اختياري)
|
| 514 |
+
console.log(`Model switched to: Genisi ${model === 'flash' ? 'Flash ⚡' : 'Pro 💎'}`);
|
| 515 |
+
}
|
| 516 |
+
|
| 517 |
+
// تحميل النموذج المحفوظ
|
| 518 |
+
function loadSavedModel() {
|
| 519 |
+
const saved = localStorage.getItem('genisi_model') || 'flash';
|
| 520 |
+
currentModel = saved;
|
| 521 |
+
|
| 522 |
+
const icon = document.getElementById('model-icon');
|
| 523 |
+
const name = document.getElementById('model-name');
|
| 524 |
+
const options = document.querySelectorAll('.model-option');
|
| 525 |
+
|
| 526 |
+
if (saved === 'flash') {
|
| 527 |
+
icon.className = 'fas fa-bolt';
|
| 528 |
+
name.textContent = 'Flash';
|
| 529 |
+
} else {
|
| 530 |
+
icon.className = 'fas fa-crown';
|
| 531 |
+
name.textContent = 'Pro';
|
| 532 |
+
}
|
| 533 |
+
|
| 534 |
+
options.forEach(opt => {
|
| 535 |
+
opt.classList.remove('active');
|
| 536 |
+
if (opt.dataset.model === saved) {
|
| 537 |
+
opt.classList.add('active');
|
| 538 |
+
}
|
| 539 |
+
});
|
| 540 |
+
}
|
| 541 |
|
| 542 |
// Markdown renderer
|
| 543 |
const renderer = new marked.Renderer();
|
|
|
|
| 792 |
const response = await fetch('/chat', {
|
| 793 |
method: 'POST',
|
| 794 |
headers: {'Content-Type':'application/json'},
|
| 795 |
+
body: JSON.stringify({
|
| 796 |
+
user_id: userId,
|
| 797 |
+
message: text,
|
| 798 |
+
history: chat.history,
|
| 799 |
+
files: binaryFiles,
|
| 800 |
+
model: currentModel // 🌟 إرسال النموذج المختار للباك-إند
|
| 801 |
+
}),
|
| 802 |
signal: currentAbortController.signal
|
| 803 |
});
|
| 804 |
|
|
|
|
| 821 |
if (isImageRequest && !fullBotResponse.includes('<img')) {
|
| 822 |
htmlToRender += '<div class="skeleton-img"><i class="fas fa-palette"></i> جاري التخيل والتصميم...</div>';
|
| 823 |
}
|
| 824 |
+
botContentDiv.innerHTML = htmlToRender + '<span class="genisi-cursor"></span>';
|
| 825 |
}
|
| 826 |
scrollToBottom();
|
| 827 |
}
|
| 828 |
|
| 829 |
+
const cursor = botContentDiv.querySelector('.genisi-cursor');
|
| 830 |
if (cursor) cursor.remove();
|
| 831 |
|
| 832 |
if (fullBotResponse.includes('<div style="text-align:center;') && fullBotResponse.includes('<img')) {
|
|
|
|
| 931 |
applyTheme(localStorage.getItem('genisi_theme')||'dark');
|
| 932 |
document.getElementById('lang-select').value = currentLang;
|
| 933 |
applyI18n();
|
| 934 |
+
loadSavedModel(); // 🌟 تحميل النموذج المحفوظ
|
| 935 |
+
|
| 936 |
+
// 🌟 إغلاق القائمة المنسدلة عند النقر خارجها
|
| 937 |
+
document.addEventListener('click', function(event) {
|
| 938 |
+
const selector = document.querySelector('.model-selector');
|
| 939 |
+
const dropdown = document.getElementById('model-dropdown');
|
| 940 |
+
if (!selector.contains(event.target) && dropdown.classList.contains('show')) {
|
| 941 |
+
dropdown.classList.remove('show');
|
| 942 |
+
}
|
| 943 |
+
});
|
| 944 |
</script>
|
| 945 |
</body>
|
| 946 |
</html>
|