@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,288 +1,175 @@
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);
30
- }
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
- }
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;
51
+ }
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
-
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
- }
79
-
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; }
110
-
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; }
118
-
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;
130
- }
131
-
132
- /* ─── Stat Cards ──────────────────────────────────────── */
133
- .stats-grid {
134
- display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
135
- gap: 16px; margin-bottom: 24px;
136
- }
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;
144
- }
145
- .stat-card .value {
146
- font-size: 28px; font-weight: 700; color: var(--text); letter-spacing: -0.03em;
147
- }
148
- .stat-card .value.pink { color: var(--primary); }
149
81
 
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); }
163
-
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); }
177
- .badge-blue { background: rgba(51,122,204,0.1); color: #337acc; }
178
- .badge-green { background: var(--success-bg); color: var(--success); }
179
- .badge-gray, .badge-neutral { background: rgba(136,136,160,0.08); color: var(--text-muted); }
180
- .badge-info { background: rgba(51,154,204,0.1); color: #339acc; }
82
+ /* ═══════════════════════════════════════════════════════════
83
+ LAYOUT
84
+ ═══════════════════════════════════════════════════════════ */
85
+ .layout { display: flex; min-height: 100vh; }
86
+
87
+ /* Sidebar */
88
+ .sidebar { width: var(--sidebar-w); background: var(--bg-secondary); border-right: 1px solid var(--border); display: flex; flex-direction: column; position: fixed; top: 0; left: 0; bottom: 0; z-index: 50; }
89
+
90
+ /* Sidebar header */
91
+ .sidebar-header { padding: 16px; border-bottom: 1px solid var(--border); }
92
+ .sidebar-header h2 { font-size: 15px; font-weight: 700; }
93
+ .sidebar-header p { font-size: 11px; color: var(--text-muted); }
94
+
95
+ /* Navigation */
96
+ .nav { flex: 1; overflow-y: auto; padding: 8px; }
97
+ .nav-section { font-size: 10px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.08em; color: var(--text-muted); padding: 12px 12px 8px; margin-top: 16px; }
98
+ .nav-section:first-child { margin-top: 8px; }
99
+ .nav-item { display: flex; align-items: center; gap: 10px; padding: 8px 12px; border-radius: var(--radius); color: var(--text-secondary); cursor: pointer; transition: all var(--transition); font-size: 13px; font-weight: 500; border: none; background: transparent; width: 100%; text-align: left; text-decoration: none; }
100
+ .nav-item:hover { background: var(--bg-hover); color: var(--text-primary); text-decoration: none; }
101
+ .nav-item.active { background: var(--accent-soft); color: var(--accent-text); }
102
+ .nav-item svg { width: 18px; height: 18px; flex-shrink: 0; }
103
+
104
+ /* Main content area */
105
+ .main-content { margin-left: var(--sidebar-w); width: calc(100% - var(--sidebar-w)); min-height: 100vh; display: flex; flex-direction: column; }
106
+
107
+ /* Topbar */
108
+ .topbar { height: var(--header-h); border-bottom: 1px solid var(--border); background: var(--bg-secondary); display: flex; align-items: center; justify-content: space-between; padding: 0 24px; }
109
+ .topbar-left { display: flex; align-items: center; gap: 16px; }
110
+ .topbar-title { font-size: 16px; font-weight: 600; }
111
+ .topbar-right { display: flex; align-items: center; gap: 8px; }
112
+ .page-content { flex: 1; padding: 24px; width: 100%; }
113
+
114
+ /* ═══════════════════════════════════════════════════════════
115
+ COMPONENTS
116
+ ═══════════════════════════════════════════════════════════ */
117
+ .btn { display: inline-flex; align-items: center; gap: 5px; padding: 6px 12px; border-radius: var(--radius); font-size: 12px; font-weight: 500; border: 1px solid transparent; cursor: pointer; transition: all var(--transition); font-family: var(--font); line-height: 1.4; text-decoration: none; }
118
+ .btn:disabled { opacity: 0.5; cursor: not-allowed; }
119
+ .btn-primary { background: var(--accent); color: white; }
120
+ .btn-primary:hover:not(:disabled) { background: var(--accent-hover); }
121
+ .btn-secondary { background: transparent; color: var(--text-secondary); border-color: var(--border); }
122
+ .btn-secondary:hover:not(:disabled) { background: var(--bg-hover); color: var(--text-primary); border-color: var(--border-light); }
123
+ .btn-danger { background: var(--danger); color: white; }
124
+ .btn-danger:hover:not(:disabled) { background: var(--danger-hover); }
125
+ .btn-sm { padding: 3px 8px; font-size: 11px; }
126
+ .btn-lg { padding: 8px 16px; font-size: 13px; }
127
+
128
+ .card { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-lg); overflow: hidden; }
129
+ .card-header { padding: 16px 20px; border-bottom: 1px solid var(--border); display: flex; align-items: center; justify-content: space-between; }
130
+ .card-header h3 { font-size: 14px; font-weight: 600; }
131
+ .card-body { padding: 20px; }
132
+
133
+ .input { width: 100%; padding: 8px 12px; background: var(--bg-input); border: 1px solid var(--border); border-radius: var(--radius); color: var(--text-primary); font-size: 13px; font-family: var(--font); transition: border-color var(--transition); outline: none; }
134
+ .input:focus { border-color: var(--accent); box-shadow: 0 0 0 2px var(--accent-soft); }
135
+ .input::placeholder { color: var(--text-muted); }
136
+ select.input { cursor: pointer; appearance: none; background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath d='M6 8L1 3h10z' fill='%239ca3b8'/%3E%3C/svg%3E"); background-repeat: no-repeat; background-position: right 10px center; padding-right: 30px; }
181
137
 
182
- /* ─── Forms ───────────────────────────────────────────── */
183
138
  .form-group { margin-bottom: 16px; }
184
- .form-group label {
185
- display: block; font-size: 13px; font-weight: 600;
186
- color: var(--text-dim); margin-bottom: 5px;
187
- }
188
- .form-group input,
189
- .form-group select,
190
- .form-group textarea {
191
- width: 100%; padding: 9px 12px; border: 1px solid var(--border);
192
- border-radius: var(--radius); background: var(--bg); color: var(--text);
193
- font-size: 14px; outline: none; transition: border-color 0.15s;
194
- }
195
- .form-group input:focus,
196
- .form-group select:focus,
197
- .form-group textarea:focus { border-color: var(--primary); }
198
- .form-row { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }
199
-
200
- /* ─── Buttons ─────────────────────────────────────────── */
201
- .btn {
202
- display: inline-flex; align-items: center; justify-content: center; gap: 6px;
203
- padding: 8px 18px; border-radius: var(--radius); font-size: 13px;
204
- font-weight: 600; border: 1px solid var(--border); background: var(--surface);
205
- color: var(--text-dim); cursor: pointer; transition: all 0.15s; text-decoration: none;
206
- }
207
- .btn:hover { background: var(--surface-hover); text-decoration: none; }
208
- .btn-primary { background: var(--primary); color: #fff; border-color: var(--primary); }
209
- .btn-primary:hover { background: var(--primary-hover); opacity: 0.9; color: #fff; }
210
- .btn-danger { background: var(--danger); color: #fff; border-color: var(--danger); }
211
- .btn-danger:hover { opacity: 0.9; color: #fff; }
212
- .btn-sm { padding: 5px 12px; font-size: 12px; }
213
- .btn-block { width: 100%; }
214
-
215
- /* ─── Modals ──────────────────────────────────────────── */
216
- .modal-overlay {
217
- display: none; position: fixed; inset: 0;
218
- background: rgba(0,0,0,0.6); align-items: center; justify-content: center; z-index: 100;
219
- }
220
- .modal-overlay.open { display: flex; }
221
- .modal {
222
- background: var(--surface); border: 1px solid var(--border);
223
- border-radius: var(--radius-lg); padding: 24px; width: 440px;
224
- max-width: 90vw; box-shadow: 0 20px 60px rgba(0,0,0,0.5);
225
- }
226
- .modal h3 { font-size: 16px; font-weight: 700; margin-bottom: 16px; }
227
- .modal-actions { display: flex; gap: 8px; justify-content: flex-end; margin-top: 20px; }
228
-
229
- /* ─── Flash Messages ──────────────────────────────────── */
230
- .flash {
231
- padding: 12px 16px; border-radius: var(--radius); margin-bottom: 20px;
232
- font-size: 14px; border: 1px solid var(--border);
233
- }
234
- .flash-success { background: var(--success-bg); border-color: var(--success); color: var(--success); }
235
- .flash-danger { background: var(--danger-bg); border-color: var(--danger); color: var(--danger); }
236
- .flash-info { background: var(--primary-bg); border-color: var(--primary); color: var(--primary); }
237
-
238
- /* ─── Toast ───────────────────────────────────────────── */
239
- .toast {
240
- position: fixed; bottom: 24px; right: 24px; padding: 12px 20px;
241
- background: var(--surface); border: 1px solid var(--success);
242
- border-radius: var(--radius); font-size: 13px; z-index: 200;
243
- display: none; animation: slideUp 0.2s ease;
244
- }
245
- .toast.error { border-color: var(--danger); }
246
- .toast.show { display: block; }
247
- @keyframes slideUp { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } }
248
-
249
- /* ─── Pagination ──────────────────────────────────────── */
250
- .pagination { display: flex; gap: 8px; margin-top: 20px; align-items: center; }
251
- .pagination a, .pagination span {
252
- padding: 6px 14px; border-radius: var(--radius); font-size: 13px;
253
- border: 1px solid var(--border); background: var(--surface); color: var(--text-dim);
254
- }
255
- .pagination a:hover { background: var(--surface-hover); text-decoration: none; }
256
- .pagination span.current { background: var(--primary); color: #fff; border-color: var(--primary); }
257
-
258
- /* ─── Empty State ─────────────────────────────────────── */
259
- .empty { text-align: center; padding: 48px 20px; color: var(--text-muted); font-size: 14px; }
260
- .empty .icon { font-size: 36px; margin-bottom: 12px; display: block; }
261
-
262
- /* ─── Key Banner (API key reveal) ─────────────────────── */
263
- .key-banner {
264
- background: var(--warning-bg); border: 1px solid var(--warning);
265
- border-radius: var(--radius); padding: 14px 18px; margin-bottom: 20px;
266
- font-size: 13px; color: var(--warning);
267
- }
268
- .key-banner code {
269
- display: block; margin-top: 6px; padding: 8px 12px; background: var(--bg);
270
- border-radius: var(--radius); font-size: 12px; color: var(--text);
271
- word-break: break-all;
272
- }
273
-
274
- /* ─── Dark Mode Toggle ────────────────────────────────── */
275
- .theme-toggle {
276
- cursor: pointer; background: none; border: none;
277
- color: var(--text-muted); font-size: 16px; padding: 4px;
278
- }
279
-
280
- /* ─── Responsive ──────────────────────────────────────── */
139
+ .form-label { display: block; font-size: 12px; font-weight: 600; color: var(--text-secondary); margin-bottom: 6px; }
140
+
141
+ .badge { display: inline-flex; align-items: center; padding: 2px 8px; border-radius: 12px; font-size: 11px; font-weight: 600; }
142
+ .badge-primary { background: var(--accent-soft); color: var(--accent-text); }
143
+ .badge-success { background: var(--success-soft); color: var(--success); }
144
+ .badge-warning { background: var(--warning-soft); color: var(--warning); }
145
+ .badge-danger { background: var(--danger-soft); color: var(--danger); }
146
+
147
+ table { width: 100%; border-collapse: collapse; }
148
+ thead th { text-align: left; padding: 10px 16px; font-size: 11px; font-weight: 600; text-transform: uppercase; letter-spacing: 0.05em; color: var(--text-muted); border-bottom: 1px solid var(--border); background: var(--bg-tertiary); }
149
+ tbody td { padding: 12px 16px; border-bottom: 1px solid var(--border); font-size: 13px; }
150
+ tbody tr:last-child td { border-bottom: none; }
151
+ tbody tr:hover { background: var(--bg-hover); }
152
+
153
+ .empty-state { text-align: center; padding: 48px 24px; }
154
+ .empty-state svg { width: 48px; height: 48px; color: var(--text-muted); margin-bottom: 16px; }
155
+ .empty-state h3 { font-size: 15px; font-weight: 600; margin-bottom: 4px; }
156
+ .empty-state p { color: var(--text-muted); font-size: 13px; margin-bottom: 16px; }
157
+
158
+ .stat-card { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: 20px; }
159
+ .stat-label { font-size: 12px; color: var(--text-muted); font-weight: 500; }
160
+ .stat-value { font-size: 28px; font-weight: 700; margin-top: 4px; }
161
+ .stat-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 16px; margin-bottom: 24px; }
162
+
163
+ /* Login page */
164
+ .login-page { min-height: 100vh; display: flex; align-items: center; justify-content: center; background: var(--bg-primary); }
165
+ .login-card { background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius-xl); padding: 40px; width: 400px; box-shadow: var(--shadow-xl); }
166
+ .login-logo { text-align: center; margin-bottom: 32px; }
167
+ .login-logo h1 { font-size: 22px; font-weight: 700; margin-top: 12px; }
168
+ .login-logo p { color: var(--text-muted); font-size: 13px; margin-top: 4px; }
169
+
170
+ /* Responsive */
281
171
  @media (max-width: 768px) {
282
- .sidebar { width: 56px; }
283
- .sidebar-brand, .sidebar-nav a span, .sidebar-footer { display: none; }
284
- .sidebar-nav a { justify-content: center; padding: 14px 0; font-size: 18px; }
285
- .main { margin-left: 56px; padding: 16px; }
286
- .form-row { grid-template-columns: 1fr; }
287
- .stats-grid { grid-template-columns: 1fr 1fr; }
288
- }
172
+ .sidebar { transform: translateX(-100%); width: var(--sidebar-w); }
173
+ .main-content { margin-left: 0; width: 100%; }
174
+ .stat-grid { grid-template-columns: 1fr; }
175
+ }
@@ -0,0 +1,87 @@
1
+ {% extends "layout.html" %}
2
+
3
+ {% block content %}
4
+ <div class="stat-grid">
5
+ <div class="stat-card">
6
+ <div class="stat-label">Total Events</div>
7
+ <div class="stat-value">2,847</div>
8
+ <div style="color: var(--success); font-size: 12px; margin-top: 4px;">+12% this week</div>
9
+ </div>
10
+ <div class="stat-card">
11
+ <div class="stat-label">Agent Actions</div>
12
+ <div class="stat-value">1,923</div>
13
+ <div style="color: var(--success); font-size: 12px; margin-top: 4px;">+8% this week</div>
14
+ </div>
15
+ <div class="stat-card">
16
+ <div class="stat-label">System Events</div>
17
+ <div class="stat-value">924</div>
18
+ <div style="color: var(--text-muted); font-size: 12px; margin-top: 4px;">No change</div>
19
+ </div>
20
+ </div>
21
+
22
+ <div class="card">
23
+ <div class="card-header">
24
+ <h3>Recent Activity</h3>
25
+ <div style="display: flex; gap: 8px;">
26
+ <select class="input" style="width: auto;">
27
+ <option>All Events</option>
28
+ <option>Agent Actions</option>
29
+ <option>System Events</option>
30
+ <option>Security Events</option>
31
+ </select>
32
+ <button class="btn btn-secondary">🔍 Filter</button>
33
+ </div>
34
+ </div>
35
+ <div class="card-body">
36
+ <table>
37
+ <thead>
38
+ <tr>
39
+ <th>Time</th>
40
+ <th>Event</th>
41
+ <th>Agent</th>
42
+ <th>Details</th>
43
+ <th>Status</th>
44
+ </tr>
45
+ </thead>
46
+ <tbody>
47
+ <tr>
48
+ <td>2 mins ago</td>
49
+ <td>Email sent</td>
50
+ <td>
51
+ <div style="display: flex; align-items: center; gap: 8px;">
52
+ <div style="width: 24px; height: 24px; border-radius: 50%; background: var(--accent-soft); color: var(--accent-text); display: flex; align-items: center; justify-content: center; font-size: 11px; font-weight: 600;">A</div>
53
+ Alice
54
+ </div>
55
+ </td>
56
+ <td>Sent monthly report to stakeholders</td>
57
+ <td><span class="badge badge-success">Success</span></td>
58
+ </tr>
59
+ <tr>
60
+ <td>5 mins ago</td>
61
+ <td>Knowledge updated</td>
62
+ <td>
63
+ <div style="display: flex; align-items: center; gap: 8px;">
64
+ <div style="width: 24px; height: 24px; border-radius: 50%; background: var(--success-soft); color: var(--success); display: flex; align-items: center; justify-content: center; font-size: 11px; font-weight: 600;">B</div>
65
+ Bob
66
+ </div>
67
+ </td>
68
+ <td>Updated customer service protocols</td>
69
+ <td><span class="badge badge-success">Success</span></td>
70
+ </tr>
71
+ <tr>
72
+ <td>12 mins ago</td>
73
+ <td>Agent deployed</td>
74
+ <td>
75
+ <div style="display: flex; align-items: center; gap: 8px;">
76
+ <div style="width: 24px; height: 24px; border-radius: 50%; background: var(--warning-soft); color: var(--warning); display: flex; align-items: center; justify-content: center; font-size: 11px; font-weight: 600;">C</div>
77
+ Charlie
78
+ </div>
79
+ </td>
80
+ <td>Deployed to production environment</td>
81
+ <td><span class="badge badge-success">Success</span></td>
82
+ </tr>
83
+ </tbody>
84
+ </table>
85
+ </div>
86
+ </div>
87
+ {% endblock %}
@@ -0,0 +1,86 @@
1
+ {% extends "layout.html" %}
2
+
3
+ {% block content %}
4
+ <div class="stat-grid">
5
+ <div class="stat-card">
6
+ <div class="stat-label">Pending Approvals</div>
7
+ <div class="stat-value">3</div>
8
+ <div style="color: var(--warning); font-size: 12px; margin-top: 4px;">2 urgent</div>
9
+ </div>
10
+ <div class="stat-card">
11
+ <div class="stat-label">Approved Today</div>
12
+ <div class="stat-value">12</div>
13
+ <div style="color: var(--success); font-size: 12px; margin-top: 4px;">+20% vs yesterday</div>
14
+ </div>
15
+ <div class="stat-card">
16
+ <div class="stat-label">Rejected Today</div>
17
+ <div class="stat-value">1</div>
18
+ <div style="color: var(--text-muted); font-size: 12px; margin-top: 4px;">Normal</div>
19
+ </div>
20
+ </div>
21
+
22
+ <div class="card">
23
+ <div class="card-header">
24
+ <h3>Pending Approvals</h3>
25
+ <button class="btn btn-primary">Review All</button>
26
+ </div>
27
+ <div class="card-body">
28
+ <table>
29
+ <thead>
30
+ <tr>
31
+ <th>Request</th>
32
+ <th>Agent</th>
33
+ <th>Type</th>
34
+ <th>Priority</th>
35
+ <th>Requested</th>
36
+ <th>Actions</th>
37
+ </tr>
38
+ </thead>
39
+ <tbody>
40
+ <tr>
41
+ <td>
42
+ <strong>Budget Allocation Request</strong><br>
43
+ <small style="color: var(--text-muted);">Requesting $5,000 for marketing campaign</small>
44
+ </td>
45
+ <td>
46
+ <div style="display: flex; align-items: center; gap: 8px;">
47
+ <div style="width: 24px; height: 24px; border-radius: 50%; background: var(--accent-soft); color: var(--accent-text); display: flex; align-items: center; justify-content: center; font-size: 11px; font-weight: 600;">F</div>
48
+ Frank
49
+ </div>
50
+ </td>
51
+ <td><span class="badge badge-primary">Financial</span></td>
52
+ <td><span class="badge badge-danger">High</span></td>
53
+ <td>1 hour ago</td>
54
+ <td>
55
+ <div style="display: flex; gap: 4px;">
56
+ <button class="btn btn-sm btn-primary">Approve</button>
57
+ <button class="btn btn-sm btn-danger">Reject</button>
58
+ </div>
59
+ </td>
60
+ </tr>
61
+ <tr>
62
+ <td>
63
+ <strong>External API Access</strong><br>
64
+ <small style="color: var(--text-muted);">Request access to CRM integration</small>
65
+ </td>
66
+ <td>
67
+ <div style="display: flex; align-items: center; gap: 8px;">
68
+ <div style="width: 24px; height: 24px; border-radius: 50%; background: var(--warning-soft); color: var(--warning); display: flex; align-items: center; justify-content: center; font-size: 11px; font-weight: 600;">C</div>
69
+ Charlie
70
+ </div>
71
+ </td>
72
+ <td><span class="badge badge-warning">Security</span></td>
73
+ <td><span class="badge badge-danger">High</span></td>
74
+ <td>3 hours ago</td>
75
+ <td>
76
+ <div style="display: flex; gap: 4px;">
77
+ <button class="btn btn-sm btn-primary">Approve</button>
78
+ <button class="btn btn-sm btn-danger">Reject</button>
79
+ </div>
80
+ </td>
81
+ </tr>
82
+ </tbody>
83
+ </table>
84
+ </div>
85
+ </div>
86
+ {% endblock %}