mcp-market.module.scss 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587
  1. @import "../styles/animation.scss";
  2. .mcp-market-page {
  3. height: 100%;
  4. display: flex;
  5. flex-direction: column;
  6. .loading-indicator {
  7. font-size: 12px;
  8. color: var(--primary);
  9. margin-left: 8px;
  10. font-weight: normal;
  11. opacity: 0.8;
  12. }
  13. .mcp-market-page-body {
  14. padding: 20px;
  15. overflow-y: auto;
  16. .loading-container,
  17. .empty-container {
  18. display: flex;
  19. justify-content: center;
  20. align-items: center;
  21. min-height: 200px;
  22. width: 100%;
  23. background-color: var(--white);
  24. border: var(--border-in-light);
  25. border-radius: 10px;
  26. animation: slide-in ease 0.3s;
  27. }
  28. .loading-text,
  29. .empty-text {
  30. font-size: 14px;
  31. color: var(--black);
  32. opacity: 0.5;
  33. text-align: center;
  34. }
  35. .mcp-market-filter {
  36. width: 100%;
  37. max-width: 100%;
  38. margin-bottom: 20px;
  39. animation: slide-in ease 0.3s;
  40. height: 40px;
  41. display: flex;
  42. .search-bar {
  43. flex-grow: 1;
  44. max-width: 100%;
  45. min-width: 0;
  46. }
  47. }
  48. .server-list {
  49. display: flex;
  50. flex-direction: column;
  51. gap: 1px;
  52. }
  53. .mcp-market-item {
  54. padding: 20px;
  55. border: var(--border-in-light);
  56. animation: slide-in ease 0.3s;
  57. background-color: var(--white);
  58. transition: all 0.3s ease;
  59. &.disabled {
  60. opacity: 0.7;
  61. pointer-events: none;
  62. }
  63. &:not(:last-child) {
  64. border-bottom: 0;
  65. }
  66. &:first-child {
  67. border-top-left-radius: 10px;
  68. border-top-right-radius: 10px;
  69. }
  70. &:last-child {
  71. border-bottom-left-radius: 10px;
  72. border-bottom-right-radius: 10px;
  73. }
  74. .mcp-market-header {
  75. display: flex;
  76. justify-content: space-between;
  77. align-items: flex-start;
  78. width: 100%;
  79. .mcp-market-title {
  80. flex-grow: 1;
  81. margin-right: 20px;
  82. max-width: calc(100% - 300px);
  83. }
  84. .mcp-market-name {
  85. font-size: 14px;
  86. font-weight: bold;
  87. display: flex;
  88. align-items: center;
  89. gap: 8px;
  90. margin-bottom: 8px;
  91. .server-status {
  92. display: inline-flex;
  93. align-items: center;
  94. margin-left: 10px;
  95. padding: 2px 8px;
  96. border-radius: 4px;
  97. font-size: 12px;
  98. background-color: #22c55e;
  99. color: #fff;
  100. &.error {
  101. background-color: #ef4444;
  102. }
  103. &.stopped {
  104. background-color: #6b7280;
  105. }
  106. .error-message {
  107. margin-left: 4px;
  108. font-size: 12px;
  109. }
  110. }
  111. }
  112. .repo-link {
  113. color: var(--primary);
  114. font-size: 12px;
  115. display: inline-flex;
  116. align-items: center;
  117. gap: 4px;
  118. text-decoration: none;
  119. opacity: 0.8;
  120. transition: opacity 0.2s;
  121. &:hover {
  122. opacity: 1;
  123. }
  124. svg {
  125. width: 14px;
  126. height: 14px;
  127. }
  128. }
  129. .tags-container {
  130. display: flex;
  131. gap: 4px;
  132. flex-wrap: wrap;
  133. margin-bottom: 8px;
  134. }
  135. .tag {
  136. background: var(--gray);
  137. color: var(--black);
  138. padding: 2px 6px;
  139. border-radius: 4px;
  140. font-size: 10px;
  141. opacity: 0.8;
  142. }
  143. .mcp-market-info {
  144. color: var(--black);
  145. font-size: 12px;
  146. overflow: hidden;
  147. text-overflow: ellipsis;
  148. white-space: nowrap;
  149. }
  150. .mcp-market-actions {
  151. display: flex;
  152. gap: 12px;
  153. align-items: flex-start;
  154. flex-shrink: 0;
  155. min-width: 180px;
  156. justify-content: flex-end;
  157. }
  158. }
  159. }
  160. }
  161. .array-input {
  162. display: flex;
  163. flex-direction: column;
  164. gap: 12px;
  165. width: 100%;
  166. padding: 16px;
  167. border: 1px solid var(--gray-200);
  168. border-radius: 10px;
  169. background-color: var(--white);
  170. .array-input-item {
  171. display: flex;
  172. gap: 8px;
  173. align-items: center;
  174. width: 100%;
  175. padding: 0;
  176. input {
  177. width: 100%;
  178. padding: 8px 12px;
  179. background-color: var(--gray-50);
  180. border-radius: 6px;
  181. transition: all 0.3s ease;
  182. font-size: 13px;
  183. border: 1px solid var(--gray-200);
  184. &:hover {
  185. background-color: var(--gray-100);
  186. border-color: var(--gray-300);
  187. }
  188. &:focus {
  189. background-color: var(--white);
  190. border-color: var(--primary);
  191. outline: none;
  192. box-shadow: 0 0 0 2px var(--primary-10);
  193. }
  194. &::placeholder {
  195. color: var(--gray-300);
  196. }
  197. }
  198. }
  199. :global(.icon-button.add-path-button) {
  200. width: 100%;
  201. background-color: var(--primary);
  202. color: white;
  203. padding: 8px 12px;
  204. border-radius: 6px;
  205. transition: all 0.3s ease;
  206. margin-top: 8px;
  207. display: flex;
  208. align-items: center;
  209. justify-content: center;
  210. border: none;
  211. height: 36px;
  212. &:hover {
  213. background-color: var(--primary-dark);
  214. }
  215. svg {
  216. width: 16px;
  217. height: 16px;
  218. margin-right: 4px;
  219. filter: brightness(2);
  220. }
  221. }
  222. }
  223. .path-list {
  224. width: 100%;
  225. display: flex;
  226. flex-direction: column;
  227. gap: 10px;
  228. .path-item {
  229. display: flex;
  230. gap: 10px;
  231. width: 100%;
  232. input {
  233. flex: 1;
  234. width: 100%;
  235. max-width: 100%;
  236. padding: 10px;
  237. border: var(--border-in-light);
  238. border-radius: 10px;
  239. box-sizing: border-box;
  240. font-size: 14px;
  241. background-color: var(--white);
  242. color: var(--black);
  243. &:hover {
  244. border-color: var(--gray-300);
  245. }
  246. &:focus {
  247. border-color: var(--primary);
  248. outline: none;
  249. box-shadow: 0 0 0 2px var(--primary-10);
  250. }
  251. }
  252. .browse-button {
  253. padding: 8px;
  254. border: var(--border-in-light);
  255. border-radius: 10px;
  256. background-color: transparent;
  257. color: var(--black-50);
  258. &:hover {
  259. border-color: var(--primary);
  260. color: var(--primary);
  261. background-color: transparent;
  262. }
  263. svg {
  264. width: 16px;
  265. height: 16px;
  266. }
  267. }
  268. .delete-button {
  269. padding: 8px;
  270. border: var(--border-in-light);
  271. border-radius: 10px;
  272. background-color: transparent;
  273. color: var(--black-50);
  274. &:hover {
  275. border-color: var(--danger);
  276. color: var(--danger);
  277. background-color: transparent;
  278. }
  279. svg {
  280. width: 16px;
  281. height: 16px;
  282. }
  283. }
  284. .file-input {
  285. display: none;
  286. }
  287. }
  288. .add-button {
  289. align-self: flex-start;
  290. display: flex;
  291. align-items: center;
  292. gap: 5px;
  293. padding: 8px 12px;
  294. background-color: transparent;
  295. border: var(--border-in-light);
  296. border-radius: 10px;
  297. color: var(--black);
  298. font-size: 12px;
  299. margin-top: 5px;
  300. &:hover {
  301. border-color: var(--primary);
  302. color: var(--primary);
  303. background-color: transparent;
  304. }
  305. svg {
  306. width: 16px;
  307. height: 16px;
  308. }
  309. }
  310. }
  311. .config-section {
  312. width: 100%;
  313. .config-header {
  314. margin-bottom: 12px;
  315. .config-title {
  316. font-size: 14px;
  317. font-weight: 600;
  318. color: var(--black);
  319. text-transform: capitalize;
  320. }
  321. .config-description {
  322. font-size: 12px;
  323. color: var(--gray-500);
  324. margin-top: 4px;
  325. }
  326. }
  327. .array-input {
  328. display: flex;
  329. flex-direction: column;
  330. gap: 12px;
  331. width: 100%;
  332. padding: 16px;
  333. border: 1px solid var(--gray-200);
  334. border-radius: 10px;
  335. background-color: var(--white);
  336. .array-input-item {
  337. display: flex;
  338. gap: 8px;
  339. align-items: center;
  340. width: 100%;
  341. padding: 0;
  342. input {
  343. width: 100%;
  344. padding: 8px 12px;
  345. background-color: var(--gray-50);
  346. border-radius: 6px;
  347. transition: all 0.3s ease;
  348. font-size: 13px;
  349. border: 1px solid var(--gray-200);
  350. &:hover {
  351. background-color: var(--gray-100);
  352. border-color: var(--gray-300);
  353. }
  354. &:focus {
  355. background-color: var(--white);
  356. border-color: var(--primary);
  357. outline: none;
  358. box-shadow: 0 0 0 2px var(--primary-10);
  359. }
  360. &::placeholder {
  361. color: var(--gray-300);
  362. }
  363. }
  364. :global(.icon-button) {
  365. width: 32px;
  366. height: 32px;
  367. padding: 0;
  368. border-radius: 6px;
  369. background-color: transparent;
  370. border: 1px solid var(--gray-200);
  371. flex-shrink: 0;
  372. display: flex;
  373. align-items: center;
  374. justify-content: center;
  375. &:hover {
  376. background-color: var(--gray-100);
  377. border-color: var(--gray-300);
  378. }
  379. svg {
  380. width: 16px;
  381. height: 16px;
  382. opacity: 0.7;
  383. }
  384. }
  385. }
  386. :global(.icon-button.add-path-button) {
  387. width: 100%;
  388. background-color: var(--primary);
  389. color: white;
  390. padding: 8px 12px;
  391. border-radius: 6px;
  392. transition: all 0.3s ease;
  393. margin-top: 8px;
  394. display: flex;
  395. align-items: center;
  396. justify-content: center;
  397. border: none;
  398. height: 36px;
  399. &:hover {
  400. background-color: var(--primary-dark);
  401. }
  402. svg {
  403. width: 16px;
  404. height: 16px;
  405. margin-right: 4px;
  406. filter: brightness(2);
  407. }
  408. }
  409. }
  410. }
  411. .input-item {
  412. width: 100%;
  413. input {
  414. width: 100%;
  415. padding: 10px;
  416. border: var(--border-in-light);
  417. border-radius: 10px;
  418. box-sizing: border-box;
  419. font-size: 14px;
  420. background-color: var(--white);
  421. color: var(--black);
  422. &:hover {
  423. border-color: var(--gray-300);
  424. }
  425. &:focus {
  426. border-color: var(--primary);
  427. outline: none;
  428. box-shadow: 0 0 0 2px var(--primary-10);
  429. }
  430. &::placeholder {
  431. color: var(--gray-300) !important;
  432. opacity: 1;
  433. }
  434. }
  435. }
  436. .tools-list {
  437. display: flex;
  438. flex-direction: column;
  439. gap: 16px;
  440. width: 100%;
  441. padding: 20px;
  442. max-width: 100%;
  443. overflow-x: hidden;
  444. word-break: break-word;
  445. box-sizing: border-box;
  446. .tool-item {
  447. width: 100%;
  448. box-sizing: border-box;
  449. .tool-name {
  450. font-size: 14px;
  451. font-weight: 600;
  452. color: var(--black);
  453. margin-bottom: 8px;
  454. padding-left: 12px;
  455. border-left: 3px solid var(--primary);
  456. box-sizing: border-box;
  457. width: 100%;
  458. }
  459. .tool-description {
  460. font-size: 13px;
  461. color: var(--gray-500);
  462. line-height: 1.6;
  463. padding-left: 15px;
  464. box-sizing: border-box;
  465. width: 100%;
  466. }
  467. }
  468. }
  469. :global {
  470. .modal-content {
  471. margin-top: 20px;
  472. max-width: 100%;
  473. overflow-x: hidden;
  474. }
  475. .list {
  476. padding: 10px;
  477. margin-bottom: 10px;
  478. background-color: var(--white);
  479. }
  480. .list-item {
  481. border: none;
  482. background-color: transparent;
  483. border-radius: 10px;
  484. padding: 10px;
  485. margin-bottom: 10px;
  486. display: flex;
  487. flex-direction: column;
  488. gap: 10px;
  489. .list-header {
  490. margin-bottom: 0;
  491. .list-title {
  492. font-size: 14px;
  493. font-weight: bold;
  494. text-transform: capitalize;
  495. color: var(--black);
  496. }
  497. .list-sub-title {
  498. font-size: 12px;
  499. color: var(--gray-500);
  500. margin-top: 4px;
  501. }
  502. }
  503. }
  504. }
  505. }