@agenticmail/enterprise 0.4.3 → 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 (159) 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/package.json +1 -1
@@ -1,284 +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
- /* ─── 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);
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
+ }
93
+ #setup-banner h3 { color: var(--warning); margin-bottom: 8px; }
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;
78
113
  }
79
114
 
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;
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);
84
154
  }
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; }
110
155
 
111
- /* ─── Main Content ────────────────────────────────────── */
112
- .main {
113
- margin-left: 240px; flex: 1; padding: 32px; max-width: 1100px; width: 100%;
114
- }
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; }
156
+ /* ═══════════════════════════════════════════════════════════
157
+ LAYOUT — Fixed Sidebar
158
+ ═══════════════════════════════════════════════════════════ */
159
+ #app { display: none; }
160
+ .layout { display: flex; min-height: 100vh; }
118
161
 
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;
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;
130
175
  }
131
176
 
132
- /* ─── Stat Cards ──────────────────────────────────────── */
133
- .stats-grid {
134
- display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
135
- gap: 16px; margin-bottom: 24px;
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;
136
196
  }
137
- .stat-card {
138
- background: var(--surface); border: 1px solid var(--border);
139
- border-radius: var(--radius-lg); padding: 20px;
140
- }
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
+ /* 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;
144
213
  }
145
- .stat-card .value {
146
- font-size: 28px; font-weight: 700; color: var(--text); letter-spacing: -0.03em;
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;
147
253
  }
148
- .stat-card .value.pink { color: var(--primary); }
149
254
 
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); }
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
+ }
163
276
 
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); }
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
+ }
177
286
 
178
- /* ─── Forms ───────────────────────────────────────────── */
287
+ /* ═══════════════════════════════════════════════════════════
288
+ COMPONENTS
289
+ ═══════════════════════════════════════════════════════════ */
179
290
  .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; }
291
+ .form-label {
292
+ display: block;
293
+ font-size: 12px;
294
+ font-weight: 600;
295
+ color: var(--text-secondary);
296
+ margin-bottom: 6px;
297
+ }
195
298
 
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%; }
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); }
210
316
 
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; }
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; }
224
360
 
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); }
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; }
233
379
 
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); } }
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
+ }
244
408
 
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); }
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); }
253
428
 
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; }
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
+ }
257
455
 
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);
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;
263
464
  }
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;
465
+ .empty-state p {
466
+ color: var(--text-muted);
467
+ font-size: 13px;
468
+ margin-bottom: 16px;
268
469
  }
269
470
 
270
- /* ─── Dark Mode Toggle ────────────────────────────────── */
271
- .theme-toggle {
272
- cursor: pointer; background: none; border: none;
273
- color: var(--text-muted); font-size: 16px; padding: 4px;
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;
274
509
  }
275
510
 
276
- /* ─── Responsive ──────────────────────────────────────── */
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 */
277
525
  @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; }
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
+ }
284
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); }