From 3ee4aaac6c293cb422a47ee6650acb7b87aa3361 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Sat, 10 Oct 2026 19:26:00 +0200 Subject: [PATCH 01/21] Research: Thing 2.0 foundation prior art (Eyes, 2026-10-03) Served ruling thing:ruling:thing2-one-solver-taffy: Thing 1's per-host layout, Clay, Taffy, Yoga, AccessKit and DOM-mirror practice. Co-Authored-By: Claude Opus 5.5 --- docs/research/thing2-foundation-prior-art.md | 275 +++++++++++++++++++ 1 file changed, 275 insertions(+) create mode 100644 docs/research/thing2-foundation-prior-art.md diff --git a/docs/research/thing2-foundation-prior-art.md b/docs/research/thing2-foundation-prior-art.md new file mode 100644 index 0000000..65c3dcf --- /dev/null +++ b/docs/research/thing2-foundation-prior-art.md @@ -0,0 +1,275 @@ +# Thing 2.0: foundation prior art (Eyes pass, 2026-10-03) + +Read-only facts with evidence pointers, gathered for the operator's question. No +conclusions or recommendations. Facts marked **[background]** come from prior +knowledge and were not re-fetched in this pass; everything else was read today. + +The operator's words, verbatim: "I'm thinking about Thing 2.0. I think we learned +a lot about what not to do with Thing 1. I feel like doing it right means +building on a solid foundation with predictable affordances. Something like +https://github.com/nicbarker/clay maybe?" + +--- + +## Part 1: Thing 1 (Eve), what the record shows + +### 1.0 What the record does and does not contain + +- `F:\Projects\Eve\docs\thing-campaign.md` (1,352 lines, revision 4, 2026-10-02) + is a **rename and site campaign** (Eve to Thing, the deck page on + gamecult.org). It records no lessons about the UI machine itself. The eureka + mind's `thing` campaign holds the same: rulings on naming, repo home, deck + cuts (`thing:ruling:operator-*`, `thing:cut_spec:cut-deck-*`). No Eve + architecture findings were found in the mind (semantic query, 48 matches, all + rename/deck/substrate). +- voidbot `search_history` (Discord) returned only 2019-2021 Aetheria UI chatter; + nothing on Eve. The operator's Eve words below come from Codex session logs + (`C:\Users\Meta\.codex\sessions\...`) and Claude transcripts. + +### 1.1 Operator's own words (verbatim, with source) + +| Date | Words | Source | +| --- | --- | --- | +| 2026-07-02 | "Aetheria view is still busted. All commands are failing, and the layouts are quite bad. Go look at the main menu, it's very confused" | `.codex/sessions/2026/07/02/rollout-2026-07-02T12-43-25-...jsonl` | +| 2026-07-02 | "...deferred scalar field lowering needs to be an Eve feature, not an Aetheria Electron feature" | same file | +| 2026-07-02 | "...doesn't Eve provide bindings to CultMesh reactive typed state? Eir shouldn't have to reload to display new contents" | `.codex/sessions/2026/07/02/rollout-2026-07-02T14-05-11-...jsonl` | +| 2026-06-17 | "And if an Eve surface contains a pointer to daemon state, the UI runtime should resolve that automatically" | `.codex/sessions/2026/06/17/rollout-2026-06-17T22-22-21-...jsonl` | +| 2026-07-10 | "...avoid a giant Eve monorepo as the long-term shape. It will feel good while everything is young, then become a swamp: every runtime build system, plugin fixture, platform SDK, and product demo starts sharing one git status. We are already seeing the smell." | `.codex/sessions/2026/07/10/rollout-2026-07-10T02-54-*.jsonl` (may be a pasted plan the operator endorsed; the message is in the user turn) | +| undated (Claude) | "the login button returns invalid Eve command result: data must not have additional properties" | a Claude transcript under `C:\Users\Meta\.claude\projects\` | +| undated (Claude) | "they're separate, Eve CultUI is the lowering target. I'm not sure about the state of the Unity package, it kinda fell behind in the rush to build Eve" | Claude transcript; also memory `F--Projects/memory` (Unity CultUI vs Eve CultUI note) | +| 2026-10-03 (above) | AetheriaEve: "an abomination preserved for taxidermy" | Claude transcript | + +### 1.2 Body facts (read today) + +**Layout semantics are delegated to each host's native layout engine.** +- The contract (`Eve/docs/surface-contract-v1.md` l.32, 78-110) is a retained + component tree, `surface.root`, with semantic `kind`s; "Kinds are semantic, + not HTML tags. Renderers lower them to native controls". Unknown kinds fall + back along the kind path (`panel.dialogue` to `panel`). +- Layout vocabulary (`Eve/docs/cultui-style-system.md` l.22, 80-140): + partition-first tree, relative or absolute division, `size` in `auto`, + `content`, px, percent, viewport units or `fr`; `min`/`max`; `clip`; `scroll`. +- No shared layout solver exists. The browser lowering + (`Eve/packages/eve-browser-lowering/src/index.ts`, 2,680 lines) maps layout + props onto CSS flexbox (`flexDirection`, `flexWrap` at l.679, 1057-1059) and + measures with `getBoundingClientRect`. Flutter (`EveFlutter/lib/main.dart`, + 1,512 lines, one file) and Unity UI Toolkit + (`EveUnity/packages/org.gamecult.eve.unity-uitoolkit/Runtime/EveUiToolkitSurfaceLowerer.cs`, + 900 lines) each re-interpret the same props with their own widgets/engine. + Unity UI Toolkit's engine "uses the layout principles of Yoga" + (docs.unity3d.com/Manual/UIE-LayoutEngine.html). +- `Eve/docs/cultmesh-streaming-ui-framework.md` l.19: "Browser renderer: owns + canonical layout behavior, accessibility semantics"; l.120 "the canonical + behavior still belongs to the browser Eve runtime". `renderer-parity.md` + names the web reference "the first renderer that can be used as a practical + comparison oracle". So the layout spec is, in practice, whatever Chrome's + flexbox does with the browser lowering's mapping. + +**Per-renderer component implementations.** +- Each runtime carries its own lowerer for the full kind set: web TS (2,680), + Flutter Dart (1,512), Unity UITK (900) plus Unity scene lowerer (932) plus a + 1,544-line Unity CultMesh live transport + (`EveUnity/.../Runtime/CultMesh/EveUnityCultMeshLiveProviderTransport.cs`), + iOS UIKit "EveCanvas", native Android/Kotlin, Fensalir Direct2D spike, + EveTui (`EveTui/src/eve-tui-shell.mjs`, 297 lines). EveElectron 64 lines. +- The contract keeps adding domain kinds: `inventory.grid`, `inventory.item`, + `inventory.drag_session` as "standard Eve component kinds" + (`surface-contract-v1.md` l.311-330), `vn.stage`, `embeddedDocuments` slots, + scalar/vector field lowering, Japanese-capable font roles and TUI pixel roles + (l.359-392). 41 distinct `"kind"` values appear across `Eve/web/fixtures`. +- Operator, 2026-07-02, asked that deferred scalar-field lowering move from an + Aetheria Electron feature into Eve (1.1). + +**Parity is evidence-heavy and admitted uneven.** +- `Eve/docs/renderer-parity.md`: "Parity is currently uneven by design." Target + is "recognizable CultUI fidelity", not pixel identity. Table rows: Flutter + "Needs native window capture and tighter text/style normalization"; iOS "Not a + plugin projection acceptance target"; Android Kotlin "Not a plugin projection + acceptance target"; Fensalir "External adapter spike, not active parity + runtime". +- `Eve/docs/parity-testing-harness.md` (681 lines): a manifest + (`tools/parity/parity-manifest.json`) of fixtures x runtimes, PNG captures per + platform (phone/tablet/desktop; SSH capture on Nightwing, Periwinkle, iOS), + runtime capability manifests, and exported gap ledgers + (`capabilityGaps[]`, `worldSurfaceLoweringGaps[]`, + `runtimePluginProjectionGaps[]`, command-boundary coverage). Parity is + asserted on features/claims and screenshots, not on computed geometry. +- Eve git: 381 commits; 18 match layout/parity/wrap/overflow (e.g. `e81c81b + Measure Sai web layout probe`, `c0c17be Add web layout probe evidence`, + `c4cd5b5 Polish native Odin wall layout`). + +**Live CultMesh loop.** +- `renderer-parity.md`: web reference "Needs live Odin/CultMesh provider feed + and command round-trip tests"; Android Flutter "Needs live provider picker and + command transport beyond fixture assets"; iOS "still needs provider picker + and command transport". The local provider list is a fixture catalog + (`web/local-provider-catalog.json`); live discovery "still belongs to + CultMesh/Odin advertisements". +- Operator words on reload, auto-resolving state pointers, failing commands and + a schema-rejected command result (1.1). + +**Text and input.** +- `Eve/docs/input-capabilities.md` exists; no Eve doc mentions IME, caret or + screen readers (grep of `Eve/docs/*.md` for `ime|caret|accessib|aria|screen + reader` hit only the "accessibility semantics" ownership line above). + `control.input` is a kind (`surface-contract-v1.md` l.105). Text styling + normalization is a named Flutter gap. Font fallback for Japanese is a + contract requirement (l.372-387). + +**Repo shape.** Eight repos (Eve, EveUnity, EveFlutter, EveElectron, EveTui, +EvePlugins, EveConformance, AetheriaEve); last commits 2026-07 to 2026-09 +(`thing-campaign.md` B1). The Unity CultUI package in CultLib "fell behind" +(operator) and is a separate lineage. + +### 1.3 Agent inferences (not operator words) + +- "The composition model learns from the old Unity CultUI without preserving its + construction accident ... not vertical-first layout" (`surface-contract-v1.md` + l.56-58, agent-written doc). +- The repo-strategy text attributed in 1.1 to 2026-07-10 reads like an agent's + plan; its authorship in the user turn is a fact, its origin is not. +- Pairing of operator complaints with the absence of a shared solver (1.2) is + this pass's juxtaposition, not a recorded diagnosis. + +--- + +## Part 2: layout and UI foundations + +### 2.1 Clay (nicbarker/clay), read from README and GitHub API today + +- **Licence** Zlib. Single header `clay.h`, C99/C++20, no dependencies. 18.2k + stars, 279 open issues, last push 2026-05-20; latest release **v0.14, + 2025-06-06** (v0.13 2025-02, v0.12 2024-10). Pre-1.0. +- **Model**: per frame, `Clay_SetLayoutDimensions` -> `Clay_SetPointerState` -> + `Clay_UpdateScrollContainers` -> `Clay_BeginLayout` -> `CLAY()` declarations + -> `Clay_EndLayout(deltaTime)` returns a sorted `Clay_RenderCommandArray` + (README l.617-621, l.109). Immediate-mode declaration; Clay retains element + state internally by ID (`CLAY_ID`, `CLAY_IDI` for loops, l.305-309). Memory is + a caller-provided arena (`Clay_MinMemorySize`, `Clay_Initialize`); multiple + contexts allowed (l.587-601). +- **Layout model**: flex-like row/column (`layoutDirection` + `CLAY_LEFT_TO_RIGHT`/`TOP_TO_BOTTOM`), `padding`, `childGap`, alignment; + sizing `CLAY_SIZING_FIT | GROW | FIXED | PERCENT` with min/max. No CSS Grid, + no wrap-to-next-row container in the sizing set. +- **Render commands** (complete enum in README): `NONE, RECTANGLE, BORDER, + TEXT, IMAGE, SCISSOR_START, SCISSOR_END, OVERLAY_COLOR_START, + OVERLAY_COLOR_END, CUSTOM`. Text commands are emitted one per wrapped line + (l.1034). Transitions API with `deltaTime` (l.7, l.489). +- **Text measurement**: user callback `Clay_SetMeasureTextFunction(...)` + returning width/height; "It is essential that this function is as fast as + possible"; Clay caches measurements internally (l.643-649). Wrap modes: + words, newlines, none. Shaping, fonts, bidi are the host's. +- **Scroll and floating**: scroll containers via `Clay_UpdateScrollContainers` + (wheel and drag, smoothing by deltaTime) and `Clay_GetScrollOffset`; + floating elements with `attachTo` (e.g. `CLAY_ATTACH_TO_PARENT`) and + z-index, outside normal flow (l.419). +- **Input helpers**: `Clay_SetPointerState`, `Clay_Hovered()`, + `Clay_OnHover(cb)`, `Clay_PointerOver(id)`. Hit boxes are "from the last + frame"; README suggests running layout twice per frame if that matters + (l.368-373). No keyboard focus model. +- **Not present**: the README has no mention of text input/editing, IME, + keyboard focus or accessibility (grep empty). The web HTML renderer + `renderers/web/html/clay-html-renderer.html` contains no `aria`/`role` + attributes (grep count 0). +- **Bindings**: README "supported bindings": Odin (in-repo) and Rust + (`clay-ui-rs/clay`; crate `clay-layout` 0.4.0, updated 2025-06-03, 3,779 + downloads). Other implementations: three Go ports. **No C#, TypeScript, Dart, + Swift or Kotlin binding is listed**; the web path is the C header compiled to + wasm with clang ("15kb uncompressed .wasm", README l.9). +- **Renderers in repo** (`renderers/`): GLES3, SDL2, SDL3, cairo, playdate, + raylib, sokol, termbox2, terminal, web (`canvas2d`, `html`, prebuilt + `clay.wasm`), win32_gdi. +- **Performance claim**: "Microsecond layout performance" (README l.5); no + benchmark table in the README. + +### 2.2 Taffy (DioxusLabs/taffy) + +- MIT. 3.6k stars, pushed 2026-10-03, release v0.14.0 2026-08-24. +- Implements CSS **Block, Flexbox and CSS Grid** (README l.15). Retained tree + `TaffyTree` with `new_leaf`, `new_with_children`, + `compute_layout`, `layout(node)`; also a low-level trait API for hosts that + own their own tree **[background: `LayoutPartialTree` etc.]**. Leaf measure + functions supply text/intrinsic sizes; Taffy does no text layout (README + benchmarks note: "require text layout, which neither yoga nor taffy + implement"). +- Users listed in README: Servo, Blitz, Bevy, Takumi, iocraft (terminal UIs), + Slint, Lapce/Floem, Zed/GPUI. +- Bindings: Python (`stretchable`); C and WASM bindings are **WIP PRs** + (#404, #394). No official C#/TS/Dart binding. +- Tests: "Flexbox layouts are tested by validating that layouts written in this + crate perform the same as in Chrome": HTML fixtures in `test_fixtures/`, + `just gentest` drives Chrome via webdriver and generates Rust tests into + `tests/generated` (CONTRIBUTING.md l.26-35). +- README benchmarks vs Yoga (M1 Pro, layout only): comparable, each wins some + (e.g. 1,000 nested nodes 329 µs Taffy vs 365 µs Yoga; 100k wide 247 ms vs + 136 ms). + +### 2.3 Yoga (facebook/yoga) + +- MIT. 18.9k stars, pushed 2026-10-01; latest release v3.2.1 2024-12-13; npm + `yoga-layout` 3.2.1. +- "An embeddable and performant flexbox layout engine with bindings for + multiple languages." Repo top level: C++ core (`yoga/`), `java/`, + `javascript/` (wasm), `Package.swift`; no C# directory today. +- Users **[background]**: React Native, Litho, ComponentKit; Unity UI Toolkit + follows Yoga's layout principles (Unity manual, read today). +- Tests: `gentest/` (`gentest-driver.ts`, `fixtures/`, `test-template.html`) + generates cross-language tests from browser-computed layouts, the same + pattern Taffy copied. Flexbox only, no Grid. + +### 2.4 Contrast, briefly + +- **Morphorm** (vizia/morphorm): MIT, 334 stars, pushed 2026-08-21. Layout by + stacking with "space" and "stretch" units rather than CSS rules + **[background on the unit model]**; used by Vizia. +- **egui** **[background]**: immediate mode, single-pass layout during + declaration (sizes known only after drawing, hence "sizing pass" tricks); + output is `epaint` clipped shapes/meshes to thin backends (wgpu, glow, + web canvas via eframe); integrates AccessKit; text editing is in-crate. +- **Slint**: uses Taffy (README list) under its own declarative language; + renderers femtovg/Skia/software **[background]**. +- **Flutter** **[background]**: retained RenderObject tree, "constraints go + down, sizes go up"; the engine paints display lists via Skia/Impeller. + On the web, CanvasKit draws to canvas while a parallel DOM semantics tree + (`flt-semantics`) carries accessibility and a hidden DOM input element + carries text editing and IME. + +### 2.5 Pattern: typed retained document -> layout -> render commands -> thin backends + +- Clay is the direct instance of the last two arrows: one solver, a closed + 10-type command list, backends that only draw rectangles/borders/text + lines/images/scissors (`renderers/*`, including terminal and termbox2). +- Taffy and Yoga cover the solver over a retained tree; the host owns the tree + shape, the measure callbacks and painting. +- Parity techniques found in primary sources: + - Taffy and Yoga: **generated geometry tests from a reference browser** + (`test_fixtures` + gentest), asserting computed boxes, not pixels. + - Eve today: screenshot captures per device plus capability/gap ledgers + (`parity-testing-harness.md`); no geometry or render-command assertion. + - With a single solver emitting commands, the command array is a + renderer-independent artifact that can be compared directly; no project + read in this pass publishes such a golden-command suite (not found, not + searched exhaustively). + +### 2.6 Text input and accessibility for canvas-style renderers on the web + +- **AccessKit** (BSD-3 and MIT/Apache files in repo; pushed 2026-09-29): a + schema for an accessibility tree pushed by the toolkit; "only the platform + adapter needs to retain a complete accessibility tree", which the README + says suits immediate-mode toolkits. Released adapters: Android, iOS, macOS, + Unix (AT-SPI), Windows (UIA). **Web adapter is listed under "Planned + adapters": "web (for applications that render their own UI elements to a + canvas)"**. C bindings (`accesskit-c`) and Python bindings exist. +- **DOM mirroring** is the shipped web practice in Flutter web (2.4, + background) and is the only web path visible here; Clay's own HTML renderer + emits plain DOM without ARIA. +- Text editing/IME: Clay, Taffy and Yoga all leave it to the host. Eve's + browser lowering currently gets native inputs from the DOM it builds. + +--- + +## Pointers + +- Eve docs: `F:\Projects\Eve\docs\{thing-campaign,renderer-parity,parity-testing-harness,surface-contract-v1,cultui-style-system,cultmesh-streaming-ui-framework}.md` +- Lowerers: `F:\Projects\Eve\packages\eve-browser-lowering\src\index.ts`, `F:\Projects\EveFlutter\lib\main.dart`, `F:\Projects\EveUnity\packages\org.gamecult.eve.unity-uitoolkit\Runtime\EveUiToolkitSurfaceLowerer.cs`, `F:\Projects\EveTui\src\eve-tui-shell.mjs` +- Clay: github.com/nicbarker/clay (README, `renderers/`); Taffy: github.com/DioxusLabs/taffy (README, CONTRIBUTING.md); Yoga: github.com/facebook/yoga (`gentest/`); AccessKit: github.com/AccessKit/accesskit (README). From cbb59574b0d202f8abe42d81e9969e216ef70c44 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Sat, 10 Oct 2026 19:34:08 +0200 Subject: [PATCH 02/21] Research: Thing 2.0 text, IME, focus, a11y and GPU glyph prior art (Eyes, 2026-10-10) Serves question thing:question:thing2-text-ownership. Co-Authored-By: Claude Opus 5.5 --- .../thing2-text-input-a11y-prior-art.md | 294 ++++++++++++++++++ 1 file changed, 294 insertions(+) create mode 100644 docs/research/thing2-text-input-a11y-prior-art.md diff --git a/docs/research/thing2-text-input-a11y-prior-art.md b/docs/research/thing2-text-input-a11y-prior-art.md new file mode 100644 index 0000000..62d3b18 --- /dev/null +++ b/docs/research/thing2-text-input-a11y-prior-art.md @@ -0,0 +1,294 @@ +# Thing 2.0: text shaping, text input/IME, focus, accessibility, GPU glyphs: prior art (Eyes pass, 2026-10-10) + +Serves the fork **thing2-text-ownership**: who owns text shaping, text editing/IME, keyboard +focus and accessibility under the ruling `thing:ruling:thing2-one-solver-taffy` +(typed retained document, one Taffy solver, closed render-command list, thin backends). +Options: (a) Thing owns all, backends only draw; (b) hybrid, solver owns geometry and +backends place native controls/a11y nodes at solved rects; (c) something unnamed. +Item 6 (GPU glyph rasterization) is an operator scope addition. + +Read-only facts with evidence pointers. No recommendation. Does not repeat +`thing2-foundation-prior-art.md` (Clay/Taffy/Yoga basics, AccessKit web "planned"). +Marks: **(inferred)** = my juxtaposition; **[background]** = prior knowledge, not re-fetched. +Versions/dates are crates.io `max_stable_version`/`updated_at` and GitHub API, read 2026-10-10. + +--- + +## 1. Rust text stacks that pair with Taffy + +| Crate | Latest (date) | Licence | Role | +| --- | --- | --- | --- | +| parley | 0.12.0 (2026-10-09) | Apache-2.0 OR MIT (emoji crate MIT-only) | rich-text layout, selection/editing, IME primitives | +| fontique | 0.12.0 (2026-10-09) | [background: same repo, Apache-2.0 OR MIT] | font enumeration, fallback | +| cosmic-text | 0.19.0 (2026-04-22) | Apache-2.0 OR MIT | shaping + layout + editor in one crate | +| harfrust | 0.14.0 (2026-10-04) | [background: MIT] | HarfBuzz port; shaping | +| rustybuzz | 0.20.1 (2024-11-12; no release since) | [background: MIT] | older HarfBuzz port | +| swash | 0.2.10 (2026-07-17) | [background: Apache-2.0 OR MIT] | scaling/rasterising | +| fontdb | 0.24.0 (2026-07-29) | [background: MIT] | font DB | +| taffy | 0.14.0 (2026-08-24) | MIT | layout | + +- **parley** github.com/linebender/parley README: "provides an API for implementing rich text + layout"; shaping by HarfRust, bidi by ICU4X, line breaking in Parley, "utilities for text + selection and editing", fontique for fallback, skrifa for outlines, ICU4X for segmentation. + 753 stars, MSRV 1.88 (README). Repo tree has `parley/src/editing/{editor,selection}.rs` and + `examples/editor/src/{accessibility,access_ids}.rs` (AccessKit text example). PRs: "Implement IME + primitives for PlainEditor" #136 (closed 2025-01-21), "Add editor features required for Android IME" + #334 (2025-06), IME baseline-jitter / text-doubling fixes #599, #601 (2026-04/05). Slint's + `accessibility-text` feature enables `parley?/accesskit`. +- **cosmic-text** github.com/pop-os/cosmic-text: 2.2k stars, 841 commits. README: HarfRust shaping, + bidi, swash rendering, own font fallback built from Chromium/Firefox lists; roadmap lists text + editing, selection, bidi selection, copy/paste, click detection (page does not say which are + done). IME not mentioned. Cargo.toml: harfrust 0.5, skrifa 0.40, fontdb 0.24, unicode-bidi, + unicode-linebreak, unicode-segmentation; features `no_std`, `wasm-web`. +- **Who uses which** (manifests on `main`, read today): + - **Bevy**: `bevy_ui` -> taffy 0.14, accesskit 0.25; `bevy_text` -> parley 0.11, swash 0.2.6. + IME PRs #23795 / #23841 "Text input IME support" closed 2026-04-21; #24421 "Fix IME text input + wrapping" closed 2026-06-06. [background: Bevy used cosmic-text before.] + - **Slint**: Taffy 0.10, flexbox feature only (`internal/core/Cargo.toml`); `shared-parley` is a + default feature; parley 0.11.1; `accessibility-text` feature; accesskit 0.24, accesskit_winit 0.33. + - **Blitz** (DioxusLabs): Stylo (CSS) + Taffy (box layout) + Parley (text layout) per README; + `blitz-dom` has `events/ime.rs` and `accessibility.rs`; feature `accessibility = ["accesskit"]`; + `blitz-shell` = winit + AccessKit + muda. README: "beta ... many bugs and missing features". + - **Xilem/Masonry**: README: winit, Parley/Fontique, AccessKit. `masonry_core` depends on accesskit + and parley; widgets `text_area.rs`, `text_input.rs`. masonry/xilem 0.4.0 on crates.io are + 2025-10-29 (repo pushed 2026-09-14). README: "experimental". + - **GPUI (Zed)**: `crates/gpui` depends on taffy and accesskit; `font-kit` default feature; + per-platform text systems (`gpui_apple/src/text_system.rs`, `gpui_wgpu` with font-kit, + `gpui_web/src/{text_system,canvas_text}.rs`). AccessKit PRs #54398, #56065, #64212, #64214 all + closed (merged vs not not checked), latest 2026-09-24. + - **COSMIC / iced**: cosmic-text is pop-os's own crate [background]. + - **iocraft** (terminal): Taffy 0.5.2 flexbox, unicode-width 0.1.13 (section 5). + - **egui**: accesskit workspace dep; own text layout [background]. +- Taffy has no text layout; leaf measure functions supply sizes (prior-art doc 2.2). + +## 2. How Taffy-based toolkits do text input and IME + +- **Masonry/Xilem (desktop)**: IME flows from winit into `TextArea`. Issues in + github.com/linebender/xilem: "Re-add IME support" #762 (closed 2024-11-30), "Ensure that IME events + interact with focus as expected" #1004, "Improve IME area reporting and set IME area in + TextArea" #785, open #1692 "TextArea: on Ime::Disabled use finish_compose()" (2026-03-26), + baseline-jitter fixes #1716 / #1718 (2026-04). Editing buffer is Parley's `PlainEditor` (inferred + from parley #136 + masonry text_area). `xilem_web` is a separate DOM backend (README: "a web backend + and a Masonry backend"); no Masonry-on-canvas web build found. +- **Blitz**: `blitz-dom/src/events/ime.rs` `handle_ime_event` sends `BlitzImeEvent` to the focused + node's `text_input_data_mut().apply_ime_event(font_ctx, layout_ctx, event)`: text input state lives + in the DOM node, not a native control. Shell is winit; README lists no web target. +- **Bevy UI**: IME merged 2026-04/06 (above); accessibility in `bevy_a11y`. +- **Slint**: docs.slint.dev/latest/docs/slint/guide/platforms/web: "Accessibility features (such as + screen readers) are not available" (WebGL canvas, no DOM); Wasm uses Winit backend + FemtoVG; + "running Slint in the browser is currently not recommended for building general-purpose web + applications". Text input / IME on web not addressed on that page. +- **GPUI web** (`crates/gpui_web/src/ime_mirror.rs` header): "The hidden `