sidebar.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726
  1. <template>
  2. <div class="sidebar-component sticky-top d-none d-md-block">
  3. <!-- <input type="file" class="d-none" ref="avatarUpdateRef" @change="handleAvatarUpdate()"> -->
  4. <!-- <div class="card shadow-sm mb-3 cursor-pointer" style="border-radius: 15px;" @click="gotoMyProfile()"> -->
  5. <div class="card shadow-sm mb-3" style="border-radius: 15px;">
  6. <div class="card-body p-2">
  7. <div class="media user-card user-select-none">
  8. <div style="position: relative;">
  9. <img :src="user.avatar" class="avatar shadow cursor-pointer" draggable="false" onerror="this.onerror=null;this.src='/storage/avatars/default.png?v=0';" @click="gotoMyProfile()">
  10. <button class="btn btn-light btn-sm avatar-update-btn" @click="updateAvatar()">
  11. <span class="avatar-update-btn-icon"></span>
  12. </button>
  13. </div>
  14. <div class="media-body">
  15. <p class="display-name" v-html="getDisplayName()"></p>
  16. <p class="username primary">&commat;{{ user.username }}</p>
  17. <p class="stats">
  18. <span class="stats-following">
  19. <span class="following-count">{{ formatCount(user.following_count) }}</span> Following
  20. </span>
  21. <span class="stats-followers">
  22. <span class="followers-count">{{ formatCount(user.followers_count) }}</span> Followers
  23. </span>
  24. </p>
  25. </div>
  26. </div>
  27. </div>
  28. </div>
  29. <div class="btn-group btn-group-lg btn-block mb-4">
  30. <!-- <button type="button" class="btn btn-outline-primary btn-block font-weight-bold" style="border-top-left-radius: 18px;border-bottom-left-radius:18px;font-size:18px;font-weight:300!important" @click="createNewPost()">
  31. <i class="fal fa-arrow-circle-up mr-1"></i> {{ $t('navmenu.compose') }} Post
  32. </button> -->
  33. <router-link to="/i/web/compose" class="btn btn-primary btn-block font-weight-bold">
  34. <i class="fal fa-arrow-circle-up mr-1"></i> {{ $t('navmenu.compose') }} Post
  35. </router-link>
  36. <button type="button" class="btn btn-outline-primary dropdown-toggle dropdown-toggle-split" data-toggle="dropdown" aria-expanded="false">
  37. <span class="sr-only">Toggle Dropdown</span>
  38. </button>
  39. <div class="dropdown-menu dropdown-menu-right">
  40. <a class="dropdown-item font-weight-bold" href="/i/collections/create">Create Collection</a>
  41. <a v-if="hasStories" class="dropdown-item font-weight-bold" href="/i/stories/new">Create Story</a>
  42. <div class="dropdown-divider"></div>
  43. <a class="dropdown-item font-weight-bold" href="/settings/home">Account Settings</a>
  44. </div>
  45. </div>
  46. <!-- <router-link to="/i/web/compose" class="btn btn-primary btn-lg btn-block mb-4 shadow-sm font-weight-bold">
  47. <i class="far fa-plus-square mr-1"></i> {{ $t('navmenu.compose') }}
  48. </router-link> -->
  49. <div class="sidebar-sticky shadow-sm">
  50. <ul class="nav flex-column">
  51. <li class="nav-item">
  52. <div class="d-flex justify-content-between align-items-center">
  53. <!-- <router-link class="nav-link text-center" to="/i/web">
  54. <div class="icon text-lighter"><i class="far fa-home fa-lg"></i></div>
  55. <div class="small">{{ $t('navmenu.homeFeed') }}</div>
  56. </router-link> -->
  57. <a
  58. class="nav-link text-center"
  59. href="/i/web"
  60. :class="[ $route.path == '/i/web' ? 'router-link-exact-active active' : '' ]"
  61. @click.prevent="goToFeed('home')">
  62. <div class="icon text-lighter"><i class="far fa-home fa-lg"></i></div>
  63. <div class="small">{{ $t('navmenu.homeFeed') }}</div>
  64. </a>
  65. <!-- <router-link v-if="hasLocalTimeline" class="nav-link text-center" :to="{ name: 'timeline', params: { scope: 'local' } }">
  66. <div class="icon text-lighter"><i class="fas fa-stream fa-lg"></i></div>
  67. <div class="small">{{ $t('navmenu.localFeed') }}</div>
  68. </router-link> -->
  69. <a
  70. v-if="hasLocalTimeline"
  71. class="nav-link text-center"
  72. href="/i/web/timeline/local"
  73. :class="[ $route.path == '/i/web/timeline/local' ? 'router-link-exact-active active' : '' ]"
  74. @click.prevent="goToFeed('local')">
  75. <div class="icon text-lighter"><i class="fas fa-stream fa-lg"></i></div>
  76. <div class="small">{{ $t('navmenu.localFeed') }}</div>
  77. </a>
  78. <!-- <router-link v-if="hasNetworkTimeline" class="nav-link text-center" :to="{ name: 'timeline', params: { scope: 'global' } }">
  79. <div class="icon text-lighter"><i class="far fa-globe fa-lg"></i></div>
  80. <div class="small">{{ $t('navmenu.globalFeed') }}</div>
  81. </router-link> -->
  82. <a
  83. v-if="hasNetworkTimeline"
  84. class="nav-link text-center"
  85. href="/i/web/timeline/global"
  86. :class="[ $route.path == '/i/web/timeline/global' ? 'router-link-exact-active active' : '' ]"
  87. @click.prevent="goToFeed('global')">
  88. <div class="icon text-lighter"><i class="far fa-globe fa-lg"></i></div>
  89. <div class="small">{{ $t('navmenu.globalFeed') }}</div>
  90. </a>
  91. </div>
  92. <hr class="mb-0" style="margin-top: -5px;opacity: 0.4;" />
  93. </li>
  94. <!-- <li class="nav-item">
  95. </li>
  96. <li class="nav-item">
  97. </li> -->
  98. <!-- <li v-for="(link, index) in links" class="nav-item">
  99. <router-link class="nav-link" :to="link.path">
  100. <span v-if="link.icon" class="icon text-lighter"><i :class="[ link.icon ]"></i></span>
  101. {{ link.name }}
  102. </router-link>
  103. </li> -->
  104. <li class="nav-item">
  105. <router-link class="nav-link" to="/i/web/discover">
  106. <span class="icon text-lighter"><i class="far fa-compass"></i></span>
  107. {{ $t('navmenu.discover') }}
  108. </router-link>
  109. </li>
  110. <li class="nav-item">
  111. <router-link class="nav-link d-flex justify-content-between align-items-center" to="/i/web/direct">
  112. <span>
  113. <span class="icon text-lighter">
  114. <i class="far fa-envelope"></i>
  115. </span>
  116. {{ $t('navmenu.directMessages') }}
  117. </span>
  118. <!-- <span class="badge badge-danger font-weight-light rounded-pill px-2" style="transform:scale(0.86)">99+</span> -->
  119. </router-link>
  120. </li>
  121. <!-- <li class="nav-item">
  122. <router-link class="nav-link" to="/i/web/groups">
  123. <span class="icon text-lighter"><i class="far fa-layer-group"></i></span>
  124. {{ $t('navmenu.groups') }}
  125. </router-link>
  126. </li> -->
  127. <li v-if="hasLiveStreams" class="nav-item">
  128. <router-link class="nav-link d-flex justify-content-between align-items-center" to="/i/web/livestreams">
  129. <span>
  130. <span class="icon text-lighter">
  131. <i class="far fa-record-vinyl"></i>
  132. </span>
  133. Livestreams
  134. </span>
  135. </router-link>
  136. </li>
  137. <li class="nav-item">
  138. <router-link class="nav-link d-flex justify-content-between align-items-center" to="/i/web/notifications">
  139. <span>
  140. <span class="icon text-lighter">
  141. <i class="far fa-bell"></i>
  142. </span>
  143. {{ $t('navmenu.notifications') }}
  144. </span>
  145. <!-- <span class="badge badge-danger font-weight-light rounded-pill px-2" style="transform:scale(0.86)">99+</span> -->
  146. </router-link>
  147. </li>
  148. <li class="nav-item">
  149. <hr class="mt-n1" style="opacity: 0.4;margin-bottom: 0;" />
  150. <router-link class="nav-link" :to="'/i/web/profile/' + user.id">
  151. <span class="icon text-lighter">
  152. <i class="far fa-user"></i>
  153. </span>
  154. {{ $t('navmenu.profile') }}
  155. </router-link>
  156. <!-- <router-link class="nav-link" to="/i/web/settings">
  157. <span class="icon text-lighter">
  158. <i class="far fa-cog"></i>
  159. </span>
  160. {{ $t('navmenu.settings') }}
  161. </router-link> -->
  162. </li>
  163. <!-- <li class="nav-item">
  164. <router-link class="nav-link" to="/i/web/drive">
  165. <span class="icon text-lighter">
  166. <i class="far fa-cloud-upload"></i>
  167. </span>
  168. {{ $t('navmenu.drive') }}
  169. </router-link>
  170. </li> -->
  171. <!-- <li class="nav-item">
  172. <router-link class="nav-link" to="/i/web/settings">
  173. <span class="icon text-lighter">
  174. <i class="fas fa-cog"></i>
  175. </span>
  176. {{ $t('navmenu.settings') }}
  177. </router-link>
  178. </li>
  179. <li class="nav-item">
  180. <a class="nav-link" href="/i/web/help">
  181. <span class="icon text-lighter">
  182. <i class="fas fa-info-circle"></i>
  183. </span>
  184. Help
  185. </a>
  186. </li> -->
  187. <li v-if="user.is_admin" class="nav-item">
  188. <hr class="mt-n1" style="opacity: 0.4;margin-bottom: 0;" />
  189. <a class="nav-link" href="/i/admin/dashboard">
  190. <span class="icon text-lighter">
  191. <i class="far fa-tools"></i>
  192. </span>
  193. {{ $t('navmenu.admin') }}
  194. </a>
  195. </li>
  196. <li class="nav-item">
  197. <hr class="mt-n1" style="opacity: 0.4;margin-bottom: 0;" />
  198. <a class="nav-link" href="/?force_old_ui=1">
  199. <span class="icon text-lighter">
  200. <i class="fas fa-chevron-left"></i>
  201. </span>
  202. {{ $t('navmenu.backToPreviousDesign') }}
  203. </a>
  204. </li>
  205. <!-- <li class="nav-item">
  206. <router-link class="nav-link" to="/i/web/?a=feed">
  207. <span class="fas fa-stream pr-2 text-lighter"></span>
  208. Feed
  209. </router-link>
  210. </li>
  211. <li class="nav-item">
  212. <router-link class="nav-link" to="/i/web/discover">
  213. <span class="fas fa-compass pr-2 text-lighter"></span>
  214. Discover
  215. </router-link>
  216. </li>
  217. <li class="nav-item">
  218. <router-link class="nav-link" to="/i/web/stories">
  219. <span class="fas fa-history pr-2 text-lighter"></span>
  220. Stories
  221. </router-link>
  222. </li> -->
  223. </ul>
  224. </div>
  225. <!-- <div class="sidebar-sitelinks">
  226. <a href="/site/about">{{ $t('navmenu.about') }}</a>
  227. <a href="/site/language">{{ $t('navmenu.language') }}</a>
  228. <a href="/site/terms">{{ $t('navmenu.privacy') }}</a>
  229. <a href="/site/terms">{{ $t('navmenu.terms') }}</a>
  230. </div> -->
  231. <div class="sidebar-attribution pr-3 d-flex justify-content-between align-items-center">
  232. <router-link to="/i/web/language">
  233. <i class="fal fa-language fa-2x" alt="Select a language"></i>
  234. </router-link>
  235. <a href="/site/help" class="font-weight-bold">{{ $t('navmenu.help') }}</a>
  236. <a href="/site/privacy" class="font-weight-bold">{{ $t('navmenu.privacy') }}</a>
  237. <a href="/site/terms" class="font-weight-bold">{{ $t('navmenu.terms') }}</a>
  238. <a href="https://pixelfed.org" class="font-weight-bold powered-by">Powered by Pixelfed</a>
  239. </div>
  240. <!-- <b-modal
  241. ref="avatarUpdateModal"
  242. centered
  243. hide-footer
  244. header-class="py-2"
  245. body-class="p-0"
  246. title-class="w-100 text-center pl-4 font-weight-bold"
  247. title-tag="p"
  248. title="Upload Avatar"
  249. >
  250. <div class="d-flex align-items-center justify-content-center">
  251. <div
  252. v-if="avatarUpdateIndex === 0"
  253. class="py-5 user-select-none cursor-pointer"
  254. @click="avatarUpdateStep(0)">
  255. <p class="text-center primary">
  256. <i class="fal fa-cloud-upload fa-3x"></i>
  257. </p>
  258. <p class="text-center lead">Drag photo here or click here</p>
  259. <p class="text-center small text-muted mb-0">Must be a <strong>png</strong> or <strong>jpg</strong> image up to 2MB</p>
  260. </div>
  261. <div v-else-if="avatarUpdateIndex === 1" class="w-100 p-5">
  262. <div class="d-md-flex justify-content-between align-items-center">
  263. <div class="text-center mb-4">
  264. <p class="small font-weight-bold" style="opacity:0.7;">Current</p>
  265. <img :src="user.avatar" class="shadow" style="width: 150px;height: 150px;object-fit: cover;border-radius: 18px;opacity: 0.7;">
  266. </div>
  267. <div class="text-center mb-4">
  268. <p class="font-weight-bold">New</p>
  269. <img :src="avatarUpdateFile" class="shadow" style="width: 220px;height: 220px;object-fit: cover;border-radius: 18px;">
  270. </div>
  271. </div>
  272. <hr>
  273. <div class="d-flex justify-content-between">
  274. <button class="btn btn-light font-weight-bold btn-block mr-3" @click="avatarUpdateClose()">Cancel</button>
  275. <button class="btn btn-primary primary font-weight-bold btn-block mt-0">Upload</button>
  276. </div>
  277. </div>
  278. </div>
  279. </b-modal> -->
  280. <!-- <b-modal
  281. ref="createPostModal"
  282. centered
  283. hide-footer
  284. header-class="py-2"
  285. body-class="p-0 w-100 h-100"
  286. title-class="w-100 text-center pl-4 font-weight-bold"
  287. title-tag="p"
  288. title="Create New Post"
  289. >
  290. <compose-simple />
  291. </b-modal> -->
  292. <update-avatar ref="avatarUpdate" :user="user" />
  293. </div>
  294. </template>
  295. <script type="text/javascript">
  296. import { mapGetters } from 'vuex'
  297. // import ComposeSimple from './../sections/ComposeSimple.vue';
  298. import UpdateAvatar from './modal/UpdateAvatar.vue';
  299. export default {
  300. props: {
  301. user: {
  302. type: Object,
  303. default: (function() {
  304. return {
  305. avatar: '/storage/avatars/default.jpg',
  306. username: false,
  307. display_name: '',
  308. following_count: 0,
  309. followers_count: 0
  310. };
  311. })
  312. },
  313. links: {
  314. type: Array,
  315. default: function() {
  316. return [
  317. // {
  318. // name: "Home",
  319. // path: "/i/web",
  320. // icon: "fas fa-home"
  321. // },
  322. // {
  323. // name: "Local",
  324. // path: "/i/web/timeline/local",
  325. // icon: "fas fa-stream"
  326. // },
  327. // {
  328. // name: "Global",
  329. // path: "/i/web/timeline/global",
  330. // icon: "far fa-globe"
  331. // },
  332. // {
  333. // name: "Audiences",
  334. // path: "/i/web/discover",
  335. // icon: "far fa-circle-notch"
  336. // },
  337. {
  338. name: "Discover",
  339. path: "/i/web/discover",
  340. icon: "fas fa-compass"
  341. },
  342. // {
  343. // name: "Events",
  344. // path: "/i/events",
  345. // icon: "far fa-calendar-alt"
  346. // },
  347. {
  348. name: "Groups",
  349. path: "/i/web/groups",
  350. icon: "far fa-user-friends"
  351. },
  352. // {
  353. // name: "Live",
  354. // path: "/i/web/?t=live",
  355. // icon: "far fa-play"
  356. // },
  357. // {
  358. // name: "Marketplace",
  359. // path: "/i/web/marketplace",
  360. // icon: "far fa-shopping-cart"
  361. // },
  362. // {
  363. // name: "Stories",
  364. // path: "/i/web/?t=stories",
  365. // icon: "fas fa-history"
  366. // },
  367. {
  368. name: "Videos",
  369. path: "/i/web/videos",
  370. icon: "far fa-video"
  371. }
  372. ];
  373. }
  374. }
  375. },
  376. components: {
  377. // ComposeSimple,
  378. UpdateAvatar
  379. },
  380. computed: {
  381. ...mapGetters([
  382. 'getCustomEmoji'
  383. ])
  384. },
  385. data() {
  386. return {
  387. loaded: false,
  388. hasLocalTimeline: true,
  389. hasNetworkTimeline: false,
  390. hasLiveStreams: false,
  391. hasStories: false,
  392. }
  393. },
  394. mounted() {
  395. if(window.App.config.features.hasOwnProperty('timelines')) {
  396. this.hasLocalTimeline = App.config.features.timelines.local;
  397. this.hasNetworkTimeline = App.config.features.timelines.network;
  398. //this.hasLiveStreams = App.config.ab.hls == true;
  399. }
  400. if(window.App.config.features.hasOwnProperty('stories')) {
  401. this.hasStories = App.config.features.stories;
  402. }
  403. // if(!this.user.username) {
  404. // this.user = window._sharedData.user;
  405. // }
  406. // setTimeout(() => {
  407. // this.user = window._sharedData.curUser;
  408. // this.loaded = true;
  409. // }, 300);
  410. },
  411. methods: {
  412. getDisplayName() {
  413. let self = this;
  414. let profile = this.user;
  415. let dn = profile.display_name;
  416. if(!dn) {
  417. return profile.username;
  418. }
  419. if(dn.includes(':')) {
  420. let re = /(<a?)?:\w+:(\d{18}>)?/g;
  421. let un = dn.replaceAll(re, function(em) {
  422. let shortcode = em.slice(1, em.length - 1);
  423. let emoji = self.getCustomEmoji.filter(e => {
  424. return e.shortcode == shortcode;
  425. });
  426. return emoji.length ? `<img draggable="false" class="emojione custom-emoji" alt="${emoji[0].shortcode}" title="${emoji[0].shortcode}" src="${emoji[0].url}" data-original="${emoji[0].url}" data-static="${emoji[0].static_url}" width="16" height="16" onerror="this.onerror=null;this.src='/storage/emoji/missing.png';" />`: em;
  427. });
  428. return un;
  429. } else {
  430. return dn;
  431. }
  432. },
  433. gotoMyProfile() {
  434. let user = this.user;
  435. this.$router.push({
  436. name: 'profile',
  437. path: `/i/web/profile/${user.id}`,
  438. params: {
  439. id: user.id,
  440. cachedProfile: user,
  441. cachedUser: user
  442. }
  443. })
  444. },
  445. formatCount(count = 0, locale = 'en-GB', notation = 'compact') {
  446. return new Intl.NumberFormat(locale, { notation: notation , compactDisplay: "short" }).format(count);
  447. },
  448. updateAvatar() {
  449. event.currentTarget.blur();
  450. // swal('update avatar', 'test', 'success');
  451. this.$refs.avatarUpdate.open();
  452. },
  453. createNewPost() {
  454. this.$refs.createPostModal.show();
  455. },
  456. goToFeed(feed) {
  457. const curPath = this.$route.path;
  458. switch(feed) {
  459. case 'home':
  460. if(curPath == '/i/web') {
  461. this.$emit('refresh');
  462. } else {
  463. this.$router.push('/i/web');
  464. }
  465. break;
  466. case 'local':
  467. if(curPath == '/i/web/timeline/local') {
  468. this.$emit('refresh');
  469. } else {
  470. this.$router.push({ name: 'timeline', params: { scope: 'local' }});
  471. }
  472. break;
  473. case 'global':
  474. if(curPath == '/i/web/timeline/global') {
  475. this.$emit('refresh');
  476. } else {
  477. this.$router.push({ name: 'timeline', params: { scope: 'global' }});
  478. }
  479. break;
  480. }
  481. }
  482. }
  483. }
  484. </script>
  485. <style lang="scss">
  486. .sidebar-component {
  487. .sidebar-sticky {
  488. background-color: var(--card-bg);
  489. border-radius: 15px;
  490. }
  491. &.sticky-top {
  492. top: 90px;
  493. }
  494. .nav {
  495. overflow: auto;
  496. }
  497. .nav-item {
  498. .nav-link {
  499. font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
  500. font-weight: 500;
  501. color: rgba(156,163,175, 1);
  502. padding-left: 14px;
  503. margin-bottom: 5px;
  504. &:hover {
  505. background-color: var(--light-hover-bg);
  506. }
  507. .icon {
  508. display: inline-block;
  509. width: 40px;
  510. text-align: center;
  511. }
  512. }
  513. .router-link-exact-active {
  514. color: var(--primary);
  515. font-weight: 700;
  516. padding-left: 14px;
  517. &:not(.text-center) {
  518. padding-left: 10px;
  519. border-left: 4px solid var(--primary);
  520. }
  521. .icon {
  522. color: var(--primary) !important;
  523. }
  524. }
  525. &:first-child {
  526. .nav-link {
  527. .small {
  528. font-weight: 700;
  529. }
  530. &:first-child {
  531. border-top-left-radius: 15px;
  532. }
  533. &:last-child {
  534. border-top-right-radius: 15px;
  535. }
  536. }
  537. }
  538. &:is(:last-child) {
  539. .nav-link {
  540. margin-bottom: 0;
  541. border-bottom-left-radius: 15px;
  542. border-bottom-right-radius: 15px;
  543. }
  544. }
  545. }
  546. .sidebar-heading {
  547. font-size: .75rem;
  548. text-transform: uppercase;
  549. }
  550. .user-card {
  551. align-items: center;
  552. .avatar {
  553. width: 75px;
  554. height: 75px;
  555. border-radius: 15px;
  556. margin-right: 0.8rem;
  557. border: 1px solid var(--border-color);
  558. }
  559. .avatar-update-btn {
  560. position: absolute;
  561. right: 12px;
  562. bottom: 0;
  563. width: 20px;
  564. height: 20px;
  565. background: rgba(255,255,255,0.9);
  566. border: 1px solid #dee2e6 !important;
  567. padding: 0;
  568. border-radius: 50rem;
  569. &-icon {
  570. font-family: 'Font Awesome 5 Free';
  571. font-weight: 400;
  572. -webkit-font-smoothing: antialiased;
  573. display: inline-block;
  574. font-style: normal;
  575. font-variant: normal;
  576. text-rendering: auto;
  577. line-height: 1;
  578. &:before {
  579. content: "\F013";
  580. }
  581. }
  582. }
  583. .username {
  584. font-weight: 600;
  585. font-size: 13px;
  586. margin-bottom: 0;
  587. }
  588. .display-name {
  589. color: var(--body-color);
  590. line-height: 0.8;
  591. font-size: 14px;
  592. font-weight: 800 !important;
  593. user-select: all;
  594. font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
  595. margin-bottom: 0;
  596. word-break: break-all;
  597. }
  598. .stats {
  599. margin-top: 0;
  600. margin-bottom: 0;
  601. font-size: 12px;
  602. user-select: none;
  603. .stats-following {
  604. margin-right: 0.8rem;
  605. }
  606. .following-count,
  607. .followers-count {
  608. font-weight: 800;
  609. }
  610. }
  611. }
  612. .btn-primary {
  613. background-color: var(--primary);
  614. &.router-link-exact-active {
  615. opacity: 0.5;
  616. pointer-events: none;
  617. cursor: unset;
  618. }
  619. }
  620. .sidebar-sitelinks {
  621. margin-top: 1rem;
  622. display: flex;
  623. justify-content: space-between;
  624. padding: 0 2rem;
  625. a {
  626. font-size: 12px;
  627. color: #B8C2CC;
  628. }
  629. .active {
  630. color: #212529;
  631. font-weight: 600;
  632. }
  633. }
  634. .sidebar-attribution {
  635. margin-top: 0.5rem;
  636. font-size: 10px;
  637. color: #B8C2CC;
  638. padding-left: 2rem;
  639. a {
  640. color: #B8C2CC !important;
  641. &.powered-by {
  642. opacity: 0.5;
  643. }
  644. }
  645. }
  646. }
  647. </style>