mindroot 9.3.0__py3-none-any.whl → 9.6.0__py3-none-any.whl

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 (183) hide show
  1. mindroot/coreplugins/admin/__init__.py +3 -1
  2. mindroot/coreplugins/admin/agent_router.py +250 -7
  3. mindroot/coreplugins/admin/asset_manager.py +164 -0
  4. mindroot/coreplugins/admin/command_router.py +236 -1
  5. mindroot/coreplugins/admin/mcp_catalog_routes.py +156 -0
  6. mindroot/coreplugins/admin/mcp_publish_routes.py +450 -0
  7. mindroot/coreplugins/admin/mcp_registry_routes.py +495 -0
  8. mindroot/coreplugins/admin/mcp_routes.py +216 -0
  9. mindroot/coreplugins/admin/mod.py +62 -0
  10. mindroot/coreplugins/admin/oauth_callback_router.py +84 -0
  11. mindroot/coreplugins/admin/persona_handler.py +15 -6
  12. mindroot/coreplugins/admin/persona_router.py +158 -2
  13. mindroot/coreplugins/admin/plugin_manager.py +105 -9
  14. mindroot/coreplugins/admin/plugin_router_fixed.py +23 -0
  15. mindroot/coreplugins/admin/plugin_router_new_not_working.py +145 -0
  16. mindroot/coreplugins/admin/plugin_routes.py +114 -0
  17. mindroot/coreplugins/admin/registry_settings_routes.py +140 -0
  18. mindroot/coreplugins/admin/router.py +116 -15
  19. mindroot/coreplugins/admin/service_models.py +1 -1
  20. mindroot/coreplugins/admin/settings_router.py +1 -0
  21. mindroot/coreplugins/admin/static/css/admin-custom.css +357 -2
  22. mindroot/coreplugins/admin/static/css/dark.css +1 -0
  23. mindroot/coreplugins/admin/static/css/default.css +4 -0
  24. mindroot/coreplugins/admin/static/js/about-info.js +367 -0
  25. mindroot/coreplugins/admin/static/js/agent-form.js +83 -3
  26. mindroot/coreplugins/admin/static/js/api-key-script.js +307 -0
  27. mindroot/coreplugins/admin/static/js/mcp-manager.js +348 -0
  28. mindroot/coreplugins/admin/static/js/mcp-publisher.js +780 -0
  29. mindroot/coreplugins/admin/static/js/persona-editor.js +34 -5
  30. mindroot/coreplugins/admin/static/js/plugin-toggle.js +1 -1
  31. mindroot/coreplugins/admin/static/js/recommended-plugin-install.js +63 -0
  32. mindroot/coreplugins/admin/static/js/registry-auth-section.js +132 -0
  33. mindroot/coreplugins/admin/static/js/registry-manager-base.js +613 -0
  34. mindroot/coreplugins/admin/static/js/registry-manager-publish-old-delete.js +166 -0
  35. mindroot/coreplugins/admin/static/js/registry-manager.js +351 -0
  36. mindroot/coreplugins/admin/static/js/registry-publish-section.js +377 -0
  37. mindroot/coreplugins/admin/static/js/registry-search-section.js +400 -0
  38. mindroot/coreplugins/admin/static/js/registry-search-section.js.bak +3 -0
  39. mindroot/coreplugins/admin/static/js/registry-settings.js +69 -0
  40. mindroot/coreplugins/admin/static/js/registry-shared-services.js +903 -0
  41. mindroot/coreplugins/admin/static/js/registry-simple-sections.js +85 -0
  42. mindroot/coreplugins/admin/static/js/secure-widget-manager.js +438 -0
  43. mindroot/coreplugins/admin/static/logo.png +0 -0
  44. mindroot/coreplugins/admin/templates/admin.jinja2 +275 -110
  45. mindroot/coreplugins/agent/Assistant/agent.json +27 -11
  46. mindroot/coreplugins/agent/agent.py +2 -2
  47. mindroot/coreplugins/agent/command_parser.py +25 -10
  48. mindroot/coreplugins/agent/templates/system.jinja2 +0 -12
  49. mindroot/coreplugins/chat/__init__.py +4 -1
  50. mindroot/coreplugins/chat/router.py +132 -20
  51. mindroot/coreplugins/chat/router_dedup_patch.py +20 -0
  52. mindroot/coreplugins/chat/services.py +31 -1
  53. mindroot/coreplugins/chat/static/css/action-fix.css +32 -0
  54. mindroot/coreplugins/chat/static/css/admin-custom.css +5 -3
  55. mindroot/coreplugins/chat/static/css/dark.css +24 -3
  56. mindroot/coreplugins/chat/static/css/default.css +24 -3
  57. mindroot/coreplugins/chat/static/css/main.css +1 -0
  58. mindroot/coreplugins/chat/static/js/action.js +137 -60
  59. mindroot/coreplugins/chat/static/js/chat-history.js +3 -0
  60. mindroot/coreplugins/chat/static/js/chat.js +59 -16
  61. mindroot/coreplugins/chat/static/js/chat.js.diff +221 -0
  62. mindroot/coreplugins/chat/static/js/chatform.js +2 -2
  63. mindroot/coreplugins/chat/static/site.webmanifest +1 -1
  64. mindroot/coreplugins/chat/templates/chat.jinja2 +3 -3
  65. mindroot/coreplugins/chat/widget_manager.py +139 -0
  66. mindroot/coreplugins/chat/widget_routes.py +287 -0
  67. mindroot/coreplugins/check_list/inject/admin.jinja2 +1 -1
  68. mindroot/coreplugins/email/__init__.py +2 -0
  69. mindroot/coreplugins/email/email_provider.py +2 -2
  70. mindroot/coreplugins/email/mod.py +100 -0
  71. mindroot/coreplugins/email/services.py +5 -3
  72. mindroot/coreplugins/email/smtp_handler.py +9 -3
  73. mindroot/coreplugins/email/test_email_service.py +75 -0
  74. mindroot/coreplugins/env_manager/mod.py +61 -25
  75. mindroot/coreplugins/home/router.py +37 -2
  76. mindroot/coreplugins/home/static/imgs/logo.png +0 -0
  77. mindroot/coreplugins/home/static/imgs/logo.png.bak +0 -0
  78. mindroot/coreplugins/home/static/imgs/logo_teal.png +0 -0
  79. mindroot/coreplugins/home/static/imgs/logo_teal2.png +0 -0
  80. mindroot/coreplugins/home/static/imgs/logo_teal_detailed.png +0 -0
  81. mindroot/coreplugins/home/static/imgs/logo_teal_python.png +0 -0
  82. mindroot/coreplugins/home/templates/home.jinja2 +15 -6
  83. mindroot/coreplugins/index/indices/default/index.json +39 -6
  84. mindroot/coreplugins/jwt_auth/middleware.py +47 -2
  85. mindroot/coreplugins/jwt_auth/mod.py +40 -17
  86. mindroot/coreplugins/l8n/__init__.py +6 -0
  87. mindroot/coreplugins/l8n/debug_loader.py +85 -0
  88. mindroot/coreplugins/l8n/debug_middleware.py +74 -0
  89. mindroot/coreplugins/l8n/l8n_constants.py +19 -0
  90. mindroot/coreplugins/l8n/language_detection.py +183 -0
  91. mindroot/coreplugins/l8n/middleware.py +151 -0
  92. mindroot/coreplugins/l8n/mod.py +277 -0
  93. mindroot/coreplugins/l8n/monkey_patch_to_delete.py +186 -0
  94. mindroot/coreplugins/l8n/test_enhanced.py +298 -0
  95. mindroot/coreplugins/l8n/test_l8n.py +95 -0
  96. mindroot/coreplugins/l8n/test_l8n_standalone.py +251 -0
  97. mindroot/coreplugins/l8n/test_middleware.py +272 -0
  98. mindroot/coreplugins/l8n/utils.py +232 -0
  99. mindroot/coreplugins/mcp_/__init__.py +14 -0
  100. mindroot/coreplugins/mcp_/catalog_commands.py +328 -0
  101. mindroot/coreplugins/mcp_/catalog_manager.py +263 -0
  102. mindroot/coreplugins/mcp_/dynamic_commands.py +154 -0
  103. mindroot/coreplugins/mcp_/mcp_manager.py +1031 -0
  104. mindroot/coreplugins/mcp_/mod.py +367 -0
  105. mindroot/coreplugins/mcp_/oauth_storage.py +144 -0
  106. mindroot/coreplugins/mcp_/server_installer.py +79 -0
  107. mindroot/coreplugins/mcp_/setup.py +26 -0
  108. mindroot/coreplugins/mcp_/test_dynamic_commands.py +134 -0
  109. mindroot/coreplugins/mcp_/testmcpclient.py +92 -0
  110. mindroot/coreplugins/persona/mod.py +12 -7
  111. mindroot/coreplugins/signup/templates/signup.jinja2 +1 -1
  112. mindroot/coreplugins/subscriptions/__init__.py +1 -0
  113. mindroot/coreplugins/subscriptions/mod.py +14 -3
  114. mindroot/coreplugins/subscriptions/router.py +3 -0
  115. mindroot/coreplugins/user_service/__init__.py +1 -2
  116. mindroot/coreplugins/user_service/admin_init.py +1 -0
  117. mindroot/coreplugins/user_service/email_service.py +72 -17
  118. mindroot/coreplugins/user_service/mod.py +10 -2
  119. mindroot/coreplugins/user_service/router.py +2 -0
  120. mindroot/lib/auth/api_key.py +28 -0
  121. mindroot/lib/cli/plugins.py +94 -0
  122. mindroot/lib/plugins/default_plugin_manifest.json +20 -0
  123. mindroot/lib/plugins/installation.py +5 -5
  124. mindroot/lib/plugins/l8n_static_handler.py +225 -0
  125. mindroot/lib/plugins/loader.py +33 -3
  126. mindroot/lib/plugins/loader_with_l8n.py +281 -0
  127. mindroot/lib/plugins/manifest.py +236 -24
  128. mindroot/lib/providers/commands.py +3 -1
  129. mindroot/lib/route_decorators.py +5 -5
  130. mindroot/lib/templates.py +183 -11
  131. mindroot/lib/utils/merge_arrays.py +1 -1
  132. mindroot/migrate.py +39 -20
  133. mindroot/registry/data_access.py +1 -1
  134. mindroot/server.py +42 -13
  135. mindroot/server_missing_normal_args.py +197 -0
  136. mindroot/server_prev.py +173 -0
  137. {mindroot-9.3.0.dist-info → mindroot-9.6.0.dist-info}/METADATA +7 -2
  138. {mindroot-9.3.0.dist-info → mindroot-9.6.0.dist-info}/RECORD +143 -113
  139. mindroot/coreplugins/admin/plugin_manager_backup.py +0 -615
  140. mindroot/coreplugins/admin/static/favicon/about.txt +0 -6
  141. mindroot/coreplugins/admin/static/favicon/android-chrome-512x512.png +0 -0
  142. mindroot/coreplugins/admin/static/favicon/apple-touch-icon.png +0 -0
  143. mindroot/coreplugins/admin/static/favicon/favicon-16x16.png +0 -0
  144. mindroot/coreplugins/admin/static/favicon/favicon-32x32.png +0 -0
  145. mindroot/coreplugins/admin/static/favicon/favicon.ico +0 -0
  146. mindroot/coreplugins/admin/static/favicon/favicon_io (1)/about.txt +0 -6
  147. mindroot/coreplugins/admin/static/favicon/favicon_io (1)/android-chrome-192x192.png +0 -0
  148. mindroot/coreplugins/admin/static/favicon/favicon_io (1)/android-chrome-512x512.png +0 -0
  149. mindroot/coreplugins/admin/static/favicon/favicon_io (1)/apple-touch-icon.png +0 -0
  150. mindroot/coreplugins/admin/static/favicon/favicon_io (1)/favicon-16x16.png +0 -0
  151. mindroot/coreplugins/admin/static/favicon/favicon_io (1)/favicon-32x32.png +0 -0
  152. mindroot/coreplugins/admin/static/favicon/favicon_io (1)/favicon.ico +0 -0
  153. mindroot/coreplugins/admin/static/favicon/favicon_io (1)/site.webmanifest +0 -1
  154. mindroot/coreplugins/admin/static/favicon/logo.png +0 -0
  155. mindroot/coreplugins/admin/static/favicon/site.webmanifest +0 -1
  156. mindroot/coreplugins/admin/static/js/backup/agent-editor.js +0 -186
  157. mindroot/coreplugins/admin/static/js/backup/agent-form.js +0 -1133
  158. mindroot/coreplugins/admin/static/js/backup/agent-list.js +0 -94
  159. mindroot/coreplugins/chat/static/favicon/about.txt +0 -6
  160. mindroot/coreplugins/chat/static/favicon/android-chrome-192x192.png +0 -0
  161. mindroot/coreplugins/chat/static/favicon/android-chrome-512x512.png +0 -0
  162. mindroot/coreplugins/chat/static/favicon/apple-touch-icon.png +0 -0
  163. mindroot/coreplugins/chat/static/favicon/favicon-16x16.png +0 -0
  164. mindroot/coreplugins/chat/static/favicon/favicon-32x32.png +0 -0
  165. mindroot/coreplugins/chat/static/favicon/favicon.ico +0 -0
  166. mindroot/coreplugins/chat/static/favicon/favicon_io (1)/about.txt +0 -6
  167. mindroot/coreplugins/chat/static/favicon/favicon_io (1)/android-chrome-192x192.png +0 -0
  168. mindroot/coreplugins/chat/static/favicon/favicon_io (1)/android-chrome-512x512.png +0 -0
  169. mindroot/coreplugins/chat/static/favicon/favicon_io (1)/apple-touch-icon.png +0 -0
  170. mindroot/coreplugins/chat/static/favicon/favicon_io (1)/favicon-16x16.png +0 -0
  171. mindroot/coreplugins/chat/static/favicon/favicon_io (1)/favicon-32x32.png +0 -0
  172. mindroot/coreplugins/chat/static/favicon/favicon_io (1)/favicon.ico +0 -0
  173. mindroot/coreplugins/chat/static/favicon/favicon_io (1)/site.webmanifest +0 -1
  174. mindroot/coreplugins/chat/static/favicon/logo.png +0 -0
  175. mindroot/coreplugins/chat/static/favicon/site.webmanifest +0 -1
  176. mindroot/coreplugins/index/default.json +0 -76
  177. mindroot/coreplugins/user_service/file_trigger_service.py +0 -12
  178. mindroot/coreplugins/user_service/hooks.py +0 -23
  179. /mindroot/coreplugins/{admin/static/favicon/android-chrome-192x192.png → home/static/imgs/backuplogo.png} +0 -0
  180. {mindroot-9.3.0.dist-info → mindroot-9.6.0.dist-info}/WHEEL +0 -0
  181. {mindroot-9.3.0.dist-info → mindroot-9.6.0.dist-info}/entry_points.txt +0 -0
  182. {mindroot-9.3.0.dist-info → mindroot-9.6.0.dist-info}/licenses/LICENSE +0 -0
  183. {mindroot-9.3.0.dist-info → mindroot-9.6.0.dist-info}/top_level.txt +0 -0
