ixingchen commited on
Commit
7199e09
·
verified ·
1 Parent(s): eb052f2

🐳 15/03 - 13:22 - 内容必须是   <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>ChatGPT 批量注册 — 管理面板</title> <met

Browse files
Files changed (2) hide show
  1. index.html +133 -90
  2. style.css +857 -15
index.html CHANGED
@@ -290,102 +290,124 @@
290
  </head>
291
  <body class="antialiased">
292
  <!-- Navigation -->
293
- <nav class="glass-panel sticky top-0 z-50">
294
- <div class="container mx-auto px-4 py-4">
295
- <div class="flex items-center justify-between">
296
- <div class="flex items-center space-x-4">
297
- <div class="w-10 h-10 bg-gradient-to-br from-accent-500 to-primary-500 rounded-xl flex items-center justify-center">
298
- <i class="fas fa-robot text-white text-xl"></i>
299
- </div>
300
- <div>
301
- <h1 class="text-2xl font-bold">GPT Register <span class="gradient-text">Pro</span></h1>
302
- <p class="text-sm text-gray-400">智能批量注册管理系统</p>
303
- </div>
304
  </div>
305
-
306
- <div class="hidden md:flex items-center space-x-6">
307
- <div class="flex items-center space-x-2 stat-badge">
308
- <span class="status-indicator status-online"></span>
309
- <span>系统运行中</span>
310
- </div>
311
- <div class="flex items-center space-x-2">
312
- <i class="fas fa-user-circle text-gray-400"></i>
313
- <span class="text-gray-300">管理员</span>
314
- </div>
315
- <button class="btn-secondary">
316
- <i class="fas fa-cog mr-2"></i>设置
317
- </button>
318
  </div>
319
-
320
- <button id="mobileMenuBtn" class="md:hidden text-gray-400 hover:text-white">
321
- <i class="fas fa-bars text-xl"></i>
322
- </button>
323
  </div>
324
  </div>
 
 
 
 
 
325
  </nav>
326
 
327
  <!-- Main Content -->
328
  <main class="container mx-auto px-4 py-8">
329
- <!-- Stats Overview -->
330
  <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-8">
331
- <div class="stat-card">
332
- <div class="flex items-center justify-between">
333
  <div>
334
- <p class="text-gray-400 text-sm">今日注册</p>
335
- <h3 class="text-3xl font-bold mt-2">1,248</h3>
 
 
 
 
 
 
336
  </div>
337
- <div class="w-12 h-12 bg-gradient-to-br from-green-500/20 to-green-600/20 rounded-full flex items-center justify-center">
338
- <i class="fas fa-user-plus text-green-400 text-xl"></i>
 
 
 
 
 
339
  </div>
340
  </div>
341
- <div class="mt-4">
342
- <p class="text-sm text-green-400"><i class="fas fa-arrow-up mr-1"></i> +12% 较昨日</p>
343
- </div>
344
  </div>
345
 
346
- <div class="stat-card">
347
- <div class="flex items-center justify-between">
348
  <div>
349
- <p class="text-gray-400 text-sm">活跃账号</p>
350
- <h3 class="text-3xl font-bold mt-2">8,432</h3>
 
 
 
 
 
 
 
351
  </div>
352
- <div class="w-12 h-12 bg-gradient-to-br from-blue-500/20 to-blue-600/20 rounded-full flex items-center justify-center">
353
- <i class="fas fa-users text-blue-400 text-xl"></i>
 
 
 
 
 
354
  </div>
355
  </div>
356
- <div class="mt-4">
357
- <p class="text-sm text-blue-400"><i class="fas fa-check-circle mr-1"></i> 98% 活跃率</p>
358
- </div>
359
  </div>
360
 
361
- <div class="stat-card">
362
- <div class="flex items-center justify-between">
363
  <div>
364
- <p class="text-gray-400 text-sm">成功率</p>
365
- <h3 class="text-3xl font-bold mt-2">94.7%</h3>
 
 
 
 
 
 
 
366
  </div>
367
- <div class="w-12 h-12 bg-gradient-to-br from-purple-500/20 to-purple-600/20 rounded-full flex items-center justify-center">
368
- <i class="fas fa-chart-line text-purple-400 text-xl"></i>
 
 
 
 
369
  </div>
370
  </div>
371
- <div class="mt-4">
372
- <p class="text-sm text-purple-400"><i class="fas fa-trending-up mr-1"></i> +2.3% 提升</p>
373
- </div>
374
  </div>
375
 
376
- <div class="stat-card">
377
- <div class="flex items-center justify-between">
378
  <div>
379
- <p class="text-gray-400 text-sm">队列任务</p>
380
- <h3 class="text-3xl font-bold mt-2">156</h3>
 
 
 
 
 
 
 
 
381
  </div>
382
- <div class="w-12 h-12 bg-gradient-to-br from-orange-500/20 to-orange-600/20 rounded-full flex items-center justify-center">
383
- <i class="fas fa-tasks text-orange-400 text-xl"></i>
 
 
 
384
  </div>
385
  </div>
386
- <div class="mt-4">
387
- <p class="text-sm text-orange-400"><i class="fas fa-clock mr-1"></i> 运行中</p>
388
- </div>
389
  </div>
390
  </div>
391
 
@@ -393,24 +415,29 @@
393
  <div class="grid grid-cols-1 lg:grid-cols-3 gap-8">
394
  <!-- Left Column -->
395
  <div class="lg:col-span-2 space-y-8">
396
- <!-- Batch Registration Panel -->
397
- <div class="dashboard-card p-6">
398
- <div class="flex items-center justify-between mb-6">
399
- <h2 class="text-xl font-bold">批量注册控制台</h2>
400
- <div class="flex items-center space-x-2">
401
- <span class="status-indicator status-online"></span>
402
- <span class="text-sm text-green-400">就绪</span>
 
 
 
 
 
403
  </div>
404
  </div>
405
 
406
- <div class="grid grid-cols-1 md:grid-cols-3 gap-4 mb-6">
407
  <div>
408
- <label class="block text-gray-400 text-sm mb-2">注册数量</label>
409
- <input type="number" min="1" max="1000" value="50" class="input-field w-full">
410
  </div>
