diff --git a/package-lock.json b/package-lock.json index 9c4600b..c259c77 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,8 @@ "npm": "^11.4.1", "react": "^19.0.0", "react-dom": "^19.0.0", - "react-icons": "^5.5.0" + "react-icons": "^5.5.0", + "react-router-dom": "^7.12.0" }, "devDependencies": { "@eslint/js": "^9.21.0", @@ -1806,6 +1807,19 @@ "dev": true, "license": "MIT" }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -5947,6 +5961,44 @@ "react": "*" } }, + "node_modules/react-router": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.12.0.tgz", + "integrity": "sha512-kTPDYPFzDVGIIGNLS5VJykK0HfHLY5MF3b+xj0/tTyNYL1gF1qs7u67Z9jEhQk2sQ98SUaHxlG31g1JtF7IfVw==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.12.0.tgz", + "integrity": "sha512-pfO9fiBcpEfX4Tx+iTYKDtPbrSLLCbwJ5EqP+SPYQu1VYCXdy79GSj0wttR0U4cikVdlImZuEZ/9ZNCgoaxwBA==", + "license": "MIT", + "dependencies": { + "react-router": "7.12.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -6095,6 +6147,12 @@ "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", "license": "MIT" }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "license": "MIT" + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", diff --git a/package.json b/package.json index ef2d2bf..b6a59e8 100644 --- a/package.json +++ b/package.json @@ -19,7 +19,8 @@ "npm": "^11.4.1", "react": "^19.0.0", "react-dom": "^19.0.0", - "react-icons": "^5.5.0" + "react-icons": "^5.5.0", + "react-router-dom": "^7.12.0" }, "devDependencies": { "@eslint/js": "^9.21.0", diff --git a/src/App.jsx b/src/App.jsx index 7943bbe..d85b192 100644 --- a/src/App.jsx +++ b/src/App.jsx @@ -1,10 +1,19 @@ -import CompilerLandingPage from "./pages/CompilerLandingPage"; +// src/App.jsx +import { BrowserRouter, Routes, Route } from "react-router-dom"; + +import CompilerLandingPage from "./pages/CodeEditor"; +import CodeEditor from "./pages/CodeEditor"; function App() { return ( -
- -
+ +
+ + } /> + } /> + +
+
); } diff --git a/src/components/CodeEditorWindow.jsx b/src/components/CodeEditorWindow.jsx index d32bb19..a5aaf2a 100644 --- a/src/components/CodeEditorWindow.jsx +++ b/src/components/CodeEditorWindow.jsx @@ -1,6 +1,5 @@ // src/components/CodeEditorWindow.jsx import Editor from "@monaco-editor/react"; -import { CODE_SNIPPETS } from "../utils/constant"; // Correct path to constant.js const CodeEditorWindow = ({ onChange, @@ -10,37 +9,41 @@ const CodeEditorWindow = ({ className = "", style = {}, activeFileId, - // openFiles, }) => { - return activeFileId ? ( + if (!activeFileId) { + return ( +

+ Select or create a file to start editing +

+ ); + } + + return (
onChange(val ?? "")} theme="vs-dark" options={{ minimap: { enabled: true }, - fontSize: 14, + fontSize: 14, scrollBeyondLastLine: false, - wordWrap: "on", - showUnused: true, + wordWrap: "on", + showUnused: true, cursorBlinking: "smooth", cursorSmoothCaretAnimation: "on", - renderLineHighlight: "all", - lineNumbersMinChars: 3, + renderLineHighlight: "all", + lineNumbersMinChars: 3, fontFamily: "Fira Code, Consolas, 'Courier New', monospace", - fontLigatures: true, + fontLigatures: true, "bracketPairColorization.enabled": true, "guides.bracketPairs": "active", }} - defaultValue={CODE_SNIPPETS[language]} - onChange={(val) => onChange(val)} />
- ) : ( -

Select or create a file to start editing

); }; diff --git a/src/components/CompilerLandingPage.jsx b/src/components/CompilerLandingPage.jsx new file mode 100644 index 0000000..5008165 --- /dev/null +++ b/src/components/CompilerLandingPage.jsx @@ -0,0 +1,56 @@ +// src/pages/CompilerLandingPage.jsx +import { useNavigate } from "react-router-dom"; +import { motion } from "framer-motion"; +import { FiPlay } from "react-icons/fi"; +import { useTheme } from "../context/ThemeContext"; + +const CompilerLandingPage = () => { + const navigate = useNavigate(); + const { theme } = useTheme(); + + return ( +
+ {/* Title */} + + Online Code Compiler + + + {/* Subtitle */} + + Write, run, and share code instantly in your browser. + No setup. No login. Just code. + + + {/* CTA Button */} + navigate("/editor")} + className="flex items-center gap-2 px-6 py-3 rounded-lg font-semibold text-white + bg-blue-600 hover:bg-blue-700 shadow-lg" + > + + Start Coding + +
+ ); +}; + +export default CompilerLandingPage; \ No newline at end of file diff --git a/src/components/FileBar.jsx b/src/components/FileBar.jsx index 2893005..99b8643 100644 --- a/src/components/FileBar.jsx +++ b/src/components/FileBar.jsx @@ -1,15 +1,15 @@ -// components/FileBar.jsx +// src/components/FileBar.jsx import React, { useState, useEffect } from "react"; import { motion, AnimatePresence } from "framer-motion"; -import { languageOptions } from "../utils/constant.js"; // Assuming languageOptions is defined here +import { languageOptions } from "../utils/constant"; import { useTheme } from "../context/ThemeContext"; - import { FiPlus, FiPlay, FiChevronDown } from "react-icons/fi"; const FileBar = ({ language, onLanguageSelect, onRunCode, + onShare, isLoading, openFiles, activeFileId, @@ -19,30 +19,24 @@ const FileBar = ({ onVersionSelect, }) => { const { theme } = useTheme(); + const [version, setVersion] = useState(""); + // Get versions for selected language const getLanguageVersions = (langValue) => { const lang = Object.values(languageOptions).find( (opt) => opt.value === langValue ); - return lang && lang.versions ? lang.versions : lang ? [lang.version] : []; + return lang?.versions?.length ? lang.versions : lang?.version ? [lang.version] : []; }; - const [version, setVersion] = useState(() => { - const initialLang = languageOptions[language]; - return initialLang ? initialLang.version : ""; - }); - + // Sync version with language useEffect(() => { - const currentLangOption = Object.values(languageOptions).find( + const lang = Object.values(languageOptions).find( (opt) => opt.value === language ); - if (currentLangOption) { - setVersion(currentLangOption.version); - onVersionSelect(currentLangOption.version); - } else { - setVersion(""); - onVersionSelect(""); - } + const v = lang?.version || ""; + setVersion(v); + onVersionSelect(v); }, [language, onVersionSelect]); const handleVersionChange = (e) => { @@ -51,119 +45,87 @@ const FileBar = ({ }; return ( -