@@ -1,47 +1,148 @@
1
1
  import nanoid
2
+ import os
3
+ import json
4
+ from pathlib import Path
2
5
  from fastapi import APIRouter, HTTPException, Request
3
- from fastapi.responses import HTMLResponse, RedirectResponse
6
+ from fastapi.responses import HTMLResponse, RedirectResponse, JSONResponse, Response
4
7
  from lib.plugins import list_enabled
5
8
  from lib.templates import render
6
9
  from .plugin_manager import router as plugin_manager_router
7
10
  from lib.route_decorators import requires_role
11
+ from .mod import get_git_version_info
8
12
 
9
- # Create admin router with role requirement for all routes under it
10
- router = APIRouter(
11
- dependencies=[requires_role('admin')]
12
- )
13
+ # Create separate routers for public and admin routes
14
+ public_router = APIRouter() # No dependencies - for OAuth callbacks etc.
15
+ admin_router = APIRouter(dependencies=[requires_role('admin')]) # Admin only
13
16
 
14
- router.include_router(plugin_manager_router, prefix="/plugin-manager", tags=["plugin-manager"])
17
+ # === PUBLIC ROUTES (no authentication required) ===
18
+ # Import and include the OAuth callback router in public router
19
+ from .oauth_callback_router import router as oauth_callback_router
20
+ public_router.include_router(oauth_callback_router)
15
21
 
