A fork of pds-dash-fork for arabica.systems
at main 121 lines 3.0 kB view raw
1<script lang="ts"> 2 import type { AccountMetadata } from "./pdsfetch"; 3 import { getTealNowListeningTo, getStatusSphere } from "./pdsfetch"; 4 const { account }: { account: AccountMetadata } = $props(); 5 import { Config } from "../../config"; 6 7 let nowListeningTo: string | null = $state(null); 8 let statusEmoji: string | null = $state(null); 9 10 $effect(() => { 11 if (account.did) { 12 getTealNowListeningTo(account.did).then((res) => { 13 nowListeningTo = res; 14 }); 15 getStatusSphere(account.did).then((res) => { 16 statusEmoji = res; 17 }); 18 } 19 }); 20</script> 21 22<a id="link" href="{Config.FRONTEND_PROFILE_URL}/{account.did}"> 23 <div id="accountContainer"> 24 {#if account.avatarCid} 25 <span class="avatar-wrapper"> 26 {#if statusEmoji} 27 <span class="avatar-badge" aria-hidden="true" title="icon" 28 >{statusEmoji}</span 29 > 30 {/if} 31 <img 32 id="avatar" 33 alt="avatar of {account.displayName}" 34 src="https://cdn.bsky.app/img/feed_thumbnail/plain/{account.did}/{account.avatarCid}@jpeg" 35 /> 36 </span> 37 <div class="name-block" style="margin-left: 12px;"> 38 <div id="accountName" style="margin-left: 0;"> 39 {account.displayName || account.handle || account.did} 40 </div> 41 {#if nowListeningTo} 42 <div class="now-playing"><span>{nowListeningTo}</span></div> 43 {/if} 44 </div> 45 {:else} 46 <span class="avatar-wrapper"> 47 {#if statusEmoji} 48 <span class="avatar-badge" aria-hidden="true" title="icon" 49 >{statusEmoji}</span 50 > 51 {/if} 52 53 <img 54 id="avatar" 55 alt="unknown avatar of {account.displayName}" 56 src="/unknown.png" 57 /> 58 </span> 59 <div class="name-block" style="margin-left: 12px;"> 60 <div id="accountName" style="margin-left: 0;"> 61 {account.displayName || account.handle || account.did} 62 </div> 63 {#if nowListeningTo} 64 <div class="now-playing"><span>{nowListeningTo}</span></div> 65 {/if} 66 </div> 67 {/if} 68 </div> 69</a> 70 71<style> 72 .avatar-wrapper { 73 position: relative; 74 display: inline-block; 75 } 76 77 .avatar-badge { 78 position: absolute; 79 top: 34px; 80 left: 40px; 81 font-size: 24px; 82 line-height: 1; 83 } 84 85 .name-block { 86 display: flex; 87 flex-direction: column; 88 min-width: 0; 89 flex: 1; 90 } 91 92 #accountName { 93 max-width: 100%; 94 overflow: hidden; 95 text-overflow: ellipsis; 96 white-space: nowrap; 97 } 98 99 .now-playing { 100 font-size: 0.8em; 101 opacity: 0.8; 102 margin-top: 2px; 103 white-space: nowrap; 104 overflow: hidden; 105 } 106 107 .now-playing > span { 108 display: inline-block; 109 padding-left: 100%; 110 animation: account-now-playing-marquee 25s linear infinite; 111 } 112 113 @keyframes account-now-playing-marquee { 114 from { 115 transform: translateX(0); 116 } 117 to { 118 transform: translateX(-100%); 119 } 120 } 121</style>