diff --git a/frontend/src/lib/components/ResourceList.svelte b/frontend/src/lib/components/ResourceList.svelte
index d2288b6f..f7b88bf8 100644
--- a/frontend/src/lib/components/ResourceList.svelte
+++ b/frontend/src/lib/components/ResourceList.svelte
@@ -54,6 +54,7 @@
import EmptyState from '$lib/components/EmptyState.svelte';
import SkeletonList from '$lib/components/SkeletonList.svelte';
import ListToolbar from '$lib/components/ListToolbar.svelte';
+ import UserVignette from '$lib/components/UserVignette.svelte';
import VirtualList from '$lib/components/VirtualList.svelte';
import { t } from '$lib/i18n/index.svelte';
import { files as filesStore } from '$lib/stores/files.svelte';
@@ -329,12 +330,14 @@
{#if showOwner}
-
- {(entry.ownerName ?? '?').slice(0, 1).toUpperCase()}
- {entry.ownerName ?? entry.ownerId ?? ''}
-
+ {#if entry.ownerId}
+
+ {:else}
+ {entry.ownerName ?? '—'}
+ {/if}
{/if}
{#if showPath}{entry.path ?? ''}
{/if}
@@ -570,28 +573,7 @@
min-width: 0;
}
- .rl-vignette {
- display: inline-flex;
- align-items: center;
- gap: var(--space-2);
- min-width: 0;
- }
-
- .rl-vignette__avatar {
- display: inline-flex;
- align-items: center;
- justify-content: center;
- width: 24px;
- height: 24px;
- border-radius: 50%;
- background: var(--color-accent-bg-sm);
- color: var(--color-accent-text);
- font-size: var(--text-xs);
- font-weight: var(--weight-semibold);
- flex: none;
- }
-
- .rl-vignette__name {
+ .owner-cell__placeholder {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
diff --git a/frontend/src/routes/shared-with-me/+page.svelte b/frontend/src/routes/shared-with-me/+page.svelte
index 2a49b1dd..0ac91ecb 100644
--- a/frontend/src/routes/shared-with-me/+page.svelte
+++ b/frontend/src/routes/shared-with-me/+page.svelte
@@ -22,9 +22,13 @@
name: it.resource.name,
kind: it.resource_type,
iconClass: it.resource.icon_class,
- path: it.granted_by
- ? t('shared_with_me.from', { who: it.granted_by }, 'Shared by {{who}}')
- : it.resource.path,
+ // The sharer becomes the "owner" surface — ResourceList renders
+ // `` (avatar / name / external badge),
+ // resolved lazily via `/api/users/{id}`. `path` keeps the
+ // resource's real location so the row still shows where it
+ // lives, not a translated string.
+ ownerId: it.granted_by ?? null,
+ path: it.resource.path,
size: it.resource_type === 'file' ? (it.resource as FileItem).size : null,
date: it.granted_at
})
@@ -79,6 +83,7 @@
{error}
emptyText={t('shared_with_me.empty', 'Nothing has been shared with you yet.')}
hasMore={!!cursor}
+ showOwner={true}
onloadmore={() => load(false)}
onopen={open}
/>
diff --git a/frontend/src/routes/shared/+page.svelte b/frontend/src/routes/shared/+page.svelte
index d333ecb7..9f72129a 100644
--- a/frontend/src/routes/shared/+page.svelte
+++ b/frontend/src/routes/shared/+page.svelte
@@ -22,6 +22,7 @@
import Icon from '$lib/icons/Icon.svelte';
import ListToolbar from '$lib/components/ListToolbar.svelte';
import ShareDialog from '$lib/components/ShareDialog.svelte';
+ import UserVignette from '$lib/components/UserVignette.svelte';
import { t } from '$lib/i18n/index.svelte';
import { ui } from '$lib/stores/ui.svelte';
import { iconNameFromClass } from '$lib/utils/display';
@@ -388,16 +389,21 @@
{t('myshares.editSharing', 'Edit sharing')}
+ {:else if lane.header.kind === 'user'}
+
+
+
{:else}
{laneTitle(lane.header)}
@@ -416,8 +422,10 @@
{item.resource.name}
{:else if grant.subject_type === 'user'}
-
- {resolveLabel('user', grant.subject_id)}
+
{:else if grant.subject_type === 'group'}
{resolveLabel('group', grant.subject_id)}