dsh-plugin 1.1.1 → 1.2.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.
- package/README.en.md +5 -5
- package/README.md +5 -5
- package/client/client.js +4772 -1659
- package/client/client.js.map +1 -1
- package/lib/http/routes.js +451 -28
- package/lib/index.js +5 -1
- package/lib/services/{install-types.js → install/install-types.js} +8 -2
- package/lib/services/install/install.js +4 -0
- package/lib/services/install/npm-check.js +55 -0
- package/lib/services/{npm-resolve.js → install/npm-resolve.js} +11 -5
- package/lib/services/{preflight.js → install/preflight.js} +23 -7
- package/lib/services/{task-queue.js → install/task-queue.js} +166 -71
- package/lib/services/loader.js +60 -1
- package/lib/services/log.js +138 -0
- package/lib/services/probe.js +157 -0
- package/lib/services/{installed-versions.js → profile/installed-versions.js} +5 -1
- package/lib/services/{pending-restart.js → profile/pending-restart.js} +1 -1
- package/lib/services/{profile.js → profile/profile.js} +59 -4
- package/lib/services/{progress.js → profile/progress.js} +4 -0
- package/lib/services/settings.js +60 -0
- package/lib/types/http/routes.d.ts +1 -1
- package/lib/types/index.d.ts +5 -1
- package/lib/types/services/{install-types.d.ts → install/install-types.d.ts} +13 -4
- package/lib/types/services/{install.d.ts → install/install.d.ts} +9 -5
- package/lib/types/services/install/npm-check.d.ts +12 -0
- package/lib/types/services/{npm-resolve.d.ts → install/npm-resolve.d.ts} +2 -1
- package/lib/types/services/{task-queue.d.ts → install/task-queue.d.ts} +5 -1
- package/lib/types/services/loader.d.ts +14 -4
- package/lib/types/services/log.d.ts +49 -0
- package/lib/types/services/probe.d.ts +30 -0
- package/lib/types/services/{pending-restart.d.ts → profile/pending-restart.d.ts} +9 -3
- package/lib/types/services/{profile.d.ts → profile/profile.d.ts} +6 -2
- package/lib/types/services/{progress.d.ts → profile/progress.d.ts} +4 -0
- package/lib/types/services/settings.d.ts +24 -0
- package/package.json +1 -1
- package/src/client/components/PluginHubSection.tsx +346 -121
- package/src/client/components/{CatalogList.tsx → catalog/CatalogList.tsx} +15 -7
- package/src/client/components/{PluginCard.tsx → catalog/PluginCard.tsx} +10 -5
- package/src/client/components/layout/CatalogControls.tsx +80 -0
- package/src/client/components/{CatalogHeader.tsx → layout/CatalogHeader.tsx} +8 -4
- package/src/client/components/{CategoryTabs.tsx → layout/CategoryTabs.tsx} +7 -3
- package/src/client/components/layout/SectionTabs.tsx +60 -0
- package/src/client/components/{AboutModal.tsx → modals/AboutModal.tsx} +11 -7
- package/src/client/components/{HubUpdateModal.tsx → modals/HubUpdateModal.tsx} +9 -5
- package/src/client/components/modals/InstalledDetailModal.tsx +193 -0
- package/src/client/components/modals/LogsModal.tsx +301 -0
- package/src/client/components/modals/LogsPathModal.tsx +161 -0
- package/src/client/components/{NotificationsModal.tsx → modals/NotificationsModal.tsx} +51 -20
- package/src/client/components/{ProgressView.tsx → modals/ProgressView.tsx} +6 -2
- package/src/client/components/{modals.tsx → modals/modals.tsx} +121 -40
- package/src/client/components/{Dropdown.tsx → ui/Dropdown.tsx} +18 -6
- package/src/client/components/ui/Toggle.tsx +28 -0
- package/src/client/components/ui/icons.tsx +343 -0
- package/src/client/components/views/CustomInstallView.tsx +250 -0
- package/src/client/components/views/DiagnosticsView.tsx +172 -0
- package/src/client/components/views/InstalledView.tsx +328 -0
- package/src/client/components/views/LogsView.tsx +150 -0
- package/src/client/components/views/MarketView.tsx +66 -0
- package/src/client/components/views/SettingsView.tsx +273 -0
- package/src/client/data/catalog.ts +38 -0
- package/src/client/data/host.ts +107 -0
- package/src/client/data/hub.ts +41 -0
- package/src/client/hooks/useCatalog.ts +77 -117
- package/src/client/hooks/useIncrementalList.ts +46 -0
- package/src/client/hooks/useLanguage.ts +40 -0
- package/src/client/hooks/useSettings.ts +90 -0
- package/src/client/hooks/useTaskQueue.ts +168 -47
- package/src/client/index.tsx +4 -0
- package/src/client/locales.ts +365 -39
- package/src/client/logic/constants.ts +87 -0
- package/src/client/{lib → logic}/failures.ts +99 -74
- package/src/client/{lib → logic}/format.ts +4 -0
- package/src/client/logic/install-command.ts +56 -0
- package/src/client/logic/installed.ts +207 -0
- package/src/client/logic/normalize.ts +52 -0
- package/src/client/{lib → logic}/renderMarkdown.ts +4 -0
- package/src/client/logic/urls.ts +125 -0
- package/src/client/styles/CustomInstallView.module.css +191 -0
- package/src/client/styles/DiagnosticsView.module.css +231 -0
- package/src/client/styles/Dropdown.module.css +46 -41
- package/src/client/styles/Header.module.css +105 -133
- package/src/client/styles/InstalledView.module.css +447 -0
- package/src/client/styles/List.module.css +11 -1
- package/src/client/styles/LogsView.module.css +503 -0
- package/src/client/styles/Modal.module.css +357 -71
- package/src/client/styles/SectionTabs.module.css +142 -0
- package/src/client/styles/SettingsView.module.css +232 -0
- package/src/client/styles/Toggle.module.css +60 -0
- package/src/client/styles/tokens.module.css +6 -1
- package/src/client/types.ts +28 -4
- package/src/server/http/routes.ts +426 -28
- package/src/server/index.ts +5 -1
- package/src/server/services/{install-types.ts → install/install-types.ts} +13 -5
- package/src/server/services/{install.ts → install/install.ts} +9 -5
- package/src/server/services/install/npm-check.ts +53 -0
- package/src/server/services/{npm-resolve.ts → install/npm-resolve.ts} +11 -5
- package/src/server/services/{preflight.ts → install/preflight.ts} +24 -7
- package/src/server/services/{task-queue.ts → install/task-queue.ts} +168 -68
- package/src/server/services/loader.ts +59 -1
- package/src/server/services/log.ts +167 -0
- package/src/server/services/probe.ts +157 -0
- package/src/server/services/{installed-versions.ts → profile/installed-versions.ts} +5 -1
- package/src/server/services/{pending-restart.ts → profile/pending-restart.ts} +9 -3
- package/src/server/services/{profile.ts → profile/profile.ts} +58 -4
- package/src/server/services/{progress.ts → profile/progress.ts} +4 -0
- package/src/server/services/settings.ts +79 -0
- package/lib/services/install.js +0 -4
- package/src/client/components/CatalogControls.tsx +0 -104
- package/src/client/components/icons.tsx +0 -125
- package/src/client/lib/catalog.ts +0 -272
- package/src/client/lib/env.ts +0 -16
- /package/lib/types/services/{preflight.d.ts → install/preflight.d.ts} +0 -0
- /package/lib/types/services/{installed-versions.d.ts → profile/installed-versions.d.ts} +0 -0
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
/* Plugin Hub
|
|
1
|
+
/* DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
|
|
2
|
+
* Website: https://dsh-plugin.org
|
|
3
|
+
* GitHub: https://github.com/dshplugin/dsh-plugin-hub
|
|
4
|
+
*
|
|
5
|
+
* Plugin Hub dialogs and overlays: install / uninstall modals, error dialog,
|
|
2
6
|
* failure-record dialog, task-queue dialog, progress strip, inline progress
|
|
3
7
|
* and the global toast. Colors resolve through the --hub-* design tokens. */
|
|
4
8
|
|
|
@@ -41,6 +45,22 @@
|
|
|
41
45
|
max-width: calc(100vw - 48px);
|
|
42
46
|
}
|
|
43
47
|
|
|
48
|
+
/* 日志存放位置弹窗:加宽 —— 路径随用户主目录/用户名变化(长短不一),
|
|
49
|
+
输入框内要完整显示长路径,窄了显示不下 */
|
|
50
|
+
.modalWide {
|
|
51
|
+
width: 560px;
|
|
52
|
+
max-width: calc(100vw - 48px);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/* 系统日志查看器弹窗:比错误弹窗更宽 —— 日志行带时间/级别/类别/事件/描述,
|
|
56
|
+
加上筛选栏与底部操作栏后需要横向空间,窄了长行容易折行。
|
|
57
|
+
高度固定(540px,小视口才让位给窗口上限):内容多寡不再让弹窗忽高忽低 */
|
|
58
|
+
.logModal {
|
|
59
|
+
width: 780px;
|
|
60
|
+
height: min(540px, calc(100vh - 64px));
|
|
61
|
+
max-width: calc(100vw - 48px);
|
|
62
|
+
}
|
|
63
|
+
|
|
44
64
|
.modalHead {
|
|
45
65
|
display: flex;
|
|
46
66
|
align-items: center;
|
|
@@ -662,6 +682,32 @@
|
|
|
662
682
|
pointer-events: none;
|
|
663
683
|
}
|
|
664
684
|
|
|
685
|
+
/* 「立即重启」的警告色变体:重启属于「提醒/待办」语义,用琥珀警告色而非品牌蓝,
|
|
686
|
+
与行内重启按钮、待重启状态点保持同一警示视觉;「完成/关闭」按钮继续用品牌蓝 */
|
|
687
|
+
.restartNowWarning {
|
|
688
|
+
font-size: 12px;
|
|
689
|
+
font-weight: 600;
|
|
690
|
+
line-height: 18px;
|
|
691
|
+
color: #fff;
|
|
692
|
+
background: var(--hub-warning);
|
|
693
|
+
border: none;
|
|
694
|
+
border-radius: 6px;
|
|
695
|
+
padding: 5px 14px;
|
|
696
|
+
cursor: pointer;
|
|
697
|
+
user-select: none;
|
|
698
|
+
transition: background 120ms ease;
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
.restartNowWarning:hover {
|
|
702
|
+
background: var(--hub-warning-hover);
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
.restartNowWarning:disabled {
|
|
706
|
+
opacity: 0.55;
|
|
707
|
+
cursor: not-allowed;
|
|
708
|
+
pointer-events: none;
|
|
709
|
+
}
|
|
710
|
+
|
|
665
711
|
/* 成功结果视图(安装/卸载完成):按钮对居中,与上方居中的对勾/标题/说明对齐,
|
|
666
712
|
而不是沿用通用 modalActions 的右对齐;等宽成组,视觉上不散落 */
|
|
667
713
|
.result .modalActions {
|
|
@@ -672,7 +718,8 @@
|
|
|
672
718
|
}
|
|
673
719
|
|
|
674
720
|
.result .modalActions .restartLater,
|
|
675
|
-
.result .modalActions .restartNow
|
|
721
|
+
.result .modalActions .restartNow,
|
|
722
|
+
.result .modalActions .restartNowWarning {
|
|
676
723
|
min-width: 100px;
|
|
677
724
|
}
|
|
678
725
|
|
|
@@ -735,6 +782,34 @@
|
|
|
735
782
|
}
|
|
736
783
|
}
|
|
737
784
|
|
|
785
|
+
/* —— 安装失败记录 —— */
|
|
786
|
+
|
|
787
|
+
/* 失败记录列表:纵向排列,高度随记录数自适应 —— 记录少时贴合内容,记录多时由窗体 max-height 兜底滚动 */
|
|
788
|
+
.failList {
|
|
789
|
+
display: flex;
|
|
790
|
+
flex-direction: column;
|
|
791
|
+
gap: 12px;
|
|
792
|
+
padding-right: 2px;
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
/* 每条失败记录 = 一张独立卡片:边框 + 底色 + 内边距,多条之间以间距清晰分隔,按钮归属一眼可辨 */
|
|
796
|
+
.failRow {
|
|
797
|
+
display: flex;
|
|
798
|
+
flex-direction: column;
|
|
799
|
+
gap: 8px;
|
|
800
|
+
padding: 10px 12px;
|
|
801
|
+
border: 1px solid var(--hub-border-2);
|
|
802
|
+
border-radius: 8px;
|
|
803
|
+
background: var(--hub-bg-2);
|
|
804
|
+
}
|
|
805
|
+
|
|
806
|
+
.failHead {
|
|
807
|
+
display: flex;
|
|
808
|
+
align-items: center;
|
|
809
|
+
gap: 8px;
|
|
810
|
+
min-width: 0;
|
|
811
|
+
}
|
|
812
|
+
|
|
738
813
|
/* —— 任务通知中心(成功 + 失败) —— */
|
|
739
814
|
|
|
740
815
|
/* 通知列表:纵向排列,高度随记录数自适应 —— 记录少时贴合内容,记录多时由窗体 max-height 兜底滚动 */
|
|
@@ -829,32 +904,99 @@
|
|
|
829
904
|
color: var(--hub-danger-text);
|
|
830
905
|
}
|
|
831
906
|
|
|
832
|
-
/*
|
|
833
|
-
|
|
834
|
-
/* 失败记录列表:纵向排列,高度随记录数自适应 —— 记录少时贴合内容,记录多时由窗体 max-height 兜底滚动 */
|
|
835
|
-
.failList {
|
|
907
|
+
/* 每条通知底部的完整时间戳:YYYY-MM-DD HH:mm:ss,靠右下角展示 */
|
|
908
|
+
.noticeFoot {
|
|
836
909
|
display: flex;
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
padding-right: 2px;
|
|
910
|
+
justify-content: flex-end;
|
|
911
|
+
align-items: center;
|
|
840
912
|
}
|
|
841
913
|
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
border: 1px solid var(--hub-border-2);
|
|
849
|
-
border-radius: 8px;
|
|
850
|
-
background: var(--hub-bg-2);
|
|
914
|
+
.noticeTime {
|
|
915
|
+
flex-shrink: 0;
|
|
916
|
+
font-size: 11px;
|
|
917
|
+
line-height: 16px;
|
|
918
|
+
color: var(--hub-text-tertiary);
|
|
919
|
+
font-variant-numeric: tabular-nums;
|
|
851
920
|
}
|
|
852
921
|
|
|
853
|
-
|
|
854
|
-
|
|
922
|
+
/* 每条通知右侧的单条删除按钮:小号透明 X,靠右对齐,hover 变红提示可删,可单独移除该条 */
|
|
923
|
+
.noticeRemove {
|
|
924
|
+
margin-left: auto;
|
|
925
|
+
flex-shrink: 0;
|
|
926
|
+
display: inline-flex;
|
|
855
927
|
align-items: center;
|
|
856
|
-
|
|
857
|
-
|
|
928
|
+
justify-content: center;
|
|
929
|
+
width: 22px;
|
|
930
|
+
height: 22px;
|
|
931
|
+
color: var(--hub-text-tertiary);
|
|
932
|
+
background: transparent;
|
|
933
|
+
border: none;
|
|
934
|
+
border-radius: 5px;
|
|
935
|
+
cursor: pointer;
|
|
936
|
+
user-select: none;
|
|
937
|
+
transition: color 120ms ease, background 120ms ease;
|
|
938
|
+
}
|
|
939
|
+
|
|
940
|
+
.noticeRemove:hover {
|
|
941
|
+
color: var(--hub-danger-text);
|
|
942
|
+
background: var(--hub-danger-tint);
|
|
943
|
+
}
|
|
944
|
+
|
|
945
|
+
/* 成功通知卡片(时间戳已并入头部行):删除按钮不再用 auto margin 顶到最右,
|
|
946
|
+
由时间戳的 margin-left:auto 把「时间 + 删除」整体推到行尾 —— 图标文字与
|
|
947
|
+
时间垂直居中,卡片只有一行内容,整体居中不顶头 */
|
|
948
|
+
.noticeRowOk .noticeRemove {
|
|
949
|
+
margin-left: 0;
|
|
950
|
+
}
|
|
951
|
+
|
|
952
|
+
.noticeRowOk .noticeTime {
|
|
953
|
+
margin-left: auto;
|
|
954
|
+
}
|
|
955
|
+
|
|
956
|
+
/* 更新提醒通知:整行可点击直达更新确认弹窗 —— 卡片 hover 提亮 + 指针手型 */
|
|
957
|
+
.noticeRowUpdate {
|
|
958
|
+
cursor: pointer;
|
|
959
|
+
transition: border-color 120ms ease, background 120ms ease;
|
|
960
|
+
}
|
|
961
|
+
|
|
962
|
+
.noticeRowUpdate:hover {
|
|
963
|
+
border-color: var(--hub-brand);
|
|
964
|
+
background: var(--hub-brand-tint);
|
|
965
|
+
}
|
|
966
|
+
|
|
967
|
+
/* 更新提醒:新版本号小徽标(紧随标题之后,品牌蓝浅底) */
|
|
968
|
+
.noticeVersion {
|
|
969
|
+
flex-shrink: 0;
|
|
970
|
+
font-size: 11px;
|
|
971
|
+
line-height: 18px;
|
|
972
|
+
font-weight: 600;
|
|
973
|
+
color: var(--hub-brand);
|
|
974
|
+
background: var(--hub-brand-tint);
|
|
975
|
+
border: 1px solid var(--hub-brand-border);
|
|
976
|
+
border-radius: 5px;
|
|
977
|
+
padding: 0 6px;
|
|
978
|
+
font-variant-numeric: tabular-nums;
|
|
979
|
+
}
|
|
980
|
+
|
|
981
|
+
/* 更新提醒:行尾「去更新」小按钮(品牌蓝实底白字) */
|
|
982
|
+
.noticeUpdateGo {
|
|
983
|
+
flex-shrink: 0;
|
|
984
|
+
margin-left: 2px;
|
|
985
|
+
font-size: 11px;
|
|
986
|
+
line-height: 16px;
|
|
987
|
+
font-weight: 600;
|
|
988
|
+
color: #fff;
|
|
989
|
+
background: var(--hub-brand);
|
|
990
|
+
border: none;
|
|
991
|
+
border-radius: 5px;
|
|
992
|
+
padding: 2px 8px;
|
|
993
|
+
cursor: pointer;
|
|
994
|
+
user-select: none;
|
|
995
|
+
transition: background 120ms ease;
|
|
996
|
+
}
|
|
997
|
+
|
|
998
|
+
.noticeUpdateGo:hover {
|
|
999
|
+
background: var(--hub-brand-hover);
|
|
858
1000
|
}
|
|
859
1001
|
|
|
860
1002
|
/* 操作类型徽标:安装失败红 / 卸载失败黄 */
|
|
@@ -900,55 +1042,6 @@
|
|
|
900
1042
|
text-decoration: underline;
|
|
901
1043
|
}
|
|
902
1044
|
|
|
903
|
-
/* 每条通知底部的完整时间戳:YYYY-MM-DD HH:mm:ss,靠右下角展示 */
|
|
904
|
-
.noticeFoot {
|
|
905
|
-
display: flex;
|
|
906
|
-
justify-content: flex-end;
|
|
907
|
-
align-items: center;
|
|
908
|
-
}
|
|
909
|
-
|
|
910
|
-
.noticeTime {
|
|
911
|
-
flex-shrink: 0;
|
|
912
|
-
font-size: 11px;
|
|
913
|
-
line-height: 16px;
|
|
914
|
-
color: var(--hub-text-tertiary);
|
|
915
|
-
font-variant-numeric: tabular-nums;
|
|
916
|
-
}
|
|
917
|
-
|
|
918
|
-
/* 每条通知右侧的单条删除按钮:小号透明 X,靠右对齐,hover 变红提示可删,可单独移除该条 */
|
|
919
|
-
.noticeRemove {
|
|
920
|
-
margin-left: auto;
|
|
921
|
-
flex-shrink: 0;
|
|
922
|
-
display: inline-flex;
|
|
923
|
-
align-items: center;
|
|
924
|
-
justify-content: center;
|
|
925
|
-
width: 22px;
|
|
926
|
-
height: 22px;
|
|
927
|
-
color: var(--hub-text-tertiary);
|
|
928
|
-
background: transparent;
|
|
929
|
-
border: none;
|
|
930
|
-
border-radius: 5px;
|
|
931
|
-
cursor: pointer;
|
|
932
|
-
user-select: none;
|
|
933
|
-
transition: color 120ms ease, background 120ms ease;
|
|
934
|
-
}
|
|
935
|
-
|
|
936
|
-
.noticeRemove:hover {
|
|
937
|
-
color: var(--hub-danger-text);
|
|
938
|
-
background: var(--hub-danger-tint);
|
|
939
|
-
}
|
|
940
|
-
|
|
941
|
-
/* 成功通知卡片(时间戳已并入头部行):删除按钮不再用 auto margin 顶到最右,
|
|
942
|
-
由时间戳的 margin-left:auto 把「时间 + 删除」整体推到行尾 —— 图标文字与
|
|
943
|
-
时间垂直居中,卡片只有一行内容,整体居中不顶头 */
|
|
944
|
-
.noticeRowOk .noticeRemove {
|
|
945
|
-
margin-left: 0;
|
|
946
|
-
}
|
|
947
|
-
|
|
948
|
-
.noticeRowOk .noticeTime {
|
|
949
|
-
margin-left: auto;
|
|
950
|
-
}
|
|
951
|
-
|
|
952
1045
|
/* 记录内的复制按钮:纯灰文字、无边框,低调隐蔽,点击即可复制该条完整错误日志 */
|
|
953
1046
|
.failCopy {
|
|
954
1047
|
flex-shrink: 0;
|
|
@@ -1278,3 +1371,196 @@
|
|
|
1278
1371
|
color: var(--hub-brand-hover);
|
|
1279
1372
|
text-decoration: underline;
|
|
1280
1373
|
}
|
|
1374
|
+
|
|
1375
|
+
/* —— 已安装插件详情弹窗 —— */
|
|
1376
|
+
|
|
1377
|
+
/* 详情弹窗:比普通弹窗略宽,给信息网格/路径留出横向空间 */
|
|
1378
|
+
.detailModal {
|
|
1379
|
+
width: 480px;
|
|
1380
|
+
max-width: calc(100vw - 48px);
|
|
1381
|
+
}
|
|
1382
|
+
|
|
1383
|
+
/* 有可用更新提示条:品牌色浅底 + 边框,醒目但不刺眼 */
|
|
1384
|
+
.detailUpdateHint {
|
|
1385
|
+
padding: 6px 10px;
|
|
1386
|
+
font-size: 12px;
|
|
1387
|
+
line-height: 18px;
|
|
1388
|
+
color: var(--hub-brand);
|
|
1389
|
+
background: var(--hub-brand-tint);
|
|
1390
|
+
border: 1px solid var(--hub-brand-border-soft);
|
|
1391
|
+
border-radius: 6px;
|
|
1392
|
+
}
|
|
1393
|
+
|
|
1394
|
+
/* 信息网格:纵向堆叠的 label/value 行 */
|
|
1395
|
+
.detailGrid {
|
|
1396
|
+
display: flex;
|
|
1397
|
+
flex-direction: column;
|
|
1398
|
+
gap: 6px;
|
|
1399
|
+
}
|
|
1400
|
+
|
|
1401
|
+
.detailRow {
|
|
1402
|
+
display: flex;
|
|
1403
|
+
align-items: baseline;
|
|
1404
|
+
gap: 10px;
|
|
1405
|
+
font-size: 12px;
|
|
1406
|
+
line-height: 20px;
|
|
1407
|
+
min-width: 0;
|
|
1408
|
+
}
|
|
1409
|
+
|
|
1410
|
+
/* 标签:弱化、固定宽、右对齐文本,网格纵向对齐 */
|
|
1411
|
+
.detailLabel {
|
|
1412
|
+
flex-shrink: 0;
|
|
1413
|
+
width: 76px;
|
|
1414
|
+
text-align: right;
|
|
1415
|
+
color: var(--hub-text-tertiary);
|
|
1416
|
+
}
|
|
1417
|
+
|
|
1418
|
+
/* 值:可换行,主文字色;链接/路径等富内容横排 */
|
|
1419
|
+
.detailValue {
|
|
1420
|
+
flex: 1 1 auto;
|
|
1421
|
+
min-width: 0;
|
|
1422
|
+
display: flex;
|
|
1423
|
+
align-items: baseline;
|
|
1424
|
+
flex-wrap: wrap;
|
|
1425
|
+
gap: 4px 6px;
|
|
1426
|
+
font-weight: 500;
|
|
1427
|
+
color: var(--hub-text-primary);
|
|
1428
|
+
}
|
|
1429
|
+
|
|
1430
|
+
/* 版本号 / 包名等代码形态的值:等宽字体,与正文区分 */
|
|
1431
|
+
.detailMono {
|
|
1432
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
1433
|
+
font-size: 11px;
|
|
1434
|
+
font-weight: 500;
|
|
1435
|
+
}
|
|
1436
|
+
|
|
1437
|
+
/* 版本对比箭头:弱化展示在已装版本 → 目录最新之间 */
|
|
1438
|
+
.detailArrow {
|
|
1439
|
+
display: inline-flex;
|
|
1440
|
+
align-items: baseline;
|
|
1441
|
+
gap: 4px;
|
|
1442
|
+
color: var(--hub-text-tertiary);
|
|
1443
|
+
}
|
|
1444
|
+
|
|
1445
|
+
/* 弱化说明文字:紧跟主值后的小字(如「目录最新」「Fork 数」) */
|
|
1446
|
+
.detailDim {
|
|
1447
|
+
font-size: 11px;
|
|
1448
|
+
font-weight: 400;
|
|
1449
|
+
color: var(--hub-text-tertiary);
|
|
1450
|
+
}
|
|
1451
|
+
|
|
1452
|
+
/* 收录入口:品牌蓝链接 + 链节图标,hover 下划线(跳官网详情页或 GitHub 仓库) */
|
|
1453
|
+
.detailLink {
|
|
1454
|
+
min-width: 0;
|
|
1455
|
+
display: inline-flex;
|
|
1456
|
+
align-items: center;
|
|
1457
|
+
gap: 4px;
|
|
1458
|
+
font-weight: 500;
|
|
1459
|
+
color: var(--hub-brand);
|
|
1460
|
+
text-decoration: none;
|
|
1461
|
+
cursor: pointer;
|
|
1462
|
+
user-select: none;
|
|
1463
|
+
transition: color 120ms ease;
|
|
1464
|
+
}
|
|
1465
|
+
|
|
1466
|
+
.detailLink:hover {
|
|
1467
|
+
color: var(--hub-brand-hover);
|
|
1468
|
+
text-decoration: underline;
|
|
1469
|
+
}
|
|
1470
|
+
|
|
1471
|
+
/* Star 数:金色星标强调 */
|
|
1472
|
+
.detailStars {
|
|
1473
|
+
color: #b45309;
|
|
1474
|
+
font-weight: 600;
|
|
1475
|
+
}
|
|
1476
|
+
|
|
1477
|
+
/* 安装路径:等宽路径 + 右侧「复制 / 打开文件夹」图标按钮组;整条点击复制 */
|
|
1478
|
+
.detailPath {
|
|
1479
|
+
flex: 1 1 auto;
|
|
1480
|
+
min-width: 0;
|
|
1481
|
+
display: flex;
|
|
1482
|
+
align-items: center;
|
|
1483
|
+
justify-content: space-between;
|
|
1484
|
+
gap: 6px;
|
|
1485
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
1486
|
+
font-size: 11px;
|
|
1487
|
+
line-height: 18px;
|
|
1488
|
+
color: var(--hub-text-primary);
|
|
1489
|
+
background: var(--hub-bg-2);
|
|
1490
|
+
border: 1px solid var(--hub-border-2);
|
|
1491
|
+
border-radius: 6px;
|
|
1492
|
+
padding: 3px 3px 3px 8px;
|
|
1493
|
+
transition: border-color 120ms ease, background 120ms ease;
|
|
1494
|
+
}
|
|
1495
|
+
|
|
1496
|
+
.detailPath:hover {
|
|
1497
|
+
border-color: var(--hub-border-ghost);
|
|
1498
|
+
background: var(--hub-bg-3);
|
|
1499
|
+
}
|
|
1500
|
+
|
|
1501
|
+
.detailPathText {
|
|
1502
|
+
min-width: 0;
|
|
1503
|
+
overflow: hidden;
|
|
1504
|
+
text-overflow: ellipsis;
|
|
1505
|
+
white-space: nowrap;
|
|
1506
|
+
cursor: pointer;
|
|
1507
|
+
user-select: none;
|
|
1508
|
+
}
|
|
1509
|
+
|
|
1510
|
+
/* 路径行右侧操作组:复制 / 打开文件夹两个图标按钮 */
|
|
1511
|
+
.detailPathActions {
|
|
1512
|
+
flex-shrink: 0;
|
|
1513
|
+
display: inline-flex;
|
|
1514
|
+
align-items: center;
|
|
1515
|
+
gap: 4px;
|
|
1516
|
+
}
|
|
1517
|
+
|
|
1518
|
+
/* 路径行图标按钮:品牌蓝描边 + 浅蓝底,图标放大到 15px —— 小图标在深色路径
|
|
1519
|
+
条上辨识度不够(macOS 尤其明显),蓝色一加立即清晰可点 */
|
|
1520
|
+
.detailPathBtn {
|
|
1521
|
+
display: inline-flex;
|
|
1522
|
+
align-items: center;
|
|
1523
|
+
justify-content: center;
|
|
1524
|
+
width: 28px;
|
|
1525
|
+
height: 28px;
|
|
1526
|
+
color: var(--hub-brand);
|
|
1527
|
+
background: var(--hub-brand-tint);
|
|
1528
|
+
border: 1px solid var(--hub-brand-border-soft);
|
|
1529
|
+
border-radius: 6px;
|
|
1530
|
+
cursor: pointer;
|
|
1531
|
+
user-select: none;
|
|
1532
|
+
transition: color 120ms ease, background 120ms ease, border-color 120ms ease;
|
|
1533
|
+
}
|
|
1534
|
+
|
|
1535
|
+
.detailPathBtn svg {
|
|
1536
|
+
width: 15px;
|
|
1537
|
+
height: 15px;
|
|
1538
|
+
}
|
|
1539
|
+
|
|
1540
|
+
.detailPathBtn:hover {
|
|
1541
|
+
color: #ffffff;
|
|
1542
|
+
background: var(--hub-brand);
|
|
1543
|
+
border-color: var(--hub-brand);
|
|
1544
|
+
}
|
|
1545
|
+
|
|
1546
|
+
/* 安装状态点:绿 = 已加载进 loader(运行中);琥珀 = 已安装未挂载(装完未重启) */
|
|
1547
|
+
.detailStatusRunning,
|
|
1548
|
+
.detailStatusPending {
|
|
1549
|
+
flex-shrink: 0;
|
|
1550
|
+
width: 8px;
|
|
1551
|
+
height: 8px;
|
|
1552
|
+
border-radius: 50%;
|
|
1553
|
+
align-self: center;
|
|
1554
|
+
}
|
|
1555
|
+
|
|
1556
|
+
.detailStatusRunning {
|
|
1557
|
+
background: var(--hub-success);
|
|
1558
|
+
}
|
|
1559
|
+
|
|
1560
|
+
.detailStatusPending {
|
|
1561
|
+
background: var(--hub-warning);
|
|
1562
|
+
}
|
|
1563
|
+
|
|
1564
|
+
.detailStatusText {
|
|
1565
|
+
font-weight: 500;
|
|
1566
|
+
}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/* DSH-Plugin Hub — the community plugin marketplace for DeepSeek Harness.
|
|
2
|
+
* Website: https://dsh-plugin.org
|
|
3
|
+
* GitHub: https://github.com/dshplugin/dsh-plugin-hub
|
|
4
|
+
*
|
|
5
|
+
* Primary navigation (section tabs): an underline tab bar under the header
|
|
6
|
+
* switching between Market / Installed / Settings. The active tab carries a
|
|
7
|
+
* brand-colored underline; the bar itself draws a hairline bottom border so
|
|
8
|
+
* the selected state reads clearly without extra chrome. */
|
|
9
|
+
|
|
10
|
+
.root {
|
|
11
|
+
display: flex;
|
|
12
|
+
align-items: stretch;
|
|
13
|
+
gap: 28px;
|
|
14
|
+
flex-shrink: 0;
|
|
15
|
+
padding: 0 2px;
|
|
16
|
+
border-bottom: 1px solid var(--hub-border-1);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.tab,
|
|
20
|
+
.tabActive {
|
|
21
|
+
position: relative;
|
|
22
|
+
display: inline-flex;
|
|
23
|
+
align-items: center;
|
|
24
|
+
gap: 7px;
|
|
25
|
+
height: 38px;
|
|
26
|
+
padding: 0 4px;
|
|
27
|
+
border: none;
|
|
28
|
+
background: transparent;
|
|
29
|
+
font-size: 14px;
|
|
30
|
+
line-height: 38px;
|
|
31
|
+
cursor: pointer;
|
|
32
|
+
user-select: none;
|
|
33
|
+
transition: color 120ms ease;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.tab {
|
|
37
|
+
color: var(--hub-text-secondary);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.tab:hover {
|
|
41
|
+
color: var(--hub-text-primary);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.tabActive {
|
|
45
|
+
color: var(--hub-text-primary);
|
|
46
|
+
font-weight: 600;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/* tab 图标:16px 随字号等宽对齐,SVG 继承 currentColor 自动跟随选中/悬浮色 */
|
|
50
|
+
.tabIcon {
|
|
51
|
+
flex-shrink: 0;
|
|
52
|
+
display: inline-flex;
|
|
53
|
+
align-items: center;
|
|
54
|
+
line-height: 1;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/* 选中下划线:紧贴栏底边(覆盖 hairline 分隔线),品牌色 2px,一眼定位当前视图 */
|
|
58
|
+
.tabActive::after {
|
|
59
|
+
content: '';
|
|
60
|
+
position: absolute;
|
|
61
|
+
left: 0;
|
|
62
|
+
right: 0;
|
|
63
|
+
bottom: -1px;
|
|
64
|
+
height: 2px;
|
|
65
|
+
border-radius: 1px;
|
|
66
|
+
background: var(--hub-brand);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/* 计数徽标(已安装数量):浅灰胶囊;选中态跟随文字转深 */
|
|
70
|
+
.tabCount,
|
|
71
|
+
.tabCountActive {
|
|
72
|
+
font-size: 11px;
|
|
73
|
+
line-height: 16px;
|
|
74
|
+
border-radius: 999px;
|
|
75
|
+
padding: 0 6px;
|
|
76
|
+
min-width: 18px;
|
|
77
|
+
text-align: center;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.tabCount {
|
|
81
|
+
color: var(--hub-text-tertiary);
|
|
82
|
+
background: var(--hub-bg-btn);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
.tabActive .tabCountActive {
|
|
86
|
+
color: var(--hub-text-on-fill);
|
|
87
|
+
background: var(--hub-btn-fill);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/* —— 通知中心入口 —— */
|
|
91
|
+
|
|
92
|
+
/* 通知铃铛按钮:位于「设置」tab 后边、靠右对齐(margin-left:auto 吃掉 tab 剩余空间),
|
|
93
|
+
在 38px tab 栏里垂直居中;常态透明底只显铃铛轮廓,hover 浅灰,不抢 tab 视觉层级 */
|
|
94
|
+
.noticeBtn {
|
|
95
|
+
position: relative;
|
|
96
|
+
margin-left: auto;
|
|
97
|
+
align-self: center;
|
|
98
|
+
flex-shrink: 0;
|
|
99
|
+
box-sizing: border-box;
|
|
100
|
+
display: inline-flex;
|
|
101
|
+
align-items: center;
|
|
102
|
+
gap: 5px;
|
|
103
|
+
height: 26px;
|
|
104
|
+
padding: 0 8px;
|
|
105
|
+
border: 1px solid transparent;
|
|
106
|
+
border-radius: 6px;
|
|
107
|
+
font-size: 12px;
|
|
108
|
+
line-height: 24px;
|
|
109
|
+
color: var(--hub-text-secondary);
|
|
110
|
+
background: transparent;
|
|
111
|
+
cursor: pointer;
|
|
112
|
+
user-select: none;
|
|
113
|
+
transition: color 120ms ease, background 120ms ease;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
.noticeBtn:hover {
|
|
117
|
+
color: var(--hub-text-primary);
|
|
118
|
+
background: var(--hub-bg-hover);
|
|
119
|
+
border-color: var(--hub-border-2);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/* 铃铛图标容器:保持 SVG 与文字基线对齐 */
|
|
123
|
+
.noticeIcon {
|
|
124
|
+
display: inline-flex;
|
|
125
|
+
align-items: center;
|
|
126
|
+
line-height: 1;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/* 红底白字计数胶囊:内联跟在铃铛后边(不悬浮),只在计数 >0 时出现 */
|
|
130
|
+
.noticeCount {
|
|
131
|
+
min-width: 17px;
|
|
132
|
+
height: 17px;
|
|
133
|
+
padding: 0 5px;
|
|
134
|
+
border-radius: 999px;
|
|
135
|
+
font-size: 11px;
|
|
136
|
+
font-weight: 600;
|
|
137
|
+
line-height: 17px;
|
|
138
|
+
text-align: center;
|
|
139
|
+
color: #ffffff;
|
|
140
|
+
background: var(--hub-danger);
|
|
141
|
+
box-shadow: 0 1px 3px rgba(209, 36, 47, 0.35);
|
|
142
|
+
}
|