dsh-plugin 0.1.1 → 1.1.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 (67) hide show
  1. package/README.en.md +56 -28
  2. package/README.md +56 -28
  3. package/client/client.js +2282 -230
  4. package/client/client.js.map +1 -1
  5. package/lib/http/routes.js +432 -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 +66 -0
  10. package/lib/services/loader.js +98 -0
  11. package/lib/services/npm-resolve.js +67 -0
  12. package/lib/services/pending-restart.js +34 -0
  13. package/lib/services/preflight.js +94 -0
  14. package/lib/services/profile.js +88 -0
  15. package/lib/services/progress.js +50 -0
  16. package/lib/services/task-queue.js +457 -0
  17. package/lib/types/http/routes.d.ts +23 -0
  18. package/lib/types/index.d.ts +27 -0
  19. package/lib/types/services/install-types.d.ts +69 -0
  20. package/lib/types/services/install.d.ts +18 -0
  21. package/lib/types/services/installed-versions.d.ts +24 -0
  22. package/lib/types/services/loader.d.ts +43 -0
  23. package/lib/types/services/npm-resolve.d.ts +6 -0
  24. package/lib/types/services/pending-restart.d.ts +13 -0
  25. package/lib/types/services/preflight.d.ts +6 -0
  26. package/lib/types/services/profile.d.ts +24 -0
  27. package/lib/types/services/progress.d.ts +17 -0
  28. package/lib/types/services/task-queue.d.ts +82 -0
  29. package/package.json +27 -6
  30. package/src/client/components/CatalogControls.tsx +104 -0
  31. package/src/client/components/CatalogHeader.tsx +78 -0
  32. package/src/client/components/CatalogList.tsx +75 -0
  33. package/src/client/components/CategoryTabs.tsx +35 -0
  34. package/src/client/components/Dropdown.tsx +80 -0
  35. package/src/client/components/NotificationsModal.tsx +243 -0
  36. package/src/client/components/PluginCard.tsx +104 -0
  37. package/src/client/components/PluginHubSection.tsx +342 -0
  38. package/src/client/components/ProgressView.tsx +23 -0
  39. package/src/client/components/icons.tsx +125 -0
  40. package/src/client/components/modals.tsx +368 -0
  41. package/src/client/hooks/useCatalog.ts +202 -0
  42. package/src/client/hooks/useTaskQueue.ts +502 -0
  43. package/src/client/index.tsx +8 -422
  44. package/src/client/lib/catalog.ts +240 -0
  45. package/src/client/lib/env.ts +16 -0
  46. package/src/client/lib/failures.ts +165 -0
  47. package/src/client/lib/format.ts +22 -0
  48. package/src/client/locales.ts +188 -18
  49. package/src/client/styles/Dropdown.module.css +123 -0
  50. package/src/client/styles/Header.module.css +432 -0
  51. package/src/client/styles/List.module.css +324 -0
  52. package/src/client/styles/Modal.module.css +1006 -0
  53. package/src/client/styles/tokens.module.css +91 -0
  54. package/src/client/types.ts +80 -0
  55. package/src/server/http/routes.ts +432 -0
  56. package/src/server/index.ts +35 -0
  57. package/src/server/services/install-types.ts +69 -0
  58. package/src/server/services/install.ts +18 -0
  59. package/src/server/services/installed-versions.ts +84 -0
  60. package/src/server/services/loader.ts +110 -0
  61. package/src/server/services/npm-resolve.ts +67 -0
  62. package/src/server/services/pending-restart.ts +36 -0
  63. package/src/server/services/preflight.ts +97 -0
  64. package/src/server/services/profile.ts +89 -0
  65. package/src/server/services/progress.ts +48 -0
  66. package/src/server/services/task-queue.ts +492 -0
  67. package/src/client/Section.module.css +0 -589
@@ -1,27 +1,107 @@
1
1
  /** zh/en dictionaries for the DSH-Plugin Hub settings section. */
