diff --git a/docs/demasha0908/calculator.html b/docs/demasha0908/calculator.html new file mode 100644 index 00000000..685897ed --- /dev/null +++ b/docs/demasha0908/calculator.html @@ -0,0 +1,105 @@ + + + + + + + Basic JS + + + + + + + +
+
+
+
+ + +
+
+
+
+
+
+

Calculator

+
+ + + + + +
+
+
+
+ +
+ + + + + diff --git a/docs/demasha0908/css/calculator.css b/docs/demasha0908/css/calculator.css new file mode 100644 index 00000000..dbfb40dc --- /dev/null +++ b/docs/demasha0908/css/calculator.css @@ -0,0 +1,62 @@ +@import url("main.css"); + +.field { + display: flex; + flex-direction: column; + margin: 20px; +} + +.field__title { + margin: 20px 0; + text-align: center; + font-size: 48px; +} + +.field__calculate { + display: flex; + column-gap: 20px; +} + +.field__select, +.field__input, +.field__button, +.field__result { + font-size: 22px; +} + +.field__input, +.field__select { + border-radius: 6px; + border: .6px solid #A9A9A9; +} + +.field__select { + background-color: #333; + color: #FFF; +} + +.field__button { + border-radius: 6px; + background: #EF4934; + border-width: 0; + color: #FFF; + font-weight: 600; + cursor: pointer; +} + +@media (max-width: 860px) { + + .field__calculate { + display: flex; + line-height: 58px; + flex-direction: column; + align-items: center; + } + + .field__select, + .field__input, + .field__button, + .field__result { + font-size: 30px; + } +} diff --git a/docs/demasha0908/css/games.css b/docs/demasha0908/css/games.css new file mode 100644 index 00000000..0032858c --- /dev/null +++ b/docs/demasha0908/css/games.css @@ -0,0 +1,151 @@ +@import url("main.css"); + +.checkbox { + display: flex; + gap: 32px; + justify-content: center; + background-color: #221F1F; +} + +.checkbox__item { + color: #FFF; +} + +.checkbox__item-inp { + height: 0; + width: 0; + opacity: 0; + position: absolute; +} + +.checkbox__item-check { + position: relative; + display: inline-block; + height: 20px; + width: 20px; + background-color: #221F1F; + border: solid 1px #FFF; + border-radius: 6px; + margin-right: 12px; + vertical-align: sub; +} + +.checkbox__item-check::before { + content: " "; + display: inline-block; + width: 14px; + height: 14px; + background-image: url("../images/check-black.png"); + background-size: contain; + position: absolute; + left: 50%; + top: 50%; + transform: translate(-50%, -50%) scale(0); + transition: .2s ease-in-out; +} + +.checkbox__item-inp:checked+.checkbox__item-check::before { + transform: translate(-50%, -50%) scale(1); +} + +.games__text-title { + font-size: 48px; + padding: 40px 0; + text-align: center; +} + +.games__loading { + font-size: 48px; + color: #221F1F; +} + +.games__loading-text { + display: flex; + justify-content: center; + align-items: center; +} + +.games__cards-container { + display: grid; + grid-template-columns: repeat(4, 2fr); + gap: 25px; + padding: 0; + margin: 0 0 46px; +} + +.games__box-item { + background-color: #ECECEC; + padding: 12px 12px 22px; + border-radius: 12px; + max-width: 100%; +} + +.games__box-top { + display: flex; + justify-content: space-between; + gap: 12px; +} + +.games__top-icon { + max-height: 72px; + max-width: 96px; + border-radius: 8px; +} + +.games__top-name { + font-size: 18px; + font-weight: 700; +} + +.games__top-info { + line-height: 21px; +} + +.games__box-bottom { + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 16px; + padding-top: 22px; +} + +@media (max-width: 1180px) { + + .games__cards-container { + display: grid; + grid-template-columns: repeat(3, 3fr); + gap: 25px; + padding: 0; + } +} + +@media (max-width: 890px) { + + .games__cards-container { + display: grid; + grid-template-columns: repeat(2, 2fr); + padding: 0 25px; + margin: 0; + width: 100%; + } + + .games__box-bottom { + margin: 0; + } +} + +@media (max-width: 680px) { + + .games__text-title { + font-size: 30px; + padding: 30px 0; + } + + .games__cards-container { + display: grid; + grid-template-columns: repeat(1, 1fr); + padding: 0 25px; + margin: 0; + } +} + diff --git a/docs/demasha0908/css/loginpage.css b/docs/demasha0908/css/loginpage.css new file mode 100644 index 00000000..dc8b43b8 --- /dev/null +++ b/docs/demasha0908/css/loginpage.css @@ -0,0 +1,106 @@ +@import url("main.css"); + +.login__form { + margin: 80px auto 0; + max-width: 575px; + display: flex; + flex-direction: column; +} + +.login__form-title { + margin-bottom: 60px; + font-size: 48px; + text-align: center; +} + +.login__form-group { + margin-bottom: 40px; + max-height: 149px; +} + +.login__form-label { + font-size: 22px; + font-weight: 600; +} + +.login__form-item { + max-height: 70px; + padding: 30px 216px 30px 20px; + width: 100%; + margin-top: 22px; + border-radius: 6px; + outline: none; + border: 1px solid #A9A9A9; + background: #FFF; +} + +.login__form-item:focus { + border-bottom: solid 6px #EF4934; +} + + +.login__form-checkbox { + height: 0; + width: 0; + opacity: 0; + position: absolute; +} + +.login__checkbox-custom { + position: relative; + display: inline-block; + height: 20px; + width: 20px; + background-color: #FFF; + border: solid 1px #EF4934; + border-radius: 6px; + margin-right: 12px; + vertical-align: sub; +} + +.login__checkbox-custom::before { + content: " "; + display: inline-block; + width: 14px; + height: 14px; + background-image: url("../images/check.png"); + background-size: contain; + transform: translate(-50%, -50%) scale(0); + position: absolute; + left: 50%; + top: 50%; + transition: .2s ease-in-out; +} + +.login__form-checkbox:checked+.login__checkbox-custom::before { + transform: translate(-50%, -50%) scale(1); +} + +.login__form-btn { + border-radius: 6px; + background: #EF4934; + padding: 27px 258px; + border-color: #FFF; + border-width: 0; + color: #FFF; + font-size: 22px; + font-weight: 600; + cursor: pointer; +} + +.login__form-btn:hover { + opacity: 1; +} + +.error { + color: #EF4934; +} + +@media (max-width: 560px) { + + .login__form-btn { + padding: 27px; + width: 100%; + } +} + diff --git a/docs/demasha0908/css/main.css b/docs/demasha0908/css/main.css new file mode 100644 index 00000000..02fbda93 --- /dev/null +++ b/docs/demasha0908/css/main.css @@ -0,0 +1,185 @@ +html { + box-sizing: border-box; +} + +*, +*::before, +*::after { + box-sizing: inherit; +} + +html, +body { + height: 100%; +} + +body { + font-family: "Roboto", sans-serif; + min-width: 400px; + margin: 0; + color: #221F1F; + font-weight: 400; + line-height: 32px; +} + +img, +button { + max-width: 100%; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 0; +} + +ul { + list-style-type: none; +} + +a { + text-decoration: none; + color: inherit; +} + +.wrapper { + min-height: 100%; + display: flex; + flex-direction: column; +} + +.container { + max-width: 1175px; + margin: 0 auto; + padding: 0 15px; +} + +.header { + background-color: #EF4934; + max-height: 80px; +} + +.header__inner { + display: flex; + justify-content: space-between; + align-items: center; +} + +.logo { + max-width: 55px; + max-height: 57px; + margin: 11px 0; +} + +.menu__btn { + width: 30px; + height: 20px; + display: flex; + flex-direction: column; + justify-content: space-between; + padding: 0; + border: none; + background-color: transparent; + cursor: pointer; + display: none; +} + +.menu__btn-span { + height: 2px; + background-color: #FFF; + width: 100%; +} + +.menu__list { + display: flex; + gap: 50px; +} + +.menu__list-link { + color: #FFF; + font-size: 16px; + font-weight: 500; +} + +.menu__list-link--active { + padding-bottom: 7px; + position: relative; + + &::after { + content: " "; + position: absolute; + bottom: 0; + left: 0; + right: 0; + height: 1px; + background-image: url("../images/Line1.svg"); + } +} + +.footer { + width: 100%; + background-color: #1C2321; + margin-top: auto; +} + +.footer__content { + display: flex; + align-items: center; + flex-direction: column; + margin: 30px 0 40px; +} + +.footer__copyright { + color: #EEF1EF; + font-weight: 400; + font-size: 22px; +} + +.footer__content-icons { + display: flex; + padding: 0; + margin: 0 0 32px; + height: 42px; + gap: 33px; +} + +@media (max-width: 860px) { + + .menu__btn { + display: flex; + } + + .menu__btn, + .logo { + position: relative; + z-index: 10; + } + + .menu__list { + position: absolute; + z-index: 5; + background-color: #EF4934; + flex-direction: column; + gap: 50px; + padding-top: 200px; + height: 100vh; + top: 0; + left: 0; + right: 0; + bottom: 0; + align-items: center; + transform: translateY(-150%); + transition: transform .3s ease; + } + + .menu__list-link { + font-size: 45px; + } + + .menu__list.menu__list-active { + transform: translateY(0%); + } +} diff --git a/docs/demasha0908/css/style.css b/docs/demasha0908/css/style.css new file mode 100644 index 00000000..d9f37b7c --- /dev/null +++ b/docs/demasha0908/css/style.css @@ -0,0 +1,39 @@ +@import url("main.css"); + +.about__inner { + display: grid; + grid-template-columns: repeat(2, 1fr); + gap: 65px; + padding: 60px 0; +} + +.about__text { + color: #221F1F; +} + +.about__text-title { + font-size: 48px; + padding-bottom: 24px; +} + +.about__text-info { + font-size: 22px; +} + +.about__text-link { + color: #EF4934; + text-decoration: underline; +} + +@media (max-width: 860px) { + + .about__inner { + display: flex; + flex-direction: column; + align-items: center; + } + + .about__text { + text-align: center; + } +} diff --git a/docs/demasha0908/css/success.css b/docs/demasha0908/css/success.css new file mode 100644 index 00000000..87dbbf83 --- /dev/null +++ b/docs/demasha0908/css/success.css @@ -0,0 +1,26 @@ +.success__block { + display: flex; + justify-content: center; + align-items: center; +} + +.success__block-title { + font-size: 48px; + text-align: center; +} + +.success__block-button { + border-radius: 6px; + background: #EF4934; + padding: 27px 258px; + border-color: #FFF; + border-width: 0; + color: #FFF; + font-size: 22px; + font-weight: 600; + cursor: pointer; +} + +.success__block-button:hover { + opacity: 1; +} diff --git a/docs/demasha0908/games.html b/docs/demasha0908/games.html new file mode 100644 index 00000000..5b06d2fb --- /dev/null +++ b/docs/demasha0908/games.html @@ -0,0 +1,115 @@ + + + + + + + Games project + + + + + + +
+
+
+
+ + +
+
+
+
+
+ + +
+
+
+

Study project "Games"

+
+

Loading...

+
+
+ +
    +
    +
    +
    +
    + +
    + + + + diff --git a/docs/demasha0908/images/Line1.svg b/docs/demasha0908/images/Line1.svg new file mode 100644 index 00000000..f5a66a28 --- /dev/null +++ b/docs/demasha0908/images/Line1.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs/demasha0908/images/check-black.png b/docs/demasha0908/images/check-black.png new file mode 100644 index 00000000..38383aad Binary files /dev/null and b/docs/demasha0908/images/check-black.png differ diff --git a/docs/demasha0908/images/check.png b/docs/demasha0908/images/check.png new file mode 100644 index 00000000..cf131b33 Binary files /dev/null and b/docs/demasha0908/images/check.png differ diff --git a/docs/demasha0908/images/facebook.png b/docs/demasha0908/images/facebook.png new file mode 100644 index 00000000..db182afb Binary files /dev/null and b/docs/demasha0908/images/facebook.png differ diff --git a/docs/demasha0908/images/gameicon.png b/docs/demasha0908/images/gameicon.png new file mode 100644 index 00000000..ce1b899a Binary files /dev/null and b/docs/demasha0908/images/gameicon.png differ diff --git a/docs/demasha0908/images/generalimage.png b/docs/demasha0908/images/generalimage.png new file mode 100644 index 00000000..1766e224 Binary files /dev/null and b/docs/demasha0908/images/generalimage.png differ diff --git a/docs/demasha0908/images/instagram.png b/docs/demasha0908/images/instagram.png new file mode 100644 index 00000000..91c59481 Binary files /dev/null and b/docs/demasha0908/images/instagram.png differ diff --git a/docs/demasha0908/images/linkedin.png b/docs/demasha0908/images/linkedin.png new file mode 100644 index 00000000..c3929bac Binary files /dev/null and b/docs/demasha0908/images/linkedin.png differ diff --git a/docs/demasha0908/images/logo.png b/docs/demasha0908/images/logo.png new file mode 100644 index 00000000..3b724d74 Binary files /dev/null and b/docs/demasha0908/images/logo.png differ diff --git a/docs/demasha0908/index.html b/docs/demasha0908/index.html new file mode 100644 index 00000000..afdd6f3a --- /dev/null +++ b/docs/demasha0908/index.html @@ -0,0 +1,103 @@ + + + + + + + Games project + + + + + + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    +
    +
    + generalimg +
    +
    +

    About me

    +
    +

    + Hi! My name is Mariia and I'm a Junior Frontend Developer. I am already familiar with main Web Technologies like HTML, CSS, JavaScript and Git version control system. +

    +

    + This page was developed during the course 'Frontend for beginners' from Masters Academy in 2023. +

    +

    + This is a social project from MOCG company where I got an opportunity to work with Frontend mentors and to create my own small project for the portfolio. +

    +

    + + You can contact me via Instagram and/or check out my GitHub. +

    +
    +
    +
    +
    +
    +
    + + +
    + + diff --git a/docs/demasha0908/loginpage.html b/docs/demasha0908/loginpage.html new file mode 100644 index 00000000..3c1e2eb5 --- /dev/null +++ b/docs/demasha0908/loginpage.html @@ -0,0 +1,110 @@ + + + + + + + Games project + + + + + + + +
    +
    +
    +
    + + +
    +
    +
    +
    + +
    + +
    + + + + diff --git a/docs/demasha0908/scripts/calculatefunction.js b/docs/demasha0908/scripts/calculatefunction.js new file mode 100644 index 00000000..717ea8d9 --- /dev/null +++ b/docs/demasha0908/scripts/calculatefunction.js @@ -0,0 +1,48 @@ +/** + * + * @param firstValue string with first number + * @param secondValue string with second number + * @param operation string with operation symbol + * @returns {string|number} result of calculation or error message: + * - if firstValue or secondValue is not a number, return 'Enter a number' + * - if operation is not '+', '-', '*', '/', return 'Choose a valid operation' + * - if the result is more than 100, return 'Result is too big' + * - else return number of result: 1 '+' 2 returns 3 + * + */ +function calculate(firstValue, secondValue, operation) { + const numOne = Number(firstValue); + const numTwo = Number(secondValue); + let result; + switch (operation) { + case '+': + result = numOne + numTwo; + break; + case '-': + result = numOne - numTwo; + break; + case '*': + result = numOne * numTwo; + break; + case '/': + if (numTwo === 0) { + return 'Error. Division by zero!'; + } + result = numOne / numTwo; + break; + default: + return 'Choose a valid operation'; + } + + if (Number.isNaN(numOne) || Number.isNaN(numTwo)) { + return 'Enter a number'; + } + + if (result > 100) { + return 'Result is too big'; + } + + return result; +} + +window.calculate = calculate; diff --git a/docs/demasha0908/scripts/calculator.js b/docs/demasha0908/scripts/calculator.js new file mode 100644 index 00000000..f82b338b --- /dev/null +++ b/docs/demasha0908/scripts/calculator.js @@ -0,0 +1,13 @@ +const FIRST_VALUE_ELEMENT = document.getElementById('firstValue'); +const SECOND_VALUE_ELEMENT = document.getElementById('secondValue'); +const OPERATION_ELEMENT = document.getElementById('operation'); +const CALCULATE_BUTTON_ELEMENT = document.getElementById('calculate'); +const RESULT_ELEMENT = document.getElementById('result'); + +CALCULATE_BUTTON_ELEMENT.addEventListener('click', () => { + const firstValue = FIRST_VALUE_ELEMENT.value; + const secondValue = SECOND_VALUE_ELEMENT.value; + const operation = OPERATION_ELEMENT.value; + + RESULT_ELEMENT.innerText = window.calculate(firstValue, secondValue, operation); +}); diff --git a/docs/demasha0908/scripts/games.js b/docs/demasha0908/scripts/games.js new file mode 100644 index 00000000..9169f0f1 --- /dev/null +++ b/docs/demasha0908/scripts/games.js @@ -0,0 +1,130 @@ +let allGamesData = []; +let gamesDisplayed = []; +const loadingOverlay = document.querySelector('.games__loading'); +const checkNew = document.querySelector('[data-check-new]'); +const checkOld = document.querySelector('[data-check-old]'); + +function showLoadingOverlay() { + loadingOverlay.style.display = 'block'; +} + +function hideLoadingOverlay() { + loadingOverlay.style.display = 'none'; +} + + function createCardElement(game) { + const template = document.querySelector('[data-card-template]'); + + const cardCopy = document.importNode(template.content, true); + + const imageElement = cardCopy.querySelector('[data-card-img]'); + imageElement.src = game.thumbnail; + + cardCopy.querySelector('[data-card-title]').innerText = game.title; + + const descriptionElement = cardCopy.querySelector('[data-card-description]'); + const maxDescriptionLength = 60; + if (game.short_description.length > maxDescriptionLength) { + descriptionElement.innerText = `${game.short_description.slice(0, maxDescriptionLength)}...`; + descriptionElement.style.cursor = 'pointer'; + + let DescriptionVisible = false; + descriptionElement.addEventListener('click', () => { + if (DescriptionVisible) { + descriptionElement.innerText = `${game.short_description.slice(0, maxDescriptionLength)}...`; + } else { + descriptionElement.innerText = game.short_description; + } + + DescriptionVisible = !DescriptionVisible; + }); + } else { + descriptionElement.innerText = game.short_description; + } + + const descriptionList = cardCopy.querySelector('[data-short-description]'); + descriptionList.innerHTML = `
  • Genre: ${game.genre}
  • +
  • Platform: ${game.platform}
  • +
  • Publisher: ${game.publisher}
  • +
  • Developer: ${game.developer}
  • +
  • Release date: ${game.release_date}
  • `; + + return cardCopy; +} + +async function renderCards(container, games) { + const fragment = document.createDocumentFragment(); + const containerElement = document.querySelector('[data-cards-container]'); + + await Promise.all(games.map(async (game) => { + const card = await createCardElement(game); + fragment.appendChild(card); + })); + + containerElement.innerHTML = ''; + containerElement.appendChild(fragment); +} + +async function fetchData() { + try { + showLoadingOverlay(); + + const apiUrl = 'https://mmo-games.p.rapidapi.com/games'; + const response = await fetch(apiUrl, { + method: 'GET', + mode: 'cors', + cache: 'no-cache', + headers: { + 'X-RapidAPI-Key': '1c3169c707mshb51bff34cbc9ff6p1749b9jsn648a19134256', + 'X-RapidAPI-Host': 'mmo-games.p.rapidapi.com', + }, + }); + + if (!response.ok) { + throw new Error('Error! No data'); + } + + const data = await response.json(); + allGamesData = Array.isArray(data) ? data.slice(0, 50) : []; + gamesDisplayed = [...allGamesData]; + + renderCards('data-cards-container', gamesDisplayed); + } catch (error) { + console.error('Error:', error); + } finally { + hideLoadingOverlay(); + } +} + +function CheckboxChange() { + const isNewChecked = checkNew.checked; + const isOldChecked = checkOld.checked; + + if (isNewChecked || isOldChecked) { + gamesDisplayed = allGamesData.filter((game) => { + const releaseYear = new Date(game.release_date).getFullYear(); + + if (isNewChecked && !isOldChecked) { + return releaseYear > 2020; + } if (isOldChecked && !isNewChecked) { + return releaseYear < 2010; + } if (isNewChecked && isOldChecked) { + return releaseYear < 2010 || releaseYear > 2020; + } + return true; + }); + } else { + gamesDisplayed = [...allGamesData]; + } + + renderCards('data-cards-container', gamesDisplayed); +} + +async function init() { + checkNew.addEventListener('change', CheckboxChange); + checkOld.addEventListener('change', CheckboxChange); + renderCards('data-cards-container', gamesDisplayed); + await fetchData(); +} + +document.addEventListener('DOMContentLoaded', init); diff --git a/docs/demasha0908/scripts/menubtn.js b/docs/demasha0908/scripts/menubtn.js new file mode 100644 index 00000000..d0b648c6 --- /dev/null +++ b/docs/demasha0908/scripts/menubtn.js @@ -0,0 +1,6 @@ +const menuBtn = document.querySelector('.menu__btn'); +const menu = document.querySelector('.menu__list'); + +menuBtn.addEventListener('click', () => { + menu.classList.toggle('menu__list-active'); +}); diff --git a/docs/demasha0908/scripts/script.js b/docs/demasha0908/scripts/script.js new file mode 100644 index 00000000..4b27744b --- /dev/null +++ b/docs/demasha0908/scripts/script.js @@ -0,0 +1,92 @@ +const EMAIL_INPUT_ID = 'email'; +const PASSWORD_INPUT_ID = 'password'; +const NOT_A_ROBOT_CHECKBOX_ID = 'checkbox'; +const SUBMIT_BUTTON_ID = 'button'; +const EMAIL_ERROR_ID = 'email__error'; +const PASSWORD_ERROR_ID = 'password__error'; +const CHECKBOX_ERROR_ID = 'checkbox__error'; +const RESULT_PAGE_PATH = './success.html'; + +const submitButton = document.getElementById(SUBMIT_BUTTON_ID); + +const inputData = { + [EMAIL_INPUT_ID]: 'Email must be in the format email@localDomen.domen', + [PASSWORD_INPUT_ID]: 'Password must be between 8 and 12 characters', + [NOT_A_ROBOT_CHECKBOX_ID]: 'The checkbox must be checked', +}; + +/** + * Return input value by id. + * @param {string} elementId + * @return {string|boolean} input value + */ +function getValueById(elementId) { + const element = document.getElementById(elementId); + const type = element.getAttribute('type'); + return type === 'checkbox' ? element.checked : element.value; +} + +/** + * Add errors to errors container. + * @param {Object} inputData in format like: { [input_id]: error_text, ... } + */ + +function setErrors(errorContainerId, error) { + const errorContainerElement = document.getElementById(errorContainerId); + const errorElement = document.createElement('p'); + errorElement.classList.add('error'); + errorElement.textContent = error; + errorContainerElement.appendChild(errorElement); +} + +/** + * Delete all errors from errors container. + */ +function deleteErrors() { + const errorEmail = document.getElementById(EMAIL_ERROR_ID); + const errorPassword = document.getElementById(PASSWORD_ERROR_ID); + const errorCheckbox = document.getElementById(CHECKBOX_ERROR_ID); + errorEmail.replaceChildren(); + errorPassword.replaceChildren(); + errorCheckbox.replaceChildren(); +} + +/** + * Goes to the page with the result. + */ +function navigateToResultPage() { + window.location.href = RESULT_PAGE_PATH; +} + +function isEmail(email) { + const trimEmail = email.replace(/\s/g, ''); + const emailPattern = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/; + return emailPattern.test(trimEmail); +} + +function validateForm() { + deleteErrors(); + + const email = getValueById(EMAIL_INPUT_ID); + const password = getValueById(PASSWORD_INPUT_ID); + const checkboxTrue = getValueById(NOT_A_ROBOT_CHECKBOX_ID); + + if (!isEmail(email)) { + setErrors(EMAIL_ERROR_ID, inputData[EMAIL_INPUT_ID]); + return; + } + + if (password.length < 8 || password.length > 12) { + setErrors(PASSWORD_ERROR_ID, inputData[PASSWORD_INPUT_ID]); + return; + } + + if (!checkboxTrue) { + setErrors(CHECKBOX_ERROR_ID, inputData[NOT_A_ROBOT_CHECKBOX_ID]); + return; + } + + navigateToResultPage(); +} + +submitButton.onclick = validateForm; diff --git a/docs/demasha0908/success.html b/docs/demasha0908/success.html new file mode 100644 index 00000000..a9348863 --- /dev/null +++ b/docs/demasha0908/success.html @@ -0,0 +1,25 @@ + + + + + + + Games project + + + + + + +
    +
    +
    +
    +

    Successful!

    + +
    +
    +
    +
    + + diff --git a/docs/index.html b/docs/index.html index 53e5520b..643e1daa 100644 --- a/docs/index.html +++ b/docs/index.html @@ -12,6 +12,9 @@

    MA Projects

  • Vladyslav Yermolin - Lecture 5
  • +
  • + Mariia Demchenko - Final project +
  • Sviatoslav Taranenko - Final Project