diff --git a/packages/ui/src/components/overflow-badge.tsx b/packages/ui/src/components/overflow-badge.tsx index 253597ea8..966ff3792 100644 --- a/packages/ui/src/components/overflow-badge.tsx +++ b/packages/ui/src/components/overflow-badge.tsx @@ -19,23 +19,43 @@ export function OverflowBadge({ radius: "sm", ...props, }; - return ( - + + const hasOverflow = data.length > overflowCount; + + const badges = data.slice(0, overflowCount).map((item) => ( + + {item} + + )); + + const overflowTrigger = hasOverflow ? ( + + + +{data.length - overflowCount} + + + ) : null; + + // Mantine mounts a Popover's machinery — the Popover itself plus its Dropdown — regardless of + // `disabled`, and this component previously mounted both even when nothing overflowed, which is the + // common case. That made it a per-row cost anywhere it appears in a list: this is shared UI, used by + // media-releases (which passes `disablePopover`), releases, and the widget inputs. Returning the + // badges directly when there is no popover to show keeps the rendered markup identical — a disabled + // Popover.Target only forwards a ref — while creating none of the overlay components. + if (disablePopover || !hasOverflow) { + return ( - {data.slice(0, overflowCount).map((item) => ( - - {item} - - ))} - {data.length > overflowCount && ( - - - - +{data.length - overflowCount} - - - - )} + {badges} + {overflowTrigger} + + ); + } + + return ( + + + {badges} + {overflowTrigger} diff --git a/packages/widgets/src/beszel/_shared/disk-usage.tsx b/packages/widgets/src/beszel/_shared/disk-usage.tsx index 9aa2a14ad..7a7891ad2 100644 --- a/packages/widgets/src/beszel/_shared/disk-usage.tsx +++ b/packages/widgets/src/beszel/_shared/disk-usage.tsx @@ -22,6 +22,24 @@ export const DiskUsage = ({ system, fontSize, progressSize, valueMiw, valueGap = const dotSize = progressSize === "xs" ? 2 : 3; const dotGap = 2; + // Mantine mounts a HoverCard's Popover machinery even when it is disabled, and this component + // renders per table row. A system reporting no extra filesystems has nothing to show on hover — it + // already fell back to a plain bar inside the target — so the whole overlay was created for nothing. + if (filesystems.length === 0) { + return ( + + + {formatPercent(system.disk)} + + + + + + + + ); + } + return ( @@ -33,11 +51,9 @@ export const DiskUsage = ({ system, fontSize, progressSize, valueMiw, valueGap = shadow="md" openDelay={200} closeDelay={100} - disabled={filesystems.length === 0} > - {filesystems.length > 0 ? ( - - - ) : ( - - - - - - )} +