411
  <div>
412
- <label class="block text-gray-400 text-sm mb-2">并发线程</label>
413
- <select class="input-field w-full">
414
  <option>1 线程</option>
415
  <option selected>5 线程</option>
416
  <option>10 线程</option>
@@ -418,8 +445,8 @@
418
  </select>
419
  </div>
420
  <div>
421
- <label class="block text-gray-400 text-sm mb-2">代理模式</label>
422
- <select class="input-field w-full">
423
  <option selected>智能轮换</option>
424
  <option>固定代理</option>
425
  <option>无代理</option>
@@ -427,21 +454,37 @@
427
  </div>
428
  </div>
429
 
430
- <div class="flex items-center justify-between">
431
- <div class="flex items-center space-x-4">
432
- <button class="btn-primary">
433
- <i class="fas fa-play mr-2"></i>开始注册
 
 
 
434
  </button>
435
- <button class="btn-secondary">
436
- <i class="fas fa-pause mr-2"></i>暂停
 
 
 
 
437
  </button>
438
  </div>
439
- <div class="flex items-center space-x-4">
440
- <button class="btn-secondary">
441
- <i class="fas fa-download mr-2"></i>导出
 
 
 
 
 
442
  </button>
443
- <button class="btn-secondary">
444
- <i class="fas fa-cog mr-2"></i>高级设置
 
 
 
 
445
  </button>
446
  </div>
447
  </div>
 
290
  </head>
291
  <body class="antialiased">
292
  <!-- Navigation -->
293
+ <!-- 豪华导航栏 -->
294
+ <nav class="header">
295
+ <div class="header-brand">
296
+ <div style="display: flex; align-items: center; gap: 12px;">
297
+ <div style="width: 40px; height: 40px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border-radius: 12px; display: flex; align-items: center; justify-content: center;">
298
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="2">
299
+ <path d="M20 21v-2a4 4 0 0 0-4-4H8a4 4 0 0 0-4 4v2"></path>
300
+ <circle cx="12" cy="7" r="4"></circle>
301
+ </svg>
 
 
302
  </div>
303
+ <div>
304
+ <h1 style="font-size: 1.5rem; margin-bottom: 2px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text;">GPT Register Pro</h1>
305
+ <p style="font-size: 0.875rem; color: var(--text-muted);">智能批量注册管理系统</p>
 
 
 
 
 
 
 
 
 
 
306
  </div>
 
 
 
 
307
  </div>
308
  </div>
309
+
310
+ <div class="status-pill" id="statusPill">
311
+ <div class="dot"></div>
312
+ <span id="statusTxt">系统就绪</span>
313
+ </div>
314
  </nav>
315
 
316
  <!-- Main Content -->
317
  <main class="container mx-auto px-4 py-8">
318
+ <!-- 豪华统计卡片 -->
319
  <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-8">
320
+ <div class="card">
321
+ <div style="display: flex; align-items: flex-start; justify-content: space-between;">
322
  <div>
323
+ <p style="color: var(--text-muted); font-size: 0.875rem; margin-bottom: 0.5rem;">今日注册</p>
324
+ <h3 style="font-size: 2rem; font-weight: 700; margin-bottom: 0.5rem; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text;">1,248</h3>
325
+ <div style="display: flex; align-items: center; gap: 4px;">
326
+ <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="#43e97b" stroke-width="2">
327
+ <polyline points="18 15 12 9 6 15"></polyline>
328
+ </svg>
329
+ <span style="color: var(--text-success); font-size: 0.875rem; font-weight: 500;">+12% 较昨日</span>
330
+ </div>
331
  </div>
332
+ <div style="width: 48px; height: 48px; background: linear-gradient(135deg, rgba(67, 233, 123, 0.2) 0%, rgba(56, 249, 215, 0.2) 100%); border-radius: 12px; display: flex; align-items: center; justify-content: center;">
333
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="#43e97b" stroke-width="2">
334
+ <path d="M16 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"></path>
335
+ <circle cx="8.5" cy="7" r="4"></circle>
336
+ <line x1="20" y1="8" x2="20" y2="14"></line>
337
+ <line x1="23" y1="11" x2="17" y2="11"></line>
338
+ </svg>
339
  </div>
340
  </div>
 
 
 
341
  </div>
342
 
343
+ <div class="card">
344
+ <div style="display: flex; align-items: flex-start; justify-content: space-between;">
345
  <div>
346
+ <p style="color: var(--text-muted); font-size: 0.875rem; margin-bottom: 0.5rem;">活跃账号</p>
347
+ <h3 style="font-size: 2rem; font-weight: 700; margin-bottom: 0.5rem; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text;">8,432</h3>
348
+ <div style="display: flex; align-items: center; gap: 4px;">
349
+ <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="#38f9d7" stroke-width="2">
350
+ <circle cx="12" cy="12" r="10"></circle>
351
+ <polyline points="12 6 12 12 16 14"></polyline>
352
+ </svg>
353
+ <span style="color: var(--text-success); font-size: 0.875rem; font-weight: 500;">98% 活跃率</span>
354
+ </div>
355
  </div>
356
+ <div style="width: 48px; height: 48px; background: linear-gradient(135deg, rgba(67, 233, 123, 0.2) 0%, rgba(56, 249, 215, 0.2) 100%); border-radius: 12px; display: flex; align-items: center; justify-content: center;">
357
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="#38f9d7" stroke-width="2">
358
+ <path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"></path>
359
+ <circle cx="9" cy="7" r="4"></circle>
360
+ <path d="M23 21v-2a4 4 0 0 0-3-3.87"></path>
361
+ <path d="M16 3.13a4 4 0 0 1 0 7.75"></path>
362
+ </svg>
363
  </div>
364
  </div>
 
 
 
365
  </div>
366
 
367
+ <div class="card">
368
+ <div style="display: flex; align-items: flex-start; justify-content: space-between;">
369
  <div>
