web-agent-bridge 3.0.0 → 3.3.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 (202) hide show
  1. package/LICENSE +72 -21
  2. package/README.ar.md +1286 -1073
  3. package/README.md +1764 -1535
  4. package/bin/agent-runner.js +474 -474
  5. package/bin/cli.js +237 -138
  6. package/bin/wab.js +80 -80
  7. package/examples/bidi-agent.js +119 -119
  8. package/examples/cross-site-agent.js +91 -91
  9. package/examples/mcp-agent.js +94 -94
  10. package/examples/next-app-router/README.md +44 -44
  11. package/examples/puppeteer-agent.js +108 -108
  12. package/examples/saas-dashboard/README.md +55 -55
  13. package/examples/shopify-hydrogen/README.md +74 -74
  14. package/examples/vision-agent.js +171 -171
  15. package/examples/wordpress-elementor/README.md +77 -77
  16. package/package.json +17 -3
  17. package/public/.well-known/agent-tools.json +180 -180
  18. package/public/.well-known/ai-assets.json +59 -59
  19. package/public/.well-known/ai-plugin.json +28 -0
  20. package/public/.well-known/security.txt +8 -0
  21. package/public/agent-workspace.html +349 -347
  22. package/public/ai.html +198 -196
  23. package/public/api.html +413 -0
  24. package/public/browser.html +486 -484
  25. package/public/commander-dashboard.html +243 -243
  26. package/public/cookies.html +210 -208
  27. package/public/css/agent-workspace.css +1713 -1713
  28. package/public/css/premium.css +317 -317
  29. package/public/css/styles.css +1235 -1235
  30. package/public/dashboard.html +706 -704
  31. package/public/demo.html +1770 -1
  32. package/public/dns.html +507 -0
  33. package/public/docs.html +587 -585
  34. package/public/feed.xml +89 -89
  35. package/public/growth.html +463 -0
  36. package/public/index.html +341 -9
  37. package/public/integrations.html +556 -0
  38. package/public/js/agent-workspace.js +1740 -1740
  39. package/public/js/auth-nav.js +31 -31
  40. package/public/js/auth-redirect.js +12 -12
  41. package/public/js/cookie-consent.js +56 -56
  42. package/public/js/wab-demo-page.js +721 -721
  43. package/public/js/ws-client.js +74 -74
  44. package/public/llms-full.txt +360 -309
  45. package/public/llms.txt +125 -86
  46. package/public/login.html +85 -83
  47. package/public/mesh-dashboard.html +328 -328
  48. package/public/openapi.json +580 -580
  49. package/public/phone-shield.html +281 -0
  50. package/public/premium-dashboard.html +2489 -2487
  51. package/public/premium.html +793 -791
  52. package/public/privacy.html +297 -295
  53. package/public/register.html +105 -103
  54. package/public/robots.txt +87 -87
  55. package/public/script/wab-consent.d.ts +36 -36
  56. package/public/script/wab-consent.js +104 -104
  57. package/public/script/wab-schema.js +131 -131
  58. package/public/script/wab.d.ts +108 -108
  59. package/public/script/wab.min.js +580 -580
  60. package/public/security.txt +8 -0
  61. package/public/terms.html +256 -254
  62. package/script/ai-agent-bridge.js +1754 -1754
  63. package/sdk/README.md +99 -99
  64. package/sdk/agent-mesh.js +449 -449
  65. package/sdk/commander.js +262 -262
  66. package/sdk/index.d.ts +464 -464
  67. package/sdk/index.js +18 -1
  68. package/sdk/multi-agent.js +318 -318
  69. package/sdk/package.json +12 -1
  70. package/sdk/safety-shield.js +219 -0
  71. package/sdk/schema-discovery.js +83 -83
  72. package/server/adapters/index.js +520 -520
  73. package/server/config/plans.js +367 -367
  74. package/server/config/secrets.js +102 -102
  75. package/server/control-plane/index.js +301 -301
  76. package/server/data-plane/index.js +354 -354
  77. package/server/index.js +175 -19
  78. package/server/llm/index.js +404 -404
  79. package/server/middleware/adminAuth.js +35 -35
  80. package/server/middleware/auth.js +50 -50
  81. package/server/middleware/featureGate.js +88 -88
  82. package/server/middleware/rateLimits.js +100 -100
  83. package/server/middleware/sensitiveAction.js +157 -0
  84. package/server/migrations/001_add_analytics_indexes.sql +7 -7
  85. package/server/migrations/002_premium_features.sql +418 -418
  86. package/server/migrations/003_ads_integer_cents.sql +33 -33
  87. package/server/migrations/004_agent_os.sql +158 -158
  88. package/server/migrations/005_marketplace_metering.sql +126 -126
  89. package/server/models/adapters/index.js +33 -33
  90. package/server/models/adapters/mysql.js +183 -183
  91. package/server/models/adapters/postgresql.js +172 -172
  92. package/server/models/adapters/sqlite.js +7 -7
  93. package/server/models/db.js +681 -681
  94. package/server/observability/failure-analysis.js +337 -337
  95. package/server/observability/index.js +394 -394
  96. package/server/protocol/capabilities.js +223 -223
  97. package/server/protocol/index.js +243 -243
  98. package/server/protocol/schema.js +584 -584
  99. package/server/registry/certification.js +271 -271
  100. package/server/registry/index.js +326 -326
  101. package/server/routes/admin-premium.js +671 -671
  102. package/server/routes/admin.js +261 -261
  103. package/server/routes/ads.js +130 -130
  104. package/server/routes/agent-workspace.js +540 -378
  105. package/server/routes/api.js +150 -150
  106. package/server/routes/auth.js +71 -71
  107. package/server/routes/billing.js +45 -45
  108. package/server/routes/commander.js +316 -316
  109. package/server/routes/demo-showcase.js +332 -0
  110. package/server/routes/demo-store.js +154 -0
  111. package/server/routes/discovery.js +417 -406
  112. package/server/routes/gateway.js +173 -0
  113. package/server/routes/license.js +251 -240
  114. package/server/routes/mesh.js +469 -469
  115. package/server/routes/noscript.js +543 -543
  116. package/server/routes/premium-v2.js +686 -686
  117. package/server/routes/premium.js +724 -724
  118. package/server/routes/runtime.js +2148 -2147
  119. package/server/routes/sovereign.js +465 -385
  120. package/server/routes/universal.js +200 -177
  121. package/server/routes/wab-api.js +850 -491
  122. package/server/runtime/container-worker.js +111 -111
  123. package/server/runtime/container.js +448 -448
  124. package/server/runtime/distributed-worker.js +362 -362
  125. package/server/runtime/event-bus.js +210 -210
  126. package/server/runtime/index.js +253 -253
  127. package/server/runtime/queue.js +599 -599
  128. package/server/runtime/replay.js +666 -666
  129. package/server/runtime/sandbox.js +266 -266
  130. package/server/runtime/scheduler.js +534 -534
  131. package/server/runtime/session-engine.js +293 -293
  132. package/server/runtime/state-manager.js +188 -188
  133. package/server/security/cross-site-redactor.js +196 -0
  134. package/server/security/dry-run.js +180 -0
  135. package/server/security/human-gate-rate-limit.js +147 -0
  136. package/server/security/human-gate-transports.js +178 -0
  137. package/server/security/human-gate.js +281 -0
  138. package/server/security/index.js +368 -368
  139. package/server/security/intent-engine.js +245 -0
  140. package/server/security/reward-guard.js +171 -0
  141. package/server/security/rollback-store.js +239 -0
  142. package/server/security/token-scope.js +404 -0
  143. package/server/security/url-policy.js +139 -0
  144. package/server/services/agent-chat.js +506 -506
  145. package/server/services/agent-learning.js +601 -575
  146. package/server/services/agent-memory.js +625 -625
  147. package/server/services/agent-mesh.js +555 -539
  148. package/server/services/agent-symphony.js +717 -717
  149. package/server/services/agent-tasks.js +1807 -1807
  150. package/server/services/api-key-engine.js +292 -0
  151. package/server/services/cluster.js +894 -894
  152. package/server/services/commander.js +738 -738
  153. package/server/services/edge-compute.js +440 -440
  154. package/server/services/email.js +204 -204
  155. package/server/services/hosted-runtime.js +205 -205
  156. package/server/services/lfd.js +635 -616
  157. package/server/services/local-ai.js +389 -389
  158. package/server/services/marketplace.js +270 -270
  159. package/server/services/metering.js +182 -182
  160. package/server/services/modules/affiliate-intelligence.js +93 -0
  161. package/server/services/modules/agent-firewall.js +90 -0
  162. package/server/services/modules/bounty.js +89 -0
  163. package/server/services/modules/collective-bargaining.js +92 -0
  164. package/server/services/modules/dark-pattern.js +66 -0
  165. package/server/services/modules/gov-intelligence.js +45 -0
  166. package/server/services/modules/neural.js +55 -0
  167. package/server/services/modules/notary.js +49 -0
  168. package/server/services/modules/price-time-machine.js +86 -0
  169. package/server/services/modules/protocol.js +104 -0
  170. package/server/services/negotiation.js +439 -439
  171. package/server/services/plugins.js +771 -771
  172. package/server/services/premium.js +1 -1
  173. package/server/services/price-intelligence.js +566 -565
  174. package/server/services/price-shield.js +1137 -1137
  175. package/server/services/reputation.js +465 -465
  176. package/server/services/search-engine.js +357 -357
  177. package/server/services/security.js +513 -513
  178. package/server/services/self-healing.js +843 -843
  179. package/server/services/sovereign-shield.js +542 -0
  180. package/server/services/stripe.js +192 -192
  181. package/server/services/swarm.js +788 -788
  182. package/server/services/universal-scraper.js +662 -661
  183. package/server/services/verification.js +481 -481
  184. package/server/services/vision.js +1163 -1163
  185. package/server/utils/cache.js +125 -125
  186. package/server/utils/migrate.js +81 -81
  187. package/server/utils/safe-fetch.js +228 -0
  188. package/server/utils/secureFields.js +50 -50
  189. package/server/ws.js +161 -161
  190. package/templates/artisan-marketplace.yaml +104 -104
  191. package/templates/book-price-scout.yaml +98 -98
  192. package/templates/electronics-price-tracker.yaml +108 -108
  193. package/templates/flight-deal-hunter.yaml +113 -113
  194. package/templates/freelancer-direct.yaml +116 -116
  195. package/templates/grocery-price-compare.yaml +93 -93
  196. package/templates/hotel-direct-booking.yaml +113 -113
  197. package/templates/local-services.yaml +98 -98
  198. package/templates/olive-oil-tunisia.yaml +88 -88
  199. package/templates/organic-farm-fresh.yaml +101 -101
  200. package/templates/restaurant-direct.yaml +97 -97
  201. package/server/services/fairness-engine.js +0 -409
  202. package/server/services/fairness.js +0 -420
