legate 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (317) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +345 -0
  4. data/bin/legate +13 -0
  5. data/examples/00_quickstart.rb +51 -0
  6. data/examples/01_simple_agent.rb +105 -0
  7. data/examples/02_multi_tool_agent.rb +140 -0
  8. data/examples/03_custom_tool.rb +93 -0
  9. data/examples/04_agent_instructions.rb +84 -0
  10. data/examples/05_state_and_sessions.rb +91 -0
  11. data/examples/06_callbacks.rb +186 -0
  12. data/examples/07_async_jobs.rb +112 -0
  13. data/examples/08_loop_agent.rb +197 -0
  14. data/examples/09_sequential_workflow.rb +40 -0
  15. data/examples/10_parallel_workflow.rb +34 -0
  16. data/examples/11_agent_delegation.rb +24 -0
  17. data/examples/12_http_client_tool.rb +156 -0
  18. data/examples/13_authentication.rb +220 -0
  19. data/examples/14_mcp_client.rb +154 -0
  20. data/examples/15_mcp_server.rb +79 -0
  21. data/examples/16_webhooks.rb +91 -0
  22. data/examples/README_sequential_agents.md +164 -0
  23. data/examples/advanced/auth/cookie_auth_tool.rb +146 -0
  24. data/examples/advanced/auth/custom_auth_flows_example.rb +626 -0
  25. data/examples/advanced/auth/excon_middleware.rb +317 -0
  26. data/examples/advanced/auth/excon_middleware_auth.rb +399 -0
  27. data/examples/advanced/auth/fiber_auth_example.rb +281 -0
  28. data/examples/advanced/auth/fiber_oidc_example.rb +403 -0
  29. data/examples/advanced/auth/httpbin_bearer_tool.rb +159 -0
  30. data/examples/advanced/auth/oauth2_auth.rb +419 -0
  31. data/examples/advanced/auth/oidc_auth.rb +514 -0
  32. data/examples/advanced/auth/openweather_api.rb +251 -0
  33. data/examples/advanced/auth/openweather_tool.rb +153 -0
  34. data/examples/advanced/auth/query_param_middleware_test.rb +138 -0
  35. data/examples/advanced/auth/service_account.rb +135 -0
  36. data/examples/advanced/auth/test_with_httpbin.rb +202 -0
  37. data/examples/advanced/auth/token_lifecycle_example.rb +428 -0
  38. data/examples/advanced/callback_monitoring.rb +679 -0
  39. data/examples/advanced/mas/fixed_delegation_example.rb +191 -0
  40. data/examples/advanced/mas/loop_workflow.rb +28 -0
  41. data/examples/advanced/mas/mock_planner.rb +77 -0
  42. data/examples/advanced/mas/proper_delegation_example.rb +276 -0
  43. data/examples/advanced/mcp/legate_mcp_server_resource_example.rb +182 -0
  44. data/examples/advanced/mcp/mcp_resource_server_example.rb +309 -0
  45. data/examples/advanced/mcp/mcp_server_async.rb +76 -0
  46. data/examples/advanced/mcp/mcp_server_async_tools.rb +122 -0
  47. data/examples/advanced/mcp/mcp_server_legate_agent.rb +95 -0
  48. data/examples/advanced/mcp/mcp_server_rack.rb +89 -0
  49. data/examples/advanced/random_calculator.rb +104 -0
  50. data/examples/advanced/sleep_agent.rb +153 -0
  51. data/examples/advanced/webhooks/webhook_e2e_runner.rb +110 -0
  52. data/examples/advanced/webhooks/webhook_receiver_agent.rb +58 -0
  53. data/examples/advanced/workflows/task_refinement_loop_agent.rb +278 -0
  54. data/examples/advanced/workflows/travel_planner_auto_sequential.rb +444 -0
  55. data/examples/advanced/workflows/travel_planner_parallel.rb +656 -0
  56. data/examples/advanced/workflows/travel_planner_sequential.rb +512 -0
  57. data/examples/tools/oauth2_example.rb +136 -0
  58. data/examples/tools/sleepy_tool.rb +42 -0
  59. data/lib/legate/activity_log.rb +71 -0
  60. data/lib/legate/agent.rb +959 -0
  61. data/lib/legate/agent_code_generator.rb +185 -0
  62. data/lib/legate/agent_definition.rb +812 -0
  63. data/lib/legate/agentic/decision.rb +49 -0
  64. data/lib/legate/agentic/loop.rb +134 -0
  65. data/lib/legate/agentic.rb +5 -0
  66. data/lib/legate/agents/loop_agent.rb +248 -0
  67. data/lib/legate/agents/parallel_agent.rb +163 -0
  68. data/lib/legate/agents/sequential_agent.rb +190 -0
  69. data/lib/legate/agents.rb +14 -0
  70. data/lib/legate/auth/config.rb +148 -0
  71. data/lib/legate/auth/coordinator.rb +218 -0
  72. data/lib/legate/auth/coordinators/oauth2_coordinator.rb +99 -0
  73. data/lib/legate/auth/coordinators/oidc_coordinator.rb +68 -0
  74. data/lib/legate/auth/coordinators/service_account_coordinator.rb +122 -0
  75. data/lib/legate/auth/credential.rb +157 -0
  76. data/lib/legate/auth/encryption.rb +108 -0
  77. data/lib/legate/auth/error.rb +94 -0
  78. data/lib/legate/auth/exchanged_credential.rb +180 -0
  79. data/lib/legate/auth/excon_middleware.rb +285 -0
  80. data/lib/legate/auth/http_client_utils.rb +364 -0
  81. data/lib/legate/auth/manager.rb +531 -0
  82. data/lib/legate/auth/manager_store.rb +394 -0
  83. data/lib/legate/auth/middleware_factory.rb +290 -0
  84. data/lib/legate/auth/runner.rb +279 -0
  85. data/lib/legate/auth/scheme.rb +125 -0
  86. data/lib/legate/auth/schemes/api_key.rb +212 -0
  87. data/lib/legate/auth/schemes/google_service_account.rb +108 -0
  88. data/lib/legate/auth/schemes/http_bearer.rb +98 -0
  89. data/lib/legate/auth/schemes/oauth2.rb +396 -0
  90. data/lib/legate/auth/schemes/openid_connect.rb +346 -0
  91. data/lib/legate/auth/schemes/service_account.rb +388 -0
  92. data/lib/legate/auth/schemes.rb +40 -0
  93. data/lib/legate/auth/token_manager.rb +362 -0
  94. data/lib/legate/auth/token_store.rb +86 -0
  95. data/lib/legate/auth/tool_context_extension.rb +97 -0
  96. data/lib/legate/auth/tool_integration.rb +188 -0
  97. data/lib/legate/auth/url_guard.rb +81 -0
  98. data/lib/legate/auth.rb +453 -0
  99. data/lib/legate/callbacks/callback_context.rb +71 -0
  100. data/lib/legate/cli/agent_commands.rb +950 -0
  101. data/lib/legate/cli/auth_commands.rb +520 -0
  102. data/lib/legate/cli/base_command.rb +24 -0
  103. data/lib/legate/cli/deployment_commands.rb +934 -0
  104. data/lib/legate/cli/output_helper.rb +108 -0
  105. data/lib/legate/cli/session_commands.rb +138 -0
  106. data/lib/legate/cli/skaffold_commands.rb +223 -0
  107. data/lib/legate/cli/tool_commands.rb +261 -0
  108. data/lib/legate/cli/web_commands.rb +182 -0
  109. data/lib/legate/cli.rb +40 -0
  110. data/lib/legate/configuration/webhooks.rb +113 -0
  111. data/lib/legate/configuration.rb +39 -0
  112. data/lib/legate/definition_store.rb +23 -0
  113. data/lib/legate/errors.rb +118 -0
  114. data/lib/legate/event.rb +161 -0
  115. data/lib/legate/gemini_ai_beta_patch.rb +39 -0
  116. data/lib/legate/generators/agent_generator.rb +412 -0
  117. data/lib/legate/generators/code_validator.rb +48 -0
  118. data/lib/legate/generators/legate/install_generator.rb +35 -0
  119. data/lib/legate/generators/legate/templates/create_legate_tables.rb.tt +36 -0
  120. data/lib/legate/generators/legate/templates/initializer.rb +18 -0
  121. data/lib/legate/generators/runtime_tool_loader.rb +76 -0
  122. data/lib/legate/generators/tool_generator.rb +408 -0
  123. data/lib/legate/generators.rb +11 -0
  124. data/lib/legate/global_definition_registry.rb +506 -0
  125. data/lib/legate/global_tool_manager.rb +135 -0
  126. data/lib/legate/llm/adapter.rb +69 -0
  127. data/lib/legate/llm/gemini.rb +172 -0
  128. data/lib/legate/llm/ollama.rb +80 -0
  129. data/lib/legate/llm.rb +34 -0
  130. data/lib/legate/mcp/client.rb +320 -0
  131. data/lib/legate/mcp/connection/sse.rb +292 -0
  132. data/lib/legate/mcp/connection/stdio.rb +273 -0
  133. data/lib/legate/mcp/connection_manager.rb +103 -0
  134. data/lib/legate/mcp/server/legate_agent_adapter.rb +170 -0
  135. data/lib/legate/mcp/server/legate_direct_agent_adapter.rb +140 -0
  136. data/lib/legate/mcp/server/legate_tool_adapter.rb +119 -0
  137. data/lib/legate/mcp/tool_wrapper.rb +138 -0
  138. data/lib/legate/mcp/util/schema_converter.rb +134 -0
  139. data/lib/legate/mcp.rb +23 -0
  140. data/lib/legate/plan_executor.rb +375 -0
  141. data/lib/legate/planner.rb +839 -0
  142. data/lib/legate/rails/railtie.rb +43 -0
  143. data/lib/legate/rails.rb +9 -0
  144. data/lib/legate/redaction.rb +32 -0
  145. data/lib/legate/session.rb +299 -0
  146. data/lib/legate/session_service/active_record.rb +300 -0
  147. data/lib/legate/session_service/base.rb +68 -0
  148. data/lib/legate/session_service/event_broadcast.rb +74 -0
  149. data/lib/legate/session_service/in_memory.rb +188 -0
  150. data/lib/legate/tool/metadata_dsl.rb +122 -0
  151. data/lib/legate/tool.rb +276 -0
  152. data/lib/legate/tool_code_generator.rb +103 -0
  153. data/lib/legate/tool_context.rb +350 -0
  154. data/lib/legate/tool_loader.rb +39 -0
  155. data/lib/legate/tool_registry.rb +73 -0
  156. data/lib/legate/tool_result.rb +61 -0
  157. data/lib/legate/tools/agent_tool.rb +187 -0
  158. data/lib/legate/tools/base/http_client.rb +319 -0
  159. data/lib/legate/tools/base/safe_url.rb +56 -0
  160. data/lib/legate/tools/base_async_job_tool.rb +91 -0
  161. data/lib/legate/tools/calculator.rb +89 -0
  162. data/lib/legate/tools/cat_facts.rb +81 -0
  163. data/lib/legate/tools/check_job_status_tool.rb +48 -0
  164. data/lib/legate/tools/current_time_tool.rb +64 -0
  165. data/lib/legate/tools/echo.rb +43 -0
  166. data/lib/legate/tools/http_request_tool.rb +105 -0
  167. data/lib/legate/tools/random_number_tool.rb +64 -0
  168. data/lib/legate/tools/read_webpage_tool.rb +92 -0
  169. data/lib/legate/tools/sleepy_tool.rb +74 -0
  170. data/lib/legate/tools/webhook_tool.rb +146 -0
  171. data/lib/legate/version.rb +5 -0
  172. data/lib/legate/web/app.rb +984 -0
  173. data/lib/legate/web/public/css/main.css +4980 -0
  174. data/lib/legate/web/public/images/favicon-256.png +0 -0
  175. data/lib/legate/web/public/images/favicon-32.png +0 -0
  176. data/lib/legate/web/public/images/legate-logo-dark.png +0 -0
  177. data/lib/legate/web/public/images/legate-logo-light.png +0 -0
  178. data/lib/legate/web/public/js/legate.js +616 -0
  179. data/lib/legate/web/public/styles/main.scss +4402 -0
  180. data/lib/legate/web/routes/agent_authentication_routes.rb +530 -0
  181. data/lib/legate/web/routes/agent_definition_routes.rb +803 -0
  182. data/lib/legate/web/routes/agent_generator_routes.rb +80 -0
  183. data/lib/legate/web/routes/agent_interaction_routes.rb +734 -0
  184. data/lib/legate/web/routes/agent_runtime_routes.rb +323 -0
  185. data/lib/legate/web/routes/api_routes.rb +56 -0
  186. data/lib/legate/web/routes/authentication_routes.rb +1541 -0
  187. data/lib/legate/web/routes/core_routes.rb +111 -0
  188. data/lib/legate/web/routes/documentation_routes.rb +220 -0
  189. data/lib/legate/web/routes/tool_generator_routes.rb +81 -0
  190. data/lib/legate/web/routes/tools_ui_routes.rb +207 -0
  191. data/lib/legate/web/sass_compiler.rb +73 -0
  192. data/lib/legate/web/views/_active_session_info.slim +25 -0
  193. data/lib/legate/web/views/_activity_list.slim +55 -0
  194. data/lib/legate/web/views/_agent_card.slim +56 -0
  195. data/lib/legate/web/views/_agent_generator_modal.slim +382 -0
  196. data/lib/legate/web/views/_agent_status_controls.slim +71 -0
  197. data/lib/legate/web/views/_agent_tool_table.slim +74 -0
  198. data/lib/legate/web/views/_chat_message.slim +95 -0
  199. data/lib/legate/web/views/_display_agent_configuration.slim +26 -0
  200. data/lib/legate/web/views/_display_agent_description.slim +11 -0
  201. data/lib/legate/web/views/_display_agent_fallback.slim +15 -0
  202. data/lib/legate/web/views/_display_agent_hierarchy.slim +93 -0
  203. data/lib/legate/web/views/_display_agent_instruction.slim +17 -0
  204. data/lib/legate/web/views/_display_agent_mcp.slim +13 -0
  205. data/lib/legate/web/views/_display_agent_model.slim +17 -0
  206. data/lib/legate/web/views/_display_agent_name.slim +42 -0
  207. data/lib/legate/web/views/_display_agent_output_key.slim +26 -0
  208. data/lib/legate/web/views/_display_agent_type.slim +65 -0
  209. data/lib/legate/web/views/_edit_agent_configuration.slim +74 -0
  210. data/lib/legate/web/views/_edit_agent_description.slim +16 -0
  211. data/lib/legate/web/views/_edit_agent_fallback.slim +25 -0
  212. data/lib/legate/web/views/_edit_agent_hierarchy.slim +98 -0
  213. data/lib/legate/web/views/_edit_agent_instruction.slim +49 -0
  214. data/lib/legate/web/views/_edit_agent_mcp.slim +33 -0
  215. data/lib/legate/web/views/_edit_agent_model.slim +23 -0
  216. data/lib/legate/web/views/_edit_agent_output_key.slim +36 -0
  217. data/lib/legate/web/views/_edit_agent_tools.slim +40 -0
  218. data/lib/legate/web/views/_edit_agent_type.slim +67 -0
  219. data/lib/legate/web/views/_session_error.slim +4 -0
  220. data/lib/legate/web/views/_skeleton.slim +69 -0
  221. data/lib/legate/web/views/_tool_card.slim +9 -0
  222. data/lib/legate/web/views/_tool_generator_modal.slim +311 -0
  223. data/lib/legate/web/views/agent.slim +436 -0
  224. data/lib/legate/web/views/agent_auth.slim +562 -0
  225. data/lib/legate/web/views/agents.slim +369 -0
  226. data/lib/legate/web/views/auth.slim +112 -0
  227. data/lib/legate/web/views/auth_credential_detail.slim +327 -0
  228. data/lib/legate/web/views/auth_credentials.slim +261 -0
  229. data/lib/legate/web/views/auth_debug.slim +94 -0
  230. data/lib/legate/web/views/auth_mapping_detail.slim +151 -0
  231. data/lib/legate/web/views/auth_mapping_new.slim +123 -0
  232. data/lib/legate/web/views/auth_mappings.slim +120 -0
  233. data/lib/legate/web/views/auth_scheme_detail.slim +274 -0
  234. data/lib/legate/web/views/auth_schemes.slim +259 -0
  235. data/lib/legate/web/views/auth_test.slim +418 -0
  236. data/lib/legate/web/views/chat.slim +192 -0
  237. data/lib/legate/web/views/docs_index.slim +105 -0
  238. data/lib/legate/web/views/docs_show.slim +105 -0
  239. data/lib/legate/web/views/error_404.slim +5 -0
  240. data/lib/legate/web/views/index.slim +148 -0
  241. data/lib/legate/web/views/layout.slim +144 -0
  242. data/lib/legate/web/views/tool_detail.slim +87 -0
  243. data/lib/legate/web/views/tools.slim +50 -0
  244. data/lib/legate/web/webhook_listener.rb +367 -0
  245. data/lib/legate/web.rb +9 -0
  246. data/lib/legate.rb +220 -0
  247. data/public/docs/advanced/callbacks.md +828 -0
  248. data/public/docs/advanced/mcp_schema_conversion.md +59 -0
  249. data/public/docs/authentication/api_reference/config.md +210 -0
  250. data/public/docs/authentication/api_reference/credential.md +246 -0
  251. data/public/docs/authentication/api_reference/encryption.md +218 -0
  252. data/public/docs/authentication/api_reference/exchanged_credential.md +271 -0
  253. data/public/docs/authentication/api_reference/excon_middleware.md +175 -0
  254. data/public/docs/authentication/api_reference/index.md +30 -0
  255. data/public/docs/authentication/api_reference/scheme.md +250 -0
  256. data/public/docs/authentication/api_reference/schemes/api_key.md +175 -0
  257. data/public/docs/authentication/api_reference/schemes/google_service_account.md +221 -0
  258. data/public/docs/authentication/api_reference/schemes/http_bearer.md +169 -0
  259. data/public/docs/authentication/api_reference/schemes/oauth2.md +343 -0
  260. data/public/docs/authentication/api_reference/schemes/oidc.md +73 -0
  261. data/public/docs/authentication/api_reference/schemes/openid_connect.md +311 -0
  262. data/public/docs/authentication/api_reference/schemes/service_account.md +287 -0
  263. data/public/docs/authentication/api_reference/token_manager.md +221 -0
  264. data/public/docs/authentication/api_reference/token_store.md +146 -0
  265. data/public/docs/authentication/api_reference/tool_context_extension.md +166 -0
  266. data/public/docs/authentication/guides/api_key.md +190 -0
  267. data/public/docs/authentication/guides/bearer.md +172 -0
  268. data/public/docs/authentication/guides/configuration.md +255 -0
  269. data/public/docs/authentication/guides/custom_flow.md +523 -0
  270. data/public/docs/authentication/guides/index.md +24 -0
  271. data/public/docs/authentication/guides/migration.md +435 -0
  272. data/public/docs/authentication/guides/oauth2.md +252 -0
  273. data/public/docs/authentication/guides/oidc.md +241 -0
  274. data/public/docs/authentication/guides/overview.md +155 -0
  275. data/public/docs/authentication/guides/secure_storage.md +301 -0
  276. data/public/docs/authentication/guides/service_account.md +228 -0
  277. data/public/docs/authentication/guides/token_lifecycle.md +295 -0
  278. data/public/docs/authentication/guides/web_ui_integration.md +504 -0
  279. data/public/docs/authentication/index.md +58 -0
  280. data/public/docs/authentication/troubleshooting/credential_storage.md +550 -0
  281. data/public/docs/authentication/troubleshooting/environment_variables.md +540 -0
  282. data/public/docs/authentication/troubleshooting/index.md +11 -0
  283. data/public/docs/authentication/troubleshooting/oauth2_issues.md +220 -0
  284. data/public/docs/authentication/troubleshooting/oidc_issues.md +412 -0
  285. data/public/docs/authentication/troubleshooting/token_refresh.md +338 -0
  286. data/public/docs/cli/legate_cli_usage.md +363 -0
  287. data/public/docs/core_concepts/legate_agent_lifecycle.md +124 -0
  288. data/public/docs/core_concepts/legate_architecture_overview.md +110 -0
  289. data/public/docs/core_concepts/legate_configuration.md +116 -0
  290. data/public/docs/core_concepts/legate_definition_store.md +102 -0
  291. data/public/docs/core_concepts/legate_planner.md +94 -0
  292. data/public/docs/core_concepts/legate_session_service.md +104 -0
  293. data/public/docs/error_handling/legate_error_handling.md +122 -0
  294. data/public/docs/examples.md +199 -0
  295. data/public/docs/getting_started.md +111 -0
  296. data/public/docs/guides/agentic_agents.md +137 -0
  297. data/public/docs/guides/ai_code_generators.md +437 -0
  298. data/public/docs/guides/auto_loading.md +326 -0
  299. data/public/docs/guides/configuring_agent_webhooks.md +219 -0
  300. data/public/docs/guides/http_client_usage.md +264 -0
  301. data/public/docs/guides/llm_providers.md +137 -0
  302. data/public/docs/guides/mcp_client_integration.md +232 -0
  303. data/public/docs/guides/mcp_server_exposure.md +206 -0
  304. data/public/docs/guides/rails_integration.md +128 -0
  305. data/public/docs/guides/sending_outbound_webhooks.md +227 -0
  306. data/public/docs/guides/streaming.md +112 -0
  307. data/public/docs/guides/webhooks.md +288 -0
  308. data/public/docs/introduction.md +51 -0
  309. data/public/docs/multi_agent_systems/advanced_features.md +57 -0
  310. data/public/docs/multi_agent_systems/agent_delegation.md +190 -0
  311. data/public/docs/multi_agent_systems/agent_hierarchy.md +49 -0
  312. data/public/docs/multi_agent_systems/state_management.md +47 -0
  313. data/public/docs/multi_agent_systems/workflow_agents.md +72 -0
  314. data/public/docs/tools/legate_built_in_tools.md +332 -0
  315. data/public/docs/tools/legate_tools_and_registry.md +263 -0
  316. data/public/docs/web_ui/legate_web_ui.md +137 -0
  317. metadata +823 -0
