Skip to content

fix(mobile): compact session header rows and dedupe session filter options - #6562

Merged
iscekic merged 1 commit into
mainfrom
kwf/owner-ui-papercuts-d78e
Sep 23, 2026
Merged

iscekic merged 1 commit into
mainfrom
kwf/owner-ui-papercuts-d78e

Conversation

@iscekic

@iscekic iscekic commented Sep 22, 2026 •

Copy link
Copy Markdown
Collaborator

Changelog for users

  • The session header fits two rows: back button, title, and context pill on top; goal status and pull-request link below.
  • A row-2 element appears only when it has data; with neither a goal nor a pull request the second row is absent.
  • The goal row's PR link keeps the same trailing position whether or not a goal is shown.
  • The live agents list header keeps the eyebrow and title beside "show all" and the filters control on one row.
  • The live agents list renders clean to the tab bar edge with no dark band above it.
  • The new-session button floats over the list, and the last row still scrolls clear of it.
  • The model picker stays on one row on the session and new-session pages; a long model name truncates instead of wrapping.
  • Session filters list each platform and each project once, even when a project has several git-URL forms or a saved platform is an older variant of another; the badge counts a merged project, and a platform bucket with its variant, once.

Changelog for maintainers

  • apps/mobile/src/components/agents/session-list-helpers.ts:112 — rejected (no_change): the option key is the formatted, locale case-folded label by design, and the sheet renders that host-less label as the option name. Keying on host + path would list two identical-looking rows for one visible name — the duplicate the request removes. Same-label git-URL forms stay one option; nothing changed.
  • apps/mobile/src/lib/agent-session-filters.ts:85 — accepted: the badge counted the raw platform array, so a saved bucket plus one of its variants showed 2 while the sheet rendered one checked row. The count now collapses each persisted platform through knownPlatformBucket, keeps an unknown platform as itself, and counts the distinct rows. New unit cases cover a bucket with its variant, distinct buckets, and an unknown platform; these replace the earlier claim that label dedupe alone covered the badge.
  • apps/mobile/src/components/screen-header.tsx:310 — accepted: inlineActions was rendered only in the leading-aligned title row, so a centered (modal) header silently dropped the trailing controls. The centered branch now renders inlineActions beside the title, the prop doc states it applies to both branches, and the blind spacer is skipped when inline actions are present. A mounted test covers the centered case.
  • ScreenHeader adds an uncapped inlineActions title-row slot; headerRight keeps its half-width cap — start here for the agents header row.
  • The PR badge moved from the header into the goal row; the row mounts for a goal or a PR and stays absent while a no-goal, no-PR session loads.
  • Live-list insets split: the tab-bar inset stays on the frame; the FAB clearance is now 64px content padding, changing how far rows scroll.
  • projectOptionKey (formatted label, case-folded in the active locale) and knownPlatformBucket define filter identity for options, matching, the badge count, and persisted variants; matching uses label identity, so one stored URL matches every alias of a merged project.
  • Headings and labels shrink and truncate (min-w-0, numberOfLines={1}); the branded-splash test now requires the splash entry with arrayContaining; new unit tests cover the single-row toolbar, the goal-row PR slot, the header inline slots, and filter dedupe, and the tabs-layout keyboard test moved beside the other component tests with unchanged assertions.

E2E proof

Session page: the model picker pill (model name, effort badge, chevron) stays on one row with no second line (screenshot 5 in the PR) — e5.png

