Compare commits
2 Commits
backend-ax
...
3ad5811566
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3ad5811566 | ||
|
|
a8a0f54cb7 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1 +0,0 @@
|
|||||||
Test
|
|
||||||
31
README.md
31
README.md
@@ -1,23 +1,20 @@
|
|||||||
Règles :
|
règles :
|
||||||
Un rayon laser constant
|
un rayon laser constant
|
||||||
Un ou plusieurs laser
|
un ou plusieurs spawn
|
||||||
Laser non movibles, on/off
|
laser non movibles, on/off
|
||||||
Mirroirs orientables
|
mirroirs orientables
|
||||||
Prisme (dédouble le laser ou le renvoi selon l'angle)
|
prisme
|
||||||
Vitre colorée fixe ou placable par le joueur (r,j,b)
|
vitre colorée (rjb)
|
||||||
Bouton allumable par clique souris (interaction porte, mirroir, etc)
|
bouton allumable par laser spécifique (interaction porte, mirroir, etc)
|
||||||
Bouton allumable par laser spécifique (interaction porte, mirroir, etc)
|
|
||||||
|
|
||||||
|
|
||||||
Rayon :
|
rayon :
|
||||||
Blanc -> rebondis seulement sur les mirroirs et s'arrête contre les murs
|
rouge - allumage bouton
|
||||||
Rouge -> Allumage boutons
|
bleu - base
|
||||||
Bleu -> Rebondis sur toutes les surfaces
|
jaune - traverse tout
|
||||||
Jaune -> Traverse tout (mirroir compris)
|
|
||||||
|
|
||||||
|
|
||||||
Systeme de placement d'objet par grille
|
systeme de placement d'objet par grille
|
||||||
|
|
||||||
Comptes utilisateur
|
|
||||||
|
|
||||||
Optionnel : timer, tableau de score,
|
optionnel : timer, tableau de score,
|
||||||
49
backend/Cargo.lock
generated
49
backend/Cargo.lock
generated
@@ -91,7 +91,6 @@ dependencies = [
|
|||||||
"axum-server",
|
"axum-server",
|
||||||
"serde",
|
"serde",
|
||||||
"tokio",
|
"tokio",
|
||||||
"tower-http",
|
|
||||||
"tracing-subscriber",
|
"tracing-subscriber",
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -257,12 +256,6 @@ dependencies = [
|
|||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "http-range-header"
|
|
||||||
version = "0.4.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "9171a2ea8a68358193d15dd5d70c1c10a2afc3e7e4c5bc92bc9f025cebd7359c"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "httparse"
|
name = "httparse"
|
||||||
version = "1.10.1"
|
version = "1.10.1"
|
||||||
@@ -373,16 +366,6 @@ version = "0.3.17"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
|
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "mime_guess"
|
|
||||||
version = "2.0.5"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e"
|
|
||||||
dependencies = [
|
|
||||||
"mime",
|
|
||||||
"unicase",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "mio"
|
name = "mio"
|
||||||
version = "1.2.0"
|
version = "1.2.0"
|
||||||
@@ -678,32 +661,6 @@ dependencies = [
|
|||||||
"tracing",
|
"tracing",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "tower-http"
|
|
||||||
version = "0.6.8"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8"
|
|
||||||
dependencies = [
|
|
||||||
"bitflags",
|
|
||||||
"bytes",
|
|
||||||
"futures-core",
|
|
||||||
"futures-util",
|
|
||||||
"http",
|
|
||||||
"http-body",
|
|
||||||
"http-body-util",
|
|
||||||
"http-range-header",
|
|
||||||
"httpdate",
|
|
||||||
"mime",
|
|
||||||
"mime_guess",
|
|
||||||
"percent-encoding",
|
|
||||||
"pin-project-lite",
|
|
||||||
"tokio",
|
|
||||||
"tokio-util",
|
|
||||||
"tower-layer",
|
|
||||||
"tower-service",
|
|
||||||
"tracing",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tower-layer"
|
name = "tower-layer"
|
||||||
version = "0.3.3"
|
version = "0.3.3"
|
||||||
@@ -762,12 +719,6 @@ dependencies = [
|
|||||||
"tracing-log",
|
"tracing-log",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "unicase"
|
|
||||||
version = "2.9.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unicode-ident"
|
name = "unicode-ident"
|
||||||
version = "1.0.24"
|
version = "1.0.24"
|
||||||
|
|||||||
@@ -9,4 +9,3 @@ axum-server = "0.8.0"
|
|||||||
serde = "1.0.228"
|
serde = "1.0.228"
|
||||||
tokio = { version = "1.50.0", features = ["full"] }
|
tokio = { version = "1.50.0", features = ["full"] }
|
||||||
tracing-subscriber = "0.3.23"
|
tracing-subscriber = "0.3.23"
|
||||||
tower-http = { version = "0.6", features = ["fs"] }
|
|
||||||
|
|||||||
@@ -1,34 +1,14 @@
|
|||||||
use axum::{Router, response::Html, routing::get};
|
use axum::{routing::get, Router};
|
||||||
use std::net::SocketAddr;
|
use std::net::SocketAddr;
|
||||||
use std::path::Path;
|
|
||||||
use tokio::fs::File;
|
|
||||||
use tokio::io::{self, AsyncReadExt};
|
|
||||||
use tower_http::services::ServeDir;
|
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
async fn main() {
|
async fn main() {
|
||||||
let app = Router::new()
|
let app = Router::new().route("/", get(|| async { "Hello, world!" }));
|
||||||
.route("/", get(handler))
|
|
||||||
.nest_service("/assets", ServeDir::new("../web/assets"));
|
|
||||||
|
|
||||||
let addr = SocketAddr::from(([127, 0, 0, 1], 3500));
|
let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
|
||||||
println!("listening on {}", addr);
|
println!("listening on {}", addr);
|
||||||
axum_server::bind(addr)
|
axum_server::bind(addr)
|
||||||
.serve(app.into_make_service())
|
.serve(app.into_make_service())
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn handler() -> Html<String> {
|
|
||||||
let html_content = read_html_from_file("../web/templates/view/index.html")
|
|
||||||
.await
|
|
||||||
.unwrap_or_else(|_| "<h1>Error loading HTML file</h1>".to_string());
|
|
||||||
Html(html_content)
|
|
||||||
}
|
|
||||||
|
|
||||||
async fn read_html_from_file<P: AsRef<Path>>(path: P) -> io::Result<String> {
|
|
||||||
let mut file = File::open(path).await?;
|
|
||||||
let mut contents = String::new();
|
|
||||||
file.read_to_string(&mut contents).await?;
|
|
||||||
Ok(contents)
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,244 +0,0 @@
|
|||||||
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@100..900&display=swap');
|
|
||||||
|
|
||||||
* {
|
|
||||||
--clr-light-a0: #ffffff;
|
|
||||||
--clr-light-a10: #f4f4f4;
|
|
||||||
--clr-light-a20: #e0e0e0;
|
|
||||||
--clr-light-a30: #c2c2c2;
|
|
||||||
--clr-light-a40: #a3a3a3;
|
|
||||||
--clr-light-a50: #858585;
|
|
||||||
--clr-dark: #000000;
|
|
||||||
|
|
||||||
--clr-surface-a0: #FFF6E5;
|
|
||||||
--clr-surface-a10: #f7f7f7;
|
|
||||||
--clr-surface-a20: #DADEEF;
|
|
||||||
--clr-surface-a30: #e0e0e0;
|
|
||||||
--clr-surface-a40: #d1d1d1;
|
|
||||||
--clr-surface-a50: #c2c2c2;
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
|
|
||||||
html {
|
|
||||||
font-size: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
body {
|
|
||||||
background-color: var(--clr-surface-a0);
|
|
||||||
font-family: 'Inter', sans-serif;
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.hero {
|
|
||||||
position: relative;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
justify-content: center;
|
|
||||||
align-items: center;
|
|
||||||
min-height: 100vh;
|
|
||||||
gap: 3rem;
|
|
||||||
padding: 2rem clamp(1rem, 4vw, 3rem);
|
|
||||||
box-sizing: border-box;
|
|
||||||
background: var(--clr-surface-a10);
|
|
||||||
}
|
|
||||||
|
|
||||||
.adsbanner {
|
|
||||||
position: absolute;
|
|
||||||
top: 50%;
|
|
||||||
left: clamp(0.75rem, 3vw, 2.5rem);
|
|
||||||
transform: translateY(-50%);
|
|
||||||
z-index: 5;
|
|
||||||
width: clamp(160px, 22vw, 300px);
|
|
||||||
aspect-ratio: 9 / 16;
|
|
||||||
box-shadow: 0 18px 40px rgba(0,0,0,0.18);
|
|
||||||
}
|
|
||||||
|
|
||||||
.adsbanner.is-hidden {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.leftadsbanner {
|
|
||||||
position: absolute;
|
|
||||||
top: 50%;
|
|
||||||
right: clamp(0.75rem, 3vw, 2.5rem);
|
|
||||||
transform: translateY(-50%);
|
|
||||||
z-index: 5;
|
|
||||||
width: clamp(160px, 22vw, 300px);
|
|
||||||
aspect-ratio: 9 / 16;
|
|
||||||
}
|
|
||||||
|
|
||||||
.hero-content {
|
|
||||||
max-width: 90vw;
|
|
||||||
text-align: left;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
align-items: center;
|
|
||||||
background: var(--clr-surface-a20);
|
|
||||||
border-radius: 1.5rem;
|
|
||||||
padding: 2rem clamp(2rem, 8vw, 10rem);
|
|
||||||
box-shadow: 0px 0px 27px 14px rgba(0,0,0,0.2);
|
|
||||||
}
|
|
||||||
|
|
||||||
.hero-content-text {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.hero h1 {
|
|
||||||
color: var(--clr-dark);
|
|
||||||
font-size: clamp(2.5rem, 7vw, 4rem);
|
|
||||||
margin: 0 0 1rem 0;
|
|
||||||
line-height: 1.1;
|
|
||||||
word-break: break-word;
|
|
||||||
text-shadow: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
.hero-content button {
|
|
||||||
margin-top: 2rem;
|
|
||||||
align-self: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.hero img {
|
|
||||||
max-width: 400px;
|
|
||||||
width: 35vw;
|
|
||||||
min-width: 180px;
|
|
||||||
height: auto;
|
|
||||||
border-radius: 1.5rem;
|
|
||||||
box-shadow: 0 6px 32px rgba(0,0,0,.10);
|
|
||||||
flex-shrink: 1;
|
|
||||||
background: var(--clr-surface-a0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* --- RESPONSIVE HERO-PLAY-BUTTON FIXES --- */
|
|
||||||
|
|
||||||
@media (max-width: 900px) {
|
|
||||||
.hero {
|
|
||||||
flex-direction: column;
|
|
||||||
text-align: center;
|
|
||||||
gap: 2rem;
|
|
||||||
padding: 1.5rem;
|
|
||||||
}
|
|
||||||
.hero-content {
|
|
||||||
max-width: 100vw;
|
|
||||||
text-align: center;
|
|
||||||
padding: 2rem;
|
|
||||||
}
|
|
||||||
.hero-content {
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
.adsbanner {
|
|
||||||
left: 1rem;
|
|
||||||
width: clamp(130px, 24vw, 220px);
|
|
||||||
}
|
|
||||||
.leftadsbanner {
|
|
||||||
right: 1rem;
|
|
||||||
width: clamp(130px, 24vw, 220px);
|
|
||||||
}
|
|
||||||
.hero img {
|
|
||||||
max-width: 70vw;
|
|
||||||
min-width: 0;
|
|
||||||
}
|
|
||||||
.hero-play-button {
|
|
||||||
padding: 1rem 4vw;
|
|
||||||
font-size: 1.1rem;
|
|
||||||
min-width: min(220px, 70vw);
|
|
||||||
max-width: 90vw;
|
|
||||||
}
|
|
||||||
.hero-play-button svg {
|
|
||||||
width: 2em;
|
|
||||||
height: 1em;
|
|
||||||
min-width: 1.25em;
|
|
||||||
min-height: 1em;
|
|
||||||
margin-right: 0.5em;
|
|
||||||
flex-shrink: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 600px) {
|
|
||||||
.hero {
|
|
||||||
min-height: 70vh;
|
|
||||||
padding: 0.5rem;
|
|
||||||
}
|
|
||||||
.hero-content {
|
|
||||||
padding: 1.5rem;
|
|
||||||
}
|
|
||||||
.hero h1 {
|
|
||||||
font-size: clamp(2rem, 9vw, 2.5rem);
|
|
||||||
}
|
|
||||||
.hero p {
|
|
||||||
font-size: clamp(1rem, 5vw, 1.15rem);
|
|
||||||
}
|
|
||||||
.adsbanner {
|
|
||||||
top: 1rem;
|
|
||||||
left: 0.75rem;
|
|
||||||
transform: none;
|
|
||||||
width: clamp(110px, 30vw, 170px);
|
|
||||||
border-radius: 1rem;
|
|
||||||
}
|
|
||||||
.leftadsbanner {
|
|
||||||
right: 0.75rem;
|
|
||||||
width: clamp(110px, 30vw, 170px);
|
|
||||||
border-radius: 1rem;
|
|
||||||
}
|
|
||||||
.hero img {
|
|
||||||
max-width: 100%;
|
|
||||||
border-radius: 1rem;
|
|
||||||
box-shadow: 0 2px 12px rgba(0,0,0,.07);
|
|
||||||
}
|
|
||||||
.hero-play-button {
|
|
||||||
padding: 0.85rem 3vw;
|
|
||||||
min-width: min(120px, 92vw);
|
|
||||||
max-width: 96vw;
|
|
||||||
font-size: 1rem;
|
|
||||||
}
|
|
||||||
.hero-play-button svg {
|
|
||||||
width: 1.3em;
|
|
||||||
height: 1em;
|
|
||||||
min-width: 1em;
|
|
||||||
min-height: 1em;
|
|
||||||
margin-right: 0.45em;
|
|
||||||
flex-shrink: 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.hero-play-button {
|
|
||||||
font-family: inherit;
|
|
||||||
font-size: 20px;
|
|
||||||
background: #8ea3fd;
|
|
||||||
color: white;
|
|
||||||
padding: 1rem 10rem;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center; /* Ensure SVG/button content is horizontally centered */
|
|
||||||
border: none;
|
|
||||||
border-radius: 50px;
|
|
||||||
overflow: hidden;
|
|
||||||
transition: all 0.2s;
|
|
||||||
cursor: pointer;
|
|
||||||
box-shadow: 0 2px 8px rgba(30, 80, 255, 0.10);
|
|
||||||
/* Button grows/shrinks with container at low widths */
|
|
||||||
width: 100%;
|
|
||||||
max-width: 500px;
|
|
||||||
min-width: 180px;
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
.hero-play-button:hover {
|
|
||||||
background: #7286e0;
|
|
||||||
transform: translateY(-2px);
|
|
||||||
}
|
|
||||||
|
|
||||||
.hero-play-button:active {
|
|
||||||
transform: scale(0.95);
|
|
||||||
}
|
|
||||||
|
|
||||||
.hero-play-button svg {
|
|
||||||
width: 2em;
|
|
||||||
height: 1em;
|
|
||||||
min-width: 1.2em;
|
|
||||||
min-height: 1em;
|
|
||||||
margin-right: 0.6em;
|
|
||||||
color: var(--clr-surface-a0);
|
|
||||||
flex-shrink: 0;
|
|
||||||
flex-grow: 0;
|
|
||||||
display: inline-block;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user