diff --git a/apps/desktop/src/components/objects/ObjectBrowser.vue b/apps/desktop/src/components/objects/ObjectBrowser.vue index b348a823c..d37e75b26 100644 --- a/apps/desktop/src/components/objects/ObjectBrowser.vue +++ b/apps/desktop/src/components/objects/ObjectBrowser.vue @@ -439,9 +439,9 @@ const selectableRows = computed(() => rows.value.filter((row) => row.type === "T // at once, which stalls the UI on schemas with thousands of objects. const OBJECT_GRID_MIN_CARD_WIDTH = 160; // former `minmax(160px, 1fr)` floor const OBJECT_GRID_GAP = 12; // 0.75rem, former grid gap (both axes) -// Card height is variable: only timestamp/comment rows that actually appear in -// the current dataset contribute. objectGridRowHeight (below) adapts accordingly -// so the row slot is as tight as possible instead of always using the worst case. +// Card height is dataset-stable: if any object has timestamps/comments, every card +// reserves those slots (even when empty) so borders stay level across a row. +// objectGridRowHeight adapts to the dataset instead of always using the worst case. // Base: p-3 top+bottom(24) + icon h-11(44) + name(18) + type/bytes(18) + gap-1×2(8) = 112 // + optional timestamp row: text-[10px](15) + gap-1(4) = 19 // + optional comment row: text-[10px](15) + gap-1(4) = 19 @@ -2626,7 +2626,7 @@ function getObjectBrowserMenuItems(item: ObjectBrowserRow): ContextMenuItem[] {