3f25e7ebca57ad038811886c1b7e238097c92268
A new workspace member, iris/transcript-ui/, built the same way tabs-ui is: generic over Rsc: HasEvents + Rsc::State: FocusHost, on client-core/event-model by path (real code, matching E2's precedent). Four modules: - markdown.rs: CommonMark (pulldown-cmark) -> one plain string plus a Vec<SpanStyle>, so a row's headings/bold/italic/inline-code/links render inline inside one wrapped TextEdit rather than one widget per block -- the actual proof that iris can do what E2 found Masonry structurally unable to (masonry/src/widgets/text_area.rs's "TODO: RichTextInput"). - row.rs: one iris::widget::List row per folded TranscriptRow. A TranscriptRow::Tools group collapses to a summary and expands to every call's own tool/input/output on tap, using List::extent + note_tap for hold-the-edge exactly as list.rs's module doc describes. - selection.rs: cross-row selection -- a drag that starts in one row's TextEdit and crosses into another's, coordinating each visible row's own select/select_all/deselect from one pointer gesture. The one Masonry's own text_area.rs cites as impossible (no SelectionContainer-shaped type anywhere in masonry/masonry_core/ xilem). - composer.rs: a growing multi-line composer with no fixed height, wired beside the list with .height(rest(1)) -- the real screen for IRIS_TODO.md's "input box" benchmark case. 9 new tests (5 pure markdown, 4 selection), all passing. Screenshotted via run-headless.sh: real inline rich text visible (bold, italic, inline code, a bigger bold heading, a coloured link, a monospaced fenced block, a collapsed tool-call row). What this box does not close, each recorded at its own point (RUST.md's I5 box, IRIS_TODO.md's dated entries): no Android integration exists yet for this screen (no cdylib/Gradle shell the way iris-android-app wraps tabs-ui), so the emulator-side render-number pass condition was not attempted; a touch-drag pan over a row's own text currently loses gesture arbitration to that row's own drag-select (diagnosed and named, not silently broken); row-level accessibility names, a tappable link, a code-span background chip, and Selection's anchor-row shortcut are scoped shortcuts recorded in place. cargo fmt/build/clippy/test --workspace clean; cargo ndk -t x86_64 -P 26 build/clippy clean for both transcript-ui and iris. Co-Authored-By: Claude Sonnet <noreply@anthropic.com>
Languages
Rust
53%
Kotlin
44.4%
Shell
2.6%