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