HomeView.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816
  1. <script setup lang="ts">
  2. //@ts-ignore
  3. import MetaMaskSDK from '../utils/metamask-sdk.js'
  4. //@ts-ignore
  5. import getZksEra from '../utils/getZksEra.js'
  6. //@ts-ignore
  7. import getZksLite from '../utils/getZksLite.js'
  8. //@ts-ignore
  9. import getZkSyncBridge from '../utils/getZkSyncBridge.js'
  10. import * as echarts from 'echarts';
  11. import {onMounted, ref} from 'vue';
  12. import balancerBg from '../project/balancer/balancerBg.png'
  13. import balancerAv from '../project/balancer/balancerAv.png'
  14. import argentBg from '../project/argent/argentBg.png'
  15. import argentAv from '../project/argent/argentAv.png'
  16. import ontoBg from '../project/onto/ontoBg.png'
  17. import ontoAv from '../project/onto/ontoAv.png'
  18. import zerionBg from '../project/zerion/zerionBg.png'
  19. import zerionAv from '../project/zerion/zerionAv.png'
  20. import zksEraBridgeAv from '../project/zksEraBridge/zksEraBridgeAv.png'
  21. import zksEraBridgeBg from '../project/zksEraBridge/zksEraBridgeBg.png'
  22. import zksLiteBridgeBg from '../project/zksLiteBridge/zksLiteBridgeBg.png'
  23. import zksLiteBridgeAv from '../project/zksLiteBridge/zksLiteBridgeAv.png'
  24. import orbiterAv from '../project/orbiter/orbiterAv.png'
  25. import orbiterBg from '../project/orbiter/orbiterBg.png'
  26. import muteAv from '../project/mute/muteAv.png'
  27. import muteBg from '../project/mute/muteBg.png'
  28. import syncswapBg from '../project/syncswap/syncswapBg.png'
  29. import syncswapAv from '../project/syncswap/syncswapAv.png'
  30. import getcoinBg from '../project/getcoin/getcoinBg.png'
  31. import getcoinAv from '../project/getcoin/getcoinAv.png'
  32. //@ts-ignore
  33. import {getAllZksSyncData} from "@/utils/getZksyncData/index.js";
  34. type EChartsOption = echarts.EChartsOption;
  35. onMounted(() => {
  36. checkWalletAddress()
  37. listeningDisconnect()
  38. })
  39. type dataArrType = {
  40. name: string,
  41. type: string[],
  42. BG: string,
  43. avatar: string,
  44. url:string
  45. }[]
  46. let dataArr: dataArrType = [
  47. {
  48. name: 'zks-era bridge',
  49. type: ['OFFICAL','BRIDGE'],
  50. BG: zksEraBridgeBg,
  51. avatar: zksEraBridgeAv,
  52. url:'https://bridge.zksync.io/'
  53. },
  54. {
  55. name: 'zks-lite bridge',
  56. type: ['OFFICAL','BRIDGE'],
  57. BG: zksLiteBridgeBg,
  58. avatar: zksLiteBridgeAv,
  59. url:'https://lite.zksync.io/transaction/deposit'
  60. },
  61. {
  62. name: 'Orbiter',
  63. type: ['ERA', 'SWAP'],
  64. BG: orbiterBg,
  65. avatar: orbiterAv,
  66. url:'https://www.orbiter.finance/'
  67. },
  68. {
  69. name: 'Mute',
  70. type: ['ERA', 'DEFI', 'SWAP'],
  71. BG: muteBg,
  72. avatar: muteAv,
  73. url:'https://app.mute.io/swap'
  74. },
  75. {
  76. name: 'Syncswap',
  77. type: ['ERA', 'SWAP'],
  78. BG: syncswapBg,
  79. avatar: syncswapAv,
  80. url:'https://syncswap.xyz/'
  81. },
  82. {
  83. name: 'Gitcoin',
  84. type: ['DEFI', 'SWAP'],
  85. BG: getcoinBg,
  86. avatar: getcoinAv,
  87. url:'https://bounties.gitcoin.co/'
  88. },
  89. ]
  90. let MM = ref()//MetaMaskSDK
  91. let address = ref('')//钱包地址
  92. let chainId = '0x144'
  93. const MMSDK = new MetaMaskSDK()
  94. MM.value = MMSDK.getProvider()
  95. //监听连接断开(通过监听账号的变化判断是否断开连接)
  96. const listeningDisconnect = () => {
  97. MM.value.on('accountsChanged', (accounts: string[]) => {
  98. if (accounts.length >= 1) {
  99. address.value = accounts[0]
  100. connectWallet()
  101. } else {
  102. address.value = ''
  103. }
  104. })
  105. }
  106. //查询钱包地址
  107. const checkWalletAddress = async () => {
  108. let accounts: string[] = await MM.value.request({method: 'eth_accounts'});//不弹窗
  109. address.value = accounts[0]
  110. getMainTx()
  111. getLiteTx()
  112. getMoreInfo()
  113. await addChain()
  114. await switchEthereumChain()
  115. }
  116. //添加链
  117. const addChain = () => {
  118. MM.value.request({
  119. method: 'wallet_addEthereumChain',
  120. params: [{
  121. chainId: chainId,
  122. chainName: 'zkSync Era Mainnet',
  123. rpcUrls: ['https://mainnet.era.zksync.io'],
  124. blockExplorerUrls: ['https://explorer.zksync.io'],
  125. nativeCurrency: {
  126. name: 'ETH',
  127. symbol: 'ETH',
  128. decimals: 18,
  129. },
  130. }]
  131. })
  132. }
  133. //切换链
  134. const switchEthereumChain = () => {
  135. MM.value.request({
  136. method: 'wallet_switchEthereumChain',
  137. params: [{chainId: chainId}],
  138. }).then(() => {
  139. }).catch(() => {
  140. });
  141. }
  142. //连接钱包按钮
  143. const connectWallet = async () => {
  144. let accounts: string[] = await MM.value.request({method: 'eth_requestAccounts'});
  145. address.value = accounts[0]
  146. getMainTx()
  147. getLiteTx()
  148. getMoreInfo()
  149. await addChain()
  150. await switchEthereumChain()
  151. }
  152. //获取主网交易次数
  153. let mainTx = ref('-')
  154. const getMainTx = () => {
  155. getZksEra(address.value).then(({tx2}:{tx2:number}) => {
  156. mainTx.value = tx2.toString()
  157. })
  158. }
  159. //获取lite网交易次数
  160. let liteTx = ref('-')
  161. const getLiteTx = () => {
  162. getZksLite(address.value).then(({tx1}:{tx1:number}) => {
  163. liteTx.value = tx1.toString()
  164. })
  165. }
  166. //获取更多信息
  167. let amount = ref('-')
  168. let contract = ref('-')
  169. let tradingTimeArr = ref()
  170. let l1Tol2Tx = ref('-')
  171. let l2Tol1Tx = ref('-')
  172. const getMoreInfo = () => {
  173. // getZkSyncBridge('0x555b07470647Cd159FF6595771054Aee7343e853').then((
  174. // {
  175. // totalExchangeAmount,
  176. // contractActivity,
  177. // overTimeArr,
  178. // l1Tol2Times,
  179. // l2Tol1Times
  180. // }:{
  181. // totalExchangeAmount:number
  182. // contractActivity:number
  183. // overTimeArr:any
  184. // l1Tol2Times:number
  185. // l2Tol1Times:number
  186. // }) => {
  187. // amount.value = totalExchangeAmount
  188. // contract.value = contractActivity
  189. // tradingTimeArr.value = overTimeArr
  190. // l1Tol2Tx.value = l1Tol2Times
  191. // l2Tol1Tx.value = l2Tol1Times
  192. // processTime()
  193. // })
  194. getAllZksSyncData(address.value).then((res:any)=>{
  195. amount.value = res.totalExchangeAmount
  196. contract.value = res.contractActivity
  197. tradingTimeArr.value = res.overTimeArr
  198. l1Tol2Tx.value = res.l1Tol2Times
  199. l2Tol1Tx.value = res.l2Tol1Times
  200. processTime()
  201. })
  202. }
  203. //处理时间数据
  204. const monthArr = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
  205. let showMonthNumberArr = ref([0,0,0,0,0,0,0,0,0,0,0,0])
  206. let showMonthArr = ref()
  207. const processTime = () => {
  208. let nowDate = new Date().toString()
  209. let nowDateArr = nowDate.split(' ')
  210. let nowMonth = nowDateArr[1]
  211. showMonthArr.value = []
  212. showMonthArr.value.push(nowMonth)
  213. let nowMonthIndex = monthArr.indexOf(nowMonth)
  214. const forLoop = () => {
  215. for (let i = 11; i !== nowMonthIndex ; i--) {
  216. showMonthArr.value.unshift(monthArr[i])
  217. }
  218. }
  219. for (let i = nowMonthIndex; i !== 0 ; i--) {
  220. showMonthArr.value.unshift(monthArr[i-1])
  221. if (i === 1) {
  222. forLoop()
  223. }
  224. }
  225. if (tradingTimeArr.value){
  226. tradingTimeArr.value.forEach((item:any) => {
  227. // if(item.balanceChanges[0].from && item.balanceChanges[0].from.toLowerCase() === address.value.toLowerCase()){
  228. let receivedAt = new Date(Date.parse(item.receivedAt)).toString();
  229. let strArr = receivedAt.split(' ')
  230. let month = strArr[1]
  231. let index = showMonthArr.value.indexOf(month)
  232. showMonthNumberArr.value[index]++
  233. // }
  234. })
  235. }
  236. initEcharts()
  237. }
  238. //初始化echarts
  239. const initEcharts = () => {
  240. let chartDom = document.getElementById('echartsBox')!
  241. let myChart = echarts.init(chartDom);
  242. let option: EChartsOption;
  243. option = {
  244. tooltip: {
  245. trigger: 'axis',
  246. axisPointer: {
  247. type: 'shadow'
  248. }
  249. },
  250. xAxis: {
  251. type: 'category',
  252. axisTick: {
  253. alignWithLabel: true
  254. },
  255. data: showMonthArr.value
  256. },
  257. yAxis: {
  258. type: 'value',
  259. },
  260. series: [
  261. {
  262. color: '#000000',
  263. data: showMonthNumberArr.value,
  264. type: 'bar'
  265. }
  266. ]
  267. };
  268. option && myChart.setOption(option);
  269. }
  270. //跳转网页
  271. const toLink = (url:string) => {
  272. window.open(url)
  273. }
  274. const toEmail = (email:string) => {
  275. const emailAddress = email; // 替换为你想发送邮件的收件人地址
  276. const subject = 'Hello'; // 替换为你想在邮件中设置的主题
  277. const body = 'This is the email body.'; // 替换为你想在邮件中设置的内容
  278. const mailtoUrl = `mailto:${emailAddress}?subject=${encodeURIComponent(subject)}&body=${encodeURIComponent(body)}`;
  279. window.open(mailtoUrl);
  280. }
  281. let sun = ref(true)
  282. const sunAndMoon = () => {
  283. if (sun.value){
  284. document.documentElement.style.setProperty('--color-background','#181818')
  285. document.documentElement.style.setProperty('--color-text','#f2f2f2')
  286. }else {
  287. document.documentElement.style.setProperty('--color-background','#f2f2f2')
  288. document.documentElement.style.setProperty('--color-text','#181818')
  289. }
  290. sun.value = !sun.value
  291. }
  292. </script>
  293. <template>
  294. <main class="main">
  295. <div class="mainBG">
  296. <img src="../assets/BG.png" alt="BG">
  297. </div>
  298. <div class="topBar">
  299. <div class="left">
  300. <img v-show="!sun" src="../assets/bitflower-white.svg" alt="bitflower">
  301. <img v-show="sun" src="../assets/bitflower.svg" alt="logo">
  302. </div>
  303. <div class="mid">
  304. Blossom your Web3 Trip ✈
  305. </div>
  306. <div class="right">
  307. <img v-show="!sun" @click="sunAndMoon" src="../assets/sun-fill.svg" alt="sun-fill">
  308. <img v-show="sun" @click="sunAndMoon" src="../assets/moon-clear-fill.svg" alt="moon-clear-fill">
  309. <div class="button" v-show="!address" @click="connectWallet">
  310. <img src="../assets/git-commit-line.svg" alt="commit">
  311. Connect Wallet
  312. </div>
  313. <div class="connect" v-if="address">
  314. <img src="../assets/git-commit-line-black.svg" alt="commit">
  315. {{ address.slice(0, 8) }}...{{ address.slice(-4) }}
  316. </div>
  317. </div>
  318. </div>
  319. <div class="dataColumn">
  320. <div class="item">
  321. <div class="top">
  322. <div class="img">
  323. <img v-show="!sun" src="../assets/group1-white.svg" alt="group1">
  324. <img v-show="sun" src="../assets/group1.svg" alt="group1">
  325. </div>
  326. <div class="title">
  327. Protocols lnteraction
  328. <el-popover
  329. placement="bottom"
  330. :width="230"
  331. trigger="hover"
  332. effect="dark"
  333. >
  334. <template #reference>
  335. <img src="../assets/info.svg" alt="info">
  336. </template>
  337. <div class="popoverText">
  338. Number of protocolsinteracted
  339. </div>
  340. <div class="popoverText">
  341. with out of allavailable protocols
  342. </div>
  343. </el-popover>
  344. </div>
  345. </div>
  346. <div class="number">
  347. {{ contract }}
  348. </div>
  349. </div>
  350. <div class="item">
  351. <div class="top">
  352. <div class="img">
  353. <img v-show="!sun" class="img" src="../assets/group3-white.svg" alt="group2">
  354. <img v-show="sun" class="img" src="../assets/group3.svg" alt="group2">
  355. </div>
  356. <div class="title">
  357. Total Transactions
  358. <el-popover
  359. placement="bottom"
  360. :width="250"
  361. trigger="hover"
  362. effect="dark"
  363. >
  364. <template #reference>
  365. <img src="../assets/info.svg" alt="info">
  366. </template>
  367. <div class="popoverText">
  368. Total zkSync lite
  369. </div>
  370. <div class="popoverText">
  371. transactions issuedfrom the account
  372. </div>
  373. </el-popover>
  374. </div>
  375. </div>
  376. <div class="number">
  377. {{ liteTx }}
  378. <img @click="toLink('https://zkscan.io/')" style="cursor: pointer" src="../assets/arrow-right-up-line.svg" alt="arrow">
  379. </div>
  380. </div>
  381. <div class="item">
  382. <div class="top">
  383. <div class="img">
  384. <img v-show="!sun" class="img" src="../assets/group2-white.svg" alt="group2">
  385. <img v-show="sun" class="img" src="../assets/group2.svg" alt="group2">
  386. </div>
  387. <div class="title">
  388. Total Transactions
  389. <el-popover
  390. placement="bottom"
  391. :width="250"
  392. trigger="hover"
  393. effect="dark"
  394. >
  395. <template #reference>
  396. <img src="../assets/info.svg" alt="info">
  397. </template>
  398. <div class="popoverText">
  399. Total zkSync era
  400. </div>
  401. <div class="popoverText">
  402. transactions issuedfrom the account
  403. </div>
  404. </el-popover>
  405. </div>
  406. </div>
  407. <div class="number">
  408. {{ mainTx }}
  409. <img @click="toLink('https://explorer.zksync.io/')" style="cursor: pointer" src="../assets/arrow-right-up-line.svg" alt="arrow">
  410. </div>
  411. </div>
  412. <div class="item" style="height: 94px">
  413. <div class="top">
  414. <div class="img">
  415. <img v-show="!sun" class="img" src="../assets/official-bridge-white.svg" alt="group2">
  416. <img v-show="sun" class="img" src="../assets/official-bridge-black.svg" alt="group2">
  417. </div>
  418. <div style="display: flex;gap:40px">
  419. <div style="display: flex;flex-direction: column;gap:20px">
  420. <img v-show="!sun" src="../assets/L1-To-L2-white.svg" alt="To">
  421. <img v-show="sun" src="../assets/L1-To-L2.svg" alt="To">
  422. <div class="number">
  423. {{ l1Tol2Tx }}
  424. </div>
  425. </div>
  426. <div style="display: flex;flex-direction: column;gap:20px">
  427. <img v-show="!sun" src="../assets/L2-To-L1-white.svg" alt="To">
  428. <img v-show="sun" src="../assets/L2-To-L1.svg" alt="To">
  429. <div class="number">
  430. {{ l2Tol1Tx }}
  431. </div>
  432. </div>
  433. </div>
  434. </div>
  435. </div>
  436. <div class="item">
  437. <div class="top">
  438. <div class="img">
  439. <img class="img" src="../assets/group4.svg" alt="group2">
  440. </div>
  441. <div class="title">
  442. Total amount spent
  443. </div>
  444. </div>
  445. <div class="number">
  446. {{ amount }} USDT
  447. </div>
  448. </div>
  449. </div>
  450. <div class="primary">
  451. <div class="left">
  452. <div class="echarts">
  453. <div class="title">
  454. Transactions Over Time
  455. <el-popover
  456. placement="right"
  457. :width="240"
  458. trigger="hover"
  459. effect="dark"
  460. >
  461. <template #reference>
  462. <img src="../assets/info.svg" alt="info">
  463. </template>
  464. <div class="popoverText">
  465. Number of transactions permonth
  466. </div>
  467. </el-popover>
  468. </div>
  469. <div class="echartsBox" id="echartsBox">
  470. </div>
  471. </div>
  472. <div class="disclaimer">
  473. <img v-show="!sun" src="../assets/disclaimer-white.svg" alt="disclaimer">
  474. <img v-show="sun" src="../assets/disclaimer.svg" alt="disclaimer">
  475. <div class="description">
  476. The list of dApps is for informational purposes only. It is not a testimony of the security or reliability
  477. of any dApp. Furthermore, most dApps are currently in alpha stage and their code is not audited. You are
  478. encouraged to do your own research (DYOR) before interacting with, or investing in any dApps. This should
  479. not be considered financial or investment advice.
  480. </div>
  481. <div class="contact">
  482. <div class="item" @click="toEmail('bitflower.web3@gmail.com')">
  483. <img src="../assets/mail-open-line.svg" alt="mail">
  484. E-mail
  485. </div>
  486. <div class="line"/>
  487. <div class="item" @click="toLink('https://t.me/bitflowersupport')">
  488. <img src="../assets/telegram-line.svg" alt="telegram">
  489. Telegram
  490. </div>
  491. </div>
  492. </div>
  493. </div>
  494. <div class="right">
  495. <div class="item" @click="toLink(item.url)" v-for="item in dataArr">
  496. <div class="BG">
  497. <img class="BG" :src="item.BG" alt="BG">
  498. </div>
  499. <div class="infoBox">
  500. <div class="avatar">
  501. <img class="avatar" :src="item.avatar" alt="avatar">
  502. </div>
  503. <div class="nameAndType">
  504. <div class="name">
  505. {{ item.name }}
  506. </div>
  507. <div class="typeBox">
  508. <div class="type" v-for="item1 in item.type">
  509. {{ item1 }}
  510. </div>
  511. </div>
  512. </div>
  513. </div>
  514. </div>
  515. </div>
  516. </div>
  517. </main>
  518. </template>
  519. <style lang="scss">
  520. .main {
  521. width: 1440px;
  522. height: 100vh;
  523. margin: auto;
  524. border: 1px solid #f7f7f7;
  525. border-top: none;
  526. border-bottom: none;
  527. padding: 30px 60px;
  528. .mainBG{
  529. position: absolute;
  530. top: 0;
  531. z-index: -1;
  532. }
  533. .topBar {
  534. display: flex;
  535. align-items: center;
  536. justify-content: space-between;
  537. .mid{
  538. font-weight: 400;
  539. font-size: 15px;
  540. line-height: 21px;
  541. font-family: 'Chillax';
  542. text-transform: uppercase;
  543. }
  544. .right {
  545. display: flex;
  546. align-items: center;
  547. gap:40px;
  548. cursor: pointer;
  549. .button {
  550. width: fit-content;
  551. height: 44px;
  552. display: flex;
  553. align-items: center;
  554. gap: 6px;
  555. background: #010101;
  556. padding: 0 24px;
  557. font-weight: 500;
  558. font-size: 15px;
  559. line-height: 20px;
  560. color: #FFFFFF;
  561. cursor: pointer;
  562. }
  563. .connect {
  564. width: fit-content;
  565. height: 44px;
  566. display: flex;
  567. align-items: center;
  568. gap: 6px;
  569. background: #FFFFFF;
  570. border: 1px solid #010101;
  571. border-radius: 30px;
  572. padding: 0 24px;
  573. font-weight: 500;
  574. font-size: 15px;
  575. line-height: 20px;
  576. color: #010101;
  577. }
  578. }
  579. }
  580. .dataColumn {
  581. display: flex;
  582. align-items: center;
  583. justify-content: space-between;
  584. padding: 75px 60px 60px 60px;
  585. border-bottom: 1px solid #f7f7f7;
  586. margin: 0 -60px;
  587. .item {
  588. width: 330px;
  589. display: flex;
  590. flex-direction: column;
  591. gap: 20px;
  592. .top {
  593. display: flex;
  594. flex-direction: column;
  595. gap: 6px;
  596. .img {
  597. height: 16px;
  598. }
  599. .title {
  600. display: flex;
  601. align-items: center;
  602. gap: 8px;
  603. font-weight: 400;
  604. font-size: 14px;
  605. line-height: 18px;
  606. //color: #010101;
  607. font-family: 'HONOR Sans CN';
  608. .popoverText{
  609. font-weight: 400;
  610. font-size: 12px;
  611. line-height: 24px;
  612. }
  613. }
  614. }
  615. .number {
  616. display: flex;
  617. align-items: center;
  618. gap: 8px;
  619. font-weight: 700;
  620. font-size: 26px;
  621. line-height: 34px;
  622. //color: #010101;
  623. }
  624. }
  625. }
  626. .primary {
  627. display: flex;
  628. gap: 60px;
  629. margin-top: 60px;
  630. .left {
  631. display: flex;
  632. flex-direction: column;
  633. .echarts {
  634. .title {
  635. display: flex;
  636. align-items: center;
  637. gap: 8px;
  638. font-weight: 700;
  639. font-size: 14px;
  640. line-height: 18px;
  641. //color: #010101;
  642. }
  643. .echartsBox {
  644. height: 360px;
  645. width: 560px;
  646. }
  647. }
  648. .disclaimer {
  649. width: 558px;
  650. height: 246px;
  651. border: 1px solid #010101;
  652. padding: 24px;
  653. .description {
  654. margin-top: 8px;
  655. margin-bottom: 28px;
  656. font-weight: 400;
  657. font-size: 12px;
  658. line-height: 24px;
  659. color: #808080;
  660. }
  661. .contact {
  662. width: fit-content;
  663. height: 44px;
  664. display: flex;
  665. align-items: center;
  666. gap: 24px;
  667. font-weight: 500;
  668. font-size: 14px;
  669. line-height: 18px;
  670. color: #FFFFFF;
  671. background: #010101;
  672. padding: 0 24px;
  673. .item{
  674. display: flex;
  675. align-items: center;
  676. gap:6px;
  677. cursor: pointer;
  678. }
  679. .line{
  680. width: 1px;
  681. height: 16px;
  682. border-right: 1px solid #4C4C4C;
  683. }
  684. }
  685. }
  686. }
  687. .right {
  688. display: flex;
  689. flex-wrap: wrap;
  690. overflow: auto;
  691. gap: 26px;
  692. width: 100%;
  693. height: 62vh;
  694. margin-right: -60px;
  695. .item {
  696. height: 256px;
  697. width: 336px;
  698. cursor: pointer;
  699. .BG {
  700. width: 100%;
  701. height: 175px;
  702. }
  703. .infoBox {
  704. display: flex;
  705. align-items: center;
  706. gap: 12px;
  707. padding: 0 24px;
  708. height: 80px;
  709. border: 1px solid #010101;
  710. border-top: none;
  711. background: #FFFFFF;
  712. .avatar {
  713. width: 40px;
  714. height: 40px;
  715. border-radius: 50%;
  716. }
  717. .nameAndType {
  718. display: flex;
  719. flex-direction: column;
  720. gap: 2px;
  721. .name {
  722. font-weight: 700;
  723. font-size: 17px;
  724. line-height: 22px;
  725. color: #010101;
  726. }
  727. .typeBox {
  728. display: flex;
  729. align-items: center;
  730. gap: 10px;
  731. .type {
  732. width: fit-content;
  733. border: 1px solid #b3b3b3;
  734. font-weight: 400;
  735. font-size: 12px;
  736. line-height: 16px;
  737. color: #b3b3b3;
  738. padding: 0 4px;
  739. }
  740. }
  741. }
  742. }
  743. }
  744. }
  745. }
  746. }
  747. ::-webkit-scrollbar {
  748. width: 4px; /* 滚动条宽度 */
  749. }
  750. // /* 滚动条轨道 */
  751. // ::-webkit-scrollbar-track {
  752. // background: #f1f1f1; /* 轨道背景色 */
  753. // }
  754. /* 滚动条滑块 */
  755. ::-webkit-scrollbar-thumb {
  756. background: #888; /* 滑块背景色 */
  757. }
  758. /* 滚动条滑块悬停状态 */
  759. ::-webkit-scrollbar-thumb:hover {
  760. background: #555; /* 悬停状态下滑块背景色 */
  761. }
  762. </style>