diff --git a/elelectron/package-lock.json b/elelectron/package-lock.json
index 2d4c20f..b07d570 100644
--- a/elelectron/package-lock.json
+++ b/elelectron/package-lock.json
@@ -15,9 +15,12 @@
"clsx": "^2.1.1",
"electron-squirrel-startup": "^1.0.1",
"lucide-react": "^1.33.0",
+ "next-themes": "^0.4.6",
"react": "^19.2.8",
"react-dom": "^19.2.8",
+ "react-router-dom": "^7.18.2",
"shadcn": "^4.18.0",
+ "sonner": "^2.0.8",
"tailwind-merge": "^3.6.0",
"tw-animate-css": "^1.4.0"
},
@@ -8741,6 +8744,16 @@
"dev": true,
"license": "MIT"
},
+ "node_modules/next-themes": {
+ "version": "0.4.6",
+ "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz",
+ "integrity": "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==",
+ "license": "MIT",
+ "peerDependencies": {
+ "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc"
+ }
+ },
"node_modules/nice-try": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
@@ -9756,6 +9769,57 @@
"node": ">=0.10.0"
}
},
+ "node_modules/react-router": {
+ "version": "7.18.2",
+ "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.18.2.tgz",
+ "integrity": "sha512-aUVMjFm3GAPTTZL7oYr5E7ETiqfQCHRLH+B+5afnICvf0r7kkK4eR6SMuwbSTJw/7t+12khT/Kahij49fqOCIg==",
+ "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.18.2",
+ "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.18.2.tgz",
+ "integrity": "sha512-AIKJ/jgGlFb3EbfCXk5Gzshiwt+l3mqbCrNjmEWMMjqQxNJ3svBa6bgzFyCC2Sw3RA0VWF1kg3uQf2OFhxb8hw==",
+ "license": "MIT",
+ "dependencies": {
+ "react-router": "7.18.2"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=18",
+ "react-dom": ">=18"
+ }
+ },
+ "node_modules/react-router/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/read-binary-file-arch": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/read-binary-file-arch/-/read-binary-file-arch-1.0.6.tgz",
@@ -10262,6 +10326,12 @@
"url": "https://opencollective.com/express"
}
},
+ "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/setprototypeof": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
@@ -10783,6 +10853,22 @@
"node": ">= 10"
}
},
+ "node_modules/sonner": {
+ "version": "2.0.8",
+ "resolved": "https://registry.npmjs.org/sonner/-/sonner-2.0.8.tgz",
+ "integrity": "sha512-UM/ByIoFra8yzV75n1o0Puu0bw5U/9UNnDacrJNspekBewIfsQ3D6ez1nvlWpt7aTsO6rujQtifBpycwIivqlg==",
+ "license": "MIT",
+ "peerDependencies": {
+ "@types/react": "^18.0.0 || ^19.0.0",
+ "react": "^18.0.0 || ^19.0.0 || ^19.0.0-rc",
+ "react-dom": "^18.0.0 || ^19.0.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
"node_modules/source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
diff --git a/elelectron/package.json b/elelectron/package.json
index 733b6eb..c6114e3 100644
--- a/elelectron/package.json
+++ b/elelectron/package.json
@@ -41,9 +41,12 @@
"clsx": "^2.1.1",
"electron-squirrel-startup": "^1.0.1",
"lucide-react": "^1.33.0",
+ "next-themes": "^0.4.6",
"react": "^19.2.8",
"react-dom": "^19.2.8",
+ "react-router-dom": "^7.18.2",
"shadcn": "^4.18.0",
+ "sonner": "^2.0.8",
"tailwind-merge": "^3.6.0",
"tw-animate-css": "^1.4.0"
},
diff --git a/elelectron/src/App.jsx b/elelectron/src/App.jsx
index e94fef6..070b00d 100644
--- a/elelectron/src/App.jsx
+++ b/elelectron/src/App.jsx
@@ -1,7 +1,27 @@
+import { Route, Routes, useNavigate } from "react-router-dom"
+
+import { Button } from "@/components/ui/button"
+import Dashboard from "@/pages/dashboard"
+import Home from "@/pages/home"
+import NotFound from "@/pages/notfound"
+
export default function App() {
+ const navigate = useNavigate()
+
return (
-
- MEOW
-
+
+
+
+
+ } />
+ } />
+ } />
+
+
)
}
diff --git a/elelectron/src/components/ui/card.jsx b/elelectron/src/components/ui/card.jsx
new file mode 100644
index 0000000..6c66656
--- /dev/null
+++ b/elelectron/src/components/ui/card.jsx
@@ -0,0 +1,114 @@
+import * as React from "react"
+
+import { cn } from "@/lib/utils"
+
+function Card({
+ className,
+ size = "default",
+ ...props
+}) {
+ return (
+ img:first-child]:pt-0 data-[size=sm]:[--card-spacing:--spacing(3)] data-[size=sm]:has-data-[slot=card-footer]:pb-0 *:[img:first-child]:rounded-t-xl *:[img:last-child]:rounded-b-xl",
+ className
+ )}
+ {...props} />
+ );
+}
+
+function CardHeader({
+ className,
+ ...props
+}) {
+ return (
+
+ );
+}
+
+function CardTitle({
+ className,
+ ...props
+}) {
+ return (
+
+ );
+}
+
+function CardDescription({
+ className,
+ ...props
+}) {
+ return (
+
+ );
+}
+
+function CardAction({
+ className,
+ ...props
+}) {
+ return (
+
+ );
+}
+
+function CardContent({
+ className,
+ ...props
+}) {
+ return (
+
+ );
+}
+
+function CardFooter({
+ className,
+ ...props
+}) {
+ return (
+
+ );
+}
+
+export {
+ Card,
+ CardHeader,
+ CardFooter,
+ CardTitle,
+ CardAction,
+ CardDescription,
+ CardContent,
+}
diff --git a/elelectron/src/components/ui/dialog.jsx b/elelectron/src/components/ui/dialog.jsx
new file mode 100644
index 0000000..bc425ea
--- /dev/null
+++ b/elelectron/src/components/ui/dialog.jsx
@@ -0,0 +1,153 @@
+import * as React from "react"
+import { Dialog as DialogPrimitive } from "@base-ui/react/dialog"
+
+import { cn } from "@/lib/utils"
+import { Button } from "@/components/ui/button"
+import { XIcon } from "lucide-react"
+
+function Dialog({
+ ...props
+}) {
+ return
;
+}
+
+function DialogTrigger({
+ ...props
+}) {
+ return
;
+}
+
+function DialogPortal({
+ ...props
+}) {
+ return
;
+}
+
+function DialogClose({
+ ...props
+}) {
+ return
;
+}
+
+function DialogOverlay({
+ className,
+ ...props
+}) {
+ return (
+
+ );
+}
+
+function DialogContent({
+ className,
+ children,
+ showCloseButton = true,
+ ...props
+}) {
+ return (
+
+
+
+ {children}
+ {showCloseButton && (
+
+ }>
+
+ Close
+
+ )}
+
+
+ );
+}
+
+function DialogHeader({
+ className,
+ ...props
+}) {
+ return (
+
+ );
+}
+
+function DialogFooter({
+ className,
+ showCloseButton = false,
+ children,
+ ...props
+}) {
+ return (
+
+ {children}
+ {showCloseButton && (
+ }>
+ Close
+
+ )}
+
+ );
+}
+
+function DialogTitle({
+ className,
+ ...props
+}) {
+ return (
+
+ );
+}
+
+function DialogDescription({
+ className,
+ ...props
+}) {
+ return (
+
+ );
+}
+
+export {
+ Dialog,
+ DialogClose,
+ DialogContent,
+ DialogDescription,
+ DialogFooter,
+ DialogHeader,
+ DialogOverlay,
+ DialogPortal,
+ DialogTitle,
+ DialogTrigger,
+}
diff --git a/elelectron/src/components/ui/input.jsx b/elelectron/src/components/ui/input.jsx
new file mode 100644
index 0000000..d6ff8e4
--- /dev/null
+++ b/elelectron/src/components/ui/input.jsx
@@ -0,0 +1,23 @@
+import * as React from "react"
+import { Input as InputPrimitive } from "@base-ui/react/input"
+
+import { cn } from "@/lib/utils"
+
+function Input({
+ className,
+ type,
+ ...props
+}) {
+ return (
+
+ );
+}
+
+export { Input }
diff --git a/elelectron/src/components/ui/label.jsx b/elelectron/src/components/ui/label.jsx
new file mode 100644
index 0000000..a014994
--- /dev/null
+++ b/elelectron/src/components/ui/label.jsx
@@ -0,0 +1,20 @@
+import * as React from "react"
+
+import { cn } from "@/lib/utils"
+
+function Label({
+ className,
+ ...props
+}) {
+ return (
+
+ );
+}
+
+export { Label }
diff --git a/elelectron/src/components/ui/sonner.jsx b/elelectron/src/components/ui/sonner.jsx
new file mode 100644
index 0000000..ec11e18
--- /dev/null
+++ b/elelectron/src/components/ui/sonner.jsx
@@ -0,0 +1,48 @@
+import { useTheme } from "next-themes"
+import { Toaster as Sonner } from "sonner";
+import { CircleCheckIcon, InfoIcon, TriangleAlertIcon, OctagonXIcon, Loader2Icon } from "lucide-react"
+
+const Toaster = ({
+ ...props
+}) => {
+ const { theme = "system" } = useTheme()
+
+ return (
+
+ ),
+ info: (
+
+ ),
+ warning: (
+
+ ),
+ error: (
+
+ ),
+ loading: (
+
+ ),
+ }}
+ style={
+ {
+ "--normal-bg": "var(--popover)",
+ "--normal-text": "var(--popover-foreground)",
+ "--normal-border": "var(--border)",
+ "--border-radius": "var(--radius)"
+ }
+ }
+ toastOptions={{
+ classNames: {
+ toast: "cn-toast",
+ },
+ }}
+ {...props} />
+ );
+}
+
+export { Toaster }
diff --git a/elelectron/src/components/ui/table.jsx b/elelectron/src/components/ui/table.jsx
new file mode 100644
index 0000000..5128be4
--- /dev/null
+++ b/elelectron/src/components/ui/table.jsx
@@ -0,0 +1,121 @@
+import * as React from "react"
+
+import { cn } from "@/lib/utils"
+
+function Table({
+ className,
+ ...props
+}) {
+ return (
+
+ );
+}
+
+function TableHeader({
+ className,
+ ...props
+}) {
+ return (
+
+ );
+}
+
+function TableBody({
+ className,
+ ...props
+}) {
+ return (
+
+ );
+}
+
+function TableFooter({
+ className,
+ ...props
+}) {
+ return (
+
tr]:last:border-b-0", className)}
+ {...props} />
+ );
+}
+
+function TableRow({
+ className,
+ ...props
+}) {
+ return (
+
+ );
+}
+
+function TableHead({
+ className,
+ ...props
+}) {
+ return (
+ |
+ );
+}
+
+function TableCell({
+ className,
+ ...props
+}) {
+ return (
+ |
+ );
+}
+
+function TableCaption({
+ className,
+ ...props
+}) {
+ return (
+
+ );
+}
+
+export {
+ Table,
+ TableHeader,
+ TableBody,
+ TableFooter,
+ TableHead,
+ TableRow,
+ TableCell,
+ TableCaption,
+}
diff --git a/elelectron/src/main.js b/elelectron/src/main.js
index 158d722..ff15182 100644
--- a/elelectron/src/main.js
+++ b/elelectron/src/main.js
@@ -25,7 +25,6 @@ const createWindow = () => {
}
// Open the DevTools.
- mainWindow.webContents.openDevTools();
};
// This method will be called when Electron has finished
diff --git a/elelectron/src/pages/dashboard.jsx b/elelectron/src/pages/dashboard.jsx
new file mode 100644
index 0000000..2b6a41d
--- /dev/null
+++ b/elelectron/src/pages/dashboard.jsx
@@ -0,0 +1,3 @@
+export default function Dashboard() {
+ return Dashboard yay
+}
diff --git a/elelectron/src/pages/home.jsx b/elelectron/src/pages/home.jsx
new file mode 100644
index 0000000..aeec15e
--- /dev/null
+++ b/elelectron/src/pages/home.jsx
@@ -0,0 +1,8 @@
+export default function Home() {
+ return(
+
+ Hi this is meow's house
+
+ )
+
+}
diff --git a/elelectron/src/pages/notfound.jsx b/elelectron/src/pages/notfound.jsx
new file mode 100644
index 0000000..802774f
--- /dev/null
+++ b/elelectron/src/pages/notfound.jsx
@@ -0,0 +1,3 @@
+export default function NotFound() {
+ return Page not found
+}
diff --git a/elelectron/src/renderer.jsx b/elelectron/src/renderer.jsx
index 34b96e9..1111589 100644
--- a/elelectron/src/renderer.jsx
+++ b/elelectron/src/renderer.jsx
@@ -1,10 +1,14 @@
import { StrictMode } from "react"
import { createRoot } from "react-dom/client"
+import { HashRouter } from "react-router-dom"
+
import App from "./App"
import "./index.css"
createRoot(document.getElementById("root")).render(
-
+
+
+
,
)