16
- @router.get("/admin", response_class=HTMLResponse)
22
+ # === ADMIN ROUTES (authentication required) ===
23
+ admin_router.include_router(plugin_manager_router, prefix="/plugin-manager", tags=["plugin-manager"])
24
+
25
+ @admin_router.get("/admin", response_class=HTMLResponse)
17
26
  async def get_admin_html():
18
27
  log_id = nanoid.generate()
19
28
  plugins = list_enabled()
20
29
  html = await render('admin', {"log_id": log_id})
21
30
  return html
22
31
 
32
+ @admin_router.post("/admin/get-version-info")
33
+ async def get_version_info():
34
+ """Get version information, trying git first, then falling back to cached file."""
35
+ try:
36
+ # Get the path to this file to determine where to store version.txt
37
+ current_file = Path(__file__)
38
+ version_file = current_file.parent / "version.txt"
39
+
40
+ # Try to get fresh git info using the command
41
+ try:
42
+ if get_git_version_info:
43
+ git_info = await get_git_version_info()
44
+ if git_info:
45
+ # Write to version.txt
46
+ with open(version_file, 'w') as f:
47
+ json.dump(git_info, f, indent=2)
48
+ return JSONResponse(git_info)
49
+ except Exception as e:
50
+ print(f"Failed to get git info: {e}")
51
+
52
+ # Fall back to reading from version.txt
53
+ if version_file.exists():
54
+ with open(version_file, 'r') as f:
55
+ cached_info = json.load(f)
56
+ # Add note that this is cached
57
+ cached_info['note'] = 'Cached version (git not available)'
58
+ return JSONResponse(cached_info)
59
+
60
+ # No version info available
61
+ return JSONResponse({
62
+ 'commit_hash': 'Unknown',
63
+ 'commit_date': 'Unknown',
64
+ 'retrieved_at': 'Unknown',
65
+ 'note': 'Version information not available'
66
+ })
67
+
68
+ except Exception as e:
69
+ raise HTTPException(status_code=500, detail=f"Error getting version info: {str(e)}")
23
70
 
