diff --git a/react-project/src/App.css b/react-project/src/App.css
index f90339d..d0fe425 100644
--- a/react-project/src/App.css
+++ b/react-project/src/App.css
@@ -1,184 +1,187 @@
.counter {
- font-size: 16px;
- padding: 5px 10px;
- border-radius: 5px;
- color: var(--accent);
- background: var(--accent-bg);
- border: 2px solid transparent;
- transition: border-color 0.3s;
- margin-bottom: 24px;
+ font-size: 16px;
+ padding: 5px 10px;
+ border-radius: 5px;
+ color: var(--accent);
+ background: var(--accent-bg);
+ border: 2px solid transparent;
+ transition: border-color 0.3s;
+ margin-bottom: 24px;
- &:hover {
- border-color: var(--accent-border);
- }
- &:focus-visible {
- outline: 2px solid var(--accent);
- outline-offset: 2px;
- }
+ &:hover {
+ border-color: var(--accent-border);
+ }
+ &:focus-visible {
+ outline: 2px solid var(--accent);
+ outline-offset: 2px;
+ }
}
.hero {
- position: relative;
-
- .base,
- .framework,
- .vite {
- inset-inline: 0;
- margin: 0 auto;
- }
-
- .base {
- width: 170px;
position: relative;
- z-index: 0;
- }
- .framework,
- .vite {
- position: absolute;
- }
+ .base,
+ .framework,
+ .vite {
+ inset-inline: 0;
+ margin: 0 auto;
+ }
- .framework {
- z-index: 1;
- top: 34px;
- height: 28px;
- transform: perspective(2000px) rotateZ(300deg) rotateX(44deg) rotateY(39deg)
- scale(1.4);
- }
+ .base {
+ width: 170px;
+ position: relative;
+ z-index: 0;
+ }
- .vite {
- z-index: 0;
- top: 107px;
- height: 26px;
- width: auto;
- transform: perspective(2000px) rotateZ(300deg) rotateX(40deg) rotateY(39deg)
- scale(0.8);
- }
+ .framework,
+ .vite {
+ position: absolute;
+ }
+
+ .framework {
+ z-index: 1;
+ top: 34px;
+ height: 28px;
+ transform: perspective(2000px) rotateZ(300deg) rotateX(44deg)
+ rotateY(39deg) scale(1.4);
+ }
+
+ .vite {
+ z-index: 0;
+ top: 107px;
+ height: 26px;
+ width: auto;
+ transform: perspective(2000px) rotateZ(300deg) rotateX(40deg)
+ rotateY(39deg) scale(0.8);
+ }
}
#center {
- display: flex;
- flex-direction: column;
- gap: 25px;
- place-content: center;
- place-items: center;
- flex-grow: 1;
+ display: flex;
+ flex-direction: column;
+ gap: 25px;
+ place-content: center;
+ place-items: center;
+ flex-grow: 1;
- @media (max-width: 1024px) {
- padding: 32px 20px 24px;
- gap: 18px;
- }
+ @media (max-width: 1024px) {
+ padding: 32px 20px 24px;
+ gap: 18px;
+ }
}
#next-steps {
- display: flex;
- border-top: 1px solid var(--border);
- text-align: left;
+ display: flex;
+ border-top: 1px solid var(--border);
+ text-align: left;
- & > div {
- flex: 1 1 0;
- padding: 32px;
- @media (max-width: 1024px) {
- padding: 24px 20px;
+ & > div {
+ flex: 1 1 0;
+ padding: 32px;
+ @media (max-width: 1024px) {
+ padding: 24px 20px;
+ }
}
- }
- .icon {
- margin-bottom: 16px;
- width: 22px;
- height: 22px;
- }
+ .icon {
+ margin-bottom: 16px;
+ width: 22px;
+ height: 22px;
+ }
- @media (max-width: 1024px) {
- flex-direction: column;
- text-align: center;
- }
+ @media (max-width: 1024px) {
+ flex-direction: column;
+ text-align: center;
+ }
}
#docs {
- border-right: 1px solid var(--border);
+ border-right: 1px solid var(--border);
- @media (max-width: 1024px) {
- border-right: none;
- border-bottom: 1px solid var(--border);
- }
+ @media (max-width: 1024px) {
+ border-right: none;
+ border-bottom: 1px solid var(--border);
+ }
}
#next-steps ul {
- list-style: none;
- padding: 0;
- display: flex;
- gap: 8px;
- margin: 32px 0 0;
-
- .logo {
- height: 18px;
- }
-
- a {
- color: var(--text-h);
- font-size: 16px;
- border-radius: 6px;
- background: var(--social-bg);
+ list-style: none;
+ padding: 0;
display: flex;
- padding: 6px 12px;
- align-items: center;
gap: 8px;
- text-decoration: none;
- transition: box-shadow 0.3s;
+ margin: 32px 0 0;
- &:hover {
- box-shadow: var(--shadow);
- }
- .button-icon {
- height: 18px;
- width: 18px;
- }
- }
-
- @media (max-width: 1024px) {
- margin-top: 20px;
- flex-wrap: wrap;
- justify-content: center;
-
- li {
- flex: 1 1 calc(50% - 8px);
+ .logo {
+ height: 18px;
}
a {
- width: 100%;
- justify-content: center;
- box-sizing: border-box;
+ color: var(--text-h);
+ font-size: 16px;
+ border-radius: 6px;
+ background: var(--social-bg);
+ display: flex;
+ padding: 6px 12px;
+ align-items: center;
+ gap: 8px;
+ text-decoration: none;
+ transition: box-shadow 0.3s;
+
+ &:hover {
+ box-shadow: var(--shadow);
+ }
+ .button-icon {
+ height: 18px;
+ width: 18px;
+ }
+ }
+
+ @media (max-width: 1024px) {
+ margin-top: 20px;
+ flex-wrap: wrap;
+ justify-content: center;
+
+ li {
+ flex: 1 1 calc(50% - 8px);
+ }
+
+ a {
+ width: 100%;
+ justify-content: center;
+ box-sizing: border-box;
+ }
}
- }
}
-#spacer {
- height: 88px;
- border-top: 1px solid var(--border);
- @media (max-width: 1024px) {
+.spacer {
height: 48px;
- }
+ @media (max-width: 1024px) {
+ height: 28px;
+ }
+}
+
+.smallgap {
+ height: 20px;
}
.ticks {
- position: relative;
- width: 100%;
+ position: relative;
+ width: 100%;
- &::before,
- &::after {
- content: '';
- position: absolute;
- top: -4.5px;
- border: 5px solid transparent;
- }
+ &::before,
+ &::after {
+ content: "";
+ position: absolute;
+ top: -4.5px;
+ border: 5px solid transparent;
+ }
- &::before {
- left: 0;
- border-left-color: var(--border);
- }
- &::after {
- right: 0;
- border-right-color: var(--border);
- }
+ &::before {
+ left: 0;
+ border-left-color: var(--border);
+ }
+ &::after {
+ right: 0;
+ border-right-color: var(--border);
+ }
}
diff --git a/react-project/src/App.jsx b/react-project/src/App.jsx
index 31045bc..b81b466 100644
--- a/react-project/src/App.jsx
+++ b/react-project/src/App.jsx
@@ -1,17 +1,46 @@
+import { useState, useEffect } from "react";
+import { Routes, Route } from "react-router-dom";
import Header from "./components/Header";
import Footer from "./components/Footer";
-import { Routes, Route } from "react-router-dom";
import Accueil from "./pages/Accueil";
import Detail from "./pages/Detail";
import "./App.css";
function App() {
+ const [jeux, setJeux] = useState([]);
+ const [likes, setLikes] = useState(() =>
+ JSON.parse(localStorage.getItem("likes") || "{}"),
+ );
+
+ useEffect(() => {
+ fetch("/zelda.json")
+ .then((r) => r.json())
+ .then(setJeux);
+ }, []);
+
+ useEffect(() => {
+ localStorage.setItem("likes", JSON.stringify(likes));
+ }, [likes]);
+
+ function liker(id) {
+ setLikes((prev) => ({ ...prev, [id]: (prev[id] || 0) + 1 }));
+ }
return (
<>
Chargement…
; return ( <> -Aucun jeu trouvé 😕
} + + ++ {medailles[index]} {j.titre} — {likes[j.id] || 0} ❤️ +
+ ))} +Total de likes : {total}
+ + > ); diff --git a/react-project/src/pages/Detail.jsx b/react-project/src/pages/Detail.jsx index 68ddb7c..a699d3d 100644 --- a/react-project/src/pages/Detail.jsx +++ b/react-project/src/pages/Detail.jsx @@ -1,7 +1,25 @@ -import { useParams } from "react-router-dom"; +import { useParams, Link } from "react-router-dom"; -function Detail() { +function Detail({ jeux, likes }) { const { id } = useParams(); - return+ Introuvable — retour +
+ ); + + return ( ++ {jeu.console} — {jeu.annee} — {jeu.Type} +
+❤️ Likes : {likes[jeu.id] || 0}
+