{
  "name": "spreadsheet-menubar-file-menu",
  "type": "registry:component",
  "dependencies": [
    "@unsanity/spreadsheet",
    "lucide-react"
  ],
  "registryDependencies": [
    "menubar",
    "https://spreadsheet.ui.unsanity.ai/r/spreadsheet-import-dialog.json"
  ],
  "files": [
    {
      "path": "components/spreadsheet/spreadsheet-menubar-file-menu.tsx",
      "content": "\"use client\";\n\nimport { useState } from \"react\";\nimport {\n  downloadSheetAsCsv,\n  downloadSheetAsTsv,\n  fromActive,\n  usePersistenceActions,\n  useSpreadsheetStore,\n} from \"@unsanity/spreadsheet\";\nimport {\n  Download,\n  FilePenLine,\n  FilePlus2,\n  FolderOpen,\n  Save,\n  SaveAll,\n  Trash2,\n  Upload,\n} from \"lucide-react\";\nimport {\n  MenubarContent,\n  MenubarItem,\n  MenubarMenu,\n  MenubarSeparator,\n  MenubarSub,\n  MenubarSubContent,\n  MenubarSubTrigger,\n  MenubarTrigger,\n} from \"@/components/ui/menubar\";\nimport { SpreadsheetImportDialog } from \"./spreadsheet-import-dialog\";\n\nexport function SpreadsheetMenubarFileMenu() {\n  const {\n    hostCtx,\n    onNew,\n    onOpen,\n    onSave,\n    onSaveAs,\n    onRename,\n    onDelete,\n    hasNew,\n    hasOpen,\n    hasSave,\n    hasSaveAs,\n    hasRename,\n    hasDelete,\n    save,\n    saveAs,\n  } = usePersistenceActions();\n\n  const sheetName = useSpreadsheetStore(fromActive((sh) => sh.name));\n  const sheetData = useSpreadsheetStore(fromActive((sh) => sh.data));\n\n  const [importOpen, setImportOpen] = useState(false);\n\n  const showPersistenceBlock =\n    hasNew || hasOpen || hasSave || hasSaveAs || hasRename;\n\n  return (\n    <>\n      <SpreadsheetImportDialog open={importOpen} onOpenChange={setImportOpen} />\n      <MenubarMenu>\n        <MenubarTrigger>File</MenubarTrigger>\n        <MenubarContent>\n          {hasNew ? (\n            <MenubarItem onClick={() => void onNew?.(hostCtx)}>\n              <FilePlus2 className=\"size-3\" />\n              New…\n            </MenubarItem>\n          ) : null}\n          {hasOpen ? (\n            <MenubarItem onClick={() => void onOpen?.(hostCtx)}>\n              <FolderOpen className=\"size-3\" />\n              Open…\n            </MenubarItem>\n          ) : null}\n          {hasSave ? (\n            <MenubarItem onClick={() => void save()}>\n              <Save className=\"size-3\" />\n              Save\n            </MenubarItem>\n          ) : null}\n          {hasSaveAs ? (\n            <MenubarItem onClick={() => void saveAs()}>\n              <SaveAll className=\"size-3\" />\n              Save As…\n            </MenubarItem>\n          ) : null}\n          {hasRename ? (\n            <MenubarItem onClick={() => void onRename?.(hostCtx)}>\n              <FilePenLine className=\"size-3\" />\n              Rename…\n            </MenubarItem>\n          ) : null}\n          {showPersistenceBlock ? <MenubarSeparator /> : null}\n          <MenubarItem onClick={() => setImportOpen(true)}>\n            <Upload className=\"size-3\" />\n            Import…\n          </MenubarItem>\n          <MenubarSub>\n            <MenubarSubTrigger className=\"gap-2\">\n              <Download className=\"size-3 shrink-0 stroke-muted-foreground\" />\n              Export\n            </MenubarSubTrigger>\n            <MenubarSubContent>\n              <MenubarItem onClick={() => downloadSheetAsCsv(sheetData, sheetName)}>\n                Comma-separated values (.csv)\n              </MenubarItem>\n              <MenubarItem onClick={() => downloadSheetAsTsv(sheetData, sheetName)}>\n                Tab-separated values (.tsv)\n              </MenubarItem>\n            </MenubarSubContent>\n          </MenubarSub>\n          {hasDelete ? (\n            <>\n              <MenubarSeparator />\n              <MenubarItem onClick={() => void onDelete?.(hostCtx)}>\n                <Trash2 className=\"size-3\" />\n                Delete document…\n              </MenubarItem>\n            </>\n          ) : null}\n        </MenubarContent>\n      </MenubarMenu>\n    </>\n  );\n}\n",
      "type": "registry:component"
    }
  ]
}
