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()], +});