AnesKAM commited on
Commit
389a55d
·
verified ·
1 Parent(s): d6cf69e

Update index.html

Browse files
Files changed (1) hide show
  1. 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
- /* GEMINI STREAMING EFFECT */
120
- .gemini-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; }
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({ user_id: userId, message: text, history: chat.history, files: binaryFiles }),
 
 
 
 
 
 
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="gemini-cursor"></span>';
685
  }
686
  scrollToBottom();
687
  }
688
 
689
- const cursor = botContentDiv.querySelector('.gemini-cursor');
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>