fogact 1.1.5 → 1.1.7

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.
@@ -211,6 +211,16 @@ body.market-user::after {
211
211
  box-shadow: var(--market-shadow-soft);
212
212
  }
213
213
 
214
+ .market-theme-toggle {
215
+ width: 40px;
216
+ min-width: 40px;
217
+ padding: 0;
218
+ }
219
+
220
+ .market-theme-toggle .material-symbols-outlined {
221
+ font-size: 20px;
222
+ }
223
+
214
224
  .market-button-primary {
215
225
  border-color: color-mix(in srgb, var(--market-primary) 70%, transparent);
216
226
  color: #fff;
@@ -222,6 +232,11 @@ body.market-user::after {
222
232
  color: #fff;
223
233
  }
224
234
 
235
+ html.dark .market-button:not(.market-button-primary),
236
+ body.market-dark .market-button:not(.market-button-primary) {
237
+ box-shadow: 0 1px 0 rgba(255, 255, 255, 0.08) inset;
238
+ }
239
+
225
240
  .market-hero {
226
241
  display: grid;
227
242
  grid-template-columns: minmax(0, 1.05fr) minmax(320px, 0.75fr);
@@ -263,7 +278,13 @@ body.market-user::after {
263
278
 
264
279
  html.dark .market-hero-main::before,
265
280
  html.dark .market-card::before,
266
- html.dark .market-auth-card::before {
281
+ html.dark .market-auth-card::before,
282
+ body.market-dark .market-hero-main::before,
283
+ body.market-dark .market-card::before,
284
+ body.market-dark .market-auth-card::before {
285
+ background:
286
+ radial-gradient(circle at 12% 0%, rgba(255, 255, 255, 0.12), transparent 25%),
287
+ linear-gradient(135deg, rgba(255, 255, 255, 0.08), transparent 36%);
267
288
  opacity: 0.09;
268
289
  }
269
290
 
@@ -710,6 +731,35 @@ html.dark .market-auth-card::before {
710
731
  color: var(--market-primary);
711
732
  }
712
733
 
734
+ .market-quick-links {
735
+ display: grid;
736
+ grid-template-columns: repeat(2, minmax(0, 1fr));
737
+ gap: 8px;
738
+ margin-top: 16px;
739
+ }
740
+
741
+ .market-quick-links a {
742
+ display: inline-flex;
743
+ align-items: center;
744
+ justify-content: center;
745
+ min-height: 36px;
746
+ border: 1px solid var(--market-line);
747
+ border-radius: 14px;
748
+ color: var(--market-ink);
749
+ background: var(--market-panel-muted);
750
+ text-decoration: none;
751
+ font-size: 13px;
752
+ font-weight: 800;
753
+ transition: transform 0.18s ease, border-color 0.18s ease, background 0.18s ease, color 0.18s ease;
754
+ }
755
+
756
+ .market-quick-links a:hover {
757
+ transform: translateY(-1px);
758
+ border-color: color-mix(in srgb, var(--market-primary) 42%, var(--market-line));
759
+ color: var(--market-primary);
760
+ background: color-mix(in srgb, var(--market-primary) 10%, var(--market-panel-muted));
761
+ }
762
+
713
763
  .market-result-list {
714
764
  display: grid;
715
765
  gap: 10px;
@@ -1041,6 +1091,59 @@ body.market-admin {
1041
1091
  background-color: color-mix(in srgb, var(--market-danger) 14%, transparent) !important;
1042
1092
  }
1043
1093
 
1094
+ html.dark .market-admin .bg-green-50,
1095
+ body.market-dark .market-admin .bg-green-50 {
1096
+ background-color: color-mix(in srgb, var(--market-success) 18%, transparent) !important;
1097
+ }
1098
+
1099
+ html.dark .market-admin .text-green-700,
1100
+ html.dark .market-admin .text-green-800,
1101
+ body.market-dark .market-admin .text-green-700,
1102
+ body.market-dark .market-admin .text-green-800 {
1103
+ color: color-mix(in srgb, var(--market-success) 82%, #fff 18%) !important;
1104
+ }
1105
+
1106
+ html.dark .market-admin .bg-amber-50,
1107
+ body.market-dark .market-admin .bg-amber-50 {
1108
+ background-color: color-mix(in srgb, var(--market-warning) 18%, transparent) !important;
1109
+ }
1110
+
1111
+ html.dark .market-admin .text-amber-700,
1112
+ body.market-dark .market-admin .text-amber-700 {
1113
+ color: color-mix(in srgb, var(--market-warning) 82%, #fff 18%) !important;
1114
+ }
1115
+
1116
+ html.dark .market-admin tbody tr,
1117
+ body.market-dark .market-admin tbody tr {
1118
+ box-shadow: 0 10px 24px rgba(0, 0, 0, 0.24);
1119
+ }
1120
+
1121
+ html.dark .market-admin option,
1122
+ body.market-dark .market-admin option {
1123
+ color: var(--market-ink);
1124
+ background: var(--market-bg-soft);
1125
+ }
1126
+
1127
+ html.dark .market-admin .modal-backdrop,
1128
+ body.market-dark .market-admin .modal-backdrop {
1129
+ background: rgba(0, 0, 0, 0.68) !important;
1130
+ }
1131
+
1132
+ html.dark .market-admin .border-b,
1133
+ body.market-dark .market-admin .border-b {
1134
+ border-color: var(--market-line) !important;
1135
+ }
1136
+
1137
+ html.dark .market-admin [class*="bg-error-container"],
1138
+ body.market-dark .market-admin [class*="bg-error-container"] {
1139
+ background-color: color-mix(in srgb, var(--market-danger) 16%, transparent) !important;
1140
+ }
1141
+
1142
+ html.dark .market-admin [class*="text-on-error-container"],
1143
+ body.market-dark .market-admin [class*="text-on-error-container"] {
1144
+ color: color-mix(in srgb, var(--market-danger) 76%, #fff 24%) !important;
1145
+ }
1146
+
1044
1147
  /* Built user app polish */
1045
1148
  body.market-user {
1046
1149
  overflow-x: hidden;
@@ -1116,7 +1219,7 @@ body.market-user {
1116
1219
  width: min(48vw, 440px);
1117
1220
  height: min(48vw, 440px);
1118
1221
  pointer-events: none;
1119
- opacity: 0.95;
1222
+ opacity: 0.98;
1120
1223
  }
1121
1224
 
1122
1225
  .market-orbit-stage::before,
@@ -1126,69 +1229,139 @@ body.market-user {
1126
1229
  inset: 12%;
1127
1230
  border: 1px solid color-mix(in srgb, var(--market-ink) 12%, transparent);
1128
1231
  border-radius: 999px;
1129
- animation: orbitSpin 18s linear infinite;
1232
+ background:
1233
+ radial-gradient(circle at center, color-mix(in srgb, var(--market-primary) 7%, transparent), transparent 62%);
1234
+ animation: orbitSpin 22s linear infinite;
1130
1235
  }
1131
1236
 
1132
1237
  .market-orbit-stage::after {
1133
1238
  inset: 25%;
1134
1239
  border-style: dashed;
1135
- animation-duration: 12s;
1240
+ animation-duration: 16s;
1136
1241
  animation-direction: reverse;
1137
1242
  opacity: 0.72;
1138
1243
  }
1139
1244
 
1140
- .market-orbit-node {
1245
+ .market-orbit-core {
1141
1246
  position: absolute;
1247
+ left: 50%;
1248
+ top: 50%;
1249
+ z-index: 2;
1250
+ display: grid;
1251
+ place-items: center;
1252
+ width: 132px;
1253
+ height: 132px;
1254
+ padding: 18px;
1255
+ border: 1px solid color-mix(in srgb, var(--market-primary) 30%, var(--market-line));
1256
+ border-radius: 36px;
1257
+ color: var(--market-ink);
1258
+ background:
1259
+ linear-gradient(145deg, color-mix(in srgb, var(--market-panel-strong) 92%, transparent), var(--market-panel-muted)),
1260
+ radial-gradient(circle at 30% 20%, color-mix(in srgb, var(--market-primary) 24%, transparent), transparent 58%);
1261
+ box-shadow: 0 24px 60px color-mix(in srgb, var(--market-primary) 20%, transparent);
1262
+ transform: translate(-50%, -50%) rotate(-2deg);
1263
+ }
1264
+
1265
+ .market-orbit-core .material-symbols-outlined {
1142
1266
  display: inline-flex;
1143
1267
  align-items: center;
1144
1268
  justify-content: center;
1145
- width: 74px;
1146
- height: 74px;
1147
- border: 1px solid var(--market-line-strong);
1148
- border-radius: 24px;
1269
+ width: 42px;
1270
+ height: 42px;
1271
+ border-radius: 16px;
1149
1272
  color: #fff;
1150
- background: linear-gradient(135deg, var(--node-a, var(--market-primary)), var(--node-b, var(--market-primary-2)));
1151
- box-shadow: 0 20px 50px color-mix(in srgb, var(--node-a, var(--market-primary)) 28%, transparent);
1152
- font-size: 28px;
1273
+ background: linear-gradient(135deg, var(--market-primary), var(--market-primary-2));
1274
+ box-shadow: 0 14px 32px color-mix(in srgb, var(--market-primary) 28%, transparent);
1275
+ }
1276
+
1277
+ .market-orbit-core strong {
1278
+ margin-top: 8px;
1279
+ font-family: var(--market-headline);
1280
+ font-size: 18px;
1281
+ letter-spacing: -0.04em;
1282
+ }
1283
+
1284
+ .market-orbit-core small {
1285
+ color: var(--market-muted);
1286
+ font-size: 12px;
1287
+ font-weight: 800;
1288
+ }
1289
+
1290
+ .market-orbit-node {
1291
+ position: absolute;
1292
+ z-index: 3;
1293
+ display: inline-flex;
1294
+ align-items: center;
1295
+ gap: 8px;
1296
+ min-width: 118px;
1297
+ min-height: 54px;
1298
+ padding: 10px 12px;
1299
+ border: 1px solid color-mix(in srgb, var(--node-a, var(--market-primary)) 30%, var(--market-line));
1300
+ border-radius: 20px;
1301
+ color: var(--market-ink);
1302
+ background:
1303
+ linear-gradient(145deg, color-mix(in srgb, var(--market-panel-strong) 94%, transparent), var(--market-panel-muted)),
1304
+ radial-gradient(circle at 15% 0%, color-mix(in srgb, var(--node-a, var(--market-primary)) 24%, transparent), transparent 64%);
1305
+ box-shadow: 0 18px 44px color-mix(in srgb, var(--node-a, var(--market-primary)) 18%, transparent);
1153
1306
  transform: translate3d(0, 0, 0) rotate(var(--tilt, 0deg));
1154
1307
  animation: nodeFloat var(--speed, 6s) ease-in-out infinite;
1155
1308
  }
1156
1309
 
1157
- .market-orbit-node:nth-child(1) {
1310
+ .market-orbit-node .material-symbols-outlined {
1311
+ display: inline-flex;
1312
+ align-items: center;
1313
+ justify-content: center;
1314
+ flex: 0 0 auto;
1315
+ width: 32px;
1316
+ height: 32px;
1317
+ border-radius: 13px;
1318
+ color: #fff;
1319
+ background: linear-gradient(135deg, var(--node-a, var(--market-primary)), var(--node-b, var(--market-primary-2)));
1320
+ font-size: 18px;
1321
+ }
1322
+
1323
+ .market-orbit-node span:last-child {
1324
+ color: var(--market-ink);
1325
+ font-size: 13px;
1326
+ font-weight: 900;
1327
+ white-space: nowrap;
1328
+ }
1329
+
1330
+ .market-orbit-node-cli {
1158
1331
  --node-a: #6d5dfc;
1159
1332
  --node-b: #b86bff;
1160
- --tilt: -10deg;
1333
+ --tilt: -8deg;
1161
1334
  --speed: 6.5s;
1162
- left: 6%;
1335
+ left: 1%;
1163
1336
  top: 18%;
1164
1337
  }
1165
1338
 
1166
- .market-orbit-node:nth-child(2) {
1339
+ .market-orbit-node-cdk {
1167
1340
  --node-a: #ff7a59;
1168
1341
  --node-b: #ffd166;
1169
- --tilt: 9deg;
1342
+ --tilt: 7deg;
1170
1343
  --speed: 7.5s;
1171
- right: 11%;
1172
- top: 7%;
1344
+ right: 2%;
1345
+ top: 9%;
1173
1346
  animation-delay: -1.8s;
1174
1347
  }
1175
1348
 
1176
- .market-orbit-node:nth-child(3) {
1349
+ .market-orbit-node-quota {
1177
1350
  --node-a: #17c3b2;
1178
1351
  --node-b: #5eead4;
1179
- --tilt: 12deg;
1352
+ --tilt: 8deg;
1180
1353
  --speed: 8s;
1181
- right: 5%;
1182
- bottom: 21%;
1354
+ right: 0;
1355
+ bottom: 20%;
1183
1356
  animation-delay: -3s;
1184
1357
  }
1185
1358
 
1186
- .market-orbit-node:nth-child(4) {
1187
- --node-a: #101014;
1359
+ .market-orbit-node-sync {
1360
+ --node-a: #111827;
1188
1361
  --node-b: #6d5dfc;
1189
- --tilt: -8deg;
1362
+ --tilt: -7deg;
1190
1363
  --speed: 7s;
1191
- left: 19%;
1364
+ left: 7%;
1192
1365
  bottom: 8%;
1193
1366
  animation-delay: -4.3s;
1194
1367
  }
@@ -1205,6 +1378,11 @@ body.market-user {
1205
1378
  overflow: hidden;
1206
1379
  }
1207
1380
 
1381
+ .market-signal-line-alt {
1382
+ transform: rotate(36deg);
1383
+ opacity: 0.42;
1384
+ }
1385
+
1208
1386
  .market-signal-line::after {
1209
1387
  content: "";
1210
1388
  position: absolute;
@@ -1214,6 +1392,10 @@ body.market-user {
1214
1392
  animation: signalSweep 2.6s cubic-bezier(0.16, 1, 0.3, 1) infinite;
1215
1393
  }
1216
1394
 
1395
+ .market-signal-line-alt::after {
1396
+ animation-delay: -1.1s;
1397
+ }
1398
+
1217
1399
  .market-card-lab {
1218
1400
  min-height: 318px;
1219
1401
  padding: 0;
@@ -1806,11 +1988,26 @@ body.is-pointer-active .market-mouse-light {
1806
1988
  height: 240px;
1807
1989
  }
1808
1990
 
1991
+ .market-orbit-core {
1992
+ width: 104px;
1993
+ height: 104px;
1994
+ border-radius: 28px;
1995
+ }
1996
+
1997
+ .market-orbit-core strong {
1998
+ font-size: 16px;
1999
+ }
2000
+
1809
2001
  .market-orbit-node {
1810
- width: 58px;
1811
- height: 58px;
2002
+ min-width: 58px;
2003
+ min-height: 58px;
2004
+ padding: 8px;
1812
2005
  border-radius: 20px;
1813
- font-size: 22px;
2006
+ justify-content: center;
2007
+ }
2008
+
2009
+ .market-orbit-node span:last-child {
2010
+ display: none;
1814
2011
  }
1815
2012
 
1816
2013
  .market-mouse-light {
@@ -3,13 +3,22 @@
3
3
  <head>
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
- <title>FogIDC Activator | 动态激活控制台</title>
7
- <meta name="description" content="FogIDC Activator 的用户中心、管理后台与激活码入口。" />
6
+ <title>FogAct | 多平台激活与配额管理</title>
7
+ <meta name="description" content="FogAct 提供用户中心、激活码管理、配额查看和多平台 CLI 接入入口。" />
8
+ <script>
9
+ ;(function () {
10
+ var theme = localStorage.getItem('fogact_theme') || localStorage.getItem('admin_theme') || localStorage.getItem('yunyi_user_theme') || 'system';
11
+ var prefersDark = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
12
+ var isDark = theme === 'dark' || (theme === 'system' && prefersDark);
13
+ document.documentElement.classList.toggle('dark', isDark);
14
+ document.documentElement.style.colorScheme = isDark ? 'dark' : 'light';
15
+ })();
16
+ </script>
8
17
  <link rel="preconnect" href="https://fonts.googleapis.com" />
9
18
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
10
19
  <link href="https://fonts.googleapis.com/css2?family=Manrope:wght@600;700;800&family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet" />
11
20
  <link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200" rel="stylesheet" />
12
- <link rel="stylesheet" href="/assets/market-ui.css?v=20260616-upstream2" />
21
+ <link rel="stylesheet" href="/assets/market-ui.css?v=20260619-theme1" />
13
22
  </head>
14
23
  <body class="market-page">
15
24
  <span class="market-mouse-light" aria-hidden="true"></span>
@@ -19,8 +28,8 @@
19
28
  <a class="market-brand" href="/">
20
29
  <span class="market-logo">F</span>
21
30
  <span>
22
- <span class="market-brand-title">FogIDC Activator</span>
23
- <span class="market-brand-subtitle">Motion control surface</span>
31
+ <span class="market-brand-title">FogAct</span>
32
+ <span class="market-brand-subtitle">多平台激活工作台</span>
24
33
  </span>
25
34
  </a>
26
35
 
@@ -31,6 +40,9 @@
31
40
  </nav>
32
41
 
33
42
  <div class="market-actions">
43
+ <button type="button" class="market-button market-theme-toggle" data-theme-toggle aria-label="切换暗黑模式">
44
+ <span class="material-symbols-outlined" data-theme-icon>light_mode</span>
45
+ </button>
34
46
  <a class="market-button" href="/api/stats">API</a>
35
47
  <a class="market-button market-button-primary" href="/user/">
36
48
  <span class="material-symbols-outlined">bolt</span>
@@ -42,10 +54,10 @@
42
54
  <main>
43
55
  <section class="market-hero" aria-labelledby="hero-title">
44
56
  <div class="market-hero-main">
45
- <div class="market-kicker"><span class="market-kicker-dot"></span> living interface for CLI activation</div>
46
- <h1 id="hero-title" class="market-title">不是工具页,是一个会呼吸的 <span>激活工作台</span></h1>
57
+ <div class="market-kicker"><span class="market-kicker-dot"></span> CLI 激活与配额管理</div>
58
+ <h1 id="hero-title" class="market-title">统一管理 Codex、Claude 与更多 <span>CLI 服务</span></h1>
47
59
  <p class="market-copy">
48
- 参考 21st.dev 的浏览式组件结构,但不照搬卡片模板:这里用轨道、错位、光扫、浮动组件和指针跟随做出更有辨识度的首页。
60
+ 在一个入口完成激活码发放、用户绑定、额度查看和服务配置,减少来回切换。
49
61
  </p>
50
62
 
51
63
  <label class="market-search" aria-label="搜索功能入口">
@@ -61,51 +73,75 @@
61
73
  <span class="market-ambient-item"><span class="material-symbols-outlined">query_stats</span></span>
62
74
  </div>
63
75
 
64
- <div class="market-orbit-stage" aria-hidden="true">
65
- <span class="market-orbit-node material-symbols-outlined">code</span>
66
- <span class="market-orbit-node material-symbols-outlined">vpn_key</span>
67
- <span class="market-orbit-node material-symbols-outlined">monitoring</span>
68
- <span class="market-orbit-node material-symbols-outlined">hub</span>
69
- <span class="market-signal-line"></span>
76
+ <div class="market-orbit-stage" aria-label="FogAct 服务流程拓扑">
77
+ <div class="market-orbit-core">
78
+ <span class="material-symbols-outlined">hub</span>
79
+ <strong>FogAct</strong>
80
+ <small>统一入口</small>
81
+ </div>
82
+ <span class="market-orbit-node market-orbit-node-cli">
83
+ <span class="material-symbols-outlined">terminal</span>
84
+ <span>CLI 接入</span>
85
+ </span>
86
+ <span class="market-orbit-node market-orbit-node-cdk">
87
+ <span class="material-symbols-outlined">vpn_key</span>
88
+ <span>CDK 校验</span>
89
+ </span>
90
+ <span class="market-orbit-node market-orbit-node-quota">
91
+ <span class="material-symbols-outlined">monitoring</span>
92
+ <span>配额监控</span>
93
+ </span>
94
+ <span class="market-orbit-node market-orbit-node-sync">
95
+ <span class="material-symbols-outlined">cloud_sync</span>
96
+ <span>上游同步</span>
97
+ </span>
98
+ <span class="market-signal-line market-signal-line-main"></span>
99
+ <span class="market-signal-line market-signal-line-alt"></span>
70
100
  </div>
71
101
  </div>
72
102
 
73
- <aside class="market-hero-side" aria-label="动态状态概览">
103
+ <aside class="market-hero-side" aria-label="服务状态概览">
74
104
  <div class="market-preview-stack">
75
105
  <div class="market-mini-card">
76
- <span class="market-icon material-symbols-outlined">auto_awesome_motion</span>
106
+ <span class="market-icon material-symbols-outlined">hub</span>
77
107
  <div>
78
- <p class="market-mini-title">动效层已启用</p>
79
- <p class="market-mini-copy">光扫、浮动、错位网格、指针光晕、卡片内组件各自运动。</p>
108
+ <p class="market-mini-title">服务接入</p>
109
+ <p class="market-mini-copy">统一承载 Codex、Claude Code、OpenCode 与 OpenClaw 等 CLI 场景。</p>
80
110
  </div>
81
- <span class="market-status-pill">Motion</span>
111
+ <span class="market-status-pill">已接入</span>
82
112
  </div>
83
113
  <div class="market-mini-card">
84
- <span class="market-icon material-symbols-outlined">gesture</span>
114
+ <span class="market-icon material-symbols-outlined">key_vertical</span>
85
115
  <div>
86
- <p class="market-mini-title">非模板化卡片</p>
87
- <p class="market-mini-copy">每张卡片的预览内容、节奏和视觉重心都不同。</p>
116
+ <p class="market-mini-title">激活码管理</p>
117
+ <p class="market-mini-copy">支持生成、导出、绑定、过期状态追踪,方便批量运营。</p>
88
118
  </div>
89
- <span class="market-status-pill">Custom</span>
119
+ <span class="market-status-pill">CDK</span>
90
120
  </div>
91
121
  <div class="market-mini-card">
92
122
  <span class="market-icon material-symbols-outlined">speed</span>
93
123
  <div>
94
- <p class="market-mini-title">轻量 CSS 动画</p>
95
- <p class="market-mini-copy">保留静态部署,不引入新前端构建链。</p>
124
+ <p class="market-mini-title">配额监控</p>
125
+ <p class="market-mini-copy">快速查看请求、额度、用户状态和服务健康度。</p>
96
126
  </div>
97
- <span class="market-status-pill">CSS</span>
127
+ <span class="market-status-pill">监控</span>
98
128
  </div>
99
129
  </div>
100
130
 
101
131
  <div class="market-panel" style="border-radius: 26px; padding: 18px;">
102
132
  <div class="market-card-footer">
103
- <span class="market-tag">Local server</span>
133
+ <span class="market-tag">本地服务</span>
104
134
  <span class="market-status-pill"><span class="market-kicker-dot"></span> 34020</span>
105
135
  </div>
106
136
  <p class="market-mini-copy" style="margin-top: 14px; font-size: 14px; line-height: 1.7;">
107
- 这一版把“统一样式”换成“动态产品感”:首页负责记忆点,后台和用户端继承氛围但不打断功能。
137
+ 本地 Web 服务默认运行在 34020 端口,提供首页、用户中心、管理中心和激活入口。
108
138
  </p>
139
+ <div class="market-quick-links" aria-label="本地服务快捷入口">
140
+ <a href="/">首页</a>
141
+ <a href="/user/">用户中心</a>
142
+ <a href="/admin/">管理中心</a>
143
+ <a href="/activate.html">激活入口</a>
144
+ </div>
109
145
  </div>
110
146
  </aside>
111
147
  </section>
@@ -114,7 +150,7 @@
114
150
  <div class="market-section-head">
115
151
  <div>
116
152
  <h2 id="section-title">工作区入口</h2>
117
- <p>卡片不再是同一个模板复制三次,而是分别表达“监控、管理、激活”的动作状态。</p>
153
+ <p>按使用角色拆分入口:查看用量、管理资源、完成激活,各自保持清晰路径。</p>
118
154
  </div>
119
155
  <a class="market-button" href="/admin/">打开管理中心</a>
120
156
  </div>
@@ -126,9 +162,9 @@
126
162
  <span class="market-widget market-widget-graph"><i></i><i></i><i></i><i></i></span>
127
163
  </div>
128
164
  <div class="market-card-content">
129
- <h3>用户用量雷达</h3>
130
- <p>用浮动指标卡和脉冲柱状图表达实时额度、请求量和用户状态。</p>
131
- <div class="market-card-footer"><span class="market-tag">Portal</span><span class="market-arrow">→</span></div>
165
+ <h3>用户中心</h3>
166
+ <p>查看额度、请求趋势、公告和个人配置,适合作为用户自助入口。</p>
167
+ <div class="market-card-footer"><span class="market-tag">用户入口</span><span class="market-arrow">→</span></div>
132
168
  </div>
133
169
  </a>
134
170
 
@@ -139,8 +175,8 @@
139
175
  </div>
140
176
  <div class="market-card-content">
141
177
  <h3>管理控制台</h3>
142
- <p>像组件面板一样管理用户、激活码、日志和设置,重点是效率而不是装饰。</p>
143
- <div class="market-card-footer"><span class="market-tag">Console</span><span class="market-arrow">→</span></div>
178
+ <p>集中维护用户、激活码、日志和系统设置,适合管理员日常操作。</p>
179
+ <div class="market-card-footer"><span class="market-tag">管理入口</span><span class="market-arrow">→</span></div>
144
180
  </div>
145
181
  </a>
146
182
 
@@ -151,9 +187,9 @@
151
187
  <span class="market-widget market-widget-badge material-symbols-outlined">bolt</span>
152
188
  </div>
153
189
  <div class="market-card-content">
154
- <h3>CDK 点火流程</h3>
155
- <p>把激活动作做成“点火”体验,强调输入、校验、开通的连续反馈。</p>
156
- <div class="market-card-footer"><span class="market-tag">Activation</span><span class="market-arrow">→</span></div>
190
+ <h3>CDK 激活</h3>
191
+ <p>输入激活码即可完成服务绑定,并返回额度、服务类型和有效期。</p>
192
+ <div class="market-card-footer"><span class="market-tag">激活入口</span><span class="market-arrow">→</span></div>
157
193
  </div>
158
194
  </a>
159
195
  </div>
@@ -179,6 +215,8 @@
179
215
  });
180
216
  });
181
217
 
218
+ initThemeToggle();
219
+
182
220
  document.querySelectorAll('.market-card-lab').forEach((card) => {
183
221
  card.addEventListener('pointermove', (event) => {
184
222
  const rect = card.getBoundingClientRect();
@@ -186,6 +224,28 @@
186
224
  card.style.setProperty('--my', `${((event.clientY - rect.top) / rect.height) * 100}%`);
187
225
  });
188
226
  });
227
+
228
+ function initThemeToggle() {
229
+ const button = document.querySelector('[data-theme-toggle]');
230
+ const icon = document.querySelector('[data-theme-icon]');
231
+ if (!button || !icon) return;
232
+
233
+ const sync = () => {
234
+ const isDark = document.documentElement.classList.contains('dark');
235
+ icon.textContent = isDark ? 'dark_mode' : 'light_mode';
236
+ button.setAttribute('aria-label', isDark ? '切换浅色模式' : '切换暗黑模式');
237
+ };
238
+
239
+ button.addEventListener('click', () => {
240
+ const isDark = !document.documentElement.classList.contains('dark');
241
+ document.documentElement.classList.toggle('dark', isDark);
242
+ document.documentElement.style.colorScheme = isDark ? 'dark' : 'light';
243
+ localStorage.setItem('fogact_theme', isDark ? 'dark' : 'light');
244
+ sync();
245
+ });
246
+
247
+ sync();
248
+ }
189
249
  </script>
190
250
  </body>
191
251
  </html>
@@ -8,15 +8,15 @@
8
8
  href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24' viewBox='0 0 24 24' fill='none' stroke='%239ca3af' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z'%3E%3C/path%3E%3C/svg%3E"
9
9
  />
10
10
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
11
- <title>CLIProxy - API 使用监控</title>
12
- <meta name="description" content="CLIProxy API 使用量监控平台" />
11
+ <title>FogAct 用户中心 | 用量与配额监控</title>
12
+ <meta name="description" content="FogAct 用户中心用于查看 API 用量、配额状态、公告和个人配置。" />
13
13
  <link rel="preconnect" href="https://fonts.googleapis.com" />
14
14
  <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
15
15
  <link href="https://fonts.googleapis.com/css2?family=Manrope:wght@600;700;800&family=Inter:wght@400;500;600;700;800&display=swap" rel="stylesheet" />
16
16
  <script>
17
17
  // 阻塞式主题初始化 — 防止 FOUC + 设置内联背景色
18
18
  ;(function () {
19
- var t = localStorage.getItem('yunyi_user_theme') || 'system'
19
+ var t = localStorage.getItem('fogact_theme') || localStorage.getItem('yunyi_user_theme') || 'system'
20
20
  var d = t === 'dark' || (t === 'system' && matchMedia('(prefers-color-scheme: dark)').matches)
21
21
  var el = document.documentElement
22
22
  if (d) {
@@ -31,7 +31,7 @@
31
31
  <script type="module" crossorigin src="assets/index-Da98HOxL.js"></script>
32
32
  <link rel="modulepreload" crossorigin href="assets/chart-vendor-CULJE59K.js">
33
33
  <link rel="stylesheet" crossorigin href="assets/index-B8QSyYhS.css">
34
- <link rel="stylesheet" href="/assets/market-ui.css?v=20260616-upstream2" />
34
+ <link rel="stylesheet" href="/assets/market-ui.css?v=20260619-theme1" />
35
35
  </head>
36
36
  <body class="market-user min-h-screen">
37
37
  <span class="market-mouse-light" aria-hidden="true"></span>