This commit is contained in:
estifanos
2026-08-19 08:32:44 +00:00
parent 273a828570
commit 58f9dd7668
2 changed files with 62 additions and 5 deletions

View File

@@ -1,5 +1,5 @@
import { useCallback, useMemo, useState } from 'react'; import { useCallback, useMemo, useState } from 'react';
import { AppShell } from '@mantine/core'; import { AppShell, Drawer } from '@mantine/core';
import { useDisclosure } from '@mantine/hooks'; import { useDisclosure } from '@mantine/hooks';
import { Outlet, useLocation, useNavigate } from 'react-router-dom'; import { Outlet, useLocation, useNavigate } from 'react-router-dom';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
@@ -31,7 +31,7 @@ export function BackofficeLayout() {
const navigate = useNavigate(); const navigate = useNavigate();
const location = useLocation(); const location = useLocation();
const dispatch = useAppDispatch(); const dispatch = useAppDispatch();
const [opened, { toggle: toggleNav }] = useDisclosure(); const [opened, { toggle: toggleNav, close: closeNav }] = useDisclosure();
const [collapsed, setCollapsed] = useState(false); const [collapsed, setCollapsed] = useState(false);
const user = useAppSelector((state) => state.auth.user); const user = useAppSelector((state) => state.auth.user);
const layoutMode = useAppSelector((state) => state.preferences.layoutMode); const layoutMode = useAppSelector((state) => state.preferences.layoutMode);
@@ -141,7 +141,10 @@ export function BackofficeLayout() {
? { ? {
width: collapsed ? 72 : 264, width: collapsed ? 72 : 264,
breakpoint: "sm", breakpoint: "sm",
collapsed: { mobile: !opened }, // Mobile has its own Drawer below — AppShell's built-in mobile
// navbar takes over the full viewport width, which felt like
// it swallowed the page. Always collapsed here on mobile.
collapsed: { mobile: true },
} }
: undefined : undefined
} }
@@ -222,6 +225,34 @@ export function BackofficeLayout() {
{/* Registered once for the whole backoffice; opens on ⌘K anywhere. */} {/* Registered once for the whole backoffice; opens on ⌘K anywhere. */}
<CommandPalette sections={sections} /> <CommandPalette sections={sections} />
{/* Mobile nav: a proper Drawer (sized, backdrop, closes on outside
click) instead of AppShell's full-width mobile navbar. Mirrors the
landing page's mobile menu. */}
{isSidebar && (
<Drawer
opened={opened}
onClose={closeNav}
hiddenFrom="sm"
size="75%"
padding={0}
withCloseButton={false}
>
<AppSidebar
navItems={sections}
collapsed={false}
activePath={location.pathname}
onToggleCollapse={handleToggleCollapse}
onNavigate={(item) => {
go(item);
closeNav();
}}
brandName={t('app.name')}
brandSubtitle={t('app.authority')}
brandLogo={<BrandMark size={32} />}
/>
</Drawer>
)}
</AppShell> </AppShell>
); );
} }

View File

@@ -1,4 +1,4 @@
import { AppShell } from "@mantine/core"; import { AppShell, Drawer } from "@mantine/core";
import { useDisclosure } from "@mantine/hooks"; import { useDisclosure } from "@mantine/hooks";
import { import {
IconArrowsExchange, IconArrowsExchange,
@@ -281,7 +281,10 @@ export function PortalLayout() {
navbar={{ navbar={{
width: sidebarCollapsed ? 72 : 264, width: sidebarCollapsed ? 72 : 264,
breakpoint: "sm", breakpoint: "sm",
collapsed: { mobile: !navOpened }, // Mobile has its own Drawer below — AppShell's built-in mobile
// navbar takes over the full viewport width, which felt like it
// swallowed the page. Always collapsed here on mobile.
collapsed: { mobile: true },
}} }}
padding="lg" padding="lg"
> >
@@ -332,6 +335,29 @@ export function PortalLayout() {
<Outlet /> <Outlet />
</div> </div>
</AppShell.Main> </AppShell.Main>
{/* Mobile nav: a proper Drawer (sized, backdrop, closes on outside
click) instead of AppShell's full-width mobile navbar. Mirrors the
landing page's mobile menu. */}
<Drawer
opened={navOpened}
onClose={closeNav}
hiddenFrom="sm"
size="75%"
padding={0}
withCloseButton={false}
>
<AppSidebar
navItems={sections}
collapsed={false}
activePath={location.pathname}
onToggleCollapse={toggleSidebar}
onNavigate={go}
brandName={t("app.name")}
brandSubtitle={t("app.authority")}
brandLogo={<BrandMark size={32} />}
/>
</Drawer>
</AppShell> </AppShell>
); );
} }