git.lucas.co / cce-designer
graphic design tool
git clone https://git.lucas.co/cce-designer.git

commit73b97966e4d131681dbf81b8efd570684cce2b0d
parent88b1c896ef
authorLucas Galante <[email protected]>
date2026-08-27 15:05
fix: the scene viewer lip is the window-edge roll overlay

The lip drew as a Boss rim, whose boundary-straddling wall lost its
outer half to the compositor clip: the visible band ran half a roll wide
(measured 4.65px of the 9.3px style.surface.relief width) and started at
mid-slope, and the focused state dropped the roll entirely (a tinted
Boss renders as the glint line alone). Emit the fill-less roll overlay
instead (negative-depth PlateSpec, cce-ui MODE_ROLL): the exact roll
other windows' root plates wear, screened over the 3D scene. Focus adds
the fill-less tinted Bevel — the wrapped accent glint on the same
silhouette (the network cursor's prim) — matching the focused plates'
treatment.

Verified in a shadow session against cce-files: edge luminance profiles
now match the plate roll's width and shape; remaining amplitude
difference is the per-app relief depth=0.08 override (strength 0.53 vs
the DE's 1.0), which scales all designer relief by user choice.

Co-Authored-By: Claude Fable 5 <[email protected]>

 src/render.rs | 44 ++++++++++++++++++++++++++------------------
 1 file changed, 26 insertions(+), 18 deletions(-)

diff --git a/src/render.rs b/src/render.rs
index 9e32b4c..20bfd00 100644
--- a/src/render.rs
+++ b/src/render.rs
@@ -289,18 +289,21 @@ impl State {
             // The scene viewer's lip is the window's own backplate edge: the
             // 3D canvas is full-bleed (CANVAS_IDX covers the window; the other
             // panes float over it), so the lip spans the WHOLE window with the
-            // window radius on all four corners (pane_plate_radii on the full
-            // rect — the SHARED silhouette value, concentric with the
-            // compositor clip). Under control_relief it is a Boss rim — the
-            // fill-less relief of the plated panes (a real Bevel would own
-            // fill AND roll together: a transparent fill kills the roll, and
-            // the params fill would frost the scene behind its blur marker);
-            // focus marks through the rim's specular tint. Without
-            // control_relief it degrades to the flat plate-border stroke,
-            // exactly a bordered plate's outline→relief degradation, and
-            // append_context_border owns the focus ring. (The relief band's
-            // SDF contours pull a hair inside the true superellipse at this
-            // radius — known, accepted; the flat stroke traces it exactly.)
+            // window radius on all four corners (the SHARED silhouette value,
+            // concentric with the compositor clip). Under control_relief it is
+            // the fill-less ROLL OVERLAY (negative-depth Plate): exactly the
+            // roll other windows' root plates wear — same width, profile,
+            // crest and specular, full band inside the silhouette — screened
+            // over the 3D scene, since a filled Plate would cover it (and a
+            // frosting fill would blur it). It replaced the Boss rim, whose
+            // boundary-straddling wall lost its outer half to the compositor
+            // clip: the visible band ran half a roll wide and started at
+            // mid-slope. Focus adds the fill-less tinted Bevel — the wrapped
+            // accent glint on the same silhouette, the network cursor's prim —
+            // matching the focused plates' treatment (shading unchanged, glint
+            // in accent). Without control_relief it degrades to the flat
+            // plate-border stroke, exactly a bordered plate's outline→relief
+            // degradation, and append_context_border owns the focus ring.
             if let Some(bc) = cce_ui::colors::plate_border_color() {
                 let (px, py, pw, ph) = (0.0, 0.0, self.width, self.height);
                 if pw > 0.0 && ph > 0.0 {
@@ -308,14 +311,19 @@ impl State {
                     let radii = self.pane_plate_radii(px, py, pw, ph);
                     if cce_ui::layout::control_relief() {
                         // Window-edge roll width, NOT plate_bevel_width: the lip
-                        // is the window's own backplate edge, so it matches the
-                        // root plates of other windows (style.surface.relief
-                        // width), not the designer's interior pane plates.
+                        // matches the root plates of other windows
+                        // (style.surface.relief width), not the designer's
+                        // interior pane plates.
                         let depth = cce_ui::layout::bevel_width();
+                        pc.plate_spec(&cce_ui::scene::paint::PlateSpec {
+                            rect: vp_rect,
+                            color: [0.0; 4],
+                            blur: false,
+                            window_corners: (true, true, true, true),
+                            depth: -depth,
+                        });
                         if let Some(tint) = self.plate_focus_tint(idx) {
-                            pc.boss_edges_tinted(vp_rect, radii, depth, (true, true, true, true), tint);
-                        } else {
-                            pc.boss_edges(vp_rect, radii, depth, (true, true, true, true));
+                            pc.bevel_tinted(vp_rect, radii, [0.0; 4], depth, tint);
                         }
                     } else {
                         pc.border(vp_rect, radii, [0.0; 4], bc, cce_ui::colors::plate_border_thickness());