From 1aca4ae7dab76fc3792b671b9e0c62e96c291c0f Mon Sep 17 00:00:00 2001 From: bitsearch Date: Wed, 11 Feb 2026 13:06:42 +0100 Subject: [PATCH] Premier commit de ce submodule --- EXPLICATION.md | 136 ++++ package-lock.json | 15 - src/tetris_frontend/src/app.html | 13 +- src/tetris_frontend/src/index.scss | 68 +- src/tetris_frontend/src/routes/+page.svelte | 836 +++++++++++++++++++- src/tetris_frontend/svelte.config.js | 8 +- 6 files changed, 992 insertions(+), 84 deletions(-) create mode 100644 EXPLICATION.md diff --git a/EXPLICATION.md b/EXPLICATION.md new file mode 100644 index 0000000..93f4dbc --- /dev/null +++ b/EXPLICATION.md @@ -0,0 +1,136 @@ +# Tetris - Projet DFX (Internet Computer) + +## Architecture + +``` +tetris/ +├── dfx.json # Configuration DFX (canisters) +├── package.json # Workspace racine +├── src/ +│ ├── tetris_backend/ +│ │ └── main.mo # Backend Motoko +│ └── tetris_frontend/ +│ ├── package.json # Dépendances frontend +│ ├── svelte.config.js # Config SvelteKit (adapter-static) +│ ├── vite.config.js # Config Vite (proxy, env DFX) +│ ├── src/ +│ │ ├── app.html # Shell HTML (fonts, meta) +│ │ ├── index.scss # Styles globaux (thème néon) +│ │ ├── lib/canisters.js # Connexion au backend canister +│ │ └── routes/ +│ │ ├── +layout.js # Prerendering activé +│ │ └── +page.svelte # Composant Tetris (logique + rendu) +│ └── dist/ # Build statique (généré) +└── .dfx/ # État local DFX (généré) +``` + +## Prérequis + +| Outil | Version minimale | Installation | +|---------|-----------------|---------------------------------------| +| Node.js | >= 16.0.0 | https://nodejs.org | +| npm | >= 7.0.0 | Inclus avec Node.js | +| dfx | >= 0.30.0 | `sh -ci "$(curl -fsSL https://internetcomputer.org/install.sh)"` | + +## Installation + +```bash +cd tetris +npm install +``` + +Cela installe les dépendances du workspace racine et du frontend SvelteKit +(Svelte 5, Vite, adapter-static, dfinity/agent...). + +## Lancement en mode développement (Vite) + +```bash +cd src/tetris_frontend +npx vite --port 3000 +``` + +Ouvre http://localhost:3000/ dans n'importe quel navigateur. +Hot reload activé, pas besoin de DFX. + +## Déploiement sur la réplique locale (DFX) + +### 1. Build du frontend + +```bash +cd src/tetris_frontend +npx vite build +``` + +Génère le dossier `dist/` contenant les assets statiques. +Note : `npm run build` exécute d'abord `dfx generate` (prebuild). +Si le canister backend n'existe pas encore, utiliser `npx vite build` directement. + +### 2. Démarrer la réplique locale + +```bash +dfx start --background +``` + +### 3. Déployer les canisters + +```bash +dfx deploy +``` + +### 4. Accéder au jeu + +| URL | Navigateur | +|-----|-----------| +| `http://.localhost:8080/` | Chrome, Firefox | +| `http://127.0.0.1:8080/?canisterId=` | Fonctionne partiellement (assets cassés en legacy) | + +Le canister ID est affiché après `dfx deploy`. +Safari ne résout pas `*.localhost` : utiliser Chrome/Firefox ou le serveur Vite. + +### 5. Arrêter la réplique + +```bash +dfx stop +``` + +## Déploiement via Docker + +Depuis le dossier parent (`icp_container/`) : + +```bash +# Tout construire et lancer +make super_start + +# Ou étape par étape +make build_image # Build l'image Docker +make create_container # Crée le container (port 4943) +make start_container # Lance le container + +# Arrêter +make stop_container + +# Nettoyer tout et relancer +make re +``` + +Le container expose le port 4943. Accès via : +`http://127.0.0.1:4943/?canisterId=` + +## Commandes utiles + +| Commande | Description | +|----------|-------------| +| `dfx start --background` | Démarre la réplique IC locale | +| `dfx stop` | Arrête la réplique | +| `dfx deploy` | Build + déploie tous les canisters | +| `dfx canister status tetris_frontend` | Vérifie l'état du canister | +| `dfx ping` | Vérifie que la réplique est en ligne | +| `npx vite build` | Build le frontend (sans dfx generate) | +| `npx vite --port 3000` | Serveur de dev avec hot reload | + +## Stack technique + +- **Frontend** : SvelteKit 2 + Svelte 5, Vite 5, TypeScript, SCSS +- **Backend** : Motoko (Internet Computer) +- **Déploiement** : adapter-static -> assets canister DFX +- **Conteneurisation** : Docker (image `icp-dev-env-slim`) diff --git a/package-lock.json b/package-lock.json index 9b3a4d0..43983b9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1664,21 +1664,6 @@ "dev": true, "license": "ISC" }, - "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/postcss": { "version": "8.5.6", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", diff --git a/src/tetris_frontend/src/app.html b/src/tetris_frontend/src/app.html index d4a7d45..931ecde 100644 --- a/src/tetris_frontend/src/app.html +++ b/src/tetris_frontend/src/app.html @@ -1,20 +1,17 @@ - + - - IC Hello Starter + + + TETRIS %sveltekit.head% -
- ⚠️ If this page appears broken, try reloading. If the problem persists, try switching browsers; Chrome or - Firefox are recommended. -
%sveltekit.body%
- \ No newline at end of file + diff --git a/src/tetris_frontend/src/index.scss b/src/tetris_frontend/src/index.scss index 283585f..a66de99 100644 --- a/src/tetris_frontend/src/index.scss +++ b/src/tetris_frontend/src/index.scss @@ -1,41 +1,35 @@ +:root { + --bg: #070712; + --panel: #0d0d1f; + --border: #1a1a3e; + --accent: #00ffe7; + --accent2:#ff00aa; + --dim: #3a3a6a; + --text: #c0c0e0; +} + +* { margin: 0; padding: 0; box-sizing: border-box; } + body { - font-family: sans-serif; - font-size: 1.5rem; + background: var(--bg); + font-family: 'Share Tech Mono', monospace; + color: var(--text); + min-height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + overflow: hidden; } -img { - max-width: 50vw; - max-height: 25vw; - display: block; - margin: auto; -} - -form { - display: flex; - justify-content: center; - gap: 0.5em; - flex-flow: row wrap; - max-width: 40vw; - margin: auto; - align-items: baseline; -} - -button[type="submit"] { - padding: 5px 20px; - margin: 10px auto; - float: right; -} - -#greeting { - margin: 10px auto; - padding: 10px 60px; - border: 1px solid #222; -} - -#greeting:empty { - display: none; -} - -.browser-warning { - display: none; +body::before { + content: ''; + position: fixed; + inset: 0; + background-image: + linear-gradient(rgba(0,255,231,0.03) 1px, transparent 1px), + linear-gradient(90deg, rgba(0,255,231,0.03) 1px, transparent 1px); + background-size: 40px 40px; + pointer-events: none; + z-index: 0; } diff --git a/src/tetris_frontend/src/routes/+page.svelte b/src/tetris_frontend/src/routes/+page.svelte index ba3f765..4921d60 100644 --- a/src/tetris_frontend/src/routes/+page.svelte +++ b/src/tetris_frontend/src/routes/+page.svelte @@ -1,27 +1,823 @@ -
- DFINITY logo -
-
-
- - - -
-
{greeting}
-
+

TETRIS

+ +
+ +
+
Hold
+ + +
+
Score
+
{scoreDisplay}
+
+ +
+ + + +
+
+ + +
+ +
+
{overlayTitle}
+
{overlayScore}
+
+
+ + +
+
Next
+ + +
+
← → Déplacer
+
Descendre
+
Q Rot. gauche
+
W Rot. droite
+
Espace Drop
+
C Hold
+
+
+
+ + diff --git a/src/tetris_frontend/svelte.config.js b/src/tetris_frontend/svelte.config.js index 0d8c676..ed38d1e 100644 --- a/src/tetris_frontend/svelte.config.js +++ b/src/tetris_frontend/svelte.config.js @@ -3,16 +3,16 @@ import adapter from '@sveltejs/adapter-static'; /** @type {import('@sveltejs/kit').Config} */ const config = { kit: { - // adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list. - // If your environment is not supported or you settled on a specific environment, switch out the adapter. - // See https://kit.svelte.dev/docs/adapters for more information about adapters. adapter: adapter({ pages: 'dist', assets: 'dist', - fallback: undefined, + fallback: 'index.html', precompress: false, strict: true, }), + paths: { + relative: false, + }, }, };