This commit includes: - Django backend with multi-tenancy (django-tenants) - React + TypeScript frontend with Vite - Platform administration API with role-based access control - Authentication system with token-based auth - Quick login dev tools for testing different user roles - CORS and CSRF configuration for local development - Docker development environment setup 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
44 lines
1.3 KiB
TypeScript
44 lines
1.3 KiB
TypeScript
import React, { useState, useEffect } from 'react';
|
|
import { Outlet } from 'react-router-dom';
|
|
import Navbar from '../components/marketing/Navbar';
|
|
import Footer from '../components/marketing/Footer';
|
|
import { useScrollToTop } from '../hooks/useScrollToTop';
|
|
|
|
const MarketingLayout: React.FC = () => {
|
|
useScrollToTop();
|
|
|
|
const [darkMode, setDarkMode] = useState(() => {
|
|
// Check for saved preference or system preference
|
|
if (typeof window !== 'undefined') {
|
|
const saved = localStorage.getItem('darkMode');
|
|
if (saved !== null) {
|
|
return JSON.parse(saved);
|
|
}
|
|
return window.matchMedia('(prefers-color-scheme: dark)').matches;
|
|
}
|
|
return false;
|
|
});
|
|
|
|
useEffect(() => {
|
|
document.documentElement.classList.toggle('dark', darkMode);
|
|
localStorage.setItem('darkMode', JSON.stringify(darkMode));
|
|
}, [darkMode]);
|
|
|
|
const toggleTheme = () => setDarkMode((prev: boolean) => !prev);
|
|
|
|
return (
|
|
<div className="min-h-screen flex flex-col bg-white dark:bg-gray-900 transition-colors duration-200">
|
|
<Navbar darkMode={darkMode} toggleTheme={toggleTheme} />
|
|
|
|
{/* Main Content - with padding for fixed navbar */}
|
|
<main className="flex-1 pt-16 lg:pt-20">
|
|
<Outlet />
|
|
</main>
|
|
|
|
<Footer />
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default MarketingLayout;
|