aimeat 1.16.2 → 1.18.0

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 (281) hide show
  1. package/dist/.env.example +6 -1
  2. package/dist/locales/en.json +166 -4
  3. package/dist/locales/fi.json +166 -4
  4. package/dist/public/components/Card.js +17 -3
  5. package/dist/public/components/Collapsible.js +39 -0
  6. package/dist/public/components/CopyButton.js +55 -24
  7. package/dist/public/components/DataTable.js +57 -0
  8. package/dist/public/components/EmptyState.js +28 -0
  9. package/dist/public/components/KeyValueRow.js +37 -0
  10. package/dist/public/components/Modal.js +22 -5
  11. package/dist/public/components/Pagination.js +70 -0
  12. package/dist/public/components/SearchBar.js +44 -0
  13. package/dist/public/components/StatusDot.js +29 -0
  14. package/dist/public/components/TagList.js +53 -0
  15. package/dist/public/components/ToggleSwitch.js +28 -0
  16. package/dist/public/components/index.js +41 -1
  17. package/dist/public/css/components/tags.css +24 -0
  18. package/dist/public/css/style-testbed.css +135 -0
  19. package/dist/public/css/theme.css +556 -34
  20. package/dist/public/css/views/admin-agent-integration.css +2 -33
  21. package/dist/public/css/views/admin.css +730 -686
  22. package/dist/public/css/views/agents-detail.css +402 -14
  23. package/dist/public/css/views/help.css +2 -1
  24. package/dist/public/css/views/hobbies.css +53 -33
  25. package/dist/public/css/views/marketplace.css +73 -60
  26. package/dist/public/css/views/openclaw.css +12 -6
  27. package/dist/public/css/views/portal-classic.css +34 -26
  28. package/dist/public/css/views/portal-dev.css +41 -32
  29. package/dist/public/css/views/portal.css +14 -18
  30. package/dist/public/css/views/profile.css +252 -164
  31. package/dist/public/css/views/public-knowledge-viewer.css +18 -6
  32. package/dist/public/css/views/scheduler.css +100 -0
  33. package/dist/public/js/format.js +41 -0
  34. package/dist/public/js/services/agent-tasks.js +14 -1
  35. package/dist/public/js/services/generator-spec-validate.js +5 -1
  36. package/dist/public/js/services/schedules.js +53 -0
  37. package/dist/public/js/style-testbed.js +170 -0
  38. package/dist/public/js/theme.js +114 -0
  39. package/dist/public/spa.html +74 -16
  40. package/dist/public/style-testbed.html +420 -0
  41. package/dist/public/views/admin/agent-integration-tab.js +23 -38
  42. package/dist/public/views/admin/agent-tasks-tab.js +14 -21
  43. package/dist/public/views/admin/chat-instances-tab.js +1 -1
  44. package/dist/public/views/admin/config-tab.js +7 -2
  45. package/dist/public/views/admin/cortex-tab.js +20 -14
  46. package/dist/public/views/admin/csm-tab.js +22 -18
  47. package/dist/public/views/admin/directory-tab.js +3 -3
  48. package/dist/public/views/admin/email-tab.js +23 -28
  49. package/dist/public/views/admin/federation-tab.js +15 -5
  50. package/dist/public/views/admin/generator-debug-tab.js +10 -8
  51. package/dist/public/views/admin/genesis-tab.js +4 -4
  52. package/dist/public/views/admin/ghii-tab.js +3 -3
  53. package/dist/public/views/admin/knowledge-tab.js +15 -5
  54. package/dist/public/views/admin/matching-tab.js +3 -3
  55. package/dist/public/views/admin/memory-tab.js +16 -20
  56. package/dist/public/views/admin/msm-tab.js +30 -17
  57. package/dist/public/views/admin/overview-tab.js +7 -7
  58. package/dist/public/views/admin/packages-tab.js +10 -9
  59. package/dist/public/views/admin/portal-tab.js +14 -4
  60. package/dist/public/views/admin/prompts-tab.js +5 -5
  61. package/dist/public/views/admin/push-tab.js +15 -4
  62. package/dist/public/views/admin/realtime-tab.js +3 -3
  63. package/dist/public/views/admin/services-tab.js +18 -27
  64. package/dist/public/views/admin/shared.js +48 -58
  65. package/dist/public/views/admin/sharing-groups-tab.js +5 -10
  66. package/dist/public/views/admin/stats-tab.js +3 -3
  67. package/dist/public/views/guides.js +9 -13
  68. package/dist/public/views/help.js +3 -24
  69. package/dist/public/views/hobbies.js +47 -41
  70. package/dist/public/views/marketplace.js +42 -34
  71. package/dist/public/views/openclaw.js +0 -1
  72. package/dist/public/views/portal-classic.js +4 -15
  73. package/dist/public/views/portal-dev.js +28 -30
  74. package/dist/public/views/portal.js +16 -21
  75. package/dist/public/views/portfolio.js +11 -12
  76. package/dist/public/views/profile/access-tab.js +250 -1
  77. package/dist/public/views/profile/agents/agent-card.js +75 -4
  78. package/dist/public/views/profile/agents/tab-activity.js +15 -13
  79. package/dist/public/views/profile/agents/tab-agent-config.js +60 -6
  80. package/dist/public/views/profile/agents/tab-integration.js +37 -60
  81. package/dist/public/views/profile/agents/tab-messages.js +10 -1
  82. package/dist/public/views/profile/agents/tab-quality.js +25 -19
  83. package/dist/public/views/profile/agents/tab-schedules.js +110 -0
  84. package/dist/public/views/profile/agents-activity-subtab.js +4 -4
  85. package/dist/public/views/profile/agents-services-subtab.js +5 -4
  86. package/dist/public/views/profile/agents-tab.js +141 -37
  87. package/dist/public/views/profile/agents-tasks-subtab.js +221 -26
  88. package/dist/public/views/profile/calibrator-batch.js +5 -11
  89. package/dist/public/views/profile/calibrator-tab.js +4 -9
  90. package/dist/public/views/profile/chat-sessions-tab.js +9 -5
  91. package/dist/public/views/profile/email-tab.js +2 -2
  92. package/dist/public/views/profile/extensions-tab.js +27 -22
  93. package/dist/public/views/profile/federation-tab.js +4 -1
  94. package/dist/public/views/profile/foundry-detail.js +22 -23
  95. package/dist/public/views/profile/foundry-tab.js +12 -13
  96. package/dist/public/views/profile/generator-dashboard/DebugPanel.js +4 -7
  97. package/dist/public/views/profile/generator-dashboard/use-dashboard-core.js +4 -1
  98. package/dist/public/views/profile/generator-dashboard/use-edit-mode.js +3 -2
  99. package/dist/public/views/profile/generator-detail.js +26 -30
  100. package/dist/public/views/profile/generator-tab.js +5 -5
  101. package/dist/public/views/profile/knowledge-tab.js +12 -12
  102. package/dist/public/views/profile/landing-page.js +100 -149
  103. package/dist/public/views/profile/memory-tab.js +15 -11
  104. package/dist/public/views/profile/node-stats-tab.js +3 -3
  105. package/dist/public/views/profile/nodes-tab.js +10 -3
  106. package/dist/public/views/profile/notifications-tab.js +3 -3
  107. package/dist/public/views/profile/packages-tab.js +14 -14
  108. package/dist/public/views/profile/scheduler-tab.js +340 -0
  109. package/dist/public/views/profile/services-tab.js +1 -1
  110. package/dist/public/views/profile/shared.js +16 -12
  111. package/dist/public/views/profile/wallet-tab.js +27 -50
  112. package/dist/public/views/profile/work-tab.js +29 -31
  113. package/dist/public/views/profile.js +24 -0
  114. package/dist/public/views/public-knowledge-viewer.js +9 -18
  115. package/dist/src/auth/middleware.d.ts +3 -2
  116. package/dist/src/auth/middleware.d.ts.map +1 -1
  117. package/dist/src/auth/middleware.js +78 -3
  118. package/dist/src/auth/middleware.js.map +1 -1
  119. package/dist/src/cli/init-wizard.d.ts.map +1 -1
  120. package/dist/src/cli/init-wizard.js +13 -1
  121. package/dist/src/cli/init-wizard.js.map +1 -1
  122. package/dist/src/config.d.ts +6 -0
  123. package/dist/src/config.d.ts.map +1 -1
  124. package/dist/src/config.js +12 -1
  125. package/dist/src/config.js.map +1 -1
  126. package/dist/src/generated/api-types.d.ts +708 -8
  127. package/dist/src/generated/api-types.d.ts.map +1 -1
  128. package/dist/src/mcp/agent-schedules.d.ts +23 -0
  129. package/dist/src/mcp/agent-schedules.d.ts.map +1 -0
  130. package/dist/src/mcp/agent-schedules.js +175 -0
  131. package/dist/src/mcp/agent-schedules.js.map +1 -0
  132. package/dist/src/mcp/annotations.d.ts.map +1 -1
  133. package/dist/src/mcp/annotations.js +6 -0
  134. package/dist/src/mcp/annotations.js.map +1 -1
  135. package/dist/src/mcp/catalog/definitions.d.ts.map +1 -1
  136. package/dist/src/mcp/catalog/definitions.js +55 -0
  137. package/dist/src/mcp/catalog/definitions.js.map +1 -1
  138. package/dist/src/mcp/catalog/scopes.d.ts.map +1 -1
  139. package/dist/src/mcp/catalog/scopes.js +12 -0
  140. package/dist/src/mcp/catalog/scopes.js.map +1 -1
  141. package/dist/src/mcp/catalog/surfaces.d.ts.map +1 -1
  142. package/dist/src/mcp/catalog/surfaces.js +2 -0
  143. package/dist/src/mcp/catalog/surfaces.js.map +1 -1
  144. package/dist/src/mcp/index.d.ts.map +1 -1
  145. package/dist/src/mcp/index.js +2 -0
  146. package/dist/src/mcp/index.js.map +1 -1
  147. package/dist/src/models/agent-task-schemas.d.ts +6 -0
  148. package/dist/src/models/agent-task-schemas.d.ts.map +1 -1
  149. package/dist/src/models/agent-task-schemas.js +6 -0
  150. package/dist/src/models/agent-task-schemas.js.map +1 -1
  151. package/dist/src/models/schemas.d.ts +1 -0
  152. package/dist/src/models/schemas.d.ts.map +1 -1
  153. package/dist/src/models/schemas.js +4 -0
  154. package/dist/src/models/schemas.js.map +1 -1
  155. package/dist/src/routes/access-tokens.d.ts +17 -0
  156. package/dist/src/routes/access-tokens.d.ts.map +1 -0
  157. package/dist/src/routes/access-tokens.js +164 -0
  158. package/dist/src/routes/access-tokens.js.map +1 -0
  159. package/dist/src/routes/agent-tasks.d.ts +2 -0
  160. package/dist/src/routes/agent-tasks.d.ts.map +1 -1
  161. package/dist/src/routes/agent-tasks.js +118 -23
  162. package/dist/src/routes/agent-tasks.js.map +1 -1
  163. package/dist/src/routes/agents.d.ts.map +1 -1
  164. package/dist/src/routes/agents.js +46 -0
  165. package/dist/src/routes/agents.js.map +1 -1
  166. package/dist/src/routes/ai.d.ts +6 -9
  167. package/dist/src/routes/ai.d.ts.map +1 -1
  168. package/dist/src/routes/ai.js +26 -175
  169. package/dist/src/routes/ai.js.map +1 -1
  170. package/dist/src/routes/apps.d.ts.map +1 -1
  171. package/dist/src/routes/apps.js +104 -34
  172. package/dist/src/routes/apps.js.map +1 -1
  173. package/dist/src/routes/auth.d.ts.map +1 -1
  174. package/dist/src/routes/auth.js +77 -4
  175. package/dist/src/routes/auth.js.map +1 -1
  176. package/dist/src/routes/cortex.d.ts +2 -1
  177. package/dist/src/routes/cortex.d.ts.map +1 -1
  178. package/dist/src/routes/cortex.js +13 -8
  179. package/dist/src/routes/cortex.js.map +1 -1
  180. package/dist/src/routes/extensions.d.ts.map +1 -1
  181. package/dist/src/routes/extensions.js +85 -51
  182. package/dist/src/routes/extensions.js.map +1 -1
  183. package/dist/src/routes/generator.d.ts.map +1 -1
  184. package/dist/src/routes/generator.js +109 -43
  185. package/dist/src/routes/generator.js.map +1 -1
  186. package/dist/src/routes/ghii.d.ts.map +1 -1
  187. package/dist/src/routes/ghii.js +34 -13
  188. package/dist/src/routes/ghii.js.map +1 -1
  189. package/dist/src/routes/libs.d.ts +15 -0
  190. package/dist/src/routes/libs.d.ts.map +1 -1
  191. package/dist/src/routes/libs.js +178 -55
  192. package/dist/src/routes/libs.js.map +1 -1
  193. package/dist/src/routes/portal.d.ts.map +1 -1
  194. package/dist/src/routes/portal.js +1 -0
  195. package/dist/src/routes/portal.js.map +1 -1
  196. package/dist/src/routes/schedules.d.ts +33 -0
  197. package/dist/src/routes/schedules.d.ts.map +1 -0
  198. package/dist/src/routes/schedules.js +380 -0
  199. package/dist/src/routes/schedules.js.map +1 -0
  200. package/dist/src/server-bootstrap/config-init.js +2 -2
  201. package/dist/src/server-bootstrap/config-init.js.map +1 -1
  202. package/dist/src/server-bootstrap/routes-loader.d.ts.map +1 -1
  203. package/dist/src/server-bootstrap/routes-loader.js +7 -0
  204. package/dist/src/server-bootstrap/routes-loader.js.map +1 -1
  205. package/dist/src/server-bootstrap/service-init.d.ts.map +1 -1
  206. package/dist/src/server-bootstrap/service-init.js +2 -1
  207. package/dist/src/server-bootstrap/service-init.js.map +1 -1
  208. package/dist/src/services/access-token.d.ts +28 -0
  209. package/dist/src/services/access-token.d.ts.map +1 -0
  210. package/dist/src/services/access-token.js +37 -0
  211. package/dist/src/services/access-token.js.map +1 -0
  212. package/dist/src/services/ai-completion.d.ts +83 -0
  213. package/dist/src/services/ai-completion.d.ts.map +1 -0
  214. package/dist/src/services/ai-completion.js +187 -0
  215. package/dist/src/services/ai-completion.js.map +1 -0
  216. package/dist/src/services/config-schema.d.ts.map +1 -1
  217. package/dist/src/services/config-schema.js +3 -0
  218. package/dist/src/services/config-schema.js.map +1 -1
  219. package/dist/src/services/generator-prompt-seeds.d.ts.map +1 -1
  220. package/dist/src/services/generator-prompt-seeds.js +6 -3
  221. package/dist/src/services/generator-prompt-seeds.js.map +1 -1
  222. package/dist/src/services/generator-prompts/spec-validate.d.ts.map +1 -1
  223. package/dist/src/services/generator-prompts/spec-validate.js +6 -2
  224. package/dist/src/services/generator-prompts/spec-validate.js.map +1 -1
  225. package/dist/src/services/generator-registration.d.ts +12 -4
  226. package/dist/src/services/generator-registration.d.ts.map +1 -1
  227. package/dist/src/services/generator-registration.js +71 -0
  228. package/dist/src/services/generator-registration.js.map +1 -1
  229. package/dist/src/services/generator-validate.d.ts +10 -0
  230. package/dist/src/services/generator-validate.d.ts.map +1 -1
  231. package/dist/src/services/generator-validate.js +180 -36
  232. package/dist/src/services/generator-validate.js.map +1 -1
  233. package/dist/src/services/owner-session.d.ts +43 -0
  234. package/dist/src/services/owner-session.d.ts.map +1 -0
  235. package/dist/src/services/owner-session.js +175 -0
  236. package/dist/src/services/owner-session.js.map +1 -0
  237. package/dist/src/services/schedule-constraints.d.ts +65 -0
  238. package/dist/src/services/schedule-constraints.d.ts.map +1 -0
  239. package/dist/src/services/schedule-constraints.js +106 -0
  240. package/dist/src/services/schedule-constraints.js.map +1 -0
  241. package/dist/src/services/scheduler.d.ts +34 -0
  242. package/dist/src/services/scheduler.d.ts.map +1 -1
  243. package/dist/src/services/scheduler.js +266 -22
  244. package/dist/src/services/scheduler.js.map +1 -1
  245. package/dist/src/services/skill-bundle/generator.js +19 -0
  246. package/dist/src/services/skill-bundle/generator.js.map +1 -1
  247. package/dist/src/storage/interface.d.ts +48 -4
  248. package/dist/src/storage/interface.d.ts.map +1 -1
  249. package/dist/src/storage/interface.js.map +1 -1
  250. package/dist/src/storage/providers/mongodb/index.d.ts +31 -0
  251. package/dist/src/storage/providers/mongodb/index.d.ts.map +1 -1
  252. package/dist/src/storage/providers/mongodb/index.js +187 -9
  253. package/dist/src/storage/providers/mongodb/index.js.map +1 -1
  254. package/dist/src/storage/providers/sqlite/index.d.ts +31 -0
  255. package/dist/src/storage/providers/sqlite/index.d.ts.map +1 -1
  256. package/dist/src/storage/providers/sqlite/index.js +131 -8
  257. package/dist/src/storage/providers/sqlite/index.js.map +1 -1
  258. package/dist/src/storage/providers/sqlite/repos/agent-task.d.ts.map +1 -1
  259. package/dist/src/storage/providers/sqlite/repos/agent-task.js +6 -4
  260. package/dist/src/storage/providers/sqlite/repos/agent-task.js.map +1 -1
  261. package/dist/src/storage/providers/sqlite/schema.d.ts.map +1 -1
  262. package/dist/src/storage/providers/sqlite/schema.js +79 -8
  263. package/dist/src/storage/providers/sqlite/schema.js.map +1 -1
  264. package/dist/src/storage/repositories/pat.repository.d.ts +40 -0
  265. package/dist/src/storage/repositories/pat.repository.d.ts.map +1 -0
  266. package/dist/src/storage/repositories/pat.repository.js +14 -0
  267. package/dist/src/storage/repositories/pat.repository.js.map +1 -0
  268. package/dist/src/storage/repositories/scheduler.repository.d.ts +2 -0
  269. package/dist/src/storage/repositories/scheduler.repository.d.ts.map +1 -1
  270. package/dist/src/storage/repositories/session.repository.d.ts +51 -0
  271. package/dist/src/storage/repositories/session.repository.d.ts.map +1 -1
  272. package/dist/src/storage/repositories/session.repository.js +12 -0
  273. package/dist/src/storage/repositories/session.repository.js.map +1 -1
  274. package/dist/src/utils/env-config.d.ts.map +1 -1
  275. package/dist/src/utils/env-config.js +25 -1
  276. package/dist/src/utils/env-config.js.map +1 -1
  277. package/dist/src/utils/env-validator.d.ts.map +1 -1
  278. package/dist/src/utils/env-validator.js +4 -0
  279. package/dist/src/utils/env-validator.js.map +1 -1
  280. package/package.json +1 -1
  281. package/prisma/schema.prisma +48 -0
