From 5f0a1ca30ba4b76f204dabb78b9ad0788a9fe1c7 Mon Sep 17 00:00:00 2001 From: amosblomqvist Date: Wed, 9 Sep 2026 02:06:26 +0300 Subject: [PATCH] =?UTF-8?q?Labels:=20disable=20sigma's=20label-grid=20decl?= =?UTF-8?q?utter=20=E2=80=94=20the=20zoom=20gate=20is=20the=20only=20culli?= =?UTF-8?q?ng?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Some labels (clustered nodes: Flux, The signifier rules the subject, The body as window onto the thing-in-itself) appeared later in zoom than others, without fade. Root cause: sigma's label grid — viewport cells of labelGridCellSize (100px default) compete, only ceil(labelDensity / ratio^2) winners per cell draw (one at fit with default density 1) — so clustered nodes' labels were culled until zoom changed the quota, then popped in with the global fade already complete. labelDensity: MAX_SAFE_INTEGER turns the quota off. The camera-ratio gate (LABELS_CAMERA_RATIO + LABELS_FADE_SPAN) is now the ONLY label culling: every label appears at the same zoom with the same fade — the wave-1 'all labels at once' intent, finally true. Verified pixel-level at fit view: all 31 node labels render, including the three previously-missing ones; no console errors. --- components/graph-view.tsx | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/components/graph-view.tsx b/components/graph-view.tsx index f8c2e47..017664e 100644 --- a/components/graph-view.tsx +++ b/components/graph-view.tsx @@ -464,8 +464,13 @@ export function GraphView() { nodeProgramClasses: { circle: PaddedNodeCircleProgram }, defaultEdgeType: "arrow", // All labels appear/disappear together: no per-node size gating - // (threshold 0) — a single camera-ratio switch toggles them below. + // (threshold 0) and NO sigma label-grid declutter (density → + // ∞) — clustered nodes otherwise lose their cells' label + // quota and pop in late, un-faded, mid-zoom. The camera-ratio + // gate below is the ONLY label culling: every label appears at + // the same zoom with the same fade. labelRenderedSizeThreshold: 0, + labelDensity: Number.MAX_SAFE_INTEGER, // Match the app typography (Geist via the body's stack). labelFont: getComputedStyle(document.body).fontFamily, labelWeight: "500", @@ -680,8 +685,11 @@ export function GraphView() { > {snapshot?.sessions[chatId] ?? chatId} + {/* The note is a fixed-scale word (solid/shaky/...) — the + session name is the main thing; the chip is bounded so + it can never push or overflow the row. */} {note && ( - + {note} )}