{#snippet versionTooltip()}
fnsys/dockhand:{appVersion}
{#if buildCommit}
Commit: {buildCommit.slice(0, 7)}
{/if} {#if $selfUpdate.updateAvailable && $selfUpdate.latestVersion}
Update available: v{$selfUpdate.latestVersion}
{/if}
{/snippet}
Dockhand Logo {#if $licenseStore.isEnterprise} {/if}
{#each editMode ? editableItems : visibleItems as item (item.href)}
  • {#if editMode}
    { dragHref = item.href; if (e.dataTransfer) { e.dataTransfer.effectAllowed = 'move'; // Safari won't start a drag without data e.dataTransfer.setData('text/plain', item.href); e.dataTransfer.setDragImage(transparentGhost(), 0, 0); } }} ondragover={(e) => { e.preventDefault(); if (e.dataTransfer) e.dataTransfer.dropEffect = 'move'; if (!dragHref || dragHref === item.href) return; // Only reorder when the pointer is past the row midpoint, // so a hover near the boundary doesn't flip back and forth const rect = (e.currentTarget as HTMLElement).getBoundingClientRect(); const before = e.clientY < rect.top + rect.height / 2; moveTo(dragHref, item.href, before); }} ondrop={(e) => e.preventDefault()} ondragend={endDrag} >
    {:else} sidebar.setOpenMobile(false)}> {/if}
  • {/each}
    {#if editMode}
    {/if}
    {#if $selfUpdate.updateAvailable} {/if}
    {appVersion} {#if $selfUpdate.updateAvailable} {/if} {#if !editMode} {/if}
    {#if $authStore.authEnabled && $authStore.authenticated && $authStore.user} sidebar.setOpenMobile(false)} class="flex items-center gap-2 px-2 py-1.5 group-data-[state=collapsed]:px-1 group-data-[state=collapsed]:py-1 rounded-md hover:bg-sidebar-accent transition-colors group-data-[state=collapsed]:justify-center" title="View profile" > {($authStore.user.displayName || $authStore.user.username)?.slice(0, 2).toUpperCase()}
    {$authStore.user.displayName || $authStore.user.username} {$authStore.user.isAdmin ? 'Admin' : 'User'}
    {/if}