HomeView.vue 21 KB

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