@@ -1,1235 +1,1235 @@
1
- /* ═══════════════════════════════════════════════════════════════════════
2
- Web Agent Bridge — Design System & Styles
3
- ═══════════════════════════════════════════════════════════════════════ */
4
-
5
- :root {
6
- --bg-primary: #0a0e1a;
7
- --bg-secondary: #111827;
8
- --bg-card: #1a2236;
9
- --bg-card-hover: #1f2a42;
10
- --bg-surface: #0f1629;
11
- --bg-input: #1a2236;
12
-
13
- --text-primary: #f0f4ff;
14
- --text-secondary: #94a3b8;
15
- --text-muted: #64748b;
16
- --text-link: #60a5fa;
17
-
18
- --accent-blue: #3b82f6;
19
- --accent-blue-hover: #2563eb;
20
- --accent-cyan: #06b6d4;
21
- --accent-purple: #8b5cf6;
22
- --accent-green: #10b981;
23
- --accent-orange: #f59e0b;
24
- --accent-red: #ef4444;
25
- --accent-pink: #ec4899;
26
-
27
- --gradient-primary: linear-gradient(135deg, #3b82f6, #8b5cf6);
28
- --gradient-secondary: linear-gradient(135deg, #06b6d4, #3b82f6);
29
- --gradient-accent: linear-gradient(135deg, #8b5cf6, #ec4899);
30
- --gradient-hero: linear-gradient(160deg, #0a0e1a 0%, #111827 40%, #1a1a3e 100%);
31
-
32
- --border-color: #1e293b;
33
- --border-hover: #334155;
34
-
35
- --radius-sm: 6px;
36
- --radius-md: 10px;
37
- --radius-lg: 16px;
38
- --radius-xl: 24px;
39
- --radius-full: 9999px;
40
-
41
- --shadow-sm: 0 1px 2px rgba(0,0,0,0.3);
42
- --shadow-md: 0 4px 12px rgba(0,0,0,0.3);
43
- --shadow-lg: 0 8px 32px rgba(0,0,0,0.4);
44
- --shadow-glow: 0 0 30px rgba(59,130,246,0.15);
45
-
46
- --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
47
- --font-mono: 'JetBrains Mono', 'Fira Code', 'Consolas', monospace;
48
-
49
- --transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1);
50
- --transition-normal: 250ms cubic-bezier(0.4, 0, 0.2, 1);
51
- --transition-slow: 400ms cubic-bezier(0.4, 0, 0.2, 1);
52
- }
53
-
54
- *, *::before, *::after {
55
- box-sizing: border-box;
56
- margin: 0;
57
- padding: 0;
58
- }
59
-
60
- html {
61
- scroll-behavior: smooth;
62
- -webkit-font-smoothing: antialiased;
63
- -moz-osx-font-smoothing: grayscale;
64
- }
65
-
66
- body {
67
- font-family: var(--font-sans);
68
- background: var(--bg-primary);
69
- color: var(--text-primary);
70
- line-height: 1.6;
71
- min-height: 100vh;
72
- }
73
-
74
- a { color: var(--text-link); text-decoration: none; transition: color var(--transition-fast); }
75
- a:hover { color: var(--accent-blue-hover); }
76
-
77
- /* ─── Typography ─────────────────────────────────────────────────────── */
78
- h1, h2, h3, h4, h5, h6 {
79
- font-weight: 700;
80
- line-height: 1.2;
81
- letter-spacing: -0.02em;
82
- }
83
-
84
- h1 { font-size: clamp(2.4rem, 5vw, 4rem); }
85
- h2 { font-size: clamp(1.8rem, 3vw, 2.8rem); }
86
- h3 { font-size: clamp(1.3rem, 2vw, 1.7rem); }
87
- h4 { font-size: 1.2rem; }
88
-
89
- .gradient-text {
90
- background: var(--gradient-primary);
91
- -webkit-background-clip: text;
92
- -webkit-text-fill-color: transparent;
93
- background-clip: text;
94
- }
95
-
96
- .gradient-text-accent {
97
- background: var(--gradient-accent);
98
- -webkit-background-clip: text;
99
- -webkit-text-fill-color: transparent;
100
- background-clip: text;
101
- }
102
-
103
- /* ─── Layout ─────────────────────────────────────────────────────────── */
104
- .container {
105
- max-width: 1200px;
106
- margin: 0 auto;
107
- padding: 0 24px;
108
- }
109
-
110
- .section {
111
- padding: 100px 0;
112
- }
113
-
114
- .grid-2 { display: grid; grid-template-columns: repeat(2, 1fr); gap: 32px; }
115
- .grid-3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; }
116
- .grid-4 { display: grid; grid-template-columns: repeat(4, 1fr); gap: 24px; }
117
-
118
- @media (max-width: 1024px) {
119
- .grid-3 { grid-template-columns: repeat(2, 1fr); }
120
- .grid-4 { grid-template-columns: repeat(2, 1fr); }
121
- }
122
- @media (max-width: 768px) {
123
- .grid-2, .grid-3, .grid-4 { grid-template-columns: 1fr; }
124
- .section { padding: 64px 0; }
125
- }
126
-
127
- /* ─── Navbar ─────────────────────────────────────────────────────────── */
128
- .navbar {
129
- position: fixed;
130
- top: 0;
131
- left: 0;
132
- right: 0;
133
- z-index: 100;
134
- padding: 16px 0;
135
- backdrop-filter: blur(20px);
136
- background: rgba(10, 14, 26, 0.8);
137
- border-bottom: 1px solid var(--border-color);
138
- transition: all var(--transition-normal);
139
- }
140
-
141
- .navbar .container {
142
- display: flex;
143
- align-items: center;
144
- justify-content: space-between;
145
- }
146
-
147
- .navbar-brand {
148
- display: flex;
149
- align-items: center;
150
- gap: 10px;
151
- font-size: 1.25rem;
152
- font-weight: 800;
153
- color: var(--text-primary);
154
- letter-spacing: -0.03em;
155
- }
156
-
157
- .navbar-brand .brand-icon {
158
- width: 36px;
159
- height: 36px;
160
- background: var(--gradient-primary);
161
- border-radius: var(--radius-md);
162
- display: flex;
163
- align-items: center;
164
- justify-content: center;
165
- font-size: 1.1rem;
166
- }
167
-
168
- .navbar-links {
169
- display: flex;
170
- align-items: center;
171
- gap: 32px;
172
- list-style: none;
173
- }
174
-
175
- .navbar-links a {
176
- color: var(--text-secondary);
177
- font-size: 0.925rem;
178
- font-weight: 500;
179
- transition: color var(--transition-fast);
180
- }
181
-
182
- .navbar-links a:hover { color: var(--text-primary); }
183
-
184
- .navbar-actions {
185
- display: flex;
186
- align-items: center;
187
- gap: 12px;
188
- }
189
-
190
- .mobile-menu-btn {
191
- display: none;
192
- background: none;
193
- border: none;
194
- color: var(--text-primary);
195
- font-size: 1.5rem;
196
- cursor: pointer;
197
- }
198
-
199
- @media (max-width: 768px) {
200
- .navbar-links { display: none; }
201
- .mobile-menu-btn { display: block; }
202
- .navbar-actions .btn-ghost { display: none; }
203
- }
204
-
205
- /* ─── Buttons ────────────────────────────────────────────────────────── */
206
- .btn {
207
- display: inline-flex;
208
- align-items: center;
209
- justify-content: center;
210
- gap: 8px;
211
- padding: 12px 28px;
212
- font-family: var(--font-sans);
213
- font-size: 0.925rem;
214
- font-weight: 600;
215
- border: none;
216
- border-radius: var(--radius-full);
217
- cursor: pointer;
218
- transition: all var(--transition-fast);
219
- white-space: nowrap;
220
- text-decoration: none;
221
- line-height: 1;
222
- }
223
-
224
- .btn-primary {
225
- background: var(--gradient-primary);
226
- color: white;
227
- box-shadow: 0 4px 16px rgba(59,130,246,0.3);
228
- }
229
- .btn-primary:hover {
230
- transform: translateY(-1px);
231
- box-shadow: 0 6px 24px rgba(59,130,246,0.4);
232
- color: white;
233
- }
234
-
235
- .btn-secondary {
236
- background: var(--bg-card);
237
- color: var(--text-primary);
238
- border: 1px solid var(--border-color);
239
- }
240
- .btn-secondary:hover {
241
- background: var(--bg-card-hover);
242
- border-color: var(--border-hover);
243
- color: var(--text-primary);
244
- }
245
-
246
- .btn-ghost {
247
- background: transparent;
248
- color: var(--text-secondary);
249
- padding: 10px 20px;
250
- }
251
- .btn-ghost:hover { color: var(--text-primary); }
252
-
253
- .btn-sm { padding: 8px 18px; font-size: 0.85rem; }
254
- .btn-lg { padding: 16px 36px; font-size: 1.05rem; }
255
- .btn-icon { padding: 10px; border-radius: var(--radius-md); }
256
-
257
- .btn-danger { background: var(--accent-red); color: white; }
258
- .btn-danger:hover { background: #dc2626; color: white; }
259
-
260
- .btn-success { background: var(--accent-green); color: white; }
261
- .btn-success:hover { background: #059669; color: white; }
262
-
263
- /* ─── Hero ───────────────────────────────────────────────────────────── */
264
- .hero {
265
- min-height: 100vh;
266
- display: flex;
267
- align-items: center;
268
- text-align: center;
269
- background: var(--gradient-hero);
270
- position: relative;
271
- overflow: hidden;
272
- padding-top: 80px;
273
- }
274
-
275
- .hero::before {
276
- content: '';
277
- position: absolute;
278
- top: -50%;
279
- left: -50%;
280
- width: 200%;
281
- height: 200%;
282
- background:
283
- radial-gradient(circle at 25% 25%, rgba(59,130,246,0.06) 0%, transparent 50%),
284
- radial-gradient(circle at 75% 75%, rgba(139,92,246,0.06) 0%, transparent 50%);
285
- animation: heroGlow 15s ease-in-out infinite alternate;
286
- }
287
-
288
- @keyframes heroGlow {
289
- 0% { transform: translate(0, 0); }
290
- 100% { transform: translate(-5%, -5%); }
291
- }
292
-
293
- .hero-content {
294
- position: relative;
295
- z-index: 1;
296
- max-width: 820px;
297
- margin: 0 auto;
298
- }
299
-
300
- .hero-badge {
301
- display: inline-flex;
302
- align-items: center;
303
- gap: 8px;
304
- padding: 6px 16px;
305
- background: rgba(59,130,246,0.1);
306
- border: 1px solid rgba(59,130,246,0.2);
307
- border-radius: var(--radius-full);
308
- font-size: 0.85rem;
309
- color: var(--accent-blue);
310
- margin-bottom: 28px;
311
- }
312
-
313
- .hero h1 {
314
- margin-bottom: 24px;
315
- }
316
-
317
- .hero p {
318
- font-size: 1.2rem;
319
- color: var(--text-secondary);
320
- max-width: 640px;
321
- margin: 0 auto 40px;
322
- line-height: 1.7;
323
- }
324
-
325
- .hero-actions {
326
- display: flex;
327
- align-items: center;
328
- justify-content: center;
329
- gap: 16px;
330
- flex-wrap: wrap;
331
- }
332
-
333
- .hero-code {
334
- margin-top: 60px;
335
- background: var(--bg-card);
336
- border: 1px solid var(--border-color);
337
- border-radius: var(--radius-lg);
338
- padding: 28px 32px;
339
- text-align: left;
340
- max-width: 700px;
341
- margin-left: auto;
342
- margin-right: auto;
343
- position: relative;
344
- overflow: hidden;
345
- }
346
-
347
- .hero-code::before {
348
- content: '';
349
- position: absolute;
350
- top: 0;
351
- left: 0;
352
- right: 0;
353
- height: 3px;
354
- background: var(--gradient-primary);
355
- }
356
-
357
- .hero-code code {
358
- font-family: var(--font-mono);
359
- font-size: 0.85rem;
360
- line-height: 1.8;
361
- color: var(--text-secondary);
362
- }
363
-
364
- .hero-code .keyword { color: var(--accent-purple); }
365
- .hero-code .string { color: var(--accent-green); }
366
- .hero-code .property { color: var(--accent-blue); }
367
- .hero-code .comment { color: var(--text-muted); font-style: italic; }
368
- .hero-code .boolean { color: var(--accent-orange); }
369
-
370
- /* ─── Cards ──────────────────────────────────────────────────────────── */
371
- .card {
372
- background: var(--bg-card);
373
- border: 1px solid var(--border-color);
374
- border-radius: var(--radius-lg);
375
- padding: 32px;
376
- transition: all var(--transition-normal);
377
- }
378
-
379
- .card:hover {
380
- border-color: var(--border-hover);
381
- transform: translateY(-2px);
382
- box-shadow: var(--shadow-lg);
383
- }
384
-
385
- .card-icon {
386
- width: 52px;
387
- height: 52px;
388
- border-radius: var(--radius-md);
389
- display: flex;
390
- align-items: center;
391
- justify-content: center;
392
- font-size: 1.5rem;
393
- margin-bottom: 20px;
394
- }
395
-
396
- .card-icon.blue { background: rgba(59,130,246,0.12); color: var(--accent-blue); }
397
- .card-icon.purple { background: rgba(139,92,246,0.12); color: var(--accent-purple); }
398
- .card-icon.cyan { background: rgba(6,182,212,0.12); color: var(--accent-cyan); }
399
- .card-icon.green { background: rgba(16,185,129,0.12); color: var(--accent-green); }
400
- .card-icon.orange { background: rgba(245,158,11,0.12); color: var(--accent-orange); }
401
- .card-icon.pink { background: rgba(236,72,153,0.12); color: var(--accent-pink); }
402
-
403
- .card h3 { margin-bottom: 12px; }
404
- .card p { color: var(--text-secondary); font-size: 0.95rem; line-height: 1.65; }
405
-
406
- /* ─── Section Header ─────────────────────────────────────────────────── */
407
- .section-header {
408
- text-align: center;
409
- margin-bottom: 64px;
410
- }
411
-
412
- .section-header .label {
413
- display: inline-block;
414
- padding: 4px 14px;
415
- background: rgba(59,130,246,0.1);
416
- border: 1px solid rgba(59,130,246,0.2);
417
- border-radius: var(--radius-full);
418
- font-size: 0.8rem;
419
- font-weight: 600;
420
- color: var(--accent-blue);
421
- text-transform: uppercase;
422
- letter-spacing: 0.05em;
423
- margin-bottom: 16px;
424
- }
425
-
426
- .section-header h2 { margin-bottom: 16px; }
427
- .section-header p {
428
- color: var(--text-secondary);
429
- max-width: 600px;
430
- margin: 0 auto;
431
- font-size: 1.05rem;
432
- }
433
-
434
- /* ─── Pricing ────────────────────────────────────────────────────────── */
435
- .pricing-card {
436
- background: var(--bg-card);
437
- border: 1px solid var(--border-color);
438
- border-radius: var(--radius-lg);
439
- padding: 40px 32px;
440
- display: flex;
441
- flex-direction: column;
442
- transition: all var(--transition-normal);
443
- position: relative;
444
- }
445
-
446
- .pricing-card.featured {
447
- border-color: var(--accent-blue);
448
- box-shadow: var(--shadow-glow);
449
- }
450
-
451
- .pricing-card.featured::before {
452
- content: 'Most Popular';
453
- position: absolute;
454
- top: -12px;
455
- left: 50%;
456
- transform: translateX(-50%);
457
- padding: 4px 16px;
458
- background: var(--gradient-primary);
459
- border-radius: var(--radius-full);
460
- font-size: 0.75rem;
461
- font-weight: 700;
462
- color: white;
463
- text-transform: uppercase;
464
- letter-spacing: 0.04em;
465
- }
466
-
467
- .pricing-card:hover {
468
- transform: translateY(-4px);
469
- box-shadow: var(--shadow-lg);
470
- }
471
-
472
- .pricing-tier {
473
- font-size: 0.85rem;
474
- font-weight: 700;
475
- text-transform: uppercase;
476
- letter-spacing: 0.06em;
477
- color: var(--text-muted);
478
- margin-bottom: 8px;
479
- }
480
-
481
- .pricing-price {
482
- font-size: 3rem;
483
- font-weight: 800;
484
- letter-spacing: -0.04em;
485
- margin-bottom: 4px;
486
- }
487
-
488
- .pricing-price span {
489
- font-size: 1rem;
490
- font-weight: 400;
491
- color: var(--text-muted);
492
- }
493
-
494
- .pricing-desc {
495
- color: var(--text-secondary);
496
- font-size: 0.9rem;
497
- margin-bottom: 28px;
498
- min-height: 44px;
499
- }
500
-
501
- .pricing-features {
502
- list-style: none;
503
- flex: 1;
504
- margin-bottom: 32px;
505
- }
506
-
507
- .pricing-features li {
508
- padding: 8px 0;
509
- font-size: 0.9rem;
510
- color: var(--text-secondary);
511
- display: flex;
512
- align-items: center;
513
- gap: 10px;
514
- }
515
-
516
- .pricing-features li::before {
517
- content: '✓';
518
- color: var(--accent-green);
519
- font-weight: 700;
520
- font-size: 0.85rem;
521
- }
522
-
523
- .pricing-features li.disabled {
524
- color: var(--text-muted);
525
- text-decoration: line-through;
526
- }
527
-
528
- .pricing-features li.disabled::before {
529
- content: '✗';
530
- color: var(--text-muted);
531
- }
532
-
533
- /* ─── Code Block ─────────────────────────────────────────────────────── */
534
- .code-block {
535
- background: var(--bg-surface);
536
- border: 1px solid var(--border-color);
537
- border-radius: var(--radius-lg);
538
- overflow: hidden;
539
- }
540
-
541
- .code-header {
542
- display: flex;
543
- align-items: center;
544
- justify-content: space-between;
545
- padding: 12px 20px;
546
- background: var(--bg-card);
547
- border-bottom: 1px solid var(--border-color);
548
- }
549
-
550
- .code-dots {
551
- display: flex;
552
- gap: 6px;
553
- }
554
-
555
- .code-dots span {
556
- width: 10px;
557
- height: 10px;
558
- border-radius: 50%;
559
- }
560
-
561
- .code-dots span:nth-child(1) { background: #ef4444; }
562
- .code-dots span:nth-child(2) { background: #f59e0b; }
563
- .code-dots span:nth-child(3) { background: #10b981; }
564
-
565
- .code-lang {
566
- font-size: 0.75rem;
567
- color: var(--text-muted);
568
- font-family: var(--font-mono);
569
- }
570
-
571
- .code-body {
572
- padding: 20px 24px;
573
- overflow-x: auto;
574
- }
575
-
576
- .code-body pre {
577
- font-family: var(--font-mono);
578
- font-size: 0.85rem;
579
- line-height: 1.8;
580
- color: var(--text-secondary);
581
- }
582
-
583
- .code-body .kw { color: var(--accent-purple); }
584
- .code-body .fn { color: var(--accent-blue); }
585
- .code-body .str { color: var(--accent-green); }
586
- .code-body .cm { color: var(--text-muted); font-style: italic; }
587
- .code-body .num { color: var(--accent-orange); }
588
- .code-body .bool { color: var(--accent-orange); }
589
- .code-body .prop { color: var(--accent-cyan); }
590
-
591
- /* ─── Footer ─────────────────────────────────────────────────────────── */
592
- .footer {
593
- padding: 64px 0 32px;
594
- border-top: 1px solid var(--border-color);
595
- background: var(--bg-surface);
596
- }
597
-
598
- .footer-grid {
599
- display: grid;
600
- grid-template-columns: 2fr 1fr 1fr 1fr;
601
- gap: 48px;
602
- margin-bottom: 48px;
603
- }
604
-
605
- @media (max-width: 768px) {
606
- .footer-grid { grid-template-columns: 1fr 1fr; gap: 32px; }
607
- }
608
-
609
- .footer-brand p {
610
- color: var(--text-secondary);
611
- font-size: 0.9rem;
612
- margin-top: 12px;
613
- max-width: 300px;
614
- line-height: 1.6;
615
- }
616
-
617
- .footer-col h4 {
618
- color: var(--text-primary);
619
- font-size: 0.85rem;
620
- text-transform: uppercase;
621
- letter-spacing: 0.06em;
622
- margin-bottom: 16px;
623
- }
624
-
625
- .footer-col ul { list-style: none; }
626
- .footer-col li { margin-bottom: 10px; }
627
- .footer-col a { color: var(--text-muted); font-size: 0.9rem; }
628
- .footer-col a:hover { color: var(--text-primary); }
629
-
630
- .footer-bottom {
631
- display: flex;
632
- justify-content: space-between;
633
- align-items: center;
634
- padding-top: 28px;
635
- border-top: 1px solid var(--border-color);
636
- color: var(--text-muted);
637
- font-size: 0.85rem;
638
- }
639
-
640
- /* ─── Forms ──────────────────────────────────────────────────────────── */
641
- .form-group {
642
- margin-bottom: 20px;
643
- }
644
-
645
- .form-group label {
646
- display: block;
647
- font-size: 0.875rem;
648
- font-weight: 600;
649
- color: var(--text-secondary);
650
- margin-bottom: 6px;
651
- }
652
-
653
- .form-input {
654
- width: 100%;
655
- padding: 12px 16px;
656
- background: var(--bg-input);
657
- border: 1px solid var(--border-color);
658
- border-radius: var(--radius-md);
659
- color: var(--text-primary);
660
- font-family: var(--font-sans);
661
- font-size: 0.925rem;
662
- transition: border-color var(--transition-fast);
663
- outline: none;
664
- }
665
-
666
- .form-input:focus {
667
- border-color: var(--accent-blue);
668
- box-shadow: 0 0 0 3px rgba(59,130,246,0.15);
669
- }
670
-
671
- .form-input::placeholder { color: var(--text-muted); }
672
-
673
- select.form-input {
674
- appearance: none;
675
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='%2394a3b8' viewBox='0 0 16 16'%3E%3Cpath d='M4.5 6l3.5 4 3.5-4H4.5z'/%3E%3C/svg%3E");
676
- background-repeat: no-repeat;
677
- background-position: right 12px center;
678
- padding-right: 36px;
679
- }
680
-
681
- textarea.form-input {
682
- resize: vertical;
683
- min-height: 100px;
684
- }
685
-
686
- /* ─── Auth Pages ─────────────────────────────────────────────────────── */
687
- .auth-page {
688
- min-height: 100vh;
689
- display: flex;
690
- align-items: center;
691
- justify-content: center;
692
- background: var(--gradient-hero);
693
- padding: 24px;
694
- }
695
-
696
- .auth-card {
697
- width: 100%;
698
- max-width: 440px;
699
- background: var(--bg-card);
700
- border: 1px solid var(--border-color);
701
- border-radius: var(--radius-xl);
702
- padding: 48px 40px;
703
- box-shadow: var(--shadow-lg);
704
- }
705
-
706
- .auth-card h1 {
707
- font-size: 1.75rem;
708
- margin-bottom: 8px;
709
- }
710
-
711
- .auth-card .subtitle {
712
- color: var(--text-secondary);
713
- margin-bottom: 32px;
714
- }
715
-
716
- .auth-card .btn { width: 100%; margin-top: 8px; }
717
-
718
- .auth-footer {
719
- text-align: center;
720
- margin-top: 24px;
721
- color: var(--text-muted);
722
- font-size: 0.9rem;
723
- }
724
-
725
- .alert {
726
- padding: 12px 16px;
727
- border-radius: var(--radius-md);
728
- font-size: 0.9rem;
729
- margin-bottom: 20px;
730
- display: none;
731
- }
732
-
733
- .alert-error {
734
- background: rgba(239,68,68,0.1);
735
- border: 1px solid rgba(239,68,68,0.3);
736
- color: var(--accent-red);
737
- }
738
-
739
- .alert-success {
740
- background: rgba(16,185,129,0.1);
741
- border: 1px solid rgba(16,185,129,0.3);
742
- color: var(--accent-green);
743
- }
744
-
745
- /* ─── Dashboard ──────────────────────────────────────────────────────── */
746
- .dashboard {
747
- display: flex;
748
- min-height: 100vh;
749
- }
750
-
751
- .sidebar {
752
- width: 260px;
753
- background: var(--bg-secondary);
754
- border-right: 1px solid var(--border-color);
755
- padding: 24px 0;
756
- display: flex;
757
- flex-direction: column;
758
- position: fixed;
759
- top: 0;
760
- left: 0;
761
- bottom: 0;
762
- z-index: 50;
763
- }
764
-
765
- .sidebar-brand {
766
- padding: 0 24px 24px;
767
- border-bottom: 1px solid var(--border-color);
768
- margin-bottom: 16px;
769
- }
770
-
771
- .sidebar-nav {
772
- flex: 1;
773
- padding: 0 12px;
774
- }
775
-
776
- .sidebar-nav a {
777
- display: flex;
778
- align-items: center;
779
- gap: 12px;
780
- padding: 10px 16px;
781
- border-radius: var(--radius-md);
782
- color: var(--text-secondary);
783
- font-size: 0.9rem;
784
- font-weight: 500;
785
- transition: all var(--transition-fast);
786
- margin-bottom: 2px;
787
- }
788
-
789
- .sidebar-nav a:hover,
790
- .sidebar-nav a.active {
791
- background: rgba(59,130,246,0.1);
792
- color: var(--text-primary);
793
- }
794
-
795
- .sidebar-nav a.active { color: var(--accent-blue); }
796
-
797
- .sidebar-footer {
798
- padding: 16px 24px;
799
- border-top: 1px solid var(--border-color);
800
- }
801
-
802
- .main-content {
803
- flex: 1;
804
- margin-left: 260px;
805
- padding: 32px 40px;
806
- }
807
-
808
- .page-header {
809
- display: flex;
810
- align-items: center;
811
- justify-content: space-between;
812
- margin-bottom: 32px;
813
- }
814
-
815
- .page-header h1 {
816
- font-size: 1.75rem;
817
- }
818
-
819
- .stats-grid {
820
- display: grid;
821
- grid-template-columns: repeat(4, 1fr);
822
- gap: 20px;
823
- margin-bottom: 32px;
824
- }
825
-
826
- @media (max-width: 1200px) {
827
- .stats-grid { grid-template-columns: repeat(2, 1fr); }
828
- }
829
-
830
- .stat-card {
831
- background: var(--bg-card);
832
- border: 1px solid var(--border-color);
833
- border-radius: var(--radius-lg);
834
- padding: 24px;
835
- }
836
-
837
- .stat-card .label {
838
- font-size: 0.8rem;
839
- color: var(--text-muted);
840
- text-transform: uppercase;
841
- letter-spacing: 0.04em;
842
- margin-bottom: 8px;
843
- }
844
-
845
- .stat-card .value {
846
- font-size: 2rem;
847
- font-weight: 800;
848
- letter-spacing: -0.03em;
849
- }
850
-
851
- .stat-card .change {
852
- font-size: 0.8rem;
853
- margin-top: 4px;
854
- }
855
-
856
- .stat-card .change.up { color: var(--accent-green); }
857
- .stat-card .change.down { color: var(--accent-red); }
858
-
859
- /* ─── Table ──────────────────────────────────────────────────────────── */
860
- .table-wrapper {
861
- background: var(--bg-card);
862
- border: 1px solid var(--border-color);
863
- border-radius: var(--radius-lg);
864
- overflow: hidden;
865
- }
866
-
867
- .table-header {
868
- display: flex;
869
- justify-content: space-between;
870
- align-items: center;
871
- padding: 20px 24px;
872
- border-bottom: 1px solid var(--border-color);
873
- }
874
-
875
- table {
876
- width: 100%;
877
- border-collapse: collapse;
878
- }
879
-
880
- th, td {
881
- padding: 14px 24px;
882
- text-align: left;
883
- font-size: 0.9rem;
884
- }
885
-
886
- th {
887
- background: var(--bg-surface);
888
- color: var(--text-muted);
889
- font-weight: 600;
890
- font-size: 0.8rem;
891
- text-transform: uppercase;
892
- letter-spacing: 0.04em;
893
- }
894
-
895
- td { border-bottom: 1px solid var(--border-color); color: var(--text-secondary); }
896
- tr:last-child td { border-bottom: none; }
897
- tr:hover td { background: rgba(59,130,246,0.03); }
898
-
899
- /* ─── Badge ──────────────────────────────────────────────────────────── */
900
- .badge {
901
- display: inline-flex;
902
- align-items: center;
903
- padding: 3px 10px;
904
- border-radius: var(--radius-full);
905
- font-size: 0.75rem;
906
- font-weight: 600;
907
- }
908
-
909
- .badge-free { background: rgba(100,116,139,0.15); color: var(--text-muted); }
910
- .badge-starter { background: rgba(59,130,246,0.15); color: var(--accent-blue); }
911
- .badge-pro { background: rgba(139,92,246,0.15); color: var(--accent-purple); }
912
- .badge-enterprise { background: rgba(245,158,11,0.15); color: var(--accent-orange); }
913
- .badge-active { background: rgba(16,185,129,0.15); color: var(--accent-green); }
914
- .badge-inactive { background: rgba(239,68,68,0.15); color: var(--accent-red); }
915
-
916
- /* ─── Modal ──────────────────────────────────────────────────────────── */
917
- .modal-overlay {
918
- position: fixed;
919
- inset: 0;
920
- background: rgba(0,0,0,0.6);
921
- backdrop-filter: blur(4px);
922
- display: flex;
923
- align-items: center;
924
- justify-content: center;
925
- z-index: 200;
926
- padding: 24px;
927
- opacity: 0;
928
- visibility: hidden;
929
- transition: all var(--transition-normal);
930
- }
931
-
932
- .modal-overlay.active {
933
- opacity: 1;
934
- visibility: visible;
935
- }
936
-
937
- .modal {
938
- background: var(--bg-card);
939
- border: 1px solid var(--border-color);
940
- border-radius: var(--radius-xl);
941
- width: 100%;
942
- max-width: 560px;
943
- max-height: 90vh;
944
- overflow-y: auto;
945
- transform: translateY(20px);
946
- transition: transform var(--transition-normal);
947
- }
948
-
949
- .modal-overlay.active .modal {
950
- transform: translateY(0);
951
- }
952
-
953
- .modal-header {
954
- display: flex;
955
- align-items: center;
956
- justify-content: space-between;
957
- padding: 24px 28px;
958
- border-bottom: 1px solid var(--border-color);
959
- }
960
-
961
- .modal-header h2 { font-size: 1.2rem; }
962
-
963
- .modal-close {
964
- background: none;
965
- border: none;
966
- color: var(--text-muted);
967
- font-size: 1.4rem;
968
- cursor: pointer;
969
- padding: 4px;
970
- line-height: 1;
971
- }
972
-
973
- .modal-close:hover { color: var(--text-primary); }
974
-
975
- .modal-body { padding: 28px; }
976
- .modal-footer {
977
- padding: 20px 28px;
978
- border-top: 1px solid var(--border-color);
979
- display: flex;
980
- justify-content: flex-end;
981
- gap: 12px;
982
- }
983
-
984
- /* ─── Tabs ───────────────────────────────────────────────────────────── */
985
- .tabs {
986
- display: flex;
987
- border-bottom: 1px solid var(--border-color);
988
- margin-bottom: 28px;
989
- }
990
-
991
- .tab {
992
- padding: 12px 20px;
993
- font-size: 0.9rem;
994
- font-weight: 500;
995
- color: var(--text-muted);
996
- background: none;
997
- border: none;
998
- border-bottom: 2px solid transparent;
999
- cursor: pointer;
1000
- transition: all var(--transition-fast);
1001
- font-family: var(--font-sans);
1002
- }
1003
-
1004
- .tab:hover { color: var(--text-secondary); }
1005
- .tab.active {
1006
- color: var(--accent-blue);
1007
- border-bottom-color: var(--accent-blue);
1008
- }
1009
-
1010
- .tab-content { display: none; }
1011
- .tab-content.active { display: block; }
1012
-
1013
- /* ─── Toggle ─────────────────────────────────────────────────────────── */
1014
- .toggle-wrap {
1015
- display: flex;
1016
- align-items: center;
1017
- justify-content: space-between;
1018
- padding: 12px 0;
1019
- border-bottom: 1px solid var(--border-color);
1020
- }
1021
-
1022
- .toggle-label {
1023
- font-size: 0.9rem;
1024
- color: var(--text-secondary);
1025
- }
1026
-
1027
- .toggle-label small { display: block; color: var(--text-muted); font-size: 0.8rem; margin-top: 2px; }
1028
-
1029
- .toggle {
1030
- position: relative;
1031
- width: 44px;
1032
- height: 24px;
1033
- flex-shrink: 0;
1034
- }
1035
-
1036
- .toggle input {
1037
- opacity: 0;
1038
- width: 0;
1039
- height: 0;
1040
- position: absolute;
1041
- }
1042
-
1043
- .toggle-slider {
1044
- position: absolute;
1045
- inset: 0;
1046
- background: var(--border-color);
1047
- border-radius: var(--radius-full);
1048
- cursor: pointer;
1049
- transition: background var(--transition-fast);
1050
- }
1051
-
1052
- .toggle-slider::before {
1053
- content: '';
1054
- position: absolute;
1055
- top: 3px;
1056
- left: 3px;
1057
- width: 18px;
1058
- height: 18px;
1059
- background: white;
1060
- border-radius: 50%;
1061
- transition: transform var(--transition-fast);
1062
- }
1063
-
1064
- .toggle input:checked + .toggle-slider {
1065
- background: var(--accent-blue);
1066
- }
1067
-
1068
- .toggle input:checked + .toggle-slider::before {
1069
- transform: translateX(20px);
1070
- }
1071
-
1072
- /* ─── Snippet Box ────────────────────────────────────────────────────── */
1073
- .snippet-box {
1074
- background: var(--bg-surface);
1075
- border: 1px solid var(--border-color);
1076
- border-radius: var(--radius-md);
1077
- padding: 16px;
1078
- position: relative;
1079
- }
1080
-
1081
- .snippet-box pre {
1082
- font-family: var(--font-mono);
1083
- font-size: 0.82rem;
1084
- line-height: 1.7;
1085
- color: var(--text-secondary);
1086
- white-space: pre-wrap;
1087
- word-break: break-all;
1088
- }
1089
-
1090
- .copy-btn {
1091
- position: absolute;
1092
- top: 10px;
1093
- right: 10px;
1094
- background: var(--bg-card);
1095
- border: 1px solid var(--border-color);
1096
- border-radius: var(--radius-sm);
1097
- color: var(--text-muted);
1098
- padding: 6px 12px;
1099
- font-size: 0.75rem;
1100
- cursor: pointer;
1101
- font-family: var(--font-sans);
1102
- transition: all var(--transition-fast);
1103
- }
1104
-
1105
- .copy-btn:hover {
1106
- color: var(--text-primary);
1107
- border-color: var(--border-hover);
1108
- }
1109
-
1110
- /* ─── Docs ───────────────────────────────────────────────────────────── */
1111
- .docs-layout {
1112
- display: flex;
1113
- gap: 40px;
1114
- padding-top: 100px;
1115
- }
1116
-
1117
- .docs-sidebar {
1118
- width: 240px;
1119
- flex-shrink: 0;
1120
- position: sticky;
1121
- top: 100px;
1122
- max-height: calc(100vh - 120px);
1123
- overflow-y: auto;
1124
- }
1125
-
1126
- .docs-sidebar ul { list-style: none; }
1127
- .docs-sidebar li { margin-bottom: 4px; }
1128
- .docs-sidebar a {
1129
- display: block;
1130
- padding: 8px 14px;
1131
- font-size: 0.875rem;
1132
- color: var(--text-muted);
1133
- border-radius: var(--radius-sm);
1134
- border-left: 2px solid transparent;
1135
- transition: all var(--transition-fast);
1136
- }
1137
- .docs-sidebar a:hover { color: var(--text-secondary); background: rgba(59,130,246,0.05); }
1138
- .docs-sidebar a.active { color: var(--accent-blue); border-left-color: var(--accent-blue); background: rgba(59,130,246,0.08); }
1139
-
1140
- .docs-content {
1141
- flex: 1;
1142
- min-width: 0;
1143
- padding-bottom: 80px;
1144
- }
1145
-
1146
- .docs-content h2 {
1147
- font-size: 1.6rem;
1148
- margin-top: 48px;
1149
- margin-bottom: 16px;
1150
- padding-bottom: 12px;
1151
- border-bottom: 1px solid var(--border-color);
1152
- }
1153
-
1154
- .docs-content h2:first-child { margin-top: 0; }
1155
-
1156
- .docs-content h3 {
1157
- font-size: 1.2rem;
1158
- margin-top: 32px;
1159
- margin-bottom: 12px;
1160
- }
1161
-
1162
- .docs-content p {
1163
- color: var(--text-secondary);
1164
- margin-bottom: 16px;
1165
- line-height: 1.7;
1166
- }
1167
-
1168
- .docs-content ul, .docs-content ol {
1169
- color: var(--text-secondary);
1170
- margin-bottom: 16px;
1171
- padding-left: 24px;
1172
- }
1173
-
1174
- .docs-content li { margin-bottom: 6px; line-height: 1.6; }
1175
-
1176
- .docs-content code {
1177
- font-family: var(--font-mono);
1178
- font-size: 0.85em;
1179
- background: var(--bg-surface);
1180
- padding: 2px 7px;
1181
- border-radius: var(--radius-sm);
1182
- border: 1px solid var(--border-color);
1183
- color: var(--accent-cyan);
1184
- }
1185
-
1186
- .docs-content pre code {
1187
- display: block;
1188
- padding: 20px 24px;
1189
- border-radius: var(--radius-md);
1190
- overflow-x: auto;
1191
- line-height: 1.7;
1192
- border: none;
1193
- }
1194
-
1195
- @media (max-width: 768px) {
1196
- .docs-sidebar { display: none; }
1197
- }
1198
-
1199
- /* ─── Utilities ──────────────────────────────────────────────────────── */
1200
- .text-center { text-align: center; }
1201
- .text-left { text-align: left; }
1202
- .text-muted { color: var(--text-muted); }
1203
- .mt-4 { margin-top: 16px; }
1204
- .mt-8 { margin-top: 32px; }
1205
- .mb-4 { margin-bottom: 16px; }
1206
- .mb-8 { margin-bottom: 32px; }
1207
- .flex { display: flex; }
1208
- .items-center { align-items: center; }
1209
- .justify-between { justify-content: space-between; }
1210
- .gap-2 { gap: 8px; }
1211
- .gap-4 { gap: 16px; }
1212
- .hidden { display: none !important; }
1213
- .mono { font-family: var(--font-mono); }
1214
- .truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1215
-
1216
- /* ─── Animations ─────────────────────────────────────────────────────── */
1217
- @keyframes fadeIn {
1218
- from { opacity: 0; transform: translateY(12px); }
1219
- to { opacity: 1; transform: translateY(0); }
1220
- }
1221
-
1222
- .fade-in {
1223
- animation: fadeIn 0.5s ease-out forwards;
1224
- }
1225
-
1226
- .fade-in-delay-1 { animation-delay: 0.1s; opacity: 0; }
1227
- .fade-in-delay-2 { animation-delay: 0.2s; opacity: 0; }
1228
- .fade-in-delay-3 { animation-delay: 0.3s; opacity: 0; }
1229
- .fade-in-delay-4 { animation-delay: 0.4s; opacity: 0; }
1230
-
1231
- /* ─── Scrollbar ──────────────────────────────────────────────────────── */
1232
- ::-webkit-scrollbar { width: 8px; height: 8px; }
1233
- ::-webkit-scrollbar-track { background: var(--bg-primary); }
1234
- ::-webkit-scrollbar-thumb { background: var(--border-color); border-radius: 4px; }
1235
- ::-webkit-scrollbar-thumb:hover { background: var(--border-hover); }
1
+ /* ═══════════════════════════════════════════════════════════════════════
2
+ Web Agent Bridge — Design System & Styles
3
+ ═══════════════════════════════════════════════════════════════════════ */
4
+
5
+ :root {
6
+ --bg-primary: #0a0e1a;
7
+ --bg-secondary: #111827;
8
+ --bg-card: #1a2236;
9
+ --bg-card-hover: #1f2a42;
10
+ --bg-surface: #0f1629;
11
+ --bg-input: #1a2236;
12
+
13
+ --text-primary: #f0f4ff;
14
+ --text-secondary: #94a3b8;
15
+ --text-muted: #64748b;
16
+ --text-link: #60a5fa;
17
+
18
+ --accent-blue: #3b82f6;
19
+ --accent-blue-hover: #2563eb;
20
+ --accent-cyan: #06b6d4;
21
+ --accent-purple: #8b5cf6;
22
+ --accent-green: #10b981;
23
+ --accent-orange: #f59e0b;
24
+ --accent-red: #ef4444;
25
+ --accent-pink: #ec4899;
26
+
27
+ --gradient-primary: linear-gradient(135deg, #3b82f6, #8b5cf6);
28
+ --gradient-secondary: linear-gradient(135deg, #06b6d4, #3b82f6);
29
+ --gradient-accent: linear-gradient(135deg, #8b5cf6, #ec4899);
30
+ --gradient-hero: linear-gradient(160deg, #0a0e1a 0%, #111827 40%, #1a1a3e 100%);
31
+
32
+ --border-color: #1e293b;
33
+ --border-hover: #334155;
34
+
35
+ --radius-sm: 6px;
36
+ --radius-md: 10px;
37
+ --radius-lg: 16px;
38
+ --radius-xl: 24px;
39
+ --radius-full: 9999px;
40
+
41
+ --shadow-sm: 0 1px 2px rgba(0,0,0,0.3);
42
+ --shadow-md: 0 4px 12px rgba(0,0,0,0.3);
43
+ --shadow-lg: 0 8px 32px rgba(0,0,0,0.4);
44
+ --shadow-glow: 0 0 30px rgba(59,130,246,0.15);
45
+
46
+ --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
47
+ --font-mono: 'JetBrains Mono', 'Fira Code', 'Consolas', monospace;
48
+
49
+ --transition-fast: 150ms cubic-bezier(0.4, 0, 0.2, 1);
50
+ --transition-normal: 250ms cubic-bezier(0.4, 0, 0.2, 1);
51
+ --transition-slow: 400ms cubic-bezier(0.4, 0, 0.2, 1);
52
+ }
53
+
54
+ *, *::before, *::after {
55
+ box-sizing: border-box;
56
+ margin: 0;
57
+ padding: 0;
58
+ }
59
+
60
+ html {
61
+ scroll-behavior: smooth;
62
+ -webkit-font-smoothing: antialiased;
63
+ -moz-osx-font-smoothing: grayscale;
64
+ }
65
+
66
+ body {
67
+ font-family: var(--font-sans);
68
+ background: var(--bg-primary);
69
+ color: var(--text-primary);
70
+ line-height: 1.6;
71
+ min-height: 100vh;
72
+ }
73
+
74
+ a { color: var(--text-link); text-decoration: none; transition: color var(--transition-fast); }
75
+ a:hover { color: var(--accent-blue-hover); }
76
+
77
+ /* ─── Typography ─────────────────────────────────────────────────────── */
78
+ h1, h2, h3, h4, h5, h6 {
79
+ font-weight: 700;
80
+ line-height: 1.2;
81
+ letter-spacing: -0.02em;
82
+ }
83
+
84
+ h1 { font-size: clamp(2.4rem, 5vw, 4rem); }
85
+ h2 { font-size: clamp(1.8rem, 3vw, 2.8rem); }
86
+ h3 { font-size: clamp(1.3rem, 2vw, 1.7rem); }
87
+ h4 { font-size: 1.2rem; }
88
+
89
+ .gradient-text {
90
+ background: var(--gradient-primary);
91
+ -webkit-background-clip: text;
92
+ -webkit-text-fill-color: transparent;
93
+ background-clip: text;
94
+ }
95
+
96
+ .gradient-text-accent {
97
+ background: var(--gradient-accent);
98
+ -webkit-background-clip: text;
99
+ -webkit-text-fill-color: transparent;
100
+ background-clip: text;
101
+ }
102
+
103
+ /* ─── Layout ─────────────────────────────────────────────────────────── */
104
+ .container {
105
+ max-width: 1200px;
106
+ margin: 0 auto;
107
+ padding: 0 24px;
108
+ }
109
+
110
+ .section {
111
+ padding: 100px 0;
112
+ }
113
+
114
+ .grid-2 { display: grid; grid-template-columns: repeat(2, 1fr); gap: 32px; }
115
+ .grid-3 { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; }
116
+ .grid-4 { display: grid; grid-template-columns: repeat(4, 1fr); gap: 24px; }
117
+
118
+ @media (max-width: 1024px) {
119
+ .grid-3 { grid-template-columns: repeat(2, 1fr); }
120
+ .grid-4 { grid-template-columns: repeat(2, 1fr); }
121
+ }
122
+ @media (max-width: 768px) {
123
+ .grid-2, .grid-3, .grid-4 { grid-template-columns: 1fr; }
124
+ .section { padding: 64px 0; }
125
+ }
126
+
127
+ /* ─── Navbar ─────────────────────────────────────────────────────────── */
128
+ .navbar {
129
+ position: fixed;
130
+ top: 0;
131
+ left: 0;
132
+ right: 0;
133
+ z-index: 100;
134
+ padding: 16px 0;
135
+ backdrop-filter: blur(20px);
136
+ background: rgba(10, 14, 26, 0.8);
137
+ border-bottom: 1px solid var(--border-color);
138
+ transition: all var(--transition-normal);
139
+ }
140
+
141
+ .navbar .container {
142
+ display: flex;
143
+ align-items: center;
144
+ justify-content: space-between;
145
+ }
146
+
147
+ .navbar-brand {
148
+ display: flex;
149
+ align-items: center;
150
+ gap: 10px;
151
+ font-size: 1.25rem;
152
+ font-weight: 800;
153
+ color: var(--text-primary);
154
+ letter-spacing: -0.03em;
155
+ }
156
+
157
+ .navbar-brand .brand-icon {
158
+ width: 36px;
159
+ height: 36px;
160
+ background: var(--gradient-primary);
161
+ border-radius: var(--radius-md);
162
+ display: flex;
163
+ align-items: center;
164
+ justify-content: center;
165
+ font-size: 1.1rem;
166
+ }
167
+
168
+ .navbar-links {
169
+ display: flex;
170
+ align-items: center;
171
+ gap: 32px;
172
+ list-style: none;
173
+ }
174
+
175
+ .navbar-links a {
176
+ color: var(--text-secondary);
177
+ font-size: 0.925rem;
178
+ font-weight: 500;
179
+ transition: color var(--transition-fast);
180
+ }
181
+
182
+ .navbar-links a:hover { color: var(--text-primary); }
183
+
184
+ .navbar-actions {
185
+ display: flex;
186
+ align-items: center;
187
+ gap: 12px;
188
+ }
189
+
190
+ .mobile-menu-btn {
191
+ display: none;
192
+ background: none;
193
+ border: none;
194
+ color: var(--text-primary);
195
+ font-size: 1.5rem;
196
+ cursor: pointer;
197
+ }
198
+
199
+ @media (max-width: 768px) {
200
+ .navbar-links { display: none; }
201
+ .mobile-menu-btn { display: block; }
202
+ .navbar-actions .btn-ghost { display: none; }
203
+ }
204
+
205
+ /* ─── Buttons ────────────────────────────────────────────────────────── */
206
+ .btn {
207
+ display: inline-flex;
208
+ align-items: center;
209
+ justify-content: center;
210
+ gap: 8px;
211
+ padding: 12px 28px;
212
+ font-family: var(--font-sans);
213
+ font-size: 0.925rem;
214
+ font-weight: 600;
215
+ border: none;
216
+ border-radius: var(--radius-full);
217
+ cursor: pointer;
218
+ transition: all var(--transition-fast);
219
+ white-space: nowrap;
220
+ text-decoration: none;
221
+ line-height: 1;
222
+ }
223
+
224
+ .btn-primary {
225
+ background: var(--gradient-primary);
226
+ color: white;
227
+ box-shadow: 0 4px 16px rgba(59,130,246,0.3);
228
+ }
229
+ .btn-primary:hover {
230
+ transform: translateY(-1px);
231
+ box-shadow: 0 6px 24px rgba(59,130,246,0.4);
232
+ color: white;
233
+ }
234
+
235
+ .btn-secondary {
236
+ background: var(--bg-card);
237
+ color: var(--text-primary);
238
+ border: 1px solid var(--border-color);
239
+ }
240
+ .btn-secondary:hover {
241
+ background: var(--bg-card-hover);
242
+ border-color: var(--border-hover);
243
+ color: var(--text-primary);
244
+ }
245
+
246
+ .btn-ghost {
247
+ background: transparent;
248
+ color: var(--text-secondary);
249
+ padding: 10px 20px;
250
+ }
251
+ .btn-ghost:hover { color: var(--text-primary); }
252
+
253
+ .btn-sm { padding: 8px 18px; font-size: 0.85rem; }
254
+ .btn-lg { padding: 16px 36px; font-size: 1.05rem; }
255
+ .btn-icon { padding: 10px; border-radius: var(--radius-md); }
256
+
257
+ .btn-danger { background: var(--accent-red); color: white; }
258
+ .btn-danger:hover { background: #dc2626; color: white; }
259
+
260
+ .btn-success { background: var(--accent-green); color: white; }
261
+ .btn-success:hover { background: #059669; color: white; }
262
+
263
+ /* ─── Hero ───────────────────────────────────────────────────────────── */
264
+ .hero {
265
+ min-height: 100vh;
266
+ display: flex;
267
+ align-items: center;
268
+ text-align: center;
269
+ background: var(--gradient-hero);
270
+ position: relative;
271
+ overflow: hidden;
272
+ padding-top: 80px;
273
+ }
274
+
275
+ .hero::before {
276
+ content: '';
277
+ position: absolute;
278
+ top: -50%;
279
+ left: -50%;
280
+ width: 200%;
281
+ height: 200%;
282
+ background:
283
+ radial-gradient(circle at 25% 25%, rgba(59,130,246,0.06) 0%, transparent 50%),
284
+ radial-gradient(circle at 75% 75%, rgba(139,92,246,0.06) 0%, transparent 50%);
285
+ animation: heroGlow 15s ease-in-out infinite alternate;
286
+ }
287
+
288
+ @keyframes heroGlow {
289
+ 0% { transform: translate(0, 0); }
290
+ 100% { transform: translate(-5%, -5%); }
291
+ }
292
+
293
+ .hero-content {
294
+ position: relative;
295
+ z-index: 1;
296
+ max-width: 820px;
297
+ margin: 0 auto;
298
+ }
299
+
300
+ .hero-badge {
301
+ display: inline-flex;
302
+ align-items: center;
303
+ gap: 8px;
304
+ padding: 6px 16px;
305
+ background: rgba(59,130,246,0.1);
306
+ border: 1px solid rgba(59,130,246,0.2);
307
+ border-radius: var(--radius-full);
308
+ font-size: 0.85rem;
309
+ color: var(--accent-blue);
310
+ margin-bottom: 28px;
311
+ }
312
+
313
+ .hero h1 {
314
+ margin-bottom: 24px;
315
+ }
316
+
317
+ .hero p {
318
+ font-size: 1.2rem;
319
+ color: var(--text-secondary);
320
+ max-width: 640px;
321
+ margin: 0 auto 40px;
322
+ line-height: 1.7;
323
+ }
324
+
325
+ .hero-actions {
326
+ display: flex;
327
+ align-items: center;
328
+ justify-content: center;
329
+ gap: 16px;
330
+ flex-wrap: wrap;
331
+ }
332
+
333
+ .hero-code {
334
+ margin-top: 60px;
335
+ background: var(--bg-card);
336
+ border: 1px solid var(--border-color);
337
+ border-radius: var(--radius-lg);
338
+ padding: 28px 32px;
339
+ text-align: left;
340
+ max-width: 700px;
341
+ margin-left: auto;
342
+ margin-right: auto;
343
+ position: relative;
344
+ overflow: hidden;
345
+ }
346
+
347
+ .hero-code::before {
348
+ content: '';
349
+ position: absolute;
350
+ top: 0;
351
+ left: 0;
352
+ right: 0;
353
+ height: 3px;
354
+ background: var(--gradient-primary);
355
+ }
356
+
357
+ .hero-code code {
358
+ font-family: var(--font-mono);
359
+ font-size: 0.85rem;
360
+ line-height: 1.8;
361
+ color: var(--text-secondary);
362
+ }
363
+
364
+ .hero-code .keyword { color: var(--accent-purple); }
365
+ .hero-code .string { color: var(--accent-green); }
366
+ .hero-code .property { color: var(--accent-blue); }
367
+ .hero-code .comment { color: var(--text-muted); font-style: italic; }
368
+ .hero-code .boolean { color: var(--accent-orange); }
369
+
370
+ /* ─── Cards ──────────────────────────────────────────────────────────── */
371
+ .card {
372
+ background: var(--bg-card);
373
+ border: 1px solid var(--border-color);
374
+ border-radius: var(--radius-lg);
375
+ padding: 32px;
376
+ transition: all var(--transition-normal);
377
+ }
378
+
379
+ .card:hover {
380
+ border-color: var(--border-hover);
381
+ transform: translateY(-2px);
382
+ box-shadow: var(--shadow-lg);
383
+ }
384
+
385
+ .card-icon {
386
+ width: 52px;
387
+ height: 52px;
388
+ border-radius: var(--radius-md);
389
+ display: flex;
390
+ align-items: center;
391
+ justify-content: center;
392
+ font-size: 1.5rem;
393
+ margin-bottom: 20px;
394
+ }
395
+
396
+ .card-icon.blue { background: rgba(59,130,246,0.12); color: var(--accent-blue); }
397
+ .card-icon.purple { background: rgba(139,92,246,0.12); color: var(--accent-purple); }
398
+ .card-icon.cyan { background: rgba(6,182,212,0.12); color: var(--accent-cyan); }
399
+ .card-icon.green { background: rgba(16,185,129,0.12); color: var(--accent-green); }
400
+ .card-icon.orange { background: rgba(245,158,11,0.12); color: var(--accent-orange); }
401
+ .card-icon.pink { background: rgba(236,72,153,0.12); color: var(--accent-pink); }
402
+
403
+ .card h3 { margin-bottom: 12px; }
404
+ .card p { color: var(--text-secondary); font-size: 0.95rem; line-height: 1.65; }
405
+
406
+ /* ─── Section Header ─────────────────────────────────────────────────── */
407
+ .section-header {
408
+ text-align: center;
409
+ margin-bottom: 64px;
410
+ }
411
+
412
+ .section-header .label {
413
+ display: inline-block;
414
+ padding: 4px 14px;
415
+ background: rgba(59,130,246,0.1);
416
+ border: 1px solid rgba(59,130,246,0.2);
417
+ border-radius: var(--radius-full);
418
+ font-size: 0.8rem;
419
+ font-weight: 600;
420
+ color: var(--accent-blue);
421
+ text-transform: uppercase;
422
+ letter-spacing: 0.05em;
423
+ margin-bottom: 16px;
424
+ }
425
+
426
+ .section-header h2 { margin-bottom: 16px; }
427
+ .section-header p {
428
+ color: var(--text-secondary);
429
+ max-width: 600px;
430
+ margin: 0 auto;
431
+ font-size: 1.05rem;
432
+ }
433
+
434
+ /* ─── Pricing ────────────────────────────────────────────────────────── */
435
+ .pricing-card {
436
+ background: var(--bg-card);
437
+ border: 1px solid var(--border-color);
438
+ border-radius: var(--radius-lg);
439
+ padding: 40px 32px;
440
+ display: flex;
441
+ flex-direction: column;
442
+ transition: all var(--transition-normal);
443
+ position: relative;
444
+ }
445
+
446
+ .pricing-card.featured {
447
+ border-color: var(--accent-blue);
448
+ box-shadow: var(--shadow-glow);
449
+ }
450
+
451
+ .pricing-card.featured::before {
452
+ content: 'Most Popular';
453
+ position: absolute;
454
+ top: -12px;
455
+ left: 50%;
456
+ transform: translateX(-50%);
457
+ padding: 4px 16px;
458
+ background: var(--gradient-primary);
459
+ border-radius: var(--radius-full);
460
+ font-size: 0.75rem;
461
+ font-weight: 700;
462
+ color: white;
463
+ text-transform: uppercase;
464
+ letter-spacing: 0.04em;
465
+ }
466
+
467
+ .pricing-card:hover {
468
+ transform: translateY(-4px);
469
+ box-shadow: var(--shadow-lg);
470
+ }
471
+
472
+ .pricing-tier {
473
+ font-size: 0.85rem;
474
+ font-weight: 700;
475
+ text-transform: uppercase;
476
+ letter-spacing: 0.06em;
477
+ color: var(--text-muted);
478
+ margin-bottom: 8px;
479
+ }
480
+
481
+ .pricing-price {
482
+ font-size: 3rem;
483
+ font-weight: 800;
484
+ letter-spacing: -0.04em;
485
+ margin-bottom: 4px;
486
+ }
487
+
488
+ .pricing-price span {
489
+ font-size: 1rem;
490
+ font-weight: 400;
491
+ color: var(--text-muted);
492
+ }
493
+
494
+ .pricing-desc {
495
+ color: var(--text-secondary);
496
+ font-size: 0.9rem;
497
+ margin-bottom: 28px;
498
+ min-height: 44px;
499
+ }
500
+
501
+ .pricing-features {
502
+ list-style: none;
503
+ flex: 1;
504
+ margin-bottom: 32px;
505
+ }
506
+
507
+ .pricing-features li {
508
+ padding: 8px 0;
509
+ font-size: 0.9rem;
510
+ color: var(--text-secondary);
511
+ display: flex;
512
+ align-items: center;
513
+ gap: 10px;
514
+ }
515
+
516
+ .pricing-features li::before {
517
+ content: '✓';
518
+ color: var(--accent-green);
519
+ font-weight: 700;
520
+ font-size: 0.85rem;
521
+ }
522
+
523
+ .pricing-features li.disabled {
524
+ color: var(--text-muted);
525
+ text-decoration: line-through;
526
+ }
527
+
528
+ .pricing-features li.disabled::before {
529
+ content: '✗';
530
+ color: var(--text-muted);
531
+ }
532
+
533
+ /* ─── Code Block ─────────────────────────────────────────────────────── */
534
+ .code-block {
535
+ background: var(--bg-surface);
536
+ border: 1px solid var(--border-color);
537
+ border-radius: var(--radius-lg);
538
+ overflow: hidden;
539
+ }
540
+
541
+ .code-header {
542
+ display: flex;
543
+ align-items: center;
544
+ justify-content: space-between;
545
+ padding: 12px 20px;
546
+ background: var(--bg-card);
547
+ border-bottom: 1px solid var(--border-color);
548
+ }
549
+
550
+ .code-dots {
551
+ display: flex;
552
+ gap: 6px;
553
+ }
554
+
555
+ .code-dots span {
556
+ width: 10px;
557
+ height: 10px;
558
+ border-radius: 50%;
559
+ }
560
+
561
+ .code-dots span:nth-child(1) { background: #ef4444; }
562
+ .code-dots span:nth-child(2) { background: #f59e0b; }
563
+ .code-dots span:nth-child(3) { background: #10b981; }
564
+
565
+ .code-lang {
566
+ font-size: 0.75rem;
567
+ color: var(--text-muted);
568
+ font-family: var(--font-mono);
569
+ }
570
+
571
+ .code-body {
572
+ padding: 20px 24px;
573
+ overflow-x: auto;
574
+ }
575
+
576
+ .code-body pre {
577
+ font-family: var(--font-mono);
578
+ font-size: 0.85rem;
579
+ line-height: 1.8;
580
+ color: var(--text-secondary);
581
+ }
582
+
583
+ .code-body .kw { color: var(--accent-purple); }
584
+ .code-body .fn { color: var(--accent-blue); }
585
+ .code-body .str { color: var(--accent-green); }
586
+ .code-body .cm { color: var(--text-muted); font-style: italic; }
587
+ .code-body .num { color: var(--accent-orange); }
588
+ .code-body .bool { color: var(--accent-orange); }
589
+ .code-body .prop { color: var(--accent-cyan); }
590
+
591
+ /* ─── Footer ─────────────────────────────────────────────────────────── */
592
+ .footer {
593
+ padding: 64px 0 32px;
594
+ border-top: 1px solid var(--border-color);
595
+ background: var(--bg-surface);
596
+ }
597
+
598
+ .footer-grid {
599
+ display: grid;
600
+ grid-template-columns: 2fr 1fr 1fr 1fr;
601
+ gap: 48px;
602
+ margin-bottom: 48px;
603
+ }
604
+
605
+ @media (max-width: 768px) {
606
+ .footer-grid { grid-template-columns: 1fr 1fr; gap: 32px; }
607
+ }
608
+
609
+ .footer-brand p {
610
+ color: var(--text-secondary);
611
+ font-size: 0.9rem;
612
+ margin-top: 12px;
613
+ max-width: 300px;
614
+ line-height: 1.6;
615
+ }
616
+
617
+ .footer-col h4 {
618
+ color: var(--text-primary);
619
+ font-size: 0.85rem;
620
+ text-transform: uppercase;
621
+ letter-spacing: 0.06em;
622
+ margin-bottom: 16px;
623
+ }
624
+
625
+ .footer-col ul { list-style: none; }
626
+ .footer-col li { margin-bottom: 10px; }
627
+ .footer-col a { color: var(--text-muted); font-size: 0.9rem; }
628
+ .footer-col a:hover { color: var(--text-primary); }
629
+
630
+ .footer-bottom {
631
+ display: flex;
632
+ justify-content: space-between;
633
+ align-items: center;
634
+ padding-top: 28px;
635
+ border-top: 1px solid var(--border-color);
636
+ color: var(--text-muted);
637
+ font-size: 0.85rem;
638
+ }
639
+
640
+ /* ─── Forms ──────────────────────────────────────────────────────────── */
641
+ .form-group {
642
+ margin-bottom: 20px;
643
+ }
644
+
645
+ .form-group label {
646
+ display: block;
647
+ font-size: 0.875rem;
648
+ font-weight: 600;
649
+ color: var(--text-secondary);
650
+ margin-bottom: 6px;
651
+ }
652
+
653
+ .form-input {
654
+ width: 100%;
655
+ padding: 12px 16px;
656
+ background: var(--bg-input);
657
+ border: 1px solid var(--border-color);
658
+ border-radius: var(--radius-md);
659
+ color: var(--text-primary);
660
+ font-family: var(--font-sans);
661
+ font-size: 0.925rem;
662
+ transition: border-color var(--transition-fast);
663
+ outline: none;
664
+ }
665
+
666
+ .form-input:focus {
667
+ border-color: var(--accent-blue);
668
+ box-shadow: 0 0 0 3px rgba(59,130,246,0.15);
669
+ }
670
+
671
+ .form-input::placeholder { color: var(--text-muted); }
672
+
673
+ select.form-input {
674
+ appearance: none;
675
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' fill='%2394a3b8' viewBox='0 0 16 16'%3E%3Cpath d='M4.5 6l3.5 4 3.5-4H4.5z'/%3E%3C/svg%3E");
676
+ background-repeat: no-repeat;
677
+ background-position: right 12px center;
678
+ padding-right: 36px;
679
+ }
680
+
681
+ textarea.form-input {
682
+ resize: vertical;
683
+ min-height: 100px;
684
+ }
685
+
686
+ /* ─── Auth Pages ─────────────────────────────────────────────────────── */
687
+ .auth-page {
688
+ min-height: 100vh;
689
+ display: flex;
690
+ align-items: center;
691
+ justify-content: center;
692
+ background: var(--gradient-hero);
693
+ padding: 24px;
694
+ }
695
+
696
+ .auth-card {
697
+ width: 100%;
698
+ max-width: 440px;
699
+ background: var(--bg-card);
700
+ border: 1px solid var(--border-color);
701
+ border-radius: var(--radius-xl);
702
+ padding: 48px 40px;
703
+ box-shadow: var(--shadow-lg);
704
+ }
705
+
706
+ .auth-card h1 {
707
+ font-size: 1.75rem;
708
+ margin-bottom: 8px;
709
+ }
710
+
711
+ .auth-card .subtitle {
712
+ color: var(--text-secondary);
713
+ margin-bottom: 32px;
714
+ }
715
+
716
+ .auth-card .btn { width: 100%; margin-top: 8px; }
717
+
718
+ .auth-footer {
719
+ text-align: center;
720
+ margin-top: 24px;
721
+ color: var(--text-muted);
722
+ font-size: 0.9rem;
723
+ }
724
+
725
+ .alert {
726
+ padding: 12px 16px;
727
+ border-radius: var(--radius-md);
728
+ font-size: 0.9rem;
729
+ margin-bottom: 20px;
730
+ display: none;
731
+ }
732
+
733
+ .alert-error {
734
+ background: rgba(239,68,68,0.1);
735
+ border: 1px solid rgba(239,68,68,0.3);
736
+ color: var(--accent-red);
737
+ }
738
+
739
+ .alert-success {
740
+ background: rgba(16,185,129,0.1);
741
+ border: 1px solid rgba(16,185,129,0.3);
742
+ color: var(--accent-green);
743
+ }
744
+
745
+ /* ─── Dashboard ──────────────────────────────────────────────────────── */
746
+ .dashboard {
747
+ display: flex;
748
+ min-height: 100vh;
749
+ }
750
+
751
+ .sidebar {
752
+ width: 260px;
753
+ background: var(--bg-secondary);
754
+ border-right: 1px solid var(--border-color);
755
+ padding: 24px 0;
756
+ display: flex;
757
+ flex-direction: column;
758
+ position: fixed;
759
+ top: 0;
760
+ left: 0;
761
+ bottom: 0;
762
+ z-index: 50;
763
+ }
764
+
765
+ .sidebar-brand {
766
+ padding: 0 24px 24px;
767
+ border-bottom: 1px solid var(--border-color);
768
+ margin-bottom: 16px;
769
+ }
770
+
771
+ .sidebar-nav {
772
+ flex: 1;
773
+ padding: 0 12px;
774
+ }
775
+
776
+ .sidebar-nav a {
777
+ display: flex;
778
+ align-items: center;
779
+ gap: 12px;
780
+ padding: 10px 16px;
781
+ border-radius: var(--radius-md);
782
+ color: var(--text-secondary);
783
+ font-size: 0.9rem;
784
+ font-weight: 500;
785
+ transition: all var(--transition-fast);
786
+ margin-bottom: 2px;
787
+ }
788
+
789
+ .sidebar-nav a:hover,
790
+ .sidebar-nav a.active {
791
+ background: rgba(59,130,246,0.1);
792
+ color: var(--text-primary);
793
+ }
794
+
795
+ .sidebar-nav a.active { color: var(--accent-blue); }
796
+
797
+ .sidebar-footer {
798
+ padding: 16px 24px;
799
+ border-top: 1px solid var(--border-color);
800
+ }
801
+
802
+ .main-content {
803
+ flex: 1;
804
+ margin-left: 260px;
805
+ padding: 32px 40px;
806
+ }
807
+
808
+ .page-header {
809
+ display: flex;
810
+ align-items: center;
811
+ justify-content: space-between;
812
+ margin-bottom: 32px;
813
+ }
814
+
815
+ .page-header h1 {
816
+ font-size: 1.75rem;
817
+ }
818
+
819
+ .stats-grid {
820
+ display: grid;
821
+ grid-template-columns: repeat(4, 1fr);
822
+ gap: 20px;
823
+ margin-bottom: 32px;
824
+ }
825
+
826
+ @media (max-width: 1200px) {
827
+ .stats-grid { grid-template-columns: repeat(2, 1fr); }
828
+ }
829
+
830
+ .stat-card {
831
+ background: var(--bg-card);
832
+ border: 1px solid var(--border-color);
833
+ border-radius: var(--radius-lg);
834
+ padding: 24px;
835
+ }
836
+
837
+ .stat-card .label {
838
+ font-size: 0.8rem;
839
+ color: var(--text-muted);
840
+ text-transform: uppercase;
841
+ letter-spacing: 0.04em;
842
+ margin-bottom: 8px;
843
+ }
844
+
845
+ .stat-card .value {
846
+ font-size: 2rem;
847
+ font-weight: 800;
848
+ letter-spacing: -0.03em;
849
+ }
850
+
851
+ .stat-card .change {
852
+ font-size: 0.8rem;
853
+ margin-top: 4px;
854
+ }
855
+
856
+ .stat-card .change.up { color: var(--accent-green); }
857
+ .stat-card .change.down { color: var(--accent-red); }
858
+
859
+ /* ─── Table ──────────────────────────────────────────────────────────── */
860
+ .table-wrapper {
861
+ background: var(--bg-card);
862
+ border: 1px solid var(--border-color);
863
+ border-radius: var(--radius-lg);
864
+ overflow: hidden;
865
+ }
866
+
867
+ .table-header {
868
+ display: flex;
869
+ justify-content: space-between;
870
+ align-items: center;
871
+ padding: 20px 24px;
872
+ border-bottom: 1px solid var(--border-color);
873
+ }
874
+
875
+ table {
876
+ width: 100%;
877
+ border-collapse: collapse;
878
+ }
879
+
880
+ th, td {
881
+ padding: 14px 24px;
882
+ text-align: left;
883
+ font-size: 0.9rem;
884
+ }
885
+
886
+ th {
887
+ background: var(--bg-surface);
888
+ color: var(--text-muted);
889
+ font-weight: 600;
890
+ font-size: 0.8rem;
891
+ text-transform: uppercase;
892
+ letter-spacing: 0.04em;
893
+ }
894
+
895
+ td { border-bottom: 1px solid var(--border-color); color: var(--text-secondary); }
896
+ tr:last-child td { border-bottom: none; }
897
+ tr:hover td { background: rgba(59,130,246,0.03); }
898
+
899
+ /* ─── Badge ──────────────────────────────────────────────────────────── */
900
+ .badge {
901
+ display: inline-flex;
902
+ align-items: center;
903
+ padding: 3px 10px;
904
+ border-radius: var(--radius-full);
905
+ font-size: 0.75rem;
906
+ font-weight: 600;
907
+ }
908
+
909
+ .badge-free { background: rgba(100,116,139,0.15); color: var(--text-muted); }
910
+ .badge-starter { background: rgba(59,130,246,0.15); color: var(--accent-blue); }
911
+ .badge-pro { background: rgba(139,92,246,0.15); color: var(--accent-purple); }
912
+ .badge-enterprise { background: rgba(245,158,11,0.15); color: var(--accent-orange); }
913
+ .badge-active { background: rgba(16,185,129,0.15); color: var(--accent-green); }
914
+ .badge-inactive { background: rgba(239,68,68,0.15); color: var(--accent-red); }
915
+
916
+ /* ─── Modal ──────────────────────────────────────────────────────────── */
917
+ .modal-overlay {
918
+ position: fixed;
919
+ inset: 0;
920
+ background: rgba(0,0,0,0.6);
921
+ backdrop-filter: blur(4px);
922
+ display: flex;
923
+ align-items: center;
924
+ justify-content: center;
925
+ z-index: 200;
926
+ padding: 24px;
927
+ opacity: 0;
928
+ visibility: hidden;
929
+ transition: all var(--transition-normal);
930
+ }
931
+
932
+ .modal-overlay.active {
933
+ opacity: 1;
934
+ visibility: visible;
935
+ }
936
+
937
+ .modal {
938
+ background: var(--bg-card);
939
+ border: 1px solid var(--border-color);
940
+ border-radius: var(--radius-xl);
941
+ width: 100%;
942
+ max-width: 560px;
943
+ max-height: 90vh;
944
+ overflow-y: auto;
945
+ transform: translateY(20px);
946
+ transition: transform var(--transition-normal);
947
+ }
948
+
949
+ .modal-overlay.active .modal {
950
+ transform: translateY(0);
951
+ }
952
+
953
+ .modal-header {
954
+ display: flex;
955
+ align-items: center;
956
+ justify-content: space-between;
957
+ padding: 24px 28px;
958
+ border-bottom: 1px solid var(--border-color);
959
+ }
960
+
961
+ .modal-header h2 { font-size: 1.2rem; }
962
+
963
+ .modal-close {
964
+ background: none;
965
+ border: none;
966
+ color: var(--text-muted);
967
+ font-size: 1.4rem;
968
+ cursor: pointer;
969
+ padding: 4px;
970
+ line-height: 1;
971
+ }
972
+
973
+ .modal-close:hover { color: var(--text-primary); }
974
+
975
+ .modal-body { padding: 28px; }
976
+ .modal-footer {
977
+ padding: 20px 28px;
978
+ border-top: 1px solid var(--border-color);
979
+ display: flex;
980
+ justify-content: flex-end;
981
+ gap: 12px;
982
+ }
983
+
984
+ /* ─── Tabs ───────────────────────────────────────────────────────────── */
985
+ .tabs {
986
+ display: flex;
987
+ border-bottom: 1px solid var(--border-color);
988
+ margin-bottom: 28px;
989
+ }
990
+
991
+ .tab {
992
+ padding: 12px 20px;
993
+ font-size: 0.9rem;
994
+ font-weight: 500;
995
+ color: var(--text-muted);
996
+ background: none;
997
+ border: none;
998
+ border-bottom: 2px solid transparent;
999
+ cursor: pointer;
1000
+ transition: all var(--transition-fast);
1001
+ font-family: var(--font-sans);
1002
+ }
1003
+
1004
+ .tab:hover { color: var(--text-secondary); }
1005
+ .tab.active {
1006
+ color: var(--accent-blue);
1007
+ border-bottom-color: var(--accent-blue);
1008
+ }
1009
+
1010
+ .tab-content { display: none; }
1011
+ .tab-content.active { display: block; }
1012
+
1013
+ /* ─── Toggle ─────────────────────────────────────────────────────────── */
1014
+ .toggle-wrap {
1015
+ display: flex;
1016
+ align-items: center;
1017
+ justify-content: space-between;
1018
+ padding: 12px 0;
1019
+ border-bottom: 1px solid var(--border-color);
1020
+ }
1021
+
1022
+ .toggle-label {
1023
+ font-size: 0.9rem;
1024
+ color: var(--text-secondary);
1025
+ }
1026
+
1027
+ .toggle-label small { display: block; color: var(--text-muted); font-size: 0.8rem; margin-top: 2px; }
1028
+
1029
+ .toggle {
1030
+ position: relative;
1031
+ width: 44px;
1032
+ height: 24px;
1033
+ flex-shrink: 0;
1034
+ }
1035
+
1036
+ .toggle input {
1037
+ opacity: 0;
1038
+ width: 0;
1039
+ height: 0;
1040
+ position: absolute;
1041
+ }
1042
+
1043
+ .toggle-slider {
1044
+ position: absolute;
1045
+ inset: 0;
1046
+ background: var(--border-color);
1047
+ border-radius: var(--radius-full);
1048
+ cursor: pointer;
1049
+ transition: background var(--transition-fast);
1050
+ }
1051
+
1052
+ .toggle-slider::before {
1053
+ content: '';
1054
+ position: absolute;
1055
+ top: 3px;
1056
+ left: 3px;
1057
+ width: 18px;
1058
+ height: 18px;
1059
+ background: white;
1060
+ border-radius: 50%;
1061
+ transition: transform var(--transition-fast);
1062
+ }
1063
+
1064
+ .toggle input:checked + .toggle-slider {
1065
+ background: var(--accent-blue);
1066
+ }
1067
+
1068
+ .toggle input:checked + .toggle-slider::before {
1069
+ transform: translateX(20px);
1070
+ }
1071
+
1072
+ /* ─── Snippet Box ────────────────────────────────────────────────────── */
1073
+ .snippet-box {
1074
+ background: var(--bg-surface);
1075
+ border: 1px solid var(--border-color);
1076
+ border-radius: var(--radius-md);
1077
+ padding: 16px;
1078
+ position: relative;
1079
+ }
1080
+
1081
+ .snippet-box pre {
1082
+ font-family: var(--font-mono);
1083
+ font-size: 0.82rem;
1084
+ line-height: 1.7;
1085
+ color: var(--text-secondary);
1086
+ white-space: pre-wrap;
1087
+ word-break: break-all;
1088
+ }
1089
+
1090
+ .copy-btn {
1091
+ position: absolute;
1092
+ top: 10px;
1093
+ right: 10px;
1094
+ background: var(--bg-card);
1095
+ border: 1px solid var(--border-color);
1096
+ border-radius: var(--radius-sm);
1097
+ color: var(--text-muted);
1098
+ padding: 6px 12px;
1099
+ font-size: 0.75rem;
1100
+ cursor: pointer;
1101
+ font-family: var(--font-sans);
1102
+ transition: all var(--transition-fast);
1103
+ }
1104
+
1105
+ .copy-btn:hover {
1106
+ color: var(--text-primary);
1107
+ border-color: var(--border-hover);
1108
+ }
1109
+
1110
+ /* ─── Docs ───────────────────────────────────────────────────────────── */
1111
+ .docs-layout {
1112
+ display: flex;
1113
+ gap: 40px;
1114
+ padding-top: 100px;
1115
+ }
1116
+
1117
+ .docs-sidebar {
1118
+ width: 240px;
1119
+ flex-shrink: 0;
1120
+ position: sticky;
1121
+ top: 100px;
1122
+ max-height: calc(100vh - 120px);
1123
+ overflow-y: auto;
1124
+ }
1125
+
1126
+ .docs-sidebar ul { list-style: none; }
1127
+ .docs-sidebar li { margin-bottom: 4px; }
1128
+ .docs-sidebar a {
1129
+ display: block;
1130
+ padding: 8px 14px;
1131
+ font-size: 0.875rem;
1132
+ color: var(--text-muted);
1133
+ border-radius: var(--radius-sm);
1134
+ border-left: 2px solid transparent;
1135
+ transition: all var(--transition-fast);
1136
+ }
1137
+ .docs-sidebar a:hover { color: var(--text-secondary); background: rgba(59,130,246,0.05); }
1138
+ .docs-sidebar a.active { color: var(--accent-blue); border-left-color: var(--accent-blue); background: rgba(59,130,246,0.08); }
1139
+
1140
+ .docs-content {
1141
+ flex: 1;
1142
+ min-width: 0;
1143
+ padding-bottom: 80px;
1144
+ }
1145
+
1146
+ .docs-content h2 {
1147
+ font-size: 1.6rem;
1148
+ margin-top: 48px;
1149
+ margin-bottom: 16px;
1150
+ padding-bottom: 12px;
1151
+ border-bottom: 1px solid var(--border-color);
1152
+ }
1153
+
1154
+ .docs-content h2:first-child { margin-top: 0; }
1155
+
1156
+ .docs-content h3 {
1157
+ font-size: 1.2rem;
1158
+ margin-top: 32px;
1159
+ margin-bottom: 12px;
1160
+ }
1161
+
1162
+ .docs-content p {
1163
+ color: var(--text-secondary);
1164
+ margin-bottom: 16px;
1165
+ line-height: 1.7;
1166
+ }
1167
+
1168
+ .docs-content ul, .docs-content ol {
1169
+ color: var(--text-secondary);
1170
+ margin-bottom: 16px;
1171
+ padding-left: 24px;
1172
+ }
1173
+
1174
+ .docs-content li { margin-bottom: 6px; line-height: 1.6; }
1175
+
1176
+ .docs-content code {
1177
+ font-family: var(--font-mono);
1178
+ font-size: 0.85em;
1179
+ background: var(--bg-surface);
1180
+ padding: 2px 7px;
1181
+ border-radius: var(--radius-sm);
1182
+ border: 1px solid var(--border-color);
1183
+ color: var(--accent-cyan);
1184
+ }
1185
+
1186
+ .docs-content pre code {
1187
+ display: block;
1188
+ padding: 20px 24px;
1189
+ border-radius: var(--radius-md);
1190
+ overflow-x: auto;
1191
+ line-height: 1.7;
1192
+ border: none;
1193
+ }
1194
+
1195
+ @media (max-width: 768px) {
1196
+ .docs-sidebar { display: none; }
1197
+ }
1198
+
1199
+ /* ─── Utilities ──────────────────────────────────────────────────────── */
1200
+ .text-center { text-align: center; }
1201
+ .text-left { text-align: left; }
1202
+ .text-muted { color: var(--text-muted); }
1203
+ .mt-4 { margin-top: 16px; }
1204
+ .mt-8 { margin-top: 32px; }
1205
+ .mb-4 { margin-bottom: 16px; }
1206
+ .mb-8 { margin-bottom: 32px; }
1207
+ .flex { display: flex; }
1208
+ .items-center { align-items: center; }
1209
+ .justify-between { justify-content: space-between; }
1210
+ .gap-2 { gap: 8px; }
1211
+ .gap-4 { gap: 16px; }
1212
+ .hidden { display: none !important; }
1213
+ .mono { font-family: var(--font-mono); }
1214
+ .truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
1215
+
1216
+ /* ─── Animations ─────────────────────────────────────────────────────── */
1217
+ @keyframes fadeIn {
1218
+ from { opacity: 0; transform: translateY(12px); }
1219
+ to { opacity: 1; transform: translateY(0); }
1220
+ }
1221
+
1222
+ .fade-in {
1223
+ animation: fadeIn 0.5s ease-out forwards;
1224
+ }
1225
+
1226
+ .fade-in-delay-1 { animation-delay: 0.1s; opacity: 0; }
1227
+ .fade-in-delay-2 { animation-delay: 0.2s; opacity: 0; }
1228
+ .fade-in-delay-3 { animation-delay: 0.3s; opacity: 0; }
1229
+ .fade-in-delay-4 { animation-delay: 0.4s; opacity: 0; }
1230
+
1231
+ /* ─── Scrollbar ──────────────────────────────────────────────────────── */
1232
+ ::-webkit-scrollbar { width: 8px; height: 8px; }
1233
+ ::-webkit-scrollbar-track { background: var(--bg-primary); }
1234
+ ::-webkit-scrollbar-thumb { background: var(--border-color); border-radius: 4px; }
1235
+ ::-webkit-scrollbar-thumb:hover { background: var(--border-hover); }