From 787be14d733491550a30d9535cdcc4ceb1c97999 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C5=ABdolfs=20O=C5=A1i=C5=86=C5=A1?= Date: Fri, 6 Nov 2026 14:48:40 +0100 Subject: [PATCH] desktop: Share the avatar stack Board cards show assignees the way the repository header shows delegates, overlapping and fanning out on hover, so the stack moves into its own component. --- desktop/src/components/AvatarStack.svelte | 59 +++++++++++++++++++++++ desktop/src/components/RepoHeader.svelte | 45 +---------------- 2 files changed, 61 insertions(+), 43 deletions(-) create mode 100644 desktop/src/components/AvatarStack.svelte diff --git a/desktop/src/components/AvatarStack.svelte b/desktop/src/components/AvatarStack.svelte new file mode 100644 index 000000000..1ba884acc --- /dev/null +++ b/desktop/src/components/AvatarStack.svelte @@ -0,0 +1,59 @@ + + + + + +
(hovered = true)} + onmouseleave={() => (hovered = false)}> + {#each people as person, index (person.did)} +
+ (cardsOpen[person.did] = expanded)} /> +
+ {/each} +
diff --git a/desktop/src/components/RepoHeader.svelte b/desktop/src/components/RepoHeader.svelte index c3d0777db..22ffc4d03 100644 --- a/desktop/src/components/RepoHeader.svelte +++ b/desktop/src/components/RepoHeader.svelte @@ -3,10 +3,9 @@ import type { RepoInfo } from "@bindings/repo/RepoInfo"; import * as router from "@app/lib/router"; - import { authorForNodeId } from "@app/lib/utils"; + import AvatarStack from "@app/components/AvatarStack.svelte"; import CheckoutRepoButton from "@app/components/CheckoutRepoButton.svelte"; - import NodeId from "@app/components/NodeId.svelte"; import ShareButton from "@app/components/ShareButton.svelte"; import VisibilityBadge from "@app/components/VisibilityBadge.svelte"; @@ -18,12 +17,6 @@ const { repo, config }: Props = $props(); const project = $derived(repo.payloads["xyz.radicle.project"]!); - - // The cards are portaled out of the stack, so moving onto one ends the - // stack's hover. Keep it fanned out while any card is still open. - let hovered = $state(false); - const cardsOpen: Record = $state({}); - const fanned = $derived(hovered || Object.values(cardsOpen).some(Boolean));