mirror of
https://github.com/Tria-plc/emaui.git
synced 2026-08-26 19:12:50 +00:00
UI Fixes
This commit is contained in:
@@ -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>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user