koishi-plugin-dwrgbwiki 2.0.1 → 2.0.2
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/index.js +57 -6
- package/match.js +21 -21
- package/package.json +1 -1
package/index.js
CHANGED
|
@@ -198,7 +198,10 @@ module.exports = {
|
|
|
198
198
|
.description('接收反馈的平台(如 qq),留空则禁用反馈推送')
|
|
199
199
|
.default(''),
|
|
200
200
|
feedbackUserId: Schema.string()
|
|
201
|
-
.description('接收反馈的账号 id
|
|
201
|
+
.description('接收反馈的账号 id(私聊推送给该账号)')
|
|
202
|
+
.default(''),
|
|
203
|
+
feedbackChannelId: Schema.string()
|
|
204
|
+
.description('接收反馈的群/频道 id(推送反馈到该群,QQ 平台推荐使用群推送以避免私聊限制),优先于私聊推送')
|
|
202
205
|
.default(''),
|
|
203
206
|
noticeEnable: Schema.boolean()
|
|
204
207
|
.description('启用网易公告变动监听(正式服+共研服)')
|
|
@@ -306,6 +309,7 @@ module.exports = {
|
|
|
306
309
|
|
|
307
310
|
ctx.command('BWIKI机器人', '显示当前支持的指令列表')
|
|
308
311
|
.action(async ({ session }) => {
|
|
312
|
+
logCmd(ctx, session, 'BWIKI机器人')
|
|
309
313
|
return helpImage(ctx, config, MAIN_HELP)
|
|
310
314
|
})
|
|
311
315
|
|
|
@@ -315,6 +319,7 @@ module.exports = {
|
|
|
315
319
|
.example('胜率 小女孩 第43赛季 第3周 使用率')
|
|
316
320
|
.example('胜率 小女孩 43 3 胜率')
|
|
317
321
|
.action(async ({ session }, name, cond) => {
|
|
322
|
+
logCmd(ctx, session, '胜率', { name, cond })
|
|
318
323
|
if (!name || !name.trim()) return helpImage(ctx, config, HELP, undefined, cmdWidth(config, 'winrateWidth'))
|
|
319
324
|
return run(ctx, config, lib.collect, lib.buildHtml, name.trim(), cond, 'winrateWidth')
|
|
320
325
|
})
|
|
@@ -325,6 +330,7 @@ module.exports = {
|
|
|
325
330
|
.example('地图 红教堂 S44 3 求生者')
|
|
326
331
|
.example('地图 月亮河公园 全赛季')
|
|
327
332
|
.action(async ({ session }, name, cond) => {
|
|
333
|
+
logCmd(ctx, session, '地图', { name, cond })
|
|
328
334
|
if (!name || !name.trim()) return helpImage(ctx, config, MAP_HELP, undefined, cmdWidth(config, 'mapWidth'))
|
|
329
335
|
return run(ctx, config, lib.collectMap, lib.buildMapHtml, name.trim(), cond, 'mapWidth')
|
|
330
336
|
})
|
|
@@ -334,6 +340,7 @@ module.exports = {
|
|
|
334
340
|
.example('模仿者 侦探')
|
|
335
341
|
.example('模仿者 药剂师 260531 低级场')
|
|
336
342
|
.action(async ({ session }, name, cond) => {
|
|
343
|
+
logCmd(ctx, session, '模仿者', { name, cond })
|
|
337
344
|
if (!name || !name.trim()) return helpImage(ctx, config, MIMIC_HELP, undefined, cmdWidth(config, 'mimicWidth'))
|
|
338
345
|
return run(ctx, config, lib.collectMimic, lib.buildMimicHtml, name.trim(), cond, 'mimicWidth')
|
|
339
346
|
})
|
|
@@ -344,6 +351,7 @@ module.exports = {
|
|
|
344
351
|
.example('勋章 小女孩 20250917 7日增长率')
|
|
345
352
|
.example('勋章 小女孩 赛季同比增长率')
|
|
346
353
|
.action(async ({ session }, name, cond) => {
|
|
354
|
+
logCmd(ctx, session, '勋章', { name, cond })
|
|
347
355
|
if (!name || !name.trim()) return helpImage(ctx, config, BADGE_HELP, undefined, cmdWidth(config, 'badgeWidth'))
|
|
348
356
|
return run(ctx, config, lib.collectBadge, lib.buildBadgeHtml, name.trim(), cond, 'badgeWidth')
|
|
349
357
|
})
|
|
@@ -354,6 +362,7 @@ module.exports = {
|
|
|
354
362
|
.example('基础数据 移动速度 厂长')
|
|
355
363
|
.example('基础数据 厂长')
|
|
356
364
|
.action(async ({ session }, cond) => {
|
|
365
|
+
logCmd(ctx, session, '基础数据', { cond })
|
|
357
366
|
return basicDataImage(ctx, config, cond)
|
|
358
367
|
})
|
|
359
368
|
|
|
@@ -361,6 +370,7 @@ module.exports = {
|
|
|
361
370
|
.usage(CODEX_HELP)
|
|
362
371
|
.example('图鉴 时装 招风旗')
|
|
363
372
|
.action(async ({ session }, cond) => {
|
|
373
|
+
logCmd(ctx, session, '图鉴', { cond })
|
|
364
374
|
return codexImage(ctx, config, cond)
|
|
365
375
|
})
|
|
366
376
|
|
|
@@ -369,6 +379,7 @@ module.exports = {
|
|
|
369
379
|
.example('WIKI页面 招风旗')
|
|
370
380
|
.example('WIKI页面 杰克')
|
|
371
381
|
.action(async ({ session }, name) => {
|
|
382
|
+
logCmd(ctx, session, 'WIKI页面', { name })
|
|
372
383
|
return wikiPageImage(ctx, config, wikiStore, session.userId, name)
|
|
373
384
|
})
|
|
374
385
|
|
|
@@ -379,6 +390,7 @@ module.exports = {
|
|
|
379
390
|
.example('藏头 第五人格 谐音 时装')
|
|
380
391
|
.example('藏头 我爱你 随身物品')
|
|
381
392
|
.action(async ({ session }, cond) => {
|
|
393
|
+
logCmd(ctx, session, '藏头', { cond })
|
|
382
394
|
return cangtouText(ctx, config, cond)
|
|
383
395
|
})
|
|
384
396
|
|
|
@@ -387,6 +399,7 @@ module.exports = {
|
|
|
387
399
|
.example('藏头完整 我爱你')
|
|
388
400
|
.example('藏头完整 我爱你 首字母 时装')
|
|
389
401
|
.action(async ({ session }, cond) => {
|
|
402
|
+
logCmd(ctx, session, '藏头完整', { cond })
|
|
390
403
|
return cangtouFullImage(ctx, config, cond)
|
|
391
404
|
})
|
|
392
405
|
|
|
@@ -399,6 +412,7 @@ module.exports = {
|
|
|
399
412
|
.option('i <模式>', '合并模式:team/player/all/none,留空用默认配置')
|
|
400
413
|
.action(async ({ session, options }, sub, p1, p2) => {
|
|
401
414
|
const subFn = String(sub || '').trim().toLowerCase()
|
|
415
|
+
logCmd(ctx, session, '赛事-' + subFn, { p1, p2, mode: options && options.i })
|
|
402
416
|
if (!ctx.puppeteer) return '未检测到 puppeteer 服务,请先安装并启用 koishi-plugin-puppeteer'
|
|
403
417
|
const mode = options && options.i ? String(options.i).trim().toLowerCase() : (config.matchMerge || 'team')
|
|
404
418
|
|
|
@@ -469,6 +483,7 @@ module.exports = {
|
|
|
469
483
|
.usage(ROLE_HELP)
|
|
470
484
|
.example('角色 古董商')
|
|
471
485
|
.action(async ({ session }, name) => {
|
|
486
|
+
logCmd(ctx, session, '角色', { name })
|
|
472
487
|
return roleImage(ctx, config, name)
|
|
473
488
|
})
|
|
474
489
|
|
|
@@ -483,6 +498,7 @@ module.exports = {
|
|
|
483
498
|
.example('抽卡 幻象迷途')
|
|
484
499
|
.example('抽卡 加页手记')
|
|
485
500
|
.action(async ({ session }, type, poolId, count) => {
|
|
501
|
+
logCmd(ctx, session, '抽卡', { type, poolId, count })
|
|
486
502
|
if (!ctx.puppeteer) return '未检测到 puppeteer 服务,请先安装并启用 koishi-plugin-puppeteer'
|
|
487
503
|
if (!type || !type.trim()) return helpImage(ctx, config, GACHA_HELP, GACHA_HERO_SUB, cmdWidth(config, 'gachaWidth'))
|
|
488
504
|
const uid = session.userId
|
|
@@ -529,6 +545,7 @@ module.exports = {
|
|
|
529
545
|
|
|
530
546
|
ctx.command('抽卡资源', '查询自己的抽卡资源与已抽物品(图片版)')
|
|
531
547
|
.action(async ({ session }) => {
|
|
548
|
+
logCmd(ctx, session, '抽卡资源')
|
|
532
549
|
if (!ctx.puppeteer) return '未检测到 puppeteer 服务,请先安装并启用 koishi-plugin-puppeteer'
|
|
533
550
|
try {
|
|
534
551
|
const res = await gacha.gachaResources(gachaStore, session.userId)
|
|
@@ -553,6 +570,7 @@ module.exports = {
|
|
|
553
570
|
.example('抽卡重置 @某人')
|
|
554
571
|
.example('抽卡重置 123456789')
|
|
555
572
|
.action(async ({ session }, target) => {
|
|
573
|
+
logCmd(ctx, session, '抽卡重置', { target })
|
|
556
574
|
let uid = target && String(target).trim()
|
|
557
575
|
if (!uid) return '请 @ 要重置的用户,或直接输入其用户 id'
|
|
558
576
|
// 兼容 @at 引用:Koishi 会解析为 at 元素,从元素中提取目标用户 id
|
|
@@ -575,6 +593,9 @@ module.exports = {
|
|
|
575
593
|
}
|
|
576
594
|
})
|
|
577
595
|
.action(async ({ session, options }, content) => {
|
|
596
|
+
const raw0 = session.content ? String(session.content).trim() : ''
|
|
597
|
+
const isReply = /\s+-i\s+\d+\s*$/.test(raw0.replace(/^反馈\s*/, '').trim()) || /^-i\s+\d+/.test(raw0.replace(/^反馈\s*/, '').trim())
|
|
598
|
+
logCmd(ctx, session, '反馈' + (isReply ? '(回复)' : ''), { content })
|
|
578
599
|
// 从原始消息提取完整反馈文字(保留空格;text 类型会去掉空格)
|
|
579
600
|
const raw = session.content ? String(session.content).trim() : ''
|
|
580
601
|
const body = raw.replace(/^反馈\s*/, '').trim()
|
|
@@ -594,7 +615,18 @@ module.exports = {
|
|
|
594
615
|
await feedbackStore.markReplied(replyId)
|
|
595
616
|
return '已回复编号 ' + replyId + ' 的反馈者'
|
|
596
617
|
} catch (e) {
|
|
597
|
-
|
|
618
|
+
// 私聊失败时,若配置了反馈群则发到群里兜底
|
|
619
|
+
if (config.feedbackChannelId) {
|
|
620
|
+
try {
|
|
621
|
+
await bot.sendMessage(config.feedbackChannelId, '【反馈回复 #' + replyId + '】' + replyText + '\n(目标:' + record.userId + ',私聊失败已转发至此)')
|
|
622
|
+
await feedbackStore.markReplied(replyId)
|
|
623
|
+
return '已回复编号 ' + replyId + '(私聊失败,已转发到反馈群)'
|
|
624
|
+
} catch (e2) {
|
|
625
|
+
ctx.logger('dwrgbwiki').warn('回复反馈失败: ' + (e2 && e2.message ? e2.message : e2))
|
|
626
|
+
return '回复失败:' + (e2 && e2.message ? e2.message : e2)
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
ctx.logger('dwrgbwiki').warn('回复反馈失败: ' + (e && e.message ? e.message : e) + ' | stack: ' + (e && e.stack ? String(e.stack).slice(0, 300) : '') + ' | target: ' + record.platform + '/' + record.userId + ' | bot: ' + (bot.platform || '?') + ':' + (bot.selfId || bot.sid) + ' status=' + bot.status)
|
|
598
630
|
return '回复失败:' + (e && e.message ? e.message : e)
|
|
599
631
|
}
|
|
600
632
|
}
|
|
@@ -612,15 +644,20 @@ module.exports = {
|
|
|
612
644
|
time,
|
|
613
645
|
})
|
|
614
646
|
const feedbackMsg = '【反馈 #' + record.id + '】' + text + '\n反馈人:' + senderName + '\n来源:' + session.platform + '\n账号:' + session.userId + '\n时间:' + time + '\n回复:发送「反馈 <内容> -i ' + record.id + '」'
|
|
615
|
-
//
|
|
616
|
-
|
|
647
|
+
// 推送反馈:优先推送到指定群/频道,其次私聊管理员(QQ 官方机器人私聊有共同群限制)
|
|
648
|
+
const hasTarget = (config.feedbackPlatform && (config.feedbackChannelId || config.feedbackUserId))
|
|
649
|
+
if (hasTarget) {
|
|
617
650
|
const bot = ctx.bots && ctx.bots.find(b => b.platform === config.feedbackPlatform && b.status === 1)
|
|
618
651
|
if (bot) {
|
|
619
652
|
try {
|
|
620
|
-
|
|
653
|
+
if (config.feedbackChannelId) {
|
|
654
|
+
await bot.sendMessage(config.feedbackChannelId, feedbackMsg)
|
|
655
|
+
} else {
|
|
656
|
+
await bot.sendPrivateMessage(config.feedbackUserId, feedbackMsg)
|
|
657
|
+
}
|
|
621
658
|
return '已收到反馈(编号 #' + record.id + ')'
|
|
622
659
|
} catch (e) {
|
|
623
|
-
ctx.logger('dwrgbwiki').warn('反馈推送失败: ' + (e && e.message ? e.message : e))
|
|
660
|
+
ctx.logger('dwrgbwiki').warn('反馈推送失败: ' + (e && e.message ? e.message : e) + ' | stack: ' + (e && e.stack ? String(e.stack).slice(0, 300) : '') + ' | target: ' + config.feedbackPlatform + '/' + (config.feedbackChannelId || config.feedbackUserId) + ' | bot: ' + (bot.platform || '?') + ':' + (bot.selfId || bot.sid) + ' status=' + bot.status)
|
|
624
661
|
return '已收到反馈(编号 #' + record.id + ',但推送给管理员失败,请稍后重试)'
|
|
625
662
|
}
|
|
626
663
|
}
|
|
@@ -631,6 +668,20 @@ module.exports = {
|
|
|
631
668
|
},
|
|
632
669
|
}
|
|
633
670
|
|
|
671
|
+
// 记录指令调用日志(用户/平台/参数/耗时)
|
|
672
|
+
function logCmd(ctx, session, name, args, extra) {
|
|
673
|
+
try {
|
|
674
|
+
const logger = ctx.logger('dwrgbwiki')
|
|
675
|
+
const params = args && typeof args === 'object' ? JSON.stringify(args) : String(args || '')
|
|
676
|
+
const user = session && (session.username || session.userId || '未知')
|
|
677
|
+
const platform = session && session.platform || '?'
|
|
678
|
+
const info = ['指令', name, '| 用户', platform + ':' + user]
|
|
679
|
+
if (params && params !== '{}' && params !== '""') info.push('| 参数', params)
|
|
680
|
+
if (extra) info.push('|', extra)
|
|
681
|
+
logger.info(info.join(' '))
|
|
682
|
+
} catch (e) { /* 日志失败不影响主流程 */ }
|
|
683
|
+
}
|
|
684
|
+
|
|
634
685
|
function cmdWidth(config, key) {
|
|
635
686
|
const v = config[key]
|
|
636
687
|
return (v && v > 0) ? v : (config.width || 1300)
|
package/match.js
CHANGED
|
@@ -298,35 +298,35 @@ body { font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Microsoft YaHei'
|
|
|
298
298
|
.page { max-width:${width}px; margin:0 auto; }
|
|
299
299
|
.head { text-align:center; padding:22px 20px; border-radius:16px; margin-bottom:20px;
|
|
300
300
|
background:linear-gradient(135deg, #667eea 0%, #764ba2 100%); box-shadow:0 6px 24px rgba(0,0,0,.35); }
|
|
301
|
-
.player-id { font-size:
|
|
302
|
-
.player-team { font-size:
|
|
301
|
+
.player-id { font-size:34px; font-weight:800; color:#fff; letter-spacing:1px; }
|
|
302
|
+
.player-team { font-size:17px; color:rgba(255,255,255,.85); margin-top:8px; }
|
|
303
303
|
.role-tag { display:inline-flex; gap:10px; margin-top:12px; }
|
|
304
|
-
.role-tag span { font-size:
|
|
304
|
+
.role-tag span { font-size:15px; font-weight:700; padding:5px 18px; border-radius:20px;
|
|
305
305
|
border:2px solid rgba(255,255,255,.5); background:rgba(255,255,255,.2); color:#fff; }
|
|
306
306
|
.role-section { margin-bottom:22px; }
|
|
307
307
|
.career { background:rgba(22,27,34,.75); border:1px solid rgba(255,255,255,.09); border-radius:14px; padding:18px 20px; margin-bottom:14px; }
|
|
308
|
-
.career-head { font-size:
|
|
308
|
+
.career-head { font-size:23px; font-weight:800; color:#ffd76d; margin-bottom:14px; letter-spacing:1px; }
|
|
309
309
|
.stats-grid { display:grid; grid-template-columns:repeat(auto-fit, minmax(150px, 1fr)); gap:10px; }
|
|
310
310
|
.stat { background:rgba(255,255,255,.05); border:1px solid rgba(255,255,255,.08); border-radius:10px; padding:10px 12px; text-align:center; }
|
|
311
|
-
.stat-label { font-size:
|
|
312
|
-
.stat-value { font-size:
|
|
311
|
+
.stat-label { font-size:13.5px; color:#8b949e; margin-bottom:5px; }
|
|
312
|
+
.stat-value { font-size:19px; font-weight:700; color:#fff; }
|
|
313
313
|
.stat-value.win { color:#3fb950; }
|
|
314
314
|
.chars { display:flex; flex-wrap:wrap; gap:7px; margin-top:13px; justify-content:center; }
|
|
315
|
-
.chip { font-size:
|
|
315
|
+
.chip { font-size:15px; color:#79c0ff; background:rgba(88,166,255,.1); border:1px solid rgba(88,166,255,.25); border-radius:999px; padding:3px 11px; }
|
|
316
316
|
.table-wrap { background:rgba(22,27,34,.75); border:1px solid rgba(255,255,255,.09); border-radius:14px; overflow:hidden; }
|
|
317
317
|
table { width:100%; border-collapse:collapse; }
|
|
318
|
-
thead th { background:rgba(139,148,158,.1); color:#c9d1d9; font-size:
|
|
319
|
-
tbody td { text-align:center; padding:8px 9px; font-size:
|
|
318
|
+
thead th { background:rgba(139,148,158,.1); color:#c9d1d9; font-size:15px; font-weight:700; padding:10px 9px; white-space:nowrap; }
|
|
319
|
+
tbody td { text-align:center; padding:8px 9px; font-size:15.5px; border-top:1px solid rgba(255,255,255,.06); color:#e6edf3; white-space:nowrap; }
|
|
320
320
|
tbody tr:hover { background:rgba(255,255,255,.03); }
|
|
321
321
|
td.sname { color:#79c0ff; font-weight:700; }
|
|
322
322
|
td.win { color:#3fb950; font-weight:700; }
|
|
323
323
|
td.draw { color:#d29922; }
|
|
324
324
|
td.loss { color:#f85149; }
|
|
325
325
|
.chars-inline { display:flex; flex-wrap:wrap; gap:5px; justify-content:center; }
|
|
326
|
-
.chip-sm { font-size:
|
|
326
|
+
.chip-sm { font-size:14px; color:#e6edf3; background:rgba(88,166,255,.08); border:1px solid rgba(88,166,255,.2); border-radius:6px; padding:2px 7px; white-space:nowrap; }
|
|
327
327
|
.chip-sm i { font-style:normal; color:#8b949e; margin-left:3px; }
|
|
328
328
|
.none { color:#8b949e; }
|
|
329
|
-
.foot { text-align:center; color:#8b949e; font-size:
|
|
329
|
+
.foot { text-align:center; color:#8b949e; font-size:14px; margin-top:16px; opacity:.75; }
|
|
330
330
|
</style>
|
|
331
331
|
</head>
|
|
332
332
|
<body>
|
|
@@ -742,30 +742,30 @@ body { font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','Microsoft YaHei'
|
|
|
742
742
|
.page { max-width:${width}px; margin:0 auto; }
|
|
743
743
|
.head { text-align:center; padding:20px; border-radius:16px; margin-bottom:20px;
|
|
744
744
|
background:linear-gradient(135deg, #667eea 0%, #764ba2 100%); box-shadow:0 6px 24px rgba(0,0,0,.35); }
|
|
745
|
-
.title { font-size:
|
|
746
|
-
.sub { font-size:
|
|
745
|
+
.title { font-size:32px; font-weight:800; color:#fff; letter-spacing:1px; }
|
|
746
|
+
.sub { font-size:16px; color:rgba(255,255,255,.85); margin-top:8px; }
|
|
747
747
|
.summary { background:rgba(22,27,34,.75); border:1px solid rgba(255,255,255,.09); border-radius:14px; padding:16px 20px; margin-bottom:16px; }
|
|
748
|
-
.summary-row { font-size:
|
|
748
|
+
.summary-row { font-size:17px; line-height:1.9; color:#c9d1d9; }
|
|
749
749
|
.summary-row b { color:#fff; }
|
|
750
750
|
.summary-row .cnt { color:#ffd76d; font-weight:700; margin:0 3px; }
|
|
751
751
|
.summary-row .date { color:#79c0ff; }
|
|
752
|
-
.warn { background:rgba(248,81,73,.1); border:1px solid rgba(248,81,73,.35); color:#f85149; font-size:
|
|
752
|
+
.warn { background:rgba(248,81,73,.1); border:1px solid rgba(248,81,73,.35); color:#f85149; font-size:16px;
|
|
753
753
|
border-radius:10px; padding:10px 16px; margin-bottom:14px; }
|
|
754
754
|
.item { background:rgba(22,27,34,.75); border:1px solid rgba(255,255,255,.09); border-radius:14px; padding:16px 20px; margin-bottom:14px; }
|
|
755
755
|
.item-head { display:flex; justify-content:space-between; align-items:flex-start; }
|
|
756
|
-
.item-info { font-size:
|
|
756
|
+
.item-info { font-size:17px; color:#c9d1d9; line-height:1.6; }
|
|
757
757
|
.item-info b { color:#fff; }
|
|
758
|
-
.item-result { font-size:
|
|
758
|
+
.item-result { font-size:22px; font-weight:800; padding:4px 18px; border-radius:10px; }
|
|
759
759
|
.item-result.win { color:#3fb950; background:rgba(63,185,80,.12); border:1px solid rgba(63,185,80,.35); }
|
|
760
760
|
.item-result.loss { color:#f85149; background:rgba(248,81,73,.12); border:1px solid rgba(248,81,73,.35); }
|
|
761
761
|
.item-result.draw { color:#d29922; background:rgba(210,153,34,.12); border:1px solid rgba(210,153,34,.35); }
|
|
762
|
-
.item-score { font-size:
|
|
762
|
+
.item-score { font-size:18px; font-weight:700; color:#fff; margin:10px 0 8px; }
|
|
763
763
|
.games { margin-top:8px; }
|
|
764
764
|
.game-tbl { width:100%; border-collapse:collapse; }
|
|
765
|
-
.game-tbl th { background:rgba(139,148,158,.1); color:#8b949e; font-size:
|
|
766
|
-
.game-tbl td { text-align:center; padding:6px 8px; font-size:
|
|
765
|
+
.game-tbl th { background:rgba(139,148,158,.1); color:#8b949e; font-size:14.5px; font-weight:700; padding:7px 8px; text-align:center; white-space:nowrap; }
|
|
766
|
+
.game-tbl td { text-align:center; padding:6px 8px; font-size:15px; border-top:1px solid rgba(255,255,255,.06); color:#e6edf3; white-space:nowrap; }
|
|
767
767
|
.none { color:#8b949e; }
|
|
768
|
-
.foot { text-align:center; color:#8b949e; font-size:
|
|
768
|
+
.foot { text-align:center; color:#8b949e; font-size:14px; margin-top:16px; opacity:.75; }
|
|
769
769
|
</style>
|
|
770
770
|
</head>
|
|
771
771
|
<body>
|
package/package.json
CHANGED