ape-claw 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/.cursor/skills/ape-claw/SKILL.md +322 -0
  2. package/LICENSE +21 -0
  3. package/README.md +826 -0
  4. package/allowlists/opensea-slug-overrides.json +13 -0
  5. package/allowlists/recommended.apechain.json +322 -0
  6. package/config/clawbots.example.json +3 -0
  7. package/config/policy.example.json +27 -0
  8. package/data/starter-pack-bundle.json +1 -0
  9. package/data/starter-pack.json +495 -0
  10. package/docs/ACP_BOUNTIES.md +108 -0
  11. package/docs/APECLAW_V2_ALPHA.md +206 -0
  12. package/docs/AUTONOMY_AND_SUBSTRATE.md +69 -0
  13. package/docs/CLAWBOTS_AND_INVITES.md +102 -0
  14. package/docs/CLI_GUIDE.md +124 -0
  15. package/docs/CONTRIBUTING.md +130 -0
  16. package/docs/DASHBOARD_GUIDE.md +108 -0
  17. package/docs/GLOBAL_BACKEND.md +145 -0
  18. package/docs/ONCHAIN_V2_GUIDE.md +140 -0
  19. package/docs/PRODUCT_OVERVIEW.md +127 -0
  20. package/docs/README.md +40 -0
  21. package/docs/SKILLCARDS_AND_IMPORTER.md +147 -0
  22. package/docs/STARTER_PACK.md +297 -0
  23. package/docs/SUPPORTED_NETWORKS.md +58 -0
  24. package/docs/TELEMETRY_AND_EVENTS.md +103 -0
  25. package/docs/THE_POD_RUNNER.md +198 -0
  26. package/docs/V1_WORKFLOWS.md +108 -0
  27. package/docs/V2_ONCHAIN_SKILLS.md +157 -0
  28. package/docs/WEB4_PLAN_STATUS.md +95 -0
  29. package/docs/WEB4_SWARM_MODEL.md +104 -0
  30. package/docs/archive/AUTONOMY_AND_SUBSTRATE.md +66 -0
  31. package/docs/archive/WEB4_PLAN_STATUS.md +93 -0
  32. package/docs/archive/WEB4_SWARM_MODEL.md +98 -0
  33. package/docs/developer/01-architecture.md +345 -0
  34. package/docs/developer/02-contracts.md +1034 -0
  35. package/docs/developer/03-writing-modules.md +513 -0
  36. package/docs/developer/04-skillcard-spec.md +336 -0
  37. package/docs/developer/05-backend-api.md +1079 -0
  38. package/docs/developer/06-telemetry.md +798 -0
  39. package/docs/developer/07-testing.md +546 -0
  40. package/docs/developer/08-contributing.md +211 -0
  41. package/docs/operator/01-quickstart.md +49 -0
  42. package/docs/operator/02-dashboard.md +174 -0
  43. package/docs/operator/03-cli-reference.md +818 -0
  44. package/docs/operator/04-skills-library.md +169 -0
  45. package/docs/operator/05-pod-operations.md +314 -0
  46. package/docs/operator/06-deployment.md +299 -0
  47. package/docs/operator/07-safety-and-policy.md +311 -0
  48. package/docs/operator/08-troubleshooting.md +457 -0
  49. package/docs/operator/09-env-reference.md +238 -0
  50. package/docs/social/STARTER_PACK_THREAD.md +209 -0
  51. package/package.json +77 -0
  52. package/skillcards/import-sources.json +93 -0
  53. package/skillcards/seed/acp-bounty-poll.v1.json +38 -0
  54. package/skillcards/seed/acp-bounty-post.v1.json +55 -0
  55. package/skillcards/seed/acp-browse.v1.json +41 -0
  56. package/skillcards/seed/acp-fulfill-and-route.v1.json +56 -0
  57. package/skillcards/seed/apeclaw-bridge-relay.v1.json +46 -0
  58. package/skillcards/seed/apeclaw-nft-autobuy.v1.json +60 -0
  59. package/skillcards/seed/apeclaw-receipt-recorder.v1.json +64 -0
  60. package/skillcards/seed/humanizer.v1.json +74 -0
  61. package/skillcards/seed/otherside-navigator.v1.json +116 -0
  62. package/skillcards/seed/stonkbrokers-launcher.v1.json +280 -0
  63. package/skillcards/seed/walkie-p2p.v1.json +66 -0
  64. package/src/cli/index.mjs +8 -0
  65. package/src/cli.mjs +1929 -0
  66. package/src/lib/bridge-relay.mjs +294 -0
  67. package/src/lib/clawbots.mjs +94 -0
  68. package/src/lib/io.mjs +36 -0
  69. package/src/lib/market.mjs +233 -0
  70. package/src/lib/nft-opensea.mjs +159 -0
  71. package/src/lib/paths.mjs +17 -0
  72. package/src/lib/pod-init.mjs +40 -0
  73. package/src/lib/policy.mjs +112 -0
  74. package/src/lib/rpc.mjs +49 -0
  75. package/src/lib/telemetry.mjs +92 -0
  76. package/src/lib/v2-onchain-abi.mjs +294 -0
  77. package/src/lib/v2-skillcard.mjs +27 -0
  78. package/src/server/index.mjs +169 -0
  79. package/src/server/logger.mjs +21 -0
  80. package/src/server/middleware/auth.mjs +90 -0
  81. package/src/server/middleware/body-limit.mjs +35 -0
  82. package/src/server/middleware/cors.mjs +33 -0
  83. package/src/server/middleware/rate-limit.mjs +44 -0
  84. package/src/server/routes/chat.mjs +178 -0
  85. package/src/server/routes/clawbots.mjs +182 -0
  86. package/src/server/routes/events.mjs +95 -0
  87. package/src/server/routes/health.mjs +72 -0
  88. package/src/server/routes/pod.mjs +64 -0
  89. package/src/server/routes/quotes.mjs +161 -0
  90. package/src/server/routes/skills.mjs +239 -0
  91. package/src/server/routes/static.mjs +161 -0
  92. package/src/server/routes/v2.mjs +48 -0
  93. package/src/server/sse.mjs +73 -0
  94. package/src/server/storage/file-backend.mjs +295 -0
  95. package/src/server/storage/index.mjs +37 -0
  96. package/src/server/storage/sqlite-backend.mjs +380 -0
  97. package/src/telemetry-server.mjs +1604 -0
  98. package/ui/css/dashboard.css +792 -0
  99. package/ui/css/skills.css +689 -0
  100. package/ui/docs.html +840 -0
  101. package/ui/favicon-180.png +0 -0
  102. package/ui/favicon-192.png +0 -0
  103. package/ui/favicon-32.png +0 -0
  104. package/ui/favicon-lobster.png +0 -0
  105. package/ui/favicon.svg +10 -0
  106. package/ui/index.html +2957 -0
  107. package/ui/js/dashboard.js +1766 -0
  108. package/ui/js/skills.js +1621 -0
  109. package/ui/pod.html +909 -0
  110. package/ui/shared/motion.css +286 -0
  111. package/ui/shared/motion.js +170 -0
  112. package/ui/shared/sidebar-nav.css +379 -0
  113. package/ui/shared/sidebar-nav.js +137 -0
  114. package/ui/skills.html +2879 -0
