git.lucas.co / cce-ui
GPU-accelerated UI toolkit (Vulkan)
git clone https://git.lucas.co/cce-ui.git

commiteafc97fc4f9057384bae7d717d1418669c65b87f
parent28ccd76ce1
authorLucas Galante <[email protected]>
date2026-07-09 11:15
docs(rfc): record Phase 6g — dl-text popover clamp + cce-system-settings flip

Co-Authored-By: Claude Fable 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_016MjP3pGQEDLkJbV5WEmYBe

 docs/rfc-core-rebuild.md | 29 ++++++++++++++++++++++-------
 1 file changed, 22 insertions(+), 7 deletions(-)

diff --git a/docs/rfc-core-rebuild.md b/docs/rfc-core-rebuild.md
index e861c63..090d14a 100644
--- a/docs/rfc-core-rebuild.md
+++ b/docs/rfc-core-rebuild.md
@@ -828,14 +828,29 @@ Constraint respected: **each crate still builds standalone** — the new core is
     dl-text occlusion pass only blocks apps that rely on the DEFAULT `text_areas`
     popover clamp (`ui_context().active_popovers`), e.g. widget-tree apps whose popovers
     register through `register_popover`.
+  - **6g — popover occlusion for display-list text lands; `cce-system-settings` flips
+    `display_list_text`. DONE (live-A/B pixel-identical, AE=0; page-dropdown popup, page
+    switch, service-list scroll, live process refresh exercised).** Engine:
+    `popover_occlusion_clamp` extracted from the default `text_areas` mapping and applied
+    to `dl_text_items` in `render()`, driven by `ui_context().active_popovers` — the
+    display_list_text known limitation is gone; apps whose popovers register through
+    `register_popover` (which `render_widget` does for any open `popover_rect`) can flip.
+    App: same mechanical shape as 6e/6f, with the app-side `FontSystem` kept for
+    button-label width measurement (centering) and the search-match highlight rect, and
+    the wheel fast-path mutating tuple y/bounds in place exactly as it did TextItems.
+    Popovers/context menu were never main-surface here: they draw on the engine's
+    xdg-popup surface via the `render_popovers` collector, which is orthogonal to the
+    flip.
   - **Still to do (per-app, roughly smallest-first):**
-    the remaining five display_list() adopters (flip `display_list_text` + drop their TextItem
-    assembly, one at a time, each A/B'd — precondition: embedded-base-free tree, see 6d),
-    then the widget-tree apps (routed events + scene
-    layout + dissolving the embedded-base containers), the demo (`cce-ui/src/main.rs`) as the
-    reference `Application`, and popover-occlusion for display-list text before any app with
-    popovers flips the flag. Delete the legacy `view*`/`text_items` paths, the per-widget
-    text getters, and finally `Element` + `Adapted` once the last app is across.
+    the remaining four display_list() adopters — data-editor, fonts, graph, text-editor —
+    flip `display_list_text` + drop their TextItem assembly, one at a time, each A/B'd.
+    All four are paint_tree/widget-tree apps, so the 6d precondition applies:
+    embedded-base-free tree first (Backplate/Plate/List/ScrollBox still load-bearing in
+    each). Popover occlusion is no longer a blocker (6g). Then the widget-tree apps
+    (routed events + scene layout + dissolving the embedded-base containers), the demo
+    (`cce-ui/src/main.rs`) as the reference `Application`. Delete the legacy
+    `view*`/`text_items` paths, the per-widget text getters, and finally `Element` +
+    `Adapted` once the last app is across.
 
 Order rationale: each phase is independently valuable and reversible, and no phase requires the
 next to compile. Phase 0 can land immediately regardless of the rest.