needs:seed (the signed-in account's recent repositories carry an https URL and its ssh alias that render to one label): the sheet lists that project once, selecting it and applying shows the badge 1… — e9-sheet.png

session-open: row 1 shows back + title + the context pill, row 2 shows the goal status and the PR link on one line (screenshot 1 in the PR) — e1.png

ux-check: Live agents list scrolled to the bottom: no opaque band sits above the tab bar and the last row scrolls fully clear of the FAB. — e14.png

ux-check: Model picker on the session page and on the new-session page with a long model name at the narrowest width: the pill (name, effort badge, chevron) stays a single row, with the name… — e15-new-session-hier.png

ux-check: Session page, PR-only session vs goal+PR session: the PR link sits at the same trailing position in row 2 in both. — e12-goalpr.png

ux-check: Session page, session with a goal and a PR: the header shows exactly two rows — row 1 = back + title + context pill (percentage and cost), row 2 = goal status + PR link; the PR link is not… — e2.png

ux-check: Session page, session with no goal and no PR: after load, no second header row and no PR skeleton or empty band is visible; the transcript starts directly under the header. — e11.png

[e1] ux-check: Session page, session with a goal and a PR: the header shows exactly two rows — row 1 = back + title + context pill (percentage and cost), row 2 = goal status + PR link; the PR link is not… — prior/e1-goalpr-live.png

[e1] ux-check: Session page, session with a goal and a PR: the header shows exactly two rows — row 1 = back + title + context pill (percentage and cost), row 2 = goal status + PR link; the PR link is not… — e2e-mobile-app/e1.png

[e15] ux-check: Model picker on the session page and on the new-session page with a long model name at the narrowest width: the pill (name, effort badge, chevron) stays a single row, with the name… — prior/e15-session-hier.png

[e4] Agents list: rows render clean to the tab bar edge, New session button floats over the list, last row clears it — scripted-shard4/e4.png

[e13] ux-check: Live agents list header one row at 480-wide viewport in a long-text locale — e13.png

[e10] session page, goal + PR — header is exactly two rows — e10.png

[e13] ux-check: Live agents list header one row at 480-wide viewport in a long-text locale — e13-hu.png

[e12] ux-check: Session page, PR-only session vs goal+PR session: the PR link sits at the same trailing position in row 2 in both. — e12-pronly.png

[e9] needs:seed (the signed-in account's recent repositories carry an https URL and its ssh alias that render to one label): the sheet lists that project once, selecting it and applying shows the badge 1… — e9-applied.png

e4

Owner request

Surface: the mobile app (apps/mobile).

Five UI papercuts in the mobile app. The owner reported them from an iOS build (TestFlight screenshots, Serbian UI text). They are shared React Native layout fixes: one implementation for every platform, and every layout must hold at every locale text length the app ships. One must-run scenario per defect below, and a screenshot per screen in the pull request.

  1. Session page header. Observed: the header takes a large share of the screen: one row with the back button, the session title, the pull-request link and the context pill, then a second row with the goal status ("Aktivan cilj") and its expand chevron. Expected: the header takes the least space possible and shows the same data as today. Two rows only:

    • Row 1: the back button, the session title, the context details (the pill with the context percentage and the cost).
    • Row 2: the goal status (tap opens view, edit and cancel for the goal) and the pull-request link.
      Each row 2 element appears only when it has data. Row 2 is absent when it holds nothing.
  2. Live agents list page, top row. Observed: the top breaks into two rows: the "live agents" eyebrow (for example "17 UZIVO") and the title ("Agenti") on the left, then "show all" ("PRIKAZI SVE") and the filters control pushed to a second line at the right. Expected: one row: the eyebrow and the title on the left, "show all" and the filters control on the right.

  3. Live agents list page, overlay. Observed: a black overlay sits over the session list at the bottom of the screen, just above the tab bar. Expected: no overlay; the list renders clean to the tab bar edge.

  4. Model picker wrap. Observed: the model picker pill (model name, effort badge, chevron) breaks into two rows on the session page and on the new session page. Expected: the picker never breaks into two rows on either page: it stays one row at every width and text length.

  5. Session filters modal duplicates. Observed: the project option list shows the same project twice (for example "isecekic/kilo-workflow" twice, "Kilo-Org/cloud" twice). Expected: no filter option ever appears twice; deduplicate the platform and project option lists.

Do not remove or hide any data these screens show today.

E2E proof — log excerpts

[e1] ux-check: Session page, session with a goal and a PR: the header shows exac -> pass :: android emulator-5554, session ses_f35f919a1ffepIu7rfFma1q117 (goal created live via the app's /goal command in a live remote CLI session, PR #1 attached with the app:session-pr-link seed, e1-goalpr-seed.log): e1-scene.log line 83 'SCENE e1 OK' — row 1 is 'android.widget.Button Go back tappable [0,130][101,231]' + 'android.view.View Session tappable [111,147][714,212]' + 'android.widget.Button Context 19,374 of 1,310,720 tokens, 1% used, cost 0.08 cents. Tap to view context details. tappable [741,123][1043,238]' with 'android.widget.TextView $0.0008 tappable [909,162][1013,199]' (percentage and cost), and row 2 is 'android.widget.TextView Goal blocked tappable [92,291][846,328]' + 'android.w

Comment thread apps/mobile/src/components/agents/session-list-helpers.ts
Comment thread apps/mobile/src/lib/agent-session-filters.ts Outdated
Comment thread apps/mobile/src/components/screen-header.tsx Outdated
@kilo-code-bot

kilo-code-bot Bot commented Sep 22, 2026 •

Copy link
Copy Markdown
Contributor

Code Review Summary

Status: 1 Issue Found | Recommendation: Address before merge

Executive Summary

No new issues were found in the rebased HEAD; the only remaining item is the previously reported (and author-declined) projectOptionKey host-folding suggestion, which stays tracked in its existing thread.

Overview

Severity Count
CRITICAL 0
WARNING 0
SUGGESTION 1
Issue Details (click to expand)

SUGGESTION

File Line Issue
apps/mobile/src/components/agents/session-list-helpers.ts 128 projectOptionKey folds the host away, so same-path repositories on different hosts become one filter option and filter in together. Carried forward unresolved (author declined as by-design); already tracked in an existing thread, so not re-commented.
Files Reviewed (22 files)
  • apps/mobile/src/components/agents/chat-toolbar-model-name.mounted.test.tsx
  • apps/mobile/src/components/agents/chat-toolbar.test.ts
  • apps/mobile/src/components/agents/chat-toolbar.tsx
  • apps/mobile/src/components/agents/live-session-filters.test.ts
  • apps/mobile/src/components/agents/live-session-filters.ts
  • apps/mobile/src/components/agents/platform-filter-modal.mounted.test.tsx
  • apps/mobile/src/components/agents/platform-filter-modal.tsx
  • apps/mobile/src/components/agents/session-detail-content.test.ts
  • apps/mobile/src/components/agents/session-detail-content.tsx
  • apps/mobile/src/components/agents/session-goal-section.mounted.test.tsx
  • apps/mobile/src/components/agents/session-goal-section.tsx
  • apps/mobile/src/components/agents/session-history-screen.mounted.test.tsx
  • apps/mobile/src/components/agents/session-list-helpers.test.ts
  • apps/mobile/src/components/agents/session-list-helpers.ts - 1 issue (carried forward)
  • apps/mobile/src/components/agents/session-list-screen.mounted.test.tsx
  • apps/mobile/src/components/agents/session-list-screen.tsx
  • apps/mobile/src/components/agents/use-agent-session-list-data.ts
  • apps/mobile/src/components/screen-header.mounted.test.tsx
  • apps/mobile/src/components/screen-header.tsx
  • apps/mobile/src/components/tabs-layout.mounted.test.tsx
  • apps/mobile/src/lib/agent-session-filters.test.ts
  • apps/mobile/src/lib/agent-session-filters.ts

Fix these issues in Kilo Cloud

Previous Review Summaries (4 snapshots, latest commit b3c4f19)

Current summary above is authoritative. Previous snapshots are kept for context only.

Previous review (commit b3c4f19)

Status: 1 Issue Found | Recommendation: Address before merge

Executive Summary

The platform-variant mismatch and the goal-row trailing alignment are both fixed at this HEAD; the only remaining item is the previously reported (and author-declined) projectOptionKey host-folding suggestion, which stays tracked in its existing thread.

Overview

Severity Count
CRITICAL 0
WARNING 0
SUGGESTION 1
Issue Details (click to expand)

SUGGESTION

File Line Issue
apps/mobile/src/components/agents/session-list-helpers.ts 128 projectOptionKey folds the host away, so same-path repositories on different hosts become one filter option and filter in together. Carried forward unresolved (author declined as by-design); already tracked in an existing thread, so not re-commented.
Files Reviewed (22 files)
  • apps/mobile/src/components/agents/chat-toolbar.tsx
  • apps/mobile/src/components/agents/chat-toolbar.test.ts
  • apps/mobile/src/components/agents/chat-toolbar-model-name.mounted.test.tsx
  • apps/mobile/src/components/agents/live-session-filters.ts
  • apps/mobile/src/components/agents/live-session-filters.test.ts
  • apps/mobile/src/components/agents/platform-filter-modal.tsx
  • apps/mobile/src/components/agents/platform-filter-modal.mounted.test.tsx
  • apps/mobile/src/components/agents/session-detail-content.tsx
  • apps/mobile/src/components/agents/session-detail-content.test.ts
  • apps/mobile/src/components/agents/session-goal-section.tsx
  • apps/mobile/src/components/agents/session-goal-section.mounted.test.tsx
  • apps/mobile/src/components/agents/session-history-screen.mounted.test.tsx
  • apps/mobile/src/components/agents/session-list-helpers.ts - 1 issue (carried forward)
  • apps/mobile/src/components/agents/session-list-helpers.test.ts
  • apps/mobile/src/components/agents/session-list-screen.tsx
  • apps/mobile/src/components/agents/session-list-screen.mounted.test.tsx
  • apps/mobile/src/components/agents/use-agent-session-list-data.ts
  • apps/mobile/src/components/screen-header.tsx
  • apps/mobile/src/components/screen-header.mounted.test.tsx
  • apps/mobile/src/components/tabs-layout.mounted.test.tsx
  • apps/mobile/src/lib/agent-session-filters.ts
  • apps/mobile/src/lib/agent-session-filters.test.ts

Fix these issues in Kilo Cloud

Previous review (commit 704fccf)

Status: 1 Issue Found | Recommendation: Address before merge

Executive Summary

The persisted-platform-variant mismatch is fixed in this revision: the badge, filter sheet, live filter, and history query now share normalisePlatformSelection. One previously reported suggestion remains open — projectOptionKey still folds the host away, so same-path repositories on different hosts share one filter option; the author declined it as by-design and it stays tracked in its existing thread.

Overview

Severity Count
CRITICAL 0
WARNING 0
SUGGESTION 1
Issue Details (click to expand)

SUGGESTION

File Line Issue
apps/mobile/src/components/agents/session-list-helpers.ts 128 projectOptionKey folds the host away, so same-path repositories on different hosts become one filter option and filter in together. Carried forward unresolved (author declined as by-design); already tracked in an existing thread, so not re-commented.
Files Reviewed (9 files)
  • apps/mobile/src/components/agents/live-session-filters.ts
  • apps/mobile/src/components/agents/session-list-helpers.ts - 1 issue (carried forward)
  • apps/mobile/src/components/agents/use-agent-session-list-data.ts
  • apps/mobile/src/lib/agent-session-filters.ts
  • apps/mobile/src/components/agents/live-session-filters.test.ts
  • apps/mobile/src/components/agents/session-list-helpers.test.ts
  • apps/mobile/src/components/agents/session-history-screen.mounted.test.tsx
  • apps/mobile/src/components/agents/chat-toolbar-model-name.mounted.test.tsx
  • apps/mobile/src/components/agents/session-detail-content.tsx

Fix these issues in Kilo Cloud

Previous review (commit e1f9b2e)

Status: 2 Issues Found | Recommendation: Address before merge

Executive Summary

Two low-severity filter-identity gaps in the mobile session filters: a persisted platform variant is collapsed in the badge and sheet but not in the live/history filter itself, and project identity still folds the host away so same-path repositories on different hosts share one option.

Overview

Severity Count
CRITICAL 0
WARNING 0
SUGGESTION 2
Issue Details (click to expand)

SUGGESTION

File Line Issue
apps/mobile/src/components/agents/live-session-filters.ts 113 The badge and filter sheet collapse a persisted platform variant into its bucket row, but this comparison (and the history query via expandPlatformFilter) still uses the raw stored value, so a saved cloud-agent-web renders the Cloud Agent row checked while matching no live row.
apps/mobile/src/components/agents/session-list-helpers.ts 112 projectOptionKey folds the host away, so same-path repositories on different hosts become one filter option and filter in together. Re-verified on HEAD; the author declined this one in the thread, so it is carried forward unresolved, not re-commented.
Files Reviewed (20 files)
  • apps/mobile/src/components/agents/live-session-filters.ts - 1 issue
  • apps/mobile/src/components/agents/session-list-helpers.ts - 1 issue
  • apps/mobile/src/lib/agent-session-filters.ts
  • apps/mobile/src/components/screen-header.tsx
  • apps/mobile/src/components/agents/chat-toolbar.tsx
  • apps/mobile/src/components/agents/platform-filter-modal.tsx
  • apps/mobile/src/components/agents/session-detail-content.tsx
  • apps/mobile/src/components/agents/session-goal-section.tsx
  • apps/mobile/src/components/agents/session-list-screen.tsx
  • apps/mobile/src/components/agents/live-session-filters.test.ts
  • apps/mobile/src/components/agents/session-list-helpers.test.ts
  • apps/mobile/src/lib/agent-session-filters.test.ts
  • apps/mobile/src/components/agents/platform-filter-modal.mounted.test.tsx
  • apps/mobile/src/components/agents/chat-toolbar.test.ts
  • apps/mobile/src/components/agents/chat-toolbar-model-name.mounted.test.tsx
  • apps/mobile/src/components/agents/session-detail-content.test.ts
  • apps/mobile/src/components/agents/session-goal-section.mounted.test.tsx
  • apps/mobile/src/components/agents/session-list-screen.mounted.test.tsx
  • apps/mobile/src/components/screen-header.mounted.test.tsx
  • apps/mobile/src/components/tabs-layout.mounted.test.tsx

Fix these issues in Kilo Cloud

Previous review (commit 9628295)

Status: 3 Issues Found | Recommendation: Address before merge

Executive Summary

Low-risk mobile UI/filter changes; the new label-based filter identity can merge repositories from different hosts, plus two smaller dedupe/slot inconsistencies.

Overview

Severity Count
CRITICAL 0
WARNING 0
SUGGESTION 3
Issue Details (click to expand)

SUGGESTION

File Line Issue
apps/mobile/src/components/agents/session-list-helpers.ts 112 projectOptionKey folds the host away, so same-path repos on different hosts become one filter option and filter in together.
apps/mobile/src/lib/agent-session-filters.ts 85 Badge uses raw platformFilter.length while the sheet collapses persisted platform variants, so the badge can exceed the checked rows.
apps/mobile/src/components/screen-header.tsx 310 inlineActions is not rendered in the separateHeading (centered/modal) branch.
Files Reviewed (20 files)
  • apps/mobile/plugins/branded-splash.test.ts
  • apps/mobile/src/components/agents/chat-toolbar-model-name.mounted.test.tsx
  • apps/mobile/src/components/agents/chat-toolbar.test.ts
  • apps/mobile/src/components/agents/chat-toolbar.tsx
  • apps/mobile/src/components/agents/live-session-filters.test.ts
  • apps/mobile/src/components/agents/live-session-filters.ts
  • apps/mobile/src/components/agents/platform-filter-modal.mounted.test.tsx
  • apps/mobile/src/components/agents/platform-filter-modal.tsx
  • apps/mobile/src/components/agents/session-detail-content.test.ts
  • apps/mobile/src/components/agents/session-detail-content.tsx
  • apps/mobile/src/components/agents/session-goal-section.mounted.test.tsx
  • apps/mobile/src/components/agents/session-goal-section.tsx
  • apps/mobile/src/components/agents/session-list-helpers.test.ts
  • apps/mobile/src/components/agents/session-list-helpers.ts - 1 issue
  • apps/mobile/src/components/agents/session-list-screen.mounted.test.tsx
  • apps/mobile/src/components/agents/session-list-screen.tsx
  • apps/mobile/src/components/screen-header.mounted.test.tsx
  • apps/mobile/src/components/screen-header.tsx - 1 issue
  • apps/mobile/src/lib/agent-session-filters.test.ts
  • apps/mobile/src/lib/agent-session-filters.ts - 1 issue

Fix these issues in Kilo Cloud


Reviewed by deepseek-v4.1-flash · Input: 0 · Output: 0 · Cached: 0

Review guidance: REVIEW.md from base branch main

@iscekic
iscekic marked this pull request as draft September 22, 2026 17:18
@iscekic
iscekic force-pushed the kwf/owner-ui-papercuts-d78e branch from 388f392 to e1f9b2e Compare September 22, 2026 19:48
@iscekic
iscekic marked this pull request as ready for review September 22, 2026 20:03
Comment thread apps/mobile/src/components/agents/live-session-filters.ts Outdated
@iscekic
iscekic marked this pull request as draft September 22, 2026 20:13
@iscekic
iscekic force-pushed the kwf/owner-ui-papercuts-d78e branch from 6db7a62 to 704fccf Compare September 22, 2026 22:43
@iscekic
iscekic marked this pull request as ready for review September 22, 2026 23:01
@iscekic

iscekic commented Sep 22, 2026

Copy link
Copy Markdown
Collaborator Author

bot: rejected: a suggestion, not a defect. A typed review read this finding as needing no code change before merge; the code stays as is. Say so here if one of them does change behaviour and it will be repaired.

  • apps/mobile/src/components/agents/session-list-helpers.ts:128 — projectOptionKey folds the host away, so same-path repositories on different hosts become one filter option and filter in together. Carried forward unresolved (author declined as by-design); already tracked in an existing thread, so n (p=0.87)

@iscekic

iscekic commented Sep 23, 2026

Copy link
Copy Markdown
Collaborator Author

kilo-review — independent audit of the published diff.

Status: 1 Issues

File Line Issue
apps/mobile/src/components/agents/session-goal-section.tsx 78 The PR link does not keep the same trailing position between a PR-only session and a goal+PR session: the goal-absent row renders the trailing slot alone with ml-auto (badge right edge at the row edge), while the goal row renders the same slot before the DisclosureChevron, so the badge's right edge differs by the chevron's 24px plus the 8px gap-2.

@iscekic
iscekic marked this pull request as draft September 23, 2026 00:39
@iscekic

iscekic commented Sep 23, 2026

Copy link
Copy Markdown
Collaborator Author

bot: Accepted. Pushed 2cc2f32 (kwf kwf-fix-review-7309).

What changed:

  • apps/mobile/src/components/agents/session-goal-section.tsx:78 — accepted: the goal-absent row rendered the trailing slot at the row edge, while the goal row put the 24px disclosure chevron plus the row's 8px gap after it, so the badge's right edge moved between a PR-only and a goal+PR session. The goal-absent row now reserves a h-6 w-6 shrink-0 gutter after the trailing slot; a mounted test compares the trailing reserve in both states.
  • apps/mobile/src/components/agents/session-list-helpers.ts:112 — rejected (no_change): the option key is the formatted, locale case-folded label by design, and the sheet renders that host-less label as the option name. Keying on host + path would list two identical-looking rows for one visible name — the duplicate the request removes. Same-label git-URL forms stay one option; nothing changed.
  • apps/mobile/src/lib/agent-session-filters.ts:85 — accepted: the badge counted the raw platform array, so a saved bucket plus one of its variants showed 2 while the sheet rendered one checked row. The count now collapses each persisted platform through knownPlatformBucket, keeps an unknown platform as itself, and counts the distinct rows. New unit cases cover a bucket with its variant, distinct buckets, and an unknown platform.
  • apps/mobile/src/components/screen-header.tsx:310 — accepted: inlineActions was rendered only in the leading-aligned title row, so a centered (modal) header silently dropped the trailing controls. The centered branch now renders inlineActions beside the title, the prop doc states it applies to both branches, and the blind spacer is skipped when inline actions are present. A mounted test covers the centered case.
  • ScreenHeader adds an uncapped inlineActions title-row slot; headerRight keeps its half-width cap — start here for the agents header row.
  • The PR badge moved from the header into the goal row; the row mounts for a goal or a PR and stays absent while a no-goal, no-PR session loads.
  • Live-list insets split: the tab-bar inset stays on the frame; the FAB clearance is now 64px content padding, changing how far rows scroll.
  • projectOptionKey (formatted label, case-folded in the active locale) and knownPlatformBucket define filter identity for options, matching, the badge count, and persisted variants. Headings and labels shrink and truncate (min-w-0, numberOfLines={1}); new unit tests cover the single-row toolbar, the goal-row PR slot, the header inline slots, and filter dedupe.

@iscekic
iscekic force-pushed the kwf/owner-ui-papercuts-d78e branch from 2cc2f32 to b3c4f19 Compare September 23, 2026 02:20
@iscekic
iscekic marked this pull request as ready for review September 23, 2026 02:53
@iscekic iscekic added the human-ready The PR is ready for human review. label Sep 23, 2026
@iscekic iscekic self-assigned this Sep 23, 2026
iscekic added a commit that referenced this pull request Sep 25, 2026
main moved the PR badge out of the header's right slot onto the goal row
(#6562/#6614), so the cluster now holds only the context pill. Assert
that, and drop the import the assertion no longer needs.
iscekic added a commit that referenced this pull request Sep 25, 2026
…the session header (#6522)

* fix(mobile): stop the composer clipping the first draft line and cap the session header

#6522

* fix(mobile): snap the composer cap floor to the native line pitch

The cap snap floored at the caller's one-line minimum (requested
line-height + padding), but the snap measures the pitch the native
input really renders (18.67dp against a requested 20dp on Android).
A remaining-space cap that landed on that minimum therefore published
the unaligned minimum, so a two-line draft still scrolled by 17.33 -
a partial line - and clipped the first visible line, exactly the defect
the snap exists to fix.

Express the floor in whole native lines and clamp it to the cap, so the
snapped height is always a whole number of native lines and never
exceeds the space the composer has. Also correct the helper's doc
comment: the caller passes the measured pitch, not the requested
font-scaled line height.

* test(mobile): match the header cluster to the merged goal-row layout

main moved the PR badge out of the header's right slot onto the goal row
(#6562/#6614), so the cluster now holds only the context pill. Assert
that, and drop the import the assertion no longer needs.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

human-ready The PR is ready for human review.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants