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}