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.
- package/README.md +2 -0
- package/README.zh-CN.md +2 -0
- package/frontend/activate.html +56 -17
- package/frontend/admin/admin-panel-v2.js +27 -21
- package/frontend/admin/index.html +21 -11
- package/frontend/assets/market-ui.css +227 -30
- package/frontend/index.html +97 -37
- package/frontend/user/index.html +4 -4
- package/lib/index.js +233 -35
- package/lib/services/cliproxy-api.js +1 -1
- package/lib/services/newapi.js +1 -1
- package/package.json +1 -1
|
@@ -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.
|
|
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
|
-
|
|
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:
|
|
1240
|
+
animation-duration: 16s;
|
|
1136
1241
|
animation-direction: reverse;
|
|
1137
1242
|
opacity: 0.72;
|
|
1138
1243
|
}
|
|
1139
1244
|
|
|
1140
|
-
.market-orbit-
|
|
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:
|
|
1146
|
-
height:
|
|
1147
|
-
border:
|
|
1148
|
-
border-radius: 24px;
|
|
1269
|
+
width: 42px;
|
|
1270
|
+
height: 42px;
|
|
1271
|
+
border-radius: 16px;
|
|
1149
1272
|
color: #fff;
|
|
1150
|
-
background: linear-gradient(135deg, var(--
|
|
1151
|
-
box-shadow: 0
|
|
1152
|
-
|
|
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
|
|
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: -
|
|
1333
|
+
--tilt: -8deg;
|
|
1161
1334
|
--speed: 6.5s;
|
|
1162
|
-
left:
|
|
1335
|
+
left: 1%;
|
|
1163
1336
|
top: 18%;
|
|
1164
1337
|
}
|
|
1165
1338
|
|
|
1166
|
-
.market-orbit-node
|
|
1339
|
+
.market-orbit-node-cdk {
|
|
1167
1340
|
--node-a: #ff7a59;
|
|
1168
1341
|
--node-b: #ffd166;
|
|
1169
|
-
--tilt:
|
|
1342
|
+
--tilt: 7deg;
|
|
1170
1343
|
--speed: 7.5s;
|
|
1171
|
-
right:
|
|
1172
|
-
top:
|
|
1344
|
+
right: 2%;
|
|
1345
|
+
top: 9%;
|
|
1173
1346
|
animation-delay: -1.8s;
|
|
1174
1347
|
}
|
|
1175
1348
|
|
|
1176
|
-
.market-orbit-node
|
|
1349
|
+
.market-orbit-node-quota {
|
|
1177
1350
|
--node-a: #17c3b2;
|
|
1178
1351
|
--node-b: #5eead4;
|
|
1179
|
-
--tilt:
|
|
1352
|
+
--tilt: 8deg;
|
|
1180
1353
|
--speed: 8s;
|
|
1181
|
-
right:
|
|
1182
|
-
bottom:
|
|
1354
|
+
right: 0;
|
|
1355
|
+
bottom: 20%;
|
|
1183
1356
|
animation-delay: -3s;
|
|
1184
1357
|
}
|
|
1185
1358
|
|
|
1186
|
-
.market-orbit-node
|
|
1187
|
-
--node-a: #
|
|
1359
|
+
.market-orbit-node-sync {
|
|
1360
|
+
--node-a: #111827;
|
|
1188
1361
|
--node-b: #6d5dfc;
|
|
1189
|
-
--tilt: -
|
|
1362
|
+
--tilt: -7deg;
|
|
1190
1363
|
--speed: 7s;
|
|
1191
|
-
left:
|
|
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
|
-
|
|
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 {
|
package/frontend/index.html
CHANGED
|
@@ -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>
|
|
7
|
-
<meta name="description" content="
|
|
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=
|
|
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">
|
|
23
|
-
<span class="market-brand-subtitle"
|
|
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>
|
|
46
|
-
<h1 id="hero-title" class="market-title"
|
|
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
|
-
|
|
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-
|
|
65
|
-
<
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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">
|
|
106
|
+
<span class="market-icon material-symbols-outlined">hub</span>
|
|
77
107
|
<div>
|
|
78
|
-
<p class="market-mini-title"
|
|
79
|
-
<p class="market-mini-copy"
|
|
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"
|
|
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">
|
|
114
|
+
<span class="market-icon material-symbols-outlined">key_vertical</span>
|
|
85
115
|
<div>
|
|
86
|
-
<p class="market-mini-title"
|
|
87
|
-
<p class="market-mini-copy"
|
|
116
|
+
<p class="market-mini-title">激活码管理</p>
|
|
117
|
+
<p class="market-mini-copy">支持生成、导出、绑定、过期状态追踪,方便批量运营。</p>
|
|
88
118
|
</div>
|
|
89
|
-
<span class="market-status-pill">
|
|
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"
|
|
95
|
-
<p class="market-mini-copy"
|
|
124
|
+
<p class="market-mini-title">配额监控</p>
|
|
125
|
+
<p class="market-mini-copy">快速查看请求、额度、用户状态和服务健康度。</p>
|
|
96
126
|
</div>
|
|
97
|
-
<span class="market-status-pill"
|
|
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"
|
|
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
|
|
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
|
|
130
|
-
<p
|
|
131
|
-
<div class="market-card-footer"><span class="market-tag"
|
|
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
|
|
143
|
-
<div class="market-card-footer"><span class="market-tag"
|
|
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
|
|
155
|
-
<p
|
|
156
|
-
<div class="market-card-footer"><span class="market-tag"
|
|
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>
|
package/frontend/user/index.html
CHANGED
|
@@ -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>
|
|
12
|
-
<meta name="description" content="
|
|
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=
|
|
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>
|