dsh-plugin 0.1.1 → 1.0.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 (64) hide show
  1. package/README.en.md +49 -26
  2. package/README.md +49 -26
  3. package/client/client.js +2148 -229
  4. package/client/client.js.map +1 -1
  5. package/lib/http/routes.js +396 -0
  6. package/lib/index.js +17 -8
  7. package/lib/services/install-types.js +11 -0
  8. package/lib/services/install.js +4 -0
  9. package/lib/services/installed-versions.js +51 -0
  10. package/lib/services/loader.js +98 -0
  11. package/lib/services/pending-restart.js +34 -0
  12. package/lib/services/preflight.js +94 -0
  13. package/lib/services/profile.js +88 -0
  14. package/lib/services/progress.js +50 -0
  15. package/lib/services/task-queue.js +417 -0
  16. package/lib/types/http/routes.d.ts +23 -0
  17. package/lib/types/index.d.ts +27 -0
  18. package/lib/types/services/install-types.d.ts +63 -0
  19. package/lib/types/services/install.d.ts +18 -0
  20. package/lib/types/services/installed-versions.d.ts +14 -0
  21. package/lib/types/services/loader.d.ts +43 -0
  22. package/lib/types/services/pending-restart.d.ts +13 -0
  23. package/lib/types/services/preflight.d.ts +6 -0
  24. package/lib/types/services/profile.d.ts +24 -0
  25. package/lib/types/services/progress.d.ts +17 -0
  26. package/lib/types/services/task-queue.d.ts +76 -0
  27. package/package.json +27 -6
  28. package/src/client/components/CatalogControls.tsx +104 -0
  29. package/src/client/components/CatalogHeader.tsx +78 -0
  30. package/src/client/components/CatalogList.tsx +75 -0
  31. package/src/client/components/CategoryTabs.tsx +35 -0
  32. package/src/client/components/Dropdown.tsx +80 -0
  33. package/src/client/components/NotificationsModal.tsx +230 -0
  34. package/src/client/components/PluginCard.tsx +104 -0
  35. package/src/client/components/PluginHubSection.tsx +339 -0
  36. package/src/client/components/ProgressView.tsx +23 -0
  37. package/src/client/components/icons.tsx +125 -0
  38. package/src/client/components/modals.tsx +365 -0
  39. package/src/client/hooks/useCatalog.ts +192 -0
  40. package/src/client/hooks/useTaskQueue.ts +405 -0
  41. package/src/client/index.tsx +8 -422
  42. package/src/client/lib/catalog.ts +204 -0
  43. package/src/client/lib/env.ts +16 -0
  44. package/src/client/lib/failures.ts +153 -0
  45. package/src/client/lib/format.ts +22 -0
  46. package/src/client/locales.ts +186 -18
  47. package/src/client/styles/Dropdown.module.css +123 -0
  48. package/src/client/styles/Header.module.css +432 -0
  49. package/src/client/styles/List.module.css +324 -0
  50. package/src/client/styles/Modal.module.css +965 -0
  51. package/src/client/styles/tokens.module.css +86 -0
  52. package/src/client/types.ts +80 -0
  53. package/src/server/http/routes.ts +397 -0
  54. package/src/server/index.ts +35 -0
  55. package/src/server/services/install-types.ts +63 -0
  56. package/src/server/services/install.ts +18 -0
  57. package/src/server/services/installed-versions.ts +65 -0
  58. package/src/server/services/loader.ts +110 -0
  59. package/src/server/services/pending-restart.ts +36 -0
  60. package/src/server/services/preflight.ts +97 -0
  61. package/src/server/services/profile.ts +89 -0
  62. package/src/server/services/progress.ts +48 -0
  63. package/src/server/services/task-queue.ts +450 -0
  64. package/src/client/Section.module.css +0 -589
