index.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934
  1. <template>
  2. <header class="head-wrap">
  3. <div class="head">
  4. <div class="left">
  5. <div
  6. class="logo-wrap"
  7. @click="router.push('/')"
  8. >
  9. <div class="logo"></div>
  10. </div>
  11. <div class="nav">
  12. <a
  13. class="item"
  14. :class="{
  15. active: router.currentRoute.value.path === '/',
  16. }"
  17. href="/"
  18. @click.prevent="router.push('/')"
  19. >
  20. {{ t('layout.home') }}
  21. </a>
  22. <a
  23. class="item"
  24. :class="{
  25. active: router.currentRoute.value.name === routerName.area,
  26. }"
  27. @click.prevent="router.push({ name: routerName.area })"
  28. >
  29. {{ t('layout.area') }}
  30. </a>
  31. <a
  32. class="item"
  33. :href="COMMON_URL.admin"
  34. @click.prevent="openToTarget(COMMON_URL.admin)"
  35. v-if="!isMobile()"
  36. >
  37. {{ t('layout.liveAdmin') }}
  38. </a>
  39. <span class="item">
  40. <Dropdown
  41. class="download"
  42. v-if="!isMobile()"
  43. >
  44. <template #btn>
  45. <div class="btn">
  46. <span>{{ t('layout.download') }}</span>
  47. <VPIconChevronDown class="icon"></VPIconChevronDown>
  48. </div>
  49. </template>
  50. <template #list>
  51. <div class="list">
  52. <a
  53. class="item"
  54. :href="COMMON_URL.androidApp"
  55. @click.prevent="openToTarget(COMMON_URL.androidApp)"
  56. >
  57. <div class="txt">{{ t('layout.android') }}</div>
  58. <VPIconExternalLink class="icon"></VPIconExternalLink>
  59. </a>
  60. <a
  61. class="item"
  62. @click.prevent="handleTip"
  63. >
  64. <div class="txt">{{ t('layout.ios') }}</div>
  65. </a>
  66. <a
  67. class="item"
  68. :href="COMMON_URL.windows"
  69. @click.prevent="openToTarget(COMMON_URL.windows)"
  70. >
  71. <div class="txt">{{ t('layout.windows') }}</div>
  72. <VPIconExternalLink class="icon"></VPIconExternalLink>
  73. </a>
  74. <a
  75. class="item"
  76. :href="COMMON_URL.macos"
  77. @click.prevent="openToTarget(COMMON_URL.macos)"
  78. >
  79. <div class="txt">{{ t('layout.macos') }}</div>
  80. <VPIconExternalLink class="icon"></VPIconExternalLink>
  81. </a>
  82. </div>
  83. </template>
  84. </Dropdown>
  85. <div class="badge">
  86. <div class="txt">new</div>
  87. </div>
  88. </span>
  89. <a
  90. class="item"
  91. @click.prevent="router.push({ name: routerName.remoteDesktop })"
  92. >
  93. {{ t('layout.remoteDesktop') }}
  94. <div class="badge">
  95. <div class="txt">stage</div>
  96. </div>
  97. </a>
  98. </div>
  99. </div>
  100. <div class="right">
  101. <Dropdown
  102. class="doc"
  103. v-if="!isMobile()"
  104. >
  105. <template #btn>
  106. <div class="btn">
  107. <span>{{ t('layout.doc') }}</span>
  108. <VPIconChevronDown class="icon"></VPIconChevronDown>
  109. </div>
  110. </template>
  111. <template #list>
  112. <div class="list">
  113. <a
  114. class="item"
  115. @click="handleTip"
  116. >
  117. <div class="txt">{{ t('layout.guide') }}</div>
  118. </a>
  119. <a
  120. class="item"
  121. :href="COMMON_URL.apifox"
  122. @click.prevent="openToTarget(COMMON_URL.apifox)"
  123. >
  124. <div class="txt">{{ t('layout.apiDoc') }}</div>
  125. <VPIconExternalLink class="icon"></VPIconExternalLink>
  126. </a>
  127. <a
  128. class="item"
  129. :href="COMMON_URL.bilibiliCollectiondetail"
  130. @click.prevent="
  131. openToTarget(COMMON_URL.bilibiliCollectiondetail)
  132. "
  133. >
  134. <div class="txt">{{ t('layout.bilibiliTutorial') }}</div>
  135. <VPIconExternalLink class="icon"></VPIconExternalLink>
  136. </a>
  137. <a
  138. class="item"
  139. :href="COMMON_URL.payCoursesArticle"
  140. @click.prevent="openToTarget(COMMON_URL.payCoursesArticle)"
  141. >
  142. <div class="txt">{{ t('layout.vipCourses') }}</div>
  143. <VPIconExternalLink class="icon"></VPIconExternalLink>
  144. </a>
  145. </div>
  146. </template>
  147. </Dropdown>
  148. <Dropdown
  149. class="ecosystem"
  150. v-if="!isMobile()"
  151. >
  152. <template #btn>
  153. <div class="btn">
  154. <span>{{ t('layout.ecosystem') }}</span>
  155. <VPIconChevronDown class="icon"></VPIconChevronDown>
  156. </div>
  157. </template>
  158. <template #list>
  159. <div class="list">
  160. <div class="title">{{ t('layout.resource') }}</div>
  161. <a
  162. v-for="(item, index) in resource"
  163. :key="index"
  164. :href="item.url"
  165. class="item"
  166. @click.prevent="handleJump(item)"
  167. >
  168. <div class="txt">{{ item.label }}</div>
  169. <VPIconExternalLink
  170. v-if="item.url"
  171. class="icon"
  172. ></VPIconExternalLink>
  173. </a>
  174. <div class="hr"></div>
  175. <div class="title">{{ t('layout.libraries') }}</div>
  176. <a
  177. v-for="(item, index) in plugins"
  178. :key="index"
  179. class="item"
  180. :href="item.url"
  181. @click.prevent="handleJump(item)"
  182. >
  183. <div class="txt">{{ item.label }}</div>
  184. <VPIconExternalLink
  185. v-if="item.url"
  186. class="icon"
  187. ></VPIconExternalLink>
  188. </a>
  189. </div>
  190. </template>
  191. </Dropdown>
  192. <Dropdown
  193. class="about"
  194. v-if="!isMobile()"
  195. >
  196. <template #btn>
  197. <div class="btn">
  198. <span>{{ t('layout.about') }}</span>
  199. <VPIconChevronDown class="icon"></VPIconChevronDown>
  200. </div>
  201. </template>
  202. <template #list>
  203. <div class="list">
  204. <a
  205. v-for="(item, index) in about"
  206. :key="index"
  207. class="item"
  208. :href="item.url"
  209. @click.prevent="
  210. item.routerName
  211. ? router.push({ name: item.routerName })
  212. : openToTarget(item.url)
  213. "
  214. >
  215. <div class="txt">{{ t(item.label) }}</div>
  216. <VPIconExternalLink
  217. v-if="item.url"
  218. class="icon"
  219. ></VPIconExternalLink>
  220. </a>
  221. </div>
  222. </template>
  223. </Dropdown>
  224. <a
  225. class="signin"
  226. @click="handleSignin"
  227. v-if="!isMobile()"
  228. >
  229. {{ t('layout.signin') }}
  230. <div
  231. class="red-dot"
  232. v-if="appStore.showSigninRedDot"
  233. ></div>
  234. </a>
  235. <a
  236. class="privatizationDeployment"
  237. :class="{
  238. active:
  239. router.currentRoute.value.name ===
  240. routerName.privatizationDeployment,
  241. }"
  242. href="/privatizationDeployment"
  243. @click.prevent="
  244. router.push({ name: routerName.privatizationDeployment })
  245. "
  246. v-if="!isMobile()"
  247. >
  248. {{ t('layout.deploy') }}
  249. <div class="badge">
  250. <div class="txt">hot</div>
  251. </div>
  252. </a>
  253. <a
  254. class="videoTools"
  255. :class="{
  256. active: router.currentRoute.value.name === routerName.videoTools,
  257. }"
  258. href="/videoTools"
  259. @click.prevent="router.push({ name: routerName.videoTools })"
  260. v-if="!isMobile()"
  261. >
  262. {{ t('layout.videoTools') }}
  263. <div class="badge">
  264. <div class="txt">beta</div>
  265. </div>
  266. </a>
  267. <a
  268. class="github"
  269. target="_blank"
  270. href="https://github.com/galaxy-s10/billd-live"
  271. >
  272. <img
  273. :src="githubStar"
  274. alt=""
  275. />
  276. </a>
  277. <Dropdown class="start-live">
  278. <template #btn>
  279. <div class="btn">{{ t('layout.startLive') }}</div>
  280. </template>
  281. <template #list>
  282. <div class="list">
  283. <a
  284. class="item"
  285. @click.prevent="handleStartLive(LiveRoomTypeEnum.srs)"
  286. >
  287. <div class="txt">{{ t('layout.srsLive') }}</div>
  288. </a>
  289. <a
  290. class="item"
  291. @click.prevent="handleStartLive(LiveRoomTypeEnum.wertc_live)"
  292. >
  293. <div class="txt">{{ t('layout.webrtcLive') }}</div>
  294. </a>
  295. <a
  296. class="item"
  297. @click.prevent="
  298. handleStartLive(LiveRoomTypeEnum.wertc_meeting_one)
  299. "
  300. >
  301. <div class="txt">{{ t('layout.webrtcMeeting') }}</div>
  302. </a>
  303. <a
  304. class="item"
  305. @click.prevent="handleStartLive(LiveRoomTypeEnum.msr)"
  306. >
  307. <div class="txt">{{ t('layout.msrLive') }}</div>
  308. </a>
  309. <a
  310. class="item"
  311. @click.prevent="handleStartLive(LiveRoomTypeEnum.pk)"
  312. >
  313. <div class="txt">{{ t('layout.pkLive') }}</div>
  314. </a>
  315. <a
  316. class="item"
  317. @click.prevent="handleStartLive(LiveRoomTypeEnum.tencent_css)"
  318. >
  319. <div class="txt">{{ t('layout.tencentCssLive') }}</div>
  320. </a>
  321. <a
  322. class="item"
  323. @click.prevent="
  324. handleStartLive(LiveRoomTypeEnum.tencent_css_pk)
  325. "
  326. >
  327. <div class="txt">{{ t('layout.tencentCssPkLive') }}</div>
  328. </a>
  329. <div class="tip">
  330. <div
  331. class="tip-txt"
  332. @click="handleWebsiteJump"
  333. >
  334. 有什么区别?
  335. </div>
  336. </div>
  337. </div>
  338. </template>
  339. </Dropdown>
  340. <div
  341. v-if="!userStore.userInfo"
  342. class="qqlogin"
  343. @click="appStore.showLoginModal = true"
  344. >
  345. <div class="btn">{{ t('layout.login') }}</div>
  346. </div>
  347. <Dropdown
  348. v-else
  349. class="qqlogin"
  350. >
  351. <template #btn>
  352. <div
  353. class="btn"
  354. :style="{ backgroundImage: `url(${userStore.userInfo.avatar})` }"
  355. ></div>
  356. </template>
  357. <template #list>
  358. <div class="list">
  359. <a
  360. class="item"
  361. @click.prevent="
  362. router.push({
  363. name: routerName.profile,
  364. params: {
  365. userId: userStore.userInfo.id,
  366. },
  367. })
  368. "
  369. >
  370. <div class="txt">{{ t('layout.profile') }}</div>
  371. </a>
  372. <a
  373. class="item"
  374. @click.prevent="handleLogout"
  375. >
  376. <div class="txt">{{ t('layout.logout') }}</div>
  377. </a>
  378. </div>
  379. </template>
  380. </Dropdown>
  381. <Dropdown
  382. class="switch-lang"
  383. v-if="!isMobile()"
  384. >
  385. <template #btn>
  386. <div class="btn">
  387. {{ localeMap[locale] }}
  388. <VPIconChevronDown class="icon"></VPIconChevronDown>
  389. </div>
  390. </template>
  391. <template #list>
  392. <div class="list">
  393. <a
  394. class="item"
  395. v-for="(item, index) in localeMap"
  396. :key="index"
  397. :class="{ active: item === localeMap[locale] }"
  398. @click="locale = index"
  399. >
  400. <div class="txt">{{ item }}</div>
  401. </a>
  402. </div>
  403. </template>
  404. </Dropdown>
  405. </div>
  406. </div>
  407. </header>
  408. </template>
  409. <script lang="ts" setup>
  410. import { isMobile, openToTarget, windowReload } from 'billd-utils';
  411. import { onMounted, ref, watch } from 'vue';
  412. import { useI18n } from 'vue-i18n';
  413. import { useRouter } from 'vue-router';
  414. import { fetchCreateSignin, fetchTodayIsSignin } from '@/api/signin';
  415. import Dropdown from '@/components/Dropdown/index.vue';
  416. import VPIconChevronDown from '@/components/icons/VPIconChevronDown.vue';
  417. import VPIconExternalLink from '@/components/icons/VPIconExternalLink.vue';
  418. import { COMMON_URL, DEFAULT_AUTH_INFO } from '@/constant';
  419. import { handleTip } from '@/hooks/use-common';
  420. import { loginTip } from '@/hooks/use-login';
  421. import { routerName } from '@/router';
  422. import { useAppStore } from '@/store/app';
  423. import { useUserStore } from '@/store/user';
  424. import { LiveRoomTypeEnum } from '@/types/ILiveRoom';
  425. const { t, locale } = useI18n();
  426. const router = useRouter();
  427. const userStore = useUserStore();
  428. const appStore = useAppStore();
  429. const githubStar = ref('');
  430. const localeMap = {
  431. zh: '中文',
  432. en: 'English',
  433. };
  434. const about = ref([
  435. {
  436. label: 'layout.faq',
  437. routerName: routerName.faq,
  438. url: '',
  439. },
  440. {
  441. label: 'layout.team',
  442. routerName: routerName.team,
  443. url: '',
  444. },
  445. {
  446. label: 'layout.sponsor',
  447. routerName: routerName.sponsors,
  448. url: '',
  449. },
  450. {
  451. label: 'layout.officialGroup',
  452. routerName: routerName.group,
  453. url: '',
  454. },
  455. {
  456. label: 'layout.release',
  457. routerName: routerName.release,
  458. url: '',
  459. },
  460. ]);
  461. const resource = ref([
  462. {
  463. label: 'billd-live',
  464. url: 'https://github.com/galaxy-s10/billd-live',
  465. },
  466. {
  467. label: 'billd-desk',
  468. url: 'https://github.com/galaxy-s10/billd-desk',
  469. },
  470. {
  471. label: 'billd-live-server',
  472. url: 'https://github.com/galaxy-s10/billd-live-server',
  473. },
  474. {
  475. label: 'billd-live-admin',
  476. url: 'https://github.com/galaxy-s10/billd-live-admin',
  477. },
  478. {
  479. label: 'billd-live-kotlin',
  480. url: 'https://github.com/galaxy-s10/billd-live-kotlin',
  481. },
  482. {
  483. label: 'billd-live-flutter',
  484. url: 'https://github.com/galaxy-s10/billd-live-flutter',
  485. },
  486. {
  487. label: 'billd-live-react-native',
  488. url: 'https://github.com/galaxy-s10/billd-live-react-native',
  489. },
  490. ]);
  491. const plugins = ref([
  492. {
  493. label: 'billd-ui',
  494. url: 'https://github.com/galaxy-s10/billd-ui',
  495. },
  496. {
  497. label: 'billd-cli',
  498. url: 'https://github.com/galaxy-s10/billd-cli',
  499. },
  500. {
  501. label: 'billd-deploy',
  502. url: 'https://github.com/galaxy-s10/billd-deploy',
  503. },
  504. {
  505. label: 'billd-utils',
  506. url: 'https://github.com/galaxy-s10/billd-utils',
  507. },
  508. {
  509. label: 'billd-scss',
  510. url: 'https://github.com/galaxy-s10/billd-scss',
  511. },
  512. {
  513. label: 'billd-html-webpack-plugin',
  514. url: 'https://github.com/galaxy-s10/billd-html-webpack-plugin',
  515. },
  516. ]);
  517. watch(
  518. () => userStore.userInfo?.id,
  519. (newval) => {
  520. if (newval) {
  521. initSigninStatus();
  522. }
  523. },
  524. {
  525. immediate: true,
  526. }
  527. );
  528. async function handleSignin() {
  529. const res = await fetchCreateSignin({});
  530. if (res.code === 200) {
  531. appStore.showSigninRedDot = false;
  532. // eslint-disable-next-line
  533. window.$message.success(`签到成功!已连续签到${res.data.nums}天`);
  534. }
  535. }
  536. async function initSigninStatus() {
  537. const res = await fetchTodayIsSignin({
  538. liveRoomId: appStore.liveRoomInfo?.id,
  539. });
  540. if (res.code === 200) {
  541. if (res.data) {
  542. appStore.showSigninRedDot = false;
  543. } else {
  544. appStore.showSigninRedDot = true;
  545. }
  546. }
  547. }
  548. function handleLogout() {
  549. userStore.logout();
  550. setTimeout(() => {
  551. windowReload();
  552. }, 500);
  553. }
  554. function handleJump(item) {
  555. if (item.url) {
  556. openToTarget(item.url);
  557. } else {
  558. handleTip();
  559. }
  560. }
  561. onMounted(() => {
  562. githubStar.value =
  563. 'https://img.shields.io/github/stars/galaxy-s10/billd-live?label=Star&logo=GitHub&labelColor=white&logoColor=black&style=social&cacheSeconds=3600';
  564. });
  565. function handleStartLive(key: LiveRoomTypeEnum) {
  566. if (!loginTip()) {
  567. return;
  568. }
  569. if (
  570. key === LiveRoomTypeEnum.msr &&
  571. !userStore.userInfo?.auths?.find(
  572. (v) => v.auth_value === DEFAULT_AUTH_INFO.LIVE_PULL_SVIP.auth_value
  573. )
  574. ) {
  575. window.$message.info('权限不足,请更换其他开播方式');
  576. return;
  577. }
  578. const url = router.resolve({
  579. name: routerName.push,
  580. query: { liveType: key },
  581. });
  582. openToTarget(url.href);
  583. }
  584. function handleWebsiteJump() {
  585. const url = router.resolve({
  586. name: routerName.pushStreamDifferent,
  587. });
  588. openToTarget(url.href);
  589. }
  590. </script>
  591. <style lang="scss" scoped>
  592. .head-wrap {
  593. position: fixed;
  594. top: 0;
  595. left: 0;
  596. z-index: 50;
  597. box-sizing: border-box;
  598. // min-width: $w-1100;
  599. width: 100%;
  600. background-color: #fff;
  601. .head {
  602. display: flex;
  603. align-items: center;
  604. justify-content: space-between;
  605. padding: 0 30px;
  606. height: $layout-head-h;
  607. box-shadow: inset 0 -1px #f1f2f3 !important;
  608. font-size: 15px;
  609. .badge {
  610. position: absolute;
  611. top: -10px;
  612. right: -10px;
  613. padding: 0 2px;
  614. border-radius: 4px;
  615. background-color: red;
  616. color: white;
  617. line-height: 1;
  618. .txt {
  619. transform-origin: top !important;
  620. @include minFont(10);
  621. }
  622. }
  623. .red-dot {
  624. position: absolute;
  625. top: -5px;
  626. right: -5px;
  627. width: 6px;
  628. height: 6px;
  629. border-radius: 50%;
  630. background-color: red;
  631. }
  632. .hr {
  633. width: 100%;
  634. height: 1px;
  635. background-color: #e7e7e7;
  636. }
  637. .left {
  638. display: flex;
  639. align-items: center;
  640. height: 100%;
  641. .logo-wrap {
  642. display: flex;
  643. align-items: center;
  644. margin-right: 20px;
  645. cursor: pointer;
  646. .logo {
  647. width: 90px;
  648. height: 56px;
  649. @include setBackground('@/assets/img/logo-txt.png');
  650. }
  651. }
  652. .nav {
  653. display: flex;
  654. align-items: center;
  655. height: 100%;
  656. .item {
  657. position: relative;
  658. display: flex;
  659. align-items: center;
  660. margin-right: 20px;
  661. color: black;
  662. text-decoration: none;
  663. cursor: pointer;
  664. &.active {
  665. &::after {
  666. position: absolute;
  667. top: calc(50% - 8px);
  668. right: -5px;
  669. width: 5px;
  670. height: 5px;
  671. border-radius: 50%;
  672. background-color: $theme-color-gold;
  673. content: '';
  674. transition: all 0.1s ease;
  675. transform: translateY(-100%);
  676. }
  677. }
  678. &:hover {
  679. color: $theme-color-gold;
  680. }
  681. }
  682. }
  683. }
  684. .download,
  685. .doc,
  686. .about,
  687. .ecosystem {
  688. &:hover {
  689. color: $theme-color-gold;
  690. }
  691. .btn {
  692. display: flex;
  693. align-items: center;
  694. .icon {
  695. margin-left: 5px;
  696. width: 13px;
  697. fill: currentColor;
  698. }
  699. &:hover {
  700. color: $theme-color-gold;
  701. }
  702. }
  703. .list {
  704. width: 150px;
  705. padding: 10px 0;
  706. .item {
  707. display: flex;
  708. align-items: center;
  709. margin-bottom: 5px;
  710. padding: 0 15px;
  711. color: black;
  712. text-decoration: none;
  713. cursor: pointer;
  714. &:hover {
  715. color: $theme-color-gold;
  716. }
  717. .icon {
  718. margin-left: 5px;
  719. width: 14px;
  720. color: #3c3c4354;
  721. fill: currentColor;
  722. }
  723. }
  724. }
  725. }
  726. .right {
  727. display: flex;
  728. align-items: center;
  729. height: 100%;
  730. .doc,
  731. .about,
  732. .ecosystem {
  733. margin-right: 20px;
  734. }
  735. & > :last-child {
  736. margin-right: 0 !important;
  737. }
  738. .ecosystem {
  739. .list {
  740. width: 225px;
  741. padding: 10px 0;
  742. .title {
  743. margin: 10px 0 5px;
  744. padding: 0 15px;
  745. color: rgba(60, 60, 60, 0.33);
  746. &:first-child {
  747. margin-top: 0;
  748. }
  749. }
  750. }
  751. }
  752. .github,
  753. .sponsors,
  754. .privatizationDeployment,
  755. .videoTools,
  756. .signin {
  757. display: flex;
  758. align-items: center;
  759. margin-right: 20px;
  760. color: black;
  761. text-decoration: none;
  762. cursor: pointer;
  763. &:hover {
  764. color: $theme-color-gold;
  765. }
  766. }
  767. .videoTools,
  768. .privatizationDeployment,
  769. .signin {
  770. position: relative;
  771. }
  772. .start-live {
  773. margin-right: 20px;
  774. .btn {
  775. padding: 5px 15px;
  776. border-radius: 6px;
  777. background-color: $theme-color-gold;
  778. color: white;
  779. font-size: 13px;
  780. cursor: pointer;
  781. }
  782. .list {
  783. width: 180px;
  784. position: relative;
  785. padding: 10px 0;
  786. .item {
  787. display: flex;
  788. align-items: center;
  789. margin-bottom: 5px;
  790. padding: 0 15px;
  791. cursor: pointer;
  792. &:hover {
  793. color: $theme-color-gold;
  794. }
  795. &.disabled {
  796. color: initial !important;
  797. opacity: 0.5;
  798. cursor: not-allowed;
  799. }
  800. }
  801. .tip {
  802. display: flex;
  803. justify-content: flex-end;
  804. padding-right: 6px;
  805. color: rgba(60, 60, 60, 0.7);
  806. font-size: 12px;
  807. .tip-txt {
  808. cursor: pointer;
  809. }
  810. }
  811. }
  812. }
  813. .qqlogin {
  814. margin-right: 20px;
  815. .btn {
  816. display: flex;
  817. align-items: center;
  818. justify-content: center;
  819. box-sizing: border-box;
  820. width: 35px;
  821. height: 35px;
  822. border-radius: 50%;
  823. background-color: papayawhip;
  824. font-size: 12px;
  825. cursor: pointer;
  826. @extend %containBg;
  827. }
  828. .list {
  829. width: 90px;
  830. padding: 10px 0;
  831. .item {
  832. position: relative;
  833. display: flex;
  834. padding: 0 15px;
  835. cursor: pointer;
  836. &:hover {
  837. color: $theme-color-gold;
  838. }
  839. }
  840. }
  841. }
  842. .switch-lang {
  843. .btn {
  844. display: flex;
  845. align-items: center;
  846. .icon {
  847. margin-left: 5px;
  848. width: 13px;
  849. fill: currentColor;
  850. }
  851. }
  852. .list {
  853. width: 80px;
  854. padding: 10px 0;
  855. .item {
  856. display: flex;
  857. align-items: center;
  858. margin-bottom: 5px;
  859. padding: 0 15px;
  860. cursor: pointer;
  861. &:hover,
  862. &.active {
  863. color: $theme-color-gold;
  864. }
  865. &.disabled {
  866. color: initial !important;
  867. opacity: 0.5;
  868. cursor: not-allowed;
  869. }
  870. }
  871. }
  872. }
  873. }
  874. }
  875. }
  876. </style>