Merge branch 'main into homepage-2nd-sprint

This commit is contained in:
Jae Young Ahn 2025-05-02 10:20:18 -07:00
commit 450d141ad9
9 changed files with 740 additions and 196 deletions

View file

@ -1,131 +1,203 @@
// Page - Code Editor
import { useEffect, useState } from "react";
import CodeMirror from "@uiw/react-codemirror";
import { javascript } from "@codemirror/lang-javascript";
import { html } from "@codemirror/lang-html";
import { css } from "@codemirror/lang-css";
import { vscodeDark } from "@uiw/codemirror-theme-vscode";
import EditorPanel from "../components/EditorPanel";
import PreviewPanel from "../components/PreviewPanel";
const PageCodeEditor = () => {
const [code, setCode] = useState(`# Write your Battlesnake code here\ndef move(board):\n return { 'move': 'up' }`);
// State for storing code in different tabs
const [htmlCode, setHtmlCode] = useState(
"<div>\n <h1>Hello World</h1>\n <p>Start editing to see some magic happen!</p>\n</div>"
);
const [cssCode, setCssCode] = useState(
"h1 {\n color: #0070f3;\n}\n\np {\n color: #444;\n}"
);
const [jsCode, setJsCode] = useState(
'// JavaScript goes here\nconsole.log("Hello from the editor!");'
);
// State for active tab
const [activeTab, setActiveTab] = useState("html");
// Combined code for preview
const combinedCode = `
<html>
<head>
<style>${cssCode}</style>
</head>
<body>
${htmlCode}
<script>${jsCode}</script>
</body>
</html>
`;
useEffect(() => {
document.title = "Code Editor";
document.title = "Snake Brain Editor";
}, []);
// Function to handle which editor to show based on active tab
const renderEditor = () => {
switch (activeTab) {
case "html":
return (
<CodeMirror
value={htmlCode}
height="100%"
theme={vscodeDark}
extensions={[html()]}
onChange={(value) => setHtmlCode(value)}
/>
);
case "css":
return (
<CodeMirror
value={cssCode}
height="100%"
theme={vscodeDark}
extensions={[css()]}
onChange={(value) => setCssCode(value)}
/>
);
case "js":
return (
<CodeMirror
value={jsCode}
height="100%"
theme={vscodeDark}
extensions={[javascript()]}
onChange={(value) => setJsCode(value)}
/>
);
default:
return null;
}
};
return (
<main className="code-editor-page">
<div className="editor-section">
<EditorPanel code={code} onChange={setCode} />
</div>
<div className="preview-section">
<PreviewPanel code={code} />
</div>
<div className="editor-container">
<div className="editor-tabs">
<button
className={`tab ${activeTab === "html" ? "active" : ""}`}
onClick={() => setActiveTab("html")}
>
HTML
</button>
<button
className={`tab ${activeTab === "css" ? "active" : ""}`}
onClick={() => setActiveTab("css")}
>
CSS
</button>
<button
className={`tab ${activeTab === "js" ? "active" : ""}`}
onClick={() => setActiveTab("js")}
>
JavaScript
</button>
</div>
<div className="editor-content">{renderEditor()}</div>
</div>
<div className="preview-container">
<div className="preview-header">
<h3>Preview</h3>
</div>
<div className="preview-content">
<iframe
title="code-preview"
srcDoc={combinedCode}
sandbox="allow-scripts"
width="100%"
height="100%"
<main className="code-editor-page" style={{ paddingTop: '70px' }}>
<div
className="editor-page-layout"
style={{
display: 'flex',
gap: '2rem',
padding: '2rem',
fontFamily: "'Fira Code', 'Courier New', monospace",
}}
>
{/* python editor */}
<div
className="box-panel"
style={{
flex: 2,
background: 'linear-gradient(145deg, #0d0221, #1a1a1a)',
borderRadius: '12px',
boxShadow: '0 0 15px #05d9e8, 0 0 30px #ff2a6d',
border: '1px solid #ff2a6d',
padding: '1rem',
color: '#eee',
}}
>
<div
style={{
backgroundColor: '#ff2a6d',
height: '6px',
borderRadius: '3px 3px 0 0',
marginBottom: '0.5rem',
}}
/>
<h3
className="panel-heading"
style={{
fontSize: '1.2rem',
color: '#05d9e8',
textShadow: '0 0 5px #05d9e8',
marginBottom: '1rem',
}}
>
🐍 Snake Brain (Python)
</h3>
<EditorPanel code={code} onChange={setCode} />
</div>
{/* live arena */}
<div
className="box-panel"
style={{
flex: 1,
background: '#1a1a1a',
borderRadius: '12px',
boxShadow: '0 0 15px #d300c5, 0 0 25px #ff2a6d',
border: '1px solid #d300c5',
padding: '1rem',
color: '#eee',
}}
>
<div
style={{
backgroundColor: '#d300c5',
height: '6px',
borderRadius: '3px 3px 0 0',
marginBottom: '0.5rem',
}}
/>
<h3
style={{
fontSize: '1.2rem',
color: '#d300c5',
textShadow: '0 0 5px #d300c5',
marginBottom: '1rem',
display: 'flex',
alignItems: 'center',
gap: '0.5rem',
}}
>
🎯 Live Arena Output
</h3>
<h4 style={{ color: '#fff', textAlign: 'center', marginBottom: '1rem' }}>
Battlesnake Preview
</h4>
{/* game url*/}
<div
style={{
background: 'rgba(255,255,255,0.05)',
border: '1px solid #ff2a6d',
borderRadius: '8px',
padding: '1rem',
marginBottom: '1rem',
textAlign: 'center',
}}
>
<input
type="text"
placeholder="Game URL"
style={{
background: 'transparent',
border: 'none',
color: '#fff',
width: '100%',
textAlign: 'center',
fontFamily: "'Fira Code', monospace",
outline: 'none',
}}
/>
<button
style={{
backgroundColor: '#ff2a6d',
color: '#fff',
padding: '0.5rem 1rem',
border: 'none',
borderRadius: '20px',
marginTop: '0.5rem',
cursor: 'pointer',
width: '100%',
fontWeight: 'bold',
}}
>
FETCH BOARD
</button>
</div>
{/* snake api */}
<div
style={{
background: 'rgba(255,255,255,0.05)',
border: '1px solid #ff2a6d',
borderRadius: '8px',
padding: '1rem',
marginBottom: '1rem',
textAlign: 'center',
}}
>
<input
type="text"
placeholder="Your Snake API URL"
style={{
background: 'transparent',
border: 'none',
color: '#fff',
width: '100%',
textAlign: 'center',
fontFamily: "'Fira Code', monospace",
outline: 'none',
}}
/>
<button
style={{
backgroundColor: '#ff2a6d',
color: '#fff',
padding: '0.5rem 1rem',
border: 'none',
borderRadius: '20px',
marginTop: '0.5rem',
cursor: 'pointer',
width: '100%',
fontWeight: 'bold',
}}
>
CONNECT SNAKE API
</button>
</div>
{/* test move button */}
<div
style={{
display: 'flex',
justifyContent: 'center',
marginTop: '2rem',
}}
>
<button
style={{
backgroundColor: '#ff2a6d',
color: '#fff',
padding: '0.5rem 2rem',
border: 'none',
borderRadius: '20px',
fontWeight: 'bold',
cursor: 'pointer',
boxShadow: '0 0 10px #ff2a6d',
}}
>
TEST MOVE
</button>
</div>
</div>
</div>
</main>

View file

@ -1,23 +1,27 @@
// Page - Home
import { useEffect } from 'react';
import { useEffect } from "react";
const PageHome = () => {
useEffect(() => {
document.title = "Home";
}, []);
const [user, setUser] = useState(null);
useEffect(()=>{
document.title = 'Home';
},[]);
return (
<div className="homepage-container">
<main>
<section>
<h2>Home Page</h2>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Fugit porro, dolorem, quod facere enim voluptate provident quo labore vero repellat nemo animi ad exercitationem rem quos, possimus libero deleniti laudantium?</p>
</section>
</main>
</div>
);
return (
<div className="homepage-container">
<main>
<section>
<h2>Home Page</h2>
<p>
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Fugit
porro, dolorem, quod facere enim voluptate provident quo labore vero
repellat nemo animi ad exercitationem rem quos, possimus libero
deleniti laudantium?
</p>
</section>
</main>
</div>
);
};
export default PageHome;
export default PageHome;