diff --git a/package-lock.json b/package-lock.json
index d86843e..1481516 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -14,6 +14,7 @@
"@react-three/rapier": "^2.2.0",
"gsap": "^3.15.0",
"lil-gui": "^0.21.0",
+ "lucide-react": "^1.11.0",
"r3f-perf": "^7.2.3",
"react": "^19.2.4",
"react-dom": "^19.2.4",
@@ -36,6 +37,9 @@
"typescript": "~6.0.2",
"typescript-eslint": "^8.58.0",
"vite": "^8.0.4"
+ },
+ "engines": {
+ "node": ">=20.19.0 || >=22.12.0"
}
},
"node_modules/@babel/code-frame": {
@@ -2362,12 +2366,6 @@
"integrity": "sha512-dMW4CWBTUK1AEEDeZc1g4xpPGIrSf9fJF960qbTZmN/QwZIWY5wgliS6JWl9/25fpTGJrMRtSjGtOmPnfjZB+A==",
"license": "Standard 'no charge' license: https://gsap.com/standard-license."
},
- "node_modules/gsap": {
- "version": "3.15.0",
- "resolved": "https://registry.npmjs.org/gsap/-/gsap-3.15.0.tgz",
- "integrity": "sha512-dMW4CWBTUK1AEEDeZc1g4xpPGIrSf9fJF960qbTZmN/QwZIWY5wgliS6JWl9/25fpTGJrMRtSjGtOmPnfjZB+A==",
- "license": "Standard 'no charge' license: https://gsap.com/standard-license."
- },
"node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -2922,6 +2920,15 @@
"yallist": "^3.0.2"
}
},
+ "node_modules/lucide-react": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.11.0.tgz",
+ "integrity": "sha512-UOhjdztXCgdBReRcIhsvz2siIBogfv/lhJEIViCpLt924dO+GDms9T7DNoucI23s6kEPpe988m5N0D2ajnzb2g==",
+ "license": "ISC",
+ "peerDependencies": {
+ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
"node_modules/maath": {
"version": "0.10.8",
"resolved": "https://registry.npmjs.org/maath/-/maath-0.10.8.tgz",
@@ -3159,15 +3166,6 @@
"three": ">= 0.168.0 < 0.185.0"
}
},
- "node_modules/postprocessing": {
- "version": "6.39.1",
- "resolved": "https://registry.npmjs.org/postprocessing/-/postprocessing-6.39.1.tgz",
- "integrity": "sha512-R2dG2zy+BAx3USl5EHw+PvnrlbT5PKnZVp3se0HCR0pWH8WQdh742yNG4YWOsq6c0bFpffk0Gd2RqPeoP/wKng==",
- "license": "Zlib",
- "peerDependencies": {
- "three": ">= 0.168.0 < 0.185.0"
- }
- },
"node_modules/potpack": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz",
diff --git a/package.json b/package.json
index 8d53429..9e1cef4 100644
--- a/package.json
+++ b/package.json
@@ -20,6 +20,7 @@
"@react-three/rapier": "^2.2.0",
"gsap": "^3.15.0",
"lil-gui": "^0.21.0",
+ "lucide-react": "^1.11.0",
"r3f-perf": "^7.2.3",
"react": "^19.2.4",
"react-dom": "^19.2.4",
diff --git a/src/features/editor/components/EditorControls.tsx b/src/features/editor/components/EditorControls.tsx
index 01e6a73..de7ee84 100644
--- a/src/features/editor/components/EditorControls.tsx
+++ b/src/features/editor/components/EditorControls.tsx
@@ -1,3 +1,16 @@
+import {
+ Box,
+ Download,
+ Expand,
+ Keyboard,
+ Lock,
+ MousePointer2,
+ Move3D,
+ Redo2,
+ RotateCw,
+ Save,
+ Undo2,
+} from "lucide-react";
import type { TransformMode } from "@/types/editor";
interface EditorControlsProps {
@@ -32,108 +45,192 @@ export function EditorControls({
isPlayerMode,
}: EditorControlsProps): React.JSX.Element {
const cameraPosition = [0, 50, 100];
+ const viewModeLabel = isPlayerMode ? "View locked" : "Lock view";
return (
<>
-
Camera Position:
-
X: {cameraPosition[0]!.toFixed(2)}
-
Y: {cameraPosition[1]!.toFixed(2)}
-
Z: {cameraPosition[2]!.toFixed(2)}
+
Camera
+
+ X {cameraPosition[0]!.toFixed(0)} ยท Y {cameraPosition[1]!.toFixed(0)}{" "}
+ ยท Z {cameraPosition[2]!.toFixed(0)}
+
-
-
Transform
+
>
);
}
diff --git a/src/features/editor/scene/EditorMap.tsx b/src/features/editor/scene/EditorMap.tsx
index 4054806..c60fbb5 100644
--- a/src/features/editor/scene/EditorMap.tsx
+++ b/src/features/editor/scene/EditorMap.tsx
@@ -70,10 +70,10 @@ export function EditorMap({
args={[100, 100]}
cellSize={1}
cellThickness={0.5}
- cellColor="#444444"
+ cellColor="#242424"
sectionSize={5}
sectionThickness={1}
- sectionColor="#666666"
+ sectionColor="#3a3a3a"
fadeDistance={50}
fadeStrength={1}
followCamera={false}
@@ -199,10 +199,10 @@ function EditorModelNode({
) {
if (isSelected) {
mesh.material = mesh.material.clone();
- (mesh.material as THREE.MeshStandardMaterial).color.set("#ff6600");
+ (mesh.material as THREE.MeshStandardMaterial).color.set("#ffffff");
} else if (isHovered) {
mesh.material = mesh.material.clone();
- (mesh.material as THREE.MeshStandardMaterial).color.set("#ff9900");
+ (mesh.material as THREE.MeshStandardMaterial).color.set("#b8b8b8");
}
}
}
@@ -281,7 +281,7 @@ function EditorFallbackNode({
}
}, [node.position, node.rotation, node.scale]);
- const color = isSelected ? "#ff6600" : isHovered ? "#ff9900" : "#cccccc";
+ const color = isSelected ? "#ffffff" : isHovered ? "#b8b8b8" : "#6f6f6f";
return (
{
- gl.setClearColor("#1e293b");
+ gl.setClearColor("#050505");
}}
>