@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,149 +1,546 @@
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
- /* --- Setup Banner --- */
59
- #setup-banner { display: none; background: var(--warning-bg); border: 1px solid var(--warning); border-radius: var(--radius); padding: 16px 20px; margin: 20px; }
82
+ /* ═══════════════════════════════════════════════════════════
83
+ SETUP BANNER
84
+ ═══════════════════════════════════════════════════════════ */
85
+ #setup-banner {
86
+ display: none;
87
+ background: var(--warning-soft);
88
+ border: 1px solid var(--warning);
89
+ border-radius: var(--radius);
90
+ padding: 16px 20px;
91
+ margin: 20px;
92
+ }
60
93
  #setup-banner h3 { color: var(--warning); margin-bottom: 8px; }
61
- #setup-banner input { padding: 8px 12px; background: var(--bg); border: 1px solid var(--border); border-radius: var(--radius); color: var(--text); font-size: 14px; width: 400px; max-width: 100%; }
62
- #setup-banner button { padding: 8px 16px; background: var(--warning); border: none; border-radius: var(--radius); color: #000; font-weight: 600; cursor: pointer; margin-left: 8px; }
63
-
64
- /* --- Login --- */
65
- #login-screen { display: flex; align-items: center; justify-content: center; min-height: 100vh; }
66
- #login-box { width: 380px; max-width: 90vw; }
67
- #login-box h1 { text-align: center; font-size: 22px; margin-bottom: 4px; }
68
- #login-box .subtitle { text-align: center; color: var(--text-dim); font-size: 13px; margin-bottom: 32px; }
69
- #login-error { display: none; background: var(--danger-bg); border: 1px solid var(--danger); border-radius: var(--radius); padding: 10px 14px; margin-bottom: 16px; font-size: 13px; color: var(--danger); }
70
- .form-group { margin-bottom: 14px; }
71
- .form-label { display: block; font-size: 12px; color: var(--text-dim); margin-bottom: 4px; font-weight: 500; }
72
- .input { width: 100%; padding: 10px 14px; background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius); color: var(--text); font-size: 14px; outline: none; transition: border-color 0.15s; }
73
- .input:focus { border-color: var(--primary); }
74
- .btn { display: inline-flex; align-items: center; justify-content: center; gap: 6px; padding: 10px 20px; border-radius: var(--radius); font-size: 14px; font-weight: 600; cursor: pointer; border: 1px solid var(--border); background: var(--surface); color: var(--text); transition: all 0.15s; text-decoration: none; }
75
- .btn:hover { border-color: var(--border-hover); background: var(--surface-hover); }
76
- .btn-primary { background: var(--primary); border-color: var(--primary); color: #fff; width: 100%; }
77
- .btn-primary:hover { background: var(--primary-hover); }
78
- .btn-sm { padding: 6px 12px; font-size: 12px; }
79
- .btn-danger { color: var(--danger); border-color: var(--danger); }
80
- .btn-danger:hover { background: var(--danger-bg); }
81
-
82
- /* --- Layout --- */
94
+ #setup-banner input {
95
+ padding: 8px 12px;
96
+ background: var(--bg-input);
97
+ border: 1px solid var(--border);
98
+ border-radius: var(--radius);
99
+ color: var(--text-primary);
100
+ font-size: 14px;
101
+ width: 400px;
102
+ max-width: 100%;
103
+ }
104
+ #setup-banner button {
105
+ padding: 8px 16px;
106
+ background: var(--warning);
107
+ border: none;
108
+ border-radius: var(--radius);
109
+ color: var(--text-inverse);
110
+ font-weight: 600;
111
+ cursor: pointer;
112
+ margin-left: 8px;
113
+ }
114
+
115
+ /* ═══════════════════════════════════════════════════════════
116
+ LOGIN PAGE
117
+ ═══════════════════════════════════════════════════════════ */
118
+ #login-screen {
119
+ display: flex;
120
+ align-items: center;
121
+ justify-content: center;
122
+ min-height: 100vh;
123
+ background: var(--bg-primary);
124
+ }
125
+ #login-box {
126
+ background: var(--bg-card);
127
+ border: 1px solid var(--border);
128
+ border-radius: var(--radius-xl);
129
+ padding: 40px;
130
+ width: 400px;
131
+ box-shadow: var(--shadow-xl);
132
+ }
133
+ #login-box h1 {
134
+ text-align: center;
135
+ font-size: 22px;
136
+ font-weight: 700;
137
+ margin-bottom: 4px;
138
+ }
139
+ #login-box .subtitle {
140
+ text-align: center;
141
+ color: var(--text-muted);
142
+ font-size: 13px;
143
+ margin-bottom: 32px;
144
+ }
145
+ #login-error {
146
+ display: none;
147
+ background: var(--danger-soft);
148
+ border: 1px solid var(--danger);
149
+ border-radius: var(--radius);
150
+ padding: 10px 14px;
151
+ margin-bottom: 16px;
152
+ font-size: 13px;
153
+ color: var(--danger);
154
+ }
155
+
156
+ /* ═══════════════════════════════════════════════════════════
157
+ LAYOUT — Fixed Sidebar
158
+ ═══════════════════════════════════════════════════════════ */
83
159
  #app { display: none; }
