app-layout.tsx 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. 'use client';
  2. import { ReactNode } from 'react';
  3. import { Sidebar } from '../sidebar';
  4. import { ModelStatusBar } from '../model-status-bar';
  5. import { LayoutProvider } from './layout-context';
  6. /**
  7. * AppLayout - Pure inline style layout (no CSS modules)
  8. * Using inline styles to avoid any CSS loading/cascade issues
  9. */
  10. interface AppLayoutProps {
  11. children: ReactNode;
  12. }
  13. export function AppLayout({ children }: AppLayoutProps) {
  14. return (
  15. <LayoutProvider>
  16. <div style={{
  17. display: 'grid',
  18. gridTemplateColumns: '16rem 1fr',
  19. gridTemplateRows: '1fr auto',
  20. gridTemplateAreas: '"sidebar main" "sidebar footer"',
  21. minHeight: '100vh',
  22. width: '100vw',
  23. overflowX: 'hidden',
  24. }}>
  25. <aside style={{
  26. gridArea: 'sidebar',
  27. position: 'sticky',
  28. top: 0,
  29. height: '100vh',
  30. overflowY: 'auto',
  31. borderRight: '1px solid var(--color-border)',
  32. backgroundColor: 'var(--color-card)',
  33. zIndex: 10000,
  34. }}>
  35. <Sidebar />
  36. </aside>
  37. <main style={{
  38. gridArea: 'main',
  39. minHeight: '100vh',
  40. maxWidth: 'calc(100vw - 16rem)',
  41. overflowX: 'hidden',
  42. backgroundColor: 'var(--color-background)',
  43. }}>
  44. {children}
  45. </main>
  46. <footer style={{
  47. gridArea: 'footer',
  48. minHeight: '3rem',
  49. }}>
  50. <ModelStatusBar />
  51. </footer>
  52. </div>
  53. </LayoutProvider>
  54. );
  55. }