From a6061348c3af4d410639a151bcafd2a0bcaaba6b Mon Sep 17 00:00:00 2001 From: Thomas Camlong Date: Mon, 10 Aug 2026 18:57:54 +0200 Subject: [PATCH 1/2] fix: polish settings and command menu --- .../[locale]/boards/[name]/settings/page.tsx | 2 +- .../_components/analytics.settings.tsx | 24 +++++++-- .../src/app/[locale]/manage/settings/page.tsx | 13 ++--- .../src/app/[locale]/manage/workshop/page.tsx | 1 - .../layout/header/lazy-spotlight.tsx | 52 +++---------------- .../src/components/layout/header/search.tsx | 7 --- .../components/manage/unsaved-changes-bar.tsx | 4 +- e2e/lazy-widgets.spec.ts | 1 + packages/translation/src/lang/en.json | 1 + 9 files changed, 37 insertions(+), 68 deletions(-) diff --git a/apps/nextjs/src/app/[locale]/boards/[name]/settings/page.tsx b/apps/nextjs/src/app/[locale]/boards/[name]/settings/page.tsx index 318d5196a..f6af46d65 100644 --- a/apps/nextjs/src/app/[locale]/boards/[name]/settings/page.tsx +++ b/apps/nextjs/src/app/[locale]/boards/[name]/settings/page.tsx @@ -53,7 +53,7 @@ export default async function BoardSettingsPage(props: Props) { } return ( - + {t("title", { boardName: capitalize(board.name) })} { - const t = useScopedI18n("management.page.settings.section.analytics"); + const t = useScopedI18n("management.page.settings.section"); return ( - - + + + + {t("analyticsDocumentation")} + + ); }; diff --git a/apps/nextjs/src/app/[locale]/manage/settings/page.tsx b/apps/nextjs/src/app/[locale]/manage/settings/page.tsx index eee563069..242cd44c1 100644 --- a/apps/nextjs/src/app/[locale]/manage/settings/page.tsx +++ b/apps/nextjs/src/app/[locale]/manage/settings/page.tsx @@ -1,11 +1,10 @@ import { notFound } from "next/navigation"; -import { Stack, Title } from "@mantine/core"; import { api } from "@homarr/api/server"; import { auth } from "@homarr/auth/next"; import { getScopedI18n } from "@homarr/translation/server"; -import { DynamicBreadcrumb } from "~/components/navigation/dynamic-breadcrumb"; +import { ManagePageLayout } from "~/components/manage/manage-page-layout"; import { SettingsForm } from "./_components/settings-form"; export async function generateMetadata() { @@ -28,12 +27,8 @@ export default async function SettingsPage() { const tSettings = await getScopedI18n("management.page.settings"); return ( - <> - - - {tSettings("title")} - - - + + + ); } diff --git a/apps/nextjs/src/app/[locale]/manage/workshop/page.tsx b/apps/nextjs/src/app/[locale]/manage/workshop/page.tsx index d52825869..260ca8db3 100644 --- a/apps/nextjs/src/app/[locale]/manage/workshop/page.tsx +++ b/apps/nextjs/src/app/[locale]/manage/workshop/page.tsx @@ -22,7 +22,6 @@ export default async function WorkshopPage() { return ( import("@homarr/spotlight/component"); -const SpotlightLoading = () => ( -
- - - -
-); -const Spotlight = dynamic(() => loadSpotlight().then(({ Spotlight: Component }) => Component), { - ssr: false, - loading: SpotlightLoading, -}); - -export const preloadSpotlight = () => void loadSpotlight().catch(() => undefined); - export const LazySpotlight = () => { const [isMounted, setIsMounted] = useState(false); - const [isPreloaded, setIsPreloaded] = useState(false); useHotkeys( isMounted @@ -49,41 +25,27 @@ export const LazySpotlight = () => { ); useEffect(() => { - let isActive = true; const mount = () => setIsMounted(true); window.addEventListener(spotlightOpenEvent, mount); if (hasPendingSpotlightOpen()) mount(); - const preload = () => { - void loadSpotlight().then( - () => { - if (isActive) setIsPreloaded(true); - }, - () => undefined, - ); - }; let idleId: number | undefined; const delayId = window.setTimeout(() => { - idleId = window.requestIdleCallback?.(preload, { timeout: 1_000 }); - if (idleId === undefined) preload(); + idleId = window.requestIdleCallback?.(mount, { timeout: 1_000 }); + if (idleId === undefined) mount(); }, 1_000); return () => { - isActive = false; window.removeEventListener(spotlightOpenEvent, mount); window.clearTimeout(delayId); if (idleId !== undefined) window.cancelIdleCallback?.(idleId); }; }, []); - return isMounted || isPreloaded ? ( + return isMounted ? ( <> - {isPreloaded &&