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 ( +