dsh-github-flow 0.5.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/README.en.md +112 -17
  2. package/README.md +115 -17
  3. package/docs/UPGRADE-NOTES.md +12 -11
  4. package/docs/architecture.md +81 -22
  5. package/docs/images/1.png +0 -0
  6. package/lib/api/route-helpers.d.ts +19 -0
  7. package/lib/api/route-helpers.js +54 -0
  8. package/lib/api/routes-actions.js +214 -9
  9. package/lib/api/routes-lifecycle.js +8 -1
  10. package/lib/api/routes-overview.d.ts +26 -0
  11. package/lib/api/routes-overview.js +396 -36
  12. package/lib/api/routes-proxy.js +8 -1
  13. package/lib/api/routes.d.ts +11 -1
  14. package/lib/api/routes.js +15 -2
  15. package/lib/cache.d.ts +56 -4
  16. package/lib/cache.js +77 -7
  17. package/lib/client.d.ts +8 -3
  18. package/lib/client.js +5542 -1391
  19. package/lib/destructive.d.ts +59 -0
  20. package/lib/destructive.js +285 -0
  21. package/lib/executor/args-guard.d.ts +17 -0
  22. package/lib/executor/args-guard.js +23 -0
  23. package/lib/executor/error-classifier.d.ts +55 -0
  24. package/lib/executor/error-classifier.js +199 -0
  25. package/lib/executor/failure-anchors.d.ts +52 -0
  26. package/lib/executor/failure-anchors.js +116 -0
  27. package/lib/executor/git-parser.d.ts +124 -0
  28. package/lib/executor/git-parser.js +397 -0
  29. package/lib/executor/pr-review.d.ts +95 -0
  30. package/lib/executor/pr-review.js +175 -0
  31. package/lib/executor/run-log.d.ts +36 -0
  32. package/lib/executor/run-log.js +78 -0
  33. package/lib/executor.d.ts +277 -6
  34. package/lib/executor.js +1265 -94
  35. package/lib/github-service.d.ts +1 -1
  36. package/lib/main.d.ts +92 -18
  37. package/lib/main.js +186 -95
  38. package/lib/renderers/common.d.ts +0 -3
  39. package/lib/renderers/common.js +8 -44
  40. package/lib/renderers/markdown.d.ts +1 -0
  41. package/lib/renderers/markdown.js +1 -0
  42. package/lib/renderers/pr.js +26 -1
  43. package/lib/renderers/task.d.ts +9 -0
  44. package/lib/renderers/task.js +120 -0
  45. package/lib/review-rules.d.ts +60 -0
  46. package/lib/review-rules.js +204 -0
  47. package/lib/shared/state-badges.d.ts +42 -0
  48. package/lib/shared/state-badges.js +102 -0
  49. package/lib/task-primitives.d.ts +109 -0
  50. package/lib/task-primitives.js +194 -0
  51. package/lib/tool-tiers.d.ts +57 -0
  52. package/lib/tool-tiers.js +168 -0
  53. package/lib/tools/agent-task.js +4 -4
  54. package/lib/tools/api.js +18 -6
  55. package/lib/tools/cache.js +42 -40
  56. package/lib/tools/codespace.js +4 -12
  57. package/lib/tools/discussion.js +4 -4
  58. package/lib/tools/gist.d.ts +1 -39
  59. package/lib/tools/gist.js +4 -14
  60. package/lib/tools/help.js +72 -18
  61. package/lib/tools/image-utils.d.ts +27 -0
  62. package/lib/tools/image-utils.js +73 -3
  63. package/lib/tools/issue.js +16 -28
  64. package/lib/tools/label.js +4 -15
  65. package/lib/tools/pr.d.ts +47 -0
  66. package/lib/tools/pr.js +170 -33
  67. package/lib/tools/project.js +4 -13
  68. package/lib/tools/release.js +11 -22
  69. package/lib/tools/repo.js +4 -4
  70. package/lib/tools/ruleset.js +9 -6
  71. package/lib/tools/run.js +76 -24
  72. package/lib/tools/secret.js +11 -17
  73. package/lib/tools/skill.js +18 -22
  74. package/lib/tools/status.js +4 -4
  75. package/lib/tools/task.d.ts +219 -0
  76. package/lib/tools/task.js +457 -0
  77. package/lib/types.d.ts +514 -1
  78. package/lib/ui/help-modal.d.ts +6 -0
  79. package/lib/ui/help-modal.js +124 -16
  80. package/lib/ui/issue-modal.d.ts +14 -0
  81. package/lib/ui/issue-modal.js +370 -0
  82. package/lib/ui/markdown-lite.d.ts +66 -0
  83. package/lib/ui/markdown-lite.js +312 -0
  84. package/lib/ui/network-banner.d.ts +12 -0
  85. package/lib/ui/network-banner.js +35 -0
  86. package/lib/ui/pr-modal.d.ts +17 -0
  87. package/lib/ui/pr-modal.js +555 -0
  88. package/lib/ui/repo-badges.d.ts +43 -0
  89. package/lib/ui/repo-badges.js +82 -0
  90. package/lib/ui/repo-selector.d.ts +14 -0
  91. package/lib/ui/repo-selector.js +112 -0
  92. package/lib/ui/run-modal.d.ts +26 -0
  93. package/lib/ui/run-modal.js +486 -0
  94. package/lib/ui/storage.d.ts +47 -0
  95. package/lib/ui/storage.js +139 -0
  96. package/lib/ui/styles.d.ts +1 -1
  97. package/lib/ui/styles.js +1330 -44
  98. package/lib/ui/sync-settings-modal.js +1 -1
  99. package/lib/ui/utils.js +13 -1
  100. package/lib/ui/workspace-panel.js +226 -29
  101. package/lib/version.d.ts +1 -1
  102. package/lib/version.js +1 -1
  103. package/package.json +9 -2
package/lib/ui/styles.js CHANGED
@@ -3,50 +3,13 @@
3
3
  * 遵循 DSH 原生 DSW (DeepSeek Web) 设计语言规范
4
4
  */
