@morehao/dsh-github-trending 0.8.11 → 0.8.12

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 (3) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/client.js +117 -61
  3. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## [v0.8.12] - 2026-11-02
4
+
5
+ ### Refactors
6
+
7
+ - **client**: 恢复提示改为居中弹层并统一页面内容框 (#99)
8
+
9
+ **Full Changelog**: https://github.com/morehao/dsh-github-trending/compare/v0.8.11...v0.8.12
10
+
3
11
  ## [v0.8.11] - 2026-11-02
4
12
 
5
13
  ### Fixes
package/client.js CHANGED
@@ -284,10 +284,10 @@ var DICT = {
284
284
  "shell.update.confirmYes": "确认更新",
285
285
  "shell.update.cancel": "取消",
286
286
  "restoreNotice.title": "已更新到 v{version}",
287
+ "restoreNotice.titleInstalled": "新版本已安装",
287
288
  "restoreNotice.titleBare": "更新已安装",
288
- "restoreNotice.body": "请彻底退出 DSH(⌘Q)再重新打开,更新才会生效。此提示会保留到你点「知道了」。",
289
- "restoreNotice.restart": "退出并重启",
290
- "restoreNotice.dismiss": "知道了",
289
+ "restoreNotice.body": "请彻底退出 DSH(⌘Q)再重新打开,更新才会生效。",
290
+ "restoreNotice.dismiss": "关闭",
291
291
  "time.in.minutes": "{minutes} 分钟后",
292
292
  "time.in.hours": "{hours} 小时 {minutes} 分后",
293
293
  "time.in.days": "{days} 天后",
@@ -835,10 +835,10 @@ var DICT = {
835
835
  "shell.update.confirmYes": "Confirm",
836
836
  "shell.update.cancel": "Cancel",
837
837
  "restoreNotice.title": "Updated to v{version}",
838
+ "restoreNotice.titleInstalled": "New version installed",
838
839
  "restoreNotice.titleBare": "Update installed",
839
- "restoreNotice.body": "Quit DSH completely (⌘Q) and reopen it so the update takes effect. This notice stays until you click Got it.",
840
- "restoreNotice.restart": "Quit & Restart",
841
- "restoreNotice.dismiss": "Got it",
840
+ "restoreNotice.body": "Quit DSH completely (⌘Q) and reopen it so the update takes effect.",
841
+ "restoreNotice.dismiss": "Close",
842
842
  "time.in.minutes": "in {minutes} min",
843
843
  "time.in.hours": "in {hours} h {minutes} min",
844
844
  "time.in.days": "in {days} d",
@@ -1178,7 +1178,7 @@ var CSS = `
1178
1178
  .dshgt-tab[aria-selected="true"]{color:var(--gt-fg);border-bottom-color:var(--gt-accent);font-weight:600;white-space:nowrap;}
1179
1179
  .dshgt-shell{height:100%;min-height:0;overflow:hidden;}
1180
1180
  .dshgt-content{flex:1;min-height:0;display:flex;}
1181
- .dshgt-scroll{flex:1;min-height:0;overflow-y:auto;display:flex;flex-direction:column;gap:12px;padding-right:4px;}
1181
+ .dshgt-scroll{flex:1;min-height:0;overflow-y:auto;display:flex;flex-direction:column;gap:12px;}
1182
1182
  .dshgt-settings{flex:1;min-height:0;display:grid;grid-template-columns:150px minmax(0,1fr);gap:16px;}
1183
1183
  .dshgt-vtabs{display:flex;flex-direction:column;gap:2px;border-right:1px solid var(--gt-border);padding-right:8px;overflow-y:auto;}
1184
1184
  .dshgt-vtab{appearance:none;border:none;background:none;text-align:left;padding:7px 10px;border-radius:7px;color:var(--gt-muted);cursor:pointer;font:inherit;font-size:12px;display:flex;align-items:center;gap:6px;}
@@ -1246,14 +1246,22 @@ var CSS = `
1246
1246
  .dshgt-modal-mask{position:fixed;inset:0;background:var(--dsw-alias-bg-mask-1,rgba(15,23,42,.38));display:flex;align-items:center;justify-content:center;z-index:2147483000;}
1247
1247
  .dshgt-modal{background:var(--gt-bg);border-radius:12px;border:1px solid var(--gt-border);max-width:640px;width:calc(100% - 32px);max-height:80vh;overflow:auto;padding:16px;display:flex;flex-direction:column;gap:10px;box-shadow:0 20px 50px rgba(15,23,42,.25);}
1248
1248
 
1249
- /* ——— 自更新后的恢复提示(正文顶部醒目横条,点「知道了」才收起) ——— */
1250
- .dshgt-restore{flex:none;display:flex;align-items:flex-start;gap:12px;padding:12px 16px;border-radius:10px;border:1px solid color-mix(in srgb,var(--gt-accent) 45%,var(--gt-border));border-left:4px solid var(--gt-accent);background:color-mix(in srgb,var(--gt-accent) 9%,var(--gt-bg));animation:dshgt-restore-in .18s ease-out;}
1251
- .dshgt-restore-icon{flex:none;width:22px;height:22px;border-radius:50%;display:inline-flex;align-items:center;justify-content:center;font-size:14px;line-height:1;color:var(--gt-accent);background:color-mix(in srgb,var(--gt-accent) 16%,transparent);}
1252
- .dshgt-restore-text{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px;}
1253
- .dshgt-restore-title{font-size:13.5px;font-weight:600;color:var(--gt-fg);}
1254
- .dshgt-restore-body{font-size:12.5px;line-height:1.5;color:var(--gt-muted);}
1255
- .dshgt-restore-actions{flex:none;display:flex;align-items:center;gap:8px;align-self:center;}
1256
- @keyframes dshgt-restore-in{from{opacity:0;transform:translateY(-6px);}to{opacity:1;transform:translateY(0);}}
1249
+ /* ——— 自更新后的恢复提示:居中弹层,唯一动作「关闭」,版本跨栏当主角 ——— */
1250
+ .dshgt-restore-mask{position:fixed;inset:0;z-index:2147483000;display:flex;align-items:center;justify-content:center;padding:24px;background:var(--dsw-alias-bg-mask-1,rgba(15,23,42,.38));animation:dshgt-restore-mask-in .14s ease-out;}
1251
+ .dshgt-restore{width:100%;max-width:448px;padding:18px 20px 12px;border-radius:10px;border:1px solid var(--gt-border);background:var(--gt-bg);box-shadow:0 24px 60px rgba(15,23,42,.28),0 2px 8px rgba(15,23,42,.08);animation:dshgt-restore-in .16s cubic-bezier(.2,.8,.3,1);}
1252
+ .dshgt-restore-versions{display:flex;align-items:center;gap:8px;}
1253
+ .dshgt-restore-version{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;font-weight:500;line-height:24px;color:var(--gt-muted);}
1254
+ .dshgt-restore-version.is-new{font-weight:650;padding:0 8px;border-radius:6px;color:var(--gt-accent);background:color-mix(in srgb,var(--gt-accent) 9%,var(--gt-bg));}
1255
+ .dshgt-restore-arrow{display:inline-flex;align-items:center;justify-content:center;color:var(--gt-muted);}
1256
+ .dshgt-restore-title{font-size:15px;font-weight:600;letter-spacing:-.008em;color:var(--gt-fg);}
1257
+ .dshgt-restore-versions + .dshgt-restore-title{margin-top:12px;}
1258
+ .dshgt-restore-body{margin:5px 0 0;font-size:13px;line-height:1.6;color:var(--gt-muted);}
1259
+ .dshgt-restore-foot{display:flex;justify-content:flex-end;margin-top:14px;}
1260
+ .dshgt-restore-close{appearance:none;font:inherit;font-size:13px;cursor:pointer;padding:5px 10px;border-radius:7px;border:1px solid transparent;background:none;color:var(--gt-accent);}
1261
+ .dshgt-restore-close:hover{background:color-mix(in srgb,var(--gt-accent) 10%,transparent);}
1262
+ @keyframes dshgt-restore-in{from{opacity:0;transform:translateY(6px) scale(.985);}to{opacity:1;transform:none;}}
1263
+ @keyframes dshgt-restore-mask-in{from{opacity:0;}to{opacity:1;}}
1264
+ @media (prefers-reduced-motion:reduce){.dshgt-restore-mask,.dshgt-restore{animation:none;}}
1257
1265
 
1258
1266
  /* ——— GitHub 设备码登录弹窗 ——— */
1259
1267
  .dshgt-authmodal{max-width:420px;gap:14px;}
@@ -1272,7 +1280,11 @@ var CSS = `
1272
1280
 
1273
1281
  /* ——— 01 工作台外壳 ——— */
1274
1282
  .dshgt-shell{gap:0;height:100%;min-height:0;overflow:hidden;}
1275
- .dshgt-app{flex:1;min-height:0;display:flex;flex-direction:column;background:var(--gt-bg);}
1283
+ /* 全页统一内容框:五个 tab 的身份条 / tab 条 / 页头 / 正文共用同一条
1284
+ 「内容宽度 + 左右留白」规则,宽屏居中、窄屏退化为最小 gutter。
1285
+ 页面内不要再给单个视图加 max-width / margin-inline:auto,否则又会出现
1286
+ 一半居中一半靠左。 */
1287
+ .dshgt-app{flex:1;min-height:0;display:flex;flex-direction:column;background:var(--gt-bg);--dshgt-frame:1100px;--dshgt-gutter:30px;--dshgt-inset:max(var(--dshgt-gutter),calc((100% - var(--dshgt-frame)) / 2));}
1276
1288
  .dshgt-rail{background:color-mix(in srgb,var(--gt-fg) 3%,var(--gt-bg));border-right:1px solid var(--gt-border);display:flex;flex-direction:column;padding:14px 10px 12px;min-height:0;overflow:hidden;}
1277
1289
  .dshgt-brand{display:flex;align-items:center;gap:9px;padding:2px 6px 16px;}
1278
1290
  .dshgt-brand svg{flex:none;border-radius:8px;}
@@ -1302,18 +1314,18 @@ var CSS = `
1302
1314
  .dshgt-pkg-copy:hover{background:color-mix(in srgb,var(--gt-fg) 7%,var(--gt-bg));color:var(--gt-fg);}
1303
1315
  .dshgt-pkg-copy:disabled{opacity:.4;cursor:not-allowed;}
1304
1316
  .dshgt-main{flex:1;display:flex;flex-direction:column;min-width:0;min-height:0;background:var(--gt-bg);}
1305
- .dshgt-page-head{display:flex;align-items:flex-start;gap:16px;padding:20px 30px 14px;border-bottom:1px solid color-mix(in srgb,var(--gt-border) 70%,transparent);flex:none;}
1317
+ .dshgt-page-head{display:flex;align-items:flex-start;gap:16px;padding:20px var(--dshgt-inset) 14px;border-bottom:1px solid color-mix(in srgb,var(--gt-border) 70%,transparent);flex:none;}
1306
1318
  .dshgt-page-heading{min-width:0;}
1307
1319
  .dshgt-page-head h1{margin:0;font-size:21px;line-height:1.25;font-weight:650;letter-spacing:-.012em;}
1308
1320
  .dshgt-dek{margin:4px 0 0;font-size:13px;color:var(--gt-muted);max-width:580px;line-height:1.5;}
1309
1321
  .dshgt-head-actions{margin-left:auto;display:flex;align-items:center;gap:8px;padding-top:2px;flex:none;}
1310
1322
  .dshgt-main-body{flex:1;min-height:0;display:flex;min-width:0;}
1311
- .dshgt-scroll{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden;scrollbar-gutter:stable;}
1312
- .dshgt-main-body > .dshgt-settings{flex:1;min-height:0;padding:16px 24px 20px;width:100%;max-width:1240px;margin-inline:auto;}
1313
- /* 视图区随可用宽度自适应:不再硬卡 1180,避免超宽屏右侧留大片空白。
1314
- 结构化内容(卡片 / 网格 / 表格 / 列表)铺满;只有长文阅读块(日报正文、空态说明)
1315
- 单独限制行宽并居中,保证可读性。与 .dshgt-page-head 的左/右内边距保持一致。 */
1316
- .dshgt-view{padding:22px 30px 38px;width:100%;display:flex;flex-direction:column;gap:18px;}
1323
+ .dshgt-scroll{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden;scrollbar-gutter:stable both-edges;}
1324
+ /* 设置页不在 .dshgt-scroll 里(自己管理左右分栏滚动),但内容框必须与其它四页完全一致。 */
1325
+ .dshgt-main-body > .dshgt-settings{flex:1;min-height:0;padding:22px var(--dshgt-inset) 30px;width:100%;}
1326
+ /* 五个 tab 共用同一个内容框:宽屏居中、窄屏贴最小 gutter;内容本身铺满框内宽度。
1327
+ 只有空态文案这类「短句」用 text-align / 自身 max-width 控制,不再靠外层居中。 */
1328
+ .dshgt-view{padding:22px var(--dshgt-inset) 38px;width:100%;display:flex;flex-direction:column;gap:18px;}
1317
1329
  .dshgt-grow{flex:1;min-width:0;}
1318
1330
  .dshgt-dim{font-size:12px;color:var(--gt-muted);}
1319
1331
  .dshgt-empty{padding:48px 0;text-align:center;color:var(--gt-muted);font-size:13px;}
@@ -1321,7 +1333,7 @@ var CSS = `
1321
1333
  .dshgt-inline-tag{margin-left:6px;vertical-align:1px;}
1322
1334
 
1323
1335
  /* ——— 顶部身份条(第一行):名称 / 版本 / 完整包名 / GitHub / 检查更新 ——— */
1324
- .dshgt-idbar{display:flex;align-items:center;gap:9px;height:48px;padding:0 18px;border-bottom:1px solid var(--gt-border);flex:none;background:var(--gt-bg);min-width:0;}
1336
+ .dshgt-idbar{display:flex;align-items:center;gap:9px;height:48px;padding:0 var(--dshgt-inset);border-bottom:1px solid var(--gt-border);flex:none;background:var(--gt-bg);min-width:0;}
1325
1337
  .dshgt-idbar .dshgt-brand{display:flex;align-items:center;gap:9px;padding:0;flex:none;min-width:0;}
1326
1338
  .dshgt-idbar .dshgt-brand svg{width:22px;height:22px;flex:none;border-radius:6px;}
1327
1339
  .dshgt-brand-name{font-size:13.5px;font-weight:650;letter-spacing:-.01em;white-space:nowrap;line-height:1.3;}
@@ -1340,7 +1352,7 @@ var CSS = `
1340
1352
  .dshgt-id-actions{display:flex;align-items:center;gap:8px;flex:none;}
1341
1353
 
1342
1354
  /* ——— 横向 tab(第二行)+ 右侧状态 ——— */
1343
- .dshgt-tabsbar{display:flex;align-items:stretch;gap:12px;height:46px;padding:0 18px;border-bottom:1px solid var(--gt-border);flex:none;background:var(--gt-bg);min-width:0;}
1355
+ .dshgt-tabsbar{display:flex;align-items:stretch;gap:12px;height:46px;padding:0 var(--dshgt-inset);border-bottom:1px solid var(--gt-border);flex:none;background:var(--gt-bg);min-width:0;}
1344
1356
  .dshgt-tabnav{display:flex;align-items:stretch;gap:2px;height:100%;min-width:0;overflow-x:auto;overflow-y:hidden;scrollbar-width:none;}
1345
1357
  .dshgt-tabnav::-webkit-scrollbar{display:none;}
1346
1358
  .dshgt-tab{display:flex;align-items:center;gap:7px;padding:0 12px;border:0;background:none;color:var(--gt-muted);cursor:pointer;font:inherit;font-size:13.5px;position:relative;border-bottom:2px solid transparent;margin-bottom:-1px;flex:none;white-space:nowrap;}
@@ -1413,17 +1425,17 @@ var CSS = `
1413
1425
  @keyframes dshgt-spin{to{transform:rotate(360deg);}}
1414
1426
 
1415
1427
  /* ——— 日报 ——— */
1416
- /* 日报是阅读页:整列(工具栏 + 纸面)统一限宽并居中,避免超宽屏下工具栏与正文两段式错位。 */
1417
- .dshgt-digest{padding-top:20px;gap:12px;}
1418
- .dshgt-digest > *{width:100%;max-width:920px;margin-inline:auto;}
1428
+ /* 日报不再自己限宽 / 居中:整页与其它四个 tab 共用 .dshgt-view 的内容框,
1429
+ 工具栏和纸面左右边缘和页头、正文完全对齐。 */
1430
+ .dshgt-digest{gap:12px;}
1419
1431
  .dshgt-digest-subbar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;}
1420
1432
  .dshgt-datenav{display:flex;align-items:center;gap:2px;border:1px solid var(--gt-border);border-radius:8px;background:var(--gt-card);padding:2px;}
1421
1433
  .dshgt-icon-btn{width:28px;height:28px;display:grid;place-items:center;border:1px solid transparent;background:var(--gt-bg);border-radius:6px;color:var(--gt-fg);font-family:inherit;font-size:18px;line-height:1;cursor:pointer;flex:none;}
1422
1434
  .dshgt-icon-btn:hover:not(:disabled){background:color-mix(in srgb,var(--gt-fg) 7%,var(--gt-bg));border-color:var(--gt-border);}
1423
1435
  .dshgt-icon-btn:disabled{opacity:.3;cursor:not-allowed;}
1424
1436
  .dshgt-dateselect{appearance:none;height:28px;border:0;background:transparent;font-family:inherit;font-size:13px;color:var(--gt-fg);padding:0 8px;min-width:210px;max-width:320px;cursor:pointer;}
1425
- /* 日报预览纸面:阅读类长文,限制行宽。整体列宽由 .dshgt-digest 视图统一居中约束。 */
1426
- .dshgt-digest-sheet{max-width:920px;width:100%;border:1px solid var(--gt-border);border-radius:12px;background:var(--gt-card);overflow:hidden;}
1437
+ /* 日报预览纸面:铺满统一内容框;阅读行宽由内边距与字号控制。 */
1438
+ .dshgt-digest-sheet{width:100%;border:1px solid var(--gt-border);border-radius:12px;background:var(--gt-card);overflow:hidden;}
1427
1439
  .dshgt-digest-body{display:flex;flex-direction:column;min-width:0;}
1428
1440
  .dshgt-digest-bar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:9px 12px;border-bottom:1px solid color-mix(in srgb,var(--gt-border) 70%,transparent);background:color-mix(in srgb,var(--gt-fg) 2.5%,var(--gt-card));}
1429
1441
  .dshgt-seg{display:inline-flex;border:1px solid var(--gt-border);border-radius:8px;padding:2px;background:var(--gt-bg);gap:2px;}
@@ -1433,7 +1445,7 @@ var CSS = `
1433
1445
  .dshgt-doc-meta{display:flex;gap:12px;flex-wrap:wrap;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:11px;color:var(--gt-muted);padding-bottom:12px;border-bottom:1px solid color-mix(in srgb,var(--gt-border) 70%,transparent);}
1434
1446
  .dshgt-digest-raw{margin:0;padding:22px 28px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;line-height:1.75;white-space:pre-wrap;word-break:break-word;color:var(--gt-muted);background:color-mix(in srgb,var(--gt-fg) 2.5%,var(--gt-card));max-height:640px;overflow:auto;}
1435
1447
  .dshgt-digest-loading{padding:40px 28px;color:var(--gt-muted);font-size:13px;}
1436
- .dshgt-digest-empty{padding:42px 36px 46px;max-width:720px;}
1448
+ .dshgt-digest-empty{padding:42px 36px 46px;}
1437
1449
  .dshgt-status-line{display:flex;align-items:center;gap:8px;font-size:12.5px;color:var(--gt-muted);}
1438
1450
  .dshgt-status-line b{color:var(--gt-fg);font-weight:600;white-space:nowrap;}
1439
1451
  .dshgt-digest-empty h2{margin:14px 0 6px;font-size:20px;font-weight:650;letter-spacing:-.012em;}
@@ -1557,7 +1569,7 @@ var CSS = `
1557
1569
  .dshgt-gh{width:15px;height:15px;display:block;fill:currentColor;}
1558
1570
 
1559
1571
  /* ——— 订阅:命令栏 + 四列表格 + 选择条 + 发版记录抽屉 ——— */
1560
- .dshgt-subs{gap:12px;padding-bottom:10px;}
1572
+ .dshgt-subs{gap:12px;}
1561
1573
  /* 工具条:搜索 + 添加 + 选择 + 生成变更分析;列表在上方操作区之下 */
1562
1574
  .dshgt-subs-toolbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding-bottom:12px;border-bottom:1px solid color-mix(in srgb,var(--gt-border) 70%,transparent);}
1563
1575
  .dshgt-subs-search{position:relative;flex:1;min-width:180px;max-width:340px;display:flex;align-items:center;}
@@ -1687,8 +1699,10 @@ var CSS = `
1687
1699
  }
1688
1700
 
1689
1701
  @media (max-width:1100px){
1690
- .dshgt-page-head{padding:18px 22px 12px;}
1691
- .dshgt-view{padding:18px 22px 30px;}
1702
+ .dshgt-app{--dshgt-gutter:22px;}
1703
+ .dshgt-page-head{padding-block:18px 12px;}
1704
+ .dshgt-view{padding-block:18px 30px;}
1705
+ .dshgt-main-body > .dshgt-settings{padding-block:18px 22px;}
1692
1706
  .dshgt-facts{grid-template-columns:repeat(2,minmax(0,1fr));row-gap:10px;}
1693
1707
  .dshgt-fact:nth-child(3){padding-left:0;border-left:0;}
1694
1708
  .dshgt-week{flex-wrap:wrap;}
@@ -1702,20 +1716,19 @@ var CSS = `
1702
1716
  @media (max-width:980px){
1703
1717
  .dshgt-page-head h1{font-size:19px;}
1704
1718
  .dshgt-dek{font-size:12.5px;}
1705
- .dshgt-main-body > .dshgt-settings{padding:14px 18px 18px;}
1706
- }
1707
- @media (max-width:900px){
1708
- .dshgt-main-body > .dshgt-settings{padding:14px 16px 18px;}
1719
+ .dshgt-main-body > .dshgt-settings{padding-block:16px 18px;}
1709
1720
  }
1710
1721
  @media (max-width:760px){
1711
- .dshgt-idbar{padding:0 14px;gap:8px;}
1722
+ .dshgt-app{--dshgt-gutter:18px;}
1723
+ .dshgt-idbar{gap:8px;}
1712
1724
  .dshgt-id-pkg{max-width:26vw;}
1713
1725
  .dshgt-id-status{display:none;}
1714
- .dshgt-tabsbar{padding:0 14px;gap:8px;}
1726
+ .dshgt-tabsbar{gap:8px;}
1715
1727
  .dshgt-tabsbar-status{display:none;}
1716
- .dshgt-page-head{flex-wrap:wrap;padding:16px 18px 12px;gap:10px 16px;}
1728
+ .dshgt-page-head{flex-wrap:wrap;padding-block:16px 12px;gap:10px 16px;}
1717
1729
  .dshgt-head-actions{margin-left:0;width:100%;justify-content:flex-start;padding-top:0;flex-wrap:wrap;}
1718
- .dshgt-view{padding:16px 18px 28px;}
1730
+ .dshgt-view{padding-block:16px 28px;}
1731
+ .dshgt-main-body > .dshgt-settings{padding-block:14px 18px;}
1719
1732
  .dshgt-runs-filter{margin-left:0;width:100%;flex-wrap:wrap;}
1720
1733
  .dshgt-run-row{grid-template-columns:14px 92px 46px minmax(0,1fr) 20px;gap:8px;padding:0 2px;}
1721
1734
  .dshgt-run-item.has-tokens .dshgt-run-row{grid-template-columns:14px 92px 46px minmax(0,1fr) 64px 20px;}
@@ -5939,23 +5952,71 @@ function IdentityBar(props) {
5939
5952
  }
5940
5953
 
5941
5954
  // client/restore-notice.ts
5942
- function RestoreNotice({ t, version, onDismiss, onRestart }) {
5943
- const title = version !== void 0 && version !== "" ? t("restoreNotice.title", { version }) : t("restoreNotice.titleBare");
5955
+ function vLabel(value) {
5956
+ if (value === void 0) return void 0;
5957
+ const text = value.trim();
5958
+ if (text === "") return void 0;
5959
+ return text.startsWith("v") ? text : `v${text}`;
5960
+ }
5961
+ var ARROW = h(
5962
+ "svg",
5963
+ {
5964
+ width: 14,
5965
+ height: 14,
5966
+ viewBox: "0 0 16 16",
5967
+ fill: "none",
5968
+ stroke: "currentColor",
5969
+ strokeWidth: 1.6,
5970
+ strokeLinecap: "round",
5971
+ strokeLinejoin: "round",
5972
+ "aria-hidden": "true",
5973
+ focusable: "false"
5974
+ },
5975
+ h("path", { d: "M3 8h9" }),
5976
+ h("polyline", { points: "8.5 4.5 12 8 8.5 11.5" })
5977
+ );
5978
+ function RestoreNotice({ t, version, from, onDismiss }) {
5979
+ const fromLabel = vLabel(from);
5980
+ const toLabel = vLabel(version);
5981
+ const pair = fromLabel !== void 0 && toLabel !== void 0 && fromLabel !== toLabel;
5982
+ const title = pair ? t("restoreNotice.titleInstalled") : toLabel !== void 0 ? t("restoreNotice.title", { version: toLabel.replace(/^v/, "") }) : t("restoreNotice.titleBare");
5983
+ import_react.default.useEffect(() => {
5984
+ if (typeof document === "undefined") return void 0;
5985
+ const onKeyDown = (event) => {
5986
+ if (event.key === "Escape") onDismiss();
5987
+ };
5988
+ document.addEventListener("keydown", onKeyDown);
5989
+ return () => document.removeEventListener("keydown", onKeyDown);
5990
+ }, [onDismiss]);
5944
5991
  return h(
5945
5992
  "div",
5946
- { className: "dshgt-restore", role: "status", "aria-live": "polite" },
5947
- h("span", { className: "dshgt-restore-icon", "aria-hidden": "true" }, "⟳"),
5948
- h(
5949
- "div",
5950
- { className: "dshgt-restore-text" },
5951
- h("div", { className: "dshgt-restore-title" }, title),
5952
- h("div", { className: "dshgt-restore-body" }, t("restoreNotice.body"))
5953
- ),
5993
+ { className: "dshgt-restore-mask" },
5954
5994
  h(
5955
5995
  "div",
5956
- { className: "dshgt-restore-actions" },
5957
- onRestart === void 0 ? null : h(Btn, { small: true, variant: "primary", onClick: () => onRestart() }, t("restoreNotice.restart")),
5958
- h(Btn, { small: true, onClick: () => onDismiss() }, t("restoreNotice.dismiss"))
5996
+ {
5997
+ className: "dshgt-restore",
5998
+ role: "dialog",
5999
+ "aria-modal": "true",
6000
+ "aria-labelledby": "dshgt-restore-title"
6001
+ },
6002
+ pair ? h(
6003
+ "div",
6004
+ { className: "dshgt-restore-versions" },
6005
+ h("span", { className: "dshgt-restore-version" }, fromLabel),
6006
+ h("span", { className: "dshgt-restore-arrow" }, ARROW),
6007
+ h("span", { className: "dshgt-restore-version is-new" }, toLabel)
6008
+ ) : null,
6009
+ h("div", { className: "dshgt-restore-title", id: "dshgt-restore-title" }, title),
6010
+ h("p", { className: "dshgt-restore-body" }, t("restoreNotice.body")),
6011
+ h(
6012
+ "div",
6013
+ { className: "dshgt-restore-foot" },
6014
+ h(
6015
+ "button",
6016
+ { type: "button", className: "dshgt-restore-close", autoFocus: true, onClick: () => onDismiss() },
6017
+ t("restoreNotice.dismiss")
6018
+ )
6019
+ )
5959
6020
  )
5960
6021
  );
5961
6022
  }
@@ -6147,12 +6208,7 @@ function apply(ctx) {
6147
6208
  pendingUpdate === null ? null : h(RestoreNotice, {
6148
6209
  t,
6149
6210
  version: pendingUpdate.to,
6150
- onRestart: () => {
6151
- const reloader = ctx.restart;
6152
- if (typeof reloader === "function") reloader();
6153
- clearPendingUpdate();
6154
- setPendingUpdate(null);
6155
- },
6211
+ from: pendingUpdate.from,
6156
6212
  onDismiss: () => {
6157
6213
  clearPendingUpdate();
6158
6214
  setPendingUpdate(null);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@morehao/dsh-github-trending",
3
- "version": "0.8.11",
3
+ "version": "0.8.12",
4
4
  "description": "GitHub 趋势日报的 DeepSeek Harness 插件:按日 / 周 / 月周期定时 spawn 本地 trendradar 核心,抓取 Trending、生成中文简介与周期总结,并可选把订阅仓库的新 Release 合成中文摘要,一起提交到你的仓库、自动开 PR 合并;内置概览 / 榜单 / 运行记录 / 订阅 / 设置工作台。",
5
5
  "type": "module",
6
6
  "main": "lib/index.js",