@@ -0,0 +1,324 @@
1
+ /* Plugin Hub catalog list: the scrollable body, plugin cards (name, badges,
2
+ * description, topics, stats, actions), loading / empty states and the
3
+ * browse-all footer. Colors resolve through the --hub-* design tokens. */
4
+
5
+ .body {
6
+ flex: 1;
7
+ min-height: 0;
8
+ display: flex;
9
+ flex-direction: column;
10
+ }
11
+
12
+ .list {
13
+ flex: 1;
14
+ min-height: 0;
15
+ overflow-y: auto;
16
+ display: flex;
17
+ flex-direction: column;
18
+ gap: 6px;
19
+ padding: 2px 4px 4px 2px;
20
+ }
21
+
22
+ .card {
23
+ display: flex;
24
+ align-items: stretch;
25
+ justify-content: space-between;
26
+ gap: 12px;
27
+ border: 1px solid var(--hub-border-2);
28
+ border-radius: 8px;
29
+ padding: 9px 12px;
30
+ background: var(--hub-bg-1);
31
+ transition: border-color 120ms ease, background 120ms ease;
32
+ }
33
+
34
+ .card:hover {
35
+ border-color: var(--hub-brand);
36
+ background: var(--hub-bg-2);
37
+ }
38
+
39
+ .cardMain {
40
+ min-width: 0;
41
+ display: flex;
42
+ flex-direction: column;
43
+ gap: 4px;
44
+ }
45
+
46
+ .cardHead {
47
+ display: flex;
48
+ align-items: center;
49
+ gap: 6px;
50
+ min-width: 0;
51
+ }
52
+
53
+ .cardTitle {
54
+ font-size: 13px;
55
+ line-height: 18px;
56
+ font-weight: 600;
57
+ white-space: nowrap;
58
+ overflow: hidden;
59
+ text-overflow: ellipsis;
60
+ }
61
+
62
+ .categoryBadge,
63
+ .verified,
64
+ .versionBadge,
65
+ .updateBadge {
66
+ flex-shrink: 0;
67
+ font-size: 10px;
68
+ line-height: 16px;
69
+ border-radius: 4px;
70
+ padding: 0 6px;
71
+ border: 1px solid transparent;
72
+ }
73
+
74
+ .categoryBadge {
75
+ color: var(--hub-brand);
76
+ border-color: var(--hub-border-ghost);
77
+ }
78
+
79
+ .verified {
80
+ color: var(--hub-success);
81
+ border-color: var(--hub-success-border);
82
+ }
83
+
84
+ /* 版本号徽标:中性灰,紧凑展示已发布版本(有 release 的仓库) */
85
+ .versionBadge {
86
+ color: var(--hub-text-secondary);
87
+ border-color: var(--hub-border-input);
88
+ }
89
+
90
+ /* 有更新徽标:警示色(与 star 的琥珀同族),已安装且有新版本/新提交时醒目提示 */
91
+ .updateBadge {
92
+ color: var(--hub-warn);
93
+ border-color: var(--hub-warn-border);
94
+ background: var(--hub-warn-tint);
95
+ }
96
+
97
+ .desc {
98
+ font-size: 12px;
99
+ line-height: 18px;
100
+ color: var(--hub-text-secondary);
101
+ margin: 0;
102
+ display: -webkit-box;
103
+ -webkit-line-clamp: 2;
104
+ -webkit-box-orient: vertical;
105
+ overflow: hidden;
106
+ }
107
+
108
+ .topics {
109
+ display: flex;
110
+ align-items: center;
111
+ gap: 4px;
112
+ flex-wrap: wrap;
113
+ min-width: 0;
114
+ }
115
+
116
+ .topic {
117
+ flex-shrink: 0;
118
+ font-size: 10px;
119
+ line-height: 16px;
120
+ color: var(--hub-text-tertiary);
121
+ background: var(--hub-bg-3);
122
+ border-radius: 4px;
123
+ padding: 0 6px;
124
+ white-space: nowrap;
125
+ }
126
+
127
+ .cardSide {
128
+ flex-shrink: 0;
129
+ display: flex;
130
+ flex-direction: column;
131
+ align-items: flex-end;
132
+ justify-content: space-between;
133
+ gap: 6px;
134
+ }
135
+
136
+ .stats {
137
+ display: flex;
138
+ flex-direction: column;
139
+ align-items: flex-end;
140
+ gap: 1px;
141
+ }
142
+
143
+ .star {
144
+ font-size: 11px;
145
+ line-height: 16px;
146
+ color: var(--hub-warn);
147
+ white-space: nowrap;
148
+ }
149
+
150
+ .fork {
151
+ font-size: 11px;
152
+ line-height: 16px;
153
+ color: var(--hub-text-tertiary);
154
+ white-space: nowrap;
155
+ }
156
+
157
+ .date {
158
+ font-size: 10px;
159
+ line-height: 14px;
160
+ color: var(--hub-text-tertiary);
161
+ white-space: nowrap;
162
+ }
163
+
164
+ .installBtn,
165
+ .installBtnCopied,
166
+ .installBtnInstalled,
167
+ .installBtnUpdate,
168
+ .uninstallBtn,
169
+ .detailBtn {
170
+ font-size: 11px;
171
+ line-height: 18px;
172
+ border-radius: 6px;
173
+ padding: 2px 10px;
174
+ cursor: pointer;
175
+ transition: color 120ms ease, border-color 120ms ease, background 120ms ease;
176
+ }
177
+
178
+ /* 已安装态:绿色禁用按钮,明确表达"已安装",不可再次点击安装 */
179
+ .installBtnInstalled {
180
+ color: var(--hub-success);
181
+ background: var(--hub-success-tint);
182
+ border: none;
183
+ cursor: default;
184
+ user-select: none;
185
+ }
186
+
187
+ /* 可更新:琥珀警示色实底按钮(与 star / 有更新徽标同族),点击直接覆盖安装更新 */
188
+ .installBtnUpdate {
189
+ color: #fff;
190
+ background: var(--hub-warn);
191
+ border: none;
192
+ font-weight: 500;
193
+ user-select: none;
194
+ }
195
+
196
+ .installBtnUpdate:hover {
197
+ background: var(--hub-warn-strong);
198
+ }
199
+
200
+ /* 卸载:危险色文字按钮,默认无底,悬浮转鲜红实底白字 */
201
+ .uninstallBtn {
202
+ color: var(--hub-danger);
203
+ background: transparent;
204
+ border: none;
205
+ user-select: none;
206
+ }
207
+
208
+ .uninstallBtn:hover {
209
+ color: #ffffff;
210
+ background: var(--hub-danger);
211
+ }
212
+
213
+ .installBtn {
214
+ color: var(--hub-text-on-fill);
215
+ background: var(--hub-btn-fill);
216
+ border: none;
217
+ font-weight: 500;
218
+ user-select: none;
219
+ }
220
+
221
+ .installBtn:hover {
222
+ background: var(--hub-btn-hover);
223
+ }
224
+
225
+ /* 查看详情:次级文字按钮(安装为主 CTA,详情为辅助入口),无默认底、悬浮加深 */
226
+ .detailBtn {
227
+ color: var(--hub-text-secondary);
228
+ background: transparent;
229
+ border: none;
230
+ text-decoration: none;
231
+ display: inline-flex;
232
+ align-items: center;
233
+ user-select: none;
234
+ }
235
+
236
+ .detailBtn:hover {
237
+ color: var(--hub-text-primary);
238
+ background: var(--hub-bg-hover);
239
+ }
240
+
241
+ .actions {
242
+ display: flex;
243
+ align-items: center;
244
+ gap: 6px;
245
+ }
246
+
247
+ /* 复制成功态:成功绿字 + 淡绿底,避免亮色下黑色实心块、暗色下白色实心块
248
+ 的强对比,两种主题下都清晰醒目,且明确表达"已复制"语义。 */
249
+ .installBtnCopied {
250
+ color: var(--hub-success);
251
+ background: var(--hub-success-tint);
252
+ border: none;
253
+ user-select: none;
254
+ }
255
+
256
+ /* —— states —— */
257
+
258
+ .state {
259
+ flex: 1;
260
+ min-height: 160px;
261
+ display: flex;
262
+ flex-direction: column;
263
+ align-items: center;
264
+ justify-content: center;
265
+ gap: 8px;
266
+ padding: 24px;
267
+ text-align: center;
268
+ font-size: 12px;
269
+ line-height: 18px;
270
+ color: var(--hub-text-tertiary);
271
+ }
272
+
273
+ .stateTitle {
274
+ font-size: 13px;
275
+ font-weight: 600;
276
+ color: var(--hub-text-primary);
277
+ }
278
+
279
+ .stateDesc {
280
+ max-width: 420px;
281
+ }
282
+
283
+ .retryBtn {
284
+ margin-top: 4px;
285
+ font-size: 12px;
286
+ line-height: 18px;
287
+ color: var(--hub-text-secondary);
288
+ border: none;
289
+ border-radius: 6px;
290
+ padding: 4px 12px;
291
+ background: transparent;
292
+ cursor: pointer;
293
+ user-select: none;
294
+ }
295
+
296
+ .retryBtn:hover {
297
+ color: var(--hub-text-primary);
298
+ background: var(--hub-bg-hover);
299
+ }
300
+
301
+ /* —— footer —— */
302
+
303
+ .footer {
304
+ flex-shrink: 0;
305
+ display: flex;
306
+ align-items: center;
307
+ justify-content: flex-end;
308
+ gap: 8px;
309
+ padding: 6px 4px 0;
310
+ border-top: 1px solid var(--hub-border-1);
311
+ }
312
+
313
+ .footLink {
314
+ font-size: 11px;
315
+ line-height: 16px;
316
+ color: var(--hub-brand);
317
+ text-decoration: none;
318
+ white-space: nowrap;
319
+ user-select: none;
320
+ }
321
+
322
+ .footLink:hover {
323
+ text-decoration: underline;
324
+ }