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
|
@@ -0,0 +1,447 @@
|
|
|
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
|
+
* Installed view: searchable, sortable list of installed plugins mixing
|
|
6
|
+
* catalog plugins (full metadata) and custom installs (runtime info only,
|
|
7
|
+
* amber custom badge). The toolbar holds a search box plus two segmented
|
|
8
|
+
* radio-button groups (source filter + sort). Each row has three tidy
|
|
9
|
+
* lines: title line (running-status dot + name + version/update badges +
|
|
10
|
+
* fixed action buttons on the right), meta line (repo · category), and a
|
|
11
|
+
* one-line description. Colors resolve through the --hub-* tokens. */
|
|
12
|
+
|
|
13
|
+
.root {
|
|
14
|
+
display: flex;
|
|
15
|
+
flex-direction: column;
|
|
16
|
+
gap: 8px;
|
|
17
|
+
min-width: 0;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/* —— 工具栏:「已安装插件」列表上方 ——
|
|
21
|
+
第一行搜索框(撑满整行),第二行来源筛选按钮组 + 排序按钮组;
|
|
22
|
+
hairline 与下方列表区隔 */
|
|
23
|
+
|
|
24
|
+
.toolbar {
|
|
25
|
+
display: flex;
|
|
26
|
+
flex-direction: column;
|
|
27
|
+
gap: 8px;
|
|
28
|
+
flex-shrink: 0;
|
|
29
|
+
padding: 0 2px 10px;
|
|
30
|
+
border-bottom: 1px solid var(--hub-border-1);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/* 搜索框容器:撑满整行宽度,与按钮组等视觉高度 */
|
|
34
|
+
.searchWrap {
|
|
35
|
+
width: 100%;
|
|
36
|
+
height: 28px;
|
|
37
|
+
min-width: 0;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/* 搜索输入:28px 与下拉触发器等高 */
|
|
41
|
+
.searchInput {
|
|
42
|
+
width: 100%;
|
|
43
|
+
height: 28px;
|
|
44
|
+
padding: 0 9px;
|
|
45
|
+
font-size: 12px;
|
|
46
|
+
line-height: 26px;
|
|
47
|
+
color: var(--hub-text-primary);
|
|
48
|
+
background: transparent;
|
|
49
|
+
border: 1px solid var(--hub-border-2);
|
|
50
|
+
border-radius: 6px;
|
|
51
|
+
outline: none;
|
|
52
|
+
transition: border-color 120ms ease;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
.searchInput::placeholder {
|
|
56
|
+
color: var(--hub-text-tertiary);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
.searchInput:focus {
|
|
60
|
+
border-color: var(--hub-brand);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/* —— 单选按钮组(segmented control):来源筛选 / 排序 ——
|
|
64
|
+
一组一个描边容器,按钮间竖线分隔,选中项品牌色实底 */
|
|
65
|
+
|
|
66
|
+
.segRow {
|
|
67
|
+
display: flex;
|
|
68
|
+
align-items: center;
|
|
69
|
+
gap: 8px;
|
|
70
|
+
min-width: 0;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/* 组前小标签:灰字,标注这组按钮的作用 */
|
|
74
|
+
.segLabel {
|
|
75
|
+
flex-shrink: 0;
|
|
76
|
+
font-size: 11px;
|
|
77
|
+
line-height: 16px;
|
|
78
|
+
color: var(--hub-text-tertiary);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.segGroup {
|
|
82
|
+
display: inline-flex;
|
|
83
|
+
align-items: center;
|
|
84
|
+
flex-shrink: 0;
|
|
85
|
+
border: 1px solid var(--hub-border-2);
|
|
86
|
+
border-radius: 6px;
|
|
87
|
+
overflow: hidden;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.segBtn {
|
|
91
|
+
font-family: inherit;
|
|
92
|
+
font-size: 12px;
|
|
93
|
+
line-height: 24px;
|
|
94
|
+
height: 24px;
|
|
95
|
+
padding: 0 10px;
|
|
96
|
+
display: inline-flex;
|
|
97
|
+
align-items: center;
|
|
98
|
+
justify-content: center;
|
|
99
|
+
gap: 4px;
|
|
100
|
+
color: var(--hub-text-secondary);
|
|
101
|
+
background: transparent;
|
|
102
|
+
border: none;
|
|
103
|
+
cursor: pointer;
|
|
104
|
+
user-select: none;
|
|
105
|
+
white-space: nowrap;
|
|
106
|
+
transition: color 120ms ease, background 120ms ease;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/* 激活排序按钮上的方向箭头:随文字色着色、不可被压缩 */
|
|
110
|
+
.segBtn svg {
|
|
111
|
+
flex-shrink: 0;
|
|
112
|
+
display: block;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
.segBtn + .segBtn {
|
|
116
|
+
border-left: 1px solid var(--hub-border-2);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.segBtn:hover {
|
|
120
|
+
color: var(--hub-text-primary);
|
|
121
|
+
background: var(--hub-bg-hover);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
.segBtnActive,
|
|
125
|
+
.segBtnActive:hover {
|
|
126
|
+
color: #fff;
|
|
127
|
+
background: var(--hub-brand);
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/* —— 空态 / 搜索无结果 —— */
|
|
131
|
+
|
|
132
|
+
.empty {
|
|
133
|
+
display: flex;
|
|
134
|
+
flex-direction: column;
|
|
135
|
+
align-items: center;
|
|
136
|
+
gap: 4px;
|
|
137
|
+
padding: 36px 12px;
|
|
138
|
+
font-size: 12px;
|
|
139
|
+
line-height: 18px;
|
|
140
|
+
color: var(--hub-text-tertiary);
|
|
141
|
+
text-align: center;
|
|
142
|
+
border: 1px dashed var(--hub-border-2);
|
|
143
|
+
border-radius: 8px;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
.emptyTitle {
|
|
147
|
+
font-size: 13px;
|
|
148
|
+
font-weight: 600;
|
|
149
|
+
color: var(--hub-text-secondary);
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
.emptyDesc {
|
|
153
|
+
color: var(--hub-text-tertiary);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/* —— 行列表 —— */
|
|
157
|
+
|
|
158
|
+
.list {
|
|
159
|
+
display: flex;
|
|
160
|
+
flex-direction: column;
|
|
161
|
+
list-style: none;
|
|
162
|
+
margin: 0;
|
|
163
|
+
padding: 0;
|
|
164
|
+
border: 1px solid var(--hub-border-1);
|
|
165
|
+
border-radius: 8px;
|
|
166
|
+
overflow: hidden;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
.row {
|
|
170
|
+
display: flex;
|
|
171
|
+
flex-direction: column;
|
|
172
|
+
gap: 4px;
|
|
173
|
+
padding: 8px 10px;
|
|
174
|
+
background: var(--hub-bg-1);
|
|
175
|
+
cursor: pointer;
|
|
176
|
+
user-select: none;
|
|
177
|
+
transition: background 120ms ease;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
.row + .row {
|
|
181
|
+
border-top: 1px solid var(--hub-border-1);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
.row:hover {
|
|
185
|
+
background: var(--hub-bg-2);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/* 第一行:状态点 + 名称/版本/更新徽标 + 右侧固定操作按钮组 */
|
|
189
|
+
.rowTitleLine {
|
|
190
|
+
display: flex;
|
|
191
|
+
align-items: center;
|
|
192
|
+
gap: 8px;
|
|
193
|
+
min-width: 0;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/* 第三行(仅目录插件):简介单独一行,超长省略号收尾;
|
|
197
|
+
左缩进对齐名称(8 状态点 + 8 间隔 = 16px) */
|
|
198
|
+
.rowDesc {
|
|
199
|
+
padding-left: 16px;
|
|
200
|
+
font-size: 11px;
|
|
201
|
+
line-height: 16px;
|
|
202
|
+
color: var(--hub-text-tertiary);
|
|
203
|
+
white-space: nowrap;
|
|
204
|
+
overflow: hidden;
|
|
205
|
+
text-overflow: ellipsis;
|
|
206
|
+
min-width: 0;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/* 运行状态点:绿 = 已加载进 loader(运行中);琥珀 = 已安装未挂载(装完未重启) */
|
|
210
|
+
.statusDot {
|
|
211
|
+
flex-shrink: 0;
|
|
212
|
+
width: 8px;
|
|
213
|
+
height: 8px;
|
|
214
|
+
border-radius: 50%;
|
|
215
|
+
background: var(--hub-success);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
.statusDot.statusPending {
|
|
219
|
+
background: var(--hub-warning);
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/* 非 dsh 插件(如官方示例项目):宿主不加载,灰色点表示「未启用」而非「待重启」 */
|
|
223
|
+
.statusDot.statusInactive {
|
|
224
|
+
background: var(--hub-text-tertiary);
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/* 主信息:名称 + 已装版本 + 有更新徽标 */
|
|
228
|
+
.rowMain {
|
|
229
|
+
display: flex;
|
|
230
|
+
align-items: baseline;
|
|
231
|
+
gap: 6px;
|
|
232
|
+
min-width: 0;
|
|
233
|
+
flex: 1 1 auto;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
.rowTitle {
|
|
237
|
+
font-size: 12px;
|
|
238
|
+
line-height: 18px;
|
|
239
|
+
font-weight: 600;
|
|
240
|
+
color: var(--hub-text-primary);
|
|
241
|
+
min-width: 0;
|
|
242
|
+
white-space: nowrap;
|
|
243
|
+
overflow: hidden;
|
|
244
|
+
text-overflow: ellipsis;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/* 已装版本:等宽弱化小字 */
|
|
248
|
+
.versionBadge {
|
|
249
|
+
flex-shrink: 0;
|
|
250
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
251
|
+
font-size: 11px;
|
|
252
|
+
line-height: 16px;
|
|
253
|
+
color: var(--hub-text-tertiary);
|
|
254
|
+
background: var(--hub-bg-hover);
|
|
255
|
+
border-radius: 4px;
|
|
256
|
+
padding: 0 5px;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/* 有更新徽标:品牌色实底小圆标 */
|
|
260
|
+
.updateBadge {
|
|
261
|
+
flex-shrink: 0;
|
|
262
|
+
font-size: 11px;
|
|
263
|
+
line-height: 16px;
|
|
264
|
+
font-weight: 500;
|
|
265
|
+
color: var(--hub-brand);
|
|
266
|
+
background: var(--hub-brand-tint-strong);
|
|
267
|
+
border-radius: 4px;
|
|
268
|
+
padding: 0 5px;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
/* 来源标签列(行尾、操作按钮前):固定宽度等宽,所有条目标签在同一列右对齐(整齐不乱)。
|
|
272
|
+
「插件中心」= 目录插件(品牌蓝描边),「手动安装」= 命令行安装(琥珀描边)。
|
|
273
|
+
两词等宽(各 4 字),宽度固定后标签列严格对齐 */
|
|
274
|
+
.rowSourceTag {
|
|
275
|
+
flex-shrink: 0;
|
|
276
|
+
width: 60px;
|
|
277
|
+
box-sizing: border-box;
|
|
278
|
+
text-align: center;
|
|
279
|
+
font-size: 11px;
|
|
280
|
+
line-height: 16px;
|
|
281
|
+
font-weight: 500;
|
|
282
|
+
border-radius: 4px;
|
|
283
|
+
padding: 0 4px;
|
|
284
|
+
white-space: nowrap;
|
|
285
|
+
overflow: hidden;
|
|
286
|
+
text-overflow: ellipsis;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
.rowSourceTagHub {
|
|
290
|
+
color: var(--hub-brand);
|
|
291
|
+
background: var(--hub-brand-tint);
|
|
292
|
+
border: 1px solid var(--hub-brand-border-soft);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
.rowSourceTagManual {
|
|
296
|
+
color: var(--hub-warning);
|
|
297
|
+
background: var(--hub-warning-tint);
|
|
298
|
+
border: 1px solid var(--hub-warning-border);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/* 示例项目徽标(非 dsh 插件,如官方示例仓库):品牌蓝描边 + 浅蓝底,
|
|
302
|
+
与「有更新」实底区分,表达「这是示例项目,宿主不加载」 */
|
|
303
|
+
.exampleBadge {
|
|
304
|
+
flex-shrink: 0;
|
|
305
|
+
font-size: 11px;
|
|
306
|
+
line-height: 16px;
|
|
307
|
+
font-weight: 500;
|
|
308
|
+
color: var(--hub-brand);
|
|
309
|
+
background: var(--hub-brand-tint);
|
|
310
|
+
border: 1px solid var(--hub-brand-border-soft);
|
|
311
|
+
border-radius: 4px;
|
|
312
|
+
padding: 0 5px;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/* 示例项目徽标行:独立一行,左缩进对齐名称(8 状态点 + 8 间隔 = 16px),
|
|
316
|
+
标签可完整显示不换行,不受名称行宽度挤压 */
|
|
317
|
+
.exampleRow {
|
|
318
|
+
display: flex;
|
|
319
|
+
align-items: center;
|
|
320
|
+
padding-left: 16px;
|
|
321
|
+
min-width: 0;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
/* 第二行元信息:仓库 · 分类 —— 独立成行,左缩进与名称对齐,不再挤压名称 */
|
|
325
|
+
.rowMeta {
|
|
326
|
+
display: flex;
|
|
327
|
+
align-items: center;
|
|
328
|
+
gap: 8px;
|
|
329
|
+
padding-left: 16px;
|
|
330
|
+
min-width: 0;
|
|
331
|
+
overflow: hidden;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
.rowRepo {
|
|
335
|
+
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
336
|
+
font-size: 11px;
|
|
337
|
+
line-height: 16px;
|
|
338
|
+
color: var(--hub-text-tertiary);
|
|
339
|
+
min-width: 0;
|
|
340
|
+
white-space: nowrap;
|
|
341
|
+
overflow: hidden;
|
|
342
|
+
text-overflow: ellipsis;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
.rowCategory {
|
|
346
|
+
flex-shrink: 0;
|
|
347
|
+
font-size: 11px;
|
|
348
|
+
line-height: 16px;
|
|
349
|
+
color: var(--hub-text-tertiary);
|
|
350
|
+
background: var(--hub-bg-hover);
|
|
351
|
+
border-radius: 4px;
|
|
352
|
+
padding: 0 6px;
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
/* —— 行操作:详情 / 更新 / 卸载 —— */
|
|
356
|
+
|
|
357
|
+
.rowActions {
|
|
358
|
+
display: flex;
|
|
359
|
+
align-items: center;
|
|
360
|
+
gap: 4px;
|
|
361
|
+
flex-shrink: 0;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/* 详情:中性细边框按钮,与卸载同款描边样式(视觉成组) */
|
|
365
|
+
.rowDetail {
|
|
366
|
+
font-family: inherit;
|
|
367
|
+
font-size: 12px;
|
|
368
|
+
line-height: 18px;
|
|
369
|
+
color: var(--hub-text-secondary);
|
|
370
|
+
background: transparent;
|
|
371
|
+
border: 1px solid var(--hub-border-2);
|
|
372
|
+
border-radius: 6px;
|
|
373
|
+
padding: 2px 10px;
|
|
374
|
+
cursor: pointer;
|
|
375
|
+
user-select: none;
|
|
376
|
+
transition: color 120ms ease, background 120ms ease, border-color 120ms ease;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
.rowDetail:hover {
|
|
380
|
+
color: var(--hub-text-primary);
|
|
381
|
+
border-color: var(--hub-border-ghost);
|
|
382
|
+
background: var(--hub-bg-hover);
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
/* 重启:琥珀警告色描边小按钮,仅在「待重启」时出现 —— 装完未挂载,点了宿主重启后即生效。
|
|
386
|
+
重启属于「提醒/待办」语义,用警告色而非品牌蓝,与状态点的琥珀点呼应 */
|
|
387
|
+
.rowRestart {
|
|
388
|
+
font-family: inherit;
|
|
389
|
+
font-size: 12px;
|
|
390
|
+
line-height: 18px;
|
|
391
|
+
font-weight: 500;
|
|
392
|
+
color: var(--hub-warning);
|
|
393
|
+
background: var(--hub-warning-tint);
|
|
394
|
+
border: 1px solid var(--hub-warning-border);
|
|
395
|
+
border-radius: 6px;
|
|
396
|
+
padding: 2px 10px;
|
|
397
|
+
cursor: pointer;
|
|
398
|
+
user-select: none;
|
|
399
|
+
transition: color 120ms ease, background 120ms ease, border-color 120ms ease;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
.rowRestart:hover {
|
|
403
|
+
color: #fff;
|
|
404
|
+
background: var(--hub-warning);
|
|
405
|
+
border-color: var(--hub-warning);
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
/* 更新:品牌色实底小按钮,仅在「有更新」时出现 */
|
|
409
|
+
.rowUpdate {
|
|
410
|
+
font-family: inherit;
|
|
411
|
+
font-size: 12px;
|
|
412
|
+
line-height: 18px;
|
|
413
|
+
font-weight: 500;
|
|
414
|
+
color: #fff;
|
|
415
|
+
background: var(--hub-brand);
|
|
416
|
+
border: none;
|
|
417
|
+
border-radius: 6px;
|
|
418
|
+
padding: 3px 10px;
|
|
419
|
+
cursor: pointer;
|
|
420
|
+
user-select: none;
|
|
421
|
+
transition: background 120ms ease;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
.rowUpdate:hover {
|
|
425
|
+
background: var(--hub-brand-hover);
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
/* 卸载:危险色描边小按钮 */
|
|
429
|
+
.rowUninstall {
|
|
430
|
+
font-family: inherit;
|
|
431
|
+
font-size: 12px;
|
|
432
|
+
line-height: 18px;
|
|
433
|
+
color: var(--hub-danger);
|
|
434
|
+
background: transparent;
|
|
435
|
+
border: 1px solid var(--hub-danger-border-soft);
|
|
436
|
+
border-radius: 6px;
|
|
437
|
+
padding: 2px 10px;
|
|
438
|
+
cursor: pointer;
|
|
439
|
+
user-select: none;
|
|
440
|
+
transition: color 120ms ease, background 120ms ease, border-color 120ms ease;
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
.rowUninstall:hover {
|
|
444
|
+
color: #fff;
|
|
445
|
+
background: var(--hub-danger);
|
|
446
|
+
border-color: var(--hub-danger);
|
|
447
|
+
}
|
|
@@ -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 catalog list: the scrollable body, plugin cards (name, badges,
|
|
2
6
|
* description, topics, stats, actions), loading / empty states and the
|
|
3
7
|
* browse-all footer. Colors resolve through the --hub-* design tokens. */
|
|
4
8
|
|
|
@@ -19,6 +23,12 @@
|
|
|
19
23
|
padding: 2px 4px 4px 2px;
|
|
20
24
|
}
|
|
21
25
|
|
|
26
|
+
/* 滚动加载哨兵:透明 1px 元素,进入视口即触发下一批渲染(无可见外观,不占排版空间) */
|
|
27
|
+
.moreSentinel {
|
|
28
|
+
flex-shrink: 0;
|
|
29
|
+
height: 1px;
|
|
30
|
+
}
|
|
31
|
+
|
|
22
32
|
.card {
|
|
23
33
|
display: flex;
|
|
24
34
|
align-items: stretch;
|