@agenticmail/enterprise 0.4.2 → 0.5.1

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 (173) hide show
  1. package/README.md +608 -923
  2. package/dashboards/django/app.py +12 -0
  3. package/dashboards/django/static/styles.css +449 -246
  4. package/dashboards/django/templates/activity.html +130 -0
  5. package/dashboards/django/templates/approvals.html +115 -0
  6. package/dashboards/django/templates/community-skills.html +89 -0
  7. package/dashboards/django/templates/domain-status.html +59 -0
  8. package/dashboards/django/templates/knowledge-contributions.html +58 -0
  9. package/dashboards/django/templates/knowledge.html +104 -0
  10. package/dashboards/django/templates/layout.html +161 -36
  11. package/dashboards/django/templates/skill-connections.html +73 -0
  12. package/dashboards/django/templates/workforce.html +116 -0
  13. package/dashboards/django/views/__init__.py +14 -0
  14. package/dashboards/django/views/new_pages.py +38 -0
  15. package/dashboards/dotnet/Program.cs +8 -0
  16. package/dashboards/dotnet/Routes/ActivityRoutes.cs +35 -0
  17. package/dashboards/dotnet/Routes/ApprovalRoutes.cs +36 -0
  18. package/dashboards/dotnet/Routes/CommunitySkillRoutes.cs +36 -0
  19. package/dashboards/dotnet/Routes/DomainStatusRoutes.cs +49 -0
  20. package/dashboards/dotnet/Routes/KnowledgeContributionRoutes.cs +42 -0
  21. package/dashboards/dotnet/Routes/KnowledgeRoutes.cs +40 -0
  22. package/dashboards/dotnet/Routes/SkillConnectionRoutes.cs +52 -0
  23. package/dashboards/dotnet/Routes/WorkforceRoutes.cs +55 -0
  24. package/dashboards/dotnet/Services/HtmlBuilder.cs +17 -8
  25. package/dashboards/dotnet/wwwroot/styles.css +508 -246
  26. package/dashboards/express/app.js +8 -0
  27. package/dashboards/express/public/styles.css +163 -272
  28. package/dashboards/express/routes/activity.js +101 -0
  29. package/dashboards/express/routes/approvals.js +100 -0
  30. package/dashboards/express/routes/community-skills.js +83 -0
  31. package/dashboards/express/routes/domain-status.js +78 -0
  32. package/dashboards/express/routes/knowledge-contributions.js +85 -0
  33. package/dashboards/express/routes/knowledge.js +83 -0
  34. package/dashboards/express/routes/skill-connections.js +86 -0
  35. package/dashboards/express/routes/workforce.js +126 -0
  36. package/dashboards/express/views/layout.js +54 -33
  37. package/dashboards/go/handlers/activity.go +30 -0
  38. package/dashboards/go/handlers/approvals.go +31 -0
  39. package/dashboards/go/handlers/community_skills.go +32 -0
  40. package/dashboards/go/handlers/domain_status.go +62 -0
  41. package/dashboards/go/handlers/knowledge.go +35 -0
  42. package/dashboards/go/handlers/knowledge_contributions.go +37 -0
  43. package/dashboards/go/handlers/skill_connections.go +59 -0
  44. package/dashboards/go/handlers/workforce.go +60 -0
  45. package/dashboards/go/main.go +8 -0
  46. package/dashboards/go/static/styles.css +508 -246
  47. package/dashboards/go/templates/layout.go +16 -11
  48. package/dashboards/html/index.html +136 -15
  49. package/dashboards/html/public/styles.css +531 -134
  50. package/dashboards/html/src/pages/activity.js +137 -0
  51. package/dashboards/html/src/pages/approvals.js +155 -0
  52. package/dashboards/html/src/pages/community-skills.js +236 -0
  53. package/dashboards/html/src/pages/domain-status.js +182 -0
  54. package/dashboards/html/src/pages/knowledge-contributions.js +319 -0
  55. package/dashboards/html/src/pages/knowledge.js +251 -0
  56. package/dashboards/html/src/pages/skill-connections.js +293 -0
  57. package/dashboards/html/src/pages/workforce.js +418 -0
  58. package/dashboards/html/src/router.js +51 -0
  59. package/dashboards/java/AgenticMailDashboard.java +8 -0
  60. package/dashboards/java/handlers/ActivityHandler.java +42 -0
  61. package/dashboards/java/handlers/ApprovalsHandler.java +43 -0
  62. package/dashboards/java/handlers/CommunitySkillsHandler.java +45 -0
  63. package/dashboards/java/handlers/DomainStatusHandler.java +58 -0
  64. package/dashboards/java/handlers/KnowledgeContributionsHandler.java +51 -0
  65. package/dashboards/java/handlers/KnowledgeHandler.java +49 -0
  66. package/dashboards/java/handlers/SkillConnectionsHandler.java +61 -0
  67. package/dashboards/java/handlers/WorkforceHandler.java +64 -0
  68. package/dashboards/java/static/styles.css +508 -250
  69. package/dashboards/java/templates/Layout.java +14 -6
  70. package/dashboards/laravel/controllers/ActivityController.php +18 -0
  71. package/dashboards/laravel/controllers/ApprovalsController.php +18 -0
  72. package/dashboards/laravel/controllers/CommunitySkillsController.php +18 -0
  73. package/dashboards/laravel/controllers/DomainStatusController.php +18 -0
  74. package/dashboards/laravel/controllers/KnowledgeContributionsController.php +18 -0
  75. package/dashboards/laravel/controllers/KnowledgeController.php +18 -0
  76. package/dashboards/laravel/controllers/SkillConnectionsController.php +18 -0
  77. package/dashboards/laravel/controllers/WorkforceController.php +18 -0
  78. package/dashboards/laravel/index.php +56 -0
  79. package/dashboards/laravel/public/styles.css +163 -279
  80. package/dashboards/laravel/views/activity.php +127 -0
  81. package/dashboards/laravel/views/approvals.php +152 -0
  82. package/dashboards/laravel/views/community-skills.php +131 -0
  83. package/dashboards/laravel/views/domain-status.php +167 -0
  84. package/dashboards/laravel/views/knowledge-contributions.php +185 -0
  85. package/dashboards/laravel/views/knowledge.php +167 -0
  86. package/dashboards/laravel/views/layout.php +54 -41
  87. package/dashboards/laravel/views/skill-connections.php +192 -0
  88. package/dashboards/laravel/views/workforce.php +265 -0
  89. package/dashboards/php/components/layout.php +21 -16
  90. package/dashboards/php/index.php +1 -1
  91. package/dashboards/php/pages/activity.php +35 -0
  92. package/dashboards/php/pages/approvals.php +36 -0
  93. package/dashboards/php/pages/community-skills.php +39 -0
  94. package/dashboards/php/pages/domain-status.php +87 -0
  95. package/dashboards/php/pages/knowledge-contributions.php +47 -0
  96. package/dashboards/php/pages/knowledge.php +43 -0
  97. package/dashboards/php/pages/skill-connections.php +94 -0
  98. package/dashboards/php/pages/workforce.php +89 -0
  99. package/dashboards/php/public/styles.css +168 -74
  100. package/dashboards/python/app.py +16 -0
  101. package/dashboards/python/routes/activity.py +11 -0
  102. package/dashboards/python/routes/approvals.py +11 -0
  103. package/dashboards/python/routes/community_skills.py +11 -0
  104. package/dashboards/python/routes/domain_status.py +11 -0
  105. package/dashboards/python/routes/knowledge.py +11 -0
  106. package/dashboards/python/routes/knowledge_contributions.py +11 -0
  107. package/dashboards/python/routes/skill_connections.py +11 -0
  108. package/dashboards/python/routes/workforce.py +11 -0
  109. package/dashboards/python/static/styles.css +163 -276
  110. package/dashboards/python/templates/activity.html +87 -0
  111. package/dashboards/python/templates/approvals.html +86 -0
  112. package/dashboards/python/templates/community-skills.html +69 -0
  113. package/dashboards/python/templates/domain-status.html +64 -0
  114. package/dashboards/python/templates/knowledge-contributions.html +71 -0
  115. package/dashboards/python/templates/knowledge.html +69 -0
  116. package/dashboards/python/templates/layout.html +103 -68
  117. package/dashboards/python/templates/skill-connections.html +72 -0
  118. package/dashboards/python/templates/workforce.html +112 -0
  119. package/dashboards/rails/app.rb +8 -0
  120. package/dashboards/rails/public/styles.css +506 -259
  121. package/dashboards/rails/routes/activity.rb +10 -0
  122. package/dashboards/rails/routes/approvals.rb +10 -0
  123. package/dashboards/rails/routes/community_skills.rb +11 -0
  124. package/dashboards/rails/routes/domain_status.rb +16 -0
  125. package/dashboards/rails/routes/knowledge.rb +11 -0
  126. package/dashboards/rails/routes/knowledge_contributions.rb +12 -0
  127. package/dashboards/rails/routes/skill_connections.rb +15 -0
  128. package/dashboards/rails/routes/workforce.rb +16 -0
  129. package/dashboards/rails/views/activity.erb +56 -0
  130. package/dashboards/rails/views/approvals.erb +60 -0
  131. package/dashboards/rails/views/community_skills.erb +69 -0
  132. package/dashboards/rails/views/domain_status.erb +75 -0
  133. package/dashboards/rails/views/knowledge.erb +67 -0
  134. package/dashboards/rails/views/knowledge_contributions.erb +70 -0
  135. package/dashboards/rails/views/layout.erb +23 -15
  136. package/dashboards/rails/views/skill_connections.erb +109 -0
  137. package/dashboards/rails/views/workforce.erb +124 -0
  138. package/dashboards/ruby/app.rb +8 -0
  139. package/dashboards/ruby/public/styles.css +506 -254
  140. package/dashboards/ruby/routes/activity.rb +10 -0
  141. package/dashboards/ruby/routes/approvals.rb +10 -0
  142. package/dashboards/ruby/routes/community_skills.rb +11 -0
  143. package/dashboards/ruby/routes/domain_status.rb +16 -0
  144. package/dashboards/ruby/routes/knowledge.rb +11 -0
  145. package/dashboards/ruby/routes/knowledge_contributions.rb +12 -0
  146. package/dashboards/ruby/routes/skill_connections.rb +15 -0
  147. package/dashboards/ruby/routes/workforce.rb +16 -0
  148. package/dashboards/ruby/views/activity.erb +56 -0
  149. package/dashboards/ruby/views/approvals.erb +60 -0
  150. package/dashboards/ruby/views/community_skills.erb +69 -0
  151. package/dashboards/ruby/views/domain_status.erb +75 -0
  152. package/dashboards/ruby/views/knowledge.erb +67 -0
  153. package/dashboards/ruby/views/knowledge_contributions.erb +70 -0
  154. package/dashboards/ruby/views/layout.erb +22 -13
  155. package/dashboards/ruby/views/skill_connections.erb +109 -0
  156. package/dashboards/ruby/views/workforce.erb +124 -0
  157. package/dashboards/shared/styles.css +505 -281
  158. package/dashboards/shared-styles.css +534 -45
  159. package/dist/chunk-ANW4OHXR.js +764 -0
  160. package/dist/chunk-EVQPFQ55.js +9040 -0
  161. package/dist/chunk-JMTNHH7I.js +12666 -0
  162. package/dist/chunk-TYW5XTOW.js +395 -0
  163. package/dist/chunk-V2YIXYDJ.js +1943 -0
  164. package/dist/cli.js +1 -1
  165. package/dist/index.js +5 -4
  166. package/dist/routes-ALTC4I2R.js +5674 -0
  167. package/dist/runtime-JLFTHMIT.js +47 -0
  168. package/dist/server-OGQWCOT6.js +11 -0
  169. package/dist/setup-HCMMUEW6.js +20 -0
  170. package/package.json +1 -1
  171. package/src/agent-tools/tools/memory.ts +42 -15
  172. package/src/engine/agent-memory.ts +4 -355
  173. package/src/lib/text-search.ts +358 -0