370
+ <p style="color: var(--text-muted); font-size: 0.875rem; margin-bottom: 0.5rem;">成功率</p>
371
+ <h3 style="font-size: 2rem; font-weight: 700; margin-bottom: 0.5rem; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text;">94.7%</h3>
372
+ <div style="display: flex; align-items: center; gap: 4px;">
373
+ <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="#667eea" stroke-width="2">
374
+ <polyline points="23 6 13.5 15.5 8.5 10.5 1 18"></polyline>
375
+ <polyline points="17 6 23 6 23 12"></polyline>
376
+ </svg>
377
+ <span style="color: #667eea; font-size: 0.875rem; font-weight: 500;">+2.3% 提升</span>
378
+ </div>
379
  </div>
380
+ <div style="width: 48px; height: 48px; background: linear-gradient(135deg, rgba(102, 126, 234, 0.2) 0%, rgba(118, 75, 162, 0.2) 100%); border-radius: 12px; display: flex; align-items: center; justify-content: center;">
381
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="#667eea" stroke-width="2">
382
+ <line x1="18" y1="20" x2="18" y2="10"></line>
383
+ <line x1="12" y1="20" x2="12" y2="4"></line>
384
+ <line x1="6" y1="20" x2="6" y2="14"></line>
385
+ </svg>
386
  </div>
387
  </div>
 
 
 
388
  </div>
389
 
390
+ <div class="card">
391
+ <div style="display: flex; align-items: flex-start; justify-content: space-between;">
392
  <div>
393
+ <p style="color: var(--text-muted); font-size: 0.875rem; margin-bottom: 0.5rem;">队列任务</p>
394
+ <h3 style="font-size: 2rem; font-weight: 700; margin-bottom: 0.5rem; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text;">156</h3>
395
+ <div style="display: flex; align-items: center; gap: 4px;">
396
+ <svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="#f093fb" stroke-width="2">
397
+ <circle cx="12" cy="12" r="10"></circle>
398
+ <line x1="12" y1="6" x2="12" y2="12"></line>
399
+ <line x1="12" y1="12" x2="16" y2="12"></line>
400
+ </svg>
401
+ <span style="color: #f093fb; font-size: 0.875rem; font-weight: 500;">运行中</span>
402
+ </div>
403
  </div>
404
+ <div style="width: 48px; height: 48px; background: linear-gradient(135deg, rgba(240, 147, 251, 0.2) 0%, rgba(245, 87, 108, 0.2) 100%); border-radius: 12px; display: flex; align-items: center; justify-content: center;">
405
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="#f093fb" stroke-width="2">
406
+ <path d="M22 5.08V12a10 10 0 1 1-5.93-9.14"></path>
407
+ <polyline points="22 6 12 13 2 6"></polyline>
408
+ </svg>
409
  </div>
410
  </div>
 
 
 
411
  </div>
412
  </div>
413
 
 
415
  <div class="grid grid-cols-1 lg:grid-cols-3 gap-8">
416
  <!-- Left Column -->
417
  <div class="lg:col-span-2 space-y-8">
418
+ <!-- 批量注册控制台 - 豪华版 -->
419
+ <div class="card">
420
+ <div style="display: flex; align-items: center; justify-content: space-between; margin-bottom: 1.5rem; padding-bottom: 1rem; border-bottom: 1px solid var(--border-color);">
421
+ <h2 style="font-size: 1.25rem; font-weight: 600; display: flex; align-items: center; gap: 0.5rem;">
422
+ <svg width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="#667eea" stroke-width="2">
423
+ <polygon points="5 3 19 12 5 21 5 3"></polygon>
424
+ </svg>
425
+ 批量注册控制台
426
+ </h2>
427
+ <div style="display: flex; align-items: center; gap: 0.5rem;">
428
+ <div style="width: 8px; height: 8px; background: var(--text-success); border-radius: 50%; animation: pulse 2s infinite;"></div>
429
+ <span style="font-size: 0.875rem; color: var(--text-success); font-weight: 500;">就绪</span>
430
  </div>
431
  </div>
432
 
433
+ <div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 1rem; margin-bottom: 1.5rem;">
434
  <div>
435
+ <label style="display: block; color: var(--text-muted); font-size: 0.875rem; margin-bottom: 0.5rem;">注册数量</label>
436
+ <input type="number" min="1" max="1000" value="50" style="width: 100%; padding: 0.75rem 1rem; background: var(--bg-input); border: 1px solid var(--border-color); border-radius: var(--radius-md); color: var(--text-primary);">
437
  </div>
438
  <div>
439
+ <label style="display: block; color: var(--text-muted); font-size: 0.875rem; margin-bottom: 0.5rem;">并发线程</label>
440
+ <select style="width: 100%; padding: 0.75rem 1rem; background: var(--bg-input); border: 1px solid var(--border-color); border-radius: var(--radius-md); color: var(--text-primary); appearance: none; background-image: url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"%238a8ab3\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\"></path></svg>'); background-repeat: no-repeat; background-position: right 1rem center; background-size: 1rem;">
441
  <option>1 线程</option>
442
  <option selected>5 线程</option>
443
  <option>10 线程</option>
 
445
  </select>
446
  </div>
447
  <div>
448
+ <label style="display: block; color: var(--text-muted); font-size: 0.875rem; margin-bottom: 0.5rem;">代理模式</label>
449
+ <select style="width: 100%; padding: 0.75rem 1rem; background: var(--bg-input); border: 1px solid var(--border-color); border-radius: var(--radius-md); color: var(--text-primary); appearance: none; background-image: url('data:image/svg+xml,<svg xmlns=\"http://www.w3.org/2000/svg\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"%238a8ab3\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\"></path></svg>'); background-repeat: no-repeat; background-position: right 1rem center; background-size: 1rem;">
450
  <option selected>智能轮换</option>
451
  <option>固定代理</option>
452
  <option>无代理</option>
 
454
  </div>
455
  </div>
456
 
457
+ <div style="display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 1rem;">
458
+ <div style="display: flex; gap: 0.75rem;">
459
+ <button style="display: inline-flex; align-items: center; gap: 0.5rem; padding: 0.75rem 1.5rem; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; border: none; border-radius: var(--radius-lg); font-weight: 600; cursor: pointer; transition: var(--transition-normal);">
460
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
461
+ <polygon points="5 3 19 12 5 21 5 3"></polygon>
462
+ </svg>
463
+ 开始注册
464
  </button>
