/* Copyright 2026 Marimo. All rights reserved. */ import "../css/index.css"; import "../css/app/App.css"; import "iconify-icon"; import { Provider as SlotzProvider } from "@marimo-team/react-slotz"; import type React from "react"; import { memo, type PropsWithChildren, Suspense } from "react"; import { TailwindIndicator } from "@/components/debug/indicator"; import { useAppConfig, useResolvedMarimoConfig } from "@/core/config/config"; import { getInitialAppMode } from "@/core/mode"; import { CssVariables } from "@/theme/ThemeProvider"; import { reactLazyWithPreload } from "@/utils/lazy"; import { ErrorBoundary } from "../components/editor/boundary/ErrorBoundary"; import { KernelStartupErrorModal } from "../components/editor/KernelStartupErrorModal"; import { TracebackModalContainer } from "../components/editor/TracebackModalContainer"; import { ModalProvider } from "../components/modal/ImperativeModal"; import { Toaster } from "../components/ui/toaster"; import { TooltipProvider } from "../components/ui/tooltip"; import { LocaleProvider } from "./i18n/locale-provider"; import { slotsController } from "./slots/slots"; // Force tailwind classnames // tailwind only creates css for classnames that exist the FE files export const FORCE_TW_CLASSES = "prose prose-sm prose-base prose-lg prose-xl prose-2xl dark:prose-invert"; // Lazy imports const LazyHomePage = reactLazyWithPreload( () => import("@/components/pages/home-page"), ); const LazyRunPage = reactLazyWithPreload( () => import("@/components/pages/run-page"), ); const LazyEditPage = reactLazyWithPreload( () => import("@/components/pages/edit-page"), ); const LazyGalleryPage = reactLazyWithPreload( () => import("@/components/pages/gallery-page"), ); export function preloadPage(mode: string) { switch (mode) { case "home": LazyHomePage.preload(); break; case "gallery": LazyGalleryPage.preload(); break; case "read": LazyRunPage.preload(); break; default: LazyEditPage.preload(); } } /** * The root component of the Marimo app. */ export const MarimoApp: React.FC = memo(() => { const [userConfig] = useResolvedMarimoConfig(); const [appConfig] = useAppConfig(); const editorFontSize = toRem(userConfig.display.code_editor_font_size); const renderBody = () => { const initialMode = getInitialAppMode(); if (initialMode === "home") { return ; } if (initialMode === "gallery") { return ; } if (initialMode === "read") { return ; } return ( ); }; return ( {renderBody()} ); }); MarimoApp.displayName = "MarimoApp"; /** * The root with all the providers. */ const Providers = memo(({ children }: PropsWithChildren) => { return ( {children} ); }); Providers.displayName = "Providers"; function toRem(px: number) { return `${px / 16}rem`; }