84
160
  .layout { display: flex; min-height: 100vh; }
85
- .sidebar { width: 240px; background: var(--surface); border-right: 1px solid var(--border); position: fixed; top: 0; left: 0; bottom: 0; display: flex; flex-direction: column; }
86
- .sidebar-header { padding: 20px; border-bottom: 1px solid var(--border); }
87
- .sidebar-header h2 { font-size: 16px; letter-spacing: -0.02em; }
88
- .sidebar-header h2 em { font-style: normal; color: var(--primary); }
89
- .sidebar-header p { font-size: 11px; color: var(--text-muted); margin-top: 2px; }
90
- .nav { flex: 1; padding: 8px 0; }
91
- .nav-section { font-size: 10px; text-transform: uppercase; letter-spacing: 0.08em; color: var(--text-muted); padding: 12px 20px 4px; }
92
- .nav-item { display: flex; align-items: center; gap: 10px; padding: 10px 20px; color: var(--text-dim); cursor: pointer; font-size: 13px; border: none; background: none; width: 100%; text-align: left; transition: all 0.1s; }
93
- .nav-item:hover { color: var(--text); background: rgba(255,255,255,0.03); }
94
- .nav-item.active { color: var(--primary); background: var(--primary-bg); border-right: 2px solid var(--primary); }
95
- .sidebar-footer { padding: 16px 20px; border-top: 1px solid var(--border); font-size: 12px; }
96
- .sidebar-footer .name { color: var(--text-dim); }
97
- .sidebar-footer .email { color: var(--text-muted); font-size: 11px; }
98
- .sidebar-footer a { color: var(--text-muted); font-size: 11px; cursor: pointer; margin-top: 6px; display: inline-block; }
99
-
100
- .content { flex: 1; margin-left: 240px; padding: 32px; max-width: 1100px; }
101
- .page-title { font-size: 22px; font-weight: 700; letter-spacing: -0.02em; margin-bottom: 4px; }
102
- .page-desc { font-size: 13px; color: var(--text-dim); margin-bottom: 24px; }
103
-
104
- /* --- Cards & Stats --- */
105
- .stats-row { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 16px; margin-bottom: 24px; }
106
- .stat-card { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 20px; }
107
- .stat-card .label { font-size: 11px; color: var(--text-muted); text-transform: uppercase; letter-spacing: 0.06em; }
108
- .stat-card .value { font-size: 30px; font-weight: 700; margin-top: 4px; letter-spacing: -0.03em; }
109
-
110
- .card { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 20px; margin-bottom: 16px; box-shadow: var(--shadow); }
111
- .card-header { display: flex; justify-content: space-between; align-items: center; margin-bottom: 16px; }
112
- .card-title { font-size: 13px; color: var(--text-dim); text-transform: uppercase; letter-spacing: 0.05em; font-weight: 600; }
113
-
114
- /* --- Table --- */
115
- .table-wrap { overflow-x: auto; }
116
- table { width: 100%; border-collapse: collapse; font-size: 13px; }
117
- th { text-align: left; padding: 10px 12px; color: var(--text-muted); font-weight: 600; font-size: 11px; text-transform: uppercase; letter-spacing: 0.05em; border-bottom: 1px solid var(--border); }
118
- td { padding: 12px; border-bottom: 1px solid var(--border); }
119
- tr:hover td { background: rgba(255,255,255,0.015); }
120
- .badge { display: inline-block; padding: 2px 10px; border-radius: 999px; font-size: 11px; font-weight: 600; }
121
- .badge-active { background: var(--success-bg); color: var(--success); }
122
- .badge-archived { background: rgba(136,136,160,0.12); color: var(--text-dim); }
123
- .badge-suspended { background: var(--danger-bg); color: var(--danger); }
124
- .badge-owner { background: var(--warning-bg); color: var(--warning); }
125
- .badge-admin { background: var(--primary-bg); color: var(--primary); }
126
- .badge-member { background: rgba(136,136,160,0.08); color: var(--text-dim); }
127
- .badge-viewer { background: rgba(136,136,160,0.06); color: var(--text-muted); }
128
- .empty { text-align: center; padding: 48px 20px; color: var(--text-muted); }
129
- .empty-icon { font-size: 36px; margin-bottom: 10px; }
130
-
131
- /* --- Modal --- */
132
- .modal-overlay { display: none; position: fixed; inset: 0; background: rgba(0,0,0,0.6); align-items: center; justify-content: center; z-index: 100; }
133
- .modal-overlay.open { display: flex; }
134
- .modal { background: var(--surface); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 24px; width: 440px; max-width: 90vw; box-shadow: 0 20px 60px rgba(0,0,0,0.5); }
135
- .modal h3 { font-size: 16px; font-weight: 700; margin-bottom: 16px; }
136
- .modal-actions { display: flex; gap: 8px; justify-content: flex-end; margin-top: 20px; }
137
-
138
- /* --- Toast --- */
139
- #toast { position: fixed; bottom: 24px; right: 24px; padding: 12px 20px; background: var(--surface); border: 1px solid var(--success); border-radius: var(--radius); font-size: 13px; z-index: 200; display: none; animation: slideUp 0.2s ease; }
140
- #toast.error { border-color: var(--danger); }
141
- @keyframes slideUp { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } }
142
-
143
- /* --- Responsive --- */
161
+
162
+ /* Sidebar: fixed width professional style */
163
+ .sidebar {
164
+ width: var(--sidebar-w);
165
+ background: var(--bg-secondary);
166
+ border-right: 1px solid var(--border);
167
+ display: flex;
168
+ flex-direction: column;
169
+ position: fixed;
170
+ top: 0;
171
+ left: 0;
172
+ bottom: 0;
173
+ z-index: 50;
174
+ overflow: hidden;
175
+ }
176
+
177
+ /* Brand */
178
+ .sidebar-header {
179
+ padding: 16px;
180
+ border-bottom: 1px solid var(--border);
181
+ display: flex;
182
+ align-items: center;
183
+ gap: 10px;
184
+ min-height: 57px;
185
+ }
186
+ .sidebar-header h2 {
187
+ font-size: 15px;
188
+ font-weight: 700;
189
+ }
190
+ .sidebar-header p {
191
+ font-size: 11px;
192
+ color: var(--text-muted);
193
+ background: var(--bg-tertiary);
194
+ padding: 2px 6px;
195
+ border-radius: 4px;
196
+ }
197
+
198
+ /* Nav sections */
199
+ .nav {
200
+ flex: 1;
201
+ overflow-y: auto;
202
+ overflow-x: hidden;
203
+ padding: 8px;
204
+ }
205
+ .nav-section {
206
+ font-size: 10px;
207
+ font-weight: 600;
208
+ text-transform: uppercase;
209
+ letter-spacing: 0.08em;
210
+ color: var(--text-muted);
211
+ padding: 4px 12px 8px;
212
+ margin-top: 8px;
213
+ }
214
+
215
+ /* Nav items */
216
+ .nav-item {
217
+ display: flex;
218
+ align-items: center;
219
+ gap: 10px;
220
+ padding: 8px 12px;
221
+ border-radius: var(--radius);
222
+ color: var(--text-secondary);
223
+ cursor: pointer;
224
+ transition: all var(--transition);
225
+ font-size: 13px;
226
+ font-weight: 500;
227
+ border: none;
228
+ background: none;
229
+ width: 100%;
230
+ text-align: left;
231
+ }
232
+ .nav-item:hover {
233
+ background: var(--bg-hover);
234
+ color: var(--text-primary);
235
+ }
236
+ .nav-item.active {
237
+ background: var(--accent-soft);
238
+ color: var(--accent-text);
239
+ }
240
+ .nav-item svg {
241
+ width: 18px;
242
+ height: 18px;
243
+ flex-shrink: 0;
244
+ }
245
+ .nav-item .badge {
246
+ margin-left: auto;
247
+ background: var(--danger);
248
+ color: white;
249
+ font-size: 10px;
250
+ padding: 1px 6px;
251
+ border-radius: 10px;
252
+ font-weight: 600;
253
+ }
254
+
255
+ /* Sidebar footer */
256
+ .sidebar-footer {
257
+ padding: 12px;
258
+ border-top: 1px solid var(--border);
259
+ }
260
+ .sidebar-footer .name {
261
+ font-size: 13px;
262
+ font-weight: 600;
263
+ color: var(--text-primary);
264
+ }
265
+ .sidebar-footer .email {
266
+ font-size: 11px;
267
+ color: var(--text-muted);
268
+ }
269
+ .sidebar-footer a {
270
+ font-size: 11px;
271
+ color: var(--text-muted);
272
+ cursor: pointer;
273
+ margin-top: 6px;
274
+ display: inline-block;
275
+ }
276
+
277
+ /* Main content area */
278
+ .content {
279
+ margin-left: var(--sidebar-w);
280
+ width: calc(100% - var(--sidebar-w));
281
+ min-height: 100vh;
282
+ display: flex;
283
+ flex-direction: column;
284
+ padding: 24px;
285
+ }
286
+
287
+ /* ═══════════════════════════════════════════════════════════
288
+ COMPONENTS
289
+ ═══════════════════════════════════════════════════════════ */
290
+ .form-group { margin-bottom: 16px; }
291
+ .form-label {
292
+ display: block;
293
+ font-size: 12px;
294
+ font-weight: 600;
295
+ color: var(--text-secondary);
296
+ margin-bottom: 6px;
297
+ }
298
+
299
+ .input {
300
+ width: 100%;
301
+ padding: 8px 12px;
302
+ background: var(--bg-input);
303
+ border: 1px solid var(--border);
304
+ border-radius: var(--radius);
305
+ color: var(--text-primary);
306
+ font-size: 13px;
307
+ font-family: var(--font);
308
+ transition: border-color var(--transition);
309
+ outline: none;
310
+ }
311
+ .input:focus {
312
+ border-color: var(--accent);
313
+ box-shadow: 0 0 0 2px var(--accent-soft);
314
+ }
315
+ .input::placeholder { color: var(--text-muted); }
316
+
317
+ .btn {
318
+ display: inline-flex;
319
+ align-items: center;
320
+ gap: 5px;
321
+ padding: 6px 12px;
322
+ border-radius: var(--radius);
323
+ font-size: 12px;
324
+ font-weight: 500;
325
+ border: 1px solid transparent;
326
+ cursor: pointer;
327
+ transition: all var(--transition);
328
+ font-family: var(--font);
329
+ line-height: 1.4;
330
+ text-decoration: none;
331
+ }
332
+ .btn:disabled { opacity: 0.5; cursor: not-allowed; }
333
+ .btn-primary {
334
+ background: var(--accent);
335
+ color: white;
336
+ width: 100%;
337
+ }
338
+ .btn-primary:hover:not(:disabled) {
339
+ background: var(--accent-hover);
340
+ }
341
+ .btn-secondary {
342
+ background: transparent;
343
+ color: var(--text-secondary);
344
+ border-color: var(--border);
345
+ }
346
+ .btn-secondary:hover:not(:disabled) {
347
+ background: var(--bg-hover);
348
+ color: var(--text-primary);
349
+ border-color: var(--border-light);
350
+ }
351
+ .btn-danger {
352
+ background: var(--danger);
353
+ color: white;
354
+ }
355
+ .btn-danger:hover:not(:disabled) {
356
+ background: var(--danger-hover);
357
+ }
358
+ .btn-sm { padding: 3px 8px; font-size: 11px; }
359
+ .btn-lg { padding: 8px 16px; font-size: 13px; }
360
+
361
+ .card {
362
+ background: var(--bg-card);
363
+ border: 1px solid var(--border);
364
+ border-radius: var(--radius-lg);
365
+ overflow: hidden;
366
+ }
367
+ .card-header {
368
+ padding: 16px 20px;
369
+ border-bottom: 1px solid var(--border);
370
+ display: flex;
371
+ align-items: center;
372
+ justify-content: space-between;
373
+ }
374
+ .card-header h3 {
375
+ font-size: 14px;
376
+ font-weight: 600;
377
+ }
378
+ .card-body { padding: 20px; }
379
+
380
+ .badge {
381
+ display: inline-flex;
382
+ align-items: center;
383
+ padding: 2px 8px;
384
+ border-radius: 12px;
385
+ font-size: 11px;
386
+ font-weight: 600;
387
+ }
388
+ .badge-primary {
389
+ background: var(--accent-soft);
390
+ color: var(--accent-text);
391
+ }
392
+ .badge-success {
393
+ background: var(--success-soft);
394
+ color: var(--success);
395
+ }
396
+ .badge-warning {
397
+ background: var(--warning-soft);
398
+ color: var(--warning);
399
+ }
400
+ .badge-danger {
401
+ background: var(--danger-soft);
402
+ color: var(--danger);
403
+ }
404
+ .badge-info {
405
+ background: var(--info-soft);
406
+ color: var(--info);
407
+ }
408
+
409
+ table { width: 100%; border-collapse: collapse; }
410
+ thead th {
411
+ text-align: left;
412
+ padding: 10px 16px;
413
+ font-size: 11px;
414
+ font-weight: 600;
415
+ text-transform: uppercase;
416
+ letter-spacing: 0.05em;
417
+ color: var(--text-muted);
418
+ border-bottom: 1px solid var(--border);
419
+ background: var(--bg-tertiary);
420
+ }
421
+ tbody td {
422
+ padding: 12px 16px;
423
+ border-bottom: 1px solid var(--border);
424
+ font-size: 13px;
425
+ }
426
+ tbody tr:last-child td { border-bottom: none; }
427
+ tbody tr:hover { background: var(--bg-hover); }
428
+
429
+ .stat-card {
430
+ background: var(--bg-card);
431
+ border: 1px solid var(--border);
432
+ border-radius: var(--radius-lg);
433
+ padding: 20px;
434
+ }
435
+ .stat-card .stat-label {
436
+ font-size: 12px;
437
+ color: var(--text-muted);
438
+ font-weight: 500;
439
+ }
440
+ .stat-card .stat-value {
441
+ font-size: 28px;
442
+ font-weight: 700;
443
+ margin-top: 4px;
444
+ }
445
+ .stat-card .stat-change {
446
+ font-size: 12px;
447
+ margin-top: 4px;
448
+ }
449
+ .stat-grid {
450
+ display: grid;
451
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
452
+ gap: 16px;
453
+ margin-bottom: 24px;
454
+ }
455
+
456
+ .empty-state {
457
+ text-align: center;
458
+ padding: 48px 24px;
459
+ }
460
+ .empty-state h3 {
461
+ font-size: 15px;
462
+ font-weight: 600;
463
+ margin-bottom: 4px;
464
+ }
465
+ .empty-state p {
466
+ color: var(--text-muted);
467
+ font-size: 13px;
468
+ margin-bottom: 16px;
469
+ }
470
+
471
+ /* Modal */
472
+ .modal-overlay {
473
+ position: fixed;
474
+ inset: 0;
475
+ background: var(--bg-modal);
476
+ display: flex;
477
+ align-items: center;
478
+ justify-content: center;
479
+ z-index: 100;
480
+ }
481
+ .modal {
482
+ background: var(--bg-card);
483
+ border: 1px solid var(--border);
484
+ border-radius: var(--radius-xl);
485
+ width: 560px;
486
+ max-width: 95vw;
487
+ max-height: 90vh;
488
+ overflow-y: auto;
489
+ box-shadow: var(--shadow-xl);
490
+ }
491
+ .modal-header {
492
+ padding: 20px 24px;
493
+ border-bottom: 1px solid var(--border);
494
+ display: flex;
495
+ align-items: center;
496
+ justify-content: space-between;
497
+ }
498
+ .modal-header h2 {
499
+ font-size: 16px;
500
+ font-weight: 600;
501
+ }
502
+ .modal-body { padding: 24px; }
503
+ .modal-footer {
504
+ padding: 16px 24px;
505
+ border-top: 1px solid var(--border);
506
+ display: flex;
507
+ justify-content: flex-end;
508
+ gap: 8px;
509
+ }
510
+
511
+ /* Page Title */
512
+ .page-title {
513
+ font-size: 24px;
514
+ font-weight: 700;
515
+ margin-bottom: 24px;
516
+ }
517
+
518
+ /* Status indicators */
519
+ .status-running { color: var(--success); }
520
+ .status-stopped { color: var(--text-muted); }
521
+ .status-error { color: var(--danger); }
522
+ .status-paused { color: var(--warning); }
523
+
524
+ /* Responsive */
144
525
  @media (max-width: 768px) {
145
- .sidebar { width: 56px; }
146
- .sidebar-header h2, .sidebar-header p, .nav-item span, .nav-section, .sidebar-footer { display: none; }
147
- .nav-item { justify-content: center; padding: 14px 0; font-size: 18px; }
148
- .content { margin-left: 56px; padding: 16px; }
526
+ .sidebar {
527
+ transform: translateX(-100%);
528
+ width: var(--sidebar-w);
529
+ }
530
+ .sidebar.open {
531
+ transform: translateX(0);
532
+ }
533
+ .content {
534
+ margin-left: 0 !important;
535
+ width: 100% !important;
536
+ }
537
+ .stat-grid {
538
+ grid-template-columns: 1fr 1fr;
539
+ }
149
540
  }
541
+
542
+ /* Scrollbar */
543
+ ::-webkit-scrollbar { width: 6px; }
544
+ ::-webkit-scrollbar-track { background: transparent; }
545
+ ::-webkit-scrollbar-thumb { background: var(--border); border-radius: 3px; }
546
+ ::-webkit-scrollbar-thumb:hover { background: var(--border-light); }