From 8f619be0d74149e4753ee963111867abc3cb9e87 Mon Sep 17 00:00:00 2001 From: ajnart Date: Wed, 26 Aug 2026 17:47:05 +0200 Subject: [PATCH] fix(network-status): fit compact layouts --- .../scripts/seed-widget-regression-board.ts | 12 ++--- .../network-status/component.tsx | 49 ++++++++++++------- .../network-status/layout.spec.ts | 4 +- .../network-status/layout.ts | 11 +++-- .../network-status/variants/stat-row.tsx | 21 ++++++-- .../network-status/variants/wifi-variant.tsx | 21 +++++--- .../network-status/variants/wired-variant.tsx | 21 +++++--- 7 files changed, 94 insertions(+), 45 deletions(-) diff --git a/packages/db/scripts/seed-widget-regression-board.ts b/packages/db/scripts/seed-widget-regression-board.ts index cb60918e9..ace4d2e7a 100644 --- a/packages/db/scripts/seed-widget-regression-board.ts +++ b/packages/db/scripts/seed-widget-regression-board.ts @@ -144,18 +144,18 @@ const fixtureWidgets: FixtureWidget[] = [ xOffset: 6, yOffset: 0, width: 2, - height: 2, - mobileHeight: 2, + height: 1, + mobileHeight: 1, needsIntegration: true, options: { content: "wired" }, }, { kind: "networkControllerStatus", xOffset: 6, - yOffset: 2, - width: 2, - height: 2, - mobileHeight: 2, + yOffset: 1, + width: 1, + height: 1, + mobileHeight: 1, needsIntegration: true, options: { content: "wifi" }, }, diff --git a/packages/widgets/src/network-controller/network-status/component.tsx b/packages/widgets/src/network-controller/network-status/component.tsx index 07e53e013..de38bfa72 100644 --- a/packages/widgets/src/network-controller/network-status/component.tsx +++ b/packages/widgets/src/network-controller/network-status/component.tsx @@ -12,8 +12,7 @@ import { getNetworkControllerStatusLayout } from "./layout"; import { WifiVariant } from "./variants/wifi-variant"; import { WiredVariant } from "./variants/wired-variant"; -const neutralBorderColor = - "rgb(from var(--mantine-color-default-border) r g b / calc(var(--opacity, 1) * 0.45))"; +const neutralBorderColor = "rgb(from var(--mantine-color-default-border) r g b / calc(var(--opacity, 1) * 0.45))"; export default function NetworkControllerNetworkStatusWidget({ options, @@ -21,6 +20,7 @@ export default function NetworkControllerNetworkStatusWidget({ displayMode, width, height, + displayScale = 1, }: WidgetComponentProps<"networkControllerStatus">) { const summaryQuery = clientApi.widget.networkController.summary.useQuery({ integrationIds, @@ -41,7 +41,18 @@ export default function NetworkControllerNetworkStatusWidget({ const countWifiUsers = summaries.reduce((sum, { summary }) => sum + summary.wifi.users, 0); const countLanGuests = summaries.reduce((sum, { summary }) => sum + summary.lan.guests, 0); const countLanUsers = summaries.reduce((sum, { summary }) => sum + summary.lan.users, 0); - const layout = getNetworkControllerStatusLayout({ width, height, displayMode, content: options.content }); + let responsiveWidth = width; + let responsiveHeight = height; + if (!isAdvanced && Number.isFinite(displayScale) && displayScale > 0) { + responsiveWidth *= displayScale; + responsiveHeight *= displayScale; + } + const layout = getNetworkControllerStatusLayout({ + width: responsiveWidth, + height: responsiveHeight, + displayMode, + content: options.content, + }); const indicatorResults = results.length > 0 || !summaryQuery.error ? results @@ -54,14 +65,26 @@ export default function NetworkControllerNetworkStatusWidget({ if (!isAdvanced) { return ( - + {queryIndicators} {options.content === "wifi" ? ( - + ) : ( - + )} ); @@ -103,20 +126,10 @@ export default function NetworkControllerNetworkStatusWidget({ - + - + diff --git a/packages/widgets/src/network-controller/network-status/layout.spec.ts b/packages/widgets/src/network-controller/network-status/layout.spec.ts index edc58f04d..db24b4ec9 100644 --- a/packages/widgets/src/network-controller/network-status/layout.spec.ts +++ b/packages/widgets/src/network-controller/network-status/layout.spec.ts @@ -7,7 +7,7 @@ describe("network controller status layout", () => { { name: "minimum compact", input: { width: 160, height: 90, displayMode: "compact" as const, content: "wifi" as const }, - expected: { padding: "xs", columns: 1, showWifi: true, showWired: false, horizontalStats: false }, + expected: { padding: 4, columns: 1, showWifi: true, showWired: false, horizontalStats: true }, }, { name: "short compact", @@ -58,7 +58,7 @@ describe("network controller status layout", () => { ).toMatchObject({ padding: "sm", horizontalStats: false }); expect( getNetworkControllerStatusLayout({ width: 199, height: 119, displayMode: "compact", content: "wifi" }), - ).toMatchObject({ padding: "xs", horizontalStats: false }); + ).toMatchObject({ padding: 4, horizontalStats: true }); expect( getNetworkControllerStatusLayout({ width: 960, height: 320, displayMode: "advanced", content: "wifi" }), ).toMatchObject({ sourceColumns: 2 }); diff --git a/packages/widgets/src/network-controller/network-status/layout.ts b/packages/widgets/src/network-controller/network-status/layout.ts index 9b869a511..265e63ccb 100644 --- a/packages/widgets/src/network-controller/network-status/layout.ts +++ b/packages/widgets/src/network-controller/network-status/layout.ts @@ -11,7 +11,7 @@ interface NetworkControllerStatusLayoutInput { } export interface NetworkControllerStatusLayout { - padding: "xs" | "sm" | "md"; + padding: 4 | "xs" | "sm" | "md"; columns: 1 | 2; sourceColumns: 1 | 2; showWifi: boolean; @@ -20,6 +20,7 @@ export interface NetworkControllerStatusLayout { withBorder: boolean; compact: boolean; horizontalStats: boolean; + inlineStats: boolean; } export const getNetworkControllerStatusLayout = ({ @@ -29,16 +30,18 @@ export const getNetworkControllerStatusLayout = ({ content, }: NetworkControllerStatusLayoutInput): NetworkControllerStatusLayout => { const isAdvanced = displayMode === "advanced"; + const compact = !isAdvanced && (width < 240 || height < 180); return { - padding: isAdvanced ? "md" : height < 120 ? "xs" : "sm", + padding: isAdvanced ? "md" : height < 120 ? 4 : "sm", columns: isAdvanced && width >= 560 ? 2 : 1, sourceColumns: isAdvanced && width >= 960 ? 2 : 1, showWifi: isAdvanced || content === "wifi", showWired: isAdvanced || content === "wired", cardPadding: isAdvanced ? "md" : 0, withBorder: isAdvanced, - compact: !isAdvanced, - horizontalStats: !isAdvanced && height < 150 && width >= 200, + compact, + horizontalStats: compact && height < 150, + inlineStats: compact && height < 80, }; }; diff --git a/packages/widgets/src/network-controller/network-status/variants/stat-row.tsx b/packages/widgets/src/network-controller/network-status/variants/stat-row.tsx index 6b5eac61c..9d4f62faa 100644 --- a/packages/widgets/src/network-controller/network-status/variants/stat-row.tsx +++ b/packages/widgets/src/network-controller/network-status/variants/stat-row.tsx @@ -1,23 +1,38 @@ -import { Stack, Text } from "@mantine/core"; +import { Group, Stack, Text } from "@mantine/core"; export const StatRow = ({ label, value, advanced = false, compact = false, + inline = false, }: { label: string; value: string | number; advanced?: boolean; compact?: boolean; + inline?: boolean; }) => { + if (!advanced && compact && inline) { + return ( + + + {value} + + + {label} + + + ); + } + if (!advanced) { return ( - + {value} - + {label} diff --git a/packages/widgets/src/network-controller/network-status/variants/wifi-variant.tsx b/packages/widgets/src/network-controller/network-status/variants/wifi-variant.tsx index 036af0ccc..f7af08c59 100644 --- a/packages/widgets/src/network-controller/network-status/variants/wifi-variant.tsx +++ b/packages/widgets/src/network-controller/network-status/variants/wifi-variant.tsx @@ -12,27 +12,36 @@ export const WifiVariant = ({ advanced = false, compact = false, horizontal = false, + inline = false, }: { countUsers: number; countGuests: number; advanced?: boolean; compact?: boolean; horizontal?: boolean; + inline?: boolean; }) => { const t = useI18n("widget.networkControllerStatus.card"); if (!advanced) { + const iconSize = horizontal ? 20 : 24; + let titleMargin: 0 | "xs" | "md" = "md"; + if (compact) titleMargin = "xs"; + if (horizontal) titleMargin = 0; + let statsSpacing: number | "xs" | "lg" = "lg"; + if (compact) statsSpacing = "xs"; + if (horizontal) statsSpacing = 4; return ( <> - - + + {t("variants.wifi.name")} - - - - + + + + ); } diff --git a/packages/widgets/src/network-controller/network-status/variants/wired-variant.tsx b/packages/widgets/src/network-controller/network-status/variants/wired-variant.tsx index 2e940fe2b..25b32f73c 100644 --- a/packages/widgets/src/network-controller/network-status/variants/wired-variant.tsx +++ b/packages/widgets/src/network-controller/network-status/variants/wired-variant.tsx @@ -12,27 +12,36 @@ export const WiredVariant = ({ advanced = false, compact = false, horizontal = false, + inline = false, }: { countUsers: number; countGuests: number; advanced?: boolean; compact?: boolean; horizontal?: boolean; + inline?: boolean; }) => { const t = useI18n("widget.networkControllerStatus.card"); if (!advanced) { + const iconSize = horizontal ? 20 : 24; + let titleMargin: 0 | "xs" | "md" = "md"; + if (compact) titleMargin = "xs"; + if (horizontal) titleMargin = 0; + let statsSpacing: number | "xs" | "lg" = "lg"; + if (compact) statsSpacing = "xs"; + if (horizontal) statsSpacing = 4; return ( <> - - + + {t("variants.wired.name")} - - - - + + + + ); }