24
71
  from lib.logging.log_router import router as log_router
25
- router.include_router(log_router)
72
+ admin_router.include_router(log_router)
26
73
 
27
74
  from .command_router import router as command_router
28
- router.include_router(command_router)
75
+ admin_router.include_router(command_router)
29
76
 
30
77
  from .settings_router import router as settings_router
31
- router.include_router(settings_router)
78
+ admin_router.include_router(settings_router)
79
+
80
+ # Use the fixed plugin router instead of the old one
81
+ from .plugin_router_fixed import router as plugin_router_fixed
82
+ admin_router.include_router(plugin_router_fixed, prefix="/admin", tags=["plugins", "mcp"])
32
83
 
84
+ # Keep the old plugin router for backward compatibility if needed
33
85
  from .plugin_router import router as plugin_router
34
- router.include_router(plugin_router)
86
+ admin_router.include_router(plugin_router, prefix="/admin/legacy", tags=["legacy-plugins"])
35
87
 
36
88
  from .persona_router import router as persona_router
37
- router.include_router(persona_router)
89
+ admin_router.include_router(persona_router)
38
90
 
39
91
  from .agent_router import router as agent_router
40
- router.include_router(agent_router)
92
+ admin_router.include_router(agent_router)
41
93
 
42
94
  from .server_router import router as server_router
