bhooai-nexus 0.1.2

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 (219) hide show
  1. package/README.md +184 -0
  2. package/apps/admin/index.html +12 -0
  3. package/apps/admin/package.json +25 -0
  4. package/apps/admin/postcss.config.js +6 -0
  5. package/apps/admin/public/anime-girl.svg +84 -0
  6. package/apps/admin/public/bhooai-nexus-logo.png +0 -0
  7. package/apps/admin/public/bhooai-nexus-logo.svg +135 -0
  8. package/apps/admin/public/favicon.ico +0 -0
  9. package/apps/admin/src/main.tsx +10 -0
  10. package/apps/admin/src/vite-env.d.ts +18 -0
  11. package/apps/admin/tailwind.config.js +10 -0
  12. package/apps/admin/tsconfig.json +17 -0
  13. package/apps/admin/vite.config.ts +68 -0
  14. package/bin/nexus.js +52 -0
  15. package/package.json +108 -0
  16. package/packages/nexus-admin/package.json +32 -0
  17. package/packages/nexus-admin/src/App.tsx +4878 -0
  18. package/packages/nexus-admin/src/alertCenter.tsx +150 -0
  19. package/packages/nexus-admin/src/api.ts +601 -0
  20. package/packages/nexus-admin/src/assets/bhooai-nexus-logo.svg +25 -0
  21. package/packages/nexus-admin/src/index.css +3635 -0
  22. package/packages/nexus-admin/src/vite-env.d.ts +19 -0
  23. package/packages/nexus-ads/package.json +20 -0
  24. package/packages/nexus-ads/src/GaqlBuilder.ts +72 -0
  25. package/packages/nexus-ads/src/GoogleAdsClient.ts +121 -0
  26. package/packages/nexus-ads/src/fetchTransport.ts +10 -0
  27. package/packages/nexus-ads/src/index.ts +20 -0
  28. package/packages/nexus-ads/src/types.ts +41 -0
  29. package/packages/nexus-ai-client/package.json +18 -0
  30. package/packages/nexus-ai-client/src/client.ts +159 -0
  31. package/packages/nexus-ai-client/src/errors.ts +21 -0
  32. package/packages/nexus-ai-client/src/index.ts +4 -0
  33. package/packages/nexus-ai-client/src/sse.ts +53 -0
  34. package/packages/nexus-ai-client/src/types.ts +174 -0
  35. package/packages/nexus-auth/package.json +22 -0
  36. package/packages/nexus-auth/src/auth.ts +116 -0
  37. package/packages/nexus-auth/src/bcryptjs.d.ts +10 -0
  38. package/packages/nexus-auth/src/cors.ts +91 -0
  39. package/packages/nexus-auth/src/csrf.ts +158 -0
  40. package/packages/nexus-auth/src/headers.ts +55 -0
  41. package/packages/nexus-auth/src/index.ts +11 -0
  42. package/packages/nexus-auth/src/jwt.ts +65 -0
  43. package/packages/nexus-auth/src/middleware.ts +94 -0
  44. package/packages/nexus-auth/src/oauth.ts +199 -0
  45. package/packages/nexus-auth/src/password.ts +33 -0
  46. package/packages/nexus-auth/src/rateLimit.ts +59 -0
  47. package/packages/nexus-auth/src/rbac.ts +94 -0
  48. package/packages/nexus-auth/src/session.ts +91 -0
  49. package/packages/nexus-cache/package.json +21 -0
  50. package/packages/nexus-cache/src/Cache.ts +155 -0
  51. package/packages/nexus-cache/src/PubSub.ts +98 -0
  52. package/packages/nexus-cache/src/RateLimiter.ts +43 -0
  53. package/packages/nexus-cache/src/index.ts +9 -0
  54. package/packages/nexus-cache/src/types.ts +47 -0
  55. package/packages/nexus-cli/package.json +25 -0
  56. package/packages/nexus-cli/src/commands/cluster.ts +133 -0
  57. package/packages/nexus-cli/src/commands/dev.ts +200 -0
  58. package/packages/nexus-cli/src/commands/doctor.ts +199 -0
  59. package/packages/nexus-cli/src/commands/init.ts +1009 -0
  60. package/packages/nexus-cli/src/commands/node.ts +106 -0
  61. package/packages/nexus-cli/src/commands/pysetup.ts +142 -0
  62. package/packages/nexus-cli/src/commands/sync.ts +116 -0
  63. package/packages/nexus-cli/src/commands/uninstall.ts +287 -0
  64. package/packages/nexus-cli/src/config-sync.ts +384 -0
  65. package/packages/nexus-cli/src/dotenv.ts +39 -0
  66. package/packages/nexus-cli/src/index.ts +94 -0
  67. package/packages/nexus-cli/src/supervisor.ts +394 -0
  68. package/packages/nexus-cli/src/util.ts +132 -0
  69. package/packages/nexus-cli/src/wizard.ts +149 -0
  70. package/packages/nexus-cli/templates/Dockerfile +60 -0
  71. package/packages/nexus-cli/templates/README.md +69 -0
  72. package/packages/nexus-cli/templates/apps/admin/index.html +12 -0
  73. package/packages/nexus-cli/templates/apps/admin/package.json +24 -0
  74. package/packages/nexus-cli/templates/apps/admin/postcss.config.js +6 -0
  75. package/packages/nexus-cli/templates/apps/admin/src/main.tsx +10 -0
  76. package/packages/nexus-cli/templates/apps/admin/src/vite-env.d.ts +18 -0
  77. package/packages/nexus-cli/templates/apps/admin/tailwind.config.js +9 -0
  78. package/packages/nexus-cli/templates/apps/admin/tsconfig.json +17 -0
  79. package/packages/nexus-cli/templates/apps/admin/vite.config.ts +64 -0
  80. package/packages/nexus-cli/templates/apps/ai-server/main.py +43 -0
  81. package/packages/nexus-cli/templates/apps/ai-server/providers/__init__.py +3 -0
  82. package/packages/nexus-cli/templates/apps/ai-server/providers/base.py +111 -0
  83. package/packages/nexus-cli/templates/apps/ai-server/requirements.txt +3 -0
  84. package/packages/nexus-cli/templates/apps/ai-server/routers/__init__.py +3 -0
  85. package/packages/nexus-cli/templates/apps/ai-server/routers/chat.py +47 -0
  86. package/packages/nexus-cli/templates/apps/ai-server/routers/embeddings.py +30 -0
  87. package/packages/nexus-cli/templates/apps/ai-server/routers/lint.py +167 -0
  88. package/packages/nexus-cli/templates/apps/ai-server/routers/models.py +23 -0
  89. package/packages/nexus-cli/templates/apps/ai-server/routers/preflight.py +169 -0
  90. package/packages/nexus-cli/templates/apps/ai-server/settings.py +48 -0
  91. package/packages/nexus-cli/templates/apps/backend/package.json +34 -0
  92. package/packages/nexus-cli/templates/apps/backend/src/main.ts +375 -0
  93. package/packages/nexus-cli/templates/apps/backend/src/modules/admin/adminRoutes.ts +732 -0
  94. package/packages/nexus-cli/templates/apps/backend/src/modules/admin/clusterRoutes.ts +391 -0
  95. package/packages/nexus-cli/templates/apps/backend/src/modules/admin/databaseRoutes.ts +161 -0
  96. package/packages/nexus-cli/templates/apps/backend/src/modules/admin/lintProxy.ts +89 -0
  97. package/packages/nexus-cli/templates/apps/backend/src/modules/admin/preflightProxy.ts +242 -0
  98. package/packages/nexus-cli/templates/apps/backend/src/modules/admin/roleCatalog.ts +78 -0
  99. package/packages/nexus-cli/templates/apps/backend/src/modules/admin/schemaRoutes.ts +449 -0
  100. package/packages/nexus-cli/templates/apps/backend/src/modules/ai/aiProxy.ts +265 -0
  101. package/packages/nexus-cli/templates/apps/backend/src/modules/auth/authRoutes.ts +220 -0
  102. package/packages/nexus-cli/templates/apps/backend/src/modules/payments/paymentRoutes.ts +100 -0
  103. package/packages/nexus-cli/templates/apps/backend/src/modules/payments/paymentStore.ts +172 -0
  104. package/packages/nexus-cli/templates/apps/backend/src/modules/requests/requestLog.ts +175 -0
  105. package/packages/nexus-cli/templates/apps/backend/src/modules/users/userGraph.ts +83 -0
  106. package/packages/nexus-cli/templates/apps/backend/src/modules/users/userModel.ts +88 -0
  107. package/packages/nexus-cli/templates/apps/backend/src/plugins/CronScheduler.ts +69 -0
  108. package/packages/nexus-cli/templates/apps/backend/src/plugins/loadPlugins.ts +107 -0
  109. package/packages/nexus-cli/templates/apps/backend/tsconfig.json +14 -0
  110. package/packages/nexus-cli/templates/apps/frontend/index.html +12 -0
  111. package/packages/nexus-cli/templates/apps/frontend/package.json +19 -0
  112. package/packages/nexus-cli/templates/apps/frontend/src/main.tsx +64 -0
  113. package/packages/nexus-cli/templates/apps/frontend/vite.config.ts +72 -0
  114. package/packages/nexus-cli/templates/bin/nexus.js +35 -0
  115. package/packages/nexus-cli/templates/bin/serve-all.mjs +45 -0
  116. package/packages/nexus-cli/templates/dockerignore +15 -0
  117. package/packages/nexus-cli/templates/gitignore +12 -0
  118. package/packages/nexus-cli/templates/nexus.config.ts +69 -0
  119. package/packages/nexus-cli/templates/package.json +47 -0
  120. package/packages/nexus-cli/templates/tsconfig.json +17 -0
  121. package/packages/nexus-cli/templates/uploads/.gitkeep +0 -0
  122. package/packages/nexus-core/package.json +38 -0
  123. package/packages/nexus-core/src/config/ConfigLoader.ts +161 -0
  124. package/packages/nexus-core/src/config/defaults.ts +155 -0
  125. package/packages/nexus-core/src/config/env.ts +113 -0
  126. package/packages/nexus-core/src/config/index.ts +6 -0
  127. package/packages/nexus-core/src/config/merge.ts +28 -0
  128. package/packages/nexus-core/src/config/schema.ts +184 -0
  129. package/packages/nexus-core/src/config/types.ts +352 -0
  130. package/packages/nexus-core/src/di/Container.ts +98 -0
  131. package/packages/nexus-core/src/di/index.ts +1 -0
  132. package/packages/nexus-core/src/errors.ts +62 -0
  133. package/packages/nexus-core/src/http/Router.ts +149 -0
  134. package/packages/nexus-core/src/http/Server.ts +145 -0
  135. package/packages/nexus-core/src/http/bodyParser.ts +129 -0
  136. package/packages/nexus-core/src/http/context.ts +112 -0
  137. package/packages/nexus-core/src/http/index.ts +6 -0
  138. package/packages/nexus-core/src/http/static.ts +85 -0
  139. package/packages/nexus-core/src/http/uploads.ts +94 -0
  140. package/packages/nexus-core/src/index.ts +4 -0
  141. package/packages/nexus-crypto/package.json +18 -0
  142. package/packages/nexus-crypto/src/csr.ts +165 -0
  143. package/packages/nexus-crypto/src/der.ts +262 -0
  144. package/packages/nexus-crypto/src/https.ts +36 -0
  145. package/packages/nexus-crypto/src/index.ts +5 -0
  146. package/packages/nexus-crypto/src/keypair.ts +59 -0
  147. package/packages/nexus-crypto/src/x509.ts +156 -0
  148. package/packages/nexus-data/package.json +27 -0
  149. package/packages/nexus-data/src/connection/Connection.ts +57 -0
  150. package/packages/nexus-data/src/connection/ConnectionManager.ts +37 -0
  151. package/packages/nexus-data/src/errors.ts +17 -0
  152. package/packages/nexus-data/src/index.ts +66 -0
  153. package/packages/nexus-data/src/model/Document.ts +126 -0
  154. package/packages/nexus-data/src/model/Model.ts +189 -0
  155. package/packages/nexus-data/src/model/hydrate.ts +12 -0
  156. package/packages/nexus-data/src/populate/populate.ts +114 -0
  157. package/packages/nexus-data/src/projects.ts +185 -0
  158. package/packages/nexus-data/src/query/Query.ts +158 -0
  159. package/packages/nexus-data/src/schema/Schema.ts +173 -0
  160. package/packages/nexus-data/src/schema/SchemaType.ts +80 -0
  161. package/packages/nexus-data/src/schema/validators.ts +88 -0
  162. package/packages/nexus-email/package.json +22 -0
  163. package/packages/nexus-email/src/EmailService.ts +76 -0
  164. package/packages/nexus-email/src/TemplateEngine.ts +62 -0
  165. package/packages/nexus-email/src/index.ts +37 -0
  166. package/packages/nexus-email/src/providers.ts +63 -0
  167. package/packages/nexus-email/src/queue.ts +103 -0
  168. package/packages/nexus-email/src/types.ts +49 -0
  169. package/packages/nexus-graphql/package.json +24 -0
  170. package/packages/nexus-graphql/src/federation/composeSupergraph.ts +153 -0
  171. package/packages/nexus-graphql/src/federation/createFederatedGateway.ts +36 -0
  172. package/packages/nexus-graphql/src/federation/executor.ts +305 -0
  173. package/packages/nexus-graphql/src/federation/parseMetadata.ts +87 -0
  174. package/packages/nexus-graphql/src/gateway/createGateway.ts +77 -0
  175. package/packages/nexus-graphql/src/gateway/fieldResolver.ts +45 -0
  176. package/packages/nexus-graphql/src/gateway/graphqlHttpHandler.ts +90 -0
  177. package/packages/nexus-graphql/src/gateway/publicSchema.ts +26 -0
  178. package/packages/nexus-graphql/src/index.ts +14 -0
  179. package/packages/nexus-graphql/src/subgraph/defineSubgraph.ts +115 -0
  180. package/packages/nexus-graphql/src/subgraph/federationDirectives.ts +47 -0
  181. package/packages/nexus-graphql/src/subgraph/parseKeys.ts +25 -0
  182. package/packages/nexus-graphql/src/subscriptions/PubSub.ts +64 -0
  183. package/packages/nexus-graphql/src/subscriptions/SubscriptionServer.ts +203 -0
  184. package/packages/nexus-graphql/src/types.ts +77 -0
  185. package/packages/nexus-payments/package.json +20 -0
  186. package/packages/nexus-payments/src/errors.ts +15 -0
  187. package/packages/nexus-payments/src/http.ts +53 -0
  188. package/packages/nexus-payments/src/index.ts +106 -0
  189. package/packages/nexus-payments/src/providers/PayPalProvider.ts +192 -0
  190. package/packages/nexus-payments/src/providers/PayUProvider.ts +164 -0
  191. package/packages/nexus-payments/src/providers/PayoneerProvider.ts +122 -0
  192. package/packages/nexus-payments/src/providers/RazorpayProvider.ts +184 -0
  193. package/packages/nexus-payments/src/providers/SkrillProvider.ts +117 -0
  194. package/packages/nexus-payments/src/signature.ts +24 -0
  195. package/packages/nexus-payments/src/types.ts +150 -0
  196. package/packages/nexus-payments/src/webhooks.ts +58 -0
  197. package/packages/nexus-plugins/package.json +20 -0
  198. package/packages/nexus-plugins/src/HookBus.ts +42 -0
  199. package/packages/nexus-plugins/src/admin/adminExtensions.ts +53 -0
  200. package/packages/nexus-plugins/src/host.ts +105 -0
  201. package/packages/nexus-plugins/src/index.ts +8 -0
  202. package/packages/nexus-plugins/src/manifest.ts +73 -0
  203. package/packages/nexus-plugins/src/registry.ts +123 -0
  204. package/packages/nexus-plugins/src/runtime/TrustedPlugin.ts +134 -0
  205. package/packages/nexus-plugins/src/sandbox/SandboxedPlugin.ts +279 -0
  206. package/packages/nexus-plugins/src/sandbox/capabilityPolicy.ts +68 -0
  207. package/packages/nexus-plugins/src/sandbox/workerBootstrap.mjs +211 -0
  208. package/packages/nexus-realtime/package.json +26 -0
  209. package/packages/nexus-realtime/src/adapter/PubSubAdapter.ts +42 -0
  210. package/packages/nexus-realtime/src/adapter/RedisPubSubAdapter.ts +59 -0
  211. package/packages/nexus-realtime/src/index.ts +5 -0
  212. package/packages/nexus-realtime/src/mediasoup/MediasoupAdapter.ts +176 -0
  213. package/packages/nexus-realtime/src/server/RealtimeServer.ts +252 -0
  214. package/packages/nexus-realtime/src/types.ts +52 -0
  215. package/packages/nexus-telemetry/package.json +20 -0
  216. package/packages/nexus-telemetry/src/index.ts +3 -0
  217. package/packages/nexus-telemetry/src/logger/Logger.ts +178 -0
  218. package/packages/nexus-telemetry/src/metrics/Metrics.ts +123 -0
  219. package/packages/nexus-telemetry/src/trace.ts +28 -0