@@ -1,284 +1,487 @@
1
1
  /*
2
- * AgenticMail Enterprise Dashboard — Shared Design System
3
- * Used by all 11 dashboard implementations.
4
- * Copy this into your dashboard's public/ or static/ folder.
2
+ * AgenticMail Enterprise Dashboard — Professional Theme
3
+ * Updated to match main React dashboard styling
4
+ * Professional dark theme with indigo accents
5
5
  */
6
6
 
7
- /* ─── Theme Variables ─────────────────────────────────── */
8
- :root, [data-theme="light"] {
9
- --bg: #f8f9fa; --surface: #fff; --surface-hover: #f1f3f5;
10
- --border: #dee2e6; --border-hover: #ced4da;
11
- --text: #212529; --text-dim: #495057; --text-muted: #868e96;
12
- --primary: #e84393; --primary-hover: #d63384; --primary-bg: rgba(232,67,147,0.08);
13
- --success: #2b8a3e; --success-bg: rgba(43,138,62,0.08);
14
- --warning: #e67700; --warning-bg: rgba(230,119,0,0.08);
15
- --danger: #c92a2a; --danger-bg: rgba(201,42,42,0.08);
16
- --radius: 6px; --radius-lg: 10px;
17
- --shadow: 0 1px 3px rgba(0,0,0,0.08);
18
- --font: -apple-system, BlinkMacSystemFont, 'Inter', 'Segoe UI', system-ui, sans-serif;
19
- color-scheme: light dark;
20
- }
21
- [data-theme="dark"] {
22
- --bg: #0f1114; --surface: #16181d; --surface-hover: #1c1f26;
23
- --border: #2c3038; --border-hover: #3b414c;
24
- --text: #e1e4e8; --text-dim: #b0b8c4; --text-muted: #6b7280;
25
- --primary: #f06595; --primary-hover: #f783ac; --primary-bg: rgba(240,101,149,0.1);
26
- --success: #37b24d; --success-bg: rgba(55,178,77,0.1);
27
- --warning: #f08c00; --warning-bg: rgba(240,140,0,0.1);
28
- --danger: #f03e3e; --danger-bg: rgba(240,62,62,0.1);
7
+ /* ═══════════════════════════════════════════════════════════
8
+ THEME SYSTEM — CSS Custom Properties
9
+ ═══════════════════════════════════════════════════════════ */
10
+ :root {
11
+ --bg-primary: #0f1117;
12
+ --bg-secondary: #161822;
13
+ --bg-tertiary: #1c1f2e;
14
+ --bg-hover: #232738;
15
+ --bg-active: #2a2f45;
16
+ --bg-card: #181b28;
17
+ --bg-input: #1c1f2e;
18
+ --bg-modal: rgba(0,0,0,0.7);
19
+ --border: #2a2f45;
20
+ --border-light: #353a52;
21
+ --text-primary: #e8eaf0;
22
+ --text-secondary: #9ca3b8;
23
+ --text-muted: #6b7394;
24
+ --text-inverse: #0f1117;
25
+ --accent: #6366f1;
26
+ --accent-hover: #4f46e5;
27
+ --accent-soft: rgba(99,102,241,0.12);
28
+ --accent-text: #818cf8;
29
+ --success: #22c55e;
30
+ --success-soft: rgba(34,197,94,0.12);
31
+ --warning: #f59e0b;
32
+ --warning-soft: rgba(245,158,11,0.12);
33
+ --danger: #ef4444;
34
+ --danger-soft: rgba(239,68,68,0.12);
35
+ --danger-hover: #dc2626;
36
+ --info: #06b6d4;
37
+ --info-soft: rgba(6,182,212,0.12);
38
+ --radius: 8px;
39
+ --radius-lg: 12px;
40
+ --radius-xl: 16px;
29
41
  --shadow: 0 1px 3px rgba(0,0,0,0.3);
42
+ --shadow-lg: 0 4px 12px rgba(0,0,0,0.4);
43
+ --shadow-xl: 0 8px 24px rgba(0,0,0,0.5);
44
+ --font: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
45
+ --font-mono: 'SF Mono', 'Fira Code', monospace;
46
+ --sidebar-w: 260px;
47
+ --sidebar-collapsed-w: 64px;
48
+ --sidebar-transition: width 200ms ease, box-shadow 200ms ease;
49
+ --header-h: 56px;
50
+ --transition: 150ms ease;
30
51
  }
31
- @media (prefers-color-scheme: dark) {
32
- :root:not([data-theme="light"]) {
33
- --bg: #0f1114; --surface: #16181d; --surface-hover: #1c1f26;
34
- --border: #2c3038; --border-hover: #3b414c;
35
- --text: #e1e4e8; --text-dim: #b0b8c4; --text-muted: #6b7280;
36
- --primary: #f06595; --primary-hover: #f783ac; --primary-bg: rgba(240,101,149,0.1);
37
- --success: #37b24d; --success-bg: rgba(55,178,77,0.1);
38
- --warning: #f08c00; --warning-bg: rgba(240,140,0,0.1);
39
- --danger: #f03e3e; --danger-bg: rgba(240,62,62,0.1);
40
- --shadow: 0 1px 3px rgba(0,0,0,0.3);
41
- }
52
+
53
+ [data-theme="light"] {
54
+ --bg-primary: #f8f9fb;
55
+ --bg-secondary: #ffffff;
56
+ --bg-tertiary: #f1f3f8;
57
+ --bg-hover: #e8ebf0;
58
+ --bg-active: #dde1ea;
59
+ --bg-card: #ffffff;
60
+ --bg-input: #f1f3f8;
61
+ --bg-modal: rgba(0,0,0,0.4);
62
+ --border: #e2e5ed;
63
+ --border-light: #eceef4;
64
+ --text-primary: #111827;
65
+ --text-secondary: #4b5563;
66
+ --text-muted: #9ca3af;
67
+ --text-inverse: #ffffff;
68
+ --shadow: 0 1px 3px rgba(0,0,0,0.08);
69
+ --shadow-lg: 0 4px 12px rgba(0,0,0,0.1);
70
+ --shadow-xl: 0 8px 24px rgba(0,0,0,0.12);
42
71
  }
43
72
 
44
- /* ─── Reset ───────────────────────────────────────────── */
73
+ /* ═══════════════════════════════════════════════════════════
74
+ RESET & BASE
75
+ ═══════════════════════════════════════════════════════════ */
45
76
  *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
46
- body {
47
- font-family: var(--font);
48
- background: var(--bg);
49
- color: var(--text);
50
- line-height: 1.5;
51
- min-height: 100vh;
52
- -webkit-font-smoothing: antialiased;
53
- }
54
- a { color: var(--primary); text-decoration: none; }
77
+ html { font-size: 14px; }
78
+ body { font-family: var(--font); background: var(--bg-primary); color: var(--text-primary); line-height: 1.5; -webkit-font-smoothing: antialiased; }
79
+ a { color: var(--accent-text); text-decoration: none; }
55
80
  a:hover { text-decoration: underline; }
56
- code { font-family: 'SF Mono', 'Fira Code', monospace; font-size: 0.9em; }
57
81
 
58
- /* ─── Login Page ──────────────────────────────────────── */
59
- .login-screen {
60
- display: flex; align-items: center; justify-content: center; min-height: 100vh;
61
- }
62
- .login-box {
63
- width: 380px; max-width: 90vw;
64
- }
65
- .login-box h1 {
66
- text-align: center; font-size: 16px; color: var(--primary); margin-bottom: 6px;
67
- }
68
- .login-box .subtitle {
69
- text-align: center; color: var(--text-muted); font-size: 12px; margin-bottom: 28px;
70
- }
71
- .login-card {
72
- background: var(--surface); border: 1px solid var(--border);
73
- border-radius: var(--radius-lg); padding: 28px;
74
- }
75
- .login-error {
76
- color: var(--danger); font-size: 13px; text-align: center; margin-bottom: 16px;
77
- padding: 10px; background: var(--danger-bg); border-radius: var(--radius);
78
- }
82
+ /* ═══════════════════════════════════════════════════════════
83
+ LOGIN PAGE
84
+ ═══════════════════════════════════════════════════════════ */
85
+ .login-page {
86
+ min-height: 100vh;
87
+ display: flex;
88
+ align-items: center;
89
+ justify-content: center;
90
+ background: var(--bg-primary);
91
+ }
92
+ .login-card {
93
+ background: var(--bg-card);
94
+ border: 1px solid var(--border);
95
+ border-radius: var(--radius-xl);
96
+ padding: 40px;
97
+ width: 400px;
98
+ box-shadow: var(--shadow-xl);
99
+ }
100
+ .login-logo { text-align: center; margin-bottom: 32px; }
101
+ .login-logo h1 { font-size: 22px; font-weight: 700; margin-top: 12px; }
102
+ .login-logo p { color: var(--text-muted); font-size: 13px; margin-top: 4px; }
79
103
 
80
- /* ─── Sidebar ─────────────────────────────────────────── */
81
- .sidebar {
82
- width: 240px; background: var(--surface); border-right: 1px solid var(--border);
83
- display: flex; flex-direction: column; position: fixed; top: 0; bottom: 0; left: 0; z-index: 10;
84
- }
85
- .sidebar-brand {
86
- padding: 20px; font-size: 14px; font-weight: 700;
87
- border-bottom: 1px solid var(--border); color: var(--primary); line-height: 1.4;
88
- }
89
- .sidebar-brand small {
90
- display: block; font-weight: 400; color: var(--text-muted); font-size: 11px; margin-top: 2px;
91
- }
92
- .sidebar-nav { flex: 1; padding: 12px 0; }
93
- .sidebar-nav a {
94
- display: flex; align-items: center; gap: 10px; padding: 10px 20px;
95
- color: var(--text-dim); font-size: 14px; border-left: 3px solid transparent;
96
- transition: all 0.15s;
97
- }
98
- .sidebar-nav a:hover {
99
- background: var(--bg); color: var(--text); text-decoration: none;
100
- }
101
- .sidebar-nav a.active {
102
- color: var(--primary); border-left-color: var(--primary);
103
- background: var(--bg); font-weight: 600;
104
- }
105
- .sidebar-footer {
106
- padding: 16px 20px; border-top: 1px solid var(--border);
107
- font-size: 12px; color: var(--text-muted);
108
- }
109
- .sidebar-footer a { color: var(--danger); font-size: 12px; }
104
+ /* ═══════════════════════════════════════════════════════════
105
+ LAYOUT — Fixed Sidebar
106
+ ═══════════════════════════════════════════════════════════ */
107
+ .app-layout { display: flex; min-height: 100vh; }
110
108
 
111
- /* ─── Main Content ────────────────────────────────────── */
112
- .main {
113
- margin-left: 240px; flex: 1; padding: 32px; max-width: 1100px; width: 100%;
109
+ /* Sidebar */
110
+ .sidebar {
111
+ width: var(--sidebar-w);
112
+ background: var(--bg-secondary);
113
+ border-right: 1px solid var(--border);
114
+ display: flex;
115
+ flex-direction: column;
116
+ position: fixed;
117
+ top: 0;
118
+ left: 0;
119
+ bottom: 0;
120
+ z-index: 50;
121
+ overflow: hidden;
114
122
  }
115
- .page-header { margin-bottom: 28px; }
116
- .page-header h1 { font-size: 22px; font-weight: 700; color: var(--text); }
117
- .page-header p { color: var(--text-muted); font-size: 14px; margin-top: 4px; }
118
123
 
119
- /* ─── Cards ───────────────────────────────────────────── */
120
- .card {
121
- background: var(--surface); border: 1px solid var(--border);
122
- border-radius: var(--radius-lg); padding: 20px; margin-bottom: 20px;
123
- box-shadow: var(--shadow);
124
- }
125
- .card h3 {
126
- font-size: 14px; font-weight: 600; margin-bottom: 14px; color: var(--text-dim);
127
- }
128
- .card-header {
129
- display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px;
124
+ /* Brand */
125
+ .sidebar-brand {
126
+ padding: 16px;
127
+ border-bottom: 1px solid var(--border);
128
+ display: flex;
129
+ align-items: center;
130
+ gap: 10px;
131
+ min-height: 57px;
132
+ }
133
+ .sidebar-brand img { flex-shrink: 0; }
134
+ .sidebar-brand h2 { font-size: 15px; font-weight: 700; }
135
+ .sidebar-brand p {
136
+ font-size: 11px;
137
+ color: var(--text-muted);
138
+ background: var(--bg-tertiary);
139
+ padding: 2px 6px;
140
+ border-radius: 4px;
130
141
  }
131
142
 
132
- /* ─── Stat Cards ──────────────────────────────────────── */
133
- .stats-grid {
134
- display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
135
- gap: 16px; margin-bottom: 24px;
143
+ /* Nav sections */
144
+ .sidebar-nav {
145
+ flex: 1;
146
+ overflow-y: auto;
147
+ overflow-x: hidden;
148
+ padding: 8px;
149
+ }
150
+ .sidebar-section { margin-top: 8px; }
151
+ .sidebar-section-title {
152
+ font-size: 10px;
153
+ font-weight: 600;
154
+ text-transform: uppercase;
155
+ letter-spacing: 0.08em;
156
+ color: var(--text-muted);
157
+ padding: 4px 12px 8px;
136
158
  }
137
- .stat-card {
138
- background: var(--surface); border: 1px solid var(--border);
139
- border-radius: var(--radius-lg); padding: 20px;
159
+
160
+ /* Nav items */
161
+ .nav-item {
162
+ display: flex;
163
+ align-items: center;
164
+ gap: 10px;
165
+ padding: 8px 12px;
166
+ border-radius: var(--radius);
167
+ color: var(--text-secondary);
168
+ cursor: pointer;
169
+ transition: all var(--transition);
170
+ font-size: 13px;
171
+ font-weight: 500;
172
+ white-space: nowrap;
173
+ text-decoration: none;
174
+ border: none;
175
+ background: none;
176
+ width: 100%;
177
+ text-align: left;
178
+ }
179
+ .nav-item:hover {
180
+ background: var(--bg-hover);
181
+ color: var(--text-primary);
182
+ }
183
+ .nav-item.active {
184
+ background: var(--accent-soft);
185
+ color: var(--accent-text);
186
+ }
187
+ .nav-item svg { width: 18px; height: 18px; flex-shrink: 0; }
188
+ .nav-item .badge {
189
+ margin-left: auto;
190
+ background: var(--danger);
191
+ color: white;
192
+ font-size: 10px;
193
+ padding: 1px 6px;
194
+ border-radius: 10px;
195
+ font-weight: 600;
140
196
  }
141
- .stat-card .label {
142
- font-size: 11px; color: var(--text-muted); text-transform: uppercase;
143
- letter-spacing: 0.06em; margin-bottom: 6px;
197
+
198
+ /* Sidebar footer */
199
+ .sidebar-footer {
200
+ padding: 12px;
201
+ border-top: 1px solid var(--border);
202
+ }
203
+ .sidebar-user {
204
+ display: flex;
205
+ align-items: center;
206
+ gap: 10px;
207
+ padding: 8px;
208
+ border-radius: var(--radius);
209
+ }
210
+ .sidebar-user .avatar {
211
+ width: 32px;
212
+ height: 32px;
213
+ border-radius: 50%;
214
+ background: var(--accent-soft);
215
+ color: var(--accent-text);
216
+ display: flex;
217
+ align-items: center;
218
+ justify-content: center;
219
+ font-weight: 600;
220
+ font-size: 13px;
221
+ flex-shrink: 0;
222
+ }
223
+ .sidebar-user .user-info { flex: 1; min-width: 0; }
224
+ .sidebar-user .user-name {
225
+ font-size: 13px;
226
+ font-weight: 600;
227
+ white-space: nowrap;
228
+ overflow: hidden;
229
+ text-overflow: ellipsis;
230
+ }
231
+ .sidebar-user .user-role {
232
+ font-size: 11px;
233
+ color: var(--text-muted);
144
234
  }
145
- .stat-card .value {
146
- font-size: 28px; font-weight: 700; color: var(--text); letter-spacing: -0.03em;
235
+
236
+ /* Main content area */
237
+ .main-content {
238
+ margin-left: var(--sidebar-w);
239
+ width: calc(100% - var(--sidebar-w));
240
+ min-height: 100vh;
241
+ display: flex;
242
+ flex-direction: column;
147
243
  }
148
- .stat-card .value.pink { color: var(--primary); }
149
244
 
150
- /* ─── Tables ──────────────────────────────────────────── */
151
- .table-wrap { overflow-x: auto; }
152
- table { width: 100%; border-collapse: collapse; font-size: 14px; }
153
- th {
154
- text-align: left; padding: 10px 12px; color: var(--text-muted);
155
- font-weight: 600; font-size: 12px; text-transform: uppercase;
156
- letter-spacing: 0.05em; border-bottom: 2px solid var(--border);
157
- }
158
- td {
159
- padding: 10px 12px; border-bottom: 1px solid var(--border);
160
- color: var(--text-dim); vertical-align: middle;
161
- }
162
- tr:hover td { background: var(--surface-hover); }
245
+ /* Page content */
246
+ .page-content {
247
+ flex: 1;
248
+ padding: 24px;
249
+ width: 100%;
250
+ }
163
251
 
164
- /* ─── Badges ──────────────────────────────────────────── */
165
- .badge {
166
- display: inline-block; padding: 3px 10px; border-radius: 999px;
167
- font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.03em;
168
- }
169
- .badge-default { background: var(--bg); color: var(--text-muted); border: 1px solid var(--border); }
170
- .badge-success, .badge-active { background: var(--success-bg); color: var(--success); }
171
- .badge-danger, .badge-archived, .badge-revoked { background: var(--danger-bg); color: var(--danger); }
172
- .badge-warning, .badge-pending { background: var(--warning-bg); color: var(--warning); }
173
- .badge-primary, .badge-admin { background: var(--primary-bg); color: var(--primary); }
174
- .badge-owner { background: var(--warning-bg); color: var(--warning); }
175
- .badge-member { background: rgba(136,136,160,0.08); color: var(--text-dim); }
176
- .badge-viewer { background: rgba(136,136,160,0.06); color: var(--text-muted); }
252
+ /* ═══════════════════════════════════════════════════════════
253
+ COMPONENTS
254
+ ═══════════════════════════════════════════════════════════ */
255
+ .page-title {
256
+ font-size: 24px;
257
+ font-weight: 700;
258
+ margin-bottom: 24px;
259
+ }
177
260
 
178
- /* ─── Forms ───────────────────────────────────────────── */
179
261
  .form-group { margin-bottom: 16px; }
180
- .form-group label {
181
- display: block; font-size: 13px; font-weight: 600;
182
- color: var(--text-dim); margin-bottom: 5px;
183
- }
184
- .form-group input,
185
- .form-group select,
186
- .form-group textarea {
187
- width: 100%; padding: 9px 12px; border: 1px solid var(--border);
188
- border-radius: var(--radius); background: var(--bg); color: var(--text);
189
- font-size: 14px; outline: none; transition: border-color 0.15s;
190
- }
191
- .form-group input:focus,
192
- .form-group select:focus,
193
- .form-group textarea:focus { border-color: var(--primary); }
194
- .form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
262
+ .form-label {
263
+ display: block;
264
+ font-size: 12px;
265
+ font-weight: 600;
266
+ color: var(--text-secondary);
267
+ margin-bottom: 6px;
268
+ }
195
269
 
196
- /* ─── Buttons ─────────────────────────────────────────── */
197
- .btn {
198
- display: inline-flex; align-items: center; justify-content: center; gap: 6px;
199
- padding: 8px 18px; border-radius: var(--radius); font-size: 13px;
200
- font-weight: 600; border: 1px solid var(--border); background: var(--surface);
201
- color: var(--text-dim); cursor: pointer; transition: all 0.15s; text-decoration: none;
202
- }
203
- .btn:hover { background: var(--surface-hover); text-decoration: none; }
204
- .btn-primary { background: var(--primary); color: #fff; border-color: var(--primary); }
205
- .btn-primary:hover { background: var(--primary-hover); opacity: 0.9; color: #fff; }
206
- .btn-danger { background: var(--danger); color: #fff; border-color: var(--danger); }
207
- .btn-danger:hover { opacity: 0.9; color: #fff; }
208
- .btn-sm { padding: 5px 12px; font-size: 12px; }
209
- .btn-block { width: 100%; }
270
+ .input {
271
+ width: 100%;
272
+ padding: 8px 12px;
273
+ background: var(--bg-input);
274
+ border: 1px solid var(--border);
275
+ border-radius: var(--radius);
276
+ color: var(--text-primary);
277
+ font-size: 13px;
278
+ font-family: var(--font);
279
+ transition: border-color var(--transition);
280
+ outline: none;
281
+ }
282
+ .input:focus {
283
+ border-color: var(--accent);
284
+ box-shadow: 0 0 0 2px var(--accent-soft);
285
+ }
286
+ .input::placeholder { color: var(--text-muted); }
210
287
 
211
- /* ─── Modals ──────────────────────────────────────────── */
212
- .modal-overlay {
213
- display: none; position: fixed; inset: 0;
214
- background: rgba(0,0,0,0.6); align-items: center; justify-content: center; z-index: 100;
215
- }
216
- .modal-overlay.open { display: flex; }
217
- .modal {
218
- background: var(--surface); border: 1px solid var(--border);
219
- border-radius: var(--radius-lg); padding: 24px; width: 440px;
220
- max-width: 90vw; box-shadow: 0 20px 60px rgba(0,0,0,0.5);
221
- }
222
- .modal h3 { font-size: 16px; font-weight: 700; margin-bottom: 16px; }
223
- .modal-actions { display: flex; gap: 8px; justify-content: flex-end; margin-top: 20px; }
288
+ .btn {
289
+ display: inline-flex;
290
+ align-items: center;
291
+ gap: 5px;
292
+ padding: 6px 12px;
293
+ border-radius: var(--radius);
294
+ font-size: 12px;
295
+ font-weight: 500;
296
+ border: 1px solid transparent;
297
+ cursor: pointer;
298
+ transition: all var(--transition);
299
+ font-family: var(--font);
300
+ line-height: 1.4;
301
+ text-decoration: none;
302
+ }
303
+ .btn:disabled { opacity: 0.5; cursor: not-allowed; }
304
+ .btn-primary {
305
+ background: var(--accent);
306
+ color: white;
307
+ }
308
+ .btn-primary:hover:not(:disabled) {
309
+ background: var(--accent-hover);
310
+ }
311
+ .btn-secondary {
312
+ background: transparent;
313
+ color: var(--text-secondary);
314
+ border-color: var(--border);
315
+ }
316
+ .btn-secondary:hover:not(:disabled) {
317
+ background: var(--bg-hover);
318
+ color: var(--text-primary);
319
+ border-color: var(--border-light);
320
+ }
321
+ .btn-danger {
322
+ background: var(--danger);
323
+ color: white;
324
+ }
325
+ .btn-danger:hover:not(:disabled) {
326
+ background: var(--danger-hover);
327
+ }
328
+ .btn-sm { padding: 3px 8px; font-size: 11px; }
329
+ .btn-lg { padding: 8px 16px; font-size: 13px; }
224
330
 
225
- /* ─── Flash Messages ──────────────────────────────────── */
226
- .flash {
227
- padding: 12px 16px; border-radius: var(--radius); margin-bottom: 20px;
228
- font-size: 14px; border: 1px solid var(--border);
229
- }
230
- .flash-success { background: var(--success-bg); border-color: var(--success); color: var(--success); }
231
- .flash-danger { background: var(--danger-bg); border-color: var(--danger); color: var(--danger); }
232
- .flash-info { background: var(--primary-bg); border-color: var(--primary); color: var(--primary); }
331
+ .card {
332
+ background: var(--bg-card);
333
+ border: 1px solid var(--border);
334
+ border-radius: var(--radius-lg);
335
+ overflow: hidden;
336
+ }
337
+ .card-header {
338
+ padding: 16px 20px;
339
+ border-bottom: 1px solid var(--border);
340
+ display: flex;
341
+ align-items: center;
342
+ justify-content: space-between;
343
+ }
344
+ .card-header h3 {
345
+ font-size: 14px;
346
+ font-weight: 600;
347
+ }
348
+ .card-body { padding: 20px; }
233
349
 
234
- /* ─── Toast ───────────────────────────────────────────── */
235
- .toast {
236
- position: fixed; bottom: 24px; right: 24px; padding: 12px 20px;
237
- background: var(--surface); border: 1px solid var(--success);
238
- border-radius: var(--radius); font-size: 13px; z-index: 200;
239
- display: none; animation: slideUp 0.2s ease;
240
- }
241
- .toast.error { border-color: var(--danger); }
242
- .toast.show { display: block; }
243
- @keyframes slideUp { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } }
350
+ .badge {
351
+ display: inline-flex;
352
+ align-items: center;
353
+ padding: 2px 8px;
354
+ border-radius: 12px;
355
+ font-size: 11px;
356
+ font-weight: 600;
357
+ }
358
+ .badge-primary {
359
+ background: var(--accent-soft);
360
+ color: var(--accent-text);
361
+ }
362
+ .badge-success {
363
+ background: var(--success-soft);
364
+ color: var(--success);
365
+ }
366
+ .badge-warning {
367
+ background: var(--warning-soft);
368
+ color: var(--warning);
369
+ }
370
+ .badge-danger {
371
+ background: var(--danger-soft);
372
+ color: var(--danger);
373
+ }
374
+ .badge-info {
375
+ background: var(--info-soft);
376
+ color: var(--info);
377
+ }
244
378
 
245
- /* ─── Pagination ──────────────────────────────────────── */
246
- .pagination { display: flex; gap: 8px; margin-top: 20px; align-items: center; }
247
- .pagination a, .pagination span {
248
- padding: 6px 14px; border-radius: var(--radius); font-size: 13px;
249
- border: 1px solid var(--border); background: var(--surface); color: var(--text-dim);
250
- }
251
- .pagination a:hover { background: var(--surface-hover); text-decoration: none; }
252
- .pagination span.current { background: var(--primary); color: #fff; border-color: var(--primary); }
379
+ table { width: 100%; border-collapse: collapse; }
380
+ thead th {
381
+ text-align: left;
382
+ padding: 10px 16px;
383
+ font-size: 11px;
384
+ font-weight: 600;
385
+ text-transform: uppercase;
386
+ letter-spacing: 0.05em;
387
+ color: var(--text-muted);
388
+ border-bottom: 1px solid var(--border);
389
+ background: var(--bg-tertiary);
390
+ }
391
+ tbody td {
392
+ padding: 12px 16px;
393
+ border-bottom: 1px solid var(--border);
394
+ font-size: 13px;
395
+ }
396
+ tbody tr:last-child td { border-bottom: none; }
397
+ tbody tr:hover { background: var(--bg-hover); }
253
398
 
254
- /* ─── Empty State ─────────────────────────────────────── */
255
- .empty { text-align: center; padding: 48px 20px; color: var(--text-muted); font-size: 14px; }
256
- .empty .icon { font-size: 36px; margin-bottom: 12px; display: block; }
399
+ .stat-card {
400
+ background: var(--bg-card);
401
+ border: 1px solid var(--border);
402
+ border-radius: var(--radius-lg);
403
+ padding: 20px;
404
+ }
405
+ .stat-card .stat-label {
406
+ font-size: 12px;
407
+ color: var(--text-muted);
408
+ font-weight: 500;
409
+ }
410
+ .stat-card .stat-value {
411
+ font-size: 28px;
412
+ font-weight: 700;
413
+ margin-top: 4px;
414
+ }
415
+ .stat-card .stat-change {
416
+ font-size: 12px;
417
+ margin-top: 4px;
418
+ }
419
+ .stat-grid {
420
+ display: grid;
421
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
422
+ gap: 16px;
423
+ margin-bottom: 24px;
424
+ }
257
425
 
258
- /* ─── Key Banner (API key reveal) ─────────────────────── */
259
- .key-banner {
260
- background: var(--warning-bg); border: 1px solid var(--warning);
261
- border-radius: var(--radius); padding: 14px 18px; margin-bottom: 20px;
262
- font-size: 13px; color: var(--warning);
426
+ .empty-state {
427
+ text-align: center;
428
+ padding: 48px 24px;
429
+ }
430
+ .empty-state h3 {
431
+ font-size: 15px;
432
+ font-weight: 600;
433
+ margin-bottom: 4px;
263
434
  }
264
- .key-banner code {
265
- display: block; margin-top: 6px; padding: 8px 12px; background: var(--bg);
266
- border-radius: var(--radius); font-size: 12px; color: var(--text);
267
- word-break: break-all;
435
+ .empty-state p {
436
+ color: var(--text-muted);
437
+ font-size: 13px;
438
+ margin-bottom: 16px;
268
439
  }
269
440
 
270
- /* ─── Dark Mode Toggle ────────────────────────────────── */
271
- .theme-toggle {
272
- cursor: pointer; background: none; border: none;
273
- color: var(--text-muted); font-size: 16px; padding: 4px;
441
+ /* Status indicators */
442
+ .status-running { color: var(--success); }
443
+ .status-stopped { color: var(--text-muted); }
444
+ .status-error { color: var(--danger); }
445
+ .status-paused { color: var(--warning); }
446
+
447
+ /* Alerts */
448
+ .alert {
449
+ padding: 12px 16px;
450
+ border-radius: var(--radius);
451
+ margin-bottom: 16px;
452
+ font-size: 13px;
453
+ }
454
+ .alert-success {
455
+ background: var(--success-soft);
456
+ border: 1px solid var(--success);
457
+ color: var(--success);
458
+ }
459
+ .alert-error {
460
+ background: var(--danger-soft);
461
+ border: 1px solid var(--danger);
462
+ color: var(--danger);
274
463
  }
275
464
 
276
- /* ─── Responsive ──────────────────────────────────────── */
465
+ /* Responsive */
277
466
  @media (max-width: 768px) {
278
- .sidebar { width: 56px; }
279
- .sidebar-brand, .sidebar-nav a span, .sidebar-footer { display: none; }
280
- .sidebar-nav a { justify-content: center; padding: 14px 0; font-size: 18px; }
281
- .main { margin-left: 56px; padding: 16px; }
282
- .form-row { grid-template-columns: 1fr; }
283
- .stats-grid { grid-template-columns: 1fr 1fr; }
467
+ .sidebar {
468
+ transform: translateX(-100%);
469
+ width: var(--sidebar-w);
470
+ }
471
+ .sidebar.open {
472
+ transform: translateX(0);
473
+ }
474
+ .main-content {
475
+ margin-left: 0 !important;
476
+ width: 100% !important;
477
+ }
478
+ .stat-grid {
479
+ grid-template-columns: 1fr 1fr;
480
+ }
284
481
  }
482
+
483
+ /* Scrollbar */
484
+ ::-webkit-scrollbar { width: 6px; }
485
+ ::-webkit-scrollbar-track { background: transparent; }
486
+ ::-webkit-scrollbar-thumb { background: var(--border); border-radius: 3px; }
487
+ ::-webkit-scrollbar-thumb:hover { background: var(--border-light); }