@@ -0,0 +1,4402 @@
1
+ @use "sass:color";
2
+
3
+ /* ========================================
4
+ CSS VARIABLES - THEME SYSTEM
5
+ ======================================== */
6
+
7
+ :root {
8
+ /* --- Brand Colors (Ruby Theme) --- */
9
+ --color-primary: hsl(348, 83%, 47%); /* Ruby red - main actions */
10
+ --color-primary-rgb: 219, 39, 77; /* RGB for rgba() usage */
11
+ --color-primary-dark: hsl(348, 83%, 40%); /* Ruby darker - hover */
12
+ --color-primary-hover: hsl(348, 83%, 42%); /* Hover state */
13
+ --color-primary-light: hsl(348, 83%, 95%); /* Ruby tint - backgrounds */
14
+ --color-accent: hsl(38, 92%, 50%); /* Warm gold - brand accent */
15
+ --color-accent-light: hsl(38, 92%, 94%); /* Gold tint */
16
+
17
+ /* --- Semantic Colors --- */
18
+ --color-success: hsl(152, 68%, 40%);
19
+ --color-success-light: hsl(152, 68%, 94%);
20
+ --color-warning: hsl(38, 92%, 50%);
21
+ --color-warning-light: hsl(38, 92%, 94%);
22
+ --color-danger: hsl(0, 72%, 51%);
23
+ --color-danger-light: hsl(0, 72%, 95%);
24
+ --color-info: hsl(201, 96%, 46%);
25
+ --color-info-light: hsl(201, 96%, 94%);
26
+
27
+ /* --- Neutral Colors (Light Mode) --- */
28
+ --color-bg-primary: #faf8f5; /* warm paper */
29
+ --color-bg-secondary: #ffffff;
30
+ --color-bg-tertiary: #f3efe9; /* warm tint */
31
+ --color-bg-elevated: #ffffff;
32
+
33
+ --color-text-primary: #1a202c;
34
+ --color-text-secondary: #4a5568;
35
+ --color-text-muted: #718096;
36
+ --color-text-inverse: #ffffff;
37
+
38
+ --color-border: #e2e8f0;
39
+ --color-border-light: #edf2f7;
40
+ --color-border-dark: #cbd5e0;
41
+
42
+ /* --- Shadows --- */
43
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.05);
44
+ --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.08);
45
+ --shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.12);
46
+ --shadow-hover: 0 12px 28px rgba(0, 0, 0, 0.15);
47
+
48
+ /* --- Transitions --- */
49
+ --transition-fast: 150ms ease;
50
+ --transition-normal: 250ms ease;
51
+ --transition-slow: 350ms ease;
52
+
53
+ /* --- App shell --- */
54
+ --sidebar-width: 244px;
55
+
56
+ /* --- Border Radii --- */
57
+ --radius-sm: 6px;
58
+ --radius-md: 10px;
59
+ --radius-lg: 14px;
60
+ --radius-full: 9999px;
61
+
62
+ /* --- Font Families --- */
63
+ --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
64
+ --font-headline: 'Space Grotesk', 'Inter', -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
65
+ --font-mono: 'JetBrains Mono', 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;
66
+ }
67
+
68
+ /* --- Dark Mode Variables --- */
69
+ [data-theme="dark"] {
70
+ --color-primary: hsl(348, 80%, 60%); /* Ruby red for dark mode */
71
+ --color-primary-rgb: 230, 92, 117; /* RGB for rgba() usage */
72
+ --color-primary-dark: hsl(348, 80%, 50%);
73
+ --color-primary-hover: hsl(348, 80%, 55%); /* Hover state */
74
+ --color-primary-light: hsl(348, 50%, 20%);
75
+ --color-accent: hsl(38, 92%, 55%); /* Warm gold for dark mode */
76
+ --color-accent-light: hsl(38, 50%, 20%);
77
+
78
+ --color-success: hsl(152, 68%, 50%);
79
+ --color-success-light: hsl(152, 40%, 18%);
80
+ --color-warning: hsl(38, 92%, 55%);
81
+ --color-warning-light: hsl(38, 50%, 18%);
82
+ --color-danger: hsl(0, 72%, 60%);
83
+ --color-danger-light: hsl(0, 50%, 18%);
84
+ --color-info: hsl(201, 96%, 55%);
85
+ --color-info-light: hsl(201, 50%, 18%);
86
+
87
+ --color-bg-primary: #0f1419;
88
+ --color-bg-secondary: #1a1f26;
89
+ --color-bg-tertiary: #242b33;
90
+ --color-bg-elevated: #2d343d;
91
+
92
+ --color-text-primary: #e7e9ea;
93
+ --color-text-secondary: #9ca3af;
94
+ --color-text-muted: #9ca3af; /* Fixed: improved contrast for accessibility */
95
+ --color-text-inverse: #1a202c;
96
+
97
+ --color-border: #2f3943;
98
+ --color-border-light: #242b33;
99
+ --color-border-dark: #3d4852;
100
+
101
+ --shadow-sm: 0 1px 2px rgba(0, 0, 0, 0.3);
102
+ --shadow-md: 0 4px 12px rgba(0, 0, 0, 0.4);
103
+ --shadow-lg: 0 8px 24px rgba(0, 0, 0, 0.5);
104
+ --shadow-hover: 0 12px 28px rgba(0, 0, 0, 0.6);
105
+ }
106
+
107
+ /* ========================================
108
+ BASE STYLES
109
+ ======================================== */
110
+
111
+ /* --- General Theme Adjustments --- */
112
+ body {
113
+ background-color: var(--color-bg-primary);
114
+ color: var(--color-text-secondary);
115
+ font-family: var(--font-sans);
116
+ -webkit-font-smoothing: antialiased;
117
+ -moz-osx-font-smoothing: grayscale;
118
+ transition: background-color var(--transition-normal), color var(--transition-normal);
119
+ }
120
+
121
+ h1.title, h2.title, h3.title, h4.title, h5.title, h6.title {
122
+ font-family: var(--font-headline);
123
+ font-weight: 600;
124
+ color: var(--color-text-primary);
125
+ letter-spacing: -0.025em;
126
+ }
127
+
128
+ .subtitle {
129
+ color: var(--color-text-muted);
130
+ }
131
+
132
+ /* --- Navbar --- */
133
+ .navbar.is-white {
134
+ background-color: var(--color-bg-secondary) !important;
135
+ border-bottom: 1px solid var(--color-border);
136
+ transition: background-color var(--transition-normal), border-color var(--transition-normal);
137
+ }
138
+
139
+ /* Dark mode navbar */
140
+ [data-theme="dark"] .navbar.is-white {
141
+ background-color: var(--color-bg-secondary) !important;
142
+ }
143
+
144
+ .navbar-item, .navbar-link {
145
+ font-weight: 500;
146
+ color: var(--color-text-secondary) !important;
147
+ transition: all var(--transition-fast);
148
+ }
149
+
150
+ /* Dark mode navbar text - ensure high contrast */
151
+ [data-theme="dark"] .navbar-item,
152
+ [data-theme="dark"] .navbar-link {
153
+ color: #e7e9ea !important;
154
+ }
155
+
156
+ [data-theme="dark"] .navbar-item:hover:not(.is-active) {
157
+ color: #ffffff !important;
158
+ }
159
+
160
+ strong.has-text-link { /* Navbar Brand */
161
+ font-weight: 700;
162
+ font-size: 1.2em;
163
+ color: var(--color-primary) !important;
164
+ }
165
+
166
+ /* --- Brand logo lockup (theme-swapped) --- */
167
+ .brand-logo {
168
+ padding-top: 0;
169
+ padding-bottom: 0;
170
+ }
171
+ .brand-logo:hover {
172
+ background-color: transparent !important;
173
+ }
174
+ .brand-logo-img {
175
+ height: 30px;
176
+ width: auto;
177
+ max-height: none; /* override Bulma's navbar img cap (1.75rem) */
178
+ display: block;
179
+ }
180
+ .brand-logo-dark { display: none; }
181
+ [data-theme="dark"] .brand-logo-light { display: none; }
182
+ [data-theme="dark"] .brand-logo-dark { display: block; }
183
+
184
+ /* ========================================
185
+ APP SHELL — LEFT SIDEBAR
186
+ Fixed left rail on desktop; off-canvas drawer on touch.
187
+ ======================================== */
188
+ .sidebar {
189
+ position: fixed;
190
+ top: 0;
191
+ left: 0;
192
+ bottom: 0;
193
+ width: var(--sidebar-width);
194
+ display: flex;
195
+ flex-direction: column;
196
+ background-color: var(--color-bg-secondary);
197
+ border-right: 1px solid var(--color-border);
198
+ z-index: 30;
199
+ transition: transform var(--transition-normal),
200
+ background-color var(--transition-normal),
201
+ border-color var(--transition-normal);
202
+ }
203
+
204
+ .sidebar-brand {
205
+ padding: 1.25rem 1.25rem 1rem;
206
+ border-bottom: 1px solid var(--color-border-light);
207
+ }
208
+ .sidebar-brand .brand-logo { padding: 0; display: inline-block; }
209
+ .sidebar-brand .brand-logo-img { height: 34px; }
210
+
211
+ .sidebar-tagline {
212
+ margin-top: 0.6rem;
213
+ font-size: 0.68rem;
214
+ font-weight: 600;
215
+ letter-spacing: 0.18em;
216
+ text-transform: uppercase;
217
+ color: var(--color-accent);
218
+ }
219
+
220
+ .sidebar-nav {
221
+ flex: 1 1 auto;
222
+ padding: 1rem 0.75rem;
223
+ overflow-y: auto;
224
+ }
225
+
226
+ .sidebar-link {
227
+ display: flex;
228
+ align-items: center;
229
+ gap: 0.75rem;
230
+ padding: 0.6rem 0.85rem;
231
+ margin-bottom: 0.2rem;
232
+ border-radius: var(--radius-md);
233
+ color: var(--color-text-secondary);
234
+ font-weight: 500;
235
+ transition: background-color var(--transition-fast), color var(--transition-fast);
236
+ }
237
+ .sidebar-link .icon { color: var(--color-text-muted); transition: color var(--transition-fast); }
238
+ .sidebar-link:hover { background-color: var(--color-bg-tertiary); color: var(--color-text-primary); }
239
+ .sidebar-link:hover .icon { color: var(--color-text-primary); }
240
+ .sidebar-link.is-active { background-color: var(--color-primary-light); color: var(--color-primary); }
241
+ .sidebar-link.is-active .icon { color: var(--color-primary); }
242
+
243
+ .sidebar-footer {
244
+ padding: 0.85rem 1rem;
245
+ border-top: 1px solid var(--color-border-light);
246
+ display: flex;
247
+ align-items: center;
248
+ gap: 0.65rem;
249
+ }
250
+ .sidebar-ghlink {
251
+ display: inline-flex;
252
+ align-items: center;
253
+ gap: 0.4rem;
254
+ font-size: 0.85rem;
255
+ color: var(--color-text-muted);
256
+ transition: color var(--transition-fast);
257
+ }
258
+ .sidebar-ghlink:hover { color: var(--color-text-primary); }
259
+
260
+ /* --- Content offset by the fixed sidebar --- */
261
+ .app-content { margin-left: var(--sidebar-width); min-height: 100vh; }
262
+ .footer { margin-left: var(--sidebar-width); }
263
+
264
+ /* --- Mobile top bar + off-canvas drawer (hidden on desktop) --- */
265
+ .mobile-topbar { display: none; }
266
+ .sidebar-backdrop { display: none; }
267
+
268
+ @media screen and (max-width: 1023px) {
269
+ .sidebar {
270
+ transform: translateX(-100%);
271
+ z-index: 40;
272
+ box-shadow: var(--shadow-lg);
273
+ }
274
+ .sidebar.is-active { transform: translateX(0); }
275
+
276
+ .app-content, .footer { margin-left: 0; }
277
+
278
+ .mobile-topbar {
279
+ display: flex;
280
+ align-items: center;
281
+ justify-content: space-between;
282
+ position: sticky;
283
+ top: 0;
284
+ z-index: 25;
285
+ padding: 0.6rem 1rem;
286
+ background-color: var(--color-bg-secondary);
287
+ border-bottom: 1px solid var(--color-border);
288
+ }
289
+ .mobile-topbar .brand-logo { padding: 0; }
290
+ .mobile-topbar .brand-logo-img { height: 26px; }
291
+
292
+ .sidebar-backdrop.is-active {
293
+ display: block;
294
+ position: fixed;
295
+ inset: 0;
296
+ background: rgba(0, 0, 0, 0.45);
297
+ z-index: 35;
298
+ }
299
+
300
+ .sidebar-burger {
301
+ background: transparent;
302
+ border: none;
303
+ cursor: pointer;
304
+ width: 2.5rem;
305
+ height: 2.5rem;
306
+ color: var(--color-text-primary);
307
+ }
308
+ .sidebar-burger span {
309
+ display: block;
310
+ width: 18px;
311
+ height: 2px;
312
+ margin: 3px auto;
313
+ background: currentColor;
314
+ border-radius: 2px;
315
+ }
316
+ }
317
+
318
+ /* Active state for current section */
319
+ .navbar-item.is-active {
320
+ background-color: var(--color-primary-light) !important;
321
+ color: var(--color-primary) !important;
322
+ font-weight: 600;
323
+ position: relative;
324
+
325
+ &::after {
326
+ content: '';
327
+ position: absolute;
328
+ bottom: 0;
329
+ left: 50%;
330
+ transform: translateX(-50%);
331
+ width: 70%;
332
+ height: 3px;
333
+ background: var(--color-primary);
334
+ border-radius: 3px 3px 0 0;
335
+ }
336
+ }
337
+
338
+ /* Hover state - make it darker than active state */
339
+ .navbar-item:hover:not(.is-active) {
340
+ background-color: var(--color-bg-tertiary) !important;
341
+ color: var(--color-text-primary) !important;
342
+ }
343
+
344
+ /* Theme toggle button */
345
+ .theme-toggle {
346
+ background: transparent;
347
+ border: none;
348
+ cursor: pointer;
349
+ padding: 0.5rem;
350
+ border-radius: var(--radius-sm);
351
+ color: var(--color-text-secondary);
352
+ transition: all var(--transition-fast);
353
+ display: flex;
354
+ align-items: center;
355
+ justify-content: center;
356
+
357
+ &:hover {
358
+ background: var(--color-bg-tertiary);
359
+ color: var(--color-text-primary);
360
+ }
361
+
362
+ i {
363
+ font-size: 1.1rem;
364
+ }
365
+ }
366
+
367
+ /* Navbar burger for mobile */
368
+ .navbar-burger span {
369
+ background-color: var(--color-text-primary);
370
+ transition: background-color var(--transition-fast);
371
+ }
372
+
373
+ .navbar-menu {
374
+ background: var(--color-bg-secondary);
375
+
376
+ @media screen and (max-width: 1023px) {
377
+ border-top: 1px solid var(--color-border);
378
+ box-shadow: var(--shadow-lg);
379
+ }
380
+ }
381
+
382
+ /* --- Cards & Boxes --- */
383
+ .card, .box {
384
+ background-color: var(--color-bg-secondary) !important;
385
+ box-shadow: var(--shadow-md);
386
+ border: 1px solid var(--color-border);
387
+ border-radius: var(--radius-lg);
388
+ transition: transform var(--transition-normal),
389
+ box-shadow var(--transition-normal),
390
+ background-color var(--transition-normal),
391
+ border-color var(--transition-normal);
392
+ }
393
+
394
+ /* Ensure dark mode applies to boxes */
395
+ [data-theme="dark"] .card,
396
+ [data-theme="dark"] .box {
397
+ background-color: var(--color-bg-secondary) !important;
398
+ border-color: var(--color-border) !important;
399
+ }
400
+
401
+ .card:hover, .box:hover {
402
+ transform: translateY(-6px);
403
+ box-shadow: var(--shadow-hover);
404
+ }
405
+
406
+ /* Dashboard hero section gradient */
407
+ .content.has-text-centered.mb-6 {
408
+ padding: 2rem 1rem 3rem;
409
+ margin: -1.5rem -1.5rem 2rem -1.5rem;
410
+ background: linear-gradient(
411
+ 135deg,
412
+ rgba(220, 38, 38, 0.03) 0%,
413
+ transparent 50%,
414
+ rgba(245, 158, 11, 0.03) 100%
415
+ );
416
+ border-radius: 0 0 var(--radius-lg) var(--radius-lg);
417
+ }
418
+
419
+ [data-theme="dark"] .content.has-text-centered.mb-6 {
420
+ background: linear-gradient(
421
+ 135deg,
422
+ rgba(220, 38, 38, 0.08) 0%,
423
+ transparent 50%,
424
+ rgba(245, 158, 11, 0.05) 100%
425
+ );
426
+ }
427
+
428
+ .box:not(:last-child), .card:not(:last-child) {
429
+ margin-bottom: 1.75rem;
430
+ }
431
+
432
+ /* ========================================
433
+ HERO WELCOME SECTION
434
+ ======================================== */
435
+
436
+ .hero-welcome {
437
+ position: relative;
438
+ padding: 2rem 2.25rem;
439
+ border-radius: var(--radius-lg);
440
+ background: linear-gradient(120deg,
441
+ hsl(348, 83%, 44%) 0%,
442
+ hsl(348, 76%, 36%) 55%,
443
+ hsl(348, 72%, 28%) 100%
444
+ );
445
+ color: white;
446
+ overflow: hidden;
447
+ box-shadow: var(--shadow-lg);
448
+
449
+ // Decorative pattern overlay
450
+ &::before {
451
+ content: '';
452
+ position: absolute;
453
+ inset: 0;
454
+ background-image:
455
+ radial-gradient(circle at 88% 18%, rgba(255,255,255,0.10) 0%, transparent 45%),
456
+ radial-gradient(circle at 15% 120%, rgba(0,0,0,0.12) 0%, transparent 50%);
457
+ pointer-events: none;
458
+ }
459
+
460
+ .hero-content {
461
+ position: relative;
462
+ z-index: 1;
463
+ display: flex;
464
+ align-items: center;
465
+ justify-content: space-between;
466
+ gap: 1.5rem;
467
+ flex-wrap: wrap;
468
+ }
469
+
470
+ .hero-main {
471
+ display: flex;
472
+ align-items: center;
473
+ gap: 1.25rem;
474
+ min-width: 0;
475
+ }
476
+
477
+ .hero-badge {
478
+ flex: 0 0 auto;
479
+ width: 3.5rem;
480
+ height: 3.5rem;
481
+ display: flex;
482
+ align-items: center;
483
+ justify-content: center;
484
+ font-size: 1.6rem;
485
+ border-radius: var(--radius-md);
486
+ background: rgba(255,255,255,0.14);
487
+ border: 1px solid rgba(255,255,255,0.22);
488
+ box-shadow: inset 0 1px 0 rgba(255,255,255,0.15);
489
+ animation: gem-float 3.5s ease-in-out infinite;
490
+ }
491
+
492
+ .hero-eyebrow {
493
+ font-family: var(--font-mono);
494
+ font-size: 0.7rem;
495
+ font-weight: 600;
496
+ letter-spacing: 0.14em;
497
+ text-transform: uppercase;
498
+ opacity: 0.78;
499
+ margin-bottom: 0.15rem;
500
+ }
501
+
502
+ .hero-title {
503
+ font-family: var(--font-headline);
504
+ font-size: 1.85rem;
505
+ font-weight: 700;
506
+ line-height: 1.1;
507
+ margin-bottom: 0.3rem;
508
+ text-shadow: 0 2px 8px rgba(0,0,0,0.18);
509
+ letter-spacing: -0.02em;
510
+ }
511
+
512
+ .hero-subtitle {
513
+ font-size: 1rem;
514
+ opacity: 0.9;
515
+ margin-bottom: 0;
516
+ line-height: 1.45;
517
+ }
518
+
519
+ .hero-actions {
520
+ display: flex;
521
+ gap: 0.75rem;
522
+ flex-wrap: wrap;
523
+ flex-shrink: 0;
524
+ }
525
+
526
+ .button.is-hero-primary {
527
+ background: white;
528
+ color: hsl(348, 83%, 42%);
529
+ border: none;
530
+ font-weight: 600;
531
+ box-shadow: 0 4px 14px rgba(0,0,0,0.15);
532
+
533
+ &:hover {
534
+ background: #f8f8f8;
535
+ transform: translateY(-2px);
536
+ box-shadow: 0 6px 20px rgba(0,0,0,0.2);
537
+ }
538
+ }
539
+
540
+ .button.is-hero-secondary {
541
+ background: rgba(255,255,255,0.15);
542
+ color: white;
543
+ border: 1px solid rgba(255,255,255,0.3);
544
+ backdrop-filter: blur(4px);
545
+
546
+ &:hover {
547
+ background: rgba(255,255,255,0.25);
548
+ border-color: rgba(255,255,255,0.5);
549
+ }
550
+ }
551
+
552
+ .hero-pronounce {
553
+ display: inline-flex;
554
+ align-items: center;
555
+ gap: 0.5rem;
556
+ margin-top: 0.75rem;
557
+ padding: 0.25rem 0.7rem 0.25rem 0.55rem;
558
+ border-radius: 999px;
559
+ background: rgba(255,255,255,0.12);
560
+ border: 1px solid rgba(255,255,255,0.2);
561
+ color: white;
562
+ cursor: pointer;
563
+ font-size: 0.82rem;
564
+ line-height: 1.2;
565
+ transition: background var(--transition-fast), border-color var(--transition-fast), transform var(--transition-fast);
566
+
567
+ &:hover {
568
+ background: rgba(255,255,255,0.2);
569
+ border-color: rgba(255,255,255,0.4);
570
+ }
571
+
572
+ &:active { transform: scale(0.97); }
573
+
574
+ .respell {
575
+ display: inline-flex;
576
+ align-items: baseline;
577
+ gap: 0.4rem;
578
+ strong { font-weight: 700; }
579
+ .phon {
580
+ font-family: var(--font-mono);
581
+ font-size: 0.75rem;
582
+ opacity: 0.85;
583
+ }
584
+ }
585
+
586
+ .pronounce-wink {
587
+ opacity: 0.9;
588
+ font-style: italic;
589
+ }
590
+
591
+ .pronounce-speaker {
592
+ opacity: 0.85;
593
+ font-size: 0.8rem;
594
+ }
595
+
596
+ // little wiggle when it speaks
597
+ &.is-saying .pronounce-speaker { animation: pronounce-wiggle 0.5s ease-in-out 1; }
598
+ }
599
+
600
+ // Stack on narrow viewports
601
+ @media screen and (max-width: 768px) {
602
+ .hero-content { align-items: flex-start; }
603
+ .hero-actions { width: 100%; }
604
+ .hero-pronounce .pronounce-wink { display: none; }
605
+ }
606
+ }
607
+
608
+ @keyframes gem-float {
609
+ 0%, 100% { transform: translateY(0); }
610
+ 50% { transform: translateY(-5px); }
611
+ }
612
+
613
+ @keyframes pronounce-wiggle {
614
+ 0%, 100% { transform: rotate(0) scale(1); }
615
+ 25% { transform: rotate(-12deg) scale(1.2); }
616
+ 75% { transform: rotate(12deg) scale(1.2); }
617
+ }
618
+
619
+ // Dark mode hero adjustments
620
+ [data-theme="dark"] .hero-welcome {
621
+ background: linear-gradient(135deg,
622
+ hsl(348, 65%, 35%) 0%,
623
+ hsl(348, 55%, 25%) 50%,
624
+ hsl(348, 50%, 18%) 100%
625
+ );
626
+
627
+ .button.is-hero-primary {
628
+ background: rgba(255,255,255,0.95);
629
+ color: hsl(348, 70%, 45%);
630
+ }
631
+ }
632
+
633
+ /* ========================================
634
+ ACTIVITY STREAM
635
+ ======================================== */
636
+
637
+ .activity-stream-box {
638
+ background: var(--color-bg-secondary);
639
+ border: 1px solid var(--color-border-light);
640
+ }
641
+
642
+ .activity-list {
643
+ .activity-item {
644
+ display: flex;
645
+ align-items: center;
646
+ padding: 0.875rem 0;
647
+ border-bottom: 1px solid var(--color-border-light);
648
+
649
+ &:last-child {
650
+ border-bottom: none;
651
+ }
652
+
653
+ &:first-child {
654
+ padding-top: 0;
655
+ }
656
+ }
657
+
658
+ .activity-icon {
659
+ width: 36px;
660
+ height: 36px;
661
+ display: flex;
662
+ align-items: center;
663
+ justify-content: center;
664
+ background: var(--color-bg-tertiary);
665
+ border-radius: 50%;
666
+ margin-right: 0.875rem;
667
+ flex-shrink: 0;
668
+
669
+ i {
670
+ font-size: 0.9rem;
671
+ }
672
+ }
673
+
674
+ .activity-text {
675
+ flex: 1;
676
+ color: var(--color-text-secondary);
677
+ font-size: 0.9rem;
678
+
679
+ strong {
680
+ color: var(--color-text-primary);
681
+ font-weight: 600;
682
+ }
683
+ }
684
+
685
+ .activity-time {
686
+ font-size: 0.75rem;
687
+ color: var(--color-text-muted);
688
+ white-space: nowrap;
689
+ margin-left: 1rem;
690
+ }
691
+ }
692
+
693
+ [data-theme="dark"] .activity-stream-box {
694
+ background: var(--color-bg-secondary);
695
+ border-color: var(--color-border);
696
+ }
697
+
698
+ /* Dashboard cards with accent borders */
699
+ .dashboard-card {
700
+ position: relative;
701
+ overflow: hidden;
702
+ display: flex;
703
+ flex-direction: column;
704
+
705
+ .card-content {
706
+ flex: 1;
707
+ }
708
+
709
+ &::before {
710
+ content: '';
711
+ position: absolute;
712
+ top: 0;
713
+ left: 0;
714
+ right: 0;
715
+ height: 4px;
716
+ background: var(--color-primary);
717
+ transition: height var(--transition-fast);
718
+ }
719
+
720
+ &:hover::before {
721
+ height: 5px;
722
+ }
723
+
724
+ /* Card footer styling */
725
+ .card-footer {
726
+ border-top: 1px solid var(--color-border-light);
727
+ background: var(--color-bg-tertiary);
728
+
729
+ .card-footer-item {
730
+ padding: 0.75rem;
731
+ color: var(--color-text-secondary);
732
+ font-size: 0.9rem;
733
+ transition: all var(--transition-fast);
734
+ display: flex;
735
+ align-items: center;
736
+ justify-content: center;
737
+
738
+ &:hover {
739
+ background: var(--color-bg-secondary);
740
+ color: var(--color-primary);
741
+ }
742
+
743
+ &.quick-action {
744
+ flex: 0 0 auto;
745
+ width: 48px;
746
+ border-left: 1px solid var(--color-border-light);
747
+ color: var(--color-text-muted);
748
+
749
+ &:hover {
750
+ background: var(--color-primary-light);
751
+ color: var(--color-primary);
752
+ }
753
+ }
754
+ }
755
+ }
756
+ /* Icon hover animation */
757
+ .icon.is-large {
758
+ transition: transform var(--transition-normal);
759
+ }
760
+
761
+ &:hover .icon.is-large {
762
+ transform: scale(1.1);
763
+ }
764
+ }
765
+
766
+ /* Equal height cards on welcome page (scoped to index dashboard only) */
767
+ .index-dashboard-cards {
768
+ display: flex;
769
+ align-items: stretch;
770
+ }
771
+ .index-dashboard-cards .column {
772
+ display: flex;
773
+ }
774
+ .index-dashboard-cards .card {
775
+ width: 100%;
776
+ display: flex;
777
+ flex-direction: column;
778
+ position: relative;
779
+ }
780
+ .index-dashboard-cards .card-content {
781
+ flex: 1;
782
+ display: flex;
783
+ flex-direction: column;
784
+ align-items: center;
785
+ text-align: center;
786
+ justify-content: space-between;
787
+ padding-bottom: 30px;
788
+ }
789
+ .index-dashboard-cards .card-content .buttons {
790
+ bottom: 30px;
791
+ left: 0;
792
+ right: 0;
793
+ }
794
+
795
+ /* ========================================
796
+ AGENT HERO HEADER
797
+ ======================================== */
798
+
799
+ .agent-header-hero {
800
+ background: linear-gradient(135deg, var(--color-bg-secondary) 0%, var(--color-bg-tertiary) 100%);
801
+ border: 1px solid var(--color-border);
802
+ border-radius: var(--radius-lg);
803
+ padding: 1.25rem 1.5rem;
804
+ position: relative;
805
+ overflow: hidden;
806
+ }
807
+
808
+ /* Subtle decorative element */
809
+ .agent-header-hero::before {
810
+ content: '';
811
+ position: absolute;
812
+ top: 0;
813
+ right: 0;
814
+ width: 200px;
815
+ height: 200px;
816
+ background: radial-gradient(circle, var(--color-primary) 0%, transparent 70%);
817
+ opacity: 0.05;
818
+ pointer-events: none;
819
+ }
820
+
821
+ /* Top row: Name/badges on left, status/action on right */
822
+ .agent-header-top-row {
823
+ display: flex !important;
824
+ flex-direction: row !important;
825
+ justify-content: space-between;
826
+ align-items: flex-start;
827
+ gap: 1.5rem;
828
+ flex-wrap: nowrap;
829
+ }
830
+
831
+ .agent-header-identity {
832
+ flex: 1 1 auto;
833
+ min-width: 200px;
834
+ }
835
+
836
+ .agent-header-actions {
837
+ flex: 0 0 auto;
838
+ display: flex;
839
+ align-items: flex-start;
840
+ }
841
+
842
+ /* Agent Identity (Name + Badges) */
843
+ .agent-hero-identity {
844
+ /* Container for name and badges */
845
+ }
846
+
847
+ .agent-hero-name {
848
+ font-size: 1.75rem;
849
+ font-weight: 700;
850
+ color: var(--color-text-primary);
851
+ margin-bottom: 0.5rem;
852
+ line-height: 1.2;
853
+ }
854
+
855
+ .agent-hero-badges {
856
+ display: flex;
857
+ flex-wrap: wrap;
858
+ gap: 0.5rem;
859
+ align-items: center;
860
+ }
861
+
862
+ .agent-hero-badges .tag {
863
+ font-weight: 500;
864
+ padding: 0.4em 0.7em;
865
+ font-size: 0.85rem;
866
+ }
867
+
868
+ .agent-model-badge {
869
+ background: var(--color-bg-tertiary) !important;
870
+ color: var(--color-text-secondary) !important;
871
+ border: 1px solid var(--color-border);
872
+ }
873
+
874
+ /* Agent Status Controls - Horizontal Row */
875
+ .agent-header-controls {
876
+ display: flex;
877
+ align-items: center;
878
+ }
879
+
880
+ .agent-status-action-row {
881
+ display: flex;
882
+ align-items: center;
883
+ gap: 0.75rem;
884
+ }
885
+
886
+ .agent-status-badge {
887
+ font-weight: 600;
888
+ padding: 0.5em 1em !important;
889
+ font-size: 0.9rem;
890
+ }
891
+
892
+ .agent-status-badge .icon {
893
+ margin-right: 0.35em;
894
+ }
895
+ /* Render the status icon as a small dot, not a big filled circle */
896
+ .agent-status-badge .icon i {
897
+ font-size: 0.5em;
898
+ }
899
+
900
+ /* Animated pulse for running status */
901
+ .agent-status-badge.is-running .icon i {
902
+ animation: status-pulse 2s ease-in-out infinite;
903
+ }
904
+
905
+ @keyframes status-pulse {
906
+ 0%, 100% { opacity: 1; }
907
+ 50% { opacity: 0.5; }
908
+ }
909
+
910
+ .agent-action-btn {
911
+ font-weight: 600;
912
+ transition: transform var(--transition-fast), box-shadow var(--transition-fast);
913
+ }
914
+
915
+ .agent-action-btn:hover:not(:disabled) {
916
+ transform: translateY(-1px);
917
+ box-shadow: var(--shadow-sm);
918
+ }
919
+
920
+ /* Quick Actions Dropdown */
921
+ .agent-quick-actions-dropdown {
922
+ margin-left: 0.5rem;
923
+ }
924
+
925
+ .agent-quick-actions-btn {
926
+ padding: 0.5rem 0.75rem;
927
+ border: 1px solid var(--color-border);
928
+ background: var(--color-bg-secondary);
929
+ color: var(--color-text-secondary);
930
+ transition: all var(--transition-fast);
931
+ }
932
+
933
+ .agent-quick-actions-btn:hover {
934
+ background: var(--color-bg-tertiary);
935
+ color: var(--color-text-primary);
936
+ border-color: var(--color-border-dark);
937
+ }
938
+
939
+ .agent-quick-actions-dropdown .dropdown-menu {
940
+ min-width: 200px;
941
+ }
942
+
943
+ .agent-quick-actions-dropdown .dropdown-content {
944
+ background: var(--color-bg-primary);
945
+ border: 1px solid var(--color-border);
946
+ border-radius: var(--radius-md);
947
+ box-shadow: var(--shadow-lg);
948
+ padding: 0.5rem 0;
949
+ }
950
+
951
+ .agent-quick-actions-dropdown .dropdown-item {
952
+ display: flex;
953
+ align-items: center;
954
+ gap: 0.75rem;
955
+ padding: 0.6rem 1rem;
956
+ color: var(--color-text-primary);
957
+ font-size: 0.9rem;
958
+ transition: background-color var(--transition-fast);
959
+ }
960
+
961
+ .agent-quick-actions-dropdown .dropdown-item:hover {
962
+ background: var(--color-bg-secondary);
963
+ }
964
+
965
+ .agent-quick-actions-dropdown .dropdown-item .icon {
966
+ color: var(--color-text-muted);
967
+ }
968
+
969
+ .agent-quick-actions-dropdown .dropdown-item:hover .icon {
970
+ color: var(--color-text-secondary);
971
+ }
972
+
973
+ .agent-quick-actions-dropdown .dropdown-item.has-text-danger {
974
+ color: var(--color-danger);
975
+ }
976
+
977
+ .agent-quick-actions-dropdown .dropdown-item.has-text-danger:hover {
978
+ background: rgba(var(--color-danger-rgb, 220, 53, 69), 0.1);
979
+ }
980
+
981
+ .agent-quick-actions-dropdown .dropdown-item.has-text-danger .icon {
982
+ color: var(--color-danger);
983
+ }
984
+
985
+ .agent-quick-actions-dropdown .dropdown-divider {
986
+ background-color: var(--color-border-light);
987
+ margin: 0.5rem 0;
988
+ }
989
+
990
+ /* Description - inside header */
991
+ .agent-header-description {
992
+ margin-top: 1rem;
993
+ padding-top: 1rem;
994
+ border-top: 1px solid var(--color-border-light);
995
+ }
996
+
997
+ /* Stats Bar */
998
+ .agent-stats-bar {
999
+ display: flex !important;
1000
+ flex-direction: row !important;
1001
+ flex-wrap: nowrap;
1002
+ align-items: center;
1003
+ gap: 0;
1004
+ margin-top: 1rem;
1005
+ background: var(--color-bg-tertiary);
1006
+ margin-left: -1.5rem;
1007
+ margin-right: -1.5rem;
1008
+ margin-bottom: -1.25rem;
1009
+ padding: 0.75rem 1.5rem;
1010
+ border-radius: 0 0 var(--radius-lg) var(--radius-lg);
1011
+ border-top: 1px solid var(--color-border-light);
1012
+ }
1013
+
1014
+ .agent-stat {
1015
+ display: flex;
1016
+ flex-direction: column;
1017
+ align-items: center;
1018
+ justify-content: center;
1019
+ gap: 0.25rem;
1020
+ padding: 0.5rem 2rem;
1021
+ border-right: 1px solid var(--color-border-dark);
1022
+ font-size: 0.9rem;
1023
+ color: var(--color-text-secondary);
1024
+ text-decoration: none;
1025
+ transition: color var(--transition-fast), background-color var(--transition-fast);
1026
+ text-align: center;
1027
+ }
1028
+
1029
+ a.agent-stat {
1030
+ cursor: pointer;
1031
+ border-radius: var(--radius-sm);
1032
+ }
1033
+
1034
+ a.agent-stat:hover {
1035
+ background: var(--color-bg-secondary);
1036
+ }
1037
+
1038
+ .agent-stat:last-child {
1039
+ border-right: none;
1040
+ }
1041
+
1042
+ .agent-stat:first-child {
1043
+ padding-left: 0;
1044
+ }
1045
+
1046
+ a.agent-stat:hover {
1047
+ color: var(--color-primary);
1048
+ }
1049
+
1050
+ a.agent-stat:hover .icon {
1051
+ color: var(--color-primary);
1052
+ }
1053
+
1054
+ .agent-stat .icon {
1055
+ color: var(--color-text-muted);
1056
+ flex-shrink: 0;
1057
+ transition: color var(--transition-fast);
1058
+ }
1059
+
1060
+ a.agent-stat:hover .icon {
1061
+ color: var(--color-primary);
1062
+ }
1063
+
1064
+ .agent-stat-value {
1065
+ font-weight: 700;
1066
+ font-size: 1.1rem;
1067
+ color: var(--color-text-primary);
1068
+ line-height: 1.2;
1069
+ }
1070
+
1071
+ .agent-stat-label {
1072
+ color: var(--color-text-muted);
1073
+ font-size: 0.7rem;
1074
+ text-transform: uppercase;
1075
+ letter-spacing: 0.05em;
1076
+ }
1077
+
1078
+ /* Collapsible Agent Details - Simplified */
1079
+ .agent-details-collapsible {
1080
+ margin-top: 1rem;
1081
+ padding-top: 0.75rem;
1082
+ border-top: 1px solid var(--color-border-light);
1083
+ }
1084
+
1085
+ .agent-details-summary {
1086
+ cursor: pointer;
1087
+ display: flex;
1088
+ align-items: center;
1089
+ gap: 0.5rem;
1090
+ font-size: 0.9rem;
1091
+ color: var(--color-text-secondary);
1092
+ font-weight: 500;
1093
+ user-select: none;
1094
+ transition: color var(--transition-fast);
1095
+ }
1096
+
1097
+ .agent-details-summary:hover {
1098
+ color: var(--color-text-primary);
1099
+ }
1100
+
1101
+ .agent-details-summary .icon {
1102
+ transition: transform var(--transition-fast);
1103
+ }
1104
+
1105
+ .agent-details-collapsible[open] .agent-details-summary .icon {
1106
+ transform: rotate(90deg);
1107
+ }
1108
+
1109
+ .agent-details-content {
1110
+ padding-top: 0.75rem;
1111
+ padding-left: 1.5rem;
1112
+ }
1113
+
1114
+ .agent-stat {
1115
+ display: flex;
1116
+ flex-direction: column;
1117
+ align-items: center;
1118
+ text-align: center;
1119
+ }
1120
+
1121
+ .agent-stat-value {
1122
+ font-size: 1.25rem;
1123
+ font-weight: 700;
1124
+ color: var(--color-text-primary);
1125
+ }
1126
+
1127
+ .agent-stat-label {
1128
+ font-size: 0.75rem;
1129
+ color: var(--color-text-muted);
1130
+ text-transform: uppercase;
1131
+ letter-spacing: 0.5px;
1132
+ }
1133
+
1134
+ /* Description Section */
1135
+ .agent-header-description {
1136
+ margin-top: 1.25rem;
1137
+ padding-top: 1.25rem;
1138
+ border-top: 1px solid var(--color-border);
1139
+ }
1140
+
1141
+ .agent-header-description p.subtitle {
1142
+ line-height: 1.5;
1143
+ color: var(--color-text-secondary);
1144
+ margin-bottom: 0 !important;
1145
+ }
1146
+
1147
+ .agent-header-description button.is-ghost {
1148
+ vertical-align: top;
1149
+ margin-left: 0.25rem;
1150
+ }
1151
+
1152
+ .agent-header-description form {
1153
+ width: 100%;
1154
+ }
1155
+
1156
+ .agent-header-description form .textarea {
1157
+ width: 100%;
1158
+ min-height: 6em;
1159
+ }
1160
+
1161
+ .agent-header-description form .field.is-grouped {
1162
+ margin-top: 0.75rem;
1163
+ }
1164
+
1165
+ .agent-header-description form .label.is-small {
1166
+ margin-bottom: 0.25rem;
1167
+ color: var(--color-text-muted);
1168
+ font-weight: normal;
1169
+ }
1170
+
1171
+ /* Collapsible Agent Details */
1172
+ .agent-details-collapsible {
1173
+ margin-top: 1.25rem;
1174
+ padding-top: 1rem;
1175
+ border-top: 1px solid var(--color-border);
1176
+ }
1177
+
1178
+ .agent-details-summary {
1179
+ cursor: pointer;
1180
+ display: flex;
1181
+ align-items: center;
1182
+ gap: 0.5rem;
1183
+ padding: 0.5rem 0;
1184
+ color: var(--color-text-secondary);
1185
+ font-weight: 500;
1186
+ user-select: none;
1187
+ transition: color var(--transition-fast);
1188
+ }
1189
+
1190
+ .agent-details-summary:hover {
1191
+ color: var(--color-text-primary);
1192
+ }
1193
+
1194
+ .agent-details-summary .icon {
1195
+ transition: transform var(--transition-fast);
1196
+ }
1197
+
1198
+ .agent-details-collapsible[open] .agent-details-summary .icon {
1199
+ transform: rotate(90deg);
1200
+ }
1201
+
1202
+ .agent-details-content {
1203
+ padding-top: 1rem;
1204
+ }
1205
+
1206
+ /* Legacy support (keep old class for any remaining references) */
1207
+ .agent-header-box {
1208
+ border: 1px solid var(--color-border);
1209
+ background-color: var(--color-bg-secondary);
1210
+ }
1211
+
1212
+ /* ========================================
1213
+ EXECUTE TAB - TERMINAL STYLE
1214
+ ======================================== */
1215
+
1216
+ .execute-tab-layout {
1217
+ display: flex;
1218
+ flex-direction: column;
1219
+ gap: 1.5rem;
1220
+ }
1221
+
1222
+ .execute-input-section {
1223
+ width: 100%;
1224
+ }
1225
+
1226
+ .execute-result-section {
1227
+ width: 100%;
1228
+ }
1229
+
1230
+ /* Code Editor Textarea */
1231
+ .is-code-editor {
1232
+ font-family: 'JetBrains Mono', 'Fira Code', 'Consolas', monospace !important;
1233
+ font-size: 0.875rem;
1234
+ line-height: 1.5;
1235
+ background-color: var(--color-bg-tertiary);
1236
+ border: 1px solid var(--color-border);
1237
+ color: var(--color-text-primary);
1238
+ tab-size: 2;
1239
+ }
1240
+
1241
+ .is-code-editor::placeholder {
1242
+ color: var(--color-text-muted);
1243
+ font-style: italic;
1244
+ }
1245
+
1246
+ .is-code-editor:focus {
1247
+ border-color: var(--color-primary);
1248
+ box-shadow: 0 0 0 2px rgba(var(--color-primary-rgb), 0.15);
1249
+ }
1250
+
1251
+ /* Terminal Window */
1252
+ .terminal-window {
1253
+ background: #1e1e2e;
1254
+ border-radius: var(--radius-md);
1255
+ overflow: hidden;
1256
+ box-shadow: var(--shadow-lg);
1257
+ display: flex;
1258
+ flex-direction: column;
1259
+ min-height: 350px;
1260
+ }
1261
+
1262
+ .terminal-header {
1263
+ display: flex;
1264
+ align-items: center;
1265
+ gap: 0.75rem;
1266
+ padding: 0.75rem 1rem;
1267
+ background: #181825;
1268
+ border-bottom: 1px solid #313244;
1269
+ }
1270
+
1271
+ .terminal-buttons {
1272
+ display: flex;
1273
+ gap: 0.5rem;
1274
+ }
1275
+
1276
+ .terminal-btn {
1277
+ width: 12px;
1278
+ height: 12px;
1279
+ border-radius: 50%;
1280
+ }
1281
+
1282
+ .terminal-btn-close {
1283
+ background: #f38ba8;
1284
+ }
1285
+
1286
+ .terminal-btn-minimize {
1287
+ background: #f9e2af;
1288
+ }
1289
+
1290
+ .terminal-btn-maximize {
1291
+ background: #a6e3a1;
1292
+ }
1293
+
1294
+ .terminal-title {
1295
+ font-size: 0.75rem;
1296
+ color: #6c7086;
1297
+ font-weight: 500;
1298
+ text-transform: uppercase;
1299
+ letter-spacing: 0.5px;
1300
+ }
1301
+
1302
+ .terminal-body {
1303
+ flex: 1;
1304
+ padding: 1rem;
1305
+ font-family: 'JetBrains Mono', 'Fira Code', 'Consolas', monospace;
1306
+ font-size: 0.85rem;
1307
+ line-height: 1.6;
1308
+ color: #cdd6f4;
1309
+ overflow-y: auto;
1310
+ overflow-x: hidden;
1311
+ word-break: break-word;
1312
+
1313
+ /* Notification styling inside terminal */
1314
+ .notification {
1315
+ background: #313244;
1316
+ border: 1px solid #45475a;
1317
+ border-radius: var(--radius-md);
1318
+ color: #cdd6f4;
1319
+ margin: 0;
1320
+ padding: 1rem;
1321
+
1322
+ &.is-success {
1323
+ background: linear-gradient(135deg, #1a332a 0%, #1e3d30 100%);
1324
+ border-color: #2d5a45;
1325
+
1326
+ p strong {
1327
+ color: #a6e3a1;
1328
+ }
1329
+ }
1330
+
1331
+ &.is-danger {
1332
+ background: linear-gradient(135deg, #3a1a1a 0%, #4a2020 100%);
1333
+ border-color: #5a2d2d;
1334
+
1335
+ p strong {
1336
+ color: #f38ba8;
1337
+ }
1338
+ }
1339
+
1340
+ &.is-warning {
1341
+ background: linear-gradient(135deg, #33291a 0%, #3d3020 100%);
1342
+ border-color: #5a4a2d;
1343
+
1344
+ p strong {
1345
+ color: #f9e2af;
1346
+ }
1347
+ }
1348
+
1349
+ &.is-info {
1350
+ background: linear-gradient(135deg, #1e2a4a 0%, #243050 100%);
1351
+ border-color: #3d4f7a;
1352
+
1353
+ p strong {
1354
+ color: #89dceb;
1355
+ }
1356
+ }
1357
+
1358
+ p {
1359
+ margin-bottom: 0.5rem;
1360
+ color: #cdd6f4;
1361
+
1362
+ strong {
1363
+ font-weight: 600;
1364
+ display: block;
1365
+ margin-bottom: 0.5rem;
1366
+ font-size: 0.9rem;
1367
+ text-transform: uppercase;
1368
+ letter-spacing: 0.05em;
1369
+ }
1370
+ }
1371
+
1372
+ pre {
1373
+ background: rgba(0, 0, 0, 0.3);
1374
+ border: 1px solid rgba(255, 255, 255, 0.1);
1375
+ border-radius: var(--radius-sm);
1376
+ padding: 1rem;
1377
+ margin: 0;
1378
+ overflow-x: auto;
1379
+ white-space: pre-wrap;
1380
+ word-break: break-word;
1381
+ font-size: 0.85rem;
1382
+ line-height: 1.7;
1383
+ color: #cdd6f4;
1384
+ max-height: 400px;
1385
+ overflow-y: auto;
1386
+
1387
+ &.has-text-danger {
1388
+ color: #f38ba8;
1389
+ }
1390
+ }
1391
+ }
1392
+ }
1393
+
1394
+ .terminal-placeholder {
1395
+ color: #6c7086;
1396
+ font-style: italic;
1397
+ }
1398
+
1399
+ /* Terminal content styling */
1400
+ .terminal-body > p {
1401
+ margin-bottom: 0.5rem;
1402
+ }
1403
+
1404
+ .terminal-body > code {
1405
+ background: #313244;
1406
+ padding: 0.125rem 0.375rem;
1407
+ border-radius: 3px;
1408
+ color: #f5c2e7;
1409
+ }
1410
+
1411
+ .terminal-body > pre {
1412
+ background: #11111b;
1413
+ padding: 0.75rem;
1414
+ border-radius: var(--radius-sm);
1415
+ overflow-x: auto;
1416
+ white-space: pre-wrap;
1417
+ word-break: break-word;
1418
+ margin: 0.5rem 0;
1419
+ }
1420
+
1421
+ /* JSON syntax highlighting (basic) */
1422
+ .terminal-body .json-key {
1423
+ color: #89b4fa;
1424
+ }
1425
+
1426
+ .terminal-body .json-string {
1427
+ color: #a6e3a1;
1428
+ }
1429
+
1430
+ .terminal-body .json-number {
1431
+ color: #fab387;
1432
+ }
1433
+
1434
+ .terminal-body .json-boolean {
1435
+ color: #f5c2e7;
1436
+ }
1437
+
1438
+ /* Execute button styles */
1439
+ .execute-input-box {
1440
+ background: var(--color-bg-secondary);
1441
+ }
1442
+
1443
+ .execute-input-box .title {
1444
+ display: flex;
1445
+ align-items: center;
1446
+ }
1447
+
1448
+ #execute-task-button {
1449
+ min-width: 140px;
1450
+ font-weight: 600;
1451
+ }
1452
+
1453
+ #execute-task-button:disabled {
1454
+ opacity: 0.6;
1455
+ }
1456
+
1457
+ /* Responsive adjustments */
1458
+ @media screen and (max-width: 768px) {
1459
+ .agent-header-top-row {
1460
+ flex-direction: column;
1461
+ gap: 1rem;
1462
+ }
1463
+
1464
+ .agent-header-actions {
1465
+ width: 100%;
1466
+ }
1467
+
1468
+ .agent-status-action-row {
1469
+ justify-content: space-between;
1470
+ width: 100%;
1471
+ }
1472
+
1473
+ .agent-stats-bar {
1474
+ flex-wrap: wrap;
1475
+ gap: 0.5rem;
1476
+ }
1477
+
1478
+ .agent-stat {
1479
+ border-right: none;
1480
+ padding: 0.5rem 0;
1481
+ flex: 1 1 auto;
1482
+ min-width: 100px;
1483
+ justify-content: center;
1484
+ }
1485
+
1486
+ .agent-hero-name {
1487
+ font-size: 1.5rem;
1488
+ }
1489
+ }
1490
+
1491
+
1492
+ /* --- Custom Rounded Tabs --- */
1493
+ /* ========================================
1494
+ CUSTOM ROUNDED TABS - POLISHED
1495
+ ======================================== */
1496
+
1497
+ /* Modern underline tabs (ruby active underline, no boxes) */
1498
+ .custom-rounded-tabs-container {
1499
+ background-color: transparent;
1500
+ padding: 0;
1501
+ margin-bottom: 1.5rem;
1502
+ border-bottom: 1px solid var(--color-border);
1503
+ overflow-x: auto;
1504
+ position: relative;
1505
+ }
1506
+
1507
+ .custom-rounded-tabs-container .tabs {
1508
+ margin-bottom: 0 !important;
1509
+ }
1510
+
1511
+ .custom-rounded-tabs-container .tabs ul {
1512
+ border-bottom: none;
1513
+ align-items: flex-end;
1514
+ flex-wrap: nowrap;
1515
+ gap: 0.25rem;
1516
+ }
1517
+
1518
+ .custom-rounded-tabs-container .tabs li {
1519
+ margin: 0;
1520
+ }
1521
+
1522
+ .custom-rounded-tabs-container .tabs li a {
1523
+ border: none;
1524
+ border-bottom: 2px solid transparent;
1525
+ border-radius: 0;
1526
+ background-color: transparent;
1527
+ color: var(--color-text-muted);
1528
+ padding: 0.8rem 1.1rem;
1529
+ margin-bottom: -1px; /* overlap the container's bottom rail */
1530
+ min-height: 44px;
1531
+ display: flex;
1532
+ align-items: center;
1533
+ gap: 0.5rem;
1534
+ font-weight: 500;
1535
+ font-size: 0.9rem;
1536
+ white-space: nowrap;
1537
+ box-shadow: none;
1538
+ transition: color var(--transition-fast), border-color var(--transition-fast);
1539
+ }
1540
+
1541
+ .custom-rounded-tabs-container .tabs li a:hover {
1542
+ background-color: transparent;
1543
+ color: var(--color-text-primary);
1544
+ border-bottom-color: var(--color-border-dark);
1545
+ }
1546
+
1547
+ .custom-rounded-tabs-container .tabs li.is-active a {
1548
+ background-color: transparent;
1549
+ color: var(--color-primary);
1550
+ border-bottom-color: var(--color-primary);
1551
+ font-weight: 600;
1552
+ box-shadow: none;
1553
+ }
1554
+
1555
+ /* Icon styling */
1556
+ .custom-rounded-tabs-container .tabs li a .icon {
1557
+ color: inherit;
1558
+ font-size: 0.85em;
1559
+ }
1560
+
1561
+ .custom-rounded-tabs-container .tabs li.is-active a .icon {
1562
+ color: var(--color-primary);
1563
+ }
1564
+ .custom-rounded-tabs-container .tabs li .tab-external-icon {
1565
+ font-size: 0.68em; opacity: 0.55; margin-left: 0.15rem;
1566
+ }
1567
+
1568
+ /* ========================================
1569
+ CONFIG PANEL (agent detail → Config tab)
1570
+ ======================================== */
1571
+ .config-panel .config-field {
1572
+ padding: 0.95rem 0;
1573
+ border-top: 1px solid var(--color-border-light);
1574
+ }
1575
+ .config-panel .config-field:first-of-type { padding-top: 0; border-top: none; }
1576
+ .config-panel .config-field:last-of-type { padding-bottom: 0; }
1577
+
1578
+ .config-field-row {
1579
+ display: flex; align-items: center; justify-content: space-between; gap: 1rem;
1580
+ }
1581
+ .config-field-main { display: flex; align-items: center; gap: 0.85rem; min-width: 0; flex-wrap: wrap; }
1582
+ .config-field-head {
1583
+ display: flex; align-items: center; justify-content: space-between; gap: 1rem;
1584
+ margin-bottom: 0.5rem;
1585
+ }
1586
+ .config-label {
1587
+ font-size: 0.68rem; font-weight: 700; letter-spacing: 0.07em; text-transform: uppercase;
1588
+ color: var(--color-text-muted); flex: none; min-width: 150px;
1589
+ }
1590
+ .config-field-head .config-label { min-width: 0; }
1591
+ .config-value { color: var(--color-text-primary); font-size: 0.92rem; }
1592
+ .config-empty { color: var(--color-text-muted); font-style: italic; font-size: 0.9rem; margin: 0; }
1593
+
1594
+ .config-edit-btn {
1595
+ display: inline-flex; align-items: center; justify-content: center;
1596
+ width: 1.9rem; height: 1.9rem; flex: none;
1597
+ border: 1px solid var(--color-border); border-radius: var(--radius-md);
1598
+ background: transparent; color: var(--color-text-muted); cursor: pointer; font-size: 0.8rem;
1599
+ transition: all var(--transition-fast);
1600
+ }
1601
+ .config-edit-btn:hover { color: var(--color-primary); border-color: var(--color-primary); background: var(--color-primary-light); }
1602
+
1603
+ .config-code {
1604
+ font-family: var(--font-mono); font-size: 0.78rem; line-height: 1.5;
1605
+ background: var(--color-bg-tertiary); border: 1px solid var(--color-border);
1606
+ border-radius: var(--radius-sm); padding: 0.7rem 0.85rem;
1607
+ color: var(--color-text-secondary); white-space: pre-wrap; word-break: break-word;
1608
+ margin: 0; overflow-x: auto;
1609
+ }
1610
+
1611
+ /* AI agent generator — review form */
1612
+ .agent-gen-review-banner {
1613
+ display: flex; align-items: center; gap: 0.5rem;
1614
+ padding: 0.6rem 0.85rem;
1615
+ background: var(--color-primary-light); color: var(--color-primary);
1616
+ border-radius: var(--radius-md); font-weight: 500; font-size: 0.9rem;
1617
+ }
1618
+ .agent-gen-tools {
1619
+ display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
1620
+ gap: 0.45rem 0.85rem;
1621
+ padding: 0.75rem; border: 1px solid var(--color-border); border-radius: var(--radius-md);
1622
+ background: var(--color-bg-tertiary); max-height: 170px; overflow-y: auto;
1623
+ }
1624
+ .agent-gen-tool-item { display: inline-flex; align-items: center; gap: 0.45rem; font-size: 0.85rem; }
1625
+ .agent-gen-tool-item input[type="checkbox"] { accent-color: var(--color-primary); }
1626
+ .agent-gen-tool-name { font-family: var(--font-mono); font-size: 0.8rem; }
1627
+ .agent-gen-code-details summary {
1628
+ cursor: pointer; font-weight: 600; color: var(--color-text-secondary); font-size: 0.85rem;
1629
+ }
1630
+ .agent-gen-code-details[open] summary { margin-bottom: 0.4rem; }
1631
+ .agent-gen-suggested { display: flex; flex-direction: column; gap: 0.5rem; }
1632
+ .agent-gen-suggested-item {
1633
+ display: flex; align-items: center; justify-content: space-between; gap: 0.75rem;
1634
+ padding: 0.6rem 0.75rem;
1635
+ border: 1px solid var(--color-border); border-radius: var(--radius-md);
1636
+ background: var(--color-bg-secondary);
1637
+ }
1638
+ .agent-gen-suggested-info { display: flex; flex-direction: column; gap: 0.1rem; min-width: 0; }
1639
+ .agent-gen-suggested-name { font-family: var(--font-mono); font-size: 0.82rem; font-weight: 600; color: var(--color-primary); }
1640
+ .agent-gen-suggested-desc { font-size: 0.8rem; color: var(--color-text-muted); }
1641
+ .agent-gen-build-btn { flex: none; }
1642
+
1643
+ /* Tool generator — live install box */
1644
+ .tool-install-box {
1645
+ padding: 0.85rem 1rem;
1646
+ border: 1px solid var(--color-border);
1647
+ border-radius: var(--radius-md);
1648
+ background: var(--color-bg-tertiary);
1649
+ }
1650
+ .tool-install-confirm { display: flex; gap: 0.5rem; align-items: flex-start; font-size: 0.88rem; }
1651
+ .tool-install-confirm input[type="checkbox"] { accent-color: var(--color-primary); margin-top: 0.2rem; }
1652
+ .tool-install-disabled { color: var(--color-text-muted); }
1653
+
1654
+ /* Tab content — no outer panel; the inner cards provide their own framing */
1655
+ #tab-content {
1656
+ background-color: transparent;
1657
+ border: none;
1658
+ border-radius: 0;
1659
+ padding: 0;
1660
+ margin-bottom: 1.5rem;
1661
+ }
1662
+
1663
+ /* Tab content fade transition */
1664
+ #tab-content > .content-tab {
1665
+ animation: tabFadeIn 0.2s ease-out;
1666
+ }
1667
+
1668
+ @keyframes tabFadeIn {
1669
+ from {
1670
+ opacity: 0;
1671
+ transform: translateY(-4px);
1672
+ }
1673
+ to {
1674
+ opacity: 1;
1675
+ transform: translateY(0);
1676
+ }
1677
+ }
1678
+
1679
+ /* Respect reduced motion preference */
1680
+ @media (prefers-reduced-motion: reduce) {
1681
+ #tab-content > .content-tab {
1682
+ animation: none;
1683
+ }
1684
+ }
1685
+
1686
+ /* --- Tab Content Spacing --- */
1687
+ #tab-content > .content-tab > .box,
1688
+ #tab-content > .content-tab > .columns {
1689
+ margin-top: 0;
1690
+ }
1691
+
1692
+ /* --- Tables --- */
1693
+ .table-container {
1694
+ background: var(--color-bg-secondary);
1695
+ border: 1px solid var(--color-border);
1696
+ border-radius: var(--radius-lg);
1697
+ overflow: visible; /* Ensure both axes allow overflow for dropdown */
1698
+ transition: background-color var(--transition-normal), border-color var(--transition-normal);
1699
+ }
1700
+ .table {
1701
+ background-color: transparent;
1702
+ font-size: 0.9rem;
1703
+ border-radius: var(--radius-md);
1704
+ }
1705
+ .table thead th {
1706
+ background: var(--color-bg-tertiary);
1707
+ color: var(--color-text-secondary);
1708
+ font-size: 0.75rem;
1709
+ text-transform: uppercase;
1710
+ letter-spacing: 0.05em;
1711
+ font-weight: 600;
1712
+ border-bottom-width: 2px;
1713
+ border-color: var(--color-border);
1714
+ padding: 0.875rem 1rem;
1715
+ }
1716
+ .table td, .table th {
1717
+ vertical-align: middle;
1718
+ padding: 0.875rem 1rem;
1719
+ border-color: var(--color-border);
1720
+ color: var(--color-text-primary);
1721
+ }
1722
+ .table.is-striped tbody tr:nth-child(even) {
1723
+ background-color: var(--color-bg-tertiary);
1724
+ }
1725
+ .table.is-hoverable tbody tr:hover {
1726
+ background-color: var(--color-primary-light);
1727
+ }
1728
+
1729
+ /* Dark mode table adjustments */
1730
+ [data-theme="dark"] .table {
1731
+ background-color: transparent !important;
1732
+ }
1733
+
1734
+ [data-theme="dark"] .table thead th {
1735
+ background-color: var(--color-bg-tertiary) !important;
1736
+ color: var(--color-text-secondary) !important;
1737
+ }
1738
+
1739
+ [data-theme="dark"] .table td,
1740
+ [data-theme="dark"] .table th {
1741
+ color: var(--color-text-primary) !important;
1742
+ border-color: var(--color-border) !important;
1743
+ background-color: transparent !important;
1744
+ }
1745
+
1746
+ [data-theme="dark"] .table tbody {
1747
+ background-color: var(--color-bg-secondary) !important;
1748
+ }
1749
+
1750
+ [data-theme="dark"] .table tbody tr {
1751
+ background-color: var(--color-bg-secondary) !important;
1752
+ }
1753
+
1754
+ [data-theme="dark"] .table.is-striped tbody tr:nth-child(even) {
1755
+ background-color: var(--color-bg-tertiary) !important;
1756
+ }
1757
+
1758
+ [data-theme="dark"] .table.is-striped tbody tr:nth-child(odd) {
1759
+ background-color: var(--color-bg-secondary) !important;
1760
+ }
1761
+
1762
+ [data-theme="dark"] .table.is-hoverable tbody tr:hover {
1763
+ background-color: rgba(220, 38, 38, 0.15) !important; /* Ruby red tint */
1764
+ }
1765
+
1766
+ /* Table row hover accent - left border indicator */
1767
+ /* Only apply to specific tables (agents, tools) to avoid breaking documentation tables */
1768
+ /* Using box-shadow instead of ::before to avoid table layout issues with position:relative on tr */
1769
+ #agent-list-table tbody tr,
1770
+ .tools-table tbody tr {
1771
+ transition: box-shadow var(--transition-fast);
1772
+
1773
+ &:hover {
1774
+ box-shadow: inset 3px 0 0 0 var(--color-primary);
1775
+ }
1776
+ }
1777
+
1778
+ /* ========================================
1779
+ INLINE ACTION BUTTONS (Gmail/Notion style)
1780
+ ======================================== */
1781
+
1782
+ .actions-cell {
1783
+ text-align: right;
1784
+ white-space: nowrap;
1785
+ width: 1%;
1786
+ }
1787
+
1788
+ /* (Removed dead `.inline-actions` + `.action-btn` icon-button rules — they
1789
+ styled the old agents table row, which was replaced by the .agent-card grid
1790
+ and its dedicated `.legion-action` buttons.) */
1791
+
1792
+ /* Dark mode table container */
1793
+ [data-theme="dark"] .table-container {
1794
+ background-color: var(--color-bg-secondary) !important;
1795
+ border-color: var(--color-border) !important;
1796
+ }
1797
+
1798
+ /* Dark mode for outlined buttons */
1799
+ [data-theme="dark"] .button.is-outlined,
1800
+ [data-theme="dark"] .button.is-link.is-outlined {
1801
+ background-color: transparent !important;
1802
+ border-color: var(--color-primary) !important;
1803
+ color: var(--color-primary) !important;
1804
+ }
1805
+
1806
+ [data-theme="dark"] .button.is-outlined:hover,
1807
+ [data-theme="dark"] .button.is-link.is-outlined:hover {
1808
+ background-color: var(--color-primary) !important;
1809
+ color: #ffffff !important;
1810
+ }
1811
+
1812
+ /* Dark mode for Bulma background helpers */
1813
+ [data-theme="dark"] .has-background-info-light,
1814
+ [data-theme="dark"] .has-background-light,
1815
+ [data-theme="dark"] .has-background-white {
1816
+ background-color: var(--color-bg-tertiary) !important;
1817
+ }
1818
+
1819
+ /* ========================================
1820
+ KEYBOARD SHORTCUT HINTS
1821
+ ======================================== */
1822
+
1823
+ .search-with-shortcut {
1824
+ position: relative;
1825
+
1826
+ input {
1827
+ padding-right: 3.5rem !important; // Make room for the kbd hint
1828
+ }
1829
+
1830
+ .keyboard-hint {
1831
+ position: absolute;
1832
+ right: 10px;
1833
+ top: 50%;
1834
+ transform: translateY(-50%);
1835
+ pointer-events: none;
1836
+ transition: opacity var(--transition-fast);
1837
+ z-index: 4;
1838
+
1839
+ kbd {
1840
+ font-family: var(--font-mono);
1841
+ font-size: 0.65rem;
1842
+ padding: 3px 6px;
1843
+ background: var(--color-bg-tertiary);
1844
+ border-radius: 4px;
1845
+ color: var(--color-text-muted);
1846
+ border: 1px solid var(--color-border);
1847
+ box-shadow: 0 1px 0 var(--color-border-light);
1848
+ }
1849
+ }
1850
+
1851
+ // Hide hint when input is focused or has content
1852
+ input:focus ~ .keyboard-hint,
1853
+ input:not(:placeholder-shown) ~ .keyboard-hint {
1854
+ opacity: 0;
1855
+ }
1856
+ }
1857
+
1858
+ // Hide keyboard hint on mobile/touch devices
1859
+ @media (max-width: 768px), (hover: none) {
1860
+ .search-with-shortcut .keyboard-hint {
1861
+ display: none !important;
1862
+ }
1863
+
1864
+ .search-with-shortcut input {
1865
+ padding-right: 2.5rem !important;
1866
+ }
1867
+ }
1868
+
1869
+ [data-theme="dark"] .search-with-shortcut .keyboard-hint kbd {
1870
+ background: var(--color-bg-elevated);
1871
+ border-color: var(--color-border-dark);
1872
+ color: var(--color-text-secondary);
1873
+ }
1874
+
1875
+ /* ========================================
1876
+ BREADCRUMB NAVIGATION
1877
+ ======================================== */
1878
+
1879
+ .breadcrumb {
1880
+ background: transparent;
1881
+ padding: 0;
1882
+
1883
+ ul {
1884
+ align-items: center;
1885
+ }
1886
+
1887
+ li {
1888
+ display: flex;
1889
+ align-items: center;
1890
+ }
1891
+
1892
+ a {
1893
+ color: var(--color-primary);
1894
+ display: flex;
1895
+ align-items: center;
1896
+ gap: 0.35rem;
1897
+ transition: color var(--transition-fast);
1898
+
1899
+ &:hover {
1900
+ color: var(--color-primary-dark);
1901
+ }
1902
+
1903
+ .icon {
1904
+ font-size: 0.85em;
1905
+ }
1906
+ }
1907
+
1908
+ li.is-active a {
1909
+ color: var(--color-text-secondary);
1910
+ font-weight: 500;
1911
+ cursor: default;
1912
+
1913
+ &:hover {
1914
+ color: var(--color-text-secondary);
1915
+ }
1916
+ }
1917
+
1918
+ li + li::before {
1919
+ color: var(--color-text-muted);
1920
+ content: "/";
1921
+ }
1922
+ }
1923
+
1924
+ /* Dark mode breadcrumb */
1925
+ [data-theme="dark"] .breadcrumb a {
1926
+ color: var(--color-primary) !important;
1927
+ }
1928
+
1929
+ [data-theme="dark"] .breadcrumb li.is-active a {
1930
+ color: var(--color-text-primary) !important;
1931
+ }
1932
+
1933
+ [data-theme="dark"] .breadcrumb li + li::before {
1934
+ color: var(--color-text-muted) !important;
1935
+ }
1936
+
1937
+ /* Dark mode TOC */
1938
+ [data-theme="dark"] .toc-item a {
1939
+ color: var(--color-text-secondary) !important;
1940
+ }
1941
+
1942
+ [data-theme="dark"] .toc-item a:hover {
1943
+ color: var(--color-primary) !important;
1944
+ }
1945
+
1946
+ [data-theme="dark"] .toc-container .has-text-weight-bold {
1947
+ color: var(--color-text-primary) !important;
1948
+ }
1949
+
1950
+ /* --- Forms & Panels --- */
1951
+ .create-agent-details summary {
1952
+ font-size: 1.1em;
1953
+ font-weight: 600;
1954
+ padding: 0.75em 1em;
1955
+ background-color: var(--color-bg-tertiary);
1956
+ border-bottom: 1px solid var(--color-border);
1957
+ border-radius: var(--radius-md) var(--radius-md) 0 0;
1958
+ margin: -1.25rem -1.25rem 0 -1.25rem;
1959
+ color: var(--color-text-primary) !important;
1960
+ }
1961
+
1962
+ /* Dark mode: ensure create agent details summary is readable */
1963
+ [data-theme="dark"] .create-agent-details summary,
1964
+ [data-theme="dark"] .create-agent-details summary strong {
1965
+ color: #e7e9ea !important;
1966
+ }
1967
+
1968
+ .create-agent-details[open] summary {
1969
+ border-bottom-left-radius: 0;
1970
+ border-bottom-right-radius: 0;
1971
+ }
1972
+ .create-agent-details > .mt-4 {
1973
+ padding-top: 1.5rem;
1974
+ }
1975
+ .create-agent-details summary::marker {
1976
+ color: var(--color-primary);
1977
+ }
1978
+ .create-agent-details summary .icon {
1979
+ color: var(--color-primary);
1980
+ vertical-align: middle;
1981
+ }
1982
+
1983
+ .panel.tool-selection-panel .panel-heading {
1984
+ background-color: var(--color-bg-tertiary);
1985
+ font-weight: 600;
1986
+ color: var(--color-text-primary);
1987
+ }
1988
+ .panel.tool-selection-panel .panel-block {
1989
+ background-color: var(--color-bg-secondary);
1990
+ border-color: var(--color-border);
1991
+ }
1992
+ .panel.tool-selection-panel .panel-block label.is-clickable:hover {
1993
+ background-color: var(--color-bg-tertiary);
1994
+ }
1995
+
1996
+ /* --- Parameter Lists (Tools Page) --- */
1997
+ dl.parameters-list dt, dl.parameters-list-detailed dt {
1998
+ font-weight: 600;
1999
+ margin-bottom: 0.2em;
2000
+ color: var(--color-text-primary);
2001
+ }
2002
+ dl.parameters-list dd, dl.parameters-list-detailed dd {
2003
+ margin-left: 1.5em;
2004
+ margin-bottom: 0.8em;
2005
+ color: var(--color-text-secondary);
2006
+ font-size: 0.95em;
2007
+ }
2008
+
2009
+ /* --- CodeMirror --- */
2010
+ /* Dark theme for code editors - provides visual separation from UI */
2011
+ .CodeMirror {
2012
+ border: 1px solid #313244;
2013
+ border-radius: var(--radius-md);
2014
+ font-size: 0.9em;
2015
+ height: auto;
2016
+ font-family: var(--font-mono);
2017
+ background-color: #1e1e2e !important;
2018
+ color: #cdd6f4 !important;
2019
+ }
2020
+ .CodeMirror-gutters {
2021
+ background-color: #181825 !important;
2022
+ border-right: 1px solid #313244;
2023
+ }
2024
+ .CodeMirror-linenumber {
2025
+ color: #6c7086 !important;
2026
+ }
2027
+ .CodeMirror-cursor {
2028
+ border-left: 2px solid #f5e0dc !important;
2029
+ }
2030
+ .CodeMirror-selected {
2031
+ background: #45475a !important;
2032
+ }
2033
+ .CodeMirror-focused .CodeMirror-selected {
2034
+ background: #45475a !important;
2035
+ }
2036
+ .CodeMirror-readonly .CodeMirror-cursor { display: none !important; }
2037
+
2038
+ /* CodeMirror syntax highlighting - Catppuccin-inspired */
2039
+ .cm-s-default .cm-keyword { color: #cba6f7; }
2040
+ .cm-s-default .cm-atom { color: #fab387; }
2041
+ .cm-s-default .cm-number { color: #fab387; }
2042
+ .cm-s-default .cm-def { color: #89b4fa; }
2043
+ .cm-s-default .cm-variable { color: #cdd6f4; }
2044
+ .cm-s-default .cm-variable-2 { color: #f38ba8; }
2045
+ .cm-s-default .cm-variable-3 { color: #f9e2af; }
2046
+ .cm-s-default .cm-property { color: #89dceb; }
2047
+ .cm-s-default .cm-operator { color: #94e2d5; }
2048
+ .cm-s-default .cm-comment { color: #6c7086; font-style: italic; }
2049
+ .cm-s-default .cm-string { color: #a6e3a1; }
2050
+ .cm-s-default .cm-string-2 { color: #a6e3a1; }
2051
+ .cm-s-default .cm-meta { color: #f9e2af; }
2052
+ .cm-s-default .cm-qualifier { color: #f9e2af; }
2053
+ .cm-s-default .cm-builtin { color: #f38ba8; }
2054
+ .cm-s-default .cm-bracket { color: #cdd6f4; }
2055
+ .cm-s-default .cm-tag { color: #f38ba8; }
2056
+ .cm-s-default .cm-attribute { color: #fab387; }
2057
+ .cm-s-default .cm-error { color: #f38ba8; background: #45475a; }
2058
+
2059
+ /* Match border to dark mode when UI is dark */
2060
+ [data-theme="dark"] .CodeMirror {
2061
+ border-color: var(--color-border);
2062
+ }
2063
+
2064
+ pre[style*="background-color: #fafafa;"] {
2065
+ border: 1px solid var(--color-border);
2066
+ font-size: 0.95em;
2067
+ background-color: var(--color-bg-tertiary) !important;
2068
+ }
2069
+
2070
+ /* --- Chat --- */
2071
+ /* Chat status box (agent status display) */
2072
+ .chat-status-box {
2073
+ background-color: var(--color-bg-tertiary);
2074
+ transition: background-color var(--transition-normal);
2075
+ }
2076
+
2077
+ /* ========================================
2078
+ CHAT INTERFACE - FULL HEIGHT EXPERIENCE
2079
+ ======================================== */
2080
+
2081
+ /* Chat main container with flex layout */
2082
+ .chat-container-box {
2083
+ display: flex;
2084
+ flex-direction: column;
2085
+ min-height: 550px;
2086
+ height: 60vh;
2087
+ max-height: 700px;
2088
+ border-radius: var(--radius-lg);
2089
+ overflow: hidden;
2090
+ background: var(--color-bg-secondary);
2091
+ }
2092
+
2093
+ /* Chat log container */
2094
+ #chat-log-container {
2095
+ flex: 1;
2096
+ overflow-y: auto;
2097
+ padding: 1.25rem;
2098
+ background-color: var(--color-bg-tertiary);
2099
+ transition: background-color var(--transition-normal);
2100
+ }
2101
+
2102
+ /* Empty state styling */
2103
+ #chat-log-container > p.has-text-grey-light {
2104
+ padding: 3rem 1rem;
2105
+ font-size: 1rem;
2106
+ }
2107
+
2108
+ /* Chat form container at bottom - prominent styling */
2109
+ .chat-form-container {
2110
+ padding: 1rem 1.25rem;
2111
+ background: linear-gradient(180deg, var(--color-bg-secondary) 0%, var(--color-bg-tertiary) 100%);
2112
+ border-top: 1px solid var(--color-border);
2113
+ transition: background-color var(--transition-normal);
2114
+ }
2115
+
2116
+ /* Chat input field styling */
2117
+ .chat-form-container .input {
2118
+ border-radius: var(--radius-full) !important; /* Override Bulma's has-addons */
2119
+ padding-left: 1.25rem;
2120
+ padding-right: 1.25rem;
2121
+ height: 48px;
2122
+ font-size: 0.95rem;
2123
+ background: var(--color-bg-primary);
2124
+ border: 2px solid var(--color-border);
2125
+ transition: border-color var(--transition-fast), box-shadow var(--transition-fast);
2126
+ }
2127
+
2128
+ .chat-form-container .input:focus {
2129
+ border-color: var(--color-primary);
2130
+ box-shadow: 0 0 0 3px rgba(var(--color-primary-rgb), 0.15);
2131
+ }
2132
+
2133
+ .chat-form-container .input::placeholder {
2134
+ color: var(--color-text-muted);
2135
+ }
2136
+
2137
+ /* Add gap between input and send button */
2138
+ .chat-form-container .field.has-addons {
2139
+ gap: 0.75rem;
2140
+ }
2141
+
2142
+ /* Send button styling */
2143
+ .chat-form-container #send-button {
2144
+ height: 48px;
2145
+ min-width: 100px;
2146
+ border-radius: var(--radius-full);
2147
+ font-weight: 600;
2148
+ font-size: 0.95rem;
2149
+ background: var(--color-primary);
2150
+ border-color: var(--color-primary);
2151
+ transition: transform var(--transition-fast), box-shadow var(--transition-fast), background-color var(--transition-fast);
2152
+ }
2153
+
2154
+ .chat-form-container #send-button:hover:not(:disabled) {
2155
+ transform: translateY(-1px);
2156
+ box-shadow: var(--shadow-md);
2157
+ background: var(--color-primary-hover);
2158
+ }
2159
+
2160
+ .chat-form-container #send-button:disabled {
2161
+ opacity: 0.5;
2162
+ cursor: not-allowed;
2163
+ }
2164
+
2165
+ /* Chat status help text */
2166
+ #chat-status-help-container {
2167
+ text-align: center;
2168
+ }
2169
+
2170
+ #chat-status-help-container .help {
2171
+ margin-top: 0.5rem;
2172
+ }
2173
+
2174
+ .message {
2175
+ display: flex;
2176
+ flex-direction: column;
2177
+ max-width: 85%;
2178
+ width: fit-content;
2179
+ margin-bottom: 1rem;
2180
+ clear: both;
2181
+ }
2182
+
2183
+ .message.user-message {
2184
+ float: left;
2185
+ max-width: 75%;
2186
+ border-radius: 15px 15px 15px 0 !important;
2187
+ }
2188
+
2189
+ .message.agent-message {
2190
+ float: right;
2191
+ max-width: 85%;
2192
+ border-radius: 15px !important;
2193
+ overflow: hidden;
2194
+ }
2195
+
2196
+ .message.user-message .message-header,
2197
+ .message.agent-message .message-header {
2198
+ border-bottom: none;
2199
+ border-radius: 15px 15px 0 0;
2200
+ padding: 0.5em 1em;
2201
+ display: flex;
2202
+ align-items: center;
2203
+ }
2204
+
2205
+ .message.agent-message .message-header button {
2206
+ margin-left: auto;
2207
+ }
2208
+
2209
+ .message.user-message .message-body {
2210
+ border-radius: 0 0 15px 15px;
2211
+ border-width: 0 1px 1px 1px;
2212
+ padding: 0.75em 1em;
2213
+ word-break: break-word;
2214
+ }
2215
+
2216
+ .message.agent-message .message-body {
2217
+ border-radius: 0 0 15px 15px;
2218
+ border-width: 0 1px 1px 1px;
2219
+ padding: 0.75em 1em;
2220
+ word-break: break-word;
2221
+ }
2222
+
2223
+ .message.user-message.is-link .message-header {
2224
+ background-color: #3273dc;
2225
+ color: white;
2226
+ }
2227
+
2228
+ .message.user-message.is-link .message-body {
2229
+ border-color: #3273dc;
2230
+ background-color: #f0f5fc;
2231
+ }
2232
+
2233
+ /* Agent message variants */
2234
+ .message.agent-message.is-light {
2235
+ background-color: #e9ecef;
2236
+ border: 1px solid #ced4da;
2237
+ }
2238
+
2239
+ .message.agent-message.is-light .message-header {
2240
+ background-color: #ced4da;
2241
+ color: #495057;
2242
+ }
2243
+
2244
+ .message.agent-message.is-light .message-body {
2245
+ border-color: #ced4da;
2246
+ background-color: #e9ecef;
2247
+ color: #363636;
2248
+ }
2249
+
2250
+ .message.agent-message.is-success {
2251
+ background-color: #eaf7ec;
2252
+ border-color: #9fd8a0;
2253
+ }
2254
+
2255
+ .message.agent-message.is-success .message-header {
2256
+ background-color: #9fd8a0;
2257
+ color: #256c3b;
2258
+ }
2259
+
2260
+ .message.agent-message.is-success .message-body {
2261
+ border-color: #9fd8a0;
2262
+ background-color: #eaf7ec;
2263
+ }
2264
+
2265
+ .message.agent-message.is-danger {
2266
+ background-color: #fdecea;
2267
+ border-color: #f6a3a1;
2268
+ }
2269
+
2270
+ .message.agent-message.is-danger .message-header {
2271
+ background-color: #f6a3a1;
2272
+ color: #b71c1c;
2273
+ }
2274
+
2275
+ .message.agent-message.is-danger .message-body {
2276
+ border-color: #f6a3a1;
2277
+ background-color: #fdecea;
2278
+ }
2279
+
2280
+ .message.agent-message.is-warning {
2281
+ background-color: #fffbeb;
2282
+ border-color: #ffe58a;
2283
+ }
2284
+
2285
+ .message.agent-message.is-warning .message-header {
2286
+ background-color: #ffe58a;
2287
+ color: #7a4f01;
2288
+ }
2289
+
2290
+ .message.agent-message.is-warning .message-body {
2291
+ border-color: #ffe58a;
2292
+ background-color: #fffbeb;
2293
+ }
2294
+
2295
+ /* Execution Plan Details Styles (within chat message body) */
2296
+ /* --- Blended tool-call timeline (agent execution plan) --- */
2297
+ .message-body .execution-plan-details {
2298
+ margin-top: 0.85rem;
2299
+ border-top: 1px solid var(--color-border-light);
2300
+ padding-top: 0.75rem;
2301
+ }
2302
+ .message-body .execution-plan-summary {
2303
+ cursor: pointer;
2304
+ font-family: var(--font-headline);
2305
+ font-weight: 600;
2306
+ color: var(--color-text-secondary);
2307
+ font-size: 0.8rem;
2308
+ letter-spacing: 0.01em;
2309
+ }
2310
+ .message-body .execution-plan-summary:hover { color: var(--color-text-primary); }
2311
+ /* Gold hairline connecting the tool-call steps */
2312
+ .message-body .execution-plan-steps {
2313
+ margin-top: 0.85rem;
2314
+ margin-left: 0.3rem;
2315
+ padding-left: 1.1rem;
2316
+ border-left: 2px solid var(--color-accent);
2317
+ }
2318
+ .message-body .execution-plan-step {
2319
+ position: relative;
2320
+ margin-bottom: 0.75rem;
2321
+ padding: 0.65rem 0.8rem;
2322
+ background: var(--color-bg-tertiary);
2323
+ border: 1px solid var(--color-border);
2324
+ border-radius: var(--radius-md);
2325
+ }
2326
+ .message-body .execution-plan-step:last-child { margin-bottom: 0; }
2327
+ /* Status dot sitting on the gold connector */
2328
+ .message-body .execution-plan-step::before {
2329
+ content: "";
2330
+ position: absolute;
2331
+ left: calc(-1.1rem - 1px);
2332
+ top: 1rem;
2333
+ width: 9px;
2334
+ height: 9px;
2335
+ border-radius: 50%;
2336
+ background: var(--color-success);
2337
+ box-shadow: 0 0 0 3px var(--color-bg-secondary);
2338
+ transform: translateX(-50%);
2339
+ }
2340
+ .message-body .step-title {
2341
+ font-family: var(--font-mono);
2342
+ font-weight: 600;
2343
+ font-size: 0.8rem;
2344
+ color: var(--color-text-primary);
2345
+ margin-bottom: 0.45rem;
2346
+ }
2347
+ .message-body .step-params-label, .message-body .step-result-label {
2348
+ font-size: 0.68rem;
2349
+ text-transform: uppercase;
2350
+ letter-spacing: 0.06em;
2351
+ color: var(--color-text-muted);
2352
+ margin-bottom: 0.2rem;
2353
+ }
2354
+ .message-body .step-params-pre, .message-body .step-result-pre {
2355
+ font-family: var(--font-mono);
2356
+ font-size: 0.76rem;
2357
+ line-height: 1.5;
2358
+ white-space: pre-wrap;
2359
+ word-break: break-word;
2360
+ background: var(--color-bg-secondary);
2361
+ border: 1px solid var(--color-border);
2362
+ color: var(--color-text-secondary);
2363
+ padding: 0.55rem 0.65rem;
2364
+ border-radius: var(--radius-sm);
2365
+ margin-bottom: 0.5rem;
2366
+ }
2367
+ .message-body .step-result-pre { margin-bottom: 0; }
2368
+
2369
+ /* Raw JSON container */
2370
+ .message-body .raw-json-container { display: none; margin-top: 0.6rem; border-top: 1px dashed var(--color-border); padding-top: 0.5rem; }
2371
+ .message-body .raw-json-pre { white-space: pre-wrap; word-break: break-word; font-family: var(--font-mono); font-size: 0.74rem; color: var(--color-text-muted); }
2372
+
2373
+ /* --- Chat header bar (agent name + model + status) --- */
2374
+ .chat-header {
2375
+ display: flex;
2376
+ align-items: center;
2377
+ gap: 1rem;
2378
+ padding: 0.85rem 1.1rem;
2379
+ background: var(--color-bg-secondary);
2380
+ border: 1px solid var(--color-border);
2381
+ border-radius: var(--radius-lg);
2382
+ }
2383
+ .chat-back {
2384
+ display: inline-flex;
2385
+ align-items: center;
2386
+ justify-content: center;
2387
+ width: 2rem;
2388
+ height: 2rem;
2389
+ flex: none;
2390
+ border-radius: var(--radius-md);
2391
+ border: 1px solid var(--color-border);
2392
+ color: var(--color-text-muted);
2393
+ }
2394
+ .chat-back:hover { background: var(--color-bg-tertiary); color: var(--color-text-primary); }
2395
+ .chat-header-titles { display: flex; align-items: center; gap: 0.7rem; flex-wrap: wrap; }
2396
+ .chat-agent-name {
2397
+ margin: 0;
2398
+ font-family: var(--font-headline);
2399
+ font-weight: 600;
2400
+ font-size: 1.15rem;
2401
+ color: var(--color-text-primary);
2402
+ }
2403
+ .chat-header-status { margin-left: auto; text-align: right; flex: none; }
2404
+ /* Slim session-info bar under the header */
2405
+ .chat-session-bar {
2406
+ font-size: 0.8rem;
2407
+ color: var(--color-text-muted);
2408
+ }
2409
+ .chat-session-bar p { margin: 0; }
2410
+ .chat-header-status p { margin: 0; display: flex; align-items: center; justify-content: flex-end; gap: 0.4rem; }
2411
+
2412
+ /* ========================================
2413
+ CHAT — REBUILT 3-ZONE SHELL
2414
+ header · transcript+composer · Run Details inspector
2415
+ ======================================== */
2416
+ .chat-shell {
2417
+ display: grid;
2418
+ grid-template-columns: minmax(0, 1fr) 300px;
2419
+ gap: 1.25rem;
2420
+ height: calc(100vh - 7rem);
2421
+ min-height: 520px;
2422
+ }
2423
+
2424
+ .chat-main {
2425
+ display: flex;
2426
+ flex-direction: column;
2427
+ min-height: 0;
2428
+ background: var(--color-bg-secondary);
2429
+ border: 1px solid var(--color-border);
2430
+ border-radius: var(--radius-lg);
2431
+ overflow: hidden;
2432
+ }
2433
+
2434
+ /* Header sits flush at the top of the main column */
2435
+ .chat-main .chat-header {
2436
+ flex: none;
2437
+ border: none;
2438
+ border-bottom: 1px solid var(--color-border);
2439
+ border-radius: 0;
2440
+ background: var(--color-bg-secondary);
2441
+ }
2442
+ .chat-header-actions { display: flex; align-items: center; gap: 0.6rem; margin-left: auto; }
2443
+ .chat-header-actions #agent-chat-panel-status-display p { margin: 0; }
2444
+ .chat-header-actions .tag.is-rounded.is-success {
2445
+ background: var(--color-success-light); color: var(--color-success); font-weight: 600;
2446
+ }
2447
+ .chat-header-actions .tag.is-rounded.is-danger {
2448
+ background: var(--color-bg-tertiary); color: var(--color-text-muted); font-weight: 600;
2449
+ }
2450
+
2451
+ .chat-new-session-btn {
2452
+ display: inline-flex; align-items: center; gap: 0.4rem;
2453
+ height: 2.1rem; padding: 0 0.85rem;
2454
+ border: 1px solid var(--color-primary);
2455
+ border-radius: var(--radius-md);
2456
+ background: var(--color-primary); color: #fff;
2457
+ font-size: 0.82rem; font-weight: 600; cursor: pointer;
2458
+ transition: background-color var(--transition-fast);
2459
+ }
2460
+ .chat-new-session-btn:hover { background: var(--color-primary-hover); color: #fff; }
2461
+
2462
+ /* Sessions dropdown */
2463
+ .chat-sessions-btn {
2464
+ display: inline-flex; align-items: center; gap: 0.4rem;
2465
+ height: 2.1rem; padding: 0 0.75rem;
2466
+ border: 1px solid var(--color-border);
2467
+ border-radius: var(--radius-md);
2468
+ background: transparent; color: var(--color-text-secondary);
2469
+ font-size: 0.82rem; font-weight: 500; cursor: pointer;
2470
+ transition: all var(--transition-fast);
2471
+ }
2472
+ .chat-sessions-btn:hover { background: var(--color-bg-tertiary); color: var(--color-text-primary); }
2473
+ .chat-sessions-dropdown .dropdown-menu { min-width: 280px; }
2474
+ .chat-sessions-dropdown .dropdown-content {
2475
+ background: var(--color-bg-elevated);
2476
+ border: 1px solid var(--color-border);
2477
+ box-shadow: var(--shadow-lg);
2478
+ padding: 0.4rem;
2479
+ }
2480
+ .chat-session-current { padding: 0.5rem 0.6rem; }
2481
+ .chat-session-line { display: flex; align-items: center; justify-content: space-between; }
2482
+ .chat-session-tag {
2483
+ font-size: 0.66rem; font-weight: 700; letter-spacing: 0.06em; text-transform: uppercase;
2484
+ color: var(--color-accent);
2485
+ }
2486
+ .chat-session-del {
2487
+ border: none; background: transparent; color: var(--color-text-muted);
2488
+ cursor: pointer; padding: 0.2rem 0.35rem; border-radius: var(--radius-sm);
2489
+ }
2490
+ .chat-session-del:hover { color: var(--color-danger); background: var(--color-danger-light); }
2491
+ .chat-session-summary { margin: 0.25rem 0 0; font-size: 0.8rem; color: var(--color-text-secondary); }
2492
+ .chat-session-switch { margin: 0; }
2493
+ .chat-session-switch-btn {
2494
+ display: flex; align-items: center; gap: 0.5rem; width: 100%; text-align: left;
2495
+ border: none; background: transparent; cursor: pointer;
2496
+ padding: 0.5rem 0.6rem; border-radius: var(--radius-sm);
2497
+ font-size: 0.8rem; color: var(--color-text-secondary);
2498
+ }
2499
+ .chat-session-switch-btn:hover { background: var(--color-bg-tertiary); color: var(--color-text-primary); }
2500
+ .chat-session-switch-btn .icon { color: var(--color-text-muted); }
2501
+
2502
+ /* Transcript */
2503
+ .chat-transcript {
2504
+ flex: 1 1 auto;
2505
+ min-height: 0;
2506
+ overflow-y: auto;
2507
+ padding: 1.5rem;
2508
+ background: var(--color-bg-tertiary);
2509
+ }
2510
+
2511
+ /* Empty state — modest + centered, not a giant void */
2512
+ .chat-empty-state {
2513
+ height: 100%;
2514
+ display: flex; flex-direction: column; align-items: center; justify-content: center;
2515
+ text-align: center; gap: 0.4rem;
2516
+ }
2517
+ .chat-empty-emblem {
2518
+ width: 3.25rem; height: 3.25rem; border-radius: var(--radius-full);
2519
+ display: flex; align-items: center; justify-content: center;
2520
+ background: var(--color-primary-light); color: var(--color-primary);
2521
+ font-size: 1.25rem; margin-bottom: 0.5rem;
2522
+ }
2523
+ .chat-empty-title { font-family: var(--font-headline); font-weight: 600; color: var(--color-text-primary); margin: 0; }
2524
+ .chat-empty-hint { font-size: 0.88rem; color: var(--color-text-muted); margin: 0; }
2525
+
2526
+ /* Composer */
2527
+ .chat-composer {
2528
+ flex: none;
2529
+ padding: 0.9rem 1.1rem;
2530
+ border-top: 1px solid var(--color-border);
2531
+ background: var(--color-bg-secondary);
2532
+ }
2533
+ .chat-composer-row { display: flex; align-items: stretch; gap: 0.6rem; }
2534
+ .chat-input-wrap { position: relative; flex: 1 1 auto; }
2535
+ .chat-composer .input {
2536
+ height: 2.75rem;
2537
+ border-radius: var(--radius-full);
2538
+ padding-left: 1.1rem; padding-right: 1.1rem;
2539
+ background: var(--color-bg-primary);
2540
+ border: 1px solid var(--color-border);
2541
+ font-size: 0.92rem;
2542
+ }
2543
+ .chat-composer .input:focus {
2544
+ border-color: var(--color-primary);
2545
+ box-shadow: 0 0 0 3px rgba(var(--color-primary-rgb), 0.15);
2546
+ }
2547
+ .chat-composer #send-button {
2548
+ height: 2.75rem; min-width: 5.5rem;
2549
+ border-radius: var(--radius-full); font-weight: 600;
2550
+ background: var(--color-primary); border-color: var(--color-primary);
2551
+ }
2552
+ .chat-composer #send-button:hover:not(:disabled) { background: var(--color-primary-hover); }
2553
+ .chat-composer #send-button:disabled { opacity: 0.5; }
2554
+ .chat-input-spinner { position: absolute; right: 1rem; top: 50%; transform: translateY(-50%); pointer-events: none; }
2555
+ #chat-status-help-container { text-align: center; }
2556
+
2557
+ /* --- Run Details inspector --- */
2558
+ .chat-inspector {
2559
+ align-self: start;
2560
+ display: flex; flex-direction: column; gap: 1.25rem;
2561
+ padding: 1.15rem 1.15rem 1.35rem;
2562
+ background: var(--color-bg-secondary);
2563
+ border: 1px solid var(--color-border);
2564
+ border-radius: var(--radius-lg);
2565
+ position: sticky; top: 1rem;
2566
+ }
2567
+ .inspector-title {
2568
+ font-family: var(--font-headline); font-weight: 600; font-size: 1rem;
2569
+ color: var(--color-text-primary); margin: 0;
2570
+ padding-bottom: 0.85rem; border-bottom: 1px solid var(--color-border-light);
2571
+ }
2572
+ .inspector-section { display: flex; flex-direction: column; gap: 0.4rem; }
2573
+ .inspector-label {
2574
+ font-size: 0.68rem; font-weight: 700; letter-spacing: 0.07em; text-transform: uppercase;
2575
+ color: var(--color-text-muted);
2576
+ }
2577
+ .inspector-session-id {
2578
+ display: flex; align-items: center; gap: 0.4rem;
2579
+ background: var(--color-bg-tertiary);
2580
+ border: 1px solid var(--color-border);
2581
+ border-radius: var(--radius-sm);
2582
+ padding: 0.4rem 0.55rem;
2583
+ }
2584
+ .inspector-session-mono {
2585
+ font-family: var(--font-mono); font-size: 0.74rem; color: var(--color-text-secondary);
2586
+ overflow: hidden; text-overflow: ellipsis; white-space: nowrap; flex: 1 1 auto;
2587
+ }
2588
+ .inspector-copy {
2589
+ border: none; background: transparent; color: var(--color-text-muted);
2590
+ cursor: pointer; padding: 0.15rem 0.3rem; border-radius: var(--radius-sm); flex: none;
2591
+ }
2592
+ .inspector-copy:hover { color: var(--color-primary); background: var(--color-primary-light); }
2593
+ .inspector-meta-row { display: flex; align-items: center; justify-content: space-between; font-size: 0.8rem; }
2594
+ .inspector-meta-key { color: var(--color-text-muted); }
2595
+ .inspector-meta-val { color: var(--color-text-primary); font-weight: 500; }
2596
+ .inspector-tools { display: flex; flex-wrap: wrap; gap: 0.4rem; }
2597
+ .inspector-empty { font-size: 0.82rem; color: var(--color-text-muted); font-style: italic; margin: 0; }
2598
+
2599
+ /* --- Message bubbles (scoped to transcript; auth pages keep Bulma .message) --- */
2600
+ .chat-transcript .message {
2601
+ display: inline-block; max-width: 80%;
2602
+ background: transparent; box-shadow: none;
2603
+ border-radius: 0 !important; margin-bottom: 1.1rem !important; clear: both;
2604
+ }
2605
+ .chat-transcript .message.user-message { float: right !important; max-width: 76% !important; }
2606
+ .chat-transcript .message.agent-message { float: left !important; max-width: 88% !important; }
2607
+ .chat-transcript .message .message-header {
2608
+ background: transparent !important; color: var(--color-text-muted) !important;
2609
+ box-shadow: none !important; border: none !important; border-radius: 0 !important;
2610
+ padding: 0 0.3rem 0.25rem !important; min-height: 0 !important;
2611
+ font-size: 0.7rem !important; font-weight: 600 !important;
2612
+ }
2613
+ .chat-transcript .message.user-message .message-header { justify-content: flex-end; }
2614
+ .chat-transcript .message .message-header p { color: inherit !important; }
2615
+ .chat-transcript .message .message-body {
2616
+ background: var(--color-bg-secondary) !important; color: var(--color-text-primary) !important;
2617
+ border: 1px solid var(--color-border) !important; border-radius: var(--radius-lg) !important;
2618
+ padding: 0.7rem 1rem !important; font-size: 0.9rem; line-height: 1.5;
2619
+ }
2620
+ .chat-transcript .user-message .message-body {
2621
+ background: var(--color-primary-light) !important; border-color: transparent !important;
2622
+ border-bottom-right-radius: var(--radius-sm) !important;
2623
+ }
2624
+ .chat-transcript .agent-message .message-body { border-bottom-left-radius: var(--radius-sm) !important; }
2625
+ .chat-transcript .agent-message.is-danger .message-body {
2626
+ background: var(--color-danger-light) !important; border-color: var(--color-danger) !important;
2627
+ }
2628
+ /* Kill Bulma's colored message-header bars in chat (repeated class beats the
2629
+ .is-success/.is-light/dark variants on specificity). Bodies keep their tint. */
2630
+ .chat-transcript .message.agent-message .message-header.message-header,
2631
+ .chat-transcript .message.user-message .message-header.message-header {
2632
+ background: transparent !important;
2633
+ color: var(--color-text-muted) !important;
2634
+ box-shadow: none !important;
2635
+ }
2636
+
2637
+ /* Stack the inspector below the chat on narrow screens */
2638
+ @media screen and (max-width: 1023px) {
2639
+ .chat-shell { grid-template-columns: 1fr; height: auto; }
2640
+ .chat-main { height: 70vh; min-height: 480px; }
2641
+ .chat-inspector { position: static; }
2642
+ }
2643
+ .chat-status-label { color: var(--color-text-muted); font-weight: 600; font-size: 0.8rem; }
2644
+ /* OOB swap injects .tag.is-success / .is-danger — render them as pills */
2645
+ .chat-header-status .tag.is-success {
2646
+ background: var(--color-success-light);
2647
+ color: var(--color-success);
2648
+ border-radius: var(--radius-full);
2649
+ font-weight: 600;
2650
+ }
2651
+ .chat-header-status .tag.is-danger {
2652
+ background: var(--color-bg-tertiary);
2653
+ color: var(--color-text-muted);
2654
+ border-radius: var(--radius-full);
2655
+ font-weight: 600;
2656
+ }
2657
+
2658
+ /* --- Dark Mode Chat Message Variants --- */
2659
+ [data-theme="dark"] .message.user-message.is-link .message-header {
2660
+ background-color: #4f6dba;
2661
+ color: #ffffff;
2662
+ }
2663
+
2664
+ [data-theme="dark"] .message.user-message.is-link .message-body {
2665
+ border-color: #4f6dba;
2666
+ background-color: #1e2a4a;
2667
+ color: #e7e9ea;
2668
+ }
2669
+
2670
+ /* Dark mode: Agent message - Light */
2671
+ [data-theme="dark"] .message.agent-message.is-light {
2672
+ background-color: #2a3038;
2673
+ border-color: #3d4450;
2674
+ }
2675
+
2676
+ [data-theme="dark"] .message.agent-message.is-light .message-header {
2677
+ background-color: #3d4450;
2678
+ color: #e7e9ea;
2679
+ }
2680
+
2681
+ [data-theme="dark"] .message.agent-message.is-light .message-body {
2682
+ border-color: #3d4450;
2683
+ background-color: #2a3038;
2684
+ color: #e7e9ea;
2685
+ }
2686
+
2687
+ /* Dark mode: Agent message - Success */
2688
+ [data-theme="dark"] .message.agent-message.is-success {
2689
+ background-color: #1a332a;
2690
+ border-color: #2d5a45;
2691
+ }
2692
+
2693
+ [data-theme="dark"] .message.agent-message.is-success .message-header {
2694
+ background-color: #2d5a45;
2695
+ color: #a6e3a1;
2696
+ }
2697
+
2698
+ [data-theme="dark"] .message.agent-message.is-success .message-body {
2699
+ border-color: #2d5a45;
2700
+ background-color: #1a332a;
2701
+ color: #e7e9ea;
2702
+ }
2703
+
2704
+ /* Dark mode: Agent message - Danger */
2705
+ [data-theme="dark"] .message.agent-message.is-danger {
2706
+ background-color: #3a1a1a;
2707
+ border-color: #5a2d2d;
2708
+ }
2709
+
2710
+ [data-theme="dark"] .message.agent-message.is-danger .message-header {
2711
+ background-color: #5a2d2d;
2712
+ color: #f38ba8;
2713
+ }
2714
+
2715
+ [data-theme="dark"] .message.agent-message.is-danger .message-body {
2716
+ border-color: #5a2d2d;
2717
+ background-color: #3a1a1a;
2718
+ color: #e7e9ea;
2719
+ }
2720
+
2721
+ /* Dark mode: Agent message - Warning */
2722
+ [data-theme="dark"] .message.agent-message.is-warning {
2723
+ background-color: #33291a;
2724
+ border-color: #5a4a2d;
2725
+ }
2726
+
2727
+ [data-theme="dark"] .message.agent-message.is-warning .message-header {
2728
+ background-color: #5a4a2d;
2729
+ color: #f9e2af;
2730
+ }
2731
+
2732
+ [data-theme="dark"] .message.agent-message.is-warning .message-body {
2733
+ border-color: #5a4a2d;
2734
+ background-color: #33291a;
2735
+ color: #e7e9ea;
2736
+ }
2737
+
2738
+ /* Dark mode: Execution plan details */
2739
+ [data-theme="dark"] .message-body .execution-plan-details {
2740
+ border-top-color: #3d4450;
2741
+ }
2742
+
2743
+ [data-theme="dark"] .message-body .execution-plan-summary {
2744
+ color: #e7e9ea;
2745
+ }
2746
+
2747
+ [data-theme="dark"] .message-body .execution-plan-steps {
2748
+ border-left-color: #4f5b66;
2749
+ }
2750
+
2751
+ [data-theme="dark"] .message-body .step-params-label,
2752
+ [data-theme="dark"] .message-body .step-result-label {
2753
+ color: #9ca3af;
2754
+ }
2755
+
2756
+ [data-theme="dark"] .message-body .step-params-pre,
2757
+ [data-theme="dark"] .message-body .step-result-pre {
2758
+ background-color: #1e2128;
2759
+ color: #e7e9ea;
2760
+ }
2761
+
2762
+ [data-theme="dark"] .message-body .raw-json-container {
2763
+ border-top-color: #4f5b66;
2764
+ }
2765
+
2766
+ [data-theme="dark"] .message-body .raw-json-pre {
2767
+ color: #9ca3af;
2768
+ }
2769
+
2770
+ /* --- Dark Mode Tags & Badges --- */
2771
+ /* Make tags less jarring in dark mode */
2772
+ [data-theme="dark"] .tag:not(.is-success):not(.is-danger):not(.is-warning):not(.is-info):not(.is-primary):not(.is-link) {
2773
+ background-color: var(--color-bg-tertiary);
2774
+ color: var(--color-text-primary);
2775
+ border: 1px solid var(--color-border);
2776
+ }
2777
+
2778
+ [data-theme="dark"] .tag.is-light {
2779
+ background-color: var(--color-bg-tertiary) !important;
2780
+ color: var(--color-text-primary) !important;
2781
+ }
2782
+
2783
+ /* Dark mode success tag */
2784
+ [data-theme="dark"] .tag.is-success {
2785
+ background-color: #2d5a45;
2786
+ color: #a6e3a1;
2787
+ }
2788
+
2789
+ [data-theme="dark"] .tag.is-success.is-light {
2790
+ background-color: #1a332a !important;
2791
+ color: #a6e3a1 !important;
2792
+ }
2793
+
2794
+ /* ========================================
2795
+ STATUS BADGE ANIMATIONS
2796
+ ======================================== */
2797
+
2798
+ /* Pulse animation for running status badges */
2799
+ @keyframes status-pulse {
2800
+ 0%, 100% {
2801
+ box-shadow: 0 0 0 0 rgba(34, 197, 94, 0.4);
2802
+ }
2803
+ 50% {
2804
+ box-shadow: 0 0 0 6px rgba(34, 197, 94, 0);
2805
+ }
2806
+ }
2807
+
2808
+ .tag.is-success.is-running,
2809
+ .tag.is-success.status-running {
2810
+ animation: status-pulse 2s ease-in-out infinite;
2811
+ }
2812
+
2813
+ /* Dark mode pulse */
2814
+ [data-theme="dark"] .tag.is-success.is-running,
2815
+ [data-theme="dark"] .tag.is-success.status-running {
2816
+ animation: status-pulse-dark 2s ease-in-out infinite;
2817
+ }
2818
+
2819
+ @keyframes status-pulse-dark {
2820
+ 0%, 100% {
2821
+ box-shadow: 0 0 0 0 rgba(166, 227, 161, 0.3);
2822
+ }
2823
+ 50% {
2824
+ box-shadow: 0 0 0 6px rgba(166, 227, 161, 0);
2825
+ }
2826
+ }
2827
+
2828
+ /* Respect reduced motion preference */
2829
+ @media (prefers-reduced-motion: reduce) {
2830
+ .tag.is-success.is-running,
2831
+ .tag.is-success.status-running {
2832
+ animation: none;
2833
+ }
2834
+ }
2835
+
2836
+ /* Dark mode danger tag */
2837
+ [data-theme="dark"] .tag.is-danger {
2838
+ background-color: #5a2d2d;
2839
+ color: #f38ba8;
2840
+ }
2841
+
2842
+ [data-theme="dark"] .tag.is-danger.is-light {
2843
+ background-color: #3a1a1a !important;
2844
+ color: #f38ba8 !important;
2845
+ }
2846
+
2847
+ /* Dark mode warning tag */
2848
+ [data-theme="dark"] .tag.is-warning {
2849
+ background-color: #5a4a2d;
2850
+ color: #f9e2af;
2851
+ }
2852
+
2853
+ [data-theme="dark"] .tag.is-warning.is-light {
2854
+ background-color: #33291a !important;
2855
+ color: #f9e2af !important;
2856
+ }
2857
+
2858
+ /* Dark mode info tag */
2859
+ [data-theme="dark"] .tag.is-info {
2860
+ background-color: #1e3a5f;
2861
+ color: #89dceb;
2862
+ }
2863
+
2864
+ /* Dark mode notifications */
2865
+ [data-theme="dark"] .notification {
2866
+ background-color: var(--color-bg-tertiary);
2867
+ color: var(--color-text-primary);
2868
+ }
2869
+
2870
+ [data-theme="dark"] .notification.is-warning {
2871
+ background-color: #33291a;
2872
+ color: #f9e2af;
2873
+ }
2874
+
2875
+ [data-theme="dark"] .notification.is-warning.is-light {
2876
+ background-color: #33291a !important;
2877
+ color: #f9e2af !important;
2878
+ }
2879
+
2880
+ [data-theme="dark"] .notification.is-danger {
2881
+ background-color: #3a1a1a;
2882
+ color: #f38ba8;
2883
+ }
2884
+
2885
+ [data-theme="dark"] .notification.is-danger.is-light {
2886
+ background-color: #3a1a1a !important;
2887
+ color: #f38ba8 !important;
2888
+ }
2889
+
2890
+ [data-theme="dark"] .notification.is-success {
2891
+ background-color: #1a332a;
2892
+ color: #a6e3a1;
2893
+ }
2894
+
2895
+ [data-theme="dark"] .notification.is-info {
2896
+ background-color: #1e3a5f;
2897
+ color: #89dceb;
2898
+ }
2899
+
2900
+ [data-theme="dark"] .notification.is-info.is-light {
2901
+ background-color: #1e3a5f !important;
2902
+ color: #89dceb !important;
2903
+ }
2904
+
2905
+ .chat-input-form { margin-top: 1rem; }
2906
+
2907
+ /* Button hover/focus states */
2908
+ .button {
2909
+ border-radius: var(--radius-md);
2910
+ font-weight: 500;
2911
+ transition: all var(--transition-fast);
2912
+
2913
+ &:hover:not(:disabled) {
2914
+ transform: translateY(-1px);
2915
+ }
2916
+
2917
+ &:active:not(:disabled) {
2918
+ transform: translateY(0);
2919
+ }
2920
+ }
2921
+
2922
+ .button:focus, .button.is-focused {
2923
+ box-shadow: 0 0 0 3px var(--color-primary-light);
2924
+ }
2925
+ .button.is-link, .button.is-primary {
2926
+ background-color: var(--color-primary);
2927
+ border-color: transparent;
2928
+
2929
+ &:hover {
2930
+ background-color: var(--color-primary-dark);
2931
+ }
2932
+ }
2933
+ /* Bulma generates `.button.is-primary[disabled]` (attr-selector, higher
2934
+ specificity) at its turquoise $primary, which beat our override on disabled
2935
+ buttons. Match that specificity so disabled primary buttons stay ruby. */
2936
+ .button.is-link[disabled], .button.is-primary[disabled],
2937
+ fieldset[disabled] .button.is-link, fieldset[disabled] .button.is-primary {
2938
+ background-color: var(--color-primary);
2939
+ border-color: transparent;
2940
+ }
2941
+ /* Light variants — ruby tint instead of Bulma's default blue */
2942
+ .button.is-link.is-light, .button.is-primary.is-light {
2943
+ background-color: var(--color-primary-light);
2944
+ color: var(--color-primary);
2945
+ border-color: transparent;
2946
+ }
2947
+ .button.is-link.is-light:hover, .button.is-primary.is-light:hover {
2948
+ background-color: rgba(var(--color-primary-rgb), 0.2);
2949
+ color: var(--color-primary);
2950
+ }
2951
+ /* Outlined link/primary buttons → ruby (Bulma left is-primary outline turquoise) */
2952
+ .button.is-link.is-outlined,
2953
+ .button.is-primary.is-outlined {
2954
+ color: var(--color-primary);
2955
+ border-color: var(--color-primary);
2956
+ background-color: transparent;
2957
+ }
2958
+ .button.is-link.is-outlined:hover,
2959
+ .button.is-primary.is-outlined:hover {
2960
+ background-color: var(--color-primary);
2961
+ border-color: var(--color-primary);
2962
+ color: #fff;
2963
+ }
2964
+
2965
+ /* Bulma's $primary is turquoise; our brand primary is ruby. Retone the text-color
2966
+ variant so `has-text-primary` icons/labels match the brand (fixes the teal
2967
+ icons across the auth pages). */
2968
+ .has-text-primary { color: var(--color-primary) !important; }
2969
+
2970
+ /* Info-light tags (scheme/credential types, model badges, etc.) → neutral chip
2971
+ instead of Bulma's blue, for brand consistency. */
2972
+ .tag.is-info.is-light {
2973
+ background-color: var(--color-bg-tertiary);
2974
+ color: var(--color-text-secondary);
2975
+ }
2976
+ /* Info notifications (auth empty-state boxes, etc.) → soft neutral card instead
2977
+ of Bulma's saturated blue. Warning/danger/success notifications keep their tint. */
2978
+ .notification.is-info {
2979
+ background-color: var(--color-bg-tertiary);
2980
+ color: var(--color-text-primary);
2981
+ border: 1px solid var(--color-border);
2982
+ }
2983
+ .notification.is-info .title { color: var(--color-text-primary); }
2984
+
2985
+ /* Agent detail → Auth tab status row */
2986
+ .auth-tab-status-row {
2987
+ display: flex; align-items: center; gap: 1.25rem;
2988
+ padding: 0.85rem 1rem;
2989
+ background: var(--color-bg-tertiary);
2990
+ border: 1px solid var(--color-border);
2991
+ border-radius: var(--radius-md);
2992
+ }
2993
+ .auth-tab-status-value { display: inline-flex; align-items: center; gap: 0.5rem; font-weight: 500; color: var(--color-text-primary); }
2994
+ .auth-tab-status-value br { display: none; }
2995
+ .auth-tab-status-value .icon.is-large { width: 1.5rem; height: 1.5rem; }
2996
+ .auth-tab-status-value .fa-2x { font-size: 1.1em; }
2997
+
2998
+ /* Brand text links in content tables + doc lists (were Bulma blue) */
2999
+ td a:not(.button):not(.tag),
3000
+ a.doc-title,
3001
+ .content a:not(.button) {
3002
+ color: var(--color-primary);
3003
+ }
3004
+ td a:not(.button):not(.tag):hover,
3005
+ a.doc-title:hover,
3006
+ .content a:not(.button):hover {
3007
+ color: var(--color-primary-dark);
3008
+ text-decoration: underline;
3009
+ }
3010
+ .button.is-success:hover { background-color: hsl(152, 68%, 35%); }
3011
+ .button.is-danger:hover { background-color: hsl(0, 72%, 45%); }
3012
+
3013
+ /* AI Generate Button - Prominent styling */
3014
+ .button.ai-generate-btn {
3015
+ background: linear-gradient(135deg, #c8102e 0%, #9d0c24 45%, #c7a14a 100%);
3016
+ background-size: 200% 200%;
3017
+ color: white;
3018
+ border: none;
3019
+ font-weight: 600;
3020
+ box-shadow: 0 4px 15px rgba(200, 16, 46, 0.35);
3021
+ transition: all 0.3s ease;
3022
+ animation: gradient-shift 3s ease infinite;
3023
+
3024
+ .icon {
3025
+ color: white;
3026
+ }
3027
+
3028
+ &:hover {
3029
+ transform: translateY(-2px);
3030
+ box-shadow: 0 6px 20px rgba(200, 16, 46, 0.45);
3031
+ color: white;
3032
+ }
3033
+
3034
+ &:active {
3035
+ transform: translateY(0);
3036
+ }
3037
+ }
3038
+
3039
+ @keyframes gradient-shift {
3040
+ 0% { background-position: 0% 50%; }
3041
+ 50% { background-position: 100% 50%; }
3042
+ 100% { background-position: 0% 50%; }
3043
+ }
3044
+
3045
+ [data-theme="dark"] .button.ai-generate-btn {
3046
+ box-shadow: 0 4px 15px rgba(200, 16, 46, 0.28);
3047
+
3048
+ &:hover {
3049
+ box-shadow: 0 6px 20px rgba(200, 16, 46, 0.38);
3050
+ }
3051
+ }
3052
+
3053
+ .button.is-light {
3054
+ background-color: var(--color-bg-tertiary);
3055
+ color: var(--color-text-primary);
3056
+ border-color: var(--color-border);
3057
+
3058
+ &:hover {
3059
+ background-color: var(--color-border);
3060
+ }
3061
+ }
3062
+
3063
+ /* --- Form Inputs --- */
3064
+ .input, .textarea, .select select {
3065
+ background-color: var(--color-bg-secondary);
3066
+ border-color: var(--color-border);
3067
+ border-radius: var(--radius-md);
3068
+ color: var(--color-text-primary);
3069
+ transition: border-color var(--transition-fast), box-shadow var(--transition-fast);
3070
+
3071
+ &::placeholder {
3072
+ color: var(--color-text-muted);
3073
+ }
3074
+
3075
+ &:focus {
3076
+ border-color: var(--color-primary);
3077
+ box-shadow: 0 0 0 3px var(--color-primary-light);
3078
+ }
3079
+ }
3080
+
3081
+ .label {
3082
+ font-weight: 600;
3083
+ font-size: 0.875rem;
3084
+ color: var(--color-text-primary);
3085
+ }
3086
+
3087
+ .help {
3088
+ color: var(--color-text-muted);
3089
+ }
3090
+
3091
+ /* --- Footer --- */
3092
+ .footer {
3093
+ background-color: var(--color-bg-primary);
3094
+ border-top: 1px solid var(--color-border);
3095
+ padding: 2rem 1.5rem 2.5rem;
3096
+ transition: background-color var(--transition-normal), border-color var(--transition-normal);
3097
+
3098
+ .content {
3099
+ color: var(--color-text-muted);
3100
+ }
3101
+
3102
+ strong {
3103
+ color: var(--color-primary);
3104
+ font-weight: 600;
3105
+ }
3106
+
3107
+ .footer-links {
3108
+ margin-top: 0.5rem;
3109
+
3110
+ a {
3111
+ color: var(--color-text-muted);
3112
+ margin: 0 0.75rem;
3113
+ transition: color var(--transition-fast);
3114
+
3115
+ &:hover {
3116
+ color: var(--color-primary);
3117
+ }
3118
+ }
3119
+ }
3120
+ }
3121
+
3122
+ /* --- HTMX Indicator --- */
3123
+ .htmx-indicator{
3124
+ display:none;
3125
+ }
3126
+ .htmx-request .htmx-indicator{
3127
+ display:inline;
3128
+ }
3129
+ .htmx-request.htmx-indicator{
3130
+ display:inline;
3131
+ }
3132
+
3133
+ /* --- Documentation Markdown Styling --- */
3134
+ .box .content {
3135
+ /* Typography improvements */
3136
+ line-height: 1.6;
3137
+ color: var(--color-text-primary);
3138
+
3139
+ /* Heading styling */
3140
+ h1, h2, h3, h4, h5, h6 {
3141
+ margin-top: 1.5em;
3142
+ margin-bottom: 0.75em;
3143
+ color: #333;
3144
+ font-weight: 600;
3145
+ line-height: 1.25;
3146
+ }
3147
+
3148
+ h1 {
3149
+ font-size: 2em;
3150
+ padding-bottom: 0.3em;
3151
+ border-bottom: 1px solid #eaecef;
3152
+ }
3153
+
3154
+ h2 {
3155
+ font-size: 1.5em;
3156
+ padding-bottom: 0.3em;
3157
+ border-bottom: 1px solid #eaecef;
3158
+ }
3159
+
3160
+ h3 {
3161
+ font-size: 1.25em;
3162
+ }
3163
+
3164
+ h4 {
3165
+ font-size: 1em;
3166
+ }
3167
+
3168
+ /* List styling */
3169
+ ul, ol {
3170
+ padding-left: 1.5em;
3171
+ margin-bottom: 1.5em;
3172
+
3173
+ li {
3174
+ margin-bottom: 0.5em;
3175
+ }
3176
+
3177
+ ul, ol {
3178
+ margin-top: 0.5em;
3179
+ margin-bottom: 0.5em;
3180
+ }
3181
+ }
3182
+
3183
+ /* Paragraph spacing */
3184
+ p {
3185
+ margin-bottom: 1.25em;
3186
+
3187
+ &:last-child {
3188
+ margin-bottom: 0;
3189
+ }
3190
+ }
3191
+
3192
+ /* Code blocks with enhanced styling */
3193
+ pre {
3194
+ background-color: #f8f9fa;
3195
+ border-radius: 8px;
3196
+ padding: 1.25em;
3197
+ margin: 1.5em 0;
3198
+ border: 1px solid #e1e4e8;
3199
+ box-shadow: 0 2px 4px rgba(0,0,0,0.05);
3200
+ position: relative;
3201
+ overflow-x: auto;
3202
+
3203
+ /* When using highlight.js */
3204
+ &.hljs {
3205
+ padding: 0;
3206
+ background: transparent;
3207
+ }
3208
+
3209
+ code {
3210
+ padding: 0;
3211
+ margin: 0;
3212
+ background-color: transparent;
3213
+ border-radius: 0;
3214
+ font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace;
3215
+ font-size: 0.9em;
3216
+ line-height: 1.5;
3217
+ color: #24292e;
3218
+ tab-size: 2;
3219
+ }
3220
+
3221
+ /* Language label */
3222
+ &[data-lang]::before {
3223
+ content: attr(data-lang);
3224
+ position: absolute;
3225
+ top: 0;
3226
+ right: 0;
3227
+ font-size: 0.7em;
3228
+ font-weight: 600;
3229
+ color: var(--color-text-muted);
3230
+ background-color: var(--color-bg-elevated);
3231
+ border: 1px solid var(--color-border);
3232
+ padding: 0.2em 0.6em;
3233
+ border-radius: 0 var(--radius-md) 0 var(--radius-sm);
3234
+ text-transform: uppercase;
3235
+ }
3236
+ }
3237
+
3238
+ /* Inline code with improved contrast (token-based → adapts to light + dark) */
3239
+ :not(pre) > code {
3240
+ padding: 0.2em 0.45em;
3241
+ margin: 0 0.1em;
3242
+ font-size: 0.85em;
3243
+ font-family: var(--font-mono);
3244
+ background-color: var(--color-primary-light);
3245
+ border-radius: var(--radius-sm);
3246
+ color: var(--color-primary);
3247
+ font-weight: 500;
3248
+ }
3249
+
3250
+ /* Blockquotes */
3251
+ blockquote {
3252
+ margin-left: 0;
3253
+ padding: 0.25em 1em;
3254
+ color: var(--color-text-secondary);
3255
+ background-color: var(--color-bg-tertiary);
3256
+ border-left: 0.25em solid var(--color-accent);
3257
+ border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
3258
+
3259
+ p {
3260
+ margin-bottom: 0;
3261
+ }
3262
+
3263
+ p + p {
3264
+ margin-top: 1em;
3265
+ }
3266
+ }
3267
+
3268
+ /* Tables */
3269
+ table {
3270
+ width: 100%;
3271
+ border-collapse: collapse;
3272
+ margin-bottom: 1.5em;
3273
+ overflow: auto;
3274
+ display: block;
3275
+
3276
+ th, td {
3277
+ padding: 0.5em 1em;
3278
+ border: 1px solid #dfe2e5;
3279
+ }
3280
+
3281
+ th {
3282
+ font-weight: 600;
3283
+ background-color: #f6f8fa;
3284
+ }
3285
+
3286
+ tr:nth-child(even) {
3287
+ background-color: #f8f9fa;
3288
+ }
3289
+
3290
+ tr:hover {
3291
+ background-color: #f1f4f8;
3292
+ }
3293
+ }
3294
+
3295
+ /* Horizontal rule */
3296
+ hr {
3297
+ height: 0.25em;
3298
+ padding: 0;
3299
+ margin: 24px 0;
3300
+ background-color: #e1e4e8;
3301
+ border: 0;
3302
+ }
3303
+
3304
+ /* Links */
3305
+ a {
3306
+ color: #0366d6;
3307
+ text-decoration: none;
3308
+
3309
+ &:hover {
3310
+ text-decoration: underline;
3311
+ }
3312
+ }
3313
+
3314
+ /* Images */
3315
+ img {
3316
+ max-width: 100%;
3317
+ box-sizing: border-box;
3318
+ border-radius: 3px;
3319
+ }
3320
+
3321
+ /* Badges/Labels */
3322
+ .badge, [class^="badge-"] {
3323
+ display: inline-block;
3324
+ padding: 0.25em 0.4em;
3325
+ font-size: 0.75em;
3326
+ font-weight: 600;
3327
+ line-height: 1;
3328
+ text-align: center;
3329
+ white-space: nowrap;
3330
+ vertical-align: baseline;
3331
+ border-radius: 0.25rem;
3332
+ margin: 0 0.25em;
3333
+ }
3334
+ }
3335
+
3336
+ /* Specific styling for webhook documentation */
3337
+ .box .content {
3338
+ pre {
3339
+ position: relative;
3340
+
3341
+ &.language-ruby, &[data-lang="ruby"] {
3342
+ &::before {
3343
+ content: "ruby";
3344
+ }
3345
+ code {
3346
+ color: #905;
3347
+ }
3348
+ }
3349
+ }
3350
+
3351
+ .parameter-name {
3352
+ font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, monospace;
3353
+ font-weight: 600;
3354
+ color: #0366d6;
3355
+ }
3356
+ }
3357
+
3358
+ /* --- Documentation Index Table --- */
3359
+ .documentation-index-table {
3360
+ thead th {
3361
+ background-color: #f8f9fa;
3362
+ border-bottom: 2px solid #e9ecef;
3363
+ color: #495057;
3364
+ font-weight: 600;
3365
+ padding: 1rem 0.75rem;
3366
+ }
3367
+
3368
+ td {
3369
+ padding: 0.9rem 0.75rem;
3370
+ vertical-align: middle;
3371
+ }
3372
+
3373
+ tr:hover {
3374
+ background-color: #f0f4f8 !important;
3375
+ transition: background-color 0.2s ease;
3376
+ }
3377
+
3378
+ &.is-striped tr:nth-child(even) {
3379
+ background-color: #f9fafb;
3380
+ }
3381
+
3382
+ &.is-striped tr:nth-child(odd) {
3383
+ background-color: #ffffff;
3384
+ }
3385
+
3386
+ .doc-title {
3387
+ font-weight: 500;
3388
+ color: #3273dc;
3389
+
3390
+ &:hover {
3391
+ text-decoration: underline;
3392
+ }
3393
+ }
3394
+
3395
+ .doc-summary {
3396
+ color: #6c757d;
3397
+ max-width: 50em;
3398
+ white-space: normal;
3399
+ line-height: 1.5;
3400
+ }
3401
+
3402
+ .action-column {
3403
+ width: 100px;
3404
+ }
3405
+ }
3406
+
3407
+ /* --- Agent List Enhancements --- */
3408
+ tr.is-newly-added {
3409
+ animation: highlight-new-row 2s ease-out;
3410
+ }
3411
+
3412
+ @keyframes highlight-new-row {
3413
+ 0% {
3414
+ background-color: hsl(171, 100%, 41%); /* Bulma's $primary color */
3415
+ color: hsl(0, 0%, 96%); /* Bulma's $primary-invert color */
3416
+ }
3417
+ 20% {
3418
+ background-color: hsl(171, 100%, 41%);
3419
+ color: hsl(0, 0%, 96%);
3420
+ }
3421
+ 100% {
3422
+ background-color: transparent; /* Or initial row color if striped */
3423
+ color: inherit;
3424
+ }
3425
+ }
3426
+
3427
+ /* --- Empty State Styling --- */
3428
+ .empty-state {
3429
+ padding: 2rem 1rem;
3430
+ text-align: center;
3431
+
3432
+ .icon.is-large {
3433
+ font-size: 3rem;
3434
+ color: var(--color-text-muted);
3435
+ opacity: 0.4;
3436
+ }
3437
+
3438
+ .title {
3439
+ color: var(--color-text-secondary);
3440
+ }
3441
+
3442
+ .subtitle {
3443
+ color: var(--color-text-muted);
3444
+ }
3445
+ }
3446
+
3447
+ [data-theme="dark"] .empty-state {
3448
+ .icon.is-large {
3449
+ color: var(--color-text-muted);
3450
+ }
3451
+
3452
+ .title {
3453
+ color: var(--color-text-secondary) !important;
3454
+ }
3455
+
3456
+ .subtitle {
3457
+ color: var(--color-text-muted) !important;
3458
+ }
3459
+ }
3460
+
3461
+ /* ========================================
3462
+ SKELETON LOADING COMPONENTS
3463
+ ======================================== */
3464
+
3465
+ /* Base skeleton styles */
3466
+ .skeleton {
3467
+ background: linear-gradient(
3468
+ 90deg,
3469
+ var(--color-bg-tertiary) 0%,
3470
+ var(--color-bg-secondary) 40%,
3471
+ var(--color-bg-secondary) 60%,
3472
+ var(--color-bg-tertiary) 100%
3473
+ );
3474
+ background-size: 300% 100%;
3475
+ animation: skeleton-shimmer 1.8s ease-in-out infinite;
3476
+ border-radius: var(--radius-sm);
3477
+ }
3478
+
3479
+ @keyframes skeleton-shimmer {
3480
+ 0% { background-position: 100% 0; }
3481
+ 100% { background-position: -100% 0; }
3482
+ }
3483
+
3484
+ /* Skeleton text variants */
3485
+ .skeleton-text {
3486
+ height: 1rem;
3487
+ margin-bottom: 0.625rem;
3488
+ width: 100%;
3489
+
3490
+ &:last-child {
3491
+ margin-bottom: 0;
3492
+ }
3493
+
3494
+ &.skeleton-short {
3495
+ width: 50%;
3496
+ }
3497
+
3498
+ &.skeleton-medium {
3499
+ width: 75%;
3500
+ }
3501
+ }
3502
+
3503
+ .skeleton-title {
3504
+ height: 1.5rem;
3505
+ width: 40%;
3506
+ margin-bottom: 1rem;
3507
+ }
3508
+
3509
+ /* Skeleton badge */
3510
+ .skeleton-badge {
3511
+ height: 1.75rem;
3512
+ width: 85px;
3513
+ border-radius: var(--radius-full);
3514
+ }
3515
+
3516
+ /* Skeleton avatar */
3517
+ .skeleton-avatar {
3518
+ width: 40px;
3519
+ height: 40px;
3520
+ border-radius: 50%;
3521
+ flex-shrink: 0;
3522
+
3523
+ &.skeleton-avatar-small {
3524
+ width: 32px;
3525
+ height: 32px;
3526
+ }
3527
+ }
3528
+
3529
+ /* Skeleton icon (for status indicators) */
3530
+ .skeleton-icon {
3531
+ width: 48px;
3532
+ height: 48px;
3533
+ border-radius: 50%;
3534
+ }
3535
+
3536
+ /* Skeleton card */
3537
+ .skeleton-card {
3538
+ padding: 1.5rem;
3539
+ background: var(--color-bg-secondary);
3540
+ border: 1px solid var(--color-border);
3541
+ border-radius: var(--radius-md);
3542
+ }
3543
+
3544
+ /* Skeleton table row */
3545
+ .skeleton-row td {
3546
+ padding: 1rem;
3547
+ }
3548
+
3549
+ /* Skeleton chat interface */
3550
+ .skeleton-chat-container {
3551
+ padding: 1rem;
3552
+ background: var(--color-bg-tertiary);
3553
+ border-radius: var(--radius-md);
3554
+ min-height: 300px;
3555
+ }
3556
+
3557
+ .skeleton-message {
3558
+ display: flex;
3559
+ align-items: flex-start;
3560
+ gap: 0.75rem;
3561
+ margin-bottom: 1.25rem;
3562
+
3563
+ &.skeleton-message-left {
3564
+ justify-content: flex-start;
3565
+ }
3566
+
3567
+ &.skeleton-message-right {
3568
+ justify-content: flex-end;
3569
+
3570
+ .skeleton-message-content {
3571
+ max-width: 60%;
3572
+ }
3573
+ }
3574
+ }
3575
+
3576
+ .skeleton-message-content {
3577
+ max-width: 70%;
3578
+ padding: 1rem;
3579
+ background: var(--color-bg-secondary);
3580
+ border-radius: var(--radius-md);
3581
+
3582
+ .skeleton-text {
3583
+ margin-bottom: 0.5rem;
3584
+
3585
+ &:last-child {
3586
+ margin-bottom: 0;
3587
+ }
3588
+ }
3589
+ }
3590
+
3591
+ .skeleton-chat-input {
3592
+ display: flex;
3593
+ gap: 0.75rem;
3594
+ margin-top: 1.5rem;
3595
+ padding-top: 1rem;
3596
+ border-top: 1px solid var(--color-border);
3597
+ }
3598
+
3599
+ .skeleton-input {
3600
+ flex: 1;
3601
+ height: 2.5rem;
3602
+ border-radius: var(--radius-md);
3603
+ }
3604
+
3605
+ .skeleton-button {
3606
+ width: 100px;
3607
+ height: 2.5rem;
3608
+ border-radius: var(--radius-md);
3609
+ }
3610
+
3611
+ /* Dark mode skeleton adjustments */
3612
+ [data-theme="dark"] .skeleton {
3613
+ background: linear-gradient(
3614
+ 90deg,
3615
+ var(--color-bg-tertiary) 0%,
3616
+ var(--color-bg-elevated) 40%,
3617
+ var(--color-bg-elevated) 60%,
3618
+ var(--color-bg-tertiary) 100%
3619
+ );
3620
+ background-size: 300% 100%;
3621
+ }
3622
+
3623
+ [data-theme="dark"] .skeleton-card {
3624
+ background: var(--color-bg-secondary);
3625
+ border-color: var(--color-border);
3626
+ }
3627
+
3628
+ [data-theme="dark"] .skeleton-chat-container {
3629
+ background: var(--color-bg-tertiary);
3630
+ }
3631
+
3632
+ [data-theme="dark"] .skeleton-message-content {
3633
+ background: var(--color-bg-secondary);
3634
+ }
3635
+
3636
+ /* Respect reduced motion preference */
3637
+ @media (prefers-reduced-motion: reduce) {
3638
+ .skeleton {
3639
+ animation: none;
3640
+ background: var(--color-bg-tertiary);
3641
+ }
3642
+ }
3643
+
3644
+ /* ========================================
3645
+ FORM SECTION GROUPING
3646
+ ======================================== */
3647
+
3648
+ .form-section {
3649
+ background: var(--color-bg-secondary);
3650
+ border: 1px solid var(--color-border);
3651
+ border-radius: var(--radius-md);
3652
+ margin-bottom: 1.5rem;
3653
+ overflow: hidden;
3654
+
3655
+ &:last-child {
3656
+ margin-bottom: 0;
3657
+ }
3658
+ }
3659
+
3660
+ .form-section-header {
3661
+ display: flex;
3662
+ align-items: center;
3663
+ gap: 0.5rem;
3664
+ padding: 0.875rem 1.25rem;
3665
+ background: var(--color-bg-tertiary);
3666
+ border-bottom: 1px solid var(--color-border);
3667
+ font-weight: 600;
3668
+ font-size: 0.95rem;
3669
+ color: var(--color-text-primary);
3670
+
3671
+ .icon {
3672
+ color: var(--color-primary);
3673
+ font-size: 0.9rem;
3674
+ }
3675
+ }
3676
+
3677
+ .form-section-content {
3678
+ padding: 1.25rem;
3679
+
3680
+ // Remove margin from last field
3681
+ > .field:last-child,
3682
+ > .columns:last-child {
3683
+ margin-bottom: 0;
3684
+ }
3685
+
3686
+ .columns {
3687
+ margin-bottom: 0;
3688
+
3689
+ &:not(:last-child) {
3690
+ margin-bottom: 0.75rem;
3691
+ }
3692
+ }
3693
+
3694
+ .column > .field {
3695
+ margin-bottom: 0;
3696
+ }
3697
+ }
3698
+
3699
+ /* Collapsible sections */
3700
+ .form-section.is-collapsible {
3701
+ .form-section-header {
3702
+ cursor: pointer;
3703
+ user-select: none;
3704
+ transition: background-color var(--transition-fast);
3705
+
3706
+ &:hover {
3707
+ background: var(--color-border-light);
3708
+ }
3709
+
3710
+ .collapse-icon {
3711
+ margin-left: auto;
3712
+ transition: transform var(--transition-fast);
3713
+
3714
+ i {
3715
+ font-size: 0.75rem;
3716
+ color: var(--color-text-muted);
3717
+ }
3718
+ }
3719
+ }
3720
+
3721
+ &.is-collapsed {
3722
+ .form-section-header .collapse-icon {
3723
+ transform: rotate(-90deg);
3724
+ }
3725
+
3726
+ .form-section-content {
3727
+ display: none;
3728
+ }
3729
+ }
3730
+ }
3731
+
3732
+ /* Dark mode form sections */
3733
+ [data-theme="dark"] .form-section {
3734
+ background: var(--color-bg-secondary);
3735
+ border-color: var(--color-border);
3736
+ }
3737
+
3738
+ [data-theme="dark"] .form-section-header {
3739
+ background: var(--color-bg-tertiary);
3740
+ border-color: var(--color-border);
3741
+ color: var(--color-text-primary);
3742
+ }
3743
+
3744
+ [data-theme="dark"] .form-section.is-collapsible .form-section-header:hover {
3745
+ background: var(--color-bg-elevated);
3746
+ }
3747
+
3748
+ /* Form section within details (create agent) */
3749
+ .create-agent-details .form-section {
3750
+ border: 1px solid var(--color-border-light);
3751
+
3752
+ &:first-child {
3753
+ margin-top: 0.5rem;
3754
+ }
3755
+ }
3756
+
3757
+ .create-agent-details .form-section-header {
3758
+ background: var(--color-bg-primary);
3759
+ }
3760
+
3761
+ [data-theme="dark"] .create-agent-details .form-section-header {
3762
+ background: var(--color-bg-tertiary);
3763
+ }
3764
+
3765
+ /* ===== Tools Card Grid ===== */
3766
+
3767
+ .tools-card-grid {
3768
+ display: grid;
3769
+ grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
3770
+ gap: 1.25rem;
3771
+ }
3772
+
3773
+ .tool-card {
3774
+ background: var(--color-bg-primary);
3775
+ border: 1px solid var(--color-border);
3776
+ border-radius: var(--radius-md);
3777
+ padding: 1.25rem;
3778
+ display: flex;
3779
+ flex-direction: column;
3780
+ transition: transform var(--transition-fast), box-shadow var(--transition-fast), border-color var(--transition-fast);
3781
+ }
3782
+
3783
+ .tool-card:hover {
3784
+ transform: translateY(-2px);
3785
+ box-shadow: var(--shadow-md);
3786
+ border-color: var(--color-primary);
3787
+ }
3788
+
3789
+ .tool-card-header {
3790
+ display: flex;
3791
+ justify-content: space-between;
3792
+ align-items: flex-start;
3793
+ margin-bottom: 0.75rem;
3794
+ }
3795
+
3796
+ .tool-card-icon {
3797
+ width: 42px;
3798
+ height: 42px;
3799
+ background: linear-gradient(135deg, var(--color-primary) 0%, var(--color-primary-hover) 100%);
3800
+ border-radius: var(--radius-sm);
3801
+ display: flex;
3802
+ align-items: center;
3803
+ justify-content: center;
3804
+ }
3805
+
3806
+ .tool-card-icon .icon {
3807
+ color: white;
3808
+ }
3809
+
3810
+ .tool-card-meta {
3811
+ display: flex;
3812
+ align-items: center;
3813
+ gap: 0.5rem;
3814
+ }
3815
+
3816
+ .tool-card-body {
3817
+ flex: 1;
3818
+ margin-bottom: 1rem;
3819
+ }
3820
+
3821
+ .tool-card-title {
3822
+ font-size: 1.1rem;
3823
+ font-weight: 600;
3824
+ color: var(--color-text-primary);
3825
+ margin-bottom: 0.5rem;
3826
+ line-height: 1.3;
3827
+ }
3828
+
3829
+ .tool-card-title a {
3830
+ color: inherit;
3831
+ text-decoration: none;
3832
+ transition: color var(--transition-fast);
3833
+ }
3834
+
3835
+ .tool-card-title a:hover {
3836
+ color: var(--color-primary);
3837
+ }
3838
+
3839
+ .tool-card-description {
3840
+ font-size: 0.9rem;
3841
+ color: var(--color-text-secondary);
3842
+ line-height: 1.5;
3843
+ display: -webkit-box;
3844
+ -webkit-line-clamp: 3;
3845
+ -webkit-box-orient: vertical;
3846
+ overflow: hidden;
3847
+ }
3848
+
3849
+ .tool-card-footer {
3850
+ border-top: 1px solid var(--color-border-light);
3851
+ padding-top: 0.75rem;
3852
+ margin-top: auto;
3853
+ }
3854
+
3855
+ .tool-card-params {
3856
+ display: flex;
3857
+ align-items: center;
3858
+ gap: 0.5rem;
3859
+ font-size: 0.85rem;
3860
+ color: var(--color-text-secondary);
3861
+ cursor: pointer;
3862
+ position: relative;
3863
+ }
3864
+
3865
+ .tool-param-count {
3866
+ font-weight: 500;
3867
+ }
3868
+
3869
+ .tool-param-details {
3870
+ display: none;
3871
+ position: absolute;
3872
+ bottom: 100%;
3873
+ left: 0;
3874
+ right: 0;
3875
+ background: var(--color-bg-elevated);
3876
+ border: 1px solid var(--color-border);
3877
+ border-radius: var(--radius-sm);
3878
+ padding: 0.75rem;
3879
+ margin-bottom: 0.5rem;
3880
+ box-shadow: var(--shadow-lg);
3881
+ z-index: 10;
3882
+ max-height: 200px;
3883
+ overflow-y: auto;
3884
+ }
3885
+
3886
+ .tool-card-params:hover .tool-param-details {
3887
+ display: block;
3888
+ }
3889
+
3890
+ .tool-param {
3891
+ display: flex;
3892
+ align-items: center;
3893
+ gap: 0.5rem;
3894
+ padding: 0.25rem 0;
3895
+ font-size: 0.8rem;
3896
+ }
3897
+
3898
+ .tool-param:not(:last-child) {
3899
+ border-bottom: 1px solid var(--color-border-light);
3900
+ padding-bottom: 0.5rem;
3901
+ margin-bottom: 0.25rem;
3902
+ }
3903
+
3904
+ .tool-param code {
3905
+ background: var(--color-bg-code);
3906
+ padding: 0.15rem 0.4rem;
3907
+ border-radius: var(--radius-xs);
3908
+ font-family: var(--font-mono);
3909
+ font-size: 0.75rem;
3910
+ color: var(--color-primary);
3911
+ }
3912
+
3913
+ .tool-param-type {
3914
+ color: var(--color-text-muted);
3915
+ font-size: 0.75rem;
3916
+ }
3917
+
3918
+ /* Tools Empty State */
3919
+ .tools-empty-state {
3920
+ text-align: center;
3921
+ padding: 3rem 2rem;
3922
+ background: var(--color-bg-secondary);
3923
+ border-radius: var(--radius-md);
3924
+ border: 2px dashed var(--color-border);
3925
+ }
3926
+
3927
+ .tools-empty-icon {
3928
+ margin-bottom: 1rem;
3929
+ }
3930
+
3931
+ .tools-empty-title {
3932
+ font-size: 1.25rem;
3933
+ font-weight: 600;
3934
+ color: var(--color-text-primary);
3935
+ margin-bottom: 0.5rem;
3936
+ }
3937
+
3938
+ .tools-empty-text {
3939
+ color: var(--color-text-secondary);
3940
+ margin-bottom: 0.5rem;
3941
+ }
3942
+
3943
+ .tools-empty-hint {
3944
+ font-size: 0.85rem;
3945
+ color: var(--color-text-muted);
3946
+ max-width: 400px;
3947
+ margin: 0 auto;
3948
+ }
3949
+
3950
+ /* MCP Errors Section */
3951
+ .tools-mcp-errors {
3952
+ background: var(--color-bg-secondary);
3953
+ border-radius: var(--radius-md);
3954
+ padding: 1rem;
3955
+ border: 1px solid var(--color-border);
3956
+ }
3957
+
3958
+ .tools-mcp-errors-title {
3959
+ font-size: 0.9rem;
3960
+ font-weight: 600;
3961
+ color: var(--color-text-secondary);
3962
+ margin-bottom: 0.75rem;
3963
+ display: flex;
3964
+ align-items: center;
3965
+ }
3966
+
3967
+ /* Dark mode adjustments */
3968
+ [data-theme="dark"] .tool-card {
3969
+ background: var(--color-bg-secondary);
3970
+ }
3971
+
3972
+ [data-theme="dark"] .tool-card:hover {
3973
+ background: var(--color-bg-tertiary);
3974
+ }
3975
+
3976
+ [data-theme="dark"] .tool-param-details {
3977
+ background: var(--color-bg-tertiary);
3978
+ }
3979
+
3980
+ [data-theme="dark"] .tools-empty-state {
3981
+ background: var(--color-bg-tertiary);
3982
+ }
3983
+
3984
+ [data-theme="dark"] .tools-mcp-errors {
3985
+ background: var(--color-bg-tertiary);
3986
+ }
3987
+
3988
+ /* Responsive: Single column on mobile */
3989
+ @media screen and (max-width: 768px) {
3990
+ .tools-card-grid {
3991
+ grid-template-columns: 1fr;
3992
+ }
3993
+ }
3994
+
3995
+ /* ===============================================
3996
+ AI Code Generator Modal Styles
3997
+ =============================================== */
3998
+
3999
+ .code-preview-container {
4000
+ background-color: #f6f8fa;
4001
+ border: 1px solid #e1e4e8;
4002
+ border-radius: 6px;
4003
+ overflow: hidden;
4004
+
4005
+ pre {
4006
+ margin: 0;
4007
+ padding: 1rem;
4008
+ background: transparent !important;
4009
+ border: none;
4010
+ overflow-x: auto;
4011
+
4012
+ code {
4013
+ font-family: 'JetBrains Mono', 'SFMono-Regular', Consolas, monospace;
4014
+ font-size: 0.875rem;
4015
+ line-height: 1.6;
4016
+ white-space: pre;
4017
+ display: block;
4018
+ background: transparent !important;
4019
+ padding: 0 !important;
4020
+
4021
+ // Highlight.js token colors - light theme adjustments
4022
+ &.hljs {
4023
+ background: transparent !important;
4024
+ padding: 0 !important;
4025
+ }
4026
+ }
4027
+ }
4028
+ }
4029
+
4030
+ [data-theme="dark"] .code-preview-container {
4031
+ background-color: #0d1117;
4032
+ border-color: #30363d;
4033
+
4034
+ pre {
4035
+ background: transparent !important;
4036
+
4037
+ code {
4038
+ color: #e6edf3;
4039
+ background: transparent !important;
4040
+
4041
+ &.hljs {
4042
+ background: transparent !important;
4043
+ }
4044
+ }
4045
+ }
4046
+ }
4047
+
4048
+ /* Generator modal specific styles */
4049
+ #agent-generator-modal,
4050
+ #tool-generator-modal {
4051
+ .modal-card-body {
4052
+ position: relative;
4053
+ }
4054
+
4055
+ textarea.textarea {
4056
+ font-family: inherit;
4057
+ resize: vertical;
4058
+ min-height: 120px;
4059
+ }
4060
+
4061
+ .notification {
4062
+ margin-bottom: 0;
4063
+ }
4064
+ }
4065
+
4066
+ /* ========================================
4067
+ COMMAND CONSOLE — AGENTS DASHBOARD
4068
+ Stat strip + "Deployed Legion" card grid.
4069
+ ======================================== */
4070
+
4071
+ /* App content sits left-aligned next to the rail (not centered) */
4072
+ .app-content .container { max-width: 1200px; margin-left: 0; }
4073
+
4074
+ /* --- Stat strip --- */
4075
+ .stat-strip {
4076
+ display: grid;
4077
+ grid-template-columns: repeat(3, 1fr);
4078
+ gap: 1rem;
4079
+ }
4080
+ .stat-card {
4081
+ display: flex;
4082
+ align-items: center;
4083
+ gap: 0.9rem;
4084
+ padding: 1rem 1.15rem;
4085
+ background-color: var(--color-bg-secondary);
4086
+ border: 1px solid var(--color-border);
4087
+ border-radius: var(--radius-lg);
4088
+ box-shadow: var(--shadow-sm);
4089
+ }
4090
+ .stat-icon {
4091
+ display: flex;
4092
+ align-items: center;
4093
+ justify-content: center;
4094
+ width: 2.6rem;
4095
+ height: 2.6rem;
4096
+ border-radius: var(--radius-md);
4097
+ font-size: 1.05rem;
4098
+ color: var(--color-primary);
4099
+ background-color: var(--color-primary-light);
4100
+ }
4101
+ .stat-icon.is-accent { color: var(--color-accent); background-color: var(--color-accent-light); }
4102
+ .stat-icon.is-info { color: var(--color-info); background-color: var(--color-info-light); }
4103
+ .stat-value {
4104
+ font-family: var(--font-headline);
4105
+ font-size: 1.6rem;
4106
+ font-weight: 700;
4107
+ line-height: 1.1;
4108
+ color: var(--color-text-primary);
4109
+ }
4110
+ .stat-suffix { font-size: 1rem; font-weight: 500; color: var(--color-text-muted); }
4111
+ .stat-label {
4112
+ font-size: 0.78rem;
4113
+ color: var(--color-text-muted);
4114
+ text-transform: uppercase;
4115
+ letter-spacing: 0.06em;
4116
+ }
4117
+
4118
+ /* --- Legion section header --- */
4119
+ .legion-section { margin-top: 0.5rem; }
4120
+ .legion-header {
4121
+ display: flex;
4122
+ align-items: center;
4123
+ justify-content: space-between;
4124
+ gap: 1rem;
4125
+ margin-bottom: 1.1rem;
4126
+ flex-wrap: wrap;
4127
+ }
4128
+ .legion-header-left { display: flex; align-items: baseline; gap: 0.6rem; }
4129
+ .legion-count {
4130
+ font-family: var(--font-mono);
4131
+ font-size: 0.85rem;
4132
+ color: var(--color-text-muted);
4133
+ padding: 0.1rem 0.5rem;
4134
+ border: 1px solid var(--color-border);
4135
+ border-radius: var(--radius-full);
4136
+ }
4137
+ .legion-count:empty { display: none; }
4138
+ .legion-header-right .search-with-shortcut { min-width: 280px; }
4139
+
4140
+ /* --- Card grid --- */
4141
+ .legion-grid {
4142
+ display: grid;
4143
+ grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
4144
+ gap: 1.1rem;
4145
+ }
4146
+
4147
+ .agent-card {
4148
+ position: relative;
4149
+ display: flex;
4150
+ flex-direction: column;
4151
+ padding: 1.15rem 1.2rem 1rem;
4152
+ background-color: var(--color-bg-secondary);
4153
+ border: 1px solid var(--color-border);
4154
+ border-left: 3px solid var(--color-border);
4155
+ border-radius: var(--radius-lg);
4156
+ box-shadow: var(--shadow-sm);
4157
+ transition: box-shadow var(--transition-fast), border-color var(--transition-fast), transform var(--transition-fast);
4158
+ }
4159
+ .agent-card:hover { box-shadow: var(--shadow-md); transform: translateY(-1px); }
4160
+ /* Green left accent bar when the agent is running (command-console cue) */
4161
+ .agent-card.is-running { border-left-color: var(--color-success); }
4162
+
4163
+ .agent-card-head {
4164
+ display: flex;
4165
+ align-items: flex-start;
4166
+ justify-content: space-between;
4167
+ gap: 0.75rem;
4168
+ }
4169
+ .agent-card-titles { display: flex; align-items: center; gap: 0.5rem; flex-wrap: wrap; }
4170
+ .agent-card-name {
4171
+ font-family: var(--font-headline);
4172
+ font-weight: 600;
4173
+ font-size: 1.05rem;
4174
+ color: var(--color-text-primary);
4175
+ }
4176
+ .agent-card-name:hover { color: var(--color-primary); }
4177
+ .agent-type-chip {
4178
+ font-size: 0.62rem;
4179
+ font-weight: 600;
4180
+ letter-spacing: 0.05em;
4181
+ text-transform: uppercase;
4182
+ padding: 0.12rem 0.45rem;
4183
+ border-radius: var(--radius-full);
4184
+ color: var(--color-text-muted);
4185
+ background-color: var(--color-bg-tertiary);
4186
+ }
4187
+
4188
+ /* Status pill */
4189
+ .status-pill {
4190
+ display: inline-flex;
4191
+ align-items: center;
4192
+ gap: 0.4rem;
4193
+ flex: none;
4194
+ font-size: 0.72rem;
4195
+ font-weight: 600;
4196
+ padding: 0.2rem 0.6rem;
4197
+ border-radius: var(--radius-full);
4198
+ }
4199
+ .status-pill .status-dot { width: 7px; height: 7px; border-radius: 50%; background: currentColor; }
4200
+ /* Running = green (healthy/active), idle = muted grey. Stop action stays red. */
4201
+ .status-pill.is-running {
4202
+ color: var(--color-success);
4203
+ background-color: var(--color-success-light);
4204
+ box-shadow: 0 0 0 3px rgba(34, 197, 94, 0.15);
4205
+ }
4206
+ .status-pill.is-idle { color: var(--color-text-muted); background-color: var(--color-bg-tertiary); }
4207
+
4208
+ .agent-card-desc {
4209
+ margin: 0.7rem 0 0.85rem;
4210
+ font-size: 0.88rem;
4211
+ color: var(--color-text-secondary);
4212
+ line-height: 1.45;
4213
+ display: -webkit-box;
4214
+ -webkit-line-clamp: 2;
4215
+ -webkit-box-orient: vertical;
4216
+ overflow: hidden;
4217
+ }
4218
+
4219
+ .agent-card-meta { margin-bottom: 0.7rem; }
4220
+ .mono-chip {
4221
+ display: inline-flex;
4222
+ align-items: center;
4223
+ gap: 0.4rem;
4224
+ font-family: var(--font-mono);
4225
+ font-size: 0.74rem;
4226
+ color: var(--color-text-secondary);
4227
+ padding: 0.2rem 0.55rem;
4228
+ border: 1px solid var(--color-border);
4229
+ border-radius: var(--radius-sm);
4230
+ background-color: var(--color-bg-tertiary);
4231
+ }
4232
+ .mono-chip .icon { color: var(--color-text-muted); }
4233
+
4234
+ .agent-card-tools {
4235
+ display: flex;
4236
+ flex-wrap: wrap;
4237
+ gap: 0.4rem;
4238
+ margin-bottom: 1rem;
4239
+ }
4240
+ .tool-chip {
4241
+ font-family: var(--font-mono);
4242
+ font-size: 0.72rem;
4243
+ color: var(--color-primary);
4244
+ padding: 0.18rem 0.5rem;
4245
+ border-radius: var(--radius-sm);
4246
+ background-color: var(--color-primary-light);
4247
+ transition: background-color var(--transition-fast);
4248
+ }
4249
+ .tool-chip:hover { background-color: rgba(var(--color-primary-rgb), 0.2); color: var(--color-primary); }
4250
+ .tool-chip.is-empty {
4251
+ color: var(--color-text-muted);
4252
+ background-color: var(--color-bg-tertiary);
4253
+ font-style: italic;
4254
+ }
4255
+
4256
+ /* Card footer actions */
4257
+ .agent-card-foot {
4258
+ display: flex;
4259
+ align-items: center;
4260
+ gap: 0.5rem;
4261
+ margin-top: auto;
4262
+ padding-top: 0.85rem;
4263
+ border-top: 1px solid var(--color-border-light);
4264
+ }
4265
+ /* Dedicated card-action class — intentionally NOT the legacy `.action-btn`
4266
+ (which is a fixed 32x32 icon box) so text buttons size to their content. */
4267
+ .legion-action {
4268
+ display: inline-flex;
4269
+ align-items: center;
4270
+ justify-content: center;
4271
+ gap: 0.4rem;
4272
+ flex: 0 0 auto;
4273
+ white-space: nowrap;
4274
+ height: 2rem;
4275
+ padding: 0 0.8rem;
4276
+ font-size: 0.8rem;
4277
+ font-weight: 600;
4278
+ line-height: 1;
4279
+ border-radius: var(--radius-md);
4280
+ border: 1px solid var(--color-border);
4281
+ background-color: transparent;
4282
+ color: var(--color-text-secondary);
4283
+ cursor: pointer;
4284
+ text-decoration: none;
4285
+ transition: all var(--transition-fast);
4286
+ }
4287
+ .legion-action i { font-size: 0.8rem; }
4288
+ .legion-action:hover { background-color: var(--color-bg-tertiary); color: var(--color-text-primary); }
4289
+ .legion-action:active { transform: scale(0.97); }
4290
+
4291
+ /* Square icon-only variant (details / delete) */
4292
+ .legion-action.is-icon { width: 2rem; padding: 0; color: var(--color-text-muted); }
4293
+ .legion-action.is-details { margin-left: auto; }
4294
+ .legion-action.is-icon.is-danger:hover {
4295
+ color: var(--color-danger);
4296
+ border-color: var(--color-danger);
4297
+ background-color: var(--color-danger-light);
4298
+ }
4299
+
4300
+ /* Primary run / destructive stop */
4301
+ .legion-action.is-run { border-color: transparent; background-color: var(--color-primary); color: #fff; }
4302
+ .legion-action.is-run:hover { background-color: var(--color-primary-hover); color: #fff; }
4303
+ .legion-action.is-stop { color: var(--color-danger); border-color: var(--color-danger); }
4304
+ .legion-action.is-stop:hover { background-color: var(--color-danger); color: #fff; }
4305
+
4306
+ /* Newly-added card flash */
4307
+ .agent-card.is-newly-added { animation: cardFlashIn var(--transition-slow) ease; }
4308
+ @keyframes cardFlashIn {
4309
+ from { opacity: 0; transform: translateY(6px); box-shadow: 0 0 0 3px var(--color-primary-light); }
4310
+ to { opacity: 1; transform: translateY(0); }
4311
+ }
4312
+
4313
+ /* Empty state */
4314
+ .legion-empty {
4315
+ text-align: center;
4316
+ padding: 3rem 1rem;
4317
+ border: 1px dashed var(--color-border);
4318
+ border-radius: var(--radius-lg);
4319
+ background-color: var(--color-bg-secondary);
4320
+ }
4321
+
4322
+ @media screen and (max-width: 768px) {
4323
+ .stat-strip { grid-template-columns: 1fr; }
4324
+ .legion-header-right .search-with-shortcut { min-width: 0; width: 100%; }
4325
+ .legion-header-right { width: 100%; }
4326
+ }
4327
+
4328
+ /* ========================================
4329
+ DOCUMENTATION CONTENT (rendered markdown)
4330
+ Token-based so it reads well in BOTH light and dark — Bulma's defaults
4331
+ leave markdown headings dark and code blocks light, which broke dark mode.
4332
+ ======================================== */
4333
+ .documentation-content .content h1,
4334
+ .documentation-content .content h2,
4335
+ .documentation-content .content h3,
4336
+ .documentation-content .content h4,
4337
+ .documentation-content .content h5,
4338
+ .documentation-content .content h6 {
4339
+ font-family: var(--font-headline);
4340
+ color: var(--color-text-primary) !important;
4341
+ letter-spacing: -0.01em;
4342
+ }
4343
+ .documentation-content .content h1 { font-size: 1.85rem; }
4344
+ .documentation-content .content h2 {
4345
+ font-size: 1.4rem; margin-top: 2.25rem;
4346
+ padding-bottom: 0.4rem; border-bottom: 1px solid var(--color-border);
4347
+ }
4348
+ .documentation-content .content h3 { font-size: 1.15rem; margin-top: 1.6rem; }
4349
+ .documentation-content .content p,
4350
+ .documentation-content .content li { color: var(--color-text-secondary); }
4351
+ .documentation-content .content strong { color: var(--color-text-primary); }
4352
+ .documentation-content .content a { color: var(--color-primary); }
4353
+ .documentation-content .content a:hover { text-decoration: underline; }
4354
+ .documentation-content .content hr { background-color: var(--color-border); }
4355
+
4356
+ /* Inline code */
4357
+ .documentation-content .content code {
4358
+ font-family: var(--font-mono);
4359
+ font-size: 0.85em;
4360
+ background: var(--color-primary-light);
4361
+ color: var(--color-primary);
4362
+ padding: 0.12em 0.4em;
4363
+ border-radius: var(--radius-sm);
4364
+ }
4365
+ /* Code blocks — own dark/light surface via tokens; readable even if the
4366
+ highlight.js theme is light/absent (base text color comes from the block). */
4367
+ .documentation-content .content pre {
4368
+ background: var(--color-bg-tertiary);
4369
+ border: 1px solid var(--color-border);
4370
+ border-radius: var(--radius-md);
4371
+ color: var(--color-text-primary);
4372
+ padding: 1rem 1.1rem;
4373
+ font-size: 0.85rem;
4374
+ }
4375
+ .documentation-content .content pre code,
4376
+ .documentation-content .content pre code.hljs {
4377
+ background: transparent !important;
4378
+ color: inherit;
4379
+ padding: 0;
4380
+ font-size: inherit;
4381
+ }
4382
+
4383
+ /* Blockquotes + tables */
4384
+ .documentation-content .content blockquote {
4385
+ border-left: 3px solid var(--color-accent);
4386
+ background: var(--color-bg-tertiary);
4387
+ color: var(--color-text-secondary);
4388
+ border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
4389
+ }
4390
+ .documentation-content .content table th { color: var(--color-text-primary); }
4391
+ .documentation-content .content table th,
4392
+ .documentation-content .content table td { border-color: var(--color-border) !important; }
4393
+
4394
+ /* In dark mode, keep highlight.js syntax colors legible on the dark block:
4395
+ force a light base so any spans the light theme left dark stay readable. */
4396
+ [data-theme="dark"] .documentation-content .content pre {
4397
+ background: #11151b;
4398
+ color: #c9d1d9;
4399
+ }
4400
+ [data-theme="dark"] .documentation-content .content pre code,
4401
+ [data-theme="dark"] .documentation-content .content pre code .hljs-comment,
4402
+ [data-theme="dark"] .documentation-content .content pre code .hljs-meta { color: inherit; }