/* Copyright 2026 Marimo. All rights reserved. */ import { useMediaQuery } from "@uidotdev/usehooks"; import type React from "react"; import { CopyClipboardIcon } from "@/components/icons/copy-icon"; import { Spinner } from "@/components/icons/spinner"; import { Button, buttonVariants } from "@/components/ui/button"; import { DialogContent, DialogDescription, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { cn } from "@/utils/cn"; import { FORMAT_DEFINITIONS } from "./format-options"; import { FormatNotice, FormatStatusIcon } from "./format-notice"; import type { ExportFormat } from "./state"; import { useExportDialog } from "./use-export-dialog"; const DESKTOP_LAYOUT_QUERY = "(min-width: 640px)"; export const ExportDialog: React.FC<{ initialFormat?: ExportFormat; onClose: () => void; returnFocusRef?: React.RefObject; }> = ({ initialFormat, onClose, returnFocusRef }) => { const { dialogRef, isExporting, isInstalling, canInstall, formats, options, selected, selectFormat, updateOptions, installRequirements, submit, } = useExportDialog({ initialFormat, onClose }); const isBusy = isExporting || isInstalling; const desktopLayout = useMediaQuery(DESKTOP_LAYOUT_QUERY); const { format, status, usesBrowserPrint, actionLabel, command, footerDescription, } = selected; const definition = FORMAT_DEFINITIONS[format]; const FormatOptions = definition.Options; const returnFocusProps = returnFocusRef ? { onCloseAutoFocus: (event: Event) => { event.preventDefault(); returnFocusRef.current?.focus(); }, } : {}; return ( Export notebook Choose a format and adjust its options. {formats.map(({ format: candidate, status: candidateStatus }) => { const candidateDefinition = FORMAT_DEFINITIONS[candidate]; return ( {candidateDefinition.label} ); })} {/* One panel per tab so each trigger's aria-controls resolves. */} {formats.map(({ format: candidate }) => (

{definition.label}

{definition.description}

{usesBrowserPrint ? null : ( )}
))}
); };