{
  "name": "markdown-editor-menubar",
  "type": "registry:component",
  "dependencies": [
    "@unsanity/markdown-editor",
    "sonner"
  ],
  "registryDependencies": [
    "menubar"
  ],
  "files": [
    {
      "path": "components/markdown-editor/markdown-editor-menubar.tsx",
      "content": "\"use client\";\n\nimport { redo, undo } from \"@codemirror/commands\";\nimport { useMarkdownEditorChrome } from \"@unsanity/markdown-editor\";\nimport { toast } from \"sonner\";\n\nimport { cn } from \"@/lib/utils\";\nimport {\n  Menubar,\n  MenubarCheckboxItem,\n  MenubarContent,\n  MenubarItem,\n  MenubarMenu,\n  MenubarSeparator,\n  MenubarShortcut,\n  MenubarTrigger,\n} from \"@/components/ui/menubar\";\n\nexport function MarkdownEditorMenubar({\n  className,\n  downloadFileName = \"document.md\",\n}: {\n  className?: string;\n  downloadFileName?: string;\n}) {\n  const { editorView, showMarkers, setShowMarkers } = useMarkdownEditorChrome();\n\n  const getMarkdown = () => editorView?.state.doc.toString() ?? \"\";\n\n  return (\n    <Menubar className={cn(\"border-0 bg-transparent px-3 md:px-4\", className)}>\n      <MenubarMenu>\n        <MenubarTrigger>파일</MenubarTrigger>\n        <MenubarContent>\n          <MenubarItem\n            onSelect={() => {\n              const md = getMarkdown();\n              void navigator.clipboard.writeText(md).then(\n                () => {\n                  toast.success(\"마크다운이 복사되었습니다.\");\n                },\n                () => {\n                  toast.error(\"복사에 실패했습니다.\");\n                },\n              );\n            }}\n          >\n            마크다운 복사\n          </MenubarItem>\n          <MenubarItem\n            onSelect={() => {\n              const md = getMarkdown();\n              const blob = new Blob([md], { type: \"text/markdown;charset=utf-8\" });\n              const url = URL.createObjectURL(blob);\n              const a = document.createElement(\"a\");\n              a.href = url;\n              a.download = downloadFileName.replace(/\\.md$/i, \"\") + \".md\";\n              a.click();\n              URL.revokeObjectURL(url);\n              toast.success(\"파일로 저장했습니다.\");\n            }}\n          >\n            다운로드…\n          </MenubarItem>\n          <MenubarSeparator />\n          <MenubarItem\n            variant=\"destructive\"\n            onSelect={() => {\n              if (!editorView) return;\n              const doc = editorView.state.doc;\n              editorView.dispatch({\n                changes: { from: 0, to: doc.length, insert: \"\" },\n              });\n              toast.message(\"문서를 비웠습니다.\");\n            }}\n          >\n            모두 지우기\n          </MenubarItem>\n        </MenubarContent>\n      </MenubarMenu>\n\n      <MenubarMenu>\n        <MenubarTrigger>편집</MenubarTrigger>\n        <MenubarContent>\n          <MenubarItem\n            onSelect={() => {\n              if (editorView) undo(editorView);\n            }}\n          >\n            실행 취소\n            <MenubarShortcut>⌘Z</MenubarShortcut>\n          </MenubarItem>\n          <MenubarItem\n            onSelect={() => {\n              if (editorView) redo(editorView);\n            }}\n          >\n            다시 실행\n            <MenubarShortcut>⇧⌘Z</MenubarShortcut>\n          </MenubarItem>\n        </MenubarContent>\n      </MenubarMenu>\n\n      <MenubarMenu>\n        <MenubarTrigger>보기</MenubarTrigger>\n        <MenubarContent>\n          <MenubarCheckboxItem\n            checked={showMarkers}\n            onCheckedChange={(v) => setShowMarkers(v === true)}\n          >\n            구문 강조\n          </MenubarCheckboxItem>\n        </MenubarContent>\n      </MenubarMenu>\n    </Menubar>\n  );\n}\n",
      "type": "registry:component"
    }
  ]
}
