iris: transcript-ui, the transcript screen (RUST.md's I5)
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>
This commit is contained in:
1 parent
0af4c88d08
commit
3f25e7ebca
9 files changed
+1421
-5
No files matched your search
+6
-1
@@ -73,7 +73,7 @@ name = "message_list"
|
||||
harness = false
|
||||
|
||||
[workspace]
|
||||
members = ["core", "macro", "tabs-ui"]
|
||||
members = ["core", "macro", "tabs-ui", "transcript-ui"]
|
||||
# android-app pulls in android-view, which needs the NDK sysroot to link
|
||||
# -- excluded so `cargo build --workspace --all-targets` on the host stays
|
||||
# buildable. Cross-compile it from its own directory (its own single-crate
|
||||
@@ -100,3 +100,8 @@ accesskit = "0.25.0"
|
||||
iris-core = { path = "core" }
|
||||
iris-macro = { path = "macro" }
|
||||
tokio = "1.49.0"
|
||||
# Current stable as of 2026-09-05 (`cargo search`) -- I5's markdown block
|
||||
# model, the same crate E2's uncommitted `e2-transcript` experiment used for
|
||||
# the identical job (RUST.md), rather than reimplementing a CommonMark
|
||||
# parser.
|
||||
pulldown-cmark = "0.13.4"
|
||||
Reference in new issue
Block a user