import React, { useState } from 'react'; import { Outlet } from 'react-router-dom'; import Sidebar from './Sidebar'; import PricingModal from './PricingModal'; import { motion, AnimatePresence } from 'framer-motion'; import { useQuery } from '@tanstack/react-query'; import { useAuth } from '@clerk/clerk-react'; import { getProject } from '../../api/client'; import { useMe } from '../../hooks/useMe'; import { AlertTriangle, ArrowRight, ShieldAlert, PanelLeftClose, PanelLeftOpen } from 'lucide-react'; import { useLocation } from 'react-router-dom'; import { OnboardingWelcomeModal } from './OnboardingWelcomeModal'; const Layout: React.FC = () => { const [showPricing, setShowPricing] = useState(false); const [, setWelcomeComplete] = useState(false); const [isSidebarOpen, setIsSidebarOpen] = useState(true); const { isLoaded, isSignedIn } = useAuth(); const location = useLocation(); const projectId = location.pathname.split('/projects/')[1]?.split('/')[0]; // Shared gated /api/me — no request until Clerk signed in const { data: sub } = useMe(); useQuery({ queryKey: ['project', projectId], queryFn: () => getProject(projectId as string), enabled: Boolean(projectId && isLoaded && isSignedIn), refetchInterval: 10000 }); // Only show limit banner from real API data — never fabricate usage stats const activeSub = sub && typeof sub === 'object' && sub.limits ? sub : null; const iterPercent = activeSub ? (activeSub.wizard_iterations_today / activeSub.limits.max_wizard_iterations) * 100 : 0; const showLimitBanner = !!activeSub && activeSub.tier !== 'business' && iterPercent > 80; const isCriticalLimit = iterPercent > 90; return (