From e9b369e667e5d518cd4b01c59cb7815cf156f846 Mon Sep 17 00:00:00 2001 From: iliya Date: Sat, 7 Mar 2026 12:02:12 +0200 Subject: [PATCH] feat: enhance theme support and UI consistency across components - Added theme-aware accent and info colors in tailwind configuration for improved visual consistency. - Updated CSS variables for accent and info styles to support light and dark themes. - Refactored various components to utilize the new themed badge logic, ensuring consistent styling based on the current theme. - Improved accessibility and visual feedback in components like SidebarTaskItem, TeamListView, and ActivityItem by adjusting color schemes and hover states. - Enhanced the CreateTeamDialog and other team-related components with updated styling for better user experience. --- .../components/chat/items/LinkedToolItem.tsx | 6 +- .../components/chat/items/SubagentItem.tsx | 14 ++- .../chat/items/TeammateMessageItem.tsx | 6 +- .../chat/viewers/MarkdownViewer.tsx | 17 +++- .../components/common/OngoingIndicator.tsx | 13 +-- .../components/common/UpdateBanner.tsx | 4 +- .../components/dashboard/CliStatusBanner.tsx | 4 +- .../components/dashboard/DashboardView.tsx | 2 +- .../components/layout/SortableTab.tsx | 10 +- .../settings/sections/GeneralSection.tsx | 27 ++++-- .../components/sidebar/GlobalTaskList.tsx | 4 +- .../components/sidebar/SidebarTaskItem.tsx | 33 ++++--- .../team/CollapsibleTeamSection.tsx | 2 +- src/renderer/components/team/MemberBadge.tsx | 6 +- .../components/team/TeamDetailView.tsx | 6 +- src/renderer/components/team/TeamListView.tsx | 14 +-- .../components/team/TeamSessionsSection.tsx | 4 +- .../components/team/ToolApprovalSheet.tsx | 6 +- .../components/team/UnreadCommentsBadge.tsx | 2 +- .../team/activity/ActiveTasksBlock.tsx | 8 +- .../components/team/activity/ActivityItem.tsx | 34 ++++++- .../team/activity/ActivityTimeline.tsx | 12 ++- .../team/activity/LeadThoughtsGroup.tsx | 6 +- .../team/activity/PendingRepliesBlock.tsx | 8 +- .../team/activity/ReplyQuoteBlock.tsx | 8 +- .../team/dialogs/CreateTeamDialog.tsx | 6 +- .../team/dialogs/EditTeamDialog.tsx | 6 +- .../team/dialogs/TaskCommentsSection.tsx | 2 +- .../team/dialogs/TaskDetailDialog.tsx | 29 +++--- .../team/editor/ProjectEditorOverlay.tsx | 2 +- .../components/team/kanban/KanbanTaskCard.tsx | 8 +- .../components/team/members/MemberCard.tsx | 6 +- .../components/team/tasks/TaskRow.tsx | 8 +- src/renderer/components/ui/MemberSelect.tsx | 6 +- .../components/ui/MentionableTextarea.tsx | 8 +- src/renderer/constants/teamColors.ts | 94 ++++++++++++++++--- src/renderer/index.css | 18 +++- src/renderer/index.html | 5 +- src/renderer/utils/memberHelpers.ts | 4 +- src/renderer/utils/projectColor.ts | 19 +++- tailwind.config.js | 8 ++ 41 files changed, 342 insertions(+), 143 deletions(-) diff --git a/src/renderer/components/chat/items/LinkedToolItem.tsx b/src/renderer/components/chat/items/LinkedToolItem.tsx index 033d4c7f..2b7c4a51 100644 --- a/src/renderer/components/chat/items/LinkedToolItem.tsx +++ b/src/renderer/components/chat/items/LinkedToolItem.tsx @@ -9,7 +9,8 @@ import React, { useRef } from 'react'; import { CARD_ICON_MUTED } from '@renderer/constants/cssVariables'; -import { getTeamColorSet } from '@renderer/constants/teamColors'; +import { getTeamColorSet, getThemedBadge } from '@renderer/constants/teamColors'; +import { useTheme } from '@renderer/hooks/useTheme'; import { getToolContextTokens, getToolStatus, @@ -70,6 +71,7 @@ export const LinkedToolItem: React.FC = ({ registerRef, }) => { const status = getToolStatus(linkedTool); + const { isLight } = useTheme(); const summary = getToolSummary(linkedTool.name, linkedTool.input); const summaryNode = searchQueryOverride && searchQueryOverride.trim().length > 0 @@ -104,7 +106,7 @@ export const LinkedToolItem: React.FC = ({ {name} diff --git a/src/renderer/components/chat/items/SubagentItem.tsx b/src/renderer/components/chat/items/SubagentItem.tsx index 7f653642..39b7482c 100644 --- a/src/renderer/components/chat/items/SubagentItem.tsx +++ b/src/renderer/components/chat/items/SubagentItem.tsx @@ -12,8 +12,13 @@ import { COLOR_TEXT_MUTED, COLOR_TEXT_SECONDARY, } from '@renderer/constants/cssVariables'; -import { getSubagentTypeColorSet, getTeamColorSet } from '@renderer/constants/teamColors'; +import { + getSubagentTypeColorSet, + getTeamColorSet, + getThemedBadge, +} from '@renderer/constants/teamColors'; import { useTabUI } from '@renderer/hooks/useTabUI'; +import { useTheme } from '@renderer/hooks/useTheme'; import { useStore } from '@renderer/store'; import { buildDisplayItemsFromMessages, buildSummary } from '@renderer/utils/aiGroupEnhancer'; import { computeSubagentPhaseBreakdown } from '@renderer/utils/aiGroupHelpers'; @@ -80,6 +85,7 @@ export const SubagentItem: React.FC = ({ // Team member colors (when this subagent is a team member) const teamColors = subagent.team ? getTeamColorSet(subagent.team.memberColor) : null; + const { isLight } = useTheme(); // Type-based colors for non-team subagents (from agent config or deterministic hash) const typeColors = !teamColors ? getSubagentTypeColorSet(subagentType, agentConfigs) : null; @@ -233,7 +239,7 @@ export const SubagentItem: React.FC = ({ = ({ = ({ = ({ highlightStyle, }) => { const colors = getTeamColorSet(teammateMessage.color); + const { isLight } = useTheme(); // Detect operational noise const noiseLabel = useMemo( @@ -162,7 +164,7 @@ export const TeammateMessageItem: React.FC = ({ searchCtx ? highlightSearchInChildren(children, searchCtx) : children; @@ -214,7 +218,7 @@ function createViewerMarkdownComponents(searchCtx: SearchContext | null): Compon // malformed percent-encoding — use empty color } const colorSet = getTeamColorSet(color); - const bg = colorSet.badge; + const bg = getThemedBadge(colorSet, isLight); return ( = ({ }) => { const [showRaw, setShowRaw] = React.useState(false); const [rawLimit, setRawLimit] = React.useState(LARGE_PREVIEW_CHARS); + const { isLight } = useTheme(); const isTooLarge = content.length > MAX_MARKDOWN_CHARS; const disableHighlight = content.length > DISABLE_HIGHLIGHT_CHARS; @@ -601,7 +606,11 @@ export const MarkdownViewer: React.FC = ({ // Create markdown components with optional search highlighting // When search is active, create fresh each render (match counter is stateful and must start at 0) // useMemo would cache stale closures when parent re-renders without search deps changing - const baseComponents = searchCtx ? createViewerMarkdownComponents(searchCtx) : defaultComponents; + const baseComponents = searchCtx + ? createViewerMarkdownComponents(searchCtx, isLight) + : isLight + ? createViewerMarkdownComponents(null, true) + : defaultComponents; // When baseDir is set (editor preview), override img to load local files via IPC const components = baseDir diff --git a/src/renderer/components/common/OngoingIndicator.tsx b/src/renderer/components/common/OngoingIndicator.tsx index 81245738..8a0473ab 100644 --- a/src/renderer/components/common/OngoingIndicator.tsx +++ b/src/renderer/components/common/OngoingIndicator.tsx @@ -34,7 +34,7 @@ export const OngoingIndicator = ({ {showLabel && ( - + {label} )} @@ -51,15 +51,12 @@ export const OngoingBanner = (): React.JSX.Element => {
- - + + Session is in progress...
diff --git a/src/renderer/components/common/UpdateBanner.tsx b/src/renderer/components/common/UpdateBanner.tsx index c377aae1..3a0c0270 100644 --- a/src/renderer/components/common/UpdateBanner.tsx +++ b/src/renderer/components/common/UpdateBanner.tsx @@ -37,7 +37,7 @@ export const UpdateBanner = (): React.JSX.Element | null => { className="mb-1.5 flex items-center gap-2 text-xs" style={{ color: 'var(--color-text-secondary)' }} > - + Updating app {clampedPercent}% @@ -48,7 +48,7 @@ export const UpdateBanner = (): React.JSX.Element | null => { style={{ backgroundColor: 'var(--color-border)' }} >
diff --git a/src/renderer/components/dashboard/CliStatusBanner.tsx b/src/renderer/components/dashboard/CliStatusBanner.tsx index 98d6052f..ecdd4e9d 100644 --- a/src/renderer/components/dashboard/CliStatusBanner.tsx +++ b/src/renderer/components/dashboard/CliStatusBanner.tsx @@ -34,7 +34,7 @@ const VARIANT_STYLES: Record = { loading: { border: 'var(--color-border)', bg: 'transparent' }, error: { border: '#ef4444', bg: 'rgba(239, 68, 68, 0.06)' }, success: { border: '#22c55e', bg: 'rgba(34, 197, 94, 0.04)' }, - info: { border: '#3b82f6', bg: 'rgba(59, 130, 246, 0.04)' }, + info: { border: 'var(--info-border)', bg: 'var(--info-bg)' }, warning: { border: '#f59e0b', bg: 'rgba(245, 158, 11, 0.06)' }, }; @@ -255,7 +255,7 @@ export const CliStatusBanner = (): React.JSX.Element | null => { >
- + Downloading Claude CLI... diff --git a/src/renderer/components/dashboard/DashboardView.tsx b/src/renderer/components/dashboard/DashboardView.tsx index e02380cb..afcc0b00 100644 --- a/src/renderer/components/dashboard/DashboardView.tsx +++ b/src/renderer/components/dashboard/DashboardView.tsx @@ -287,7 +287,7 @@ const RepositoryCard = ({ <> · {taskCounts.inProgress > 0 && ( - + {taskCounts.inProgress} active )} diff --git a/src/renderer/components/layout/SortableTab.tsx b/src/renderer/components/layout/SortableTab.tsx index 499849f4..2be1cc5d 100644 --- a/src/renderer/components/layout/SortableTab.tsx +++ b/src/renderer/components/layout/SortableTab.tsx @@ -7,7 +7,8 @@ import { useCallback, useState } from 'react'; import { useSortable } from '@dnd-kit/sortable'; import { CSS } from '@dnd-kit/utilities'; -import { getTeamColorSet } from '@renderer/constants/teamColors'; +import { getTeamColorSet, getThemedBadge } from '@renderer/constants/teamColors'; +import { useTheme } from '@renderer/hooks/useTheme'; import { useStore } from '@renderer/store'; import { nameColorSet } from '@renderer/utils/projectColor'; import { @@ -61,6 +62,7 @@ export const SortableTab = ({ setRef, }: SortableTabProps): React.JSX.Element => { const [isHovered, setIsHovered] = useState(false); + const { isLight } = useTheme(); const isPinned = useStore( useShallow((s) => @@ -96,14 +98,14 @@ export const SortableTab = ({ opacity: isDragging ? 0.3 : 1, backgroundColor: isActive ? teamColorSet - ? teamColorSet.badge + ? getThemedBadge(teamColorSet, isLight) : 'var(--color-surface-raised)' : isHovered ? teamColorSet - ? teamColorSet.badge + ? getThemedBadge(teamColorSet, isLight) : 'var(--color-surface-overlay)' : teamColorSet - ? teamColorSet.badge + ? getThemedBadge(teamColorSet, isLight) : 'transparent', color: isActive || isHovered diff --git a/src/renderer/components/settings/sections/GeneralSection.tsx b/src/renderer/components/settings/sections/GeneralSection.tsx index c78078fa..7f2fdbbf 100644 --- a/src/renderer/components/settings/sections/GeneralSection.tsx +++ b/src/renderer/components/settings/sections/GeneralSection.tsx @@ -7,12 +7,13 @@ import { useCallback, useEffect, useMemo, useState } from 'react'; import { api, isElectronMode } from '@renderer/api'; import { confirm } from '@renderer/components/common/ConfirmDialog'; import { Combobox } from '@renderer/components/ui/combobox'; +import { cn } from '@renderer/lib/utils'; import { useStore } from '@renderer/store'; import { getFullResetState } from '@renderer/store/utils/stateResetHelpers'; import { AGENT_LANGUAGE_OPTIONS, resolveLanguageName } from '@shared/utils/agentLanguage'; import { Check, Copy, FolderOpen, Laptop, Loader2, RotateCcw } from 'lucide-react'; -import { SettingRow, SettingsSectionHeader, SettingsSelect, SettingsToggle } from '../components'; +import { SettingRow, SettingsSectionHeader, SettingsToggle } from '../components'; import type { SafeConfig } from '../hooks/useSettingsConfig'; import type { ClaudeRootInfo, WslClaudeRootCandidate } from '@shared/types'; @@ -335,12 +336,24 @@ export const GeneralSection = ({ - +
+ {THEME_OPTIONS.map((opt) => ( + + ))} +
Group by:
@@ -508,7 +508,7 @@ export const GlobalTaskList = ({ className={cn( 'rounded px-2 py-0.5 transition-colors', groupingMode === mode - ? 'bg-surface-raised text-text shadow-sm' + ? 'ring-border-emphasis/60 bg-surface-raised text-text shadow-sm ring-1' : 'text-text-muted hover:text-text-secondary' )} > diff --git a/src/renderer/components/sidebar/SidebarTaskItem.tsx b/src/renderer/components/sidebar/SidebarTaskItem.tsx index 2fc40d9b..e1aad9c8 100644 --- a/src/renderer/components/sidebar/SidebarTaskItem.tsx +++ b/src/renderer/components/sidebar/SidebarTaskItem.tsx @@ -2,6 +2,7 @@ import { useEffect, useMemo, useRef, useState } from 'react'; import { Tooltip, TooltipContent, TooltipTrigger } from '@renderer/components/ui/tooltip'; import { getTeamColorSet } from '@renderer/constants/teamColors'; +import { useTheme } from '@renderer/hooks/useTheme'; import { useUnreadCommentCount } from '@renderer/hooks/useUnreadCommentCount'; import { useStore } from '@renderer/store'; import { buildMemberColorMap } from '@renderer/utils/memberHelpers'; @@ -78,6 +79,7 @@ export const SidebarTaskItem = ({ const openGlobalTaskDetail = useStore((s) => s.openGlobalTaskDetail); const teamMembers = useStore((s) => s.teamByName[task.teamName]?.members); const unreadCount = useUnreadCommentCount(task.teamName, task.id, task.comments); + const { isLight } = useTheme(); const isRenaming = renamingKey === `${task.teamName}:${task.id}`; const displaySubject = getDisplaySubject?.(task) ?? task.subject; @@ -118,19 +120,24 @@ export const SidebarTaskItem = ({ return colorName ? getTeamColorSet(colorName) : null; }, [teamMembers, task.owner]); + const ownerTextColor = useMemo(() => { + if (!ownerColorSet) return undefined; + return isLight && ownerColorSet.textLight ? ownerColorSet.textLight : ownerColorSet.text; + }, [ownerColorSet, isLight]); + const projectLabel = useMemo(() => { if (!task.projectPath?.trim()) return null; return projectLabelFromPath(task.projectPath); }, [task.projectPath]); const projectColorSet = useMemo( - () => (projectLabel ? projectColor(projectLabel) : null), - [projectLabel] + () => (projectLabel ? projectColor(projectLabel, isLight) : null), + [projectLabel, isLight] ); const teamColor = useMemo( - () => (showTeamName ? nameColorSet(task.teamDisplayName) : null), - [showTeamName, task.teamDisplayName] + () => (showTeamName ? nameColorSet(task.teamDisplayName, isLight) : null), + [showTeamName, task.teamDisplayName, isLight] ); const showTeamRow = showTeamName && !hideTeamName; @@ -220,17 +227,19 @@ export const SidebarTaskItem = ({ )} {!showTeamRow && ( <> - {projectLabel && ·} + {projectLabel && ·} {task.owner ?? 'unassigned'} )} {dateLabel && ( - + {dateLabel} )} @@ -242,14 +251,14 @@ export const SidebarTaskItem = ({ className="mt-0.5 flex w-full items-center gap-1.5 text-[10px] leading-tight" style={{ color: 'var(--color-text-muted)' }} > - Team: + Team: {task.teamDisplayName} - · + · {task.owner ?? 'unassigned'} diff --git a/src/renderer/components/team/CollapsibleTeamSection.tsx b/src/renderer/components/team/CollapsibleTeamSection.tsx index 5b513f4d..fb78dd64 100644 --- a/src/renderer/components/team/CollapsibleTeamSection.tsx +++ b/src/renderer/components/team/CollapsibleTeamSection.tsx @@ -106,7 +106,7 @@ export const CollapsibleTeamSection = ({ {secondaryBadge != null && secondaryBadge > 0 && ( {secondaryBadge} new diff --git a/src/renderer/components/team/MemberBadge.tsx b/src/renderer/components/team/MemberBadge.tsx index bca37d17..a6857a06 100644 --- a/src/renderer/components/team/MemberBadge.tsx +++ b/src/renderer/components/team/MemberBadge.tsx @@ -1,4 +1,5 @@ -import { getTeamColorSet } from '@renderer/constants/teamColors'; +import { getTeamColorSet, getThemedBadge } from '@renderer/constants/teamColors'; +import { useTheme } from '@renderer/hooks/useTheme'; import { agentAvatarUrl } from '@renderer/utils/memberHelpers'; interface MemberBadgeProps { @@ -24,12 +25,13 @@ export const MemberBadge = ({ onClick, }: 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 badgeStyle = { - backgroundColor: colors.badge, + backgroundColor: getThemedBadge(colors, isLight), color: colors.text, border: `1px solid ${colors.border}40`, }; diff --git a/src/renderer/components/team/TeamDetailView.tsx b/src/renderer/components/team/TeamDetailView.tsx index 307f9181..44600ce8 100644 --- a/src/renderer/components/team/TeamDetailView.tsx +++ b/src/renderer/components/team/TeamDetailView.tsx @@ -13,11 +13,12 @@ import { DialogTitle, } from '@renderer/components/ui/dialog'; import { Tooltip, TooltipContent, TooltipTrigger } from '@renderer/components/ui/tooltip'; -import { getTeamColorSet } from '@renderer/constants/teamColors'; +import { getTeamColorSet, getThemedBadge } from '@renderer/constants/teamColors'; import { useBranchSync } from '@renderer/hooks/useBranchSync'; import { useTabUI } from '@renderer/hooks/useTabUI'; import { useTeamMessagesRead } from '@renderer/hooks/useTeamMessagesRead'; import { useTeamMessagesExpanded } from '@renderer/hooks/useTeamMessagesExpanded'; +import { useTheme } from '@renderer/hooks/useTheme'; import { cn } from '@renderer/lib/utils'; import { useStore } from '@renderer/store'; import { createChipFromSelection } from '@renderer/utils/chipUtils'; @@ -125,6 +126,7 @@ function filterKanbanTasks(tasks: TeamTaskWithKanban[], query: string): TeamTask } export const TeamDetailView = ({ teamName }: TeamDetailViewProps): React.JSX.Element => { + const { isLight } = useTheme(); const [requestChangesTaskId, setRequestChangesTaskId] = useState(null); const [selectedTask, setSelectedTask] = useState(null); const [selectedMember, setSelectedMember] = useState(null); @@ -961,7 +963,7 @@ export const TeamDetailView = ({ teamName }: TeamDetailViewProps): React.JSX.Ele {headerColorSet ? (
) : null}
@@ -84,7 +85,7 @@ function renderMemberChips(members: TeamSummaryMember[]): React.JSX.Element { style={ memberColor ? { - backgroundColor: memberColor.badge, + backgroundColor: getThemedBadge(memberColor, isLight), color: memberColor.text, border: `1px solid ${memberColor.border}40`, } @@ -177,6 +178,7 @@ const StatusBadge = ({ status }: { status: TeamStatus }): React.JSX.Element => { }; export const TeamListView = (): React.JSX.Element => { + const { isLight } = useTheme(); const electronMode = isElectronMode(); const [showCreateDialog, setShowCreateDialog] = useState(false); const [copyData, setCopyData] = useState(null); @@ -679,7 +681,7 @@ export const TeamListView = (): React.JSX.Element => { {teamColorSet ? (
) : null}
{
{team.members && team.members.length > 0 ? ( - renderMemberChips(team.members) + renderMemberChips(team.members, isLight) ) : team.memberCount === 0 ? ( Solo @@ -895,7 +897,7 @@ export const TeamListView = (): React.JSX.Element => {

{team.members && team.members.length > 0 && (
- {renderMemberChips(team.members)} + {renderMemberChips(team.members, isLight)}
)}
diff --git a/src/renderer/components/team/TeamSessionsSection.tsx b/src/renderer/components/team/TeamSessionsSection.tsx index 0a500389..13929447 100644 --- a/src/renderer/components/team/TeamSessionsSection.tsx +++ b/src/renderer/components/team/TeamSessionsSection.tsx @@ -130,7 +130,7 @@ export const TeamSessionsSection = ({ {selectedSessionId !== null && (
diff --git a/src/renderer/components/team/ToolApprovalSheet.tsx b/src/renderer/components/team/ToolApprovalSheet.tsx index 4894939a..2268b088 100644 --- a/src/renderer/components/team/ToolApprovalSheet.tsx +++ b/src/renderer/components/team/ToolApprovalSheet.tsx @@ -1,6 +1,7 @@ import React, { useCallback, useEffect, useRef, useState } from 'react'; -import { getTeamColorSet } from '@renderer/constants/teamColors'; +import { getTeamColorSet, getThemedBadge } from '@renderer/constants/teamColors'; +import { useTheme } from '@renderer/hooks/useTheme'; import { useStore } from '@renderer/store'; import { FileText, Search, Terminal } from 'lucide-react'; @@ -112,6 +113,7 @@ export const ToolApprovalSheet: React.FC = () => { const teamSummary = teams.find((t) => t.teamName === current.teamName); const teamColor = teamSummary?.color ? getTeamColorSet(teamSummary.color) : null; + const { isLight } = useTheme(); return (
{ 0 - ? 'bg-blue-500/20 text-blue-400' + ? 'bg-blue-500/20 text-blue-600 dark:text-blue-400' : 'bg-[var(--color-surface-raised)] text-[var(--color-text-muted)]' }`} title={unreadCount > 0 ? `${unreadCount} unread` : 'All read'} diff --git a/src/renderer/components/team/activity/ActiveTasksBlock.tsx b/src/renderer/components/team/activity/ActiveTasksBlock.tsx index a93993ad..76fd2f7d 100644 --- a/src/renderer/components/team/activity/ActiveTasksBlock.tsx +++ b/src/renderer/components/team/activity/ActiveTasksBlock.tsx @@ -1,5 +1,6 @@ import { CARD_BG, CARD_BORDER_STYLE, CARD_ICON_MUTED } from '@renderer/constants/cssVariables'; -import { getTeamColorSet } from '@renderer/constants/teamColors'; +import { getTeamColorSet, getThemedBadge } from '@renderer/constants/teamColors'; +import { useTheme } from '@renderer/hooks/useTheme'; import { formatAgentRole } from '@renderer/utils/formatAgentRole'; import { buildMemberColorMap } from '@renderer/utils/memberHelpers'; import { Loader2 } from 'lucide-react'; @@ -19,6 +20,7 @@ export const ActiveTasksBlock = ({ onMemberClick, onTaskClick, }: ActiveTasksBlockProps): React.JSX.Element | null => { + const { isLight } = useTheme(); const colorMap = buildMemberColorMap(members); const taskMap = new Map(tasks.map((t) => [t.id, t])); const working = members.filter((m) => m.currentTaskId != null); @@ -61,7 +63,7 @@ export const ActiveTasksBlock = ({ type="button" className="rounded px-1.5 py-0.5 text-[10px] font-medium tracking-wide transition-opacity hover:opacity-90 focus:outline-none focus:ring-1 focus:ring-[var(--color-border)]" style={{ - backgroundColor: colors.badge, + backgroundColor: getThemedBadge(colors, isLight), color: colors.text, border: `1px solid ${colors.border}40`, }} @@ -73,7 +75,7 @@ export const ActiveTasksBlock = ({ void): React.
)} -
+
+
+ +
{thought.toolSummary && ( diff --git a/src/renderer/components/team/activity/PendingRepliesBlock.tsx b/src/renderer/components/team/activity/PendingRepliesBlock.tsx index 6a535c42..04dea364 100644 --- a/src/renderer/components/team/activity/PendingRepliesBlock.tsx +++ b/src/renderer/components/team/activity/PendingRepliesBlock.tsx @@ -1,5 +1,6 @@ import { CARD_BG, CARD_BORDER_STYLE, CARD_ICON_MUTED } from '@renderer/constants/cssVariables'; -import { getTeamColorSet } from '@renderer/constants/teamColors'; +import { getTeamColorSet, getThemedBadge } from '@renderer/constants/teamColors'; +import { useTheme } from '@renderer/hooks/useTheme'; import { formatAgentRole } from '@renderer/utils/formatAgentRole'; import { buildMemberColorMap } from '@renderer/utils/memberHelpers'; import { formatDistanceToNowStrict } from 'date-fns'; @@ -18,6 +19,7 @@ export const PendingRepliesBlock = ({ pendingRepliesByMember, onMemberClick, }: PendingRepliesBlockProps): React.JSX.Element | null => { + const { isLight } = useTheme(); const colorMap = buildMemberColorMap(members); const pending = Object.entries(pendingRepliesByMember) .map(([name, sentAtMs]) => ({ @@ -62,7 +64,7 @@ export const PendingRepliesBlock = ({ type="button" className="rounded px-1.5 py-0.5 text-[10px] font-medium tracking-wide transition-opacity hover:opacity-90 focus:outline-none focus:ring-1 focus:ring-[var(--color-border)]" style={{ - backgroundColor: colors.badge, + backgroundColor: getThemedBadge(colors, isLight), color: colors.text, border: `1px solid ${colors.border}40`, }} @@ -75,7 +77,7 @@ export const PendingRepliesBlock = ({ {/* Quote block — styled like SendMessageDialog */} -
+
{/* Decorative quotation mark */} - + {/* "Replying to" + MemberBadge */}
- Replying to + Replying to
@@ -50,7 +50,7 @@ export const ReplyQuoteBlock = ({ {isLong ? (
) : currentTask.description ? ( -
{ - if (e.key === 'Enter' || e.key === ' ') { - e.preventDefault(); - startEditDescription(); - } - }} - > +
- + + + + + Edit description +
) : (