465
+ <button style="display: inline-flex; align-items: center; gap: 0.5rem; padding: 0.75rem 1.5rem; background: var(--bg-input); color: var(--text-secondary); border: 1px solid var(--border-color); border-radius: var(--radius-lg); font-weight: 600; cursor: pointer; transition: var(--transition-normal);">
466
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
467
+ <line x1="6" y1="9" x2="6" y2="15"></line>
468
+ <line x1="18" y1="9" x2="18" y2="15"></line>
469
+ </svg>
470
+ 暂停
471
  </button>
472
  </div>
473
+ <div style="display: flex; gap: 0.75rem;">
474
+ <button style="display: inline-flex; align-items: center; gap: 0.5rem; padding: 0.75rem 1.5rem; background: var(--bg-input); color: var(--text-secondary); border: 1px solid var(--border-color); border-radius: var(--radius-lg); font-weight: 600; cursor: pointer; transition: var(--transition-normal);">
475
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
476
+ <path d="M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4"></path>
477
+ <polyline points="7 10 12 15 17 10"></polyline>
478
+ <line x1="12" y1="15" x2="12" y2="3"></line>
479
+ </svg>
480
+ 导出
481
  </button>
482
+ <button style="display: inline-flex; align-items: center; gap: 0.5rem; padding: 0.75rem 1.5rem; background: var(--bg-input); color: var(--text-secondary); border: 1px solid var(--border-color); border-radius: var(--radius-lg); font-weight: 600; cursor: pointer; transition: var(--transition-normal);">
483
+ <svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
484
+ <circle cx="12" cy="12" r="3"></circle>
485
+ <path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 0 1-2 2 2 2 0 0 1-2-2v-.09A1.65 1.65 0 0 0 9 19.4a1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 0 1-2-2 2 2 0 0 1 2-2h.09A1.65 1.65 0 0 0 4.6 9a1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 0 1 0-2.83 2 2 0 0 1 2.83 0l.06.06a1.65 1.65 0 0 0 1.82.33H9a1.65 1.65 0 0 0 1-1.51V3a2 2 0 0 1 2-2 2 2 0 0 1 2 2v.09a1.65 1.65 0 0 0 1 1.51 1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 0 1 2.83 0 2 2 0 0 1 0 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82V9a1.65 1.65 0 0 0 1.51 1H21a2 2 0 0 1 2 2 2 2 0 0 1-2 2h-.09a1.65 1.65 0 0 0-1.51 1z"></path>
486
+ </svg>
487
+ 高级设置
488
  </button>
489
  </div>
490
  </div>
style.css CHANGED
@@ -1,28 +1,870 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  body {
2
- padding: 2rem;
3
- font-family: -apple-system, BlinkMacSystemFont, "Arial", sans-serif;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4
  }
5
 
6
  h1 {
7
- font-size: 16px;
8
- margin-top: 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  }
10
 
11
  p {
12
- color: rgb(107, 114, 128);
13
- font-size: 15px;
14
- margin-bottom: 10px;
15
- margin-top: 5px;
16
  }
17
 
 
18
  .card {
19
- max-width: 620px;
20
- margin: 0 auto;
21
- padding: 16px;
22
- border: 1px solid lightgray;
23
- border-radius: 16px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
  }
25
 
26
- .card p:last-child {
27
- margin-bottom: 0;
 
 
 
 
 
 
 
 
28
  }
 
