diff --git a/frontend/src/lib/components/sidebar/MenuButton.svelte b/frontend/src/lib/components/sidebar/MenuButton.svelte
index 9d2bd8dd48..72cde81f9d 100644
--- a/frontend/src/lib/components/sidebar/MenuButton.svelte
+++ b/frontend/src/lib/components/sidebar/MenuButton.svelte
@@ -2,6 +2,7 @@
export const sidebarClasses = {
text: 'text-primary-inverse dark:text-primary data-[light-mode=true]:text-primary text-xs font-normal',
selectedText: 'text-emphasis-inverse dark:text-emphasis text-xs font-normal',
+ sublabelText: 'text-secondary-inverse dark:text-secondary text-2xs font-normal',
hoverBg:
'transition-colors hover:bg-surface-hover-inverse dark:hover:bg-surface-hover data-[light-mode=true]:hover:bg-surface-hover'
}
@@ -20,6 +21,7 @@
aiId?: string | undefined
aiDescription?: string | undefined
label?: string | undefined
+ sublabel?: string | undefined
icon?: any | undefined
iconClasses?: string | null
iconProps?: any | null
@@ -39,6 +41,7 @@
aiId = undefined,
aiDescription = undefined,
label = undefined,
+ sublabel = undefined,
icon = undefined,
iconClasses = null,
iconProps = null,
@@ -91,41 +94,62 @@
{href}
data-light-mode={lightMode}
class={twMerge(
- 'group flex items-center px-2 py-2 font-light rounded-md h-8 gap-3 w-full',
+ 'group flex items-center px-2 py-2 font-light rounded-md gap-2 w-full',
sidebarClasses.hoverBg,
- color ? 'border-4' : '',
'transition-all relative',
+ sublabel ? 'h-10' : 'h-8',
classNames
)}
- style={color ? `border-color: ${color}; padding: 0 calc(0.5rem - 4px);` : ''}
use:conditionalMelt={trigger}
title={isCollapsed ? undefined : label}
{...$trigger}
>
{#if icon}
{@const SvelteComponent = icon}
-
+
+
+
{/if}
- {#if !isCollapsed && label}
-
- {label}
-
- {shortcut}
-
-
- {/if}
+
+ {#if !isCollapsed && label}
+
+ {label}
+
+ {shortcut}
+
+
+ {/if}
+
+ {#if sublabel}
+
{sublabel}
+ {/if}
+
{#if isCollapsed && notificationsCount > 0}
diff --git a/frontend/src/lib/components/sidebar/MultiplayerMenu.svelte b/frontend/src/lib/components/sidebar/MultiplayerMenu.svelte
index 0c0297c5bb..c7894c3d6c 100644
--- a/frontend/src/lib/components/sidebar/MultiplayerMenu.svelte
+++ b/frontend/src/lib/components/sidebar/MultiplayerMenu.svelte
@@ -84,7 +84,7 @@
{#if connected}
-
Live activity
+
Live activity
{#each Object.entries($awarenessStore ?? {}) as [user, url]}
@@ -97,8 +97,8 @@
>
- {user}
- {showActivity(url)}
+ {user}
+ {showActivity(url)}
{/each}
diff --git a/frontend/src/lib/components/sidebar/WorkspaceMenu.svelte b/frontend/src/lib/components/sidebar/WorkspaceMenu.svelte
index 7b1503e027..50c61604a2 100644
--- a/frontend/src/lib/components/sidebar/WorkspaceMenu.svelte
+++ b/frontend/src/lib/components/sidebar/WorkspaceMenu.svelte
@@ -11,7 +11,7 @@
} from '$lib/stores'
import { Building, Plus, Settings, GitFork } from 'lucide-svelte'
import MenuButton from '$lib/components/sidebar/MenuButton.svelte'
- import { Menu, MenuItem } from '$lib/components/meltComponents'
+ import { Menu, MenuItem, Tooltip } from '$lib/components/meltComponents'
import { goto } from '$lib/navigation'
import { base } from '$lib/base'
import { page } from '$app/stores'
@@ -23,6 +23,7 @@
import { twMerge } from 'tailwind-merge'
import type { MenubarBuilders } from '@melt-ui/svelte'
import { buildWorkspaceHierarchy } from '$lib/utils/workspaceHierarchy'
+ import { getContrastTextColor } from '$lib/utils'
interface Props {
isCollapsed?: boolean
@@ -66,12 +67,6 @@
}
}
- // Helper function to check if a workspace is forked
- function isForkedWorkspace(workspaceId: string): boolean {
- if (!$userWorkspaces) return false
- return $userWorkspaces.some((w) => w.id === workspaceId && w.parent_workspace_id != null)
- }
-
function getForkedWorkspace(workspaceId: string) {
if (!$userWorkspaces) return undefined
return $userWorkspaces.find((w) => w.id === workspaceId && w.parent_workspace_id != null)
@@ -87,43 +82,56 @@
if (!$userWorkspaces) return []
return buildWorkspaceHierarchy($userWorkspaces)
})
+
+ const itemClass =
+ 'text-primary flex flex-row gap-2 px-4 py-2 text-xs hover:bg-surface-hover hover:text-primary data-[highlighted]:bg-surface-hover data-[highlighted]:text-primary'
-{#if isForkedWorkspace($workspaceStore ?? '') && !isCollapsed}
- {@const forkedWorkspace = getForkedWorkspace($workspaceStore ?? '')}
- {@const parentWorkspace = forkedWorkspace
- ? getParentWorkspace(forkedWorkspace.parent_workspace_id!)
- : null}
-
-{/if}
+{#snippet workspaceIcon(
+ workspaceColor: string | undefined,
+ isForked: boolean,
+ parentName: string | undefined
+)}
+ {@const iconColor = getContrastTextColor(workspaceColor)}
+
+ {#if isForked}
+
+ {#snippet text()}
+ {#if isForked && parentName}
+ Fork of {parentName}
+ {/if}
+ {/snippet}
+
+
+ {:else}
+
+ {/if}
+
+{/snippet}
+