@@ -1,686 +1,730 @@
1
- /* ── Admin Dashboard SPA Styles ── */
2
-
3
- /* Admin-scoped variable overrides */
4
- .adm {
5
- --text-dim: #94a3b8;
6
- --text-bright: #F1F5F9;
7
- --text-muted: #64748b;
8
- --accent: #6366F1;
9
- --accent-light: #EEF2FF;
10
- --glass-border: #E5E7EB;
11
- --glass-bg: #FFFFFF;
12
- --bg-deep: #F8FAFC;
13
- --sidebar-bg: #1E293B;
14
- --sidebar-text: #CBD5E1;
15
- --sidebar-border: rgba(255,255,255,0.08);
16
- color: #1A1A2E;
17
- }
18
-
19
- /* Layout */
20
- .adm { display: flex; min-height: 100vh; position: relative; z-index: 1; background: var(--bg-deep); }
21
-
22
- /* Sidebar — stays dark per mockup */
23
- .adm-sidebar {
24
- width: 220px;
25
- background: var(--sidebar-bg);
26
- border-right: none;
27
- padding: 16px 0;
28
- flex-shrink: 0;
29
- position: sticky;
30
- top: 0;
31
- height: 100vh;
32
- overflow-y: auto;
33
- display: flex;
34
- flex-direction: column;
35
- }
36
- .adm-sidebar .node-id {
37
- padding: 0 18px;
38
- padding-top: 4px;
39
- color: #475569;
40
- font-size: .69rem;
41
- font-family: var(--font-mono);
42
- margin-bottom: 16px;
43
- word-break: break-all;
44
- }
45
- .adm-nav-group {
46
- font-size: .625rem;
47
- text-transform: uppercase;
48
- letter-spacing: 1px;
49
- color: #475569;
50
- padding: 0 18px;
51
- margin-top: 16px;
52
- margin-bottom: 4px;
53
- font-weight: 700;
54
- }
55
- .adm-nav-item {
56
- display: flex;
57
- align-items: center;
58
- gap: 10px;
59
- padding: 7px 18px;
60
- color: var(--sidebar-text, #CBD5E1);
61
- font-size: .84rem;
62
- cursor: pointer;
63
- border: none;
64
- background: none;
65
- width: 100%;
66
- text-align: left;
67
- font-family: inherit;
68
- font-weight: 400;
69
- transition: all .1s;
70
- border-left: 3px solid transparent;
71
- }
72
- .adm-nav-item:hover { background: rgba(255,255,255,0.04); color: #F1F5F9; }
73
- .adm-nav-item.active {
74
- color: #FFFFFF;
75
- background: rgba(99,102,241,0.12);
76
- border-left-color: var(--accent, #6366F1);
77
- font-weight: 500;
78
- }
79
- .adm-nav-item .icon { font-size: .81rem; width: 16px; text-align: center; }
80
- .adm-nav-item .label { flex: 1; }
81
- .adm-nav-item .cnt {
82
- background: rgba(255,255,255,0.08);
83
- color: #94A3B8;
84
- font-size: .69rem;
85
- padding: 1px 7px;
86
- border-radius: 9999px;
87
- font-weight: 600;
88
- }
89
- .adm-sep { height: 1px; background: rgba(255,255,255,0.08); margin: 8px 16px; }
90
-
91
- /* Main area */
92
- .adm-main { flex: 1; padding: 24px 32px; overflow-y: auto; background: var(--bg-deep); }
93
- .adm-topbar {
94
- display: flex;
95
- justify-content: space-between;
96
- align-items: center;
97
- margin-bottom: 20px;
98
- flex-wrap: wrap;
99
- gap: 10px;
100
- }
101
- .adm-topbar-right { display: flex; align-items: center; gap: 12px; }
102
- .adm-page-title {
103
- font-size: 1.375rem;
104
- font-weight: 800;
105
- color: #1A1A2E;
106
- display: flex;
107
- align-items: center;
108
- gap: 10px;
109
- }
110
-
111
- /* Cards */
112
- .adm-grid { display: grid; gap: 16px; margin-bottom: 20px; }
113
- .adm-grid-4 { grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); }
114
- .adm-grid-3 { grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); }
115
- .adm-grid-2 { grid-template-columns: repeat(auto-fit, minmax(340px, 1fr)); }
116
- .adm-card {
117
- background: var(--glass-bg, #FFFFFF);
118
- border: 1px solid var(--glass-border, #E5E7EB);
119
- border-radius: 14px;
120
- padding: 20px 24px;
121
- box-shadow: 0 1px 3px rgba(0,0,0,0.04);
122
- }
123
- .adm-card h2 {
124
- font-size: .66rem;
125
- text-transform: uppercase;
126
- letter-spacing: .5px;
127
- color: #9CA3AF;
128
- margin-bottom: 6px;
129
- font-weight: 700;
130
- }
131
- .adm-stat { font-size: 1.625rem; font-weight: 800; line-height: 1.1; color: #1A1A2E; }
132
- .adm-stat.indigo { color: var(--accent, #6366F1); }
133
- .adm-stat.mint { color: #34D399; }
134
- .adm-stat-label { color: #9CA3AF; font-size: .69rem; margin-top: 2px; }
135
-
136
- /* Badges */
137
- .adm-badge {
138
- display: inline-block;
139
- padding: 2px 8px;
140
- border-radius: 20px;
141
- font-size: .7rem;
142
- font-weight: 600;
143
- text-transform: uppercase;
144
- }
145
- /* Badge semantic colors */
146
- .adm-badge--success { background: #D1FAE5; color: #047857; }
147
- .adm-badge--warning { background: #FEF3C7; color: #B45309; }
148
- .adm-badge--danger { background: #FEE2E2; color: #DC2626; }
149
- .adm-badge--info { background: #EFF6FF; color: #1D4ED8; }
150
- .adm-badge--accent { background: #F5F3FF; color: #6D28D9; }
151
- .adm-badge--muted { background: #F3F4F6; color: #6B7280; }
152
-
153
- /* Badge name aliases → semantic colors */
154
- .adm-badge-healthy,
155
- .adm-badge-public,
156
- .adm-badge-delivered,
157
- .adm-badge-settled,
158
- .adm-badge-owner { background: #D1FAE5; color: #047857; }
159
-
160
- .adm-badge-watch,
161
- .adm-badge-pending { background: #FEF3C7; color: #B45309; }
162
-
163
- .adm-badge-danger,
164
- .adm-badge-critical,
165
- .adm-badge-cancelled,
166
- .adm-badge-expired,
167
- .adm-badge-disputed,
168
- .adm-badge-error { background: #FEE2E2; color: #DC2626; }
169
-
170
- .adm-badge-info,
171
- .adm-badge-accepted,
172
- .adm-badge-in_progress,
173
- .adm-badge-operator,
174
- .adm-badge-syncing { background: #EFF6FF; color: #1D4ED8; }
175
-
176
- .adm-badge-private,
177
- .adm-badge-agent { background: #F5F3FF; color: #6D28D9; }
178
-
179
- .adm-badge-idle,
180
- .adm-badge-general { background: #F3F4F6; color: #6B7280; }
181
-
182
- /* Error / success toast */
183
- .adm-toast {
184
- padding: 10px 16px;
185
- border-radius: 8px;
186
- font-size: .85rem;
187
- margin-bottom: 12px;
188
- display: flex;
189
- align-items: center;
190
- gap: 8px;
191
- animation: adm-toast-in .2s ease;
192
- }
193
- .adm-toast-error { background: #FEE2E2; color: #DC2626; border: 1px solid #FECACA; }
194
- .adm-toast-success { background: #D1FAE5; color: #047857; border: 1px solid #A7F3D0; }
195
- .adm-toast-dismiss {
196
- margin-left: auto;
197
- cursor: pointer;
198
- opacity: .6;
199
- background: none;
200
- border: none;
201
- color: inherit;
202
- font-size: 1rem;
203
- }
204
- .adm-toast-dismiss:hover { opacity: 1; }
205
- @keyframes adm-toast-in { from { opacity: 0; transform: translateY(-8px); } to { opacity: 1; transform: translateY(0); } }
206
-
207
- /* Economy rows */
208
- .adm-erow { display: flex; justify-content: space-between; padding: 7px 0; border-bottom: 1px solid #F3F4F6; }
209
- .adm-erow:last-child { border-bottom: none; }
210
- .adm-elabel { color: #6B7280; font-size: .84rem; }
211
- .adm-eval { font-family: var(--font-mono); font-size: .81rem; font-weight: 600; color: #1A1A2E; }
212
-
213
- /* Health rows */
214
- .adm-hrow { display: flex; align-items: center; justify-content: space-between; padding: 8px 0; border-bottom: 1px solid #F3F4F6; }
215
- .adm-hrow:last-child { border-bottom: none; }
216
- .adm-hmetric { font-size: .84rem; color: #6B7280; }
217
- .adm-hval { font-family: var(--font-mono); font-size: .84rem; color: var(--accent, #6366F1); }
218
-
219
- /* Tables */
220
- .adm table { width: 100%; border-collapse: collapse; font-size: .81rem; }
221
- .adm th { text-align: left; color: #9CA3AF; font-weight: 600; padding: 8px 10px; border-bottom: 1px solid #E5E7EB; white-space: nowrap; font-size: .69rem; text-transform: uppercase; letter-spacing: .3px; }
222
- .adm td { padding: 8px 10px; border-bottom: 1px solid #F3F4F6; color: #6B7280; }
223
- .adm tr:hover td { background: #F9FAFB; }
224
-
225
- /* Misc */
226
- .adm .mono { font-family: var(--font-mono); font-size: .78rem; }
227
- .adm .scrollable { max-height: 600px; overflow-y: auto; }
228
- .adm .empty { color: #9CA3AF; text-align: center; padding: 24px; font-size: .85rem; }
229
- .adm .error-box { background: #FEE2E2; border: 1px solid #FECACA; border-radius: 8px; padding: 16px; color: #DC2626; margin: 20px 0; }
230
- .adm .tag { display: inline-block; background: #F3F4F6; color: #6B7280; padding: 1px 6px; border-radius: 4px; font-size: .7rem; margin: 1px; }
231
-
232
- /* Buttons */
233
- .adm-btn {
234
- background: var(--accent, #6366F1);
235
- color: #fff;
236
- border: none;
237
- padding: 8px 18px;
238
- border-radius: 10px;
239
- cursor: pointer;
240
- font-size: .81rem;
241
- font-weight: 600;
242
- font-family: inherit;
243
- transition: all .15s;
244
- }
245
- .adm-btn:hover { background: #4F46E5; }
246
- .adm-btn:disabled { opacity: .5; cursor: not-allowed; }
247
- .adm-btn-sm {
248
- background: none;
249
- border: 1px solid #E5E7EB;
250
- color: var(--accent, #6366F1);
251
- padding: 3px 10px;
252
- border-radius: 6px;
253
- cursor: pointer;
254
- font-size: .75rem;
255
- font-family: inherit;
256
- }
257
- .adm-btn-sm:hover { background: #F3F4F6; }
258
- .adm-btn-action {
259
- background: none;
260
- border: 1px solid #E5E7EB;
261
- color: var(--accent, #6366F1);
262
- padding: 4px 12px;
263
- border-radius: 6px;
264
- cursor: pointer;
265
- font-size: .78rem;
266
- font-family: inherit;
267
- }
268
- .adm-btn-action:hover { background: #F3F4F6; }
269
-
270
- /* Sub-panels */
271
- .adm-sub-panel {
272
- background: #F8FAFC;
273
- border: 1px solid #E5E7EB;
274
- border-radius: 8px;
275
- padding: 12px;
276
- margin-top: 8px;
277
- font-size: .8rem;
278
- }
279
-
280
- /* Inputs */
281
- .adm input[type="text"],
282
- .adm input[type="number"],
283
- .adm input[type="email"],
284
- .adm input[type="password"],
285
- .adm textarea,
286
- .adm select {
287
- padding: 8px 10px;
288
- border-radius: 6px;
289
- border: 1.5px solid #E5E7EB;
290
- background: #FAFAF8;
291
- color: #1A1A2E;
292
- font-size: .85rem;
293
- font-family: inherit;
294
- }
295
- .adm input:focus,
296
- .adm textarea:focus,
297
- .adm select:focus {
298
- border-color: var(--accent, #6366F1);
299
- box-shadow: 0 0 0 3px rgba(99,102,241,0.1);
300
- outline: none;
301
- }
302
-
303
- /* Login overlay */
304
- .adm-login {
305
- max-width: 420px;
306
- margin: 60px auto;
307
- text-align: center;
308
- }
309
- .adm-login h2 {
310
- font-size: 1.2rem;
311
- color: #1A1A2E;
312
- text-transform: none;
313
- letter-spacing: 0;
314
- margin-bottom: 4px;
315
- }
316
- .adm-login p { color: #6B7280; font-size: .85rem; margin-bottom: 16px; }
317
- .adm-login input { width: 100%; margin-bottom: 8px; }
318
- .adm-login-err {
319
- margin-top: 10px;
320
- padding: 8px;
321
- border-radius: 6px;
322
- background: #FEE2E2;
323
- border: 1px solid #FECACA;
324
- color: #DC2626;
325
- font-size: .85rem;
326
- }
327
-
328
- /* Config editor */
329
- .adm-config-changes {
330
- margin-bottom: 16px;
331
- padding: 12px;
332
- background: #FEF3C7;
333
- border: 1px solid #FDE68A;
334
- border-radius: 8px;
335
- }
336
- .adm-config-array-edit {
337
- width: 360px;
338
- max-width: 100%;
339
- min-height: 4.5rem;
340
- font-family: 'JetBrains Mono', monospace;
341
- font-size: 0.8rem;
342
- padding: 6px 8px;
343
- border: 1px solid var(--border, #E5E7EB);
344
- border-radius: 6px;
345
- resize: vertical;
346
- box-sizing: border-box;
347
- }
348
- .adm-config-readonly { opacity: 0.85; pointer-events: none; }
349
- .adm-config-readonly input,
350
- .adm-config-readonly select { background: #F3F4F6; cursor: not-allowed; }
351
- .adm-config-readonly-banner {
352
- margin-bottom: 16px;
353
- padding: 12px 16px;
354
- background: #EFF6FF;
355
- border: 1px solid #BFDBFE;
356
- border-radius: 8px;
357
- color: #1D4ED8;
358
- font-size: .85rem;
359
- }
360
-
361
- /* Expandable help sections */
362
- .adm-help {
363
- margin-bottom: 12px;
364
- border: 1px solid #E5E7EB;
365
- border-radius: 8px;
366
- background: #F8FAFC;
367
- }
368
- .adm-help-summary {
369
- cursor: pointer;
370
- padding: 10px 14px;
371
- color: var(--accent, #6366F1);
372
- font-size: .85rem;
373
- font-weight: 600;
374
- user-select: none;
375
- }
376
- .adm-help-summary:hover { color: #1A1A2E; }
377
- .adm-help-body {
378
- padding: 0 14px 12px;
379
- color: #6B7280;
380
- font-size: .82rem;
381
- line-height: 1.6;
382
- }
383
- .adm-help-body p { margin: 0 0 8px; }
384
- .adm-help-body ul { margin: 4px 0 8px; padding-left: 20px; }
385
- .adm-help-body li { margin-bottom: 4px; }
386
- .adm-help-body code {
387
- background: #F3F4F6;
388
- padding: 1px 5px;
389
- border-radius: 3px;
390
- font-size: .78rem;
391
- color: var(--accent, #6366F1);
392
- }
393
- .adm-help-body strong { color: #1A1A2E; }
394
-
395
- /* Card grid for card-based layouts */
396
- .adm-card-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(340px, 1fr)); gap: 16px; }
397
-
398
- /* Responsive */
399
- @media (max-width: 768px) {
400
- .adm-sidebar { display: none; }
401
- .adm-main { padding: 12px; }
402
- }
403
-
404
- /* ── System Prompts ── */
405
- .adm-prompt-editor { display: flex; flex-direction: column; gap: 8px; margin: 8px 0; }
406
- .adm-prompt-textarea {
407
- width: 100%; min-height: 300px; max-height: 600px;
408
- font-family: var(--font-mono); font-size: 13px; line-height: 1.5;
409
- background: #FAFAF8; border: 1.5px solid #E5E7EB;
410
- color: #1A1A2E; padding: 12px; border-radius: 8px;
411
- resize: vertical; box-sizing: border-box; tab-size: 2;
412
- }
413
- .adm-prompt-textarea:focus { border-color: var(--accent); outline: none; box-shadow: 0 0 0 3px rgba(99,102,241,0.1); }
414
- .adm-prompt-vars { font-size: .8rem; color: #6B7280; padding: 8px 12px; background: #F3F4F6; border-radius: 6px; margin: 4px 0; }
415
- .adm-prompt-vars code { color: var(--accent); }
416
- .adm-prompt-version-row {
417
- display: flex; align-items: center; gap: 8px; padding: 6px 0;
418
- border-bottom: 1px solid #F3F4F6; font-size: .85rem;
419
- }
420
- .adm-prompt-version-row:last-child { border-bottom: none; }
421
- .adm-prompt-used-tag {
422
- display: inline-block; font-size: .7rem; padding: 2px 6px;
423
- background: #F3F4F6; border: 1px solid #E5E7EB;
424
- border-radius: 4px; color: #6B7280; margin: 1px;
425
- }
426
- .adm-prompt-group-header {
427
- cursor: pointer; padding: 8px 0; font-weight: 600; color: #1A1A2E;
428
- display: flex; align-items: center; gap: 6px;
429
- border-bottom: 1px solid #F3F4F6;
430
- }
431
-
432
- /* ── Form Controls ── */
433
- .adm-input {
434
- background: #FAFAF8;
435
- border: 1.5px solid #E5E7EB;
436
- color: #1A1A2E;
437
- padding: 8px 12px;
438
- border-radius: 6px;
439
- font-size: .85rem;
440
- font-family: inherit;
441
- }
442
- .adm-input:focus { border-color: var(--accent); outline: none; box-shadow: 0 0 0 3px rgba(99,102,241,0.1); }
443
- .adm-input-full { width: 100%; }
444
-
445
- .adm-textarea {
446
- background: #FAFAF8;
447
- border: 1.5px solid #E5E7EB;
448
- color: #1A1A2E;
449
- padding: 10px;
450
- border-radius: 6px;
451
- font-family: var(--font-mono);
452
- font-size: .8rem;
453
- resize: vertical;
454
- line-height: 1.5;
455
- tab-size: 2;
456
- }
457
-
458
- /* ── Flex Utilities ── */
459
- .adm-flex { display: flex; gap: 8px; }
460
- .adm-flex-col { display: flex; flex-direction: column; gap: 8px; }
461
- .adm-flex-between { display: flex; justify-content: space-between; align-items: center; }
462
- .adm-flex-center { display: flex; align-items: center; gap: 8px; }
463
- .adm-flex-wrap { display: flex; flex-wrap: wrap; gap: 8px; }
464
-
465
- /* ── Text Utilities ── */
466
- .adm-text-xs { font-size: .7rem; }
467
- .adm-text-sm { font-size: .8rem; }
468
- .adm-text-base { font-size: .85rem; }
469
- .adm-text-dim { color: var(--text-dim); }
470
- .adm-text-bright { color: #1A1A2E; }
471
- .adm-text-accent { color: var(--accent); }
472
- .adm-text-error { color: #DC2626; }
473
- .adm-text-success { color: #047857; }
474
- .adm-text-mono { font-family: var(--font-mono); font-size: .8rem; }
475
-
476
- /* ── Spacing Utilities ── */
477
- .adm-gap-xs { gap: 4px; }
478
- .adm-gap-sm { gap: 8px; }
479
- .adm-gap-md { gap: 12px; }
480
- .adm-gap-lg { gap: 16px; }
481
-
482
- .adm-mb-xs { margin-bottom: 4px; }
483
- .adm-mb-sm { margin-bottom: 8px; }
484
- .adm-mb-md { margin-bottom: 12px; }
485
- .adm-mb-lg { margin-bottom: 16px; }
486
-
487
- .adm-mt-sm { margin-top: 8px; }
488
- .adm-mt-md { margin-top: 12px; }
489
- .adm-mt-lg { margin-top: 16px; }
490
-
491
- /* ── Modal ── */
492
- .adm-modal-overlay {
493
- position: fixed; inset: 0;
494
- background: rgba(26,26,46,.4);
495
- backdrop-filter: blur(8px);
496
- display: flex; align-items: center; justify-content: center;
497
- z-index: 1000;
498
- }
499
-
500
- /* ── Memory Tab ── */
501
- .adm-mem-stats {
502
- display: flex; gap: 16px; margin-bottom: 16px; flex-wrap: wrap;
503
- }
504
- .adm-mem-stat {
505
- background: var(--glass-bg); border: 1px solid var(--glass-border);
506
- border-radius: 10px; padding: 12px 20px; text-align: center; min-width: 100px;
507
- }
508
- .adm-mem-stat-value { display: block; font-size: 1.4rem; font-weight: 700; color: var(--accent); }
509
- .adm-mem-stat-label { display: block; font-size: .75rem; color: var(--text-dim); margin-top: 2px; }
510
- .adm-mem-filters {
511
- display: flex; gap: 8px; margin-bottom: 16px; flex-wrap: wrap; align-items: center;
512
- }
513
- .adm-mem-filters .adm-input {
514
- padding: 6px 10px; border: 1px solid var(--glass-border); border-radius: 6px;
515
- font-size: .85rem; background: var(--glass-bg); color: inherit; min-width: 160px;
516
- }
517
- .adm-mem-value-label { font-size: .8rem; color: var(--text-dim); margin-bottom: 4px; }
518
- .adm-mem-value {
519
- background: #f1f5f9; border: 1px solid var(--glass-border); border-radius: 6px;
520
- padding: 10px; font-size: .8rem; max-height: 300px; overflow: auto;
521
- white-space: pre-wrap; word-break: break-all; font-family: 'JetBrains Mono', monospace;
522
- }
523
- .adm-mem-pagination {
524
- display: flex; align-items: center; justify-content: center; gap: 12px;
525
- padding: 12px 0; border-top: 1px solid var(--glass-border); margin-top: 8px;
526
- }
527
- .adm-mem-page-info { font-size: .85rem; color: var(--text-dim); }
528
- .adm-btn-danger {
529
- color: #dc2626; border-color: #fecaca;
530
- }
531
- .adm-btn-danger:hover { background: #fef2f2; }
532
-
533
- /* Subtabs row */
534
- .adm-subtabs { display: flex; gap: 8px; margin: 16px 0; flex-wrap: wrap; }
535
-
536
- /* Active subtab button */
537
- .adm-btn-active,
538
- .adm-btn-active:hover { background: var(--accent, #6366F1); color: #fff; }
539
-
540
- /* Packages tab seed card */
541
- .adm-pkg-seed-card { margin-bottom: 16px; text-align: center; padding: 24px; }
542
- .adm-pkg-seed-text { margin-bottom: 12px; }
543
- .adm-pkg-seed-msg { margin-top: 8px; font-size: .85rem; color: var(--green, #34d399); }
544
-
545
- /* Template moderation */
546
- .adm-mod-section { margin-bottom: 16px; }
547
- .adm-mod-review { margin-top: 8px; }
548
- .adm-mod-review-title { font-size: 1rem; font-weight: 700; margin-bottom: 8px; color: var(--text-bright, #1A1A2E); }
549
- .adm-mod-desc { font-size: .85rem; color: var(--text-dim, #6B7280); margin-bottom: 8px; }
550
- .adm-mod-meta-grid { display: flex; gap: 16px; flex-wrap: wrap; margin-bottom: 8px; font-size: .84rem; }
551
- .adm-mod-meta-item { color: var(--text-dim, #6B7280); }
552
- .adm-mod-meta-item strong { color: var(--text-bright, #1A1A2E); }
553
- .adm-mod-tags { display: flex; gap: 4px; flex-wrap: wrap; margin-bottom: 8px; }
554
- .adm-mod-pre { font-size: .78rem; white-space: pre-wrap; word-break: break-all; max-height: 300px; overflow: auto; font-family: var(--font-mono); background: var(--bg-deep, #F8FAFC); border: 1px solid var(--glass-border, #E5E7EB); border-radius: 6px; padding: 10px; }
555
- .adm-mod-components { margin-bottom: 12px; }
556
- .adm-mod-components h5 { font-size: .84rem; margin-bottom: 6px; }
557
- .adm-mod-actions { display: flex; gap: 16px; flex-wrap: wrap; margin-top: 12px; }
558
- .adm-mod-action-group { flex: 1; min-width: 200px; display: flex; flex-direction: column; gap: 6px; }
559
- .adm-mod-action-label { font-size: .78rem; font-weight: 600; color: var(--text-dim, #6B7280); }
560
- .adm-mod-input { padding: 6px 10px; border: 1px solid var(--glass-border, #E5E7EB); border-radius: 6px; font-size: .85rem; background: var(--glass-bg, #fff); color: inherit; }
561
- .adm-mod-suspend-panel { margin-top: 8px; }
562
- .adm-mod-suspend-row { display: flex; gap: 8px; align-items: center; }
563
- .adm-mod-suspend-row .adm-mod-input { flex: 1; }
564
-
565
- /* Badge aliases for moderation statuses */
566
- .adm-badge-approved { background: #D1FAE5; color: #047857; }
567
- .adm-badge-rejected { background: #FEE2E2; color: #DC2626; }
568
- .adm-badge-suspended { background: #FEF3C7; color: #B45309; }
569
- .adm-badge-published { background: #D1FAE5; color: #047857; }
570
- .adm-badge-active { background: #D1FAE5; color: #047857; }
571
- .adm-badge-installed { background: #D1FAE5; color: #047857; }
572
-
573
- /* ── Board Members ── */
574
- .adm-board-detail { border-top: 1px solid var(--card-border, var(--glass-border)); padding-top: 8px; }
575
- .adm-board-post { margin-bottom: 6px; padding: 6px; background: var(--bg-card, var(--glass-bg)); border-radius: 6px; }
576
- .adm-board-members { border-top: 1px solid var(--card-border, var(--glass-border)); padding-top: 8px; }
577
- .adm-member-tag {
578
- display: inline-flex; align-items: center; gap: 4px;
579
- background: var(--glass-bg); border: 1px solid var(--glass-border);
580
- border-radius: 4px; padding: 2px 8px; font-size: .8rem;
581
- }
582
- .adm-member-tag code { font-size: .78rem; }
583
- .adm-member-remove {
584
- background: none; border: none; color: var(--text-dim); cursor: pointer;
585
- font-size: 1rem; line-height: 1; padding: 0 2px;
586
- }
587
- .adm-member-remove:hover { color: var(--danger, #E8564A); }
588
- .adm-member-add { display: flex; gap: 8px; align-items: center; }
589
- .adm-member-add .adm-input { flex: 1; font-size: .85rem; }
590
- .adm-font-mono { font-family: 'JetBrains Mono', monospace; }
591
-
592
- /* ── Stats Time Range Selector ── */
593
- .adm-time-range {
594
- display: flex;
595
- flex-wrap: wrap;
596
- align-items: center;
597
- gap: 8px;
598
- margin-bottom: 20px;
599
- padding: 12px 16px;
600
- background: var(--glass-bg, #FFFFFF);
601
- border: 1px solid var(--glass-border, #E5E7EB);
602
- border-radius: 8px;
603
- }
604
- .adm-time-range-label {
605
- font-size: 0.8rem;
606
- color: var(--text-dim);
607
- margin-right: 4px;
608
- }
609
- .adm-time-btn {
610
- padding: 4px 12px;
611
- font-size: 0.75rem;
612
- border: 1px solid var(--glass-border, #E5E7EB);
613
- border-radius: 6px;
614
- background: transparent;
615
- color: #1A1A2E;
616
- cursor: pointer;
617
- font-family: inherit;
618
- transition: all 0.15s;
619
- }
620
- .adm-time-btn:hover { border-color: var(--accent); color: var(--accent); }
621
- .adm-time-btn.active { background: var(--accent); color: #fff; border-color: var(--accent); }
622
- .adm-time-custom {
623
- display: flex;
624
- align-items: center;
625
- gap: 6px;
626
- margin-left: auto;
627
- }
628
- .adm-time-custom input[type="date"] {
629
- padding: 3px 8px;
630
- font-size: 0.75rem;
631
- border: 1px solid var(--glass-border, #E5E7EB);
632
- border-radius: 4px;
633
- background: #FAFAF8;
634
- color: #1A1A2E;
635
- font-family: inherit;
636
- }
637
-
638
- /* ── Stats Breakdown Table ── */
639
- .adm-breakdown-table {
640
- width: 100%;
641
- border-collapse: collapse;
642
- font-size: 0.78rem;
643
- margin-top: 8px;
644
- }
645
- .adm-breakdown-table th {
646
- text-align: left;
647
- padding: 6px 10px;
648
- color: var(--text-dim);
649
- border-bottom: 1px solid var(--glass-border, #E5E7EB);
650
- font-weight: 500;
651
- }
652
- .adm-breakdown-table td {
653
- padding: 5px 10px;
654
- border-bottom: 1px solid #F3F4F6;
655
- }
656
- .adm-breakdown-table td.num {
657
- text-align: right;
658
- font-variant-numeric: tabular-nums;
659
- }
660
-
661
- /* ── Stats Section Header Colors ── */
662
- .adm-section-purple { color: #a855f7; }
663
- .adm-section-cyan { color: #06b6d4; }
664
- .adm-section-violet { color: #8b5cf6; }
665
- .adm-section-amber { color: #f59e0b; }
666
- .adm-section-red { color: #ef4444; }
667
-
668
- /* ── Breakdown Table ── */
669
- .adm-breakdown-table th.num { text-align: right; }
670
-
671
- /* ── Stats Inline Breakdown ── */
672
- .adm-date-separator { color: var(--text-dim); }
673
- .adm-mailbox-inline { padding: 10px 16px; }
674
- .adm-blocked-reasons { margin-bottom: 6px; color: var(--text-dim); }
675
- .adm-channels-summary { color: var(--text-dim); }
676
-
677
- .adm-badge-live {
678
- display: inline-block;
679
- font-size: 0.6rem;
680
- padding: 1px 6px;
681
- border-radius: 4px;
682
- background: var(--accent);
683
- color: #fff;
684
- vertical-align: middle;
685
- margin-left: 6px;
686
- }
1
+ /* ── Admin Dashboard SPA Styles ──
2
+ * @file admin.css
3
+ * @description Admin dashboard (operator tooling) styles, .adm-* scoped. Keeps
4
+ * its distinct indigo accent and a permanently-dark sidebar, but all content
5
+ * surfaces map to global theme.css tokens so they flip with dark/light mode.
6
+ * @version-history
7
+ * v1.5.0 — 2026-06-02 — Component unification (#13 tables): strip the dead
8
+ * `, #E5E7EB` hardcoded fallback from `.adm-breakdown-table th` border
9
+ * (.adm always maps --glass-border → --border, so the fallback was dead
10
+ * light-frozen code). No visual change. The .adm table look is unchanged
11
+ * (scoped .adm table still wins over the new generic .data-table).
12
+ * v1.1.0 — 2026-06-02 — Tokenize all surfaces/text/borders/badges for dark mode (Phase 2).
13
+ * v1.2.0 — 2026-06-02 — Component unification (#3): remove .adm-modal-overlay
14
+ * duplicate; msm-tab now uses canonical theme.css .modal-overlay.
15
+ * v1.3.0 — 2026-06-02 — Component unification (#16): add tokenized
16
+ * .tag--status-* classes (replace agent-tasks-tab inline hex status colors).
17
+ * v1.4.0 — 2026-06-02 — Component unification (#21 key/value rows): strip the
18
+ * dead `, #6366F1` hardcoded hex fallbacks from every `var(--accent, #6366F1)`
19
+ * (10 sites incl. .adm-hval) — .adm always defines --accent (indigo light /
20
+ * #818CF8 dark), so the fallback was light-mode-frozen dead code. No visual
21
+ * change; removes hardcoded hex per Rule 7.3. .adm-erow/.adm-hrow markup left
22
+ * in place (mono/bordered look differs from canonical .kv-row).
23
+ */
24
+
25
+ /* Admin-scoped variables: indigo accent identity + surfaces mapped to global
26
+ (flipping) tokens. Text tiers inherit the global tokens so they flip too. */
27
+ .adm {
28
+ --accent: #6366F1;
29
+ --accent-light: rgba(99, 102, 241, 0.12);
30
+ --glass-border: var(--border);
31
+ --glass-bg: var(--bg-card);
32
+ --bg-deep: var(--bg);
33
+ --sidebar-bg: #1E293B; /* dark slate — sidebar stays dark in both themes (by design) */
34
+ --sidebar-text: #CBD5E1;
35
+ --sidebar-border: rgba(255, 255, 255, 0.08);
36
+ }
37
+ /* Brighten the indigo accent for contrast on dark surfaces */
38
+ [data-theme="dark"] .adm { --accent: #818CF8; }
39
+
40
+ /* Layout */
41
+ .adm { display: flex; min-height: 100vh; position: relative; z-index: 1; background: var(--bg-deep); color: var(--text); }
42
+
43
+ /* Sidebar — stays dark per mockup (its colors are intentionally fixed) */
44
+ .adm-sidebar {
45
+ width: 220px;
46
+ background: var(--sidebar-bg);
47
+ border-right: none;
48
+ padding: 16px 0;
49
+ flex-shrink: 0;
50
+ position: sticky;
51
+ top: 0;
52
+ height: 100vh;
53
+ overflow-y: auto;
54
+ display: flex;
55
+ flex-direction: column;
56
+ }
57
+ .adm-sidebar .node-id {
58
+ padding: 0 18px;
59
+ padding-top: 4px;
60
+ color: #475569;
61
+ font-size: .69rem;
62
+ font-family: var(--font-mono);
63
+ margin-bottom: 16px;
64
+ word-break: break-all;
65
+ }
66
+ .adm-nav-group {
67
+ font-size: .625rem;
68
+ text-transform: uppercase;
69
+ letter-spacing: 1px;
70
+ color: #475569;
71
+ padding: 0 18px;
72
+ margin-top: 16px;
73
+ margin-bottom: 4px;
74
+ font-weight: 700;
75
+ }
76
+ .adm-nav-item {
77
+ display: flex;
78
+ align-items: center;
79
+ gap: 10px;
80
+ padding: 7px 18px;
81
+ color: var(--sidebar-text, #CBD5E1);
82
+ font-size: .84rem;
83
+ cursor: pointer;
84
+ border: none;
85
+ background: none;
86
+ width: 100%;
87
+ text-align: left;
88
+ font-family: inherit;
89
+ font-weight: 400;
90
+ transition: all .1s;
91
+ border-left: 3px solid transparent;
92
+ }
93
+ .adm-nav-item:hover { background: rgba(255,255,255,0.04); color: #F1F5F9; }
94
+ .adm-nav-item.active {
95
+ color: #FFFFFF;
96
+ background: rgba(99,102,241,0.18);
97
+ border-left-color: var(--accent);
98
+ font-weight: 500;
99
+ }
100
+ .adm-nav-item .icon { font-size: .81rem; width: 16px; text-align: center; }
101
+ .adm-nav-item .label { flex: 1; }
102
+ .adm-nav-item .cnt {
103
+ background: rgba(255,255,255,0.08);
104
+ color: #94A3B8;
105
+ font-size: .69rem;
106
+ padding: 1px 7px;
107
+ border-radius: 9999px;
108
+ font-weight: 600;
109
+ }
110
+ .adm-sep { height: 1px; background: rgba(255,255,255,0.08); margin: 8px 16px; }
111
+
112
+ /* Main area */
113
+ .adm-main { flex: 1; padding: 24px 32px; overflow-y: auto; background: var(--bg-deep); }
114
+ .adm-topbar {
115
+ display: flex;
116
+ justify-content: space-between;
117
+ align-items: center;
118
+ margin-bottom: 20px;
119
+ flex-wrap: wrap;
120
+ gap: 10px;
121
+ }
122
+ .adm-topbar-right { display: flex; align-items: center; gap: 12px; }
123
+ .adm-page-title {
124
+ font-size: 1.375rem;
125
+ font-weight: 800;
126
+ color: var(--text);
127
+ display: flex;
128
+ align-items: center;
129
+ gap: 10px;
130
+ }
131
+
132
+ /* Cards */
133
+ .adm-grid { display: grid; gap: 16px; margin-bottom: 20px; }
134
+ .adm-grid-4 { grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); }
135
+ .adm-grid-3 { grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); }
136
+ .adm-grid-2 { grid-template-columns: repeat(auto-fit, minmax(340px, 1fr)); }
137
+ .adm-card {
138
+ background: var(--glass-bg, #FFFFFF);
139
+ border: 1px solid var(--glass-border, #E5E7EB);
140
+ border-radius: 14px;
141
+ padding: 20px 24px;
142
+ box-shadow: var(--shadow-sm);
143
+ }
144
+ .adm-card h2 {
145
+ font-size: .66rem;
146
+ text-transform: uppercase;
147
+ letter-spacing: .5px;
148
+ color: var(--text-muted);
149
+ margin-bottom: 6px;
150
+ font-weight: 700;
151
+ }
152
+ .adm-stat { font-size: 1.625rem; font-weight: 800; line-height: 1.1; color: var(--text); }
153
+ .adm-stat.indigo { color: var(--accent); }
154
+ .adm-stat.mint,
155
+ .adm-stat.green { color: var(--mint); }
156
+ .adm-stat.cyan { color: var(--teal); }
157
+ .adm-stat.amber { color: var(--warn); }
158
+ .adm-stat.purple { color: var(--purple); }
159
+ .adm-stat.blue { color: var(--blue); }
160
+ .adm-stat.orange { color: var(--orange); }
161
+ .adm-stat.red { color: var(--danger); }
162
+ .adm-stat-label { color: var(--text-muted); font-size: .69rem; margin-top: 2px; }
163
+
164
+ /* Badges */
165
+ .adm-badge {
166
+ display: inline-block;
167
+ padding: 2px 8px;
168
+ border-radius: 20px;
169
+ font-size: .7rem;
170
+ font-weight: 600;
171
+ text-transform: uppercase;
172
+ }
173
+ /* Badge semantic colors */
174
+ .adm-badge--success { background: var(--success-bg); color: var(--success-fg); }
175
+ .adm-badge--warning { background: var(--warn-bg); color: var(--warn-fg); }
176
+ .adm-badge--danger { background: var(--danger-bg); color: var(--danger-fg); }
177
+ .adm-badge--info { background: var(--info-bg); color: var(--info-fg); }
178
+ .adm-badge--accent { background: var(--purple-bg); color: var(--purple-fg); }
179
+ .adm-badge--muted { background: var(--bg-surface); color: var(--text-dim); }
180
+
181
+ /* Badge name aliases → semantic colors */
182
+ .adm-badge-healthy,
183
+ .adm-badge-public,
184
+ .adm-badge-delivered,
185
+ .adm-badge-settled,
186
+ .adm-badge-owner { background: var(--success-bg); color: var(--success-fg); }
187
+
188
+ .adm-badge-watch,
189
+ .adm-badge-pending { background: var(--warn-bg); color: var(--warn-fg); }
190
+
191
+ .adm-badge-danger,
192
+ .adm-badge-critical,
193
+ .adm-badge-cancelled,
194
+ .adm-badge-expired,
195
+ .adm-badge-disputed,
196
+ .adm-badge-error { background: var(--danger-bg); color: var(--danger-fg); }
197
+
198
+ .adm-badge-info,
199
+ .adm-badge-accepted,
200
+ .adm-badge-in_progress,
201
+ .adm-badge-operator,
202
+ .adm-badge-syncing { background: var(--info-bg); color: var(--info-fg); }
203
+
204
+ .adm-badge-private,
205
+ .adm-badge-agent { background: var(--purple-bg); color: var(--purple-fg); }
206
+
207
+ .adm-badge-idle,
208
+ .adm-badge-general { background: var(--bg-surface); color: var(--text-dim); }
209
+
210
+ /* Error / success toast */
211
+ .adm-toast {
212
+ padding: 10px 16px;
213
+ border-radius: 8px;
214
+ font-size: .85rem;
215
+ margin-bottom: 12px;
216
+ display: flex;
217
+ align-items: center;
218
+ gap: 8px;
219
+ animation: adm-toast-in .2s ease;
220
+ }
221
+ .adm-toast-error { background: var(--danger-bg); color: var(--danger-fg); border: 1px solid var(--danger-border); }
222
+ .adm-toast-success { background: var(--success-bg); color: var(--success-fg); border: 1px solid var(--success-border); }
223
+ .adm-toast-dismiss {
224
+ margin-left: auto;
225
+ cursor: pointer;
226
+ opacity: .6;
227
+ background: none;
228
+ border: none;
229
+ color: inherit;
230
+ font-size: 1rem;
231
+ }
232
+ .adm-toast-dismiss:hover { opacity: 1; }
233
+ @keyframes adm-toast-in { from { opacity: 0; transform: translateY(-8px); } to { opacity: 1; transform: translateY(0); } }
234
+
235
+ /* Economy rows */
236
+ .adm-erow { display: flex; justify-content: space-between; padding: 7px 0; border-bottom: 1px solid var(--border-subtle); }
237
+ .adm-erow:last-child { border-bottom: none; }
238
+ .adm-elabel { color: var(--text-dim); font-size: .84rem; }
239
+ .adm-eval { font-family: var(--font-mono); font-size: .81rem; font-weight: 600; color: var(--text); }
240
+
241
+ /* Health rows */
242
+ .adm-hrow { display: flex; align-items: center; justify-content: space-between; padding: 8px 0; border-bottom: 1px solid var(--border-subtle); }
243
+ .adm-hrow:last-child { border-bottom: none; }
244
+ .adm-hmetric { font-size: .84rem; color: var(--text-dim); }
245
+ .adm-hval { font-family: var(--font-mono); font-size: .84rem; color: var(--accent); }
246
+
247
+ /* Tables */
248
+ .adm table { width: 100%; border-collapse: collapse; font-size: .81rem; }
249
+ .adm th { text-align: left; color: var(--text-muted); font-weight: 600; padding: 8px 10px; border-bottom: 1px solid var(--border); white-space: nowrap; font-size: .69rem; text-transform: uppercase; letter-spacing: .3px; }
250
+ .adm td { padding: 8px 10px; border-bottom: 1px solid var(--border-subtle); color: var(--text-dim); }
251
+ .adm tr:hover td { background: var(--bg-surface); }
252
+
253
+ /* Misc */
254
+ .adm .mono { font-family: var(--font-mono); font-size: .78rem; }
255
+ .adm .scrollable { max-height: 600px; overflow-y: auto; }
256
+ .adm .empty { color: var(--text-muted); text-align: center; padding: 24px; font-size: .85rem; }
257
+ .adm .error-box { background: var(--danger-bg); border: 1px solid var(--danger-border); border-radius: 8px; padding: 16px; color: var(--danger-fg); margin: 20px 0; }
258
+ .adm .tag { display: inline-block; background: var(--bg-surface); color: var(--text-dim); padding: 1px 6px; border-radius: 4px; font-size: .7rem; margin: 1px; }
259
+ /* Status-colored task tags — tokenized (were inline hex colors). Color only;
260
+ base .adm .tag has no border so border-color stays inert as before. */
261
+ .adm .tag--status-active { color: var(--accent); }
262
+ .adm .tag--status-done { color: var(--success); }
263
+ .adm .tag--status-failed { color: var(--danger); }
264
+ .adm .tag--status-stalled { color: var(--warn); }
265
+ .adm .tag--status-queued { color: var(--purple); }
266
+ .adm .tag--status-draft { color: var(--text-dim); }
267
+
268
+ /* Buttons */
269
+ .adm-btn {
270
+ background: var(--accent);
271
+ color: #fff;
272
+ border: none;
273
+ padding: 8px 18px;
274
+ border-radius: 10px;
275
+ cursor: pointer;
276
+ font-size: .81rem;
277
+ font-weight: 600;
278
+ font-family: inherit;
279
+ transition: all .15s;
280
+ }
281
+ .adm-btn:hover { filter: brightness(0.92); }
282
+ .adm-btn:disabled { opacity: .5; cursor: not-allowed; }
283
+ .adm-btn-sm {
284
+ background: none;
285
+ border: 1px solid var(--border);
286
+ color: var(--accent);
287
+ padding: 3px 10px;
288
+ border-radius: 6px;
289
+ cursor: pointer;
290
+ font-size: .75rem;
291
+ font-family: inherit;
292
+ }
293
+ .adm-btn-sm:hover { background: var(--bg-surface); }
294
+ .adm-btn-action {
295
+ background: none;
296
+ border: 1px solid var(--border);
297
+ color: var(--accent);
298
+ padding: 4px 12px;
299
+ border-radius: 6px;
300
+ cursor: pointer;
301
+ font-size: .78rem;
302
+ font-family: inherit;
303
+ }
304
+ .adm-btn-action:hover { background: var(--bg-surface); }
305
+
306
+ /* Sub-panels */
307
+ .adm-sub-panel {
308
+ background: var(--bg-surface);
309
+ border: 1px solid var(--border);
310
+ border-radius: 8px;
311
+ padding: 12px;
312
+ margin-top: 8px;
313
+ font-size: .8rem;
314
+ }
315
+
316
+ /* Inputs */
317
+ .adm input[type="text"],
318
+ .adm input[type="number"],
319
+ .adm input[type="email"],
320
+ .adm input[type="password"],
321
+ .adm textarea,
322
+ .adm select {
323
+ padding: 8px 10px;
324
+ border-radius: 6px;
325
+ border: 1.5px solid var(--border);
326
+ background: var(--bg-input);
327
+ color: var(--text);
328
+ font-size: .85rem;
329
+ font-family: inherit;
330
+ }
331
+ .adm input:focus,
332
+ .adm textarea:focus,
333
+ .adm select:focus {
334
+ border-color: var(--accent);
335
+ box-shadow: 0 0 0 3px rgba(99,102,241,0.15);
336
+ outline: none;
337
+ }
338
+
339
+ /* Login overlay */
340
+ .adm-login {
341
+ max-width: 420px;
342
+ margin: 60px auto;
343
+ text-align: center;
344
+ }
345
+ .adm-login h2 {
346
+ font-size: 1.2rem;
347
+ color: var(--text);
348
+ text-transform: none;
349
+ letter-spacing: 0;
350
+ margin-bottom: 4px;
351
+ }
352
+ .adm-login p { color: var(--text-dim); font-size: .85rem; margin-bottom: 16px; }
353
+ .adm-login input { width: 100%; margin-bottom: 8px; }
354
+ .adm-login-err {
355
+ margin-top: 10px;
356
+ padding: 8px;
357
+ border-radius: 6px;
358
+ background: var(--danger-bg);
359
+ border: 1px solid var(--danger-border);
360
+ color: var(--danger-fg);
361
+ font-size: .85rem;
362
+ }
363
+
364
+ /* Config editor */
365
+ .adm-config-changes {
366
+ margin-bottom: 16px;
367
+ padding: 12px;
368
+ background: var(--warn-bg);
369
+ border: 1px solid var(--warn-border);
370
+ border-radius: 8px;
371
+ }
372
+ .adm-config-array-edit {
373
+ width: 360px;
374
+ max-width: 100%;
375
+ min-height: 4.5rem;
376
+ font-family: 'JetBrains Mono', monospace;
377
+ font-size: 0.8rem;
378
+ padding: 6px 8px;
379
+ border: 1px solid var(--border, #E5E7EB);
380
+ border-radius: 6px;
381
+ resize: vertical;
382
+ box-sizing: border-box;
383
+ }
384
+ .adm-config-readonly { opacity: 0.85; pointer-events: none; }
385
+ .adm-config-readonly input,
386
+ .adm-config-readonly select { background: var(--bg-surface); cursor: not-allowed; }
387
+ .adm-config-readonly-banner {
388
+ margin-bottom: 16px;
389
+ padding: 12px 16px;
390
+ background: var(--info-bg);
391
+ border: 1px solid var(--info-border);
392
+ border-radius: 8px;
393
+ color: var(--info-fg);
394
+ font-size: .85rem;
395
+ }
396
+ .adm-config-result-ok {
397
+ padding: 8px 12px;
398
+ border-radius: 6px;
399
+ background: var(--success-bg);
400
+ color: var(--success-fg);
401
+ border: 1px solid var(--success-border);
402
+ }
403
+
404
+ /* Expandable help sections */
405
+ .adm-help {
406
+ margin-bottom: 12px;
407
+ border: 1px solid var(--border);
408
+ border-radius: 8px;
409
+ background: var(--bg-surface);
410
+ }
411
+ .adm-help-summary {
412
+ cursor: pointer;
413
+ padding: 10px 14px;
414
+ color: var(--accent);
415
+ font-size: .85rem;
416
+ font-weight: 600;
417
+ user-select: none;
418
+ }
419
+ .adm-help-summary:hover { color: var(--text); }
420
+ .adm-help-body {
421
+ padding: 0 14px 12px;
422
+ color: var(--text-dim);
423
+ font-size: .82rem;
424
+ line-height: 1.6;
425
+ }
426
+ .adm-help-body p { margin: 0 0 8px; }
427
+ .adm-help-body ul { margin: 4px 0 8px; padding-left: 20px; }
428
+ .adm-help-body li { margin-bottom: 4px; }
429
+ .adm-help-body code {
430
+ background: var(--code-bg);
431
+ padding: 1px 5px;
432
+ border-radius: 3px;
433
+ font-size: .78rem;
434
+ color: var(--accent);
435
+ }
436
+ .adm-help-body strong { color: var(--text); }
437
+
438
+ /* Card grid for card-based layouts */
439
+ .adm-card-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(340px, 1fr)); gap: 16px; }
440
+
441
+ /* Responsive */
442
+ @media (max-width: 768px) {
443
+ .adm-sidebar { display: none; }
444
+ .adm-main { padding: 12px; }
445
+ }
446
+
447
+ /* ── System Prompts ── */
448
+ .adm-prompt-editor { display: flex; flex-direction: column; gap: 8px; margin: 8px 0; }
449
+ .adm-prompt-textarea {
450
+ width: 100%; min-height: 300px; max-height: 600px;
451
+ font-family: var(--font-mono); font-size: 13px; line-height: 1.5;
452
+ background: var(--bg-input); border: 1.5px solid var(--border);
453
+ color: var(--text); padding: 12px; border-radius: 8px;
454
+ resize: vertical; box-sizing: border-box; tab-size: 2;
455
+ }
456
+ .adm-prompt-textarea:focus { border-color: var(--accent); outline: none; box-shadow: 0 0 0 3px rgba(99,102,241,0.15); }
457
+ .adm-prompt-vars { font-size: .8rem; color: var(--text-dim); padding: 8px 12px; background: var(--bg-surface); border-radius: 6px; margin: 4px 0; }
458
+ .adm-prompt-vars code { color: var(--accent); }
459
+ .adm-prompt-version-row {
460
+ display: flex; align-items: center; gap: 8px; padding: 6px 0;
461
+ border-bottom: 1px solid var(--border-subtle); font-size: .85rem;
462
+ }
463
+ .adm-prompt-version-row:last-child { border-bottom: none; }
464
+ .adm-prompt-used-tag {
465
+ display: inline-block; font-size: .7rem; padding: 2px 6px;
466
+ background: var(--bg-surface); border: 1px solid var(--border);
467
+ border-radius: 4px; color: var(--text-dim); margin: 1px;
468
+ }
469
+ .adm-prompt-group-header {
470
+ cursor: pointer; padding: 8px 0; font-weight: 600; color: var(--text);
471
+ display: flex; align-items: center; gap: 6px;
472
+ border-bottom: 1px solid var(--border-subtle);
473
+ }
474
+
475
+ /* ── Form Controls ── */
476
+ .adm-input {
477
+ background: var(--bg-input);
478
+ border: 1.5px solid var(--border);
479
+ color: var(--text);
480
+ padding: 8px 12px;
481
+ border-radius: 6px;
482
+ font-size: .85rem;
483
+ font-family: inherit;
484
+ }
485
+ .adm-input:focus { border-color: var(--accent); outline: none; box-shadow: 0 0 0 3px rgba(99,102,241,0.15); }
486
+ .adm-input-full { width: 100%; }
487
+
488
+ .adm-textarea {
489
+ background: var(--bg-input);
490
+ border: 1.5px solid var(--border);
491
+ color: var(--text);
492
+ padding: 10px;
493
+ border-radius: 6px;
494
+ font-family: var(--font-mono);
495
+ font-size: .8rem;
496
+ resize: vertical;
497
+ line-height: 1.5;
498
+ tab-size: 2;
499
+ }
500
+
501
+ /* ── Flex Utilities ── */
502
+ .adm-flex { display: flex; gap: 8px; }
503
+ .adm-flex-col { display: flex; flex-direction: column; gap: 8px; }
504
+ .adm-flex-between { display: flex; justify-content: space-between; align-items: center; }
505
+ .adm-flex-center { display: flex; align-items: center; gap: 8px; }
506
+ .adm-flex-wrap { display: flex; flex-wrap: wrap; gap: 8px; }
507
+
508
+ /* ── Text Utilities ── */
509
+ .adm-text-xs { font-size: .7rem; }
510
+ .adm-text-sm { font-size: .8rem; }
511
+ .adm-text-base { font-size: .85rem; }
512
+ .adm-text-dim { color: var(--text-dim); }
513
+ .adm-text-bright { color: var(--text); }
514
+ .adm-text-accent { color: var(--accent); }
515
+ .adm-text-error { color: var(--danger-fg); }
516
+ .adm-text-success { color: var(--success-fg); }
517
+ .adm-text-mono { font-family: var(--font-mono); font-size: .8rem; }
518
+
519
+ /* ── Spacing Utilities ── */
520
+ .adm-gap-xs { gap: 4px; }
521
+ .adm-gap-sm { gap: 8px; }
522
+ .adm-gap-md { gap: 12px; }
523
+ .adm-gap-lg { gap: 16px; }
524
+
525
+ .adm-mb-xs { margin-bottom: 4px; }
526
+ .adm-mb-sm { margin-bottom: 8px; }
527
+ .adm-mb-md { margin-bottom: 12px; }
528
+ .adm-mb-lg { margin-bottom: 16px; }
529
+
530
+ .adm-mt-sm { margin-top: 8px; }
531
+ .adm-mt-md { margin-top: 12px; }
532
+ .adm-mt-lg { margin-top: 16px; }
533
+
534
+ /* ── Modal ── canonical overlay/box live in theme.css (.modal-overlay / .modal).
535
+ msm-tab uses .modal-overlay directly; no admin-specific override needed. */
536
+
537
+ /* ── Memory Tab ──
538
+ (the bespoke .adm-mem-stat summary cards were removed — memory/agent-tasks/
539
+ sharing-groups now use the canonical <StatsGrid>/.adm-stat pattern.) */
540
+ .adm-mem-filters {
541
+ display: flex; gap: 8px; margin-bottom: 16px; flex-wrap: wrap; align-items: center;
542
+ }
543
+ .adm-mem-filters .adm-input {
544
+ padding: 6px 10px; border: 1px solid var(--glass-border); border-radius: 6px;
545
+ font-size: .85rem; background: var(--glass-bg); color: inherit; min-width: 160px;
546
+ }
547
+ .adm-mem-value-label { font-size: .8rem; color: var(--text-dim); margin-bottom: 4px; }
548
+ .adm-mem-value {
549
+ background: var(--bg-surface); border: 1px solid var(--glass-border); border-radius: 6px;
550
+ padding: 10px; font-size: .8rem; max-height: 300px; overflow: auto;
551
+ white-space: pre-wrap; word-break: break-all; font-family: 'JetBrains Mono', monospace;
552
+ }
553
+ .adm-mem-pagination {
554
+ display: flex; align-items: center; justify-content: center; gap: 12px;
555
+ padding: 12px 0; border-top: 1px solid var(--glass-border); margin-top: 8px;
556
+ }
557
+ .adm-mem-page-info { font-size: .85rem; color: var(--text-dim); }
558
+ /* Semantic button modifiers — combine with .adm-btn-sm / .adm-btn-action
559
+ (which supply padding/radius). Theme-aware via tokens, never hardcoded hex.
560
+ These replace the ad-hoc inline style="color:#ef4444…" overrides that were
561
+ scattered across the tabs. */
562
+ .adm-btn-danger {
563
+ color: var(--danger-fg); border-color: var(--danger-border);
564
+ }
565
+ .adm-btn-danger:hover { background: var(--danger-bg); }
566
+ .adm-btn-success {
567
+ color: var(--success-fg); border-color: var(--success-border);
568
+ }
569
+ .adm-btn-success:hover { background: var(--success-bg); }
570
+ /* Solid danger — combine with .adm-btn (which supplies layout); the bg override
571
+ below wins on source order. For destructive primary actions (e.g. delete). */
572
+ .adm-btn-danger-solid {
573
+ background: var(--danger); color: #fff; border-color: transparent;
574
+ }
575
+ .adm-btn-danger-solid:hover { background: var(--danger); filter: brightness(0.92); }
576
+
577
+ /* Subtabs row */
578
+ .adm-subtabs { display: flex; gap: 8px; margin: 16px 0; flex-wrap: wrap; }
579
+
580
+ /* Active subtab button */
581
+ .adm-btn-active,
582
+ .adm-btn-active:hover { background: var(--accent); color: #fff; }
583
+
584
+ /* Packages tab seed card */
585
+ .adm-pkg-seed-card { margin-bottom: 16px; text-align: center; padding: 24px; }
586
+ .adm-pkg-seed-text { margin-bottom: 12px; }
587
+ .adm-pkg-seed-msg { margin-top: 8px; font-size: .85rem; color: var(--mint); }
588
+
589
+ /* Template moderation */
590
+ .adm-mod-section { margin-bottom: 16px; }
591
+ .adm-mod-review { margin-top: 8px; }
592
+ .adm-mod-review-title { font-size: 1rem; font-weight: 700; margin-bottom: 8px; color: var(--text-bright, #1A1A2E); }
593
+ .adm-mod-desc { font-size: .85rem; color: var(--text-dim, #6B7280); margin-bottom: 8px; }
594
+ .adm-mod-meta-grid { display: flex; gap: 16px; flex-wrap: wrap; margin-bottom: 8px; font-size: .84rem; }
595
+ .adm-mod-meta-item { color: var(--text-dim, #6B7280); }
596
+ .adm-mod-meta-item strong { color: var(--text-bright, #1A1A2E); }
597
+ .adm-mod-tags { display: flex; gap: 4px; flex-wrap: wrap; margin-bottom: 8px; }
598
+ .adm-mod-pre { font-size: .78rem; white-space: pre-wrap; word-break: break-all; max-height: 300px; overflow: auto; font-family: var(--font-mono); background: var(--bg-deep, #F8FAFC); border: 1px solid var(--glass-border, #E5E7EB); border-radius: 6px; padding: 10px; }
599
+ .adm-mod-components { margin-bottom: 12px; }
600
+ .adm-mod-components h5 { font-size: .84rem; margin-bottom: 6px; }
601
+ .adm-mod-actions { display: flex; gap: 16px; flex-wrap: wrap; margin-top: 12px; }
602
+ .adm-mod-action-group { flex: 1; min-width: 200px; display: flex; flex-direction: column; gap: 6px; }
603
+ .adm-mod-action-label { font-size: .78rem; font-weight: 600; color: var(--text-dim, #6B7280); }
604
+ .adm-mod-input { padding: 6px 10px; border: 1px solid var(--glass-border, #E5E7EB); border-radius: 6px; font-size: .85rem; background: var(--glass-bg, #fff); color: inherit; }
605
+ .adm-mod-suspend-panel { margin-top: 8px; }
606
+ .adm-mod-suspend-row { display: flex; gap: 8px; align-items: center; }
607
+ .adm-mod-suspend-row .adm-mod-input { flex: 1; }
608
+
609
+ /* Badge aliases for moderation statuses */
610
+ .adm-badge-approved { background: var(--success-bg); color: var(--success-fg); }
611
+ .adm-badge-rejected { background: var(--danger-bg); color: var(--danger-fg); }
612
+ .adm-badge-suspended { background: var(--warn-bg); color: var(--warn-fg); }
613
+ .adm-badge-published { background: var(--success-bg); color: var(--success-fg); }
614
+ .adm-badge-active { background: var(--success-bg); color: var(--success-fg); }
615
+ .adm-badge-installed { background: var(--success-bg); color: var(--success-fg); }
616
+
617
+ /* ── Board Members ── */
618
+ .adm-board-detail { border-top: 1px solid var(--card-border, var(--glass-border)); padding-top: 8px; }
619
+ .adm-board-post { margin-bottom: 6px; padding: 6px; background: var(--bg-card, var(--glass-bg)); border-radius: 6px; }
620
+ .adm-board-members { border-top: 1px solid var(--card-border, var(--glass-border)); padding-top: 8px; }
621
+ .adm-member-tag {
622
+ display: inline-flex; align-items: center; gap: 4px;
623
+ background: var(--glass-bg); border: 1px solid var(--glass-border);
624
+ border-radius: 4px; padding: 2px 8px; font-size: .8rem;
625
+ }
626
+ .adm-member-tag code { font-size: .78rem; }
627
+ .adm-member-remove {
628
+ background: none; border: none; color: var(--text-dim); cursor: pointer;
629
+ font-size: 1rem; line-height: 1; padding: 0 2px;
630
+ }
631
+ .adm-member-remove:hover { color: var(--danger, #E8564A); }
632
+ .adm-member-add { display: flex; gap: 8px; align-items: center; }
633
+ .adm-member-add .adm-input { flex: 1; font-size: .85rem; }
634
+ .adm-font-mono { font-family: 'JetBrains Mono', monospace; }
635
+
636
+ /* ── Stats Time Range Selector ── */
637
+ .adm-time-range {
638
+ display: flex;
639
+ flex-wrap: wrap;
640
+ align-items: center;
641
+ gap: 8px;
642
+ margin-bottom: 20px;
643
+ padding: 12px 16px;
644
+ background: var(--glass-bg, #FFFFFF);
645
+ border: 1px solid var(--glass-border, #E5E7EB);
646
+ border-radius: 8px;
647
+ }
648
+ .adm-time-range-label {
649
+ font-size: 0.8rem;
650
+ color: var(--text-dim);
651
+ margin-right: 4px;
652
+ }
653
+ .adm-time-btn {
654
+ padding: 4px 12px;
655
+ font-size: 0.75rem;
656
+ border: 1px solid var(--glass-border, #E5E7EB);
657
+ border-radius: 6px;
658
+ background: transparent;
659
+ color: var(--text);
660
+ cursor: pointer;
661
+ font-family: inherit;
662
+ transition: all 0.15s;
663
+ }
664
+ .adm-time-btn:hover { border-color: var(--accent); color: var(--accent); }
665
+ .adm-time-btn.active { background: var(--accent); color: #fff; border-color: var(--accent); }
666
+ .adm-time-custom {
667
+ display: flex;
668
+ align-items: center;
669
+ gap: 6px;
670
+ margin-left: auto;
671
+ }
672
+ .adm-time-custom input[type="date"] {
673
+ padding: 3px 8px;
674
+ font-size: 0.75rem;
675
+ border: 1px solid var(--glass-border, #E5E7EB);
676
+ border-radius: 4px;
677
+ background: var(--bg-input);
678
+ color: var(--text);
679
+ font-family: inherit;
680
+ }
681
+
682
+ /* ── Stats Breakdown Table ── */
683
+ .adm-breakdown-table {
684
+ width: 100%;
685
+ border-collapse: collapse;
686
+ font-size: 0.78rem;
687
+ margin-top: 8px;
688
+ }
689
+ .adm-breakdown-table th {
690
+ text-align: left;
691
+ padding: 6px 10px;
692
+ color: var(--text-dim);
693
+ border-bottom: 1px solid var(--border);
694
+ font-weight: 500;
695
+ }
696
+ .adm-breakdown-table td {
697
+ padding: 5px 10px;
698
+ border-bottom: 1px solid var(--border-subtle);
699
+ }
700
+ .adm-breakdown-table td.num {
701
+ text-align: right;
702
+ font-variant-numeric: tabular-nums;
703
+ }
704
+
705
+ /* ── Stats Section Header Colors ── */
706
+ .adm-section-purple { color: var(--purple); }
707
+ .adm-section-cyan { color: var(--teal); }
708
+ .adm-section-violet { color: var(--purple); }
709
+ .adm-section-amber { color: var(--warn); }
710
+ .adm-section-red { color: var(--danger); }
711
+
712
+ /* ── Breakdown Table ── */
713
+ .adm-breakdown-table th.num { text-align: right; }
714
+
715
+ /* ── Stats Inline Breakdown ── */
716
+ .adm-date-separator { color: var(--text-dim); }
717
+ .adm-mailbox-inline { padding: 10px 16px; }
718
+ .adm-blocked-reasons { margin-bottom: 6px; color: var(--text-dim); }
719
+ .adm-channels-summary { color: var(--text-dim); }
720
+
721
+ .adm-badge-live {
722
+ display: inline-block;
723
+ font-size: 0.6rem;
724
+ padding: 1px 6px;
725
+ border-radius: 4px;
726
+ background: var(--accent);
727
+ color: #fff;
728
+ vertical-align: middle;
729
+ margin-left: 6px;
730
+ }