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

commita2739b8ad3570a66122b5d580e6dbe415ab483f8
parentf2d8f4d479
authorLucas Galante <[email protected]>
date2026-07-09 16:58
docs(rfc): record Phase 6t — settings popovers in-frame; draws_own_popovers; popup-path endgame

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

 docs/rfc-core-rebuild.md | 30 ++++++++++++++++++++++++++----
 1 file changed, 26 insertions(+), 4 deletions(-)

diff --git a/docs/rfc-core-rebuild.md b/docs/rfc-core-rebuild.md
index 053ee24..740d75d 100644
--- a/docs/rfc-core-rebuild.md
+++ b/docs/rfc-core-rebuild.md
@@ -1000,12 +1000,34 @@ Constraint respected: **each crate still builds standalone** — the new core is
     consumer; fix when settings' popovers move to the 6l ui_context-only pattern.
     The root's `with_border` was never rendered (a rounded Backplate emits no plain
     bg quad; the border branch fires only on plain bg quads) — dropped, not ported.
+  - **6t — settings' popovers + context menu draw INTO the frame;
+    `Application::draws_own_popovers` lands. DONE (live-verified: dropdown popover
+    in-window with page geometry occluded beneath, item click switches pages both
+    ways, spinbox right-click context menu at cursor with dl-text occluded beneath,
+    dismissal).** This fixes the 6s finding at the source: the engine's render-only
+    xdg popup anchored at the widget's bottom edge regardless of the app's open-upward
+    popover rect, so settings' page popover displayed BELOW the window while clicks
+    landed on the app-side in-window rect. The app now runs the same
+    `render_popovers` collector into its own tuple stream (appended above window/
+    page/search content; kept out of the scrollable vecs so the wheel fast-path can't
+    shift popover content) and deletes the override. Page-widget popovers
+    (notifications/fonts menus) shift by −scroll_y — the subtraction the popup
+    positioner used to apply — keeping display aligned with hit-testing under scroll.
+    Engine: `draws_own_popovers` (default false) gates BOTH popup spawn triggers (the
+    global popover registry and global context-menu visibility), and under the flag
+    `render()` adds the visible context menu's rect to the dl-text occlusion overlays
+    (the menu is engine-global state, not a `ui_context` popover; its own labels are
+    exempt via bounds == rect). Remaining popup-path consumers: cce-data-editor and
+    cce-text-editor (`render_popovers` overrides) — the popup surface, `ActivePopup`,
+    `PopoverCollector`, and this flag all go away once they draw their own.
   - **Still to do:**
     settings' page tree (Switcher/Page/SectionContainer/ScrollBox — the
-    deep-composition set; the root and status bar are gone as of 6s); files' internal
-    containers (splitters/BrowseContainer/List) and data-editor's SplitBox/TreeList
-    when their turns come; routed events + scene layout for the widget-tree apps; the
-    demo (`cce-ui/src/main.rs`) as the reference `Application`. Delete the legacy
+    deep-composition set; the root and status bar are gone as of 6s, popovers
+    in-frame as of 6t); data-editor + text-editor off the engine popup path, then
+    delete the popup surface machinery; files' internal containers
+    (splitters/BrowseContainer/List) and data-editor's SplitBox/TreeList when their
+    turns come; routed events + scene layout for the widget-tree apps; 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.