Logankunfall commited on
Commit
d57e560
·
verified ·
1 Parent(s): 327d153

Upload 10 files

Browse files
Files changed (1) hide show
  1. public/index.html +167 -17
public/index.html CHANGED
@@ -416,6 +416,79 @@
416
  visibility: visible;
417
  }
418
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
419
  /* Mobile Responsive Styles */
420
  @media (max-width: 768px) {
421
  header {
@@ -459,27 +532,26 @@
459
  order: 2;
460
  }
461
 
 
 
 
 
462
  main {
463
  grid-template-columns: 1fr;
464
  gap: 12px;
465
  padding: 12px;
 
466
  min-height: auto;
467
  }
468
 
469
- .panel {
470
- padding: 16px;
471
- border-radius: 12px;
472
- }
473
-
474
- .form-grid {
475
- grid-template-columns: 1fr;
476
- gap: 8px;
477
  }
478
 
479
- .row {
480
- flex-direction: column;
481
- align-items: stretch;
482
- gap: 8px;
483
  }
484
 
485
  .gallery {
@@ -604,6 +676,9 @@
604
  </div>
605
  </div>
606
 
 
 
 
607
  <main>
608
  <section class="panel" id="desktopPanel">
609
  <div class="group">
@@ -795,21 +870,89 @@
795
  const img = document.createElement('img');
796
  img.src = dataUrl;
797
  img.alt = params.prompt || 'image';
 
798
  const meta = document.createElement('div');
799
  meta.className = 'meta';
800
- meta.innerHTML = `
801
- <div style="font-weight: 600; margin-bottom: 4px;">${params.model}</div>
 
 
 
 
 
 
 
 
 
802
  <div style="margin-bottom: 4px;">尺寸: ${params.width}x${params.height}</div>
803
  <div style="margin-bottom: 4px;">步数: ${params.num_inference_steps} | 引导: ${params.guidance_scale}</div>
804
- <div style="margin-bottom: 6px; font-size: 12px; line-height: 1.3;">${params.prompt}</div>
805
  <div class="row">
806
- <button class="secondary" onclick="downloadImage('${filename}', '${dataUrl}')">下载</button>
807
  </div>
808
  `;
 
 
 
809
  wrap.appendChild(img);
810
  wrap.appendChild(meta);
811
  }
812
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
813
  function removeCard(wrap) {
814
  try { wrap.remove(); } catch(e) {}
815
  }
@@ -921,7 +1064,9 @@
921
  return;
922
  }
923
 
924
- const countRaw = Number(qs('#batchCount').value || 1);
 
 
925
  const count = Math.max(1, Math.min(10, Number.isFinite(countRaw) ? Math.trunc(countRaw) : 1));
926
 
927
  const headers = {
@@ -1040,6 +1185,11 @@
1040
  closeSidebar();
1041
  });
1042
 
 
 
 
 
 
1043
  // 通用事件绑定
