diff --git a/app/[locale]/calendar/page.tsx b/app/[locale]/calendar/page.tsx index 45a5214b..19e41bbc 100644 --- a/app/[locale]/calendar/page.tsx +++ b/app/[locale]/calendar/page.tsx @@ -269,12 +269,13 @@ export default function CalendarPage() { }, [closeDetail, openEditModal]); const handleHoverEvent = useCallback((event: CalendarEvent, anchorRect: DOMRect) => { + if (isMobile) return; if (hoverTimerRef.current) { clearTimeout(hoverTimerRef.current); hoverTimerRef.current = null; } // Don't show hover popover if the sidebar is already open for this event if (showEventModal && editEvent?.id === event.id) return; setDetailEvent(event); setDetailAnchorRect(anchorRect); - }, [showEventModal, editEvent]); + }, [isMobile, showEventModal, editEvent]); const handleHoverLeave = useCallback(() => { hoverTimerRef.current = setTimeout(() => { @@ -712,7 +713,7 @@ export default function CalendarPage() { }; return ( -
+
{/* Left Navigation Rail */} {!isMobile && (
@@ -775,7 +776,7 @@ export default function CalendarPage() { )} {!inlineApp && ( -
+
+
+ +
)} {detailEvent && detailAnchorRect && ( diff --git a/app/[locale]/contacts/page.tsx b/app/[locale]/contacts/page.tsx index fbf631dd..a7f47981 100644 --- a/app/[locale]/contacts/page.tsx +++ b/app/[locale]/contacts/page.tsx @@ -544,7 +544,7 @@ export default function ContactsPage() { }; return ( -
+
{/* Navigation Rail - desktop only */} {!isMobile && (
diff --git a/components/layout/navigation-rail.tsx b/components/layout/navigation-rail.tsx index aaa93e12..4e22eba8 100644 --- a/components/layout/navigation-rail.tsx +++ b/components/layout/navigation-rail.tsx @@ -217,8 +217,8 @@ export function NavigationRail({ ); })} - {/* Custom sidebar apps */} - {sidebarApps.map((app) => { + {/* Custom sidebar apps (per-app mobile visibility) */} + {sidebarApps.filter((app) => app.showOnMobile).map((app) => { const AppIcon = lucideIcons[app.icon as keyof typeof lucideIcons] as LucideIcon | undefined; const isActive = activeAppId === app.id; return ( @@ -252,16 +252,27 @@ export function NavigationRail({ ); })} - {/* Manage apps button */} - {onManageApps && ( - - )} + {/* Settings */} + onCloseInlineApp?.() : undefined} + className={cn( + "flex flex-col items-center justify-center gap-1 py-2 px-3 min-w-[64px] min-h-[44px]", + "transition-colors duration-150", + isSettingsActive + ? "text-primary" + : "text-muted-foreground hover:text-foreground" + )} + aria-current={isSettingsActive ? "page" : undefined} + > +
+ + {isSettingsActive && ( + + )} +
+ {t("settings")} + ); } diff --git a/components/settings/sidebar-apps-settings.tsx b/components/settings/sidebar-apps-settings.tsx index 857cff4f..61478a0c 100644 --- a/components/settings/sidebar-apps-settings.tsx +++ b/components/settings/sidebar-apps-settings.tsx @@ -18,6 +18,7 @@ interface SidebarAppFormData { url: string; icon: string; openMode: "tab" | "inline"; + showOnMobile: boolean; } function AppForm({ @@ -37,6 +38,7 @@ function AppForm({ url: app?.url || "", icon: app?.icon || "Globe", openMode: app?.openMode || "tab", + showOnMobile: app?.showOnMobile ?? false, }); const [errors, setErrors] = useState>({}); @@ -144,6 +146,25 @@ function AppForm({
+
+ + +
+