diff --git a/src/app/client/page.tsx b/src/app/client/page.tsx index 9149debf..7549e122 100644 --- a/src/app/client/page.tsx +++ b/src/app/client/page.tsx @@ -81,8 +81,9 @@ export default function ClientPage() { const getClientSrc = useCallback(() => { if (!ticket) return ""; - const sep = clientUrl.includes("?") ? "&" : "?"; - return `${clientUrl}${sep}sso=${encodeURIComponent(ticket)}`; + const base = clientUrl.replace(/(\?|&)sso=[^&]*/, ""); + const sep = base.includes("?") ? "&" : "?"; + return `${base}${sep}sso=${encodeURIComponent(ticket)}`; }, [clientUrl, ticket]); if (loading) { diff --git a/src/app/globals.css b/src/app/globals.css index 50670f72..7086bf6c 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -146,6 +146,28 @@ body { background-color: color-mix(in srgb, var(--color-primary) 12%, transparent); color: var(--color-primary); } + .dropdown-menu { + background-color: var(--color-dropdown); + border: 1px solid color-mix(in srgb, var(--color-text-muted) 14%, transparent); + box-shadow: 0 8px 32px color-mix(in srgb, rgb(0, 0, 0) 20%, transparent); + transform-origin: top right; + transition: opacity 0.2s cubic-bezier(0.16, 1, 0.3, 1), + transform 0.2s cubic-bezier(0.16, 1, 0.3, 1); + opacity: 0; + transform: translateY(-8px) scale(0.95); + pointer-events: none; + } + details[open] > .dropdown-menu { + opacity: 1; + transform: translateY(0) scale(1); + pointer-events: auto; + } + @starting-style { + details[open] > .dropdown-menu { + opacity: 0; + transform: translateY(-8px) scale(0.95); + } + } } /* ── Atom icons / backgrounds (asset paths adapted to /assets) ── */ @@ -723,32 +745,6 @@ tbody tr:hover { border-color: #f97316; } -/* ── Dropdown menu (solid color + animation) ─────────────────── */ -.dropdown-menu { - background-color: var(--color-dropdown); - border: 1px solid color-mix(in srgb, var(--color-text-muted) 14%, transparent); - box-shadow: 0 8px 32px color-mix(in srgb, rgb(0, 0, 0) 20%, transparent); - transform-origin: top right; - transition: opacity 0.2s cubic-bezier(0.16, 1, 0.3, 1), - transform 0.2s cubic-bezier(0.16, 1, 0.3, 1); - opacity: 0; - transform: translateY(-8px) scale(0.95); - pointer-events: none; -} - -details[open] > .dropdown-menu { - opacity: 1; - transform: translateY(0) scale(1); - pointer-events: auto; -} - -@starting-style { - details[open] > .dropdown-menu { - opacity: 0; - transform: translateY(-8px) scale(0.95); - } -} - /* ── Radio sidebar ──────────────────────────────────────────── */ .radio-layout { display: flex; diff --git a/src/app/layout.tsx b/src/app/layout.tsx index a506f7c9..05844c27 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -39,7 +39,7 @@ export default async function RootLayout({ children }: { children: ReactNode }) const defaultDark = await siteSettings.getBool("default_dark", false); const headersList = await headers(); - const pathname = headersList.get("x-pathname") || ""; + const pathname = headersList.get("x-pathname") || headersList.get("next-url") || ""; const isClient = pathname === "/client" || pathname.startsWith("/client/"); return ( diff --git a/src/components/top-header.tsx b/src/components/top-header.tsx index cc1ef591..52746cb5 100644 --- a/src/components/top-header.tsx +++ b/src/components/top-header.tsx @@ -67,15 +67,16 @@ export async function TopHeader() { Administration