atagen

malice

public
Star0
Watch0
6c8fd192fb8c82f9475366bef757637abb84012f
2
ssh://brewery@pls.lobotomise.me:33/atagen/malice.git

Blame: web/src/lib/MxcAvatar.svelte

973f8fbdaf80atagen2026-09-28 09:10 UTC1
<script lang="ts">
973f8fbdaf80atagen2026-09-28 09:10 UTC2
  import { mediaUrl } from './api';
973f8fbdaf80atagen2026-09-28 09:10 UTC3
  import { initialsOf } from './format';
973f8fbdaf80atagen2026-09-28 09:10 UTC4
973f8fbdaf80atagen2026-09-28 09:10 UTC5
  export let mxc: string | null;
973f8fbdaf80atagen2026-09-28 09:10 UTC6
  export let label: string;
973f8fbdaf80atagen2026-09-28 09:10 UTC7
  export let size = 34;
973f8fbdaf80atagen2026-09-28 09:10 UTC8
  /** 'circle' for people, 'rounded' for rooms/spaces */
973f8fbdaf80atagen2026-09-28 09:10 UTC9
  export let shape: 'circle' | 'rounded' = 'circle';
973f8fbdaf80atagen2026-09-28 09:10 UTC10
973f8fbdaf80atagen2026-09-28 09:10 UTC11
  $: src = mediaUrl(mxc);
973f8fbdaf80atagen2026-09-28 09:10 UTC12
973f8fbdaf80atagen2026-09-28 09:10 UTC13
  let failed = false;
973f8fbdaf80atagen2026-09-28 09:10 UTC14
  $: if (mxc) failed = false;
973f8fbdaf80atagen2026-09-28 09:10 UTC15
  $: px = `${size}px`;
973f8fbdaf80atagen2026-09-28 09:10 UTC16
  $: fontPx = `${Math.max(10, Math.round(size * 0.36))}px`;
973f8fbdaf80atagen2026-09-28 09:10 UTC17
</script>
973f8fbdaf80atagen2026-09-28 09:10 UTC18
973f8fbdaf80atagen2026-09-28 09:10 UTC19
{#if src && !failed}
973f8fbdaf80atagen2026-09-28 09:10 UTC20
  <img
973f8fbdaf80atagen2026-09-28 09:10 UTC21
    {src}
973f8fbdaf80atagen2026-09-28 09:10 UTC22
    alt=""
973f8fbdaf80atagen2026-09-28 09:10 UTC23
    aria-hidden="true"
973f8fbdaf80atagen2026-09-28 09:10 UTC24
    width={size}
973f8fbdaf80atagen2026-09-28 09:10 UTC25
    height={size}
973f8fbdaf80atagen2026-09-28 09:10 UTC26
    loading="lazy"
973f8fbdaf80atagen2026-09-28 09:10 UTC27
    class="mxc-avatar"
973f8fbdaf80atagen2026-09-28 09:10 UTC28
    class:circle={shape === 'circle'}
973f8fbdaf80atagen2026-09-28 09:10 UTC29
    style={`width:${px};height:${px};`}
973f8fbdaf80atagen2026-09-28 09:10 UTC30
    on:error={() => (failed = true)}
973f8fbdaf80atagen2026-09-28 09:10 UTC31
  />
973f8fbdaf80atagen2026-09-28 09:10 UTC32
{:else}
973f8fbdaf80atagen2026-09-28 09:10 UTC33
  <span class="mxc-fallback" class:circle={shape === 'circle'} aria-hidden="true" style={`width:${px};height:${px};font-size:${fontPx};`}>
973f8fbdaf80atagen2026-09-28 09:10 UTC34
    {initialsOf(label || '#')}
973f8fbdaf80atagen2026-09-28 09:10 UTC35
  </span>
973f8fbdaf80atagen2026-09-28 09:10 UTC36
{/if}
973f8fbdaf80atagen2026-09-28 09:10 UTC37
973f8fbdaf80atagen2026-09-28 09:10 UTC38
<style>
973f8fbdaf80atagen2026-09-28 09:10 UTC39
  .mxc-avatar {
973f8fbdaf80atagen2026-09-28 09:10 UTC40
    flex: none;
973f8fbdaf80atagen2026-09-28 09:10 UTC41
    object-fit: cover;
973f8fbdaf80atagen2026-09-28 09:10 UTC42
    border-radius: 8px;
973f8fbdaf80atagen2026-09-28 09:10 UTC43
    background: var(--bg-soft);
973f8fbdaf80atagen2026-09-28 09:10 UTC44
  }
973f8fbdaf80atagen2026-09-28 09:10 UTC45
  .mxc-avatar.circle { border-radius: 50%; }
973f8fbdaf80atagen2026-09-28 09:10 UTC46
  .mxc-fallback {
973f8fbdaf80atagen2026-09-28 09:10 UTC47
    flex: none;
973f8fbdaf80atagen2026-09-28 09:10 UTC48
    display: inline-grid;
973f8fbdaf80atagen2026-09-28 09:10 UTC49
    place-items: center;
973f8fbdaf80atagen2026-09-28 09:10 UTC50
    border-radius: 8px;
973f8fbdaf80atagen2026-09-28 09:10 UTC51
    background: var(--panel-2);
973f8fbdaf80atagen2026-09-28 09:10 UTC52
    color: var(--text);
973f8fbdaf80atagen2026-09-28 09:10 UTC53
    font-weight: 700;
973f8fbdaf80atagen2026-09-28 09:10 UTC54
  }
973f8fbdaf80atagen2026-09-28 09:10 UTC55
  .mxc-fallback.circle { border-radius: 50%; }
973f8fbdaf80atagen2026-09-28 09:10 UTC56
</style>