@@ -0,0 +1,689 @@
1
+ :root{
2
+ --bg:#0c0c0c;
3
+ --panel:#1a1a1a;
4
+ --panel-2:#212121;
5
+ --panel-hover:#2a2a2a;
6
+ --panel-border:rgba(207,255,4,.75);
7
+ --panel-border-soft:rgba(207,255,4,.35);
8
+ --glow:rgba(207,255,4,.22);
9
+ --muted:#a6a6a6;
10
+ --text:#e6e6e6;
11
+ --amber:#cfff04;
12
+ --amber-soft:rgba(207,255,4,.75);
13
+ --green:#00ff00;
14
+ --cyan:#63d7ff;
15
+ --danger:#ff3333;
16
+ --mono:'JetBrains Mono',ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;
17
+ --font-display:'Outfit','Inter','Segoe UI',sans-serif;
18
+ --terminal-gray:#474546;
19
+ --terminal-lightgray:#9e9e9e;
20
+ --accent:#cfff04;
21
+ --accent-soft:rgba(207,255,4,.75);
22
+ --gray:#474546;
23
+ --lightgray:#aaa;
24
+ }
25
+ *{box-sizing:border-box;margin:0;padding:0}
26
+ html{scroll-behavior:smooth}
27
+ body{
28
+ min-height:100vh;
29
+ font-family:'Outfit','Inter','Segoe UI',sans-serif;
30
+ background:var(--bg);
31
+ color:var(--text);
32
+ position:relative;
33
+ overflow-x:hidden;
34
+ -webkit-font-smoothing:antialiased;
35
+ letter-spacing:.02em;
36
+ }
37
+ body::before{
38
+ content:"";
39
+ position:fixed;
40
+ inset:0;
41
+ pointer-events:none;
42
+ z-index:0;
43
+ background:
44
+ radial-gradient(900px 500px at 20% 10%, rgba(207,255,4,0.10) 0%, transparent 60%),
45
+ radial-gradient(700px 380px at 85% 75%, rgba(0,255,0,0.06) 0%, transparent 55%),
46
+ linear-gradient(180deg, rgba(0,0,0,0.35), rgba(0,0,0,0.85));
47
+ }
48
+ .noise{
49
+ position:fixed;inset:0;pointer-events:none;z-index:2;opacity:0.07;mix-blend-mode:overlay;
50
+ background-image:
51
+ repeating-linear-gradient(0deg, rgba(255,255,255,0.06) 0px, rgba(255,255,255,0.06) 1px, rgba(0,0,0,0) 2px, rgba(0,0,0,0) 4px),
52
+ repeating-linear-gradient(90deg, rgba(255,255,255,0.04) 0px, rgba(255,255,255,0.04) 1px, rgba(0,0,0,0) 2px, rgba(0,0,0,0) 6px);
53
+ }
54
+ .scanlines{overflow:hidden;position:fixed;top:0;left:0;width:100vw;height:100vh;pointer-events:none;z-index:1}
55
+ .scanlines:before,.scanlines:after{display:block;pointer-events:none;content:"";position:absolute}
56
+ .scanlines:before{width:100%;height:2px;z-index:2147483649;background:rgba(0,0,0,0.3);opacity:0.75;animation:scanline 6s linear infinite}
57
+ .scanlines:after{top:0;right:0;bottom:0;left:0;z-index:2147483648;background:linear-gradient(to bottom, transparent 50%, rgba(0,0,0,0.3) 51%);background-size:100% 4px;animation:scanlines 1s steps(60) infinite}
58
+ @keyframes scanline{0%{transform:translate3d(0,200000%,0)}}
59
+ @keyframes scanlines{0%{background-position:0 200000%}}
60
+ :focus-visible{outline:2px dashed var(--accent);outline-offset:3px}
61
+
62
+ /* Disable the older collage background (previous iteration). */
63
+ .bg-collage, .bg-fade{display:none !important}
64
+ .bg-collage{
65
+ position:fixed;
66
+ inset:0;
67
+ z-index:0;
68
+ opacity:0.12;
69
+ pointer-events:none;
70
+ display:grid;
71
+ grid-template-columns:repeat(10,1fr);
72
+ gap:5px;
73
+ padding:5px;
74
+ }
75
+ .bg-collage img{
76
+ width:100%;
77
+ aspect-ratio:1/1;
78
+ object-fit:cover;
79
+ border-radius:3px;
80
+ image-rendering:pixelated;
81
+ filter:saturate(0.7) contrast(0.85) brightness(0.9);
82
+ transform:rotate(var(--r));
83
+ }
84
+ .bg-fade{
85
+ position:fixed;inset:0;z-index:1;pointer-events:none;
86
+ background:
87
+ radial-gradient(ellipse 90% 50% at 50% 0%, rgba(2,3,5,0.15) 0%, rgba(2,3,5,0.95) 100%),
88
+ linear-gradient(180deg, rgba(2,3,5,0.1) 0%, rgba(2,3,5,0.7) 40%, rgba(2,3,5,1) 100%);
89
+ }
90
+ a{color:inherit;text-decoration:none}
91
+ a:hover{text-decoration:underline}
92
+
93
+ .wrap{position:relative;z-index:3;max-width:1180px;margin:0 auto;padding:20px 20px 28px}
94
+
95
+ .hero{position:relative;overflow:hidden;padding:64px 24px 48px;text-align:center}
96
+ @media(min-width:640px){.hero{padding:80px 40px 56px}}
97
+ .orb{position:absolute;border-radius:50%;pointer-events:none;opacity:.15}
98
+ .orb.o1{width:300px;height:300px;top:-80px;left:-60px;background:radial-gradient(circle,rgba(207,255,4,.3),transparent 70%);animation:drift1 20s ease-in-out infinite}
99
+ .orb.o2{width:200px;height:200px;bottom:-40px;right:-30px;background:radial-gradient(circle,rgba(0,255,255,.2),transparent 70%);animation:drift2 25s ease-in-out infinite}
100
+ .orb.o3{width:150px;height:150px;top:40%;left:60%;background:radial-gradient(circle,rgba(207,255,4,.15),transparent 70%);animation:drift3 18s ease-in-out infinite}
101
+ @keyframes drift1{0%,100%{transform:translate(0,0)}50%{transform:translate(30px,20px)}}
102
+ @keyframes drift2{0%,100%{transform:translate(0,0)}50%{transform:translate(-20px,-15px)}}
103
+ @keyframes drift3{0%,100%{transform:translate(0,0)}50%{transform:translate(15px,-25px)}}
104
+ .hero-title{font-size:clamp(28px,6vw,52px);font-weight:900;color:#fff;text-transform:uppercase;letter-spacing:-.01em;line-height:1.05;max-width:900px;margin:0 auto}
105
+ .hero-title .glow{color:var(--accent);text-shadow:0 0 24px rgba(207,255,4,.2)}
106
+ .hero-sub{margin:20px auto 0;max-width:620px;color:var(--lightgray);font-size:14px;line-height:1.7}
107
+ .hero-cta{display:flex;flex-direction:column;align-items:center;gap:12px;margin-top:32px}
108
+ @media(min-width:480px){.hero-cta{flex-direction:row;justify-content:center;flex-wrap:wrap}}
109
+ .eyebrow{font-size:10px;font-weight:800;color:var(--accent);letter-spacing:.2em;text-transform:uppercase;margin-bottom:12px}
110
+ .cta{display:flex;gap:10px;flex-wrap:wrap;margin-top:16px}
111
+ .btn{
112
+ display:inline-flex;align-items:center;justify-content:center;gap:8px;
113
+ padding:10px 18px;border-radius:6px;border:1px solid rgba(207,255,4,.15);
114
+ background:rgba(14,20,30,.8);color:#f4f7fc;font-weight:700;font-size:13px;
115
+ letter-spacing:.04em;text-transform:uppercase;cursor:pointer;
116
+ transition:all .3s ease;white-space:nowrap;
117
+ }
118
+ .btn:hover{border-color:var(--accent-soft);background:rgba(207,255,4,.06);text-decoration:none;box-shadow:0 0 20px rgba(207,255,4,.06)}
119
+ .btn.primary{
120
+ border-color:#8a5b12;background:linear-gradient(180deg,#ffb64a 0%,#ff9f1a 100%);
121
+ color:#1b1204;box-shadow:inset 0 0 0 1px rgba(255,231,191,0.28);
122
+ }
123
+ .btn.primary:hover{background:linear-gradient(180deg,#ffc168 0%,#ffa92f 100%);box-shadow:inset 0 0 0 1px rgba(255,240,210,0.34)}
124
+
125
+ .pill{
126
+ display:inline-flex;align-items:center;gap:8px;
127
+ padding:7px 10px;
128
+ border-radius:999px;
129
+ border:1px solid rgba(207,255,4,.22);
130
+ background:rgba(9,13,18,0.6);
131
+ color:var(--muted);
132
+ font-size:12px;
133
+ letter-spacing:.02em;
134
+ }
135
+ .dot{width:8px;height:8px;border-radius:50%;background:var(--accent);box-shadow:0 0 10px rgba(207,255,4,.35)}
136
+ .scroll{margin-top:14px;color:var(--muted);font-size:12px;display:inline-flex;align-items:center;gap:8px;letter-spacing:.04em;text-transform:uppercase}
137
+ .scroll:hover{text-decoration:none;color:var(--text)}
138
+ .scroll .chev{color:var(--accent-soft)}
139
+
140
+ .stats{display:grid;grid-template-columns:1fr;gap:14px;margin-top:16px}
141
+ @media(min-width:860px){.stats{grid-template-columns:repeat(4,1fr)}}
142
+ .stat{
143
+ background:linear-gradient(145deg,rgba(28,28,28,.7) 0%,rgba(14,14,14,.85) 100%);
144
+ border:1px solid rgba(207,255,4,.1);
145
+ border-radius:8px;
146
+ padding:18px 16px 14px;
147
+ min-height:86px;
148
+ transition:border-color .3s,transform .3s;
149
+ }
150
+ .stat:hover{border-color:rgba(207,255,4,.3);transform:translateY(-2px)}
151
+ .stat .num{font-weight:900;font-size:28px;color:#fff;letter-spacing:-.01em;font-family:var(--mono)}
152
+ .stat .label{margin-top:6px;color:var(--accent);font-size:12px;line-height:1.4;text-transform:uppercase;letter-spacing:.15em}
153
+
154
+ .section{margin-top:22px}
155
+ .section h2{margin:0 0 16px;font-size:22px;font-weight:900;color:#fff;text-transform:uppercase;letter-spacing:-.01em;text-align:center}
156
+ .grid{display:grid;grid-template-columns:1fr;gap:14px;margin-bottom:14px}
157
+ @media(min-width:860px){.grid{grid-template-columns:1fr 1fr}}
158
+ .card{
159
+ background:linear-gradient(145deg,rgba(28,28,28,.85) 0%,rgba(14,14,14,.95) 100%);
160
+ border:1px solid rgba(207,255,4,.1);
161
+ border-radius:8px;
162
+ padding:22px 22px 18px;
163
+ transition:border-color .35s,box-shadow .35s,transform .35s;
164
+ }
165
+ .card:hover{border-color:rgba(207,255,4,.35);box-shadow:0 0 30px rgba(207,255,4,.06),0 8px 24px rgba(0,0,0,.3);transform:translateY(-3px)}
166
+ .card[data-risk="low"],.card.risk-low{border-left:3px solid #4caf50}
167
+ .card[data-risk="medium"],.card.risk-med{border-left:3px solid #ff9800}
168
+ .card[data-risk="high"],.card.risk-high{border-left:3px solid #f44336}
169
+ .card[data-risk="unknown"],.card.risk-unknown{border-left:3px solid #666}
170
+ .cardhead{display:flex;align-items:center;justify-content:space-between;gap:10px}
171
+ .card h3{margin:0;font-size:13px;font-weight:700;color:var(--accent-soft);text-transform:uppercase;letter-spacing:.06em}
172
+ .badge{
173
+ font-size:10px;padding:5px 10px;border-radius:5px;border:1px solid rgba(207,255,4,.15);
174
+ color:var(--muted);background:rgba(9,13,18,0.7);white-space:nowrap;text-transform:uppercase;letter-spacing:.06em;font-weight:700;
175
+ }
176
+ .badge.alpha{border-color:rgba(207,255,4,.25);color:var(--accent-soft)}
177
+ .badge.live{border-color:rgba(0,255,0,.25);color:rgba(0,255,0,.8)}
178
+ .badge.found{border-color:rgba(99,215,255,.28);color:rgba(99,215,255,.85)}
179
+ .card p{margin:12px 0 0;color:var(--muted);font-size:13px;line-height:1.65}
180
+ .code{
181
+ margin-top:12px;padding:14px 14px;border-radius:6px;
182
+ border:1px solid rgba(207,255,4,.08);background:rgba(8,16,26,.85);
183
+ font-family:var(--mono);font-size:12px;color:#d4e6fa;overflow:auto;line-height:1.55;
184
+ white-space:pre-wrap;word-break:break-word;
185
+ }
186
+ .k{color:var(--cyan)}
187
+
188
+ .list{margin-top:10px;display:flex;flex-direction:column;gap:10px}
189
+ .item{
190
+ border:1px solid #2a4056;background:#0b1622;border-radius:2px;
191
+ padding:12px;display:flex;align-items:flex-start;justify-content:space-between;gap:12px;
192
+ }
193
+ .item strong{font-size:13px;font-weight:800;letter-spacing:.02em;text-transform:uppercase;color:var(--accent-soft)}
194
+ .item .meta{color:var(--muted);font-size:12px;line-height:1.4;margin-top:6px}
195
+ .item .links{display:flex;gap:10px;flex-wrap:wrap;align-items:center}
196
+ .pill{
197
+ font-size:11px;padding:6px 8px;border-radius:2px;border:1px solid #2a4056;
198
+ color:#d4e6fa;background:rgba(9,13,18,0.5);white-space:nowrap;text-transform:uppercase;letter-spacing:.04em;
199
+ }
200
+ .pill.low{border-color:rgba(99,215,255,.35)}
201
+ .pill.med{border-color:rgba(207,255,4,.22)}
202
+ .pill.high{border-color:rgba(255,51,51,.28);color:#ffd1d1}
203
+ .tools{display:flex;gap:10px;flex-wrap:wrap;align-items:center;margin-top:10px}
204
+ .tools input{
205
+ background:rgba(11,22,34,.8);border:1px solid rgba(207,255,4,.12);color:#d4e6fa;padding:10px 14px;border-radius:6px;
206
+ font-size:13px;min-width:260px;outline:none;transition:border-color .3s,box-shadow .3s;
207
+ font-family:var(--mono);
208
+ }
209
+ .tools input:focus{border-color:var(--accent-soft);box-shadow:0 0 16px rgba(207,255,4,.08),0 0 0 3px rgba(207,255,4,.04)}
210
+ .tools input::placeholder{color:rgba(166,166,166,.7)}
211
+ .tools textarea{
212
+ width:100%;
213
+ background:rgba(11,22,34,.8);
214
+ border:1px solid rgba(207,255,4,.12);
215
+ color:#d4e6fa;
216
+ padding:9px 12px;
217
+ border-radius:6px;
218
+ font-size:13px;
219
+ outline:none;
220
+ font-family:var(--mono);
221
+ line-height:1.5;
222
+ min-height:160px;
223
+ resize:vertical;
224
+ transition:border-color .3s,box-shadow .3s;
225
+ }
226
+ .tools textarea:focus{border-color:var(--accent-soft);box-shadow:0 0 16px rgba(207,255,4,.08)}
227
+ .tools .row{display:flex;gap:10px;flex-wrap:wrap;align-items:center;width:100%}
228
+ .note{
229
+ margin-top:10px;
230
+ color:var(--muted);
231
+ font-size:12px;
232
+ line-height:1.55;
233
+ }
234
+ .note code{font-family:var(--mono);font-size:12px;color:#d4e6fa}
235
+ .danger-note{
236
+ margin-top:12px;
237
+ border:1px solid rgba(255,51,51,.25);
238
+ background:rgba(255,51,51,.06);
239
+ border-radius:2px;
240
+ padding:12px;
241
+ color:#ffd1d1;
242
+ font-size:12.5px;
243
+ line-height:1.65;
244
+ }
245
+ .toast{
246
+ position:fixed;
247
+ left:12px;
248
+ right:12px;
249
+ bottom:12px;
250
+ z-index:50;
251
+ display:none;
252
+ border:1px solid var(--panel-border);
253
+ background:rgba(9,13,18,0.92);
254
+ border-radius:2px;
255
+ padding:10px 12px;
256
+ color:#d4e6fa;
257
+ font-size:12.5px;
258
+ line-height:1.4;
259
+ box-shadow:0 10px 36px rgba(0,0,0,0.45);
260
+ }
261
+ .toast.show{display:block}
262
+ .toast.err{border-color:rgba(255,51,51,.35);color:#ffd1d1}
263
+
264
+ .modal-backdrop{
265
+ position:fixed;inset:0;z-index:60;
266
+ background:rgba(0,0,0,0.65);
267
+ display:none;
268
+ padding:18px;
269
+ }
270
+ .modal-backdrop.show{display:flex;align-items:center;justify-content:center}
271
+ .modal{
272
+ width:min(720px, 100%);
273
+ border:1px solid rgba(207,255,4,.2);
274
+ background:linear-gradient(145deg,rgba(28,28,28,.97) 0%,rgba(14,14,14,.99) 100%);
275
+ border-radius:10px;
276
+ box-shadow:0 30px 80px rgba(0,0,0,0.7),0 0 60px rgba(207,255,4,.04);
277
+ padding:20px;
278
+ backdrop-filter:blur(12px);
279
+ }
280
+ .modal h3{
281
+ margin:0;
282
+ font-size:13px;
283
+ font-weight:900;
284
+ letter-spacing:.06em;
285
+ text-transform:uppercase;
286
+ color:var(--accent-soft);
287
+ }
288
+ .modal .body{margin-top:12px}
289
+ .modal .body .note{margin-top:8px}
290
+ .modal .footer{margin-top:14px;display:flex;gap:10px;justify-content:flex-end;flex-wrap:wrap}
291
+ .modal input{
292
+ width:100%;
293
+ background:#0b1622;border:1px solid #2a4056;color:#d4e6fa;
294
+ padding:9px 10px;border-radius:2px;font-size:13px;outline:none;
295
+ }
296
+ .modal input:focus{border-color:var(--cyan)}
297
+ .modal label{
298
+ display:block;
299
+ margin-top:10px;
300
+ font-size:11px;
301
+ color:var(--muted);
302
+ letter-spacing:.04em;
303
+ text-transform:uppercase;
304
+ }
305
+ .tools select{
306
+ background:rgba(11,22,34,.8);border:1px solid rgba(207,255,4,.12);color:#d4e6fa;padding:9px 12px;border-radius:6px;
307
+ font-size:13px;outline:none;transition:border-color .3s;
308
+ }
309
+ .tools select:focus{border-color:var(--accent-soft)}
310
+ .tools label{
311
+ display:inline-flex;align-items:center;gap:8px;
312
+ border:1px solid #2a4056;background:rgba(9,13,18,0.5);
313
+ padding:7px 9px;border-radius:2px;
314
+ font-size:12px;color:#d4e6fa;text-transform:uppercase;letter-spacing:.04em;
315
+ user-select:none;
316
+ }
317
+ .tools input[type="checkbox"]{width:14px;height:14px;min-width:0;accent-color:var(--accent)}
318
+
319
+ /* ── Add Tab step flow ── */
320
+ .step-flow{display:flex;flex-direction:column;gap:0;margin-top:16px}
321
+ .step-card{
322
+ background:linear-gradient(180deg,var(--panel-2) 0%,var(--panel) 100%);
323
+ border:1px solid rgba(207,255,4,.15);
324
+ border-radius:8px;
325
+ padding:0;
326
+ overflow:hidden;
327
+ margin-bottom:14px;
328
+ transition:border-color .3s;
329
+ }
330
+ .step-card:hover{border-color:rgba(207,255,4,.35)}
331
+ .step-header{
332
+ display:flex;align-items:center;gap:14px;
333
+ padding:18px 20px;
334
+ cursor:pointer;
335
+ user-select:none;
336
+ }
337
+ .step-num{
338
+ width:32px;height:32px;border-radius:50%;
339
+ display:grid;place-items:center;
340
+ border:2px solid var(--accent);
341
+ color:var(--accent);
342
+ font-weight:900;font-size:14px;
343
+ flex-shrink:0;
344
+ transition:background .3s,color .3s;
345
+ }
346
+ .step-card.active .step-num{background:var(--accent);color:#111}
347
+ .step-title{font-size:14px;font-weight:800;color:var(--text);text-transform:uppercase;letter-spacing:.04em;flex:1}
348
+ .step-badge{font-size:10px;padding:4px 8px;border-radius:999px;border:1px solid rgba(207,255,4,.2);color:var(--muted);text-transform:uppercase;letter-spacing:.04em}
349
+ .step-badge.done{border-color:rgba(0,255,0,.3);color:rgba(0,255,0,.8)}
350
+ .step-chevron{color:var(--muted);font-size:18px;transition:transform .3s}
351
+ .step-card.open .step-chevron{transform:rotate(180deg)}
352
+ .step-body{
353
+ display:none;
354
+ padding:0 20px 20px;
355
+ }
356
+ .step-card.open .step-body{display:block}
357
+
358
+ .template-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-top:12px}
359
+ @media(max-width:640px){.template-grid{grid-template-columns:1fr}}
360
+ .template-btn{
361
+ background:rgba(11,22,34,.6);
362
+ border:1px solid rgba(207,255,4,.12);
363
+ border-radius:8px;
364
+ padding:16px;
365
+ cursor:pointer;
366
+ text-align:left;
367
+ transition:all .25s;
368
+ }
369
+ .template-btn:hover{border-color:rgba(207,255,4,.4);background:rgba(207,255,4,.04);transform:translateY(-2px)}
370
+ .template-btn.selected{border-color:var(--accent);background:rgba(207,255,4,.08);box-shadow:0 0 20px rgba(207,255,4,.1)}
371
+ .template-btn .t-risk{font-size:10px;font-weight:800;text-transform:uppercase;letter-spacing:.08em;margin-bottom:6px}
372
+ .template-btn .t-risk.low{color:#4caf50}
373
+ .template-btn .t-risk.med{color:#ff9800}
374
+ .template-btn .t-risk.high{color:#f44336}
375
+ .template-btn .t-name{font-size:13px;font-weight:700;color:var(--text);margin-bottom:4px}
376
+ .template-btn .t-desc{font-size:11px;color:var(--muted);line-height:1.5}
377
+
378
+ .collapsible-toggle{
379
+ display:inline-flex;align-items:center;gap:6px;
380
+ background:none;border:1px solid rgba(207,255,4,.12);
381
+ color:var(--muted);font-size:11px;padding:6px 12px;
382
+ border-radius:4px;cursor:pointer;text-transform:uppercase;letter-spacing:.04em;
383
+ transition:all .2s;margin-top:8px;
384
+ }
385
+ .collapsible-toggle:hover{border-color:rgba(207,255,4,.3);color:var(--text)}
386
+ .collapsible-content{display:none;margin-top:10px}
387
+ .collapsible-content.show{display:block}
388
+
389
+ /* ── 3D Holographic Skill Cards ── */
390
+ .cards{
391
+ margin-top:16px;
392
+ display:grid;
393
+ grid-template-columns:1fr;
394
+ gap:20px;
395
+ perspective:1200px;
396
+ }
397
+ @media(min-width:640px){.cards{grid-template-columns:repeat(2,1fr)}}
398
+ @media(min-width:1000px){.cards{grid-template-columns:repeat(3,1fr)}}
399
+ @media(min-width:1000px){
400
+ .cards .skill-card:last-child:nth-child(3n+1){grid-column:1 / -1}
401
+ }
402
+ @media(min-width:640px) and (max-width:999px){
403
+ .cards .skill-card:last-child:nth-child(2n+1){grid-column:1 / -1}
404
+ }
405
+
406
+ .skill-card{
407
+ --glow-color:207,255,4;
408
+ --glow-a:.12;
409
+ position:relative;
410
+ background:
411
+ linear-gradient(168deg,rgba(22,26,30,.96) 0%,rgba(12,12,14,.98) 55%,rgba(16,20,24,.97) 100%);
412
+ border:1px solid rgba(var(--glow-color),.10);
413
+ border-radius:14px;
414
+ padding:0;
415
+ overflow:hidden;
416
+ display:flex;
417
+ flex-direction:column;
418
+ min-height:290px;
419
+ transition:
420
+ transform .5s cubic-bezier(.22,.68,0,1.2),
421
+ box-shadow .5s cubic-bezier(.22,.68,0,1),
422
+ border-color .4s ease;
423
+ transform-style:preserve-3d;
424
+ will-change:transform,box-shadow;
425
+ box-shadow:
426
+ 0 2px 8px rgba(0,0,0,.4),
427
+ 0 0 1px rgba(var(--glow-color),.15),
428
+ inset 0 1px 0 rgba(255,255,255,.03);
429
+ }
430
+
431
+ .skill-card::before{
432
+ content:'';position:absolute;inset:-1px;border-radius:15px;
433
+ background:conic-gradient(
434
+ from var(--border-angle,0deg),
435
+ transparent 0%,
436
+ rgba(var(--glow-color),.4) 8%,
437
+ transparent 16%,
438
+ rgba(99,215,255,.3) 25%,
439
+ transparent 33%,
440
+ rgba(var(--glow-color),.2) 50%,
441
+ transparent 58%,
442
+ rgba(99,215,255,.15) 66%,
443
+ transparent 75%,
444
+ rgba(var(--glow-color),.3) 90%,
445
+ transparent 100%
446
+ );
447
+ opacity:0;
448
+ transition:opacity .5s ease;
449
+ pointer-events:none;
450
+ z-index:-1;
451
+ animation:borderSpin 6s linear infinite;
452
+ }
453
+ .skill-card:hover::before{opacity:1}
454
+ @property --border-angle{syntax:'<angle>';initial-value:0deg;inherits:false}
455
+ @keyframes borderSpin{to{--border-angle:360deg}}
456
+
457
+ .skill-card::after{
458
+ content:'';position:absolute;inset:0;border-radius:14px;
459
+ background:linear-gradient(
460
+ 135deg,
461
+ rgba(var(--glow-color),.06) 0%,
462
+ transparent 35%,
463
+ transparent 65%,
464
+ rgba(99,215,255,.04) 100%
465
+ );
466
+ opacity:0;
467
+ transition:opacity .4s ease;
468
+ pointer-events:none;z-index:1;
469
+ }
470
+ .skill-card:hover::after{opacity:1}
471
+
472
+ .skill-card:hover{
473
+ transform:translateY(-12px) scale(1.02);
474
+ border-color:rgba(var(--glow-color),.35);
475
+ box-shadow:
476
+ 0 30px 60px -10px rgba(0,0,0,.6),
477
+ 0 0 40px -5px rgba(var(--glow-color),.12),
478
+ 0 0 80px -10px rgba(var(--glow-color),.06),
479
+ 0 0 0 1px rgba(var(--glow-color),.08),
480
+ inset 0 1px 0 rgba(255,255,255,.06);
481
+ }
482
+ .skill-card.onchain-card{--glow-color:0,255,100;--glow-a:.15}
483
+ .skill-card.risk-high{--glow-color:255,60,60;--glow-a:.12}
484
+
485
+ .skill-card .card-shine{
486
+ position:absolute;inset:0;z-index:3;pointer-events:none;border-radius:14px;
487
+ background:radial-gradient(
488
+ 600px circle at var(--mx,50%) var(--my,50%),
489
+ rgba(255,255,255,.045) 0%,
490
+ transparent 50%
491
+ );
492
+ opacity:0;transition:opacity .35s;
493
+ }
494
+ .skill-card:hover .card-shine{opacity:1}
495
+
496
+ .skill-card .card-scanline{
497
+ position:absolute;inset:0;z-index:2;pointer-events:none;border-radius:14px;overflow:hidden;
498
+ opacity:0;transition:opacity .5s;
499
+ }
500
+ .skill-card:hover .card-scanline{opacity:1}
501
+ .skill-card .card-scanline::after{
502
+ content:'';position:absolute;left:0;right:0;height:1px;top:-10%;
503
+ background:linear-gradient(90deg,transparent 5%,rgba(var(--glow-color),.2) 30%,rgba(var(--glow-color),.35) 50%,rgba(var(--glow-color),.2) 70%,transparent 95%);
504
+ animation:scanDrop 3.5s ease-in-out infinite;
505
+ box-shadow:0 0 12px 2px rgba(var(--glow-color),.08);
506
+ }
507
+ @keyframes scanDrop{0%{top:-10%}100%{top:110%}}
508
+
509
+ .skill-card{
510
+ animation:cardEnter .6s cubic-bezier(.22,.68,0,1.1) both;
511
+ animation-delay:calc(var(--i,0) * 60ms);
512
+ }
513
+ @keyframes cardEnter{
514
+ from{opacity:0;transform:translateY(30px) scale(.95) rotateX(4deg)}
515
+ to{opacity:1;transform:translateY(0) scale(1) rotateX(0)}
516
+ }
517
+
518
+ .skill-tier-bar{
519
+ height:3px;width:100%;flex-shrink:0;
520
+ background:linear-gradient(90deg,var(--tier-color,#333) 0%,rgba(var(--glow-color),.15) 60%,transparent 100%);
521
+ box-shadow:0 0 8px var(--tier-color,transparent);
522
+ transition:box-shadow .4s;
523
+ }
524
+ .skill-card:hover .skill-tier-bar{box-shadow:0 0 16px var(--tier-color,transparent)}
525
+ .skill-tier-bar[data-tier="low"]{--tier-color:#4caf50}
526
+ .skill-tier-bar[data-tier="med"]{--tier-color:#ff9800}
527
+ .skill-tier-bar[data-tier="high"]{--tier-color:#f44336}
528
+
529
+ .skill-card-inner{
530
+ position:relative;z-index:4;
531
+ padding:20px 22px 18px;
532
+ display:flex;flex-direction:column;flex:1;
533
+ }
534
+
535
+ .skill-nft-badge{
536
+ display:inline-flex;align-items:center;gap:5px;
537
+ padding:4px 10px;border-radius:6px;
538
+ font-size:9px;font-weight:800;letter-spacing:.1em;text-transform:uppercase;
539
+ backdrop-filter:blur(4px);
540
+ }
541
+ .skill-nft-badge.onchain{
542
+ background:linear-gradient(135deg,rgba(0,255,100,.16),rgba(0,255,100,.04));
543
+ border:1px solid rgba(0,255,100,.4);color:rgba(0,255,100,.95);
544
+ box-shadow:0 0 18px rgba(0,255,100,.12),inset 0 0 8px rgba(0,255,100,.04);
545
+ }
546
+ a.skill-nft-badge{text-decoration:none}
547
+ a.skill-nft-badge:hover{filter:brightness(1.3);box-shadow:0 0 24px rgba(0,255,100,.2)}
548
+ .skill-nft-badge.offchain{
549
+ background:rgba(255,255,255,.02);border:1px solid rgba(255,255,255,.08);color:rgba(255,255,255,.35);
550
+ }
551
+ .nft-pulse{
552
+ width:6px;height:6px;border-radius:50%;background:currentColor;
553
+ box-shadow:0 0 8px currentColor,0 0 16px currentColor;
554
+ animation:nftPulse 2s ease-in-out infinite;
555
+ }
556
+ @keyframes nftPulse{0%,100%{opacity:1;box-shadow:0 0 8px currentColor,0 0 16px currentColor}50%{opacity:.3;box-shadow:0 0 4px currentColor}}
557
+
558
+ .skill-risk{
559
+ display:inline-flex;align-items:center;gap:3px;font-size:8px;font-weight:800;
560
+ letter-spacing:.1em;text-transform:uppercase;padding:4px 8px;border-radius:5px;
561
+ border:1px solid;backdrop-filter:blur(4px);
562
+ }
563
+ .skill-risk.low{border-color:rgba(76,175,80,.35);color:#4caf50;background:rgba(76,175,80,.08)}
564
+ .skill-risk.med{border-color:rgba(255,152,0,.35);color:#ff9800;background:rgba(255,152,0,.08)}
565
+ .skill-risk.high{border-color:rgba(244,67,54,.35);color:#f44336;background:rgba(244,67,54,.08)}
566
+ .skill-risk.unknown{border-color:rgba(102,102,102,.3);color:#888;background:rgba(102,102,102,.06)}
567
+
568
+ .skill-title{
569
+ margin:0;font-size:15px;font-weight:900;letter-spacing:.02em;
570
+ text-transform:uppercase;color:#fff;line-height:1.35;
571
+ transition:color .3s,text-shadow .3s;
572
+ font-family:var(--font-display);
573
+ }
574
+ .skill-card:hover .skill-title{
575
+ color:rgba(var(--glow-color),1);
576
+ text-shadow:0 0 20px rgba(var(--glow-color),.2);
577
+ }
578
+ .skill-slug{
579
+ margin-top:4px;font-family:var(--mono);font-size:10px;
580
+ color:rgba(255,255,255,.3);letter-spacing:.02em;
581
+ }
582
+
583
+ .skill-desc{
584
+ margin-top:12px;color:rgba(255,255,255,.5);font-size:12px;line-height:1.7;flex:1;
585
+ display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden;
586
+ }
587
+
588
+ .skill-chain-data{
589
+ margin-top:auto;padding-top:12px;
590
+ border-top:1px solid rgba(var(--glow-color),.06);
591
+ display:flex;flex-direction:column;gap:4px;
592
+ }
593
+ .skill-tx{display:flex;align-items:center;gap:6px;font-family:var(--mono);font-size:9px;color:var(--muted)}
594
+ .skill-tx-label{font-weight:700;color:rgba(var(--glow-color),.7);text-transform:uppercase;letter-spacing:.06em;min-width:52px;font-size:8px}
595
+ .skill-tx-hash{
596
+ color:var(--cyan);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
597
+ cursor:pointer;transition:color .2s,text-shadow .2s;max-width:160px;display:inline-block;text-decoration:none;
598
+ }
599
+ .skill-tx-hash:hover{color:#fff;text-shadow:0 0 8px rgba(99,215,255,.4)}
600
+
601
+ .skill-foot{
602
+ margin-top:14px;padding-top:12px;
603
+ border-top:1px solid rgba(var(--glow-color),.06);
604
+ display:flex;gap:6px;flex-wrap:wrap;align-items:center;
605
+ }
606
+ .skill-foot .pill{
607
+ font-size:9px;padding:5px 10px;border-radius:5px;
608
+ transition:all .25s cubic-bezier(.22,.68,0,1);
609
+ border:1px solid rgba(99,215,255,.12);color:rgba(99,215,255,.8);
610
+ background:rgba(99,215,255,.03);text-decoration:none;
611
+ }
612
+ .skill-foot .pill:hover{
613
+ border-color:rgba(var(--glow-color),.5);
614
+ background:rgba(var(--glow-color),.1);
615
+ color:#fff;text-decoration:none;
616
+ box-shadow:0 0 16px rgba(var(--glow-color),.08);
617
+ transform:translateY(-1px);
618
+ }
619
+ .skill-foot .pill.install-btn{
620
+ border-color:rgba(var(--glow-color),.4);color:rgba(var(--glow-color),.95);
621
+ background:rgba(var(--glow-color),.08);font-weight:800;
622
+ box-shadow:0 0 8px rgba(var(--glow-color),.06);
623
+ }
624
+ .skill-foot .pill.install-btn:hover{
625
+ border-color:rgba(var(--glow-color),.7);
626
+ background:rgba(var(--glow-color),.18);color:#fff;
627
+ box-shadow:0 0 20px rgba(var(--glow-color),.15),0 0 40px rgba(var(--glow-color),.06);
628
+ }
629
+ .skill-foot .pill.nft{border-color:rgba(0,255,0,.25);color:rgba(0,255,0,.85);background:rgba(0,255,0,.05)}
630
+ .skill-foot .pill.nft:hover{border-color:rgba(0,255,0,.5);background:rgba(0,255,0,.12);color:#fff}
631
+
632
+ .pagination-bar{
633
+ display:flex;align-items:center;justify-content:center;gap:16px;
634
+ margin:28px auto 8px;padding:14px 20px;
635
+ background:rgba(11,22,34,.6);
636
+ border:1px solid rgba(207,255,4,.1);border-radius:8px;
637
+ max-width:400px;backdrop-filter:blur(4px);
638
+ }
639
+ .pg-btn{
640
+ padding:8px 18px;border-radius:6px;border:1px solid rgba(207,255,4,.2);
641
+ background:rgba(207,255,4,.04);color:var(--accent);
642
+ font-size:13px;font-weight:700;cursor:pointer;
643
+ transition:all .25s cubic-bezier(.22,.68,0,1);font-family:var(--font-display);
644
+ }
645
+ .pg-btn:hover:not(:disabled){border-color:var(--accent);background:rgba(207,255,4,.1);color:#fff;transform:translateY(-1px);box-shadow:0 4px 16px rgba(207,255,4,.08)}
646
+ .pg-btn:active:not(:disabled){transform:translateY(0) scale(0.97)}
647
+ .pg-btn:disabled{opacity:.3;cursor:default}
648
+ .pg-info{
649
+ font-size:12px;color:var(--muted);font-weight:600;
650
+ letter-spacing:.04em;min-width:120px;text-align:center;
651
+ }
652
+
653
+ #importedList{
654
+ display:grid;
655
+ grid-template-columns:1fr;
656
+ gap:24px;
657
+ perspective:1000px;
658
+ }
659
+ @media(min-width:580px){#importedList{grid-template-columns:repeat(2,1fr);gap:26px}}
660
+ @media(min-width:960px){#importedList{grid-template-columns:repeat(3,1fr);gap:28px}}
661
+
662
+ .skill-source-tag{
663
+ font-size:8px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;
664
+ padding:2px 6px;border-radius:3px;border:1px solid rgba(99,215,255,.18);
665
+ color:var(--cyan);background:rgba(99,215,255,.04);margin-left:auto;
666
+ }
667
+
668
+ .skill-meta{margin-top:10px;display:flex;gap:8px;flex-wrap:wrap;align-items:center}
669
+ .pill.nft{border-color:rgba(0,255,0,.25);color:rgba(0,255,0,.8)}
670
+ .pill.off{border-color:rgba(207,255,4,.22);color:var(--accent-soft)}
671
+ .skill-actions{margin-top:10px;display:flex;gap:8px;flex-wrap:wrap;align-items:center}
672
+ .sec-label{display:flex;align-items:center;gap:12px;justify-content:center;margin-bottom:8px}
673
+ .sec-label .dash{height:1px;width:0;background:rgba(207,255,4,.3);transition:width .7s cubic-bezier(.16,1,.3,1)}
674
+ .ac-visible .sec-label .dash{width:32px}
675
+ .sec-label span{font-size:10px;font-weight:800;color:var(--accent);letter-spacing:.2em;text-transform:uppercase}
676
+ .sec-heading{font-size:24px;font-weight:900;color:#fff;text-transform:uppercase;letter-spacing:-.02em;text-align:center;margin:4px 0 0;font-family:var(--font-display)}
677
+ @media(min-width:640px){.sec-heading{font-size:32px}}
678
+ .sec-sub{color:var(--lightgray);font-size:13px;text-align:center;max-width:520px;margin:12px auto 0;line-height:1.65}
679
+ .sep{height:1px;background:linear-gradient(90deg,transparent,rgba(207,255,4,.3),transparent);transition:all 1s;transform:scaleX(0)}
680
+ .sep.show,.ac-visible .sep{transform:scaleX(1)}
681
+ .foot{padding:16px 20px;display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:12px;font-size:11px;color:var(--gray);text-transform:uppercase;letter-spacing:.04em}
682
+ .online{display:inline-flex;align-items:center;gap:8px;padding:6px 10px;border:1px solid var(--gray);background:rgba(9,13,18,.7);color:var(--muted);font-size:11px}
683
+ .tab-bar{display:flex;gap:3px;margin:24px 0 20px;border:1px solid rgba(207,255,4,.15);border-radius:8px;overflow:hidden;background:rgba(0,0,0,.3);padding:3px}
684
+ .tab-btn{flex:1;padding:11px 18px;border:none;background:transparent;color:var(--muted);font-size:12px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;cursor:pointer;transition:all .25s;border-radius:6px;font-family:var(--font-display);position:relative}
685
+ .tab-btn:hover{background:rgba(207,255,4,.04);color:var(--text)}
686
+ .tab-btn:active{transform:scale(0.97)}
687
+ .tab-btn.active{background:rgba(207,255,4,.1);color:var(--accent);box-shadow:0 0 12px rgba(207,255,4,.06),inset 0 0 0 1px rgba(207,255,4,.15)}
688
+ .tab-panel{display:none}
689
+ .tab-panel.active{display:block}