43
- router.include_router(server_router, prefix="/admin/server", tags=["server"])
95
+ admin_router.include_router(server_router, prefix="/admin/server", tags=["server"])
44
96
 
45
97
  # Import and include the env_manager router
46
98
  from coreplugins.env_manager.router import router as env_manager_router
47
- router.include_router(env_manager_router)
99
+ admin_router.include_router(env_manager_router)
100
+
101
+ @admin_router.post("/admin/update-mindroot")
102
+ async def update_mindroot():
103
+ """Update MindRoot using pip install --upgrade mindroot"""
104
+ import subprocess
105
+ import sys
106
+
107
+ try:
108
+ # Run pip install --upgrade mindroot in the current environment
109
+ result = subprocess.run(
110
+ [sys.executable, "-m", "pip", "install", "--upgrade", "mindroot"],
111
+ capture_output=True,
112
+ text=True,
113
+ timeout=300 # 5 minute timeout
114
+ )
115
+
116
+ if result.returncode == 0:
117
+ return JSONResponse({
118
+ "success": True,
119
+ "message": "MindRoot updated successfully",
120
+ "output": result.stdout,
121
+ "note": "Restart the application to use the updated version"
122
+ })
123
+ else:
124
+ return JSONResponse({
125
+ "success": False,
126
+ "message": "Failed to update MindRoot",
127
+ "error": result.stderr,
128
+ "output": result.stdout
129
+ })
130
+
131
+ except subprocess.TimeoutExpired:
132
+ return JSONResponse({
133
+ "success": False,
134
+ "message": "Update timed out after 5 minutes",
135
+ "error": "Process timed out"
136
+ })
137
+ except Exception as e:
138
+ return JSONResponse({
139
+ "success": False,
140
+ "message": "Error during update",
141
+ "error": str(e)
142
+ })
143
+
144
+ # === MAIN ROUTER COMBINING PUBLIC AND ADMIN ===
145
+ # Create main router that combines both public and admin routes
146
+ router = APIRouter()
147
+ router.include_router(public_router) # Public routes first (no auth)
148
+ router.include_router(admin_router) # Admin routes (with auth)
@@ -71,7 +71,7 @@ async def get_service_models_from_providers(timeout: float = 500.0, context=None
71
71
  print(f"Querying {len(providers)} providers for service models...")
72
72
  provider_tasks = [query_provider(provider) for provider in providers]
73
73
  provider_results = await asyncio.gather(*provider_tasks)
74
- print(provider_results)
74
+ #print(provider_results)
75
75
  # Organize results by service, then by provider
76
76
  service_models: Dict[str, Dict[str, List[str]]] = {}
77
77
 
@@ -110,6 +110,7 @@ async def get_providers():
110
110
  @router.get('/commands', response_model=Dict)
111
111
  async def get_commands():
112
112
  print("retrieving commands")
113
+ print(f"settings_router: command_manager instance ID: {id(command_manager)}")
113
114
  #funcs = command_manager.get_functions()
114
115
  funcs = command_manager.get_detailed_functions()
115
116
  print("funcs is")
@@ -138,7 +138,7 @@ details summary .material-icons {
138
138
 
139
139
  .commands-grid {
140
140
  display: grid;
141
- grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
141
+ grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
142
142
  gap: 0.5rem;
143
143
  margin-top: 0.25rem;
144
144
  }
@@ -147,7 +147,7 @@ details summary .material-icons {
147
147
  display: flex;
148
148
  align-items: center;
149
149
  gap: 0.5rem;
150
- padding: 0.35rem 0.5rem;
150
+ padding: 0.5rem 0.75rem;
151
151
  background: rgba(255, 255, 255, 0.05);
152
152
  border-radius: 4px;
153
153
  cursor: pointer;
@@ -167,6 +167,9 @@ details summary .material-icons {
167
167
 
168
168
  .command-name {
169
169
  white-space: nowrap;
170
+ flex: 1;
171
+ margin-right: 1rem;
172
+ min-width: 0;
170
173
  overflow: hidden;
171
174
  text-overflow: ellipsis;
172
175
  font-size: 0.9rem;
@@ -312,3 +315,355 @@ h2, h3, h4 {
312
315
  .admin-link, .admin-link:visited {
313
316
  color: #ddd;
314
317
  }
318
+
319
+ /* Category Section Styles */
320
+ .category-section {
321
+ margin-bottom: 2rem;
322
+ background: rgba(5, 5, 15, 0.6);
323
+ border-radius: 12px;
324
+ padding: 1.5rem;
325
+ border: 1px solid rgba(255, 255, 255, 0.08);
326
+ }
327
+
328
+ .category-title {
329
+ display: flex;
330
+ align-items: center;
331
+ gap: 0.75rem;
332
+ font-size: 1.3rem;
333
+ font-weight: 600;
334
+ color: rgba(255, 255, 255, 0.95);
335
+ margin: 0 0 1.5rem 0;
336
+ padding: 0.75rem 1rem;
337
+ background: rgba(255, 255, 255, 0.08);
338
+ border-radius: 8px;
339
+ border: 1px solid rgba(255, 255, 255, 0.12);
340
+ }
341
+
342
+ .category-title .material-icons {
343
+ font-size: 1.4rem;
344
+ opacity: 0.9;
345
+ }
346
+
347
+ /* Adjust details within categories */
348
+ .category-section details {
349
+ margin-bottom: 1rem;
350
+ background: rgba(15, 15, 30, 0.7);
351
+ border: 1px solid rgba(255, 255, 255, 0.12);
352
+ }
353
+
354
+ .category-section details:last-child {
355
+ margin-bottom: 0;
356
+ }
357
+
358
+ .category-section details summary {
359
+ background: rgba(255, 255, 255, 0.06);
360
+ padding: 1rem 1.25rem;
361
+ font-size: 1.05rem;
362
+ }
363
+
364
+ .category-section details summary:hover {
365
+ background: rgba(255, 255, 255, 0.12);
366
+ }
367
+
368
+ .category-section .details-content {
369
+ padding: 1.25rem;
370
+ background: rgba(10, 10, 25, 0.5);
371
+ }
372
+
373
+ /* Category-specific styling */
374
+ .category-section:nth-child(1) .category-title {
375
+ background: linear-gradient(135deg, rgba(74, 158, 255, 0.15), rgba(74, 158, 255, 0.08));
376
+ border-color: rgba(74, 158, 255, 0.2);
377
+ }
378
+
379
+ .category-section:nth-child(2) .category-title {
380
+ background: linear-gradient(135deg, rgba(76, 175, 80, 0.15), rgba(76, 175, 80, 0.08));
381
+ border-color: rgba(76, 175, 80, 0.2);
382
+ }
383
+
384
+ .category-section:nth-child(3) .category-title {
385
+ background: linear-gradient(135deg, rgba(255, 152, 0, 0.15), rgba(255, 152, 0, 0.08));
386
+ border-color: rgba(255, 152, 0, 0.2);
387
+ }
388
+
389
+ /* Responsive adjustments for categories */
390
+ @media (max-width: 768px) {
391
+ .category-section {
392
+ padding: 1rem;
393
+ margin-bottom: 1.5rem;
394
+ }
395
+
396
+ .category-title {
397
+ font-size: 1.2rem;
398
+ padding: 0.6rem 0.8rem;
399
+ }
400
+
401
+ .category-section details summary {
402
+ padding: 0.8rem 1rem;
403
+ font-size: 1rem;
404
+ }
405
+
406
+ .category-section .details-content {
407
+ padding: 1rem;
408
+ }
409
+ }
410
+
411
+ /* Navigation Category Styles */
412
+ .nav-category {
413
+ margin-bottom: 0.5rem;
414
+ }
415
+
416
+ .nav-category-header {
417
+ display: flex;
418
+ align-items: center;
419
+ gap: 0.5rem;
420
+ padding: 0.75rem 1rem;
421
+ background: rgba(255, 255, 255, 0.08);
422
+ border: 1px solid rgba(255, 255, 255, 0.15);
423
+ border-radius: 6px;
424
+ cursor: pointer;
425
+ font-weight: 600;
426
+ font-size: 0.95rem;
427
+ color: rgba(255, 255, 255, 0.9);
428
+ margin-bottom: 0.5rem;
429
+ transition: background 0.2s ease;
430
+ }
431
+
432
+ .nav-category-header:hover {
433
+ background: rgba(255, 255, 255, 0.12);
434
+ }
435
+
436
+ .nav-category-header .material-icons {
437
+ font-size: 1.1rem;
438
+ opacity: 0.8;
439
+ }
440
+
441
+ .nav-category-content {
442
+ padding-left: 1rem;
443
+ border-left: 2px solid rgba(255, 255, 255, 0.1);
444
+ margin-left: 1rem;
445
+ }
446
+
447
+ .nav-category-content .tab-button {
448
+ width: 100%;
449
+ margin-bottom: 0.25rem;
450
+ justify-content: flex-start;
451
+ padding: 0.6rem 0.75rem;
452
+ font-size: 0.9rem;
453
+ }
454
+
455
+ /* Category-specific colors for headers */
456
+ .nav-category:nth-child(1) .nav-category-header {
457
+ background: linear-gradient(135deg, rgba(74, 158, 255, 0.15), rgba(74, 158, 255, 0.08));
458
+ border-color: rgba(74, 158, 255, 0.2);
459
+ }
460
+
461
+ .nav-category:nth-child(1) .nav-category-content {
462
+ border-left-color: rgba(74, 158, 255, 0.3);
463
+ }
464
+
465
+ .nav-category:nth-child(2) .nav-category-header {
466
+ background: linear-gradient(135deg, rgba(76, 175, 80, 0.15), rgba(76, 175, 80, 0.08));
467
+ border-color: rgba(76, 175, 80, 0.2);
468
+ }
469
+
470
+ .nav-category:nth-child(2) .nav-category-content {
471
+ border-left-color: rgba(76, 175, 80, 0.3);
472
+ }
473
+
474
+ .nav-category:nth-child(3) .nav-category-header {
475
+ background: linear-gradient(135deg, rgba(255, 152, 0, 0.15), rgba(255, 152, 0, 0.08));
476
+ border-color: rgba(255, 152, 0, 0.2);
477
+ }
478
+
479
+ .nav-category:nth-child(3) .nav-category-content {
480
+ border-left-color: rgba(255, 152, 0, 0.3);
481
+ }
482
+
483
+ /* Responsive adjustments for navigation categories */
484
+ @media (max-width: 768px) {
485
+ .nav-category-header {
486
+ padding: 0.6rem 0.8rem;
487
+ font-size: 0.9rem;
488
+ }
489
+
490
+ .nav-category-content {
491
+ padding-left: 0.75rem;
492
+ margin-left: 0.75rem;
493
+ }
494
+
495
+ .nav-category-content .tab-button {
496
+ padding: 0.5rem 0.6rem;
497
+ font-size: 0.85rem;
498
+ }
499
+ }
500
+
501
+ /* Enhanced Navigation Category Styles with Expand Indicators */
502
+ .nav-category-header {
503
+ position: relative;
504
+ }
505
+
506
+ .nav-category-header::after {
507
+ content: '▼';
508
+ position: absolute;
509
+ right: 1rem;
510
+ top: 50%;
511
+ transform: translateY(-50%);
512
+ font-size: 0.8rem;
513
+ opacity: 0.7;
514
+ transition: transform 0.2s ease, opacity 0.2s ease;
515
+ }
516
+
517
+ .nav-category:not([open]) .nav-category-header::after {
518
+ transform: translateY(-50%) rotate(-90deg);
519
+ }
520
+
521
+ .nav-category-header:hover::after {
522
+ opacity: 1;
523
+ }
524
+
525
+ /* Enhanced hover effects */
526
+ .nav-category-header:hover {
527
+ background: rgba(255, 255, 255, 0.15);
528
+ transform: translateY(-1px);
529
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
530
+ }
531
+
532
+ /* Category-specific hover enhancements */
533
+ .nav-category:nth-child(1) .nav-category-header:hover {
534
+ background: linear-gradient(135deg, rgba(74, 158, 255, 0.25), rgba(74, 158, 255, 0.15));
535
+ border-color: rgba(74, 158, 255, 0.3);
536
+ }
537
+
538
+ .nav-category:nth-child(2) .nav-category-header:hover {
539
+ background: linear-gradient(135deg, rgba(76, 175, 80, 0.25), rgba(76, 175, 80, 0.15));
540
+ border-color: rgba(76, 175, 80, 0.3);
541
+ }
542
+
543
+ .nav-category:nth-child(3) .nav-category-header:hover {
544
+ background: linear-gradient(135deg, rgba(255, 152, 0, 0.25), rgba(255, 152, 0, 0.15));
545
+ border-color: rgba(255, 152, 0, 0.3);
546
+ }
547
+
548
+ /* Smooth transitions for all category interactions */
549
+ .nav-category-header {
550
+ transition: all 0.2s ease;
551
+ }
552
+
553
+ .nav-category-content {
554
+ transition: all 0.2s ease;
555
+ }
556
+
557
+ /* Enhanced tab button hover within categories */
558
+ .nav-category-content .tab-button:hover {
559
+ background: rgba(255, 255, 255, 0.15);
560
+ transform: translateX(2px);
561
+ border-left: 2px solid rgba(255, 255, 255, 0.3);
562
+ }
563
+
564
+ /* Active state enhancements */
565
+ .nav-category-content .tab-button.active {
566
+ background: rgba(255, 255, 255, 0.2);
567
+ border-left: 3px solid #4a9eff;
568
+ font-weight: 500;
569
+ }
570
+
571
+ .nav-category-content .tab-button.active:hover {
572
+ background: rgba(255, 255, 255, 0.25);
573
+ }
574
+
575
+
576
+ .publish-details summary {
577
+ list-style: none;
578
+ }
579
+
580
+ /* Remove webkit default arrow */
581
+ .publish-details summary::-webkit-details-marker {
582
+ display: none;
583
+ }
584
+
585
+ /* Add custom arrow using ::before pseudo-element */
586
+ .publish-details summary::before {
587
+ content: '▶';
588
+ margin-right: 8px;
589
+ transition: transform 0.2s ease;
590
+ display: inline-block;
591
+ }
592
+
593
+ /* Rotate arrow when expanded */
594
+ .publish-details details[open] summary::before {
595
+ transform: rotate(90deg);
596
+ }
597
+
598
+
599
+
600
+ /* Override all radio buttons globally */
601
+ input[type="radio"] {
602
+ /* Remove default appearance */
603
+ appearance: none;
604
+ -webkit-appearance: none;
605
+ -moz-appearance: none;
606
+
607
+ /* Size and positioning */
608
+ width: 20px;
609
+ height: 20px;
610
+ margin-right: 8px;
611
+
612
+ /* Dark theme styling */
613
+ background-color: #2a2a2a;
614
+ border: 2px solid #4a4a4a;
615
+ border-radius: 50%;
616
+
617
+ /* Smooth transitions */
618
+ transition: all 0.2s ease;
619
+ cursor: pointer;
620
+
621
+ /* Positioning for the inner dot */
622
+ position: relative;
623
+ vertical-align: middle;
624
+ }
625
+
626
+ /* Hover state */
627
+ input[type="radio"]:hover {
628
+ border-color: #6366f1;
629
+ box-shadow: 0 0 0 4px rgba(99, 102, 241, 0.1);
630
+ }
631
+
632
+ /* Checked state */
633
+ input[type="radio"]:checked {
634
+ background-color: #6366f1;
635
+ border-color: #6366f1;
636
+ }
637
+
638
+ /* Inner dot when checked */
639
+ input[type="radio"]:checked::after {
640
+ content: '';
641
+ position: absolute;
642
+ top: 50%;
643
+ left: 50%;
644
+ transform: translate(-50%, -50%);
645
+ width: 8px;
646
+ height: 8px;
647
+ background-color: white;
648
+ border-radius: 50%;
649
+ }
650
+
651
+ /* Focus state for accessibility */
652
+ input[type="radio"]:focus {
653
+ outline: none;
654
+ box-shadow: 0 0 0 3px rgba(99, 102, 241, 0.3);
655
+ }
656
+
657
+ /* Disabled state */
658
+ input[type="radio"]:disabled {
659
+ opacity: 0.5;
660
+ cursor: not-allowed;
661
+ }
662
+
663
+ input[type="radio"]:disabled:hover {
664
+ border-color: #4a4a4a;
665
+ box-shadow: none;
666
+ }
667
+
668
+
669
+
@@ -3,6 +3,7 @@ html, body {
3
3
  color: #f0f0f0;
4
4
  padding: 5px 5px;
5
5
  font-family: ui-sans-serif, -apple-system, system-ui, "Segoe UI", Roboto, Ubuntu, Cantarell, "Noto Sans", sans-serif, Helvetica, "Apple Color Emoji", Arial, "Segoe UI Emoji", "Segoe UI Symbol";
6
+ font-size: 16px;
6
7
  display: flex;
7
8
  flex-direction: column;
8
9
  height: 100%;
@@ -10,6 +10,10 @@ html, body {
10
10
  margin: 2px;
11
11
  }
12
12
 
13
+ html, body, * {
14
+ font-size: 16px;
15
+ }
16
+
13
17
  input, textarea {
14
18
  background-color: rgba(10, 10, 25, 0.95);
15
19
  color: #f0f0f0;