diff --git a/src/components/LayoutMobileMenu.tsx b/src/components/LayoutMobileMenu.tsx index 49644ff6..7c4da0bc 100644 --- a/src/components/LayoutMobileMenu.tsx +++ b/src/components/LayoutMobileMenu.tsx @@ -73,13 +73,14 @@ export function LayoutMobileMenu({ {t("navbarDescription")}
-
+
-
+
+
{!isAdminPage && user.serverAdmin && (
@@ -113,7 +114,7 @@ export function LayoutMobileMenu({ />
-
+
{env?.app?.version && (
diff --git a/src/components/LayoutSidebar.tsx b/src/components/LayoutSidebar.tsx index c578614d..5d3609d5 100644 --- a/src/components/LayoutSidebar.tsx +++ b/src/components/LayoutSidebar.tsx @@ -109,14 +109,18 @@ export function LayoutSidebar({ isSidebarCollapsed ? "w-16" : "w-64" )} > -
+
-
+
+
{!isAdminPage && user.serverAdmin && (
@@ -153,8 +157,12 @@ export function LayoutSidebar({ isCollapsed={isSidebarCollapsed} />
+ {/* Fade gradient at bottom to indicate scrollable content */} +
+
+
{canShowProductUpdates && (
diff --git a/src/components/OrgSelector.tsx b/src/components/OrgSelector.tsx index 042500dd..b2939a90 100644 --- a/src/components/OrgSelector.tsx +++ b/src/components/OrgSelector.tsx @@ -1,6 +1,5 @@ "use client"; -import { Button } from "@app/components/ui/button"; import { Command, CommandEmpty, @@ -52,13 +51,14 @@ export function OrgSelector({ const orgSelectorContent = ( - +
diff --git a/src/components/ProductUpdates.tsx b/src/components/ProductUpdates.tsx index 630d0800..e3346b4f 100644 --- a/src/components/ProductUpdates.tsx +++ b/src/components/ProductUpdates.tsx @@ -88,6 +88,10 @@ export default function ProductUpdates({ (update) => !productUpdatesRead.includes(update.id) ); + if (filteredUpdates.length === 0 && !showNewVersionPopup) { + return null; + } + return (
{item.icon && ( - {item.icon} + + {item.icon} + )} -
- {t(item.title)} +
+ + {t(item.title)} + {item.isBeta && ( - + {t("beta")} - + )}
@@ -256,7 +257,11 @@ export function SidebarNav({ href={isDisabled ? "#" : hydratedHref} className={cn( "flex items-center rounded-md transition-colors", - isCollapsed ? "px-2 py-2 justify-center" : level === 0 ? "px-3 py-2" : "px-3 py-1.5", + isCollapsed + ? "px-2 py-2 justify-center" + : level === 0 + ? "px-3 py-1.5" + : "px-3 py-1", isActive ? "bg-secondary font-medium" : "text-muted-foreground hover:bg-secondary/80 dark:hover:bg-secondary/50 hover:text-foreground", @@ -284,21 +289,21 @@ export function SidebarNav({ )} {!isCollapsed && ( <> -
+
{t(item.title)} {item.isBeta && ( - + {t("beta")} - + )}
{build === "enterprise" && item.showEE && !isUnlocked() && ( - + {t("licenseBadge")} )} @@ -309,27 +314,31 @@ export function SidebarNav({
{item.icon && ( - {item.icon} + + {item.icon} + )} -
+
{t(item.title)} {item.isBeta && ( - + {t("beta")} - + )}
{build === "enterprise" && item.showEE && !isUnlocked() && ( - {t("licenseBadge")} + + {t("licenseBadge")} + )}
); @@ -422,23 +431,23 @@ export function SidebarNav({ {childItem.icon} )} -
+
{t(childItem.title)} {childItem.isBeta && ( - + {t("beta")} - + )}
{build === "enterprise" && childItem.showEE && !isUnlocked() && ( - + {t( "licenseBadge" )} @@ -481,7 +490,10 @@ export function SidebarNav({ {...props} > {sections.map((section, sectionIndex) => ( -
0 && "mt-4")}> +
0 && "mt-4")} + > {!isCollapsed && (
{t(`${section.heading}`)} diff --git a/src/components/ValidateOidcToken.tsx b/src/components/ValidateOidcToken.tsx index 3677f625..bd862c11 100644 --- a/src/components/ValidateOidcToken.tsx +++ b/src/components/ValidateOidcToken.tsx @@ -56,11 +56,7 @@ export default function ValidateOidcToken(props: ValidateOidcTokenParams) { if (props.providerError?.error) { const providerMessage = props.providerError.description || - t("idpErrorOidcProviderRejected", { - error: props.providerError.error, - defaultValue: - "The identity provider returned an error: {error}." - }); + "The identity provider returned an error: {error}."; const suffix = props.providerError.uri ? ` (${props.providerError.uri})` : ""; @@ -76,10 +72,7 @@ export default function ValidateOidcToken(props: ValidateOidcTokenParams) { if (!isCancelled) { setIsProviderError(false); setError( - t("idpErrorOidcMissingCode", { - defaultValue: - "The identity provider did not return an authorization code." - }) + "The identity provider did not return an authorization code." ); setLoading(false); } @@ -90,10 +83,7 @@ export default function ValidateOidcToken(props: ValidateOidcTokenParams) { if (!isCancelled) { setIsProviderError(false); setError( - t("idpErrorOidcMissingState", { - defaultValue: - "The login request is missing state information. Please restart the login process." - }) + "The login request is missing state information. Please restart the login process." ); setLoading(false); } @@ -159,12 +149,7 @@ export default function ValidateOidcToken(props: ValidateOidcTokenParams) { console.error(e); if (!isCancelled) { setIsProviderError(false); - setError( - t("idpErrorOidcTokenValidating", { - defaultValue: - "An unexpected error occurred. Please try again." - }) - ); + setError("An unexpected error occurred. Please try again."); } } finally { if (!isCancelled) { @@ -181,7 +166,7 @@ export default function ValidateOidcToken(props: ValidateOidcTokenParams) { }, []); return ( -
+
diff --git a/src/components/ui/alert.tsx b/src/components/ui/alert.tsx index 08761eba..6ec5f0b7 100644 --- a/src/components/ui/alert.tsx +++ b/src/components/ui/alert.tsx @@ -11,7 +11,7 @@ const alertVariants = cva( default: "bg-card border text-foreground", neutral: "bg-card bg-muted border text-foreground", destructive: - "border-destructive/50 border bg-destructive/10 text-destructive dark:border-destructive [&>svg]:text-destructive", + "border-destructive/50 border bg-destructive/8 text-destructive dark:border-destructive/50 [&>svg]:text-destructive", success: "border-green-500/50 border bg-green-500/10 text-green-500 dark:border-success [&>svg]:text-green-500", info: "border-blue-500/50 border bg-blue-500/10 text-blue-800 dark:text-blue-400 dark:border-blue-400 [&>svg]:text-blue-500",