diff --git a/src/app/(app)/problems/[id]/@workspace/@editor/layout.tsx b/src/app/(app)/problems/[id]/@workspace/@editor/layout.tsx
index 36c8a63..abbe23c 100644
--- a/src/app/(app)/problems/[id]/@workspace/@editor/layout.tsx
+++ b/src/app/(app)/problems/[id]/@workspace/@editor/layout.tsx
@@ -1,3 +1,4 @@
+import WorkspaceEditorHeader from "@/features/playground/workspace/editor/header";
import WorkspaceEditorFooter from "@/features/playground/workspace/editor/footer";
interface WorkspaceEditorLayoutProps {
@@ -9,6 +10,7 @@ export default function WorkspaceEditorLayout({
}: WorkspaceEditorLayoutProps) {
return (
diff --git a/src/app/(app)/problems/[id]/@workspace/@editor/page.tsx b/src/app/(app)/problems/[id]/@workspace/@editor/page.tsx
new file mode 100644
index 0000000..453b337
--- /dev/null
+++ b/src/app/(app)/problems/[id]/@workspace/@editor/page.tsx
@@ -0,0 +1,5 @@
+import CodeEditor from "@/components/code-editor";
+
+export default function WorkspaceEditorPage() {
+ return ;
+}
diff --git a/src/features/playground/workspace/editor/components/copy-button.tsx b/src/features/playground/workspace/editor/components/copy-button.tsx
new file mode 100644
index 0000000..375c21c
--- /dev/null
+++ b/src/features/playground/workspace/editor/components/copy-button.tsx
@@ -0,0 +1,70 @@
+"use client";
+
+import {
+ Tooltip,
+ TooltipContent,
+ TooltipProvider,
+ TooltipTrigger,
+} from "@/components/ui/tooltip";
+import { cn } from "@/lib/utils";
+import { useState } from "react";
+import { Check, Copy } from "lucide-react";
+import { Button } from "@/components/ui/button";
+import { useCodeEditorStore } from "@/store/useCodeEditorStore";
+
+export default function CopyButton() {
+ const [copied, setCopied] = useState(false);
+ const { editor } = useCodeEditorStore();
+
+ const handleCopy = async () => {
+ try {
+ await navigator.clipboard.writeText(editor?.getValue() || "");
+ setCopied(true);
+ setTimeout(() => setCopied(false), 1500);
+ } catch (err) {
+ console.error("Failed to copy text: ", err);
+ }
+ };
+
+ return (
+
+
+
+
+
+
+ Click to Copy
+
+
+
+ );
+}
diff --git a/src/features/playground/workspace/editor/components/format-button.tsx b/src/features/playground/workspace/editor/components/format-button.tsx
new file mode 100644
index 0000000..8179069
--- /dev/null
+++ b/src/features/playground/workspace/editor/components/format-button.tsx
@@ -0,0 +1,38 @@
+"use client";
+
+import {
+ Tooltip,
+ TooltipContent,
+ TooltipProvider,
+ TooltipTrigger,
+} from "@/components/ui/tooltip";
+import { Paintbrush } from "lucide-react";
+import { Button } from "@/components/ui/button";
+import { useCodeEditorStore } from "@/store/useCodeEditorStore";
+
+export default function FormatButton() {
+ const { editor } = useCodeEditorStore();
+
+ return (
+
+
+
+
+
+
+ Format Code
+
+
+
+ );
+}
diff --git a/src/features/playground/workspace/editor/components/language-selector.tsx b/src/features/playground/workspace/editor/components/language-selector.tsx
new file mode 100644
index 0000000..b149344
--- /dev/null
+++ b/src/features/playground/workspace/editor/components/language-selector.tsx
@@ -0,0 +1,47 @@
+"use client";
+
+import {
+ Select,
+ SelectContent,
+ SelectItem,
+ SelectTrigger,
+ SelectValue,
+} from "@/components/ui/select";
+import { getPath } from "@/lib/utils";
+import { EditorLanguage } from "@prisma/client";
+import { Skeleton } from "@/components/ui/skeleton";
+import LanguageServerConfig from "@/config/language-server";
+import { EditorLanguageConfig } from "@/config/editor-language";
+import { useCodeEditorStore } from "@/store/useCodeEditorStore";
+
+export default function LanguageSelector() {
+ const { hydrated, language, setLanguage, setPath, setLspConfig } = useCodeEditorStore();
+
+ if (!hydrated) {
+ return ;
+ }
+
+ const handleValueChange = (lang: EditorLanguage) => {
+ setLanguage(lang);
+ setPath(getPath(lang));
+ setLspConfig(LanguageServerConfig[lang]);
+ };
+
+ return (
+
+ );
+}
diff --git a/src/features/playground/workspace/editor/components/redo-button.tsx b/src/features/playground/workspace/editor/components/redo-button.tsx
new file mode 100644
index 0000000..ba28031
--- /dev/null
+++ b/src/features/playground/workspace/editor/components/redo-button.tsx
@@ -0,0 +1,38 @@
+"use client";
+
+import {
+ Tooltip,
+ TooltipContent,
+ TooltipProvider,
+ TooltipTrigger,
+} from "@/components/ui/tooltip";
+import { Redo2 } from "lucide-react";
+import { Button } from "@/components/ui/button";
+import { useCodeEditorStore } from "@/store/useCodeEditorStore";
+
+export default function RedoButton() {
+ const { editor } = useCodeEditorStore();
+
+ return (
+
+
+
+
+
+
+ Redo Code
+
+
+
+ );
+}
diff --git a/src/features/playground/workspace/editor/components/reset-button.tsx b/src/features/playground/workspace/editor/components/reset-button.tsx
new file mode 100644
index 0000000..9c09037
--- /dev/null
+++ b/src/features/playground/workspace/editor/components/reset-button.tsx
@@ -0,0 +1,51 @@
+"use client";
+
+import {
+ Tooltip,
+ TooltipContent,
+ TooltipProvider,
+ TooltipTrigger,
+} from "@/components/ui/tooltip";
+import { RotateCcw } from "lucide-react";
+import { Button } from "@/components/ui/button";
+import { useCodeEditorStore } from "@/store/useCodeEditorStore";
+import { TEMP_DEFAULT_EDITOR_VALUE } from "@/config/problem/value";
+
+export default function ResetButton() {
+ const { editor, language } = useCodeEditorStore();
+ return (
+
+
+
+
+
+
+ Reset Code
+
+
+
+ );
+}
diff --git a/src/features/playground/workspace/editor/components/undo-button.tsx b/src/features/playground/workspace/editor/components/undo-button.tsx
new file mode 100644
index 0000000..21e607f
--- /dev/null
+++ b/src/features/playground/workspace/editor/components/undo-button.tsx
@@ -0,0 +1,38 @@
+"use client";
+
+import {
+ Tooltip,
+ TooltipContent,
+ TooltipProvider,
+ TooltipTrigger,
+} from "@/components/ui/tooltip";
+import { Undo2 } from "lucide-react";
+import { Button } from "@/components/ui/button";
+import { useCodeEditorStore } from "@/store/useCodeEditorStore";
+
+export default function UndoButton() {
+ const { editor } = useCodeEditorStore();
+
+ return (
+
+
+
+
+
+
+ Undo Code
+
+
+
+ );
+}
diff --git a/src/features/playground/workspace/editor/header.tsx b/src/features/playground/workspace/editor/header.tsx
new file mode 100644
index 0000000..e142540
--- /dev/null
+++ b/src/features/playground/workspace/editor/header.tsx
@@ -0,0 +1,36 @@
+import { cn } from "@/lib/utils";
+import CopyButton from "./components/copy-button";
+import RedoButton from "./components/redo-button";
+import UndoButton from "./components/undo-button";
+import ResetButton from "./components/reset-button";
+import FormatButton from "./components/format-button";
+import LanguageSelector from "./components/language-selector";
+
+interface WorkspaceEditorHeaderProps {
+ className?: string;
+}
+
+export default function WorkspaceEditorHeader({
+ className,
+ ...props
+}: WorkspaceEditorHeaderProps) {
+ return (
+
+ );
+}