diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..4f9a9eb
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,11 @@
+# API
+*/target
+*/.idea
+
+# Web
+*/node_modules
+*/Cargo.lock
+*/.DS_Store
+*/.react-router/
+*/build/
+*/pnpm-lock.yaml
diff --git a/vote-api/Cargo.toml b/vote-api/Cargo.toml
new file mode 100644
index 0000000..806174b
--- /dev/null
+++ b/vote-api/Cargo.toml
@@ -0,0 +1,8 @@
+[package]
+name = "vote-api"
+version = "0.1.0"
+edition = "2021"
+
+[dependencies]
+actix-web = {version = "4.9.0"}
+sqlx = {version = "0.8.3"}
\ No newline at end of file
diff --git a/vote-api/src/main.rs b/vote-api/src/main.rs
new file mode 100644
index 0000000..e7a11a9
--- /dev/null
+++ b/vote-api/src/main.rs
@@ -0,0 +1,3 @@
+fn main() {
+ println!("Hello, world!");
+}
diff --git a/vote-web/app/app.css b/vote-web/app/app.css
new file mode 100644
index 0000000..99345d8
--- /dev/null
+++ b/vote-web/app/app.css
@@ -0,0 +1,15 @@
+@import "tailwindcss";
+
+@theme {
+ --font-sans: "Inter", ui-sans-serif, system-ui, sans-serif,
+ "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
+}
+
+html,
+body {
+ @apply bg-white dark:bg-gray-950;
+
+ @media (prefers-color-scheme: dark) {
+ color-scheme: dark;
+ }
+}
diff --git a/vote-web/app/pages/home.tsx b/vote-web/app/pages/home.tsx
new file mode 100644
index 0000000..3b89545
--- /dev/null
+++ b/vote-web/app/pages/home.tsx
@@ -0,0 +1,8 @@
+export default function HomePage() {
+ return (
+
+
Accueil
+
Bienvenue sur l'application web de vote !
+
+ );
+}
diff --git a/vote-web/app/root.tsx b/vote-web/app/root.tsx
new file mode 100644
index 0000000..3c4de91
--- /dev/null
+++ b/vote-web/app/root.tsx
@@ -0,0 +1,75 @@
+import {
+ isRouteErrorResponse,
+ Links,
+ Meta,
+ Outlet,
+ Scripts,
+ ScrollRestoration,
+} from "react-router";
+
+import type { Route } from "./+types/root";
+import "./app.css";
+
+/* export const links: Route.LinksFunction = () => [
+ { rel: "preconnect", href: "https://fonts.googleapis.com" },
+ {
+ rel: "preconnect",
+ href: "https://fonts.gstatic.com",
+ crossOrigin: "anonymous",
+ },
+ {
+ rel: "stylesheet",
+ href: "https://fonts.googleapis.com/css2?family=Inter:ital,opsz,wght@0,14..32,100..900;1,14..32,100..900&display=swap",
+ },
+]; */
+
+export function Layout({ children }: { children: React.ReactNode }) {
+ return (
+
+
+
+
+
+
+
+
+ {children}
+
+
+
+
+ );
+}
+
+export default function App() {
+ return ;
+}
+
+export function ErrorBoundary({ error }: Route.ErrorBoundaryProps) {
+ let message = "Tiens tiens!";
+ let details = "Une erreur est survenue.";
+ let stack: string | undefined;
+
+ if (isRouteErrorResponse(error)) {
+ message = error.status === 404 ? "404" : "Erreur";
+ details =
+ error.status === 404
+ ? "La page demandée n'a pas été trouvée."
+ : error.statusText || details;
+ } else if (import.meta.env.DEV && error && error instanceof Error) {
+ details = error.message;
+ stack = error.stack;
+ }
+
+ return (
+
+ {message}
+ {details}
+ {stack && (
+
+ {stack}
+
+ )}
+
+ );
+}
diff --git a/vote-web/app/routes.ts b/vote-web/app/routes.ts
new file mode 100644
index 0000000..102b402
--- /dev/null
+++ b/vote-web/app/routes.ts
@@ -0,0 +1,3 @@
+import { type RouteConfig, index } from "@react-router/dev/routes";
+
+export default [index("routes/home.tsx")] satisfies RouteConfig;
diff --git a/vote-web/app/routes/home.tsx b/vote-web/app/routes/home.tsx
new file mode 100644
index 0000000..5c7adda
--- /dev/null
+++ b/vote-web/app/routes/home.tsx
@@ -0,0 +1,9 @@
+import HomePage from "~/pages/home";
+
+export function Meta() {
+ return [{ title: "Vote RLLHC" }];
+}
+
+export default function Home() {
+ return ;
+}
diff --git a/vote-web/package.json b/vote-web/package.json
new file mode 100644
index 0000000..c5c7067
--- /dev/null
+++ b/vote-web/package.json
@@ -0,0 +1,36 @@
+{
+ "name": "vote-web",
+ "private": true,
+ "type": "module",
+ "scripts": {
+ "build": "react-router build",
+ "dev": "react-router dev",
+ "start": "react-router-serve ./build/server/index.js",
+ "typecheck": "react-router typegen && tsc"
+ },
+ "dependencies": {
+ "@react-router/node": "^7.3.0",
+ "@react-router/serve": "^7.3.0",
+ "isbot": "^5.1.17",
+ "react": "^19.0.0",
+ "react-dom": "^19.0.0",
+ "react-router": "^7.3.0"
+ },
+ "devDependencies": {
+ "@react-router/dev": "^7.3.0",
+ "@tailwindcss/vite": "^4.0.0",
+ "@types/node": "^20",
+ "@types/react": "^19.0.1",
+ "@types/react-dom": "^19.0.1",
+ "react-router-devtools": "^1.1.0",
+ "tailwindcss": "^4.0.0",
+ "typescript": "^5.7.2",
+ "vite": "^5.4.11",
+ "vite-tsconfig-paths": "^5.1.4"
+ },
+ "pnpm": {
+ "onlyBuiltDependencies": [
+ "esbuild"
+ ]
+ }
+}
\ No newline at end of file
diff --git a/vote-web/react-router.config.ts b/vote-web/react-router.config.ts
new file mode 100644
index 0000000..b8b143a
--- /dev/null
+++ b/vote-web/react-router.config.ts
@@ -0,0 +1,7 @@
+import type { Config } from "@react-router/dev/config";
+
+export default {
+ // Config options...
+ // Server-side render by default, to enable SPA mode set this to `false`
+ ssr: false,
+} satisfies Config;
diff --git a/vote-web/tsconfig.json b/vote-web/tsconfig.json
new file mode 100644
index 0000000..dc391a4
--- /dev/null
+++ b/vote-web/tsconfig.json
@@ -0,0 +1,27 @@
+{
+ "include": [
+ "**/*",
+ "**/.server/**/*",
+ "**/.client/**/*",
+ ".react-router/types/**/*"
+ ],
+ "compilerOptions": {
+ "lib": ["DOM", "DOM.Iterable", "ES2022"],
+ "types": ["node", "vite/client"],
+ "target": "ES2022",
+ "module": "ES2022",
+ "moduleResolution": "bundler",
+ "jsx": "react-jsx",
+ "rootDirs": [".", "./.react-router/types"],
+ "baseUrl": ".",
+ "paths": {
+ "~/*": ["./app/*"]
+ },
+ "esModuleInterop": true,
+ "verbatimModuleSyntax": true,
+ "noEmit": true,
+ "resolveJsonModule": true,
+ "skipLibCheck": true,
+ "strict": true
+ }
+}
diff --git a/vote-web/vite.config.ts b/vote-web/vite.config.ts
new file mode 100644
index 0000000..4a88d58
--- /dev/null
+++ b/vote-web/vite.config.ts
@@ -0,0 +1,8 @@
+import { reactRouter } from "@react-router/dev/vite";
+import tailwindcss from "@tailwindcss/vite";
+import { defineConfig } from "vite";
+import tsconfigPaths from "vite-tsconfig-paths";
+
+export default defineConfig({
+ plugins: [tailwindcss(), reactRouter(), tsconfigPaths()],
+});