Add 2 files
Browse files- README.md +7 -5
- index.html +1242 -19
README.md
CHANGED
|
@@ -1,10 +1,12 @@
|
|
| 1 |
---
|
| 2 |
-
title:
|
| 3 |
-
emoji:
|
| 4 |
-
colorFrom:
|
| 5 |
-
colorTo:
|
| 6 |
sdk: static
|
| 7 |
pinned: false
|
|
|
|
|
|
|
| 8 |
---
|
| 9 |
|
| 10 |
-
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
|
|
|
|
| 1 |
---
|
| 2 |
+
title: looplayer
|
| 3 |
+
emoji: 🐳
|
| 4 |
+
colorFrom: red
|
| 5 |
+
colorTo: purple
|
| 6 |
sdk: static
|
| 7 |
pinned: false
|
| 8 |
+
tags:
|
| 9 |
+
- deepsite
|
| 10 |
---
|
| 11 |
|
| 12 |
+
Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
|
index.html
CHANGED
|
@@ -1,19 +1,1242 @@
|
|
| 1 |
-
<!
|
| 2 |
-
<html>
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>LoopLayer Dashboard</title>
|
| 7 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 8 |
+
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
|
| 9 |
+
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
|
| 10 |
+
<script src="https://d3js.org/d3.v7.min.js"></script>
|
| 11 |
+
<style>
|
| 12 |
+
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Pixelify+Sans:wght@400;500;600&display=swap');
|
| 13 |
+
|
| 14 |
+
:root {
|
| 15 |
+
--bg-dark: #000000;
|
| 16 |
+
--primary: #00C2FF;
|
| 17 |
+
--secondary: #8C52FF;
|
| 18 |
+
--accent: #00FF9D;
|
| 19 |
+
--dao: #FFB800;
|
| 20 |
+
--text: #FFFFFF;
|
| 21 |
+
--card-bg: #1C1C1C;
|
| 22 |
+
}
|
| 23 |
+
|
| 24 |
+
body {
|
| 25 |
+
font-family: 'Inter', sans-serif;
|
| 26 |
+
background-color: var(--bg-dark);
|
| 27 |
+
color: var(--text);
|
| 28 |
+
overflow-x: hidden;
|
| 29 |
+
}
|
| 30 |
+
|
| 31 |
+
.pixel-font {
|
| 32 |
+
font-family: 'Pixelify Sans', sans-serif;
|
| 33 |
+
}
|
| 34 |
+
|
| 35 |
+
.neon-text {
|
| 36 |
+
text-shadow: 0 0 5px var(--primary), 0 0 10px var(--primary);
|
| 37 |
+
}
|
| 38 |
+
|
| 39 |
+
.neon-glow {
|
| 40 |
+
box-shadow: 0 0 10px var(--primary), 0 0 20px var(--primary), 0 0 30px var(--primary);
|
| 41 |
+
}
|
| 42 |
+
|
| 43 |
+
.category-defi {
|
| 44 |
+
background: rgba(0, 194, 255, 0.2);
|
| 45 |
+
border-color: var(--primary);
|
| 46 |
+
}
|
| 47 |
+
|
| 48 |
+
.category-gaming {
|
| 49 |
+
background: rgba(140, 82, 255, 0.2);
|
| 50 |
+
border-color: var(--secondary);
|
| 51 |
+
}
|
| 52 |
+
|
| 53 |
+
.category-zkml {
|
| 54 |
+
background: rgba(0, 255, 157, 0.2);
|
| 55 |
+
border-color: var(--accent);
|
| 56 |
+
}
|
| 57 |
+
|
| 58 |
+
.category-dao {
|
| 59 |
+
background: rgba(255, 184, 0, 0.2);
|
| 60 |
+
border-color: var(--dao);
|
| 61 |
+
}
|
| 62 |
+
|
| 63 |
+
.tab-content {
|
| 64 |
+
display: none;
|
| 65 |
+
animation: fadeIn 0.5s ease;
|
| 66 |
+
}
|
| 67 |
+
|
| 68 |
+
.tab-content.active {
|
| 69 |
+
display: block;
|
| 70 |
+
}
|
| 71 |
+
|
| 72 |
+
@keyframes fadeIn {
|
| 73 |
+
from { opacity: 0; transform: translateY(10px); }
|
| 74 |
+
to { opacity: 1; transform: translateY(0); }
|
| 75 |
+
}
|
| 76 |
+
|
| 77 |
+
.card {
|
| 78 |
+
background-color: rgba(28, 28, 28, 0.8);
|
| 79 |
+
backdrop-filter: blur(10px);
|
| 80 |
+
border: 1px solid rgba(255, 255, 255, 0.1);
|
| 81 |
+
transition: all 0.3s ease;
|
| 82 |
+
}
|
| 83 |
+
|
| 84 |
+
.card:hover {
|
| 85 |
+
transform: translateY(-5px);
|
| 86 |
+
box-shadow: 0 10px 25px rgba(0, 194, 255, 0.3);
|
| 87 |
+
}
|
| 88 |
+
|
| 89 |
+
.logo-spin {
|
| 90 |
+
animation: spin 8s linear infinite;
|
| 91 |
+
}
|
| 92 |
+
|
| 93 |
+
@keyframes spin {
|
| 94 |
+
0% { transform: rotate(0deg); }
|
| 95 |
+
100% { transform: rotate(360deg); }
|
| 96 |
+
}
|
| 97 |
+
|
| 98 |
+
.pulse {
|
| 99 |
+
animation: pulse 2s infinite;
|
| 100 |
+
}
|
| 101 |
+
|
| 102 |
+
@keyframes pulse {
|
| 103 |
+
0% { box-shadow: 0 0 0 0 rgba(0, 194, 255, 0.7); }
|
| 104 |
+
70% { box-shadow: 0 0 0 10px rgba(0, 194, 255, 0); }
|
| 105 |
+
100% { box-shadow: 0 0 0 0 rgba(0, 194, 255, 0); }
|
| 106 |
+
}
|
| 107 |
+
|
| 108 |
+
.bubble {
|
| 109 |
+
transition: all 0.3s ease;
|
| 110 |
+
}
|
| 111 |
+
|
| 112 |
+
.bubble:hover {
|
| 113 |
+
transform: scale(1.1);
|
| 114 |
+
z-index: 10;
|
| 115 |
+
}
|
| 116 |
+
|
| 117 |
+
.tooltip {
|
| 118 |
+
opacity: 0;
|
| 119 |
+
transition: opacity 0.3s ease;
|
| 120 |
+
pointer-events: none;
|
| 121 |
+
}
|
| 122 |
+
|
| 123 |
+
.bubble:hover .tooltip {
|
| 124 |
+
opacity: 1;
|
| 125 |
+
}
|
| 126 |
+
|
| 127 |
+
.status-badge {
|
| 128 |
+
display: inline-flex;
|
| 129 |
+
align-items: center;
|
| 130 |
+
}
|
| 131 |
+
|
| 132 |
+
.status-badge::before {
|
| 133 |
+
content: "";
|
| 134 |
+
display: inline-block;
|
| 135 |
+
width: 8px;
|
| 136 |
+
height: 8px;
|
| 137 |
+
border-radius: 50%;
|
| 138 |
+
margin-right: 6px;
|
| 139 |
+
}
|
| 140 |
+
|
| 141 |
+
.status-active::before {
|
| 142 |
+
background-color: #00FF9D;
|
| 143 |
+
}
|
| 144 |
+
|
| 145 |
+
.status-pending::before {
|
| 146 |
+
background-color: #FFB800;
|
| 147 |
+
}
|
| 148 |
+
|
| 149 |
+
.status-inactive::before {
|
| 150 |
+
background-color: #FF3E3E;
|
| 151 |
+
}
|
| 152 |
+
|
| 153 |
+
.rank-badge {
|
| 154 |
+
width: 24px;
|
| 155 |
+
height: 24px;
|
| 156 |
+
display: flex;
|
| 157 |
+
align-items: center;
|
| 158 |
+
justify-content: center;
|
| 159 |
+
border-radius: 4px;
|
| 160 |
+
font-weight: bold;
|
| 161 |
+
font-size: 12px;
|
| 162 |
+
}
|
| 163 |
+
|
| 164 |
+
.rank-1 {
|
| 165 |
+
background: linear-gradient(135deg, #FFD700, #FFB800);
|
| 166 |
+
color: #000;
|
| 167 |
+
}
|
| 168 |
+
|
| 169 |
+
.rank-2 {
|
| 170 |
+
background: linear-gradient(135deg, #C0C0C0, #A0A0A0);
|
| 171 |
+
color: #000;
|
| 172 |
+
}
|
| 173 |
+
|
| 174 |
+
.rank-3 {
|
| 175 |
+
background: linear-gradient(135deg, #CD7F32, #A05A2C);
|
| 176 |
+
color: #000;
|
| 177 |
+
}
|
| 178 |
+
|
| 179 |
+
.profile-card {
|
| 180 |
+
background: linear-gradient(135deg, rgba(28, 28, 28, 0.8), rgba(40, 40, 40, 0.8));
|
| 181 |
+
border: 1px solid rgba(255, 255, 255, 0.1);
|
| 182 |
+
}
|
| 183 |
+
|
| 184 |
+
.profile-cover {
|
| 185 |
+
height: 100px;
|
| 186 |
+
background: linear-gradient(90deg, #00C2FF, #8C52FF);
|
| 187 |
+
}
|
| 188 |
+
|
| 189 |
+
.profile-avatar {
|
| 190 |
+
width: 80px;
|
| 191 |
+
height: 80px;
|
| 192 |
+
border: 3px solid var(--bg-dark);
|
| 193 |
+
margin-top: -40px;
|
| 194 |
+
}
|
| 195 |
+
|
| 196 |
+
.progress-bar {
|
| 197 |
+
height: 4px;
|
| 198 |
+
background-color: rgba(255, 255, 255, 0.1);
|
| 199 |
+
}
|
| 200 |
+
|
| 201 |
+
.progress-fill {
|
| 202 |
+
height: 100%;
|
| 203 |
+
background: linear-gradient(90deg, #00C2FF, #00FF9D);
|
| 204 |
+
}
|
| 205 |
+
|
| 206 |
+
.patch-timeline {
|
| 207 |
+
position: relative;
|
| 208 |
+
padding-left: 30px;
|
| 209 |
+
}
|
| 210 |
+
|
| 211 |
+
.patch-timeline::before {
|
| 212 |
+
content: "";
|
| 213 |
+
position: absolute;
|
| 214 |
+
left: 10px;
|
| 215 |
+
top: 0;
|
| 216 |
+
bottom: 0;
|
| 217 |
+
width: 2px;
|
| 218 |
+
background-color: rgba(255, 255, 255, 0.1);
|
| 219 |
+
}
|
| 220 |
+
|
| 221 |
+
.patch-item {
|
| 222 |
+
position: relative;
|
| 223 |
+
margin-bottom: 20px;
|
| 224 |
+
}
|
| 225 |
+
|
| 226 |
+
.patch-item::before {
|
| 227 |
+
content: "";
|
| 228 |
+
position: absolute;
|
| 229 |
+
left: -30px;
|
| 230 |
+
top: 5px;
|
| 231 |
+
width: 12px;
|
| 232 |
+
height: 12px;
|
| 233 |
+
border-radius: 50%;
|
| 234 |
+
border: 2px solid var(--primary);
|
| 235 |
+
background-color: var(--bg-dark);
|
| 236 |
+
}
|
| 237 |
+
|
| 238 |
+
.patch-validated::before {
|
| 239 |
+
background-color: var(--primary);
|
| 240 |
+
}
|
| 241 |
+
|
| 242 |
+
.patch-pending::before {
|
| 243 |
+
background-color: var(--dao);
|
| 244 |
+
}
|
| 245 |
+
|
| 246 |
+
.patch-rejected::before {
|
| 247 |
+
background-color: #FF3E3E;
|
| 248 |
+
}
|
| 249 |
+
|
| 250 |
+
/* New styles for logo header */
|
| 251 |
+
.logo-header {
|
| 252 |
+
display: flex;
|
| 253 |
+
align-items: center;
|
| 254 |
+
padding: 1rem;
|
| 255 |
+
position: fixed;
|
| 256 |
+
top: 0;
|
| 257 |
+
left: 0;
|
| 258 |
+
z-index: 50;
|
| 259 |
+
}
|
| 260 |
+
|
| 261 |
+
.logo-container {
|
| 262 |
+
display: flex;
|
| 263 |
+
align-items: center;
|
| 264 |
+
gap: 0.75rem;
|
| 265 |
+
}
|
| 266 |
+
|
| 267 |
+
.logo-text {
|
| 268 |
+
font-family: 'Pixelify Sans', sans-serif;
|
| 269 |
+
font-size: 1.5rem;
|
| 270 |
+
font-weight: 600;
|
| 271 |
+
background: linear-gradient(90deg, #00C2FF, #8C52FF);
|
| 272 |
+
-webkit-background-clip: text;
|
| 273 |
+
background-clip: text;
|
| 274 |
+
color: transparent;
|
| 275 |
+
text-shadow: 0 0 5px rgba(0, 194, 255, 0.3);
|
| 276 |
+
}
|
| 277 |
+
|
| 278 |
+
.main-content {
|
| 279 |
+
padding-top: 6rem;
|
| 280 |
+
}
|
| 281 |
+
|
| 282 |
+
/* Consistent section headers */
|
| 283 |
+
.section-header {
|
| 284 |
+
font-family: 'Pixelify Sans', sans-serif;
|
| 285 |
+
font-size: 1.25rem;
|
| 286 |
+
font-weight: 600;
|
| 287 |
+
margin-bottom: 1rem;
|
| 288 |
+
color: #00C2FF;
|
| 289 |
+
display: flex;
|
| 290 |
+
align-items: center;
|
| 291 |
+
gap: 0.5rem;
|
| 292 |
+
}
|
| 293 |
+
</style>
|
| 294 |
+
</head>
|
| 295 |
+
<body class="min-h-screen">
|
| 296 |
+
<!-- Background Bubbles -->
|
| 297 |
+
<div id="background-bubbles" class="fixed inset-0 overflow-hidden pointer-events-none z-0"></div>
|
| 298 |
+
|
| 299 |
+
<!-- Logo Header -->
|
| 300 |
+
<header class="logo-header">
|
| 301 |
+
<div class="logo-container">
|
| 302 |
+
<div class="logo-spin">
|
| 303 |
+
<svg width="40" height="40" viewBox="0 0 120 120" fill="none" xmlns="http://www.w3.org/2000/svg">
|
| 304 |
+
<path d="M60 0C26.8629 0 0 26.8629 0 60C0 93.1371 26.8629 120 60 120C93.1371 120 120 93.1371 120 60C120 26.8629 93.1371 0 60 0ZM60 110C32.3858 110 10 87.6142 10 60C10 32.3858 32.3858 10 60 10C87.6142 10 110 32.3858 110 60C110 87.6142 87.6142 110 60 110Z" fill="#00C2FF"/>
|
| 305 |
+
<path d="M60 20C37.9086 20 20 37.9086 20 60C20 82.0914 37.9086 100 60 100C82.0914 100 100 82.0914 100 60C100 37.9086 82.0914 20 60 20ZM60 90C42.3265 90 30 77.6735 30 60C30 42.3265 42.3265 30 60 30C77.6735 30 90 42.3265 90 60C90 77.6735 77.6735 90 60 90Z" fill="#8C52FF"/>
|
| 306 |
+
<path d="M60 40C48.9543 40 40 48.9543 40 60C40 71.0457 48.9543 80 60 80C71.0457 80 80 71.0457 80 60C80 48.9543 71.0457 40 60 40ZM60 70C55.5817 70 50 65.5817 50 60C50 54.4183 55.5817 50 60 50C64.4183 50 70 54.4183 70 60C70 65.5817 64.4183 70 60 70Z" fill="#00FF9D"/>
|
| 307 |
+
</svg>
|
| 308 |
+
</div>
|
| 309 |
+
<span class="logo-text">LOOPLAYER</span>
|
| 310 |
+
</div>
|
| 311 |
+
</header>
|
| 312 |
+
|
| 313 |
+
<div class="container mx-auto px-4 py-8 relative z-10 main-content">
|
| 314 |
+
<!-- Tabs Navigation -->
|
| 315 |
+
<div class="flex justify-center mb-8">
|
| 316 |
+
<div class="inline-flex rounded-md shadow-sm" role="group">
|
| 317 |
+
<button onclick="switchTab('dashboard')" class="px-6 py-3 text-sm font-medium rounded-l-lg bg-indigo-600 text-white hover:bg-indigo-700 focus:z-10 focus:ring-2 focus:ring-indigo-500">
|
| 318 |
+
<i class="fas fa-chart-line mr-2"></i> Dashboard
|
| 319 |
+
</button>
|
| 320 |
+
<button onclick="switchTab('patches')" class="px-6 py-3 text-sm font-medium bg-gray-700 text-white hover:bg-gray-600 focus:z-10 focus:ring-2 focus:ring-gray-500">
|
| 321 |
+
<i class="fas fa-code-branch mr-2"></i> Patches
|
| 322 |
+
</button>
|
| 323 |
+
<button onclick="switchTab('community')" class="px-6 py-3 text-sm font-medium rounded-r-lg bg-gray-700 text-white hover:bg-gray-600 focus:z-10 focus:ring-2 focus:ring-gray-500">
|
| 324 |
+
<i class="fas fa-users mr-2"></i> Community
|
| 325 |
+
</button>
|
| 326 |
+
</div>
|
| 327 |
+
</div>
|
| 328 |
+
|
| 329 |
+
<!-- Dashboard Tab Content -->
|
| 330 |
+
<div id="dashboard" class="tab-content active">
|
| 331 |
+
<!-- Top AI Agents Bubble Chart -->
|
| 332 |
+
<div class="card rounded-xl p-6 mb-8">
|
| 333 |
+
<div class="flex justify-between items-center mb-6">
|
| 334 |
+
<h3 class="section-header">
|
| 335 |
+
<i class="fas fa-chart-pie"></i>
|
| 336 |
+
Top AI Agents
|
| 337 |
+
</h3>
|
| 338 |
+
<div class="flex items-center">
|
| 339 |
+
<span class="inline-block w-3 h-3 rounded-full bg-green-500 mr-2 pulse"></span>
|
| 340 |
+
<span class="text-sm text-gray-300">Live Data</span>
|
| 341 |
+
</div>
|
| 342 |
+
</div>
|
| 343 |
+
<div id="bubble-chart" class="h-96 relative">
|
| 344 |
+
<!-- Bubbles will be inserted here by JavaScript -->
|
| 345 |
+
</div>
|
| 346 |
+
<div class="flex justify-center mt-4 space-x-4">
|
| 347 |
+
<div class="flex items-center">
|
| 348 |
+
<span class="w-3 h-3 rounded-full bg-blue-500 mr-2"></span>
|
| 349 |
+
<span class="text-xs">DeFi</span>
|
| 350 |
+
</div>
|
| 351 |
+
<div class="flex items-center">
|
| 352 |
+
<span class="w-3 h-3 rounded-full bg-purple-500 mr-2"></span>
|
| 353 |
+
<span class="text-xs">Gaming</span>
|
| 354 |
+
</div>
|
| 355 |
+
<div class="flex items-center">
|
| 356 |
+
<span class="w-3 h-3 rounded-full bg-green-500 mr-2"></span>
|
| 357 |
+
<span class="text-xs">zkML</span>
|
| 358 |
+
</div>
|
| 359 |
+
<div class="flex items-center">
|
| 360 |
+
<span class="w-3 h-3 rounded-full bg-yellow-500 mr-2"></span>
|
| 361 |
+
<span class="text-xs">DAO</span>
|
| 362 |
+
</div>
|
| 363 |
+
</div>
|
| 364 |
+
</div>
|
| 365 |
+
|
| 366 |
+
<div class="grid grid-cols-1 md:grid-cols-2 gap-6 mb-8">
|
| 367 |
+
<!-- LoopScore Over Time -->
|
| 368 |
+
<div class="card rounded-xl p-6">
|
| 369 |
+
<h3 class="section-header">
|
| 370 |
+
<i class="fas fa-chart-line"></i>
|
| 371 |
+
LoopScore Trend
|
| 372 |
+
</h3>
|
| 373 |
+
<div class="h-64 flex items-center justify-center">
|
| 374 |
+
<canvas id="scoreChart"></canvas>
|
| 375 |
+
</div>
|
| 376 |
+
<div class="flex justify-center mt-4 space-x-4">
|
| 377 |
+
<button class="px-3 py-1 text-xs bg-gray-700 rounded hover:bg-gray-600">7D</button>
|
| 378 |
+
<button class="px-3 py-1 text-xs bg-blue-600 rounded">30D</button>
|
| 379 |
+
<button class="px-3 py-1 text-xs bg-gray-700 rounded hover:bg-gray-600">90D</button>
|
| 380 |
+
</div>
|
| 381 |
+
</div>
|
| 382 |
+
|
| 383 |
+
<!-- Agent Stats -->
|
| 384 |
+
<div class="card rounded-xl p-6">
|
| 385 |
+
<h3 class="section-header">
|
| 386 |
+
<i class="fas fa-chart-bar"></i>
|
| 387 |
+
Agent Statistics
|
| 388 |
+
</h3>
|
| 389 |
+
<div class="grid grid-cols-2 gap-4">
|
| 390 |
+
<div class="bg-gray-800 p-3 rounded-lg">
|
| 391 |
+
<p class="text-sm text-gray-400 mb-1">Total Agents</p>
|
| 392 |
+
<p class="text-2xl font-mono">1,248</p>
|
| 393 |
+
</div>
|
| 394 |
+
<div class="bg-gray-800 p-3 rounded-lg">
|
| 395 |
+
<p class="text-sm text-gray-400 mb-1">Active</p>
|
| 396 |
+
<p class="text-2xl font-mono text-green-400">1,124</p>
|
| 397 |
+
</div>
|
| 398 |
+
<div class="bg-gray-800 p-3 rounded-lg">
|
| 399 |
+
<p class="text-sm text-gray-400 mb-1">Avg. Score</p>
|
| 400 |
+
<p class="text-2xl font-mono">72.5</p>
|
| 401 |
+
</div>
|
| 402 |
+
<div class="bg-gray-800 p-3 rounded-lg">
|
| 403 |
+
<p class="text-sm text-gray-400 mb-1">Categories</p>
|
| 404 |
+
<p class="text-2xl font-mono">12</p>
|
| 405 |
+
</div>
|
| 406 |
+
</div>
|
| 407 |
+
</div>
|
| 408 |
+
</div>
|
| 409 |
+
|
| 410 |
+
<!-- Agent Rankings -->
|
| 411 |
+
<div class="card rounded-xl p-6 mb-8">
|
| 412 |
+
<div class="flex justify-between items-center mb-4">
|
| 413 |
+
<h3 class="section-header">
|
| 414 |
+
<i class="fas fa-trophy"></i>
|
| 415 |
+
Agent Rankings
|
| 416 |
+
</h3>
|
| 417 |
+
<div class="relative">
|
| 418 |
+
<select class="bg-gray-800 border border-gray-700 text-white text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2">
|
| 419 |
+
<option selected>All Categories</option>
|
| 420 |
+
<option>DeFi</option>
|
| 421 |
+
<option>Gaming</option>
|
| 422 |
+
<option>zkML</option>
|
| 423 |
+
<option>DAO</option>
|
| 424 |
+
</select>
|
| 425 |
+
</div>
|
| 426 |
+
</div>
|
| 427 |
+
<div class="overflow-x-auto">
|
| 428 |
+
<table class="min-w-full divide-y divide-gray-700">
|
| 429 |
+
<thead>
|
| 430 |
+
<tr>
|
| 431 |
+
<th class="px-6 py-3 text-left text-xs font-medium text-gray-300 uppercase tracking-wider">Agent</th>
|
| 432 |
+
<th class="px-6 py-3 text-left text-xs font-medium text-gray-300 uppercase tracking-wider">Category</th>
|
| 433 |
+
<th class="px-6 py-3 text-left text-xs font-medium text-gray-300 uppercase tracking-wider">LoopScore</th>
|
| 434 |
+
<th class="px-6 py-3 text-left text-xs font-medium text-gray-300 uppercase tracking-wider">Patches</th>
|
| 435 |
+
<th class="px-6 py-3 text-left text-xs font-medium text-gray-300 uppercase tracking-wider">Updated</th>
|
| 436 |
+
<th class="px-6 py-3 text-left text-xs font-medium text-gray-300 uppercase tracking-wider">Status</th>
|
| 437 |
+
</tr>
|
| 438 |
+
</thead>
|
| 439 |
+
<tbody class="divide-y divide-gray-700" id="agent-table-body">
|
| 440 |
+
<!-- Rows will be inserted here by JavaScript -->
|
| 441 |
+
</tbody>
|
| 442 |
+
</table>
|
| 443 |
+
</div>
|
| 444 |
+
</div>
|
| 445 |
+
</div>
|
| 446 |
+
|
| 447 |
+
<!-- Patches Tab Content -->
|
| 448 |
+
<div id="patches" class="tab-content">
|
| 449 |
+
<div class="grid grid-cols-1 lg:grid-cols-3 gap-6 mb-8">
|
| 450 |
+
<!-- Agent Profile -->
|
| 451 |
+
<div class="card rounded-xl p-6 lg:col-span-1">
|
| 452 |
+
<div class="flex flex-col items-center">
|
| 453 |
+
<div class="w-24 h-24 rounded-full bg-gradient-to-r from-blue-500 to-purple-500 flex items-center justify-center mb-4">
|
| 454 |
+
<span class="text-2xl font-bold">AX</span>
|
| 455 |
+
</div>
|
| 456 |
+
<h3 class="text-xl font-bold mb-1 pixel-font">AIXBT</h3>
|
| 457 |
+
<span class="text-sm bg-blue-900 text-blue-300 px-2 py-1 rounded-full mb-4">DeFi</span>
|
| 458 |
+
|
| 459 |
+
<div class="w-full mb-6">
|
| 460 |
+
<div class="flex justify-between items-center mb-1">
|
| 461 |
+
<span class="text-sm text-gray-400">LoopScore</span>
|
| 462 |
+
<span class="text-sm font-mono">92.4</span>
|
| 463 |
+
</div>
|
| 464 |
+
<div class="progress-bar rounded-full">
|
| 465 |
+
<div class="progress-fill rounded-full" style="width: 92.4%"></div>
|
| 466 |
+
</div>
|
| 467 |
+
</div>
|
| 468 |
+
|
| 469 |
+
<div class="grid grid-cols-2 gap-4 w-full mb-6">
|
| 470 |
+
<div class="bg-gray-800 p-3 rounded-lg text-center">
|
| 471 |
+
<p class="text-sm text-gray-400 mb-1">Patches</p>
|
| 472 |
+
<p class="text-xl font-mono">7</p>
|
| 473 |
+
</div>
|
| 474 |
+
<div class="bg-gray-800 p-3 rounded-lg text-center">
|
| 475 |
+
<p class="text-sm text-gray-400 mb-1">Uptime</p>
|
| 476 |
+
<p class="text-xl font-mono text-green-400">98.2%</p>
|
| 477 |
+
</div>
|
| 478 |
+
</div>
|
| 479 |
+
|
| 480 |
+
<div class="w-full">
|
| 481 |
+
<h4 class="text-sm font-semibold mb-2">Current Version</h4>
|
| 482 |
+
<div class="bg-gray-800 p-3 rounded-lg">
|
| 483 |
+
<div class="flex justify-between items-center">
|
| 484 |
+
<span class="font-mono">v2.1.4</span>
|
| 485 |
+
<span class="text-xs bg-green-900 text-green-300 px-2 py-1 rounded-full">Active</span>
|
| 486 |
+
</div>
|
| 487 |
+
</div>
|
| 488 |
+
</div>
|
| 489 |
+
</div>
|
| 490 |
+
</div>
|
| 491 |
+
|
| 492 |
+
<!-- Patch Timeline -->
|
| 493 |
+
<div class="card rounded-xl p-6 lg:col-span-2">
|
| 494 |
+
<div class="flex justify-between items-center mb-6">
|
| 495 |
+
<h3 class="section-header">
|
| 496 |
+
<i class="fas fa-history"></i>
|
| 497 |
+
Patch Timeline
|
| 498 |
+
</h3>
|
| 499 |
+
<button class="px-4 py-2 bg-gradient-to-r from-blue-600 to-purple-600 hover:from-blue-700 hover:to-purple-700 text-white font-medium rounded-lg transition-all">
|
| 500 |
+
<i class="fas fa-plus mr-2"></i> Propose Patch
|
| 501 |
+
</button>
|
| 502 |
+
</div>
|
| 503 |
+
|
| 504 |
+
<div class="patch-timeline">
|
| 505 |
+
<!-- Patch Item -->
|
| 506 |
+
<div class="patch-item patch-validated">
|
| 507 |
+
<div class="bg-gray-800 rounded-lg p-4">
|
| 508 |
+
<div class="flex justify-between items-start mb-2">
|
| 509 |
+
<div>
|
| 510 |
+
<h4 class="font-medium text-lg pixel-font">v2.1.4 Patch</h4>
|
| 511 |
+
<p class="text-sm text-gray-400">Released 2 days ago</p>
|
| 512 |
+
</div>
|
| 513 |
+
<span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-green-900 text-green-300">Validated</span>
|
| 514 |
+
</div>
|
| 515 |
+
<p class="text-gray-300 mb-3">Optimized transaction processing pipeline for better throughput and reduced gas costs by 12%.</p>
|
| 516 |
+
<div class="flex flex-wrap gap-2">
|
| 517 |
+
<span class="text-xs px-2 py-1 rounded bg-gray-700 text-gray-300">Performance</span>
|
| 518 |
+
<span class="text-xs px-2 py-1 rounded bg-gray-700 text-gray-300">Core</span>
|
| 519 |
+
<a href="#" class="text-xs px-2 py-1 rounded bg-blue-900 text-blue-300 hover:underline">View Proof</a>
|
| 520 |
+
<a href="#" class="text-xs px-2 py-1 rounded bg-purple-900 text-purple-300 hover:underline">Benchmarks</a>
|
| 521 |
+
</div>
|
| 522 |
+
</div>
|
| 523 |
+
</div>
|
| 524 |
+
|
| 525 |
+
<!-- Patch Item -->
|
| 526 |
+
<div class="patch-item patch-validated">
|
| 527 |
+
<div class="bg-gray-800 rounded-lg p-4">
|
| 528 |
+
<div class="flex justify-between items-start mb-2">
|
| 529 |
+
<div>
|
| 530 |
+
<h4 class="font-medium text-lg pixel-font">v2.1.3 Hotfix</h4>
|
| 531 |
+
<p class="text-sm text-gray-400">Released 1 week ago</p>
|
| 532 |
+
</div>
|
| 533 |
+
<span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-green-900 text-green-300">Validated</span>
|
| 534 |
+
</div>
|
| 535 |
+
<p class="text-gray-300 mb-3">Fixed edge case in liquidity calculation that could lead to incorrect pricing in high volatility scenarios.</p>
|
| 536 |
+
<div class="flex flex-wrap gap-2">
|
| 537 |
+
<span class="text-xs px-2 py-1 rounded bg-gray-700 text-gray-300">Bug Fix</span>
|
| 538 |
+
<span class="text-xs px-2 py-1 rounded bg-gray-700 text-gray-300">DeFi</span>
|
| 539 |
+
<a href="#" class="text-xs px-2 py-1 rounded bg-blue-900 text-blue-300 hover:underline">View Proof</a>
|
| 540 |
+
</div>
|
| 541 |
+
</div>
|
| 542 |
+
</div>
|
| 543 |
+
|
| 544 |
+
<!-- Patch Item -->
|
| 545 |
+
<div class="patch-item patch-validated">
|
| 546 |
+
<div class="bg-gray-800 rounded-lg p-4">
|
| 547 |
+
<div class="flex justify-between items-start mb-2">
|
| 548 |
+
<div>
|
| 549 |
+
<h4 class="font-medium text-lg pixel-font">v2.1.2 Update</h4>
|
| 550 |
+
<p class="text-sm text-gray-400">Released 2 weeks ago</p>
|
| 551 |
+
</div>
|
| 552 |
+
<span class="inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-green-900 text-green-300">Validated</span>
|
| 553 |
+
</div>
|
| 554 |
+
<p class="text-gray-300 mb-3">Added support for new token standards and improved compatibility with multi-chain deployments.</p>
|
| 555 |
+
<div class="flex flex-wrap gap-2">
|
| 556 |
+
<span class="text-xs px-2 py-1 rounded bg-gray-700 text-gray-300">Feature</span>
|
| 557 |
+
<span class="text-xs px-2 py-1 rounded bg-gray-700 text-gray-300">Compatibility</span>
|
| 558 |
+
<a href="#" class="text-xs px-2 py-1 rounded bg-blue-900 text-blue-300 hover:underline">View Proof</a>
|
| 559 |
+
</div>
|
| 560 |
+
</div>
|
| 561 |
+
</div>
|
| 562 |
+
</div>
|
| 563 |
+
|
| 564 |
+
<div class="mt-8">
|
| 565 |
+
<h4 class="font-medium mb-4 pixel-font">Upcoming Patches</h4>
|
| 566 |
+
<div class="space-y-4">
|
| 567 |
+
<div class="flex items-center">
|
| 568 |
+
<div class="flex-shrink-0 h-3 w-3 rounded-full bg-blue-500 mr-3"></div>
|
| 569 |
+
<div>
|
| 570 |
+
<p class="text-sm font-medium pixel-font">v2.2.0 - Smart Contract Enhancements</p>
|
| 571 |
+
<p class="text-xs text-gray-400">Estimated release: 2023-11-15 | Status: In Testing</p>
|
| 572 |
+
</div>
|
| 573 |
+
</div>
|
| 574 |
+
<div class="flex items-center">
|
| 575 |
+
<div class="flex-shrink-0 h-3 w-3 rounded-full bg-purple-500 mr-3"></div>
|
| 576 |
+
<div>
|
| 577 |
+
<p class="text-sm font-medium pixel-font">v2.1.5 - Performance Improvements</p>
|
| 578 |
+
<p class="text-xs text-gray-400">Estimated release: 2023-10-30 | Status: Development</p>
|
| 579 |
+
</div>
|
| 580 |
+
</div>
|
| 581 |
+
</div>
|
| 582 |
+
</div>
|
| 583 |
+
</div>
|
| 584 |
+
</div>
|
| 585 |
+
</div>
|
| 586 |
+
|
| 587 |
+
<!-- Community Tab Content -->
|
| 588 |
+
<div id="community" class="tab-content">
|
| 589 |
+
<div class="grid grid-cols-1 lg:grid-cols-3 gap-6 mb-8">
|
| 590 |
+
<!-- Top Contributors -->
|
| 591 |
+
<div class="card rounded-xl p-6 lg:col-span-2">
|
| 592 |
+
<div class="flex justify-between items-center mb-6">
|
| 593 |
+
<h3 class="section-header">
|
| 594 |
+
<i class="fas fa-trophy"></i>
|
| 595 |
+
Top Contributors
|
| 596 |
+
</h3>
|
| 597 |
+
<div class="flex space-x-2">
|
| 598 |
+
<button id="solvers-tab" class="px-3 py-1 text-xs bg-blue-600 rounded">Solvers</button>
|
| 599 |
+
<button id="validators-tab" class="px-3 py-1 text-xs bg-gray-700 rounded hover:bg-gray-600">Validators</button>
|
| 600 |
+
<button id="checkers-tab" class="px-3 py-1 text-xs bg-gray-700 rounded hover:bg-gray-600">Checkers</button>
|
| 601 |
+
</div>
|
| 602 |
+
</div>
|
| 603 |
+
|
| 604 |
+
<div class="overflow-x-auto">
|
| 605 |
+
<table class="min-w-full divide-y divide-gray-700">
|
| 606 |
+
<thead>
|
| 607 |
+
<tr>
|
| 608 |
+
<th class="px-6 py-3 text-left text-xs font-medium text-gray-300 uppercase tracking-wider">Rank</th>
|
| 609 |
+
<th class="px-6 py-3 text-left text-xs font-medium text-gray-300 uppercase tracking-wider">Contributor</th>
|
| 610 |
+
<th class="px-6 py-3 text-left text-xs font-medium text-gray-300 uppercase tracking-wider">Patches</th>
|
| 611 |
+
<th class="px-6 py-3 text-left text-xs font-medium text-gray-300 uppercase tracking-wider">Accuracy</th>
|
| 612 |
+
<th class="px-6 py-3 text-left text-xs font-medium text-gray-300 uppercase tracking-wider">Rewards</th>
|
| 613 |
+
</tr>
|
| 614 |
+
</thead>
|
| 615 |
+
<tbody class="divide-y divide-gray-700" id="contributors-table-body">
|
| 616 |
+
<!-- Rows will be inserted here by JavaScript -->
|
| 617 |
+
</tbody>
|
| 618 |
+
</table>
|
| 619 |
+
</div>
|
| 620 |
+
</div>
|
| 621 |
+
|
| 622 |
+
<!-- Contributor Profile -->
|
| 623 |
+
<div class="card rounded-xl p-6 lg:col-span-1">
|
| 624 |
+
<div class="profile-card rounded-lg overflow-hidden">
|
| 625 |
+
<div class="profile-cover"></div>
|
| 626 |
+
<div class="flex flex-col items-center px-6 pb-6 relative">
|
| 627 |
+
<div class="profile-avatar rounded-full bg-gray-800 flex items-center justify-center">
|
| 628 |
+
<span class="text-2xl font-bold">QS</span>
|
| 629 |
+
</div>
|
| 630 |
+
<h3 class="text-xl font-bold mt-4 pixel-font">QuantumStake</h3>
|
| 631 |
+
<p class="text-sm text-gray-400 mb-2">0x8f...3e2d</p>
|
| 632 |
+
|
| 633 |
+
<div class="flex space-x-4 my-4">
|
| 634 |
+
<a href="#" class="text-gray-400 hover:text-blue-400"><i class="fab fa-github"></i></a>
|
| 635 |
+
<a href="#" class="text-gray-400 hover:text-blue-400"><i class="fab fa-twitter"></i></a>
|
| 636 |
+
<a href="#" class="text-gray-400 hover:text-purple-400"><i class="fab fa-discord"></i></a>
|
| 637 |
+
</div>
|
| 638 |
+
|
| 639 |
+
<div class="w-full mb-4">
|
| 640 |
+
<div class="flex justify-between items-center mb-1">
|
| 641 |
+
<span class="text-sm text-gray-400">LoopScore</span>
|
| 642 |
+
<span class="text-sm font-mono">98.7</span>
|
| 643 |
+
</div>
|
| 644 |
+
<div class="progress-bar rounded-full">
|
| 645 |
+
<div class="progress-fill rounded-full" style="width: 98.7%"></div>
|
| 646 |
+
</div>
|
| 647 |
+
</div>
|
| 648 |
+
|
| 649 |
+
<div class="grid grid-cols-3 gap-4 w-full mb-6">
|
| 650 |
+
<div class="bg-gray-800 p-2 rounded-lg text-center">
|
| 651 |
+
<p class="text-sm text-gray-400 mb-1">Patches</p>
|
| 652 |
+
<p class="text-lg font-mono">24</p>
|
| 653 |
+
</div>
|
| 654 |
+
<div class="bg-gray-800 p-2 rounded-lg text-center">
|
| 655 |
+
<p class="text-sm text-gray-400 mb-1">Validated</p>
|
| 656 |
+
<p class="text-lg font-mono">187</p>
|
| 657 |
+
</div>
|
| 658 |
+
<div class="bg-gray-800 p-2 rounded-lg text-center">
|
| 659 |
+
<p class="text-sm text-gray-400 mb-1">Accuracy</p>
|
| 660 |
+
<p class="text-lg font-mono text-green-400">99.2%</p>
|
| 661 |
+
</div>
|
| 662 |
+
</div>
|
| 663 |
+
|
| 664 |
+
<div class="w-full">
|
| 665 |
+
<h4 class="text-sm font-semibold mb-2 pixel-font">Recent Activity</h4>
|
| 666 |
+
<div class="space-y-2">
|
| 667 |
+
<div class="flex items-center text-sm">
|
| 668 |
+
<span class="w-2 h-2 rounded-full bg-green-500 mr-2"></span>
|
| 669 |
+
<span>Validated AIXBT v2.1.4</span>
|
| 670 |
+
<span class="text-gray-500 ml-auto">2d ago</span>
|
| 671 |
+
</div>
|
| 672 |
+
<div class="flex items-center text-sm">
|
| 673 |
+
<span class="w-2 h-2 rounded-full bg-blue-500 mr-2"></span>
|
| 674 |
+
<span>Proposed patch for ZKML-1</span>
|
| 675 |
+
<span class="text-gray-500 ml-auto">5d ago</span>
|
| 676 |
+
</div>
|
| 677 |
+
<div class="flex items-center text-sm">
|
| 678 |
+
<span class="w-2 h-2 rounded-full bg-purple-500 mr-2"></span>
|
| 679 |
+
<span>Earned 12,400 LOOP</span>
|
| 680 |
+
<span class="text-gray-500 ml-auto">1w ago</span>
|
| 681 |
+
</div>
|
| 682 |
+
</div>
|
| 683 |
+
</div>
|
| 684 |
+
</div>
|
| 685 |
+
</div>
|
| 686 |
+
</div>
|
| 687 |
+
</div>
|
| 688 |
+
|
| 689 |
+
<!-- Community Feed -->
|
| 690 |
+
<div class="card rounded-xl p-6 mb-8">
|
| 691 |
+
<div class="flex justify-between items-center mb-6">
|
| 692 |
+
<h3 class="section-header">
|
| 693 |
+
<i class="fas fa-comments"></i>
|
| 694 |
+
Community Feed
|
| 695 |
+
</h3>
|
| 696 |
+
<button class="px-4 py-2 bg-gradient-to-r from-blue-600 to-purple-600 hover:from-blue-700 hover:to-purple-700 text-white font-medium rounded-lg transition-all">
|
| 697 |
+
<i class="fas fa-plus mr-2"></i> Propose CIT
|
| 698 |
+
</button>
|
| 699 |
+
</div>
|
| 700 |
+
|
| 701 |
+
<div class="space-y-6">
|
| 702 |
+
<!-- Feed Item -->
|
| 703 |
+
<div class="bg-gray-800 rounded-lg p-4">
|
| 704 |
+
<div class="flex items-start mb-3">
|
| 705 |
+
<div class="w-10 h-10 rounded-full bg-blue-600 flex items-center justify-center mr-3">
|
| 706 |
+
<span class="text-sm font-bold">ZK</span>
|
| 707 |
+
</div>
|
| 708 |
+
<div>
|
| 709 |
+
<div class="flex items-center">
|
| 710 |
+
<span class="font-medium pixel-font">ZKValidator</span>
|
| 711 |
+
<span class="text-xs text-gray-500 ml-2">2 hours ago</span>
|
| 712 |
+
</div>
|
| 713 |
+
<p class="text-sm text-gray-400">Proposed a new CIT for zkML agents: "Standardized benchmarks for zk-SNARK proving times"</p>
|
| 714 |
+
</div>
|
| 715 |
+
</div>
|
| 716 |
+
<div class="flex items-center space-x-4 text-sm">
|
| 717 |
+
<button class="flex items-center text-gray-400 hover:text-blue-400">
|
| 718 |
+
<i class="far fa-thumbs-up mr-1"></i> 12
|
| 719 |
+
</button>
|
| 720 |
+
<button class="flex items-center text-gray-400 hover:text-blue-400">
|
| 721 |
+
<i class="far fa-comment mr-1"></i> 3
|
| 722 |
+
</button>
|
| 723 |
+
<button class="flex items-center text-gray-400 hover:text-blue-400">
|
| 724 |
+
<i class="fas fa-share mr-1"></i> Share
|
| 725 |
+
</button>
|
| 726 |
+
</div>
|
| 727 |
+
</div>
|
| 728 |
+
|
| 729 |
+
<!-- Feed Item -->
|
| 730 |
+
<div class="bg-gray-800 rounded-lg p-4">
|
| 731 |
+
<div class="flex items-start mb-3">
|
| 732 |
+
<div class="w-10 h-10 rounded-full bg-purple-600 flex items-center justify-center mr-3">
|
| 733 |
+
<span class="text-sm font-bold">GP</span>
|
| 734 |
+
</div>
|
| 735 |
+
<div>
|
| 736 |
+
<div class="flex items-center">
|
| 737 |
+
<span class="font-medium pixel-font">GamePro</span>
|
| 738 |
+
<span class="text-xs text-gray-500 ml-2">5 hours ago</span>
|
| 739 |
+
</div>
|
| 740 |
+
<p class="text-sm text-gray-400">Just submitted a patch for GameAI that reduces rendering latency by 15%. Looking for validators!</p>
|
| 741 |
+
</div>
|
| 742 |
+
</div>
|
| 743 |
+
<div class="flex items-center space-x-4 text-sm">
|
| 744 |
+
<button class="flex items-center text-gray-400 hover:text-blue-400">
|
| 745 |
+
<i class="far fa-thumbs-up mr-1"></i> 8
|
| 746 |
+
</button>
|
| 747 |
+
<button class="flex items-center text-gray-400 hover:text-blue-400">
|
| 748 |
+
<i class="far fa-comment mr-1"></i> 2
|
| 749 |
+
</button>
|
| 750 |
+
<button class="flex items-center text-gray-400 hover:text-blue-400">
|
| 751 |
+
<i class="fas fa-share mr-1"></i> Share
|
| 752 |
+
</button>
|
| 753 |
+
</div>
|
| 754 |
+
</div>
|
| 755 |
+
|
| 756 |
+
<!-- Feed Item -->
|
| 757 |
+
<div class="bg-gray-800 rounded-lg p-4">
|
| 758 |
+
<div class="flex items-start mb-3">
|
| 759 |
+
<div class="w-10 h-10 rounded-full bg-green-600 flex items-center justify-center mr-3">
|
| 760 |
+
<span class="text-sm font-bold">DA</span>
|
| 761 |
+
</div>
|
| 762 |
+
<div>
|
| 763 |
+
<div class="flex items-center">
|
| 764 |
+
<span class="font-medium pixel-font">DeFiArchitect</span>
|
| 765 |
+
<span class="text-xs text-gray-500 ml-2">1 day ago</span>
|
| 766 |
+
</div>
|
| 767 |
+
<p class="text-sm text-gray-400">Our proposal for a standardized DeFi agent interface has been approved! Looking forward to community contributions.</p>
|
| 768 |
+
</div>
|
| 769 |
+
</div>
|
| 770 |
+
<div class="flex items-center space-x-4 text-sm">
|
| 771 |
+
<button class="flex items-center text-gray-400 hover:text-blue-400">
|
| 772 |
+
<i class="far fa-thumbs-up mr-1"></i> 24
|
| 773 |
+
</button>
|
| 774 |
+
<button class="flex items-center text-gray-400 hover:text-blue-400">
|
| 775 |
+
<i class="far fa-comment mr-1"></i> 7
|
| 776 |
+
</button>
|
| 777 |
+
<button class="flex items-center text-gray-400 hover:text-blue-400">
|
| 778 |
+
<i class="fas fa-share mr-1"></i> Share
|
| 779 |
+
</button>
|
| 780 |
+
</div>
|
| 781 |
+
</div>
|
| 782 |
+
</div>
|
| 783 |
+
</div>
|
| 784 |
+
|
| 785 |
+
<!-- Community Links -->
|
| 786 |
+
<div class="grid grid-cols-1 md:grid-cols-3 gap-6">
|
| 787 |
+
<div class="card rounded-xl p-6 text-center hover:bg-gray-800 transition-colors cursor-pointer">
|
| 788 |
+
<div class="w-12 h-12 rounded-full bg-blue-600 flex items-center justify-center mx-auto mb-4">
|
| 789 |
+
<i class="fab fa-discord text-xl"></i>
|
| 790 |
+
</div>
|
| 791 |
+
<h4 class="font-medium mb-2 pixel-font">Join Discord</h4>
|
| 792 |
+
<p class="text-sm text-gray-400">Chat with the community and get real-time updates</p>
|
| 793 |
+
</div>
|
| 794 |
+
<div class="card rounded-xl p-6 text-center hover:bg-gray-800 transition-colors cursor-pointer">
|
| 795 |
+
<div class="w-12 h-12 rounded-full bg-purple-600 flex items-center justify-center mx-auto mb-4">
|
| 796 |
+
<i class="fas fa-book text-xl"></i>
|
| 797 |
+
</div>
|
| 798 |
+
<h4 class="font-medium mb-2 pixel-font">Documentation</h4>
|
| 799 |
+
<p class="text-sm text-gray-400">Learn how to contribute and build on LoopLayer</p>
|
| 800 |
+
</div>
|
| 801 |
+
<div class="card rounded-xl p-6 text-center hover:bg-gray-800 transition-colors cursor-pointer">
|
| 802 |
+
<div class="w-12 h-12 rounded-full bg-green-600 flex items-center justify-center mx-auto mb-4">
|
| 803 |
+
<i class="fas fa-file-contract text-xl"></i>
|
| 804 |
+
</div>
|
| 805 |
+
<h4 class="font-medium mb-2 pixel-font">Governance</h4>
|
| 806 |
+
<p class="text-sm text-gray-400">Participate in protocol decisions and proposals</p>
|
| 807 |
+
</div>
|
| 808 |
+
</div>
|
| 809 |
+
</div>
|
| 810 |
+
</div>
|
| 811 |
+
|
| 812 |
+
<footer class="text-center py-6 text-gray-400 text-sm relative z-10">
|
| 813 |
+
<p>© 2023 LoopLayer. All rights reserved.</p>
|
| 814 |
+
</footer>
|
| 815 |
+
|
| 816 |
+
<script>
|
| 817 |
+
// Tab switching functionality
|
| 818 |
+
function switchTab(tabName) {
|
| 819 |
+
// Hide all tab contents
|
| 820 |
+
document.querySelectorAll('.tab-content').forEach(tab => {
|
| 821 |
+
tab.classList.remove('active');
|
| 822 |
+
});
|
| 823 |
+
|
| 824 |
+
// Show the selected tab content
|
| 825 |
+
document.getElementById(tabName).classList.add('active');
|
| 826 |
+
|
| 827 |
+
// Update tab button styles
|
| 828 |
+
const buttons = document.querySelectorAll('[onclick^="switchTab"]');
|
| 829 |
+
buttons.forEach(btn => {
|
| 830 |
+
if (btn.getAttribute('onclick').includes(tabName)) {
|
| 831 |
+
btn.classList.remove('bg-gray-700');
|
| 832 |
+
btn.classList.add('bg-indigo-600');
|
| 833 |
+
} else {
|
| 834 |
+
btn.classList.remove('bg-indigo-600');
|
| 835 |
+
btn.classList.add('bg-gray-700');
|
| 836 |
+
}
|
| 837 |
+
});
|
| 838 |
+
|
| 839 |
+
// If switching to dashboard, recreate the bubble chart
|
| 840 |
+
if (tabName === 'dashboard') {
|
| 841 |
+
createBubbleChart();
|
| 842 |
+
}
|
| 843 |
+
}
|
| 844 |
+
|
| 845 |
+
// Create background bubbles
|
| 846 |
+
function createBackgroundBubbles() {
|
| 847 |
+
const container = document.getElementById('background-bubbles');
|
| 848 |
+
const colors = ['rgba(0, 194, 255, 0.1)', 'rgba(140, 82, 255, 0.1)', 'rgba(0, 255, 157, 0.1)'];
|
| 849 |
+
|
| 850 |
+
for (let i = 0; i < 20; i++) {
|
| 851 |
+
const bubble = document.createElement('div');
|
| 852 |
+
bubble.className = 'bubble absolute rounded-full pointer-events-none';
|
| 853 |
+
|
| 854 |
+
// Random size between 20px and 150px
|
| 855 |
+
const size = Math.random() * 130 + 20;
|
| 856 |
+
bubble.style.width = `${size}px`;
|
| 857 |
+
bubble.style.height = `${size}px`;
|
| 858 |
+
|
| 859 |
+
// Random position
|
| 860 |
+
bubble.style.left = `${Math.random() * 100}%`;
|
| 861 |
+
bubble.style.top = `${Math.random() * 100}%`;
|
| 862 |
+
|
| 863 |
+
// Random color
|
| 864 |
+
bubble.style.backgroundColor = colors[Math.floor(Math.random() * colors.length)];
|
| 865 |
+
|
| 866 |
+
// Random animation duration and delay
|
| 867 |
+
const duration = Math.random() * 20 + 10;
|
| 868 |
+
const delay = Math.random() * 5;
|
| 869 |
+
bubble.style.animation = `float ${duration}s ease-in-out ${delay}s infinite`;
|
| 870 |
+
|
| 871 |
+
container.appendChild(bubble);
|
| 872 |
+
}
|
| 873 |
+
}
|
| 874 |
+
|
| 875 |
+
// Create bubble chart for AI Agents
|
| 876 |
+
function createBubbleChart() {
|
| 877 |
+
// Clear existing bubbles
|
| 878 |
+
const container = document.getElementById('bubble-chart');
|
| 879 |
+
container.innerHTML = '';
|
| 880 |
+
|
| 881 |
+
// Sample data - in a real app, this would come from APIs
|
| 882 |
+
const agents = [
|
| 883 |
+
{ id: 'aixbt-1', name: 'AIXBT', score: 92.4, category: 'DeFi', patches: 7, lastUpdate: '2023-10-15', source: 'loop' },
|
| 884 |
+
{ id: 'gameai-2', name: 'GameAI', score: 85.2, category: 'Gaming', patches: 5, lastUpdate: '2023-10-14', source: 'loop' },
|
| 885 |
+
{ id: 'zkml-3', name: 'ZKML-1', score: 88.7, category: 'zkML', patches: 9, lastUpdate: '2023-10-13', source: 'loop' },
|
| 886 |
+
{ id: 'daobot-4', name: 'DAOBot', score: 78.3, category: 'DAO', patches: 4, lastUpdate: '2023-10-12', source: 'loop' },
|
| 887 |
+
{ id: 'vitalik-5', name: 'Vitalik', score: 3569.71, category: 'DeFi', patches: 0, lastUpdate: '2023-10-15', source: 'kaito' },
|
| 888 |
+
{ id: 'nftbot-6', name: 'NFTBot', score: 65.8, category: 'NFT', patches: 3, lastUpdate: '2023-10-11', source: 'loop' },
|
| 889 |
+
{ id: 'defi-7', name: 'DeFiMax', score: 81.5, category: 'DeFi', patches: 6, lastUpdate: '2023-10-10', source: 'loop' },
|
| 890 |
+
{ id: 'oracle-8', name: 'OracleX', score: 76.2, category: 'Oracle', patches: 2, lastUpdate: '2023-10-09', source: 'loop' },
|
| 891 |
+
{ id: 'lending-9', name: 'LendFi', score: 72.9, category: 'DeFi', patches: 3, lastUpdate: '2023-10-08', source: 'loop' },
|
| 892 |
+
{ id: 'gamefi-10', name: 'GameFiPro', score: 68.4, category: 'Gaming', patches: 2, lastUpdate: '2023-10-07', source: 'loop' }
|
| 893 |
+
];
|
| 894 |
+
|
| 895 |
+
// Set up SVG container
|
| 896 |
+
const width = container.clientWidth;
|
| 897 |
+
const height = container.clientHeight;
|
| 898 |
+
|
| 899 |
+
const svg = d3.select(container)
|
| 900 |
+
.append('svg')
|
| 901 |
+
.attr('width', width)
|
| 902 |
+
.attr('height', height);
|
| 903 |
+
|
| 904 |
+
// Create a force simulation
|
| 905 |
+
const simulation = d3.forceSimulation(agents)
|
| 906 |
+
.force('charge', d3.forceManyBody().strength(5))
|
| 907 |
+
.force('center', d3.forceCenter(width / 2, height / 2))
|
| 908 |
+
.force('collision', d3.forceCollide().radius(d => {
|
| 909 |
+
// Normalize scores for bubble sizes
|
| 910 |
+
if (d.source === 'kaito') {
|
| 911 |
+
return Math.min(60, Math.max(20, d.score / 60));
|
| 912 |
+
}
|
| 913 |
+
return d.score * 0.6;
|
| 914 |
+
}));
|
| 915 |
+
|
| 916 |
+
// Create bubbles
|
| 917 |
+
const bubbles = svg.selectAll('g')
|
| 918 |
+
.data(agents)
|
| 919 |
+
.enter()
|
| 920 |
+
.append('g')
|
| 921 |
+
.attr('transform', d => `translate(${width / 2}, ${height / 2})`);
|
| 922 |
+
|
| 923 |
+
// Add circles for each bubble
|
| 924 |
+
bubbles.append('circle')
|
| 925 |
+
.attr('r', d => {
|
| 926 |
+
if (d.source === 'kaito') {
|
| 927 |
+
return Math.min(60, Math.max(20, d.score / 60));
|
| 928 |
+
}
|
| 929 |
+
return d.score * 0.6;
|
| 930 |
+
})
|
| 931 |
+
.attr('fill', d => {
|
| 932 |
+
switch(d.category) {
|
| 933 |
+
case 'DeFi': return 'rgba(0, 194, 255, 0.3)';
|
| 934 |
+
case 'Gaming': return 'rgba(140, 82, 255, 0.3)';
|
| 935 |
+
case 'zkML': return 'rgba(0, 255, 157, 0.3)';
|
| 936 |
+
case 'DAO': return 'rgba(255, 184, 0, 0.3)';
|
| 937 |
+
default: return 'rgba(255, 255, 255, 0.2)';
|
| 938 |
+
}
|
| 939 |
+
})
|
| 940 |
+
.attr('stroke', d => {
|
| 941 |
+
switch(d.category) {
|
| 942 |
+
case 'DeFi': return '#00C2FF';
|
| 943 |
+
case 'Gaming': return '#8C52FF';
|
| 944 |
+
case 'zkML': return '#00FF9D';
|
| 945 |
+
case 'DAO': return '#FFB800';
|
| 946 |
+
default: return '#FFFFFF';
|
| 947 |
+
}
|
| 948 |
+
})
|
| 949 |
+
.attr('stroke-width', 1)
|
| 950 |
+
.attr('class', 'cursor-pointer')
|
| 951 |
+
.on('mouseover', function(event, d) {
|
| 952 |
+
d3.select(this)
|
| 953 |
+
.transition()
|
| 954 |
+
.duration(200)
|
| 955 |
+
.attr('stroke-width', 3)
|
| 956 |
+
.attr('filter', 'url(#glow)');
|
| 957 |
+
|
| 958 |
+
// Show tooltip
|
| 959 |
+
tooltip.style('opacity', 1)
|
| 960 |
+
.html(`
|
| 961 |
+
<div class="text-sm">
|
| 962 |
+
<div class="font-bold pixel-font">${d.name}</div>
|
| 963 |
+
<div class="text-${d.category === 'DeFi' ? 'blue' : d.category === 'Gaming' ? 'purple' : d.category === 'zkML' ? 'green' : 'yellow'}-400">${d.category}</div>
|
| 964 |
+
<div class="mt-1">Score: ${d.score}</div>
|
| 965 |
+
<div>Patches: ${d.patches}</div>
|
| 966 |
+
<div class="text-xs text-gray-400">Updated: ${d.lastUpdate}</div>
|
| 967 |
+
<div class="text-xs text-gray-400">Source: ${d.source === 'loop' ? 'LoopLayer' : 'Kaito'}</div>
|
| 968 |
+
</div>
|
| 969 |
+
`);
|
| 970 |
+
})
|
| 971 |
+
.on('mouseout', function() {
|
| 972 |
+
d3.select(this)
|
| 973 |
+
.transition()
|
| 974 |
+
.duration(200)
|
| 975 |
+
.attr('stroke-width', 1)
|
| 976 |
+
.attr('filter', null);
|
| 977 |
+
|
| 978 |
+
// Hide tooltip
|
| 979 |
+
tooltip.style('opacity', 0);
|
| 980 |
+
})
|
| 981 |
+
.on('click', function(event, d) {
|
| 982 |
+
// In a real app, this would open the agent in the Patches tab
|
| 983 |
+
alert(`Showing details for ${d.name}\nCategory: ${d.category}\nScore: ${d.score}\nPatches: ${d.patches}`);
|
| 984 |
+
});
|
| 985 |
+
|
| 986 |
+
// Add glow filter
|
| 987 |
+
const defs = svg.append('defs');
|
| 988 |
+
const glowFilter = defs.append('filter')
|
| 989 |
+
.attr('id', 'glow')
|
| 990 |
+
.attr('height', '130%')
|
| 991 |
+
.attr('width', '130%');
|
| 992 |
+
|
| 993 |
+
glowFilter.append('feGaussianBlur')
|
| 994 |
+
.attr('stdDeviation', '3.5')
|
| 995 |
+
.attr('result', 'coloredBlur');
|
| 996 |
+
|
| 997 |
+
const feMerge = glowFilter.append('feMerge');
|
| 998 |
+
feMerge.append('feMergeNode').attr('in', 'coloredBlur');
|
| 999 |
+
feMerge.append('feMergeNode').attr('in', 'SourceGraphic');
|
| 1000 |
+
|
| 1001 |
+
// Add text labels
|
| 1002 |
+
bubbles.append('text')
|
| 1003 |
+
.text(d => d.name)
|
| 1004 |
+
.attr('text-anchor', 'middle')
|
| 1005 |
+
.attr('dy', '.3em')
|
| 1006 |
+
.attr('fill', 'white')
|
| 1007 |
+
.attr('font-size', d => {
|
| 1008 |
+
const size = d.source === 'kaito' ?
|
| 1009 |
+
Math.min(12, Math.max(8, d.score / 300)) :
|
| 1010 |
+
Math.min(12, Math.max(8, d.score / 20));
|
| 1011 |
+
return `${size}px`;
|
| 1012 |
+
})
|
| 1013 |
+
.attr('class', 'pointer-events-none pixel-font');
|
| 1014 |
+
|
| 1015 |
+
// Create tooltip
|
| 1016 |
+
const tooltip = d3.select(container)
|
| 1017 |
+
.append('div')
|
| 1018 |
+
.attr('class', 'absolute bg-gray-900 border border-gray-700 rounded-lg p-3 pointer-events-none opacity-0 transition-opacity')
|
| 1019 |
+
.style('left', '0')
|
| 1020 |
+
.style('top', '0');
|
| 1021 |
+
|
| 1022 |
+
// Update positions on simulation tick
|
| 1023 |
+
simulation.on('tick', () => {
|
| 1024 |
+
bubbles.attr('transform', d => `translate(${d.x}, ${d.y})`);
|
| 1025 |
+
|
| 1026 |
+
// Keep bubbles within container
|
| 1027 |
+
agents.forEach(d => {
|
| 1028 |
+
const radius = d.source === 'kaito' ?
|
| 1029 |
+
Math.min(60, Math.max(20, d.score / 60)) :
|
| 1030 |
+
d.score * 0.6;
|
| 1031 |
+
|
| 1032 |
+
d.x = Math.max(radius, Math.min(width - radius, d.x));
|
| 1033 |
+
d.y = Math.max(radius, Math.min(height - radius, d.y));
|
| 1034 |
+
});
|
| 1035 |
+
});
|
| 1036 |
+
}
|
| 1037 |
+
|
| 1038 |
+
// Create line chart for LoopScore over time
|
| 1039 |
+
function createScoreChart() {
|
| 1040 |
+
const ctx = document.getElementById('scoreChart').getContext('2d');
|
| 1041 |
+
|
| 1042 |
+
// Sample data
|
| 1043 |
+
const labels = Array.from({length: 30}, (_, i) => `Day ${i+1}`);
|
| 1044 |
+
const data = Array.from({length: 30}, (_, i) => 70 + Math.sin(i/3) * 10 + Math.random() * 5);
|
| 1045 |
+
|
| 1046 |
+
new Chart(ctx, {
|
| 1047 |
+
type: 'line',
|
| 1048 |
+
data: {
|
| 1049 |
+
labels: labels,
|
| 1050 |
+
datasets: [{
|
| 1051 |
+
label: 'LoopScore',
|
| 1052 |
+
data: data,
|
| 1053 |
+
borderColor: '#00C2FF',
|
| 1054 |
+
backgroundColor: 'rgba(0, 194, 255, 0.1)',
|
| 1055 |
+
borderWidth: 2,
|
| 1056 |
+
fill: true,
|
| 1057 |
+
tension: 0.4,
|
| 1058 |
+
pointRadius: 0
|
| 1059 |
+
}]
|
| 1060 |
+
},
|
| 1061 |
+
options: {
|
| 1062 |
+
responsive: true,
|
| 1063 |
+
maintainAspectRatio: false,
|
| 1064 |
+
plugins: {
|
| 1065 |
+
legend: {
|
| 1066 |
+
display: false
|
| 1067 |
+
}
|
| 1068 |
+
},
|
| 1069 |
+
scales: {
|
| 1070 |
+
y: {
|
| 1071 |
+
beginAtZero: false,
|
| 1072 |
+
grid: {
|
| 1073 |
+
color: 'rgba(255, 255, 255, 0.1)'
|
| 1074 |
+
},
|
| 1075 |
+
ticks: {
|
| 1076 |
+
color: 'rgba(255, 255, 255, 0.7)'
|
| 1077 |
+
}
|
| 1078 |
+
},
|
| 1079 |
+
x: {
|
| 1080 |
+
grid: {
|
| 1081 |
+
display: false
|
| 1082 |
+
},
|
| 1083 |
+
ticks: {
|
| 1084 |
+
color: 'rgba(255, 255, 255, 0.7)'
|
| 1085 |
+
}
|
| 1086 |
+
}
|
| 1087 |
+
}
|
| 1088 |
+
}
|
| 1089 |
+
});
|
| 1090 |
+
}
|
| 1091 |
+
|
| 1092 |
+
// Populate agent table
|
| 1093 |
+
function populateAgentTable() {
|
| 1094 |
+
const agents = [
|
| 1095 |
+
{ name: 'AIXBT', category: 'DeFi', score: 92.4, patches: 7, updated: '2023-10-15', status: 'Active' },
|
| 1096 |
+
{ name: 'GameAI', category: 'Gaming', score: 85.2, patches: 5, updated: '2023-10-14', status: 'Active' },
|
| 1097 |
+
{ name: 'ZKML-1', category: 'zkML', score: 88.7, patches: 9, updated: '2023-10-13', status: 'Active' },
|
| 1098 |
+
{ name: 'DAOBot', category: 'DAO', score: 78.3, patches: 4, updated: '2023-10-12', status: 'Active' },
|
| 1099 |
+
{ name: 'NFTBot', category: 'NFT', score: 65.8, patches: 3, updated: '2023-10-11', status: 'Active' },
|
| 1100 |
+
{ name: 'DeFiMax', category: 'DeFi', score: 81.5, patches: 6, updated: '2023-10-10', status: 'Active' },
|
| 1101 |
+
{ name: 'OracleX', category: 'Oracle', score: 76.2, patches: 2, updated: '2023-10-09', status: 'Active' },
|
| 1102 |
+
{ name: 'LendFi', category: 'DeFi', score: 72.9, patches: 3, updated: '2023-10-08', status: 'Active' },
|
| 1103 |
+
{ name: 'GameFiPro', category: 'Gaming', score: 68.4, patches: 2, updated: '2023-10-07', status: 'Active' }
|
| 1104 |
+
];
|
| 1105 |
+
|
| 1106 |
+
const tbody = document.getElementById('agent-table-body');
|
| 1107 |
+
|
| 1108 |
+
agents.forEach(agent => {
|
| 1109 |
+
const row = document.createElement('tr');
|
| 1110 |
+
row.className = 'hover:bg-gray-800 cursor-pointer';
|
| 1111 |
+
|
| 1112 |
+
// Status badge color
|
| 1113 |
+
let statusClass = '';
|
| 1114 |
+
let statusText = '';
|
| 1115 |
+
switch(agent.status) {
|
| 1116 |
+
case 'Active':
|
| 1117 |
+
statusClass = 'bg-green-900 text-green-300';
|
| 1118 |
+
statusText = 'status-active';
|
| 1119 |
+
break;
|
| 1120 |
+
case 'Pending':
|
| 1121 |
+
statusClass = 'bg-yellow-900 text-yellow-300';
|
| 1122 |
+
statusText = 'status-pending';
|
| 1123 |
+
break;
|
| 1124 |
+
case 'Inactive':
|
| 1125 |
+
statusClass = 'bg-red-900 text-red-300';
|
| 1126 |
+
statusText = 'status-inactive';
|
| 1127 |
+
break;
|
| 1128 |
+
default:
|
| 1129 |
+
statusClass = 'bg-gray-700 text-gray-300';
|
| 1130 |
+
}
|
| 1131 |
+
|
| 1132 |
+
row.innerHTML = `
|
| 1133 |
+
<td class="px-6 py-4 whitespace-nowrap font-medium pixel-font">${agent.name}</td>
|
| 1134 |
+
<td class="px-6 py-4 whitespace-nowrap">
|
| 1135 |
+
<span class="text-xs px-2 py-1 rounded-full ${agent.category === 'DeFi' ? 'bg-blue-900 text-blue-300' : agent.category === 'Gaming' ? 'bg-purple-900 text-purple-300' : agent.category === 'zkML' ? 'bg-green-900 text-green-300' : 'bg-yellow-900 text-yellow-300'}">
|
| 1136 |
+
${agent.category}
|
| 1137 |
+
</span>
|
| 1138 |
+
</td>
|
| 1139 |
+
<td class="px-6 py-4 whitespace-nowrap font-mono">${agent.score}</td>
|
| 1140 |
+
<td class="px-6 py-4 whitespace-nowrap font-mono">${agent.patches}</td>
|
| 1141 |
+
<td class="px-6 py-4 whitespace-nowrap">${agent.updated}</td>
|
| 1142 |
+
<td class="px-6 py-4 whitespace-nowrap">
|
| 1143 |
+
<span class="${statusText} text-xs px-2 py-1 rounded-full ${statusClass}">${agent.status}</span>
|
| 1144 |
+
</td>
|
| 1145 |
+
`;
|
| 1146 |
+
|
| 1147 |
+
row.addEventListener('click', () => {
|
| 1148 |
+
// In a real app, this would switch to the Patches tab with this agent selected
|
| 1149 |
+
alert(`Showing details for ${agent.name}\nCategory: ${agent.category}\nScore: ${agent.score}\nPatches: ${agent.patches}`);
|
| 1150 |
+
});
|
| 1151 |
+
|
| 1152 |
+
tbody.appendChild(row);
|
| 1153 |
+
});
|
| 1154 |
+
}
|
| 1155 |
+
|
| 1156 |
+
// Populate contributors table
|
| 1157 |
+
function populateContributorsTable() {
|
| 1158 |
+
const contributors = [
|
| 1159 |
+
{ rank: 1, name: 'QuantumStake', role: 'Solver', patches: 24, validated: 187, accuracy: 99.2, rewards: 24500 },
|
| 1160 |
+
{ rank: 2, name: 'InfinityNode', role: 'Solver', patches: 18, validated: 156, accuracy: 98.7, rewards: 19200 },
|
| 1161 |
+
{ rank: 3, name: 'StakeCapital', role: 'Solver', patches: 15, validated: 132, accuracy: 97.8, rewards: 14700 },
|
| 1162 |
+
{ rank: 4, name: 'ZKValidator', role: 'Validator', patches: 8, validated: 210, accuracy: 99.5, rewards: 12500 },
|
| 1163 |
+
{ rank: 5, name: 'DeFiArchitect', role: 'Solver', patches: 12, validated: 98, accuracy: 96.3, rewards: 9800 }
|
| 1164 |
+
];
|
| 1165 |
+
|
| 1166 |
+
const tbody = document.getElementById('contributors-table-body');
|
| 1167 |
+
|
| 1168 |
+
contributors.forEach(contributor => {
|
| 1169 |
+
const row = document.createElement('tr');
|
| 1170 |
+
row.className = 'hover:bg-gray-800 cursor-pointer';
|
| 1171 |
+
|
| 1172 |
+
row.innerHTML = `
|
| 1173 |
+
<td class="px-6 py-4 whitespace-nowrap">
|
| 1174 |
+
<div class="flex items-center">
|
| 1175 |
+
<div class="rank-badge ${contributor.rank === 1 ? 'rank-1' : contributor.rank === 2 ? 'rank-2' : 'rank-3'}">
|
| 1176 |
+
${contributor.rank}
|
| 1177 |
+
</div>
|
| 1178 |
+
</div>
|
| 1179 |
+
</td>
|
| 1180 |
+
<td class="px-6 py-4 whitespace-nowrap font-medium pixel-font">${contributor.name}</td>
|
| 1181 |
+
<td class="px-6 py-4 whitespace-nowrap font-mono">${contributor.patches}</td>
|
| 1182 |
+
<td class="px-6 py-4 whitespace-nowrap font-mono">${contributor.accuracy}%</td>
|
| 1183 |
+
<td class="px-6 py-4 whitespace-nowrap font-mono text-green-400">+${contributor.rewards.toLocaleString()}</td>
|
| 1184 |
+
`;
|
| 1185 |
+
|
| 1186 |
+
row.addEventListener('click', () => {
|
| 1187 |
+
// In a real app, this would show the contributor's profile
|
| 1188 |
+
alert(`Showing profile for ${contributor.name}\nRank: ${contributor.rank}\nPatches: ${contributor.patches}\nRewards: ${contributor.rewards}`);
|
| 1189 |
+
});
|
| 1190 |
+
|
| 1191 |
+
tbody.appendChild(row);
|
| 1192 |
+
});
|
| 1193 |
+
}
|
| 1194 |
+
|
| 1195 |
+
// Initialize everything when the page loads
|
| 1196 |
+
window.onload = function() {
|
| 1197 |
+
createBackgroundBubbles();
|
| 1198 |
+
createBubbleChart();
|
| 1199 |
+
createScoreChart();
|
| 1200 |
+
populateAgentTable();
|
| 1201 |
+
populateContributorsTable();
|
| 1202 |
+
|
| 1203 |
+
// Set up tab switching for community tabs
|
| 1204 |
+
document.getElementById('solvers-tab').addEventListener('click', function() {
|
| 1205 |
+
this.classList.remove('bg-gray-700');
|
| 1206 |
+
this.classList.add('bg-blue-600');
|
| 1207 |
+
document.getElementById('validators-tab').classList.remove('bg-blue-600');
|
| 1208 |
+
document.getElementById('validators-tab').classList.add('bg-gray-700');
|
| 1209 |
+
document.getElementById('checkers-tab').classList.remove('bg-blue-600');
|
| 1210 |
+
document.getElementById('checkers-tab').classList.add('bg-gray-700');
|
| 1211 |
+
// In a real app, this would filter the table
|
| 1212 |
+
});
|
| 1213 |
+
|
| 1214 |
+
document.getElementById('validators-tab').addEventListener('click', function() {
|
| 1215 |
+
this.classList.remove('bg-gray-700');
|
| 1216 |
+
this.classList.add('bg-blue-600');
|
| 1217 |
+
document.getElementById('solvers-tab').classList.remove('bg-blue-600');
|
| 1218 |
+
document.getElementById('solvers-tab').classList.add('bg-gray-700');
|
| 1219 |
+
document.getElementById('checkers-tab').classList.remove('bg-blue-600');
|
| 1220 |
+
document.getElementById('checkers-tab').classList.add('bg-gray-700');
|
| 1221 |
+
// In a real app, this would filter the table
|
| 1222 |
+
});
|
| 1223 |
+
|
| 1224 |
+
document.getElementById('checkers-tab').addEventListener('click', function() {
|
| 1225 |
+
this.classList.remove('bg-gray-700');
|
| 1226 |
+
this.classList.add('bg-blue-600');
|
| 1227 |
+
document.getElementById('solvers-tab').classList.remove('bg-blue-600');
|
| 1228 |
+
document.getElementById('solvers-tab').classList.add('bg-gray-700');
|
| 1229 |
+
document.getElementById('validators-tab').classList.remove('bg-blue-600');
|
| 1230 |
+
document.getElementById('validators-tab').classList.add('bg-gray-700');
|
| 1231 |
+
// In a real app, this would filter the table
|
| 1232 |
+
});
|
| 1233 |
+
|
| 1234 |
+
// Simulate some data updates
|
| 1235 |
+
setInterval(() => {
|
| 1236 |
+
const uptimeElement = document.querySelector('.pulse');
|
| 1237 |
+
if (uptimeElement) {
|
| 1238 |
+
// Randomly change status for demo purposes
|
| 1239 |
+
if (Math.random() > 0.95) {
|
| 1240 |
+
uptimeElement.classList.remove('bg-green-500', 'pulse');
|
| 1241 |
+
|
| 1242 |
+
</html>
|