diff --git a/src/App.scss b/src/App.scss index 4ebb6d3..a4c9552 100644 --- a/src/App.scss +++ b/src/App.scss @@ -17,4 +17,25 @@ width: 75px; } } + + & > .helpButton { + display: grid; + grid-template-columns: 20px 1fr; + align-items: center; + gap: 5px; + padding: 10px 15px; + border: 2px solid #f39440; + border-radius: 5px; + background-color: #ffdccb; + font-size: 0.9em; + font-weight: 600; + color: #f39440; + opacity: 0.7; + cursor: pointer; + transition: opacity 0.3s ease; + + &:hover { + opacity: 1; + } + } } diff --git a/src/App.tsx b/src/App.tsx index f3b2992..6eaa471 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -2,6 +2,10 @@ //! Imports // --------------------------------------------------------------------------------------------------------------------- +// ------------------------------------------------------ React -------------------------------------------------------- +import { useState } from 'react'; +// --------------------------------------------------------------------------------------------------------------------- + // ----------------------------------------------------- Context ------------------------------------------------------- import { RecoilRoot } from 'recoil'; // --------------------------------------------------------------------------------------------------------------------- @@ -10,14 +14,18 @@ import { RecoilRoot } from 'recoil'; import Grid from './components/Grid/Grid'; import Timer from './components/Stats/Timer/Timer'; import MinesCounter from './components/Stats/MinesCounter/MinesCounter'; +import Help from './components/Help/Help'; // --------------------------------------------------------------------------------------------------------------------- // ----------------------------------------------------- Styles -------------------------------------------------------- -import './App.scss'; import Logo from './assets/logo'; +import './App.scss'; +import Question from './assets/question'; // --------------------------------------------------------------------------------------------------------------------- const App = () => { + const [helpDisplayed, displayHelp] = useState(false); + return (
@@ -27,7 +35,21 @@ const App = () => {
+ + {helpDisplayed && ( + { + displayHelp(false); + }} + /> + )} ); }; diff --git a/src/assets/close.tsx b/src/assets/close.tsx new file mode 100644 index 0000000..3e87293 --- /dev/null +++ b/src/assets/close.tsx @@ -0,0 +1,20 @@ +const Close = (props: any) => { + return ( + + + + ); +}; + +export default Close; diff --git a/src/assets/question.tsx b/src/assets/question.tsx new file mode 100644 index 0000000..b558b4a --- /dev/null +++ b/src/assets/question.tsx @@ -0,0 +1,26 @@ +const Question = (props: any) => { + return ( + + + + + ); +}; + +export default Question; diff --git a/src/components/Help/Help.tsx b/src/components/Help/Help.tsx new file mode 100644 index 0000000..2ac6973 --- /dev/null +++ b/src/components/Help/Help.tsx @@ -0,0 +1,43 @@ +// --------------------------------------------------------------------------------------------------------------------- +//! Imports +// --------------------------------------------------------------------------------------------------------------------- + +// ----------------------------------------------------- Assets -------------------------------------------------------- +import Close from '../../assets/close'; +import './styles.scss'; +// --------------------------------------------------------------------------------------------------------------------- + +const Help = ({ onClose }: { onClose: () => void }) => { + return ( +
+
+
+

Comment jouer ?

+ +
+
+

+ Pour commencer, il suffit de cliquer n'importe où sur la grille. +
+ Les cases vides vont alors se dévoiler jusqu'à atteindre les cases contenant des numéros. +
+
+ Chaque numéro indique que dans les 8 cases autour de celle-ci, il y a X bombes (numéro affiché). +
+ Le but est de dévoiler toute la grille sans faire exploser une bombe en cliquant dessus. +
+
+ Pour éviter tout accident, vous pouvez poser un drapeau sur les cases où vous pensez qu'il y a une bombe en faisant clic droit. Le clic sera alors désactivé jusqu'à ce que vous retiriez le drapeau. +

+
+
+
+ ); +}; + +export default Help; diff --git a/src/components/Help/styles.scss b/src/components/Help/styles.scss new file mode 100644 index 0000000..06b109b --- /dev/null +++ b/src/components/Help/styles.scss @@ -0,0 +1,62 @@ +.helpContainer { + z-index: 10; + position: absolute; + display: flex; + justify-content: center; + align-items: center; + width: 100svw; + height: 100svh; + background-color: rgba(0, 0, 0, 0.4); + backdrop-filter: blur(7px); + + & > .helpPopup { + display: flex; + flex-direction: column; + width: 95svw; + max-width: 600px; + border-radius: 5px; + background-color: #ffeee5; + color: #f39440; + + & > .header { + display: grid; + grid-template-columns: 1fr 30px; + gap: 30px; + padding: 15px; + border-bottom: 1px solid #f39440; + box-shadow: 0 0 3px #ffdccb; + clip-path: inset(0 0 -3px 0); + + & > .title { + font-size: 1.5em; + } + + & > .closeButton { + display: flex; + justify-content: center; + align-items: center; + padding: 2px; + border: none; + background-color: transparent; + cursor: pointer; + + &:focus-visible { + outline-color: #f39440; + } + + & > svg { + width: 100%; + color: #f39440; + } + } + } + + & > .content { + display: flex; + flex-direction: column; + padding: 15px; + width: 100%; + line-height: 1.4em; + } + } +}