Files
clinicpro/assets/admin/components/layout/AdminLayout.tsx
T
hamed 6876135a53 feat: add BlogBodySanitizer for HTML sanitization on article save
- Implemented BlogBodySanitizer to clean HTML content before saving articles, ensuring security against XSS attacks.
- Added tests for BlogBodySanitizer to verify that unsafe tags and attributes are stripped from the content.
- Introduced ApiLeastPrivilegeTest to ensure that unauthorized users cannot access sensitive API routes, maintaining strict access control.
2026-08-07 21:13:38 +03:30

40 lines
1.4 KiB
TypeScript

import React, { useEffect, useState } from 'react';
import { Outlet } from 'react-router';
import Sidebar from './Sidebar';
import Topbar from './Topbar';
import { useUiStore, applyBrand } from '../../stores/uiStore';
export default function AdminLayout() {
const darkMode = useUiStore((s) => s.darkMode);
const density = useUiStore((s) => s.density);
const brandHue = useUiStore((s) => s.brandHue);
const sidebarOpen = useUiStore((s) => s.sidebarOpen);
const setSidebarOpen = useUiStore((s) => s.setSidebarOpen);
const [mobileOpen, setMobileOpen] = useState(false);
useEffect(() => {
const root = document.documentElement;
root.classList.toggle('dark', darkMode);
root.setAttribute('data-theme', darkMode ? 'dark' : 'light');
root.setAttribute('data-density', density);
applyBrand(root, brandHue, darkMode);
}, [darkMode, density, brandHue]);
return (
<div
className="app"
data-collapsed={!sidebarOpen ? 'true' : 'false'}
data-mobile-open={mobileOpen ? 'true' : 'false'}
>
<div className="scrim" onClick={() => setMobileOpen(false)} />
<Sidebar mobileOpen={mobileOpen} onMobileClose={() => setMobileOpen(false)} />
<div className="main">
<Topbar onMobileMenuOpen={() => setMobileOpen(true)} />
<main className="content">
<Outlet />
</main>
</div>
</div>
);
}