@@ -0,0 +1,3635 @@
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
4
+
5
+ :root {
6
+ color-scheme: dark;
7
+ }
8
+
9
+ html,
10
+ body,
11
+ #root {
12
+ min-height: 100%;
13
+ }
14
+
15
+ body {
16
+ @apply text-slate-100 antialiased;
17
+ color-scheme: dark;
18
+ }
19
+
20
+ /* Ambient gradient mesh behind the frosted glass. */
21
+ .bg-mesh {
22
+ background:
23
+ radial-gradient(60rem 60rem at 85% -10%, rgba(99, 102, 241, 0.32), transparent 70%),
24
+ radial-gradient(50rem 50rem at -10% 110%, rgba(34, 211, 238, 0.26), transparent 70%),
25
+ radial-gradient(45rem 45rem at 50% 50%, rgba(168, 85, 247, 0.2), transparent 70%),
26
+ radial-gradient(30rem 30rem at 100% 80%, rgba(52, 211, 153, 0.12), transparent 70%),
27
+ #0b0d1a;
28
+ background-attachment: fixed;
29
+ }
30
+
31
+ ::selection {
32
+ background: rgba(129, 140, 248, 0.35);
33
+ }
34
+
35
+ * {
36
+ scrollbar-width: thin;
37
+ scrollbar-color: rgba(255, 255, 255, 0.18) transparent;
38
+ }
39
+ *::-webkit-scrollbar {
40
+ width: 10px;
41
+ height: 10px;
42
+ }
43
+ *::-webkit-scrollbar-thumb {
44
+ background: rgba(255, 255, 255, 0.14);
45
+ border-radius: 8px;
46
+ }
47
+ *::-webkit-scrollbar-track {
48
+ background: transparent;
49
+ }
50
+
51
+ @layer components {
52
+ /* Frosted-glass surfaces. */
53
+ .glass {
54
+ border-width: 1px;
55
+ border-style: solid;
56
+ border-color: var(--admin-border, rgba(125, 174, 235, 0.2));
57
+ background: var(--admin-surface, rgba(10, 24, 45, 0.78));
58
+ box-shadow: 0 8px 32px rgba(2, 6, 23, 0.45);
59
+ backdrop-filter: blur(20px);
60
+ -webkit-backdrop-filter: blur(20px);
61
+ }
62
+ .glass-card {
63
+ @apply glass rounded-2xl p-5;
64
+ }
65
+ .glass-panel {
66
+ @apply glass rounded-2xl;
67
+ }
68
+
69
+ /* Gradients used for accents. */
70
+ .brand-text {
71
+ @apply bg-gradient-to-r from-indigo-300 via-violet-300 to-cyan-300 bg-clip-text text-transparent;
72
+ }
73
+ .glass-h3 {
74
+ @apply text-sm font-semibold uppercase tracking-wider text-slate-300;
75
+ }
76
+
77
+ /* Inputs / selects. */
78
+ .glass-input {
79
+ @apply w-full rounded-xl border border-white/10 px-3 py-2 text-sm text-slate-100 placeholder:text-slate-500 transition-colors focus:border-indigo-300/50 focus:outline-none focus:ring-2 focus:ring-indigo-400/40;
80
+ background: rgba(255, 255, 255, 0.05);
81
+ }
82
+ .glass-input:focus {
83
+ background: rgba(255, 255, 255, 0.08);
84
+ }
85
+ .glass-code {
86
+ @apply rounded-xl border border-white/10 bg-black/30 font-mono text-xs text-slate-200 shadow-inner backdrop-blur-xl;
87
+ }
88
+
89
+ /* Buttons. */
90
+ .glass-btn {
91
+ @apply inline-flex cursor-pointer items-center justify-center gap-1.5 rounded-lg px-4 py-2 text-sm font-semibold text-slate-100 transition-all hover:-translate-y-px hover:brightness-110 disabled:pointer-events-none disabled:opacity-50;
92
+ background: color-mix(in srgb, var(--admin-blue) 15%, transparent);
93
+ border: 1px solid color-mix(in srgb, var(--admin-blue) 40%, transparent);
94
+ }
95
+ .glass-btn-primary {
96
+ @apply glass-btn text-white;
97
+ background: linear-gradient(135deg, rgba(38, 130, 225, 0.55), rgba(90, 67, 183, 0.45));
98
+ border-color: color-mix(in srgb, var(--admin-blue) 48%, transparent);
99
+ box-shadow: 0 8px 24px color-mix(in srgb, var(--admin-blue) 17%, transparent);
100
+ font-size: 0.72rem;
101
+ font-weight: 700;
102
+ padding: 0.55rem 0.9rem;
103
+ }
104
+ .glass-btn-primary:hover {
105
+ background: linear-gradient(135deg, rgba(56, 150, 245, 0.65), rgba(110, 80, 205, 0.55));
106
+ filter: brightness(1.12);
107
+ }
108
+ .glass-btn-success {
109
+ @apply glass-btn text-white;
110
+ background: linear-gradient(135deg, rgba(16, 185, 129, 0.7), rgba(5, 150, 105, 0.65));
111
+ border-color: rgba(52, 211, 153, 0.4);
112
+ }
113
+ .glass-btn-danger {
114
+ @apply glass-btn;
115
+ background: color-mix(in srgb, #f43f5e 45%, transparent);
116
+ border-color: color-mix(in srgb, #fb7185 45%, transparent);
117
+ color: #fecdd3;
118
+ }
119
+ .glass-btn-danger:hover {
120
+ background: color-mix(in srgb, #f43f5e 60%, transparent);
121
+ }
122
+
123
+ /* Small action buttons for tables / inline rows. */
124
+ .glass-chip-btn {
125
+ @apply inline-flex cursor-pointer items-center rounded-lg px-2.5 py-1 text-xs font-medium text-slate-300 transition-colors hover:brightness-110 hover:text-white;
126
+ background: color-mix(in srgb, var(--admin-blue) 13%, transparent);
127
+ border: 1px solid color-mix(in srgb, var(--admin-blue) 34%, transparent);
128
+ color: color-mix(in srgb, var(--admin-ink, #eef6ff) 84%, transparent);
129
+ }
130
+ .glass-chip-btn:hover {
131
+ background: color-mix(in srgb, var(--admin-blue) 22%, transparent);
132
+ }
133
+ .glass-chip-btn-danger {
134
+ @apply glass-chip-btn;
135
+ color: #fda4af;
136
+ background: color-mix(in srgb, #f43f5e 24%, transparent);
137
+ border-color: color-mix(in srgb, #fb7185 32%, transparent);
138
+ }
139
+ .glass-chip-btn-danger:hover {
140
+ background: color-mix(in srgb, #f43f5e 45%, transparent);
141
+ color: #ffe4e6;
142
+ }
143
+ .glass-chip-btn-primary {
144
+ @apply glass-chip-btn text-white;
145
+ background: linear-gradient(135deg, rgba(38, 130, 225, 0.55), rgba(90, 67, 183, 0.45));
146
+ border-color: color-mix(in srgb, var(--admin-blue) 48%, transparent);
147
+ box-shadow: 0 8px 24px color-mix(in srgb, var(--admin-blue) 17%, transparent);
148
+ font-weight: 700;
149
+ }
150
+ .glass-chip-btn-primary:hover {
151
+ background: linear-gradient(135deg, rgba(56, 150, 245, 0.65), rgba(110, 80, 205, 0.55));
152
+ color: #fff;
153
+ }
154
+
155
+ /* Navigation. */
156
+ .glass-nav {
157
+ @apply flex w-full cursor-pointer items-center gap-2.5 rounded-xl px-3 py-2 text-left text-sm text-slate-400 transition-colors hover:bg-white/10 hover:text-slate-100;
158
+ }
159
+ .glass-nav-active {
160
+ @apply glass-nav;
161
+ color: #fff;
162
+ background: linear-gradient(135deg, color-mix(in srgb, var(--admin-blue) 55%, transparent), color-mix(in srgb, var(--admin-violet) 45%, transparent));
163
+ border: 1px solid color-mix(in srgb, var(--admin-violet) 40%, transparent);
164
+ }
165
+
166
+ /* Tables. */
167
+ .glass-table {
168
+ @apply w-full text-sm;
169
+ }
170
+ .glass-table th {
171
+ @apply px-3 py-2 text-left text-xs font-semibold uppercase tracking-wider text-slate-500;
172
+ }
173
+ .glass-table td {
174
+ @apply border-t border-white/[0.06] px-3 py-2.5;
175
+ }
176
+ .glass-table tbody tr {
177
+ @apply transition-colors hover:bg-white/5;
178
+ }
179
+
180
+ /* Small pill/badge. */
181
+ .chip {
182
+ @apply inline-flex items-center rounded-full border border-white/10 px-2.5 py-0.5 text-xs font-medium text-slate-300;
183
+ background: rgba(255, 255, 255, 0.07);
184
+ }
185
+
186
+ /* Live status dot. */
187
+ .dot {
188
+ @apply inline-block h-2.5 w-2.5 rounded-full;
189
+ }
190
+ .dot-ok {
191
+ @apply dot bg-emerald-400 shadow-[0_0_12px_rgba(52,211,153,0.8)];
192
+ }
193
+ .dot-bad {
194
+ @apply dot bg-rose-500 shadow-[0_0_12px_rgba(244,63,94,0.7)];
195
+ }
196
+
197
+ /* Provider cards (AI Providers redesign). */
198
+ .provider-card {
199
+ display: flex;
200
+ flex-direction: column;
201
+ gap: 0.65rem;
202
+ padding: 0.95rem;
203
+ border: 1px solid rgba(112, 168, 228, 0.17);
204
+ border-color: hsl(var(--card-accent, 220 15% 40%) / 0.28);
205
+ border-radius: var(--admin-radius, 0.8rem);
206
+ background: rgba(8, 25, 48, 0.68);
207
+ box-shadow: inset 0 1px rgba(255, 255, 255, 0.04), 0 14px 42px rgba(0, 0, 0, 0.14);
208
+ backdrop-filter: blur(calc(var(--admin-glass, 0) * 20px));
209
+ -webkit-backdrop-filter: blur(calc(var(--admin-glass, 0) * 20px));
210
+ transition: border-color 150ms ease, box-shadow 150ms ease, transform 150ms ease;
211
+ }
212
+ .provider-card:hover { border-color: hsl(var(--card-accent, 220 15% 40%) / 0.5); }
213
+ .provider-card.is-on { --card-accent: 152 60% 45%; }
214
+ .provider-card.is-warn { --card-accent: 38 90% 50%; }
215
+ .provider-card.is-off { --card-accent: 220 15% 40%; }
216
+
217
+ /* Fade out → vanish → fade in when a provider is toggled. */
218
+ .provider-card.is-switch-out {
219
+ animation: provider-switch-out 0.28s cubic-bezier(0.4, 0, 0.6, 1) forwards;
220
+ }
221
+ .provider-card.is-switch-in {
222
+ animation: provider-switch-in 0.42s cubic-bezier(0.22, 1, 0.36, 1);
223
+ }
224
+ @keyframes provider-switch-out {
225
+ to { opacity: 0; transform: scale(0.94); filter: blur(1px); }
226
+ }
227
+ @keyframes provider-switch-in {
228
+ from { opacity: 0; transform: translateY(8px) scale(0.96); }
229
+ to { opacity: 1; transform: translateY(0) scale(1); }
230
+ }
231
+
232
+ .provider-avatar {
233
+ @apply flex h-9 w-9 shrink-0 items-center justify-center rounded-full text-sm font-semibold;
234
+ background: hsl(var(--avatar-hue, 220) 70% 45% / 0.25);
235
+ color: hsl(var(--avatar-hue, 220) 80% 80%);
236
+ border: 1px solid hsl(var(--avatar-hue, 220) 70% 55% / 0.35);
237
+ }
238
+
239
+ .provider-badge { @apply inline-flex items-center gap-1 rounded-full px-2.5 py-1 text-[10px] font-medium leading-none; }
240
+ .provider-badge-ok { @apply provider-badge bg-emerald-500/15 text-emerald-300 border border-emerald-500/25; }
241
+ .provider-badge-warn { @apply provider-badge bg-amber-500/15 text-amber-300 border border-amber-500/25; }
242
+ .provider-badge-mute { @apply provider-badge bg-slate-500/15 text-slate-400 border border-slate-500/20; }
243
+ .provider-badge-accent { @apply provider-badge bg-indigo-500/15 text-indigo-300 border border-indigo-500/25; }
244
+ .provider-badge-local { @apply provider-badge bg-cyan-500/15 text-cyan-300 border border-cyan-500/25; }
245
+
246
+ .provider-filter-bar {
247
+ display: flex;
248
+ flex-wrap: wrap;
249
+ align-items: center;
250
+ gap: 0.5rem;
251
+ position: sticky;
252
+ top: 0.5rem;
253
+ z-index: 10;
254
+ padding: 0.6rem 0.75rem;
255
+ border: 1px solid color-mix(in srgb, var(--admin-blue) 24%, transparent);
256
+ border-radius: 0.7rem;
257
+ background: rgba(7, 30, 58, 0.6);
258
+ backdrop-filter: blur(20px) saturate(135%);
259
+ -webkit-backdrop-filter: blur(20px) saturate(135%);
260
+ box-shadow: 0 0.75rem 1.75rem rgba(0, 0, 0, 0.35);
261
+ }
262
+
263
+ /* Keep the provider grid visible behind dialogs; the editor should not make
264
+ * the entire AI Providers page look empty or disappear. */
265
+ .provider-modal-backdrop {
266
+ @apply fixed inset-0 z-50 flex items-center justify-center;
267
+ background: rgba(2, 8, 18, 0.42);
268
+ backdrop-filter: blur(4px) saturate(0.6);
269
+ -webkit-backdrop-filter: blur(4px) saturate(0.6);
270
+ transition: opacity 0.22s ease, background-color 0.22s ease,
271
+ backdrop-filter 0.22s ease, -webkit-backdrop-filter 0.22s ease;
272
+ }
273
+ .provider-modal {
274
+ width: 100%;
275
+ max-width: 28rem;
276
+ margin-inline: 1rem;
277
+ padding: 1.25rem;
278
+ border: 1px solid rgba(92, 185, 255, 0.3);
279
+ border-radius: 0.75rem;
280
+ background: rgba(7, 30, 58, 0.52);
281
+ box-shadow: 0 1.2rem 2.8rem rgba(0, 0, 0, 0.55);
282
+ backdrop-filter: blur(20px) saturate(135%);
283
+ -webkit-backdrop-filter: blur(20px) saturate(135%);
284
+ animation: admin-pop 0.2s cubic-bezier(0.22, 1, 0.36, 1);
285
+ }
286
+
287
+ /* Large account/workspace settings dialog (Profile, Security, Project, About). */
288
+ .settings-dialog {
289
+ display: flex;
290
+ flex-direction: column;
291
+ width: min(720px, 94vw);
292
+ max-height: min(85vh, 760px);
293
+ margin-inline: 1rem;
294
+ border: 1px solid rgba(112, 168, 228, 0.2);
295
+ border-radius: 0.6rem;
296
+ background: rgba(9, 22, 43, 0.92);
297
+ box-shadow: 0 1.2rem 2.8rem rgba(0, 0, 0, 0.55);
298
+ backdrop-filter: blur(20px) saturate(135%);
299
+ -webkit-backdrop-filter: blur(20px) saturate(135%);
300
+ animation: admin-pop 0.2s cubic-bezier(0.22, 1, 0.36, 1);
301
+ }
302
+ .settings-header {
303
+ display: flex;
304
+ align-items: flex-start;
305
+ justify-content: space-between;
306
+ gap: 1rem;
307
+ padding: 1.1rem 1.25rem 0.9rem;
308
+ border-bottom: 1px solid rgba(112, 168, 228, 0.14);
309
+ }
310
+ .settings-header h3 {
311
+ margin: 0.15rem 0 0;
312
+ color: var(--admin-ink, #eef6ff);
313
+ font-size: 1rem;
314
+ font-weight: 700;
315
+ }
316
+ .settings-body {
317
+ display: flex;
318
+ flex-direction: column;
319
+ gap: 0.9rem;
320
+ padding: 1rem 1.25rem 1.25rem;
321
+ overflow-y: auto;
322
+ }
323
+ .settings-section {
324
+ border: 1px solid rgba(112, 168, 228, 0.14);
325
+ border-radius: 0.6rem;
326
+ background: rgba(10, 24, 45, 0.5);
327
+ padding: 0.9rem 1rem;
328
+ }
329
+ .settings-section h4 {
330
+ margin: 0 0 0.15rem;
331
+ color: var(--admin-ink, #eef6ff);
332
+ font-size: 0.72rem;
333
+ font-weight: 700;
334
+ letter-spacing: 0.04em;
335
+ }
336
+ .settings-desc {
337
+ margin: 0 0 0.8rem;
338
+ color: #6f89a7;
339
+ font-size: 0.62rem;
340
+ line-height: 1.5;
341
+ }
342
+ .settings-row {
343
+ display: grid;
344
+ grid-template-columns: 1fr 1fr;
345
+ gap: 0.75rem;
346
+ }
347
+ .settings-row:not(:last-child) {
348
+ margin-bottom: 0.75rem;
349
+ }
350
+ .settings-field {
351
+ display: flex;
352
+ flex-direction: column;
353
+ gap: 0.3rem;
354
+ }
355
+ .settings-field .admin-overline {
356
+ margin: 0;
357
+ }
358
+ .settings-field .glass-input[readonly] {
359
+ color: #6f89a7;
360
+ background: rgba(255, 255, 255, 0.03);
361
+ cursor: default;
362
+ }
363
+ .settings-actions {
364
+ display: flex;
365
+ justify-content: flex-end;
366
+ margin-top: 0.8rem;
367
+ }
368
+ .settings-status {
369
+ margin-top: 0.7rem;
370
+ padding: 0.45rem 0.65rem;
371
+ border-radius: 0.45rem;
372
+ border: 1px solid;
373
+ font-size: 0.62rem;
374
+ }
375
+ .settings-status.ok {
376
+ border-color: rgba(52, 211, 153, 0.3);
377
+ background: rgba(16, 185, 129, 0.1);
378
+ color: #6ee7b7;
379
+ }
380
+ .settings-status.err {
381
+ border-color: rgba(251, 113, 133, 0.3);
382
+ background: rgba(244, 63, 94, 0.1);
383
+ color: #fda4af;
384
+ }
385
+ .settings-facts {
386
+ display: grid;
387
+ grid-template-columns: repeat(2, minmax(0, 1fr));
388
+ gap: 0.5rem 1rem;
389
+ }
390
+ .settings-facts div {
391
+ display: flex;
392
+ flex-direction: column;
393
+ gap: 0.1rem;
394
+ min-width: 0;
395
+ }
396
+ .settings-facts span {
397
+ color: #6f89a7;
398
+ font-size: 0.5rem;
399
+ letter-spacing: 0.08em;
400
+ }
401
+ .settings-facts b {
402
+ overflow: hidden;
403
+ color: #cfe3fb;
404
+ font-size: 0.66rem;
405
+ font-weight: 600;
406
+ text-overflow: ellipsis;
407
+ white-space: nowrap;
408
+ }
409
+ .settings-package {
410
+ margin-top: 0.9rem;
411
+ padding-top: 0.9rem;
412
+ border-top: 1px solid rgba(112, 168, 228, 0.14);
413
+ }
414
+ @media (max-width: 560px) {
415
+ .settings-row {
416
+ grid-template-columns: 1fr;
417
+ }
418
+ .settings-facts {
419
+ grid-template-columns: 1fr;
420
+ }
421
+ }
422
+ }
423
+
424
+ /* Aurora workspace shell inspired by the supplied desktop reference. */
425
+ :root {
426
+ --admin-bg: #040b18;
427
+ --admin-surface: rgba(10, 24, 45, 0.78);
428
+ --admin-surface-strong: rgba(12, 29, 54, 0.94);
429
+ --admin-border: rgba(125, 174, 235, 0.2);
430
+ --admin-border-bright: rgba(82, 160, 255, 0.55);
431
+ --admin-ink: #edf6ff;
432
+ --admin-muted: #849ab7;
433
+ --admin-blue: #54b7ff;
434
+ --admin-violet: #9f7bff;
435
+ --admin-pink: #f36eb8;
436
+ }
437
+
438
+ html,
439
+ body,
440
+ #root {
441
+ min-height: 100%;
442
+ }
443
+
444
+ body {
445
+ min-width: 320px;
446
+ overflow-x: hidden;
447
+ background: var(--admin-bg);
448
+ }
449
+
450
+ button,
451
+ input,
452
+ textarea,
453
+ select {
454
+ font: inherit;
455
+ }
456
+
457
+ button {
458
+ cursor: pointer;
459
+ }
460
+
461
+ .bg-mesh {
462
+ background:
463
+ radial-gradient(50rem 34rem at 56% -12%, rgba(27, 93, 184, 0.28), transparent 72%),
464
+ radial-gradient(35rem 30rem at 0% 88%, rgba(7, 106, 170, 0.22), transparent 72%),
465
+ radial-gradient(32rem 30rem at 96% 70%, rgba(105, 47, 190, 0.14), transparent 72%),
466
+ linear-gradient(135deg, #030915 0%, #071326 52%, #040a16 100%);
467
+ background-attachment: fixed;
468
+ }
469
+
470
+ .admin-shell {
471
+ --admin-mesh: 0.32;
472
+ --admin-glass: 0;
473
+ --admin-radius: 13px;
474
+ display: flex;
475
+ width: var(--admin-shell-width, 80vw);
476
+ max-width: 100vw;
477
+ min-height: 100vh;
478
+ margin: 0 auto;
479
+ color: var(--admin-ink);
480
+ isolation: isolate;
481
+ }
482
+
483
+ .admin-shell .workspace-panel,
484
+ .admin-shell .glass-card,
485
+ .admin-shell .role-box,
486
+ .admin-shell .overview-stat {
487
+ border-radius: var(--admin-radius, 0.8rem);
488
+ backdrop-filter: blur(calc(var(--admin-glass, 0) * 20px));
489
+ -webkit-backdrop-filter: blur(calc(var(--admin-glass, 0) * 20px));
490
+ }
491
+ .admin-shell .glass-card,
492
+ .admin-shell .role-box,
493
+ .admin-shell .overview-stat {
494
+ transition: border-color 150ms ease, box-shadow 150ms ease, transform 150ms ease;
495
+ }
496
+
497
+ .admin-particles {
498
+ position: fixed;
499
+ inset: 0;
500
+ z-index: 0;
501
+ overflow: hidden;
502
+ pointer-events: none;
503
+ }
504
+ .admin-particles i {
505
+ position: absolute;
506
+ bottom: -3rem;
507
+ width: var(--s, 6px);
508
+ height: var(--s, 6px);
509
+ border-radius: 50%;
510
+ background: radial-gradient(circle, rgba(130, 208, 255, 0.95), rgba(130, 208, 255, 0) 72%);
511
+ opacity: 0;
512
+ animation: admin-float var(--d, 24s) linear infinite;
513
+ }
514
+
515
+ @keyframes admin-float {
516
+ 0% { transform: translateY(0) translateX(0) scale(0.6); opacity: 0; }
517
+ 10% { opacity: var(--o, 0.7); }
518
+ 50% { transform: translateY(-52vh) translateX(var(--dx, 20px)) scale(1); }
519
+ 90% { opacity: var(--o, 0.7); }
520
+ 100% { transform: translateY(-108vh) translateX(var(--dx2, -20px)) scale(0.6); opacity: 0; }
521
+ }
522
+ @media (prefers-reduced-motion: reduce) {
523
+ .admin-particles { opacity: 0 !important; }
524
+ }
525
+
526
+ .admin-login {
527
+ position: relative;
528
+ overflow: hidden;
529
+ }
530
+
531
+ .admin-boot {
532
+ min-height: 100vh;
533
+ display: flex;
534
+ align-items: center;
535
+ justify-content: center;
536
+ color: var(--admin-muted, #98aec9);
537
+ }
538
+
539
+ .admin-login::before,
540
+ .admin-login::after {
541
+ position: absolute;
542
+ width: 38rem;
543
+ height: 15rem;
544
+ border: 1px solid rgba(78, 172, 255, 0.18);
545
+ border-radius: 50%;
546
+ content: "";
547
+ transform: rotate(-24deg);
548
+ }
549
+
550
+ .admin-login::before { top: 10%; left: -14rem; box-shadow: 0 0 80px rgba(32, 140, 255, 0.12); }
551
+ .admin-login::after { right: -13rem; bottom: 12%; border-color: rgba(178, 104, 255, 0.2); transform: rotate(24deg); }
552
+
553
+ .admin-login-card {
554
+ position: relative;
555
+ z-index: 1;
556
+ border-color: rgba(84, 183, 255, 0.3);
557
+ background: linear-gradient(145deg, rgba(13, 35, 67, 0.87), rgba(10, 17, 40, 0.88));
558
+ box-shadow: 0 1.2rem 2.8rem rgba(0, 0, 0, 0.55);
559
+ }
560
+
561
+ .admin-login.theme-midnight .admin-login-card {
562
+ border-color: rgba(120, 191, 255, 0.28);
563
+ background: linear-gradient(145deg, rgba(15, 29, 51, 0.92), rgba(6, 12, 24, 0.92));
564
+ box-shadow: 0 1.2rem 2.8rem rgba(0, 0, 0, 0.55);
565
+ }
566
+ .admin-login.theme-midnight {
567
+ background: radial-gradient(45rem 34rem at 55% -15%, rgba(51, 93, 137, 0.28), transparent 72%), linear-gradient(135deg, #02050b, #07111f 54%, #030711);
568
+ background-attachment: fixed;
569
+ }
570
+ .admin-login.theme-violet .admin-login-card {
571
+ border-color: rgba(198, 140, 255, 0.32);
572
+ background: linear-gradient(145deg, rgba(37, 22, 74, 0.9), rgba(19, 10, 42, 0.92));
573
+ box-shadow: 0 1.2rem 2.8rem rgba(0, 0, 0, 0.55);
574
+ }
575
+ .admin-login.theme-violet {
576
+ background: radial-gradient(48rem 34rem at 60% -12%, rgba(117, 58, 194, 0.36), transparent 72%), radial-gradient(35rem 28rem at 0% 85%, rgba(53, 65, 176, 0.26), transparent 72%), #0b071b;
577
+ background-attachment: fixed;
578
+ }
579
+
580
+ .admin-login .glass-input {
581
+ border-color: rgba(125, 174, 235, 0.22);
582
+ background: rgba(255, 255, 255, 0.05);
583
+ }
584
+ .admin-login .glass-input:focus {
585
+ border-color: var(--admin-blue);
586
+ background: rgba(255, 255, 255, 0.08);
587
+ box-shadow: 0 0 0 2px color-mix(in srgb, var(--admin-blue) 30%, transparent);
588
+ }
589
+ .admin-login .glass-btn-primary {
590
+ background: linear-gradient(135deg, color-mix(in srgb, var(--admin-blue) 78%, #00000000), color-mix(in srgb, var(--admin-violet) 72%, #00000000));
591
+ border-color: color-mix(in srgb, var(--admin-violet) 55%, transparent);
592
+ box-shadow: 0 6px 24px -6px color-mix(in srgb, var(--admin-blue) 60%, transparent);
593
+ }
594
+ .admin-login .glass-btn-primary:hover {
595
+ background: linear-gradient(135deg, color-mix(in srgb, var(--admin-blue) 90%, #00000000), color-mix(in srgb, var(--admin-violet) 85%, #00000000));
596
+ }
597
+ .admin-login .brand-text {
598
+ background-image: linear-gradient(90deg, color-mix(in srgb, var(--admin-blue) 80%, white), color-mix(in srgb, var(--admin-violet) 80%, white) 60%, color-mix(in srgb, var(--admin-pink) 80%, white));
599
+ }
600
+
601
+ .admin-shell::before {
602
+ position: fixed;
603
+ inset: 0;
604
+ z-index: -1;
605
+ pointer-events: none;
606
+ content: "";
607
+ opacity: var(--admin-mesh-opacity, 0.3);
608
+ background-image: linear-gradient(rgba(95, 164, 241, 0.045) 1px, transparent 1px), linear-gradient(90deg, rgba(95, 164, 241, 0.045) 1px, transparent 1px);
609
+ background-size: 48px 48px;
610
+ mask-image: linear-gradient(to bottom, black, transparent 78%);
611
+ }
612
+
613
+ .admin-sidebar {
614
+ position: sticky;
615
+ top: 0;
616
+ display: flex;
617
+ flex: 0 0 246px;
618
+ flex-direction: column;
619
+ min-height: 100vh;
620
+ padding: 1.35rem 1rem;
621
+ border-right: 1px solid rgba(112, 168, 228, 0.16);
622
+ background: rgba(3, 12, 27, 0.74);
623
+ backdrop-filter: blur(24px);
624
+ }
625
+
626
+ .admin-brand {
627
+ display: flex;
628
+ align-items: center;
629
+ gap: 0.65rem;
630
+ padding: 0.3rem 0.5rem 1.25rem;
631
+ }
632
+
633
+ .admin-brand img {
634
+ width: 34px;
635
+ height: 34px;
636
+ filter: drop-shadow(0 0 12px rgba(68, 165, 255, 0.45));
637
+ }
638
+
639
+ .admin-brand div {
640
+ display: flex;
641
+ flex-direction: column;
642
+ gap: 0.12rem;
643
+ }
644
+
645
+ .admin-brand strong {
646
+ color: #f1f8ff;
647
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
648
+ font-size: 0.86rem;
649
+ letter-spacing: 0.17em;
650
+ }
651
+
652
+ .admin-brand span,
653
+ .admin-project-card > span:last-child {
654
+ color: var(--admin-muted);
655
+ font-size: 0.62rem;
656
+ }
657
+
658
+ .admin-close-mobile,
659
+ .admin-mobile-menu {
660
+ display: none;
661
+ }
662
+
663
+ .admin-project-card,
664
+ .admin-side-widget {
665
+ padding: 0.85rem;
666
+ border: 1px solid rgba(105, 171, 245, 0.2);
667
+ border-radius: 0.8rem;
668
+ background: linear-gradient(145deg, rgba(29, 82, 143, 0.26), rgba(8, 25, 51, 0.42));
669
+ box-shadow: inset 0 1px rgba(255, 255, 255, 0.06), 0 14px 35px rgba(0, 0, 0, 0.16);
670
+ }
671
+
672
+ .admin-project-card {
673
+ display: flex;
674
+ flex-direction: column;
675
+ gap: 0.35rem;
676
+ margin-bottom: 1.3rem;
677
+ }
678
+
679
+ .admin-project-card strong {
680
+ overflow: hidden;
681
+ color: #f1f8ff;
682
+ font-size: 0.79rem;
683
+ text-overflow: ellipsis;
684
+ white-space: nowrap;
685
+ }
686
+
687
+ .admin-project-db {
688
+ overflow: hidden;
689
+ color: var(--admin-muted);
690
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
691
+ font-size: 0.62rem;
692
+ font-style: normal;
693
+ text-overflow: ellipsis;
694
+ white-space: nowrap;
695
+ }
696
+
697
+ .admin-project-card span:last-child {
698
+ display: flex;
699
+ align-items: center;
700
+ gap: 0.35rem;
701
+ }
702
+
703
+ .admin-overline {
704
+ color: #63bdff;
705
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
706
+ font-size: 0.57rem;
707
+ font-weight: 700;
708
+ letter-spacing: 0.13em;
709
+ }
710
+
711
+ .status-dot {
712
+ display: inline-block;
713
+ width: 0.44rem;
714
+ height: 0.44rem;
715
+ border-radius: 50%;
716
+ }
717
+
718
+ .status-dot.good {
719
+ background: #5ef0b3;
720
+ box-shadow: 0 0 10px rgba(94, 240, 179, 0.9);
721
+ }
722
+
723
+ .admin-nav-label {
724
+ margin: 0.8rem 0 0.45rem 0.55rem;
725
+ color: #536c8c;
726
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
727
+ font-size: 0.56rem;
728
+ letter-spacing: 0.16em;
729
+ text-transform: uppercase;
730
+ }
731
+
732
+ .admin-nav {
733
+ display: flex;
734
+ flex-direction: column;
735
+ gap: 0.2rem;
736
+ }
737
+
738
+ .admin-nav button {
739
+ display: flex;
740
+ align-items: center;
741
+ gap: 0.65rem;
742
+ width: 100%;
743
+ padding: 0.63rem 0.65rem;
744
+ border: 1px solid transparent;
745
+ border-radius: 0.58rem;
746
+ color: #849bb6;
747
+ background: transparent;
748
+ text-align: left;
749
+ font-size: 0.7rem;
750
+ transition: 160ms ease;
751
+ }
752
+
753
+ .admin-nav button:hover,
754
+ .admin-nav button.is-active {
755
+ border-color: rgba(74, 166, 255, 0.29);
756
+ color: #e9f7ff;
757
+ background: linear-gradient(90deg, rgba(40, 137, 235, 0.22), rgba(76, 83, 212, 0.12));
758
+ box-shadow: inset 3px 0 #55b9ff, 0 8px 24px rgba(26, 91, 175, 0.1);
759
+ }
760
+
761
+ .admin-nav-icon {
762
+ display: grid;
763
+ width: 1.15rem;
764
+ place-items: center;
765
+ color: #62bfff;
766
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
767
+ font-size: 0.74rem;
768
+ }
769
+
770
+ .admin-nav button b {
771
+ margin-left: auto;
772
+ color: #f18ac6;
773
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
774
+ font-size: 0.46rem;
775
+ }
776
+
777
+ .admin-side-widget {
778
+ margin-top: auto;
779
+ margin-bottom: 1rem;
780
+ }
781
+
782
+ .admin-inspector .admin-side-widget {
783
+ margin-top: 1rem;
784
+ }
785
+
786
+ .admin-widget-heading,
787
+ .load-line {
788
+ display: flex;
789
+ align-items: center;
790
+ }
791
+
792
+ .admin-widget-heading {
793
+ justify-content: space-between;
794
+ margin-bottom: 0.8rem;
795
+ color: #6b84a3;
796
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
797
+ font-size: 0.55rem;
798
+ letter-spacing: 0.1em;
799
+ }
800
+
801
+ .admin-widget-heading b {
802
+ color: #5ef0b3;
803
+ font-size: 0.48rem;
804
+ }
805
+
806
+ .load-line {
807
+ gap: 0.45rem;
808
+ margin-top: 0.55rem;
809
+ color: #7892b1;
810
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
811
+ font-size: 0.55rem;
812
+ }
813
+
814
+ .load-line > span {
815
+ width: 1.8rem;
816
+ }
817
+
818
+ .load-line i {
819
+ flex: 1;
820
+ height: 0.25rem;
821
+ overflow: hidden;
822
+ border-radius: 999px;
823
+ background: rgba(126, 169, 215, 0.18);
824
+ }
825
+
826
+ .load-line i b {
827
+ display: block;
828
+ height: 100%;
829
+ border-radius: inherit;
830
+ background: linear-gradient(90deg, #3f9bff, #6cd9ff);
831
+ box-shadow: 0 0 9px rgba(84, 183, 255, 0.75);
832
+ }
833
+
834
+ .load-line i b.violet {
835
+ background: linear-gradient(90deg, #8373ff, #c186ff);
836
+ box-shadow: 0 0 9px rgba(159, 123, 255, 0.75);
837
+ }
838
+
839
+ .load-line strong {
840
+ width: 1.9rem;
841
+ color: #b4c9e3;
842
+ font-size: 0.55rem;
843
+ font-weight: 500;
844
+ text-align: right;
845
+ }
846
+
847
+ .admin-signout {
848
+ padding: 0.65rem;
849
+ border: 0;
850
+ color: #7590ae;
851
+ background: transparent;
852
+ text-align: left;
853
+ font-size: 0.68rem;
854
+ }
855
+
856
+ .admin-signout:hover {
857
+ color: #ff8bbd;
858
+ }
859
+
860
+ .admin-signout span {
861
+ margin-right: 0.42rem;
862
+ color: #f285bb;
863
+ }
864
+
865
+ .admin-main-shell {
866
+ position: relative;
867
+ min-width: 0;
868
+ flex: 1;
869
+ }
870
+
871
+ .admin-topbar {
872
+ position: relative;
873
+ z-index: 10;
874
+ display: flex;
875
+ align-items: center;
876
+ gap: 1.25rem;
877
+ min-height: 66px;
878
+ padding: 0 1.65rem;
879
+ border-bottom: 1px solid rgba(112, 168, 228, 0.15);
880
+ background: rgba(4, 14, 29, 0.62);
881
+ backdrop-filter: blur(24px);
882
+ }
883
+
884
+ .admin-window-tab {
885
+ display: flex;
886
+ align-items: center;
887
+ gap: 0.55rem;
888
+ align-self: stretch;
889
+ min-width: 170px;
890
+ padding: 0 1.2rem;
891
+ border-right: 1px solid rgba(112, 168, 228, 0.12);
892
+ border-bottom: 2px solid #56baff;
893
+ color: #edf7ff;
894
+ font-size: 0.72rem;
895
+ }
896
+
897
+ .window-tab-mark {
898
+ color: #63c5ff;
899
+ font-size: 0.86rem;
900
+ }
901
+
902
+ .window-tab-close {
903
+ margin-left: auto;
904
+ color: #7490ad;
905
+ font-size: 1rem;
906
+ }
907
+
908
+ .admin-search {
909
+ display: flex;
910
+ align-items: center;
911
+ gap: 0.55rem;
912
+ width: min(370px, 32vw);
913
+ padding: 0.53rem 0.7rem;
914
+ border: 1px solid rgba(112, 168, 228, 0.16);
915
+ border-radius: 0.5rem;
916
+ color: #6e87a5;
917
+ background: rgba(20, 46, 79, 0.32);
918
+ cursor: pointer;
919
+ transition: border-color 150ms ease, background 150ms ease;
920
+ }
921
+ .admin-search:hover { border-color: rgba(112, 168, 228, 0.32); background: rgba(20, 46, 79, 0.45); }
922
+
923
+ .admin-search input {
924
+ min-width: 0;
925
+ flex: 1;
926
+ border: 0;
927
+ outline: 0;
928
+ color: #e5f4ff;
929
+ background: transparent;
930
+ font-size: 0.68rem;
931
+ cursor: pointer;
932
+ }
933
+ .admin-search input:focus { cursor: text; }
934
+
935
+ .admin-search kbd {
936
+ color: #6884a3;
937
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
938
+ font-size: 0.52rem;
939
+ }
940
+
941
+ .admin-search {
942
+ position: relative;
943
+ }
944
+
945
+ .admin-search-results {
946
+ position: absolute;
947
+ top: calc(100% + 0.45rem);
948
+ left: 0;
949
+ right: 0;
950
+ z-index: 9999;
951
+ display: flex;
952
+ flex-direction: column;
953
+ padding: 0.35rem;
954
+ border: 1px solid rgba(112, 168, 228, 0.2);
955
+ border-radius: 0.6rem;
956
+ background: rgba(9, 22, 43, 0.92);
957
+ backdrop-filter: blur(20px) saturate(135%);
958
+ box-shadow: 0 1.2rem 2.8rem rgba(0, 0, 0, 0.55);
959
+ overflow: hidden;
960
+ }
961
+
962
+ .admin-search-results button {
963
+ display: flex;
964
+ align-items: center;
965
+ gap: 0.6rem;
966
+ width: 100%;
967
+ padding: 0.5rem 0.6rem;
968
+ border: 0;
969
+ border-radius: 0.45rem;
970
+ color: #dcecff;
971
+ background: transparent;
972
+ font-size: 0.7rem;
973
+ text-align: left;
974
+ cursor: pointer;
975
+ }
976
+
977
+ .admin-search-results button:hover,
978
+ .admin-search-results button.is-active {
979
+ color: #eef8ff;
980
+ background: rgba(84, 183, 255, 0.14);
981
+ }
982
+
983
+ .admin-search-result-icon {
984
+ display: grid;
985
+ place-items: center;
986
+ width: 1.4rem;
987
+ height: 1.4rem;
988
+ border-radius: 0.35rem;
989
+ color: #8fb8e4;
990
+ background: rgba(84, 183, 255, 0.1);
991
+ font-size: 0.6rem;
992
+ }
993
+
994
+ .admin-search-empty {
995
+ padding: 0.7rem 0.6rem;
996
+ color: #6e87a5;
997
+ font-size: 0.68rem;
998
+ }
999
+
1000
+ .admin-top-actions {
1001
+ position: relative;
1002
+ display: flex;
1003
+ align-items: center;
1004
+ gap: 0.8rem;
1005
+ margin-left: auto;
1006
+ }
1007
+
1008
+ .top-live {
1009
+ display: flex;
1010
+ align-items: center;
1011
+ gap: 0.38rem;
1012
+ color: #7893b1;
1013
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
1014
+ font-size: 0.56rem;
1015
+ }
1016
+
1017
+ .admin-mobile-search {
1018
+ display: none;
1019
+ place-items: center;
1020
+ width: 30px;
1021
+ height: 30px;
1022
+ border: 1px solid rgba(112, 168, 228, 0.2);
1023
+ border-radius: 0.5rem;
1024
+ color: #9bb4d0;
1025
+ background: rgba(25, 57, 95, 0.34);
1026
+ font-size: 0.78rem;
1027
+ cursor: pointer;
1028
+ }
1029
+ .admin-mobile-search:hover { color: #fff; background: rgba(71, 161, 247, 0.2); }
1030
+
1031
+
1032
+ .admin-icon-button,
1033
+ .admin-user-avatar {
1034
+ position: relative;
1035
+ display: grid;
1036
+ place-items: center;
1037
+ border: 1px solid rgba(112, 168, 228, 0.2);
1038
+ border-radius: 0.5rem;
1039
+ color: #9bb4d0;
1040
+ background: rgba(25, 57, 95, 0.34);
1041
+ }
1042
+
1043
+ .admin-icon-button {
1044
+ width: 30px;
1045
+ height: 30px;
1046
+ }
1047
+
1048
+ .admin-icon-button.is-active {
1049
+ color: #a9ddff;
1050
+ background: rgba(64, 140, 219, 0.4);
1051
+ border-color: rgba(100, 200, 255, 0.65);
1052
+ box-shadow: 0 0 12px rgba(100, 200, 255, 0.35);
1053
+ }
1054
+
1055
+ .admin-icon-button b {
1056
+ position: absolute;
1057
+ top: -4px;
1058
+ right: -4px;
1059
+ display: grid;
1060
+ width: 13px;
1061
+ height: 13px;
1062
+ place-items: center;
1063
+ border-radius: 50%;
1064
+ color: #071426;
1065
+ background: #64c8ff;
1066
+ font-size: 0.47rem;
1067
+ }
1068
+
1069
+ .admin-user-avatar {
1070
+ width: 31px;
1071
+ height: 31px;
1072
+ border-color: rgba(84, 183, 255, 0.52);
1073
+ color: white;
1074
+ background: linear-gradient(135deg, #2767a6, #7544a7);
1075
+ font-size: 0.58rem;
1076
+ font-weight: 700;
1077
+ }
1078
+
1079
+ .admin-breadcrumb {
1080
+ display: flex;
1081
+ align-items: center;
1082
+ gap: 0.7rem;
1083
+ min-height: 50px;
1084
+ padding: 0 1.8rem;
1085
+ border-bottom: 1px solid rgba(112, 168, 228, 0.12);
1086
+ color: #6c85a3;
1087
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
1088
+ font-size: 0.58rem;
1089
+ }
1090
+
1091
+ .admin-breadcrumb strong {
1092
+ color: #d9ebfc;
1093
+ font-weight: 600;
1094
+ }
1095
+
1096
+ .admin-breadcrumb b {
1097
+ color: #47749d;
1098
+ font-size: 0.86rem;
1099
+ }
1100
+
1101
+ .admin-breadcrumb button {
1102
+ margin-left: auto;
1103
+ border: 0;
1104
+ color: #7894b2;
1105
+ background: transparent;
1106
+ font-size: 1rem;
1107
+ }
1108
+
1109
+ .admin-content-layout {
1110
+ display: grid;
1111
+ grid-template-columns: minmax(0, 1fr) 272px;
1112
+ min-height: calc(100vh - 116px);
1113
+ }
1114
+
1115
+ .admin-content {
1116
+ min-width: 0;
1117
+ padding: 2rem 2rem 5.5rem;
1118
+ }
1119
+
1120
+ .admin-inspector {
1121
+ padding: 1.25rem 1rem 5rem;
1122
+ border-left: 1px solid rgba(112, 168, 228, 0.13);
1123
+ background: rgba(4, 15, 31, 0.4);
1124
+ }
1125
+
1126
+ .inspector-heading,
1127
+ .panel-title-row,
1128
+ .section-heading,
1129
+ .config-footer,
1130
+ .heading-actions {
1131
+ display: flex;
1132
+ align-items: center;
1133
+ justify-content: space-between;
1134
+ gap: 1rem;
1135
+ }
1136
+
1137
+ .inspector-heading {
1138
+ color: #6e8aaa;
1139
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
1140
+ font-size: 0.55rem;
1141
+ letter-spacing: 0.12em;
1142
+ }
1143
+
1144
+ .inspector-heading button {
1145
+ border: 0;
1146
+ color: #6e8aaa;
1147
+ background: transparent;
1148
+ font-size: 1rem;
1149
+ }
1150
+
1151
+ .inspector-preview {
1152
+ display: flex;
1153
+ flex-direction: column;
1154
+ align-items: center;
1155
+ gap: 0.3rem;
1156
+ margin: 1rem 0;
1157
+ padding: 1.4rem 0.8rem 1rem;
1158
+ border: 1px solid rgba(88, 162, 244, 0.2);
1159
+ border-radius: 0.75rem;
1160
+ background: linear-gradient(145deg, rgba(17, 50, 91, 0.42), rgba(18, 17, 52, 0.34));
1161
+ text-align: center;
1162
+ }
1163
+
1164
+ .inspector-preview strong {
1165
+ margin-top: 0.6rem;
1166
+ color: #eff8ff;
1167
+ font-size: 0.82rem;
1168
+ }
1169
+
1170
+ .inspector-preview > span:last-child {
1171
+ color: #7891ad;
1172
+ font-size: 0.59rem;
1173
+ }
1174
+
1175
+ .preview-orbit,
1176
+ .hero-orbit-art {
1177
+ position: relative;
1178
+ display: grid;
1179
+ place-items: center;
1180
+ border: 1px solid rgba(84, 183, 255, 0.3);
1181
+ border-radius: 50%;
1182
+ background: radial-gradient(circle, rgba(57, 170, 255, 0.25), rgba(56, 58, 179, 0.12) 43%, transparent 68%);
1183
+ box-shadow: 0 0 32px rgba(58, 149, 255, 0.18), inset 0 0 24px rgba(94, 119, 255, 0.12);
1184
+ }
1185
+
1186
+ .preview-orbit {
1187
+ width: 78px;
1188
+ height: 78px;
1189
+ }
1190
+
1191
+ .preview-orbit::before,
1192
+ .hero-orbit-art::before {
1193
+ position: absolute;
1194
+ width: 72%;
1195
+ height: 28%;
1196
+ border: 1px solid rgba(112, 206, 255, 0.65);
1197
+ border-radius: 50%;
1198
+ content: "";
1199
+ transform: rotate(-28deg);
1200
+ }
1201
+
1202
+ .preview-orbit::after,
1203
+ .hero-orbit-art::after {
1204
+ position: absolute;
1205
+ width: 62%;
1206
+ height: 24%;
1207
+ border: 1px solid rgba(178, 113, 255, 0.55);
1208
+ border-radius: 50%;
1209
+ content: "";
1210
+ transform: rotate(42deg);
1211
+ }
1212
+
1213
+ .preview-orbit span,
1214
+ .preview-orbit i,
1215
+ .preview-orbit b,
1216
+ .hero-orbit-art span,
1217
+ .hero-orbit-art i,
1218
+ .hero-orbit-art b {
1219
+ position: absolute;
1220
+ width: 5px;
1221
+ height: 5px;
1222
+ border-radius: 50%;
1223
+ background: #64d2ff;
1224
+ box-shadow: 0 0 10px #64d2ff;
1225
+ }
1226
+
1227
+ .preview-orbit span { top: 13px; right: 15px; }
1228
+ .preview-orbit i { bottom: 16px; left: 12px; background: #c17cff; box-shadow: 0 0 10px #c17cff; }
1229
+ .preview-orbit b { right: 9px; bottom: 22px; width: 3px; height: 3px; background: #5ef0b3; box-shadow: 0 0 8px #5ef0b3; }
1230
+
1231
+ .inspector-tabs {
1232
+ display: flex;
1233
+ gap: 1.15rem;
1234
+ padding: 0.2rem 0.2rem 0.7rem;
1235
+ border-bottom: 1px solid rgba(112, 168, 228, 0.13);
1236
+ color: #718ba9;
1237
+ font-size: 0.61rem;
1238
+ }
1239
+
1240
+ .inspector-tabs b {
1241
+ padding-bottom: 0.65rem;
1242
+ margin-bottom: -0.7rem;
1243
+ border-bottom: 2px solid #5cbaff;
1244
+ color: #eef8ff;
1245
+ font-weight: 600;
1246
+ }
1247
+
1248
+ .inspector-card {
1249
+ margin-top: 0.75rem;
1250
+ padding: 0.85rem;
1251
+ border: 1px solid rgba(112, 168, 228, 0.12);
1252
+ border-radius: 0.7rem;
1253
+ background: rgba(17, 42, 73, 0.32);
1254
+ }
1255
+
1256
+ .inspector-card strong {
1257
+ display: block;
1258
+ margin: 0.45rem 0 0.35rem;
1259
+ color: #e9f6ff;
1260
+ font-size: 0.78rem;
1261
+ }
1262
+
1263
+ .inspector-card p {
1264
+ margin: 0;
1265
+ color: #829ab5;
1266
+ font-size: 0.62rem;
1267
+ line-height: 1.6;
1268
+ }
1269
+
1270
+ .inspector-list {
1271
+ display: flex;
1272
+ flex-direction: column;
1273
+ gap: 0.3rem;
1274
+ }
1275
+
1276
+ .inspector-list button {
1277
+ display: flex;
1278
+ justify-content: space-between;
1279
+ padding: 0.42rem 0;
1280
+ border: 0;
1281
+ border-bottom: 1px solid rgba(112, 168, 228, 0.08);
1282
+ color: #a6bfd8;
1283
+ background: transparent;
1284
+ text-align: left;
1285
+ font-size: 0.64rem;
1286
+ }
1287
+
1288
+ .inspector-list button:last-child { border-bottom: 0; }
1289
+ .inspector-list button b { color: #58baff; }
1290
+
1291
+ .workspace-action {
1292
+ display: inline-flex;
1293
+ align-items: center;
1294
+ justify-content: center;
1295
+ gap: 0.55rem;
1296
+ padding: 0.62rem 0.85rem;
1297
+ border: 1px solid color-mix(in srgb, var(--admin-blue) 48%, transparent);
1298
+ border-radius: 0.5rem;
1299
+ color: #f0f9ff;
1300
+ background: linear-gradient(135deg, rgba(38, 130, 225, 0.55), rgba(90, 67, 183, 0.45));
1301
+ box-shadow: 0 8px 24px color-mix(in srgb, var(--admin-blue) 17%, transparent);
1302
+ font-size: 0.63rem;
1303
+ font-weight: 700;
1304
+ transition: 160ms ease;
1305
+ }
1306
+
1307
+ .workspace-action:hover { transform: translateY(-1px); filter: brightness(1.12); }
1308
+
1309
+ .workspace-action {
1310
+ padding: 0.5rem 0.7rem;
1311
+ color: color-mix(in srgb, var(--admin-ink, #eef6ff) 86%, transparent);
1312
+ background: color-mix(in srgb, var(--admin-blue) 15%, transparent);
1313
+ box-shadow: none;
1314
+ }
1315
+
1316
+ .section-heading {
1317
+ margin-bottom: 1.4rem;
1318
+ }
1319
+
1320
+ .section-heading-title {
1321
+ display: flex;
1322
+ align-items: center;
1323
+ gap: 0.75rem;
1324
+ }
1325
+
1326
+ .section-heading-mark {
1327
+ display: block;
1328
+ width: 3px;
1329
+ height: 27px;
1330
+ border-radius: 999px;
1331
+ background: linear-gradient(#5bc6ff, #8d76ff);
1332
+ box-shadow: 0 0 14px rgba(83, 180, 255, 0.8);
1333
+ }
1334
+
1335
+ .section-heading h2 {
1336
+ margin: 0;
1337
+ color: #f1f8ff;
1338
+ font-size: 1.18rem;
1339
+ letter-spacing: -0.04em;
1340
+ }
1341
+
1342
+ .admin-view-stack {
1343
+ display: flex;
1344
+ flex-direction: column;
1345
+ gap: 1rem;
1346
+ }
1347
+
1348
+ .overview-hero,
1349
+ .config-intro {
1350
+ display: flex;
1351
+ align-items: center;
1352
+ justify-content: space-between;
1353
+ gap: 2rem;
1354
+ padding: 1.5rem 1.6rem;
1355
+ overflow: hidden;
1356
+ border: 1px solid rgba(83, 165, 246, 0.24);
1357
+ border-radius: 0.9rem;
1358
+ background: linear-gradient(115deg, rgba(22, 70, 122, 0.42), rgba(21, 28, 77, 0.3) 58%, rgba(88, 39, 128, 0.27));
1359
+ box-shadow: inset 0 1px rgba(255, 255, 255, 0.07), 0 18px 55px rgba(0, 0, 0, 0.18);
1360
+ }
1361
+
1362
+ .overview-hero h1,
1363
+ .config-intro h1 {
1364
+ margin: 0.55rem 0 0.4rem;
1365
+ color: #f0f8ff;
1366
+ font-size: clamp(1.65rem, 3vw, 2.55rem);
1367
+ letter-spacing: -0.075em;
1368
+ }
1369
+
1370
+ .overview-hero h1 em,
1371
+ .config-intro h1 em {
1372
+ color: #6fcaff;
1373
+ font-style: normal;
1374
+ text-shadow: 0 0 24px rgba(80, 183, 255, 0.4);
1375
+ }
1376
+
1377
+ .overview-hero p,
1378
+ .config-intro p {
1379
+ max-width: 580px;
1380
+ margin: 0;
1381
+ color: #9ab0c9;
1382
+ font-size: 0.73rem;
1383
+ line-height: 1.7;
1384
+ }
1385
+
1386
+ .hero-orbit-art {
1387
+ flex: 0 0 124px;
1388
+ width: 124px;
1389
+ height: 124px;
1390
+ }
1391
+
1392
+ .hero-orbit-art strong {
1393
+ z-index: 1;
1394
+ color: #aee7ff;
1395
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
1396
+ font-size: 1rem;
1397
+ text-shadow: 0 0 16px #359cff;
1398
+ }
1399
+
1400
+ .hero-orbit-art span { top: 23px; right: 21px; }
1401
+ .hero-orbit-art i { bottom: 26px; left: 19px; background: #d27cff; box-shadow: 0 0 10px #d27cff; }
1402
+ .hero-orbit-art b { right: 17px; bottom: 30px; width: 4px; height: 4px; background: #5ef0b3; box-shadow: 0 0 8px #5ef0b3; }
1403
+
1404
+ .hero-art {
1405
+ position: relative;
1406
+ flex: 0 0 124px;
1407
+ width: 124px;
1408
+ height: 124px;
1409
+ display: grid;
1410
+ place-items: center;
1411
+ border-radius: 0.9rem;
1412
+ }
1413
+ .hero-art strong {
1414
+ z-index: 1;
1415
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
1416
+ font-size: 1rem;
1417
+ text-shadow: 0 0 16px currentColor;
1418
+ letter-spacing: 0.02em;
1419
+ }
1420
+ .hero-art .ha-a,
1421
+ .hero-art .ha-b,
1422
+ .hero-art .ha-c {
1423
+ position: absolute;
1424
+ border-radius: 50%;
1425
+ }
1426
+
1427
+ /* bars — three rising service bars */
1428
+ .hero-art--bars {
1429
+ color: #5ef0b3;
1430
+ border: 1px solid rgba(94, 240, 179, 0.32);
1431
+ background: linear-gradient(180deg, rgba(22, 90, 92, 0.45), rgba(6, 26, 34, 0.55));
1432
+ box-shadow: inset 0 0 22px rgba(94, 240, 179, 0.1);
1433
+ }
1434
+ .hero-art--bars .ha-a { left: 28%; bottom: 30%; width: 6px; height: 30%; background: rgba(94, 240, 179, 0.95); box-shadow: 0 0 10px rgba(94, 240, 179, 0.9); border-radius: 3px 3px 0 0; }
1435
+ .hero-art--bars .ha-b { left: 43%; bottom: 30%; width: 6px; height: 46%; background: rgba(94, 240, 179, 0.7); border-radius: 3px 3px 0 0; }
1436
+ .hero-art--bars .ha-c { left: 58%; bottom: 30%; width: 6px; height: 26%; background: rgba(94, 240, 179, 0.45); border-radius: 3px 3px 0 0; }
1437
+
1438
+ /* stack — stacked plugin tiles */
1439
+ .hero-art--stack {
1440
+ color: #ffc46b;
1441
+ border: 1px solid rgba(255, 196, 107, 0.32);
1442
+ background: linear-gradient(180deg, rgba(120, 74, 20, 0.4), rgba(40, 22, 10, 0.55));
1443
+ box-shadow: inset 0 0 22px rgba(255, 196, 107, 0.08);
1444
+ }
1445
+ .hero-art--stack .ha-a, .hero-art--stack .ha-b, .hero-art--stack .ha-c {
1446
+ width: 58%; height: 14%; border-radius: 4px; background: rgba(255, 196, 107, 0.4);
1447
+ }
1448
+ .hero-art--stack .ha-a { bottom: 30%; left: 21%; }
1449
+ .hero-art--stack .ha-b { bottom: 45%; left: 21%; width: 50%; background: rgba(255, 196, 107, 0.65); }
1450
+ .hero-art--stack .ha-c { bottom: 60%; left: 21%; width: 34%; background: rgba(255, 196, 107, 0.9); box-shadow: 0 0 8px rgba(255, 196, 107, 0.6); }
1451
+
1452
+ /* people — clients ringed around a center */
1453
+ .hero-art--people {
1454
+ color: #c8b4ff;
1455
+ border: 1px solid rgba(200, 180, 255, 0.32);
1456
+ background: linear-gradient(180deg, rgba(84, 50, 150, 0.45), rgba(30, 16, 60, 0.55));
1457
+ box-shadow: inset 0 0 22px rgba(200, 180, 255, 0.1);
1458
+ }
1459
+ .hero-art--people .ha-a { top: 18%; right: 26%; width: 10px; height: 10px; background: rgba(200, 180, 255, 0.95); box-shadow: 0 0 8px rgba(200, 180, 255, 0.8); }
1460
+ .hero-art--people .ha-b { top: 66%; left: 22%; width: 12px; height: 12px; background: rgba(160, 130, 240, 0.8); box-shadow: 0 0 8px rgba(160, 130, 240, 0.7); }
1461
+ .hero-art--people .ha-c { bottom: 22%; right: 24%; width: 8px; height: 8px; background: rgba(120, 200, 255, 0.8); box-shadow: 0 0 8px rgba(120, 200, 255, 0.7); }
1462
+
1463
+ /* wave — pulsing heartbeat line */
1464
+ .hero-art--wave {
1465
+ color: #6fe8a8;
1466
+ border: 1px solid rgba(111, 232, 168, 0.32);
1467
+ background: linear-gradient(180deg, rgba(18, 102, 84, 0.45), rgba(8, 28, 30, 0.55));
1468
+ box-shadow: inset 0 0 22px rgba(111, 232, 168, 0.1);
1469
+ }
1470
+ .hero-art--wave .ha-a, .hero-art--wave .ha-b, .hero-art--wave .ha-c { border-radius: 3px; }
1471
+ .hero-art--wave .ha-a { left: 18%; right: 18%; top: 52%; height: 3px; background: linear-gradient(90deg, transparent, rgba(111, 232, 168, 0.95), transparent); box-shadow: 0 0 8px rgba(111, 232, 168, 0.8); }
1472
+ .hero-art--wave .ha-b { left: 44%; top: 26%; width: 8px; height: 26%; background: rgba(111, 232, 168, 0.55); transform: rotate(20deg); }
1473
+ .hero-art--wave .ha-c { left: 44%; bottom: 26%; width: 8px; height: 26%; background: rgba(111, 232, 168, 0.85); box-shadow: 0 0 8px rgba(111, 232, 168, 0.6); transform: rotate(-20deg); }
1474
+
1475
+ /* coins — stacked cylinder of payment */
1476
+ .hero-art--coins {
1477
+ color: #ffd479;
1478
+ border: 1px solid rgba(255, 212, 121, 0.32);
1479
+ background: linear-gradient(180deg, rgba(122, 86, 20, 0.45), rgba(44, 28, 12, 0.55));
1480
+ box-shadow: inset 0 0 22px rgba(255, 212, 121, 0.08);
1481
+ }
1482
+ .hero-art--coins .ha-a, .hero-art--coins .ha-b, .hero-art--coins .ha-c {
1483
+ left: 33%; right: 33%; height: 11%; border-radius: 50%; background: rgba(255, 212, 121, 0.55);
1484
+ }
1485
+ .hero-art--coins .ha-a { bottom: 28%; }
1486
+ .hero-art--coins .ha-b { bottom: 43%; background: rgba(255, 212, 121, 0.75); }
1487
+ .hero-art--coins .ha-c { bottom: 58%; background: rgba(255, 212, 121, 0.95); box-shadow: 0 0 8px rgba(255, 212, 121, 0.7); }
1488
+
1489
+ /* cubes — stacked database shelves */
1490
+ .hero-art--cubes {
1491
+ color: #6fd6ff;
1492
+ border: 1px solid rgba(111, 214, 255, 0.32);
1493
+ background: linear-gradient(180deg, rgba(22, 74, 116, 0.5), rgba(10, 28, 50, 0.55));
1494
+ box-shadow: inset 0 0 22px rgba(111, 214, 255, 0.1);
1495
+ }
1496
+ .hero-art--cubes .ha-a, .hero-art--cubes .ha-b, .hero-art--cubes .ha-c {
1497
+ width: 46%; height: 13%; border-radius: 4px; background: rgba(111, 214, 255, 0.5);
1498
+ }
1499
+ .hero-art--cubes .ha-a { top: 26%; left: 27%; transform: skew(-10deg); }
1500
+ .hero-art--cubes .ha-b { top: 42%; left: 27%; background: rgba(111, 214, 255, 0.75); transform: skew(-10deg); }
1501
+ .hero-art--cubes .ha-c { top: 58%; left: 27%; background: rgba(111, 214, 255, 0.95); box-shadow: 0 0 8px rgba(111, 214, 255, 0.7); transform: skew(-10deg); }
1502
+
1503
+ /* spark — four-petal bloom around a center */
1504
+ .hero-art--spark {
1505
+ color: #ff9fd6;
1506
+ border: 1px solid rgba(255, 159, 214, 0.32);
1507
+ background: radial-gradient(circle, rgba(150, 40, 110, 0.5), rgba(40, 16, 40, 0.55) 70%);
1508
+ box-shadow: inset 0 0 22px rgba(255, 159, 214, 0.1);
1509
+ }
1510
+ .hero-art--spark .ha-a { top: 20%; left: 50%; width: 30%; height: 30%; transform: translateX(-50%); background: rgba(255, 159, 214, 0.35); }
1511
+ .hero-art--spark .ha-b { left: 20%; top: 50%; width: 28%; height: 28%; transform: translateY(-50%); background: rgba(255, 159, 214, 0.6); }
1512
+ .hero-art--spark .ha-c { right: 20%; top: 50%; width: 28%; height: 28%; transform: translateY(-50%); background: rgba(180, 200, 255, 0.55); box-shadow: 0 0 10px rgba(160, 180, 255, 0.6); }
1513
+
1514
+ /* grid — plugin/extension tiles */
1515
+ .hero-art--grid {
1516
+ color: #ffc46b;
1517
+ border: 1px solid rgba(255, 196, 107, 0.32);
1518
+ background: linear-gradient(180deg, rgba(120, 74, 20, 0.4), rgba(40, 22, 10, 0.55));
1519
+ box-shadow: inset 0 0 22px rgba(255, 196, 107, 0.08);
1520
+ }
1521
+ .hero-art--grid .ha-a, .hero-art--grid .ha-b, .hero-art--grid .ha-c {
1522
+ width: 30%; height: 30%; border-radius: 5px; background: rgba(255, 196, 107, 0.4);
1523
+ }
1524
+ .hero-art--grid .ha-a { top: 22%; left: 22%; }
1525
+ .hero-art--grid .ha-b { top: 22%; right: 22%; background: rgba(255, 196, 107, 0.6); }
1526
+ .hero-art--grid .ha-c { bottom: 22%; left: 38%; width: 24%; background: rgba(255, 196, 107, 0.85); box-shadow: 0 0 8px rgba(255, 196, 107, 0.6); }
1527
+
1528
+ /* cards — payment card stack */
1529
+ .hero-art--cards {
1530
+ color: #ffd479;
1531
+ border: 1px solid rgba(255, 212, 121, 0.32);
1532
+ background: linear-gradient(180deg, rgba(122, 86, 20, 0.45), rgba(44, 28, 12, 0.55));
1533
+ box-shadow: inset 0 0 22px rgba(255, 212, 121, 0.08);
1534
+ }
1535
+ .hero-art--cards .ha-a, .hero-art--cards .ha-b, .hero-art--cards .ha-c {
1536
+ left: 22%; right: 22%; height: 34%; border-radius: 6px; background: rgba(255, 212, 121, 0.35);
1537
+ }
1538
+ .hero-art--cards .ha-a { top: 22%; transform: rotate(-6deg); }
1539
+ .hero-art--cards .ha-b { top: 34%; transform: rotate(4deg); background: rgba(255, 212, 121, 0.6); }
1540
+ .hero-art--cards .ha-c { top: 46%; background: rgba(255, 212, 121, 0.9); box-shadow: 0 0 10px rgba(255, 212, 121, 0.6); }
1541
+
1542
+ /* bolt — AI schema flash */
1543
+ .hero-art--bolt {
1544
+ color: #6fd6ff;
1545
+ border: 1px solid rgba(111, 214, 255, 0.32);
1546
+ background: radial-gradient(circle, rgba(30, 110, 160, 0.5), rgba(10, 28, 50, 0.55) 70%);
1547
+ box-shadow: inset 0 0 22px rgba(111, 214, 255, 0.1);
1548
+ }
1549
+ .hero-art--bolt .ha-a { left: 46%; top: 20%; width: 30%; height: 30%; clip-path: polygon(55% 0, 15% 55%, 45% 55%, 40% 100%, 90% 42%, 55% 42%); background: rgba(111, 214, 255, 0.9); box-shadow: 0 0 12px rgba(111, 214, 255, 0.7); }
1550
+ .hero-art--bolt .ha-b { right: 20%; top: 30%; width: 9px; height: 9px; border-radius: 50%; background: rgba(200, 180, 255, 0.8); box-shadow: 0 0 8px rgba(200, 180, 255, 0.7); }
1551
+ .hero-art--bolt .ha-c { bottom: 24%; left: 22%; width: 9px; height: 9px; border-radius: 50%; background: rgba(255, 159, 214, 0.8); box-shadow: 0 0 8px rgba(255, 159, 214, 0.7); }
1552
+
1553
+ /* ===== animated art — orbit spin, glow, breathing, floating dots ===== */
1554
+ @keyframes hero-orbit-spin { to { transform: rotate(360deg); } }
1555
+ @keyframes hero-counter-spin { to { transform: rotate(-360deg); } }
1556
+ @keyframes orbit-ring-glow {
1557
+ 0%, 100% { box-shadow: 0 0 32px rgba(58, 149, 255, 0.18), inset 0 0 24px rgba(94, 119, 255, 0.12); }
1558
+ 50% { box-shadow: 0 0 48px rgba(58, 149, 255, 0.4), inset 0 0 30px rgba(94, 119, 255, 0.24); }
1559
+ }
1560
+ @keyframes dot-glow { 0%, 100% { filter: brightness(1); } 50% { filter: brightness(1.9); } }
1561
+ @keyframes hero-text-glow { 0%, 100% { opacity: 0.85; filter: brightness(1); } 50% { opacity: 1; filter: brightness(1.6); } }
1562
+ @keyframes hero-art-breathe { 0%, 100% { transform: scale(1); } 50% { transform: scale(1.04); } }
1563
+ @keyframes ha-float { 0%, 100% { translate: 0 0; } 50% { translate: 0 -5px; } }
1564
+ @keyframes ha-pulse { 0%, 100% { opacity: 0.6; filter: brightness(0.9); } 50% { opacity: 1; filter: brightness(1.45); } }
1565
+
1566
+ .hero-orbit-art,
1567
+ .preview-orbit {
1568
+ animation: hero-orbit-spin 16s linear infinite, orbit-ring-glow 4.5s ease-in-out infinite;
1569
+ }
1570
+
1571
+ .hero-orbit-art strong,
1572
+ .preview-orbit strong {
1573
+ animation: hero-counter-spin 16s linear infinite, hero-text-glow 3.4s ease-in-out infinite;
1574
+ }
1575
+
1576
+ .hero-orbit-art span,
1577
+ .hero-orbit-art i,
1578
+ .hero-orbit-art b,
1579
+ .preview-orbit span,
1580
+ .preview-orbit i,
1581
+ .preview-orbit b {
1582
+ animation: dot-glow 2.4s ease-in-out infinite;
1583
+ }
1584
+ .hero-orbit-art i,
1585
+ .preview-orbit i { animation-delay: 0.8s; }
1586
+ .hero-orbit-art b,
1587
+ .preview-orbit b { animation-delay: 1.6s; }
1588
+
1589
+ .hero-art { animation: hero-art-breathe 5s ease-in-out infinite; }
1590
+ .hero-art strong { animation: hero-text-glow 3.4s ease-in-out infinite; }
1591
+ .hero-art .ha-a,
1592
+ .hero-art .ha-b,
1593
+ .hero-art .ha-c { animation: ha-pulse 3s ease-in-out infinite, ha-float 4.6s ease-in-out infinite; }
1594
+ .hero-art .ha-b { animation-delay: 0.5s, 0.9s; }
1595
+ .hero-art .ha-c { animation-delay: 1s, 1.8s; }
1596
+
1597
+ @media (prefers-reduced-motion: reduce) {
1598
+ .hero-orbit-art, .preview-orbit, .hero-art,
1599
+ .hero-orbit-art strong, .preview-orbit strong, .hero-art strong,
1600
+ .hero-orbit-art span, .hero-orbit-art i, .hero-orbit-art b,
1601
+ .preview-orbit span, .preview-orbit i, .preview-orbit b,
1602
+ .hero-art .ha-a, .hero-art .ha-b, .hero-art .ha-c { animation: none; }
1603
+ }
1604
+
1605
+ .overview-stat-grid {
1606
+ position: relative;
1607
+ z-index: 1;
1608
+ display: grid;
1609
+ grid-template-columns: repeat(4, minmax(0, 1fr));
1610
+ gap: 0.7rem;
1611
+ }
1612
+
1613
+ .overview-stat {
1614
+ padding: 0.95rem 1rem;
1615
+ border: 1px solid rgba(112, 168, 228, 0.16);
1616
+ border-radius: 0.7rem;
1617
+ background: rgba(10, 30, 56, 0.56);
1618
+ }
1619
+
1620
+ .overview-stat > span {
1621
+ color: #6e8aaa;
1622
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
1623
+ font-size: 0.53rem;
1624
+ letter-spacing: 0.11em;
1625
+ }
1626
+
1627
+ .overview-stat strong {
1628
+ display: block;
1629
+ margin: 0.45rem 0 0.2rem;
1630
+ color: #f0f8ff;
1631
+ font-size: 1.5rem;
1632
+ letter-spacing: -0.05em;
1633
+ }
1634
+
1635
+ .overview-stat strong small { color: #718baa; font-size: 0.8rem; font-weight: 500; }
1636
+ .overview-stat b { color: #718ba7; font-size: 0.55rem; font-weight: 500; }
1637
+ .overview-stat .stat-good { color: #5ef0b3; }
1638
+ .overview-stat .stat-violet { color: #bd9aff; }
1639
+
1640
+ .overview-columns {
1641
+ display: grid;
1642
+ grid-template-columns: minmax(0, 1.35fr) minmax(240px, 0.65fr);
1643
+ gap: 0.8rem;
1644
+ }
1645
+
1646
+ .workspace-panel {
1647
+ padding: 1rem;
1648
+ border: 1px solid rgba(112, 168, 228, 0.17);
1649
+ border-radius: 0.8rem;
1650
+ background: rgba(8, 25, 48, 0.68);
1651
+ box-shadow: inset 0 1px rgba(255, 255, 255, 0.04), 0 14px 42px rgba(0, 0, 0, 0.14);
1652
+ }
1653
+
1654
+ .panel-title-row h3 {
1655
+ margin: 0.35rem 0 0;
1656
+ color: #eaf6ff;
1657
+ font-size: 0.88rem;
1658
+ letter-spacing: -0.03em;
1659
+ }
1660
+
1661
+ .text-action {
1662
+ border: 0;
1663
+ color: #5ebcff;
1664
+ background: transparent;
1665
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
1666
+ font-size: 0.58rem;
1667
+ }
1668
+
1669
+ .surface-grid {
1670
+ display: grid;
1671
+ grid-auto-flow: column;
1672
+ grid-template-rows: repeat(2, auto);
1673
+ grid-template-columns: repeat(4, minmax(0, 1fr));
1674
+ gap: 0.55rem;
1675
+ margin-top: 1rem;
1676
+ }
1677
+
1678
+ .surface-grid .surface-card {
1679
+ position: relative;
1680
+ display: grid;
1681
+ grid-template-columns: 38px 1fr;
1682
+ grid-template-rows: auto auto;
1683
+ column-gap: 0.7rem;
1684
+ align-items: center;
1685
+ padding: 0.8rem;
1686
+ border: 1px solid var(--admin-border, rgba(125, 174, 235, 0.2));
1687
+ border-radius: 0.8rem;
1688
+ color: var(--admin-ink, #eef6ff);
1689
+ background: var(--admin-surface, rgba(10, 24, 45, 0.78));
1690
+ text-align: left;
1691
+ overflow: hidden;
1692
+ transition: border-color 180ms ease, transform 180ms ease, box-shadow 180ms ease, background 180ms ease;
1693
+ }
1694
+
1695
+ .surface-grid .surface-card::before {
1696
+ content: '';
1697
+ position: absolute;
1698
+ inset: 0;
1699
+ background: radial-gradient(14rem 6rem at 120% -30%, color-mix(in srgb, var(--acc, var(--admin-blue)) 32%, transparent), transparent 70%);
1700
+ opacity: 0;
1701
+ transition: opacity 180ms ease;
1702
+ }
1703
+
1704
+ .surface-grid .surface-card:hover {
1705
+ border-color: color-mix(in srgb, var(--acc, var(--admin-blue)) 55%, transparent);
1706
+ background: color-mix(in srgb, var(--acc, var(--admin-blue)) 14%, transparent);
1707
+ transform: translateY(-2px);
1708
+ box-shadow: 0 10px 26px -8px color-mix(in srgb, var(--acc, var(--admin-blue)) 40%, transparent);
1709
+ }
1710
+
1711
+ .surface-grid .surface-card:hover::before { opacity: 1; }
1712
+ .surface-grid .surface-card strong { align-self: end; font-size: 0.7rem; font-weight: 600; color: var(--admin-ink, #eef6ff); }
1713
+ .surface-grid .surface-card small { grid-column: 2; color: var(--admin-muted, #849ab7); font-size: 0.56rem; }
1714
+
1715
+ .surface-grid .surface-icon {
1716
+ display: grid;
1717
+ grid-row: 1 / 3;
1718
+ width: 38px;
1719
+ height: 38px;
1720
+ place-items: center;
1721
+ border-radius: 0.7rem;
1722
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
1723
+ font-size: 0.85rem;
1724
+ color: var(--acc, var(--admin-blue));
1725
+ background: linear-gradient(135deg, color-mix(in srgb, var(--acc, var(--admin-blue)) 28%, transparent), color-mix(in srgb, var(--acc, var(--admin-blue)) 8%, transparent));
1726
+ border: 1px solid color-mix(in srgb, var(--acc, var(--admin-blue)) 34%, transparent);
1727
+ box-shadow: inset 0 0 14px color-mix(in srgb, var(--acc, var(--admin-blue)) 12%, transparent);
1728
+ }
1729
+
1730
+ .surface-grid .surface-go {
1731
+ position: absolute;
1732
+ top: 0.55rem;
1733
+ right: 0.6rem;
1734
+ font-style: normal;
1735
+ color: var(--acc, var(--admin-blue));
1736
+ font-size: 0.72rem;
1737
+ opacity: 0;
1738
+ transform: translateX(-4px);
1739
+ transition: opacity 180ms ease, transform 180ms ease;
1740
+ }
1741
+
1742
+ .surface-grid .surface-card:hover .surface-go { opacity: 1; transform: translateX(0); }
1743
+
1744
+ .surface-grid .acc-blue { --acc: var(--admin-blue); }
1745
+ .surface-grid .acc-violet { --acc: var(--admin-violet); }
1746
+ .surface-grid .acc-pink { --acc: var(--admin-pink); }
1747
+
1748
+ .live-badge,
1749
+ .restart-badge,
1750
+ .secret-badge {
1751
+ display: inline-flex;
1752
+ align-items: center;
1753
+ gap: 0.35rem;
1754
+ padding: 0.3rem 0.45rem;
1755
+ border: 1px solid rgba(91, 240, 179, 0.25);
1756
+ border-radius: 999px;
1757
+ color: #6df0bb;
1758
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
1759
+ font-size: 0.48rem;
1760
+ letter-spacing: 0.08em;
1761
+ }
1762
+
1763
+ .restart-badge { border-color: rgba(255, 195, 102, 0.27); color: #ffcf78; }
1764
+ .secret-badge { border-color: rgba(243, 110, 184, 0.3); color: #ff9dcc; }
1765
+
1766
+ .pulse-bars {
1767
+ display: flex;
1768
+ align-items: end;
1769
+ gap: 0.32rem;
1770
+ height: 82px;
1771
+ margin: 1.15rem 0 0.7rem;
1772
+ padding: 0.35rem 0;
1773
+ border-bottom: 1px solid rgba(112, 168, 228, 0.16);
1774
+ }
1775
+
1776
+ .pulse-bars i {
1777
+ flex: 1;
1778
+ min-height: 12%;
1779
+ border-radius: 0.18rem 0.18rem 0 0;
1780
+ background: linear-gradient(#67c8ff, #4d53bf);
1781
+ box-shadow: 0 0 12px rgba(74, 169, 255, 0.22);
1782
+ }
1783
+
1784
+ .pulse-panel p,
1785
+ .panel-description {
1786
+ color: #7891ad;
1787
+ font-size: 0.6rem;
1788
+ line-height: 1.6;
1789
+ }
1790
+
1791
+ .live-traffic-panel { margin-top: 0.8rem; }
1792
+
1793
+ .traffic-chart {
1794
+ margin-top: 0.85rem;
1795
+ }
1796
+
1797
+ .traffic-chart-body {
1798
+ position: relative;
1799
+ }
1800
+
1801
+ .traffic-chart-body svg {
1802
+ display: block;
1803
+ width: 100%;
1804
+ height: 96px;
1805
+ overflow: visible;
1806
+ }
1807
+
1808
+ .traffic-tip {
1809
+ position: absolute;
1810
+ transform: translate(-50%, -140%);
1811
+ pointer-events: none;
1812
+ z-index: 20;
1813
+ display: flex;
1814
+ flex-direction: column;
1815
+ align-items: center;
1816
+ gap: 0.1rem;
1817
+ padding: 0.4rem 0.7rem;
1818
+ border-radius: 0.5rem;
1819
+ border: 1px solid color-mix(in srgb, var(--admin-violet, #9f7bff) 45%, transparent);
1820
+ background: color-mix(in srgb, #0a1830 88%, transparent);
1821
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.45);
1822
+ white-space: nowrap;
1823
+ }
1824
+
1825
+ .traffic-tip-time {
1826
+ font-size: 0.6rem;
1827
+ color: var(--admin-muted, #849ab7);
1828
+ }
1829
+
1830
+ .traffic-tip-count {
1831
+ font-size: 0.78rem;
1832
+ font-weight: 700;
1833
+ color: var(--admin-ink, #eef6ff);
1834
+ }
1835
+
1836
+ .traffic-meta {
1837
+ display: flex;
1838
+ align-items: center;
1839
+ gap: 1rem;
1840
+ margin-top: 0.55rem;
1841
+ color: #7891ad;
1842
+ font-size: 0.62rem;
1843
+ }
1844
+
1845
+ .traffic-meta span {
1846
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
1847
+ letter-spacing: 0.04em;
1848
+ }
1849
+
1850
+ .traffic-meta .text-action { margin-left: auto; }
1851
+
1852
+ .series-tabs {
1853
+ display: inline-flex;
1854
+ gap: 0.25rem;
1855
+ padding: 0.2rem;
1856
+ border: 1px solid var(--admin-border, rgba(125, 174, 235, 0.2));
1857
+ border-radius: 0.5rem;
1858
+ background: var(--admin-surface, rgba(10, 24, 45, 0.78));
1859
+ }
1860
+
1861
+ .series-tabs button {
1862
+ border: 0;
1863
+ border-radius: 0.35rem;
1864
+ padding: 0.32rem 0.65rem;
1865
+ color: var(--admin-muted, #849ab7);
1866
+ background: transparent;
1867
+ font-size: 0.62rem;
1868
+ cursor: pointer;
1869
+ transition: 140ms ease;
1870
+ }
1871
+
1872
+ .series-tabs button:hover { color: var(--admin-ink, #eef6ff); }
1873
+
1874
+ .series-tabs button.is-active {
1875
+ color: var(--admin-ink, #eef6ff);
1876
+ background: color-mix(in srgb, var(--admin-violet, #9f7bff) 26%, transparent);
1877
+ box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--admin-violet, #9f7bff) 40%, transparent);
1878
+ }
1879
+
1880
+ .req-log-table-wrap { max-height: 340px; overflow: auto; }
1881
+
1882
+ .req-log-table th { position: sticky; top: 0; background: rgba(8, 25, 48, 0.96); z-index: 1; }
1883
+
1884
+ .req-log-table td { font-size: 0.62rem; }
1885
+
1886
+ .req-td-time { white-space: nowrap; color: var(--admin-muted, #849ab7); }
1887
+ .req-td-path { max-width: 260px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-family: ui-monospace, SFMono-Regular, Consolas, monospace; color: var(--admin-ink, #eef6ff); }
1888
+ .req-td-dur { white-space: nowrap; color: var(--admin-muted, #849ab7); }
1889
+ .req-td-ip { white-space: nowrap; color: var(--admin-muted, #849ab7); font-family: ui-monospace, SFMono-Regular, Consolas, monospace; }
1890
+ .req-td-ref { max-width: 180px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--admin-muted, #849ab7); }
1891
+
1892
+ .req-method { font-family: ui-monospace, SFMono-Regular, Consolas, monospace; font-weight: 600; }
1893
+ .req-method-get { color: #5ef0b3; }
1894
+ .req-method-post { color: #ffd479; }
1895
+ .req-method-put { color: #6dcbff; }
1896
+ .req-method-patch { color: #c0a0ff; }
1897
+ .req-method-delete { color: #ff91a8; }
1898
+
1899
+ .req-status { font-weight: 700; }
1900
+ .req-status-err { color: #ff6b81; }
1901
+ .req-status-warn { color: #ffcf78; }
1902
+
1903
+ .workspace-tabs {
1904
+ display: inline-flex;
1905
+ gap: 0.2rem;
1906
+ padding: 0.22rem;
1907
+ border: 1px solid rgba(112, 168, 228, 0.14);
1908
+ border-radius: 0.58rem;
1909
+ background: rgba(8, 24, 45, 0.72);
1910
+ }
1911
+
1912
+ .workspace-tabs button {
1913
+ padding: 0.52rem 0.75rem;
1914
+ border: 0;
1915
+ border-radius: 0.4rem;
1916
+ color: #7891ae;
1917
+ background: transparent;
1918
+ font-size: 0.62rem;
1919
+ }
1920
+
1921
+ .workspace-tabs button.is-active { color: #ecf8ff; background: linear-gradient(135deg, rgba(38, 130, 225, 0.55), rgba(90, 67, 183, 0.45)); }
1922
+
1923
+ /* ---- Logs: aggregated console viewer ---- */
1924
+ .log-card { padding: 0; overflow: hidden; }
1925
+
1926
+ .log-stat-strip {
1927
+ display: grid;
1928
+ grid-template-columns: repeat(4, minmax(0, 1fr));
1929
+ gap: 0.55rem;
1930
+ padding: 0.85rem 0.85rem 0.65rem;
1931
+ }
1932
+ .log-stat {
1933
+ display: flex;
1934
+ align-items: center;
1935
+ gap: 0.55rem;
1936
+ min-width: 0;
1937
+ padding: 0.55rem 0.7rem;
1938
+ border: 1px solid rgba(112, 168, 228, 0.16);
1939
+ border-radius: 0.7rem;
1940
+ background: rgba(10, 30, 56, 0.5);
1941
+ }
1942
+ .log-stat i {
1943
+ width: 8px;
1944
+ height: 8px;
1945
+ flex: 0 0 auto;
1946
+ border-radius: 50%;
1947
+ background: color-mix(in srgb, var(--admin-blue) 80%, white);
1948
+ box-shadow: 0 0 10px color-mix(in srgb, var(--admin-blue) 62%, transparent);
1949
+ }
1950
+ .log-stat b {
1951
+ color: #eaf6ff;
1952
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
1953
+ font-size: 1rem;
1954
+ line-height: 1;
1955
+ }
1956
+ .log-stat em {
1957
+ overflow: hidden;
1958
+ color: #6f89a8;
1959
+ font-size: 0.54rem;
1960
+ font-style: normal;
1961
+ letter-spacing: 0.04em;
1962
+ text-overflow: ellipsis;
1963
+ white-space: nowrap;
1964
+ }
1965
+ .log-stat--all i { background: var(--admin-blue); box-shadow: 0 0 10px color-mix(in srgb, var(--admin-blue) 62%, transparent); }
1966
+ .log-stat--all b { color: #aee1ff; }
1967
+ .log-stat--error i { background: #fb7185; box-shadow: 0 0 10px rgba(251, 113, 133, 0.55); }
1968
+ .log-stat--error b { color: #fda4af; }
1969
+ .log-stat--warn i { background: #fbbf24; box-shadow: 0 0 10px rgba(251, 191, 36, 0.55); }
1970
+ .log-stat--warn b { color: #fcd34d; }
1971
+ .log-stat--info i { background: #38bdf8; box-shadow: 0 0 10px rgba(56, 189, 248, 0.55); }
1972
+ .log-stat--info b { color: #7dd3fc; }
1973
+
1974
+ .log-toolbar {
1975
+ display: flex;
1976
+ flex-wrap: wrap;
1977
+ align-items: center;
1978
+ gap: 0.55rem;
1979
+ padding: 0.1rem 0.85rem 0.85rem;
1980
+ }
1981
+ .log-filter-group {
1982
+ display: inline-flex;
1983
+ gap: 0.15rem;
1984
+ padding: 0.2rem;
1985
+ border-radius: 0.65rem;
1986
+ }
1987
+ .log-filter-btn {
1988
+ padding: 0.42rem 0.62rem;
1989
+ border: 0;
1990
+ border-radius: 0.45rem;
1991
+ color: #8aa7c6;
1992
+ background: transparent;
1993
+ font-size: 0.62rem;
1994
+ font-weight: 600;
1995
+ cursor: pointer;
1996
+ transition: color 150ms ease, background 150ms ease, box-shadow 150ms ease;
1997
+ }
1998
+ .log-filter-btn b { font-weight: 700; opacity: 0.65; }
1999
+ .log-filter-btn:hover { color: #dbeafe; }
2000
+ .log-filter-btn.is-active {
2001
+ color: #f0f8ff;
2002
+ background: linear-gradient(135deg, color-mix(in srgb, var(--admin-blue) 55%, transparent), color-mix(in srgb, var(--admin-violet) 45%, transparent));
2003
+ box-shadow: 0 2px 10px color-mix(in srgb, var(--admin-blue) 22%, transparent);
2004
+ }
2005
+ .log-filter-btn.is-active b { opacity: 1; }
2006
+ .log-crit-btn {
2007
+ padding: 0.42rem 0.62rem;
2008
+ border: 1px solid transparent;
2009
+ border-radius: 0.45rem;
2010
+ color: #8aa7c6;
2011
+ background: transparent;
2012
+ font-size: 0.62rem;
2013
+ font-weight: 600;
2014
+ cursor: pointer;
2015
+ transition: color 150ms ease, background 150ms ease, border-color 150ms ease, box-shadow 150ms ease;
2016
+ }
2017
+ .log-crit-btn:hover { color: #ffdce6; }
2018
+ .log-crit-btn.is-active {
2019
+ color: #ffd5e0;
2020
+ border-color: rgba(251, 113, 133, 0.45);
2021
+ background: rgba(244, 63, 94, 0.14);
2022
+ box-shadow: 0 0 10px rgba(244, 63, 94, 0.18);
2023
+ }
2024
+ .log-ai-btn {
2025
+ color: #d9c8ff;
2026
+ border-color: color-mix(in srgb, var(--admin-violet) 40%, transparent);
2027
+ background: color-mix(in srgb, var(--admin-violet) 16%, transparent);
2028
+ }
2029
+ .log-ai-btn:hover { color: #fff; background: color-mix(in srgb, var(--admin-violet) 30%, transparent); }
2030
+ .log-ai-btn:disabled { opacity: 0.6; cursor: wait; }
2031
+ .log-toolbar-right { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem; margin-left: auto; }
2032
+ .log-service-input { width: 9.5rem; }
2033
+ .log-search-input { width: 13rem; }
2034
+ .log-search-input::placeholder { color: #59738f; }
2035
+
2036
+ .log-viewer {
2037
+ position: relative;
2038
+ min-height: 180px;
2039
+ max-height: min(58vh, 620px);
2040
+ overflow: auto;
2041
+ border-top: 1px solid rgba(112, 168, 228, 0.14);
2042
+ border-bottom: 1px solid rgba(112, 168, 228, 0.14);
2043
+ background: rgba(1, 8, 19, 0.62);
2044
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
2045
+ font-size: 0.68rem;
2046
+ line-height: 1.55;
2047
+ }
2048
+ .log-viewer:focus-visible {
2049
+ outline: 1px solid color-mix(in srgb, var(--admin-blue) 55%, transparent);
2050
+ outline-offset: -1px;
2051
+ }
2052
+
2053
+ .log-colhead {
2054
+ position: sticky;
2055
+ top: 0;
2056
+ z-index: 2;
2057
+ display: grid;
2058
+ grid-template-columns: 84px 150px 88px 72px minmax(0, 1fr);
2059
+ gap: 0.5rem;
2060
+ align-items: center;
2061
+ padding: 0.45rem 0.7rem;
2062
+ border-bottom: 1px solid rgba(112, 168, 228, 0.13);
2063
+ color: #5f7b99;
2064
+ background: rgba(4, 14, 28, 0.94);
2065
+ backdrop-filter: blur(8px);
2066
+ font-size: 0.53rem;
2067
+ font-weight: 700;
2068
+ letter-spacing: 0.09em;
2069
+ text-transform: uppercase;
2070
+ }
2071
+ .log-colhead span { color: inherit; }
2072
+
2073
+ .log-row {
2074
+ display: grid;
2075
+ grid-template-columns: 84px 150px 88px 72px minmax(0, 1fr);
2076
+ gap: 0.5rem;
2077
+ align-items: baseline;
2078
+ padding: 0.32rem 0.7rem;
2079
+ border-top: 1px solid rgba(112, 168, 228, 0.07);
2080
+ border-left: 2px solid transparent;
2081
+ color: #b7cce3;
2082
+ transition: background 120ms ease, border-color 120ms ease;
2083
+ }
2084
+ .log-row:hover { background: rgba(58, 116, 178, 0.12); }
2085
+ .log-row--error {
2086
+ border-left-color: rgba(244, 63, 94, 0.55);
2087
+ background: linear-gradient(90deg, rgba(244, 63, 94, 0.1), rgba(244, 63, 94, 0.02) 65%, transparent);
2088
+ }
2089
+ .log-row--warn {
2090
+ border-left-color: rgba(251, 191, 36, 0.5);
2091
+ background: linear-gradient(90deg, rgba(251, 191, 36, 0.07), transparent 65%);
2092
+ }
2093
+ .log-row--info { border-left-color: transparent; }
2094
+
2095
+ @keyframes log-critical-flash {
2096
+ 0%, 100% { background: rgba(244, 63, 94, 0.16); box-shadow: inset 2px 0 0 rgba(251, 113, 133, 0.85); }
2097
+ 50% { background: rgba(251, 191, 36, 0.13); box-shadow: inset 2px 0 0 rgba(251, 191, 36, 0.95); }
2098
+ }
2099
+ .log-row--critical {
2100
+ border-left-color: rgba(251, 113, 133, 0.85);
2101
+ animation: log-critical-flash 1.4s ease-in-out infinite;
2102
+ }
2103
+ @media (prefers-reduced-motion: reduce) {
2104
+ .log-row--critical { animation: none; background: rgba(244, 63, 94, 0.14); }
2105
+ }
2106
+
2107
+ .log-time { color: #66809e; font-variant-numeric: tabular-nums; white-space: nowrap; }
2108
+ .log-service, .log-source, .log-level { white-space: nowrap; }
2109
+
2110
+ .log-tag {
2111
+ justify-self: start;
2112
+ padding: 0.08rem 0.45rem;
2113
+ border-radius: 999px;
2114
+ font-size: 0.6rem;
2115
+ font-weight: 600;
2116
+ letter-spacing: 0.02em;
2117
+ }
2118
+ .log-tag--default {
2119
+ border: 1px solid rgba(255, 255, 255, 0.14);
2120
+ background: rgba(255, 255, 255, 0.05);
2121
+ color: #b7cce3;
2122
+ }
2123
+
2124
+ .log-source { font-size: 0.6rem; text-transform: uppercase; letter-spacing: 0.06em; }
2125
+ .log-source--stdout { color: #7fd0e8; }
2126
+ .log-source--stderr { color: #ff9f8a; }
2127
+ .log-source--system { color: #c5a7ff; }
2128
+
2129
+ .log-level {
2130
+ justify-self: start;
2131
+ padding: 0.06rem 0.4rem;
2132
+ border-radius: 999px;
2133
+ font-size: 0.58rem;
2134
+ font-weight: 700;
2135
+ text-transform: uppercase;
2136
+ letter-spacing: 0.04em;
2137
+ }
2138
+ .log-level--error { color: #fda4af; background: rgba(244, 63, 94, 0.14); }
2139
+ .log-level--warn { color: #fcd34d; background: rgba(251, 191, 36, 0.12); }
2140
+ .log-level--info { color: #7dd3fc; background: rgba(56, 189, 248, 0.12); }
2141
+
2142
+ .log-line { min-width: 0; color: #cfe2f5; white-space: pre-wrap; word-break: break-word; }
2143
+ .log-row--error .log-line { color: #ffc4c9; }
2144
+ .log-row--warn .log-line { color: #ffe3b0; }
2145
+
2146
+ .log-empty {
2147
+ display: flex;
2148
+ flex-direction: column;
2149
+ align-items: center;
2150
+ justify-content: center;
2151
+ gap: 0.35rem;
2152
+ min-height: 220px;
2153
+ padding: 1.5rem;
2154
+ color: #64809f;
2155
+ text-align: center;
2156
+ }
2157
+ .log-empty-glyph { font-size: 1.4rem; opacity: 0.55; color: var(--admin-muted); }
2158
+ .log-empty strong { color: #a9c4de; font-size: 0.78rem; }
2159
+ .log-empty p { margin: 0; color: #64809f; font-size: 0.65rem; }
2160
+
2161
+ .log-footer {
2162
+ display: flex;
2163
+ align-items: center;
2164
+ justify-content: space-between;
2165
+ gap: 0.6rem;
2166
+ padding: 0.7rem 0.85rem 0.8rem;
2167
+ }
2168
+ .log-foot-left { display: inline-flex; align-items: center; gap: 0.35rem; color: #6b87a5; font-size: 0.58rem; }
2169
+ .log-live-dot {
2170
+ display: inline-block;
2171
+ width: 7px;
2172
+ height: 7px;
2173
+ border-radius: 50%;
2174
+ background: #34d399;
2175
+ box-shadow: 0 0 8px rgba(52, 211, 153, 0.8);
2176
+ animation: dot-glow 2.4s ease-in-out infinite;
2177
+ }
2178
+ .log-live-btn.is-live { color: #34d399; border-color: rgba(52, 211, 153, 0.4); background: rgba(16, 185, 129, 0.12); }
2179
+
2180
+ .log-ai-panel {
2181
+ margin: 0 0.85rem 0.85rem;
2182
+ padding: 0.75rem 0.8rem;
2183
+ border: 1px solid color-mix(in srgb, var(--admin-violet) 34%, transparent);
2184
+ border-radius: 0.7rem;
2185
+ background: rgba(18, 12, 40, 0.5);
2186
+ box-shadow: inset 0 1px rgba(255, 255, 255, 0.05);
2187
+ }
2188
+ .log-ai-head { display: flex; align-items: center; justify-content: space-between; gap: 0.6rem; margin-bottom: 0.5rem; }
2189
+ .log-ai-title { color: #d9c8ff; font-size: 0.66rem; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase; }
2190
+ .log-ai-actions { display: flex; align-items: center; gap: 0.4rem; }
2191
+ .log-ai-note { color: #8f7fbf; font-size: 0.6rem; }
2192
+ .log-ai-err {
2193
+ margin: 0 0 0.5rem;
2194
+ padding: 0.5rem 0.6rem;
2195
+ border: 1px solid rgba(244, 63, 94, 0.4);
2196
+ border-radius: 0.5rem;
2197
+ color: #ffb4ad;
2198
+ background: rgba(244, 63, 94, 0.1);
2199
+ font-size: 0.62rem;
2200
+ }
2201
+ .log-ai-open { margin-left: 0.5rem; }
2202
+ .log-ai-body {
2203
+ margin: 0;
2204
+ max-height: 260px;
2205
+ overflow: auto;
2206
+ padding: 0.6rem 0.7rem;
2207
+ border-radius: 0.5rem;
2208
+ background: rgba(1, 8, 19, 0.55);
2209
+ color: #d9ccff;
2210
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
2211
+ font-size: 0.66rem;
2212
+ line-height: 1.6;
2213
+ white-space: pre-wrap;
2214
+ word-break: break-word;
2215
+ }
2216
+
2217
+ @media (prefers-reduced-motion: reduce) { .log-live-dot { animation: none; } }
2218
+
2219
+ @media (max-width: 760px) {
2220
+ .log-stat-strip { grid-template-columns: repeat(2, minmax(0, 1fr)); }
2221
+ .log-toolbar-right { width: 100%; margin-left: 0; }
2222
+ .log-service-input, .log-search-input { flex: 1 1 45%; width: auto; min-width: 0; }
2223
+ .log-viewer { max-height: 48vh; font-size: 0.64rem; }
2224
+ .log-colhead, .log-row { grid-template-columns: 66px 92px minmax(0, 1fr); gap: 0.4rem; padding-inline: 0.55rem; }
2225
+ .log-colhead .log-source, .log-colhead .log-level,
2226
+ .log-row .log-source, .log-row .log-level { display: none; }
2227
+ }
2228
+
2229
+ .config-intro { padding: 1.2rem 1.35rem; }
2230
+ .config-layer-stack { display: flex; flex-direction: column; gap: 0.38rem; min-width: 120px; font-family: ui-monospace, SFMono-Regular, Consolas, monospace; font-size: 0.51rem; }
2231
+ .config-layer-stack span, .config-layer-stack b, .config-layer-stack strong, .config-layer-stack i { padding: 0.35rem 0.55rem; border-radius: 0.25rem; font-style: normal; font-weight: 500; }
2232
+ .config-layer-stack span { color: #7189a4; background: rgba(112, 168, 228, 0.1); }
2233
+ .config-layer-stack b { color: #9ecbff; background: rgba(52, 131, 218, 0.18); }
2234
+ .config-layer-stack strong { color: #d2b4ff; background: rgba(133, 81, 212, 0.24); }
2235
+ .config-layer-stack i { color: #ffaad1; background: rgba(210, 72, 145, 0.18); }
2236
+ .config-panel { padding: 1.15rem; }
2237
+ .key-value-table { margin-top: 1rem; overflow: hidden; border: 1px solid rgba(112, 168, 228, 0.14); border-radius: 0.6rem; }
2238
+ .key-value-head, .key-value-row { display: grid; grid-template-columns: minmax(150px, 1fr) 110px minmax(160px, 1.25fr) 30px; gap: 0.55rem; align-items: center; padding: 0.58rem 0.65rem; }
2239
+ .key-value-head { color: #6280a1; background: rgba(29, 67, 108, 0.25); font-family: ui-monospace, SFMono-Regular, Consolas, monospace; font-size: 0.49rem; letter-spacing: 0.1em; }
2240
+ .key-value-row { border-top: 1px solid rgba(112, 168, 228, 0.09); background: rgba(5, 20, 39, 0.34); }
2241
+ .key-value-row input, .key-value-row select { min-width: 0; width: 100%; padding: 0.48rem 0.55rem; border: 1px solid rgba(112, 168, 228, 0.14); border-radius: 0.35rem; outline: 0; color: #dcefff; background: rgba(13, 35, 61, 0.72); font-family: ui-monospace, SFMono-Regular, Consolas, monospace; font-size: 0.58rem; }
2242
+ .key-value-row input:focus, .key-value-row select:focus { border-color: rgba(84, 183, 255, 0.6); box-shadow: 0 0 0 2px rgba(84, 183, 255, 0.1); }
2243
+ .row-delete { border: 0; color: #d77b9f; background: transparent; font-size: 1rem; }
2244
+ .row-delete:hover { color: #ff8fbd; }
2245
+ .key-value-empty { padding: 1.5rem; color: #6f89a6; font-size: 0.64rem; text-align: center; }
2246
+ .key-group { border-top: 1px solid rgba(112, 168, 228, 0.14); }
2247
+ .key-group-head { display: flex; align-items: center; gap: 0.55rem; padding: 0.55rem 0.65rem; color: #bfe0ff; background: linear-gradient(90deg, rgba(47, 118, 192, 0.28), rgba(47, 118, 192, 0.06)); font-family: ui-monospace, SFMono-Regular, Consolas, monospace; font-size: 0.55rem; letter-spacing: 0.12em; text-transform: uppercase; }
2248
+ .key-group-head small { margin-left: auto; color: #5d7fa1; font-size: 0.48rem; letter-spacing: 0.05em; text-transform: none; }
2249
+ .key-group-name { color: #8fd0ff; font-weight: 700; }
2250
+ .key-add-bar { display: grid; grid-template-columns: minmax(150px, 1fr) 110px minmax(160px, 1.25fr); gap: 0.55rem; align-items: center; margin: 0.9rem 0 1rem; padding: 0 0.65rem; }
2251
+ .key-add-bar input, .key-add-bar select { min-width: 0; width: 100%; padding: 0.48rem 0.55rem; border: 1px solid rgba(112, 168, 228, 0.14); border-radius: 0.35rem; outline: 0; color: #dcefff; background: rgba(13, 35, 61, 0.72); font-family: ui-monospace, SFMono-Regular, Consolas, monospace; font-size: 0.58rem; }
2252
+ .key-add-bar input:focus, .key-add-bar select:focus { border-color: rgba(84, 183, 255, 0.6); box-shadow: 0 0 0 2px rgba(84, 183, 255, 0.1); }
2253
+ .key-add-bar select { flex: 0 0 auto; }
2254
+ .env-add-bar { display: grid; grid-template-columns: minmax(150px, 1fr) minmax(160px, 1.25fr); gap: 0.55rem; align-items: center; margin: 0.9rem 0 1rem; padding: 0 0.65rem; }
2255
+ .env-add-bar input { min-width: 0; width: 100%; padding: 0.48rem 0.55rem; border: 1px solid rgba(112, 168, 228, 0.14); border-radius: 0.35rem; outline: 0; color: #dcefff; background: rgba(13, 35, 61, 0.72); font-family: ui-monospace, SFMono-Regular, Consolas, monospace; font-size: 0.58rem; }
2256
+ .env-add-bar input:focus { border-color: rgba(84, 183, 255, 0.6); box-shadow: 0 0 0 2px rgba(84, 183, 255, 0.1); }
2257
+ .env-add-bar .env-value-wrap input { padding-right: 1.8rem; }
2258
+ .config-footer { margin-top: 1rem; color: #738ca8; font-family: ui-monospace, SFMono-Regular, Consolas, monospace; font-size: 0.55rem; }
2259
+ .source-editor { display: block; width: 100%; min-height: 390px; margin-top: 1rem; padding: 1rem; overflow: auto; resize: vertical; border: 1px solid rgba(112, 168, 228, 0.17); border-radius: 0.55rem; outline: 0; color: #c6ddf4; background: rgba(1, 8, 19, 0.8); font-family: ui-monospace, SFMono-Regular, Consolas, monospace; font-size: 0.67rem; line-height: 1.65; }
2260
+ .effective-editor { margin-top: 0; white-space: pre; }
2261
+ .env-path { overflow: hidden; color: #7491b0; font-family: ui-monospace, SFMono-Regular, Consolas, monospace; font-size: 0.54rem; text-overflow: ellipsis; white-space: nowrap; }
2262
+ .env-value-wrap { position: relative; min-width: 0; }
2263
+ .env-value-wrap input { padding-right: 1.8rem; }
2264
+ .secret-mark { position: absolute; top: 50%; right: 0.6rem; color: #526e8e; font-size: 0.5rem; transform: translateY(-50%); }
2265
+ .secret-mark.is-secret { color: #ff8fc4; text-shadow: 0 0 8px rgba(255, 143, 196, 0.8); }
2266
+
2267
+ .env-table .key-value-head, .env-table .key-value-row { grid-template-columns: 180px minmax(0, 1fr); }
2268
+ .env-table .env-value-wrap { display: flex; align-items: center; gap: 0.4rem; }
2269
+ .env-table .env-value-wrap input { flex: 1; min-width: 0; padding-right: 1.5rem; }
2270
+ .env-table .env-value-wrap .secret-mark { right: 1.6rem; }
2271
+ .env-table .env-value-wrap .row-delete {
2272
+ display: grid;
2273
+ place-items: center;
2274
+ flex: 0 0 auto;
2275
+ width: 24px;
2276
+ height: 24px;
2277
+ padding: 0;
2278
+ border: 1px solid rgba(215, 123, 159, 0.45);
2279
+ border-radius: 0.3rem;
2280
+ background: rgba(243, 110, 184, 0.12);
2281
+ color: #f77b9f;
2282
+ font-size: 0.9rem;
2283
+ line-height: 1;
2284
+ }
2285
+ .env-table .env-value-wrap .row-delete:hover { border-color: rgba(255, 111, 122, 0.65); color: #ff6b7a; background: rgba(243, 110, 184, 0.2); }
2286
+ .env-intro { background: linear-gradient(115deg, rgba(24, 69, 117, 0.4), rgba(77, 31, 92, 0.28)); }
2287
+ .env-file-switch { display: inline-flex; padding: 0.15rem; gap: 0.15rem; border: 1px solid rgba(112, 168, 228, 0.18); border-radius: 0.5rem; background: rgba(7, 22, 40, 0.6); }
2288
+ .env-file-switch button {
2289
+ padding: 0.32rem 0.6rem;
2290
+ border: 0;
2291
+ border-radius: 0.36rem;
2292
+ color: #7f9ab6;
2293
+ background: transparent;
2294
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
2295
+ font-size: 0.6rem;
2296
+ cursor: pointer;
2297
+ transition: color 0.15s, background 0.15s, box-shadow 0.15s;
2298
+ }
2299
+ .env-file-switch button:hover { color: #c9e2f7; }
2300
+ .env-file-switch button.is-active { color: #e3f4ff; background: linear-gradient(135deg, rgba(26, 108, 200, 0.6), rgba(128, 90, 200, 0.6)); box-shadow: 0 1px 8px rgba(70, 140, 255, 0.35); }
2301
+ .env-lock-art {
2302
+ position: relative;
2303
+ display: flex;
2304
+ flex-direction: column;
2305
+ align-items: center;
2306
+ justify-content: center;
2307
+ width: 82px;
2308
+ height: 82px;
2309
+ border: 1px solid rgba(243, 110, 184, 0.35);
2310
+ border-radius: 50%;
2311
+ color: #ff96c9;
2312
+ background: radial-gradient(circle, rgba(243, 110, 184, 0.25), transparent 68%);
2313
+ box-shadow: 0 0 30px rgba(243, 110, 184, 0.18);
2314
+ animation: orbit-ring-glow 4.5s ease-in-out infinite, hero-art-breathe 5s ease-in-out infinite;
2315
+ }
2316
+ .env-lock-art::before {
2317
+ content: "";
2318
+ position: absolute;
2319
+ top: 50%;
2320
+ left: 50%;
2321
+ width: 58px;
2322
+ height: 66px;
2323
+ transform: translate(-50%, -50%);
2324
+ opacity: 0.1;
2325
+ background: linear-gradient(180deg, rgba(255, 190, 224, 0.95), rgba(210, 80, 150, 0.85) 46%, rgba(120, 30, 86, 0.9));
2326
+ clip-path: polygon(50% 0%, 87% 10%, 100% 24%, 100% 66%, 87% 84%, 50% 100%, 13% 84%, 0% 66%, 0% 24%, 13% 10%);
2327
+ animation: shield-glow 3s ease-in-out infinite;
2328
+ }
2329
+ .env-lock-art::after {
2330
+ content: "";
2331
+ position: absolute;
2332
+ top: 50%;
2333
+ left: 50%;
2334
+ width: 46px;
2335
+ height: 54px;
2336
+ transform: translate(-50%, -50%);
2337
+ opacity: 0.1;
2338
+ background: radial-gradient(circle at 50% 32%, rgba(255, 170, 214, 0.55), rgba(80, 14, 58, 0.78) 74%);
2339
+ clip-path: polygon(50% 6%, 82% 16%, 94% 54%, 50% 96%, 6% 54%, 18% 16%);
2340
+ animation: shield-inner 4.5s ease-in-out infinite;
2341
+ }
2342
+ .env-lock-glyph {
2343
+ position: relative;
2344
+ z-index: 1;
2345
+ font-style: normal;
2346
+ font-size: 1.7rem;
2347
+ line-height: 1;
2348
+ animation: glyph-glow 2.6s ease-in-out infinite;
2349
+ }
2350
+ .env-lock-art span {
2351
+ position: relative;
2352
+ z-index: 1;
2353
+ display: block;
2354
+ margin-top: 0.15rem;
2355
+ color: #ffb6d9;
2356
+ font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
2357
+ font-size: 0.43rem;
2358
+ letter-spacing: 0.1em;
2359
+ animation: hero-text-glow 3.4s ease-in-out infinite;
2360
+ }
2361
+ @keyframes glyph-glow {
2362
+ 0%, 100% { filter: drop-shadow(0 0 4px rgba(255, 159, 214, 0.5)) drop-shadow(0 0 12px rgba(255, 159, 214, 0.3)); }
2363
+ 50% { filter: drop-shadow(0 0 8px rgba(255, 210, 235, 0.95)) drop-shadow(0 0 24px rgba(255, 159, 214, 0.65)); }
2364
+ }
2365
+ @keyframes shield-glow {
2366
+ 0%, 100% { filter: drop-shadow(0 0 2px rgba(255, 159, 214, 0.15)); opacity: 0.06; }
2367
+ 50% { filter: drop-shadow(0 0 6px rgba(255, 159, 214, 0.4)); opacity: 0.14; }
2368
+ }
2369
+ @keyframes shield-inner {
2370
+ 0%, 100% { filter: brightness(1); opacity: 0.08; }
2371
+ 50% { filter: brightness(1.4); opacity: 0.12; }
2372
+ }
2373
+ @media (prefers-reduced-motion: reduce) { .env-lock-art, .env-lock-art::before, .env-lock-art::after, .env-lock-glyph, .env-lock-art span { animation: none; } }
2374
+ .admin-notice { padding: 0.7rem 0.85rem; border: 1px solid rgba(255, 194, 101, 0.28); border-radius: 0.5rem; color: #ffd48a; background: rgba(150, 91, 26, 0.14); font-size: 0.62rem; }
2375
+
2376
+ .confirm-overlay { position: fixed; inset: 0; z-index: 100; display: grid; place-items: center; padding: 1rem; background: rgba(2, 8, 18, 0.66); backdrop-filter: blur(6px) saturate(0.55); -webkit-backdrop-filter: blur(6px) saturate(0.55); transition: opacity 0.22s ease, background-color 0.22s ease, backdrop-filter 0.22s ease, -webkit-backdrop-filter 0.22s ease; }
2377
+ .confirm-dialog { width: min(420px, 92vw); padding: 1.2rem 1.3rem 1.25rem; border: 1px solid rgba(112, 168, 228, 0.3); border-radius: 0.85rem; background: linear-gradient(150deg, rgba(13, 35, 67, 0.97), rgba(9, 18, 40, 0.97)); box-shadow: 0 1.2rem 2.8rem rgba(0, 0, 0, 0.55); animation: confirm-pop 150ms ease; }
2378
+ .confirm-dialog-head { display: flex; align-items: center; gap: 0.7rem; }
2379
+ .confirm-dialog-mark { display: grid; width: 30px; height: 30px; flex: 0 0 auto; place-items: center; border: 1px solid rgba(244, 117, 172, 0.42); border-radius: 50%; color: #ff8fc4; background: radial-gradient(circle, rgba(243, 110, 184, 0.2), transparent 70%); box-shadow: 0 0 18px rgba(243, 110, 184, 0.18); font-family: ui-monospace, SFMono-Regular, Consolas, monospace; font-weight: 700; }
2380
+ .confirm-dialog-head strong { color: #f3f9ff; font-size: 0.92rem; }
2381
+ .confirm-dialog-close { margin-left: auto; border: 0; color: #7d96b2; background: transparent; font-size: 1.15rem; }
2382
+ .confirm-dialog-close:hover { color: #e8f4ff; }
2383
+ .confirm-dialog-message { margin: 0.9rem 0 1.15rem; color: #a9c1db; font-size: 0.78rem; line-height: 1.6; }
2384
+ .confirm-dialog-message strong { color: #ffffff; font-weight: 600; }
2385
+ .confirm-dialog-actions { display: flex; justify-content: flex-end; gap: 0.6rem; }
2386
+ .confirm-dialog-primary { background: linear-gradient(135deg, rgba(225, 61, 120, 0.55), rgba(161, 42, 98, 0.5)); border-color: rgba(244, 117, 172, 0.4); color: #ffe1ee; }
2387
+ .confirm-dialog-primary:hover:not(:disabled) { border-color: rgba(244, 117, 172, 0.65); background: linear-gradient(135deg, rgba(239, 76, 138, 0.72), rgba(190, 52, 118, 0.6)); }
2388
+ .confirm-dialog-primary:disabled { opacity: 0.55; cursor: default; }
2389
+ @starting-style {
2390
+ .provider-modal-backdrop,
2391
+ .confirm-overlay,
2392
+ .safe-goto-overlay {
2393
+ opacity: 0;
2394
+ background-color: rgba(2, 8, 18, 0);
2395
+ backdrop-filter: blur(0) saturate(1);
2396
+ -webkit-backdrop-filter: blur(0) saturate(1);
2397
+ }
2398
+ }
2399
+ @keyframes confirm-pop { from { opacity: 0; transform: translateY(8px) scale(0.98); } to { opacity: 1; transform: none; } }
2400
+ .confirm-dialog { animation: confirm-pop 150ms ease; }
2401
+
2402
+ /* ── Cluster pairing celebration (flying ribbons) ──────────────── */
2403
+ .celebrate-overlay { position: fixed; inset: 0; z-index: 200; display: grid; place-items: center; padding: 1rem; overflow: hidden; background: rgba(0, 0, 0, 0.28); backdrop-filter: none; -webkit-backdrop-filter: none; pointer-events: none; opacity: 0; animation: celebrate-fade-in 220ms ease forwards; transition: opacity 220ms ease; }
2404
+ .celebrate-overlay.exiting { opacity: 0; animation: none; }
2405
+ .celebrate-card { position: relative; z-index: 2; pointer-events: auto; width: min(460px, 92vw); padding: 2rem 2.2rem; text-align: center; border: 1px solid rgba(92, 220, 180, 0.35); border-radius: 1rem; background: linear-gradient(150deg, rgba(10, 40, 66, 0.92), rgba(6, 16, 36, 0.94)); box-shadow: 0 1.2rem 2.8rem rgba(0, 0, 0, 0.55); animation: confirm-pop 240ms cubic-bezier(0.34, 1.56, 0.64, 1); transition: transform 220ms ease, opacity 220ms ease; }
2406
+ .celebrate-overlay.exiting .celebrate-card { transform: scale(0.94); opacity: 0; }
2407
+ @keyframes celebrate-fade-in { from { opacity: 0; } to { opacity: 1; } }
2408
+ .celebrate-kicker { display: inline-block; margin-bottom: 0.75rem; padding: 0.25rem 0.7rem; border-radius: 999px; background: rgba(52, 211, 153, 0.14); color: #34d399; font-size: 0.62rem; letter-spacing: 0.14em; }
2409
+ .celebrate-title { margin: 0 0 0.5rem; font-size: clamp(1.9rem, 5vw, 2.7rem); font-weight: 800; line-height: 1.1; background: linear-gradient(90deg, #34d399, #fbbf24, #38bdf8, #fb7185, #34d399); background-size: 300% 100%; -webkit-background-clip: text; background-clip: text; color: transparent; animation: celebrate-shimmer 3.2s linear infinite; }
2410
+ .celebrate-sub { margin: 0 0 1rem; color: #9fb6d2; font-size: 0.85rem; }
2411
+ .celebrate-node { display: inline-flex; flex-wrap: wrap; gap: 0.4rem 1rem; justify-content: center; margin-bottom: 1.25rem; padding: 0.55rem 0.9rem; border: 1px solid rgba(148, 163, 184, 0.25); border-radius: 0.6rem; background: rgba(2, 8, 18, 0.5); font-family: ui-monospace, SFMono-Regular, Consolas, monospace; font-size: 0.72rem; color: #cbd5e1; }
2412
+ .celebrate-node b { color: #64748b; font-weight: 600; margin-right: 0.25rem; }
2413
+ .celebrate-dismiss { margin-top: 0.25rem; }
2414
+ .celebrate-ribbons { position: absolute; inset: 0; pointer-events: none; overflow: hidden; }
2415
+ .celebrate-ribbon { position: absolute; top: -12%; width: 11px; height: 30px; border-radius: 3px; opacity: 0; transform: rotate(0deg); animation-name: celebrate-ribbon-fall; animation-timing-function: linear; animation-iteration-count: infinite; }
2416
+ @keyframes celebrate-ribbon-fall {
2417
+ 0% { opacity: 0; transform: translate(0, 0) rotate(0deg) scale(1); }
2418
+ 6% { opacity: 0.95; }
2419
+ 60% { opacity: 0.9; }
2420
+ 100% { opacity: 0; transform: translate(var(--sway, 60px), 118vh) rotate(var(--rot, 540deg)) scale(0.9); }
2421
+ }
2422
+ @keyframes celebrate-shimmer { to { background-position: -300% 0; } }
2423
+ @media (prefers-reduced-motion: reduce) {
2424
+ .celebrate-overlay, .celebrate-card { animation: none; transition: none; }
2425
+ .celebrate-ribbon, .celebrate-title { animation: none; }
2426
+ .celebrate-ribbon { display: none; }
2427
+ }
2428
+
2429
+ .appearance-panel { position: absolute; top: calc(100% + 0.75rem); right: 0; z-index: 30; width: 245px; padding: 0.85rem; border: 1px solid rgba(112, 168, 228, 0.2); border-radius: 0.6rem; background: rgba(9, 22, 43, 0.92); box-shadow: 0 1.2rem 2.8rem rgba(0, 0, 0, 0.55); backdrop-filter: blur(20px) saturate(135%); -webkit-backdrop-filter: blur(20px) saturate(135%); animation: admin-pop 0.2s cubic-bezier(0.22, 1, 0.36, 1); }
2430
+ .appearance-heading { display: flex; align-items: center; justify-content: space-between; margin-bottom: 0.6rem; }
2431
+ .appearance-heading > span:last-child { color: #6e89a8; font-family: ui-monospace, SFMono-Regular, Consolas, monospace; font-size: 0.45rem; }
2432
+ .appearance-panel > strong { display: block; margin-bottom: 0.65rem; color: #eaf6ff; font-size: 0.72rem; }
2433
+ .appearance-options, .ui-mode-options { display: flex; flex-direction: column; gap: 0.3rem; }
2434
+ .appearance-options button, .ui-mode-options button { display: flex; align-items: center; gap: 0.55rem; width: 100%; padding: 0.46rem; border: 1px solid transparent; border-radius: 0.45rem; color: #9ab2ce; background: transparent; text-align: left; }
2435
+ .appearance-options button:hover, .appearance-options button.is-selected, .ui-mode-options button:hover, .ui-mode-options button.is-selected { border-color: rgba(84, 183, 255, 0.26); color: #edf8ff; background: rgba(61, 139, 220, 0.14); }
2436
+ .appearance-options button > span:nth-child(2) { display: flex; flex: 1; flex-direction: column; gap: 0.12rem; }
2437
+ .appearance-options b { font-size: 0.6rem; font-weight: 600; }
2438
+ .appearance-options small, .ui-mode-options small { color: #6f89a7; font-size: 0.51rem; }
2439
+ .appearance-options i { color: #61c7ff; font-size: 0.7rem; font-style: normal; }
2440
+ .theme-preview { width: 26px; height: 26px; flex: 0 0 auto; border: 1px solid rgba(255, 255, 255, 0.25); border-radius: 0.35rem; box-shadow: inset 0 0 11px rgba(255, 255, 255, 0.15); }
2441
+ .theme-preview.aurora { background: linear-gradient(135deg, #0d5b9c, #4262dd 55%, #b558c6); }
2442
+ .theme-preview.midnight { background: linear-gradient(135deg, #080f1c, #162c48 55%, #26364e); }
2443
+ .theme-preview.violet { background: linear-gradient(135deg, #22154c, #5c2c9c 55%, #d063b6); }
2444
+ .appearance-divider { height: 1px; margin: 0.7rem 0; background: rgba(112, 168, 228, 0.14); }
2445
+ .ui-mode-options { margin-top: 0.45rem; }
2446
+ .ui-mode-options button { justify-content: space-between; padding: 0.42rem 0.5rem; font-size: 0.59rem; }
2447
+ .ui-mode-options button small { margin-left: auto; }
2448
+
2449
+ .admin-account { position: relative; }
2450
+ @keyframes admin-pop { from { opacity: 0; transform: translateY(-6px) scale(0.98); } to { opacity: 1; transform: translateY(0) scale(1); } }
2451
+ .account-panel { position: absolute; top: calc(100% + 0.75rem); right: 0; z-index: 31; width: 230px; padding: 0.6rem; border: 1px solid rgba(112, 168, 228, 0.2); border-radius: 0.6rem; background: rgba(9, 22, 43, 0.92); box-shadow: 0 1.2rem 2.8rem rgba(0, 0, 0, 0.55); backdrop-filter: blur(20px) saturate(135%); -webkit-backdrop-filter: blur(20px) saturate(135%); animation: admin-pop 0.2s cubic-bezier(0.22, 1, 0.36, 1); }
2452
+
2453
+ .account-panel::before {
2454
+ content: "";
2455
+ position: absolute;
2456
+ top: -6px;
2457
+ right: 10px;
2458
+ width: 11px;
2459
+ height: 11px;
2460
+ border-left: 1px solid rgba(112, 168, 228, 0.2);
2461
+ border-top: 1px solid rgba(112, 168, 228, 0.2);
2462
+ background: rgba(9, 22, 43, 0.92);
2463
+ transform: rotate(45deg);
2464
+ }
2465
+ .appearance-panel::before {
2466
+ content: "";
2467
+ position: absolute;
2468
+ top: -6px;
2469
+ right: 9.5px;
2470
+ width: 11px;
2471
+ height: 11px;
2472
+ border-left: 1px solid rgba(112, 168, 228, 0.2);
2473
+ border-top: 1px solid rgba(112, 168, 228, 0.2);
2474
+ background: rgba(9, 22, 43, 0.92);
2475
+ transform: rotate(45deg);
2476
+ }
2477
+ .account-head { display: flex; align-items: center; gap: 0.6rem; padding: 0.35rem 0.4rem; }
2478
+ .account-avatar { display: grid; width: 34px; height: 34px; flex: 0 0 auto; place-items: center; border: 1px solid rgba(84, 183, 255, 0.52); border-radius: 50%; color: #fff; background: linear-gradient(135deg, #2767a6, #7544a7); font-size: 0.62rem; font-weight: 700; }
2479
+ .account-meta { display: flex; min-width: 0; flex-direction: column; gap: 0.12rem; }
2480
+ .account-meta strong { color: #eaf6ff; font-size: 0.68rem; font-weight: 700; }
2481
+ .account-meta small { overflow: hidden; color: #6f89a7; font-size: 0.52rem; text-overflow: ellipsis; white-space: nowrap; }
2482
+ .account-divider { height: 1px; margin: 0.55rem 0; background: rgba(112, 168, 228, 0.14); }
2483
+ .account-item { display: flex; align-items: center; gap: 0.6rem; width: 100%; padding: 0.5rem 0.5rem; border: 1px solid transparent; border-radius: 0.5rem; color: #9ab2ce; background: transparent; text-align: left; }
2484
+ .account-item:hover { border-color: rgba(84, 183, 255, 0.26); color: #edf8ff; background: rgba(61, 139, 220, 0.14); }
2485
+ .account-item-icon { display: grid; width: 24px; height: 24px; place-items: center; border-radius: 0.4rem; color: #61c7ff; background: rgba(40, 110, 178, 0.25); font-size: 0.7rem; }
2486
+ .account-item > span:last-child { display: flex; flex-direction: column; gap: 0.1rem; }
2487
+ .account-item b { color: inherit; font-size: 0.62rem; font-weight: 600; }
2488
+ .account-item small { color: #6f89a7; font-size: 0.5rem; }
2489
+ .account-item.account-danger:hover { border-color: rgba(244, 117, 172, 0.34); color: #ffd5e8; background: rgba(243, 110, 184, 0.12); }
2490
+ .account-item.account-danger .account-item-icon { color: #ff8fc4; background: rgba(243, 110, 184, 0.16); }
2491
+
2492
+ .admin-shell.theme-midnight { --admin-blue: #78bfff; --admin-violet: #7da5d3; --admin-pink: #b8c7db; background: radial-gradient(45rem 34rem at 55% -15%, rgba(51, 93, 137, 0.2), transparent 72%), linear-gradient(135deg, #02050b, #07111f 54%, #030711); }
2493
+ .admin-shell.theme-midnight .admin-shell::before { opacity: 0.18; }
2494
+ .admin-shell.theme-midnight .admin-nav button.is-active { background: rgba(79, 137, 193, 0.18); }
2495
+ .admin-shell.theme-violet { --admin-blue: #b4a1ff; --admin-violet: #d78bff; --admin-pink: #ff8ed1; background: radial-gradient(48rem 34rem at 60% -12%, rgba(117, 58, 194, 0.32), transparent 72%), radial-gradient(35rem 28rem at 0% 85%, rgba(53, 65, 176, 0.22), transparent 72%), #0b071b; }
2496
+ .admin-shell.theme-violet .admin-nav button.is-active { border-color: rgba(198, 134, 255, 0.34); background: linear-gradient(90deg, rgba(111, 64, 188, 0.3), rgba(195, 74, 170, 0.12)); box-shadow: inset 3px 0 #cf8cff, 0 8px 24px rgba(118, 49, 177, 0.14); }
2497
+ .admin-shell.theme-violet .section-heading-mark { background: linear-gradient(#c989ff, #ff86ca); }
2498
+ .admin-shell.ui-compact .admin-sidebar { flex-basis: 210px; padding-inline: 0.7rem; }
2499
+ .admin-shell.ui-compact .admin-content { padding: 1.25rem 1.25rem 4.5rem; }
2500
+ .admin-shell.ui-compact .admin-dock { left: 210px; }
2501
+ .admin-shell.ui-compact .admin-side-widget { display: none; }
2502
+ .admin-shell.ui-focus .admin-inspector { display: none; }
2503
+ .admin-shell.ui-focus .admin-content-layout { display: block; }
2504
+ .admin-shell.ui-focus .admin-content { max-width: 1180px; margin: auto; }
2505
+
2506
+ @media (max-width: 760px) {
2507
+ .admin-shell.ui-compact .admin-sidebar { flex-basis: 246px; }
2508
+ .admin-shell.ui-compact .admin-dock { left: 0; }
2509
+ }
2510
+
2511
+ @media (max-width: 620px) {
2512
+ .account-panel { position: fixed; top: 58px; right: 0.6rem; width: 250px; }
2513
+ }
2514
+
2515
+ .admin-tool-rail { position: fixed; top: 50%; right: 0.8rem; z-index: 4; display: flex; flex-direction: column; gap: 0.45rem; padding: 0.55rem 0.4rem; transform: translateY(-50%); border: 1px solid rgba(83, 177, 255, 0.35); border-radius: 999px; background: rgba(6, 19, 39, 0.78); box-shadow: 0 0 28px rgba(45, 125, 221, 0.18); backdrop-filter: blur(18px); }
2516
+ .admin-tool-rail button { position: relative; display: grid; width: 30px; height: 30px; flex: 0 0 auto; place-items: center; border: 0; border-radius: 50%; color: #9fc7ec; background: transparent; font-size: 0.78rem; cursor: pointer; }
2517
+ .admin-tool-rail button:hover { color: white; background: rgba(71, 161, 247, 0.2); }
2518
+ .admin-tool-rail button.is-active { color: white; background: linear-gradient(135deg, rgba(38, 130, 225, 0.55), rgba(90, 67, 183, 0.45)); box-shadow: 0 0 12px rgba(45, 125, 221, 0.3); }
2519
+ .admin-tool-rail button[data-tip]::after {
2520
+ content: attr(data-tip);
2521
+ position: absolute;
2522
+ bottom: calc(100% + 8px);
2523
+ left: 50%;
2524
+ z-index: 50;
2525
+ padding: 0.3rem 0.55rem;
2526
+ border: 1px solid rgba(83, 177, 255, 0.4);
2527
+ border-radius: 0.45rem;
2528
+ color: #eaf6ff;
2529
+ background: rgba(6, 19, 39, 0.96);
2530
+ box-shadow: 0 6px 18px rgba(0, 0, 0, 0.4);
2531
+ font-size: 0.58rem;
2532
+ font-weight: 600;
2533
+ letter-spacing: 0.02em;
2534
+ line-height: 1.2;
2535
+ white-space: nowrap;
2536
+ opacity: 0;
2537
+ pointer-events: none;
2538
+ transform: translateX(-50%) translateY(2px);
2539
+ transition: opacity 120ms ease, transform 120ms ease;
2540
+ }
2541
+ .admin-tool-rail button[data-tip]:hover::after,
2542
+ .admin-tool-rail button[data-tip]:focus-visible::after { opacity: 1; transform: translateX(-50%) translateY(0); }
2543
+
2544
+ .rail-panel { position: fixed; top: 50%; right: 3.4rem; z-index: 40; width: 250px; max-height: 70vh; overflow: auto; padding: 0.9rem; translate: 0 -50%; border: 1px solid rgba(92, 185, 255, 0.3); border-radius: 0.75rem; background: rgba(7, 30, 58, 0.92); box-shadow: 0 1.2rem 2.8rem rgba(0, 0, 0, 0.55); backdrop-filter: blur(20px) saturate(135%); -webkit-backdrop-filter: blur(20px) saturate(135%); animation: admin-pop 0.2s cubic-bezier(0.22, 1, 0.36, 1); }
2545
+ .rail-panel-head { display: flex; align-items: center; gap: 0.5rem; margin-bottom: 0.55rem; }
2546
+ .rail-x { margin-left: auto; border: 0; color: var(--admin-muted); background: transparent; font-size: 1.05rem; line-height: 1; }
2547
+ .rail-x:hover { color: var(--admin-ink); }
2548
+ .rail-panel-text { margin: 0 0 0.6rem; color: #9ab2ce; font-size: 0.68rem; line-height: 1.5; }
2549
+ .rail-panel-hint { display: block; color: #6f89a7; font-size: 0.6rem; }
2550
+ .rail-divider { height: 1px; margin: 0.6rem 0; background: rgba(112, 168, 228, 0.14); }
2551
+ .rail-row { display: flex; align-items: center; justify-content: space-between; gap: 0.5rem; margin-top: 0.6rem; }
2552
+ .rail-empty { color: #6f89a7; font-size: 0.66rem; padding: 0.3rem 0; }
2553
+ .rail-notes { display: block; width: 100%; min-height: 110px; padding: 0.5rem; resize: vertical; border: 1px solid rgba(112, 168, 228, 0.17); border-radius: 0.5rem; outline: 0; color: #dcefff; background: rgba(1, 8, 19, 0.8); font-family: ui-monospace, SFMono-Regular, Consolas, monospace; font-size: 0.66rem; line-height: 1.55; }
2554
+ .rail-list { display: flex; flex-direction: column; gap: 0.3rem; margin: 0; padding: 0; list-style: none; }
2555
+ .rail-list li { display: flex; flex-direction: column; gap: 0.1rem; padding: 0.35rem 0.4rem; border: 1px solid transparent; border-radius: 0.4rem; }
2556
+ .rail-list li:hover { border-color: rgba(84, 183, 255, 0.2); background: rgba(61, 139, 220, 0.08); }
2557
+ .rail-list li b { color: #dcecff; font-size: 0.66rem; }
2558
+ .rail-list li span { color: #6f89a7; font-size: 0.56rem; }
2559
+ .rail-list--nav li { padding: 0; }
2560
+ .rail-list--nav li button { display: flex; align-items: center; gap: 0.5rem; width: 100%; padding: 0.4rem 0.45rem; border: 0; border-radius: 0.4rem; color: #9ab2ce; background: transparent; text-align: left; cursor: pointer; }
2561
+ .rail-list--nav li button:hover, .rail-list--nav li button.is-on { color: #edf8ff; background: rgba(61, 139, 220, 0.14); }
2562
+ .rail-fav-icon { width: 18px; text-align: center; }
2563
+ .rail-fav-label { flex: 1; font-size: 0.66rem; }
2564
+ .rail-fav-check { color: #61c7ff; font-size: 0.66rem; }
2565
+ .rail-appearance { display: flex; flex-direction: column; gap: 0.3rem; margin-top: 0.4rem; }
2566
+ .rail-appearance button { display: flex; align-items: center; gap: 0.55rem; width: 100%; padding: 0.45rem; border: 1px solid transparent; border-radius: 0.45rem; color: #9ab2ce; background: transparent; text-align: left; cursor: pointer; }
2567
+ .rail-appearance button:hover, .rail-appearance button.is-selected { border-color: rgba(84, 183, 255, 0.26); color: #edf8ff; background: rgba(61, 139, 220, 0.14); }
2568
+ .rail-appearance-label { display: flex; flex: 1; flex-direction: column; gap: 0.12rem; }
2569
+ .rail-appearance b { font-size: 0.62rem; font-weight: 600; }
2570
+ .rail-appearance small { color: #6f89a7; font-size: 0.52rem; }
2571
+ .rail-appearance i { color: #61c7ff; font-size: 0.66rem; font-style: normal; }
2572
+
2573
+ .admin-notify { position: relative; }
2574
+
2575
+ .notify-panel {
2576
+ position: absolute;
2577
+ top: calc(100% + 0.7rem);
2578
+ right: 0;
2579
+ z-index: 45;
2580
+ width: min(380px, calc(100vw - 2rem));
2581
+ max-height: min(70vh, 620px);
2582
+ display: flex;
2583
+ flex-direction: column;
2584
+ border: 1px solid rgba(112, 168, 228, 0.2);
2585
+ border-radius: 0.6rem;
2586
+ background: rgba(9, 22, 43, 0.92);
2587
+ box-shadow: 0 1.2rem 2.8rem rgba(0, 0, 0, 0.55);
2588
+ backdrop-filter: blur(20px) saturate(135%);
2589
+ -webkit-backdrop-filter: blur(20px) saturate(135%);
2590
+ animation: notify-pop 0.22s cubic-bezier(0.22, 1, 0.36, 1);
2591
+ }
2592
+ .notify-panel::before {
2593
+ content: '';
2594
+ position: absolute;
2595
+ top: -5px;
2596
+ right: 9.5px;
2597
+ z-index: 2;
2598
+ width: 10px;
2599
+ height: 10px;
2600
+ transform: rotate(45deg);
2601
+ border-top: 1px solid rgba(112, 168, 228, 0.2);
2602
+ border-left: 1px solid rgba(112, 168, 228, 0.2);
2603
+ background: rgba(9, 22, 43, 0.92);
2604
+ }
2605
+ @keyframes notify-pop {
2606
+ from { opacity: 0; transform: translateY(-6px) scale(0.98); }
2607
+ to { opacity: 1; transform: translateY(0) scale(1); }
2608
+ }
2609
+ .notify-head {
2610
+ display: flex;
2611
+ align-items: center;
2612
+ gap: 0.55rem;
2613
+ flex: 0 0 auto;
2614
+ padding: 0.7rem 0.8rem;
2615
+ border-bottom: 1px solid rgba(112, 168, 228, 0.14);
2616
+ border-radius: 0.6rem 0.6rem 0 0;
2617
+ }
2618
+ .notify-head-icon {
2619
+ display: grid;
2620
+ width: 28px;
2621
+ height: 28px;
2622
+ flex: 0 0 auto;
2623
+ place-items: center;
2624
+ border-radius: 0.5rem;
2625
+ color: #cfeaff;
2626
+ background: linear-gradient(135deg, rgba(38, 130, 225, 0.5), rgba(90, 67, 183, 0.4));
2627
+ font-size: 0.8rem;
2628
+ }
2629
+ .notify-head-titles { display: flex; flex-direction: column; gap: 0.05rem; }
2630
+ .notify-head-titles strong { color: #eaf6ff; font-size: 0.74rem; font-weight: 600; }
2631
+ .notify-refresh {
2632
+ width: 24px;
2633
+ height: 24px;
2634
+ margin-left: auto;
2635
+ border: 1px solid rgba(112, 168, 228, 0.2);
2636
+ border-radius: 0.4rem;
2637
+ color: var(--admin-muted);
2638
+ background: rgba(25, 57, 95, 0.34);
2639
+ font-size: 0.72rem;
2640
+ line-height: 1;
2641
+ }
2642
+ .notify-refresh:hover { color: var(--admin-ink); background: rgba(71, 161, 247, 0.2); }
2643
+ .notify-refresh:disabled { opacity: 0.5; }
2644
+ .notify-head .rail-x { margin-left: 0; }
2645
+
2646
+ .notify-body { flex: 1 1 auto; overflow-y: auto; overscroll-behavior: contain; }
2647
+ .notify-body::-webkit-scrollbar { width: 8px; }
2648
+ .notify-body::-webkit-scrollbar-thumb { border-radius: 4px; background: rgba(112, 168, 228, 0.22); }
2649
+
2650
+ .notify-summary { display: flex; flex-wrap: wrap; gap: 0.35rem 0.7rem; padding: 0.55rem 0.8rem; border-bottom: 1px solid rgba(112, 168, 228, 0.1); }
2651
+ .notify-summary span { display: inline-flex; align-items: center; gap: 0.3rem; color: #9ab2ce; font-size: 0.6rem; }
2652
+ .notify-summary .is-err { color: #fda4af; }
2653
+ .notify-summary .is-warn { color: #fcd34d; }
2654
+ .notify-summary .is-ok { color: #6ee7b7; }
2655
+ .notify-summary .is-log { color: #93c5fd; }
2656
+
2657
+ .notify-section-title { display: flex; align-items: center; justify-content: space-between; gap: 0.5rem; padding: 0.6rem 0.8rem 0.3rem; }
2658
+ .notify-section-title span { color: #6f89a7; font-size: 0.58rem; letter-spacing: 0.12em; }
2659
+ .notify-section-title button { border: 0; color: var(--admin-blue); background: transparent; font-size: 0.58rem; }
2660
+ .notify-section-title button:hover { color: var(--admin-ink); }
2661
+ .notify-section-title button:disabled { opacity: 0.4; }
2662
+ .notify-section-meta { color: #5f7c99 !important; letter-spacing: 0 !important; }
2663
+
2664
+ .notify-alerts { display: flex; flex-direction: column; gap: 0.3rem; margin: 0; padding: 0.15rem 0.6rem 0.6rem; list-style: none; }
2665
+ .notify-alerts li {
2666
+ position: relative;
2667
+ display: flex;
2668
+ align-items: flex-start;
2669
+ gap: 0.5rem;
2670
+ overflow: hidden;
2671
+ padding: 0.45rem 0.5rem 0.45rem 0.6rem;
2672
+ border: 1px solid rgba(112, 168, 228, 0.12);
2673
+ border-radius: 0.5rem;
2674
+ background: rgba(10, 32, 60, 0.5);
2675
+ }
2676
+ .notify-alerts li:hover { border-color: rgba(84, 183, 255, 0.28); background: rgba(61, 139, 220, 0.1); }
2677
+ .notify-alert-bar { position: absolute; top: 0; bottom: 0; left: 0; width: 3px; }
2678
+ .notify-alerts li.is-err .notify-alert-bar { background: #fb7185; box-shadow: 0 0 8px rgba(251, 113, 133, 0.6); }
2679
+ .notify-alerts li.is-warn .notify-alert-bar { background: #fbbf24; box-shadow: 0 0 8px rgba(251, 191, 36, 0.6); }
2680
+ .notify-alerts li.is-ok .notify-alert-bar { background: #34d399; box-shadow: 0 0 8px rgba(52, 211, 153, 0.6); }
2681
+ .notify-alert-dot { flex: none; width: 7px; height: 7px; margin-top: 0.32rem; border-radius: 50%; }
2682
+ .notify-alerts li.is-err .notify-alert-dot { background: #fb7185; box-shadow: 0 0 6px rgba(251, 113, 133, 0.7); }
2683
+ .notify-alerts li.is-warn .notify-alert-dot { background: #fbbf24; box-shadow: 0 0 6px rgba(251, 191, 36, 0.7); }
2684
+ .notify-alerts li.is-ok .notify-alert-dot { background: #34d399; box-shadow: 0 0 6px rgba(52, 211, 153, 0.7); }
2685
+ .notify-alert-body { display: flex; flex-direction: column; gap: 0.15rem; flex: 1; min-width: 0; }
2686
+ .notify-alert-body b { color: #dcecff; font-size: 0.64rem; font-weight: 600; line-height: 1.45; overflow-wrap: anywhere; }
2687
+ .notify-alert-body small { color: #6f89a7; font-size: 0.54rem; }
2688
+ .notify-alert-x { flex: none; width: 18px; height: 18px; border: 0; border-radius: 0.3rem; color: var(--admin-blue); background: transparent; font-size: 0.85rem; line-height: 1; }
2689
+ .notify-alert-x:hover { color: var(--admin-ink); background: rgba(71, 161, 247, 0.2); }
2690
+
2691
+ .notify-logs { display: flex; flex-direction: column; gap: 0.3rem; margin: 0; padding: 0.15rem 0.6rem 0.7rem; list-style: none; }
2692
+ .notify-logs li { display: flex; flex-direction: column; gap: 0.1rem; padding: 0.4rem 0.5rem; border: 1px solid transparent; border-radius: 0.45rem; }
2693
+ .notify-logs li:hover { border-color: rgba(251, 113, 133, 0.25); background: rgba(251, 113, 133, 0.06); }
2694
+ .notify-logs li b { color: #fda4af; font-size: 0.62rem; }
2695
+ .notify-logs li span { color: #6f89a7; font-size: 0.54rem; }
2696
+ .notify-logs li p { margin: 0.1rem 0 0; color: #ffb4b4; font-size: 0.58rem; font-family: ui-monospace, SFMono-Regular, Consolas, monospace; line-height: 1.45; overflow-wrap: anywhere; }
2697
+
2698
+ .notify-empty { display: flex; flex-direction: column; align-items: center; gap: 0.4rem; padding: 1.6rem 1rem 1.8rem; text-align: center; }
2699
+ .notify-empty-icon { color: rgba(97, 199, 255, 0.35); font-size: 1.6rem; }
2700
+ .notify-empty strong { color: #cfe0f0; font-size: 0.72rem; font-weight: 600; }
2701
+ .notify-empty p { margin: 0; color: #6f89a7; font-size: 0.6rem; }
2702
+
2703
+ .admin-toasts { position: fixed; top: 1rem; right: 1rem; z-index: 999; display: flex; flex-direction: column; gap: 0.6rem; width: min(22rem, calc(100vw - 2rem)); pointer-events: none; }
2704
+ .admin-toast {
2705
+ position: relative;
2706
+ display: flex;
2707
+ align-items: flex-start;
2708
+ gap: 0.65rem;
2709
+ overflow: hidden;
2710
+ padding: 0.75rem 0.8rem;
2711
+ border: 1px solid color-mix(in srgb, var(--admin-blue) 42%, transparent);
2712
+ border-radius: 0.9rem;
2713
+ background: color-mix(in srgb, var(--admin-bg, #0b0d1a) 88%, rgba(255, 255, 255, 0.1));
2714
+ box-shadow: 0 12px 36px color-mix(in srgb, var(--admin-blue) 24%, transparent);
2715
+ backdrop-filter: blur(20px);
2716
+ color: var(--admin-ink, #eef6ff);
2717
+ pointer-events: auto;
2718
+ animation: admin-toast-in 0.28s cubic-bezier(0.2, 0.9, 0.3, 1.1);
2719
+ }
2720
+ .admin-toast::before {
2721
+ content: '';
2722
+ position: absolute;
2723
+ inset: 0 auto 0 0;
2724
+ width: 3px;
2725
+ background: linear-gradient(180deg, var(--admin-blue), var(--admin-violet));
2726
+ }
2727
+ .admin-toast.is-err::before { background: linear-gradient(180deg, #fb7185, #f43f5e); }
2728
+ .admin-toast.is-warn::before { background: linear-gradient(180deg, #fbbf24, #f59e0b); }
2729
+ .admin-toast-icon {
2730
+ display: grid;
2731
+ flex: none;
2732
+ place-items: center;
2733
+ width: 22px;
2734
+ height: 22px;
2735
+ border: 1px solid color-mix(in srgb, var(--admin-blue) 48%, transparent);
2736
+ border-radius: 50%;
2737
+ background: color-mix(in srgb, var(--admin-blue) 22%, transparent);
2738
+ color: var(--admin-blue);
2739
+ font-size: 0.68rem;
2740
+ font-weight: 700;
2741
+ }
2742
+ .admin-toast.is-err .admin-toast-icon { border-color: rgba(251, 113, 133, 0.5); background: rgba(251, 113, 133, 0.2); color: #fda4af; }
2743
+ .admin-toast.is-warn .admin-toast-icon { border-color: rgba(251, 191, 36, 0.5); background: rgba(251, 191, 36, 0.2); color: #fcd34d; }
2744
+ .admin-toast-body { display: flex; flex-direction: column; gap: 0.15rem; flex: 1; min-width: 0; }
2745
+ .admin-toast-body b { color: var(--admin-ink, #dcecff); font-size: 0.72rem; font-weight: 600; line-height: 1.45; overflow-wrap: anywhere; }
2746
+ .admin-toast-body small { color: var(--admin-muted, #6f89a7); font-size: 0.56rem; text-transform: capitalize; }
2747
+ .admin-toast-x { flex: none; width: 20px; height: 20px; border: 0; border-radius: 0.35rem; color: var(--admin-muted, #9ab2ce); background: transparent; font-size: 0.9rem; line-height: 1; cursor: pointer; }
2748
+ .admin-toast-x:hover { color: var(--admin-ink, #dcecff); background: color-mix(in srgb, var(--admin-blue) 18%, transparent); }
2749
+ @keyframes admin-toast-in {
2750
+ from { opacity: 0; transform: translateX(18px) scale(0.96); }
2751
+ to { opacity: 1; transform: translateX(0) scale(1); }
2752
+ }
2753
+
2754
+ .admin-dock { position: fixed; right: 0; bottom: 0; left: 246px; z-index: 3; display: flex; align-items: center; gap: 1.5rem; min-height: 38px; padding: 0 1.3rem; border-top: 1px solid rgba(112, 168, 228, 0.15); color: #7790ac; background: rgba(3, 13, 28, 0.88); backdrop-filter: blur(18px); font-family: ui-monospace, SFMono-Regular, Consolas, monospace; font-size: 0.53rem; }
2755
+ .dock-logo { margin-right: 0.4rem; color: #5cc3ff; font-size: 0.75rem; }
2756
+ .dock-right { display: flex; align-items: center; gap: 0.35rem; margin-left: auto; }
2757
+ .admin-dock strong { color: #b4d4ef; font-weight: 500; }
2758
+
2759
+ @media (max-width: 1120px) {
2760
+ .admin-inspector { display: none; }
2761
+ .admin-content-layout { display: block; }
2762
+ .admin-dock { left: 246px; }
2763
+ }
2764
+
2765
+ @media (max-width: 1024px) {
2766
+ .admin-shell { width: 100vw; margin: 0; }
2767
+ .admin-shell.ui-compact .admin-side-widget { display: block; }
2768
+ .admin-content { padding: 1.6rem 1.4rem 5rem; }
2769
+ .admin-tool-rail { display: none; }
2770
+ .admin-sidebar { position: fixed; inset: 0 auto 0 0; z-index: 20; width: 246px; overflow-y: auto; overscroll-behavior: contain; -webkit-overflow-scrolling: touch; transform: translateX(-102%); transition: transform 180ms ease; box-shadow: 20px 0 50px rgba(0, 0, 0, 0.4); }
2771
+ .admin-sidebar.is-open { transform: translateX(0); }
2772
+ .admin-close-mobile, .admin-mobile-menu { display: grid; place-items: center; border: 0; background: transparent; }
2773
+ .admin-close-mobile { margin-left: auto; color: #9eb6d1; font-size: 1.2rem; }
2774
+ .admin-mobile-menu { width: 30px; height: 30px; color: #9ec8eb; font-size: 1rem; }
2775
+ .admin-shell.ui-compact .admin-sidebar { flex-basis: 246px; }
2776
+ .admin-shell.ui-compact .admin-dock { left: 0; }
2777
+ .admin-dock { left: 0; gap: 0.5rem; padding: 0 0.75rem; }
2778
+ .admin-dock > span:nth-child(2) { display: none; }
2779
+ }
2780
+
2781
+ @media (max-width: 760px) {
2782
+ .admin-shell { width: 100vw; margin: 0; }
2783
+ .admin-topbar { gap: 0.7rem; padding: 0 0.85rem; }
2784
+ .admin-window-tab { min-width: 0; padding: 0 0.55rem; border-right: 0; }
2785
+ .admin-window-tab strong { overflow: hidden; max-width: 90px; text-overflow: ellipsis; white-space: nowrap; }
2786
+ .admin-search { display: none; }
2787
+ .admin-mobile-search { display: grid; }
2788
+ .admin-topbar.is-mobile-search .admin-mobile-search {
2789
+ color: #fff;
2790
+ background: linear-gradient(135deg, rgba(38, 130, 225, 0.55), rgba(90, 67, 183, 0.45));
2791
+ }
2792
+ .admin-topbar.is-mobile-search .admin-search {
2793
+ position: absolute;
2794
+ top: 100%;
2795
+ left: 0;
2796
+ right: 0;
2797
+ display: flex;
2798
+ width: auto;
2799
+ border-radius: 0;
2800
+ border-left: 0;
2801
+ border-right: 0;
2802
+ border-top: 1px solid rgba(112, 168, 228, 0.16);
2803
+ background: rgba(4, 14, 29, 0.98);
2804
+ }
2805
+ .admin-topbar.is-mobile-search .admin-search kbd { display: none; }
2806
+ .top-live { display: none; }
2807
+ .admin-breadcrumb { padding: 0 0.95rem; }
2808
+ .admin-content { padding: 1.25rem 0.85rem 4.5rem; }
2809
+ .overview-hero, .config-intro { align-items: flex-start; padding: 1.1rem; }
2810
+ .overview-hero, .config-intro { align-items: flex-start; padding: 1.1rem; }
2811
+ .hero-orbit-art, .hero-art { flex-basis: 78px; width: 78px; height: 78px; }
2812
+ .hero-orbit-art strong, .hero-art strong { font-size: 0.7rem; }
2813
+ .overview-stat-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
2814
+ .overview-columns { grid-template-columns: 1fr; }
2815
+ .surface-grid { grid-auto-flow: row; grid-template-columns: 1fr; grid-template-rows: none; }
2816
+ .config-layer-stack { display: none; }
2817
+ .heading-actions { gap: 0.35rem; }
2818
+ .restart-badge { display: none; }
2819
+ .key-value-table { overflow-x: auto; }
2820
+ .key-value-head, .key-value-row { min-width: 580px; }
2821
+ .key-value-head, .key-value-row { grid-template-columns: 170px 110px 1fr 30px; }
2822
+ .env-table .key-value-head, .env-table .key-value-row { grid-template-columns: 180px minmax(0, 1fr); }
2823
+ .admin-tool-rail { display: none; }
2824
+ }
2825
+
2826
+ /* ---- Users & Roles ---- */
2827
+ .notice-line {
2828
+ display: flex;
2829
+ align-items: center;
2830
+ gap: 0.5rem;
2831
+ padding: 0.6rem 0.85rem;
2832
+ border: 1px solid rgba(255, 255, 255, 0.1);
2833
+ border-radius: 0.7rem;
2834
+ font-size: 0.82rem;
2835
+ }
2836
+ .notice-line.is-ok { color: #7ce7b0; background: rgba(16, 185, 129, 0.1); border-color: rgba(16, 185, 129, 0.35); }
2837
+ .notice-line.is-err { color: #ffb4ad; background: rgba(244, 63, 94, 0.1); border-color: rgba(244, 63, 94, 0.4); }
2838
+
2839
+ .role-catalog {
2840
+ display: grid;
2841
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
2842
+ gap: 1rem;
2843
+ }
2844
+ .role-box {
2845
+ display: flex;
2846
+ flex-direction: column;
2847
+ gap: 0.7rem;
2848
+ padding: 1rem;
2849
+ border: 1px solid rgba(255, 255, 255, 0.1);
2850
+ border-radius: 0.9rem;
2851
+ background: linear-gradient(150deg, rgba(13, 35, 67, 0.85), rgba(8, 20, 42, 0.9));
2852
+ box-shadow: inset 0 1px rgba(255, 255, 255, 0.05), 0 14px 35px rgba(0, 0, 0, 0.2);
2853
+ border-top: 2px solid var(--role-accent, #63bdff);
2854
+ }
2855
+ .role-box-head { display: flex; align-items: center; gap: 0.7rem; }
2856
+ .role-box-icon {
2857
+ display: grid;
2858
+ place-items: center;
2859
+ width: 2.4rem;
2860
+ height: 2.4rem;
2861
+ flex: none;
2862
+ border: 1px solid var(--role-accent, #63bdff);
2863
+ border-radius: 0.7rem;
2864
+ background: color-mix(in srgb, var(--role-accent, #63bdff) 14%, transparent);
2865
+ font-size: 1.15rem;
2866
+ }
2867
+ .role-box-head strong { display: block; color: #eef6ff; font-size: 0.95rem; line-height: 1.15; }
2868
+ .role-box-id { display: inline-block; margin-top: 0.15rem; color: var(--admin-muted); font-family: ui-monospace, SFMono-Regular, Consolas, monospace; font-size: 0.62rem; letter-spacing: 0.06em; }
2869
+ .role-box-desc { margin: 0; color: #b7c7db; font-size: 0.8rem; line-height: 1.45; }
2870
+ .role-section { display: flex; flex-direction: column; gap: 0.4rem; }
2871
+ .role-section-title { font-family: ui-monospace, SFMono-Regular, Consolas, monospace; font-size: 0.62rem; font-weight: 700; letter-spacing: 0.08em; text-transform: uppercase; }
2872
+ .role-section-title.is-can { color: #5ee6a0; }
2873
+ .role-section-title.is-no { color: #ff9f97; }
2874
+ .role-list { display: flex; flex-direction: column; gap: 0.4rem; margin: 0; padding: 0; list-style: none; }
2875
+ .role-list li {
2876
+ display: flex;
2877
+ flex-direction: column;
2878
+ gap: 0.1rem;
2879
+ padding: 0.45rem 0.6rem;
2880
+ border: 1px solid rgba(255, 255, 255, 0.07);
2881
+ border-radius: 0.55rem;
2882
+ background: rgba(255, 255, 255, 0.035);
2883
+ }
2884
+ .role-list b { color: #dce9f7; font-size: 0.78rem; font-weight: 600; }
2885
+ .role-list span { color: #8296ad; font-size: 0.7rem; line-height: 1.4; }
2886
+
2887
+ .role-chip {
2888
+ display: inline-flex;
2889
+ align-items: center;
2890
+ gap: 0.3rem;
2891
+ margin-right: 0.35rem;
2892
+ margin-bottom: 0.2rem;
2893
+ padding: 0.18rem 0.55rem;
2894
+ border: 1px solid;
2895
+ border-radius: 999px;
2896
+ font-size: 0.72rem;
2897
+ font-weight: 600;
2898
+ white-space: nowrap;
2899
+ }
2900
+ .you-tag {
2901
+ display: inline-block;
2902
+ margin-left: 0.45rem;
2903
+ padding: 0.1rem 0.45rem;
2904
+ border: 1px solid rgba(99, 189, 255, 0.4);
2905
+ border-radius: 999px;
2906
+ color: #63bdff;
2907
+ font-size: 0.62rem;
2908
+ font-weight: 700;
2909
+ letter-spacing: 0.06em;
2910
+ text-transform: uppercase;
2911
+ vertical-align: middle;
2912
+ }
2913
+
2914
+ .role-dialog { width: min(520px, 94vw); }
2915
+ .role-options { display: flex; flex-direction: column; gap: 0.55rem; margin: 0.5rem 0 0.75rem; }
2916
+ .role-option {
2917
+ display: flex;
2918
+ align-items: center;
2919
+ gap: 0.7rem;
2920
+ width: 100%;
2921
+ padding: 0.7rem 0.8rem;
2922
+ border: 1px solid rgba(255, 255, 255, 0.1);
2923
+ border-radius: 0.7rem;
2924
+ background: rgba(255, 255, 255, 0.04);
2925
+ cursor: pointer;
2926
+ text-align: left;
2927
+ transition: border-color 120ms ease, background 120ms ease;
2928
+ }
2929
+ .role-option:hover { background: rgba(255, 255, 255, 0.08); }
2930
+ .role-option.is-on { border-color: var(--role-accent, #63bdff); background: color-mix(in srgb, var(--role-accent, #63bdff) 12%, rgba(255,255,255,0.04)); }
2931
+ .role-option-icon {
2932
+ display: grid;
2933
+ place-items: center;
2934
+ width: 1.9rem;
2935
+ height: 1.9rem;
2936
+ flex: none;
2937
+ border: 1px solid currentColor;
2938
+ border-radius: 0.6rem;
2939
+ background: color-mix(in srgb, currentColor 12%, transparent);
2940
+ font-size: 0.95rem;
2941
+ }
2942
+ .role-option-text { display: flex; flex-direction: column; gap: 0.1rem; flex: 1; min-width: 0; }
2943
+ .role-option-text b { color: #e7f1fc; font-size: 0.84rem; }
2944
+ .role-option-text small { color: #8296ad; font-size: 0.7rem; line-height: 1.35; }
2945
+ .role-option-check {
2946
+ flex: none;
2947
+ display: grid;
2948
+ place-items: center;
2949
+ width: 1.4rem;
2950
+ height: 1.4rem;
2951
+ border: 1px solid rgba(255, 255, 255, 0.18);
2952
+ border-radius: 50%;
2953
+ color: #0f2c18;
2954
+ background: rgba(255, 255, 255, 0.06);
2955
+ font-size: 0.75rem;
2956
+ font-weight: 700;
2957
+ }
2958
+ .role-option.is-on .role-option-check { border-color: #5ee6a0; background: #5ee6a0; color: #07231a; }
2959
+ .role-hint { margin: 0 0 0.25rem; color: #9fb2c8; font-size: 0.72rem; line-height: 1.45; }
2960
+ .role-hint b { color: #ff9f97; }
2961
+
2962
+ /* ---- Theme Centre ---- */
2963
+ .hero-art--palette {
2964
+ color: #ffd479;
2965
+ border: 1px solid rgba(255, 212, 121, 0.32);
2966
+ background: linear-gradient(135deg, rgba(120, 74, 20, 0.4), rgba(40, 22, 10, 0.55));
2967
+ box-shadow: inset 0 0 22px rgba(255, 212, 121, 0.08);
2968
+ }
2969
+ .hero-art--palette .ha-a { left: 28%; bottom: 30%; width: 34%; height: 26%; background: rgba(255, 132, 205, 0.85); box-shadow: 0 0 10px rgba(255, 132, 205, 0.7); border-radius: 6px; }
2970
+ .hero-art--palette .ha-b { right: 28%; bottom: 30%; width: 26%; height: 40%; background: rgba(111, 214, 255, 0.9); box-shadow: 0 0 10px rgba(111, 214, 255, 0.7); border-radius: 6px; }
2971
+ .hero-art--palette .ha-c { left: 50%; bottom: 52%; width: 22%; height: 22%; transform: translateX(-50%); background: rgba(211, 160, 255, 0.95); box-shadow: 0 0 10px rgba(211, 160, 255, 0.7); border-radius: 6px; }
2972
+
2973
+ .theme-gallery { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 0.7rem; }
2974
+ .theme-card {
2975
+ display: flex;
2976
+ align-items: center;
2977
+ gap: 0.7rem;
2978
+ padding: 0.8rem;
2979
+ border: 1px solid rgba(112, 168, 228, 0.16);
2980
+ border-radius: 0.7rem;
2981
+ color: #eaf6ff;
2982
+ background: rgba(8, 25, 48, 0.6);
2983
+ text-align: left;
2984
+ cursor: pointer;
2985
+ transition: border-color 150ms ease, transform 150ms ease, box-shadow 150ms ease;
2986
+ }
2987
+ .theme-card:hover { transform: translateY(-2px); border-color: rgba(84, 183, 255, 0.4); box-shadow: 0 10px 28px rgba(0, 0, 0, 0.25); }
2988
+ .theme-card.is-active { border-color: rgba(92, 185, 255, 0.6); box-shadow: 0 0 0 2px rgba(92, 185, 255, 0.22), 0 12px 30px rgba(0, 0, 0, 0.28); }
2989
+ .theme-card-body { display: flex; min-width: 0; flex: 1; flex-direction: column; gap: 0.15rem; }
2990
+ .theme-card-body b { font-size: 0.72rem; }
2991
+ .theme-card-body small { color: #7d98b6; font-size: 0.56rem; }
2992
+ .theme-card-check { display: grid; width: 18px; height: 18px; flex: 0 0 auto; place-items: center; border-radius: 50%; color: #042a1a; background: #5ef0b3; font-size: 0.6rem; font-style: normal; }
2993
+ .ui-mode-row { flex-direction: row; gap: 0.45rem; }
2994
+ .ui-mode-row button { justify-content: flex-start; }
2995
+ .ui-mode-row button small { margin-left: auto; }
2996
+ .custom-toggle {
2997
+ padding: 0.45rem 0.7rem;
2998
+ border: 1px solid rgba(94, 240, 179, 0.4);
2999
+ border-radius: 0.5rem;
3000
+ color: #9df0c4;
3001
+ background: rgba(30, 120, 90, 0.18);
3002
+ font-size: 0.62rem;
3003
+ font-weight: 600;
3004
+ cursor: pointer;
3005
+ transition: color 150ms ease, background 150ms ease, box-shadow 150ms ease;
3006
+ }
3007
+ .custom-toggle:hover { color: #e5fff2; }
3008
+ .custom-toggle.is-active { color: #042a1a; background: linear-gradient(135deg, #3fd98f, #5ef0b3); box-shadow: 0 2px 14px rgba(94, 240, 179, 0.4); }
3009
+ .custom-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 0.6rem; }
3010
+ .color-row {
3011
+ display: flex;
3012
+ align-items: center;
3013
+ gap: 0.6rem;
3014
+ padding: 0.6rem 0.7rem;
3015
+ border: 1px solid rgba(112, 168, 228, 0.14);
3016
+ border-radius: 0.6rem;
3017
+ background: rgba(8, 25, 48, 0.5);
3018
+ cursor: pointer;
3019
+ transition: border-color 150ms ease, background 150ms ease;
3020
+ }
3021
+ .color-row:hover { border-color: rgba(84, 183, 255, 0.36); background: rgba(8, 25, 48, 0.75); }
3022
+ .color-swatch { position: relative; width: 34px; height: 34px; flex: 0 0 auto; overflow: hidden; border: 1px solid rgba(255, 255, 255, 0.22); border-radius: 0.5rem; }
3023
+ .color-swatch input { position: absolute; inset: -8px; width: 50px; height: 50px; padding: 0; border: 0; cursor: pointer; }
3024
+ .color-swatch input:disabled { cursor: not-allowed; }
3025
+ .color-meta { display: flex; min-width: 0; flex: 1; flex-direction: column; gap: 0.12rem; }
3026
+ .color-meta b { font-size: 0.66rem; font-weight: 600; }
3027
+ .color-meta small { overflow: hidden; color: #7d98b6; font-size: 0.52rem; text-overflow: ellipsis; white-space: nowrap; }
3028
+ .color-hex { width: 5.5rem; padding: 0.3rem 0.4rem; font-family: ui-monospace, SFMono-Regular, Consolas, monospace; font-size: 0.58rem; }
3029
+
3030
+ @media (max-width: 960px) {
3031
+ .theme-gallery, .custom-grid { grid-template-columns: 1fr; }
3032
+ .ui-mode-row { flex-direction: column; }
3033
+ }
3034
+
3035
+
3036
+ /* ---- Theme Centre: surface tuning + preview ---- */
3037
+ .surface-row {
3038
+ display: flex;
3039
+ align-items: center;
3040
+ justify-content: space-between;
3041
+ gap: 1rem;
3042
+ padding: 0.7rem 0;
3043
+ border-bottom: 1px solid rgba(112, 168, 228, 0.08);
3044
+ }
3045
+ .surface-row:last-child { border-bottom: 0; }
3046
+ .surface-range {
3047
+ -webkit-appearance: none;
3048
+ appearance: none;
3049
+ flex: 0 0 11rem;
3050
+ height: 5px;
3051
+ border-radius: 999px;
3052
+ background: linear-gradient(90deg, var(--admin-blue), var(--admin-violet));
3053
+ outline: none;
3054
+ cursor: pointer;
3055
+ }
3056
+ .surface-range::-webkit-slider-thumb {
3057
+ -webkit-appearance: none;
3058
+ appearance: none;
3059
+ width: 15px;
3060
+ height: 15px;
3061
+ border-radius: 50%;
3062
+ background: #fff;
3063
+ border: 2px solid var(--admin-violet);
3064
+ cursor: pointer;
3065
+ }
3066
+ .surface-range::-moz-range-thumb {
3067
+ width: 15px;
3068
+ height: 15px;
3069
+ border-radius: 50%;
3070
+ background: #fff;
3071
+ border: 2px solid var(--admin-violet);
3072
+ cursor: pointer;
3073
+ }
3074
+ .surface-meta { display: flex; flex-direction: column; gap: 0.1rem; }
3075
+ .surface-meta b { font-size: 0.82rem; color: var(--admin-ink); }
3076
+ .surface-meta span { font-size: 0.7rem; color: var(--admin-muted); }
3077
+ .surface-value {
3078
+ flex: 0 0 2.9rem;
3079
+ font-size: 0.78rem;
3080
+ font-weight: 700;
3081
+ text-align: right;
3082
+ color: var(--admin-blue);
3083
+ }
3084
+ .surface-row.disabled .surface-meta span,
3085
+ .surface-row.disabled .surface-value { opacity: 0.4; }
3086
+ .surface-row.disabled .surface-range { pointer-events: none; opacity: 0.45; }
3087
+
3088
+ .palette-list { display: flex; flex-wrap: wrap; gap: 0.55rem; }
3089
+ .palette-chip {
3090
+ display: inline-flex;
3091
+ align-items: center;
3092
+ gap: 0.35rem;
3093
+ padding: 0.1rem 0.35rem 0.1rem 0.15rem;
3094
+ border: 1px solid rgba(112, 168, 228, 0.2);
3095
+ border-radius: 999px;
3096
+ background: rgba(8, 25, 48, 0.5);
3097
+ }
3098
+ .palette-chip input[type="color"] {
3099
+ width: 22px;
3100
+ height: 22px;
3101
+ padding: 0;
3102
+ border: 0;
3103
+ border-radius: 50%;
3104
+ background: transparent;
3105
+ cursor: pointer;
3106
+ }
3107
+ .row-delete {
3108
+ border: 0;
3109
+ background: transparent;
3110
+ color: var(--admin-muted);
3111
+ font-size: 0.9rem;
3112
+ line-height: 1;
3113
+ cursor: pointer;
3114
+ padding: 0 0.15rem;
3115
+ }
3116
+ .row-delete:hover { color: #ff6b7a; }
3117
+ .add-color {
3118
+ align-self: center;
3119
+ border: 1px dashed rgba(112, 168, 228, 0.35);
3120
+ background: transparent;
3121
+ color: var(--admin-blue);
3122
+ font-size: 0.78rem;
3123
+ padding: 0.4rem 0.8rem;
3124
+ border-radius: 999px;
3125
+ cursor: pointer;
3126
+ }
3127
+ .add-color:hover { border-color: var(--admin-blue); background: rgba(112, 168, 228, 0.1); }
3128
+
3129
+ .theme-preview-tile {
3130
+ position: relative;
3131
+ overflow: hidden;
3132
+ display: grid;
3133
+ place-items: center;
3134
+ flex: 1;
3135
+ min-height: 12rem;
3136
+ border-radius: var(--admin-radius, 0.8rem);
3137
+ border: 1px solid rgba(112, 168, 228, 0.18);
3138
+ background: var(--p-bg, linear-gradient(160deg, #070f1e, #0d2440));
3139
+ }
3140
+ .theme-preview-glow {
3141
+ position: absolute;
3142
+ inset: -20%;
3143
+ background: radial-gradient(40rem 26rem at 20% 0%, var(--p-blue, rgba(74, 152, 255, 0.35)), transparent 60%),
3144
+ radial-gradient(36rem 24rem at 85% 110%, var(--p-pink, rgba(255, 120, 190, 0.3)), transparent 60%);
3145
+ animation: preview-breathe 6s ease-in-out infinite;
3146
+ }
3147
+ @keyframes preview-breathe {
3148
+ 0%, 100% { opacity: 0.55; transform: translateY(0) scale(1); }
3149
+ 50% { opacity: 1; transform: translateY(-6px) scale(1.04); }
3150
+ }
3151
+ .theme-preview-card {
3152
+ position: relative;
3153
+ width: 78%;
3154
+ max-width: 20rem;
3155
+ padding: 1.1rem 1.2rem;
3156
+ border-radius: var(--admin-radius, 0.8rem);
3157
+ border: 1px solid rgba(160, 200, 255, 0.22);
3158
+ background: rgba(10, 28, 55, 0.55);
3159
+ backdrop-filter: blur(calc(var(--admin-glass, 0) * 20px));
3160
+ -webkit-backdrop-filter: blur(calc(var(--admin-glass, 0) * 20px));
3161
+ box-shadow: 0 14px 40px -18px rgba(0, 0, 0, 0.7);
3162
+ }
3163
+ .theme-preview-overline {
3164
+ display: block;
3165
+ font-size: 0.58rem;
3166
+ letter-spacing: 0.16em;
3167
+ color: var(--p-violet, var(--admin-violet));
3168
+ margin-bottom: 0.35rem;
3169
+ }
3170
+ .theme-preview-title { font-size: 1.02rem; color: var(--p-ink, var(--admin-ink)); }
3171
+ .theme-preview-actions { display: flex; gap: 0.5rem; margin-top: 0.9rem; }
3172
+ .theme-preview-dots { display: flex; justify-content: flex-end; gap: 0.4rem; margin-top: 1rem; }
3173
+ .theme-preview-dots i {
3174
+ width: 7px;
3175
+ height: 7px;
3176
+ border-radius: 50%;
3177
+ background: var(--p-blue, var(--admin-blue));
3178
+ opacity: 0.5;
3179
+ }
3180
+ .theme-preview-dots i:nth-child(2) { background: var(--p-violet, var(--admin-violet)); }
3181
+ .theme-preview-dots i:nth-child(3) { background: var(--p-pink, var(--admin-pink)); }
3182
+
3183
+ @media (prefers-reduced-motion: reduce) {
3184
+ .theme-preview-glow { animation: none; }
3185
+ }
3186
+
3187
+
3188
+ /* ---- Overview: preflight diagnostics ---- */
3189
+ .preflight-note { margin: 0 0 0.9rem; font-size: 0.74rem; color: var(--admin-muted); }
3190
+ .preflight-summary { display: flex; flex-wrap: wrap; align-items: center; gap: 0.8rem; margin-bottom: 0.9rem; }
3191
+ .preflight-count { font-size: 0.78rem; font-weight: 700; padding: 0.25rem 0.6rem; border-radius: 999px; }
3192
+ .preflight-count.ok { color: #4ade80; background: rgba(74, 222, 128, 0.12); }
3193
+ .preflight-count.warn { color: #fbbf24; background: rgba(251, 191, 36, 0.12); }
3194
+ .preflight-count.bad { color: #f87171; background: rgba(248, 113, 113, 0.12); }
3195
+ .preflight-meta { margin-left: auto; font-size: 0.68rem; color: var(--admin-muted); }
3196
+ .preflight-empty { font-size: 0.74rem; color: var(--admin-muted); }
3197
+ .preflight-list { display: flex; flex-direction: column; gap: 0.45rem; }
3198
+ .preflight-row { display: flex; align-items: center; gap: 0.6rem; font-size: 0.76rem; }
3199
+ .preflight-dot { width: 8px; height: 8px; border-radius: 50%; flex: 0 0 auto; }
3200
+ .preflight-dot.good { background: #4ade80; box-shadow: 0 0 8px rgba(74, 222, 128, 0.8); }
3201
+ .preflight-dot.bad { background: #f87171; }
3202
+ .preflight-dot.warn { background: #fbbf24; box-shadow: 0 0 8px rgba(251, 191, 36, 0.8); }
3203
+ .preflight-message { color: var(--admin-muted); flex: 1 1 auto; min-width: 0; }
3204
+ .preflight-message.is-ok { color: #34d399; }
3205
+ .preflight-state.is-warn { color: #fbbf24; }
3206
+ .preflight-check-name { color: var(--admin-ink); font-weight: 600; }
3207
+ .preflight-kind { color: var(--admin-muted); text-transform: uppercase; font-size: 0.62rem; letter-spacing: 0.06em; }
3208
+ .preflight-latency { color: var(--admin-muted); font-variant-numeric: tabular-nums; }
3209
+ .preflight-state { margin-left: auto; font-size: 0.68rem; font-weight: 700; }
3210
+ .preflight-state.ok { color: #4ade80; }
3211
+ .preflight-state.fail { color: #f87171; }
3212
+ .preflight-error { flex: 0 0 auto; max-width: 46%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: #f87171; font-size: 0.68rem; }
3213
+
3214
+ .preflight-address { flex: 0 0 auto; max-width: 30%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--admin-muted); font-size: 0.66rem; font-variant-numeric: tabular-nums; }
3215
+
3216
+ .preflight-guidance { display: flex; align-items: center; flex-wrap: wrap; gap: 0.5rem; margin: 0 0 0.9rem; padding: 0.6rem 0.8rem; border: 1px solid rgba(251, 191, 36, 0.35); border-radius: 10px; background: rgba(251, 191, 36, 0.08); font-size: 0.74rem; color: var(--admin-ink); }
3217
+ .preflight-guidance strong { color: #fbbf24; }
3218
+ .preflight-guidance code { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; font-size: 0.7rem; color: #fbbf24; background: rgba(251, 191, 36, 0.12); padding: 0.1rem 0.35rem; border-radius: 6px; }
3219
+ .preflight-guidance .text-action { margin-left: auto; }
3220
+
3221
+ /* ─── Toggle switch ─────────────────────────────────────────────── */
3222
+ .ai-toggle {
3223
+ position: relative;
3224
+ display: inline-flex;
3225
+ align-items: center;
3226
+ justify-content: center;
3227
+ height: 26px;
3228
+ width: 48px;
3229
+ flex: 0 0 auto;
3230
+ border-radius: 999px;
3231
+ border: 1px solid rgba(255, 255, 255, 0.12);
3232
+ cursor: pointer;
3233
+ outline: none;
3234
+ transition: background 0.25s ease, border-color 0.25s ease, box-shadow 0.25s ease, width 0.25s ease, min-width 0.25s ease, padding 0.25s ease;
3235
+ background: rgba(30, 41, 59, 0.8);
3236
+ }
3237
+ .ai-toggle:focus-visible {
3238
+ box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.4);
3239
+ }
3240
+ .ai-toggle:disabled {
3241
+ opacity: 0.45;
3242
+ cursor: not-allowed;
3243
+ }
3244
+ .ai-toggle-knob {
3245
+ position: absolute;
3246
+ top: 50%;
3247
+ left: 3px;
3248
+ height: 18px;
3249
+ width: 18px;
3250
+ border-radius: 50%;
3251
+ background: rgba(226, 232, 240, 0.95);
3252
+ transform: translateY(-50%);
3253
+ transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1), background 0.25s ease, box-shadow 0.25s ease;
3254
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.35);
3255
+ }
3256
+ .ai-toggle.is-on .ai-toggle-knob {
3257
+ transform: translateY(-50%) translateX(22px);
3258
+ background: #fff;
3259
+ }
3260
+
3261
+ /* Shared glow keyframes for ON states. */
3262
+ @keyframes ai-glow-breathe {
3263
+ 0%, 100% { box-shadow: 0 0 10px -1px var(--ai-glow-color, rgba(52, 211, 153, 0.45)); }
3264
+ 50% { box-shadow: 0 0 22px 0 var(--ai-glow-color, rgba(52, 211, 153, 0.85)); }
3265
+ }
3266
+ @keyframes ai-glow-icon {
3267
+ 0%, 100% { text-shadow: 0 0 6px rgba(255, 255, 255, 0.7); }
3268
+ 50% { text-shadow: 0 0 12px rgba(255, 255, 255, 1), 0 0 20px rgba(52, 211, 153, 0.9); }
3269
+ }
3270
+ @keyframes ai-glow-dot {
3271
+ 0%, 100% { box-shadow: 0 0 6px 0 rgba(255, 255, 255, 0.6); }
3272
+ 50% { box-shadow: 0 0 12px 2px rgba(255, 255, 255, 0.95), 0 0 16px 3px rgba(52, 211, 153, 0.8); }
3273
+ }
3274
+ @keyframes ai-orb-pulse {
3275
+ 0%, 100% { box-shadow: 0 0 0 5px rgba(52, 211, 153, 0.15), 0 0 14px rgba(52, 211, 153, 0.5); }
3276
+ 50% { box-shadow: 0 0 0 7px rgba(52, 211, 153, 0.12), 0 0 24px rgba(52, 211, 153, 0.85); }
3277
+ }
3278
+
3279
+ /* Toggle style: Chip ON/OFF (default). */
3280
+ .ai-toggle.tg-chip {
3281
+ width: auto;
3282
+ min-width: 58px;
3283
+ gap: 0.35rem;
3284
+ padding: 0 0.7rem;
3285
+ color: #64748b;
3286
+ border-color: rgba(148, 163, 184, 0.35);
3287
+ }
3288
+ .ai-toggle.tg-chip .ai-toggle-knob { display: none; }
3289
+ .ai-toggle.tg-chip::before {
3290
+ content: '';
3291
+ width: 7px;
3292
+ height: 7px;
3293
+ border-radius: 50%;
3294
+ background: #64748b;
3295
+ transition: background 0.25s ease, box-shadow 0.25s ease;
3296
+ }
3297
+ .ai-toggle.tg-chip::after {
3298
+ content: 'OFF';
3299
+ font-size: 0.62rem;
3300
+ font-weight: 700;
3301
+ letter-spacing: 0.06em;
3302
+ transition: color 0.25s ease;
3303
+ }
3304
+ .ai-toggle.tg-chip.is-on {
3305
+ background: linear-gradient(135deg, rgba(16, 185, 129, 0.85), rgba(5, 150, 105, 0.75));
3306
+ border-color: rgba(52, 211, 153, 0.5);
3307
+ color: #fff;
3308
+ --ai-glow-color: rgba(52, 211, 153, 0.6);
3309
+ animation: ai-glow-breathe 1.8s ease-in-out infinite;
3310
+ }
3311
+ .ai-toggle.tg-chip.is-on::before { background: #d1fae5; animation: ai-glow-dot 1.8s ease-in-out infinite; }
3312
+ .ai-toggle.tg-chip.is-on::after { content: 'ON'; }
3313
+
3314
+ /* Toggle style: Neon glass. */
3315
+ .ai-toggle.tg-neon {
3316
+ background: linear-gradient(135deg, rgba(38, 130, 225, 0.35), rgba(90, 67, 183, 0.35));
3317
+ border-color: rgba(130, 190, 255, 0.45);
3318
+ box-shadow: 0 0 12px -3px rgba(84, 183, 255, 0.5);
3319
+ }
3320
+ .ai-toggle.tg-neon .ai-toggle-knob {
3321
+ background: linear-gradient(135deg, rgba(160, 220, 255, 0.95), rgba(84, 183, 255, 0.45));
3322
+ border: 1px solid rgba(160, 220, 255, 0.6);
3323
+ box-shadow: 0 1px 6px rgba(0, 0, 0, 0.4), inset 0 0 5px rgba(220, 240, 255, 0.8);
3324
+ }
3325
+ .ai-toggle.tg-neon.is-on {
3326
+ background: linear-gradient(135deg, rgba(16, 185, 129, 0.9), rgba(5, 150, 105, 0.75));
3327
+ border-color: rgba(52, 211, 153, 0.5);
3328
+ --ai-glow-color: rgba(52, 211, 153, 0.7);
3329
+ animation: ai-glow-breathe 2.2s ease-in-out infinite;
3330
+ }
3331
+ .ai-toggle.tg-neon.is-on .ai-toggle-knob { background: #fff; }
3332
+
3333
+ /* Toggle style: Icon knob. */
3334
+ .ai-toggle.tg-icon .ai-toggle-knob { display: none; }
3335
+ .ai-toggle.tg-icon::before {
3336
+ content: '⏻';
3337
+ font-size: 0.6rem;
3338
+ line-height: 1;
3339
+ color: #64748b;
3340
+ transition: color 0.25s ease, text-shadow 0.25s ease;
3341
+ }
3342
+ .ai-toggle.tg-icon.is-on {
3343
+ background: linear-gradient(135deg, rgba(16, 185, 129, 0.85), rgba(5, 150, 105, 0.75));
3344
+ border-color: rgba(52, 211, 153, 0.5);
3345
+ --ai-glow-color: rgba(52, 211, 153, 0.6);
3346
+ animation: ai-glow-breathe 1.8s ease-in-out infinite;
3347
+ }
3348
+ .ai-toggle.tg-icon.is-on::before { content: '⚡'; color: #fff; animation: ai-glow-icon 1.8s ease-in-out infinite; }
3349
+
3350
+ /* Toggle style: Orb status dot. */
3351
+ .ai-toggle.tg-orb {
3352
+ width: 30px;
3353
+ height: 30px;
3354
+ border-radius: 50%;
3355
+ border: 2px solid rgba(148, 163, 184, 0.45);
3356
+ background: transparent;
3357
+ transition: all 0.25s ease;
3358
+ }
3359
+ .ai-toggle.tg-orb .ai-toggle-knob { display: none; }
3360
+ .ai-toggle.tg-orb.is-on {
3361
+ border-color: rgba(52, 211, 153, 0.8);
3362
+ background: radial-gradient(circle at 35% 35%, #6ee7b7, #10b981 60%, #047857);
3363
+ animation: ai-orb-pulse 1.8s ease-in-out infinite;
3364
+ }
3365
+
3366
+ /* Toggle style: Gradient-track. */
3367
+ .ai-toggle.tg-track { overflow: hidden; border-color: rgba(112, 168, 228, 0.3); }
3368
+ .ai-toggle.tg-track::before {
3369
+ content: '';
3370
+ position: absolute;
3371
+ top: 2px;
3372
+ bottom: 2px;
3373
+ left: 3px;
3374
+ width: 21px;
3375
+ border-radius: 999px;
3376
+ background: linear-gradient(90deg, rgba(84, 183, 255, 0.55), rgba(16, 185, 129, 0.65));
3377
+ transition: width 0.25s cubic-bezier(0.4, 0, 0.2, 1);
3378
+ }
3379
+ .ai-toggle.tg-track.is-on::before { width: calc(100% - 6px); }
3380
+ .ai-toggle.tg-track.is-on {
3381
+ border-color: rgba(52, 211, 153, 0.5);
3382
+ --ai-glow-color: rgba(52, 211, 153, 0.7);
3383
+ animation: ai-glow-breathe 2.2s ease-in-out infinite;
3384
+ }
3385
+ .ai-toggle.tg-track .ai-toggle-knob { z-index: 1; }
3386
+
3387
+ /* Toggle style picker (Theme Centre). */
3388
+ .toggle-style-row {
3389
+ display: grid;
3390
+ grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
3391
+ gap: 0.55rem;
3392
+ margin-top: 0.5rem;
3393
+ }
3394
+ .toggle-style-btn {
3395
+ display: flex;
3396
+ align-items: center;
3397
+ gap: 0.5rem;
3398
+ padding: 0.6rem;
3399
+ border: 1px solid rgba(112, 168, 228, 0.14);
3400
+ border-radius: var(--admin-radius, 0.8rem);
3401
+ color: #9ab2ce;
3402
+ background: rgba(8, 25, 48, 0.5);
3403
+ text-align: left;
3404
+ cursor: pointer;
3405
+ transition: border-color 150ms ease, background 150ms ease;
3406
+ }
3407
+ .toggle-style-btn:hover { border-color: rgba(84, 183, 255, 0.4); background: rgba(24, 61, 102, 0.4); }
3408
+ .toggle-style-btn.is-selected {
3409
+ border-color: rgba(52, 211, 153, 0.5);
3410
+ background: rgba(16, 185, 129, 0.08);
3411
+ }
3412
+ .toggle-style-preview { pointer-events: none; transform: scale(0.9); transform-origin: left center; }
3413
+ .toggle-style-meta { display: flex; flex: 1; flex-direction: column; gap: 0.12rem; }
3414
+ .toggle-style-meta b { font-size: 0.62rem; font-weight: 600; color: #eaf6ff; }
3415
+ .toggle-style-meta small { font-size: 0.52rem; color: #6f89a7; }
3416
+ .toggle-style-check { color: #4ade80; font-style: normal; font-size: 0.7rem; }
3417
+
3418
+ /* ─── Safe-goto external link dialog ─────────────────────────────── */
3419
+ .safe-goto-overlay {
3420
+ position: fixed;
3421
+ inset: 0;
3422
+ z-index: 100;
3423
+ display: flex;
3424
+ align-items: center;
3425
+ justify-content: center;
3426
+ background: rgba(2, 6, 23, 0.72);
3427
+ backdrop-filter: blur(6px) saturate(0.55);
3428
+ -webkit-backdrop-filter: blur(6px) saturate(0.55);
3429
+ transition: opacity 0.22s ease, background-color 0.22s ease,
3430
+ backdrop-filter 0.22s ease, -webkit-backdrop-filter 0.22s ease;
3431
+ }
3432
+ .safe-goto-dialog {
3433
+ max-width: 480px;
3434
+ border-radius: 18px;
3435
+ border: 1px solid rgba(255, 255, 255, 0.14);
3436
+ background: linear-gradient(135deg, rgba(15, 23, 42, 0.96), rgba(11, 7, 27, 0.96));
3437
+ box-shadow: 0 1.2rem 2.8rem rgba(0, 0, 0, 0.55);
3438
+ overflow: hidden;
3439
+ animation: safe-goto-pop 0.25s cubic-bezier(0.4, 0, 0.2, 1);
3440
+ }
3441
+ @keyframes safe-goto-pop { from { transform: scale(0.92); opacity: 0; } to { transform: scale(1); opacity: 1; } }
3442
+ .safe-goto-icon-wrap {
3443
+ display: flex;
3444
+ align-items: center;
3445
+ justify-content: center;
3446
+ height: 64px;
3447
+ background: linear-gradient(135deg, rgba(99, 102, 241, 0.25), rgba(139, 92, 246, 0.15));
3448
+ border-bottom: 1px solid rgba(255, 255, 255, 0.08);
3449
+ }
3450
+ .safe-goto-icon {
3451
+ font-size: 1.8rem;
3452
+ filter: drop-shadow(0 2px 8px rgba(99, 102, 241, 0.5));
3453
+ }
3454
+ .safe-goto-body { padding: 1.25rem 1.5rem; }
3455
+ .safe-goto-title { font-size: 1.05rem; font-weight: 700; color: var(--admin-ink); margin-bottom: 0.5rem; }
3456
+ .safe-goto-msg { font-size: 0.82rem; color: var(--admin-muted); line-height: 1.5; margin-bottom: 0.75rem; }
3457
+ .safe-goto-url {
3458
+ display: flex;
3459
+ align-items: center;
3460
+ gap: 0.5rem;
3461
+ padding: 0.6rem 0.8rem;
3462
+ border-radius: 10px;
3463
+ background: rgba(0, 0, 0, 0.35);
3464
+ border: 1px solid rgba(255, 255, 255, 0.08);
3465
+ margin-bottom: 1.25rem;
3466
+ }
3467
+ .safe-goto-url code {
3468
+ font-size: 0.78rem;
3469
+ color: #93c5fd;
3470
+ word-break: break-all;
3471
+ font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
3472
+ }
3473
+ .safe-goto-url .safe-goto-shield {
3474
+ flex: 0 0 auto;
3475
+ font-size: 1.1rem;
3476
+ }
3477
+ .safe-goto-warning {
3478
+ display: flex;
3479
+ gap: 0.5rem;
3480
+ padding: 0.6rem 0.8rem;
3481
+ border-radius: 10px;
3482
+ background: rgba(251, 191, 36, 0.08);
3483
+ border: 1px solid rgba(251, 191, 36, 0.25);
3484
+ font-size: 0.72rem;
3485
+ color: #fbbf24;
3486
+ margin-bottom: 1.25rem;
3487
+ line-height: 1.45;
3488
+ }
3489
+ .safe-goto-actions {
3490
+ display: flex;
3491
+ gap: 0.6rem;
3492
+ justify-content: flex-end;
3493
+ }
3494
+ .safe-goto-link {
3495
+ display: inline-flex;
3496
+ align-items: center;
3497
+ gap: 0.3rem;
3498
+ color: #93c5fd;
3499
+ font-size: 0.72rem;
3500
+ text-decoration: none;
3501
+ cursor: pointer;
3502
+ transition: color 0.2s ease;
3503
+ }
3504
+ .safe-goto-link:hover { color: #bfdbfe; text-decoration: underline; }
3505
+
3506
+ /* ── Cluster: connected-node cards + allocation/load bars ── */
3507
+ .node-card {
3508
+ @apply glass rounded-2xl p-4;
3509
+ border-color: rgba(125, 174, 235, 0.18);
3510
+ }
3511
+ .node-card.is-ok { border-color: rgba(52, 211, 153, 0.32); }
3512
+ .node-card.is-warn { border-color: rgba(251, 191, 36, 0.3); }
3513
+ .node-card.is-bad { border-color: rgba(244, 63, 94, 0.32); opacity: 0.92; }
3514
+
3515
+ /* Aggregate stacked allocation bar (header). */
3516
+ .alloc-split {
3517
+ display: flex;
3518
+ height: 8px;
3519
+ border-radius: 999px;
3520
+ overflow: hidden;
3521
+ background: rgba(255, 255, 255, 0.06);
3522
+ }
3523
+ .alloc-split-seg {
3524
+ height: 100%;
3525
+ transition: width 0.4s ease;
3526
+ }
3527
+
3528
+ /* Per-node allocation % bar. */
3529
+ .alloc-bar {
3530
+ height: 8px;
3531
+ border-radius: 999px;
3532
+ background: rgba(255, 255, 255, 0.06);
3533
+ overflow: hidden;
3534
+ }
3535
+ .alloc-bar-fill {
3536
+ height: 100%;
3537
+ border-radius: 999px;
3538
+ transition: width 0.4s ease;
3539
+ }
3540
+ .alloc-bar-fill.is-ready { background: #34d399; }
3541
+ .alloc-bar-fill.is-idle { background: rgba(148, 163, 184, 0.4); }
3542
+
3543
+ /* Thin load bars (cpu / mem). */
3544
+ .load-bar {
3545
+ height: 6px;
3546
+ border-radius: 999px;
3547
+ background: rgba(255, 255, 255, 0.06);
3548
+ overflow: hidden;
3549
+ }
3550
+ .load-bar-fill {
3551
+ height: 100%;
3552
+ border-radius: 999px;
3553
+ transition: width 0.4s ease;
3554
+ }
3555
+
3556
+ /* Per-service health dots. */
3557
+ .svc-dot {
3558
+ display: inline-block;
3559
+ width: 10px;
3560
+ height: 10px;
3561
+ border-radius: 999px;
3562
+ border: 1px solid rgba(255, 255, 255, 0.12);
3563
+ }
3564
+ .svc-dot.is-ok { background: #34d399; box-shadow: 0 0 6px rgba(52, 211, 153, 0.7); border-color: rgba(52, 211, 153, 0.5); }
3565
+ .svc-dot.is-bad { background: #fb7185; border-color: rgba(251, 113, 133, 0.5); }
3566
+ .svc-dot.is-unknown { background: rgba(148, 163, 184, 0.25); }
3567
+
3568
+ /* Stale-metrics badge. */
3569
+ .freshness-badge {
3570
+ @apply rounded-full px-1.5 py-0.5 text-[9px] font-semibold uppercase tracking-wider;
3571
+ }
3572
+ .freshness-stale {
3573
+ background: rgba(251, 191, 36, 0.16);
3574
+ color: #fbbf24;
3575
+ border: 1px solid rgba(251, 191, 36, 0.3);
3576
+ }
3577
+
3578
+ /* CSS-only toggle switch (per-node enabled/standby). */
3579
+ .toggle-switch {
3580
+ position: relative;
3581
+ display: inline-flex;
3582
+ align-items: center;
3583
+ width: 34px;
3584
+ height: 18px;
3585
+ border-radius: 999px;
3586
+ background: rgba(255, 255, 255, 0.1);
3587
+ border: 1px solid rgba(255, 255, 255, 0.12);
3588
+ cursor: pointer;
3589
+ transition: background 0.2s ease;
3590
+ }
3591
+ .toggle-switch.is-on { background: rgba(52, 211, 153, 0.45); border-color: rgba(52, 211, 153, 0.5); }
3592
+ .toggle-switch input { position: absolute; opacity: 0; width: 100%; height: 100%; cursor: pointer; margin: 0; }
3593
+ .toggle-knob {
3594
+ position: absolute;
3595
+ left: 2px;
3596
+ width: 12px;
3597
+ height: 12px;
3598
+ border-radius: 999px;
3599
+ background: #e2e8f0;
3600
+ transition: left 0.18s ease;
3601
+ }
3602
+ .toggle-switch.is-on .toggle-knob { left: 18px; background: #d1fae5; }
3603
+
3604
+ /* ── Cluster: role picker cards (slave panel) ── */
3605
+ .role-card {
3606
+ @apply glass rounded-xl p-3 text-left transition-all hover:-translate-y-px hover:brightness-110 disabled:pointer-events-none disabled:opacity-50;
3607
+ border-color: rgba(125, 174, 235, 0.18);
3608
+ display: flex;
3609
+ flex-direction: column;
3610
+ gap: 0.15rem;
3611
+ }
3612
+ .role-card.is-active {
3613
+ border-color: rgba(52, 211, 153, 0.5);
3614
+ background: color-mix(in srgb, rgba(52, 211, 153, 0.12), var(--admin-surface, rgba(10, 24, 45, 0.78)));
3615
+ box-shadow: 0 0 0 1px rgba(52, 211, 153, 0.3), 0 8px 24px rgba(2, 6, 23, 0.45);
3616
+ }
3617
+ .role-card-icon { font-size: 1.1rem; line-height: 1; }
3618
+ .role-card-label { @apply text-sm font-semibold text-slate-100; }
3619
+ .role-card-desc { @apply text-[10px] text-slate-400; }
3620
+
3621
+ /* ── Cluster: path-pin routing rows (master panel) ── */
3622
+ .path-pin-row {
3623
+ display: flex;
3624
+ align-items: center;
3625
+ gap: 0.5rem;
3626
+ padding: 0.5rem;
3627
+ border-radius: 0.5rem;
3628
+ background: rgba(255, 255, 255, 0.04);
3629
+ border: 1px solid rgba(255, 255, 255, 0.08);
3630
+ }
3631
+ .path-pin-prefix { flex: 1 1 auto; min-width: 8rem; }
3632
+ .path-pin-arrow { color: #94a3b8; font-size: 0.8rem; }
3633
+ .path-pin-node { min-width: 12rem; }
3634
+ .path-pin-role { min-width: 7rem; }
3635
+ .path-pin-del { margin-left: auto; }