git.lucas.co / cce-grid
desktop grid client
git clone https://git.lucas.co/cce-grid.git

commitd0337a6cfb9b159e06514efd7f3da84ae702322a
parenta6fa613a27
authorLucas Galante <[email protected]>
date2026-08-18 10:57
cells: flat — drop the recess relief

The grid is ground, not furniture: a lit well under every window fought
the windows' own bevels. Cells are now plain span-widened rounded rects
on the rail surface; the compositor's fallback cells lose their chamfer
in the same change so the client latch never swaps the grid's material.

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

 CLAUDE.md   |  8 +++++---
 src/main.rs | 13 ++++++-------
 2 files changed, 11 insertions(+), 10 deletions(-)

diff --git a/CLAUDE.md b/CLAUDE.md
index a06b083..2f2da94 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -14,9 +14,11 @@ its own rect grid as the fallback whenever this client is absent or has not
 latched a patch yet, and its gap-colored backdrop always draws beneath as
 the safety net beyond patch edges.
 
-Rendering is a pure function of (patch, style config): cells are `Recess`
-wells carved into the gap-colored rail surface, reading the same
-`style.surface.desktop.*` / backplate-radius keys as the compositor
+Rendering is a pure function of (patch, style config): flat rounded cells
+on the gap-colored rail surface — deliberately NO relief, so the grid reads
+as ground under the windows' own bevels (the compositor fallback is flat
+for the same reason: the client latch must not swap the grid's material).
+It reads the same `style.surface.desktop.*` / backplate-radius keys as the
 fallback. Keep it that way — no camera state, no timers, no input (the
 surface is input-transparent compositor-side).
 
diff --git a/src/main.rs b/src/main.rs
index d50b73e..8ca9281 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -8,10 +8,9 @@
 //! of (patch, style config) — no camera state, no timers.
 //!
 //! The look comes from the same config keys the compositor's fallback grid
-//! reads (`style.surface.desktop.*`, backplate corner radius), but drawn
-//! with cce-ui's own primitives: cells are `Recess` wells carved into the
-//! gap-colored rail surface, under the toolkit's real lighting model —
-//! not the compositor's scenefx approximation of it.
+//! reads (`style.surface.desktop.*`, backplate corner radius): flat
+//! rounded cells on the gap-colored rail surface — deliberately unlit, so
+//! the grid reads as ground under the windows' own relief.
 
 use wayland_client::QueueHandle;
 
@@ -109,7 +108,6 @@ impl GridApp {
         let radius = ((st.corner_radius * s)
             * cce_ui::layout::corner_span_factor() as f64)
             .min(cell_px / 2.0) as f32;
-        let depth = radius.max(1.0);
 
         let col0 = (p.x / period).floor() as i64;
         let col1 = ((p.x + p.w) / period).ceil() as i64;
@@ -130,9 +128,10 @@ impl GridApp {
                     width: (len * s) as f32,
                     height: (len * s) as f32,
                 };
-                // The cell floor, then the well walls carved down to it.
+                // A flat cell — no relief: the grid is ground, not furniture,
+                // and a lit well under every window fought the windows' own
+                // bevels.
                 pc.rounded_rect(rect, radius, (true, true, true, true), st.cell_color);
-                pc.recess(rect, (radius, radius, radius, radius), depth);
             }
         }
     }