diff --git a/packages/app/src/components/titlebar.tsx b/packages/app/src/components/titlebar.tsx index 8144aec66..580f6caec 100644 --- a/packages/app/src/components/titlebar.tsx +++ b/packages/app/src/components/titlebar.tsx @@ -22,7 +22,7 @@ import { Icon as IconV2 } from "@opencode-ai/ui/v2/icon" import { KeybindV2 } from "@opencode-ai/ui/v2/keybind-v2" import { TooltipV2 } from "@opencode-ai/ui/v2/tooltip-v2" -import { getProjectAvatarVariant, LayoutRoute, useLayout, type LocalProject } from "@/context/layout" +import { LayoutRoute, useLayout } from "@/context/layout" import { usePlatform } from "@/context/platform" import { useCommand } from "@/context/command" import { useLanguage } from "@/context/language" @@ -30,9 +30,8 @@ import { useSettings } from "@/context/settings" import { WindowsAppMenu } from "./windows-app-menu" import { applyPath, backPath, forwardPath } from "./titlebar-history" import { base64Encode } from "@opencode-ai/core/util/encode" -import { ProjectAvatar } from "@opencode-ai/ui/v2/project-avatar-v2" -import { displayName, getProjectAvatarSource, projectForSession } from "@/pages/layout/helpers" -import { useSessionTabAvatarState } from "@/pages/layout/project-avatar-state" +import { projectForSession } from "@/pages/layout/helpers" +import { SessionTabAvatar } from "@/pages/layout/session-tab-avatar" import { makeEventListener } from "@solid-primitives/event-listener" import { createResizeObserver } from "@solid-primitives/resize-observer" import { createMediaQuery } from "@solid-primitives/media" @@ -868,7 +867,7 @@ function TabNavItem(props: { class="flex h-full min-w-0 flex-1 flex-row items-center gap-1.5 text-[13px] font-medium text-v2-text-text-faint group-data-[active='true']:text-v2-text-text-base" > - props.directory - const sessionId = () => props.sessionId - const state = useSessionTabAvatarState(directory, sessionId, () => props.activeServer) - return ( - - ) -} - function DraftTabItem(props: { ref?: HTMLDivElement href: string diff --git a/packages/app/src/pages/home.tsx b/packages/app/src/pages/home.tsx index ac9ee63ed..b531c1ed9 100644 --- a/packages/app/src/pages/home.tsx +++ b/packages/app/src/pages/home.tsx @@ -38,7 +38,7 @@ import { sortedRootSessions, toggleHomeProjectSelection, } from "@/pages/layout/helpers" -import { useSessionTabAvatarState } from "@/pages/layout/project-avatar-state" +import { SessionTabAvatar } from "@/pages/layout/session-tab-avatar" import { sessionTitle } from "@/utils/session-title" import { pathKey } from "@/utils/path-key" import { useGlobal } from "@/context/global" @@ -755,21 +755,6 @@ function HomeProjectAvatar(props: { project: LocalProject }) { ) } -function HomeSessionAvatar(props: { project: LocalProject; session: Session; activeServer: boolean }) { - const directory = () => props.session.directory - const sessionId = () => props.session.id - const state = useSessionTabAvatarState(directory, sessionId, () => props.activeServer) - return ( - - ) -} - function HomeSessionLeading(props: { project: LocalProject session: Session @@ -787,7 +772,12 @@ function HomeSessionLeading(props: { style={{ right: "calc(100% + 12px)" }} /> - + ) } diff --git a/packages/app/src/pages/layout/session-tab-avatar.tsx b/packages/app/src/pages/layout/session-tab-avatar.tsx new file mode 100644 index 000000000..951bce96e --- /dev/null +++ b/packages/app/src/pages/layout/session-tab-avatar.tsx @@ -0,0 +1,33 @@ +import type { LocalProject } from "@/context/layout" +import { getProjectAvatarVariant } from "@/context/layout" +import { displayName, getProjectAvatarSource } from "@/pages/layout/helpers" +import { useSessionTabAvatarState } from "@/pages/layout/project-avatar-state" +import { ProjectAvatar } from "@opencode-ai/ui/v2/project-avatar-v2" +import { SessionProgressIndicatorV2 } from "@opencode-ai/ui/v2/session-progress-indicator-v2" +import { Show } from "solid-js" + +export function SessionTabAvatar(props: { + project?: LocalProject + directory: string + sessionId: string + activeServer: boolean +}) { + const directory = () => props.directory + const sessionId = () => props.sessionId + const state = useSessionTabAvatarState(directory, sessionId, () => props.activeServer) + return ( + + } + > + + + ) +} diff --git a/packages/ui/src/v2/components/project-avatar-v2.css b/packages/ui/src/v2/components/project-avatar-v2.css index 1c59fc17d..c99bc4a11 100644 --- a/packages/ui/src/v2/components/project-avatar-v2.css +++ b/packages/ui/src/v2/components/project-avatar-v2.css @@ -98,29 +98,6 @@ -webkit-user-drag: none; } -[data-slot="project-avatar-surface"] [data-slot="project-avatar-loader"] { - position: absolute; - inset: -3px; - z-index: 2; - border-radius: 0; - background: conic-gradient( - from 180deg at 50% 50%, - var(--v2-grey-100) 0deg, - var(--v2-grey-1200) 0.04deg, - var(--v2-alpha-dark-50) 90deg, - var(--v2-grey-100) 360deg - ); - mix-blend-mode: soft-light; - pointer-events: none; - animation: project-avatar-v2-loader-spin 1.2s linear infinite; -} - -@keyframes project-avatar-v2-loader-spin { - to { - transform: rotate(360deg); - } -} - [data-component="project-avatar-v2"][data-unread] [data-slot="project-avatar-surface"] { -webkit-mask-image: radial-gradient(circle 4.5px at calc(100% - 1px) 1px, transparent 4.5px, black 4.5px); mask-image: radial-gradient(circle 4.5px at calc(100% - 1px) 1px, transparent 4.5px, black 4.5px); diff --git a/packages/ui/src/v2/components/project-avatar-v2.stories.tsx b/packages/ui/src/v2/components/project-avatar-v2.stories.tsx index aa1d8be31..a67738462 100644 --- a/packages/ui/src/v2/components/project-avatar-v2.stories.tsx +++ b/packages/ui/src/v2/components/project-avatar-v2.stories.tsx @@ -79,20 +79,3 @@ export const AllVariantsUnread = { ), } - -export const Loading = { - args: { - fallback: "O", - variant: "orange", - loading: true, - }, -} - -export const LoadingAndUnread = { - args: { - fallback: "O", - variant: "blue", - loading: true, - unread: true, - }, -} diff --git a/packages/ui/src/v2/components/project-avatar-v2.tsx b/packages/ui/src/v2/components/project-avatar-v2.tsx index ff5cfa525..e0110d3cb 100644 --- a/packages/ui/src/v2/components/project-avatar-v2.tsx +++ b/packages/ui/src/v2/components/project-avatar-v2.tsx @@ -31,20 +31,10 @@ export interface ProjectAvatarProps extends ComponentProps<"div"> { src?: string variant?: ProjectAvatarVariant unread?: boolean - loading?: boolean } export function ProjectAvatar(props: ProjectAvatarProps) { - const [split, rest] = splitProps(props, [ - "fallback", - "src", - "variant", - "unread", - "loading", - "class", - "classList", - "style", - ]) + const [split, rest] = splitProps(props, ["fallback", "src", "variant", "unread", "class", "classList", "style"]) const src = split.src return (
{(value) => } - -