mcpmake 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (344) hide show
  1. package/README.md +691 -0
  2. package/bin/mcpmake.mjs +2 -0
  3. package/dist/analyzer/auth-detector.d.ts +12 -0
  4. package/dist/analyzer/auth-detector.js +142 -0
  5. package/dist/analyzer/dom-parser.d.ts +10 -0
  6. package/dist/analyzer/dom-parser.js +259 -0
  7. package/dist/analyzer/goal-crawler.d.ts +25 -0
  8. package/dist/analyzer/goal-crawler.js +177 -0
  9. package/dist/analyzer/hybrid-detector.d.ts +28 -0
  10. package/dist/analyzer/hybrid-detector.js +96 -0
  11. package/dist/analyzer/index.d.ts +12 -0
  12. package/dist/analyzer/index.js +8 -0
  13. package/dist/analyzer/screenshot-capture.d.ts +29 -0
  14. package/dist/analyzer/screenshot-capture.js +42 -0
  15. package/dist/analyzer/selector-builder.d.ts +19 -0
  16. package/dist/analyzer/selector-builder.js +199 -0
  17. package/dist/analyzer/semantic-analyzer.d.ts +13 -0
  18. package/dist/analyzer/semantic-analyzer.js +145 -0
  19. package/dist/analyzer/site-crawler.d.ts +38 -0
  20. package/dist/analyzer/site-crawler.js +235 -0
  21. package/dist/cloud/billing/billing-engine.d.ts +44 -0
  22. package/dist/cloud/billing/billing-engine.js +81 -0
  23. package/dist/cloud/billing/credit-store.d.ts +64 -0
  24. package/dist/cloud/billing/credit-store.js +168 -0
  25. package/dist/cloud/billing/index.d.ts +4 -0
  26. package/dist/cloud/billing/index.js +2 -0
  27. package/dist/cloud/billing/usage-store.d.ts +42 -0
  28. package/dist/cloud/billing/usage-store.js +85 -0
  29. package/dist/cloud/billing/usage-tracker.d.ts +38 -0
  30. package/dist/cloud/billing/usage-tracker.js +95 -0
  31. package/dist/cloud/build-pipeline.d.ts +39 -0
  32. package/dist/cloud/build-pipeline.js +310 -0
  33. package/dist/cloud/build-queue.d.ts +30 -0
  34. package/dist/cloud/build-queue.js +70 -0
  35. package/dist/cloud/caddy-manager.d.ts +18 -0
  36. package/dist/cloud/caddy-manager.js +97 -0
  37. package/dist/cloud/container-backend.d.ts +62 -0
  38. package/dist/cloud/container-backend.js +59 -0
  39. package/dist/cloud/container-manager.d.ts +64 -0
  40. package/dist/cloud/container-manager.js +301 -0
  41. package/dist/cloud/crypto.d.ts +27 -0
  42. package/dist/cloud/crypto.js +63 -0
  43. package/dist/cloud/db/index.d.ts +27 -0
  44. package/dist/cloud/db/index.js +53 -0
  45. package/dist/cloud/db/migrations.d.ts +12 -0
  46. package/dist/cloud/db/migrations.js +329 -0
  47. package/dist/cloud/db/pg-store.d.ts +45 -0
  48. package/dist/cloud/db/pg-store.js +336 -0
  49. package/dist/cloud/failure-tracker.d.ts +51 -0
  50. package/dist/cloud/failure-tracker.js +102 -0
  51. package/dist/cloud/idle-monitor.d.ts +30 -0
  52. package/dist/cloud/idle-monitor.js +70 -0
  53. package/dist/cloud/mailer.d.ts +21 -0
  54. package/dist/cloud/mailer.js +193 -0
  55. package/dist/cloud/mcp-proxy.d.ts +58 -0
  56. package/dist/cloud/mcp-proxy.js +203 -0
  57. package/dist/cloud/metric-samples.d.ts +43 -0
  58. package/dist/cloud/metric-samples.js +85 -0
  59. package/dist/cloud/metrics.d.ts +26 -0
  60. package/dist/cloud/metrics.js +59 -0
  61. package/dist/cloud/multipart.d.ts +26 -0
  62. package/dist/cloud/multipart.js +132 -0
  63. package/dist/cloud/observability.d.ts +27 -0
  64. package/dist/cloud/observability.js +98 -0
  65. package/dist/cloud/rate-limiter.d.ts +31 -0
  66. package/dist/cloud/rate-limiter.js +58 -0
  67. package/dist/cloud/request-security.d.ts +5 -0
  68. package/dist/cloud/request-security.js +74 -0
  69. package/dist/cloud/resource-monitor.d.ts +69 -0
  70. package/dist/cloud/resource-monitor.js +130 -0
  71. package/dist/cloud/secret-store.d.ts +38 -0
  72. package/dist/cloud/secret-store.js +103 -0
  73. package/dist/cloud/security.d.ts +26 -0
  74. package/dist/cloud/security.js +142 -0
  75. package/dist/cloud/server.d.ts +21 -0
  76. package/dist/cloud/server.js +1079 -0
  77. package/dist/cloud/shared-state.d.ts +72 -0
  78. package/dist/cloud/shared-state.js +159 -0
  79. package/dist/cloud/ssrf.d.ts +43 -0
  80. package/dist/cloud/ssrf.js +150 -0
  81. package/dist/cloud/store.d.ts +41 -0
  82. package/dist/cloud/store.js +75 -0
  83. package/dist/cloud/stripe.d.ts +78 -0
  84. package/dist/cloud/stripe.js +317 -0
  85. package/dist/cloud/telemetry-store.d.ts +53 -0
  86. package/dist/cloud/telemetry-store.js +108 -0
  87. package/dist/cloud/web/auth.d.ts +225 -0
  88. package/dist/cloud/web/auth.js +555 -0
  89. package/dist/cloud/web/charts.d.ts +70 -0
  90. package/dist/cloud/web/charts.js +178 -0
  91. package/dist/cloud/web/csrf.d.ts +14 -0
  92. package/dist/cloud/web/csrf.js +22 -0
  93. package/dist/cloud/web/docs.d.ts +40 -0
  94. package/dist/cloud/web/docs.js +174 -0
  95. package/dist/cloud/web/router.d.ts +25 -0
  96. package/dist/cloud/web/router.js +1921 -0
  97. package/dist/cloud/web/static/alpine.min.js +5 -0
  98. package/dist/cloud/web/static/favicon.svg +4 -0
  99. package/dist/cloud/web/static/htmx-sse.js +290 -0
  100. package/dist/cloud/web/static/htmx.min.js +1 -0
  101. package/dist/cloud/web/static/style.css +2683 -0
  102. package/dist/cloud/web/static-server.d.ts +13 -0
  103. package/dist/cloud/web/static-server.js +73 -0
  104. package/dist/cloud/web/template-engine.d.ts +27 -0
  105. package/dist/cloud/web/template-engine.js +146 -0
  106. package/dist/cloud/web/templates/layouts/admin.hbs +57 -0
  107. package/dist/cloud/web/templates/layouts/auth.hbs +138 -0
  108. package/dist/cloud/web/templates/layouts/base.hbs +16 -0
  109. package/dist/cloud/web/templates/layouts/dashboard.hbs +39 -0
  110. package/dist/cloud/web/templates/layouts/landing.hbs +82 -0
  111. package/dist/cloud/web/templates/pages/admin/overview.hbs +123 -0
  112. package/dist/cloud/web/templates/pages/admin/servers.hbs +129 -0
  113. package/dist/cloud/web/templates/pages/admin/telemetry.hbs +39 -0
  114. package/dist/cloud/web/templates/pages/admin/user-edit.hbs +91 -0
  115. package/dist/cloud/web/templates/pages/admin/users.hbs +179 -0
  116. package/dist/cloud/web/templates/pages/auth/forgot-password.hbs +25 -0
  117. package/dist/cloud/web/templates/pages/auth/login.hbs +33 -0
  118. package/dist/cloud/web/templates/pages/auth/register.hbs +32 -0
  119. package/dist/cloud/web/templates/pages/auth/reset-password.hbs +34 -0
  120. package/dist/cloud/web/templates/pages/dashboard/billing.hbs +140 -0
  121. package/dist/cloud/web/templates/pages/dashboard/create.hbs +173 -0
  122. package/dist/cloud/web/templates/pages/dashboard/index.hbs +8 -0
  123. package/dist/cloud/web/templates/pages/dashboard/server-detail.hbs +280 -0
  124. package/dist/cloud/web/templates/pages/dashboard/server-logs.hbs +35 -0
  125. package/dist/cloud/web/templates/pages/dashboard/server-metrics.hbs +63 -0
  126. package/dist/cloud/web/templates/pages/dashboard/servers-partial.hbs +21 -0
  127. package/dist/cloud/web/templates/pages/dashboard/servers.hbs +44 -0
  128. package/dist/cloud/web/templates/pages/docs/show.hbs +16 -0
  129. package/dist/cloud/web/templates/pages/errors/404.hbs +9 -0
  130. package/dist/cloud/web/templates/pages/errors/500.hbs +8 -0
  131. package/dist/cloud/web/templates/pages/landing/index.hbs +223 -0
  132. package/dist/cloud/web/templates/pages/legal/privacy.hbs +71 -0
  133. package/dist/cloud/web/templates/pages/legal/terms.hbs +73 -0
  134. package/dist/cloud/web/templates/partials/admin-stats.hbs +52 -0
  135. package/dist/cloud/web/templates/partials/flash-message.hbs +6 -0
  136. package/dist/cloud/web/templates/partials/pricing-table.hbs +103 -0
  137. package/dist/cloud/web/templates/partials/server-card.hbs +19 -0
  138. package/dist/cloud/web/templates/partials/status-badge.hbs +1 -0
  139. package/dist/commands/bundle.d.ts +18 -0
  140. package/dist/commands/bundle.js +82 -0
  141. package/dist/commands/ci.d.ts +25 -0
  142. package/dist/commands/ci.js +149 -0
  143. package/dist/commands/deploy.d.ts +24 -0
  144. package/dist/commands/deploy.js +145 -0
  145. package/dist/commands/diff.d.ts +18 -0
  146. package/dist/commands/diff.js +185 -0
  147. package/dist/commands/from/describe.d.ts +65 -0
  148. package/dist/commands/from/describe.js +173 -0
  149. package/dist/commands/from/har.d.ts +81 -0
  150. package/dist/commands/from/har.js +255 -0
  151. package/dist/commands/from/openapi.d.ts +105 -0
  152. package/dist/commands/from/openapi.js +302 -0
  153. package/dist/commands/from/postman.d.ts +51 -0
  154. package/dist/commands/from/postman.js +146 -0
  155. package/dist/commands/from/target-support.d.ts +11 -0
  156. package/dist/commands/from/target-support.js +33 -0
  157. package/dist/commands/from/url.d.ts +75 -0
  158. package/dist/commands/from/url.js +244 -0
  159. package/dist/commands/from/website.d.ts +75 -0
  160. package/dist/commands/from/website.js +284 -0
  161. package/dist/commands/lint.d.ts +24 -0
  162. package/dist/commands/lint.js +184 -0
  163. package/dist/commands/merge.d.ts +18 -0
  164. package/dist/commands/merge.js +161 -0
  165. package/dist/commands/publish.d.ts +27 -0
  166. package/dist/commands/publish.js +334 -0
  167. package/dist/commands/rescan.d.ts +40 -0
  168. package/dist/commands/rescan.js +255 -0
  169. package/dist/commands/update.d.ts +14 -0
  170. package/dist/commands/update.js +87 -0
  171. package/dist/commands/verify.d.ts +14 -0
  172. package/dist/commands/verify.js +71 -0
  173. package/dist/config/configurable-command.d.ts +13 -0
  174. package/dist/config/configurable-command.js +70 -0
  175. package/dist/config/mcpmake-config.d.ts +68 -0
  176. package/dist/config/mcpmake-config.js +207 -0
  177. package/dist/docs/cli.md +400 -0
  178. package/dist/docs/mcp-2026-07-28-migration.md +78 -0
  179. package/dist/docs/migrate-from-stainless.md +94 -0
  180. package/dist/docs/quickstart.md +166 -0
  181. package/dist/docs/show-hn.md +26 -0
  182. package/dist/docs/website-servers.md +169 -0
  183. package/dist/emitter/code-writer.d.ts +8 -0
  184. package/dist/emitter/code-writer.js +25 -0
  185. package/dist/emitter/index.d.ts +32 -0
  186. package/dist/emitter/index.js +280 -0
  187. package/dist/emitter/mcpb-bundler.d.ts +31 -0
  188. package/dist/emitter/mcpb-bundler.js +172 -0
  189. package/dist/emitter/project-scaffolder.d.ts +4 -0
  190. package/dist/emitter/project-scaffolder.js +89 -0
  191. package/dist/emitter/python-template-loader.d.ts +4 -0
  192. package/dist/emitter/python-template-loader.js +30 -0
  193. package/dist/emitter/python-templates/dockerfile.hbs +14 -0
  194. package/dist/emitter/python-templates/env.example.hbs +6 -0
  195. package/dist/emitter/python-templates/requirements.txt.hbs +4 -0
  196. package/dist/emitter/python-templates/server.py.hbs +77 -0
  197. package/dist/emitter/site-scaffolder.d.ts +13 -0
  198. package/dist/emitter/site-scaffolder.js +70 -0
  199. package/dist/emitter/site-template-loader.d.ts +5 -0
  200. package/dist/emitter/site-template-loader.js +47 -0
  201. package/dist/emitter/site-templates/browser-manager.ts.hbs +233 -0
  202. package/dist/emitter/site-templates/config.ts.hbs +28 -0
  203. package/dist/emitter/site-templates/dockerfile.hbs +31 -0
  204. package/dist/emitter/site-templates/env.example.hbs +19 -0
  205. package/dist/emitter/site-templates/package.json.hbs +26 -0
  206. package/dist/emitter/site-templates/server-main-http.ts.hbs +108 -0
  207. package/dist/emitter/site-templates/server-main.ts.hbs +23 -0
  208. package/dist/emitter/site-templates/tool-handler-action.ts.hbs +86 -0
  209. package/dist/emitter/site-templates/tool-handler-form.ts.hbs +116 -0
  210. package/dist/emitter/site-templates/tool-handler-lifecycle.ts.hbs +146 -0
  211. package/dist/emitter/site-templates/tool-index.ts.hbs +11 -0
  212. package/dist/emitter/template-loader.d.ts +1 -0
  213. package/dist/emitter/template-loader.js +27 -0
  214. package/dist/emitter/templates/auth-provider.ts.hbs +57 -0
  215. package/dist/emitter/templates/config.ts.hbs +63 -0
  216. package/dist/emitter/templates/discovery.ts.hbs +301 -0
  217. package/dist/emitter/templates/dockerfile.hbs +34 -0
  218. package/dist/emitter/templates/env.example.hbs +28 -0
  219. package/dist/emitter/templates/gitignore.hbs +5 -0
  220. package/dist/emitter/templates/http-executor.ts.hbs +117 -0
  221. package/dist/emitter/templates/oauth.ts.hbs +188 -0
  222. package/dist/emitter/templates/package.json.hbs +25 -0
  223. package/dist/emitter/templates/prompts.ts.hbs +22 -0
  224. package/dist/emitter/templates/readme.md.hbs +123 -0
  225. package/dist/emitter/templates/resources.ts.hbs +63 -0
  226. package/dist/emitter/templates/server-main-http.ts.hbs +407 -0
  227. package/dist/emitter/templates/server-main.ts.hbs +40 -0
  228. package/dist/emitter/templates/task-handlers.ts.hbs +189 -0
  229. package/dist/emitter/templates/task-manager.ts.hbs +139 -0
  230. package/dist/emitter/templates/task-sse.ts.hbs +105 -0
  231. package/dist/emitter/templates/tool-handler.ts.hbs +124 -0
  232. package/dist/emitter/templates/tool-index.ts.hbs +11 -0
  233. package/dist/emitter/templates/tool-test.ts.hbs +57 -0
  234. package/dist/emitter/templates/trace.ts.hbs +79 -0
  235. package/dist/emitter/templates/tsconfig.json.hbs +16 -0
  236. package/dist/emitter/templates/types.ts.hbs +5 -0
  237. package/dist/emitter/worker-template-loader.d.ts +5 -0
  238. package/dist/emitter/worker-template-loader.js +33 -0
  239. package/dist/emitter/worker-templates/config.ts.hbs +54 -0
  240. package/dist/emitter/worker-templates/dev-vars.example.hbs +10 -0
  241. package/dist/emitter/worker-templates/gitignore.hbs +6 -0
  242. package/dist/emitter/worker-templates/package.json.hbs +24 -0
  243. package/dist/emitter/worker-templates/readme.md.hbs +53 -0
  244. package/dist/emitter/worker-templates/server.test.ts.hbs +20 -0
  245. package/dist/emitter/worker-templates/tool-handler.ts.hbs +85 -0
  246. package/dist/emitter/worker-templates/tool-index.ts.hbs +28 -0
  247. package/dist/emitter/worker-templates/tsconfig.json.hbs +17 -0
  248. package/dist/emitter/worker-templates/worker.ts.hbs +242 -0
  249. package/dist/emitter/worker-templates/wrangler.toml.hbs +19 -0
  250. package/dist/generator/spec-generator.d.ts +6 -0
  251. package/dist/generator/spec-generator.js +50 -0
  252. package/dist/index.d.ts +1 -0
  253. package/dist/index.js +64 -0
  254. package/dist/parser/har-filter.d.ts +8 -0
  255. package/dist/parser/har-filter.js +71 -0
  256. package/dist/parser/har-loader.d.ts +2 -0
  257. package/dist/parser/har-loader.js +14 -0
  258. package/dist/parser/har-normalizer.d.ts +20 -0
  259. package/dist/parser/har-normalizer.js +78 -0
  260. package/dist/parser/index.d.ts +10 -0
  261. package/dist/parser/index.js +6 -0
  262. package/dist/parser/openapi-loader.d.ts +6 -0
  263. package/dist/parser/openapi-loader.js +308 -0
  264. package/dist/parser/operation-extractor.d.ts +13 -0
  265. package/dist/parser/operation-extractor.js +155 -0
  266. package/dist/parser/overlay-loader.d.ts +10 -0
  267. package/dist/parser/overlay-loader.js +184 -0
  268. package/dist/parser/postman-loader.d.ts +9 -0
  269. package/dist/parser/postman-loader.js +106 -0
  270. package/dist/parser/schema-converter.d.ts +12 -0
  271. package/dist/parser/schema-converter.js +117 -0
  272. package/dist/plugins/adapter.d.ts +40 -0
  273. package/dist/plugins/adapter.js +15 -0
  274. package/dist/plugins/loader.d.ts +25 -0
  275. package/dist/plugins/loader.js +58 -0
  276. package/dist/pricing.d.ts +55 -0
  277. package/dist/pricing.js +133 -0
  278. package/dist/providers/index.d.ts +15 -0
  279. package/dist/providers/index.js +56 -0
  280. package/dist/recorder/browser-recorder.d.ts +22 -0
  281. package/dist/recorder/browser-recorder.js +205 -0
  282. package/dist/registry/official-registry.d.ts +90 -0
  283. package/dist/registry/official-registry.js +129 -0
  284. package/dist/rescan/diff-engine.d.ts +5 -0
  285. package/dist/rescan/diff-engine.js +312 -0
  286. package/dist/rescan/index.d.ts +3 -0
  287. package/dist/rescan/index.js +2 -0
  288. package/dist/rescan/rescan-runner.d.ts +42 -0
  289. package/dist/rescan/rescan-runner.js +69 -0
  290. package/dist/rescan/rescan-scheduler.d.ts +41 -0
  291. package/dist/rescan/rescan-scheduler.js +179 -0
  292. package/dist/site-transformer/browser-tools.d.ts +10 -0
  293. package/dist/site-transformer/browser-tools.js +59 -0
  294. package/dist/site-transformer/index.d.ts +2 -0
  295. package/dist/site-transformer/index.js +2 -0
  296. package/dist/site-transformer/selector-healer.d.ts +8 -0
  297. package/dist/site-transformer/selector-healer.js +106 -0
  298. package/dist/site-transformer/tool-generator.d.ts +13 -0
  299. package/dist/site-transformer/tool-generator.js +245 -0
  300. package/dist/transformer/auth-detector.d.ts +13 -0
  301. package/dist/transformer/auth-detector.js +90 -0
  302. package/dist/transformer/catalog-builder.d.ts +18 -0
  303. package/dist/transformer/catalog-builder.js +56 -0
  304. package/dist/transformer/client-compat.d.ts +6 -0
  305. package/dist/transformer/client-compat.js +44 -0
  306. package/dist/transformer/har-clusterer.d.ts +9 -0
  307. package/dist/transformer/har-clusterer.js +27 -0
  308. package/dist/transformer/har-dedup.d.ts +10 -0
  309. package/dist/transformer/har-dedup.js +81 -0
  310. package/dist/transformer/har-schema-inferrer.d.ts +15 -0
  311. package/dist/transformer/har-schema-inferrer.js +90 -0
  312. package/dist/transformer/har-to-operations.d.ts +13 -0
  313. package/dist/transformer/har-to-operations.js +192 -0
  314. package/dist/transformer/index.d.ts +8 -0
  315. package/dist/transformer/index.js +6 -0
  316. package/dist/transformer/llm-namer.d.ts +6 -0
  317. package/dist/transformer/llm-namer.js +59 -0
  318. package/dist/transformer/naming.d.ts +4 -0
  319. package/dist/transformer/naming.js +30 -0
  320. package/dist/transformer/operation-filter.d.ts +13 -0
  321. package/dist/transformer/operation-filter.js +52 -0
  322. package/dist/transformer/resource-builder.d.ts +12 -0
  323. package/dist/transformer/resource-builder.js +80 -0
  324. package/dist/transformer/schema-merger.d.ts +14 -0
  325. package/dist/transformer/schema-merger.js +65 -0
  326. package/dist/transformer/tool-builder.d.ts +3 -0
  327. package/dist/transformer/tool-builder.js +114 -0
  328. package/dist/types/index.d.ts +131 -0
  329. package/dist/types/index.js +1 -0
  330. package/dist/types/site.d.ts +284 -0
  331. package/dist/types/site.js +8 -0
  332. package/dist/utils/fail.d.ts +48 -0
  333. package/dist/utils/fail.js +204 -0
  334. package/dist/utils/fs.d.ts +5 -0
  335. package/dist/utils/fs.js +28 -0
  336. package/dist/utils/interactive.d.ts +6 -0
  337. package/dist/utils/interactive.js +30 -0
  338. package/dist/utils/logger.d.ts +1 -0
  339. package/dist/utils/logger.js +2 -0
  340. package/dist/utils/sanitize.d.ts +28 -0
  341. package/dist/utils/sanitize.js +44 -0
  342. package/dist/utils/watcher.d.ts +11 -0
  343. package/dist/utils/watcher.js +36 -0
  344. package/package.json +65 -0
