diff --git a/src/renderer/components/team/MemberBadge.tsx b/src/renderer/components/team/MemberBadge.tsx index c4f40187..580763dd 100644 --- a/src/renderer/components/team/MemberBadge.tsx +++ b/src/renderer/components/team/MemberBadge.tsx @@ -13,7 +13,7 @@ interface MemberBadgeProps { name: string; color?: string; /** Avatar + badge size variant */ - size?: 'sm' | 'md'; + size?: 'xs' | 'sm' | 'md'; /** Hide the avatar icon, show only the name badge */ hideAvatar?: boolean; onClick?: (name: string) => void; @@ -37,9 +37,10 @@ export const MemberBadge = ({ }: MemberBadgeProps): React.JSX.Element => { const colors = getTeamColorSet(color ?? ''); const { isLight } = useTheme(); - const avatarSize = size === 'md' ? 32 : 24; - const avatarClass = size === 'md' ? 'size-6' : 'size-5'; - const textClass = size === 'md' ? 'text-xs' : 'text-[10px]'; + const avatarSize = size === 'md' ? 32 : size === 'sm' ? 24 : 18; + const avatarClass = size === 'md' ? 'size-6' : size === 'sm' ? 'size-5' : 'size-4'; + const textClass = size === 'md' ? 'text-xs' : size === 'sm' ? 'text-[10px]' : 'text-[9px]'; + const paddingClass = size === 'xs' ? 'px-1 py-0.5' : 'px-1.5 py-0.5'; const badgeStyle = { backgroundColor: getThemedBadge(colors, isLight), @@ -58,7 +59,7 @@ export const MemberBadge = ({ const badge = ( {name === 'team-lead' ? 'lead' : name} diff --git a/src/renderer/components/team/TaskTooltip.tsx b/src/renderer/components/team/TaskTooltip.tsx index b761ad76..e5f863b3 100644 --- a/src/renderer/components/team/TaskTooltip.tsx +++ b/src/renderer/components/team/TaskTooltip.tsx @@ -73,27 +73,39 @@ export const TaskTooltip = ({ const globalTasks = useStore((s) => s.globalTasks); const teamByName = useStore((s) => s.teamByName); - const tasks = useMemo(() => { + const task = useMemo(() => { if (teamName && selectedTeamName === teamName) { - return selectedTeamData?.tasks ?? []; + return ( + (selectedTeamData?.tasks ?? []).find((candidate) => taskMatchesRef(candidate, taskId)) ?? + null + ); } + if (teamName) { - return globalTasks.filter((task) => task.teamName === teamName); + return ( + globalTasks.find( + (candidate) => candidate.teamName === teamName && taskMatchesRef(candidate, taskId) + ) ?? null + ); } + const currentTasks = selectedTeamData?.tasks ?? []; const currentMatch = currentTasks.find((task) => taskMatchesRef(task, taskId)); - if (currentMatch) return currentTasks; - return globalTasks; + if (currentMatch) return currentMatch; + + const globalMatches = globalTasks.filter((candidate) => taskMatchesRef(candidate, taskId)); + return globalMatches.length === 1 ? globalMatches[0] : null; }, [globalTasks, selectedTeamData, selectedTeamName, teamName, taskId]); const members = useMemo(() => { if (teamName && selectedTeamName === teamName) { return selectedTeamData?.members ?? []; } + if (!teamName && task && selectedTeamName === (task as { teamName?: string }).teamName) { + return selectedTeamData?.members ?? []; + } return []; - }, [selectedTeamData, selectedTeamName, teamName]); - - const task = useMemo(() => tasks?.find((t) => taskMatchesRef(t, taskId)), [tasks, taskId]); + }, [selectedTeamData, selectedTeamName, teamName, task]); const colorMap = useMemo( () => (members ? buildMemberColorMap(members) : new Map()), diff --git a/src/renderer/components/team/dialogs/CreateTeamDialog.tsx b/src/renderer/components/team/dialogs/CreateTeamDialog.tsx index af2e5448..6bd633bd 100644 --- a/src/renderer/components/team/dialogs/CreateTeamDialog.tsx +++ b/src/renderer/components/team/dialogs/CreateTeamDialog.tsx @@ -839,18 +839,33 @@ export const CreateTeamDialog = ({ /> -
+
setLaunchTeam(checked === true)} />
-
diff --git a/src/renderer/components/team/dialogs/LaunchTeamDialog.tsx b/src/renderer/components/team/dialogs/LaunchTeamDialog.tsx index c89f32cb..7317a386 100644 --- a/src/renderer/components/team/dialogs/LaunchTeamDialog.tsx +++ b/src/renderer/components/team/dialogs/LaunchTeamDialog.tsx @@ -20,6 +20,7 @@ import { MentionableTextarea } from '@renderer/components/ui/MentionableTextarea import { useChipDraftPersistence } from '@renderer/hooks/useChipDraftPersistence'; import { useDraftPersistence } from '@renderer/hooks/useDraftPersistence'; import { useFileListCacheWarmer } from '@renderer/hooks/useFileListCacheWarmer'; +import { useTheme } from '@renderer/hooks/useTheme'; import { useStore } from '@renderer/store'; import { getTeamColorSet } from '@renderer/constants/teamColors'; import { formatAgentRole } from '@renderer/utils/formatAgentRole'; @@ -108,6 +109,7 @@ function getLocalTimezone(): string { export const LaunchTeamDialog = (props: LaunchTeamDialogProps): React.JSX.Element => { const { open, onClose } = props; + const { isLight } = useTheme(); const isLaunch = props.mode === 'launch'; const isSchedule = props.mode === 'schedule'; const schedule = isSchedule ? ((props as LaunchDialogScheduleMode).schedule ?? null) : null; @@ -821,7 +823,14 @@ export const LaunchTeamDialog = (props: LaunchTeamDialogProps): React.JSX.Elemen Schedule-only: Schedule configuration section ═══════════════════════════════════════════════════════════════════ */} {isSchedule ? ( -
+
@@ -80,7 +113,7 @@ export const OptionalSettingsSection = ({
{children} diff --git a/src/renderer/components/team/members/MemberDraftRow.tsx b/src/renderer/components/team/members/MemberDraftRow.tsx index e8eddd8a..621719f5 100644 --- a/src/renderer/components/team/members/MemberDraftRow.tsx +++ b/src/renderer/components/team/members/MemberDraftRow.tsx @@ -8,6 +8,7 @@ import { MentionableTextarea } from '@renderer/components/ui/MentionableTextarea import { getTeamColorSet } from '@renderer/constants/teamColors'; import { useDraftPersistence } from '@renderer/hooks/useDraftPersistence'; import { useFileListCacheWarmer } from '@renderer/hooks/useFileListCacheWarmer'; +import { useTheme } from '@renderer/hooks/useTheme'; import { reconcileChips, removeChipTokenFromText } from '@renderer/utils/chipUtils'; import { getMemberColorByName } from '@shared/constants/memberColors'; import { ChevronDown, ChevronRight, Info } from 'lucide-react'; @@ -47,6 +48,7 @@ export const MemberDraftRow = ({ projectPath, mentionSuggestions = [], }: MemberDraftRowProps): React.JSX.Element => { + const { isLight } = useTheme(); const memberColorSet = getTeamColorSet( getMemberColorByName(member.name.trim() || `member-${index}`) ); @@ -117,12 +119,19 @@ export const MemberDraftRow = ({ return (
+