/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ /** * Main application component. * * Routing is intentionally lo-fi (no router lib): we read window.location.pathname * at boot, react to popstate, and switch by prefix. The handful of routes: * * / → main WebGL viewer (default) * /mcp[/...] → @ifc-lite/mcp marketing surface */ import { ViewerLayout } from './components/viewer/ViewerLayout'; import { McpLanding } from './components/mcp/McpLanding'; import { McpPlayground } from './components/mcp/McpPlayground'; import { BimProvider } from './sdk/BimProvider'; import { ExtensionHostProvider } from './sdk/ExtensionHostProvider'; import { Toaster } from './components/ui/toast'; import { useEffect, useState } from 'react'; import { Analytics } from '@vercel/analytics/react'; export function App() { const [pathname, setPathname] = useState(() => window.location.pathname); useEffect(() => { const onRouteChange = () => setPathname(window.location.pathname); window.addEventListener('popstate', onRouteChange); return () => window.removeEventListener('popstate', onRouteChange); }, []); // /mcp lives outside BimProvider — it’s a pure marketing surface that // doesn’t need the WASM viewer context. Skips a chunky dependency boot // so cold-loading the landing page is cheap. /mcp/playground does parse // IFCs in-browser, but uses its own minimal pipeline (parser → headless // backend → BimContext) rather than the full viewer stack. // // Normalise the trailing slash before matching so `/mcp/playground/` // (e.g. shared from a browser address bar that auto-appends `/`) hits // the playground branch instead of falling through to the landing. const normalizedPath = pathname.length > 1 && pathname.endsWith('/') ? pathname.slice(0, -1) : pathname; if (normalizedPath === '/mcp/playground') { return ( <> ); } if (normalizedPath === '/mcp' || normalizedPath.startsWith('/mcp/')) { return ( <> ); } return ( ); } export default App;