@@ -0,0 +1,2683 @@
1
+ /* =========================================================================
2
+ mcpmake Cloud — Styles
3
+ ========================================================================= */
4
+
5
+ /* --- Reset --- */
6
+
7
+ *,
8
+ *::before,
9
+ *::after {
10
+ box-sizing: border-box;
11
+ margin: 0;
12
+ padding: 0;
13
+ }
14
+
15
+ html {
16
+ -webkit-text-size-adjust: 100%;
17
+ scroll-behavior: smooth;
18
+ }
19
+
20
+ body {
21
+ font-family:
22
+ -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell,
23
+ 'Helvetica Neue', sans-serif;
24
+ line-height: 1.6;
25
+ color: #e4e4e7;
26
+ background: #0a0a0f;
27
+ -webkit-font-smoothing: antialiased;
28
+ }
29
+
30
+ a {
31
+ color: inherit;
32
+ text-decoration: none;
33
+ }
34
+
35
+ img,
36
+ svg {
37
+ display: block;
38
+ max-width: 100%;
39
+ }
40
+
41
+ /* --- Custom Properties --- */
42
+
43
+ :root {
44
+ --color-bg-dark: #0a0a0f;
45
+ --color-bg-dark-end: #12121f;
46
+ --color-bg-light: #fafafa;
47
+ --color-text-dark: #e4e4e7;
48
+ --color-text-light: #1a1a2e;
49
+ --color-text-muted: #a1a1aa;
50
+ --color-primary: #7c3aed;
51
+ --color-primary-hover: #8b5cf6;
52
+ --color-primary-subtle: rgba(124, 58, 237, 0.12);
53
+ --color-border: #27272a;
54
+ --color-border-subtle: #1e1e24;
55
+ --color-surface: #18181b;
56
+ --color-surface-hover: #1f1f23;
57
+ --color-success: #10b981;
58
+ --color-warning: #f59e0b;
59
+ --color-error: #ef4444;
60
+ --nav-height: 64px;
61
+ --max-width: 1200px;
62
+ --section-padding: 96px;
63
+ --radius-sm: 6px;
64
+ --radius-md: 10px;
65
+ --radius-lg: 16px;
66
+ }
67
+
68
+ /* --- Nav --- */
69
+
70
+ .nav {
71
+ position: sticky;
72
+ top: 0;
73
+ z-index: 100;
74
+ height: var(--nav-height);
75
+ background: rgba(10, 10, 15, 0.85);
76
+ backdrop-filter: blur(12px);
77
+ border-bottom: 1px solid var(--color-border);
78
+ }
79
+
80
+ .nav-inner {
81
+ display: flex;
82
+ align-items: center;
83
+ justify-content: space-between;
84
+ max-width: var(--max-width);
85
+ margin: 0 auto;
86
+ padding: 0 24px;
87
+ height: 100%;
88
+ }
89
+
90
+ .nav-logo {
91
+ font-size: 1.125rem;
92
+ font-weight: 700;
93
+ letter-spacing: -0.02em;
94
+ color: #fff;
95
+ }
96
+
97
+ .nav-links {
98
+ display: flex;
99
+ align-items: center;
100
+ gap: 24px;
101
+ font-size: 0.875rem;
102
+ }
103
+
104
+ .nav-links a {
105
+ color: var(--color-text-muted);
106
+ transition: color 0.15s;
107
+ }
108
+
109
+ .nav-links a:hover {
110
+ color: #fff;
111
+ }
112
+
113
+ .nav-link-subtle {
114
+ color: var(--color-text-muted);
115
+ }
116
+
117
+ /* --- Buttons --- */
118
+
119
+ .btn {
120
+ display: inline-flex;
121
+ align-items: center;
122
+ justify-content: center;
123
+ padding: 12px 24px;
124
+ font-size: 0.9375rem;
125
+ font-weight: 600;
126
+ border-radius: 8px;
127
+ border: 1px solid transparent;
128
+ cursor: pointer;
129
+ transition:
130
+ background 0.15s,
131
+ border-color 0.15s,
132
+ transform 0.1s,
133
+ box-shadow 0.15s;
134
+ text-decoration: none;
135
+ }
136
+
137
+ .btn:active {
138
+ transform: scale(0.98);
139
+ }
140
+
141
+ .btn-primary {
142
+ background: var(--color-primary);
143
+ color: #fff;
144
+ border-color: var(--color-primary);
145
+ }
146
+
147
+ .btn-primary:hover {
148
+ background: var(--color-primary-hover);
149
+ border-color: var(--color-primary-hover);
150
+ box-shadow: 0 0 20px rgba(124, 58, 237, 0.3);
151
+ }
152
+
153
+ .btn-secondary {
154
+ background: transparent;
155
+ color: var(--color-text-dark);
156
+ border-color: var(--color-border);
157
+ }
158
+
159
+ .btn-secondary:hover {
160
+ border-color: var(--color-text-muted);
161
+ }
162
+
163
+ .btn-sm {
164
+ padding: 6px 16px;
165
+ font-size: 0.8125rem;
166
+ border-radius: var(--radius-sm);
167
+ }
168
+
169
+ .btn-lg {
170
+ padding: 16px 36px;
171
+ font-size: 1.0625rem;
172
+ border-radius: var(--radius-md);
173
+ }
174
+
175
+ .btn-block {
176
+ width: 100%;
177
+ }
178
+
179
+ /* --- Hero --- */
180
+
181
+ .hero {
182
+ display: flex;
183
+ align-items: center;
184
+ justify-content: center;
185
+ min-height: calc(100vh - var(--nav-height));
186
+ background: linear-gradient(170deg, var(--color-bg-dark) 0%, var(--color-bg-dark-end) 100%);
187
+ text-align: center;
188
+ padding: 80px 24px 60px;
189
+ position: relative;
190
+ overflow: hidden;
191
+ }
192
+
193
+ .hero::before {
194
+ content: '';
195
+ position: absolute;
196
+ top: -50%;
197
+ left: 50%;
198
+ width: 800px;
199
+ height: 800px;
200
+ transform: translateX(-50%);
201
+ background: radial-gradient(circle, rgba(124, 58, 237, 0.08) 0%, transparent 70%);
202
+ pointer-events: none;
203
+ }
204
+
205
+ .hero-inner {
206
+ max-width: 720px;
207
+ position: relative;
208
+ z-index: 1;
209
+ }
210
+
211
+ .hero h1 {
212
+ font-size: clamp(2rem, 5vw, 3.5rem);
213
+ font-weight: 800;
214
+ line-height: 1.12;
215
+ letter-spacing: -0.035em;
216
+ color: #fff;
217
+ margin-bottom: 20px;
218
+ }
219
+
220
+ .hero-sub {
221
+ font-size: 1.125rem;
222
+ color: var(--color-text-muted);
223
+ line-height: 1.7;
224
+ margin-bottom: 36px;
225
+ max-width: 540px;
226
+ margin-left: auto;
227
+ margin-right: auto;
228
+ }
229
+
230
+ .hero-ctas {
231
+ display: flex;
232
+ gap: 12px;
233
+ justify-content: center;
234
+ flex-wrap: wrap;
235
+ margin-bottom: 48px;
236
+ }
237
+
238
+ /* --- Terminal --- */
239
+
240
+ .terminal {
241
+ background: #0d0d14;
242
+ border: 1px solid var(--color-border);
243
+ border-radius: var(--radius-lg);
244
+ text-align: left;
245
+ overflow: hidden;
246
+ box-shadow:
247
+ 0 4px 24px rgba(0, 0, 0, 0.4),
248
+ 0 0 0 1px rgba(255, 255, 255, 0.03);
249
+ max-width: 620px;
250
+ margin: 0 auto;
251
+ }
252
+
253
+ .terminal-titlebar {
254
+ display: flex;
255
+ align-items: center;
256
+ gap: 8px;
257
+ padding: 12px 16px;
258
+ background: #141420;
259
+ border-bottom: 1px solid var(--color-border);
260
+ }
261
+
262
+ .terminal-dot {
263
+ width: 12px;
264
+ height: 12px;
265
+ border-radius: 50%;
266
+ display: inline-block;
267
+ }
268
+
269
+ .terminal-dot--red {
270
+ background: #ff5f57;
271
+ }
272
+ .terminal-dot--yellow {
273
+ background: #febc2e;
274
+ }
275
+ .terminal-dot--green {
276
+ background: #28c840;
277
+ }
278
+
279
+ .terminal-title {
280
+ flex: 1;
281
+ text-align: center;
282
+ font-size: 0.75rem;
283
+ color: var(--color-text-muted);
284
+ margin-right: 44px; /* offset for dots to center */
285
+ }
286
+
287
+ .terminal-body {
288
+ padding: 20px 24px;
289
+ overflow-x: auto;
290
+ }
291
+
292
+ .terminal-body pre {
293
+ margin: 0;
294
+ font-size: 0.8125rem;
295
+ line-height: 1.7;
296
+ }
297
+
298
+ .terminal-body code {
299
+ font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', 'JetBrains Mono', Menlo, monospace;
300
+ color: #d4d4d8;
301
+ }
302
+
303
+ .terminal-prompt {
304
+ color: var(--color-success);
305
+ font-weight: 700;
306
+ }
307
+
308
+ .terminal-muted {
309
+ color: #71717a;
310
+ }
311
+
312
+ .terminal-success {
313
+ color: var(--color-success);
314
+ }
315
+
316
+ /* --- Social Proof --- */
317
+
318
+ .social-proof {
319
+ background: #111116;
320
+ border-top: 1px solid var(--color-border);
321
+ border-bottom: 1px solid var(--color-border);
322
+ padding: 40px 24px;
323
+ }
324
+
325
+ .social-proof-inner {
326
+ display: flex;
327
+ align-items: center;
328
+ justify-content: center;
329
+ gap: 48px;
330
+ max-width: var(--max-width);
331
+ margin: 0 auto;
332
+ flex-wrap: wrap;
333
+ }
334
+
335
+ .social-proof-stat {
336
+ display: flex;
337
+ flex-direction: column;
338
+ align-items: center;
339
+ gap: 4px;
340
+ }
341
+
342
+ .social-proof-number {
343
+ font-size: 1.75rem;
344
+ font-weight: 800;
345
+ color: #fff;
346
+ letter-spacing: -0.02em;
347
+ }
348
+
349
+ .social-proof-label {
350
+ font-size: 0.8125rem;
351
+ color: var(--color-text-muted);
352
+ text-transform: uppercase;
353
+ letter-spacing: 0.05em;
354
+ }
355
+
356
+ .social-proof-divider {
357
+ width: 1px;
358
+ height: 40px;
359
+ background: var(--color-border);
360
+ }
361
+
362
+ /* --- Sections --- */
363
+
364
+ .section {
365
+ max-width: var(--max-width);
366
+ margin: 0 auto;
367
+ padding: var(--section-padding) 24px;
368
+ }
369
+
370
+ .section--dark {
371
+ max-width: none;
372
+ background: linear-gradient(180deg, #0e0e16 0%, var(--color-bg-dark) 100%);
373
+ }
374
+
375
+ .section--dark > h2,
376
+ .section--dark > .bento-grid,
377
+ .section--dark > .pricing-grid {
378
+ max-width: var(--max-width);
379
+ margin-left: auto;
380
+ margin-right: auto;
381
+ }
382
+
383
+ .section h2 {
384
+ font-size: clamp(1.5rem, 3vw, 2rem);
385
+ font-weight: 700;
386
+ text-align: center;
387
+ margin-bottom: 56px;
388
+ color: #fff;
389
+ letter-spacing: -0.02em;
390
+ }
391
+
392
+ /* --- Steps (How it works) --- */
393
+
394
+ .steps {
395
+ display: grid;
396
+ grid-template-columns: repeat(3, 1fr);
397
+ gap: 32px;
398
+ }
399
+
400
+ .step {
401
+ background: var(--color-surface);
402
+ border: 1px solid var(--color-border);
403
+ border-radius: var(--radius-lg);
404
+ padding: 36px 28px;
405
+ text-align: center;
406
+ transition:
407
+ border-color 0.2s,
408
+ transform 0.2s;
409
+ }
410
+
411
+ .step:hover {
412
+ border-color: #3f3f46;
413
+ transform: translateY(-2px);
414
+ }
415
+
416
+ .step-icon {
417
+ display: flex;
418
+ align-items: center;
419
+ justify-content: center;
420
+ width: 48px;
421
+ height: 48px;
422
+ border-radius: 12px;
423
+ background: var(--color-primary-subtle);
424
+ color: var(--color-primary-hover);
425
+ margin: 0 auto 16px;
426
+ }
427
+
428
+ .step-num {
429
+ display: inline-flex;
430
+ align-items: center;
431
+ justify-content: center;
432
+ width: 36px;
433
+ height: 36px;
434
+ border-radius: 50%;
435
+ background: var(--color-primary);
436
+ color: #fff;
437
+ font-weight: 700;
438
+ font-size: 0.875rem;
439
+ margin-bottom: 16px;
440
+ }
441
+
442
+ .step h3 {
443
+ font-size: 1.125rem;
444
+ font-weight: 600;
445
+ margin-bottom: 8px;
446
+ color: #fff;
447
+ }
448
+
449
+ .step p {
450
+ font-size: 0.9375rem;
451
+ color: var(--color-text-muted);
452
+ line-height: 1.6;
453
+ }
454
+
455
+ /* --- Bento Feature Grid --- */
456
+
457
+ .bento-grid {
458
+ display: grid;
459
+ grid-template-columns: repeat(3, 1fr);
460
+ gap: 20px;
461
+ padding: 0 24px;
462
+ }
463
+
464
+ .bento-card {
465
+ background: var(--color-surface);
466
+ border: 1px solid var(--color-border);
467
+ border-radius: var(--radius-lg);
468
+ padding: 32px 28px;
469
+ transition:
470
+ border-color 0.2s,
471
+ transform 0.2s,
472
+ box-shadow 0.2s;
473
+ }
474
+
475
+ .bento-card:hover {
476
+ border-color: #3f3f46;
477
+ transform: translateY(-3px);
478
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
479
+ }
480
+
481
+ .bento-icon {
482
+ display: flex;
483
+ align-items: center;
484
+ justify-content: center;
485
+ width: 44px;
486
+ height: 44px;
487
+ border-radius: var(--radius-md);
488
+ background: var(--color-primary-subtle);
489
+ color: var(--color-primary-hover);
490
+ margin-bottom: 20px;
491
+ }
492
+
493
+ .bento-card h3 {
494
+ font-size: 1.0625rem;
495
+ font-weight: 600;
496
+ color: #fff;
497
+ margin-bottom: 8px;
498
+ }
499
+
500
+ .bento-card p {
501
+ font-size: 0.875rem;
502
+ color: var(--color-text-muted);
503
+ line-height: 1.65;
504
+ }
505
+
506
+ /* --- Comparison Table --- */
507
+
508
+ .comparison-wrapper {
509
+ max-width: 800px;
510
+ margin: 0 auto;
511
+ overflow-x: auto;
512
+ -webkit-overflow-scrolling: touch;
513
+ }
514
+
515
+ .comparison-table {
516
+ width: 100%;
517
+ border-collapse: collapse;
518
+ font-size: 0.9375rem;
519
+ }
520
+
521
+ .comparison-table thead th {
522
+ text-align: left;
523
+ font-size: 0.75rem;
524
+ font-weight: 600;
525
+ text-transform: uppercase;
526
+ letter-spacing: 0.06em;
527
+ color: var(--color-text-muted);
528
+ padding: 12px 20px;
529
+ border-bottom: 1px solid var(--color-border);
530
+ }
531
+
532
+ .comparison-table tbody td {
533
+ padding: 16px 20px;
534
+ color: var(--color-text-dark);
535
+ border-bottom: 1px solid var(--color-border-subtle);
536
+ }
537
+
538
+ .comparison-table tbody tr:last-child td {
539
+ border-bottom: none;
540
+ }
541
+
542
+ .comparison-name {
543
+ font-weight: 500;
544
+ color: #fff;
545
+ }
546
+
547
+ .comparison-highlight {
548
+ background: var(--color-primary-subtle);
549
+ border-radius: var(--radius-md);
550
+ }
551
+
552
+ .comparison-highlight td {
553
+ border-bottom-color: transparent;
554
+ }
555
+
556
+ .comparison-highlight td:first-child {
557
+ border-radius: var(--radius-md) 0 0 var(--radius-md);
558
+ }
559
+
560
+ .comparison-highlight td:last-child {
561
+ border-radius: 0 var(--radius-md) var(--radius-md) 0;
562
+ color: var(--color-success);
563
+ }
564
+
565
+ /* --- Pricing --- */
566
+
567
+ .pricing-grid {
568
+ display: grid;
569
+ grid-template-columns: repeat(4, 1fr);
570
+ gap: 20px;
571
+ padding: 0 24px;
572
+ }
573
+
574
+ .pricing-card {
575
+ background: var(--color-surface);
576
+ border: 1px solid var(--color-border);
577
+ border-radius: var(--radius-lg);
578
+ padding: 32px 24px;
579
+ display: flex;
580
+ flex-direction: column;
581
+ position: relative;
582
+ transition:
583
+ border-color 0.2s,
584
+ transform 0.2s;
585
+ }
586
+
587
+ .pricing-card:hover {
588
+ border-color: #3f3f46;
589
+ transform: translateY(-2px);
590
+ }
591
+
592
+ .pricing-card--featured {
593
+ border-color: var(--color-primary);
594
+ box-shadow: 0 0 30px rgba(124, 58, 237, 0.15);
595
+ }
596
+
597
+ .pricing-card--featured:hover {
598
+ border-color: var(--color-primary-hover);
599
+ }
600
+
601
+ .pricing-badge {
602
+ position: absolute;
603
+ top: -12px;
604
+ left: 50%;
605
+ transform: translateX(-50%);
606
+ background: var(--color-primary);
607
+ color: #fff;
608
+ font-size: 0.6875rem;
609
+ font-weight: 700;
610
+ text-transform: uppercase;
611
+ letter-spacing: 0.06em;
612
+ padding: 4px 14px;
613
+ border-radius: 20px;
614
+ }
615
+
616
+ .pricing-card-header {
617
+ text-align: center;
618
+ margin-bottom: 24px;
619
+ padding-bottom: 24px;
620
+ border-bottom: 1px solid var(--color-border-subtle);
621
+ }
622
+
623
+ .pricing-tier-name {
624
+ font-size: 0.9375rem;
625
+ font-weight: 600;
626
+ color: var(--color-text-muted);
627
+ margin-bottom: 12px;
628
+ text-transform: uppercase;
629
+ letter-spacing: 0.04em;
630
+ }
631
+
632
+ .pricing-amount {
633
+ color: #fff;
634
+ margin-bottom: 8px;
635
+ }
636
+
637
+ .pricing-currency {
638
+ font-size: 1.25rem;
639
+ font-weight: 600;
640
+ vertical-align: top;
641
+ position: relative;
642
+ top: 6px;
643
+ }
644
+
645
+ .pricing-value {
646
+ font-size: 3rem;
647
+ font-weight: 800;
648
+ letter-spacing: -0.03em;
649
+ line-height: 1;
650
+ }
651
+
652
+ .pricing-period {
653
+ font-size: 0.9375rem;
654
+ color: var(--color-text-muted);
655
+ font-weight: 400;
656
+ }
657
+
658
+ .pricing-tagline {
659
+ font-size: 0.8125rem;
660
+ color: var(--color-text-muted);
661
+ }
662
+
663
+ .pricing-features {
664
+ list-style: none;
665
+ flex: 1;
666
+ margin-bottom: 28px;
667
+ }
668
+
669
+ .pricing-features li {
670
+ font-size: 0.875rem;
671
+ color: var(--color-text-dark);
672
+ padding: 7px 0;
673
+ padding-left: 22px;
674
+ position: relative;
675
+ line-height: 1.5;
676
+ }
677
+
678
+ .pricing-features li::before {
679
+ content: '';
680
+ position: absolute;
681
+ left: 0;
682
+ top: 12px;
683
+ width: 14px;
684
+ height: 14px;
685
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='14' height='14' viewBox='0 0 24 24' fill='none' stroke='%2310b981' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpolyline points='20 6 9 17 4 12'%3E%3C/polyline%3E%3C/svg%3E");
686
+ background-size: contain;
687
+ background-repeat: no-repeat;
688
+ }
689
+
690
+ .pricing-card-footer {
691
+ text-align: center;
692
+ }
693
+
694
+ .pricing-note {
695
+ font-size: 0.75rem;
696
+ color: var(--color-text-muted);
697
+ margin-top: 10px;
698
+ }
699
+
700
+ /* --- CTA Section --- */
701
+
702
+ .cta-section {
703
+ background: linear-gradient(170deg, #12121f 0%, var(--color-bg-dark) 100%);
704
+ padding: var(--section-padding) 24px;
705
+ text-align: center;
706
+ position: relative;
707
+ overflow: hidden;
708
+ }
709
+
710
+ .cta-section::before {
711
+ content: '';
712
+ position: absolute;
713
+ bottom: -30%;
714
+ left: 50%;
715
+ width: 600px;
716
+ height: 600px;
717
+ transform: translateX(-50%);
718
+ background: radial-gradient(circle, rgba(124, 58, 237, 0.06) 0%, transparent 70%);
719
+ pointer-events: none;
720
+ }
721
+
722
+ .cta-inner {
723
+ max-width: 600px;
724
+ margin: 0 auto;
725
+ position: relative;
726
+ z-index: 1;
727
+ }
728
+
729
+ .cta-section h2 {
730
+ font-size: clamp(1.5rem, 4vw, 2.25rem);
731
+ font-weight: 800;
732
+ color: #fff;
733
+ margin-bottom: 16px;
734
+ letter-spacing: -0.03em;
735
+ }
736
+
737
+ .cta-sub {
738
+ font-size: 1.0625rem;
739
+ color: var(--color-text-muted);
740
+ line-height: 1.7;
741
+ margin-bottom: 36px;
742
+ }
743
+
744
+ /* --- Footer --- */
745
+
746
+ .footer {
747
+ border-top: 1px solid var(--color-border);
748
+ padding: 64px 24px 32px;
749
+ background: var(--color-bg-dark);
750
+ }
751
+
752
+ .footer-inner {
753
+ display: grid;
754
+ grid-template-columns: repeat(3, 1fr);
755
+ gap: 32px;
756
+ max-width: var(--max-width);
757
+ margin: 0 auto;
758
+ }
759
+
760
+ .footer-col h4 {
761
+ font-size: 0.8125rem;
762
+ font-weight: 600;
763
+ text-transform: uppercase;
764
+ letter-spacing: 0.05em;
765
+ color: var(--color-text-muted);
766
+ margin-bottom: 12px;
767
+ }
768
+
769
+ .footer-col a {
770
+ display: block;
771
+ font-size: 0.875rem;
772
+ color: var(--color-text-dark);
773
+ padding: 4px 0;
774
+ transition: color 0.15s;
775
+ }
776
+
777
+ .footer-col a:hover {
778
+ color: var(--color-primary-hover);
779
+ }
780
+
781
+ .footer-copy {
782
+ grid-column: 1 / -1;
783
+ text-align: center;
784
+ font-size: 0.75rem;
785
+ color: var(--color-text-muted);
786
+ margin-top: 24px;
787
+ }
788
+
789
+ /* --- Status Colors (used by dashboard) --- */
790
+
791
+ .status-green {
792
+ color: #22c55e;
793
+ }
794
+ .status-gray {
795
+ color: #71717a;
796
+ }
797
+ .status-red {
798
+ color: var(--color-error);
799
+ }
800
+ .status-yellow {
801
+ color: #eab308;
802
+ }
803
+
804
+ /* =========================================================================
805
+ Admin Panel
806
+ ========================================================================= */
807
+
808
+ /* --- Admin Shell (sidebar + main) --- */
809
+
810
+ .admin-shell {
811
+ display: flex;
812
+ min-height: 100vh;
813
+ }
814
+
815
+ .admin-sidebar {
816
+ width: 240px;
817
+ flex-shrink: 0;
818
+ background: var(--color-surface);
819
+ border-right: 1px solid var(--color-border);
820
+ display: flex;
821
+ flex-direction: column;
822
+ position: fixed;
823
+ top: 0;
824
+ left: 0;
825
+ bottom: 0;
826
+ z-index: 50;
827
+ }
828
+
829
+ .admin-sidebar-header {
830
+ padding: 20px 20px 16px;
831
+ border-bottom: 1px solid var(--color-border);
832
+ }
833
+
834
+ .admin-sidebar-logo {
835
+ display: block;
836
+ font-size: 1rem;
837
+ font-weight: 700;
838
+ color: #fff;
839
+ margin-bottom: 4px;
840
+ }
841
+
842
+ .admin-sidebar-logo:hover {
843
+ color: var(--color-primary-hover);
844
+ }
845
+
846
+ .admin-sidebar-label {
847
+ display: inline-block;
848
+ font-size: 0.6875rem;
849
+ font-weight: 600;
850
+ text-transform: uppercase;
851
+ letter-spacing: 0.08em;
852
+ color: var(--color-primary-hover);
853
+ background: var(--color-primary-subtle);
854
+ padding: 2px 8px;
855
+ border-radius: 4px;
856
+ }
857
+
858
+ .admin-sidebar-nav {
859
+ flex: 1;
860
+ padding: 12px 8px;
861
+ display: flex;
862
+ flex-direction: column;
863
+ gap: 2px;
864
+ }
865
+
866
+ .admin-nav-link {
867
+ display: flex;
868
+ align-items: center;
869
+ gap: 10px;
870
+ padding: 8px 12px;
871
+ border-radius: var(--radius-sm);
872
+ font-size: 0.875rem;
873
+ color: var(--color-text-muted);
874
+ transition:
875
+ background 0.12s,
876
+ color 0.12s;
877
+ }
878
+
879
+ .admin-nav-link:hover {
880
+ background: var(--color-surface-hover);
881
+ color: #fff;
882
+ }
883
+
884
+ .admin-nav-link.active {
885
+ background: var(--color-primary-subtle);
886
+ color: var(--color-primary-hover);
887
+ }
888
+
889
+ .admin-nav-link svg {
890
+ flex-shrink: 0;
891
+ opacity: 0.7;
892
+ }
893
+
894
+ .admin-nav-link.active svg {
895
+ opacity: 1;
896
+ }
897
+
898
+ .admin-nav-link--back {
899
+ margin-top: auto;
900
+ }
901
+
902
+ .admin-sidebar-footer {
903
+ padding: 12px 8px 16px;
904
+ border-top: 1px solid var(--color-border);
905
+ }
906
+
907
+ .admin-sidebar-user {
908
+ padding: 8px 12px;
909
+ margin-top: 8px;
910
+ }
911
+
912
+ .admin-sidebar-email {
913
+ display: block;
914
+ font-size: 0.8125rem;
915
+ color: var(--color-text-muted);
916
+ overflow: hidden;
917
+ text-overflow: ellipsis;
918
+ white-space: nowrap;
919
+ margin-bottom: 4px;
920
+ }
921
+
922
+ .admin-signout-btn {
923
+ background: none;
924
+ border: none;
925
+ color: var(--color-text-muted);
926
+ font-size: 0.75rem;
927
+ cursor: pointer;
928
+ padding: 0;
929
+ transition: color 0.12s;
930
+ }
931
+
932
+ .admin-signout-btn:hover {
933
+ color: var(--color-error);
934
+ }
935
+
936
+ .admin-main {
937
+ flex: 1;
938
+ margin-left: 240px;
939
+ padding: 32px 40px;
940
+ min-width: 0;
941
+ }
942
+
943
+ /* --- Admin Page Structures --- */
944
+
945
+ .admin-page-header {
946
+ display: flex;
947
+ align-items: baseline;
948
+ gap: 12px;
949
+ margin-bottom: 28px;
950
+ }
951
+
952
+ .admin-page-header h1 {
953
+ font-size: 1.5rem;
954
+ font-weight: 700;
955
+ color: #fff;
956
+ letter-spacing: -0.02em;
957
+ }
958
+
959
+ .admin-page-count {
960
+ font-size: 0.875rem;
961
+ color: var(--color-text-muted);
962
+ }
963
+
964
+ /* --- Stats Grid --- */
965
+
966
+ .admin-stats {
967
+ display: grid;
968
+ grid-template-columns: repeat(4, 1fr);
969
+ gap: 16px;
970
+ margin-bottom: 32px;
971
+ }
972
+
973
+ .stat-card {
974
+ background: var(--color-surface);
975
+ border: 1px solid var(--color-border);
976
+ border-radius: var(--radius-md);
977
+ padding: 24px;
978
+ display: flex;
979
+ flex-direction: column;
980
+ gap: 4px;
981
+ }
982
+
983
+ .stat-card-value {
984
+ font-size: 2rem;
985
+ font-weight: 800;
986
+ color: #fff;
987
+ letter-spacing: -0.03em;
988
+ line-height: 1.1;
989
+ }
990
+
991
+ .stat-card-label {
992
+ font-size: 0.8125rem;
993
+ color: var(--color-text-muted);
994
+ text-transform: uppercase;
995
+ letter-spacing: 0.04em;
996
+ }
997
+
998
+ /* --- System Info --- */
999
+
1000
+ .system-info {
1001
+ background: var(--color-surface);
1002
+ border: 1px solid var(--color-border);
1003
+ border-radius: var(--radius-md);
1004
+ padding: 24px;
1005
+ }
1006
+
1007
+ .system-info h2 {
1008
+ font-size: 1.125rem;
1009
+ font-weight: 600;
1010
+ color: #fff;
1011
+ margin-bottom: 16px;
1012
+ text-align: left;
1013
+ }
1014
+
1015
+ .system-info-list {
1016
+ display: flex;
1017
+ flex-direction: column;
1018
+ gap: 0;
1019
+ }
1020
+
1021
+ .system-info-row {
1022
+ display: flex;
1023
+ justify-content: space-between;
1024
+ align-items: center;
1025
+ padding: 10px 0;
1026
+ border-bottom: 1px solid var(--color-border-subtle);
1027
+ }
1028
+
1029
+ .system-info-row:last-child {
1030
+ border-bottom: none;
1031
+ }
1032
+
1033
+ .system-info-row dt {
1034
+ font-size: 0.875rem;
1035
+ color: var(--color-text-muted);
1036
+ }
1037
+
1038
+ .system-info-row dd {
1039
+ font-size: 0.875rem;
1040
+ color: var(--color-text-dark);
1041
+ font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', Menlo, monospace;
1042
+ }
1043
+
1044
+ /* --- Admin Table --- */
1045
+
1046
+ .admin-table-wrap {
1047
+ overflow-x: auto;
1048
+ -webkit-overflow-scrolling: touch;
1049
+ }
1050
+
1051
+ .admin-table {
1052
+ width: 100%;
1053
+ border-collapse: collapse;
1054
+ font-size: 0.875rem;
1055
+ background: var(--color-surface);
1056
+ border: 1px solid var(--color-border);
1057
+ border-radius: var(--radius-md);
1058
+ overflow: hidden;
1059
+ }
1060
+
1061
+ .admin-table thead th {
1062
+ text-align: left;
1063
+ font-size: 0.75rem;
1064
+ font-weight: 600;
1065
+ text-transform: uppercase;
1066
+ letter-spacing: 0.05em;
1067
+ color: var(--color-text-muted);
1068
+ padding: 12px 16px;
1069
+ border-bottom: 1px solid var(--color-border);
1070
+ white-space: nowrap;
1071
+ user-select: none;
1072
+ }
1073
+
1074
+ .admin-table thead th.sortable {
1075
+ cursor: pointer;
1076
+ transition: color 0.12s;
1077
+ }
1078
+
1079
+ .admin-table thead th.sortable:hover {
1080
+ color: #fff;
1081
+ }
1082
+
1083
+ .admin-table thead th.sorted-asc::after {
1084
+ content: ' \2191';
1085
+ }
1086
+
1087
+ .admin-table thead th.sorted-desc::after {
1088
+ content: ' \2193';
1089
+ }
1090
+
1091
+ .admin-table tbody td {
1092
+ padding: 10px 16px;
1093
+ border-bottom: 1px solid var(--color-border-subtle);
1094
+ color: var(--color-text-dark);
1095
+ vertical-align: middle;
1096
+ }
1097
+
1098
+ .admin-table tbody tr:last-child td {
1099
+ border-bottom: none;
1100
+ }
1101
+
1102
+ .admin-table tbody tr:hover {
1103
+ background: var(--color-surface-hover);
1104
+ }
1105
+
1106
+ .admin-table code {
1107
+ font-family: 'SF Mono', 'Fira Code', Menlo, monospace;
1108
+ font-size: 0.8125rem;
1109
+ color: var(--color-primary-hover);
1110
+ }
1111
+
1112
+ .admin-table-empty {
1113
+ text-align: center;
1114
+ padding: 32px 16px !important;
1115
+ color: var(--color-text-muted);
1116
+ }
1117
+
1118
+ .admin-actions {
1119
+ display: flex;
1120
+ align-items: center;
1121
+ gap: 8px;
1122
+ white-space: nowrap;
1123
+ }
1124
+
1125
+ /* --- Search Input --- */
1126
+
1127
+ .search-input {
1128
+ width: 100%;
1129
+ padding: 10px 14px;
1130
+ margin-bottom: 16px;
1131
+ border: 1px solid var(--color-border);
1132
+ border-radius: var(--radius-sm);
1133
+ background: var(--color-surface);
1134
+ color: var(--color-text-dark);
1135
+ font-size: 0.875rem;
1136
+ outline: none;
1137
+ transition: border-color 0.15s;
1138
+ }
1139
+
1140
+ .search-input:focus {
1141
+ border-color: var(--color-primary);
1142
+ }
1143
+
1144
+ .search-input::placeholder {
1145
+ color: var(--color-text-muted);
1146
+ }
1147
+
1148
+ /* --- Plan Badge --- */
1149
+
1150
+ .plan-badge {
1151
+ display: inline-block;
1152
+ padding: 2px 8px;
1153
+ border-radius: 4px;
1154
+ font-size: 0.75rem;
1155
+ font-weight: 600;
1156
+ text-transform: uppercase;
1157
+ letter-spacing: 0.03em;
1158
+ }
1159
+
1160
+ .plan-badge--free {
1161
+ background: rgba(113, 113, 122, 0.15);
1162
+ color: #a1a1aa;
1163
+ }
1164
+
1165
+ .plan-badge--hobbyist {
1166
+ background: rgba(59, 130, 246, 0.12);
1167
+ color: #60a5fa;
1168
+ }
1169
+
1170
+ .plan-badge--pro {
1171
+ background: rgba(139, 92, 246, 0.12);
1172
+ color: #a78bfa;
1173
+ }
1174
+
1175
+ .plan-badge--team {
1176
+ background: rgba(245, 158, 11, 0.12);
1177
+ color: #fbbf24;
1178
+ }
1179
+
1180
+ .plan-badge--enterprise {
1181
+ background: rgba(16, 185, 129, 0.12);
1182
+ color: #34d399;
1183
+ }
1184
+
1185
+ /* --- Admin Badge --- */
1186
+
1187
+ .admin-badge {
1188
+ display: inline-block;
1189
+ padding: 2px 8px;
1190
+ border-radius: 4px;
1191
+ font-size: 0.6875rem;
1192
+ font-weight: 700;
1193
+ text-transform: uppercase;
1194
+ letter-spacing: 0.04em;
1195
+ background: rgba(239, 68, 68, 0.12);
1196
+ color: #f87171;
1197
+ }
1198
+
1199
+ /* --- Admin Select & Danger Button --- */
1200
+
1201
+ .admin-select {
1202
+ padding: 4px 8px;
1203
+ border: 1px solid var(--color-border);
1204
+ border-radius: var(--radius-sm);
1205
+ background: var(--color-bg-dark);
1206
+ color: var(--color-text-dark);
1207
+ font-size: 0.8125rem;
1208
+ cursor: pointer;
1209
+ outline: none;
1210
+ }
1211
+
1212
+ .admin-select:focus {
1213
+ border-color: var(--color-primary);
1214
+ }
1215
+
1216
+ .btn-danger {
1217
+ background: rgba(239, 68, 68, 0.1);
1218
+ color: #f87171;
1219
+ border-color: rgba(239, 68, 68, 0.3);
1220
+ }
1221
+
1222
+ .btn-danger:hover {
1223
+ background: rgba(239, 68, 68, 0.2);
1224
+ border-color: rgba(239, 68, 68, 0.5);
1225
+ }
1226
+
1227
+ .inline-action {
1228
+ display: inline-flex;
1229
+ }
1230
+
1231
+ /* --- Status dot in table --- */
1232
+
1233
+ .status-dot {
1234
+ font-weight: 600;
1235
+ font-size: 0.8125rem;
1236
+ }
1237
+
1238
+ /* --- Admin links (row + back) --- */
1239
+
1240
+ .admin-row-link {
1241
+ color: var(--color-text-dark);
1242
+ text-decoration: none;
1243
+ font-weight: 500;
1244
+ }
1245
+
1246
+ .admin-row-link:hover {
1247
+ color: var(--color-primary-hover);
1248
+ text-decoration: underline;
1249
+ }
1250
+
1251
+ .admin-back-link {
1252
+ font-size: 0.8125rem;
1253
+ color: var(--color-text-muted);
1254
+ text-decoration: none;
1255
+ }
1256
+
1257
+ .admin-back-link:hover {
1258
+ color: #fff;
1259
+ }
1260
+
1261
+ /* --- Health panel --- */
1262
+
1263
+ .health-panel,
1264
+ .chart-panel,
1265
+ .credit-panel {
1266
+ background: var(--color-surface);
1267
+ border: 1px solid var(--color-border);
1268
+ border-radius: var(--radius-md);
1269
+ padding: 24px;
1270
+ margin-bottom: 24px;
1271
+ }
1272
+
1273
+ .health-panel h2,
1274
+ .chart-panel h2,
1275
+ .credit-panel h2 {
1276
+ font-size: 1.125rem;
1277
+ font-weight: 600;
1278
+ color: #fff;
1279
+ margin-bottom: 16px;
1280
+ }
1281
+
1282
+ .health-grid {
1283
+ display: grid;
1284
+ grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
1285
+ gap: 12px;
1286
+ }
1287
+
1288
+ .health-item {
1289
+ display: flex;
1290
+ align-items: center;
1291
+ gap: 12px;
1292
+ padding: 12px;
1293
+ border: 1px solid var(--color-border-subtle);
1294
+ border-radius: var(--radius-sm);
1295
+ }
1296
+
1297
+ .health-badge {
1298
+ flex-shrink: 0;
1299
+ font-size: 0.75rem;
1300
+ font-weight: 700;
1301
+ padding: 4px 8px;
1302
+ border-radius: var(--radius-sm);
1303
+ text-transform: uppercase;
1304
+ letter-spacing: 0.03em;
1305
+ }
1306
+
1307
+ .health-badge--ok {
1308
+ background: rgba(16, 185, 129, 0.15);
1309
+ color: #34d399;
1310
+ }
1311
+
1312
+ .health-badge--bad {
1313
+ background: rgba(239, 68, 68, 0.15);
1314
+ color: #f87171;
1315
+ }
1316
+
1317
+ .health-badge--neutral {
1318
+ background: var(--color-surface-hover);
1319
+ color: var(--color-text-dark);
1320
+ text-transform: none;
1321
+ }
1322
+
1323
+ .health-meta {
1324
+ display: flex;
1325
+ flex-direction: column;
1326
+ min-width: 0;
1327
+ }
1328
+
1329
+ .health-name {
1330
+ font-size: 0.875rem;
1331
+ color: #fff;
1332
+ }
1333
+
1334
+ .health-sub {
1335
+ font-size: 0.75rem;
1336
+ color: var(--color-text-muted);
1337
+ }
1338
+
1339
+ .health-alerts {
1340
+ margin-top: 16px;
1341
+ padding: 12px 16px;
1342
+ list-style: disc inside;
1343
+ background: rgba(239, 68, 68, 0.08);
1344
+ border: 1px solid rgba(239, 68, 68, 0.25);
1345
+ border-radius: var(--radius-sm);
1346
+ color: #f87171;
1347
+ font-size: 0.8125rem;
1348
+ }
1349
+
1350
+ /* --- Chart panels --- */
1351
+
1352
+ .chart-panel-header {
1353
+ display: flex;
1354
+ align-items: baseline;
1355
+ gap: 12px;
1356
+ margin-bottom: 16px;
1357
+ }
1358
+
1359
+ .chart-panel-header h2 {
1360
+ margin-bottom: 0;
1361
+ }
1362
+
1363
+ .chart-panel-meta {
1364
+ font-size: 0.8125rem;
1365
+ color: var(--color-text-muted);
1366
+ }
1367
+
1368
+ .failure-rate-grid {
1369
+ display: grid;
1370
+ grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
1371
+ gap: 16px;
1372
+ margin-bottom: 20px;
1373
+ }
1374
+
1375
+ .chart-grid {
1376
+ display: grid;
1377
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
1378
+ gap: 20px;
1379
+ }
1380
+
1381
+ .chart-box {
1382
+ display: flex;
1383
+ flex-direction: column;
1384
+ gap: 8px;
1385
+ padding: 16px;
1386
+ border: 1px solid var(--color-border-subtle);
1387
+ border-radius: var(--radius-sm);
1388
+ background: var(--color-bg-dark);
1389
+ }
1390
+
1391
+ .chart-box-label {
1392
+ font-size: 0.8125rem;
1393
+ color: var(--color-text-muted);
1394
+ text-transform: uppercase;
1395
+ letter-spacing: 0.04em;
1396
+ }
1397
+
1398
+ .chart {
1399
+ width: 100%;
1400
+ height: auto;
1401
+ display: block;
1402
+ overflow: visible;
1403
+ }
1404
+
1405
+ .chart--sparkline {
1406
+ height: 48px;
1407
+ }
1408
+
1409
+ .chart--bars {
1410
+ height: 80px;
1411
+ }
1412
+
1413
+ .chart--dual {
1414
+ height: 140px;
1415
+ }
1416
+
1417
+ .chart-legend {
1418
+ display: flex;
1419
+ gap: 16px;
1420
+ flex-wrap: wrap;
1421
+ }
1422
+
1423
+ .chart-legend-item {
1424
+ display: inline-flex;
1425
+ align-items: center;
1426
+ gap: 6px;
1427
+ font-size: 0.75rem;
1428
+ color: var(--color-text-muted);
1429
+ }
1430
+
1431
+ .chart-swatch {
1432
+ width: 12px;
1433
+ height: 3px;
1434
+ border-radius: 2px;
1435
+ display: inline-block;
1436
+ }
1437
+
1438
+ .chart-swatch--a {
1439
+ background: var(--color-primary-hover);
1440
+ }
1441
+
1442
+ .chart-swatch--b {
1443
+ background: var(--color-error);
1444
+ }
1445
+
1446
+ .chart-empty {
1447
+ padding: 24px;
1448
+ text-align: center;
1449
+ color: var(--color-text-muted);
1450
+ font-size: 0.875rem;
1451
+ border: 1px dashed var(--color-border);
1452
+ border-radius: var(--radius-sm);
1453
+ }
1454
+
1455
+ .chart-empty code {
1456
+ font-family: var(--font-mono, monospace);
1457
+ color: var(--color-text-dark);
1458
+ }
1459
+
1460
+ /* --- Credit form --- */
1461
+
1462
+ .credit-form {
1463
+ margin-top: 16px;
1464
+ }
1465
+
1466
+ .credit-form-row {
1467
+ display: flex;
1468
+ align-items: flex-end;
1469
+ gap: 16px;
1470
+ flex-wrap: wrap;
1471
+ }
1472
+
1473
+ .credit-form-field {
1474
+ display: flex;
1475
+ flex-direction: column;
1476
+ gap: 6px;
1477
+ font-size: 0.8125rem;
1478
+ color: var(--color-text-muted);
1479
+ }
1480
+
1481
+ .credit-form-field .search-input {
1482
+ width: 200px;
1483
+ margin-bottom: 0;
1484
+ }
1485
+
1486
+ .credit-form-actions {
1487
+ display: flex;
1488
+ gap: 8px;
1489
+ }
1490
+
1491
+ .ledger-heading {
1492
+ font-size: 1.125rem;
1493
+ font-weight: 600;
1494
+ color: #fff;
1495
+ margin-bottom: 12px;
1496
+ }
1497
+
1498
+ /* --- Telemetry --- */
1499
+
1500
+ .telemetry-count {
1501
+ font-weight: 700;
1502
+ color: #fff;
1503
+ }
1504
+
1505
+ .telemetry-error {
1506
+ max-width: 360px;
1507
+ font-size: 0.8125rem;
1508
+ color: var(--color-text-muted);
1509
+ word-break: break-word;
1510
+ }
1511
+
1512
+ /* =========================================================================
1513
+ Dashboard
1514
+ ========================================================================= */
1515
+
1516
+ /* --- Dashboard Shell (sidebar + main) --- */
1517
+
1518
+ .dashboard-body {
1519
+ margin: 0;
1520
+ display: flex;
1521
+ min-height: 100vh;
1522
+ }
1523
+
1524
+ .sidebar {
1525
+ width: 240px;
1526
+ flex-shrink: 0;
1527
+ background: var(--color-surface);
1528
+ border-right: 1px solid var(--color-border);
1529
+ display: flex;
1530
+ flex-direction: column;
1531
+ position: fixed;
1532
+ top: 0;
1533
+ left: 0;
1534
+ bottom: 0;
1535
+ z-index: 50;
1536
+ }
1537
+
1538
+ .sidebar-logo {
1539
+ display: block;
1540
+ padding: 20px 20px 16px;
1541
+ font-size: 1.1rem;
1542
+ font-weight: 700;
1543
+ color: #fff;
1544
+ border-bottom: 1px solid var(--color-border);
1545
+ }
1546
+
1547
+ .sidebar-logo:hover {
1548
+ color: var(--color-primary-hover);
1549
+ }
1550
+
1551
+ .sidebar-nav {
1552
+ flex: 1;
1553
+ padding: 12px 8px;
1554
+ display: flex;
1555
+ flex-direction: column;
1556
+ gap: 2px;
1557
+ }
1558
+
1559
+ .sidebar-link {
1560
+ display: block;
1561
+ padding: 8px 12px;
1562
+ border-radius: var(--radius-sm);
1563
+ font-size: 0.875rem;
1564
+ color: var(--color-text-muted);
1565
+ transition:
1566
+ background 0.12s,
1567
+ color 0.12s;
1568
+ }
1569
+
1570
+ .sidebar-link:hover {
1571
+ background: var(--color-surface-hover);
1572
+ color: #fff;
1573
+ }
1574
+
1575
+ .sidebar-link.active {
1576
+ background: var(--color-primary-subtle);
1577
+ color: var(--color-primary-hover);
1578
+ }
1579
+
1580
+ .sidebar-divider {
1581
+ border: none;
1582
+ border-top: 1px solid var(--color-border);
1583
+ margin: 8px 12px;
1584
+ }
1585
+
1586
+ .sidebar-footer {
1587
+ padding: 12px 16px 16px;
1588
+ border-top: 1px solid var(--color-border);
1589
+ }
1590
+
1591
+ .sidebar-email {
1592
+ display: block;
1593
+ font-size: 0.8125rem;
1594
+ color: var(--color-text-muted);
1595
+ overflow: hidden;
1596
+ text-overflow: ellipsis;
1597
+ white-space: nowrap;
1598
+ margin-bottom: 6px;
1599
+ }
1600
+
1601
+ .sidebar-logout {
1602
+ background: none;
1603
+ border: none;
1604
+ color: var(--color-text-muted);
1605
+ font-size: 0.75rem;
1606
+ cursor: pointer;
1607
+ padding: 0;
1608
+ transition: color 0.12s;
1609
+ }
1610
+
1611
+ .sidebar-logout:hover {
1612
+ color: var(--color-error);
1613
+ }
1614
+
1615
+ .dashboard-main {
1616
+ flex: 1;
1617
+ margin-left: 240px;
1618
+ padding: 32px 40px;
1619
+ min-width: 0;
1620
+ }
1621
+
1622
+ /* --- Dashboard Header --- */
1623
+
1624
+ .dashboard-header {
1625
+ display: flex;
1626
+ align-items: center;
1627
+ justify-content: space-between;
1628
+ gap: 16px;
1629
+ margin-bottom: 28px;
1630
+ flex-wrap: wrap;
1631
+ }
1632
+
1633
+ .dashboard-header h1 {
1634
+ font-size: 1.5rem;
1635
+ font-weight: 700;
1636
+ color: #fff;
1637
+ letter-spacing: -0.02em;
1638
+ margin: 0;
1639
+ }
1640
+
1641
+ .dashboard-header-left {
1642
+ display: flex;
1643
+ align-items: center;
1644
+ gap: 8px;
1645
+ }
1646
+
1647
+ .dashboard-header-actions {
1648
+ display: flex;
1649
+ align-items: center;
1650
+ gap: 8px;
1651
+ }
1652
+
1653
+ .breadcrumb-link {
1654
+ font-size: 0.875rem;
1655
+ color: var(--color-text-muted);
1656
+ transition: color 0.12s;
1657
+ }
1658
+
1659
+ .breadcrumb-link:hover {
1660
+ color: var(--color-primary-hover);
1661
+ }
1662
+
1663
+ .breadcrumb-sep {
1664
+ color: var(--color-text-muted);
1665
+ font-size: 0.875rem;
1666
+ }
1667
+
1668
+ /* --- Server Cards --- */
1669
+
1670
+ .server-grid {
1671
+ display: grid;
1672
+ grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));
1673
+ gap: 16px;
1674
+ }
1675
+
1676
+ .server-card {
1677
+ background: var(--color-surface);
1678
+ border: 1px solid var(--color-border);
1679
+ border-radius: var(--radius-md);
1680
+ padding: 20px;
1681
+ transition:
1682
+ border-color 0.15s,
1683
+ transform 0.15s;
1684
+ }
1685
+
1686
+ .server-card:hover {
1687
+ border-color: #3f3f46;
1688
+ transform: translateY(-1px);
1689
+ }
1690
+
1691
+ .server-card-header {
1692
+ display: flex;
1693
+ align-items: center;
1694
+ justify-content: space-between;
1695
+ gap: 12px;
1696
+ margin-bottom: 12px;
1697
+ }
1698
+
1699
+ .server-card-name {
1700
+ font-size: 1rem;
1701
+ font-weight: 600;
1702
+ color: #fff;
1703
+ overflow: hidden;
1704
+ text-overflow: ellipsis;
1705
+ white-space: nowrap;
1706
+ transition: color 0.12s;
1707
+ }
1708
+
1709
+ .server-card-name:hover {
1710
+ color: var(--color-primary-hover);
1711
+ }
1712
+
1713
+ .server-card-meta {
1714
+ display: flex;
1715
+ gap: 16px;
1716
+ font-size: 0.8125rem;
1717
+ color: var(--color-text-muted);
1718
+ margin-bottom: 16px;
1719
+ }
1720
+
1721
+ .server-card-actions {
1722
+ display: flex;
1723
+ align-items: center;
1724
+ gap: 8px;
1725
+ }
1726
+
1727
+ .server-card-actions form {
1728
+ display: inline;
1729
+ }
1730
+
1731
+ /* --- Status Badge --- */
1732
+
1733
+ .status-badge {
1734
+ display: inline-flex;
1735
+ align-items: center;
1736
+ padding: 2px 10px;
1737
+ border-radius: 12px;
1738
+ font-size: 0.75rem;
1739
+ font-weight: 600;
1740
+ text-transform: capitalize;
1741
+ letter-spacing: 0.02em;
1742
+ }
1743
+
1744
+ .status-running {
1745
+ background: rgba(16, 185, 129, 0.12);
1746
+ color: #34d399;
1747
+ }
1748
+
1749
+ .status-stopped {
1750
+ background: rgba(113, 113, 122, 0.15);
1751
+ color: #a1a1aa;
1752
+ }
1753
+
1754
+ .status-error {
1755
+ background: rgba(239, 68, 68, 0.12);
1756
+ color: #f87171;
1757
+ }
1758
+
1759
+ .status-building {
1760
+ background: rgba(245, 158, 11, 0.12);
1761
+ color: #fbbf24;
1762
+ }
1763
+
1764
+ /* --- Empty State --- */
1765
+
1766
+ .empty-state {
1767
+ text-align: center;
1768
+ padding: 64px 24px;
1769
+ color: var(--color-text-muted);
1770
+ }
1771
+
1772
+ .empty-state-icon {
1773
+ margin-bottom: 16px;
1774
+ color: var(--color-text-muted);
1775
+ opacity: 0.5;
1776
+ }
1777
+
1778
+ .empty-state-icon svg {
1779
+ display: inline-block;
1780
+ }
1781
+
1782
+ .empty-state h2 {
1783
+ font-size: 1.25rem;
1784
+ font-weight: 600;
1785
+ color: #fff;
1786
+ margin-bottom: 8px;
1787
+ }
1788
+
1789
+ .empty-state p {
1790
+ font-size: 0.9375rem;
1791
+ margin-bottom: 24px;
1792
+ }
1793
+
1794
+ /* --- Detail Page --- */
1795
+
1796
+ .detail-grid {
1797
+ display: grid;
1798
+ grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
1799
+ gap: 16px;
1800
+ margin-bottom: 32px;
1801
+ }
1802
+
1803
+ .detail-card {
1804
+ background: var(--color-surface);
1805
+ border: 1px solid var(--color-border);
1806
+ border-radius: var(--radius-md);
1807
+ padding: 20px;
1808
+ }
1809
+
1810
+ .detail-card h3 {
1811
+ font-size: 0.75rem;
1812
+ font-weight: 600;
1813
+ text-transform: uppercase;
1814
+ letter-spacing: 0.05em;
1815
+ color: var(--color-text-muted);
1816
+ margin-bottom: 8px;
1817
+ }
1818
+
1819
+ .detail-value {
1820
+ font-size: 1.125rem;
1821
+ font-weight: 600;
1822
+ color: #fff;
1823
+ }
1824
+
1825
+ .detail-value-lg {
1826
+ font-size: 2rem;
1827
+ font-weight: 800;
1828
+ letter-spacing: -0.03em;
1829
+ }
1830
+
1831
+ .detail-section {
1832
+ margin-bottom: 32px;
1833
+ }
1834
+
1835
+ .detail-section h2 {
1836
+ font-size: 1.125rem;
1837
+ font-weight: 600;
1838
+ color: #fff;
1839
+ margin-bottom: 16px;
1840
+ text-align: left;
1841
+ }
1842
+
1843
+ /* --- Endpoint --- */
1844
+
1845
+ .endpoint-row {
1846
+ display: flex;
1847
+ align-items: center;
1848
+ gap: 12px;
1849
+ background: var(--color-surface);
1850
+ border: 1px solid var(--color-border);
1851
+ border-radius: var(--radius-sm);
1852
+ padding: 12px 16px;
1853
+ }
1854
+
1855
+ .endpoint-url {
1856
+ flex: 1;
1857
+ font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', Menlo, monospace;
1858
+ font-size: 0.875rem;
1859
+ color: var(--color-primary-hover);
1860
+ overflow: hidden;
1861
+ text-overflow: ellipsis;
1862
+ white-space: nowrap;
1863
+ }
1864
+
1865
+ .token-display {
1866
+ font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', Menlo, monospace;
1867
+ font-size: 0.8125rem;
1868
+ background: rgba(0, 0, 0, 0.3);
1869
+ padding: 4px 8px;
1870
+ border-radius: 4px;
1871
+ word-break: break-all;
1872
+ }
1873
+
1874
+ /* --- Config Tabs --- */
1875
+
1876
+ .config-tabs {
1877
+ display: flex;
1878
+ gap: 0;
1879
+ border-bottom: 1px solid var(--color-border);
1880
+ margin-bottom: 0;
1881
+ }
1882
+
1883
+ .config-tab {
1884
+ padding: 10px 20px;
1885
+ background: none;
1886
+ border: none;
1887
+ border-bottom: 2px solid transparent;
1888
+ color: var(--color-text-muted);
1889
+ font-size: 0.875rem;
1890
+ font-weight: 500;
1891
+ cursor: pointer;
1892
+ transition:
1893
+ color 0.12s,
1894
+ border-color 0.12s;
1895
+ }
1896
+
1897
+ .config-tab:hover {
1898
+ color: #fff;
1899
+ }
1900
+
1901
+ .config-tab.active {
1902
+ color: var(--color-primary-hover);
1903
+ border-bottom-color: var(--color-primary);
1904
+ }
1905
+
1906
+ .config-content {
1907
+ position: relative;
1908
+ background: #0d0d14;
1909
+ border: 1px solid var(--color-border);
1910
+ border-top: none;
1911
+ border-radius: 0 0 var(--radius-md) var(--radius-md);
1912
+ padding: 20px;
1913
+ }
1914
+
1915
+ .config-content pre {
1916
+ margin: 0;
1917
+ font-size: 0.8125rem;
1918
+ line-height: 1.7;
1919
+ overflow-x: auto;
1920
+ }
1921
+
1922
+ .config-content code {
1923
+ font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', Menlo, monospace;
1924
+ color: #d4d4d8;
1925
+ }
1926
+
1927
+ .config-copy {
1928
+ position: absolute;
1929
+ top: 12px;
1930
+ right: 12px;
1931
+ }
1932
+
1933
+ /* --- Log Viewer --- */
1934
+
1935
+ .log-viewer-wrapper {
1936
+ margin-top: 8px;
1937
+ }
1938
+
1939
+ .log-viewer {
1940
+ background: #0d0d14;
1941
+ border: 1px solid var(--color-border);
1942
+ border-radius: var(--radius-md);
1943
+ padding: 16px 20px;
1944
+ max-height: 600px;
1945
+ overflow-y: auto;
1946
+ font-family: 'SF Mono', 'Fira Code', 'Cascadia Code', Menlo, monospace;
1947
+ font-size: 0.8125rem;
1948
+ line-height: 1.7;
1949
+ color: #d4d4d8;
1950
+ }
1951
+
1952
+ .log-viewer div {
1953
+ padding: 1px 0;
1954
+ }
1955
+
1956
+ .log-connecting {
1957
+ color: var(--color-text-muted);
1958
+ font-style: italic;
1959
+ }
1960
+
1961
+ /* --- Metrics --- */
1962
+
1963
+ .metrics-table {
1964
+ width: 100%;
1965
+ border-collapse: collapse;
1966
+ font-size: 0.875rem;
1967
+ background: var(--color-surface);
1968
+ border: 1px solid var(--color-border);
1969
+ border-radius: var(--radius-md);
1970
+ overflow: hidden;
1971
+ margin-top: 16px;
1972
+ }
1973
+
1974
+ .metrics-table thead th {
1975
+ text-align: left;
1976
+ font-size: 0.75rem;
1977
+ font-weight: 600;
1978
+ text-transform: uppercase;
1979
+ letter-spacing: 0.05em;
1980
+ color: var(--color-text-muted);
1981
+ padding: 12px 16px;
1982
+ border-bottom: 1px solid var(--color-border);
1983
+ }
1984
+
1985
+ .metrics-table tbody td {
1986
+ padding: 10px 16px;
1987
+ border-bottom: 1px solid var(--color-border-subtle);
1988
+ color: var(--color-text-dark);
1989
+ }
1990
+
1991
+ .metrics-table tbody tr:last-child td {
1992
+ border-bottom: none;
1993
+ }
1994
+
1995
+ /* --- Bar Chart --- */
1996
+
1997
+ .bar-chart {
1998
+ display: flex;
1999
+ flex-direction: column;
2000
+ gap: 8px;
2001
+ }
2002
+
2003
+ .bar-chart-row {
2004
+ display: flex;
2005
+ align-items: center;
2006
+ gap: 12px;
2007
+ }
2008
+
2009
+ .bar-chart-label {
2010
+ flex: 0 0 140px;
2011
+ font-size: 0.8125rem;
2012
+ color: var(--color-text-dark);
2013
+ overflow: hidden;
2014
+ text-overflow: ellipsis;
2015
+ white-space: nowrap;
2016
+ font-family: 'SF Mono', 'Fira Code', Menlo, monospace;
2017
+ }
2018
+
2019
+ .bar-chart-track {
2020
+ flex: 1;
2021
+ height: 20px;
2022
+ background: var(--color-surface);
2023
+ border-radius: 4px;
2024
+ overflow: hidden;
2025
+ }
2026
+
2027
+ .bar {
2028
+ height: 100%;
2029
+ background: var(--color-primary);
2030
+ border-radius: 4px;
2031
+ min-width: 4px;
2032
+ transition: width 0.3s ease;
2033
+ }
2034
+
2035
+ .bar-chart-value {
2036
+ flex: 0 0 48px;
2037
+ text-align: right;
2038
+ font-size: 0.8125rem;
2039
+ font-weight: 600;
2040
+ color: #fff;
2041
+ }
2042
+
2043
+ /* --- Create Form --- */
2044
+
2045
+ .create-form-wrapper {
2046
+ max-width: 560px;
2047
+ }
2048
+
2049
+ .create-form .form-group {
2050
+ margin-bottom: 1.25rem;
2051
+ }
2052
+
2053
+ .create-form .form-group label {
2054
+ display: block;
2055
+ font-size: 0.875rem;
2056
+ font-weight: 500;
2057
+ margin-bottom: 0.4rem;
2058
+ color: var(--color-text-dark);
2059
+ }
2060
+
2061
+ .create-form .form-group input[type='text'] {
2062
+ width: 100%;
2063
+ padding: 0.6rem 0.75rem;
2064
+ border: 1px solid var(--color-border);
2065
+ border-radius: var(--radius-sm);
2066
+ background: var(--color-bg-dark);
2067
+ color: var(--color-text-dark);
2068
+ font-size: 0.9375rem;
2069
+ outline: none;
2070
+ transition: border-color 0.15s;
2071
+ }
2072
+
2073
+ .create-form .form-group input[type='text']:focus {
2074
+ border-color: var(--color-primary);
2075
+ }
2076
+
2077
+ .form-hint {
2078
+ font-size: 0.8rem;
2079
+ color: var(--color-text-muted);
2080
+ margin-top: 0.3rem;
2081
+ }
2082
+
2083
+ .form-hint-inline {
2084
+ font-weight: 400;
2085
+ color: var(--color-text-muted);
2086
+ font-size: 0.85em;
2087
+ }
2088
+
2089
+ /* --- Dropzone --- */
2090
+
2091
+ .dropzone {
2092
+ position: relative;
2093
+ border: 2px dashed var(--color-border);
2094
+ border-radius: var(--radius-md);
2095
+ padding: 32px 24px;
2096
+ text-align: center;
2097
+ transition:
2098
+ border-color 0.15s,
2099
+ background 0.15s;
2100
+ cursor: pointer;
2101
+ }
2102
+
2103
+ .dropzone:hover,
2104
+ .dropzone-active {
2105
+ border-color: var(--color-primary);
2106
+ background: var(--color-primary-subtle);
2107
+ }
2108
+
2109
+ .dropzone-input {
2110
+ position: absolute;
2111
+ inset: 0;
2112
+ width: 100%;
2113
+ height: 100%;
2114
+ opacity: 0;
2115
+ cursor: pointer;
2116
+ }
2117
+
2118
+ .dropzone-content {
2119
+ pointer-events: none;
2120
+ }
2121
+
2122
+ .dropzone-content svg {
2123
+ display: inline-block;
2124
+ margin-bottom: 8px;
2125
+ color: var(--color-text-muted);
2126
+ }
2127
+
2128
+ .dropzone-content p {
2129
+ font-size: 0.875rem;
2130
+ color: var(--color-text-muted);
2131
+ margin-bottom: 4px;
2132
+ }
2133
+
2134
+ .dropzone-link {
2135
+ color: var(--color-primary-hover);
2136
+ font-weight: 500;
2137
+ }
2138
+
2139
+ .dropzone-selected {
2140
+ display: flex;
2141
+ align-items: center;
2142
+ gap: 8px;
2143
+ justify-content: center;
2144
+ color: var(--color-text-dark);
2145
+ font-size: 0.875rem;
2146
+ pointer-events: none;
2147
+ }
2148
+
2149
+ .dropzone-selected svg {
2150
+ color: var(--color-primary-hover);
2151
+ }
2152
+
2153
+ .dropzone-clear {
2154
+ pointer-events: all;
2155
+ background: none;
2156
+ border: none;
2157
+ color: var(--color-text-muted);
2158
+ font-size: 1.125rem;
2159
+ cursor: pointer;
2160
+ padding: 0 4px;
2161
+ line-height: 1;
2162
+ }
2163
+
2164
+ .dropzone-clear:hover {
2165
+ color: var(--color-error);
2166
+ }
2167
+
2168
+ /* --- Flash Messages --- */
2169
+
2170
+ .flash-message {
2171
+ padding: 12px 16px;
2172
+ border-radius: var(--radius-sm);
2173
+ font-size: 0.875rem;
2174
+ margin-bottom: 20px;
2175
+ }
2176
+
2177
+ .flash-success {
2178
+ background: rgba(16, 185, 129, 0.1);
2179
+ border: 1px solid rgba(16, 185, 129, 0.3);
2180
+ color: #6ee7b7;
2181
+ }
2182
+
2183
+ .flash-error {
2184
+ background: rgba(239, 68, 68, 0.1);
2185
+ border: 1px solid rgba(239, 68, 68, 0.3);
2186
+ color: #fca5a5;
2187
+ }
2188
+
2189
+ /* --- Focus States --- */
2190
+
2191
+ :focus-visible {
2192
+ outline: 2px solid var(--color-primary);
2193
+ outline-offset: 2px;
2194
+ }
2195
+
2196
+ /* --- Skip to Content --- */
2197
+
2198
+ .skip-to-content {
2199
+ position: absolute;
2200
+ left: -9999px;
2201
+ top: auto;
2202
+ width: 1px;
2203
+ height: 1px;
2204
+ overflow: hidden;
2205
+ }
2206
+
2207
+ .skip-to-content:focus {
2208
+ position: static;
2209
+ width: auto;
2210
+ height: auto;
2211
+ padding: 8px 16px;
2212
+ background: var(--color-primary);
2213
+ color: white;
2214
+ z-index: 1000;
2215
+ display: block;
2216
+ text-align: center;
2217
+ }
2218
+
2219
+ /* --- Error Pages --- */
2220
+
2221
+ .error-page {
2222
+ text-align: center;
2223
+ padding: 120px 24px 80px;
2224
+ max-width: 520px;
2225
+ margin: 0 auto;
2226
+ }
2227
+
2228
+ .error-page h1 {
2229
+ font-size: clamp(4rem, 10vw, 8rem);
2230
+ font-weight: 800;
2231
+ letter-spacing: -0.04em;
2232
+ color: var(--color-primary);
2233
+ line-height: 1;
2234
+ margin-bottom: 8px;
2235
+ }
2236
+
2237
+ .error-page h2 {
2238
+ font-size: 1.5rem;
2239
+ font-weight: 700;
2240
+ color: #fff;
2241
+ margin-bottom: 12px;
2242
+ }
2243
+
2244
+ .error-page p {
2245
+ font-size: 1rem;
2246
+ color: var(--color-text-muted);
2247
+ line-height: 1.6;
2248
+ margin-bottom: 32px;
2249
+ }
2250
+
2251
+ .error-actions {
2252
+ display: flex;
2253
+ gap: 12px;
2254
+ justify-content: center;
2255
+ flex-wrap: wrap;
2256
+ }
2257
+
2258
+ /* --- Alpine.js cloak --- */
2259
+
2260
+ [x-cloak] {
2261
+ display: none !important;
2262
+ }
2263
+
2264
+ /* =========================================================================
2265
+ Responsive
2266
+ ========================================================================= */
2267
+
2268
+ @media (max-width: 1024px) {
2269
+ .bento-grid {
2270
+ grid-template-columns: repeat(2, 1fr);
2271
+ }
2272
+
2273
+ .pricing-grid {
2274
+ grid-template-columns: repeat(2, 1fr);
2275
+ }
2276
+
2277
+ .admin-stats {
2278
+ grid-template-columns: repeat(2, 1fr);
2279
+ }
2280
+
2281
+ .server-grid {
2282
+ grid-template-columns: 1fr;
2283
+ }
2284
+
2285
+ .detail-grid {
2286
+ grid-template-columns: repeat(2, 1fr);
2287
+ }
2288
+ }
2289
+
2290
+ @media (max-width: 768px) {
2291
+ :root {
2292
+ --section-padding: 64px;
2293
+ }
2294
+
2295
+ .sidebar {
2296
+ position: static;
2297
+ width: 100%;
2298
+ border-right: none;
2299
+ border-bottom: 1px solid var(--color-border);
2300
+ }
2301
+
2302
+ .dashboard-body {
2303
+ flex-direction: column;
2304
+ }
2305
+
2306
+ .dashboard-main {
2307
+ margin-left: 0;
2308
+ padding: 24px 20px;
2309
+ }
2310
+
2311
+ .sidebar-nav {
2312
+ flex-direction: row;
2313
+ flex-wrap: wrap;
2314
+ gap: 4px;
2315
+ padding: 8px;
2316
+ }
2317
+
2318
+ .sidebar-footer {
2319
+ display: flex;
2320
+ align-items: center;
2321
+ gap: 12px;
2322
+ padding: 8px 12px;
2323
+ }
2324
+
2325
+ .sidebar-divider {
2326
+ display: none;
2327
+ }
2328
+
2329
+ .detail-grid {
2330
+ grid-template-columns: 1fr;
2331
+ }
2332
+
2333
+ .bar-chart-label {
2334
+ flex: 0 0 100px;
2335
+ }
2336
+
2337
+ .admin-sidebar {
2338
+ width: 200px;
2339
+ }
2340
+
2341
+ .admin-main {
2342
+ margin-left: 200px;
2343
+ padding: 24px 20px;
2344
+ }
2345
+
2346
+ .admin-stats {
2347
+ grid-template-columns: 1fr;
2348
+ }
2349
+
2350
+ .admin-page-header h1 {
2351
+ font-size: 1.25rem;
2352
+ }
2353
+
2354
+ .stat-card-value {
2355
+ font-size: 1.5rem;
2356
+ }
2357
+
2358
+ .nav-links {
2359
+ gap: 16px;
2360
+ }
2361
+
2362
+ .hero {
2363
+ min-height: auto;
2364
+ padding: 48px 20px 40px;
2365
+ }
2366
+
2367
+ .hero h1 {
2368
+ font-size: 1.75rem;
2369
+ }
2370
+
2371
+ .hero-ctas {
2372
+ margin-bottom: 36px;
2373
+ }
2374
+
2375
+ .terminal-body {
2376
+ padding: 16px;
2377
+ }
2378
+
2379
+ .terminal-body pre {
2380
+ font-size: 0.6875rem;
2381
+ }
2382
+
2383
+ .steps {
2384
+ grid-template-columns: 1fr;
2385
+ }
2386
+
2387
+ .bento-grid {
2388
+ grid-template-columns: 1fr;
2389
+ padding: 0;
2390
+ }
2391
+
2392
+ .pricing-grid {
2393
+ grid-template-columns: 1fr;
2394
+ max-width: 380px;
2395
+ margin-left: auto;
2396
+ margin-right: auto;
2397
+ padding: 0;
2398
+ }
2399
+
2400
+ .comparison-table {
2401
+ font-size: 0.8125rem;
2402
+ }
2403
+
2404
+ .comparison-table thead th,
2405
+ .comparison-table tbody td {
2406
+ padding: 12px 14px;
2407
+ }
2408
+
2409
+ .footer-inner {
2410
+ grid-template-columns: 1fr;
2411
+ text-align: center;
2412
+ }
2413
+
2414
+ .social-proof-inner {
2415
+ gap: 32px;
2416
+ }
2417
+
2418
+ .social-proof-divider {
2419
+ display: none;
2420
+ }
2421
+
2422
+ .social-proof-number {
2423
+ font-size: 1.5rem;
2424
+ }
2425
+ }
2426
+
2427
+ @media (max-width: 480px) {
2428
+ .nav-links a:not(.btn) {
2429
+ display: none;
2430
+ }
2431
+
2432
+ .hero-sub {
2433
+ font-size: 1rem;
2434
+ }
2435
+
2436
+ .terminal {
2437
+ border-radius: var(--radius-md);
2438
+ }
2439
+
2440
+ .pricing-value {
2441
+ font-size: 2.5rem;
2442
+ }
2443
+
2444
+ .admin-sidebar {
2445
+ position: static;
2446
+ width: 100%;
2447
+ border-right: none;
2448
+ border-bottom: 1px solid var(--color-border);
2449
+ }
2450
+
2451
+ .admin-shell {
2452
+ flex-direction: column;
2453
+ }
2454
+
2455
+ .admin-main {
2456
+ margin-left: 0;
2457
+ padding: 16px;
2458
+ }
2459
+
2460
+ .admin-sidebar-nav {
2461
+ flex-direction: row;
2462
+ flex-wrap: wrap;
2463
+ gap: 4px;
2464
+ padding: 8px;
2465
+ }
2466
+
2467
+ .admin-nav-link--back {
2468
+ margin-top: 0;
2469
+ }
2470
+
2471
+ .admin-sidebar-footer {
2472
+ display: flex;
2473
+ align-items: center;
2474
+ gap: 12px;
2475
+ padding: 8px 12px;
2476
+ }
2477
+
2478
+ .admin-sidebar-user {
2479
+ margin-top: 0;
2480
+ padding: 0;
2481
+ display: flex;
2482
+ align-items: center;
2483
+ gap: 8px;
2484
+ }
2485
+
2486
+ .admin-sidebar-email {
2487
+ margin-bottom: 0;
2488
+ }
2489
+ }
2490
+
2491
+ /* ===========================================================================
2492
+ Documentation pages (/docs)
2493
+ =========================================================================== */
2494
+
2495
+ .docs-layout {
2496
+ display: flex;
2497
+ gap: 40px;
2498
+ align-items: flex-start;
2499
+ max-width: var(--max-width);
2500
+ margin: 0 auto;
2501
+ padding: 40px 24px 80px;
2502
+ background: #ffffff;
2503
+ color: var(--color-text-light);
2504
+ min-height: calc(100vh - var(--nav-height));
2505
+ }
2506
+
2507
+ .docs-sidebar {
2508
+ position: sticky;
2509
+ top: calc(var(--nav-height) + 24px);
2510
+ flex: 0 0 232px;
2511
+ width: 232px;
2512
+ display: flex;
2513
+ flex-direction: column;
2514
+ gap: 4px;
2515
+ font-size: 0.92rem;
2516
+ }
2517
+
2518
+ .docs-sidebar-home {
2519
+ font-weight: 600;
2520
+ color: var(--color-text-light);
2521
+ text-decoration: none;
2522
+ padding: 6px 10px;
2523
+ border-radius: var(--radius-sm);
2524
+ }
2525
+
2526
+ .docs-sidebar-group {
2527
+ margin-top: 18px;
2528
+ display: flex;
2529
+ flex-direction: column;
2530
+ gap: 2px;
2531
+ }
2532
+
2533
+ .docs-sidebar-cat {
2534
+ text-transform: uppercase;
2535
+ letter-spacing: 0.06em;
2536
+ font-size: 0.72rem;
2537
+ font-weight: 700;
2538
+ color: var(--color-text-muted);
2539
+ padding: 4px 10px;
2540
+ }
2541
+
2542
+ .docs-sidebar-link {
2543
+ color: #3f3f52;
2544
+ text-decoration: none;
2545
+ padding: 6px 10px;
2546
+ border-radius: var(--radius-sm);
2547
+ border-left: 2px solid transparent;
2548
+ }
2549
+
2550
+ .docs-sidebar-link:hover,
2551
+ .docs-sidebar-home:hover {
2552
+ background: var(--color-primary-subtle);
2553
+ color: var(--color-primary);
2554
+ }
2555
+
2556
+ .docs-sidebar-link.active,
2557
+ .docs-sidebar-home.active {
2558
+ background: var(--color-primary-subtle);
2559
+ color: var(--color-primary);
2560
+ border-left-color: var(--color-primary);
2561
+ font-weight: 600;
2562
+ }
2563
+
2564
+ .docs-content {
2565
+ flex: 1 1 auto;
2566
+ min-width: 0;
2567
+ max-width: 820px;
2568
+ line-height: 1.7;
2569
+ }
2570
+
2571
+ /* Prose */
2572
+ .prose h1 { font-size: 2rem; margin: 0 0 16px; line-height: 1.2; }
2573
+ .prose h2 { font-size: 1.5rem; margin: 40px 0 14px; padding-top: 8px; border-top: 1px solid #ececf1; }
2574
+ .prose h3 { font-size: 1.2rem; margin: 28px 0 10px; }
2575
+ .prose h4 { font-size: 1.02rem; margin: 22px 0 8px; }
2576
+ .prose p { margin: 0 0 16px; }
2577
+ .prose ul, .prose ol { margin: 0 0 16px; padding-left: 24px; }
2578
+ .prose li { margin: 4px 0; }
2579
+ .prose li > ul, .prose li > ol { margin: 4px 0; }
2580
+ .prose a { color: var(--color-primary); text-decoration: none; }
2581
+ .prose a:hover { text-decoration: underline; }
2582
+ .prose strong { font-weight: 700; }
2583
+ .prose hr { border: none; border-top: 1px solid #ececf1; margin: 32px 0; }
2584
+
2585
+ .prose code {
2586
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
2587
+ font-size: 0.88em;
2588
+ background: #f3f3f7;
2589
+ color: #5b21b6;
2590
+ padding: 2px 6px;
2591
+ border-radius: 4px;
2592
+ }
2593
+
2594
+ .prose pre {
2595
+ background: #14141c;
2596
+ color: #e4e4e7;
2597
+ padding: 16px 18px;
2598
+ border-radius: var(--radius-md);
2599
+ overflow-x: auto;
2600
+ margin: 0 0 18px;
2601
+ font-size: 0.86rem;
2602
+ line-height: 1.55;
2603
+ }
2604
+
2605
+ .prose pre code {
2606
+ background: none;
2607
+ color: inherit;
2608
+ padding: 0;
2609
+ font-size: inherit;
2610
+ }
2611
+
2612
+ .prose blockquote {
2613
+ margin: 0 0 16px;
2614
+ padding: 8px 16px;
2615
+ border-left: 3px solid var(--color-primary);
2616
+ background: var(--color-primary-subtle);
2617
+ border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
2618
+ color: #3f3f52;
2619
+ }
2620
+
2621
+ .prose table {
2622
+ width: 100%;
2623
+ border-collapse: collapse;
2624
+ margin: 0 0 20px;
2625
+ font-size: 0.9rem;
2626
+ display: block;
2627
+ overflow-x: auto;
2628
+ }
2629
+
2630
+ .prose th, .prose td {
2631
+ border: 1px solid #e4e4ea;
2632
+ padding: 8px 12px;
2633
+ text-align: left;
2634
+ vertical-align: top;
2635
+ }
2636
+
2637
+ .prose thead th {
2638
+ background: #f7f7fa;
2639
+ font-weight: 700;
2640
+ }
2641
+
2642
+ /* Docs index cards */
2643
+ .docs-card-grid {
2644
+ display: grid;
2645
+ grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
2646
+ gap: 16px;
2647
+ margin: 0 0 28px;
2648
+ }
2649
+
2650
+ .docs-card {
2651
+ display: block;
2652
+ padding: 18px;
2653
+ border: 1px solid #e4e4ea;
2654
+ border-radius: var(--radius-md);
2655
+ text-decoration: none;
2656
+ color: var(--color-text-light);
2657
+ transition: border-color 0.15s, box-shadow 0.15s;
2658
+ }
2659
+
2660
+ .docs-card:hover {
2661
+ border-color: var(--color-primary);
2662
+ box-shadow: 0 4px 16px rgba(124, 58, 237, 0.12);
2663
+ }
2664
+
2665
+ .docs-card h3 { margin: 0 0 6px; font-size: 1.05rem; color: var(--color-primary); }
2666
+ .docs-card p { margin: 0; font-size: 0.9rem; color: var(--color-text-muted); line-height: 1.5; }
2667
+
2668
+ @media (max-width: 860px) {
2669
+ .docs-layout { flex-direction: column; gap: 8px; padding: 24px 16px 56px; }
2670
+ .docs-sidebar {
2671
+ position: static;
2672
+ width: 100%;
2673
+ flex-basis: auto;
2674
+ flex-direction: row;
2675
+ flex-wrap: wrap;
2676
+ gap: 8px;
2677
+ padding-bottom: 12px;
2678
+ border-bottom: 1px solid #ececf1;
2679
+ margin-bottom: 16px;
2680
+ }
2681
+ .docs-sidebar-group { margin-top: 0; flex-direction: row; flex-wrap: wrap; align-items: center; }
2682
+ .docs-sidebar-cat { display: none; }
2683
+ }