+ L'idée est simple : réunir des profils différents autour d'un + jeu lisible, vivant et immédiatement intriguant. +
+Nouvelle rencontre
+Configuration
++ Les réglages ci-dessous préparent les pages chrono et cube. +
+diff --git a/README.md b/README.md index 360b2aa..58b473c 100644 --- a/README.md +++ b/README.md @@ -30,9 +30,11 @@ L'application est ensuite disponible sur `http://localhost:8080`. ## Fichiers clés -- `index.html` : page de configuration et reprise de match +- `index.html` : page d'accueil du site +- `application.html` : page de configuration et reprise de match - `chrono.html` : page dédiée à la phase chrono - `cube.html` : page dédiée à la phase cube +- `reglement.html` : page éditoriale qui présente le règlement officiel - `styles.css` : design mobile/tablette - `app.js` : logique de match et arbitrage - `docker-compose.yml` + `Dockerfile` : exécution locale diff --git a/app.js b/app.js index 873e3f7..2fd8b77 100644 --- a/app.js +++ b/app.js @@ -1,4 +1,5 @@ const PAGE = document.body.dataset.page; +const SETUP_PAGE = "application.html"; const STORAGE_KEY = "chesscubing-arena-state-v2"; const WINDOW_NAME_KEY = "chesscubing-arena-state-v2:"; @@ -178,7 +179,7 @@ function initSetupPage() { function initChronoPage() { if (!match) { - replaceTo("index.html"); + replaceTo(SETUP_PAGE); return; } @@ -314,7 +315,7 @@ function initChronoPage() { refs.arbiterResetButton?.addEventListener("click", () => { clearMatch(); - replaceTo("index.html"); + replaceTo(SETUP_PAGE); }); function handleChronoTap(color) { @@ -344,7 +345,7 @@ function initChronoPage() { syncRunningState(match); if (match.result) { - navigateTo("index.html"); + navigateTo(SETUP_PAGE); return; } @@ -500,7 +501,7 @@ function initChronoPage() { function initCubePage() { if (!match) { - replaceTo("index.html"); + replaceTo(SETUP_PAGE); return; } @@ -564,7 +565,7 @@ function initCubePage() { refs.primaryButton?.addEventListener("click", () => { if (match.result) { - navigateTo("index.html"); + navigateTo(SETUP_PAGE); return; } @@ -596,7 +597,7 @@ function initCubePage() { refs.resetButton?.addEventListener("click", () => { clearMatch(); - replaceTo("index.html"); + replaceTo(SETUP_PAGE); }); function handleCubeTap(color) { @@ -1384,7 +1385,7 @@ function resultText(storedMatch) { function routeForMatch(storedMatch) { if (!storedMatch) { - return "index.html"; + return SETUP_PAGE; } return storedMatch.phase === "cube" && !storedMatch.result ? "cube.html" : "chrono.html"; diff --git a/application.html b/application.html new file mode 100644 index 0000000..6adf738 --- /dev/null +++ b/application.html @@ -0,0 +1,259 @@ + + +
+ + + +Application officielle de match
++ Une version mobile et tablette organisée par phases : configuration, + page chrono ultra lisible, puis page cube dédiée qui s'ouvre + automatiquement à la fin de la phase chess. +
+Nouvelle rencontre
++ Les réglages ci-dessous préparent les pages chrono et cube. +
+Phase chrono
Phase cube
Application officielle de match
-Association ChessCubing
+- Une version mobile et tablette organisée par phases : configuration, - page chrono ultra lisible, puis page cube dédiée qui s'ouvre - automatiquement à la fin de la phase chess. + ChessCubing propose un jeu hybride simple à comprendre, intense à + vivre et très plaisant à regarder. On joue un block d'échecs, on + passe par une phase cube obligatoire, puis la partie repart avec un + nouveau rythme.
Nouvelle rencontre
-L'association
+- Les réglages ci-dessous préparent les pages chrono et cube. + L'association ChessCubing veut créer des moments de rencontre, de + découverte et de jeu partagé autour d'un format hybride.
+ L'idée est simple : réunir des profils différents autour d'un + jeu lisible, vivant et immédiatement intriguant. +
++ Joueurs d'échecs, cubers, curieux, familles ou clubs peuvent se + retrouver dans une expérience facile à lancer et à commenter. +
++ Le mélange de réflexion, de vitesse et de rebondissements donne + au format un côté spectaculaire qui marche très bien en + initiation comme en événement. +
+Version entrée en vigueur le 4 février 2026.
- + Application Retour à ChessCubing ArenaRevenir à la configuration du match et à l'arbitrage mobile.
diff --git a/styles.css b/styles.css index 6acb785..f94ba84 100644 --- a/styles.css +++ b/styles.css @@ -792,6 +792,15 @@ textarea:focus { 0 0 30px rgba(30, 214, 255, 0.08); } +.hero-home h1 { + margin: 0; + font-size: clamp(2.9rem, 6.4vw, 5.2rem); + line-height: 0.93; + text-shadow: + 0 0 12px rgba(30, 214, 255, 0.18), + 0 0 32px rgba(24, 217, 127, 0.08); +} + .hero-actions { display: flex; flex-wrap: wrap; @@ -870,6 +879,12 @@ textarea:focus { gap: 0.9rem; } +.home-story-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 0.9rem; +} + .stage-card { display: grid; gap: 0.45rem; @@ -898,6 +913,39 @@ textarea:focus { opacity: 0.7; } +.mini-panel { + position: relative; + display: grid; + gap: 0.45rem; + padding: 1rem; + border-radius: 22px; + border: 1px solid var(--panel-border-soft); + background: + linear-gradient(160deg, rgba(10, 31, 47, 0.96), rgba(3, 13, 21, 0.96)); + box-shadow: + inset 0 0 0 1px rgba(30, 214, 255, 0.03), + 0 0 22px rgba(30, 214, 255, 0.04); +} + +.mini-panel p { + margin-bottom: 0; + color: var(--muted); +} + +.home-mini-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 0.9rem; +} + +.home-mini-grid.two-columns { + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.cta-panel { + border-color: rgba(125, 247, 189, 0.24); +} + .twice-card { border-color: rgba(117, 242, 255, 0.24); } @@ -1035,8 +1083,11 @@ textarea:focus { .faceoff-board, .rules-compare, .rules-stage-grid, + .home-story-grid, .split-callouts, - .source-grid { + .source-grid, + .home-mini-grid, + .home-mini-grid.two-columns { grid-template-columns: 1fr; }