1044
  qs('#downloadAll').addEventListener('click', () => {
1045
  qsa('#gallery img').forEach((img, i) => {
 
416
  visibility: visible;
417
  }
418
 
419
+ /* Mobile Generate Button */
420
+ .mobile-generate-btn {
421
+ position: fixed;
422
+ left: 20px;
423
+ top: 50%;
424
+ transform: translateY(-50%);
425
+ z-index: 50;
426
+ background: linear-gradient(135deg, var(--accent), var(--accent-hover));
427
+ color: white;
428
+ border: none;
429
+ border-radius: 50%;
430
+ width: 60px;
431
+ height: 60px;
432
+ font-size: 24px;
433
+ cursor: pointer;
434
+ box-shadow: var(--shadow-lg);
435
+ transition: all 0.3s ease;
436
+ display: none;
437
+ }
438
+
439
+ .mobile-generate-btn:hover {
440
+ transform: translateY(-50%) scale(1.1);
441
+ box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.2), 0 10px 10px -5px rgba(0, 0, 0, 0.1);
442
+ }
443
+
444
+ .mobile-generate-btn:active {
445
+ transform: translateY(-50%) scale(0.95);
446
+ }
447
+
448
+ /* Card Meta Expandable */
449
+ .card .meta {
450
+ padding: 16px;
451
+ border-top: 1px solid var(--border);
452
+ font-size: 13px;
453
+ color: var(--muted);
454
+ line-height: 1.5;
455
+ }
456
+
457
+ .card .meta-header {
458
+ display: flex;
459
+ justify-content: space-between;
460
+ align-items: center;
461
+ margin-bottom: 8px;
462
+ }
463
+
464
+ .card .meta-toggle {
465
+ background: none;
466
+ border: none;
467
+ color: var(--accent);
468
+ cursor: pointer;
469
+ font-size: 12px;
470
+ padding: 4px 8px;
471
+ border-radius: 4px;
472
+ transition: all 0.2s ease;
473
+ min-height: auto;
474
+ }
475
+
476
+ .card .meta-toggle:hover {
477
+ background: var(--border);
478
+ transform: none;
479
+ box-shadow: none;
480
+ }
481
+
482
+ .card .meta-content {
483
+ max-height: 0;
484
+ overflow: hidden;
485
+ transition: max-height 0.3s ease;
486
+ }
487
+
488
+ .card .meta-content.expanded {
489
+ max-height: 200px;
490
+ }
491
+
492
  /* Mobile Responsive Styles */
493
  @media (max-width: 768px) {
494
  header {
 
532
  order: 2;
533
  }
534
 
535
+ .mobile-generate-btn {
536
+ display: block;
537
+ }
538
+
539
  main {
540
  grid-template-columns: 1fr;
541
  gap: 12px;
542
  padding: 12px;
543
+ padding-left: 100px;
544
  min-height: auto;
545
  }
546
 
547
+ /* Hide desktop panel on mobile */
548
+ #desktopPanel {
549
+ display: none;
 
 
 
 
 
550
  }
551
 
552
+ .panel.results {
553
+ padding: 16px;
554
+ border-radius: 12px;
 
555
  }
556
 
557
  .gallery {
 
676
  </div>
677
  </div>
678
 
679
+ <!-- Mobile Generate Button -->
680
+ <button class="mobile-generate-btn" id="mobileGenerateBtn">✨</button>
681
+
682
  <main>
683
  <section class="panel" id="desktopPanel">
684
  <div class="group">
 
870
  const img = document.createElement('img');
871
  img.src = dataUrl;
872
  img.alt = params.prompt || 'image';
873
+
874
  const meta = document.createElement('div');
875
  meta.className = 'meta';
876
+
877
+ const metaHeader = document.createElement('div');
878
+ metaHeader.className = 'meta-header';
879
+ metaHeader.innerHTML = `
880
+ <div style="font-weight: 600;">${params.model}</div>
881
+ <button class="meta-toggle" onclick="toggleCardMeta(this)">详情</button>
882
+ `;
883
+
884
+ const metaContent = document.createElement('div');
885
+ metaContent.className = 'meta-content';
886
+ metaContent.innerHTML = `
887
  <div style="margin-bottom: 4px;">尺寸: ${params.width}x${params.height}</div>
888
  <div style="margin-bottom: 4px;">步数: ${params.num_inference_steps} | 引导: ${params.guidance_scale}</div>
889
+ <div style="margin-bottom: 8px; font-size: 12px; line-height: 1.3; word-break: break-all;">${params.prompt}</div>
890
  <div class="row">
891
+ <button class="secondary" onclick="downloadImageMobile('${filename}', '${dataUrl}')">下载</button>
892
  </div>
893
  `;
894
+
895
+ meta.appendChild(metaHeader);
896
+ meta.appendChild(metaContent);
897
  wrap.appendChild(img);
898
  wrap.appendChild(meta);
899
  }
900
 
901
+ // 切换卡片详情显示
902
+ function toggleCardMeta(button) {
903
+ const metaContent = button.parentElement.nextElementSibling;
904
+ const isExpanded = metaContent.classList.contains('expanded');
905
+
906
+ if (isExpanded) {
907
+ metaContent.classList.remove('expanded');
908
+ button.textContent = '详情';
909
+ } else {
910
+ metaContent.classList.add('expanded');
911
+ button.textContent = '收起';
912
+ }
913
+ }
914
+
915
+ // 移动端优化的下���函数
916
+ function downloadImageMobile(filename, dataUrl) {
917
+ // 检测是否为移动端
918
+ const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
919
+
920
+ if (isMobile) {
921
+ // 移动端直接触发下载
922
+ const a = document.createElement('a');
923
+ a.href = dataUrl;
924
+ a.download = filename;
925
+ a.style.display = 'none';
926
+ document.body.appendChild(a);
927
+ a.click();
928
+ document.body.removeChild(a);
929
+
930
+ // 显示提示
931
+ const toast = document.createElement('div');
932
+ toast.style.cssText = `
933
+ position: fixed;
934
+ top: 50%;
935
+ left: 50%;
936
+ transform: translate(-50%, -50%);
937
+ background: var(--accent);
938
+ color: white;
939
+ padding: 12px 20px;
940
+ border-radius: 8px;
941
+ z-index: 1000;
942
+ font-size: 14px;
943
+ `;
944
+ toast.textContent = '图片已开始下载';
945
+ document.body.appendChild(toast);
946
+
947
+ setTimeout(() => {
948
+ document.body.removeChild(toast);
949
+ }, 2000);
950
+ } else {
951
+ // 桌面端使用原有逻辑
952
+ downloadImage(filename, dataUrl);
953
+ }
954
+ }
955
+
956
  function removeCard(wrap) {
957
  try { wrap.remove(); } catch(e) {}
958
  }
 
1064
  return;
1065
  }
1066
 
1067
+ const isMobile = window.innerWidth <= 768;
1068
+ const batchElement = qs(isMobile ? '#batchCountMobile' : '#batchCount');
1069
+ const countRaw = Number(batchElement.value || 1);
1070
  const count = Math.max(1, Math.min(10, Number.isFinite(countRaw) ? Math.trunc(countRaw) : 1));
1071
 
1072
  const headers = {
 
1185
  closeSidebar();
1186
  });
1187
 
1188
+ // 移动端浮动生成按钮
1189
+ qs('#mobileGenerateBtn').addEventListener('click', () => {
1190
+ generate();
1191
+ });
1192
+
1193
  // 通用事件绑定
1194
  qs('#downloadAll').addEventListener('click', () => {
1195
  qsa('#gallery img').forEach((img, i) => {