1
+ /* ===== 高端GPT管理面板样式 ===== */
2
+ :root {
3
+ /* 品牌色系 - 紫色渐变主题 */
4
+ --primary-gradient: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
5
+ --secondary-gradient: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
6
+ --success-gradient: linear-gradient(135deg, #43e97b 0%, #38f9d7 100%);
7
+ --warning-gradient: linear-gradient(135deg, #fa709a 0%, #fee140 100%);
8
+ --danger-gradient: linear-gradient(135deg, #ff0844 0%, #ffb199 100%);
9
+
10
+ /* 背景色系 - 深色豪华主题 */
11
+ --bg-primary: #0f0c29;
12
+ --bg-secondary: #1a1a2e;
13
+ --bg-card: #16213e;
14
+ --bg-card-hover: #1e2a52;
15
+ --bg-input: rgba(255, 255, 255, 0.05);
16
+ --bg-glass: rgba(255, 255, 255, 0.03);
17
+
18
+ /* 文字颜色 */
19
+ --text-primary: #ffffff;
20
+ --text-secondary: #b8b8d1;
21
+ --text-muted: #8a8ab3;
22
+ --text-success: #38f9d7;
23
+ --text-warning: #fee140;
24
+ --text-danger: #ffb199;
25
+
26
+ /* 边框与阴影 */
27
+ --border-color: rgba(255, 255, 255, 0.1);
28
+ --border-hover: rgba(255, 255, 255, 0.2);
29
+ --shadow-sm: 0 4px 6px rgba(0, 0, 0, 0.1);
30
+ --shadow-md: 0 10px 25px rgba(0, 0, 0, 0.2);
31
+ --shadow-lg: 0 20px 50px rgba(0, 0, 0, 0.3);
32
+ --shadow-glow: 0 0 20px rgba(102, 126, 234, 0.4);
33
+
34
+ /* 过渡动画 */
35
+ --transition-fast: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
36
+ --transition-normal: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
37
+ --transition-slow: all 0.5s cubic-bezier(0.4, 0, 0.2, 1);
38
+
39
+ /* 边框圆角 */
40
+ --radius-sm: 8px;
41
+ --radius-md: 12px;
42
+ --radius-lg: 16px;
43
+ --radius-xl: 20px;
44
+ --radius-full: 9999px;
45
+ }
46
+
47
+ /* ===== 全局样式重置 ===== */
48
+ * {
49
+ margin: 0;
50
+ padding: 0;
51
+ box-sizing: border-box;
52
+ }
53
+
54
  body {
55
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
56
+ background: var(--bg-primary);
57
+ color: var(--text-primary);
58
+ min-height: 100vh;
59
+ overflow-x: hidden;
60
+ position: relative;
61
+ }
62
+
63
+ body::before {
64
+ content: '';
65
+ position: fixed;
66
+ top: 0;
67
+ left: 0;
68
+ width: 100%;
69
+ height: 100%;
70
+ background:
71
+ radial-gradient(circle at 20% 50%, rgba(102, 126, 234, 0.15) 0%, transparent 50%),
72
+ radial-gradient(circle at 80% 20%, rgba(118, 75, 162, 0.1) 0%, transparent 50%),
73
+ radial-gradient(circle at 40% 80%, rgba(240, 147, 251, 0.08) 0%, transparent 50%);
74
+ z-index: -1;
75
+ pointer-events: none;
76
+ }
77
+
78
+ /* ===== 滚动条美化 ===== */
79
+ ::-webkit-scrollbar {
80
+ width: 10px;
81
+ height: 10px;
82
+ }
83
+
84
+ ::-webkit-scrollbar-track {
85
+ background: var(--bg-secondary);
86
+ border-radius: var(--radius-full);
87
+ }
88
+
89
+ ::-webkit-scrollbar-thumb {
90
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
91
+ border-radius: var(--radius-full);
92
+ transition: var(--transition-fast);
93
+ }
94
+
95
+ ::-webkit-scrollbar-thumb:hover {
96
+ background: linear-gradient(135deg, #764ba2 0%, #667eea 100%);
97
+ }
98
+
99
+ /* ===== 基础组件样式 ===== */
100
+ h1, h2, h3, h4, h5, h6 {
101
+ font-weight: 700;
102
+ line-height: 1.2;
103
+ letter-spacing: -0.02em;
104
  }
105
 
106
  h1 {
107
+ font-size: 2.5rem;
108
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
109
+ -webkit-background-clip: text;
110
+ -webkit-text-fill-color: transparent;
111
+ background-clip: text;
112
+ margin-bottom: 1rem;
113
+ }
114
+
115
+ h2 {
116
+ font-size: 1.75rem;
117
+ margin-bottom: 1.5rem;
118
+ color: var(--text-primary);
119
+ }
120
+
121
+ h3 {
122
+ font-size: 1.25rem;
123
+ margin-bottom: 1rem;
124
+ color: var(--text-primary);
125
  }
126
 
127
  p {
128
+ color: var(--text-secondary);
129
+ line-height: 1.6;
130
+ margin-bottom: 1rem;
 
131
  }
132
 
133
+ /* ===== 卡片组件 ===== */
134
  .card {
135
+ background: var(--bg-card);
136
+ border: 1px solid var(--border-color);
137
+ border-radius: var(--radius-xl);
138
+ padding: 1.5rem;
139
+ box-shadow: var(--shadow-md);
140
+ transition: var(--transition-normal);
141
+ position: relative;
142
+ overflow: hidden;
143
+ }
144
+
145
+ .card::before {
146
+ content: '';
147
+ position: absolute;
148
+ top: 0;
149
+ left: 0;
150
+ width: 100%;
151
+ height: 4px;
152
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
153
+ opacity: 0;
154
+ transition: var(--transition-normal);
155
+ }
156
+
157
+ .card:hover {
158
+ transform: translateY(-4px);
159
+ box-shadow: var(--shadow-lg);
160
+ border-color: var(--border-hover);
161
+ background: var(--bg-card-hover);
162
+ }
163
+
164
+ .card:hover::before {
165
+ opacity: 1;
166
+ }
167
+
168
+ .card-head {
169
+ display: flex;
170
+ justify-content: space-between;
171
+ align-items: center;
172
+ padding-bottom: 1rem;
173
+ margin-bottom: 1rem;
174
+ border-bottom: 1px solid var(--border-color);
175
+ cursor: pointer;
176
+ transition: var(--transition-fast);
177
+ }
178
+
179
+ .card-head:hover {
180
+ color: var(--text-primary);
181
+ }
182
+
183
+ .card-head .title {
184
+ font-size: 1.125rem;
185
+ font-weight: 600;
186
+ color: var(--text-primary);
187
+ display: flex;
188
+ align-items: center;
189
+ gap: 0.5rem;
190
+ }
191
+
192
+ .card-head .chevron {
193
+ transition: var(--transition-fast);
194
+ color: var(--text-muted);
195
+ }
196
+
197
+ .card-head.collapsed .chevron {
198
+ transform: rotate(-90deg);
199
+ }
200
+
201
+ .card-body {
202
+ transition: var(--transition-normal);
203
+ }
204
+
205
+ .card-body.hidden {
206
+ display: none;
207
+ }
208
+
209
+ /* ===== 按钮样式 ===== */
210
+ .btn {
211
+ display: inline-flex;
212
+ align-items: center;
213
+ justify-content: center;
214
+ gap: 0.5rem;
215
+ padding: 0.75rem 1.5rem;
216
+ border-radius: var(--radius-lg);
217
+ font-weight: 600;
218
+ font-size: 0.875rem;
219
+ text-decoration: none;
220
+ border: none;
221
+ cursor: pointer;
222
+ transition: var(--transition-normal);
223
+ position: relative;
224
+ overflow: hidden;
225
+ z-index: 1;
226
+ }
227
+
228
+ .btn::before {
229
+ content: '';
230
+ position: absolute;
231
+ top: 0;
232
+ left: 0;
233
+ width: 100%;
234
+ height: 100%;
235
+ background: linear-gradient(135deg, rgba(255, 255, 255, 0.1) 0%, rgba(255, 255, 255, 0) 100%);
236
+ opacity: 0;
237
+ transition: var(--transition-fast);
238
+ z-index: -1;
239
+ }
240
+
241
+ .btn:hover::before {
242
+ opacity: 1;
243
+ }
244
+
245
+ .btn:hover {
246
+ transform: translateY(-2px);
247
+ box-shadow: var(--shadow-md);
248
+ }
249
+
250
+ .btn:active {
251
+ transform: translateY(0);
252
+ }
253
+
254
+ .btn-blue {
255
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
256
+ color: white;
257
+ }
258
+
259
+ .btn-green {
260
+ background: linear-gradient(135deg, #43e97b 0%, #38f9d7 100%);
261
+ color: white;
262
+ }
263
+
264
+ .btn-red {
265
+ background: linear-gradient(135deg, #ff0844 0%, #ffb199 100%);
266
+ color: white;
267
+ }
268
+
269
+ .btn-gray {
270
+ background: var(--bg-input);
271
+ color: var(--text-secondary);
272
+ border: 1px solid var(--border-color);
273
+ }
274
+
275
+ .btn-gray:hover {
276
+ background: var(--bg-card-hover);
277
+ color: var(--text-primary);
278
+ border-color: var(--border-hover);
279
+ }
280
+
281
+ .btn-ghost {
282
+ background: transparent;
283
+ color: var(--text-secondary);
284
+ border: 1px solid var(--border-color);
285
+ }
286
+
287
+ .btn-ghost:hover {
288
+ background: rgba(255, 255, 255, 0.05);
289
+ color: var(--text-primary);
290
+ border-color: var(--border-hover);
291
+ }
292
+
293
+ .btn-ghost-danger {
294
+ background: transparent;
295
+ color: var(--text-danger);
296
+ border: 1px solid rgba(255, 177, 153, 0.3);
297
+ }
298
+
299
+ .btn-ghost-danger:hover {
300
+ background: rgba(255, 177, 153, 0.1);
301
+ color: var(--text-danger);
302
+ border-color: rgba(255, 177, 153, 0.5);
303
+ }
304
+
305
+ .icon-btn {
306
+ width: 2rem;
307
+ height: 2rem;
308
+ display: inline-flex;
309
+ align-items: center;
310
+ justify-content: center;
311
+ border-radius: var(--radius-md);
312
+ background: transparent;
313
+ border: none;
314
+ color: var(--text-muted);
315
+ cursor: pointer;
316
+ transition: var(--transition-fast);
317
+ }
318
+
319
+ .icon-btn:hover {
320
+ background: rgba(255, 255, 255, 0.05);
321
+ color: var(--text-primary);
322
+ }
323
+
324
+ .icon-btn.danger:hover {
325
+ background: rgba(255, 177, 153, 0.1);
326
+ color: var(--text-danger);
327
+ }
328
+
329
+ /* ===== 表单元素 ===== */
330
+ .form-row {
331
+ margin-bottom: 1rem;
332
+ }
333
+
334
+ .form-row label {
335
+ display: block;
336
+ margin-bottom: 0.5rem;
337
+ color: var(--text-secondary);
338
+ font-size: 0.875rem;
339
+ font-weight: 500;
340
+ }
341
+
342
+ .inp {
343
+ width: 100%;
344
+ padding: 0.75rem 1rem;
345
+ background: var(--bg-input);
346
+ border: 1px solid var(--border-color);
347
+ border-radius: var(--radius-md);
348
+ color: var(--text-primary);
349
+ font-family: inherit;
350
+ font-size: 0.875rem;
351
+ transition: var(--transition-fast);
352
+ }
353
+
354
+ .inp:focus {
355
+ outline: none;
356
+ border-color: #667eea;
357
+ box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1);
358
+ background: rgba(255, 255, 255, 0.07);
359
+ }
360
+
361
+ .inp::placeholder {
362
+ color: var(--text-muted);
363
+ }
364
+
365
+ textarea.inp {
366
+ min-height: 80px;
367
+ resize: vertical;
368
+ }
369
+
370
+ select.inp {
371
+ appearance: none;
372
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='%238a8ab3'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M19 9l-7 7-7-7'%3E%3C/path%3E%3C/svg%3E");
373
+ background-repeat: no-repeat;
374
+ background-position: right 1rem center;
375
+ background-size: 1rem;
376
+ padding-right: 2.5rem;
377
+ }
378
+
379
+ .chk {
380
+ width: 1.125rem;
381
+ height: 1.125rem;
382
+ border-radius: var(--radius-sm);
383
+ border: 2px solid var(--border-color);
384
+ background: var(--bg-input);
385
+ appearance: none;
386
+ cursor: pointer;
387
+ position: relative;
388
+ transition: var(--transition-fast);
389
+ }
390
+
391
+ .chk:checked {
392
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
393
+ border-color: transparent;
394
+ }
395
+
396
+ .chk:checked::after {
397
+ content: '';
398
+ position: absolute;
399
+ top: 50%;
400
+ left: 50%;
401
+ transform: translate(-50%, -50%);
402
+ width: 0.5rem;
403
+ height: 0.5rem;
404
+ background: white;
405
+ border-radius: 2px;
406
+ }
407
+
408
+ /* ===== 切换开关 ===== */
409
+ .toggle-wrap {
410
+ display: flex;
411
+ justify-content: space-between;
412
+ align-items: center;
413
+ margin-bottom: 1rem;
414
+ }
415
+
416
+ .toggle {
417
+ position: relative;
418
+ display: inline-block;
419
+ width: 3rem;
420
+ height: 1.5rem;
421
+ }
422
+
423
+ .toggle input {
424
+ opacity: 0;
425
+ width: 0;
426
+ height: 0;
427
+ }
428
+
429
+ .toggle .track {
430
+ position: absolute;
431
+ cursor: pointer;
432
+ top: 0;
433
+ left: 0;
434
+ right: 0;
435
+ bottom: 0;
436
+ background: var(--bg-input);
437
+ border: 1px solid var(--border-color);
438
+ border-radius: var(--radius-full);
439
+ transition: var(--transition-fast);
440
+ }
441
+
442
+ .toggle .track::before {
443
+ content: '';
444
+ position: absolute;
445
+ height: 1rem;
446
+ width: 1rem;
447
+ left: 0.25rem;
448
+ bottom: 0.25rem;
449
+ background: white;
450
+ border-radius: 50%;
451
+ transition: var(--transition-fast);
452
+ }
453
+
454
+ .toggle input:checked + .track {
455
+ background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
456
+ border-color: transparent;
457
+ }
458
+
459
+ .toggle input:checked + .track::before {
460
+ transform: translateX(1.5rem);
461
+ }
462
+
463
+ /* ===== 标签与徽章 ===== */
464
+ .tag {
465
+ display: inline-block;
466
+ padding: 0.25rem 0.75rem;
467
+ border-radius: var(--radius-full);
468
+ font-size: 0.75rem;
469
+ font-weight: 600;
470
+ letter-spacing: 0.02em;
471
+ }
472
+
473
+ .tag.ok {
474
+ background: linear-gradient(135deg, rgba(67, 233, 123, 0.2) 0%, rgba(56, 249, 215, 0.2) 100%);
475
+ color: var(--text-success);
476
+ border: 1px solid rgba(67, 233, 123, 0.3);
477
+ }
478
+
479
+ .tag.err {
480
+ background: linear-gradient(135deg, rgba(255, 8, 68, 0.2) 0%, rgba(255, 177, 153, 0.2) 100%);
481
+ color: var(--text-danger);
482
+ border: 1px solid rgba(255, 8, 68, 0.3);
483
+ }
484
+
485
+ /* ===== 团队卡片 ===== */
486
+ .team-card {
487
+ background: var(--bg-input);
488
+ border: 1px solid var(--border-color);
489
+ border-radius: var(--radius-lg);
490
+ padding: 1rem;
491
+ margin-bottom: 1rem;
492
+ transition: var(--transition-fast);
493
+ }
494
+
495
+ .team-card:hover {
496
+ border-color: var(--border-hover);
497
+ background: rgba(255, 255, 255, 0.03);
498
+ }
499
+
500
+ .team-card-top {
501
+ display: flex;
502
+ justify-content: space-between;
503
+ align-items: center;
504
+ margin-bottom: 1rem;
505
+ }
506
+
507
+ .team-lbl {
508
+ font-size: 0.75rem;
509
+ font-weight: 700;
510
+ text-transform: uppercase;
511
+ letter-spacing: 0.05em;
512
+ color: var(--text-muted);
513
+ background: var(--bg-card);
514
+ padding: 0.25rem 0.75rem;
515
+ border-radius: var(--radius-full);
516
+ }
517
+
518
+ /* ===== 工具条 ===== */
519
+ .toolbar {
520
+ display: flex;
521
+ gap: 0.75rem;
522
+ align-items: center;
523
+ margin-bottom: 1rem;
524
+ flex-wrap: wrap;
525
+ }
526
+
527
+ .toolbar-spacer {
528
+ flex: 1;
529
+ }
530
+
531
+ /* ===== 表格样式 ===== */
532
+ .tbl-wrap {
533
+ overflow-x: auto;
534
+ border-radius: var(--radius-lg);
535
+ border: 1px solid var(--border-color);
536
+ background: var(--bg-card);
537
+ }
538
+
539
+ table {
540
+ width: 100%;
541
+ border-collapse: collapse;
542
+ min-width: 600px;
543
+ }
544
+
545
+ thead {
546
+ background: var(--bg-secondary);
547
+ border-bottom: 1px solid var(--border-color);
548
+ }
549
+
550
+ th {
551
+ padding: 0.75rem 1rem;
552
+ text-align: left;
553
+ font-size: 0.75rem;
554
+ font-weight: 600;
555
+ text-transform: uppercase;
556
+ letter-spacing: 0.05em;
557
+ color: var(--text-muted);
558
+ white-space: nowrap;
559
+ }
560
+
561
+ td {
562
+ padding: 1rem;
563
+ font-size: 0.875rem;
564
+ border-bottom: 1px solid var(--border-color);
565
+ color: var(--text-secondary);
566
+ }
567
+
568
+ tbody tr {
569
+ transition: var(--transition-fast);
570
+ }
571
+
572
+ tbody tr:hover {
573
+ background: rgba(255, 255, 255, 0.02);
574
+ }
575
+
576
+ tbody tr:last-child td {
577
+ border-bottom: none;
578
+ }
579
+
580
+ td.empty {
581
+ text-align: center;
582
+ padding: 3rem;
583
+ color: var(--text-muted);
584
+ }
585
+
586
+ /* ===== 终端日志 ===== */
587
+ .terminal {
588
+ background: var(--bg-secondary);
589
+ border: 1px solid var(--border-color);
590
+ border-radius: var(--radius-lg);
591
+ padding: 1rem;
592
+ font-family: 'Menlo', 'Monaco', 'Courier New', monospace;
593
+ font-size: 0.8125rem;
594
+ line-height: 1.5;
595
+ max-height: 300px;
596
+ overflow-y: auto;
597
+ scroll-behavior: smooth;
598
+ }
599
+
600
+ .log {
601
+ margin-bottom: 0.5rem;
602
+ padding-left: 0.5rem;
603
+ border-left: 3px solid transparent;
604
+ white-space: pre-wrap;
605
+ word-break: break-word;
606
+ }
607
+
608
+ .log.ok {
609
+ border-left-color: #43e97b;
610
+ color: var(--text-success);
611
+ }
612
+
613
+ .log.err {
614
+ border-left-color: #ff0844;
615
+ color: var(--text-danger);
616
+ }
617
+
618
+ .log.wrn {
619
+ border-left-color: #fee140;
620
+ color: var(--text-warning);
621
+ }
622
+
623
+ .log.inf {
624
+ border-left-color: #667eea;
625
+ color: var(--text-primary);
626
+ }
627
+
628
+ .log.hi {
629
+ border-left-color: #f093fb;
630
+ color: var(--text-primary);
631
+ font-weight: 600;
632
+ }
633
+
634
+ /* ===== 页面布局 ===== */
635
+ .page {
636
+ display: grid;
637
+ grid-template-columns: 300px 1fr;
638
+ gap: 2rem;
639
+ max-width: 1400px;
640
+ margin: 0 auto;
641
+ padding: 2rem;
642
+ }
643
+
644
+ .sidebar {
645
+ display: flex;
646
+ flex-direction: column;
647
+ gap: 1.5rem;
648
+ }
649
+
650
+ .main {
651
+ display: flex;
652
+ flex-direction: column;
653
+ gap: 1.5rem;
654
+ }
655
+
656
+ /* ===== 头部样式 ===== */
657
+ .header {
658
+ background: var(--bg-card);
659
+ border-bottom: 1px solid var(--border-color);
660
+ padding: 1rem 2rem;
661
+ display: flex;
662
+ justify-content: space-between;
663
+ align-items: center;
664
+ position: sticky;
665
+ top: 0;
666
+ z-index: 100;
667
+ backdrop-filter: blur(10px);
668
+ -webkit-backdrop-filter: blur(10px);
669
+ }
670
+
671
+ .header-brand h1 {
672
+ margin-bottom: 0;
673
+ font-size: 1.5rem;
674
+ }
675
+
676
+ .status-pill {
677
+ display: inline-flex;
678
+ align-items: center;
679
+ gap: 0.5rem;
680
+ padding: 0.5rem 1rem;
681
+ background: var(--bg-input);
682
+ border: 1px solid var(--border-color);
683
+ border-radius: var(--radius-full);
684
+ font-size: 0.875rem;
685
+ font-weight: 500;
686
+ transition: var(--transition-fast);
687
+ }
688
+
689
+ .status-pill.running {
690
+ background: linear-gradient(135deg, rgba(67, 233, 123, 0.2) 0%, rgba(56, 249, 215, 0.2) 100%);
691
+ border-color: rgba(67, 233, 123, 0.3);
692
+ color: var(--text-success);
693
+ }
694
+
695
+ .status-pill .dot {
696
+ width: 8px;
697
+ height: 8px;
698
+ border-radius: 50%;
699
+ background: var(--text-success);
700
+ animation: pulse 2s infinite;
701
+ }
702
+
703
+ .status-pill.running .dot {
704
+ background: var(--text-success);
705
+ animation: pulse 2s infinite;
706
+ }
707
+
708
+ @keyframes pulse {
709
+ 0%, 100% { opacity: 1; }
710
+ 50% { opacity: 0.5; }
711
+ }
712
+
713
+ /* ===== 吐司通知 ===== */
714
+ .toast-wrap {
715
+ position: fixed;
716
+ bottom: 2rem;
717
+ right: 2rem;
718
+ z-index: 1000;
719
+ display: flex;
720
+ flex-direction: column;
721
+ gap: 0.75rem;
722
+ }
723
+
724
+ .toast {
725
+ background: var(--bg-card);
726
+ border: 1px solid var(--border-color);
727
+ border-radius: var(--radius-lg);
728
+ padding: 1rem 1.25rem;
729
+ display: flex;
730
+ align-items: center;
731
+ gap: 0.75rem;
732
+ box-shadow: var(--shadow-lg);
733
+ animation: slideIn 0.3s cubic-bezier(0.4, 0, 0.2, 1);
734
+ max-width: 320px;
735
+ transition: var(--transition-fast);
736
+ }
737
+
738
+ .toast.out {
739
+ transform: translateX(100%);
740
+ opacity: 0;
741
+ }
742
+
743
+ .toast.ok {
744
+ border-left: 4px solid #43e97b;
745
+ }
746
+
747
+ .toast.err {
748
+ border-left: 4px solid #ff0844;
749
+ }
750
+
751
+ .toast-ico {
752
+ width: 1.25rem;
753
+ height: 1.25rem;
754
+ display: flex;
755
+ align-items: center;
756
+ justify-content: center;
757
+ font-weight: bold;
758
+ }
759
+
760
+ @keyframes slideIn {
761
+ from {
762
+ transform: translateX(100%);
763
+ opacity: 0;
764
+ }
765
+ to {
766
+ transform: translateX(0);
767
+ opacity: 1;
768
+ }
769
+ }
770
+
771
+ /* ===== 响应式设计 ===== */
772
+ @media (max-width: 1024px) {
773
+ .page {
774
+ grid-template-columns: 1fr;
775
+ padding: 1rem;
776
+ }
777
+
778
+ .sidebar {
779
+ order: 2;
780
+ }
781
+
782
+ .main {
783
+ order: 1;
784
+ }
785
+ }
786
+
787
+ @media (max-width: 768px) {
788
+ .header {
789
+ padding: 1rem;
790
+ flex-direction: column;
791
+ gap: 1rem;
792
+ align-items: flex-start;
793
+ }
794
+
795
+ .toolbar {
796
+ flex-direction: column;
797
+ align-items: stretch;
798
+ }
799
+
800
+ .toolbar-spacer {
801
+ display: none;
802
+ }
803
+
804
+ .toast-wrap {
805
+ left: 1rem;
806
+ right: 1rem;
807
+ bottom: 1rem;
808
+ }
809
+
810
+ .toast {
811
+ max-width: none;
812
+ }
813
+ }
814
+
815
+ /* ===== 加载动画 ===== */
816
+ @keyframes shimmer {
817
+ 0% {
818
+ background-position: -1000px 0;
819
+ }
820
+ 100% {
821
+ background-position: 1000px 0;
822
+ }
823
+ }
824
+
825
+ .loading {
826
+ background: linear-gradient(90deg,
827
+ var(--bg-input) 25%,
828
+ var(--bg-card) 50%,
829
+ var(--bg-input) 75%
830
+ );
831
+ background-size: 1000px 100%;
832
+ animation: shimmer 2s infinite linear;
833
+ }
834
+
835
+ /* ===== 粒子背景 ===== */
836
+ .bg {
837
+ position: fixed;
838
+ top: 0;
839
+ left: 0;
840
+ width: 100%;
841
+ height: 100%;
842
+ z-index: -1;
843
+ pointer-events: none;
844
+ }
845
+
846
+ .bg::before {
847
+ content: '';
848
+ position: absolute;
849
+ top: 0;
850
+ left: 0;
851
+ width: 100%;
852
+ height: 100%;
853
+ background:
854
+ radial-gradient(circle at 15% 50%, rgba(102, 126, 234, 0.1) 0%, transparent 50%),
855
+ radial-gradient(circle at 85% 30%, rgba(118, 75, 162, 0.08) 0%, transparent 50%),
856
+ radial-gradient(circle at 50% 80%, rgba(240, 147, 251, 0.06) 0%, transparent 50%);
857
+ animation: float 20s ease-in-out infinite;
858
  }
859
 
860
+ @keyframes float {
861
+ 0%, 100% {
862
+ transform: translate(0, 0);
863
+ }
864
+ 33% {
865
+ transform: translate(20px, -10px);
866
+ }
867
+ 66% {
868
+ transform: translate(-15px, 15px);
869
+ }
870
  }