Family Tree

Shared family knowledge — any family member can view and edit this map.

{#if error}

{error}

{/if}

{editingId ? 'Edit person' : 'Add a person'}

{#if editingId}{/if}
{#if people.length >= 2}

Add a relationship

{/if}

Tree

{#if roots.length === 0}

Add people and relationships above to build the tree.

{/if} {#each roots as root (root.id)} {@render personNode(root, 0)} {/each}

All people

{#each people as p (p.id)}
{#if expandedId === p.id}
{#if p.notes}

{p.notes}

{/if} {#if p.deathDate}
{#if memorialCounts[p.id] > 0} {memorialCounts[p.id]} sadaqah given in their memory {/if}
{/if}
{#if photoUrls[p.id]}{/if}
{/if}
{:else}

No one added yet.

{/each}

Relationships

{#each relationships as r (r.id)}
{personName(r.personAId)} {r.type === 'parent_of' ? 'is parent of' : 'is spouse of'} {personName(r.personBId)}
{:else}

No relationships recorded yet.

{/each}
{#snippet personNode(person, depth)}
{#if photoUrls[person.id]} {person.fullName} {:else}
{person.fullName.charAt(0).toUpperCase()}
{/if} {person.fullName} {#each (spousesOf[person.id] || []) as spouseId} ⚭ {personName(spouseId)} {/each}
{#each (childrenOf[person.id] || []) as childId} {@const child = people.find(p => p.id === childId)} {#if child} {@render personNode(child, depth + 1)} {/if} {/each}
{/snippet}