diff --git a/editor/index.html b/editor/index.html
index c93d819..5314680 100644
--- a/editor/index.html
+++ b/editor/index.html
@@ -4,7 +4,7 @@
-
editor
+ nandsim
diff --git a/editor/package.json b/editor/package.json
index a411456..14b3c09 100644
--- a/editor/package.json
+++ b/editor/package.json
@@ -30,5 +30,8 @@
"typescript": "~6.0.2",
"typescript-eslint": "^8.58.2",
"vite": "^8.0.10"
+ },
+ "prettier": {
+ "tabWidth": 2
}
-}
+}
\ No newline at end of file
diff --git a/editor/src/App.css b/editor/src/App.css
index f90339d..e69de29 100644
--- a/editor/src/App.css
+++ b/editor/src/App.css
@@ -1,184 +0,0 @@
-.counter {
- font-size: 16px;
- padding: 5px 10px;
- border-radius: 5px;
- color: var(--accent);
- background: var(--accent-bg);
- border: 2px solid transparent;
- transition: border-color 0.3s;
- margin-bottom: 24px;
-
- &:hover {
- border-color: var(--accent-border);
- }
- &:focus-visible {
- outline: 2px solid var(--accent);
- outline-offset: 2px;
- }
-}
-
-.hero {
- position: relative;
-
- .base,
- .framework,
- .vite {
- inset-inline: 0;
- margin: 0 auto;
- }
-
- .base {
- width: 170px;
- position: relative;
- z-index: 0;
- }
-
- .framework,
- .vite {
- position: absolute;
- }
-
- .framework {
- z-index: 1;
- top: 34px;
- height: 28px;
- transform: perspective(2000px) rotateZ(300deg) rotateX(44deg) rotateY(39deg)
- scale(1.4);
- }
-
- .vite {
- z-index: 0;
- top: 107px;
- height: 26px;
- width: auto;
- transform: perspective(2000px) rotateZ(300deg) rotateX(40deg) rotateY(39deg)
- scale(0.8);
- }
-}
-
-#center {
- display: flex;
- flex-direction: column;
- gap: 25px;
- place-content: center;
- place-items: center;
- flex-grow: 1;
-
- @media (max-width: 1024px) {
- padding: 32px 20px 24px;
- gap: 18px;
- }
-}
-
-#next-steps {
- display: flex;
- border-top: 1px solid var(--border);
- text-align: left;
-
- & > div {
- flex: 1 1 0;
- padding: 32px;
- @media (max-width: 1024px) {
- padding: 24px 20px;
- }
- }
-
- .icon {
- margin-bottom: 16px;
- width: 22px;
- height: 22px;
- }
-
- @media (max-width: 1024px) {
- flex-direction: column;
- text-align: center;
- }
-}
-
-#docs {
- border-right: 1px solid var(--border);
-
- @media (max-width: 1024px) {
- border-right: none;
- border-bottom: 1px solid var(--border);
- }
-}
-
-#next-steps ul {
- list-style: none;
- padding: 0;
- display: flex;
- gap: 8px;
- margin: 32px 0 0;
-
- .logo {
- height: 18px;
- }
-
- a {
- color: var(--text-h);
- font-size: 16px;
- border-radius: 6px;
- background: var(--social-bg);
- display: flex;
- padding: 6px 12px;
- align-items: center;
- gap: 8px;
- text-decoration: none;
- transition: box-shadow 0.3s;
-
- &:hover {
- box-shadow: var(--shadow);
- }
- .button-icon {
- height: 18px;
- width: 18px;
- }
- }
-
- @media (max-width: 1024px) {
- margin-top: 20px;
- flex-wrap: wrap;
- justify-content: center;
-
- li {
- flex: 1 1 calc(50% - 8px);
- }
-
- a {
- width: 100%;
- justify-content: center;
- box-sizing: border-box;
- }
- }
-}
-
-#spacer {
- height: 88px;
- border-top: 1px solid var(--border);
- @media (max-width: 1024px) {
- height: 48px;
- }
-}
-
-.ticks {
- position: relative;
- width: 100%;
-
- &::before,
- &::after {
- content: '';
- position: absolute;
- top: -4.5px;
- border: 5px solid transparent;
- }
-
- &::before {
- left: 0;
- border-left-color: var(--border);
- }
- &::after {
- right: 0;
- border-right-color: var(--border);
- }
-}
diff --git a/editor/src/App.tsx b/editor/src/App.tsx
index a66b5ef..9f6c942 100644
--- a/editor/src/App.tsx
+++ b/editor/src/App.tsx
@@ -1,122 +1,14 @@
-import { useState } from 'react'
-import reactLogo from './assets/react.svg'
-import viteLogo from './assets/vite.svg'
-import heroImg from './assets/hero.png'
-import './App.css'
-
-function App() {
- const [count, setCount] = useState(0)
+import { type ReactElement } from "react";
+import "./App.css";
+import Editor from "./Editor";
+function App(): ReactElement {
return (
<>
-
-
-
-
Get started
-
- Edit src/App.tsx and save to test HMR
-
-
-
-
-
-
-
-
-
-
-
Documentation
-
Your questions, answered
-
-
-
-
-
Connect with us
-
Join the Vite community
-
-
-
-
-
-
+ nandsim
+
>
- )
+ );
}
-export default App
+export default App;
diff --git a/editor/src/Editor.css b/editor/src/Editor.css
new file mode 100644
index 0000000..51015f8
--- /dev/null
+++ b/editor/src/Editor.css
@@ -0,0 +1,6 @@
+
+.Editor {
+ canvas {
+ image-rendering: pixelated;
+ }
+}
diff --git a/editor/src/Editor.tsx b/editor/src/Editor.tsx
new file mode 100644
index 0000000..af27945
--- /dev/null
+++ b/editor/src/Editor.tsx
@@ -0,0 +1,78 @@
+import { useEffect, useRef, type ReactElement } from "react";
+import "./Editor.css";
+
+function Editor(): ReactElement {
+ const ref = useRef(null);
+
+ useEffect(() => {
+ if (!ref.current) return;
+
+ let offset = { x: 0, y: 0 };
+ let dragging = false;
+
+ const canvas = ref.current;
+ const cx = canvas.getContext("2d")!;
+ cx.imageSmoothingEnabled = false;
+
+ const render = () => {
+ cx.fillStyle = "white";
+ cx.fillRect(0, 0, canvas.width, canvas.height);
+
+ const gridSize = { x: 20, y: 20 };
+ const dotSize = { x: 4, y: 4 };
+
+ cx.fillStyle = "gray";
+ for (let y = 0; y < canvas.width / gridSize.x + 1; ++y) {
+ for (let x = 0; x < canvas.height / gridSize.y + 1; ++x) {
+ cx.fillRect(
+ (offset.x % gridSize.x) + x * gridSize.x - dotSize.x / 2,
+ (offset.y % gridSize.y) + y * gridSize.y - dotSize.y / 2,
+ dotSize.x,
+ dotSize.y,
+ );
+ }
+ }
+ };
+
+ function mousedownHandler(ev: MouseEvent) {
+ dragging = true;
+ }
+ function mouseupHandler(ev: MouseEvent) {
+ dragging = false;
+ }
+ function mousemoveHandler(ev: MouseEvent) {
+ if (dragging) {
+ offset.x += ev.movementX;
+ offset.y += ev.movementY;
+ render();
+ }
+ }
+
+ canvas.addEventListener("mousedown", mousedownHandler);
+ canvas.addEventListener("mouseup", mouseupHandler);
+ canvas.addEventListener("mousemove", mousemoveHandler);
+
+ render();
+
+ return () => {
+ canvas.removeEventListener("mousedown", mousedownHandler);
+ canvas.removeEventListener("mouseup", mouseupHandler);
+ canvas.removeEventListener("mousemove", mousemoveHandler);
+ };
+ });
+
+ return (
+ <>
+
+
+
+ >
+ );
+}
+
+export default Editor;
diff --git a/editor/src/assets/hero.png b/editor/src/assets/hero.png
deleted file mode 100644
index 02251f4..0000000
Binary files a/editor/src/assets/hero.png and /dev/null differ
diff --git a/editor/src/assets/react.svg b/editor/src/assets/react.svg
deleted file mode 100644
index 6c87de9..0000000
--- a/editor/src/assets/react.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/editor/src/assets/vite.svg b/editor/src/assets/vite.svg
deleted file mode 100644
index 5101b67..0000000
--- a/editor/src/assets/vite.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/editor/src/index.css b/editor/src/index.css
index 5fb3313..962bd0e 100644
--- a/editor/src/index.css
+++ b/editor/src/index.css
@@ -1,111 +1,13 @@
:root {
- --text: #6b6375;
- --text-h: #08060d;
- --bg: #fff;
- --border: #e5e4e7;
- --code-bg: #f4f3ec;
- --accent: #aa3bff;
- --accent-bg: rgba(170, 59, 255, 0.1);
- --accent-border: rgba(170, 59, 255, 0.5);
- --social-bg: rgba(244, 243, 236, 0.5);
- --shadow:
- rgba(0, 0, 0, 0.1) 0 10px 15px -3px, rgba(0, 0, 0, 0.05) 0 4px 6px -2px;
-
- --sans: system-ui, 'Segoe UI', Roboto, sans-serif;
- --heading: system-ui, 'Segoe UI', Roboto, sans-serif;
- --mono: ui-monospace, Consolas, monospace;
-
- font: 18px/145% var(--sans);
- letter-spacing: 0.18px;
color-scheme: light dark;
- color: var(--text);
- background: var(--bg);
- font-synthesis: none;
- text-rendering: optimizeLegibility;
- -webkit-font-smoothing: antialiased;
- -moz-osx-font-smoothing: grayscale;
-
- @media (max-width: 1024px) {
- font-size: 16px;
- }
-}
-
-@media (prefers-color-scheme: dark) {
- :root {
- --text: #9ca3af;
- --text-h: #f3f4f6;
- --bg: #16171d;
- --border: #2e303a;
- --code-bg: #1f2028;
- --accent: #c084fc;
- --accent-bg: rgba(192, 132, 252, 0.15);
- --accent-border: rgba(192, 132, 252, 0.5);
- --social-bg: rgba(47, 48, 58, 0.5);
- --shadow:
- rgba(0, 0, 0, 0.4) 0 10px 15px -3px, rgba(0, 0, 0, 0.25) 0 4px 6px -2px;
- }
-
- #social .button-icon {
- filter: invert(1) brightness(2);
- }
}
#root {
- width: 1126px;
- max-width: 100%;
margin: 0 auto;
- text-align: center;
- border-inline: 1px solid var(--border);
min-height: 100svh;
- display: flex;
- flex-direction: column;
- box-sizing: border-box;
+ text-align: center;
}
body {
margin: 0;
}
-
-h1,
-h2 {
- font-family: var(--heading);
- font-weight: 500;
- color: var(--text-h);
-}
-
-h1 {
- font-size: 56px;
- letter-spacing: -1.68px;
- margin: 32px 0;
- @media (max-width: 1024px) {
- font-size: 36px;
- margin: 20px 0;
- }
-}
-h2 {
- font-size: 24px;
- line-height: 118%;
- letter-spacing: -0.24px;
- margin: 0 0 8px;
- @media (max-width: 1024px) {
- font-size: 20px;
- }
-}
-p {
- margin: 0;
-}
-
-code,
-.counter {
- font-family: var(--mono);
- display: inline-flex;
- border-radius: 4px;
- color: var(--text-h);
-}
-
-code {
- font-size: 15px;
- line-height: 135%;
- padding: 4px 8px;
- background: var(--code-bg);
-}
Connect with us
-Join the Vite community
---
-
-
- GitHub
-
-
- -
-
-
- Discord
-
-
- -
-
-
- X.com
-
-
- -
-
-
- Bluesky
-
-
-
-