2
2
  export const zh = {
3
3
  nav: '插件中心',
4
- title: 'DSH-Plugin Hub for DeepSeek Harness',
4
+ title: 'DSH-Plugin Hub',
5
5
  // 收录/精选数量由组件从官网 /api/stats.json 实时拉取填充({total}/{verified}),不写死
6
- tagline: 'DSH plugin 插件中心:收录 {total} 个 DeepSeek Harness 插件,人工精选验证 {verified},每日更新 · 免费安装',
6
+ tagline: 'DSH-Plugin 插件中心:面向 DeepSeek Harness 插件收录平台,人工审验、来源可溯,免费安装',
7
7
  adBadge: '推荐',
8
- ad: 'DSH-Plugin 插件中心:收录 {total} 个 DeepSeek Harness 插件,其中 {verified} 人工精选验证,每日更新,免费按分类浏览、搜索、下载与安装,人工验证、来源可溯',
8
+ // 紫色广告横幅:突出数量(显眼)+ 更新节奏,与 tagline 职责分开、不重复
9
+ ad: 'DSH-Plugin 插件中心:收录 {total} 款插件,{verified} 款人工精选验证,每日更新',
9
10
  search: '搜索插件名称、描述、标签…',
10
11
  all: '全部',
11
12
  sortStars: 'Star 最多',
13
+ sortForks: 'Fork 最多',
12
14
  sortUpdated: '最近更新',
13
15
  sortNewest: '最新收录',
14
- open: '在浏览器中打开',
15
16
  openHint: '打开 dsh-plugin.org',
16
- openBtn: 'DSH-Plugin 官网',
17
- toEn: 'Switch to English',
17
+ toggleLangHint: '切换界面语言',
18
18
  fork: 'Fork',
19
19
  loading: '正在加载插件数据…',
20
20
  failed: '插件数据加载失败',
21
21
  failedDesc: '请稍后重试,或点击右上角按钮在浏览器中打开插件中心。',
22
22
  retry: '重试',
23
- copy: '复制安装命令',
23
+ install: '安装',
24
24
  toastCopied: '安装命令已复制,去 dsh 终端粘贴即可安装',
25
+ installed: '已安装',
26
+ notInstalled: '未安装',
27
+ filterAllHint: '显示全部插件',
28
+ filterInstalledHint: '筛选当前分类下的已安装插件',
29
+ filterNotInstalledHint: '筛选当前分类下的未安装插件',
30
+ filterInstalledNone: '当前分类下没有已安装插件',
31
+ filterNotInstalledNone: '当前分类下没有未安装插件',
32
+ uninstall: '卸载',
33
+ uninstalling: '卸载中…',
34
+ uninstallTitle: '确认卸载',
35
+ uninstallDesc: '将从当前环境卸载该插件。',
36
+ uninstallDone: '卸载成功',
37
+ uninstallFail: '卸载失败,请稍后重试',
38
+ uninstallResultTitle: '卸载完成',
39
+ uninstallResultDesc: '插件已从当前环境移除。',
40
+ confirmTitle: '确认安装',
41
+ confirmDesc: '安装前请前往插件仓库仔细阅读源码,确认可信后再安装',
42
+ confirmPlugin: '插件',
43
+ confirmSource: '来源',
44
+ confirmCommand: '安装命令',
45
+ copyInstallCommand: '复制安装命令',
46
+ copyCmdLabel: '复制',
47
+ copyUninstallCommand: '复制卸载命令',
48
+ installNow: '直接安装',
49
+ installing: '安装中…',
50
+ installDone: '安装成功',
51
+ installResultTitle: '插件安装成功',
52
+ installResultDesc: '',
53
+ // 更新语义:已安装插件点「更新」走同一条 add 命令原位覆盖重装,弹窗文案区分安装/更新
54
+ confirmUpdateTitle: '确认更新',
55
+ updateNow: '直接更新',
56
+ updating: '更新中…',
57
+ queuedUpdateTitle: '已加入更新排队',
58
+ updateResultTitle: '更新完成',
59
+ updateResultDesc: '插件已更新到最新版本。',
60
+ installFail: '安装失败',
61
+ confirmCancel: '取消',
62
+ doneBtn: '完成',
63
+ // 结果视图:部分插件需重启后才挂载,提供「立即重启 / 稍后重启」选择
64
+ restartNow: '立即重启',
65
+ restartLater: '稍后重启',
66
+ restarting: '正在重启…',
67
+ restartHint: '部分插件(如插件市场、顶层 bundle)需重启后才会生效。',
68
+ // 待重启:装完没重启的插件常驻提醒,直到宿主真正重启
69
+ restartPendingHint: '安装成功,重启后生效',
70
+ restartPendingHintUninstall: '卸载成功,重启后移除',
71
+ sectionPendingRestart: '待重启',
72
+ sectionInProgress: '进行中',
73
+ // 串行队列:安装/卸载弹窗内可后台关闭,排队任务自动串行执行
74
+ queuedTitle: '已加入安装排队',
75
+ queuedUninstallTitle: '已加入卸载排队',
76
+ queuedHint: '已加入排队,前序任务完成后将自动开始,可关闭本窗口继续浏览。',
77
+ cancelTask: '取消任务',
78
+ cancelling: '正在取消…',
79
+ errorTitle: '操作失败',
80
+ errorTitleInstall: '安装失败',
81
+ errorTitleUninstall: '卸载失败',
82
+ errorPlugin: '插件',
83
+ errorClose: '知道了',
84
+ errorCopy: '复制错误信息',
85
+ errCopied: '错误信息已复制',
86
+ // 任务通知中心:安装/卸载的成败自动落盘,随时可回来查看
87
+ notifications: '通知',
88
+ // 通知入口按钮文字:工具栏空间有限,与弹窗标题(notifications)区分,短文案不截断
89
+ notificationsBtn: '通知',
90
+ notificationsHint: '查看安装/卸载通知(含失败记录)',
91
+ notificationsDesc: '安装、卸载任务的成败都会记录在这里,即使错过提示也能随时回来查看。',
92
+ notificationsEmpty: '暂无通知记录',
93
+ notificationsClear: '清空通知',
94
+ removeNotification: '删除这条通知',
95
+ failCopy: '复制完整错误信息',
96
+ failIssueHint: '带着错误日志去作者仓库一键提交 Issue(正文含官网收录链接)',
97
+ failIssueBig: '一键提交 BUG 到 GitHub Issue 为开源作贡献',
98
+ // prepare 构建脚本实际执行失败(git 分发缺子模块/构建产物):插件打包分发问题,应提 Issue
99
+ failPrepareHint: '该插件安装时的构建脚本执行失败(git 分发常缺失子模块或构建产物),属插件打包分发问题。请向作者仓库提交 Issue 反馈。',
100
+ // 安装前预检 / 装后校验拦截([packaging]):git 分发缺构建产物、入口文件不存在 = 插件未适配官方默认安装方式
101
+ failPackagingHint: '该插件不支持官方默认安装方式:其 git 分发缺少构建产物(package.json 声明的入口文件在仓库中不存在),说明作者未适配官方安装流程。请到作者仓库提交 Issue 反馈,请其提交构建产物或发布 npm 版。',
102
+ // 原生依赖构建脚本被 pnpm 默认拦截(如 node-pty 的 ERR_PNPM_IGNORED_BUILDS):只影响带原生模块的插件,属插件依赖打包问题,应提 Issue
103
+ failIgnoredBuild: '该插件依赖了需要编译的原生模块(如 node-pty),pnpm 默认拦截这类构建脚本导致安装失败 —— 其他插件不受影响,属该插件的依赖/打包问题。建议向作者仓库一键反馈,请作者改用预编译版本(如 node-pty-prebuilt-multiarch)。',
104
+ reportIssue: '去插件仓库提交 Issue',
25
105
  detail: '打开详情',
26
106
  noResult: '没有找到匹配的插件',
27
107
  noResultDesc: '换个关键词试试,或前往网站浏览全部插件。',
@@ -29,38 +109,122 @@ export const zh = {
29
109
  daysAgo: '更新于 {days} 天前',
30
110
  monthsAgo: '更新于 {months} 个月前',
31
111
  yearsAgo: '更新于 {years} 年前',
32
- pluginsTotal: '共 {n} 个插件',
33
- filteredCount: '匹配 {n} 个',
112
+ pluginsTotal: '结果 {n} 条插件',
113
+ // 分类按钮不带数量,选中分类后在列表头部显示筛选结果数
114
+ filterResults: '结果 {n} 条插件',
34
115
  more: '还有 {n} 个插件,去网站查看全部',
35
116
  browseAll: '浏览全部 {n} 个插件',
36
117
  verified: '已验证',
118
+ // 版本与更新:有 release 比版本号;无 release 的仓库比仓库最近更新时间(有新提交即提示更新)
119
+ version: '版本',
120
+ update: '可更新',
121
+ updateAvailable: '有更新',
122
+ updateAvailableHint: '检测到更新:有版本号的仓库比对版本号,无版本号的仓库比对仓库最近更新时间',
37
123
  empty: '该分类暂无插件',
38
124
  dataFrom: '数据源 dsh-plugin.org · 每日人工更新',
39
125
  }
40
126
 
41
127
  export const en = {
42
128
  nav: 'Plugin Hub',
43
- title: 'DSH-Plugin Hub for DeepSeek Harness',
129
+ title: 'DSH-Plugin Hub',
44
130
  // Plugin counts are filled from the live /api/stats.json ({total}/{verified}), never hardcoded
45
- tagline: 'DSH plugin marketplace · {total} DeepSeek Harness plugins indexed · {verified} human-verified · updated daily · free to install',
131
+ tagline: 'DSH-Plugin Hub: a human-verified, free marketplace for DeepSeek Harness plugins',
46
132
  adBadge: 'Featured',
47
- ad: 'DSH-Plugin Hub: {total} DeepSeek Harness plugins indexed, {verified} of which are human-verified. Updated daily — browse, search & install for free.',
133
+ ad: 'DSH-Plugin Hub: {total} plugins indexed, {verified} human-verified, updated daily',
48
134
  search: 'Search plugins by name, description, tags…',
49
135
  all: 'All',
50
136
  sortStars: 'Most stars',
137
+ sortForks: 'Most forks',
51
138
  sortUpdated: 'Recently updated',
52
139
  sortNewest: 'Newest added',
53
- open: 'Open in browser',
54
140
  openHint: 'Open dsh-plugin.org',
55
- openBtn: 'dsh-plugin.org',
56
- toZh: 'Switch to Chinese',
141
+ toggleLangHint: 'Switch language',
142
+ githubHint: 'View source on GitHub',
57
143
  fork: 'Fork',
58
144
  loading: 'Loading plugin data…',
59
145
  failed: 'Failed to load plugin data',
60
146
  failedDesc: 'Please retry, or open the hub in your browser with the button above.',
61
147
  retry: 'Retry',
62
- copy: 'Copy install command',
148
+ install: 'Install',
63
149
  toastCopied: 'Install command copied — paste it in your dsh terminal',
150
+ installed: 'Installed',
151
+ notInstalled: 'Not installed',
152
+ filterAllHint: 'Show all plugins',
153
+ filterInstalledHint: 'Filter to installed plugins in this category',
154
+ filterNotInstalledHint: 'Filter to uninstalled plugins in this category',
155
+ filterInstalledNone: 'No installed plugins in this category',
156
+ filterNotInstalledNone: 'No uninstalled plugins in this category',
157
+ uninstall: 'Uninstall',
158
+ uninstalling: 'Removing…',
159
+ uninstallTitle: 'Confirm uninstall',
160
+ uninstallDesc: 'The plugin will be removed from this environment.',
161
+ uninstallDone: 'Uninstalled',
162
+ uninstallFail: 'Removal failed — try again',
163
+ uninstallResultTitle: 'Removed',
164
+ uninstallResultDesc: 'The plugin has been removed from this environment.',
165
+ confirmTitle: 'Confirm install',
166
+ confirmDesc: 'Review the plugin repository source code carefully before installing.',
167
+ confirmPlugin: 'Plugin',
168
+ confirmSource: 'Source',
169
+ confirmCommand: 'Command',
170
+ copyInstallCommand: 'Copy install command',
171
+ copyCmdLabel: 'Copy',
172
+ copyUninstallCommand: 'Copy uninstall command',
173
+ installNow: 'Install',
174
+ installing: 'Installing…',
175
+ installDone: 'Installed',
176
+ installResultTitle: 'Plugin installed successfully',
177
+ installResultDesc: '',
178
+ // Update semantics: the "update" action re-runs add in place — copy differentiates install vs update
179
+ confirmUpdateTitle: 'Confirm update',
180
+ updateNow: 'Update',
181
+ updating: 'Updating…',
182
+ queuedUpdateTitle: 'Queued for update…',
183
+ updateResultTitle: 'Updated',
184
+ updateResultDesc: 'The plugin has been updated to the latest version.',
185
+ installFail: 'Install failed — copy the command instead',
186
+ confirmCancel: 'Cancel',
187
+ doneBtn: 'Done',
188
+ // Result view: some plugins need a restart to mount — offer restart now / later
189
+ restartNow: 'Restart now',
190
+ restartLater: 'Later',
191
+ restarting: 'Restarting…',
192
+ restartHint: 'Some plugins (such as plugin markets / top-level bundles) only take effect after a restart.',
193
+ restartPendingHint: 'Installed — takes effect after restart',
194
+ restartPendingHintUninstall: 'Removed — cleaned up after restart',
195
+ sectionPendingRestart: 'Pending restart',
196
+ sectionInProgress: 'In progress',
197
+ queuedTitle: 'Queued…',
198
+ queuedUninstallTitle: 'Queued for removal…',
199
+ queuedHint: 'Queued — starts automatically after earlier tasks finish. You may close this window.',
200
+ cancelTask: 'Cancel task',
201
+ cancelling: 'Cancelling…',
202
+ errorTitle: 'Operation failed',
203
+ errorTitleInstall: 'Install failed',
204
+ errorTitleUninstall: 'Removal failed',
205
+ errorPlugin: 'Plugin',
206
+ errorClose: 'Got it',
207
+ errorCopy: 'Copy error',
208
+ errCopied: 'Error copied',
209
+ // Task notification center: install/remove results are auto-logged, viewable later
210
+ notifications: 'Notifications',
211
+ // Entry button label: toolbar space is tight, keep it short so it never truncates; the modal title stays full
212
+ notificationsBtn: 'Notice',
213
+ notificationsHint: 'View install/remove notifications (including failures)',
214
+ notificationsDesc: 'Every install and remove result is logged here — even if you missed the prompt, you can always check back.',
215
+ notificationsEmpty: 'No notifications yet',
216
+ notificationsClear: 'Clear notifications',
217
+ removeNotification: 'Remove this notification',
218
+ failCopy: 'Copy full log',
219
+ failIssueHint: 'Open a pre-filled issue on the author repo with this error log (includes catalog links)',
220
+ failIssueBig: 'Report this bug to GitHub — contribute to open source',
221
+ // prepare script actually failed (git tarball misses submodules/build output): a packaging issue of the plugin itself — file an issue
222
+ failPrepareHint: 'This plugin failed while running its build scripts during install (git tarballs often miss submodules or build output). This is a packaging issue of the plugin itself — please report it to the author repository.',
223
+ // Pre-install / post-install guard hit ([packaging]): git distribution lacks build output, entry file missing = not adapted to the official default install method
224
+ failPackagingHint: 'This plugin does not support the official default install method: its git distribution lacks the build output (the entry file declared in package.json is not in the repository), so it has not been adapted to the official install flow. Please file an Issue on the author\'s repo asking for committed build output or an npm release.',
225
+ // native-module build scripts ignored by pnpm by default (e.g. node-pty, ERR_PNPM_IGNORED_BUILDS): only affects plugins with native deps — a dependency/packaging issue of the plugin itself, file an issue
226
+ failIgnoredBuild: 'This plugin depends on a native module (e.g. node-pty) whose build script pnpm blocks by default, so the install fails — other plugins are unaffected. This is a dependency/packaging issue of the plugin itself. Please report it to the author repository and ask the author to switch to a prebuilt variant (e.g. node-pty-prebuilt-multiarch).',
227
+ reportIssue: 'Report an Issue to the plugin repo',
64
228
  detail: 'Open details',
65
229
  noResult: 'No plugins match your search',
66
230
  noResultDesc: 'Try another keyword, or browse all plugins on the website.',
@@ -68,11 +232,17 @@ export const en = {
68
232
  daysAgo: 'updated {days}d ago',
69
233
  monthsAgo: 'updated {months}mo ago',
70
234
  yearsAgo: 'updated {years}y ago',
71
- pluginsTotal: '{n} plugins',
72
- filteredCount: '{n} matched',
235
+ pluginsTotal: 'Results: {n} plugins',
236
+ // Category chips carry no counts; the filtered result count shows in the list header
237
+ filterResults: 'Results: {n} plugins',
73
238
  more: '{n} more on the website',
74
239
  browseAll: 'Browse all {n} plugins',
75
240
  verified: 'Verified',
241
+ // Version & updates: repos with a release are compared by tag; repos without one by last push time (new commits → update)
242
+ version: 'Version',
243
+ update: 'Update',
244
+ updateAvailable: 'Update available',
245
+ updateAvailableHint: 'An update was detected: repos with a release are compared by tag, repos without one by last push time',
76
246
  empty: 'No plugins in this category yet',
77
247
  dataFrom: 'Data from dsh-plugin.org · curated daily',
78
248
  }
@@ -0,0 +1,123 @@
1
+ /* 自绘下拉(替换原生 <select>)。颜色跟随宿主主题:经 --hub-* 设计令牌解析,
2
+ * 与 Header 的控件(排序/分段)保持一致的无边框 + 圆角语言。 */
3
+ .dropdown {
4
+ position: relative;
5
+ display: inline-flex;
6
+ flex-shrink: 0;
7
+ }
8
+
9
+ .dropdownBtn {
10
+ display: inline-flex;
11
+ align-items: center;
12
+ gap: 6px;
13
+ height: 24px;
14
+ padding: 0 8px;
15
+ font-size: 12px;
16
+ line-height: 22px;
17
+ color: var(--hub-text-primary);
18
+ background: transparent;
19
+ border: none;
20
+ border-radius: 6px;
21
+ cursor: pointer;
22
+ user-select: none;
23
+ white-space: nowrap;
24
+ transition: background 120ms ease;
25
+ }
26
+
27
+ .dropdownBtn:hover {
28
+ background: var(--hub-bg-hover);
29
+ }
30
+
31
+ .dropdownLabel {
32
+ min-width: 0;
33
+ overflow: hidden;
34
+ text-overflow: ellipsis;
35
+ }
36
+
37
+ .dropdownArrow,
38
+ .dropdownArrowOpen {
39
+ display: inline-flex;
40
+ align-items: center;
41
+ justify-content: center;
42
+ color: var(--hub-text-tertiary);
43
+ transition: transform 120ms ease;
44
+ }
45
+
46
+ .dropdownArrowOpen {
47
+ transform: rotate(180deg);
48
+ }
49
+
50
+ .dropdownPanel {
51
+ position: absolute;
52
+ top: calc(100% + 4px);
53
+ left: 0;
54
+ z-index: 50;
55
+ min-width: 100%;
56
+ display: flex;
57
+ flex-direction: column;
58
+ gap: 2px;
59
+ padding: 4px;
60
+ background: var(--hub-bg-1);
61
+ border: 1px solid var(--hub-border-2);
62
+ border-radius: 8px;
63
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.14);
64
+ }
65
+
66
+ .dropdownItem,
67
+ .dropdownItemActive {
68
+ display: flex;
69
+ align-items: center;
70
+ justify-content: space-between;
71
+ gap: 10px;
72
+ font-size: 12px;
73
+ line-height: 18px;
74
+ border: none;
75
+ border-radius: 6px;
76
+ padding: 4px 9px;
77
+ cursor: pointer;
78
+ user-select: none;
79
+ white-space: nowrap;
80
+ text-align: left;
81
+ transition: background 120ms ease, color 120ms ease;
82
+ }
83
+
84
+ .dropdownItem {
85
+ color: var(--hub-text-primary);
86
+ background: transparent;
87
+ }
88
+
89
+ /* 悬浮选项:明显加重底色,保证「看得见、点得准」。 */
90
+ .dropdownItem:hover {
91
+ background: var(--hub-bg-hover);
92
+ }
93
+
94
+ .dropdownItemActive {
95
+ color: var(--hub-text-on-fill);
96
+ background: var(--hub-btn-fill);
97
+ }
98
+
99
+ .dropdownItemLabel {
100
+ min-width: 0;
101
+ overflow: hidden;
102
+ text-overflow: ellipsis;
103
+ }
104
+
105
+ .dropdownCount,
106
+ .dropdownCountActive {
107
+ font-size: 10px;
108
+ line-height: 14px;
109
+ border-radius: 999px;
110
+ padding: 0 6px;
111
+ min-width: 16px;
112
+ text-align: center;
113
+ }
114
+
115
+ .dropdownCount {
116
+ color: var(--hub-text-tertiary);
117
+ background: var(--hub-bg-btn);
118
+ }
119
+
120
+ .dropdownItemActive .dropdownCountActive {
121
+ color: var(--hub-text-on-fill);
122
+ background: var(--hub-bg-on-fill);
123
+ }