5
5
  export const GITHUB_PANEL_CSS = `
6
- /* 1. 侧边栏图标与外壳 */
7
- .dsh-github-icon {
8
- display: flex;
9
- align-items: center;
10
- justify-content: center;
11
- width: 100%;
12
- height: 100%;
13
- cursor: pointer;
14
- color: var(--dsw-alias-label-secondary, #656d76);
15
- transition: color 0.15s ease;
16
- }
17
- .dsh-github-icon:hover {
18
- color: var(--dsw-alias-label-primary, #1f2328);
19
- }
20
- .dsh-github-icon-inner {
21
- display: flex;
22
- align-items: center;
23
- justify-content: center;
24
- width: 28px;
25
- height: 28px;
26
- border-radius: 7px;
27
- background: transparent;
28
- color: inherit;
29
- border: 1px solid transparent;
30
- transition: all 0.2s cubic-bezier(0.16, 1, 0.3, 1);
31
- }
32
- .dsh-github-icon-inner.active {
33
- background: var(--dsw-alias-bg-module-platform, rgba(9, 105, 218, 0.08));
34
- color: var(--dsw-alias-link, #0969da);
35
- border-color: var(--dsw-alias-border-l2, rgba(9, 105, 218, 0.2));
36
- }
37
-
38
- body[data-ds-dark-theme] .dsh-github-icon {
39
- color: var(--dsw-alias-label-secondary, #9ca3af);
40
- }
41
- body[data-ds-dark-theme] .dsh-github-icon:hover {
42
- color: var(--dsw-alias-label-primary, #ffffff);
43
- }
44
- body[data-ds-dark-theme] .dsh-github-icon-inner.active {
45
- background: linear-gradient(135deg, rgba(46, 160, 67, 0.3) 0%, rgba(31, 111, 235, 0.45) 100%);
46
- color: #ffffff;
47
- box-shadow: 0 0 12px rgba(31, 111, 235, 0.4);
48
- border-color: rgba(88, 166, 255, 0.45);
49
- }
6
+ /* 1. 侧边栏入口图标:刻意不提供任何样式
7
+ *
8
+ * 宿主的 .panelRow 负责行高亮 / hover / 颜色,图标格 .panelGlyph 是 flex:none
9
+ * 且不设宽高(宽度完全由内容决定)。这里任何固定尺寸都会撑开图标格、把标签推右;
10
+ * 任何背景/发光都会与宿主选中态叠加。历史教训见 issue #9:
11
+ * 28px 内层盒子让图标格比同级宽 12px,深色渐变+发光则是多余的第二层选中态。
12
+ */
50
13
 
51
14
  /* 2. Octocat 科技勋章 Badge */
52
15
  .dsh-octocat-badge {
@@ -217,6 +180,31 @@ body[data-ds-dark-theme] .dsh-github-card-subtext {
217
180
  color: var(--dsw-alias-label-tertiary, #888);
218
181
  }
219
182
 
183
+ /* fork 血缘行:说明「这是谁的上游」,上游名可点击 */
184
+ .dsh-github-fork-line {
185
+ font-size: 12px;
186
+ margin-top: 4px;
187
+ color: var(--dsw-alias-label-secondary, #656d76);
188
+ display: flex;
189
+ align-items: center;
190
+ gap: 4px;
191
+ flex-wrap: wrap;
192
+ }
193
+ body[data-ds-dark-theme] .dsh-github-fork-line {
194
+ color: var(--dsw-alias-label-secondary, #bbb);
195
+ }
196
+ .dsh-github-fork-line a {
197
+ color: var(--dsw-alias-link, #0969da);
198
+ text-decoration: none;
199
+ font-weight: 600;
200
+ }
201
+ .dsh-github-fork-line a:hover {
202
+ text-decoration: underline;
203
+ }
204
+ body[data-ds-dark-theme] .dsh-github-fork-line a {
205
+ color: #58a6ff;
206
+ }
207
+
220
208
  /* 7. 徽章(Badges) */
221
209
  .dsh-github-badge {
222
210
  display: inline-flex;
@@ -242,6 +230,22 @@ body[data-ds-dark-theme] .dsh-github-card-subtext {
242
230
  color: #9a6700;
243
231
  border: 1px solid rgba(154, 103, 0, 0.2);
244
232
  }
233
+
234
+ /*
235
+ * 只读徽章:与 yellow 同色系但描边更明显,因为「你改不了」是需要被看见的约束。
236
+ * 独立类而非复用 yellow,是为了将来调整只读语义的视觉强度时不牵动其他黄色徽章。
237
+ */
238
+ .dsh-badge-readonly {
239
+ background: rgba(154, 103, 0, 0.12);
240
+ color: #9a6700;
241
+ border: 1px solid rgba(154, 103, 0, 0.35);
242
+ font-weight: 600;
243
+ }
244
+ body[data-ds-dark-theme] .dsh-badge-readonly {
245
+ background: rgba(210, 153, 34, 0.18);
246
+ color: #d29922;
247
+ border-color: rgba(210, 153, 34, 0.4);
248
+ }
245
249
  .dsh-badge-blue {
246
250
  background: rgba(9, 105, 218, 0.12);
247
251
  color: #0969da;
@@ -1528,6 +1532,1288 @@ body[data-ds-dark-theme] .dsh-github-btn-sm.active {
1528
1532
  color: #f0b72f !important;
1529
1533
  border-color: #d29922 !important;
1530
1534
  }
1535
+
1536
+ /* 19. 关联仓库切换器 (RepoSelectorDropdown) */
1537
+ .dsh-github-repo-switch-trigger {
1538
+ display: inline-flex;
1539
+ align-items: center;
1540
+ gap: 3px;
1541
+ padding: 1px 7px;
1542
+ font-size: 11px;
1543
+ font-weight: 500;
1544
+ border-radius: 12px;
1545
+ border: 1px solid rgba(130, 80, 223, 0.35);
1546
+ background: rgba(130, 80, 223, 0.1);
1547
+ color: #8250df;
1548
+ cursor: pointer;
1549
+ transition: all 0.15s ease;
1550
+ user-select: none;
1551
+ line-height: 16px;
1552
+ }
1553
+ .dsh-github-repo-switch-trigger:hover {
1554
+ background: rgba(130, 80, 223, 0.2);
1555
+ border-color: rgba(130, 80, 223, 0.6);
1556
+ }
1557
+ body[data-ds-dark-theme] .dsh-github-repo-switch-trigger {
1558
+ border-color: rgba(163, 113, 247, 0.4);
1559
+ background: rgba(163, 113, 247, 0.15);
1560
+ color: #a371f7;
1561
+ }
1562
+ body[data-ds-dark-theme] .dsh-github-repo-switch-trigger:hover {
1563
+ background: rgba(163, 113, 247, 0.25);
1564
+ border-color: #a371f7;
1565
+ }
1566
+
1567
+ .dsh-github-repo-dropdown {
1568
+ position: absolute;
1569
+ top: 100%;
1570
+ left: 0;
1571
+ margin-top: 5px;
1572
+ width: 320px;
1573
+ max-height: 380px;
1574
+ background: var(--dsw-alias-bg-base, #ffffff);
1575
+ border: 1px solid var(--dsw-alias-border-l2, #e1e4e8);
1576
+ border-radius: 8px;
1577
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.16);
1578
+ z-index: 1000;
1579
+ display: flex;
1580
+ flex-direction: column;
1581
+ overflow: hidden;
1582
+ }
1583
+ body[data-ds-dark-theme] .dsh-github-repo-dropdown {
1584
+ background: var(--dsw-alias-bg-layer-2, #1e1e22);
1585
+ border-color: var(--dsw-alias-border-l1, #30363d);
1586
+ box-shadow: 0 8px 28px rgba(0, 0, 0, 0.5);
1587
+ }
1588
+
1589
+ .dsh-github-repo-dropdown-header {
1590
+ display: flex;
1591
+ justify-content: space-between;
1592
+ align-items: center;
1593
+ padding: 8px 12px;
1594
+ font-size: 11px;
1595
+ font-weight: 600;
1596
+ background: var(--dsw-alias-bg-layer-1, #f6f8fa);
1597
+ border-bottom: 1px solid var(--dsw-alias-border-l2, #e1e4e8);
1598
+ color: var(--dsw-alias-label-secondary, #57606a);
1599
+ }
1600
+ body[data-ds-dark-theme] .dsh-github-repo-dropdown-header {
1601
+ background: var(--dsw-alias-bg-layer-1, #16161a);
1602
+ border-bottom-color: var(--dsw-alias-border-l1, #30363d);
1603
+ color: var(--dsw-alias-label-secondary, #8b949e);
1604
+ }
1605
+
1606
+ .dsh-github-repo-dropdown-list {
1607
+ overflow-y: auto;
1608
+ max-height: 260px;
1609
+ padding: 4px 0;
1610
+ }
1611
+
1612
+ .dsh-github-repo-item {
1613
+ padding: 7px 12px;
1614
+ font-size: 12px;
1615
+ cursor: pointer;
1616
+ transition: background 0.12s ease;
1617
+ color: var(--dsw-alias-label-primary, #1f2328);
1618
+ }
1619
+ .dsh-github-repo-item:hover {
1620
+ background: var(--dsw-alias-interactive-bg-hover, rgba(0, 0, 0, 0.05));
1621
+ }
1622
+ body[data-ds-dark-theme] .dsh-github-repo-item {
1623
+ color: var(--dsw-alias-label-primary, #f0f6fc);
1624
+ }
1625
+ body[data-ds-dark-theme] .dsh-github-repo-item:hover {
1626
+ background: var(--dsw-alias-interactive-bg-hover, rgba(255, 255, 255, 0.06));
1627
+ }
1628
+ .dsh-github-repo-item.selected {
1629
+ background: rgba(9, 105, 218, 0.08);
1630
+ }
1631
+ body[data-ds-dark-theme] .dsh-github-repo-item.selected {
1632
+ background: rgba(56, 139, 253, 0.15);
1633
+ }
1634
+
1635
+ .dsh-github-repo-dropdown-footer {
1636
+ padding: 6px 10px;
1637
+ font-size: 10px;
1638
+ background: var(--dsw-alias-bg-layer-1, #f6f8fa);
1639
+ border-top: 1px solid var(--dsw-alias-border-l2, #e1e4e8);
1640
+ color: var(--dsw-alias-label-tertiary, #656d76);
1641
+ line-height: 1.4;
1642
+ }
1643
+ body[data-ds-dark-theme] .dsh-github-repo-dropdown-footer {
1644
+ background: var(--dsw-alias-bg-layer-1, #16161a);
1645
+ border-top-color: var(--dsw-alias-border-l1, #30363d);
1646
+ color: var(--dsw-alias-label-tertiary, #8b949e);
1647
+ }
1648
+
1649
+ .dsh-github-switch-quicklink {
1650
+ font-size: 11px;
1651
+ cursor: pointer;
1652
+ color: var(--dsw-alias-link, #0969da);
1653
+ text-decoration: none;
1654
+ font-weight: 500;
1655
+ display: inline-flex;
1656
+ align-items: center;
1657
+ gap: 3px;
1658
+ margin-left: 6px;
1659
+ padding: 1px 6px;
1660
+ border-radius: 4px;
1661
+ background: rgba(9, 105, 218, 0.08);
1662
+ border: 1px solid rgba(9, 105, 218, 0.2);
1663
+ }
1664
+ .dsh-github-switch-quicklink:hover {
1665
+ text-decoration: none;
1666
+ background: rgba(9, 105, 218, 0.16);
1667
+ border-color: rgba(9, 105, 218, 0.4);
1668
+ }
1669
+ body[data-ds-dark-theme] .dsh-github-switch-quicklink {
1670
+ color: #58a6ff;
1671
+ background: rgba(56, 139, 253, 0.15);
1672
+ border-color: rgba(56, 139, 253, 0.3);
1673
+ }
1674
+ body[data-ds-dark-theme] .dsh-github-switch-quicklink:hover {
1675
+ background: rgba(56, 139, 253, 0.25);
1676
+ border-color: rgba(56, 139, 253, 0.5);
1677
+ }
1678
+
1679
+ /* 20. PR 在线详情与代码审阅工作台 (PrDetailModal) */
1680
+ .dsh-github-pr-modal-dialog {
1681
+ width: 95% !important;
1682
+ max-width: 1040px !important;
1683
+ height: 88vh !important;
1684
+ max-height: 88vh !important;
1685
+ display: flex !important;
1686
+ flex-direction: column !important;
1687
+ overflow: hidden !important;
1688
+ padding: 0 !important;
1689
+ }
1690
+
1691
+ .dsh-github-pr-modal-header {
1692
+ padding: 12px 16px !important;
1693
+ border-bottom: 1px solid var(--dsw-alias-border-l2, #e1e4e8);
1694
+ background: var(--dsw-alias-bg-layer-1, #f6f8fa);
1695
+ flex-shrink: 0;
1696
+ }
1697
+ body[data-ds-dark-theme] .dsh-github-pr-modal-header {
1698
+ border-bottom-color: var(--dsw-alias-border-l1, #30363d);
1699
+ background: var(--dsw-alias-bg-layer-1, #16161a);
1700
+ }
1701
+
1702
+ .dsh-github-pr-modal-tabs {
1703
+ display: flex;
1704
+ align-items: center;
1705
+ gap: 4px;
1706
+ padding: 6px 16px;
1707
+ background: var(--dsw-alias-bg-base, #ffffff);
1708
+ border-bottom: 1px solid var(--dsw-alias-border-l2, #e1e4e8);
1709
+ flex-shrink: 0;
1710
+ }
1711
+ body[data-ds-dark-theme] .dsh-github-pr-modal-tabs {
1712
+ background: var(--dsw-alias-bg-layer-2, #1e1e22);
1713
+ border-bottom-color: var(--dsw-alias-border-l1, #30363d);
1714
+ }
1715
+
1716
+ .dsh-github-pr-tab-btn {
1717
+ padding: 5px 12px;
1718
+ font-size: 12px;
1719
+ font-weight: 500;
1720
+ border-radius: 6px;
1721
+ border: 1px solid transparent;
1722
+ background: transparent;
1723
+ color: var(--dsw-alias-label-secondary, #656d76);
1724
+ cursor: pointer;
1725
+ transition: all 0.15s ease;
1726
+ }
1727
+ .dsh-github-pr-tab-btn:hover {
1728
+ background: var(--dsw-alias-interactive-bg-hover, rgba(0, 0, 0, 0.05));
1729
+ color: var(--dsw-alias-label-primary, #1f2328);
1730
+ }
1731
+ .dsh-github-pr-tab-btn.active {
1732
+ background: var(--dsw-alias-interactive-bg-active, rgba(9, 105, 218, 0.1));
1733
+ color: var(--dsw-alias-link, #0969da);
1734
+ font-weight: 600;
1735
+ border-color: rgba(9, 105, 218, 0.25);
1736
+ }
1737
+ body[data-ds-dark-theme] .dsh-github-pr-tab-btn {
1738
+ color: var(--dsw-alias-label-secondary, #8b949e);
1739
+ }
1740
+ body[data-ds-dark-theme] .dsh-github-pr-tab-btn:hover {
1741
+ background: rgba(255, 255, 255, 0.06);
1742
+ color: #f0f6fc;
1743
+ }
1744
+ body[data-ds-dark-theme] .dsh-github-pr-tab-btn.active {
1745
+ background: rgba(56, 139, 253, 0.15);
1746
+ color: #58a6ff;
1747
+ border-color: rgba(56, 139, 253, 0.4);
1748
+ }
1749
+
1750
+ .dsh-github-pr-conversation-pane {
1751
+ padding: 16px !important;
1752
+ overflow-y: auto !important;
1753
+ flex: 1;
1754
+ min-height: 0;
1755
+ display: flex;
1756
+ flex-direction: column;
1757
+ gap: 12px;
1758
+ /* 滚到边界时不把滚动传给弹窗外层,避免整页跟着滚 */
1759
+ overscroll-behavior: contain;
1760
+ }
1761
+
1762
+ .dsh-github-pr-checks-bar {
1763
+ display: flex;
1764
+ align-items: center;
1765
+ justify-content: space-between;
1766
+ padding: 8px 12px;
1767
+ background: var(--dsw-alias-bg-module-platform, #f6f8fa);
1768
+ border: 1px solid var(--dsw-alias-border-l2, #e1e4e8);
1769
+ border-radius: 6px;
1770
+ font-size: 11px;
1771
+ }
1772
+ body[data-ds-dark-theme] .dsh-github-pr-checks-bar {
1773
+ background: var(--dsw-alias-bg-layer-1, #16161a);
1774
+ border-color: var(--dsw-alias-border-l1, #30363d);
1775
+ }
1776
+
1777
+ .dsh-github-pr-body-card {
1778
+ border: 1px solid var(--dsw-alias-border-l2, #e1e4e8);
1779
+ border-radius: 6px;
1780
+ background: var(--dsw-alias-bg-base, #ffffff);
1781
+ overflow: hidden;
1782
+ /*
1783
+ * flex: 0 0 auto 是滚动能否工作的关键。
1784
+ * 父容器 .dsh-github-pr-conversation-pane 是 flex-direction: column,
1785
+ * flex 子项默认 flex-shrink: 1 —— 内容变长时会被「压缩」而不是撑开父容器,
1786
+ * 父容器的 overflow-y: auto 于是永远不触发,长内容被直接裁掉。
1787
+ * 禁止收缩后卡片高度由内容决定,父容器才能真正滚动。
1788
+ */
1789
+ flex: 0 0 auto;
1790
+ }
1791
+ body[data-ds-dark-theme] .dsh-github-pr-body-card {
1792
+ border-color: var(--dsw-alias-border-l1, #30363d);
1793
+ background: var(--dsw-alias-bg-layer-2, #1e1e22);
1794
+ }
1795
+
1796
+ .dsh-github-pr-comment-card {
1797
+ border: 1px solid var(--dsw-alias-border-l2, #e1e4e8);
1798
+ border-radius: 6px;
1799
+ background: var(--dsw-alias-bg-base, #ffffff);
1800
+ overflow: hidden;
1801
+ margin-bottom: 10px;
1802
+ /* 同 body-card:禁止收缩,否则父容器滚不动(见上方注释) */
1803
+ flex: 0 0 auto;
1804
+ }
1805
+ body[data-ds-dark-theme] .dsh-github-pr-comment-card {
1806
+ border-color: var(--dsw-alias-border-l1, #30363d);
1807
+ background: var(--dsw-alias-bg-layer-2, #1e1e22);
1808
+ }
1809
+
1810
+ .dsh-github-pr-comment-header {
1811
+ display: flex;
1812
+ justify-content: space-between;
1813
+ align-items: center;
1814
+ padding: 6px 12px;
1815
+ background: var(--dsw-alias-bg-module-platform, #f6f8fa);
1816
+ border-bottom: 1px solid var(--dsw-alias-border-l2, #e1e4e8);
1817
+ font-size: 11px;
1818
+ }
1819
+ body[data-ds-dark-theme] .dsh-github-pr-comment-header {
1820
+ background: var(--dsw-alias-bg-layer-1, #16161a);
1821
+ border-bottom-color: var(--dsw-alias-border-l1, #30363d);
1822
+ }
1823
+
1824
+ .dsh-github-pr-files-pane {
1825
+ display: flex;
1826
+ flex: 1;
1827
+ min-height: 0;
1828
+ overflow: hidden;
1829
+ }
1830
+
1831
+ .dsh-github-pr-file-list {
1832
+ width: 280px;
1833
+ flex-shrink: 0;
1834
+ border-right: 1px solid var(--dsw-alias-border-l2, #e1e4e8);
1835
+ background: var(--dsw-alias-bg-layer-1, #f6f8fa);
1836
+ overflow-y: auto;
1837
+ padding: 6px 0;
1838
+ }
1839
+ body[data-ds-dark-theme] .dsh-github-pr-file-list {
1840
+ border-right-color: var(--dsw-alias-border-l1, #30363d);
1841
+ background: var(--dsw-alias-bg-layer-1, #16161a);
1842
+ }
1843
+
1844
+ /*
1845
+ * 拖拽分隔条。宽度 6px 而非常见的 1px:细条几乎点不中,
1846
+ * 是分栏拖拽最常见的可用性缺陷。
1847
+ */
1848
+ .dsh-github-pr-splitter {
1849
+ position: relative;
1850
+ flex-shrink: 0;
1851
+ width: 6px;
1852
+ cursor: col-resize;
1853
+ background: var(--dsw-alias-border-l2, #e1e4e8);
1854
+ transition: background 0.15s ease;
1855
+ display: flex;
1856
+ align-items: center;
1857
+ justify-content: center;
1858
+ }
1859
+ .dsh-github-pr-splitter:hover {
1860
+ background: var(--dsw-alias-link, #0969da);
1861
+ }
1862
+ body[data-ds-dark-theme] .dsh-github-pr-splitter {
1863
+ background: var(--dsw-alias-border-l1, #30363d);
1864
+ }
1865
+ body[data-ds-dark-theme] .dsh-github-pr-splitter:hover {
1866
+ background: #58a6ff;
1867
+ }
1868
+
1869
+ /* 折叠按钮贴在分隔条中部,始终可见——折叠后这是唯一的视觉恢复提示 */
1870
+ .dsh-github-pr-splitter-toggle {
1871
+ position: absolute;
1872
+ top: 50%;
1873
+ transform: translateY(-50%);
1874
+ width: 16px;
1875
+ height: 32px;
1876
+ padding: 0;
1877
+ border: 1px solid var(--dsw-alias-border-l2, #d0d7de);
1878
+ border-radius: 3px;
1879
+ background: var(--dsw-alias-bg-base, #ffffff);
1880
+ color: var(--dsw-alias-label-secondary, #656d76);
1881
+ font-size: 8px;
1882
+ line-height: 1;
1883
+ cursor: pointer;
1884
+ display: flex;
1885
+ align-items: center;
1886
+ justify-content: center;
1887
+ z-index: 2;
1888
+ }
1889
+ .dsh-github-pr-splitter-toggle:hover {
1890
+ background: var(--dsw-alias-interactive-bg-hover, rgba(0, 0, 0, 0.06));
1891
+ color: var(--dsw-alias-label-primary, #1f2328);
1892
+ }
1893
+ body[data-ds-dark-theme] .dsh-github-pr-splitter-toggle {
1894
+ border-color: var(--dsw-alias-border-l1, #30363d);
1895
+ background: var(--dsw-alias-bg-layer-2, #1e1e22);
1896
+ color: var(--dsw-alias-label-secondary, #8b949e);
1897
+ }
1898
+ body[data-ds-dark-theme] .dsh-github-pr-splitter-toggle:hover {
1899
+ background: rgba(255, 255, 255, 0.08);
1900
+ color: #f0f6fc;
1901
+ }
1902
+
1903
+ /*
1904
+ * PR 卡片标题行:标题在左、跳转按钮钉在最右,且严格保持同一行。
1905
+ *
1906
+ * 为什么需要这个容器:.dsh-github-item 本身是 flex-direction: column,
1907
+ * 若把按钮直接放进去,它会独占一整行、只剩一个孤零零的 ↗ 字符,
1908
+ * 既丑也让用户看不出这是可点的入口。包进横向 flex 行即可解决。
1909
+ */
1910
+ .dsh-github-pr-title-row {
1911
+ display: flex;
1912
+ align-items: center; /* 标题已强制单行,居中对齐即「同一行」 */
1913
+ gap: 10px;
1914
+ width: 100%;
1915
+ min-width: 0;
1916
+ }
1917
+ .dsh-github-pr-title-row .dsh-github-item-title {
1918
+ /*
1919
+ * flex: 0 1 auto —— 标题按自身内容宽度占据,可收缩(shrink 1)但不撑满(grow 0)。
1920
+ *
1921
+ * 为什么不是 flex: 1 1 0%:
1922
+ * 标题行里现在还有状态徽章(MERGED/CLOSED)跟在标题右侧。
1923
+ * 若标题 grow 撑满全部剩余空间,徽章会被顶到最右边紧贴「GitHub ↗」按钮,
1924
+ * 看起来像两个右边控件挤在一起,而不是「标题 → 状态 → 按钮」的阅读顺序。
1925
+ * 改成不撑满后,徽章自然紧跟在标题文字之后;
1926
+ * 「按钮贴最右」由按钮自身的 margin-left: auto 保证,与此处无关。
1927
+ */
1928
+ flex: 0 1 auto;
1929
+ /*
1930
+ * min-width: 0 是关键。flex 子项默认 min-width: auto,
1931
+ * PR 标题经常很长,会撑破容器把右侧徽章与按钮顶出可视区——
1932
+ * 没有这一行,text-overflow: ellipsis 根本不会生效。
1933
+ */
1934
+ min-width: 0;
1935
+ /*
1936
+ * white-space: nowrap + ellipsis:标题只占一行。
1937
+ * 若允许换行,标题变成两三行后徽章与按钮会浮在首行右侧,
1938
+ * 视觉上与文字末行错位——用户看到的就是「按钮跑到上面去了」。
1939
+ * 完整标题通过 title 属性悬浮查看,这也是 GitHub 自身的做法。
1940
+ */
1941
+ white-space: nowrap;
1942
+ overflow: hidden;
1943
+ text-overflow: ellipsis;
1944
+ /* 标题与按钮之间靠 flex 分配留白,不额外加 margin */
1945
+ text-decoration: none;
1946
+ }
1947
+
1948
+ /*
1949
+ * 「GitHub ↗」跳转按钮。
1950
+ *
1951
+ * 视觉规格按截图反馈重做:原先是 font-size 11px / padding 2px 8px,
1952
+ * 在深色背景上又矮又小、与 13px 标题不匹配,看起来像贴在文字上的标签。
1953
+ * 现在放大到与标题同一视觉量级,并给出明确的悬浮反馈。
1954
+ */
1955
+ .dsh-github-pr-gh-btn {
1956
+ flex-shrink: 0; /* 永不压缩,宁可让标题省略 */
1957
+ /*
1958
+ * margin-left: auto 是双保险:即使标题因某种原因没吃满 flex 空间
1959
+ * (如父容器宽度异常、flex-basis 被覆盖),按钮仍会被推到最右侧,
1960
+ * 而不是紧贴在标题文字屁股后面。
1961
+ */
1962
+ margin-left: auto;
1963
+ display: inline-flex;
1964
+ align-items: center;
1965
+ justify-content: center;
1966
+ gap: 4px;
1967
+ font-size: 12px;
1968
+ font-weight: 500;
1969
+ line-height: 18px;
1970
+ padding: 3px 10px;
1971
+ border-radius: 6px;
1972
+ border: 1px solid var(--dsw-alias-border-l2, #d0d7de);
1973
+ background: var(--dsw-alias-bg-module-platform, #f6f8fa);
1974
+ color: var(--dsw-alias-label-secondary, #57606a);
1975
+ text-decoration: none;
1976
+ white-space: nowrap;
1977
+ transition: all 0.15s ease;
1978
+ }
1979
+ .dsh-github-pr-gh-btn:hover {
1980
+ color: var(--dsw-alias-link, #0969da);
1981
+ border-color: var(--dsw-alias-link, #0969da);
1982
+ background: var(--dsw-alias-interactive-bg-hover, #eaeef2);
1983
+ }
1984
+ body[data-ds-dark-theme] .dsh-github-pr-gh-btn {
1985
+ border-color: var(--dsw-alias-border-l1, #30363d);
1986
+ background: var(--dsw-alias-bg-layer-2, #1e1e22);
1987
+ color: var(--dsw-alias-label-secondary, #8b949e);
1988
+ }
1989
+ body[data-ds-dark-theme] .dsh-github-pr-gh-btn:hover {
1990
+ color: #58a6ff;
1991
+ border-color: #58a6ff;
1992
+ background: rgba(56, 139, 253, 0.15);
1993
+ }
1994
+
1995
+ .dsh-github-pr-file-item {
1996
+ display: flex;
1997
+ align-items: center;
1998
+ justify-content: space-between;
1999
+ gap: 8px;
2000
+ padding: 6px 12px;
2001
+ font-size: 11px;
2002
+ font-family: ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, monospace;
2003
+ cursor: pointer;
2004
+ color: var(--dsw-alias-label-primary, #1f2328);
2005
+ transition: background 0.12s ease;
2006
+ }
2007
+ .dsh-github-pr-file-item:hover {
2008
+ background: var(--dsw-alias-interactive-bg-hover, rgba(0, 0, 0, 0.05));
2009
+ }
2010
+ .dsh-github-pr-file-item.selected {
2011
+ background: rgba(9, 105, 218, 0.1);
2012
+ color: var(--dsw-alias-link, #0969da);
2013
+ font-weight: 600;
2014
+ }
2015
+ body[data-ds-dark-theme] .dsh-github-pr-file-item {
2016
+ color: var(--dsw-alias-label-primary, #f0f6fc);
2017
+ }
2018
+ body[data-ds-dark-theme] .dsh-github-pr-file-item:hover {
2019
+ background: rgba(255, 255, 255, 0.06);
2020
+ }
2021
+ body[data-ds-dark-theme] .dsh-github-pr-file-item.selected {
2022
+ background: rgba(56, 139, 253, 0.18);
2023
+ color: #58a6ff;
2024
+ }
2025
+
2026
+ .dsh-github-pr-diff-viewer {
2027
+ flex: 1;
2028
+ min-width: 0;
2029
+ display: flex;
2030
+ flex-direction: column;
2031
+ overflow: hidden;
2032
+ background: var(--dsw-alias-bg-base, #ffffff);
2033
+ }
2034
+ body[data-ds-dark-theme] .dsh-github-pr-diff-viewer {
2035
+ background: var(--dsw-alias-bg-layer-2, #1e1e22);
2036
+ }
2037
+
2038
+ .dsh-github-pr-diff-toolbar {
2039
+ display: flex;
2040
+ align-items: center;
2041
+ justify-content: space-between;
2042
+ padding: 6px 12px;
2043
+ border-bottom: 1px solid var(--dsw-alias-border-l2, #e1e4e8);
2044
+ background: var(--dsw-alias-bg-module-platform, #f6f8fa);
2045
+ flex-shrink: 0;
2046
+ }
2047
+ body[data-ds-dark-theme] .dsh-github-pr-diff-toolbar {
2048
+ border-bottom-color: var(--dsw-alias-border-l1, #30363d);
2049
+ background: var(--dsw-alias-bg-layer-1, #16161a);
2050
+ }
2051
+
2052
+ /* 行级审查评论:与对话区评论视觉区分(左侧紫色描边,暗示「挂在代码上」) */
2053
+ .dsh-github-pr-line-comments {
2054
+ border-top: 1px solid var(--dsw-alias-border-l2, #e1e4e8);
2055
+ padding: 10px 12px 14px;
2056
+ background: var(--dsw-alias-bg-layer-1, #f6f8fa);
2057
+ }
2058
+ body[data-ds-dark-theme] .dsh-github-pr-line-comments {
2059
+ border-top-color: var(--dsw-alias-border-l1, #30363d);
2060
+ background: var(--dsw-alias-bg-layer-1, #16161a);
2061
+ }
2062
+ .dsh-github-pr-line-comments-title {
2063
+ font-size: 11px;
2064
+ font-weight: 600;
2065
+ margin-bottom: 8px;
2066
+ color: var(--dsw-alias-label-secondary, #656d76);
2067
+ }
2068
+ body[data-ds-dark-theme] .dsh-github-pr-line-comments-title {
2069
+ color: var(--dsw-alias-label-secondary, #8b949e);
2070
+ }
2071
+ .dsh-github-pr-line-comment-item {
2072
+ border-left: 3px solid rgba(130, 80, 223, 0.5);
2073
+ border-radius: 4px;
2074
+ background: var(--dsw-alias-bg-base, #ffffff);
2075
+ padding: 8px 10px;
2076
+ margin-bottom: 8px;
2077
+ }
2078
+ body[data-ds-dark-theme] .dsh-github-pr-line-comment-item {
2079
+ background: var(--dsw-alias-bg-layer-2, #1e1e22);
2080
+ border-left-color: rgba(163, 113, 247, 0.6);
2081
+ }
2082
+ .dsh-github-pr-line-comment-head {
2083
+ display: flex;
2084
+ align-items: center;
2085
+ gap: 8px;
2086
+ flex-wrap: wrap;
2087
+ font-size: 11px;
2088
+ margin-bottom: 5px;
2089
+ }
2090
+ .dsh-github-pr-line-comment-body {
2091
+ font-size: 12px;
2092
+ line-height: 1.6;
2093
+ white-space: pre-wrap;
2094
+ word-break: break-word;
2095
+ color: var(--dsw-alias-label-primary, #1f2328);
2096
+ }
2097
+ body[data-ds-dark-theme] .dsh-github-pr-line-comment-body {
2098
+ color: var(--dsw-alias-label-primary, #f0f6fc);
2099
+ }
2100
+
2101
+ /* 21. PR 弹窗内的 Markdown 排版 (markdown-lite) */
2102
+ .dsh-github-md-body {
2103
+ padding: 12px;
2104
+ font-size: 12px;
2105
+ line-height: 1.7;
2106
+ word-break: break-word;
2107
+ color: var(--dsw-alias-label-primary, #1f2328);
2108
+ }
2109
+ body[data-ds-dark-theme] .dsh-github-md-body {
2110
+ color: var(--dsw-alias-label-primary, #f0f6fc);
2111
+ }
2112
+
2113
+ /* 标题:GitHub 的层级差距比浏览器默认小,避免 h3 过大撑破卡片 */
2114
+ .dsh-github-md-body .dsh-github-md-heading {
2115
+ margin: 14px 0 8px 0;
2116
+ font-weight: 600;
2117
+ line-height: 1.4;
2118
+ }
2119
+ .dsh-github-md-body h1.dsh-github-md-heading { font-size: 17px; }
2120
+ .dsh-github-md-body h2.dsh-github-md-heading { font-size: 15px; }
2121
+ .dsh-github-md-body h3.dsh-github-md-heading { font-size: 14px; }
2122
+ .dsh-github-md-body h4.dsh-github-md-heading { font-size: 13px; }
2123
+ .dsh-github-md-body h5.dsh-github-md-heading,
2124
+ .dsh-github-md-body h6.dsh-github-md-heading { font-size: 12px; opacity: 0.9; }
2125
+ .dsh-github-md-body > .dsh-github-md-heading:first-child {
2126
+ margin-top: 0;
2127
+ }
2128
+
2129
+ .dsh-github-md-body .dsh-github-md-p {
2130
+ margin: 0 0 10px 0;
2131
+ }
2132
+ .dsh-github-md-body .dsh-github-md-p:last-child {
2133
+ margin-bottom: 0;
2134
+ }
2135
+
2136
+ /* 行内代码:用边框 + 底色与正文区分,比单纯改字体更易辨识 */
2137
+ .dsh-github-md-body .dsh-github-md-inline-code {
2138
+ font-family: ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, monospace;
2139
+ font-size: 0.92em;
2140
+ padding: 1px 5px;
2141
+ border-radius: 4px;
2142
+ background: var(--dsw-alias-bg-subtle, rgba(0, 0, 0, 0.06));
2143
+ border: 1px solid var(--dsw-alias-border-subtle, rgba(0, 0, 0, 0.08));
2144
+ word-break: break-all;
2145
+ }
2146
+ body[data-ds-dark-theme] .dsh-github-md-body .dsh-github-md-inline-code {
2147
+ background: rgba(255, 255, 255, 0.1);
2148
+ border-color: rgba(255, 255, 255, 0.12);
2149
+ }
2150
+
2151
+ /* 围栏代码块:横向可滚,绝不换行——换行会毁掉缩进语义 */
2152
+ .dsh-github-md-body .dsh-github-md-pre {
2153
+ margin: 10px 0;
2154
+ padding: 10px 12px;
2155
+ border-radius: 6px;
2156
+ overflow-x: auto;
2157
+ max-height: 420px;
2158
+ background: var(--dsw-alias-bg-subtle, rgba(0, 0, 0, 0.04));
2159
+ border: 1px solid var(--dsw-alias-border-l2, #e1e4e8);
2160
+ }
2161
+ body[data-ds-dark-theme] .dsh-github-md-body .dsh-github-md-pre {
2162
+ background: rgba(0, 0, 0, 0.3);
2163
+ border-color: var(--dsw-alias-border-l1, #30363d);
2164
+ }
2165
+ .dsh-github-md-body .dsh-github-md-pre code {
2166
+ font-family: ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, monospace;
2167
+ font-size: 11px;
2168
+ line-height: 1.55;
2169
+ white-space: pre;
2170
+ display: block;
2171
+ }
2172
+
2173
+ .dsh-github-md-body .dsh-github-md-list {
2174
+ margin: 8px 0;
2175
+ padding-left: 22px;
2176
+ }
2177
+ .dsh-github-md-body .dsh-github-md-list li {
2178
+ margin: 4px 0;
2179
+ }
2180
+ .dsh-github-md-body .dsh-github-md-task {
2181
+ list-style: none;
2182
+ margin-left: -18px;
2183
+ display: flex;
2184
+ align-items: flex-start;
2185
+ gap: 6px;
2186
+ }
2187
+ .dsh-github-md-body .dsh-github-md-checkbox {
2188
+ flex-shrink: 0;
2189
+ opacity: 0.8;
2190
+ }
2191
+
2192
+ .dsh-github-md-body .dsh-github-md-quote {
2193
+ margin: 10px 0;
2194
+ padding: 6px 12px;
2195
+ border-left: 3px solid var(--dsw-alias-border-l3, #d0d7de);
2196
+ color: var(--dsw-alias-label-secondary, #656d76);
2197
+ background: var(--dsw-alias-bg-subtle, rgba(0, 0, 0, 0.02));
2198
+ border-radius: 0 4px 4px 0;
2199
+ }
2200
+
2201
+ .dsh-github-md-body .dsh-github-md-hr {
2202
+ margin: 14px 0;
2203
+ border: none;
2204
+ border-top: 1px solid var(--dsw-alias-border-l2, #e1e4e8);
2205
+ }
2206
+ body[data-ds-dark-theme] .dsh-github-md-body .dsh-github-md-hr {
2207
+ border-top-color: var(--dsw-alias-border-l1, #30363d);
2208
+ }
2209
+
2210
+ .dsh-github-md-body .dsh-github-md-link {
2211
+ color: var(--dsw-alias-link, #0969da);
2212
+ text-decoration: none;
2213
+ }
2214
+ .dsh-github-md-body .dsh-github-md-link:hover {
2215
+ text-decoration: underline;
2216
+ }
2217
+ body[data-ds-dark-theme] .dsh-github-md-body .dsh-github-md-link {
2218
+ color: #58a6ff;
2219
+ }
2220
+
2221
+ /* 折叠/展开按钮:低调的文本按钮,不抢正文视觉 */
2222
+ .dsh-github-md-expand-btn {
2223
+ display: inline-flex;
2224
+ align-items: center;
2225
+ gap: 4px;
2226
+ margin: 0 0 4px 12px;
2227
+ padding: 3px 8px;
2228
+ font-size: 11px;
2229
+ font-weight: 500;
2230
+ border-radius: 5px;
2231
+ border: 1px solid var(--dsw-alias-border-l2, #d0d7de);
2232
+ background: var(--dsw-alias-bg-module-platform, #f6f8fa);
2233
+ color: var(--dsw-alias-label-secondary, #57606a);
2234
+ cursor: pointer;
2235
+ transition: all 0.15s ease;
2236
+ }
2237
+ .dsh-github-md-expand-btn:hover {
2238
+ color: var(--dsw-alias-link, #0969da);
2239
+ border-color: var(--dsw-alias-link, #0969da);
2240
+ }
2241
+ body[data-ds-dark-theme] .dsh-github-md-expand-btn {
2242
+ border-color: var(--dsw-alias-border-l1, #30363d);
2243
+ background: var(--dsw-alias-bg-layer-2, #1e1e22);
2244
+ color: var(--dsw-alias-label-secondary, #8b949e);
2245
+ }
2246
+ body[data-ds-dark-theme] .dsh-github-md-expand-btn:hover {
2247
+ color: #58a6ff;
2248
+ border-color: #58a6ff;
2249
+ }
2250
+
2251
+ /* 22. Issue 在线查看弹窗 (IssueDetailModal)
2252
+ *
2253
+ * 为什么是单列而不是 PR 那样的双栏:Issue 没有 diff 载荷,没有需要并排
2254
+ * 对照的第二个信息源。把宽度全部让给 Markdown 正文,行宽更接近 80 字符的
2255
+ * 可读区间,长讨论读起来比挤在左半边舒服得多。
2256
+ */
2257
+ .dsh-github-issue-modal-dialog {
2258
+ width: 92% !important;
2259
+ max-width: 880px !important;
2260
+ height: 84vh !important;
2261
+ max-height: 84vh !important;
2262
+ display: flex !important;
2263
+ flex-direction: column !important;
2264
+ overflow: hidden !important;
2265
+ padding: 0 !important;
2266
+ }
2267
+
2268
+ .dsh-github-issue-modal-header {
2269
+ padding: 12px 16px !important;
2270
+ border-bottom: 1px solid var(--dsw-alias-border-l2, #e1e4e8);
2271
+ background: var(--dsw-alias-bg-layer-1, #f6f8fa);
2272
+ flex-shrink: 0;
2273
+ }
2274
+ body[data-ds-dark-theme] .dsh-github-issue-modal-header {
2275
+ border-bottom-color: var(--dsw-alias-border-l1, #30363d);
2276
+ background: var(--dsw-alias-bg-layer-1, #16161a);
2277
+ }
2278
+
2279
+ .dsh-github-issue-conversation-pane {
2280
+ padding: 16px !important;
2281
+ overflow-y: auto !important;
2282
+ flex: 1;
2283
+ min-height: 0;
2284
+ display: flex;
2285
+ flex-direction: column;
2286
+ gap: 12px;
2287
+ /* 滚到边界不把滚动传给弹窗外层,避免整页跟着滚 */
2288
+ overscroll-behavior: contain;
2289
+ }
2290
+
2291
+ /* 元数据条:标签/指派人/里程碑/关联 PR 全部以胶囊呈现,一行不够自然换行 */
2292
+ .dsh-github-issue-meta {
2293
+ display: flex;
2294
+ flex-wrap: wrap;
2295
+ align-items: center;
2296
+ gap: 6px;
2297
+ flex: 0 0 auto;
2298
+ }
2299
+ .dsh-github-issue-chip {
2300
+ display: inline-flex;
2301
+ align-items: center;
2302
+ gap: 5px;
2303
+ padding: 2px 8px;
2304
+ border-radius: 999px;
2305
+ border: 1px solid var(--dsw-alias-border-l2, #d0d7de);
2306
+ background: var(--dsw-alias-bg-module-platform, #f6f8fa);
2307
+ color: var(--dsw-alias-label-secondary, #57606a);
2308
+ font-size: 11px;
2309
+ line-height: 18px;
2310
+ white-space: nowrap;
2311
+ max-width: 100%;
2312
+ overflow: hidden;
2313
+ text-overflow: ellipsis;
2314
+ }
2315
+ /* 标签胶囊自身带 label 色(行内 background/borderColor 覆盖),
2316
+ * 这里的类只用于色点与文字对其,不设背景以免行内样式失效时变成灰块 */
2317
+ .dsh-github-issue-label-chip {
2318
+ color: var(--dsw-alias-label-primary, #1f2328);
2319
+ }
2320
+ /* 逾期里程碑:用错误色描边提示「这条已经过期了」,否则和正常 milestone 长得一样 */
2321
+ .dsh-github-issue-chip-overdue {
2322
+ border-color: rgba(207, 34, 46, 0.5);
2323
+ color: var(--dsw-alias-state-error-primary, #cf222e);
2324
+ }
2325
+ body[data-ds-dark-theme] .dsh-github-issue-chip-overdue {
2326
+ border-color: rgba(248, 81, 73, 0.5);
2327
+ color: #f85149;
2328
+ }
2329
+ .dsh-github-issue-label-dot {
2330
+ width: 7px;
2331
+ height: 7px;
2332
+ border-radius: 50%;
2333
+ flex-shrink: 0;
2334
+ }
2335
+ /* 可点击的胶囊(图片清单开关、关联 PR 外链)必须有 hover 反馈,否则看不出可点 */
2336
+ .dsh-github-issue-chip-btn,
2337
+ .dsh-github-issue-chip-link {
2338
+ cursor: pointer;
2339
+ text-decoration: none;
2340
+ font-family: inherit;
2341
+ transition: border-color 0.15s ease, color 0.15s ease;
2342
+ }
2343
+ .dsh-github-issue-chip-btn:hover,
2344
+ .dsh-github-issue-chip-link:hover {
2345
+ color: var(--dsw-alias-link, #0969da);
2346
+ border-color: var(--dsw-alias-link, #0969da);
2347
+ }
2348
+ body[data-ds-dark-theme] .dsh-github-issue-chip {
2349
+ border-color: var(--dsw-alias-border-l1, #30363d);
2350
+ background: var(--dsw-alias-bg-layer-2, #1e1e22);
2351
+ color: var(--dsw-alias-label-secondary, #8b949e);
2352
+ }
2353
+ body[data-ds-dark-theme] .dsh-github-issue-label-chip {
2354
+ color: var(--dsw-alias-label-primary, #f0f6fc);
2355
+ }
2356
+ body[data-ds-dark-theme] .dsh-github-issue-chip-btn:hover,
2357
+ body[data-ds-dark-theme] .dsh-github-issue-chip-link:hover {
2358
+ color: #58a6ff;
2359
+ border-color: #58a6ff;
2360
+ }
2361
+
2362
+ /* 图片清单:展开后逐行列出外链,不与正文混排 */
2363
+ .dsh-github-issue-image-badge {
2364
+ display: inline-flex;
2365
+ flex-direction: column;
2366
+ gap: 6px;
2367
+ max-width: 100%;
2368
+ }
2369
+ .dsh-github-issue-image-links {
2370
+ display: flex;
2371
+ flex-direction: column;
2372
+ gap: 3px;
2373
+ padding: 6px 8px;
2374
+ border-radius: 6px;
2375
+ border: 1px solid var(--dsw-alias-border-l2, #e1e4e8);
2376
+ background: var(--dsw-alias-bg-base, #ffffff);
2377
+ }
2378
+ body[data-ds-dark-theme] .dsh-github-issue-image-links {
2379
+ border-color: var(--dsw-alias-border-l1, #30363d);
2380
+ background: var(--dsw-alias-bg-layer-2, #1e1e22);
2381
+ }
2382
+ .dsh-github-issue-image-link {
2383
+ font-size: 11px;
2384
+ font-family: ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, monospace;
2385
+ color: var(--dsw-alias-link, #0969da);
2386
+ text-decoration: none;
2387
+ overflow: hidden;
2388
+ text-overflow: ellipsis;
2389
+ white-space: nowrap;
2390
+ }
2391
+ .dsh-github-issue-image-link:hover {
2392
+ text-decoration: underline;
2393
+ }
2394
+
2395
+ /* 正文与评论卡片:同 PR 弹窗,flex: 0 0 auto 是滚动能否工作的前提 */
2396
+ .dsh-github-issue-body-card,
2397
+ .dsh-github-issue-comment-card {
2398
+ border: 1px solid var(--dsw-alias-border-l2, #e1e4e8);
2399
+ border-radius: 6px;
2400
+ background: var(--dsw-alias-bg-base, #ffffff);
2401
+ overflow: hidden;
2402
+ /* 禁止收缩:父容器是 column flex,默认 flex-shrink:1 会压缩卡片
2403
+ * 而不是撑开父容器,导致 overflow-y:auto 永不触发(长 Issue 滚不动) */
2404
+ flex: 0 0 auto;
2405
+ }
2406
+ .dsh-github-issue-comment-card {
2407
+ margin-bottom: 10px;
2408
+ }
2409
+ body[data-ds-dark-theme] .dsh-github-issue-body-card,
2410
+ body[data-ds-dark-theme] .dsh-github-issue-comment-card {
2411
+ border-color: var(--dsw-alias-border-l1, #30363d);
2412
+ background: var(--dsw-alias-bg-layer-2, #1e1e22);
2413
+ }
2414
+
2415
+ .dsh-github-issue-comment-header {
2416
+ display: flex;
2417
+ justify-content: space-between;
2418
+ align-items: center;
2419
+ gap: 8px;
2420
+ padding: 6px 12px;
2421
+ background: var(--dsw-alias-bg-module-platform, #f6f8fa);
2422
+ border-bottom: 1px solid var(--dsw-alias-border-l2, #e1e4e8);
2423
+ font-size: 11px;
2424
+ }
2425
+ body[data-ds-dark-theme] .dsh-github-issue-comment-header {
2426
+ background: var(--dsw-alias-bg-layer-1, #16161a);
2427
+ border-bottom-color: var(--dsw-alias-border-l1, #30363d);
2428
+ }
2429
+
2430
+ /* 正文容器不加 padding:CollapsibleBody 内部的 .dsh-github-md-body 已有 12px,
2431
+ * 双层叠加会让正文比评论缩进更深,视觉上误读成引用块 */
2432
+ .dsh-github-issue-body-content {
2433
+ padding: 0;
2434
+ }
2435
+
2436
+ .dsh-github-issue-timeline-title {
2437
+ margin: 4px 0 0 0;
2438
+ font-size: 13px;
2439
+ font-weight: 600;
2440
+ color: var(--dsw-alias-label-primary, #1f2328);
2441
+ flex: 0 0 auto;
2442
+ }
2443
+ body[data-ds-dark-theme] .dsh-github-issue-timeline-title {
2444
+ color: var(--dsw-alias-label-primary, #f0f6fc);
2445
+ }
2446
+
2447
+ .dsh-github-issue-empty-timeline {
2448
+ padding: 16px 0;
2449
+ text-align: center;
2450
+ font-size: 12px;
2451
+ opacity: 0.6;
2452
+ flex: 0 0 auto;
2453
+ }
2454
+
2455
+ /* 23. Actions Run 详情弹窗 (RunDetailModal)
2456
+ *
2457
+ * 为什么是单列而不是 PR 那样的双栏:run 的信息是「一串 job + 一条日志流」,
2458
+ * 天然按纵向顺序阅读,没有需要并排对照的第二个信息源(PR 才有 diff 双栏);
2459
+ * 但宽度仍给到 960px——job/step 名称与日志行都要靠横向空间减少折行。
2460
+ *
2461
+ * 为什么日志块用 pre 而不是 Markdown:GitHub 原始日志里的 #、|、--- 分别是
2462
+ * shell 注释、表格与 diff 分隔符,交给 markdown-lite 会被当成标题/表格语法,
2463
+ * 把堆栈与 diff 片段撕碎;等宽字体 + pre-wrap + 自身滚动区才是日志的呈现形态。
2464
+ */
2465
+ .dsh-github-run-modal-dialog {
2466
+ width: 92% !important;
2467
+ max-width: 960px !important;
2468
+ height: 84vh !important;
2469
+ max-height: 84vh !important;
2470
+ display: flex !important;
2471
+ flex-direction: column !important;
2472
+ overflow: hidden !important;
2473
+ padding: 0 !important;
2474
+ }
2475
+
2476
+ .dsh-github-run-modal-header {
2477
+ padding: 12px 16px !important;
2478
+ border-bottom: 1px solid var(--dsw-alias-border-l2, #e1e4e8);
2479
+ background: var(--dsw-alias-bg-layer-1, #f6f8fa);
2480
+ flex-shrink: 0;
2481
+ }
2482
+ body[data-ds-dark-theme] .dsh-github-run-modal-header {
2483
+ border-bottom-color: var(--dsw-alias-border-l1, #30363d);
2484
+ background: var(--dsw-alias-bg-layer-1, #16161a);
2485
+ }
2486
+
2487
+ /* 滚动容器:flex:1 与 min-height:0 缺一不可,否则 column flex 的子项会按内容
2488
+ * 撑高,overflow-y:auto 永远不触发(长 job 列表滚不动) */
2489
+ .dsh-github-run-body {
2490
+ padding: 14px 16px 20px;
2491
+ overflow-y: auto;
2492
+ flex: 1;
2493
+ min-height: 0;
2494
+ display: flex;
2495
+ flex-direction: column;
2496
+ gap: 10px;
2497
+ /* 滚到边界不把滚动传给弹窗外层,避免整页跟着滚 */
2498
+ overscroll-behavior: contain;
2499
+ }
2500
+
2501
+ /* 元信息行:分隔符交给 ::before,省掉一批纯装饰的空 span */
2502
+ .dsh-github-run-meta {
2503
+ display: flex;
2504
+ flex-wrap: wrap;
2505
+ align-items: center;
2506
+ gap: 6px;
2507
+ padding: 8px 16px;
2508
+ font-size: 11px;
2509
+ line-height: 18px;
2510
+ color: var(--dsw-alias-label-secondary, #57606a);
2511
+ background: var(--dsw-alias-bg-module-platform, #f6f8fa);
2512
+ border-bottom: 1px solid var(--dsw-alias-border-l2, #e1e4e8);
2513
+ flex: 0 0 auto;
2514
+ }
2515
+ .dsh-github-run-meta > span:not(:first-child)::before {
2516
+ content: "·";
2517
+ margin-right: 6px;
2518
+ opacity: 0.5;
2519
+ }
2520
+ body[data-ds-dark-theme] .dsh-github-run-meta {
2521
+ color: var(--dsw-alias-label-secondary, #8b949e);
2522
+ background: var(--dsw-alias-bg-layer-1, #16161a);
2523
+ border-bottom-color: var(--dsw-alias-border-l1, #30363d);
2524
+ }
2525
+
2526
+ .dsh-github-run-mono {
2527
+ font-family: ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, monospace;
2528
+ opacity: 0.9;
2529
+ }
2530
+ .dsh-github-run-degraded {
2531
+ color: var(--dsw-alias-state-warning-primary, #9a6700);
2532
+ }
2533
+ body[data-ds-dark-theme] .dsh-github-run-degraded {
2534
+ color: #d29922;
2535
+ }
2536
+
2537
+ /* 单个 job 卡片 */
2538
+ .dsh-github-run-job {
2539
+ border: 1px solid var(--dsw-alias-border-l2, #e1e4e8);
2540
+ border-radius: 6px;
2541
+ background: var(--dsw-alias-bg-base, #ffffff);
2542
+ overflow: hidden;
2543
+ /* 禁止收缩:父容器是 column flex,默认 flex-shrink:1 会压缩卡片而不是撑开
2544
+ * 父容器,导致 overflow-y:auto 永不触发 */
2545
+ flex: 0 0 auto;
2546
+ }
2547
+ body[data-ds-dark-theme] .dsh-github-run-job {
2548
+ border-color: var(--dsw-alias-border-l1, #30363d);
2549
+ background: var(--dsw-alias-bg-layer-2, #1e1e22);
2550
+ }
2551
+
2552
+ /* 折叠头是 <button>:必须整条重置,否则会继承宿主的按钮边框/灰底/文字居中,
2553
+ * 一排 job 就变成一排「大按钮」,与既有弹窗的行式排版完全冲突 */
2554
+ .dsh-github-run-job-header {
2555
+ display: flex;
2556
+ align-items: center;
2557
+ gap: 8px;
2558
+ width: 100%;
2559
+ padding: 7px 10px;
2560
+ border: none;
2561
+ background: transparent;
2562
+ cursor: pointer;
2563
+ text-align: left;
2564
+ font-family: inherit;
2565
+ font-size: 12px;
2566
+ line-height: 18px;
2567
+ color: var(--dsw-alias-label-primary, #1f2328);
2568
+ border-radius: 6px;
2569
+ transition: background 0.15s ease;
2570
+ }
2571
+ .dsh-github-run-job-header:hover {
2572
+ background: var(--dsw-alias-interactive-bg-hover, #eaeef2);
2573
+ }
2574
+ body[data-ds-dark-theme] .dsh-github-run-job-header {
2575
+ color: var(--dsw-alias-label-primary, #f0f6fc);
2576
+ }
2577
+ body[data-ds-dark-theme] .dsh-github-run-job-header:hover {
2578
+ background: rgba(56, 139, 253, 0.12);
2579
+ }
2580
+ .dsh-github-run-caret {
2581
+ flex-shrink: 0;
2582
+ width: 10px;
2583
+ font-size: 10px;
2584
+ opacity: 0.65;
2585
+ }
2586
+ .dsh-github-run-job-name {
2587
+ flex: 1 1 auto;
2588
+ min-width: 0;
2589
+ font-weight: 500;
2590
+ overflow: hidden;
2591
+ text-overflow: ellipsis;
2592
+ white-space: nowrap;
2593
+ }
2594
+ .dsh-github-run-failed-count {
2595
+ flex-shrink: 0;
2596
+ font-size: 11px;
2597
+ opacity: 0.6;
2598
+ white-space: nowrap;
2599
+ }
2600
+ /* 有失败步骤时点成错误色:0/N 与 2/N 的信息量完全不同,不能同色 */
2601
+ .dsh-github-run-failed-count.is-hit {
2602
+ opacity: 1;
2603
+ font-weight: 600;
2604
+ color: var(--dsw-alias-state-error-primary, #cf222e);
2605
+ }
2606
+ body[data-ds-dark-theme] .dsh-github-run-failed-count.is-hit {
2607
+ color: #f85149;
2608
+ }
2609
+
2610
+ /* 步骤表:四列等宽对齐(序号 / 名称 / 状态 / 耗时);没有表头,用 grid 行式
2611
+ * 布局比 table 更轻,且能让长步骤名省略而不是撑破布局 */
2612
+ .dsh-github-run-steps {
2613
+ border-top: 1px solid var(--dsw-alias-border-l2, #e1e4e8);
2614
+ display: flex;
2615
+ flex-direction: column;
2616
+ }
2617
+ body[data-ds-dark-theme] .dsh-github-run-steps {
2618
+ border-top-color: var(--dsw-alias-border-l1, #30363d);
2619
+ }
2620
+ .dsh-github-run-step {
2621
+ display: grid;
2622
+ grid-template-columns: 32px minmax(0, 1fr) auto 62px;
2623
+ align-items: center;
2624
+ gap: 8px;
2625
+ padding: 5px 10px 5px 18px;
2626
+ font-size: 11px;
2627
+ line-height: 17px;
2628
+ color: var(--dsw-alias-label-primary, #1f2328);
2629
+ border-bottom: 1px solid var(--dsw-alias-border-l2, #eaeef2);
2630
+ }
2631
+ .dsh-github-run-step:last-child {
2632
+ border-bottom: none;
2633
+ }
2634
+ .dsh-github-run-step > span:first-child {
2635
+ font-variant-numeric: tabular-nums;
2636
+ opacity: 0.55;
2637
+ }
2638
+ .dsh-github-run-step > span:nth-child(2) {
2639
+ overflow: hidden;
2640
+ text-overflow: ellipsis;
2641
+ white-space: nowrap;
2642
+ }
2643
+ .dsh-github-run-step > span:nth-child(3) {
2644
+ justify-self: start;
2645
+ }
2646
+ body[data-ds-dark-theme] .dsh-github-run-step {
2647
+ color: var(--dsw-alias-label-primary, #f0f6fc);
2648
+ border-bottom-color: var(--dsw-alias-border-l1, #30363d);
2649
+ }
2650
+ /* 失败步骤:浅红底 + 左侧粗线,扫一眼就能定位断点,不必逐个读状态文字 */
2651
+ .dsh-github-run-step-failed {
2652
+ background: rgba(207, 34, 46, 0.07);
2653
+ box-shadow: inset 3px 0 0 rgba(207, 34, 46, 0.55);
2654
+ }
2655
+ body[data-ds-dark-theme] .dsh-github-run-step-failed {
2656
+ background: rgba(248, 81, 73, 0.12);
2657
+ box-shadow: inset 3px 0 0 rgba(248, 81, 73, 0.7);
2658
+ }
2659
+
2660
+ /* 耗时列:tabular-nums 让 m/s 数字上下严格对齐 */
2661
+ .dsh-github-run-duration {
2662
+ font-size: 11px;
2663
+ font-variant-numeric: tabular-nums;
2664
+ white-space: nowrap;
2665
+ text-align: right;
2666
+ justify-self: end;
2667
+ opacity: 0.65;
2668
+ }
2669
+
2670
+ /* 日志提取按钮,同时也是错误块里的「重试」 */
2671
+ .dsh-github-run-log-btn {
2672
+ align-self: flex-start;
2673
+ flex-shrink: 0;
2674
+ font-family: inherit;
2675
+ font-size: 11px;
2676
+ line-height: 18px;
2677
+ padding: 5px 12px;
2678
+ border-radius: 6px;
2679
+ border: 1px solid var(--dsw-alias-border-l2, #d0d7de);
2680
+ background: var(--dsw-alias-bg-module-platform, #f6f8fa);
2681
+ color: var(--dsw-alias-label-primary, #1f2328);
2682
+ cursor: pointer;
2683
+ transition: border-color 0.15s ease, color 0.15s ease;
2684
+ }
2685
+ .dsh-github-run-log-btn:hover:not(:disabled) {
2686
+ color: var(--dsw-alias-link, #0969da);
2687
+ border-color: var(--dsw-alias-link, #0969da);
2688
+ }
2689
+ .dsh-github-run-log-btn:disabled {
2690
+ cursor: progress;
2691
+ opacity: 0.6;
2692
+ }
2693
+ body[data-ds-dark-theme] .dsh-github-run-log-btn {
2694
+ border-color: var(--dsw-alias-border-l1, #30363d);
2695
+ background: var(--dsw-alias-bg-layer-2, #1e1e22);
2696
+ color: var(--dsw-alias-label-primary, #f0f6fc);
2697
+ }
2698
+ body[data-ds-dark-theme] .dsh-github-run-log-btn:hover:not(:disabled) {
2699
+ color: #58a6ff;
2700
+ border-color: #58a6ff;
2701
+ }
2702
+
2703
+ .dsh-github-run-log-section {
2704
+ display: flex;
2705
+ flex-direction: column;
2706
+ gap: 8px;
2707
+ flex: 0 0 auto;
2708
+ }
2709
+ .dsh-github-run-log-block {
2710
+ display: flex;
2711
+ flex-direction: column;
2712
+ gap: 6px;
2713
+ }
2714
+ .dsh-github-run-log-title {
2715
+ font-size: 12px;
2716
+ font-weight: 600;
2717
+ color: var(--dsw-alias-label-primary, #1f2328);
2718
+ overflow: hidden;
2719
+ text-overflow: ellipsis;
2720
+ white-space: nowrap;
2721
+ }
2722
+ body[data-ds-dark-theme] .dsh-github-run-log-title {
2723
+ color: var(--dsw-alias-label-primary, #f0f6fc);
2724
+ }
2725
+ /* 截断提示必须显眼:用户看到的是不完整日志,不能让他误以为日志就这么多 */
2726
+ .dsh-github-run-log-truncated {
2727
+ font-size: 11px;
2728
+ color: var(--dsw-alias-state-warning-primary, #9a6700);
2729
+ }
2730
+ body[data-ds-dark-theme] .dsh-github-run-log-truncated {
2731
+ color: #d29922;
2732
+ }
2733
+ .dsh-github-run-log-hint {
2734
+ font-size: 11px;
2735
+ line-height: 1.6;
2736
+ opacity: 0.7;
2737
+ }
2738
+
2739
+ /* 日志正文:等宽 + pre-wrap(GitHub 日志几乎不折行,默认 pre 会把长行藏进横向
2740
+ * 滚动),max-height 内独立滚动,避免几万行日志把整个弹窗顶爆 */
2741
+ .dsh-github-run-log {
2742
+ margin: 0;
2743
+ padding: 8px 10px;
2744
+ max-height: 320px;
2745
+ overflow: auto;
2746
+ font-family: ui-monospace, SFMono-Regular, SF Mono, Menlo, Consolas, monospace;
2747
+ font-size: 11px;
2748
+ line-height: 1.5;
2749
+ white-space: pre-wrap;
2750
+ word-break: break-word;
2751
+ border: 1px solid var(--dsw-alias-border-l2, #e1e4e8);
2752
+ border-radius: 6px;
2753
+ background: var(--dsw-alias-bg-layer-1, #f6f8fa);
2754
+ color: var(--dsw-alias-label-primary, #1f2328);
2755
+ overscroll-behavior: contain;
2756
+ }
2757
+ body[data-ds-dark-theme] .dsh-github-run-log {
2758
+ border-color: var(--dsw-alias-border-l1, #30363d);
2759
+ background: var(--dsw-alias-bg-layer-1, #16161a);
2760
+ color: var(--dsw-alias-label-primary, #f0f6fc);
2761
+ }
2762
+
2763
+ /* 错误块:错误文本可能是一整段 gh 原始输出,单独限高滚动,别让它把重试按钮顶出视口 */
2764
+ .dsh-github-run-error {
2765
+ display: flex;
2766
+ flex-direction: column;
2767
+ gap: 6px;
2768
+ padding: 10px 12px;
2769
+ border-radius: 6px;
2770
+ border: 1px solid rgba(248, 81, 73, 0.35);
2771
+ background: rgba(248, 81, 73, 0.08);
2772
+ color: var(--dsw-alias-state-error-primary, #cf222e);
2773
+ font-size: 12px;
2774
+ flex: 0 0 auto;
2775
+ }
2776
+ body[data-ds-dark-theme] .dsh-github-run-error {
2777
+ border-color: rgba(248, 81, 73, 0.45);
2778
+ background: rgba(248, 81, 73, 0.12);
2779
+ color: #f85149;
2780
+ }
2781
+ .dsh-github-run-error-title {
2782
+ font-weight: 600;
2783
+ }
2784
+ .dsh-github-run-error-text {
2785
+ max-height: 180px;
2786
+ overflow: auto;
2787
+ opacity: 0.9;
2788
+ line-height: 1.6;
2789
+ word-break: break-word;
2790
+ white-space: pre-wrap;
2791
+ overscroll-behavior: contain;
2792
+ }
2793
+
2794
+ .dsh-github-run-empty {
2795
+ padding: 18px 0;
2796
+ text-align: center;
2797
+ font-size: 12px;
2798
+ opacity: 0.6;
2799
+ flex: 0 0 auto;
2800
+ }
2801
+ body[data-ds-dark-theme] .dsh-github-run-empty {
2802
+ color: var(--dsw-alias-label-secondary, #8b949e);
2803
+ }
2804
+
2805
+ /* ciBadge 的 neutral 档(skipped)在全局样式里没有定义;只在本弹窗作用域内补,
2806
+ * 免得影响其它面板已有徽章的观感 */
2807
+ .dsh-github-run-modal-dialog .dsh-badge-neutral {
2808
+ background: rgba(110, 118, 129, 0.14);
2809
+ border: 1px solid rgba(110, 118, 129, 0.28);
2810
+ color: var(--dsw-alias-label-secondary, #57606a);
2811
+ }
2812
+ body[data-ds-dark-theme] .dsh-github-run-modal-dialog .dsh-badge-neutral {
2813
+ background: rgba(139, 148, 158, 0.18);
2814
+ border-color: rgba(139, 148, 158, 0.35);
2815
+ color: var(--dsw-alias-label-secondary, #8b949e);
2816
+ }
1531
2817
  `;
1532
2818
  export function injectStyles() {
1533
2819
  var styleId = "dsh-plugin-github-styles";