diff --git a/apps/mobile/src/app/(app)/(tabs)/_layout.tsx b/apps/mobile/src/app/(app)/(tabs)/_layout.tsx index 6013e1a069..1703e7dff3 100644 --- a/apps/mobile/src/app/(app)/(tabs)/_layout.tsx +++ b/apps/mobile/src/app/(app)/(tabs)/_layout.tsx @@ -16,8 +16,8 @@ const TAB_BAR_ICON_STYLE = { } satisfies ViewStyle; const TAB_BAR_LABEL_STYLE = { fontFamily: 'JetBrainsMono_500Medium', - fontSize: 10, - letterSpacing: 0, + fontSize: 11, + letterSpacing: 0.2, marginTop: 2, minWidth: TAB_BAR_ITEM_CONTENT_WIDTH, textAlign: 'center', diff --git a/apps/mobile/src/app/(app)/kiloclaw/[instance-id]/settings/model-list.tsx b/apps/mobile/src/app/(app)/kiloclaw/[instance-id]/settings/model-list.tsx index e02d3cd024..213c05dd4c 100644 --- a/apps/mobile/src/app/(app)/kiloclaw/[instance-id]/settings/model-list.tsx +++ b/apps/mobile/src/app/(app)/kiloclaw/[instance-id]/settings/model-list.tsx @@ -83,11 +83,17 @@ export default function ModelListScreen() { {item.id} {item.supportsVision && } - {selected && } + {selected && } ); }, - [currentModel, handleSelect, mutations.updateModel.isPending, colors.mutedForeground] + [ + currentModel, + handleSelect, + mutations.updateModel.isPending, + colors.mutedForeground, + colors.primary, + ] ); const sections = [ diff --git a/apps/mobile/src/components/agents/chat-composer.tsx b/apps/mobile/src/components/agents/chat-composer.tsx index 09b5228811..767535a25e 100644 --- a/apps/mobile/src/components/agents/chat-composer.tsx +++ b/apps/mobile/src/components/agents/chat-composer.tsx @@ -166,6 +166,10 @@ export function ChatComposer({ @@ -174,6 +178,10 @@ export function ChatComposer({ { setIsExpanded(prev => !prev); @@ -142,7 +142,11 @@ export function ChildSessionSection({ style={{ transform: [{ rotate: isExpanded ? '90deg' : '0deg' }] }} /> - {isRunning ? : } + {isRunning ? ( + + ) : ( + + )} @@ -150,7 +154,7 @@ export function ChildSessionSection({ {currentTool ? ( - {currentTool.tool} + {currentTool.tool} {currentTool.context ? ` ${currentTool.context}` : ''} ) : null} @@ -261,14 +265,14 @@ function ChildSessionMessage({ ); } -function getStatusBorderColor(status: string, destructiveColor: string): string { +function getStatusBorderColor(status: string, colors: ThemeColors): string { if (status === 'error') { - return destructiveColor; + return colors.destructive; } if (status === 'completed') { - return '#22c55e'; + return colors.good; } - return '#3b82f6'; + return colors.agentSky; } function StatusBadge({ status }: Readonly<{ status: string }>) { diff --git a/apps/mobile/src/components/agents/session-list-screen.tsx b/apps/mobile/src/components/agents/session-list-screen.tsx index 626fb720f0..698188c75d 100644 --- a/apps/mobile/src/components/agents/session-list-screen.tsx +++ b/apps/mobile/src/components/agents/session-list-screen.tsx @@ -234,8 +234,11 @@ export function AgentSessionListScreen() { onPress={() => { router.push(getNewAgentSessionPath(organizationId) as Href); }} - hitSlop={8} + // right slop capped so the expanded targets don't overlap inside the 16px gap + hitSlop={{ top: 11, bottom: 11, left: 11, right: 8 }} + accessibilityRole="button" accessibilityLabel="New session" + className="active:opacity-70" > @@ -243,8 +246,10 @@ export function AgentSessionListScreen() { onPress={() => { setShowFilterModal(true); }} - hitSlop={8} + hitSlop={{ top: 12, bottom: 12, left: 8, right: 12 }} + accessibilityRole="button" accessibilityLabel="Filter sessions" + className="active:opacity-70" > { handleSelectAutoModel(card.id); }} + accessibilityRole="button" + accessibilityState={{ selected, disabled: mutations.updateModel.isPending }} + accessibilityLabel={`${card.label} auto model`} > {selected && ( - + )} - + {card.label} @@ -161,10 +170,12 @@ export function ModelPicker() { {/* Navigate to full model list */} { router.push(`/(app)/kiloclaw/${instanceId}/settings/model-list` as Href); }} + accessibilityRole="link" + accessibilityLabel="Browse all 500+ models" > or select from 500+ models diff --git a/apps/mobile/src/components/profile-avatar-button.tsx b/apps/mobile/src/components/profile-avatar-button.tsx index ae5287da31..a15e026552 100644 --- a/apps/mobile/src/components/profile-avatar-button.tsx +++ b/apps/mobile/src/components/profile-avatar-button.tsx @@ -17,6 +17,7 @@ export function ProfileAvatarButton() { }} accessibilityRole="button" accessibilityLabel="Open profile" + className="h-11 w-11 items-center justify-center rounded-full active:opacity-70" > diff --git a/apps/mobile/src/components/screen-header.tsx b/apps/mobile/src/components/screen-header.tsx index 7f3a6ee14c..798da347aa 100644 --- a/apps/mobile/src/components/screen-header.tsx +++ b/apps/mobile/src/components/screen-header.tsx @@ -64,7 +64,9 @@ export function ScreenHeader({ titleNode = onTitlePress ? ( {titleText} @@ -89,6 +91,7 @@ export function ScreenHeader({ } }} hitSlop={12} + accessibilityRole="button" accessibilityLabel="Go back" className="-ml-1 mr-1 active:opacity-70" > diff --git a/apps/mobile/src/components/ui/configure-row.tsx b/apps/mobile/src/components/ui/configure-row.tsx index 3a32875d1b..2e85d947f6 100644 --- a/apps/mobile/src/components/ui/configure-row.tsx +++ b/apps/mobile/src/components/ui/configure-row.tsx @@ -57,10 +57,8 @@ export function ConfigureRow({ - {title} - {subtitle ? ( - {subtitle} - ) : null} + {title} + {subtitle ? {subtitle} : null} {trailing ?? } diff --git a/apps/mobile/src/components/ui/session-row.tsx b/apps/mobile/src/components/ui/session-row.tsx index c9d6ee035f..b806cf4981 100644 --- a/apps/mobile/src/components/ui/session-row.tsx +++ b/apps/mobile/src/components/ui/session-row.tsx @@ -79,21 +79,18 @@ export function SessionRow({ {agentLabel} {live && } {!live && meta && ( - + {meta} )} - + {title} {subtitle ? ( {subtitle}