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

commit062f45da6fc968a4a95caa3a3718acaf35173d20
parentf1523ab5fc
authorLucas Galante <[email protected]>
date2026-07-08 15:27
docs(rfc): record Phase 5o — MenuBar migrated, Menu deleted

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

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

diff --git a/docs/rfc-core-rebuild.md b/docs/rfc-core-rebuild.md
index 191fd1f..039fc90 100644
--- a/docs/rfc-core-rebuild.md
+++ b/docs/rfc-core-rebuild.md
@@ -559,12 +559,28 @@ Constraint respected: **each crate still builds standalone** — the new core is
     `Container`; Paginator embeds ButtonStrip + `Vec<Page>`) — embedding means migrating the
     base struct inverts the dependency; those dissolve when their hosts move to the scene
     walk (Phase 6), not through `Adapted`.
+  - **5o — `MenuBar` migrated; standalone `Menu` DELETED (zero constructors workspace-wide —
+    dead code).** MenuBar keeps its legacy `ButtonStrip` EMBEDDED in the model (owned by
+    value, driven through `Element` calls; events reach it via `EventCtx::ui`;
+    `arrange_children` parents it back to the adapter). New adapter surface: `Paint::popover`
+    / `draw_popover` (own dropdowns — the container recursion only covered child popovers),
+    `Layout::z_order`, `Layout::tracked_parent` (serves `Element::parent` from the model's
+    field — legacy parent-chain styling walks use a DUMMY ctx that tree lookups can't
+    answer), `Input::set_modifiers` / `visibility_changed` / `is_focused` (conditional focus:
+    the bar holds the global slot only while something is open) + `EventCtx::release_focus`,
+    the `as_page_selector` capability pair, and `Paint::corner_style` now takes the laid-out
+    rect (corners computed against the parent backplate's edges). Dropped, flagged: the
+    never-read glyphon buffer caches and the vertical-mode dynamic `rect()` (`with_vertical`
+    has no callers). Verified: 168 tests (full open→click→close roundtrip through real
+    adapter dispatch), all four hosts run, live A/B on cce-test-interface pixel-equivalent
+    (the strip has zero diffs above the 8% threshold; the File-click-opens-nothing behavior
+    there is byte-identical pre-existing app behavior). Pending: a designer A/B (menu layer +
+    curved circular-pane mode) once the screen is uncontended.
   - **Still to do:** migrate remaining widgets
     off `impl Element` onto the narrow traits (per-widget, Phase 6 flavour). Remaining:
-    Menu/MenuBar (needs popover hooks — the adapter's container popover recursion covers
-    child popovers, but Menu draws its own), Paginator (embeds ButtonStrip + Vec<Page>),
-    ParametersBg (real container, 1.8k lines), and the deferred leaves (TextBox, Dropdown,
-    StatusBar, Float3, LayoutPreview, PreviewState); the embedded-base containers
+    Paginator (embeds ButtonStrip + Vec<Page>), ParametersBg (real container, 1.8k lines),
+    and the deferred leaves (TextBox, Dropdown, StatusBar, Float3, LayoutPreview,
+    PreviewState); the embedded-base containers
     (Layer/Container/Page/Plate/Backplate/ScrollBox/List/…) dissolve via Phase 6 scene
     adoption instead. Then delete `Element` + `Adapted` once the last widget is across, at
     which point the `as_*_controller` pairs and the `Input` capability hooks die together