From 6fa003ed6777b127d6cd0d458370147128d40237 Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Thu, 27 Oct 2022 15:00:55 +0800 Subject: [PATCH 01/54] add random emoji project --- projects/random-emoji/index.html | 18 +++++++++++ projects/random-emoji/index.js | 27 +++++++++++++++++ projects/random-emoji/style.css | 51 ++++++++++++++++++++++++++++++++ 3 files changed, 96 insertions(+) create mode 100644 projects/random-emoji/index.html create mode 100644 projects/random-emoji/index.js create mode 100644 projects/random-emoji/style.css diff --git a/projects/random-emoji/index.html b/projects/random-emoji/index.html new file mode 100644 index 0000000..4087387 --- /dev/null +++ b/projects/random-emoji/index.html @@ -0,0 +1,18 @@ + + + + + + + + Random Emoji + + +

Random Emoji

+
+ +

Emoji Name

+
+ + + diff --git a/projects/random-emoji/index.js b/projects/random-emoji/index.js new file mode 100644 index 0000000..161d197 --- /dev/null +++ b/projects/random-emoji/index.js @@ -0,0 +1,27 @@ +const btnEl = document.getElementById("emoji-btn"); +const emojiNameEl = document.getElementById("emoji-name"); + +const emojis = []; + +const emojiAddFunction = async () => { + let response = await fetch( + "https://emoji-api.com/emojis?access_key=c026368c7be293ca27c373a38b0d4361494d257d" + ); + data = await response.json(); + console.log(data); + + for (let i = 0; i < 1500; i++) { + emojis.push({ + name: data[i].unicodeName, + character: data[i].character, + }); + } +}; + +emojiAddFunction(); + +btnEl.addEventListener("click", () => { + const randomNum = Math.floor(Math.random() * emojis.length); + btnEl.innerText = emojis[randomNum].character; + emojiNameEl.innerText = emojis[randomNum].name; +}); diff --git a/projects/random-emoji/style.css b/projects/random-emoji/style.css new file mode 100644 index 0000000..fecb8a1 --- /dev/null +++ b/projects/random-emoji/style.css @@ -0,0 +1,51 @@ + +body { + font-family:'Courier New', Courier, monospace; + padding: 0; + margin: 0; + display: flex; + justify-content: center; + align-items: center; + height: 100vh; + background: salmon; +} + +h2 { + position: absolute; + top: 0; + padding-top: 140px; + color: white; + font-size: 2rem; + text-align: center; +} + +.section{ + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + + +.emoji-btn { + border: none; + font-size: 5rem; + background: rgba(255, 255, 255, 0.2); + border-radius: 10px; + filter: grayscale(); + padding: 15px; + transition: filter 0.2s ease-in-out; + cursor: pointer; +} + +.emoji-btn:hover { + filter: grayscale(0); + +} + +.emoji-name { +font-weight: 600; + color: darkblue; + +} + From 17eeae61b33147195d41deb72e9f2271d5b277d6 Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Mon, 31 Oct 2022 07:04:42 +0800 Subject: [PATCH 02/54] update random emoji project --- projects/random-emoji/index.html | 22 +++++------ projects/random-emoji/index.js | 26 ++++++------ projects/random-emoji/style.css | 68 ++++++++++++++------------------ 3 files changed, 53 insertions(+), 63 deletions(-) diff --git a/projects/random-emoji/index.html b/projects/random-emoji/index.html index 4087387..74b24cc 100644 --- a/projects/random-emoji/index.html +++ b/projects/random-emoji/index.html @@ -1,18 +1,18 @@ - - - - - + + + + + Random Emoji - - + +

Random Emoji

- -

Emoji Name

+ +

Emoji Name

- - + + \ No newline at end of file diff --git a/projects/random-emoji/index.js b/projects/random-emoji/index.js index 161d197..a768eb0 100644 --- a/projects/random-emoji/index.js +++ b/projects/random-emoji/index.js @@ -1,27 +1,27 @@ -const btnEl = document.getElementById("emoji-btn"); +const btnEl = document.getElementById("btn"); const emojiNameEl = document.getElementById("emoji-name"); -const emojis = []; +const emoji = []; -const emojiAddFunction = async () => { +async function getEmoji() { let response = await fetch( - "https://emoji-api.com/emojis?access_key=c026368c7be293ca27c373a38b0d4361494d257d" + "https://emoji-api.com/emojis?access_key=773b58f681fb786fafdb8392e8b8a75ddc177fd1" ); + data = await response.json(); - console.log(data); for (let i = 0; i < 1500; i++) { - emojis.push({ - name: data[i].unicodeName, - character: data[i].character, + emoji.push({ + emojiName: data[i].character, + emojiCode: data[i].unicodeName, }); } -}; +} -emojiAddFunction(); +getEmoji(); btnEl.addEventListener("click", () => { - const randomNum = Math.floor(Math.random() * emojis.length); - btnEl.innerText = emojis[randomNum].character; - emojiNameEl.innerText = emojis[randomNum].name; + const randomNum = Math.floor(Math.random() * emoji.length); + btnEl.innerText = emoji[randomNum].emojiName; + emojiNameEl.innerText = emoji[randomNum].emojiCode; }); diff --git a/projects/random-emoji/style.css b/projects/random-emoji/style.css index fecb8a1..37b110b 100644 --- a/projects/random-emoji/style.css +++ b/projects/random-emoji/style.css @@ -1,51 +1,41 @@ - -body { - font-family:'Courier New', Courier, monospace; - padding: 0; - margin: 0; - display: flex; - justify-content: center; - align-items: center; - height: 100vh; - background: salmon; +body{ + padding: 0; + margin: 0; + background: salmon; + display: flex; + flex-direction: column; + justify-content: center; + height: 100vh; + align-items: center; + font-family: 'Courier New', Courier, monospace; } -h2 { - position: absolute; - top: 0; - padding-top: 140px; - color: white; - font-size: 2rem; - text-align: center; +h2{ + font-size: 2rem; + color: aliceblue; } .section{ - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; + text-align: center; } +.btn{ + font-size: 5rem; + border: none; + background: rgb(255,255,255,.2); + border-radius: 10px; + padding: 15px; + filter: grayscale(); + transition: filter .2s ease-in-out; + cursor: pointer; -.emoji-btn { - border: none; - font-size: 5rem; - background: rgba(255, 255, 255, 0.2); - border-radius: 10px; - filter: grayscale(); - padding: 15px; - transition: filter 0.2s ease-in-out; - cursor: pointer; } -.emoji-btn:hover { - filter: grayscale(0); - -} - -.emoji-name { -font-weight: 600; - color: darkblue; - +.btn:hover{ + filter: grayscale(0); } +.emoji-name{ + font-weight: 600; + color: darkblue; +} \ No newline at end of file From 87880851c8047cb23b920e03d52cb6fe366dfe17 Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Fri, 11 Nov 2022 12:18:01 +0800 Subject: [PATCH 03/54] add 12 new projects --- projects/anime-pics-genrator/index.html | 35 + projects/anime-pics-genrator/script.js | 14 + projects/anime-pics-genrator/style.css | 88 + projects/bmi-calculator/index.html | 34 + projects/bmi-calculator/script.js | 24 + .../cat-api/45_Chatting_app/client/index.html | 91 + .../cat-api/45_Chatting_app/client/index.js | 152 ++ .../45_Chatting_app/client/message.mp3 | Bin 0 -> 24794 bytes .../45_Chatting_app/client/package-lock.json | 114 ++ .../45_Chatting_app/client/package.json | 14 + .../cat-api/45_Chatting_app/client/styles.css | 419 +++++ .../cat-api/45_Chatting_app/server/Procfile | 1 + .../45_Chatting_app/server/package-lock.json | 621 +++++++ .../45_Chatting_app/server/package.json | 18 + .../cat-api/45_Chatting_app/server/server.js | 62 + projects/cat-api/46_image_slider/app.js | 158 ++ projects/cat-api/46_image_slider/index.html | 130 ++ projects/cat-api/46_image_slider/style.css | 337 ++++ projects/cat-api/app.js | 30 + projects/cat-api/index.html | 25 + projects/cat-api/styles.css | 106 ++ projects/currency-converter/index.html | 142 ++ projects/currency-converter/readme.md | 5 + projects/currency-converter/script.js | 51 + projects/currency-converter/style.css | 83 + projects/english-dictionary/index.html | 53 + projects/english-dictionary/script.js | 73 + projects/english-dictionary/style.css | 153 ++ projects/feedback-ui/assets/review.png | Bin 0 -> 1800 bytes projects/feedback-ui/font/sans.ttf | Bin 0 -> 55852 bytes projects/feedback-ui/index.html | 48 + projects/feedback-ui/script.js | 29 + projects/feedback-ui/style.css | 120 ++ projects/loan-calculator/index.html | 50 + projects/loan-calculator/index.js | 9 + projects/loan-calculator/style.css | 32 + projects/movie-quote-generator/index.html | 40 + projects/movie-quote-generator/script.js | 17 + projects/movie-quote-generator/style.css | 129 ++ projects/notes-taking-app/icon.png | Bin 0 -> 7224 bytes projects/notes-taking-app/index.html | 19 + projects/notes-taking-app/script.js | 69 + projects/notes-taking-app/style.css | 85 + projects/project-idea-generator/index.html | 43 + .../project-idea-generator/src/css/styles.css | 102 ++ .../project-idea-generator/src/js/main.js | 15 + .../project-idea-generator/src/js/projects.js | 1514 +++++++++++++++++ projects/temp-converter/icon.png | Bin 0 -> 8895 bytes projects/temp-converter/index.html | 52 + projects/temp-converter/script.js | 39 + projects/temp-converter/style.css | 127 ++ projects/weight-converter/Assets/Assets.png | Bin 0 -> 76519 bytes projects/weight-converter/app.js | 34 + projects/weight-converter/index.html | 22 + projects/weight-converter/style.css | 16 + 55 files changed, 5644 insertions(+) create mode 100644 projects/anime-pics-genrator/index.html create mode 100644 projects/anime-pics-genrator/script.js create mode 100644 projects/anime-pics-genrator/style.css create mode 100644 projects/bmi-calculator/index.html create mode 100644 projects/bmi-calculator/script.js create mode 100644 projects/cat-api/45_Chatting_app/client/index.html create mode 100644 projects/cat-api/45_Chatting_app/client/index.js create mode 100644 projects/cat-api/45_Chatting_app/client/message.mp3 create mode 100644 projects/cat-api/45_Chatting_app/client/package-lock.json create mode 100644 projects/cat-api/45_Chatting_app/client/package.json create mode 100644 projects/cat-api/45_Chatting_app/client/styles.css create mode 100644 projects/cat-api/45_Chatting_app/server/Procfile create mode 100644 projects/cat-api/45_Chatting_app/server/package-lock.json create mode 100644 projects/cat-api/45_Chatting_app/server/package.json create mode 100644 projects/cat-api/45_Chatting_app/server/server.js create mode 100644 projects/cat-api/46_image_slider/app.js create mode 100644 projects/cat-api/46_image_slider/index.html create mode 100644 projects/cat-api/46_image_slider/style.css create mode 100644 projects/cat-api/app.js create mode 100644 projects/cat-api/index.html create mode 100644 projects/cat-api/styles.css create mode 100644 projects/currency-converter/index.html create mode 100644 projects/currency-converter/readme.md create mode 100644 projects/currency-converter/script.js create mode 100644 projects/currency-converter/style.css create mode 100644 projects/english-dictionary/index.html create mode 100644 projects/english-dictionary/script.js create mode 100644 projects/english-dictionary/style.css create mode 100644 projects/feedback-ui/assets/review.png create mode 100644 projects/feedback-ui/font/sans.ttf create mode 100644 projects/feedback-ui/index.html create mode 100644 projects/feedback-ui/script.js create mode 100644 projects/feedback-ui/style.css create mode 100644 projects/loan-calculator/index.html create mode 100644 projects/loan-calculator/index.js create mode 100644 projects/loan-calculator/style.css create mode 100644 projects/movie-quote-generator/index.html create mode 100644 projects/movie-quote-generator/script.js create mode 100644 projects/movie-quote-generator/style.css create mode 100644 projects/notes-taking-app/icon.png create mode 100644 projects/notes-taking-app/index.html create mode 100644 projects/notes-taking-app/script.js create mode 100644 projects/notes-taking-app/style.css create mode 100644 projects/project-idea-generator/index.html create mode 100644 projects/project-idea-generator/src/css/styles.css create mode 100644 projects/project-idea-generator/src/js/main.js create mode 100644 projects/project-idea-generator/src/js/projects.js create mode 100644 projects/temp-converter/icon.png create mode 100644 projects/temp-converter/index.html create mode 100644 projects/temp-converter/script.js create mode 100644 projects/temp-converter/style.css create mode 100644 projects/weight-converter/Assets/Assets.png create mode 100644 projects/weight-converter/app.js create mode 100644 projects/weight-converter/index.html create mode 100644 projects/weight-converter/style.css diff --git a/projects/anime-pics-genrator/index.html b/projects/anime-pics-genrator/index.html new file mode 100644 index 0000000..aeedb6f --- /dev/null +++ b/projects/anime-pics-genrator/index.html @@ -0,0 +1,35 @@ + + + + + + + Random Anime profile + + + + + +
+ +
+

Anime Pics Genrator

+

genrates Random Animes profile pics

+ + +
+
+ hero-img +
+
+

+
+
+
+
+ + diff --git a/projects/anime-pics-genrator/script.js b/projects/anime-pics-genrator/script.js new file mode 100644 index 0000000..9772363 --- /dev/null +++ b/projects/anime-pics-genrator/script.js @@ -0,0 +1,14 @@ +const getBTN = document.getElementById("btn"); +const animeBox = document.querySelector(".anime-box"); +const anime = document.querySelector(".anime"); +const animeName = document.querySelector(".hero-name"); + +const api_url = `https://api.catboys.com/img`; + +getBTN.addEventListener("click", async function () { + const response = await fetch(api_url); + const data = await response.json(); + anime.src = data.url; + animeBox.style.display = "block"; + animeName.textContent = data.artist; +}); diff --git a/projects/anime-pics-genrator/style.css b/projects/anime-pics-genrator/style.css new file mode 100644 index 0000000..d4471af --- /dev/null +++ b/projects/anime-pics-genrator/style.css @@ -0,0 +1,88 @@ +@import url("https://fonts.googleapis.com/css2?family=Poppins:wght@300&display=swap"); + +* { + box-sizing: border-box; +} + +body { + font-family: "Poppins", sans-serif; + font-weight: normal; + background: linear-gradient(to right, #00afff, #00ff6c); + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + height: 100vh; + overflow: hidden; + margin: 0; +} + +.main-container { + background-color: rgba(255, 255, 255, 0.863); + border-radius: 10px; + box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1), 0 6px 6px rgba(0, 0, 0, 0.1); + text-align: center; + padding: 10px; + max-width: 100%; + width: 800px; +} + +.anime-container h3 { + font-size: 20px; + font-weight: 600; + text-transform: capitalize; + padding-bottom: 10px; + letter-spacing: 0.9px; +} + +.anime-container h2 { + line-height: 30px; + word-spacing: 1px; + margin-bottom: 30px; + position: relative; +} + +.get-anime { + margin-bottom: 30px; + background-color: rgba(0, 0, 0, 0.774); + color: #fff; + padding: 10px 30px; + border: none; + border-radius: 6px; + outline: none; + font-size: 16px; + font-weight: 200; + cursor: pointer; + letter-spacing: 1px; +} + +.anime-box { + display: none; +} + +.anime-box img { + height: 300px; + width: 300px; + border-radius: 50%; + border: 10px solid #005da3; + align-items: center; +} + +.hero-name { + margin-bottom: 30px; + background-color: rgba(0, 0, 0, 0.774); + color: #fff; + padding: 10px 30px; + border: none; + border-radius: 6px; + outline: none; + font-size: 17px; + font-weight: bold; +} + +@media screen and (max-width: 500px) { + .main-container { + width: 450px; + flex-wrap: wrap; + } +} diff --git a/projects/bmi-calculator/index.html b/projects/bmi-calculator/index.html new file mode 100644 index 0000000..77c1be9 --- /dev/null +++ b/projects/bmi-calculator/index.html @@ -0,0 +1,34 @@ + + + + + + + + BMI + + + +
+

Body Mass Index Calculator using Metric Units

+ Your Height: +
+ Your Weight: +
+
+ Your BMI: +

+
+ + + + + \ No newline at end of file diff --git a/projects/bmi-calculator/script.js b/projects/bmi-calculator/script.js new file mode 100644 index 0000000..1fdba94 --- /dev/null +++ b/projects/bmi-calculator/script.js @@ -0,0 +1,24 @@ +function fun() + { + var cm = document.getElementById("cm").value ; + cm = cm/100; + var w = document.getElementById("weight").value; + var bmi = w/(cm*cm); + document.getElementById("bmi").value = bmi; + if(bmi<18.5) + { + document.querySelector("h4").innerHTML = 'Under weight'; + } + else if(bmi>=18.5 && bmi <=24.9) + { + document.querySelector("h4").innerHTML = 'Normal weight'; + } + else if(bmi>=25 && bmi <= 29.9) + { + document.querySelector("h4").innerHTML = 'Overweight'; + } + else if(bmi>=30) + { + document.querySelector("h4").innerHTML = 'Obesity'; + } + } \ No newline at end of file diff --git a/projects/cat-api/45_Chatting_app/client/index.html b/projects/cat-api/45_Chatting_app/client/index.html new file mode 100644 index 0000000..1b66ec2 --- /dev/null +++ b/projects/cat-api/45_Chatting_app/client/index.html @@ -0,0 +1,91 @@ + + + + + + + + + + Warta - Chatting App + + +
+

Warta App

+
+
+
+ + + + + +
+ +
+ +
+ + +
+
+
+
+

Warta App

+

+
+ +
+
+
+ + +
+
+ + +
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/projects/cat-api/45_Chatting_app/client/index.js b/projects/cat-api/45_Chatting_app/client/index.js new file mode 100644 index 0000000..1fc3df3 --- /dev/null +++ b/projects/cat-api/45_Chatting_app/client/index.js @@ -0,0 +1,152 @@ +// import {io} from "./node_modules/socket.io-client"; +//const io = require('socket.io-client'); + +var name1, room; +//var nameArray = []; + + + +function viewSelection(){ + + name1 = document.querySelector("#name").value; + room = document.querySelector("#roomC").value; + + if(name1 === '') { + alert("Name cannot be empty"); + return false; + } + else if(room === ''){ + alert("Please provide a room name"); + return false; + } + document.body.style.background = "#efe7dd url('https://cloud.githubusercontent.com/assets/398893/15136779/4e765036-1639-11e6-9201-67e728e86f39.jpg') repeat"; + + + const form = document.getElementById("form-container"); + const messageInput = document.querySelector(".input-msg"); + const messageContainer = document.querySelector(".conversation-container"); + + const appendCopyright = (message) => { + + const messageElement = document.createElement('div'); + messageElement.innerText = message; + messageElement.classList.add('otherCopyright'); + messageContainer.append(messageElement); + try{ + new Audio('message.mp3').play(); + } + catch(err){ + new Audio('message.mp3').play(); + + } + + } + appendCopyright("Copyright © Akhil Choubey"); + + if(document.querySelector("#create-room").checked){ + alert(`Share following details with your chatmates\r\n ----------------------------------------------- \r\n Website link : https://akhil-warta.netlify.app \r\n Room name : ${room}`); + // appendCopyright("You created this room"); + // nameArray.push(name1); + } + + //console.log(nameArray); + document.querySelector(".chat").style.display = 'block'; + document.querySelector(".new-room").style.display = 'none'; + + document.querySelector(".status-bar h4").innerText = `Room Name : ${room}`; + // const socket = io("http://localhost:8000"); + const socket = io("https://guarded-falls-33664.herokuapp.com/"); + + +const append = (message) => { + + //if(document.querySelector("#join-room").checked){ + // appendCopyright(`${cruator} created this room`); + //} + const messageElement = document.createElement('div'); + messageElement.innerText = message; + messageElement.classList.add('other'); + messageContainer.append(messageElement); + try{ + new Audio('message.mp3').play(); + } + catch(err){ + new Audio('message.mp3').play(); + + } + +} + +const appendSend = (message) => { + const messageElement = document.createElement('div'); + messageElement.innerText = message; + messageElement.classList.add('message'); + messageElement.classList.add('sent'); + messageContainer.append(messageElement); +} + +const appendRecieved = (message, name) => { + + + const messageElement = document.createElement('div'); + messageElement.classList.add('message'); + messageElement.classList.add('received'); + + const Name = document.createElement('h1'); + Name.classList.add('person'); + Name.innerText= name; + + const randomColor =((1<<24)*Math.random() | 0).toString(16) + if(randomColor[0] === "0") randomColor = "800080"; + const color = "#"+randomColor; + + messageElement.innerHTML+=`

${name}

+ ${message}`; + + //messageElement.innerText = message; + messageContainer.append(messageElement); + + try{ + new Audio('message.mp3').play(); + } + catch(err){ + new Audio('message.mp3').play(); + + } +} + +form.addEventListener('submit', (e)=>{ + e.preventDefault(); + const message = messageInput.value; + appendSend(`${message}`); + socket.emit('send', message, room); + messageInput.value = ''; +}); + +socket.emit("new-user-joined" , name1, room); +socket.emit("room" , room); +//var curator = 0; +//if(document.querySelector("#join-room").checked) { + // curator = 1; +//} +socket.on('user-joined', (name1) =>{ + append(`${name1} joined` ); //, data.creator); + + // appendCopyright(`${data.creator} created this room`); + +}); + + +socket.on('leave', (data) =>{ + append(`${data.name1} left`); +}); + +socket.on('receive', (data) =>{ + appendRecieved(`${data.message}`,`${data.name1}`); +}); + + + + + +} \ No newline at end of file diff --git a/projects/cat-api/45_Chatting_app/client/message.mp3 b/projects/cat-api/45_Chatting_app/client/message.mp3 new file mode 100644 index 0000000000000000000000000000000000000000..049cfa88aea4bbee112318efaae22d0167ddf052 GIT binary patch literal 24794 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 literal 0 HcmV?d00001 diff --git a/projects/cat-api/45_Chatting_app/client/package-lock.json b/projects/cat-api/45_Chatting_app/client/package-lock.json new file mode 100644 index 0000000..a219e4d --- /dev/null +++ b/projects/cat-api/45_Chatting_app/client/package-lock.json @@ -0,0 +1,114 @@ +{ + "name": "frontend", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/component-emitter": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz", + "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg==" + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" + }, + "base64-arraybuffer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", + "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=" + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "engine.io-client": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-5.1.2.tgz", + "integrity": "sha512-blRrgXIE0A/eurWXRzvfCLG7uUFJqfTGFsyJzXSK71srMMGJ2VraBLg8Mdw28uUxSpVicepBN9X7asqpD1mZcQ==", + "requires": { + "base64-arraybuffer": "0.1.4", + "component-emitter": "~1.3.0", + "debug": "~4.3.1", + "engine.io-parser": "~4.0.1", + "has-cors": "1.1.0", + "parseqs": "0.0.6", + "parseuri": "0.0.6", + "ws": "~7.4.2", + "yeast": "0.1.2" + } + }, + "engine.io-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.2.tgz", + "integrity": "sha512-sHfEQv6nmtJrq6TKuIz5kyEKH/qSdK56H/A+7DnAuUPWosnIZAS2NHNcPLmyjtY3cGS/MqJdZbUjW97JU72iYg==", + "requires": { + "base64-arraybuffer": "0.1.4" + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "parseqs": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", + "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==" + }, + "parseuri": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", + "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==" + }, + "socket.io-client": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.1.3.tgz", + "integrity": "sha512-hISFn6PDpgDifVUiNklLHVPTMv1LAk8poHArfIUdXa+gKgbr0MZbAlquDFqCqsF30yBqa+jg42wgos2FK50BHA==", + "requires": { + "@types/component-emitter": "^1.2.10", + "backo2": "~1.0.2", + "component-emitter": "~1.3.0", + "debug": "~4.3.1", + "engine.io-client": "~5.1.2", + "parseuri": "0.0.6", + "socket.io-parser": "~4.0.4" + } + }, + "socket.io-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", + "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", + "requires": { + "@types/component-emitter": "^1.2.10", + "component-emitter": "~1.3.0", + "debug": "~4.3.1" + } + }, + "ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==" + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" + } + } +} diff --git a/projects/cat-api/45_Chatting_app/client/package.json b/projects/cat-api/45_Chatting_app/client/package.json new file mode 100644 index 0000000..db3506f --- /dev/null +++ b/projects/cat-api/45_Chatting_app/client/package.json @@ -0,0 +1,14 @@ +{ + "name": "frontend", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "socket.io-client": "^4.1.3" + } +} diff --git a/projects/cat-api/45_Chatting_app/client/styles.css b/projects/cat-api/45_Chatting_app/client/styles.css new file mode 100644 index 0000000..e0b84a4 --- /dev/null +++ b/projects/cat-api/45_Chatting_app/client/styles.css @@ -0,0 +1,419 @@ +*, *:before, *:after { + box-sizing: inherit; +} + +html { + box-sizing: border-box; + height: 100%; + margin: 0; + padding: 0; +} + +body { + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + font-family: "Roboto", sans-serif; + margin: 0; + padding: 0; + height: 100%; + background: #50a3a2; /* url("https://cloud.githubusercontent.com/assets/398893/15136779/4e765036-1639-11e6-9201-67e728e86f39.jpg") repeat; */ + +} + +/* room form styles */ +.new-room h1{ + margin: 0% auto; + padding-top: 80px; + text-align: center; + top: 27%; + font-size: 40px; + font-weight: 200; + color:white; +} + +#createForm { + padding-top: 20px; + top: 30%; + position: relative; + display: block; +} +#name, #roomC{ + border: 1px solid white;/* rgba(0,78,69,0.4); rgba(252, 252, 252, 0.4); */ + background-color: rgba(252, 252, 252, 0.2); + width: 250px; + border-radius: 3px; + font-family: "Source Sans Pro", sans-serif; + padding: 10px 15px; + margin: 0 auto 10px auto; + display: block; + text-align: center; + font-size: 18px; + color: white; + font-weight: 300; +} +.radio { + display: flex; + margin-bottom: 5px; +} + + +.button-submit { + display: block; + appearance: none; + outline: 0; + background-color: white; + border: 0; + padding: 10px 15px; + margin: 0 auto 10px auto; + color: #50a3a2; + border-radius: 3px; + width: 250px; + font-size: 18px; +} + +.choose { + margin-left: 40%; + display: flex; +} + +#roomC{ + visibility: hidden; +} + +.lableCreate{ +color: white; padding-top: 4px; +} +.lableJoin{ +color: white; padding-top: 4px; +} + + +/* status bar */ +.status-room { +width:70%; +text-align: right; +} + +.status-bar { + height: 57px; + background: #004e45; + color: #fff; + font-size: 24px; + padding: 0 8px; + text-align: center; +} +h2{ + margin: 0; +} +h4{ + margin: 0; + font-size: 12px; +} +.copyright{ + color:rgb(158, 157, 152); + font-size: 11px; + margin: 0; +} + +.status-bar:after { + content: ""; + display: table; + clear: both; +} + +/* .status-bar div { + float: right; + position: fixed; + top: 50%; + transform: translateY(-50%); + margin: 0 0 0 8px; + font-weight: 600; +} */ +.choose{ +width: 2%; +height: 20px; +} + +/* chat container styling */ +.chat { + height: calc(79%); + display: none; +} + +.chat-container { + height: 100%; +} + +.conversation { + height: calc(100%); + position: relative; + z-index: 0; +} + +.conversation ::-webkit-scrollbar { + transition: all .5s; + width: 5px; + height: 1px; + z-index: 10; +} + +.conversation ::-webkit-scrollbar-track { + background: transparent; +} + +.conversation ::-webkit-scrollbar-thumb { + background: #b3ada7; +} + +.conversation .conversation-container { + height: calc(100%); + box-shadow: inset 0 10px 10px -10px #000000; + overflow-x: hidden; + padding: 0 16px; + /* margin-bottom: 5px; */ +} + +.conversation .conversation-container:after { + content: ""; + display: table; + clear: both; +} + +/* Messages */ + +.message { + color: #000; + clear: both; + line-height: 18px; + font-size: 15px; + padding: 8px; + position: relative; + margin: 8px 0; + max-width: 85%; + word-wrap: break-word; + z-index: -1; +} + +.person{ + background-color: none; + color:blue; + margin: 0; + font-size: 15px; + position: relative; +} + +.message:after { + position: absolute; + content: ""; + width: 0; + height: 0; + border-style: solid; +} +.message:first-child { + margin: 16px 0 8px; +} + +.message.received { + background: #fff; + border-radius: 0px 5px 5px 5px; + float: left; +} +.message.received:after { + border-width: 0px 10px 10px 0; + border-color: transparent #fff transparent transparent; + top: 0; + left: -10px; +} +.message.sent { + background: #e1ffc7; + border-radius: 5px 0px 5px 5px; + float: right; +} + +.message.sent:after { + border-width: 0px 0 10px 10px; + border-color: transparent transparent transparent #e1ffc7; + top: 0; + right: -10px; +} + +.other{ +color: rgb(141, 136, 136); +clear: both; +line-height: 18px; +font-size: 15px; +padding: 8px; +position: relative; +margin: 8px 3px; +word-wrap: break-word; +z-index: -1; +background-color: rgb(187, 224, 224); +max-width: 85%; +/* line-height: 21px; */ +text-align: center; +width:8rem; +display: block; +margin: auto; +border-radius: 4rem; +margin-top: 4px; +margin-bottom: 4px; +} +/* form styling */ +.conversation-compose { + display: flex; + flex-direction: row; + align-items: flex-end; + overflow: hidden; + height: 50px; + width: 100%; + z-index: 2; + position: sticky; + top: 88%; + +} + +#form-container{ + display: block; + margin: auto; + text-align: center; + width: 100%; +} + +input { + background: #fff; + height: 100%; + width: 91%; + border-radius: 4rem; + +} + +.input-msg { + border: 0; + flex: 1 1 auto; + font-size: 16px; + margin: 0; + outline: none; + min-width: 50px; + padding: 17px; + height: 48px; + border: #000; + border-width: 2px; +} +.send { + background: transparent; + border: 0; + cursor: pointer; + flex: 0 0 auto; + margin-left: 8px; + margin-right: 8px; + + padding: 0; + position: relative; + outline: none; +} + +.send .circle { + background: #008a7c; + border-radius: 50%; + color: #fff; + position: relative; + width: 48px; + height: 48px; + + display: flex; + align-items: center; + justify-content: center; +} + +.send .circle .iconify { + font-size: 44px; + height: 20px; + + margin-left: 5px; +} + +.otherCopyright{ + color: rgb(141, 136, 136); + clear: both; + line-height: 18px; + font-size: 15px; + padding: 8px; + position: relative; + margin: 8px 3px; + word-wrap: break-word; + z-index: -1; + background-color: rgb(187, 224, 224); + max-width: 85%; + /* line-height: 21px; */ + text-align: center; + width:13rem; + display: block; + margin: auto; + border-radius: 9px; + margin-top: 4px; + margin-bottom: 4px; + } + + + + +@media (max-width: 768px) { + h4{ + font-size: 11px; + } + + .status-bar { + height: 47px; + font-size: 18px; + padding: 0 8px; + text-align: center; + } + .copyright{ + font-size: 8px; + } + input { + width: 77%; + } + .chat { + height: calc(81%); + } + .other{ + line-height:8px; + font-size: 10px; + width:6rem; + } + .otherCopyright{ + line-height:8px; + font-size: 10px; + width:9rem; + } + .radio { + margin-right: 11%; + font-size: 19px; + } + .choose { + width: 25px; + height: 46px; + + } + #create-room { + margin-left: 17%; + } + #join-room { + margin-left: 3%; + } + .lableCreate { + color: white; + padding-top: 14px; + margin-left: 0; + width: 168px; + } + .lableJoin { + color: white; + padding-top: 14px; + width: 143px; + } +} + + + diff --git a/projects/cat-api/45_Chatting_app/server/Procfile b/projects/cat-api/45_Chatting_app/server/Procfile new file mode 100644 index 0000000..9c4dee9 --- /dev/null +++ b/projects/cat-api/45_Chatting_app/server/Procfile @@ -0,0 +1 @@ +node server.js \ No newline at end of file diff --git a/projects/cat-api/45_Chatting_app/server/package-lock.json b/projects/cat-api/45_Chatting_app/server/package-lock.json new file mode 100644 index 0000000..e31cdb6 --- /dev/null +++ b/projects/cat-api/45_Chatting_app/server/package-lock.json @@ -0,0 +1,621 @@ +{ + "name": "backend", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/component-emitter": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz", + "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg==" + }, + "@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" + }, + "@types/cors": { + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==" + }, + "@types/node": { + "version": "16.4.13", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.4.13.tgz", + "integrity": "sha512-bLL69sKtd25w7p1nvg9pigE4gtKVpGTPojBFLMkGHXuUgap2sLqQt2qUnqmVCDfzGUL0DRNZP+1prIZJbMeAXg==" + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" + }, + "base64-arraybuffer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", + "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=" + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + } + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "engine.io": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-5.1.1.tgz", + "integrity": "sha512-aMWot7H5aC8L4/T8qMYbLdvKlZOdJTH54FxfdFunTGvhMx1BHkJOntWArsVfgAZVwAO9LC2sryPWRcEeUzCe5w==", + "requires": { + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~4.0.0", + "ws": "~7.4.2" + }, + "dependencies": { + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" + }, + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "engine.io-client": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-5.1.2.tgz", + "integrity": "sha512-blRrgXIE0A/eurWXRzvfCLG7uUFJqfTGFsyJzXSK71srMMGJ2VraBLg8Mdw28uUxSpVicepBN9X7asqpD1mZcQ==", + "requires": { + "base64-arraybuffer": "0.1.4", + "component-emitter": "~1.3.0", + "debug": "~4.3.1", + "engine.io-parser": "~4.0.1", + "has-cors": "1.1.0", + "parseqs": "0.0.6", + "parseuri": "0.0.6", + "ws": "~7.4.2", + "yeast": "0.1.2" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "engine.io-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.2.tgz", + "integrity": "sha512-sHfEQv6nmtJrq6TKuIz5kyEKH/qSdK56H/A+7DnAuUPWosnIZAS2NHNcPLmyjtY3cGS/MqJdZbUjW97JU72iYg==", + "requires": { + "base64-arraybuffer": "0.1.4" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" + }, + "http": { + "version": "0.0.1-security", + "resolved": "https://registry.npmjs.org/http/-/http-0.0.1-security.tgz", + "integrity": "sha512-RnDvP10Ty9FxqOtPZuxtebw1j4L/WiqNMDtuc1YMH1XQm5TgDRaR1G9u8upL6KD1bXHSp9eSXo/ED+8Q7FAr+g==" + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", + "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==" + }, + "mime-types": { + "version": "2.1.32", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", + "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", + "requires": { + "mime-db": "1.49.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "parseqs": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", + "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==" + }, + "parseuri": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", + "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==" + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "socket.io": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.1.3.tgz", + "integrity": "sha512-tLkaY13RcO4nIRh1K2hT5iuotfTaIQw7cVIe0FUykN3SuQi0cm7ALxuyT5/CtDswOMWUzMGTibxYNx/gU7In+Q==", + "requires": { + "@types/cookie": "^0.4.0", + "@types/cors": "^2.8.10", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.1", + "engine.io": "~5.1.1", + "socket.io-adapter": "~2.3.1", + "socket.io-parser": "~4.0.4" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "socket.io-adapter": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.1.tgz", + "integrity": "sha512-8cVkRxI8Nt2wadkY6u60Y4rpW3ejA1rxgcK2JuyIhmF+RMNpTy1QRtkHIDUOf3B4HlQwakMsWbKftMv/71VMmw==" + }, + "socket.io-client": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.1.3.tgz", + "integrity": "sha512-hISFn6PDpgDifVUiNklLHVPTMv1LAk8poHArfIUdXa+gKgbr0MZbAlquDFqCqsF30yBqa+jg42wgos2FK50BHA==", + "requires": { + "@types/component-emitter": "^1.2.10", + "backo2": "~1.0.2", + "component-emitter": "~1.3.0", + "debug": "~4.3.1", + "engine.io-client": "~5.1.2", + "parseuri": "0.0.6", + "socket.io-parser": "~4.0.4" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "socket.io-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", + "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", + "requires": { + "@types/component-emitter": "^1.2.10", + "component-emitter": "~1.3.0", + "debug": "~4.3.1" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "ws": { + "version": "7.4.6", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==" + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" + } + } +} diff --git a/projects/cat-api/45_Chatting_app/server/package.json b/projects/cat-api/45_Chatting_app/server/package.json new file mode 100644 index 0000000..b7aad51 --- /dev/null +++ b/projects/cat-api/45_Chatting_app/server/package.json @@ -0,0 +1,18 @@ +{ + "name": "backend", + "version": "1.0.0", + "description": "", + "main": "server.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC", + "dependencies": { + "cors": "^2.8.5", + "express": "^4.17.1", + "http": "0.0.1-security", + "socket.io": "^4.1.3", + "socket.io-client": "^4.1.3" + } +} diff --git a/projects/cat-api/45_Chatting_app/server/server.js b/projects/cat-api/45_Chatting_app/server/server.js new file mode 100644 index 0000000..365fa16 --- /dev/null +++ b/projects/cat-api/45_Chatting_app/server/server.js @@ -0,0 +1,62 @@ + +var express = require('express'); +var http = require('http'); + +var app = express(); +var server = http.createServer(app).listen(process.env.PORT || 8000);; +var cors = require('cors'); +app.use(cors({origin: 'https://akhil-warta.netlify.app'})); +const io = require('socket.io')(server,{ + cors: { + origin: 'https://akhil-warta.netlify.app' + // origin: 'http://127.0.0.1:5500' + // header: ('Access-Control-Allow-Origin', "*") + } +}); + +// const users = {}; + +// io.on("connection", socket =>{ +// // console.log("New user" ,socket.id); +// socket.on('new-user-joined', name1 =>{ +// console.log('New user', name1); +// users[socket.id] = name1; +// socket.broadcast.emit('user-joined' , name1); +// }); + +// socket.on('send', message =>{ +// socket.broadcast.emit('receive',{message: message, name1: users[socket.id]}); +// }); +// socket.on('disconnect', message =>{ +// socket.broadcast.emit('leave',{message: message, name1: users[socket.id]}); +// delete users[socket.id]; +// }); + +// }); + +const users = {}; +//const userName = []; +io.on("connection", socket =>{ + // console.log("New user" ,socket.id); + + socket.on('new-user-joined', (name1, room) =>{ + + //userName.push(name1); + socket.join(room); + console.log('New user', name1); + users[socket.id] = name1; + socket.to(room).emit('user-joined' , name1); // {name1, creator:userName[0]}); + }); + + socket.on('send', (message, room) =>{ + socket.to(room).emit('receive',{message: message, name1: users[socket.id]}); + }); + socket.on("room" , (room) =>{ + socket.on('disconnect', () =>{ + socket.to(room).emit('leave',{ name1: users[socket.id]}); + delete users[socket.id]; + }); +}) + + +}); diff --git a/projects/cat-api/46_image_slider/app.js b/projects/cat-api/46_image_slider/app.js new file mode 100644 index 0000000..209dc7d --- /dev/null +++ b/projects/cat-api/46_image_slider/app.js @@ -0,0 +1,158 @@ +// Slider(all Slides in a container) +const slider = document.querySelector('.slider'); +// All trails +const trail = document.querySelector('.trail').querySelectorAll('div'); + +// Transform value +let value = 0; +// trail index number +let trailValue = 0; +// interval (Duration) +let interval = 4000; + +// Function to slide forward +const slide = (condition) => { + // CLear interval + clearInterval(start); + // update value and trailValue + condition === 'increase' ? initiateINC() : initiateDEC(); + // move slide + move(value, trailValue); + // Restart Animation + animate(); + // start interal for slides back + start = setInterval(() => slide('increase'), interval); +}; + +// function for increase(forward, next) configuration +const initiateINC = () => { + // Remove active from all trails + trail.forEach((cur) => cur.classList.remove('active')); + // increase transform value + value === 80 ? (value = 0) : (value += 20); + // update trailValue based on value + trailUpdate(); +}; + +// function for decrease(backward, previous) configuration +const initiateDEC = () => { + // Remove active from all trails + trail.forEach((cur) => cur.classList.remove('active')); + // decrease transform value + value === 0 ? (value = 80) : (value -= 20); + // update trailValue based on value + trailUpdate(); +}; + +// function to transform slide +const move = (S, T) => { + // transform slider + slider.style.transform = `translateX(-${S}%)`; + //add active class to the current trail + trail[T].classList.add('active'); +}; + +const tl = gsap.timeline({ defaults: { duration: 0.6, ease: 'power2.inOut' } }); +tl.from('.bg', { x: '-100%', opacity: 0 }) + .from('p', { opacity: 0 }, '-=0.3') + .from('h1', { opacity: 0, y: '30px' }, '-=0.3') + .from('button', { opacity: 0, y: '-40px' }, '-=0.8'); + +// function to restart animation +const animate = () => tl.restart(); + +// function to update trailValue based on slide value +const trailUpdate = () => { + if (value === 0) { + trailValue = 0; + } else if (value === 20) { + trailValue = 1; + } else if (value === 40) { + trailValue = 2; + } else if (value === 60) { + trailValue = 3; + } else { + trailValue = 4; + } +}; + +// Start interval for slides +let start = setInterval(() => slide('increase'), interval); + +// Next and Previous button function (SVG icon with different classes) +document.querySelectorAll('svg').forEach((cur) => { + // Assign function based on the class Name("next" and "prev") + cur.addEventListener('click', () => + cur.classList.contains('next') ? slide('increase') : slide('decrease') + ); +}); + +// function to slide when trail is clicked +const clickCheck = (e) => { + // CLear interval + clearInterval(start); + // remove active class from all trails + trail.forEach((cur) => cur.classList.remove('active')); + // Get selected trail + const check = e.target; + // add active class + check.classList.add('active'); + + // Update slide value based on the selected trail + if (check.classList.contains('box1')) { + value = 0; + } else if (check.classList.contains('box2')) { + value = 20; + } else if (check.classList.contains('box3')) { + value = 40; + } else if (check.classList.contains('box4')) { + value = 60; + } else { + value = 80; + } + // update trail based on value + trailUpdate(); + // transfrom slide + move(value, trailValue); + // start animation + animate(); + // start interval + start = setInterval(() => slide('increase'), interval); +}; + +// Add function to all trails +trail.forEach((cur) => cur.addEventListener('click', (ev) => clickCheck(ev))); + +// Mobile touch Slide Section +const touchSlide = (() => { + let start, move, change, sliderWidth; + + // Do this on initial touch on screen + slider.addEventListener('touchstart', (e) => { + // get the touche position of X on the screen + start = e.touches[0].clientX; + // (each slide with) the width of the slider container divided by the number of slides + sliderWidth = slider.clientWidth / trail.length; + }); + + // Do this on touchDrag on screen + slider.addEventListener('touchmove', (e) => { + // prevent default function + e.preventDefault(); + // get the touche position of X on the screen when dragging stops + move = e.touches[0].clientX; + // Subtract initial position from end position and save to change variabla + change = start - move; + }); + + const mobile = (e) => { + // if change is greater than a quarter of sliderWidth, next else Do NOTHING + change > sliderWidth / 4 ? slide('increase') : null; + // if change * -1 is greater than a quarter of sliderWidth, prev else Do NOTHING + change * -1 > sliderWidth / 4 ? slide('decrease') : null; + // reset all variable to 0 + [start, move, change, sliderWidth] = [0, 0, 0, 0]; + }; + // call mobile on touch end + slider.addEventListener('touchend', mobile); +})(); diff --git a/projects/cat-api/46_image_slider/index.html b/projects/cat-api/46_image_slider/index.html new file mode 100644 index 0000000..44196e5 --- /dev/null +++ b/projects/cat-api/46_image_slider/index.html @@ -0,0 +1,130 @@ + + + + + + + + Image Slider + + +
+
+
+
+
+

I'm the first Box

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer + lacinia dui lectus. Donec scelerisque ipsum diam, ac mattis orci + pellentesque eget. +

+ +
+ +
+
+ +
+
+
+

I'm the second Box

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer + lacinia dui lectus. Donec scelerisque ipsum diam, ac mattis orci + pellentesque eget. +

+ +
+ +
+
+ +
+
+
+

I'm the third Box

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer + lacinia dui lectus. Donec scelerisque ipsum diam, ac mattis orci + pellentesque eget. +

+ +
+ +
+
+ +
+
+
+

I'm the fourth Box

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer + lacinia dui lectus. Donec scelerisque ipsum diam, ac mattis orci + pellentesque eget. +

+ +
+ +
+
+ +
+
+
+

I'm the fifth Box

+

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer + lacinia dui lectus. Donec scelerisque ipsum diam, ac mattis orci + pellentesque eget. +

+ +
+ +
+
+
+ + + + + + + +
+
1
+
2
+
3
+
4
+
5
+
+
+ + + + + + + diff --git a/projects/cat-api/46_image_slider/style.css b/projects/cat-api/46_image_slider/style.css new file mode 100644 index 0000000..dbdcaa4 --- /dev/null +++ b/projects/cat-api/46_image_slider/style.css @@ -0,0 +1,337 @@ +*, +*:before, +*:after { + margin: 0; + padding: 0; + box-sizing: inherit; +} + +html { + box-sizing: border-box; + font-family: "Roboto", sans-serif; + font-size: 62.5%; +} +@media only screen and (max-width: 800px) { + html { + font-size: 57%; + } +} + +body { + background-color: #000; + color: #fff; + padding: 8rem; +} +@media only screen and (max-width: 1000px) { + body { + padding: 0; + } +} + +.container { + position: relative; + overflow: hidden; + border-radius: 5rem; +} +@media only screen and (max-width: 1000px) { + .container { + border-radius: 0; + } +} + +.slider { + display: flex; + width: 500%; + height: 55rem; + transition: all 0.25s ease-in; + transform: translateX(0); +} +@media only screen and (max-width: 1000px) { + .slider { + height: 100vh; + } +} +.slider .box { + height: 100%; + width: 100%; + display: grid; + grid-template-columns: repeat(2, 1fr); + align-items: center; + overflow: hidden; + position: relative; +} +@media only screen and (max-width: 650px) { + .slider .box { + grid-template-columns: 1fr; + grid-template-rows: repeat(2, 1fr); + } +} +.slider .box .bg { + padding: 2rem; + background-color: rgba(0, 0, 0, 0.2); + width: 55%; + transform: skewX(7deg); + position: absolute; + height: 100%; + left: -10%; + padding-left: 20rem; + transform-origin: 0 100%; +} +@media only screen and (max-width: 800px) { + .slider .box .bg { + width: 65%; + } +} +@media only screen and (max-width: 650px) { + .slider .box .bg { + width: 100%; + left: 0; + bottom: 0; + height: 54%; + transform: skewX(0deg); + } +} +.slider .box .bg::before { + content: ""; + width: 100%; + height: 100%; + position: absolute; + left: 0; + top: 0; + background-color: inherit; + pointer-events: none; + transform: skewX(10deg); +} +@media only screen and (max-width: 650px) { + .slider .box .bg::before { + width: 120%; + bottom: 0; + transform: skewX(0deg); + } +} +.slider .box .details { + padding: 5rem; + padding-left: 10rem; + z-index: 100; + grid-column: 1/span 1; + grid-row: 1/-1; +} +@media only screen and (max-width: 650px) { + .slider .box .details { + grid-row: 2/span 1; + grid-column: 1/-1; + text-align: center; + padding: 2rem; + transform: translateY(-9rem); + } +} +.slider .box .details h1 { + font-size: 3.5rem; + font-weight: 500; + margin-bottom: 0.5rem; +} +.slider .box .details p { + display: inline-block; + font-size: 1.3rem; + color: #b5b4b4; + margin-bottom: 2rem; + margin-right: 5rem; +} +@media only screen and (max-width: 800px) { + .slider .box .details p { + margin-right: 0; + } +} +.slider .box .details button { + padding: 1rem 3rem; + color: #fff; + border-radius: 2rem; + outline: none; + border: none; + cursor: pointer; + transition: all 0.3s ease; +} +.slider .box .details button:hover { + opacity: 0.8; +} +.slider .box .details button:focus { + outline: none; + border: none; +} +.slider .box1 { + background-color: #500033; +} +.slider .box1 .illustration .inner { + background-color: #ff0077; +} +.slider .box1 .illustration .inner::after, .slider .box1 .illustration .inner::before { + background-color: rgba(255, 0, 119, 0.4); +} +.slider .box1 button { + background-color: #ff0077; +} +.slider .box2 { + background-color: #000050; +} +.slider .box2 .illustration .inner { + background-color: #0033ff; +} +.slider .box2 .illustration .inner::after, .slider .box2 .illustration .inner::before { + background-color: rgba(0, 51, 255, 0.4); +} +.slider .box2 button { + background-color: #0033ff; +} +.slider .box3 { + background-color: #00501d; +} +.slider .box3 .illustration .inner { + background-color: #00ff44; +} +.slider .box3 .illustration .inner::after, .slider .box3 .illustration .inner::before { + background-color: rgba(0, 255, 68, 0.4); +} +.slider .box3 button { + background-color: #00ff44; +} +.slider .box4 { + background-color: #554d00; +} +.slider .box4 .illustration .inner { + background-color: #ff4e00; +} +.slider .box4 .illustration .inner::after, .slider .box4 .illustration .inner::before { + background-color: rgba(255, 78, 0, 0.4); +} +.slider .box4 button { + background-color: #ff4e00; +} +.slider .box5 { + background-color: #300050; +} +.slider .box5 .illustration .inner { + background-color: #8000ff; +} +.slider .box5 .illustration .inner::after, .slider .box5 .illustration .inner::before { + background-color: rgba(128, 0, 255, 0.4); +} +.slider .box5 button { + background-color: #8000ff; +} +.slider .illustration { + grid-column: 2/-1; + grid-row: 1/-1; + justify-self: center; +} +@media only screen and (max-width: 650px) { + .slider .illustration { + grid-row: 1/span 1; + grid-column: 1/-1; + display: flex; + justify-content: center; + align-items: center; + } +} +.slider .illustration div { + height: 25rem; + width: 18rem; + border-radius: 3rem; + background-color: #ff0077; + position: relative; + transform: skewX(-10deg); +} +@media only screen and (max-width: 800px) { + .slider .illustration div { + height: 20rem; + width: 15rem; + } +} +.slider .illustration div::after, .slider .illustration div::before { + content: ""; + position: absolute; + height: 100%; + width: 100%; + border-radius: 3rem; + top: 0; + left: 0; +} +.slider .illustration div::after { + transform: translate(4rem, -1rem); +} +.slider .illustration div::before { + transform: translate(2rem, -2rem); +} + +.prev, +.next, +.trail { + z-index: 10000; + position: absolute; +} + +.prev, +.next { + width: 4rem; + cursor: pointer; + opacity: 0.2; + transition: all 0.3s ease; +} +@media only screen and (max-width: 650px) { + .prev, +.next { + display: none; + } +} +.prev:hover, +.next:hover { + opacity: 1; +} + +.prev { + top: 50%; + left: 2%; + transform: translateY(-50%); +} + +.next { + top: 50%; + right: 2%; + transform: translateY(-50%); +} + +.trail { + bottom: 5%; + left: 50%; + transform: translateX(-50%); + width: 60%; + display: grid; + grid-template-columns: repeat(5, 1fr); + gap: 1rem; + text-align: center; + font-size: 1.5rem; +} +@media only screen and (max-width: 650px) { + .trail { + width: 90%; + bottom: 13%; + } +} +.trail div { + padding: 2rem; + border-top: 3px solid #fff; + cursor: pointer; + opacity: 0.3; + transition: all 0.3s ease; +} +.trail div:hover { + opacity: 0.6; +} +@media only screen and (max-width: 650px) { + .trail div { + padding: 1rem; + } +} + +.active { + opacity: 1 !important; +} \ No newline at end of file diff --git a/projects/cat-api/app.js b/projects/cat-api/app.js new file mode 100644 index 0000000..5484703 --- /dev/null +++ b/projects/cat-api/app.js @@ -0,0 +1,30 @@ +const cat_result = document.getElementById("gallery"); +const errorData = document.getElementById("errorBox"); + + +btn_generate.addEventListener("click", function () { + const nums = document.getElementById("inp-box").value; + + errorData.innerHTML = ""; + + if(!nums.match(/^[0-9]+$/)){ + return errorData.innerHTML = "Enter a valid number"; + } + if(parseInt(nums) > 10){ + return errorData.innerHTML = "Number should be less than or equal to 10"; + } + + allimages = ""; + fetch( + `https://api.thecatapi.com/v1/images/search?limit=${nums}&page=10&order=Desc` + ) + .then((res) => res.json()) + .then((res) => { + for (let i = 0; i < nums; i++) { + allimages += ` + cat + `; + } + cat_result.innerHTML = allimages; + }); +}); diff --git a/projects/cat-api/index.html b/projects/cat-api/index.html new file mode 100644 index 0000000..89e0a6a --- /dev/null +++ b/projects/cat-api/index.html @@ -0,0 +1,25 @@ + + + + + + + + Getting Started with APIs + + + +
+

Getting Started with APIs

+ +

Enter the number of kitties

+ + + + + + +
+ + + diff --git a/projects/cat-api/styles.css b/projects/cat-api/styles.css new file mode 100644 index 0000000..1c09be2 --- /dev/null +++ b/projects/cat-api/styles.css @@ -0,0 +1,106 @@ +@import url('https://fonts.googleapis.com/css?family=Open+Sans&display=swap'); + +:root { + --error-color: #dc3545; + --success-color: #28a745; + --warning-color: #ffc107; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: 'Open Sans', sans-serif; + font-size: 16px; + background-color: #19172e; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + min-height: 100vh; +} + +.container { + background-color: rgba(255, 255, 255, 0.05); + padding: 1em; + border-radius: 5px; + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3); + width: 90%; + text-align: center; + display: flex; + + flex-direction: column; + align-items: center; + flex-wrap: wrap; + +} + +h1 { + color: #fff; + margin-bottom: 20px; +} +#errorBox{ + color: crimson; +} + +.gallery img { + width: 18vw; + height: 18vh; + object-fit: cover; + } + +.inp-box{ + text-transform: uppercase; + width: 250px; + height: 45px; + outline: none; + border: none; + margin: 20px 0; + padding: 10px; + font-size: 18px; + border-radius: 3px; + background-color: white; + transition: all 300ms ease; +} +.btn { + text-transform: uppercase; + width: 250px; + height: 45px; + outline: none; + border: none; + margin: 20px 0; + font-size: 18px; + border-radius: 3px; + background-color: white; + cursor: pointer; + transition: all 300ms ease; +} + +.btn:hover { + color: #fff; + background-color: #5c1ed5; + cursor: pointer; +} + +.btn:focus { + outline: none; +} + +footer { + color: pink; + font-size: 1rem; + padding: 22px; + line-height: 3vh; + margin-top: 30px; +} + +footer a { + color: inherit; +} + +footer a:visited { + color: inherit; +} diff --git a/projects/currency-converter/index.html b/projects/currency-converter/index.html new file mode 100644 index 0000000..f88d169 --- /dev/null +++ b/projects/currency-converter/index.html @@ -0,0 +1,142 @@ + + + + + + + Currency_Converter_in_Javascript + + + +

Currency Converter

+
+
+ +

Welcome! Please Enter the values

+ +
+
+ + +
+ +
+
+
+ +
+ + +
+
+
+
+ + + \ No newline at end of file diff --git a/projects/currency-converter/readme.md b/projects/currency-converter/readme.md new file mode 100644 index 0000000..fc19e5a --- /dev/null +++ b/projects/currency-converter/readme.md @@ -0,0 +1,5 @@ +I have added a Currency Converter. +It allows user to type digits(amount) and we have real time conversions as they type. +It fetches recent rates from the exchangerate API. +The UI is pretty simple and neat. + diff --git a/projects/currency-converter/script.js b/projects/currency-converter/script.js new file mode 100644 index 0000000..1407f01 --- /dev/null +++ b/projects/currency-converter/script.js @@ -0,0 +1,51 @@ +const exchange_rate = document.getElementById('exchange-rate'); +const curr_first = document.getElementById('curr-first'); +const curr_second = document.getElementById('curr-second'); +const worth_first = document.getElementById('worth-first'); +const worth_second = document.getElementById('worth-second'); + +function convert() { + const currency_first = curr_first.value; + const currency_second = curr_second.value; +//using API for conversion of currency units + fetch(`https://v6.exchangerate-api.com/v6/16947c81da979880bacde4f5/latest/${currency_first}`) + .then((res) => res.json()) + .then((data) => { + + const rate = data.conversion_rates[currency_second]; + exchange_rate.innerText = `1 ${currency_first} = ${rate} ${currency_second}`; + + worth_second.value = (worth_first.value * rate).toFixed(5); + }); +} +//some javascript event listeners +curr_first.addEventListener('change', convert); +worth_first.addEventListener('input', convert); +curr_second.addEventListener('change', convert); +worth_second.addEventListener('input', convert); +convert(); + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/projects/currency-converter/style.css b/projects/currency-converter/style.css new file mode 100644 index 0000000..0ca98bd --- /dev/null +++ b/projects/currency-converter/style.css @@ -0,0 +1,83 @@ +* { + box-sizing: border-box; + } +body { + + font-family: Arial, Helvetica, sans-serif; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + height: 100vh; + margin: 0; + padding: 20px; + background-image: linear-gradient(rgb(42, 105, 177),rgb(67, 207, 67) ); + } + + h1 { + color:blanchedalmond; + text-align: center; + } + h3{ + text-align: center; + } + + p { + text-align: center; + } + + .main-box{ + border:12px solid rgb(56, 27, 187); + background-color: #ff3399; + border-radius: 25px; + padding:40px; + + } + .second-box{ + border:2px solid ; + background-color:#ff99cc; + border-radius:20px; + padding:10px; + } + + .currency { + padding: 40px 0; + display: flex; + align-items: center; + justify-content: space-between; + } + + .currency select { + padding: 10px 20px 10px 10px; + + appearance: none; + border: 1px solid #dedede; + font-size: 16px; + background: transparent; + background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22%20000002%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E'); + background-position: right 10px top 50%, 0, 0; + background-size: 12px auto, 100%; + background-repeat: no-repeat; + } + + .currency input { + border:0px; + background: transparent; + font-size: 30px; + text-align: right; + } + + + + .exchange-rate { + color:aliceblue; + font-size: 14px; + padding: 0 10px; + } + + select:focus, + input:focus, + button:focus { + outline: 0; + } + \ No newline at end of file diff --git a/projects/english-dictionary/index.html b/projects/english-dictionary/index.html new file mode 100644 index 0000000..fdbafc8 --- /dev/null +++ b/projects/english-dictionary/index.html @@ -0,0 +1,53 @@ + + + + + Dictionary App + + + + + + +
+
English Dictionary
+ +

Type a word and press enter

+
    +
  • +
    +

    _

    + ___ +
    + +
  • +
    +
  • +
    +

    Meaning

    + ___ +
    +
  • +
    +
  • +
    +

    Example

    + ___ +
    +
  • +
    +
    +

    Synonyms

    +
    +
    +
    +
+
+ + + + \ No newline at end of file diff --git a/projects/english-dictionary/script.js b/projects/english-dictionary/script.js new file mode 100644 index 0000000..c092e20 --- /dev/null +++ b/projects/english-dictionary/script.js @@ -0,0 +1,73 @@ +const wrapper = document.querySelector(".wrapper"), +searchInput = wrapper.querySelector("input"), +synonyms = wrapper.querySelector(".synonyms .list"), +infoText = wrapper.querySelector(".info-text"), +volumeIcon = wrapper.querySelector(".word i"), +removeIcon = wrapper.querySelector(".search span"); +let audio; + + +function data(result, word) { + if (result.title){ + infoText.innerHTML = `Can't find the meaning of "${word}".Please try to search for another + word`; + } + else { + console.log(result); + wrapper.classList.add("active"); + let definitions = result[0].meanings[0].definitions[0], + phonetics = `${result[0].meanings[0].partOfSpeech} / ${result[0].phonetics[0].text} / `; + + document.querySelector('.word p').innerText = result[0].word; + document.querySelector('.word span').innerText = phonetics; + document.querySelector('.meaning span').innerText = definitions.definition; + document.querySelector('.example span').innerText = definitions.example; + audio = new Audio('https:' + result[0].phonetics[0].audio); + + if(definitions.synonyms[0] == undefined){ + synonyms.parentElement.style.display = 'none'; + } + else { + synonyms.parentElement.style.display = 'block'; + synonyms.innerHTML = ""; + for( let i =0; i < 5; i++) { + let tag = `${definitions.synonyms[i]},`; + synonyms.insertAdjacentHTML('beforeend', tag); + } + } + } +} + +function search (word){ + searchInput.value = word; + fetchApi(word); +} + +function fetchApi(word) { + wrapper.classList.remove('active'); + infoText.style.color = '#000'; + infoText.innerHTML = `Searching the meaning of"${word}"`; + let url = `https://api.dictionaryapi.dev/api/v2/entries/en/${word}`; + // fetching api response and returning it with parsing into js obj + //method calling data with passing api response + fetch(url).then(res => res.json()).then(result => data(result, word)); +} + + +searchInput.addEventListener('keyup', e => { + if(e.key === 'Enter' && e.target.value){ + fetchApi(e.target.value); + } +}); + +volumeIcon.addEventListener('click', () => { + audio.play(); +}); + +removeIcon.addEventListener('click', () => { + searchInput.value = ""; + searchInput.focus(); + wrapper.classList.remove("active"); + infoText.style.color = '#9a9a9a'; + infoText.innerHTML= "Type a word and press enter"; +}); \ No newline at end of file diff --git a/projects/english-dictionary/style.css b/projects/english-dictionary/style.css new file mode 100644 index 0000000..39c1ecc --- /dev/null +++ b/projects/english-dictionary/style.css @@ -0,0 +1,153 @@ +*{ + margin: 0; + padding: 0; + box-sizing: border-box; + font-family: sans-serif; +} +body { + display: flex; + align-items: center; + justify-content: center; + background-color: rgb(160, 158, 156); + min-height: 100vh; +} + +.wrapper { + width: 420px; + background-color: #fff; + border-radius: 7px; + padding: 28px 28px; +} +.wrapper header { + font-size: 28px; + font-weight: 500; + text-align: center; +} +.wrapper .search { + margin: 35px 0 18px; + position: relative; +} +.search input { + height: 53px; + width: 100%; + outline: none; + border: 1px solid #999; + border-radius: 5px; + font-size: 16px; + padding: 0 42px; +} +.search :where(i, span) { + position: absolute; + top: 50%; + color: #999; + transform: translateY(-50%); +} +.search input::placeholder{ + color: #b8b8b8; +} +.search input:focus{ + border: 2px solid #4d59fb; + padding: 0 41px; +} +.search i { + left: 18px; + font-size: 16px; + pointer-events: none; +} +.search input:focus ~ i { + color: #4d59fb; +} +.search span { + right: 15px; + cursor: pointer; + font-size: 18px; + display: none; +} +.search input:valid ~ span { + display: block; +} +.wrapper ul li{ + display: flex; + margin-bottom: 14px; + padding-bottom: 17px; + border-bottom: 1px solid #ccc; + justify-content: space-between; + align-items: center; +} +ul .word p{ + font-size: 22px; + font-weight: 500; +} +.wrapper .info-text { + font-size: 13px; + color: #9a9a9a; + margin: -3px 0 -10px; +} +.wrapper ul { + height: 0; + opacity: 0; + overflow: hidden; + transition: all 0.3s ease; +} +ul .word i { + cursor: pointer; + font-size: 15px; + color: #999; +} +ul li:last-child{ + margin-bottom: 0px; + padding-bottom: 0px; + border-bottom: 0px; +} +.content li .details{ + border-left: 3px solid #4d59fb; + border-radius: 4px 0 0 4px; + padding-left: 10px; +} +.content li .details p { + font-size: 17px; + color: #7e7e7e; +} +.synonyms .details .list { + display: flex; + flex-wrap: wrap; +} +.synonyms .details .list span { + margin-right: 5px; + text-decoration: underline; + cursor: pointer; +} +.info-text span{ + font-weight: 500; +} +.wrapper.active ul { + height: 303px; + opacity: 1; +} +.wrapper.active ul{ + display: block; +} +.wrapper.active .info-text { + display: none; +} +ul .content { + max-height: 215px; + overflow-y: auto; +} +ul .content::-webkit-scrollbar{ + width: 0px; +} + + + + + + + + + + + + + + diff --git a/projects/feedback-ui/assets/review.png b/projects/feedback-ui/assets/review.png new file mode 100644 index 0000000000000000000000000000000000000000..12102214dab13333fcf607fd98027f590c6567b0 GIT binary patch literal 1800 zcmV+j2lx1iP)sIiZi9qjuSq#I#Xt_A9|TeiBeK0ZM~srf);9#2C*@eqJ|(s z?#W4VaxU*>`{5+#k`qW1`~ULp`|LjZ{P)@av%7+6P#_1_ZhJzw?jtzv65+EXeqS8F z)s5hYfCJ@C``(-GH(!YSpW(IN*yyE_`?2j1J_`|zfUeEJk%O9JK300@>7oA{fq}IT z?~w8MlS(Ne!Xb#1UENdhp_JabvZiM~{>%i1*FUmJjg2)cr33*#qB8ow`gbZR8=?pH zj?R~WR3N=%;`d4^fs}}7`CR;$;d#5~8yr9kuX}j6H#WW#K$L}{v~;d>q#Q@pR2|ya z1Mv8<19fhS?qS&^TC>6=KqcQC43Y%0q~djF?{CLgJ(H#cQP`z3qTCr zwK=IA$3h6il0^jr9R;5_U;vAa!bu!mu=}AeVJi=*Ny@4t(~h-Sk<>J`RL3yR;y5c% z3Q}pXOcby`2G5Q_r4A_tu7V#%;jYQuduRC~Y?aw3D`DjGuK1=@me`ve7|*EdrE&QC1T-y%=N7>Wi=nX!o*shkNs;`kCU;)wmdWU) zao&9DT~0TjEm~^Vu}i$Qx1ICvTq>{&q3)5I@7asw+VV zR5Xd+(1Ul)DAG_Ej)fQwqRxkKG&0u`AfzBtQ;KFtDsCt~Nh_}}RxAOjPbERZ#(gU32Ig? zL>iKwjsY(Gvxhq$y>|+cc*WpT=u9r*R~OfyJcZ#i z30IWh+8$lUFVcHv2-oq5)Rc0=nrpGb1*fD!h^>2WdEifZ1Xi^;X?sIv^#NiDKR?}H z%@4NpQB$2R2z+_aps{HIPi*Vuw6UBQdv6A%@Q3~QOJ^qz?A%kg;b#Cj4R~tRR8!M6 zT8@=+_(TbRcs)|&eXzBR*WNARk4MW{SJKY5MJLfUL1HYy`0yA?%`8Mv@@%hyWoZX*-h~$0^o9+R3<0il2tS8J?^;#1|ujaX0NIVwZ5x=05IRk$1ie@%CJTLtX~rr&ivZOgk?E=%#`03vzj| z=vh^O1rY~R&k0U=s@}Y@?c}@&0F1P+>~d|V1_6O^7^%%+8x()GYFjtXB{<}lA>e8H z{X$3=1*wS%ve(@#5YX%C+V|%gyof;Lmg60UZayTXbX~_KF+Mv90evX(fd30eE_`MJ z0O8w?H)9y}x~})Qw!_3|JXg=fIP5xNrCIytiTMPFS)P%jryIWQdG7Z-$E(#1O-RGA q4b$ira8!8ed84-NZ}Sa2h5rI@z<94%j>Tzv}niXcU%Rhx32`jOK-Y z-PP6A)z#Hi)lZBw#_Txg8JpO&aqBIWA2`bxw=mW-Ik9#7aCETocE)-SGG=&jSDIuafCJjK|^Dm*V7K5^uVhacQ*WNZ}o zwyTcpyXpipu^?kxAH#FYkz=P0zxl1XFXH|yj9qitWry}13|znM4UC<=49`0$!S+MT z2=4F2eeGpeTz%b}AFcZj+`6DuUw>le(22^weCQlw-+3#_-^GX)X10x8 z&Ge(=>$b7Lfm1WbSmMacq03p@v3*xx$p(l{jLpxBybIU7BwZ@G)-nC%hi0y1f#pYl zq57z#gtLU2zk<7jC~alq>;Yi1mmR}*hTXvag5AmPL)wGvVdSzhBeSzGlUXf`qfC;e zSemu4Huiq@k4(ol%s<&%Xr7^85=dKL1Ok*P@mreko=E6d7p}v*1WqdRC63 z89yb3O41#bmRJJElnU)7R*Q5h{{oKE{5QlAu-ZEb`}R+DzQm^3TF~j2^DpE363*%u zE&U(x0rrbN^DoSQ16aNUs^K&LG+KnCxJK%ttpANSN{ymc;J1L|Jh*-FN8tCu;|&(gZVU%&=Eh@M;g5$Q|%dvT6G)g8EKj$l#Gfl4YjiIn9%h!oSi|2_^|iWSW`3pgm(8Ws!bfBviGGC{#%DgOVRnEg+n!_xLaR^Nj@ z`vSgCJ$UQ=dgqWm{X>9c}WEIdK%XAbBkM}l|bol5EqhkJ6}t{(T`#!u);^-7Uf91LtKON z%Zupt()@45GsyF$AeN`7Im{?Qx(`bJz8`_jOThUBv8GtmDoP=E3dYLueDFnURE!tr zJRhAjNK{h0UN|dh0us^Vx4;jh3siprM}Zg4bgdq>k_)g_yi(dDv|1{0KHLbd265r6 z_7?TMGT#=dLo`}|wY==|6osnFap9>3Veoa4HrE5p?FSQFJ$skC<{4Dp8&$k3KRiNK%{%hjs8?G-1FbC!DO3hH{kN{2SE{uXgO#rThhSB`7&nc+q8EwEztwt= z@-4Izsjtdci=md5TzIl_pRWX$`WiKoGPfQO2Ptt5OMb5a~PO4)DbM3CNGGJhnv1dqmA8 zP?ut`a#^C2R&#MyAu0NtN;P#X5iY>Fq#qY(B%V>vt8f;!ZdP#BD6?{VR)oJK zQM8SyM3fe7Uy`9@JS~1AO8gLXA-P4;Q}hy!qGy%73SJ^-3GR#G{3-9m82mVKIeO~T z#JM-U<@qy^SM{#@`o)^c#O7#PdLE|EnBWTKKep+iC#?qXqrvwhsPqPW3ObH#7 zIuvRwuWx}$%b)!|Dbxci_u)!V1g%Irrcp<||4YzoPT@sz*NlE zl)CaqfvMI{@HAWimr4jY(5@H5S%j66PvATMoG7E%CCgU z#ibQ#Rm9~Y%aIgC89J8Y0sTSDAz~)_E&L_F_eYTqzjraU0I+!(IH)@5QYfU6(lg*) zqT`n0k0)pWeW|Qyg`iAnexxtqDy1H+)Y4j!|M#TsatLY)yl?0Gtc=t7a;t4q=ljxJ z=Wj)6uF`9TR+OSrt;9Z8ny>VFq0FMxC3MwB!E&CUC%Lj4XkN^(9$fmP!U#OB8(!M?71B^GaZ>c&SLz6(3zN zk>)1CXlX|1T(IQeCsw`7pO@yxQ@55wIcro^&U9QEN3B#5nmUe&3M-8_Els7;#YoX5 zd6xEEvE~)~aN((PrBI5nUW$3K#mgwU6vl<`HCPwUdHx(?&RoRX=Wn?NWu*v%Ix)V;o>SCvHvt}Ud}t`K}aN@7b|F}lwolU&#OVwo@w<9 z3SEe=v_ebHiU(pzB5pAbNls7?{sD84kU1nL#EhtDjLYkwl$EKnaw_FM-;))fo5hG( zvO3dfwnF}eB%0@zeU{f;D!odxFU`61zBKRR>y>k^oVvK={~vcNQ|!;zJ|RU{Ak~5t z6%YRaDY^pC|Id>yJmXw6t>ixmDJ15_{vi`!IhhA%9}BSxR?T9}fxS(Qc-qP~vKqD- z-vPFjUBL#~aeQ~NlkBbR6827fuV?RO{|mdM?qPq;UdQgm_x0?3>;vo#?0)u1_D1#y zzVBj>v9BTD*Vz;7gY0R1A7KB6?}yn>xto0iIB=Z3tPFLhP#4FJs+B%#*-q@vs>CBJ z_C<}e2JF+);Vy^$S2?x@7}CdqHkh$TYc*PAVcYRlKEv1{p>_{y4xpA=Kw9`V0-o~i0>mzS37Ym@4`}q&KG@aA+F3Kc^zi{2 zeU#^|C}m^ixbI+{fYl4SP`x$C*9t1Nuu(Q9ehj$Lhw=@v5qw?9Lq8w(3DTFL6u~BJ z>Dx!yiy!PUTk>gHa=&o9hBaN}Hx0U`OX#`|*F@oUNN*Fzb+qG+yKqNbKrO{CMezyY z7(xFr&_MarqAWxIHUWDE{ve7uz&8$XK^!U*+RRAJB|N`vmEu zoGr?YdQWL%pjH69SOu=MqDL7hyavZCemY=g7hgU4WCSBBh2sd?mqzL^evP2F0s9F} z;Cv6-;zcRKQ&|@(b#lPhm3$S5bWCFRA$}- z!ckiNa~2s}N3Rc94Bz(Z14pv9Gj8>?>UZ82DgcDM=DNdSc<814ent zy#&gdOYU{(xe8`Eu)Tz*9TW%z-=fs0<{47yiR%h4+_ zNSImdLw$+6`7VB+l+e9LKcjz-{sH|r_5W@t6FpD)sVzGFB;@X6tWrOze;cpYe@y>2 z_86t%>Z`baN&i*RXXcVpoc$E#V*1_e7tE}`3FkNJWBA>qe+T=8{u4MV6eSK*>XFzd zPzTqqW99mKwoUglwoSiIzn^_he;P;1T~PvG$8N{>FPL8UJC@LW4%}t1Afbk8&}r1}{~-2x^C76H5leA@v3Y1XBC1xF>Hm7ww} zarBF$PaJ9fiGBD^VQ=wHNZ-BUdLKKB=cVc0%TlJm4K$;9F8XZJs z>%=vUr2r%(rAy*EE%Lt%ys4(2<4m>u7tU0}FK{O4{|9G+Onaya>aTDnh`+{}p#27C zf<(Kye*~(uh^zk)S41@@YK^e}M6McK{Y;#LxR=D8gp$-hR?z7ONULGA_d3d6#Bqaw z^b=gQ;Acc{{ut*b_Ct|EdK1m$QSe(6@?N<>cTkb~{vB)%yb}S|E$FKp^ny(oy?Y^z z^6Uh=20GIlxB)pQ**0zz=Uv<+&X;f+!INw^FBj)M+$_#}d4)J1=ERZPIPG7bLhoHXQFMGQ7OeOQizu(f#>0p zHW5#YQ3Nid5?1a*E^spU;!OOD?#7Sub+Iq4SaL6(>A4@zXcUx|Fp3@c9HXMhy#kU_ z<6%)QfM+{FJG#?qGR}VxcO0pZ-O^V63vd>bW~E8ouT{<%1#LWm)Cz-6XOQ%g?q(+4 zhUa$t#AjmT#tD8iW51r)eP$k#Q}-p_hQaw zbK*6UM>nx~-paR1Uy`1Yz8i5z0+H%SERu-yL`EZ5M;?edV;;;k^r=Ltdy#jGn%5Qa zM?xZR_oBSt!CLC)n4#{S-&?Sp`|Y`3JufhO{;KES`1~!;U-SI&=WWjw{`Fr3Mg+H( z4#m$??3v>A!o}0j(BH=1&Yov~10H<`yBj+Ed!ey^5L)@2?Awqd??G=@LNeS7?fp~i zDafw-*oV-@a&Y$hp}BvaeHNPgNyxc-*j4O{cyq(&*cb2ygfFo#i@tmfwEeF_>;EV? z-GQ~iH!%nQ6T234GGZlgid_fUa|2cnH)6GL6T2B}hu34xaGKr1ZiP&e*lp}hm?>u2 zo7o+h@BS8Z##`85V%1^5xO)V1&L`QY*~i$&*=Nu{W%${p2kn`;mTx9mVrYQP&}n^CW1rRpdFzrjd3Oe< zz}<#=c8SzHpdAPNk3!qsjQo%SNI#6+ry;kuKyL2>`~!eaxW0w4+?xM&=eyr^+Z%5^ zeajnOfAi~Zy77kVUwi7hYp;3D)mP1&JaPQWD~?^BKYH1b!-ozY*uQW3(!G0jU$Sdz za_5fi+qQ1rv~k1wb!*qGUNteEskC8I{{rOCGP*9?OwAwrO_u;2EZi157S> zhKmcs$Q@H?$do*{KP^Y)$wL5jri@vl+onfwWznv9WCArr9=5an_#N0OKg`vuU6XT> z>BCd2kef;IIq|o3u0y^~xtyMh9Ee2bjB$DYrpejp9G{kh>iw2U8Tb2wvr#!3nVNcd z{<9&x4{ zEDZ3)5jlqG)7UU}M%s{;7npkUBsy^H4BwER24kGdx04Qa&%$emw!*dn#aPi3?8&sYc>4`}m zp5tDH&SUae#D8@5fV>|(m)kUXBzSmgA7Ibr1m{55{L#P za|WCvhxZY4k(}Lx`ti33!XBr6vs+P?(U1wwnIQ5H?>i(%AokpJ~3xZtfmwGPNe01htP>sUu54QQFa{Y3hEGk!7({Hg)CB>=uU)# zeArKi1GC`9xjh(dhPY$aIUDJog`C<05vxxe*fEWHAYzYFp&$8%T^?XT9ZIe){b=(~a&RsT@KBxdQDyP*E zNK{Df1Dl0L0(X-j&Ln5RoOw`8E6vu1Q zWq`N5)NI+sRR&fNy*XDd5Fu%lC?mwqUzJYjpfywhgsY@9V+}RM077F-&(0p$2c2q< zl}4x~;Xt|*ZR$qTy4ALUHaDQ%o2Yi+fCh`(ZIjge3NV3So(ep$gN~n7Si1rb?P&OC zA<$I3AD*8l0;;(c(t*B!C-_`_ECvPvqjJ}#r*Jh+ziH$er=L2KD%4SGSt9jS@JgSS zFMcQ&fzd=S7a`K!8E%30s}CAbVoF{Bl6OH;Q^-iS(w zQeOly>~kDvLn2DQAdyb++#E*6@${6Ua@|P0@dh!Z-jI$&jzZ5G;n21)QQ|rRX@J~i z2_fWWq3|5thp8EIh~&<&DdjX1Hin7fsRqF#L_i!{vQ#)O)ST5xN6c2>zpTDV1;UAq-T zpe35QD`*Bz#Rb=$=~sJ<$!TO8m@^(hNw8QS$~vSd=Z?T2K@%dU*b!5G|03wOy~(HiO!z+F7l-xdSWK zMqI`(p`-W{tvl1nWTk$6LalUm_v|h#2%~dhs#wJXx7H9zZGp+1gbBl%NrD~13`-8# z*H$6n=deMLKfwM;oj%V@dE7KNr_(L1uBaoL#cvh=yTXnfuP;0$ojupyCy`4LWxH^A zn(P`9%c6K+XGi?M;?#MVYZPk*;ZI#kI+t%69 zo=9^~#v^-9uUq$n?YCW;$y|Ed_81rE5ViO)(fmgNkHwRZAt{EI2t{vW;ZJQcNriQjPrhDv$>fW1bR{Prm z?+djiyxw?QFw`2yxmEghRcqs_(D2_K95}oxnHb*Hk)6uP0h?j0v1?7F!eKo3tUJ*W ziL}Sv?s$77(viSc2@bm(lX^kBO6JIwSDJ}jl?u6lGca>x9KhQX^+ey@+jhmtYg_N< znZj;vsNFoucNBiHcGJ-x93#&U{Cd(Qy4$4$y*U#$*t=kDd6;=~R&KWNTH{V`HgMjx zgQeSfx*hrT^C`(JeG~aFM}8x_YnX}L1o*f zpW$D`qa=G27G?&k;lKE`=Z}cz&+)6(=k!hz?YSTJ-Y-gLCEUa6C*bMK$e&=}^%Jz` z1XL5C9uUv{dam1wpt$28wCEDHsFTRQT)yxD*W~kfAIx;D8CPfD_~y@!Vl7$tMM~yxl8Aj z0-<~$z{)F3HAaQi%k47)Cm~PT+Alu`DIL*EPf_g{N$``a^bO%6ck1U427!{Y}oBzBGAi@^O4{`qG!a#H&xC1^)Sa z_$xX)d@~)Oxi44V-Pq&JG`4vg6@n`@`r2E2+M~+LiXySA5kGZ|+YuqNH(>haxHG zL*>92GhI-64ABBLLROEkOfD>EqJ~UweyA=#G?X#;Y!KWTLpX16 z%w$}}DMJuCt+dr8q_#3~kQC3ly%{lk$T6df`*`+Mo=1YsgYnv2Q!v<+tBnsf2QO)n z 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 literal 0 HcmV?d00001 diff --git a/projects/feedback-ui/index.html b/projects/feedback-ui/index.html new file mode 100644 index 0000000..bf8cda1 --- /dev/null +++ b/projects/feedback-ui/index.html @@ -0,0 +1,48 @@ + + + + + + + + Feedback UI + + + +

Feedback Design UI

+
+

+ How satisfied are you with our
+ customer support performance? +

+
+
+ + Unhappy +
+ +
+ + Neutral +
+ +
+ + Satisfied +
+
+ +
+ + + + diff --git a/projects/feedback-ui/script.js b/projects/feedback-ui/script.js new file mode 100644 index 0000000..60bfd0f --- /dev/null +++ b/projects/feedback-ui/script.js @@ -0,0 +1,29 @@ +const ratings = document.querySelectorAll(".rating"); +const ratingsContainer = document.querySelector(".ratings-container"); +const sendBtn = document.querySelector("#send"); +const panel = document.querySelector("#panel"); +let selectedRating = "Unhappy"; + +ratingsContainer.addEventListener("click", (e) => { + console.log(e.target.parentNode.innerText); + removeActive(); + selectedRating = e.target.innerText || e.target.parentNode.innerText; + e.target.parentNode.classList.toggle("active"); + e.target.classList.toggle("active"); +}); + +sendBtn.addEventListener("click", (e) => { + panel.innerHTML = ` + + Thank You! +
+ Feedback : ${selectedRating} +

We'll use your feedback to improve our customer support.

+ `; +}); + +function removeActive() { + for (let i = 0; i < ratings.length; i++) { + ratings[i].classList.remove("active"); + } +} diff --git a/projects/feedback-ui/style.css b/projects/feedback-ui/style.css new file mode 100644 index 0000000..ef76253 --- /dev/null +++ b/projects/feedback-ui/style.css @@ -0,0 +1,120 @@ +* { + padding: 0; + box-sizing: border-box; + font-family: "sans"; +} + +@font-face { + font-family: "sans"; + src: url(font/sans.ttf); +} + +body { + overflow: hidden; + background: #19172e; + color: #fff; + display: flex; + align-items: center; + justify-content: center; + min-height: 100vh; +} + +footer, a, h3,small { + color: #fff; +} + +h1 { + color: #fff; + text-align: center; + position: absolute; + left: 0; + right: 0; + top: 0; + padding-top: 10px; +} + +.box { + background: rgba(255, 255, 255, 0.05); + box-shadow: 0 15px 25px rgba(0, 0, 0, 0.1); + border-radius: 10px; + backdrop-filter: blur(20px); + padding: 1rem; + width: 400px; + text-align: center; +} + +.panel-container { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + text-align: center; + padding: 30px; + max-width: 400px; +} + +.panel-container strong { + line-height: 20px; +} + +.ratings-container { + display: flex; + margin: 20px 0; +} + +.rating { + flex: 1; + cursor: pointer; + padding: 20px; + margin: 10px 5px; +} + +.rating:hover, +.rating.active { + border-radius: 4px; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.3); + background: salmon; +} + +.rating img { + width: 40px; +} + +.rating small { + display: inline-block; + margin: 10px 0 0; +} + +.rating:hover small, +.rating.active small { + color: green; +} + +.btn { + background-color: #302d2b; + color: #fff; + border: 0; + border-radius: 4px; + padding: 12px 30px; + cursor: pointer; +} + +.btn:focus { + outline: 0; +} + +.btn:active { + transform: scale(0.98); +} + +.fa-heart { + color: red; + font-size: 30px; + margin-bottom: 10px; +} + +footer { + text-align: center; + position: absolute; + bottom: 0; +} \ No newline at end of file diff --git a/projects/loan-calculator/index.html b/projects/loan-calculator/index.html new file mode 100644 index 0000000..d2722a1 --- /dev/null +++ b/projects/loan-calculator/index.html @@ -0,0 +1,50 @@ + + + + + + + + Loan Calculator + + + +
+

Loan Calculator

+

+ Loan Amount: $ +

+

+ Interest Rate: % +

+

+ Months to Pay: + +

+

+
+ + + diff --git a/projects/loan-calculator/index.js b/projects/loan-calculator/index.js new file mode 100644 index 0000000..5f3d29d --- /dev/null +++ b/projects/loan-calculator/index.js @@ -0,0 +1,9 @@ +function computeLoan() { + const amount = document.querySelector("#amount").value; + const interest_rate = document.querySelector("#interest_rate").value; + const months = document.querySelector("#months").value; + const interest = (amount * (interest_rate * 0.01)) / months; + const payment = (amount / months + interest).toFixed(2); + + document.querySelector("#payment").innerHTML = `Monthly Payment = ${payment}`; +} diff --git a/projects/loan-calculator/style.css b/projects/loan-calculator/style.css new file mode 100644 index 0000000..abdb9fc --- /dev/null +++ b/projects/loan-calculator/style.css @@ -0,0 +1,32 @@ + +body{ + padding: 0; + margin: 0; + display: flex; + justify-content: center; + align-items: center; + height: 100vh; + font-family: 'Courier New', Courier, monospace; +} + +#loancal { + padding: 20px; + border-radius: 10px; + background-color:darkcyan; + color: aliceblue; +} + +#months, #amount, #interest_rate{ + width: 100%; + height: 40px; + font-size: 20px; + +} + +#interest_rate { + margin-left: 2px; +} + +h1 { + font-size:40px; +} \ No newline at end of file diff --git a/projects/movie-quote-generator/index.html b/projects/movie-quote-generator/index.html new file mode 100644 index 0000000..eb18ef6 --- /dev/null +++ b/projects/movie-quote-generator/index.html @@ -0,0 +1,40 @@ + + + + + + + Random Movie/TV Series Quote Generator + + + + + + + +

Movie Quote Generator

+
+ +

+ +

+ + + +

+ +

+ +

+
+
+ + + + +
+
+ + + + diff --git a/projects/movie-quote-generator/script.js b/projects/movie-quote-generator/script.js new file mode 100644 index 0000000..2c0f8c4 --- /dev/null +++ b/projects/movie-quote-generator/script.js @@ -0,0 +1,17 @@ +const getNextQuote = async() => +{ + var url = "https://raw.githubusercontent.com/msramalho/json-tv-quotes/master/quotes.json"; + const response = await fetch(url); + const totalQuotes = await response.json(); + const index = Math.floor(Math.random()*totalQuotes.length); + const quo=totalQuotes[index].quote; + const auth=totalQuotes[index].author; + const sour=totalQuotes[index].source; + quote.innerHTML=""+quo; + author.innerHTML="~ "+auth; + source.innerHTML=""+sour; + tweet.href="https://twitter.com/intent/tweet?text="+quo+" ~ "+auth+" | "+sour; + whatsapp.href="whatsapp://send?text="+quo+" ~ "+auth+" | "+sour; +} + +getNextQuote(); diff --git a/projects/movie-quote-generator/style.css b/projects/movie-quote-generator/style.css new file mode 100644 index 0000000..b0e3c55 --- /dev/null +++ b/projects/movie-quote-generator/style.css @@ -0,0 +1,129 @@ +*{ + margin: 0; + padding: 0; + box-sizing: border-box; + } + +body { + display: flex; + justify-content: center; + align-items: center; + min-height: 100vh; + background-color: #19172e; + font-family: "Garamond", serif; + transition-timing-function: ease-in; + transition: 0.7s; + } + +#quote { + text-align: center; + font-size: 40px; + font-weight: bold; + color: white; +} + +#author { + margin: 10px; + text-align: right; + font-size: 25px; + font-style: italic; + font-family: "Garamond", serif; + color: #19172e; +} + +#source { + margin: 10px; + text-align: right; + font-size: 25px; + font-weight: 700; + font-family: "Garamond", serif; + color: #19172e +} + +.container { + display: flex; + flex-direction: column; + align-items: center; + padding: 30px; + box-shadow: 0 4px 10px rgba(0, 0, 0, 0.6); + border-radius: 15px; + width: 600px; + background-color: rgba(255, 255, 255, 0.3); + margin: 10px; +} + + +.buttons { + width: 100%; + display: flex; + justify-content: space-between; + align-items: center; + margin-top: 9px; + +} + +#tweet { + border: solid rgb(102, 179, 255); + border-radius: 4px; + background-color: rgb(102, 179, 255); + color: white; + text-align: center; + font-size: 1.8em; + width: 60px; + height: 35px; + line-height: 40px; + +} + +#whatsapp { + border: solid #25D366; + border-radius: 4px; + background-color: #25D366; + color: white; + text-align: center; + font-size: 1.8em; + width: 60px; + height: 35px; + line-height: 40px; + +} + +footer { + + text-align: center; + color: white; + font-size: 1rem; + position: absolute; + bottom: 0px; + padding: 5px; + line-height: 3vh; + font-family: "Roboto", sans-serif; +} + +.heading{ + font-family: "Roboto", sans-serif; + color: white; + font-size: 50px; + position: absolute; + top: 0; + left: 0; + right: 0; + text-align: center; + padding: 100px; + line-height: 3vh; +} + +.container:hover { + box-shadow: 0 10px 10px rgb(0, 0, 0); +} + +.next { + font-size: 18px; + border-radius: 5px; + cursor: pointer; + padding: 10px; + margin-top: 5px; + font-weight: bold; + color: white; + background-image: linear-gradient(to right bottom, rgb(230, 100, 0), #ffedbca8); +} \ No newline at end of file diff --git a/projects/notes-taking-app/icon.png b/projects/notes-taking-app/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9cac03b4f4fbefe58aefa59d447c69c926af06c7 GIT binary patch literal 7224 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 + + + + + + + Notes Taking App + + + +

Notes Taking App

+
+ +
+ + + + diff --git a/projects/notes-taking-app/script.js b/projects/notes-taking-app/script.js new file mode 100644 index 0000000..f788999 --- /dev/null +++ b/projects/notes-taking-app/script.js @@ -0,0 +1,69 @@ +const notesContainer = document.getElementById("app"); +const addNoteButton = notesContainer.querySelector(".add-note"); + +getNotes().forEach(note => { + const noteElement = createNoteElement(note.id, note.content); + notesContainer.insertBefore(noteElement, addNoteButton); +}); + +addNoteButton.addEventListener("click", () => addNote()); + +function getNotes(){ + return JSON.parse(localStorage.getItem("note-ap") || "[]"); +} + +function saveNotes(notes){ + localStorage.setItem("note-ap", JSON.stringify(notes)); +} + +function createNoteElement(id, content){ + const element = document.createElement("textarea"); + + element.classList.add("note"); + element.value = content; + element.placeholder = "Empty Note"; + + element.addEventListener("change", () => { + updateNote(id, element.value); + }); + + element.addEventListener("dblclick", () => { + const noteDelete = confirm("Want to Delete the note?") + if (noteDelete) { + deleteNote(id, element); + } + }); + + return element; +} + +function addNote(){ + const notes = getNotes(); + const noteObj = { + id: Math.floor(Math.random()*100000), + content: "" + }; + + const noteElement = createNoteElement(noteObj.id, noteObj.content); + notesContainer.insertBefore(noteElement, addNoteButton); + + + notes.push(noteObj); + saveNotes(notes); +} + +function updateNote(id, newContent) { + const notes = getNotes(); + const target = notes.filter(note=>note.id == id)[0]; + + target.content = newContent; + saveNotes(notes); +} + +function deleteNote(id, element) { + const notes = getNotes().filter(note => note.id != id); + + saveNotes(notes); + notesContainer.removeChild(element); +} + diff --git a/projects/notes-taking-app/style.css b/projects/notes-taking-app/style.css new file mode 100644 index 0000000..58a6b31 --- /dev/null +++ b/projects/notes-taking-app/style.css @@ -0,0 +1,85 @@ +:root { + --bg: #19172e; + --btn: #9c528b; + --card: #b9929f; +} +* { + font-family: sans-serif; + transition: 0.5s ease; +} +body { + margin: 0; + background: var(--bg); +} + +h1 { + color: #fff; + text-align: center; + left: 0; + right: 0; + top: 0; + padding-top: 10px; + font-size: 2rem !important; +} + +#app { + display: grid; + grid-template-columns: repeat(auto-fill, 200px); + padding: 50px; + gap: 40px; +} + +.note { + height: 200px; + box-sizing: border-box; + padding: 17px; + border-radius: 15px; + resize: none; + box-shadow: 0 0 7px rgba(0, 0, 0, 0.3); + font-family: monospace; + font-size: 18px; + color: var(--bg); + font-weight: 800; + border: none; + outline: none; + background: var(--card); +} + +.add-note { + height: 200px; + border: none; + outline: none; + background: rgba(156, 82, 139, 0.27); + border-radius: 15px; + font-size: 70px; + font-weight: 700; + color: rgba(0, 0, 0, 0.5); + cursor: pointer; +} + +.add-note:hover { + background: rgba(156, 82, 139, 0.5); + color: rgba(0, 0, 0, 0.7); +} + +::placeholder { + color: rgb(214, 214, 214); +} + +footer, +a { + color: rgb(214, 214, 214); + font-size: 20px; +} + +footer { + text-align: center; + color: white; + font-size: 1.25rem; + left: 0; + right: 0; + bottom: 0; + margin-bottom: 0; + padding: 10px; + line-height: 4vh; +} \ No newline at end of file diff --git a/projects/project-idea-generator/index.html b/projects/project-idea-generator/index.html new file mode 100644 index 0000000..5262bbf --- /dev/null +++ b/projects/project-idea-generator/index.html @@ -0,0 +1,43 @@ + + + + + Project Idea Generator + + + + + + + + + +

Project Idea Generator

+

+ Generate your next coding project
+
+ Note: Some projects may be in a specific language but you + can try doing them in a language you like! +

+ +
+ +

+
+ + + + + diff --git a/projects/project-idea-generator/src/css/styles.css b/projects/project-idea-generator/src/css/styles.css new file mode 100644 index 0000000..2e23832 --- /dev/null +++ b/projects/project-idea-generator/src/css/styles.css @@ -0,0 +1,102 @@ +* { + box-sizing: border-box; + padding: 10px +} +body { + position: relative; + margin: 0; + padding: 0; + font-family: 'Poppins', sans-serif; + text-align: center; + color: black; + background: #3498DB; +} + +h1 { + display: block; + font-family: 'Poppins', sans-serif; + text-align: center; +} + +h2 { + font-weight: 500; + font-size: 24px; +} + +.fa-code { + font-size: 30px; + font-weight: bolder; + color: white; +} + +h3 { + font-weight: 500; +} + +a { + color: inherit; + text-decoration: underline; +} + +p { + color: white; +} + +.title { + font-weight: 600; + color: white; + font-size: 54px; + padding: 0 16px; +} + +#generate-project { + padding: 15px 40px; + background: none; + border: 3px solid white; + border-radius: 10px; + font-family: 'Poppins', sans-serif; + font-size: 24px; + cursor: pointer; + transition: all 0.3s ease; +} + +#generate-project:hover { + background: white; +} + +#give-idea { + padding: 10px 20px; + background: none; + border: 3px solid white; + border-radius: 10px; + font-family: 'Poppins', sans-serif; + font-size: 16px; + cursor: pointer; + transition: all 0.3s ease; +} + +.fa-github { + font-size: 20px; + font-weight: 600; +} + +#give-idea:hover { + background: white; +} + +#new-project { + margin-top: 20px; + font-size: 44px; +} + +#project-generation { + font-size: 50px; +} + +#project-generation span { + margin-top: 70px; +} + +ul li { + list-style-type: none; +} \ No newline at end of file diff --git a/projects/project-idea-generator/src/js/main.js b/projects/project-idea-generator/src/js/main.js new file mode 100644 index 0000000..3b8dee5 --- /dev/null +++ b/projects/project-idea-generator/src/js/main.js @@ -0,0 +1,15 @@ +document.getElementById("generate-project").addEventListener( + "click", + function() { + let project = projects[Math.floor(Math.random() * projects.length)]; + let link = document.getElementById('new-project') + + if (project.link !== "") { + link.innerHTML = ` + ${project.title} + `; + } else { + link.innerHTML = `${project.title}`; + }; + } + ); \ No newline at end of file diff --git a/projects/project-idea-generator/src/js/projects.js b/projects/project-idea-generator/src/js/projects.js new file mode 100644 index 0000000..4637c82 --- /dev/null +++ b/projects/project-idea-generator/src/js/projects.js @@ -0,0 +1,1514 @@ +let projects = [ + { + "title": "Build Your Own Text Editor", + "link": "https://viewsourcecode.org/snaptoken/kilo/index.html" + }, + { + "title": "Let's Build a Simple Database", + "link": "https://cstack.github.io/db_tutorial" + }, + { + "title": "Build a spell-checker in Clojure", + "link": "https://bernhardwenzel.com/articles/clojure-spellchecker/" + }, + { + "title": "Build a Twitter Bot in Clojure", + "link": "https://howistart.org/posts/clojure/1/index.html" + }, + { + "title": "Build an Intrpreter", + "link": "https://www.craftinginterpreters.com/" + }, + { + "title": "Write a Shell in C", + "link": "https://brennan.io/2015/01/16/write-a-shell-in-c/" + }, + { + "title": "Build your own Lisp", + "link": "http://www.buildyourownlisp.com/" + }, + { + "title": "Write an OS from scratch", + "link": "https://github.com/tuhdo/os01" + }, + { + "title": "How to create an OS from scratch", + "link": "https://github.com/cfenollosa/os-tutorial" + }, + { + "title": "Building a Simple Chat App With Elixir and Phoenix", + "link": "https://sheharyar.me/blog/simple-chat-phoenix-elixir/" + }, + { + "title": "Write a super fast link shortener with Elixir, Phoenix, and Mnesia", + "link": "https://medium.com/free-code-camp/how-to-write-a-super-fast-link-shortener-with-elixir-phoenix-and-mnesia-70ffa1564b3c" + }, + { + "title": "Write your own Excel in 100 lines of F#", + "link": "http://tomasp.net/blog/2018/write-your-own-excel/" + }, + { + "title": "ChatBus : build your first multi-user chat room app with Erlang/OTP", + "link": "https://medium.com/@kansi/chatbus-build-your-first-multi-user-chat-room-app-with-erlang-otp-b55f72064901" + }, + { + "title": "How to Write a Jupyter Notebook Extension", + "link": "https://towardsdatascience.com/how-to-write-a-jupyter-notebook-extension-a63f9578a38c" + }, + { + "title": "Build a React Native Todo Application", + "link": "https://egghead.io/courses/build-a-react-native-todo-application" + }, + { + "title": "How to build a news app with React Native", + "link": "https://www.freecodecamp.org/news/create-a-news-app-using-react-native-ced249263627/" + }, + { + "title": "Reverse a String", + "link": "" + }, + { + "title": "RSS Feed Creator", + "link": "" + }, + { + "title": "P2P File Sharing App", + "link": "" + }, + { + "title": "Hotel Reservation System", + "link": "" + }, + { + "title": "WYSIWG Editor", + "link": "" + }, + { + "title": "CAPTCHA Maker", + "link": "" + }, + { + "title": "Build the Hangman game", + "link": "" + }, + { + "title": "Build a microblog with Flask", + "link": "https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world" + }, + { + "title": "Mining Twitter Data with Python", + "link": "https://marcobonzanini.com/2015/03/02/mining-twitter-data-with-python-part-1/" + }, + { + "title": "Build a Job Scrapping Web App", + "link": "https://www.freecodecamp.org/news/how-i-built-a-job-scraping-web-app-using-node-js-and-indreed-7fbba124bbdc/" + }, + { + "title": "Create a Character voting app", + "link": "http://sahatyalkabov.com/create-a-character-voting-app-using-react-nodejs-mongodb-and-socketio/" + }, + { + "title": "Build Git from Scratch", + "link": "http://gitlet.maryrosecook.com/docs/gitlet.html" + }, + { + "title": "Build a TCP/IP stack in C", + "link": "https://www.saminiir.com/lets-code-tcp-ip-stack-1-ethernet-arp/" + }, + { + "title": "Build a Network Stack in Ruby", + "link": "https://medium.com/geckoboard-under-the-hood/how-to-build-a-network-stack-in-ruby-f73aeb1b661b" + }, + { + "title": "C++: Introduction to Ray Tracing: a Simple Method for Creating 3D Images", + "link": "https://www.scratchapixel.com/lessons/3d-basic-rendering/introduction-to-ray-tracing/how-does-it-work" + }, + { + "title": "C++: How OpenGL works: software rendering in 500 lines of code", + "link": "https://github.com/ssloy/tinyrenderer/wiki" + }, + { + "title": "C++: Raycasting engine of Wolfenstein 3D", + "link": "http://lodev.org/cgtutor/raycasting.html" + }, + { + "title": "C++: Physically Based Rendering:From Theory To Implementation", + "link": "http://www.pbr-book.org/" + }, + { + "title": "C++: Rasterization: a Practical Implementation", + "link": "https://www.scratchapixel.com/lessons/3d-basic-rendering/rasterization-practical-implementation/overview-rasterization-algorithm" + }, + { + "title": "C# / TypeScript / JavaScript: Learning how to write a 3D soft engine from scratch in C#, TypeScript or JavaScript", + "link": "https://www.davrous.com/2013/06/13/tutorial-series-learning-how-to-write-a-3d-soft-engine-from-scratch-in-c-typescript-or-javascript/" + }, + { + "title": "Java / JavaScript: Build your own 3D renderer", + "link": "https://avik-das.github.io/build-your-own-raytracer/" + }, + { + "title": "Java: How to create your own simple 3D render engine in pure Java", + "link": "http://blog.rogach.org/2015/08/how-to-create-your-own-simple-3d-render.html" + }, + { + "title": "JavaScript / Pseudocode: Computer Graphics from scratch", + "link": "http://www.gabrielgambetta.com/computer-graphics-from-scratch/introduction.html" + }, + { + "title": "Python: A 3D Modeller", + "link": "http://aosabook.org/en/500L/a-3d-modeller.html" + }, + { + "title": "C#: How To: Augmented Reality App Tutorial for Beginners with Vuforia and Unity 3D", + "link": "https://www.youtube.com/watch?v=uXNjNcqW4kY" + }, + { + "title": "C#: How To Unity ARCore", + "link": "https://www.youtube.com/playlist?list=PLKIKuXdn4ZMjuUAtdQfK1vwTZPQn_rgSv" + }, + { + "title": "C#: AR Portal Tutorial with Unity", + "link": "https://www.youtube.com/playlist?list=PLPCqNOwwN794Gz5fzUSi1p4OqLU0HTmvn" + }, + { + "title": "C#: How to create a Dragon in Augmented Reality in Unity ARCore", + "link": "https://fr-film.net/v-how-to-create-a-dragon-in-augmented-reality-in-unity-arcore-tutorial-qTSDPkPyPqs.html" + }, + { + "title": "C#: How to Augmented Reality AR Tutorial: ARKit Portal to the Upside Down", + "link": "https://www.youtube.com/watch?v=Z5AmqMuNi08" + }, + { + "title": "Python: Augmented Reality with Python and OpenCV", + "link": "https://bitesofcode.wordpress.com/2017/09/12/augmented-reality-with-python-and-opencv-part-1/" + }, + { + "title": "C#: Building a BitTorrent client from scratch in C#", + "link": "https://www.seanjoflynn.com/research/bittorrent.html" + }, + { + "title": "Go: Building a BitTorrent client from the ground up in Go", + "link": "https://blog.jse.li/posts/torrent/" + }, + { + "title": "Nim: Writing a Bencode Parser", + "link": "https://xmonader.github.io/nimdays/day02_bencode.html" + }, + { + "title": "Node.js: Write your own bittorrent client", + "link": "https://allenkim67.github.io/programming/2016/05/04/how-to-make-your-own-bittorrent-client.html" + }, + { + "title": "Python: A BitTorrent client in Python 3.5", + "link": "http://markuseliasson.se/article/bittorrent-in-python/" + }, + { + "title": "ATS: Functional Blockchain", + "link": "https://beta.observablehq.com/@galletti94/functional-blockchain" + }, + { + "title": "C#: Programming The Blockchain in C#", + "link": "https://programmingblockchain.gitbooks.io/programmingblockchain/" + }, + { + "title": "Crystal: Write your own blockchain and PoW algorithm using Crystal", + "link": "https://medium.com/@bradford_hamilton/write-your-own-blockchain-and-pow-algorithm-using-crystal-d53d5d9d0c52" + }, + { + "title": "Go: Building Blockchain in Go", + "link": "https://jeiwan.cc/posts/building-blockchain-in-go-part-1/" + }, + { + "title": "Go: Code your own blockchain in less than 200 lines of Go", + "link": "https://medium.com/@mycoralhealth/code-your-own-blockchain-in-less-than-200-lines-of-go-e296282bcffc" + }, + { + "title": "Java: Creating Your First Blockchain with Java", + "link": "https://medium.com/programmers-blockchain/create-simple-blockchain-java-tutorial-from-scratch-6eeed3cb03fa" + }, + { + "title": "JavaScript: A cryptocurrency implementation in less than 1500 lines of code", + "link": "https://github.com/conradoqg/naivecoin" + }, + { + "title": "JavaScript: Build your own Blockchain in JavaScript", + "link": "https://github.com/nambrot/blockchain-in-js" + }, + { + "title": "JavaScript: Learn & Build a JavaScript Blockchain", + "link": "https://medium.com/digital-alchemy-holdings/learn-build-a-javascript-blockchain-part-1-ca61c285821e" + }, + { + "title": "JavaScript: Creating a blockchain with JavaScript", + "link": "https://github.com/SavjeeTutorials/SavjeeCoin" + }, + { + "title": "JavaScript: How To Launch Your Own Production-Ready Cryptocurrency", + "link": "https://hackernoon.com/how-to-launch-your-own-production-ready-cryptocurrency-ab97cb773371" + }, + { + "title": "JavaScript: Writing a Blockchain in Node.js", + "link": "https://www.jsmonday.dev/articles/34/writing-a-blockchain-in-node-js" + }, + { + "title": "Kotlin: Let’s implement a cryptocurrency in Kotlin", + "link": "https://medium.com/@vasilyf/lets-implement-a-cryptocurrency-in-kotlin-part-1-blockchain-8704069f8580" + }, + { + "title": "Python: Learn Blockchains by Building One", + "link": "https://hackernoon.com/learn-blockchains-by-building-one-117428612f46" + }, + { + "title": "Python: Build your own blockchain: a Python tutorial", + "link": "http://ecomunsing.com/build-your-own-blockchain" + }, + { + "title": "Python: A Practical Introduction to Blockchain with Python", + "link": "http://adilmoujahid.com/posts/2018/03/intro-blockchain-bitcoin-python/" + }, + { + "title": "Python: Let’s Build the Tiniest Blockchain", + "link": "https://medium.com/crypto-currently/lets-build-the-tiniest-blockchain-e70965a248b" + }, + { + "title": "Ruby: Programming Blockchains Step-by-Step (Manuscripts Book Edition)", + "link": "https://github.com/yukimotopress/programming-blockchains-step-by-step" + }, + { + "title": "Scala: How to build a simple actor-based blockchain", + "link": "https://medium.freecodecamp.org/how-to-build-a-simple-actor-based-blockchain-aac1e996c177" + }, + { + "title": "TypeScript: Naivecoin: a tutorial for building a cryptocurrency", + "link": "https://lhartikk.github.io/" + }, + { + "title": "TypeScript: NaivecoinStake: a tutorial for building a cryptocurrency with the Proof of Stake consensus", + "link": "https://naivecoinstake.learn.uno/" + }, + { + "title": "Haskell: Roll your own IRC bot", + "link": "https://wiki.haskell.org/Roll_your_own_IRC_bot" + }, + { + "title": "Java: How To Make a Scary Russian Twitter Bot With Java", + "link": "https://medium.com/@SeloSlav/how-to-make-a-scary-russian-twitter-bot-with-java-b7b62768a3ac" + }, + { + "title": "Node.js: Creating a Simple Facebook Messenger AI Bot with API.ai in Node.js", + "link": "https://tutorials.botsfloor.com/creating-a-simple-facebook-messenger-ai-bot-with-api-ai-in-node-js-50ae2fa5c80d" + }, + { + "title": "Node.js: How to make a responsive telegram bot", + "link": "https://www.sohamkamani.com/blog/2016/09/21/making-a-telegram-bot/" + }, + { + "title": "Node.js: Create a Discord bot", + "link": "https://discordjs.guide/" + }, + { + "title": "Node.js: gifbot - Building a GitHub App", + "link": "https://blog.scottlogic.com/2017/05/22/gifbot-github-integration.html" + }, + { + "title": "Node.js: Building A Simple AI Chatbot With Web Speech API And Node.js", + "link": "https://www.smashingmagazine.com/2017/08/ai-chatbot-web-speech-api-node-js/" + }, + { + "title": "Python: Chatbot Fundamentals: An interactive guide to writing bots in Python", + "link": "https://apps.worldwritable.com/tutorials/chatbot/" + }, + { + "title": "Python: How to Build Your First Slack Bot with Python", + "link": "https://www.fullstackpython.com/blog/build-first-slack-bot-python.html" + }, + { + "title": "Python: How to build a Slack Bot with Python using Slack Events API & Django under 20 minute", + "link": "https://medium.com/freehunch/how-to-build-a-slack-bot-with-python-using-slack-events-api-django-under-20-minute-code-included-269c3a9bf64e" + }, + { + "title": "Python: Build a Reddit Bot", + "link": "http://pythonforengineers.com/build-a-reddit-bot-part-1/" + }, + { + "title": "Python: How To Make A Reddit Bot", + "link": "https://www.youtube.com/watch?v=krTUf7BpTc0" + }, + { + "title": "Python: How To Create a Telegram Bot Using Python", + "link": "https://khashtamov.com/en/how-to-create-a-telegram-bot-using-python/" + }, + { + "title": "Python: Create a Twitter Bot in Python Using Tweepy", + "link": "https://medium.freecodecamp.org/creating-a-twitter-bot-in-python-with-tweepy-ac524157a607" + }, + { + "title": "Python: Creating Reddit Bot with Python & PRAW", + "link": "https://www.youtube.com/playlist?list=PLIFBTFgFpoJ9vmYYlfxRFV6U_XhG-4fpP" + }, + { + "title": "R: Build A Cryptocurrency Trading Bot with R", + "link": "https://towardsdatascience.com/build-a-cryptocurrency-trading-bot-with-r-1445c429e1b1" + }, + { + "title": "Rust: A bot for Starcraft in Rust, C or any other language", + "link": "https://habr.com/en/post/436254/" + }, + { + "title": "C: Rewriting the cat command from scratch", + "link": "https://learnto.computer/screencasts/bsd-cat" + }, + { + "title": "Go: Visualize your local git contributions with Go", + "link": "https://flaviocopes.com/go-git-contributions/" + }, + { + "title": "Go: Build a command line app with Go: lolcat", + "link": "https://flaviocopes.com/go-tutorial-lolcat/" + }, + { + "title": "Go: Building a cli command with Go: cowsay", + "link": "https://flaviocopes.com/go-tutorial-cowsay/" + }, + { + "title": "Go: Go CLI tutorial: fortune clone", + "link": "https://flaviocopes.com/go-tutorial-fortune/" + }, + { + "title": "Nim: Writing a stow alternative to manage dotfiles", + "link": "https://xmonader.github.io/nimdays/day06_nistow.html" + }, + { + "title": "C: Let's Build a Simple Database", + "link": "https://cstack.github.io/db_tutorial/" + }, + { + "title": "C++: Implementing a Key-Value Store", + "link": "http://codecapsule.com/2012/11/07/ikvs-implementing-a-key-value-store-table-of-contents/" + }, + { + "title": "C#: Build Your Own Database", + "link": "https://www.codeproject.com/Articles/1029838/Build-Your-Own-Database" + }, + { + "title": "Clojure: An Archaeology-Inspired Database", + "link": "http://aosabook.org/en/500L/an-archaeology-inspired-database.html" + }, + { + "title": "Crystal: Why you should build your own NoSQL Database", + "link": "https://medium.com/@marceloboeira/why-you-should-build-your-own-nosql-database-9bbba42039f5" + }, + { + "title": "JavaScript: Dagoba: an in-memory graph database", + "link": "http://aosabook.org/en/500L/dagoba-an-in-memory-graph-database.html" + }, + { + "title": "Python: DBDB: Dog Bed Database", + "link": "http://aosabook.org/en/500L/dbdb-dog-bed-database.html" + }, + { + "title": "Python: Write your own miniature Redis with Python", + "link": "http://charlesleifer.com/blog/building-a-simple-redis-server-with-python/" + }, + { + "title": "C: Linux containers in 500 lines of code", + "link": "https://blog.lizzie.io/linux-containers-in-500-loc.html" + }, + { + "title": "Go: Build Your Own Container Using Less than 100 Lines of Go", + "link": "https://www.infoq.com/articles/build-a-container-golang" + }, + { + "title": "Go: Building a container from scratch in Go", + "link": "https://www.youtube.com/watch?v=8fi7uSYlOdc" + }, + { + "title": "Python: A workshop on Linux containers: Rebuild Docker from Scratch", + "link": "https://github.com/Fewbytes/rubber-docker" + }, + { + "title": "Python: A proof-of-concept imitation of Docker, written in 100% Python", + "link": "https://github.com/tonybaloney/mocker" + }, + { + "title": "Shell: Docker implemented in around 100 lines of bash", + "link": "https://github.com/p8952/bocker" + }, + { + "title": "C: Virtual machine in C", + "link": "https://blog.felixangell.com/virtual-machine-in-c/" + }, + { + "title": "C: Write your Own Virtual Machine", + "link": "https://justinmeiners.github.io/lc3-vm/" + }, + { + "title": "C: Writing a Game Boy emulator, Cinoop", + "link": "https://cturt.github.io/cinoop.html" + }, + { + "title": "C++: How to write an emulator (CHIP-8 interpreter)", + "link": "http://www.multigesture.net/articles/how-to-write-an-emulator-chip-8-interpreter/" + }, + { + "title": "C++: Emulation tutorial (CHIP-8 interpreter)", + "link": "http://www.codeslinger.co.uk/pages/projects/chip8.html" + }, + { + "title": "C++: Emulation tutorial (GameBoy emulator)", + "link": "http://www.codeslinger.co.uk/pages/projects/gameboy.html" + }, + { + "title": "C++: Emulation tutorial (Master System emulator)", + "link": "http://www.codeslinger.co.uk/pages/projects/mastersystem/memory.html" + }, + { + "title": "Common Lisp: CHIP-8 in Common Lisp", + "link": "http://stevelosh.com/blog/2016/12/chip8-cpu/" + }, + { + "title": "JavaScript: GameBoy Emulation in JavaScript", + "link": "http://imrannazar.com/GameBoy-Emulation-in-JavaScript" + }, + { + "title": "Python: Emulation Basics: Write your own Chip 8 Emulator/Interpreter", + "link": "http://omokute.blogspot.com.br/2012/06/emulation-basics-write-your-own-chip-8.html" + }, + { + "title": "JavaScript: WTF is JSX (Let's Build a JSX Renderer)", + "link": "https://jasonformat.com/wtf-is-jsx/" + }, + { + "title": "JavaScript: A DIY guide to build your own React", + "link": "https://github.com/hexacta/didact" + }, + { + "title": "JavaScript: Reverse Engineering React", + "link": "https://vimeo.com/album/3930691" + }, + { + "title": "JavaScript: Building React From Scratch", + "link": "https://www.youtube.com/watch?v=_MAD4Oly9yg" + }, + { + "title": "JavaScript: Building Your Own React Clone in Five Easy Steps", + "link": "https://blog.javascripting.com/2016/10/05/building-your-own-react-clone-in-five-easy-steps/" + }, + { + "title": "JavaScript: Gooact: React in 160 lines of JavaScript", + "link": "https://medium.com/@sweetpalma/gooact-react-in-160-lines-of-javascript-44e0742ad60f" + }, + { + "title": "JavaScript: React Internals", + "link": "http://www.mattgreer.org/articles/react-internals-part-one-basic-rendering/" + }, + { + "title": "JavaScript: Learn how React Reconciler package works by building your own lightweight React DOM", + "link": "https://hackernoon.com/learn-you-some-custom-react-renderers-aed7164a4199" + }, + { + "title": "JavaScript: Build Yourself a Redux", + "link": "https://zapier.com/engineering/how-to-build-redux/" + }, + { + "title": "JavaScript: Let’s Write Redux!", + "link": "https://www.jamasoftware.com/blog/lets-write-redux/" + }, + { + "title": "JavaScript: Redux: Implementing Store from Scratch", + "link": "https://egghead.io/lessons/react-redux-implementing-store-from-scratch" + }, + { + "title": "JavaScript: Build Your own Simplified AngularJS in 200 Lines of JavaScript", + "link": "https://blog.mgechev.com/2015/03/09/build-learn-your-own-light-lightweight-angularjs/" + }, + { + "title": "JavaScript: Make Your Own AngularJS", + "link": "http://teropa.info/blog/2013/11/03/make-your-own-angular-part-1-scopes-and-digest.html" + }, + { + "title": "JavaScript: How to write your own Virtual DOM", + "link": "https://medium.com/@deathmood/how-to-write-your-own-virtual-dom-ee74acc13060" + }, + { + "title": "JavaScript: Building a frontend framework, from scratch, with components (templating, state, VDOM)", + "link": "https://mfrachet.github.io/create-frontend-framework/" + }, + { + "title": "JavaScript: Build your own React", + "link": "https://pomb.us/build-your-own-react/" + }, + { + "title": "C: Handmade Hero", + "link": "https://handmadehero.org/" + }, + { + "title": "C: How to Program an NES game in C", + "link": "https://nesdoug.com/" + }, + { + "title": "C: Chess Engine In C", + "link": "https://www.youtube.com/playlist?list=PLZ1QII7yudbc-Ky058TEaOstZHVbT-2hg" + }, + { + "title": "C: Let's Make: Dangerous Dave", + "link": "https://www.youtube.com/playlist?list=PLSkJey49cOgTSj465v2KbLZ7LMn10bCF9" + }, + { + "title": "C: Learn Video Game Programming in C", + "link": "https://www.youtube.com/playlist?list=PLT6WFYYZE6uLMcPGS3qfpYm7T_gViYMMt" + }, + { + "title": "C: Coding A Sudoku Solver in C", + "link": "https://www.youtube.com/playlist?list=PLkTXsX7igf8edTYU92nU-f5Ntzuf-RKvW" + }, + { + "title": "C: Coding a Rogue/Nethack RPG in C", + "link": "https://www.youtube.com/playlist?list=PLkTXsX7igf8erbWGYT4iSAhpnJLJ0Nk5G" + }, + { + "title": "C: On Tetris and Reimplementation", + "link": "https://brennan.io/2015/06/12/tetris-reimplementation/" + }, + { + "title": "C++: Breakout", + "link": "https://learnopengl.com/In-Practice/2D-Game/Breakout" + }, + { + "title": "C++: Beginning Game Programming v2.0", + "link": "http://lazyfoo.net/tutorials/SDL/" + }, + { + "title": "C++: Tetris tutorial in C++ platform independent focused in game logic for beginners", + "link": "http://javilop.com/gamedev/tetris-tutorial-in-c-platform-independent-focused-in-game-logic-for-beginners/" + }, + { + "title": "C++: Remaking Cavestory in C++", + "link": "https://www.youtube.com/watch?v=ETvApbD5xRo&list=PLNOBk_id22bw6LXhrGfhVwqQIa-M2MsLa" + }, + { + "title": "C++: Reconstructing Cave Story", + "link": "https://www.youtube.com/playlist?list=PL006xsVEsbKjSKBmLu1clo85yLrwjY67X" + }, + { + "title": "C++: Space Invaders from Scratch", + "link": "http://nicktasios.nl/posts/space-invaders-from-scratch-part-1.html" + }, + { + "title": "C#: Learn C# by Building a Simple RPG", + "link": "http://scottlilly.com/learn-c-by-building-a-simple-rpg-index/" + }, + { + "title": "C#: Creating a Roguelike Game in C#", + "link": "https://roguesharp.wordpress.com/" + }, + { + "title": "C#: Build a C#/WPF RPG", + "link": "https://scottlilly.com/build-a-cwpf-rpg/" + }, + { + "title": "Go: Games With Go", + "link": "https://gameswithgo.org/" + }, + { + "title": "Java: 3D Game Development with LWJGL 3", + "link": "https://lwjglgamedev.gitbooks.io/3d-game-development-with-lwjgl/content/" + }, + { + "title": "JavaScript: 2D breakout game using Phaser", + "link": "https://developer.mozilla.org/en-US/docs/Games/Tutorials/2D_breakout_game_Phaser" + }, + { + "title": "JavaScript: How to Make Flappy Bird in HTML5 With Phaser", + "link": "http://www.lessmilk.com/tutorial/flappy-bird-phaser-1" + }, + { + "title": "JavaScript: Developing Games with React, Redux, and SVG", + "link": "https://auth0.com/blog/developing-games-with-react-redux-and-svg-part-1/" + }, + { + "title": "JavaScript: Build your own 8-Ball Pool game from scratch", + "link": "https://www.youtube.com/watch?v=aXwCrtAo4Wc" + }, + { + "title": "JavaScript: How to Make Your First Roguelike", + "link": "https://gamedevelopment.tutsplus.com/tutorials/how-to-make-your-first-roguelike--gamedev-13677" + }, + { + "title": "JavaScript: Think like a programmer: How to build Snake using only JavaScript, HTML & CSS", + "link": "https://medium.freecodecamp.org/think-like-a-programmer-how-to-build-snake-using-only-javascript-html-and-css-7b1479c3339e" + }, + { + "title": "Lua: BYTEPATH", + "link": "https://github.com/SSYGEN/blog/issues/30" + }, + { + "title": "Python: Developing Games With PyGame", + "link": "https://pythonprogramming.net/pygame-python-3-part-1-intro/" + }, + { + "title": "Python: Making Games with Python & Pygame", + "link": "https://inventwithpython.com/makinggames.pdf [pdf]" + }, + { + "title": "Python: The Complete Roguelike Tutorial", + "link": "https://www.youtube.com/playlist?list=PLKUel_nHsTQ1yX7tQxR_SQRdcOFyXfNAb" + }, + { + "title": "Python: Roguelike Tutorial Revised", + "link": "http://rogueliketutorials.com/" + }, + { + "title": "Ruby: Developing Games With Ruby", + "link": "https://leanpub.com/developing-games-with-ruby/read" + }, + { + "title": "Ruby: Ruby Snake", + "link": "https://www.diatomenterprises.com/gamedev-on-ruby-why-not/" + }, + { + "title": "Rust: Adventures in Rust: A Basic 2D Game", + "link": "https://a5huynh.github.io/posts/2018/adventures-in-rust/" + }, + { + "title": "Rust: Roguelike Tutorial in Rust + tcod", + "link": "https://tomassedovic.github.io/roguelike-tutorial/" + }, + { + "title": "Haskell: Reimplementing “git clone” in Haskell from the bottom up", + "link": "http://stefan.saasen.me/articles/git-clone-in-haskell-from-the-bottom-up/" + }, + { + "title": "JavaScript: Gitlet", + "link": "http://gitlet.maryrosecook.com/docs/gitlet.html" + }, + { + "title": "JavaScript: Build GIT - Learn GIT", + "link": "https://kushagragour.in/blog/2014/01/build-git-learn-git/" + }, + { + "title": "Python: Just enough of a Git client to create a repo, commit, and push itself to GitHub", + "link": "https://benhoyt.com/writings/pygit/" + }, + { + "title": "Python: Write yourself a Git!", + "link": "https://wyag.thb.lt/" + }, + { + "title": "Ruby: Rebuilding Git in Ruby", + "link": "https://robots.thoughtbot.com/rebuilding-git-in-ruby" + }, + { + "title": "C: Beej's Guide to Network Programming", + "link": "http://beej.us/guide/bgnet/" + }, + { + "title": "C: Let's code a TCP/IP stack", + "link": "http://www.saminiir.com/lets-code-tcp-ip-stack-1-ethernet-arp/" + }, + { + "title": "Ruby: How to build a network stack in Ruby", + "link": "https://medium.com/geckoboard-under-the-hood/how-to-build-a-network-stack-in-ruby-f73aeb1b661b" + }, + { + "title": "C#: Neural Network OCR", + "link": "https://www.codeproject.com/Articles/11285/Neural-Network-OCR" + }, + { + "title": "F#: Building Neural Networks in F#", + "link": "https://towardsdatascience.com/building-neural-networks-in-f-part-1-a2832ae972e6" + }, + { + "title": "Go: Build a multilayer perceptron with Golang", + "link": "https://made2591.github.io/posts/neuralnetwork" + }, + { + "title": "Go: How to build a simple artificial neural network with Go", + "link": "https://sausheong.github.io/posts/how-to-build-a-simple-artificial-neural-network-with-go/" + }, + { + "title": "Go: Building a Neural Net from Scratch in Go", + "link": "https://datadan.io/blog/neural-net-with-go" + }, + { + "title": "JavaScript / Java: Neural Networks - The Nature of Code", + "link": "https://www.youtube.com/playlist?list=PLRqwX-V7Uu6aCibgK1PTWWu9by6XFdCfh" + }, + { + "title": "JavaScript: Neural Network implementation in JavaScript, by an example", + "link": "https://franpapers.com/en/machine-learning-ai-en/2017-neural-network-implementation-in-javascript-by-an-example/" + }, + { + "title": "JavaScript: Neural networks from scratch for JavaScript linguists (Part1 — The Perceptron)", + "link": "https://hackernoon.com/neural-networks-from-scratch-for-javascript-linguists-part1-the-perceptron-632a4d1fbad2" + }, + { + "title": "Python: A Neural Network in 11 lines of Python", + "link": "https://iamtrask.github.io/2015/07/12/basic-python-network/" + }, + { + "title": "Python: Implement a Neural Network from Scratch", + "link": "https://victorzhou.com/blog/intro-to-neural-networks/" + }, + { + "title": "Python: Optical Character Recognition (OCR)", + "link": "http://aosabook.org/en/500L/optical-character-recognition-ocr.html" + }, + { + "title": "Python: Traffic signs classification with a convolutional network", + "link": "https://navoshta.com/traffic-signs-classification/" + }, + { + "title": "Python: Generate Music using LSTM Neural Network in Keras", + "link": "https://towardsdatascience.com/how-to-generate-music-using-a-lstm-neural-network-in-keras-68786834d4c5" + }, + { + "title": "Python: An Introduction to Convolutional Neural Networks", + "link": "https://victorzhou.com/blog/intro-to-cnns-part-1/" + }, + { + "title": "Assembly: Writing a Tiny x86 Bootloader", + "link": "http://joebergeron.io/posts/post_two.html" + }, + { + "title": "Assembly: Baking Pi – Operating Systems Development", + "link": "http://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/index.html" + }, + { + "title": "C: Building a software and hardware stack for a simple computer from scratch", + "link": "https://www.youtube.com/watch?v=ZjwvMcP3Nf0&list=PLU94OURih-CiP4WxKSMt3UcwMSDM3aTtX" + }, + { + "title": "C: Operating Systems: From 0 to 1", + "link": "https://tuhdo.github.io/os01/" + }, + { + "title": "C: The little book about OS development", + "link": "https://littleosbook.github.io/" + }, + { + "title": "C: Roll your own toy UNIX-clone OS", + "link": "http://jamesmolloy.co.uk/tutorial_html/" + }, + { + "title": "C: Kernel 101 – Let’s write a Kernel", + "link": "https://arjunsreedharan.org/post/82710718100/kernel-101-lets-write-a-kernel" + }, + { + "title": "C: Kernel 201 – Let’s write a Kernel with keyboard and screen support", + "link": "https://arjunsreedharan.org/post/99370248137/kernel-201-lets-write-a-kernel-with-keyboard" + }, + { + "title": "C: Build a minimal multi-tasking kernel for ARM from scratch", + "link": "https://github.com/jserv/mini-arm-os" + }, + { + "title": "C: How to create an OS from scratch", + "link": "https://github.com/cfenollosa/os-tutorial" + }, + { + "title": "C: Malloc tutorial", + "link": "https://danluu.com/malloc-tutorial/" + }, + { + "title": "C: Hack the virtual memory", + "link": "https://blog.holbertonschool.com/hack-the-virtual-memory-c-strings-proc/" + }, + { + "title": "C: Learning operating system development using Linux kernel and Raspberry Pi", + "link": "https://github.com/s-matyukevich/raspberry-pi-os" + }, + { + "title": "C: Operating systems development for Dummies", + "link": "https://medium.com/@lduck11007/operating-systems-development-for-dummies-3d4d786e8ac" + }, + { + "title": "C++: Write your own Operating System", + "link": "https://www.youtube.com/playlist?list=PLHh55M_Kq4OApWScZyPl5HhgsTJS9MZ6M" + }, + { + "title": "C++: Writing a Bootloader", + "link": "http://3zanders.co.uk/2017/10/13/writing-a-bootloader/" + }, + { + "title": "Rust: Writing an OS in Rust", + "link": "https://os.phil-opp.com/" + }, + { + "title": "C: Video Game Physics Tutorial", + "link": "https://www.toptal.com/game/video-game-physics-part-i-an-introduction-to-rigid-body-dynamics" + }, + { + "title": "C++: Game physics series by Allen Chou", + "link": "http://allenchou.net/game-physics-series/" + }, + { + "title": "C++: How to Create a Custom Physics Engine", + "link": "https://gamedevelopment.tutsplus.com/series/how-to-create-a-custom-physics-engine--gamedev-12715" + }, + { + "title": "C++: 3D Physics Engine Tutorial", + "link": "https://www.youtube.com/playlist?list=PLEETnX-uPtBXm1KEr_2zQ6K_0hoGH6JJ0" + }, + { + "title": "JavaScript: Build your own basic physics engine in JavaScript", + "link": "https://www.graphitedigital.com/blog/build-your-own-basic-physics-engine-in-javascript" + }, + { + "title": "JavaScript: How Physics Engines Work", + "link": "http://buildnewgames.com/gamephysics/" + }, + { + "title": "JavaScript: Broad Phase Collision Detection Using Spatial Partitioning", + "link": "http://buildnewgames.com/broad-phase-collision-detection/" + }, + { + "title": "JavaScript: Build a simple 2D physics engine for JavaScript games", + "link": "https://www.ibm.com/developerworks/library/wa-build2dphysicsengine/index.html" + }, + { + "title": "(any): mal - Make a Lisp", + "link": "https://github.com/kanaka/mal#mal---make-a-lisp" + }, + { + "title": "Assembly: Jonesforth", + "link": "https://github.com/nornagon/jonesforth/blob/master/jonesforth.S" + }, + { + "title": "C: Baby's First Garbage Collector", + "link": "http://journal.stuffwithstuff.com/2013/12/08/babys-first-garbage-collector/" + }, + { + "title": "C: Build Your Own Lisp: Learn C and build your own programming language in 1000 lines of code", + "link": "http://www.buildyourownlisp.com/" + }, + { + "title": "C: Writing a Simple Garbage Collector in C", + "link": "http://maplant.com/gc.html" + }, + { + "title": "C: C interpreter that interprets itself.", + "link": "https://github.com/lotabout/write-a-C-interpreter" + }, + { + "title": "C: A C & x86 version of the \"Let's Build a Compiler\" by Jack Crenshaw", + "link": "https://github.com/lotabout/Let-s-build-a-compiler" + }, + { + "title": "C++: Writing Your Own Toy Compiler Using Flex", + "link": "https://gnuu.org/2009/09/18/writing-your-own-toy-compiler/" + }, + { + "title": "C++: How to Create a Compiler", + "link": "https://www.youtube.com/watch?v=eF9qWbuQLuw" + }, + { + "title": "C++: Kaleidoscope: Implementing a Language with LLVM", + "link": "https://llvm.org/docs/tutorial/MyFirstLanguageFrontend/index.html" + }, + { + "title": "F#: Understanding Parser Combinators", + "link": "https://fsharpforfunandprofit.com/posts/understanding-parser-combinators/" + }, + { + "title": "Elixir: Demystifying compilers by writing your own", + "link": "https://www.youtube.com/watch?v=zMJYoYwOCd4" + }, + { + "title": "Go: The Super Tiny Compiler", + "link": "https://github.com/hazbo/the-super-tiny-compiler" + }, + { + "title": "Go: Lexical Scanning in Go", + "link": "https://www.youtube.com/watch?v=HxaD_trXwRE" + }, + { + "title": "Haskell: Let's Build a Compiler", + "link": "https://g-ford.github.io/cradle/" + }, + { + "title": "Haskell: Write You a Haskell", + "link": "http://dev.stephendiehl.com/fun/" + }, + { + "title": "Haskell: Write Yourself a Scheme in 48 Hours", + "link": "https://en.wikibooks.org/wiki/Write_Yourself_a_Scheme_in_48_Hours" + }, + { + "title": "Haskell: Write You A Scheme", + "link": "https://www.wespiser.com/writings/wyas/home.html" + }, + { + "title": "Java: Crafting interpreters: A handbook for making programming languages", + "link": "http://www.craftinginterpreters.com/" + }, + { + "title": "Java: Creating JVM Language", + "link": "http://jakubdziworski.github.io/categories.html#Enkel-ref" + }, + { + "title": "JavaScript: The Super Tiny Compiler", + "link": "https://github.com/jamiebuilds/the-super-tiny-compiler" + }, + { + "title": "JavaScript: The Super Tiny Interpreter", + "link": "https://github.com/keyanzhang/the-super-tiny-interpreter" + }, + { + "title": "JavaScript: Little Lisp interpreter", + "link": "https://maryrosecook.com/blog/post/little-lisp-interpreter" + }, + { + "title": "JavaScript: How to implement a programming language in JavaScript", + "link": "http://lisperator.net/pltut/" + }, + { + "title": "OCaml: Writing a C Compiler", + "link": "https://norasandler.com/2017/11/29/Write-a-Compiler.html" + }, + { + "title": "OCaml: Writing a Lisp, the series", + "link": "https://bernsteinbear.com/blog/lisp/" + }, + { + "title": "Pascal: Let's Build a Compiler", + "link": "https://compilers.iecc.com/crenshaw/" + }, + { + "title": "Python: A Python Interpreter Written in Python", + "link": "http://aosabook.org/en/500L/a-python-interpreter-written-in-python.html" + }, + { + "title": "Python: lisp.py: Make your own Lisp interpreter", + "link": "http://khamidou.com/compilers/lisp.py/" + }, + { + "title": "Python: Simple Iterator-based Parsing", + "link": "http://effbot.org/zone/simple-iterator-parser.htm" + }, + { + "title": "Python: Simple Top-Down Parsing in Python", + "link": "http://effbot.org/zone/simple-top-down-parsing.htm" + }, + { + "title": "Python: How to Write a Lisp Interpreter in Python", + "link": "http://norvig.com/lispy.html" + }, + { + "title": "Python: Let’s Build A Simple Interpreter", + "link": "https://ruslanspivak.com/lsbasi-part1/" + }, + { + "title": "Python: Make Your Own Simple Interpreted Programming Language", + "link": "https://www.youtube.com/watch?v=dj9CBS3ikGA&list=PLZQftyCk7_SdoVexSmwy_tBgs7P0b97yD&index=1" + }, + { + "title": "Racket: Beautiful Racket: How to make your own programming languages with Racket", + "link": "https://beautifulracket.com/" + }, + { + "title": "Ruby: A Compiler From Scratch", + "link": "https://www.destroyallsoftware.com/screencasts/catalog/a-compiler-from-scratch" + }, + { + "title": "Ruby: Markdown compiler from scratch in Ruby", + "link": "https://blog.beezwax.net/2017/07/07/writing-a-markdown-compiler/" + }, + { + "title": "Rust: So You Want to Build a Language VM", + "link": "https://blog.subnetzero.io/post/building-language-vm-part-00/" + }, + { + "title": "Rust: Learning Parser Combinators With Rust", + "link": "https://bodil.lol/parser-combinators/" + }, + { + "title": "Swift: Building a LISP from scratch with Swift", + "link": "https://www.uraimo.com/2017/02/05/building-a-lisp-from-scratch-with-swift/" + }, + { + "title": "TypeScript: Build your own WebAssembly Compiler", + "link": "https://blog.scottlogic.com/2019/05/17/webassembly-compiler.html" + }, + { + "title": "C: A Regular Expression Matcher", + "link": "https://www.cs.princeton.edu/courses/archive/spr09/cos333/beautiful.html" + }, + { + "title": "C: Regular Expression Matching Can Be Simple And Fast", + "link": "https://swtch.com/~rsc/regexp/regexp1.html" + }, + { + "title": "JavaScript: Build a Regex Engine in Less than 40 Lines of Code", + "link": "https://nickdrane.com/build-your-own-regex/" + }, + { + "title": "JavaScript: How to implement regular expressions in functional javascript using derivatives", + "link": "http://dpk.io/dregs/toydregs" + }, + { + "title": "JavaScript: Implementing a Regular Expression Engine", + "link": "https://deniskyashif.com/2019/02/17/implementing-a-regular-expression-engine/" + }, + { + "title": "Perl: How Regexes Work", + "link": "https://perl.plover.com/Regex/article.html" + }, + { + "title": "Scala: No Magic: Regular Expressions", + "link": "https://rcoh.svbtle.com/no-magic-regular-expressions" + }, + { + "title": "CSS: A search engine in CSS", + "link": "https://stories.algolia.com/a-search-engine-in-css-b5ec4e902e97" + }, + { + "title": "Python: Building a search engine using Redis and redis-py", + "link": "http://www.dr-josiah.com/2010/07/building-search-engine-using-redis-and.html" + }, + { + "title": "Python: Building a Vector Space Indexing Engine in Python", + "link": "https://boyter.org/2010/08/build-vector-space-search-engine-python/" + }, + { + "title": "Python: Building A Python-Based Search Engine", + "link": "https://www.youtube.com/watch?v=cY7pE7vX6MU" + }, + { + "title": "Python: Making text search learn from feedback", + "link": "https://medium.com/filament-ai/making-text-search-learn-from-feedback-4fe210fd87b0" + }, + { + "title": "Python: Finding Important Words in Text Using TF-IDF", + "link": "https://stevenloria.com/tf-idf/" + }, + { + "title": "C: Tutorial - Write a Shell in C", + "link": "https://brennan.io/2015/01/16/write-a-shell-in-c/" + }, + { + "title": "C: Let's build a shell!", + "link": "https://github.com/kamalmarhubi/shell-workshop" + }, + { + "title": "C: Writing a UNIX Shell", + "link": "https://indradhanush.github.io/blog/writing-a-unix-shell-part-1/" + }, + { + "title": "C: Build Your Own Shell", + "link": "https://github.com/tokenrove/build-your-own-shell" + }, + { + "title": "Go: Writing a simple shell in Go", + "link": "https://sj14.gitlab.io/post/2018-07-01-go-unix-shell/" + }, + { + "title": "Ruby: A Unix Shell in Ruby", + "link": "https://www.jstorimer.com/blogs/workingwithcode/7766107-a-unix-shell-in-ruby" + }, + { + "title": "Rust: Build Your Own Shell using Rust", + "link": "https://www.joshmcguigan.com/blog/build-your-own-shell-rust/" + }, + { + "title": "JavaScript: JavaScript template engine in just 20 lines", + "link": "http://krasimirtsonev.com/blog/article/Javascript-template-engine-in-just-20-line" + }, + { + "title": "JavaScript: Understanding JavaScript Micro-Templating", + "link": "https://medium.com/wdstack/understanding-javascript-micro-templating-f37a37b3b40e" + }, + { + "title": "Python: Approach: Building a toy template engine in Python", + "link": "http://alexmic.net/building-a-template-engine/" + }, + { + "title": "Python: A Template Engine", + "link": "http://aosabook.org/en/500L/a-template-engine.html" + }, + { + "title": "Ruby: How to write a template engine in less than 30 lines of code", + "link": "http://bits.citrusbyte.com/how-to-write-a-template-library/" + }, + { + "title": "C: Build Your Own Text Editor", + "link": "https://viewsourcecode.org/snaptoken/kilo/" + }, + { + "title": "C++: Designing a Simple Text Editor", + "link": "http://www.fltk.org/doc-1.1/editor.html" + }, + { + "title": "Python: Python Tutorial: Make Your Own Text Editor", + "link": "https://www.youtube.com/watch?v=xqDonHEYPgA" + }, + { + "title": "Python: Create a Simple Python Text Editor!", + "link": "http://www.instructables.com/id/Create-a-Simple-Python-Text-Editor/" + }, + { + "title": "Ruby: Build a Collaborative Text Editor Using Rails", + "link": "https://blog.aha.io/text-editor/" + }, + { + "title": "Python: Developing a License Plate Recognition System with Machine Learning in Python", + "link": "https://blog.devcenter.co/developing-a-license-plate-recognition-system-with-machine-learning-in-python-787833569ccd" + }, + { + "title": "Python: Building a Facial Recognition Pipeline with Deep Learning in Tensorflow", + "link": "https://hackernoon.com/building-a-facial-recognition-pipeline-with-deep-learning-in-tensorflow-66e7645015b8" + }, + { + "title": "C++: Let's Make a Voxel Engine", + "link": "https://sites.google.com/site/letsmakeavoxelengine/home" + }, + { + "title": "Java: Let's make a voxel engine", + "link": "https://www.youtube.com/watch?v=C_Fo9PcrVXA&list=PLXa65xzz2vplye7cn1HH4GyE6_FjnDSug&index=1" + }, + { + "title": "Java: Java Voxel Engine Tutorial", + "link": "https://www.youtube.com/watch?v=QZ4Vk2PkPZk&list=PL80Zqpd23vJfyWQi-8FKDbeO_ZQamLKJL" + }, + { + "title": "PHP: Code a Search Engine in PHP", + "link": "https://boyter.org/2013/01/code-for-a-search-engine-in-php-part-1/" + }, + { + "title": "Ruby: Write an Internet search engine with 200 lines of Ruby code", + "link": "https://blog.saush.com/2009/03/17/write-an-internet-search-engine-with-200-lines-of-ruby-code/" + }, + { + "title": "C#: Writing a Web Server from Scratch", + "link": "https://www.codeproject.com/Articles/859108/Writing-a-Web-Server-from-Scratch" + }, + { + "title": "Node.js: Let's code a web server from scratch with NodeJS Streams", + "link": "https://www.codementor.io/ziad-saab/let-s-code-a-web-server-from-scratch-with-nodejs-streams-h4uc9utji" + }, + { + "title": "Node.js: lets-build-express", + "link": "https://github.com/antoaravinth/lets-build-express" + }, + { + "title": "PHP: Writing a webserver in pure PHP", + "link": "http://station.clancats.com/writing-a-webserver-in-pure-php/" + }, + { + "title": "Python: A Simple Web Server", + "link": "http://aosabook.org/en/500L/a-simple-web-server.html" + }, + { + "title": "Python: Let’s Build A Web Server.", + "link": "https://ruslanspivak.com/lsbaws-part1/" + }, + { + "title": "Python: Web application from scratch", + "link": "https://defn.io/2018/02/25/web-app-from-scratch-01/" + }, + { + "title": "Python: Building a basic HTTP Server from scratch in Python", + "link": "http://joaoventura.net/blog/2017/python-webserver/" + }, + { + "title": "Python: Implementing a RESTful Web API with Python & Flask", + "link": "http://blog.luisrei.com/articles/flaskrest.html" + }, + { + "title": "Ruby: Building a simple websockets server from scratch in Ruby", + "link": "http://blog.honeybadger.io/building-a-simple-websockets-server-from-scratch-in-ruby/" + }, + { + "title": "(any): From NAND to Tetris: Building a Modern Computer From First Principles", + "link": "http://nand2tetris.org/" + }, + { + "title": "Alloy: The Same-Origin Policy", + "link": "http://aosabook.org/en/500L/the-same-origin-policy.html" + }, + { + "title": "C: How to Write a Video Player in Less Than 1000 Lines", + "link": "http://dranger.com/ffmpeg/ffmpeg.html" + }, + { + "title": "C: Learn how to write a hash table in C", + "link": "https://github.com/jamesroutley/write-a-hash-table" + }, + { + "title": "C: The very basics of a terminal emulator", + "link": "https://www.uninformativ.de/blog/postings/2018-02-24/0/POSTING-en.html" + }, + { + "title": "C: Write a System Call", + "link": "https://brennan.io/2016/11/14/kernel-dev-ep3/" + }, + { + "title": "C: Sol - An MQTT broker from scratch", + "link": "https://codepr.github.io/posts/sol-mqtt-broker" + }, + { + "title": "C++: Build your own VR headset for $100", + "link": "https://github.com/relativty/Relativ" + }, + { + "title": "C++: How X Window Managers work and how to write one", + "link": "https://seasonofcode.com/posts/how-x-window-managers-work-and-how-to-write-one-part-i.html" + }, + { + "title": "C++: Writing a Linux Debugger", + "link": "https://blog.tartanllama.xyz/writing-a-linux-debugger-setup/" + }, + { + "title": "C++: How a 64k intro is made", + "link": "http://www.lofibucket.com/articles/64k_intro.html" + }, + { + "title": "C#: C# Networking: Create a TCP chater server, TCP games, UDP Pong and more", + "link": "https://16bpp.net/tutorials/csharp-networking" + }, + { + "title": "C#: Loading and rendering 3D skeletal animations from scratch in C# and GLSL", + "link": "https://www.seanjoflynn.com/research/skeletal-animation.html" + }, + { + "title": "Clojure: Building a spell-checker", + "link": "https://bernhardwenzel.com/articles/clojure-spellchecker/" + }, + { + "title": "Go: Let's Create a Simple Load Balancer", + "link": "https://kasvith.github.io/posts/lets-create-a-simple-lb-go/" + }, + { + "title": "Java: How to Build an Android Reddit App", + "link": "https://www.youtube.com/playlist?list=PLgCYzUzKIBE9HUJU-upNvl3TRVAo9W47y" + }, + { + "title": "JavaScript: Build Your Own Module Bundler - Minipack", + "link": "https://github.com/ronami/minipack" + }, + { + "title": "JavaScript: Learn JavaScript Promises by Building a Promise from Scratch", + "link": "https://levelup.gitconnected.com/understand-javascript-promises-by-building-a-promise-from-scratch-84c0fd855720" + }, + { + "title": "JavaScript: Implementing promises from scratch (TDD way)", + "link": "https://www.mauriciopoppe.com/notes/computer-science/computation/promises/" + }, + { + "title": "JavaScript: Implement your own — call(), apply() and bind() method in JavaScript", + "link": "https://blog.usejournal.com/implement-your-own-call-apply-and-bind-method-in-javascript-42cc85dba1b" + }, + { + "title": "JavaScript: JavaScript Algorithms and Data Structures", + "link": "https://github.com/trekhleb/javascript-algorithms" + }, + { + "title": "JavaScript: How to Make an Evolutionary Tetris AI", + "link": "https://www.youtube.com/watch?v=xLHCMMGuN0Q" + }, + { + "title": "JavaScript: Build a ride hailing app with React Native", + "link": "https://pusher.com/tutorials/ride-hailing-react-native" + }, + { + "title": "Kotlin: Build Your Own Cache", + "link": "https://github.com/kezhenxu94/cache-lite" + }, + { + "title": "Nim: Writing a Redis Protocol Parser", + "link": "https://xmonader.github.io/nimdays/day12_resp.html" + }, + { + "title": "Nim: Writing a Build system", + "link": "https://xmonader.github.io/nimdays/day11_buildsystem.html" + }, + { + "title": "Nim: Writing a MiniTest Framework", + "link": "https://xmonader.github.io/nimdays/day08_minitest.html" + }, + { + "title": "Nim: Writing a DMIDecode Parser", + "link": "https://xmonader.github.io/nimdays/day01_dmidecode.html" + }, + { + "title": "Nim: Writing a INI Parser", + "link": "https://xmonader.github.io/nimdays/day05_iniparser.html" + }, + { + "title": "Nim: Writing a Link Checker", + "link": "https://xmonader.github.io/nimdays/day04_asynclinkschecker.html" + }, + { + "title": "Nim: Writing a URL Shortening Service", + "link": "https://xmonader.github.io/nimdays/day07_shorturl.html" + }, + { + "title": "Node.js: Build a static site generator in 40 lines with Node.js", + "link": "https://www.webdevdrops.com/build-static-site-generator-nodejs-8969ebe34b22/" + }, + { + "title": "Node.js: Building A Simple Single Sign On(SSO) Server And Solution From Scratch In Node.js.", + "link": "https://codeburst.io/building-a-simple-single-sign-on-sso-server-and-solution-from-scratch-in-node-js-ea6ee5fdf340" + }, + { + "title": "Node.js: How to create a real-world Node CLI app with Node", + "link": "https://medium.freecodecamp.org/how-to-create-a-real-world-node-cli-app-with-node-391b727bbed3" + }, + { + "title": "PHP: Write your own MVC from scratch in PHP", + "link": "https://chaitya62.github.io/2018/04/29/Writing-your-own-MVC-from-Scratch-in-PHP.html" + }, + { + "title": "PHP: Make your own blog", + "link": "https://ilovephp.jondh.me.uk/en/tutorial/make-your-own-blog" + }, + { + "title": "PHP: Modern PHP Without a Framework", + "link": "https://kevinsmith.io/modern-php-without-a-framework" + }, + { + "title": "Python: Build a Deep Learning Library", + "link": "https://www.youtube.com/watch?v=o64FV-ez6Gw" + }, + { + "title": "Python: How to Build a Kick-Ass Mobile Document Scanner in Just 5 Minutes", + "link": "https://www.pyimagesearch.com/2014/09/01/build-kick-ass-mobile-document-scanner-just-5-minutes/" + }, + { + "title": "Python: Continuous Integration System", + "link": "http://aosabook.org/en/500L/a-continuous-integration-system.html" + }, + { + "title": "Python: Recommender Systems in Python: Beginner Tutorial", + "link": "https://www.datacamp.com/community/tutorials/recommender-systems-python" + }, + { + "title": "Python: Write SMS-spam detector with Scikit-learn", + "link": "https://medium.com/@kopilov.vlad/detect-sms-spam-in-kaggle-with-scikit-learn-5f6afa7a3ca2" + }, + { + "title": "Python: A Simple Content-Based Recommendation Engine in Python", + "link": "http://blog.untrod.com/2016/06/simple-similar-products-recommendation-engine-in-python.html" + }, + { + "title": "Python: Stock Market Predictions with LSTM in Python", + "link": "https://www.datacamp.com/community/tutorials/lstm-python-stock-market" + }, + { + "title": "Python: Build your own error-correction fountain code with Luby Transform Codes", + "link": "https://franpapers.com/en/algorithmic/2018-introduction-to-fountain-codes-lt-codes-with-python/" + }, + { + "title": "Python: Building a simple Generative Adversial Network (GAN) using Tensorflow", + "link": "https://blog.paperspace.com/implementing-gans-in-tensorflow/" + }, + { + "title": "Python: Learn ML Algorithms by coding: Decision Trees", + "link": "https://lethalbrains.com/learn-ml-algorithms-by-coding-decision-trees-439ac503c9a4" + }, + { + "title": "Python: JSON Decoding Algorithm", + "link": "https://github.com/cheery/json-algorithm" + }, + { + "title": "Ruby: A Pedometer in the Real World", + "link": "http://aosabook.org/en/500L/a-pedometer-in-the-real-world.html" + }, + { + "title": "Ruby: Creating a Linux Desktop application with Ruby", + "link": "https://iridakos.com/tutorials/2018/01/25/creating-a-gtk-todo-application-with-ruby" + }, + { + "title": "Rust: Let's build a browser engine", + "link": "https://limpet.net/mbrubeck/2014/08/08/toy-layout-engine-1.html" + }, + { + "title": "Rust: Building a DNS server in Rust", + "link": "https://github.com/EmilHernvall/dnsguide/blob/master/README.md" + }, + { + "title": "Rust: Writing Scalable Chat Service from Scratch", + "link": "https://nbaksalyar.github.io/2015/07/10/writing-chat-in-rust.html" + }, + { + "title": "TypeScript: Tiny Package Manager: Learns how npm or Yarn works", + "link": "https://github.com/g-plane/tiny-package-manager" + }, + { + "title": "Write a CSV to HTML program", + "link": "https://programmingpraxis.com/2020/03/17/csv-to-html/" + }, + { + "title": "Write a Texas Hold 'Em Poker program", + "link": "https://programmingpraxis.com/2010/03/23/texas-hold-em/" + }, + { + "title": "Write a Turing Machine Simulator", + "link": "https://programmingpraxis.com/2009/03/27/a-turing-machine-simulator/" + }, + { + "title": "Nim: A two-player game of mathematical logic", + "link": "https://programmingpraxis.com/2010/01/08/nim/" + }, + { + "title": "Traveling Salesman: Brute Force: Examine all possible permutations to find the least-cost tour", + "link": "https://programmingpraxis.com/2010/03/12/traveling-salesman-brute-force/" + }, + { + "title": "The Seven Bridges of Königsberg: A classic graph puzzle due to Leonhard Euler", + "link": "https://programmingpraxis.com/2013/05/31/the-seven-bridges-of-knigsberg/" + }, + { + "title": "Adi Shamir’s Threshold Scheme: Use cryptography to share a secret, by Graham Enos", + "link": "https://programmingpraxis.com/2011/06/17/adi-shamirs-threshold-scheme/" + }, + { + "title": "Knight Rider: Classic problem of the knight’s tour", + "link": "https://programmingpraxis.com/2011/12/02/knight-rider/" + }, + { + "title": "Unix Paths: Convert relative Unix path to absolute, by Robert Fisher", + "link": "https://programmingpraxis.com/2013/08/13/unix-paths/" + }, + { + "title": "The First Computer Program: Ada Lovelace’s program to compute Bernoulli numbers for Charles Babbage’s Analytical Engine", + "link": "https://programmingpraxis.com/2011/02/08/the-first-computer-program/" + }, + { + "title": "Steve Yegge’s Phone-Screen Coding Exercises", + "link": "https://programmingpraxis.com/2009/06/30/steve-yegges-phone-screen-coding-exercises/" + }, + { + "title": "Word Count: An implementation of the unix wc program", + "link": "https://programmingpraxis.com/2009/12/08/word-count/" + }, + { + "title": "Grep: Simple version of the classic unix regular-expression matching utility", + "link": "https://programmingpraxis.com/2009/09/25/grep/" + }, + { + "title": "Cal: Print a twelve-month calendar", + "link": "https://programmingpraxis.com/2010/01/01/cal-2/" + }, + { + "title": "Diff: Find the differences between two text files", + "link": "https://programmingpraxis.com/2010/06/08/diff/" + }, + { + "title": "J K Rowling: Identify an author using forensic linguistics", + "link": "https://programmingpraxis.com/2013/07/19/j-k-rowling/" + }, + { + "title": "How to write your first Quine program", + "link": "https://towardsdatascience.com/how-to-write-your-first-quine-program-947f2b7e4a6f" + }, + { + "title": "Code The Game Of Life With React", + "link": "https://www.freecodecamp.org/news/create-gameoflife-with-react-in-one-hour-8e686a410174/" + }, + { + "title": "Build A Chat App with Sentiment Analysis", + "link": "https://codeburst.io/build-a-chat-app-with-sentiment-analysis-using-next-js-c43ebf3ea643" + }, +] diff --git a/projects/temp-converter/icon.png b/projects/temp-converter/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..496496ffd769a1c54c69803d111f89f9d3842bc5 GIT binary patch literal 8895 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 literal 0 HcmV?d00001 diff --git a/projects/temp-converter/index.html b/projects/temp-converter/index.html new file mode 100644 index 0000000..b4911a9 --- /dev/null +++ b/projects/temp-converter/index.html @@ -0,0 +1,52 @@ + + + + + + + + Temperature Convertor + + + +
+
+
Temperature Convertor
+
+
+ + +
+
+ + +
+
+ + +
+
+
+
+ + + + diff --git a/projects/temp-converter/script.js b/projects/temp-converter/script.js new file mode 100644 index 0000000..2876905 --- /dev/null +++ b/projects/temp-converter/script.js @@ -0,0 +1,39 @@ +// taking input element +const celsius =document.getElementById('celsius'); +const fahrenheit =document.getElementById('fahrenheit'); +const kelvin =document.getElementById('kelvin'); + +const input_box = document.getElementsByClassName('input_box'); + +for(let i=0; i0N4o5X&e^6_6qbs5A*Bw1l3h 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

|B*v$H1foEqBRMs-T*KTSwzJPf!UjTHe8%<_*|y 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 + + + + + + + Weight Converstion Tool + + +

+ + + diff --git a/projects/weight-converter/style.css b/projects/weight-converter/style.css new file mode 100644 index 0000000..67bd921 --- /dev/null +++ b/projects/weight-converter/style.css @@ -0,0 +1,16 @@ +form { + background-color: rgb(241, 9, 144); + color: white; + width: 500px; + height: 300px; + margin: 100px auto 100px; + padding: 25px; +} + +.error{ + color: red; +} + +.no-error{ + color: rgb(6, 48, 2); +} From ea47391de1827c15fe68c82750895090889846a7 Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Sun, 20 Nov 2022 12:42:27 +0800 Subject: [PATCH 04/54] edit loan calculator project --- projects/loan-calculator/index.html | 67 +++++++++-------------------- projects/loan-calculator/index.js | 21 +++++---- projects/loan-calculator/style.css | 25 ++++------- 3 files changed, 41 insertions(+), 72 deletions(-) diff --git a/projects/loan-calculator/index.html b/projects/loan-calculator/index.html index d2722a1..5762407 100644 --- a/projects/loan-calculator/index.html +++ b/projects/loan-calculator/index.html @@ -1,50 +1,25 @@ - - - - - - Loan Calculator - - - -
-

Loan Calculator

-

- Loan Amount: $ -

-

- Interest Rate: % -

-

- Months to Pay: - -

-

+ + + + + loan calculator + + + +
+

loan calculator

+

loan amount $ + +

+

interest rate % +

+

month to pay + +

+

monthly payment:

- - + + \ No newline at end of file diff --git a/projects/loan-calculator/index.js b/projects/loan-calculator/index.js index 5f3d29d..260f27d 100644 --- a/projects/loan-calculator/index.js +++ b/projects/loan-calculator/index.js @@ -1,9 +1,12 @@ -function computeLoan() { - const amount = document.querySelector("#amount").value; - const interest_rate = document.querySelector("#interest_rate").value; - const months = document.querySelector("#months").value; - const interest = (amount * (interest_rate * 0.01)) / months; - const payment = (amount / months + interest).toFixed(2); - - document.querySelector("#payment").innerHTML = `Monthly Payment = ${payment}`; -} +function calculateLoan() { + const amount = document.getElementById("amount").value + const interest_rate = document.getElementById("interest_rate").value + const months = document.getElementById("months").value + const interest = (amount * (interest_rate * .01)) / months + + const payment = (amount / months + interest).toFixed(2) + + document.getElementById("payment").innerHTML = `monthly payment: ${payment}` + + +} \ No newline at end of file diff --git a/projects/loan-calculator/style.css b/projects/loan-calculator/style.css index abdb9fc..321fc2b 100644 --- a/projects/loan-calculator/style.css +++ b/projects/loan-calculator/style.css @@ -1,32 +1,23 @@ - body{ padding: 0; margin: 0; display: flex; + height: 100vh; justify-content: center; align-items: center; - height: 100vh; font-family: 'Courier New', Courier, monospace; } -#loancal { - padding: 20px; - border-radius: 10px; - background-color:darkcyan; +.container{ + background-color: darkcyan; color: aliceblue; + padding: 20px; + border-radius: 10px; + } -#months, #amount, #interest_rate{ +.input{ width: 100%; - height: 40px; + height: 100%; font-size: 20px; - -} - -#interest_rate { - margin-left: 2px; -} - -h1 { - font-size:40px; } \ No newline at end of file From c6c243a0f28e4ae0fa22ce7bb214abeb7a998274 Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Mon, 28 Nov 2022 12:02:14 +0800 Subject: [PATCH 05/54] update currency converter project --- projects/currency-converter/index.html | 119 ++---------------- .../{script.js => index.js} | 0 projects/currency-converter/readme.md | 5 - projects/currency-converter/style.css | 69 ++++------ 4 files changed, 35 insertions(+), 158 deletions(-) rename projects/currency-converter/{script.js => index.js} (100%) delete mode 100644 projects/currency-converter/readme.md diff --git a/projects/currency-converter/index.html b/projects/currency-converter/index.html index f88d169..88358ff 100644 --- a/projects/currency-converter/index.html +++ b/projects/currency-converter/index.html @@ -4,139 +4,44 @@ - Currency_Converter_in_Javascript + Currency Converter -

Currency Converter

-
+

Currency Converter

-

Welcome! Please Enter the values

- -
-
+
- +
-
-
-
+
- -
+
+ +

- + \ No newline at end of file diff --git a/projects/currency-converter/script.js b/projects/currency-converter/index.js similarity index 100% rename from projects/currency-converter/script.js rename to projects/currency-converter/index.js diff --git a/projects/currency-converter/readme.md b/projects/currency-converter/readme.md deleted file mode 100644 index fc19e5a..0000000 --- a/projects/currency-converter/readme.md +++ /dev/null @@ -1,5 +0,0 @@ -I have added a Currency Converter. -It allows user to type digits(amount) and we have real time conversions as they type. -It fetches recent rates from the exchangerate API. -The UI is pretty simple and neat. - diff --git a/projects/currency-converter/style.css b/projects/currency-converter/style.css index 0ca98bd..b533d4e 100644 --- a/projects/currency-converter/style.css +++ b/projects/currency-converter/style.css @@ -1,83 +1,60 @@ -* { - box-sizing: border-box; - } + body { - font-family: Arial, Helvetica, sans-serif; + font-family:'Courier New', Courier, monospace; display: flex; flex-direction: column; - align-items: center; justify-content: center; height: 100vh; margin: 0; - padding: 20px; - background-image: linear-gradient(rgb(42, 105, 177),rgb(67, 207, 67) ); - } - - h1 { - color:blanchedalmond; - text-align: center; - } - h3{ - text-align: center; - } - - p { - text-align: center; + padding: 0; + background: yellow; + align-items: center; + } - .main-box{ - border:12px solid rgb(56, 27, 187); - background-color: #ff3399; - border-radius: 25px; - padding:40px; - } - .second-box{ - border:2px solid ; - background-color:#ff99cc; - border-radius:20px; + .main-box{ + background-color: darkcyan; + color: aliceblue; + border-radius: 5px; padding:10px; + max-width: 600px; + text-align: center; + + } .currency { - padding: 40px 0; + padding: 20px; display: flex; align-items: center; justify-content: space-between; } .currency select { - padding: 10px 20px 10px 10px; - - appearance: none; - border: 1px solid #dedede; - font-size: 16px; - background: transparent; - background-image: url('data:image/svg+xml;charset=US-ASCII,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22292.4%22%20height%3D%22292.4%22%3E%3Cpath%20fill%3D%22%20000002%22%20d%3D%22M287%2069.4a17.6%2017.6%200%200%200-13-5.4H18.4c-5%200-9.3%201.8-12.9%205.4A17.6%2017.6%200%200%200%200%2082.2c0%205%201.8%209.3%205.4%2012.9l128%20127.9c3.6%203.6%207.8%205.4%2012.8%205.4s9.2-1.8%2012.8-5.4L287%2095c3.5-3.5%205.4-7.8%205.4-12.8%200-5-1.9-9.2-5.5-12.8z%22%2F%3E%3C%2Fsvg%3E'); - background-position: right 10px top 50%, 0, 0; - background-size: 12px auto, 100%; - background-repeat: no-repeat; + padding: 10px; + } .currency input { border:0px; background: transparent; - font-size: 30px; + font-size: 25px; text-align: right; + color: aliceblue; } .exchange-rate { - color:aliceblue; - font-size: 14px; - padding: 0 10px; + font-size: 16px; + padding: 10px; + font-weight: 600; } select:focus, - input:focus, - button:focus { + input:focus { outline: 0; } \ No newline at end of file From 266dca8e5261901995b29ae3e0a17ee454596b4a Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Mon, 28 Nov 2022 15:17:23 +0800 Subject: [PATCH 06/54] update currency converter project --- projects/currency-converter/index.html | 4 +- projects/currency-converter/index.js | 60 ++++++++------------------ 2 files changed, 20 insertions(+), 44 deletions(-) diff --git a/projects/currency-converter/index.html b/projects/currency-converter/index.html index 88358ff..45f40ae 100644 --- a/projects/currency-converter/index.html +++ b/projects/currency-converter/index.html @@ -12,7 +12,7 @@

Currency Converter

- @@ -27,7 +27,7 @@

Currency Converter

- diff --git a/projects/currency-converter/index.js b/projects/currency-converter/index.js index 1407f01..585c669 100644 --- a/projects/currency-converter/index.js +++ b/projects/currency-converter/index.js @@ -1,51 +1,27 @@ -const exchange_rate = document.getElementById('exchange-rate'); -const curr_first = document.getElementById('curr-first'); -const curr_second = document.getElementById('curr-second'); -const worth_first = document.getElementById('worth-first'); -const worth_second = document.getElementById('worth-second'); +const exchangeRateEl = document.getElementById("exchange-rate"); +const currencyFirstEl = document.getElementById("currency-first"); +const currencySecondEl = document.getElementById("currency-second"); +const worthFirstEl = document.getElementById("worth-first"); +const worthSecondEl = document.getElementById("worth-second"); function convert() { - const currency_first = curr_first.value; - const currency_second = curr_second.value; -//using API for conversion of currency units - fetch(`https://v6.exchangerate-api.com/v6/16947c81da979880bacde4f5/latest/${currency_first}`) + const currencyFirstValue = currencyFirstEl.value; + const currencySecondValue = currencySecondEl.value; + //using API for conversion of currency units + fetch( + `https://v6.exchangerate-api.com/v6/5f9d1c87f7250159c9c9b17d/latest/${currencyFirstValue}` + ) .then((res) => res.json()) .then((data) => { - - const rate = data.conversion_rates[currency_second]; - exchange_rate.innerText = `1 ${currency_first} = ${rate} ${currency_second}`; + const rate = data.conversion_rates[currencySecondValue]; + exchangeRateEl.innerText = `1 ${currencyFirstValue} = ${rate} ${currencySecondValue}`; - worth_second.value = (worth_first.value * rate).toFixed(5); + worthSecondEl.value = (worthFirstEl.value * rate).toFixed(2); }); } //some javascript event listeners -curr_first.addEventListener('change', convert); -worth_first.addEventListener('input', convert); -curr_second.addEventListener('change', convert); -worth_second.addEventListener('input', convert); +currencyFirstEl.addEventListener("change", convert); +worthFirstEl.addEventListener("input", convert); +currencySecondEl.addEventListener("change", convert); +worthSecondEl.addEventListener("input", convert); convert(); - - - - - - - - - - - - - - - - - - - - - - - - - From 8f870b71eef21c8d810ef6a81132da394d8ca0d0 Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Tue, 29 Nov 2022 09:01:08 +0800 Subject: [PATCH 07/54] update the loan calculator project --- projects/loan-calculator/index.html | 20 +++++++++++--------- projects/loan-calculator/index.js | 17 ++++++++++------- projects/loan-calculator/style.css | 10 +++++++--- 3 files changed, 28 insertions(+), 19 deletions(-) diff --git a/projects/loan-calculator/index.html b/projects/loan-calculator/index.html index 5762407..8285844 100644 --- a/projects/loan-calculator/index.html +++ b/projects/loan-calculator/index.html @@ -4,22 +4,24 @@ - loan calculator + Loan Calculator
-

loan calculator

-

loan amount $ - +

Loan Calculator

+

Loan Amount $ +

-

interest rate % +

Interest Rate % +

-

month to pay - +

Months to pay +

-

monthly payment:

+

Monthly Payment:

+ - \ No newline at end of file + \ No newline at end of file diff --git a/projects/loan-calculator/index.js b/projects/loan-calculator/index.js index 260f27d..fb038fe 100644 --- a/projects/loan-calculator/index.js +++ b/projects/loan-calculator/index.js @@ -1,12 +1,15 @@ function calculateLoan() { - const amount = document.getElementById("amount").value - const interest_rate = document.getElementById("interest_rate").value - const months = document.getElementById("months").value - const interest = (amount * (interest_rate * .01)) / months + loanAmountValue = document.getElementById("loan-amount").value; - const payment = (amount / months + interest).toFixed(2) + interestRateValue = document.getElementById("interest-rate").value; - document.getElementById("payment").innerHTML = `monthly payment: ${payment}` + MonthsToPayValue = document.getElementById("months-to-pay").value; + interest = (loanAmountValue * (interestRateValue * 0.01)) / MonthsToPayValue; -} \ No newline at end of file + monthlyPayment = (loanAmountValue / MonthsToPayValue + interest).toFixed(2); + + document.getElementById( + "payment" + ).innerHTML = `Monthly Payment: ${monthlyPayment}`; +} diff --git a/projects/loan-calculator/style.css b/projects/loan-calculator/style.css index 321fc2b..6ca571b 100644 --- a/projects/loan-calculator/style.css +++ b/projects/loan-calculator/style.css @@ -9,15 +9,19 @@ body{ } .container{ - background-color: darkcyan; + background: darkcyan; color: aliceblue; padding: 20px; border-radius: 10px; - } .input{ width: 100%; - height: 100%; + font-size: 20px; + height: 30px; +} + +.payment{ + font-weight: 600; font-size: 20px; } \ No newline at end of file From 55ae0294a4b059bacdce4a9b8e22235785c7df34 Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Wed, 30 Nov 2022 20:18:34 +0800 Subject: [PATCH 08/54] update anime pics generator project --- .../anime-pics-genrator/.vscode/settings.json | 3 + projects/anime-pics-genrator/index.html | 32 +++---- projects/anime-pics-genrator/index.js | 26 ++++++ projects/anime-pics-genrator/script.js | 14 ---- projects/anime-pics-genrator/spinner.svg | 6 ++ projects/anime-pics-genrator/style.css | 83 ++++++------------- 6 files changed, 74 insertions(+), 90 deletions(-) create mode 100644 projects/anime-pics-genrator/.vscode/settings.json create mode 100644 projects/anime-pics-genrator/index.js delete mode 100644 projects/anime-pics-genrator/script.js create mode 100644 projects/anime-pics-genrator/spinner.svg diff --git a/projects/anime-pics-genrator/.vscode/settings.json b/projects/anime-pics-genrator/.vscode/settings.json new file mode 100644 index 0000000..6b665aa --- /dev/null +++ b/projects/anime-pics-genrator/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "liveServer.settings.port": 5501 +} diff --git a/projects/anime-pics-genrator/index.html b/projects/anime-pics-genrator/index.html index aeedb6f..424dfd4 100644 --- a/projects/anime-pics-genrator/index.html +++ b/projects/anime-pics-genrator/index.html @@ -4,32 +4,26 @@ - Random Anime profile + Anime Pics Generator - -
+
+

Anime Pics Generator

+ + +
-

Anime Pics Genrator

-

genrates Random Animes profile pics

- - -
-
- hero-img -
-
-

-
-
+ + +

Anime Name

+ diff --git a/projects/anime-pics-genrator/index.js b/projects/anime-pics-genrator/index.js new file mode 100644 index 0000000..55a158c --- /dev/null +++ b/projects/anime-pics-genrator/index.js @@ -0,0 +1,26 @@ +const btnEl = document.getElementById("btn"); +const animeBoxEl = document.querySelector(".anime-container"); +const animeImgEl = document.querySelector(".anime-img"); +const animeNameEl = document.querySelector(".anime-name"); + +btnEl.addEventListener("click", async function () { + try { + btnEl.disabled = true; + btnEl.innerText = "Loading..."; + animeNameEl.innerText = "Updating..."; + animeImgEl.src = "spinner.svg"; + const response = await fetch("https://api.catboys.com/img"); + const data = await response.json(); + animeImgEl.src = data.url; + + animeBoxEl.style.display = "block"; + animeNameEl.innerText = data.artist; + btnEl.disabled = false; + btnEl.innerText = "Get Anime"; + } catch (error) { + console.log(error); + btnEl.disabled = false; + btnEl.innerText = "Get Anime"; + animeNameEl.innerText = "An error happened, try again"; + } +}); diff --git a/projects/anime-pics-genrator/script.js b/projects/anime-pics-genrator/script.js deleted file mode 100644 index 9772363..0000000 --- a/projects/anime-pics-genrator/script.js +++ /dev/null @@ -1,14 +0,0 @@ -const getBTN = document.getElementById("btn"); -const animeBox = document.querySelector(".anime-box"); -const anime = document.querySelector(".anime"); -const animeName = document.querySelector(".hero-name"); - -const api_url = `https://api.catboys.com/img`; - -getBTN.addEventListener("click", async function () { - const response = await fetch(api_url); - const data = await response.json(); - anime.src = data.url; - animeBox.style.display = "block"; - animeName.textContent = data.artist; -}); diff --git a/projects/anime-pics-genrator/spinner.svg b/projects/anime-pics-genrator/spinner.svg new file mode 100644 index 0000000..0476499 --- /dev/null +++ b/projects/anime-pics-genrator/spinner.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/projects/anime-pics-genrator/style.css b/projects/anime-pics-genrator/style.css index d4471af..ee907a8 100644 --- a/projects/anime-pics-genrator/style.css +++ b/projects/anime-pics-genrator/style.css @@ -1,88 +1,57 @@ -@import url("https://fonts.googleapis.com/css2?family=Poppins:wght@300&display=swap"); - -* { - box-sizing: border-box; -} body { - font-family: "Poppins", sans-serif; - font-weight: normal; - background: linear-gradient(to right, #00afff, #00ff6c); + margin: 0; + background: linear-gradient(to right, lightblue, yellow); display: flex; - flex-direction: column; + height: 100vh; justify-content: center; align-items: center; - height: 100vh; - overflow: hidden; - margin: 0; + font-family:'Courier New', Courier, monospace; } -.main-container { - background-color: rgba(255, 255, 255, 0.863); +.container { + background-color: aliceblue; border-radius: 10px; - box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1), 0 6px 6px rgba(0, 0, 0, 0.1); + box-shadow: 0 10px 20px rgba(0, 0, 0, 0.3); text-align: center; padding: 10px; - max-width: 100%; - width: 800px; -} - -.anime-container h3 { - font-size: 20px; - font-weight: 600; - text-transform: capitalize; - padding-bottom: 10px; - letter-spacing: 0.9px; -} - -.anime-container h2 { - line-height: 30px; - word-spacing: 1px; - margin-bottom: 30px; - position: relative; + width: 450px; + margin: 5px; } .get-anime { margin-bottom: 30px; - background-color: rgba(0, 0, 0, 0.774); - color: #fff; + background-color: green; + color: aliceblue; padding: 10px 30px; - border: none; border-radius: 6px; - outline: none; font-size: 16px; - font-weight: 200; cursor: pointer; - letter-spacing: 1px; } -.anime-box { +.get-anime:disabled{ + background-color: gray; + cursor: not-allowed; +} + +.anime-container { + /* display: none; */ display: none; } -.anime-box img { +.anime-container img { height: 300px; width: 300px; border-radius: 50%; - border: 10px solid #005da3; - align-items: center; + border: 3px solid green; } -.hero-name { - margin-bottom: 30px; - background-color: rgba(0, 0, 0, 0.774); - color: #fff; - padding: 10px 30px; - border: none; +.anime-name{ + margin: 20px; + background-color: green; + color: aliceblue; + padding: 10px; border-radius: 6px; - outline: none; font-size: 17px; - font-weight: bold; -} - -@media screen and (max-width: 500px) { - .main-container { - width: 450px; - flex-wrap: wrap; - } + font-weight: 600; } From 8a5ba99f6afc434532c833ccba589f0849d14ab7 Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Sun, 4 Dec 2022 09:52:06 +0700 Subject: [PATCH 09/54] Update anime pics generator --- projects/amine-pics-generator/index.html | 21 +++++++ .../index.js | 15 +++-- .../spinner.svg | 2 +- projects/amine-pics-generator/style.css | 56 +++++++++++++++++ .../anime-pics-genrator/.vscode/settings.json | 3 - projects/anime-pics-genrator/index.html | 29 --------- projects/anime-pics-genrator/style.css | 57 ----------------- projects/currency-converter/index.html | 62 +++++++++--------- projects/currency-converter/index.js | 38 ++++++----- projects/currency-converter/style.css | 63 ++++++++----------- 10 files changed, 160 insertions(+), 186 deletions(-) create mode 100644 projects/amine-pics-generator/index.html rename projects/{anime-pics-genrator => amine-pics-generator}/index.js (63%) rename projects/{anime-pics-genrator => amine-pics-generator}/spinner.svg (89%) create mode 100644 projects/amine-pics-generator/style.css delete mode 100644 projects/anime-pics-genrator/.vscode/settings.json delete mode 100644 projects/anime-pics-genrator/index.html delete mode 100644 projects/anime-pics-genrator/style.css diff --git a/projects/amine-pics-generator/index.html b/projects/amine-pics-generator/index.html new file mode 100644 index 0000000..0cb6e43 --- /dev/null +++ b/projects/amine-pics-generator/index.html @@ -0,0 +1,21 @@ + + + + + + + Anime Pics Generator + + + +
+

Anime Pics Generator

+ +
+ +

Anime Name

+
+
+ + + \ No newline at end of file diff --git a/projects/anime-pics-genrator/index.js b/projects/amine-pics-generator/index.js similarity index 63% rename from projects/anime-pics-genrator/index.js rename to projects/amine-pics-generator/index.js index 55a158c..ab0dfe5 100644 --- a/projects/anime-pics-genrator/index.js +++ b/projects/amine-pics-generator/index.js @@ -1,26 +1,25 @@ const btnEl = document.getElementById("btn"); -const animeBoxEl = document.querySelector(".anime-container"); +const animeContainerEl = document.querySelector(".anime-container"); const animeImgEl = document.querySelector(".anime-img"); -const animeNameEl = document.querySelector(".anime-name"); +const amineNameEl = document.querySelector(".anime-name"); btnEl.addEventListener("click", async function () { try { btnEl.disabled = true; btnEl.innerText = "Loading..."; - animeNameEl.innerText = "Updating..."; + amineNameEl.innerText = "Updating..."; animeImgEl.src = "spinner.svg"; const response = await fetch("https://api.catboys.com/img"); const data = await response.json(); - animeImgEl.src = data.url; - - animeBoxEl.style.display = "block"; - animeNameEl.innerText = data.artist; btnEl.disabled = false; btnEl.innerText = "Get Anime"; + animeContainerEl.style.display = "block"; + animeImgEl.src = data.url; + amineNameEl.innerText = data.artist; } catch (error) { console.log(error); btnEl.disabled = false; btnEl.innerText = "Get Anime"; - animeNameEl.innerText = "An error happened, try again"; + amineNameEl.innerText = "An error happened, please try again"; } }); diff --git a/projects/anime-pics-genrator/spinner.svg b/projects/amine-pics-generator/spinner.svg similarity index 89% rename from projects/anime-pics-genrator/spinner.svg rename to projects/amine-pics-generator/spinner.svg index 0476499..fd9b80a 100644 --- a/projects/anime-pics-genrator/spinner.svg +++ b/projects/amine-pics-generator/spinner.svg @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/projects/amine-pics-generator/style.css b/projects/amine-pics-generator/style.css new file mode 100644 index 0000000..077c804 --- /dev/null +++ b/projects/amine-pics-generator/style.css @@ -0,0 +1,56 @@ +body{ + margin: 0; + background: linear-gradient(to right, lightblue, yellow); + display: flex; + height: 100vh; + justify-content: center; + align-items: center; + font-family: 'Courier New', Courier, monospace; +} + +.container{ + background: aliceblue; + border-radius: 10px; + box-shadow: 0 10px 20px rgba(0,0,0,0.3); + text-align: center; + padding: 10px; + width: 450px; + margin: 5px; +} + +.btn{ + background-color: green; + color: aliceblue; + padding: 10px 30px; + font-size: 16px; + margin-bottom: 30px; + border-radius: 6px; + cursor: pointer; + +} + +.btn:disabled{ + background-color: gray; + cursor: not-allowed; +} + +.anime-img{ + height: 300px; + width: 300px; + border-radius: 50%; + border: 3px solid green; +} + +.anime-name{ + margin: 20px; + background-color: green; + color: aliceblue; + padding: 10px; + border-radius: 6px; + font-size: 17px; + font-weight: 600; +} + +.anime-container{ + display: none; +} \ No newline at end of file diff --git a/projects/anime-pics-genrator/.vscode/settings.json b/projects/anime-pics-genrator/.vscode/settings.json deleted file mode 100644 index 6b665aa..0000000 --- a/projects/anime-pics-genrator/.vscode/settings.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "liveServer.settings.port": 5501 -} diff --git a/projects/anime-pics-genrator/index.html b/projects/anime-pics-genrator/index.html deleted file mode 100644 index 424dfd4..0000000 --- a/projects/anime-pics-genrator/index.html +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - Anime Pics Generator - - - - -
- -

Anime Pics Generator

- - - -
- - -

Anime Name

-
-
- - - diff --git a/projects/anime-pics-genrator/style.css b/projects/anime-pics-genrator/style.css deleted file mode 100644 index ee907a8..0000000 --- a/projects/anime-pics-genrator/style.css +++ /dev/null @@ -1,57 +0,0 @@ - -body { - margin: 0; - background: linear-gradient(to right, lightblue, yellow); - display: flex; - height: 100vh; - justify-content: center; - align-items: center; - font-family:'Courier New', Courier, monospace; -} - -.container { - background-color: aliceblue; - border-radius: 10px; - box-shadow: 0 10px 20px rgba(0, 0, 0, 0.3); - text-align: center; - padding: 10px; - width: 450px; - margin: 5px; -} - -.get-anime { - margin-bottom: 30px; - background-color: green; - color: aliceblue; - padding: 10px 30px; - border-radius: 6px; - font-size: 16px; - cursor: pointer; -} - -.get-anime:disabled{ - background-color: gray; - cursor: not-allowed; -} - -.anime-container { - /* display: none; */ - display: none; -} - -.anime-container img { - height: 300px; - width: 300px; - border-radius: 50%; - border: 3px solid green; -} - -.anime-name{ - margin: 20px; - background-color: green; - color: aliceblue; - padding: 10px; - border-radius: 6px; - font-size: 17px; - font-weight: 600; -} diff --git a/projects/currency-converter/index.html b/projects/currency-converter/index.html index 45f40ae..c3bc553 100644 --- a/projects/currency-converter/index.html +++ b/projects/currency-converter/index.html @@ -5,43 +5,37 @@ Currency Converter - + -
-

Currency Converter

- -
- - -
- - - -
- - +
+

Currency Converter

+
+ + +
+
+ + +
+

1 USD = 138.5802 JPY

- -

-
-
\ No newline at end of file diff --git a/projects/currency-converter/index.js b/projects/currency-converter/index.js index 585c669..7514ce1 100644 --- a/projects/currency-converter/index.js +++ b/projects/currency-converter/index.js @@ -1,27 +1,33 @@ -const exchangeRateEl = document.getElementById("exchange-rate"); const currencyFirstEl = document.getElementById("currency-first"); -const currencySecondEl = document.getElementById("currency-second"); + const worthFirstEl = document.getElementById("worth-first"); + +const currencySecondEl = document.getElementById("currency-second"); + const worthSecondEl = document.getElementById("worth-second"); -function convert() { - const currencyFirstValue = currencyFirstEl.value; - const currencySecondValue = currencySecondEl.value; - //using API for conversion of currency units +const exchangeRateEl = document.getElementById("exchange-rate"); + +updateRate() + +function updateRate() { fetch( - `https://v6.exchangerate-api.com/v6/5f9d1c87f7250159c9c9b17d/latest/${currencyFirstValue}` + `https://v6.exchangerate-api.com/v6/5f9d1c87f7250159c9c9b17d/latest/${currencyFirstEl.value}` ) .then((res) => res.json()) .then((data) => { - const rate = data.conversion_rates[currencySecondValue]; - exchangeRateEl.innerText = `1 ${currencyFirstValue} = ${rate} ${currencySecondValue}`; + const rate = data.conversion_rates[currencySecondEl.value]; + console.log(rate); + exchangeRateEl.innerText = `1 ${currencyFirstEl.value} = ${ + rate + " " + currencySecondEl.value + }`; - worthSecondEl.value = (worthFirstEl.value * rate).toFixed(2); + worthSecondEl.value = (worthFirstEl.value * rate).toFixed(2) }); } -//some javascript event listeners -currencyFirstEl.addEventListener("change", convert); -worthFirstEl.addEventListener("input", convert); -currencySecondEl.addEventListener("change", convert); -worthSecondEl.addEventListener("input", convert); -convert(); + +currencyFirstEl.addEventListener("change", updateRate); + +currencySecondEl.addEventListener("change", updateRate); + +worthFirstEl.addEventListener("input", updateRate); diff --git a/projects/currency-converter/style.css b/projects/currency-converter/style.css index b533d4e..eb02a2b 100644 --- a/projects/currency-converter/style.css +++ b/projects/currency-converter/style.css @@ -1,60 +1,47 @@ - -body { - - font-family:'Courier New', Courier, monospace; +body{ + background-color: yellow; display: flex; - flex-direction: column; - justify-content: center; height: 100vh; + justify-content: center; + align-items: center; + font-family: 'Courier New', Courier, monospace; margin: 0; padding: 0; - background: yellow; - align-items: center; - - } - +} - .main-box{ - background-color: darkcyan; +.container{ + background-color: darkcyan; color: aliceblue; + padding: 10px; border-radius: 5px; - padding:10px; - max-width: 600px; text-align: center; +} - } - - .currency { +.currency-container{ padding: 20px; display: flex; - align-items: center; justify-content: space-between; - } - - .currency select { +} + +.currency-container select{ padding: 10px; +} - } - - .currency input { - border:0px; +.currency-container input{ + border: 0; background: transparent; font-size: 25px; text-align: right; color: aliceblue; - } - - - - .exchange-rate { +} + +.exchange-rate{ font-size: 16px; - padding: 10px; font-weight: 600; - } - - select:focus, - input:focus { +} + +select:focus, +input:focus{ outline: 0; - } - \ No newline at end of file +} \ No newline at end of file From 47a76ff4a5ec12e920717dc3afb4191ddbae8e6b Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Sun, 11 Dec 2022 07:51:36 +0700 Subject: [PATCH 10/54] update the photo api project --- .../cat-api/45_Chatting_app/client/index.html | 91 --- .../cat-api/45_Chatting_app/client/index.js | 152 ----- .../45_Chatting_app/client/message.mp3 | Bin 24794 -> 0 bytes .../45_Chatting_app/client/package-lock.json | 114 ---- .../45_Chatting_app/client/package.json | 14 - .../cat-api/45_Chatting_app/client/styles.css | 419 ------------ .../cat-api/45_Chatting_app/server/Procfile | 1 - .../45_Chatting_app/server/package-lock.json | 621 ------------------ .../45_Chatting_app/server/package.json | 18 - .../cat-api/45_Chatting_app/server/server.js | 62 -- projects/cat-api/46_image_slider/app.js | 158 ----- projects/cat-api/46_image_slider/index.html | 130 ---- projects/cat-api/46_image_slider/style.css | 337 ---------- projects/cat-api/app.js | 30 - projects/cat-api/index.html | 40 +- projects/cat-api/index.js | 53 ++ projects/cat-api/spinner.svg | 6 + projects/cat-api/styles.css | 95 +-- 18 files changed, 123 insertions(+), 2218 deletions(-) delete mode 100644 projects/cat-api/45_Chatting_app/client/index.html delete mode 100644 projects/cat-api/45_Chatting_app/client/index.js delete mode 100644 projects/cat-api/45_Chatting_app/client/message.mp3 delete mode 100644 projects/cat-api/45_Chatting_app/client/package-lock.json delete mode 100644 projects/cat-api/45_Chatting_app/client/package.json delete mode 100644 projects/cat-api/45_Chatting_app/client/styles.css delete mode 100644 projects/cat-api/45_Chatting_app/server/Procfile delete mode 100644 projects/cat-api/45_Chatting_app/server/package-lock.json delete mode 100644 projects/cat-api/45_Chatting_app/server/package.json delete mode 100644 projects/cat-api/45_Chatting_app/server/server.js delete mode 100644 projects/cat-api/46_image_slider/app.js delete mode 100644 projects/cat-api/46_image_slider/index.html delete mode 100644 projects/cat-api/46_image_slider/style.css delete mode 100644 projects/cat-api/app.js create mode 100644 projects/cat-api/index.js create mode 100644 projects/cat-api/spinner.svg diff --git a/projects/cat-api/45_Chatting_app/client/index.html b/projects/cat-api/45_Chatting_app/client/index.html deleted file mode 100644 index 1b66ec2..0000000 --- a/projects/cat-api/45_Chatting_app/client/index.html +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - Warta - Chatting App - - -
-

Warta App

-
-
-
- - - - - -
- -
- -
- - -
-
-
-
-

Warta App

-

-
- -
-
-
- - -
-
- - -
-
-
-
- - - - - - - - \ No newline at end of file diff --git a/projects/cat-api/45_Chatting_app/client/index.js b/projects/cat-api/45_Chatting_app/client/index.js deleted file mode 100644 index 1fc3df3..0000000 --- a/projects/cat-api/45_Chatting_app/client/index.js +++ /dev/null @@ -1,152 +0,0 @@ -// import {io} from "./node_modules/socket.io-client"; -//const io = require('socket.io-client'); - -var name1, room; -//var nameArray = []; - - - -function viewSelection(){ - - name1 = document.querySelector("#name").value; - room = document.querySelector("#roomC").value; - - if(name1 === '') { - alert("Name cannot be empty"); - return false; - } - else if(room === ''){ - alert("Please provide a room name"); - return false; - } - document.body.style.background = "#efe7dd url('https://cloud.githubusercontent.com/assets/398893/15136779/4e765036-1639-11e6-9201-67e728e86f39.jpg') repeat"; - - - const form = document.getElementById("form-container"); - const messageInput = document.querySelector(".input-msg"); - const messageContainer = document.querySelector(".conversation-container"); - - const appendCopyright = (message) => { - - const messageElement = document.createElement('div'); - messageElement.innerText = message; - messageElement.classList.add('otherCopyright'); - messageContainer.append(messageElement); - try{ - new Audio('message.mp3').play(); - } - catch(err){ - new Audio('message.mp3').play(); - - } - - } - appendCopyright("Copyright © Akhil Choubey"); - - if(document.querySelector("#create-room").checked){ - alert(`Share following details with your chatmates\r\n ----------------------------------------------- \r\n Website link : https://akhil-warta.netlify.app \r\n Room name : ${room}`); - // appendCopyright("You created this room"); - // nameArray.push(name1); - } - - //console.log(nameArray); - document.querySelector(".chat").style.display = 'block'; - document.querySelector(".new-room").style.display = 'none'; - - document.querySelector(".status-bar h4").innerText = `Room Name : ${room}`; - // const socket = io("http://localhost:8000"); - const socket = io("https://guarded-falls-33664.herokuapp.com/"); - - -const append = (message) => { - - //if(document.querySelector("#join-room").checked){ - // appendCopyright(`${cruator} created this room`); - //} - const messageElement = document.createElement('div'); - messageElement.innerText = message; - messageElement.classList.add('other'); - messageContainer.append(messageElement); - try{ - new Audio('message.mp3').play(); - } - catch(err){ - new Audio('message.mp3').play(); - - } - -} - -const appendSend = (message) => { - const messageElement = document.createElement('div'); - messageElement.innerText = message; - messageElement.classList.add('message'); - messageElement.classList.add('sent'); - messageContainer.append(messageElement); -} - -const appendRecieved = (message, name) => { - - - const messageElement = document.createElement('div'); - messageElement.classList.add('message'); - messageElement.classList.add('received'); - - const Name = document.createElement('h1'); - Name.classList.add('person'); - Name.innerText= name; - - const randomColor =((1<<24)*Math.random() | 0).toString(16) - if(randomColor[0] === "0") randomColor = "800080"; - const color = "#"+randomColor; - - messageElement.innerHTML+=`

${name}

- ${message}`; - - //messageElement.innerText = message; - messageContainer.append(messageElement); - - try{ - new Audio('message.mp3').play(); - } - catch(err){ - new Audio('message.mp3').play(); - - } -} - -form.addEventListener('submit', (e)=>{ - e.preventDefault(); - const message = messageInput.value; - appendSend(`${message}`); - socket.emit('send', message, room); - messageInput.value = ''; -}); - -socket.emit("new-user-joined" , name1, room); -socket.emit("room" , room); -//var curator = 0; -//if(document.querySelector("#join-room").checked) { - // curator = 1; -//} -socket.on('user-joined', (name1) =>{ - append(`${name1} joined` ); //, data.creator); - - // appendCopyright(`${data.creator} created this room`); - -}); - - -socket.on('leave', (data) =>{ - append(`${data.name1} left`); -}); - -socket.on('receive', (data) =>{ - appendRecieved(`${data.message}`,`${data.name1}`); -}); - - - - - -} \ No newline at end of file diff --git a/projects/cat-api/45_Chatting_app/client/message.mp3 b/projects/cat-api/45_Chatting_app/client/message.mp3 deleted file mode 100644 index 049cfa88aea4bbee112318efaae22d0167ddf052..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24794 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 diff --git a/projects/cat-api/45_Chatting_app/client/package-lock.json b/projects/cat-api/45_Chatting_app/client/package-lock.json deleted file mode 100644 index a219e4d..0000000 --- a/projects/cat-api/45_Chatting_app/client/package-lock.json +++ /dev/null @@ -1,114 +0,0 @@ -{ - "name": "frontend", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@types/component-emitter": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz", - "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg==" - }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" - }, - "base64-arraybuffer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", - "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=" - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" - }, - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "requires": { - "ms": "2.1.2" - } - }, - "engine.io-client": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-5.1.2.tgz", - "integrity": "sha512-blRrgXIE0A/eurWXRzvfCLG7uUFJqfTGFsyJzXSK71srMMGJ2VraBLg8Mdw28uUxSpVicepBN9X7asqpD1mZcQ==", - "requires": { - "base64-arraybuffer": "0.1.4", - "component-emitter": "~1.3.0", - "debug": "~4.3.1", - "engine.io-parser": "~4.0.1", - "has-cors": "1.1.0", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "ws": "~7.4.2", - "yeast": "0.1.2" - } - }, - "engine.io-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.2.tgz", - "integrity": "sha512-sHfEQv6nmtJrq6TKuIz5kyEKH/qSdK56H/A+7DnAuUPWosnIZAS2NHNcPLmyjtY3cGS/MqJdZbUjW97JU72iYg==", - "requires": { - "base64-arraybuffer": "0.1.4" - } - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "parseqs": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", - "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==" - }, - "parseuri": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", - "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==" - }, - "socket.io-client": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.1.3.tgz", - "integrity": "sha512-hISFn6PDpgDifVUiNklLHVPTMv1LAk8poHArfIUdXa+gKgbr0MZbAlquDFqCqsF30yBqa+jg42wgos2FK50BHA==", - "requires": { - "@types/component-emitter": "^1.2.10", - "backo2": "~1.0.2", - "component-emitter": "~1.3.0", - "debug": "~4.3.1", - "engine.io-client": "~5.1.2", - "parseuri": "0.0.6", - "socket.io-parser": "~4.0.4" - } - }, - "socket.io-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", - "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", - "requires": { - "@types/component-emitter": "^1.2.10", - "component-emitter": "~1.3.0", - "debug": "~4.3.1" - } - }, - "ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==" - }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" - } - } -} diff --git a/projects/cat-api/45_Chatting_app/client/package.json b/projects/cat-api/45_Chatting_app/client/package.json deleted file mode 100644 index db3506f..0000000 --- a/projects/cat-api/45_Chatting_app/client/package.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "frontend", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "", - "license": "ISC", - "dependencies": { - "socket.io-client": "^4.1.3" - } -} diff --git a/projects/cat-api/45_Chatting_app/client/styles.css b/projects/cat-api/45_Chatting_app/client/styles.css deleted file mode 100644 index e0b84a4..0000000 --- a/projects/cat-api/45_Chatting_app/client/styles.css +++ /dev/null @@ -1,419 +0,0 @@ -*, *:before, *:after { - box-sizing: inherit; -} - -html { - box-sizing: border-box; - height: 100%; - margin: 0; - padding: 0; -} - -body { - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - font-family: "Roboto", sans-serif; - margin: 0; - padding: 0; - height: 100%; - background: #50a3a2; /* url("https://cloud.githubusercontent.com/assets/398893/15136779/4e765036-1639-11e6-9201-67e728e86f39.jpg") repeat; */ - -} - -/* room form styles */ -.new-room h1{ - margin: 0% auto; - padding-top: 80px; - text-align: center; - top: 27%; - font-size: 40px; - font-weight: 200; - color:white; -} - -#createForm { - padding-top: 20px; - top: 30%; - position: relative; - display: block; -} -#name, #roomC{ - border: 1px solid white;/* rgba(0,78,69,0.4); rgba(252, 252, 252, 0.4); */ - background-color: rgba(252, 252, 252, 0.2); - width: 250px; - border-radius: 3px; - font-family: "Source Sans Pro", sans-serif; - padding: 10px 15px; - margin: 0 auto 10px auto; - display: block; - text-align: center; - font-size: 18px; - color: white; - font-weight: 300; -} -.radio { - display: flex; - margin-bottom: 5px; -} - - -.button-submit { - display: block; - appearance: none; - outline: 0; - background-color: white; - border: 0; - padding: 10px 15px; - margin: 0 auto 10px auto; - color: #50a3a2; - border-radius: 3px; - width: 250px; - font-size: 18px; -} - -.choose { - margin-left: 40%; - display: flex; -} - -#roomC{ - visibility: hidden; -} - -.lableCreate{ -color: white; padding-top: 4px; -} -.lableJoin{ -color: white; padding-top: 4px; -} - - -/* status bar */ -.status-room { -width:70%; -text-align: right; -} - -.status-bar { - height: 57px; - background: #004e45; - color: #fff; - font-size: 24px; - padding: 0 8px; - text-align: center; -} -h2{ - margin: 0; -} -h4{ - margin: 0; - font-size: 12px; -} -.copyright{ - color:rgb(158, 157, 152); - font-size: 11px; - margin: 0; -} - -.status-bar:after { - content: ""; - display: table; - clear: both; -} - -/* .status-bar div { - float: right; - position: fixed; - top: 50%; - transform: translateY(-50%); - margin: 0 0 0 8px; - font-weight: 600; -} */ -.choose{ -width: 2%; -height: 20px; -} - -/* chat container styling */ -.chat { - height: calc(79%); - display: none; -} - -.chat-container { - height: 100%; -} - -.conversation { - height: calc(100%); - position: relative; - z-index: 0; -} - -.conversation ::-webkit-scrollbar { - transition: all .5s; - width: 5px; - height: 1px; - z-index: 10; -} - -.conversation ::-webkit-scrollbar-track { - background: transparent; -} - -.conversation ::-webkit-scrollbar-thumb { - background: #b3ada7; -} - -.conversation .conversation-container { - height: calc(100%); - box-shadow: inset 0 10px 10px -10px #000000; - overflow-x: hidden; - padding: 0 16px; - /* margin-bottom: 5px; */ -} - -.conversation .conversation-container:after { - content: ""; - display: table; - clear: both; -} - -/* Messages */ - -.message { - color: #000; - clear: both; - line-height: 18px; - font-size: 15px; - padding: 8px; - position: relative; - margin: 8px 0; - max-width: 85%; - word-wrap: break-word; - z-index: -1; -} - -.person{ - background-color: none; - color:blue; - margin: 0; - font-size: 15px; - position: relative; -} - -.message:after { - position: absolute; - content: ""; - width: 0; - height: 0; - border-style: solid; -} -.message:first-child { - margin: 16px 0 8px; -} - -.message.received { - background: #fff; - border-radius: 0px 5px 5px 5px; - float: left; -} -.message.received:after { - border-width: 0px 10px 10px 0; - border-color: transparent #fff transparent transparent; - top: 0; - left: -10px; -} -.message.sent { - background: #e1ffc7; - border-radius: 5px 0px 5px 5px; - float: right; -} - -.message.sent:after { - border-width: 0px 0 10px 10px; - border-color: transparent transparent transparent #e1ffc7; - top: 0; - right: -10px; -} - -.other{ -color: rgb(141, 136, 136); -clear: both; -line-height: 18px; -font-size: 15px; -padding: 8px; -position: relative; -margin: 8px 3px; -word-wrap: break-word; -z-index: -1; -background-color: rgb(187, 224, 224); -max-width: 85%; -/* line-height: 21px; */ -text-align: center; -width:8rem; -display: block; -margin: auto; -border-radius: 4rem; -margin-top: 4px; -margin-bottom: 4px; -} -/* form styling */ -.conversation-compose { - display: flex; - flex-direction: row; - align-items: flex-end; - overflow: hidden; - height: 50px; - width: 100%; - z-index: 2; - position: sticky; - top: 88%; - -} - -#form-container{ - display: block; - margin: auto; - text-align: center; - width: 100%; -} - -input { - background: #fff; - height: 100%; - width: 91%; - border-radius: 4rem; - -} - -.input-msg { - border: 0; - flex: 1 1 auto; - font-size: 16px; - margin: 0; - outline: none; - min-width: 50px; - padding: 17px; - height: 48px; - border: #000; - border-width: 2px; -} -.send { - background: transparent; - border: 0; - cursor: pointer; - flex: 0 0 auto; - margin-left: 8px; - margin-right: 8px; - - padding: 0; - position: relative; - outline: none; -} - -.send .circle { - background: #008a7c; - border-radius: 50%; - color: #fff; - position: relative; - width: 48px; - height: 48px; - - display: flex; - align-items: center; - justify-content: center; -} - -.send .circle .iconify { - font-size: 44px; - height: 20px; - - margin-left: 5px; -} - -.otherCopyright{ - color: rgb(141, 136, 136); - clear: both; - line-height: 18px; - font-size: 15px; - padding: 8px; - position: relative; - margin: 8px 3px; - word-wrap: break-word; - z-index: -1; - background-color: rgb(187, 224, 224); - max-width: 85%; - /* line-height: 21px; */ - text-align: center; - width:13rem; - display: block; - margin: auto; - border-radius: 9px; - margin-top: 4px; - margin-bottom: 4px; - } - - - - -@media (max-width: 768px) { - h4{ - font-size: 11px; - } - - .status-bar { - height: 47px; - font-size: 18px; - padding: 0 8px; - text-align: center; - } - .copyright{ - font-size: 8px; - } - input { - width: 77%; - } - .chat { - height: calc(81%); - } - .other{ - line-height:8px; - font-size: 10px; - width:6rem; - } - .otherCopyright{ - line-height:8px; - font-size: 10px; - width:9rem; - } - .radio { - margin-right: 11%; - font-size: 19px; - } - .choose { - width: 25px; - height: 46px; - - } - #create-room { - margin-left: 17%; - } - #join-room { - margin-left: 3%; - } - .lableCreate { - color: white; - padding-top: 14px; - margin-left: 0; - width: 168px; - } - .lableJoin { - color: white; - padding-top: 14px; - width: 143px; - } -} - - - diff --git a/projects/cat-api/45_Chatting_app/server/Procfile b/projects/cat-api/45_Chatting_app/server/Procfile deleted file mode 100644 index 9c4dee9..0000000 --- a/projects/cat-api/45_Chatting_app/server/Procfile +++ /dev/null @@ -1 +0,0 @@ -node server.js \ No newline at end of file diff --git a/projects/cat-api/45_Chatting_app/server/package-lock.json b/projects/cat-api/45_Chatting_app/server/package-lock.json deleted file mode 100644 index e31cdb6..0000000 --- a/projects/cat-api/45_Chatting_app/server/package-lock.json +++ /dev/null @@ -1,621 +0,0 @@ -{ - "name": "backend", - "version": "1.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@types/component-emitter": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz", - "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg==" - }, - "@types/cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" - }, - "@types/cors": { - "version": "2.8.12", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", - "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==" - }, - "@types/node": { - "version": "16.4.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.4.13.tgz", - "integrity": "sha512-bLL69sKtd25w7p1nvg9pigE4gtKVpGTPojBFLMkGHXuUgap2sLqQt2qUnqmVCDfzGUL0DRNZP+1prIZJbMeAXg==" - }, - "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", - "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" - } - }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" - }, - "backo2": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", - "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" - }, - "base64-arraybuffer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", - "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=" - }, - "base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" - }, - "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", - "requires": { - "bytes": "3.1.0", - "content-type": "~1.0.4", - "debug": "2.6.9", - "depd": "~1.1.2", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" - } - }, - "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" - }, - "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "requires": { - "safe-buffer": "5.1.2" - } - }, - "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" - }, - "cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" - }, - "cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" - }, - "cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "requires": { - "object-assign": "^4", - "vary": "^1" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" - }, - "destroy": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" - }, - "ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" - }, - "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" - }, - "engine.io": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-5.1.1.tgz", - "integrity": "sha512-aMWot7H5aC8L4/T8qMYbLdvKlZOdJTH54FxfdFunTGvhMx1BHkJOntWArsVfgAZVwAO9LC2sryPWRcEeUzCe5w==", - "requires": { - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.4.1", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~4.0.0", - "ws": "~7.4.2" - }, - "dependencies": { - "cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" - }, - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "engine.io-client": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-5.1.2.tgz", - "integrity": "sha512-blRrgXIE0A/eurWXRzvfCLG7uUFJqfTGFsyJzXSK71srMMGJ2VraBLg8Mdw28uUxSpVicepBN9X7asqpD1mZcQ==", - "requires": { - "base64-arraybuffer": "0.1.4", - "component-emitter": "~1.3.0", - "debug": "~4.3.1", - "engine.io-parser": "~4.0.1", - "has-cors": "1.1.0", - "parseqs": "0.0.6", - "parseuri": "0.0.6", - "ws": "~7.4.2", - "yeast": "0.1.2" - }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "engine.io-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.2.tgz", - "integrity": "sha512-sHfEQv6nmtJrq6TKuIz5kyEKH/qSdK56H/A+7DnAuUPWosnIZAS2NHNcPLmyjtY3cGS/MqJdZbUjW97JU72iYg==", - "requires": { - "base64-arraybuffer": "0.1.4" - } - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" - }, - "etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" - }, - "express": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", - "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", - "requires": { - "accepts": "~1.3.7", - "array-flatten": "1.1.1", - "body-parser": "1.19.0", - "content-disposition": "0.5.3", - "content-type": "~1.0.4", - "cookie": "0.4.0", - "cookie-signature": "1.0.6", - "debug": "2.6.9", - "depd": "~1.1.2", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "finalhandler": "~1.1.2", - "fresh": "0.5.2", - "merge-descriptors": "1.0.1", - "methods": "~1.1.2", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", - "proxy-addr": "~2.0.5", - "qs": "6.7.0", - "range-parser": "~1.2.1", - "safe-buffer": "5.1.2", - "send": "0.17.1", - "serve-static": "1.14.1", - "setprototypeof": "1.1.1", - "statuses": "~1.5.0", - "type-is": "~1.6.18", - "utils-merge": "1.0.1", - "vary": "~1.1.2" - } - }, - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - } - }, - "forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" - }, - "fresh": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" - }, - "has-cors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", - "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" - }, - "http": { - "version": "0.0.1-security", - "resolved": "https://registry.npmjs.org/http/-/http-0.0.1-security.tgz", - "integrity": "sha512-RnDvP10Ty9FxqOtPZuxtebw1j4L/WiqNMDtuc1YMH1XQm5TgDRaR1G9u8upL6KD1bXHSp9eSXo/ED+8Q7FAr+g==" - }, - "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "requires": { - "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - } - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" - }, - "media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" - }, - "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" - }, - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" - }, - "mime-db": { - "version": "1.49.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", - "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==" - }, - "mime-types": { - "version": "2.1.32", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", - "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", - "requires": { - "mime-db": "1.49.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", - "requires": { - "ee-first": "1.1.1" - } - }, - "parseqs": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", - "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==" - }, - "parseuri": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", - "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==" - }, - "parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" - }, - "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" - }, - "proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "requires": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - } - }, - "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" - }, - "range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" - }, - "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", - "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "send": { - "version": "0.17.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", - "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "requires": { - "debug": "2.6.9", - "depd": "~1.1.2", - "destroy": "~1.0.4", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "etag": "~1.8.1", - "fresh": "0.5.2", - "http-errors": "~1.7.2", - "mime": "1.6.0", - "ms": "2.1.1", - "on-finished": "~2.3.0", - "range-parser": "~1.2.1", - "statuses": "~1.5.0" - }, - "dependencies": { - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" - } - } - }, - "serve-static": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", - "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", - "requires": { - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "parseurl": "~1.3.3", - "send": "0.17.1" - } - }, - "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" - }, - "socket.io": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.1.3.tgz", - "integrity": "sha512-tLkaY13RcO4nIRh1K2hT5iuotfTaIQw7cVIe0FUykN3SuQi0cm7ALxuyT5/CtDswOMWUzMGTibxYNx/gU7In+Q==", - "requires": { - "@types/cookie": "^0.4.0", - "@types/cors": "^2.8.10", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "debug": "~4.3.1", - "engine.io": "~5.1.1", - "socket.io-adapter": "~2.3.1", - "socket.io-parser": "~4.0.4" - }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "socket.io-adapter": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.1.tgz", - "integrity": "sha512-8cVkRxI8Nt2wadkY6u60Y4rpW3ejA1rxgcK2JuyIhmF+RMNpTy1QRtkHIDUOf3B4HlQwakMsWbKftMv/71VMmw==" - }, - "socket.io-client": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.1.3.tgz", - "integrity": "sha512-hISFn6PDpgDifVUiNklLHVPTMv1LAk8poHArfIUdXa+gKgbr0MZbAlquDFqCqsF30yBqa+jg42wgos2FK50BHA==", - "requires": { - "@types/component-emitter": "^1.2.10", - "backo2": "~1.0.2", - "component-emitter": "~1.3.0", - "debug": "~4.3.1", - "engine.io-client": "~5.1.2", - "parseuri": "0.0.6", - "socket.io-parser": "~4.0.4" - }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "socket.io-parser": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", - "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", - "requires": { - "@types/component-emitter": "^1.2.10", - "component-emitter": "~1.3.0", - "debug": "~4.3.1" - }, - "dependencies": { - "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", - "requires": { - "ms": "2.1.2" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - } - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" - }, - "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" - }, - "type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "requires": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - } - }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" - }, - "utils-merge": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" - }, - "vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" - }, - "ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==" - }, - "yeast": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", - "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" - } - } -} diff --git a/projects/cat-api/45_Chatting_app/server/package.json b/projects/cat-api/45_Chatting_app/server/package.json deleted file mode 100644 index b7aad51..0000000 --- a/projects/cat-api/45_Chatting_app/server/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "backend", - "version": "1.0.0", - "description": "", - "main": "server.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "", - "license": "ISC", - "dependencies": { - "cors": "^2.8.5", - "express": "^4.17.1", - "http": "0.0.1-security", - "socket.io": "^4.1.3", - "socket.io-client": "^4.1.3" - } -} diff --git a/projects/cat-api/45_Chatting_app/server/server.js b/projects/cat-api/45_Chatting_app/server/server.js deleted file mode 100644 index 365fa16..0000000 --- a/projects/cat-api/45_Chatting_app/server/server.js +++ /dev/null @@ -1,62 +0,0 @@ - -var express = require('express'); -var http = require('http'); - -var app = express(); -var server = http.createServer(app).listen(process.env.PORT || 8000);; -var cors = require('cors'); -app.use(cors({origin: 'https://akhil-warta.netlify.app'})); -const io = require('socket.io')(server,{ - cors: { - origin: 'https://akhil-warta.netlify.app' - // origin: 'http://127.0.0.1:5500' - // header: ('Access-Control-Allow-Origin', "*") - } -}); - -// const users = {}; - -// io.on("connection", socket =>{ -// // console.log("New user" ,socket.id); -// socket.on('new-user-joined', name1 =>{ -// console.log('New user', name1); -// users[socket.id] = name1; -// socket.broadcast.emit('user-joined' , name1); -// }); - -// socket.on('send', message =>{ -// socket.broadcast.emit('receive',{message: message, name1: users[socket.id]}); -// }); -// socket.on('disconnect', message =>{ -// socket.broadcast.emit('leave',{message: message, name1: users[socket.id]}); -// delete users[socket.id]; -// }); - -// }); - -const users = {}; -//const userName = []; -io.on("connection", socket =>{ - // console.log("New user" ,socket.id); - - socket.on('new-user-joined', (name1, room) =>{ - - //userName.push(name1); - socket.join(room); - console.log('New user', name1); - users[socket.id] = name1; - socket.to(room).emit('user-joined' , name1); // {name1, creator:userName[0]}); - }); - - socket.on('send', (message, room) =>{ - socket.to(room).emit('receive',{message: message, name1: users[socket.id]}); - }); - socket.on("room" , (room) =>{ - socket.on('disconnect', () =>{ - socket.to(room).emit('leave',{ name1: users[socket.id]}); - delete users[socket.id]; - }); -}) - - -}); diff --git a/projects/cat-api/46_image_slider/app.js b/projects/cat-api/46_image_slider/app.js deleted file mode 100644 index 209dc7d..0000000 --- a/projects/cat-api/46_image_slider/app.js +++ /dev/null @@ -1,158 +0,0 @@ -// Slider(all Slides in a container) -const slider = document.querySelector('.slider'); -// All trails -const trail = document.querySelector('.trail').querySelectorAll('div'); - -// Transform value -let value = 0; -// trail index number -let trailValue = 0; -// interval (Duration) -let interval = 4000; - -// Function to slide forward -const slide = (condition) => { - // CLear interval - clearInterval(start); - // update value and trailValue - condition === 'increase' ? initiateINC() : initiateDEC(); - // move slide - move(value, trailValue); - // Restart Animation - animate(); - // start interal for slides back - start = setInterval(() => slide('increase'), interval); -}; - -// function for increase(forward, next) configuration -const initiateINC = () => { - // Remove active from all trails - trail.forEach((cur) => cur.classList.remove('active')); - // increase transform value - value === 80 ? (value = 0) : (value += 20); - // update trailValue based on value - trailUpdate(); -}; - -// function for decrease(backward, previous) configuration -const initiateDEC = () => { - // Remove active from all trails - trail.forEach((cur) => cur.classList.remove('active')); - // decrease transform value - value === 0 ? (value = 80) : (value -= 20); - // update trailValue based on value - trailUpdate(); -}; - -// function to transform slide -const move = (S, T) => { - // transform slider - slider.style.transform = `translateX(-${S}%)`; - //add active class to the current trail - trail[T].classList.add('active'); -}; - -const tl = gsap.timeline({ defaults: { duration: 0.6, ease: 'power2.inOut' } }); -tl.from('.bg', { x: '-100%', opacity: 0 }) - .from('p', { opacity: 0 }, '-=0.3') - .from('h1', { opacity: 0, y: '30px' }, '-=0.3') - .from('button', { opacity: 0, y: '-40px' }, '-=0.8'); - -// function to restart animation -const animate = () => tl.restart(); - -// function to update trailValue based on slide value -const trailUpdate = () => { - if (value === 0) { - trailValue = 0; - } else if (value === 20) { - trailValue = 1; - } else if (value === 40) { - trailValue = 2; - } else if (value === 60) { - trailValue = 3; - } else { - trailValue = 4; - } -}; - -// Start interval for slides -let start = setInterval(() => slide('increase'), interval); - -// Next and Previous button function (SVG icon with different classes) -document.querySelectorAll('svg').forEach((cur) => { - // Assign function based on the class Name("next" and "prev") - cur.addEventListener('click', () => - cur.classList.contains('next') ? slide('increase') : slide('decrease') - ); -}); - -// function to slide when trail is clicked -const clickCheck = (e) => { - // CLear interval - clearInterval(start); - // remove active class from all trails - trail.forEach((cur) => cur.classList.remove('active')); - // Get selected trail - const check = e.target; - // add active class - check.classList.add('active'); - - // Update slide value based on the selected trail - if (check.classList.contains('box1')) { - value = 0; - } else if (check.classList.contains('box2')) { - value = 20; - } else if (check.classList.contains('box3')) { - value = 40; - } else if (check.classList.contains('box4')) { - value = 60; - } else { - value = 80; - } - // update trail based on value - trailUpdate(); - // transfrom slide - move(value, trailValue); - // start animation - animate(); - // start interval - start = setInterval(() => slide('increase'), interval); -}; - -// Add function to all trails -trail.forEach((cur) => cur.addEventListener('click', (ev) => clickCheck(ev))); - -// Mobile touch Slide Section -const touchSlide = (() => { - let start, move, change, sliderWidth; - - // Do this on initial touch on screen - slider.addEventListener('touchstart', (e) => { - // get the touche position of X on the screen - start = e.touches[0].clientX; - // (each slide with) the width of the slider container divided by the number of slides - sliderWidth = slider.clientWidth / trail.length; - }); - - // Do this on touchDrag on screen - slider.addEventListener('touchmove', (e) => { - // prevent default function - e.preventDefault(); - // get the touche position of X on the screen when dragging stops - move = e.touches[0].clientX; - // Subtract initial position from end position and save to change variabla - change = start - move; - }); - - const mobile = (e) => { - // if change is greater than a quarter of sliderWidth, next else Do NOTHING - change > sliderWidth / 4 ? slide('increase') : null; - // if change * -1 is greater than a quarter of sliderWidth, prev else Do NOTHING - change * -1 > sliderWidth / 4 ? slide('decrease') : null; - // reset all variable to 0 - [start, move, change, sliderWidth] = [0, 0, 0, 0]; - }; - // call mobile on touch end - slider.addEventListener('touchend', mobile); -})(); diff --git a/projects/cat-api/46_image_slider/index.html b/projects/cat-api/46_image_slider/index.html deleted file mode 100644 index 44196e5..0000000 --- a/projects/cat-api/46_image_slider/index.html +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - - Image Slider - - -
-
-
-
-
-

I'm the first Box

-

- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer - lacinia dui lectus. Donec scelerisque ipsum diam, ac mattis orci - pellentesque eget. -

- -
- -
-
- -
-
-
-

I'm the second Box

-

- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer - lacinia dui lectus. Donec scelerisque ipsum diam, ac mattis orci - pellentesque eget. -

- -
- -
-
- -
-
-
-

I'm the third Box

-

- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer - lacinia dui lectus. Donec scelerisque ipsum diam, ac mattis orci - pellentesque eget. -

- -
- -
-
- -
-
-
-

I'm the fourth Box

-

- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer - lacinia dui lectus. Donec scelerisque ipsum diam, ac mattis orci - pellentesque eget. -

- -
- -
-
- -
-
-
-

I'm the fifth Box

-

- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer - lacinia dui lectus. Donec scelerisque ipsum diam, ac mattis orci - pellentesque eget. -

- -
- -
-
-
- - - - - - - -
-
1
-
2
-
3
-
4
-
5
-
-
- - - - - - - diff --git a/projects/cat-api/46_image_slider/style.css b/projects/cat-api/46_image_slider/style.css deleted file mode 100644 index dbdcaa4..0000000 --- a/projects/cat-api/46_image_slider/style.css +++ /dev/null @@ -1,337 +0,0 @@ -*, -*:before, -*:after { - margin: 0; - padding: 0; - box-sizing: inherit; -} - -html { - box-sizing: border-box; - font-family: "Roboto", sans-serif; - font-size: 62.5%; -} -@media only screen and (max-width: 800px) { - html { - font-size: 57%; - } -} - -body { - background-color: #000; - color: #fff; - padding: 8rem; -} -@media only screen and (max-width: 1000px) { - body { - padding: 0; - } -} - -.container { - position: relative; - overflow: hidden; - border-radius: 5rem; -} -@media only screen and (max-width: 1000px) { - .container { - border-radius: 0; - } -} - -.slider { - display: flex; - width: 500%; - height: 55rem; - transition: all 0.25s ease-in; - transform: translateX(0); -} -@media only screen and (max-width: 1000px) { - .slider { - height: 100vh; - } -} -.slider .box { - height: 100%; - width: 100%; - display: grid; - grid-template-columns: repeat(2, 1fr); - align-items: center; - overflow: hidden; - position: relative; -} -@media only screen and (max-width: 650px) { - .slider .box { - grid-template-columns: 1fr; - grid-template-rows: repeat(2, 1fr); - } -} -.slider .box .bg { - padding: 2rem; - background-color: rgba(0, 0, 0, 0.2); - width: 55%; - transform: skewX(7deg); - position: absolute; - height: 100%; - left: -10%; - padding-left: 20rem; - transform-origin: 0 100%; -} -@media only screen and (max-width: 800px) { - .slider .box .bg { - width: 65%; - } -} -@media only screen and (max-width: 650px) { - .slider .box .bg { - width: 100%; - left: 0; - bottom: 0; - height: 54%; - transform: skewX(0deg); - } -} -.slider .box .bg::before { - content: ""; - width: 100%; - height: 100%; - position: absolute; - left: 0; - top: 0; - background-color: inherit; - pointer-events: none; - transform: skewX(10deg); -} -@media only screen and (max-width: 650px) { - .slider .box .bg::before { - width: 120%; - bottom: 0; - transform: skewX(0deg); - } -} -.slider .box .details { - padding: 5rem; - padding-left: 10rem; - z-index: 100; - grid-column: 1/span 1; - grid-row: 1/-1; -} -@media only screen and (max-width: 650px) { - .slider .box .details { - grid-row: 2/span 1; - grid-column: 1/-1; - text-align: center; - padding: 2rem; - transform: translateY(-9rem); - } -} -.slider .box .details h1 { - font-size: 3.5rem; - font-weight: 500; - margin-bottom: 0.5rem; -} -.slider .box .details p { - display: inline-block; - font-size: 1.3rem; - color: #b5b4b4; - margin-bottom: 2rem; - margin-right: 5rem; -} -@media only screen and (max-width: 800px) { - .slider .box .details p { - margin-right: 0; - } -} -.slider .box .details button { - padding: 1rem 3rem; - color: #fff; - border-radius: 2rem; - outline: none; - border: none; - cursor: pointer; - transition: all 0.3s ease; -} -.slider .box .details button:hover { - opacity: 0.8; -} -.slider .box .details button:focus { - outline: none; - border: none; -} -.slider .box1 { - background-color: #500033; -} -.slider .box1 .illustration .inner { - background-color: #ff0077; -} -.slider .box1 .illustration .inner::after, .slider .box1 .illustration .inner::before { - background-color: rgba(255, 0, 119, 0.4); -} -.slider .box1 button { - background-color: #ff0077; -} -.slider .box2 { - background-color: #000050; -} -.slider .box2 .illustration .inner { - background-color: #0033ff; -} -.slider .box2 .illustration .inner::after, .slider .box2 .illustration .inner::before { - background-color: rgba(0, 51, 255, 0.4); -} -.slider .box2 button { - background-color: #0033ff; -} -.slider .box3 { - background-color: #00501d; -} -.slider .box3 .illustration .inner { - background-color: #00ff44; -} -.slider .box3 .illustration .inner::after, .slider .box3 .illustration .inner::before { - background-color: rgba(0, 255, 68, 0.4); -} -.slider .box3 button { - background-color: #00ff44; -} -.slider .box4 { - background-color: #554d00; -} -.slider .box4 .illustration .inner { - background-color: #ff4e00; -} -.slider .box4 .illustration .inner::after, .slider .box4 .illustration .inner::before { - background-color: rgba(255, 78, 0, 0.4); -} -.slider .box4 button { - background-color: #ff4e00; -} -.slider .box5 { - background-color: #300050; -} -.slider .box5 .illustration .inner { - background-color: #8000ff; -} -.slider .box5 .illustration .inner::after, .slider .box5 .illustration .inner::before { - background-color: rgba(128, 0, 255, 0.4); -} -.slider .box5 button { - background-color: #8000ff; -} -.slider .illustration { - grid-column: 2/-1; - grid-row: 1/-1; - justify-self: center; -} -@media only screen and (max-width: 650px) { - .slider .illustration { - grid-row: 1/span 1; - grid-column: 1/-1; - display: flex; - justify-content: center; - align-items: center; - } -} -.slider .illustration div { - height: 25rem; - width: 18rem; - border-radius: 3rem; - background-color: #ff0077; - position: relative; - transform: skewX(-10deg); -} -@media only screen and (max-width: 800px) { - .slider .illustration div { - height: 20rem; - width: 15rem; - } -} -.slider .illustration div::after, .slider .illustration div::before { - content: ""; - position: absolute; - height: 100%; - width: 100%; - border-radius: 3rem; - top: 0; - left: 0; -} -.slider .illustration div::after { - transform: translate(4rem, -1rem); -} -.slider .illustration div::before { - transform: translate(2rem, -2rem); -} - -.prev, -.next, -.trail { - z-index: 10000; - position: absolute; -} - -.prev, -.next { - width: 4rem; - cursor: pointer; - opacity: 0.2; - transition: all 0.3s ease; -} -@media only screen and (max-width: 650px) { - .prev, -.next { - display: none; - } -} -.prev:hover, -.next:hover { - opacity: 1; -} - -.prev { - top: 50%; - left: 2%; - transform: translateY(-50%); -} - -.next { - top: 50%; - right: 2%; - transform: translateY(-50%); -} - -.trail { - bottom: 5%; - left: 50%; - transform: translateX(-50%); - width: 60%; - display: grid; - grid-template-columns: repeat(5, 1fr); - gap: 1rem; - text-align: center; - font-size: 1.5rem; -} -@media only screen and (max-width: 650px) { - .trail { - width: 90%; - bottom: 13%; - } -} -.trail div { - padding: 2rem; - border-top: 3px solid #fff; - cursor: pointer; - opacity: 0.3; - transition: all 0.3s ease; -} -.trail div:hover { - opacity: 0.6; -} -@media only screen and (max-width: 650px) { - .trail div { - padding: 1rem; - } -} - -.active { - opacity: 1 !important; -} \ No newline at end of file diff --git a/projects/cat-api/app.js b/projects/cat-api/app.js deleted file mode 100644 index 5484703..0000000 --- a/projects/cat-api/app.js +++ /dev/null @@ -1,30 +0,0 @@ -const cat_result = document.getElementById("gallery"); -const errorData = document.getElementById("errorBox"); - - -btn_generate.addEventListener("click", function () { - const nums = document.getElementById("inp-box").value; - - errorData.innerHTML = ""; - - if(!nums.match(/^[0-9]+$/)){ - return errorData.innerHTML = "Enter a valid number"; - } - if(parseInt(nums) > 10){ - return errorData.innerHTML = "Number should be less than or equal to 10"; - } - - allimages = ""; - fetch( - `https://api.thecatapi.com/v1/images/search?limit=${nums}&page=10&order=Desc` - ) - .then((res) => res.json()) - .then((res) => { - for (let i = 0; i < nums; i++) { - allimages += ` - cat - `; - } - cat_result.innerHTML = allimages; - }); -}); diff --git a/projects/cat-api/index.html b/projects/cat-api/index.html index 89e0a6a..d31671e 100644 --- a/projects/cat-api/index.html +++ b/projects/cat-api/index.html @@ -5,21 +5,45 @@ - Getting Started with APIs + Get Random Photos
-

Getting Started with APIs

+

Get Random Photos

-

Enter the number of kitties

- - +

Enter the number of photos

+ + Error message - + - +
- + diff --git a/projects/cat-api/index.js b/projects/cat-api/index.js new file mode 100644 index 0000000..191bb57 --- /dev/null +++ b/projects/cat-api/index.js @@ -0,0 +1,53 @@ +const galleryEl = document.getElementById("gallery"); +const errorMessageEl = document.getElementById("errorMessage"); +const btnEl = document.getElementById("btn"); + +async function loadImage() { + const inputValue = document.getElementById("input").value; + if (inputValue > 10 || inputValue < 1) { + errorMessageEl.style.display = "block"; + errorMessageEl.innerHTML = "Number should be between 1 and 10"; + + return; + } + + let images = ""; + + try { + btnEl.style.display = "none"; + loading = `image`; + + galleryEl.innerHTML = loading; + + await fetch( + `https://api.unsplash.com/photos?per_page=${inputValue}&query=office&page=${Math.round( + Math.random() * 1000 + )}&client_id=2zo4prpSQRMCG-gokmZT4sGe9hIAkcbdiTct1dnRzAY` + ) + .then((res) => res.json()) + .then((data) => { + if (data) { + errorMessageEl.style.display = "none"; + data.forEach((pic) => { + images += ` + cat + `; + }); + galleryEl.style.display = "block"; + galleryEl.innerHTML = images; + } + }); + + btnEl.style.display = "block"; + } catch (error) { + console.log(error); + errorMessageEl.style.display = "block"; + errorMessageEl.innerHTML = "An error happened, please try again later"; + btnEl.style.display = "block"; + } +} + +btnEl.addEventListener("click", loadImage); diff --git a/projects/cat-api/spinner.svg b/projects/cat-api/spinner.svg new file mode 100644 index 0000000..fd9b80a --- /dev/null +++ b/projects/cat-api/spinner.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/projects/cat-api/styles.css b/projects/cat-api/styles.css index 1c09be2..92bfaf9 100644 --- a/projects/cat-api/styles.css +++ b/projects/cat-api/styles.css @@ -1,106 +1,75 @@ -@import url('https://fonts.googleapis.com/css?family=Open+Sans&display=swap'); - -:root { - --error-color: #dc3545; - --success-color: #28a745; - --warning-color: #ffc107; -} - -* { +body { margin: 0; padding: 0; - box-sizing: border-box; -} - -body { - font-family: 'Open Sans', sans-serif; - font-size: 16px; - background-color: #19172e; + font-family:'Courier New', Courier, monospace; + background: linear-gradient(to bottom, lightgreen, lightblue); display: flex; - flex-direction: column; justify-content: center; align-items: center; min-height: 100vh; + } .container { - background-color: rgba(255, 255, 255, 0.05); - padding: 1em; + background: aliceblue; + padding: 20px; border-radius: 5px; - box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3); + box-shadow: 0 10px 20px rgba(0,0,0,0.3); width: 90%; text-align: center; display: flex; - flex-direction: column; align-items: center; - flex-wrap: wrap; + margin: 10px; } -h1 { - color: #fff; - margin-bottom: 20px; +h2{ + font-weight: 400; } -#errorBox{ - color: crimson; + +.errorMessage{ + display: none; + color: red; + font-weight: 600; + margin: 10px; +} + +.gallery{ + display: none; } .gallery img { - width: 18vw; - height: 18vh; + width: 400px; + height: 250px; object-fit: cover; + border-radius: 10px; + margin: 5px; } -.inp-box{ - text-transform: uppercase; - width: 250px; - height: 45px; - outline: none; - border: none; - margin: 20px 0; - padding: 10px; +.input{ + padding: 20px 10px; font-size: 18px; border-radius: 3px; background-color: white; - transition: all 300ms ease; + text-align: center; } .btn { text-transform: uppercase; width: 250px; height: 45px; - outline: none; - border: none; margin: 20px 0; font-size: 18px; - border-radius: 3px; - background-color: white; + border-radius: 5px; + background-color: black; + color: aliceblue; cursor: pointer; transition: all 300ms ease; } .btn:hover { - color: #fff; - background-color: #5c1ed5; + color: white; + background-color: green; cursor: pointer; } -.btn:focus { - outline: none; -} - -footer { - color: pink; - font-size: 1rem; - padding: 22px; - line-height: 3vh; - margin-top: 30px; -} - -footer a { - color: inherit; -} - -footer a:visited { - color: inherit; -} From d543507cf56df6c4d013e6d218c20f19b0d6eca2 Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Sun, 11 Dec 2022 09:33:12 +0700 Subject: [PATCH 11/54] update the title of photo api --- projects/{cat-api => photo-gallery}/index.html | 4 ++-- projects/{cat-api => photo-gallery}/index.js | 0 projects/{cat-api => photo-gallery}/spinner.svg | 0 projects/{cat-api => photo-gallery}/styles.css | 0 4 files changed, 2 insertions(+), 2 deletions(-) rename projects/{cat-api => photo-gallery}/index.html (95%) rename projects/{cat-api => photo-gallery}/index.js (100%) rename projects/{cat-api => photo-gallery}/spinner.svg (100%) rename projects/{cat-api => photo-gallery}/styles.css (100%) diff --git a/projects/cat-api/index.html b/projects/photo-gallery/index.html similarity index 95% rename from projects/cat-api/index.html rename to projects/photo-gallery/index.html index d31671e..0845696 100644 --- a/projects/cat-api/index.html +++ b/projects/photo-gallery/index.html @@ -5,12 +5,12 @@ - Get Random Photos + Photos Gallery
-

Get Random Photos

+

Photos Gallery

Enter the number of photos

Date: Sun, 11 Dec 2022 19:27:09 +0700 Subject: [PATCH 12/54] update the photo gallery project --- projects/photo-gallery/index.html | 38 +++------- projects/photo-gallery/index.js | 51 ++++++------- projects/photo-gallery/spinner.svg | 2 +- projects/photo-gallery/styles.css | 114 ++++++++++++++--------------- 4 files changed, 92 insertions(+), 113 deletions(-) diff --git a/projects/photo-gallery/index.html b/projects/photo-gallery/index.html index 0845696..f0a8e39 100644 --- a/projects/photo-gallery/index.html +++ b/projects/photo-gallery/index.html @@ -4,44 +4,28 @@ - - Photos Gallery - + Photo Gallery +
-

Photos Gallery

- +

Photo Gallery

Enter the number of photos

- Error message - - - - diff --git a/projects/photo-gallery/index.js b/projects/photo-gallery/index.js index 191bb57..024848b 100644 --- a/projects/photo-gallery/index.js +++ b/projects/photo-gallery/index.js @@ -1,53 +1,48 @@ -const galleryEl = document.getElementById("gallery"); -const errorMessageEl = document.getElementById("errorMessage"); const btnEl = document.getElementById("btn"); +const errorMessageEl = document.getElementById("errorMessage"); +const galleryEl = document.getElementById("gallery"); -async function loadImage() { +async function fetchImage() { const inputValue = document.getElementById("input").value; + if (inputValue > 10 || inputValue < 1) { errorMessageEl.style.display = "block"; - errorMessageEl.innerHTML = "Number should be between 1 and 10"; - + errorMessageEl.innerText = "Number should be between 0 and 11"; return; } - let images = ""; + imgs = ""; try { btnEl.style.display = "none"; - loading = `image`; - + const loading = ``; galleryEl.innerHTML = loading; - await fetch( - `https://api.unsplash.com/photos?per_page=${inputValue}&query=office&page=${Math.round( + `https://api.unsplash.com/photos?per_page=${inputValue}&page=${Math.round( Math.random() * 1000 - )}&client_id=2zo4prpSQRMCG-gokmZT4sGe9hIAkcbdiTct1dnRzAY` - ) - .then((res) => res.json()) - .then((data) => { + )}&client_id=B8S3zB8gCPVCvzpAhCRdfXg_aki8PZM_q5pAyzDUvlc` + ).then((res) => + res.json().then((data) => { if (data) { - errorMessageEl.style.display = "none"; data.forEach((pic) => { - images += ` - cat - `; + imgs += ` + image + `; + galleryEl.style.display = "block"; + galleryEl.innerHTML = imgs; + btnEl.style.display = "block"; + errorMessageEl.style.display = "none"; }); - galleryEl.style.display = "block"; - galleryEl.innerHTML = images; } - }); - - btnEl.style.display = "block"; + }) + ); } catch (error) { console.log(error); errorMessageEl.style.display = "block"; - errorMessageEl.innerHTML = "An error happened, please try again later"; + errorMessageEl.innerHTML = "An error happened, try again later"; btnEl.style.display = "block"; + galleryEl.style.display = "none"; } } -btnEl.addEventListener("click", loadImage); +btnEl.addEventListener("click", fetchImage); diff --git a/projects/photo-gallery/spinner.svg b/projects/photo-gallery/spinner.svg index fd9b80a..c59456b 100644 --- a/projects/photo-gallery/spinner.svg +++ b/projects/photo-gallery/spinner.svg @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/projects/photo-gallery/styles.css b/projects/photo-gallery/styles.css index 92bfaf9..c4270f4 100644 --- a/projects/photo-gallery/styles.css +++ b/projects/photo-gallery/styles.css @@ -1,75 +1,75 @@ -body { - margin: 0; - padding: 0; - font-family:'Courier New', Courier, monospace; - background: linear-gradient(to bottom, lightgreen, lightblue); - display: flex; - justify-content: center; - align-items: center; - min-height: 100vh; +body{ + margin: 0; + font-family: 'Courier New', Courier, monospace; + background: linear-gradient(to bottom, lightgreen, lightblue); + display: flex; + min-height: 100vh; + justify-content: center; + align-items: center; + text-align: center; } -.container { - background: aliceblue; - padding: 20px; - border-radius: 5px; - box-shadow: 0 10px 20px rgba(0,0,0,0.3); - width: 90%; - text-align: center; - display: flex; - flex-direction: column; - align-items: center; - margin: 10px; - +.container{ + background-color: aliceblue; + padding: 20px; + border-radius: 5px; + box-shadow: 0 10px 20px rgba(0,0,0,0.3); + width: 90%; + margin: 10px; + display: flex; + flex-direction: column; + text-align: center; + justify-content: center; + align-items: center; } h2{ - font-weight: 400; + font-weight: 400; +} + +.input{ + padding: 20px 10px; + font-size: 18px; + background-color: white; + border-radius: 5px; + text-align: center; + width: 100px; } .errorMessage{ - display: none; - color: red; - font-weight: 600; - margin: 10px; + color: red; + font-weight: 600; + margin: 10px; + display: none; } -.gallery{ - display: none; +.btn{ + text-transform: uppercase; + width: 250px; + height: 45px; + margin: 20px 0; + font-size: 18px; + border-radius: 5px; + background-color: black; + color: aliceblue; + +} + +.btn:hover{ + color: aliceblue; + background-color: green; + cursor: pointer; + transition: background-color 300ms ease-in-out; } - -.gallery img { +.gallery img{ width: 400px; height: 250px; object-fit: cover; - border-radius: 10px; + border-radius: 5px; margin: 5px; - } - -.input{ - padding: 20px 10px; - font-size: 18px; - border-radius: 3px; - background-color: white; - text-align: center; -} -.btn { - text-transform: uppercase; - width: 250px; - height: 45px; - margin: 20px 0; - font-size: 18px; - border-radius: 5px; - background-color: black; - color: aliceblue; - cursor: pointer; - transition: all 300ms ease; -} - -.btn:hover { - color: white; - background-color: green; - cursor: pointer; } +.gallery{ + display: none; +} \ No newline at end of file From 4502cce775deb9760af0f10f76902beb0de62895 Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Mon, 12 Dec 2022 11:58:12 +0700 Subject: [PATCH 13/54] update random quote generator --- projects/english-dictionary/index.html | 2 +- .../{script.js => index.js} | 0 projects/movie-quote-generator/index.html | 69 ++++--- projects/movie-quote-generator/index.js | 32 +++ projects/movie-quote-generator/script.js | 17 -- projects/movie-quote-generator/style.css | 182 ++++++------------ 6 files changed, 123 insertions(+), 179 deletions(-) rename projects/english-dictionary/{script.js => index.js} (100%) create mode 100644 projects/movie-quote-generator/index.js delete mode 100644 projects/movie-quote-generator/script.js diff --git a/projects/english-dictionary/index.html b/projects/english-dictionary/index.html index fdbafc8..d74bf9a 100644 --- a/projects/english-dictionary/index.html +++ b/projects/english-dictionary/index.html @@ -47,7 +47,7 @@
- + \ No newline at end of file diff --git a/projects/english-dictionary/script.js b/projects/english-dictionary/index.js similarity index 100% rename from projects/english-dictionary/script.js rename to projects/english-dictionary/index.js diff --git a/projects/movie-quote-generator/index.html b/projects/movie-quote-generator/index.html index eb18ef6..87e9108 100644 --- a/projects/movie-quote-generator/index.html +++ b/projects/movie-quote-generator/index.html @@ -1,40 +1,37 @@ - - - - - Random Movie/TV Series Quote Generator - - - - - - - -

Movie Quote Generator

-
- -

- -

- - - -

- -

- -

-
-
- + + + + + Random Quote Generator + + + + + +
+ +

Random Quote Generator

- - -
-
- - - +

+ + Quote + +

+ +

~ Author

+ + +
+
+ + + diff --git a/projects/movie-quote-generator/index.js b/projects/movie-quote-generator/index.js new file mode 100644 index 0000000..90b0fc9 --- /dev/null +++ b/projects/movie-quote-generator/index.js @@ -0,0 +1,32 @@ +btnEl = document.getElementById("btn"); +quoteEl = document.getElementById("quote"); +authorEl = document.getElementById("author"); + +async function getNextQuote() { + try { + btnEl.innerText = "Loading..."; + btnEl.disabled = true; + quoteEl.innerText = "Updating..."; + authorEl.innerText = "~ " + "Updating..."; + let url = "https://api.quotable.io/random"; + const response = await fetch(url); + const data = await response.json(); + const quoteContent = data.content; + const quoteAuthor = data.author; + quoteEl.innerText = quoteContent; + authorEl.innerText = "~ " + quoteAuthor; + btnEl.innerText = "Get quote"; + btnEl.disabled = false; + } catch (error) { + console.log(error); + // test the error by setting up the network to offline + quoteEl.innerText = "An error happened, try again later"; + authorEl.innerText = "~ " + "An error happened"; + btnEl.disabled = false; + btnEl.innerText = "Get quote"; + } +} + +btnEl.addEventListener("click", getNextQuote); + +getNextQuote(); diff --git a/projects/movie-quote-generator/script.js b/projects/movie-quote-generator/script.js deleted file mode 100644 index 2c0f8c4..0000000 --- a/projects/movie-quote-generator/script.js +++ /dev/null @@ -1,17 +0,0 @@ -const getNextQuote = async() => -{ - var url = "https://raw.githubusercontent.com/msramalho/json-tv-quotes/master/quotes.json"; - const response = await fetch(url); - const totalQuotes = await response.json(); - const index = Math.floor(Math.random()*totalQuotes.length); - const quo=totalQuotes[index].quote; - const auth=totalQuotes[index].author; - const sour=totalQuotes[index].source; - quote.innerHTML=""+quo; - author.innerHTML="~ "+auth; - source.innerHTML=""+sour; - tweet.href="https://twitter.com/intent/tweet?text="+quo+" ~ "+auth+" | "+sour; - whatsapp.href="whatsapp://send?text="+quo+" ~ "+auth+" | "+sour; -} - -getNextQuote(); diff --git a/projects/movie-quote-generator/style.css b/projects/movie-quote-generator/style.css index b0e3c55..3314276 100644 --- a/projects/movie-quote-generator/style.css +++ b/projects/movie-quote-generator/style.css @@ -1,129 +1,61 @@ -*{ - margin: 0; - padding: 0; - box-sizing: border-box; - } - -body { - display: flex; - justify-content: center; - align-items: center; - min-height: 100vh; - background-color: #19172e; - font-family: "Garamond", serif; - transition-timing-function: ease-in; - transition: 0.7s; - } - -#quote { - text-align: center; - font-size: 40px; - font-weight: bold; - color: white; -} - -#author { - margin: 10px; - text-align: right; - font-size: 25px; - font-style: italic; - font-family: "Garamond", serif; - color: #19172e; -} - -#source { - margin: 10px; - text-align: right; - font-size: 25px; - font-weight: 700; - font-family: "Garamond", serif; - color: #19172e +body { + margin: 0; + display: flex; + justify-content: center; + align-items: center; + min-height: 100vh; + background: linear-gradient(to left bottom, lightgreen, lightblue); + color: black; + font-family: "Courier New", Courier, monospace; } .container { - display: flex; - flex-direction: column; - align-items: center; - padding: 30px; - box-shadow: 0 4px 10px rgba(0, 0, 0, 0.6); - border-radius: 15px; - width: 600px; - background-color: rgba(255, 255, 255, 0.3); - margin: 10px; -} - - -.buttons { - width: 100%; - display: flex; - justify-content: space-between; - align-items: center; - margin-top: 9px; - -} - -#tweet { - border: solid rgb(102, 179, 255); - border-radius: 4px; - background-color: rgb(102, 179, 255); - color: white; - text-align: center; - font-size: 1.8em; - width: 60px; - height: 35px; - line-height: 40px; - + display: flex; + flex-direction: column; + align-items: center; + padding: 30px; + box-shadow: 0 6px 10px rgba(0, 0, 0, 0.3); + border-radius: 15px; + width: 90%; + background-color: rgba(255, 255, 255, 0.1); + margin: 10px; + text-align: center; +} + +.heading { + font-size: 35px; + text-align: center; + font-weight: 700; +} + +.quote { + font-size: 30px; + font-weight: bold; +} + +.author { + margin: 10px; + text-align: right; + font-size: 25px; + font-style: italic; +} + +.btn { + font-size: 18px; + border-radius: 5px; + cursor: pointer; + padding: 10px; + margin-top: 15px; + background-color: rgba(255, 255, 255, 0.3); + border-color: rgba(255, 255, 255, 0.6); + width: 300px; + color: black; + text-transform: uppercase; +} + +.btn:hover { + background-color: rgba(255, 255, 255, 0.6); + color: green; + transition: all 300ms ease-in-out; + box-shadow: 0 4px 4px rgba(0, 0, 0, 0.3); } - -#whatsapp { - border: solid #25D366; - border-radius: 4px; - background-color: #25D366; - color: white; - text-align: center; - font-size: 1.8em; - width: 60px; - height: 35px; - line-height: 40px; - -} - -footer { - - text-align: center; - color: white; - font-size: 1rem; - position: absolute; - bottom: 0px; - padding: 5px; - line-height: 3vh; - font-family: "Roboto", sans-serif; -} - -.heading{ - font-family: "Roboto", sans-serif; - color: white; - font-size: 50px; - position: absolute; - top: 0; - left: 0; - right: 0; - text-align: center; - padding: 100px; - line-height: 3vh; -} - -.container:hover { - box-shadow: 0 10px 10px rgb(0, 0, 0); -} - -.next { - font-size: 18px; - border-radius: 5px; - cursor: pointer; - padding: 10px; - margin-top: 5px; - font-weight: bold; - color: white; - background-image: linear-gradient(to right bottom, rgb(230, 100, 0), #ffedbca8); -} \ No newline at end of file From 63e176d8211672308da5d1cb01a1d988b5533960 Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Mon, 12 Dec 2022 13:44:05 +0700 Subject: [PATCH 14/54] update the movie quote generator name --- .../{movie-quote-generator => random-quote-generator}/index.html | 0 .../{movie-quote-generator => random-quote-generator}/index.js | 0 .../{movie-quote-generator => random-quote-generator}/style.css | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename projects/{movie-quote-generator => random-quote-generator}/index.html (100%) rename projects/{movie-quote-generator => random-quote-generator}/index.js (100%) rename projects/{movie-quote-generator => random-quote-generator}/style.css (100%) diff --git a/projects/movie-quote-generator/index.html b/projects/random-quote-generator/index.html similarity index 100% rename from projects/movie-quote-generator/index.html rename to projects/random-quote-generator/index.html diff --git a/projects/movie-quote-generator/index.js b/projects/random-quote-generator/index.js similarity index 100% rename from projects/movie-quote-generator/index.js rename to projects/random-quote-generator/index.js diff --git a/projects/movie-quote-generator/style.css b/projects/random-quote-generator/style.css similarity index 100% rename from projects/movie-quote-generator/style.css rename to projects/random-quote-generator/style.css From 7c5b97301be35c223d9972e2ad9e18f70c8630b4 Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Tue, 13 Dec 2022 18:06:36 +0700 Subject: [PATCH 15/54] update random quote generator project --- projects/random-quote-generator/index.html | 46 ++++++++-------------- projects/random-quote-generator/index.js | 27 +++++++------ projects/random-quote-generator/style.css | 31 ++++++--------- 3 files changed, 43 insertions(+), 61 deletions(-) diff --git a/projects/random-quote-generator/index.html b/projects/random-quote-generator/index.html index 87e9108..04cd199 100644 --- a/projects/random-quote-generator/index.html +++ b/projects/random-quote-generator/index.html @@ -1,37 +1,25 @@ - - - - + + + + Random Quote Generator - - - - - + + + +
- -

Random Quote Generator

- -

- - Quote - -

- -

~ Author

+

Random Quote Generator

+

+ + Quote + +

+

~ Author

-
- - - + + \ No newline at end of file diff --git a/projects/random-quote-generator/index.js b/projects/random-quote-generator/index.js index 90b0fc9..801cc29 100644 --- a/projects/random-quote-generator/index.js +++ b/projects/random-quote-generator/index.js @@ -1,32 +1,33 @@ -btnEl = document.getElementById("btn"); -quoteEl = document.getElementById("quote"); -authorEl = document.getElementById("author"); +const btnEl = document.getElementById("btn"); +const quoteEl = document.getElementById("quote"); +const authorEl = document.getElementById("author"); -async function getNextQuote() { +const apiURL = "https://api.quotable.io/random"; + +async function getQuote() { try { btnEl.innerText = "Loading..."; btnEl.disabled = true; quoteEl.innerText = "Updating..."; - authorEl.innerText = "~ " + "Updating..."; - let url = "https://api.quotable.io/random"; - const response = await fetch(url); + authorEl.innerText = "Updating..."; + const response = await fetch(apiURL); const data = await response.json(); const quoteContent = data.content; const quoteAuthor = data.author; quoteEl.innerText = quoteContent; authorEl.innerText = "~ " + quoteAuthor; - btnEl.innerText = "Get quote"; + btnEl.innerText = "Get a quote"; btnEl.disabled = false; + console.log(data); } catch (error) { console.log(error); - // test the error by setting up the network to offline quoteEl.innerText = "An error happened, try again later"; - authorEl.innerText = "~ " + "An error happened"; + authorEl.innerText = "An error happened"; + btnEl.innerText = "Get a quote"; btnEl.disabled = false; - btnEl.innerText = "Get quote"; } } -btnEl.addEventListener("click", getNextQuote); +getQuote() -getNextQuote(); +btnEl.addEventListener("click", getQuote); diff --git a/projects/random-quote-generator/style.css b/projects/random-quote-generator/style.css index 3314276..e67e3f5 100644 --- a/projects/random-quote-generator/style.css +++ b/projects/random-quote-generator/style.css @@ -1,42 +1,36 @@ body { margin: 0; display: flex; + min-height: 100vh; justify-content: center; align-items: center; - min-height: 100vh; - background: linear-gradient(to left bottom, lightgreen, lightblue); - color: black; font-family: "Courier New", Courier, monospace; + background: linear-gradient(to left bottom, lightgreen, lightblue); } .container { - display: flex; - flex-direction: column; - align-items: center; - padding: 30px; + background-color: rgba(255, 255, 255, 0.1); box-shadow: 0 6px 10px rgba(0, 0, 0, 0.3); + padding: 30px; border-radius: 15px; width: 90%; - background-color: rgba(255, 255, 255, 0.1); margin: 10px; text-align: center; } .heading { font-size: 35px; - text-align: center; font-weight: 700; } .quote { font-size: 30px; - font-weight: bold; + font-weight: 600; } .author { - margin: 10px; - text-align: right; font-size: 25px; + margin: 10px; font-style: italic; } @@ -48,14 +42,13 @@ body { margin-top: 15px; background-color: rgba(255, 255, 255, 0.3); border-color: rgba(255, 255, 255, 0.6); - width: 300px; - color: black; text-transform: uppercase; + width: 300px; } -.btn:hover { - background-color: rgba(255, 255, 255, 0.6); - color: green; - transition: all 300ms ease-in-out; - box-shadow: 0 4px 4px rgba(0, 0, 0, 0.3); +.btn:hover{ + background-color: rgba(255,255,255,.6); + box-shadow: 0 4px 4px rgba(0,0,0,.3); + transition: all 300ms ease-in-out; + color: green; } From 0ffab49484dc2824ed5ca48191105e300a88faca Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Thu, 15 Dec 2022 07:53:09 +0700 Subject: [PATCH 16/54] update english dic project --- projects/english-dictionary/index.html | 82 +++++------ projects/english-dictionary/index.js | 110 ++++++--------- projects/english-dictionary/style.css | 188 +++++-------------------- 3 files changed, 114 insertions(+), 266 deletions(-) diff --git a/projects/english-dictionary/index.html b/projects/english-dictionary/index.html index d74bf9a..a1800e9 100644 --- a/projects/english-dictionary/index.html +++ b/projects/english-dictionary/index.html @@ -1,53 +1,35 @@ - + - - + + Dictionary App - - - - - - -
-
English Dictionary
- -

Type a word and press enter

-
    -
  • -
    -

    _

    - ___ -
    - -
  • -
    -
  • -
    -

    Meaning

    - ___ -
    -
  • -
    -
  • -
    -

    Example

    - ___ -
    -
  • -
    -
    -

    Synonyms

    -
    -
    -
    -
-
- - - \ No newline at end of file + + + + + +
+

English Dictionary

+ +

Type a word and press enter

+
+

Word Title: ___

+

Meaning: ___

+ + +
+
+ + + diff --git a/projects/english-dictionary/index.js b/projects/english-dictionary/index.js index c092e20..171ff75 100644 --- a/projects/english-dictionary/index.js +++ b/projects/english-dictionary/index.js @@ -1,73 +1,53 @@ -const wrapper = document.querySelector(".wrapper"), -searchInput = wrapper.querySelector("input"), -synonyms = wrapper.querySelector(".synonyms .list"), -infoText = wrapper.querySelector(".info-text"), -volumeIcon = wrapper.querySelector(".word i"), -removeIcon = wrapper.querySelector(".search span"); -let audio; - - -function data(result, word) { - if (result.title){ - infoText.innerHTML = `Can't find the meaning of "${word}".Please try to search for another - word`; - } - else { - console.log(result); - wrapper.classList.add("active"); - let definitions = result[0].meanings[0].definitions[0], - phonetics = `${result[0].meanings[0].partOfSpeech} / ${result[0].phonetics[0].text} / `; - - document.querySelector('.word p').innerText = result[0].word; - document.querySelector('.word span').innerText = phonetics; - document.querySelector('.meaning span').innerText = definitions.definition; - document.querySelector('.example span').innerText = definitions.example; - audio = new Audio('https:' + result[0].phonetics[0].audio); - - if(definitions.synonyms[0] == undefined){ - synonyms.parentElement.style.display = 'none'; - } - else { - synonyms.parentElement.style.display = 'block'; - synonyms.innerHTML = ""; - for( let i =0; i < 5; i++) { - let tag = `${definitions.synonyms[i]},`; - synonyms.insertAdjacentHTML('beforeend', tag); - } - } +const containerEl = document.getElementById("container"), + searchInput = document.getElementById("input"); +infoTextEl = document.getElementById("info-text"); +const audioEl = document.getElementById("audio"); + +const meaningContainerEl = document.getElementById("meaning-container"); + +const titleEl = document.getElementById("title"); +const meaningEl = document.getElementById("meaning"); + +async function fetchApi(word) { + try { + infoTextEl.style.display = "block"; + infoTextEl.innerText = `Searching the meaning of "${word}"`; + meaningContainerEl.style.display = "none"; + const url = `https://api.dictionaryapi.dev/api/v2/entries/en/${word}`; + const result = await fetch(url).then((res) => res.json()); + + if (result.title) { + titleEl.innerText = word; + meaningEl.innerText = "N/A"; + audioEl.style.display = "none"; } -} -function search (word){ - searchInput.value = word; - fetchApi(word); -} + const definitions = result[0].meanings[0].definitions[0]; -function fetchApi(word) { - wrapper.classList.remove('active'); - infoText.style.color = '#000'; - infoText.innerHTML = `Searching the meaning of"${word}"`; - let url = `https://api.dictionaryapi.dev/api/v2/entries/en/${word}`; - // fetching api response and returning it with parsing into js obj - //method calling data with passing api response - fetch(url).then(res => res.json()).then(result => data(result, word)); -} + titleEl.innerText = result[0].word; + meaningEl.innerText = definitions.definition; -searchInput.addEventListener('keyup', e => { - if(e.key === 'Enter' && e.target.value){ - fetchApi(e.target.value); + if (result[0].phonetics[0].audio) { + audioEl.style.display = "inline-flex"; + + audioEl.src = result[0].phonetics[0].audio; + } else { + audioEl.style.display = "none"; } -}); -volumeIcon.addEventListener('click', () => { - audio.play(); -}); + infoTextEl.style.display = "none"; + meaningContainerEl.style.display = "block"; + } catch (error) { + console.log(error); + infoTextEl.style.display = "none"; + meaningContainerEl.style.display = "block"; + audioEl.style.display = "none"; + } +} -removeIcon.addEventListener('click', () => { - searchInput.value = ""; - searchInput.focus(); - wrapper.classList.remove("active"); - infoText.style.color = '#9a9a9a'; - infoText.innerHTML= "Type a word and press enter"; -}); \ No newline at end of file +searchInput.addEventListener("keyup", (e) => { + if (e.key === "Enter" && e.target.value) { + fetchApi(e.target.value); + } +}); diff --git a/projects/english-dictionary/style.css b/projects/english-dictionary/style.css index 39c1ecc..aa22bfb 100644 --- a/projects/english-dictionary/style.css +++ b/projects/english-dictionary/style.css @@ -1,153 +1,39 @@ -*{ - margin: 0; - padding: 0; - box-sizing: border-box; - font-family: sans-serif; -} body { - display: flex; - align-items: center; - justify-content: center; - background-color: rgb(160, 158, 156); - min-height: 100vh; -} - -.wrapper { - width: 420px; - background-color: #fff; - border-radius: 7px; - padding: 28px 28px; -} -.wrapper header { - font-size: 28px; - font-weight: 500; - text-align: center; -} -.wrapper .search { - margin: 35px 0 18px; - position: relative; -} -.search input { - height: 53px; - width: 100%; - outline: none; - border: 1px solid #999; - border-radius: 5px; - font-size: 16px; - padding: 0 42px; -} -.search :where(i, span) { - position: absolute; - top: 50%; - color: #999; - transform: translateY(-50%); -} -.search input::placeholder{ - color: #b8b8b8; -} -.search input:focus{ - border: 2px solid #4d59fb; - padding: 0 41px; -} -.search i { - left: 18px; - font-size: 16px; - pointer-events: none; -} -.search input:focus ~ i { - color: #4d59fb; -} -.search span { - right: 15px; - cursor: pointer; - font-size: 18px; - display: none; -} -.search input:valid ~ span { - display: block; -} -.wrapper ul li{ - display: flex; - margin-bottom: 14px; - padding-bottom: 17px; - border-bottom: 1px solid #ccc; - justify-content: space-between; - align-items: center; -} -ul .word p{ - font-size: 22px; - font-weight: 500; -} -.wrapper .info-text { - font-size: 13px; - color: #9a9a9a; - margin: -3px 0 -10px; -} -.wrapper ul { - height: 0; - opacity: 0; - overflow: hidden; - transition: all 0.3s ease; -} -ul .word i { - cursor: pointer; - font-size: 15px; - color: #999; -} -ul li:last-child{ - margin-bottom: 0px; - padding-bottom: 0px; - border-bottom: 0px; -} -.content li .details{ - border-left: 3px solid #4d59fb; - border-radius: 4px 0 0 4px; - padding-left: 10px; -} -.content li .details p { - font-size: 17px; - color: #7e7e7e; -} -.synonyms .details .list { - display: flex; - flex-wrap: wrap; + margin: 0; + display: flex; + align-items: center; + justify-content: center; + background-color: salmon; + min-height: 100vh; + font-family: "Courier New", Courier, monospace; +} + +.container { + width: 90%; + background-color: rgba(255, 255, 255, 0.3); + box-shadow: 0 10px 10px rgba(0, 0, 0, 0.3); + border-radius: 7px; + padding: 28px; + margin: 10px; + text-align: center; + max-width: 450px; + font-weight: 500; + font-size: 18px; +} +.heading { + font-size: 28px; +} + +.input { + height: 53px; + width: 300px; + border-color: rgba(255, 255, 255, 0.4); + background-color: rgba(255, 255, 255, 0.6); + border-radius: 5px; + font-size: 16px; + padding: 0 42px; +} + +.meaning-container { + display: none; } -.synonyms .details .list span { - margin-right: 5px; - text-decoration: underline; - cursor: pointer; -} -.info-text span{ - font-weight: 500; -} -.wrapper.active ul { - height: 303px; - opacity: 1; -} -.wrapper.active ul{ - display: block; -} -.wrapper.active .info-text { - display: none; -} -ul .content { - max-height: 215px; - overflow-y: auto; -} -ul .content::-webkit-scrollbar{ - width: 0px; -} - - - - - - - - - - - - - - From 3a4a17e4382e25eafb79adb11979dc8a249baa27 Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Fri, 16 Dec 2022 16:40:50 +0700 Subject: [PATCH 17/54] update 2 projects --- projects/english-dictionary/index.html | 28 +++------ projects/english-dictionary/index.js | 45 +++++--------- projects/english-dictionary/style.css | 65 ++++++++++---------- projects/notes-taking-app/icon.png | Bin 7224 -> 0 bytes projects/notes-taking-app/index.html | 19 +++--- projects/notes-taking-app/index.js | 67 ++++++++++++++++++++ projects/notes-taking-app/script.js | 69 --------------------- projects/notes-taking-app/style.css | 82 ++++++++++--------------- 8 files changed, 169 insertions(+), 206 deletions(-) delete mode 100644 projects/notes-taking-app/icon.png create mode 100644 projects/notes-taking-app/index.js delete mode 100644 projects/notes-taking-app/script.js diff --git a/projects/english-dictionary/index.html b/projects/english-dictionary/index.html index a1800e9..47f6806 100644 --- a/projects/english-dictionary/index.html +++ b/projects/english-dictionary/index.html @@ -1,33 +1,21 @@ - - Dictionary App - - - - + + + + English Dictionary + -
+

English Dictionary

- +

Type a word and press enter

Word Title: ___

Meaning: ___

- - +
diff --git a/projects/english-dictionary/index.js b/projects/english-dictionary/index.js index 171ff75..8a93219 100644 --- a/projects/english-dictionary/index.js +++ b/projects/english-dictionary/index.js @@ -1,53 +1,40 @@ -const containerEl = document.getElementById("container"), - searchInput = document.getElementById("input"); -infoTextEl = document.getElementById("info-text"); -const audioEl = document.getElementById("audio"); - +const inputEl = document.getElementById("input"); +const infoTextEl = document.getElementById("info-text"); const meaningContainerEl = document.getElementById("meaning-container"); - const titleEl = document.getElementById("title"); const meaningEl = document.getElementById("meaning"); +const audioEl = document.getElementById("audio"); -async function fetchApi(word) { +async function fetchAPI(word) { try { infoTextEl.style.display = "block"; - infoTextEl.innerText = `Searching the meaning of "${word}"`; meaningContainerEl.style.display = "none"; + infoTextEl.innerText = `Searching the meaning of "${word}"`; const url = `https://api.dictionaryapi.dev/api/v2/entries/en/${word}`; const result = await fetch(url).then((res) => res.json()); if (result.title) { + meaningContainerEl.style.display = "block"; + infoTextEl.style.display = "none"; titleEl.innerText = word; meaningEl.innerText = "N/A"; audioEl.style.display = "none"; - } - - const definitions = result[0].meanings[0].definitions[0]; - - titleEl.innerText = result[0].word; - - meaningEl.innerText = definitions.definition; - - if (result[0].phonetics[0].audio) { + } else { + infoTextEl.style.display = "none"; + meaningContainerEl.style.display = "block"; audioEl.style.display = "inline-flex"; - + titleEl.innerText = result[0].word; + meaningEl.innerText = result[0].meanings[0].definitions[0].definition; audioEl.src = result[0].phonetics[0].audio; - } else { - audioEl.style.display = "none"; } - - infoTextEl.style.display = "none"; - meaningContainerEl.style.display = "block"; } catch (error) { console.log(error); - infoTextEl.style.display = "none"; - meaningContainerEl.style.display = "block"; - audioEl.style.display = "none"; + infoTextEl.innerText = `an error happened, try again later`; } } -searchInput.addEventListener("keyup", (e) => { - if (e.key === "Enter" && e.target.value) { - fetchApi(e.target.value); +inputEl.addEventListener("keyup", (e) => { + if (e.target.value && e.key === "Enter") { + fetchAPI(e.target.value); } }); diff --git a/projects/english-dictionary/style.css b/projects/english-dictionary/style.css index aa22bfb..59fa822 100644 --- a/projects/english-dictionary/style.css +++ b/projects/english-dictionary/style.css @@ -1,39 +1,40 @@ -body { - margin: 0; - display: flex; - align-items: center; - justify-content: center; - background-color: salmon; - min-height: 100vh; - font-family: "Courier New", Courier, monospace; +body{ + margin: 0; + display: flex; + min-height: 100vh; + justify-content: center; + align-items: center; + background-color: salmon; + font-family: 'Courier New', Courier, monospace; } -.container { - width: 90%; - background-color: rgba(255, 255, 255, 0.3); - box-shadow: 0 10px 10px rgba(0, 0, 0, 0.3); - border-radius: 7px; - padding: 28px; - margin: 10px; - text-align: center; - max-width: 450px; - font-weight: 500; - font-size: 18px; -} -.heading { - font-size: 28px; +.container{ + background-color: rgba(255,255,255, .3); + padding: 28px; + border-radius: 7px; + box-shadow: 0 10px 10px rgba(0,0,0,.3); + width: 90%; + margin: 10px; + max-width: 450px; + text-align: center; + font-size: 18px; + font-weight: 500; } -.input { - height: 53px; - width: 300px; - border-color: rgba(255, 255, 255, 0.4); - background-color: rgba(255, 255, 255, 0.6); - border-radius: 5px; - font-size: 16px; - padding: 0 42px; +.heading{ + font-size: 28px; } -.meaning-container { - display: none; +.input{ + height: 53px; + width: 300px; + background-color: rgba(255,255,255, .6); + border-color: rgba(255,255,255, .4); + font-size: 16px; + padding: 0 42px; + border-radius: 5px; } + +.meaning-container{ + display: none; +} \ No newline at end of file diff --git a/projects/notes-taking-app/icon.png b/projects/notes-taking-app/icon.png deleted file mode 100644 index 9cac03b4f4fbefe58aefa59d447c69c926af06c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7224 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 - - Notes Taking App + Note App -

Notes Taking App

-
- +

Note App

+

Double click on a note to remove it

+
+ +
- - + diff --git a/projects/notes-taking-app/index.js b/projects/notes-taking-app/index.js new file mode 100644 index 0000000..178aa19 --- /dev/null +++ b/projects/notes-taking-app/index.js @@ -0,0 +1,67 @@ +const notesContainerEl = document.getElementById("app"); +const btnEl = document.getElementById("btn"); + +getNotes().forEach((note) => { + const noteEl = createNoteEl(note.id, note.content); + notesContainerEl.insertBefore(noteEl, btnEl); +}); + +btnEl.addEventListener("click", () => addNote()); + +function getNotes() { + return JSON.parse(localStorage.getItem("note-ap") || "[]"); +} + +function saveNotes(notes) { + localStorage.setItem("note-ap", JSON.stringify(notes)); +} + +function createNoteEl(id, content) { + const element = document.createElement("textarea"); + + element.classList.add("note"); + element.value = content; + element.placeholder = "Empty Note"; + + element.addEventListener("input", () => { + updateNote(id, element.value); + }); + + element.addEventListener("dblclick", () => { + const noteDelete = confirm("Want to Delete the note?"); + if (noteDelete) { + deleteNote(id, element); + } + }); + + return element; +} + +function addNote() { + const notes = getNotes(); + const noteObj = { + id: Math.floor(Math.random() * 100000), + content: "", + }; + + const noteEl = createNoteEl(noteObj.id, noteObj.content); + notesContainerEl.insertBefore(noteEl, btnEl); + + notes.push(noteObj); + saveNotes(notes); +} + +function updateNote(id, newContent) { + const notes = getNotes(); + const target = notes.filter((note) => note.id == id)[0]; + + target.content = newContent; + saveNotes(notes); +} + +function deleteNote(id, element) { + const notes = getNotes().filter((note) => note.id != id); + + saveNotes(notes); + notesContainerEl.removeChild(element); +} diff --git a/projects/notes-taking-app/script.js b/projects/notes-taking-app/script.js deleted file mode 100644 index f788999..0000000 --- a/projects/notes-taking-app/script.js +++ /dev/null @@ -1,69 +0,0 @@ -const notesContainer = document.getElementById("app"); -const addNoteButton = notesContainer.querySelector(".add-note"); - -getNotes().forEach(note => { - const noteElement = createNoteElement(note.id, note.content); - notesContainer.insertBefore(noteElement, addNoteButton); -}); - -addNoteButton.addEventListener("click", () => addNote()); - -function getNotes(){ - return JSON.parse(localStorage.getItem("note-ap") || "[]"); -} - -function saveNotes(notes){ - localStorage.setItem("note-ap", JSON.stringify(notes)); -} - -function createNoteElement(id, content){ - const element = document.createElement("textarea"); - - element.classList.add("note"); - element.value = content; - element.placeholder = "Empty Note"; - - element.addEventListener("change", () => { - updateNote(id, element.value); - }); - - element.addEventListener("dblclick", () => { - const noteDelete = confirm("Want to Delete the note?") - if (noteDelete) { - deleteNote(id, element); - } - }); - - return element; -} - -function addNote(){ - const notes = getNotes(); - const noteObj = { - id: Math.floor(Math.random()*100000), - content: "" - }; - - const noteElement = createNoteElement(noteObj.id, noteObj.content); - notesContainer.insertBefore(noteElement, addNoteButton); - - - notes.push(noteObj); - saveNotes(notes); -} - -function updateNote(id, newContent) { - const notes = getNotes(); - const target = notes.filter(note=>note.id == id)[0]; - - target.content = newContent; - saveNotes(notes); -} - -function deleteNote(id, element) { - const notes = getNotes().filter(note => note.id != id); - - saveNotes(notes); - notesContainer.removeChild(element); -} - diff --git a/projects/notes-taking-app/style.css b/projects/notes-taking-app/style.css index 58a6b31..ba2c848 100644 --- a/projects/notes-taking-app/style.css +++ b/projects/notes-taking-app/style.css @@ -1,30 +1,25 @@ -:root { - --bg: #19172e; - --btn: #9c528b; - --card: #b9929f; -} -* { - font-family: sans-serif; - transition: 0.5s ease; -} body { + font-family: "Courier New", Courier, monospace; margin: 0; - background: var(--bg); + background: linear-gradient(to left, lightblue, lightgreen); } -h1 { - color: #fff; +.heading { + color: aliceblue; text-align: center; - left: 0; - right: 0; - top: 0; padding-top: 10px; - font-size: 2rem !important; + font-size: 35px; +} +.info-text { + text-align: center; + color: aliceblue; + font-size: 18px; } -#app { +.app { display: grid; - grid-template-columns: repeat(auto-fill, 200px); + grid-template-columns: repeat(auto-fill, 300px); + justify-content: center; padding: 50px; gap: 40px; } @@ -35,51 +30,40 @@ h1 { padding: 17px; border-radius: 15px; resize: none; - box-shadow: 0 0 7px rgba(0, 0, 0, 0.3); + box-shadow: 0 0 3px rgba(0, 0, 0, 0.3); font-family: monospace; font-size: 18px; - color: var(--bg); + color: gray; font-weight: 800; border: none; outline: none; - background: var(--card); + background: rgba(255, 255, 255, 0.1); +} +.note::placeholder { + color: gray; + opacity: 30%; } -.add-note { +.note:hover, +.note:focus { + box-shadow: 0 0 10px rgba(0, 0, 0, 0.3); + transition: all 300ms ease; +} + +.btn { height: 200px; border: none; outline: none; - background: rgba(156, 82, 139, 0.27); + background: rgba(255, 255, 255, 0.27); border-radius: 15px; font-size: 70px; font-weight: 700; - color: rgba(0, 0, 0, 0.5); + color: rgba(0, 0, 0, 0.3); cursor: pointer; } -.add-note:hover { - background: rgba(156, 82, 139, 0.5); - color: rgba(0, 0, 0, 0.7); -} - -::placeholder { - color: rgb(214, 214, 214); +.btn:hover { + background: rgba(255, 255, 255, 0.55); + color: rgba(0, 0, 0, 0.6); + transition: all 300ms ease; } - -footer, -a { - color: rgb(214, 214, 214); - font-size: 20px; -} - -footer { - text-align: center; - color: white; - font-size: 1.25rem; - left: 0; - right: 0; - bottom: 0; - margin-bottom: 0; - padding: 10px; - line-height: 4vh; -} \ No newline at end of file From e7e3b9a9230a0a2fada76f0636d1af7691e3d07c Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Sat, 17 Dec 2022 07:47:50 +0700 Subject: [PATCH 18/54] update note app project --- projects/{notes-taking-app => note-app}/index.html | 0 projects/{notes-taking-app => note-app}/index.js | 0 projects/{notes-taking-app => note-app}/style.css | 11 +++++------ 3 files changed, 5 insertions(+), 6 deletions(-) rename projects/{notes-taking-app => note-app}/index.html (100%) rename projects/{notes-taking-app => note-app}/index.js (100%) rename projects/{notes-taking-app => note-app}/style.css (91%) diff --git a/projects/notes-taking-app/index.html b/projects/note-app/index.html similarity index 100% rename from projects/notes-taking-app/index.html rename to projects/note-app/index.html diff --git a/projects/notes-taking-app/index.js b/projects/note-app/index.js similarity index 100% rename from projects/notes-taking-app/index.js rename to projects/note-app/index.js diff --git a/projects/notes-taking-app/style.css b/projects/note-app/style.css similarity index 91% rename from projects/notes-taking-app/style.css rename to projects/note-app/style.css index ba2c848..e220361 100644 --- a/projects/notes-taking-app/style.css +++ b/projects/note-app/style.css @@ -5,14 +5,14 @@ body { } .heading { - color: aliceblue; + color: darkblue; text-align: center; padding-top: 10px; font-size: 35px; } .info-text { text-align: center; - color: aliceblue; + color: darkblue; font-size: 18px; } @@ -26,18 +26,18 @@ body { .note { height: 200px; - box-sizing: border-box; padding: 17px; border-radius: 15px; resize: none; box-shadow: 0 0 3px rgba(0, 0, 0, 0.3); font-family: monospace; font-size: 18px; - color: gray; + color: darkblue; font-weight: 800; border: none; outline: none; background: rgba(255, 255, 255, 0.1); + box-sizing: border-box; } .note::placeholder { color: gray; @@ -52,8 +52,7 @@ body { .btn { height: 200px; - border: none; - outline: none; + border-color: rgba(255, 255, 255, 0.37); background: rgba(255, 255, 255, 0.27); border-radius: 15px; font-size: 70px; From ea83e76d551b58d057e653078534720f4e568862 Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Sun, 18 Dec 2022 07:28:24 +0700 Subject: [PATCH 19/54] update note app project --- projects/note-app/index.html | 9 ++--- projects/note-app/index.js | 65 +++++++++++++++++------------------- projects/note-app/style.css | 36 ++++++++++---------- 3 files changed, 54 insertions(+), 56 deletions(-) diff --git a/projects/note-app/index.html b/projects/note-app/index.html index a06cdb0..f61a1bd 100644 --- a/projects/note-app/index.html +++ b/projects/note-app/index.html @@ -4,20 +4,21 @@ - Note App + Document

Note App

Double click on a note to remove it

-
+
- + +
diff --git a/projects/note-app/index.js b/projects/note-app/index.js index 178aa19..c3b33e9 100644 --- a/projects/note-app/index.js +++ b/projects/note-app/index.js @@ -1,67 +1,64 @@ -const notesContainerEl = document.getElementById("app"); const btnEl = document.getElementById("btn"); +const appEl = document.getElementById("app"); getNotes().forEach((note) => { const noteEl = createNoteEl(note.id, note.content); - notesContainerEl.insertBefore(noteEl, btnEl); + appEl.insertBefore(noteEl, btnEl); }); -btnEl.addEventListener("click", () => addNote()); - -function getNotes() { - return JSON.parse(localStorage.getItem("note-ap") || "[]"); -} - -function saveNotes(notes) { - localStorage.setItem("note-ap", JSON.stringify(notes)); -} - function createNoteEl(id, content) { const element = document.createElement("textarea"); - element.classList.add("note"); - element.value = content; element.placeholder = "Empty Note"; - - element.addEventListener("input", () => { - updateNote(id, element.value); - }); + element.value = content; element.addEventListener("dblclick", () => { - const noteDelete = confirm("Want to Delete the note?"); - if (noteDelete) { + const warning = confirm("Do you want to delete this note?"); + if (warning) { deleteNote(id, element); } }); + element.addEventListener("input", () => { + updateNote(id, element.value); + }); + return element; } +function deleteNote(id, element) { + const notes = getNotes().filter((note)=>note.id != id) + saveNote(notes) + appEl.removeChild(element) +} + +function updateNote(id, content) { + const notes = getNotes(); + const target = notes.filter((note) => note.id == id)[0]; + target.content = content; + saveNote(notes); +} + function addNote() { const notes = getNotes(); const noteObj = { id: Math.floor(Math.random() * 100000), content: "", }; - const noteEl = createNoteEl(noteObj.id, noteObj.content); - notesContainerEl.insertBefore(noteEl, btnEl); + appEl.insertBefore(noteEl, btnEl); notes.push(noteObj); - saveNotes(notes); -} - -function updateNote(id, newContent) { - const notes = getNotes(); - const target = notes.filter((note) => note.id == id)[0]; - target.content = newContent; - saveNotes(notes); + saveNote(notes); } -function deleteNote(id, element) { - const notes = getNotes().filter((note) => note.id != id); +function saveNote(notes) { + localStorage.setItem("note-app", JSON.stringify(notes)); +} - saveNotes(notes); - notesContainerEl.removeChild(element); +function getNotes() { + return JSON.parse(localStorage.getItem("note-app") || "[]"); } + +btnEl.addEventListener("click", addNote); diff --git a/projects/note-app/style.css b/projects/note-app/style.css index e220361..47154de 100644 --- a/projects/note-app/style.css +++ b/projects/note-app/style.css @@ -1,7 +1,7 @@ body { - font-family: "Courier New", Courier, monospace; margin: 0; background: linear-gradient(to left, lightblue, lightgreen); + font-family: "Courier New", Courier, monospace; } .heading { @@ -10,6 +10,7 @@ body { padding-top: 10px; font-size: 35px; } + .info-text { text-align: center; color: darkblue; @@ -19,26 +20,25 @@ body { .app { display: grid; grid-template-columns: repeat(auto-fill, 300px); + gap: 40px; justify-content: center; padding: 50px; - gap: 40px; } .note { - height: 200px; padding: 17px; border-radius: 15px; resize: none; box-shadow: 0 0 3px rgba(0, 0, 0, 0.3); - font-family: monospace; font-size: 18px; + height: 200px; color: darkblue; - font-weight: 800; border: none; outline: none; background: rgba(255, 255, 255, 0.1); box-sizing: border-box; } + .note::placeholder { color: gray; opacity: 30%; @@ -50,19 +50,19 @@ body { transition: all 300ms ease; } -.btn { - height: 200px; - border-color: rgba(255, 255, 255, 0.37); - background: rgba(255, 255, 255, 0.27); - border-radius: 15px; - font-size: 70px; - font-weight: 700; - color: rgba(0, 0, 0, 0.3); - cursor: pointer; +.btn{ + height: 200px; + border-color: rgba(255, 255, 255, 0.37); + background: rgba(255, 255, 255, 0.27); + border-radius: 15px; + font-size: 70px; + font-weight: 700; + color: rgba(0, 0, 0, 0.3); + cursor: pointer; } -.btn:hover { - background: rgba(255, 255, 255, 0.55); - color: rgba(0, 0, 0, 0.6); - transition: all 300ms ease; +.btn:hover{ + background: rgba(255, 255, 255, 0.55); + color: rgba(0, 0, 0, 0.6); + transition: all 300ms ease; } From 43898730a9d27213b92d701a662c559bf98c1ac0 Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Sun, 18 Dec 2022 10:50:37 +0700 Subject: [PATCH 20/54] update bmi calculator project --- projects/bmi-calculator/index.html | 64 ++++++++++++++++-------------- projects/bmi-calculator/index.js | 23 +++++++++++ projects/bmi-calculator/script.js | 24 ----------- projects/bmi-calculator/style.css | 53 +++++++++++++++++++++++++ 4 files changed, 111 insertions(+), 53 deletions(-) create mode 100644 projects/bmi-calculator/index.js delete mode 100644 projects/bmi-calculator/script.js create mode 100644 projects/bmi-calculator/style.css diff --git a/projects/bmi-calculator/index.html b/projects/bmi-calculator/index.html index 77c1be9..45359e9 100644 --- a/projects/bmi-calculator/index.html +++ b/projects/bmi-calculator/index.html @@ -1,34 +1,40 @@ - - - - - + + + + BMI - - - -
-

Body Mass Index Calculator using Metric Units

- Your Height: -
- Your Weight: -
-
- Your BMI: -

+ + + +
+

Body Mass Index (BMI) Calculator

+ Your Height (cm): + + Your Weight (kg): + + + Your BMI: + +

+ Weight Condition: +

- - + + - - \ No newline at end of file diff --git a/projects/bmi-calculator/index.js b/projects/bmi-calculator/index.js new file mode 100644 index 0000000..f1e90ff --- /dev/null +++ b/projects/bmi-calculator/index.js @@ -0,0 +1,23 @@ +const btnEl = document.getElementById("btn"); +const BMIInputEl = document.getElementById("bmi"); +const weightConditionEl = document.getElementById("weight-condition"); + +function calculateBMI() { + const HeightValue = document.getElementById("height").value / 100; + + const weightValue = document.getElementById("weight").value; + const bmiValue = weightValue / (HeightValue * HeightValue); + BMIInputEl.value = bmiValue; + + if (bmiValue < 18.5) { + weightConditionEl.innerText = "Under weight"; + } else if (bmiValue >= 18.5 && bmiValue <= 24.9) { + weightConditionEl.innerText = "Normal weight"; + } else if (bmiValue >= 25 && bmiValue <= 29.9) { + weightConditionEl.innerText = "Overweight"; + } else if (bmiValue >= 30) { + weightConditionEl.innerText = "Obesity"; + } +} + +btnEl.addEventListener("click", calculateBMI); diff --git a/projects/bmi-calculator/script.js b/projects/bmi-calculator/script.js deleted file mode 100644 index 1fdba94..0000000 --- a/projects/bmi-calculator/script.js +++ /dev/null @@ -1,24 +0,0 @@ -function fun() - { - var cm = document.getElementById("cm").value ; - cm = cm/100; - var w = document.getElementById("weight").value; - var bmi = w/(cm*cm); - document.getElementById("bmi").value = bmi; - if(bmi<18.5) - { - document.querySelector("h4").innerHTML = 'Under weight'; - } - else if(bmi>=18.5 && bmi <=24.9) - { - document.querySelector("h4").innerHTML = 'Normal weight'; - } - else if(bmi>=25 && bmi <= 29.9) - { - document.querySelector("h4").innerHTML = 'Overweight'; - } - else if(bmi>=30) - { - document.querySelector("h4").innerHTML = 'Obesity'; - } - } \ No newline at end of file diff --git a/projects/bmi-calculator/style.css b/projects/bmi-calculator/style.css new file mode 100644 index 0000000..6c2c61b --- /dev/null +++ b/projects/bmi-calculator/style.css @@ -0,0 +1,53 @@ +body { + margin: 0; + display: flex; + min-height: 100vh; + justify-content: center; + align-items: center; + background: linear-gradient(to left bottom, lightgreen, lightblue); + font-family: "Courier New", Courier, monospace; +} + +.container { + background: rgba(255, 255, 255, 0.3); + padding: 20px; + display: flex; + flex-direction: column; + border-radius: 5px; + box-shadow: 0 10px 10px rgba(0, 0, 0, 0.3); + text-align: start; + margin: 5px; +} + +.heading { + font-size: 30px; +} + +.input { + padding: 10px 20px; + font-size: 18px; + background: rgba(255, 255, 255, 0.4); + border-color: rgba(255, 255, 255, 0.5); + margin: 10px; +} + +.btn { + background-color: lightgreen; + border: none; + padding: 10px 20px; + border-radius: 5px; + margin: 10px; + font-size: 20px; + cursor: pointer; + box-shadow: 0 0 4px rgba(0, 0, 0, 0.3); +} + +.btn:hover { + box-shadow: 0 0 8px rgba(0, 0, 0, 0.3); + transition: all 300ms ease; +} + +.info-text { + font-size: 20px; + font-weight: 500; +} From 772b5408cc6041c6c98716860c504c3a8714a97f Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Mon, 19 Dec 2022 17:19:50 +0700 Subject: [PATCH 21/54] update bmi project --- projects/bmi-calculator/index.html | 53 +++++++------------ projects/bmi-calculator/index.js | 11 ++-- projects/bmi-calculator/style.css | 81 +++++++++++++++--------------- 3 files changed, 64 insertions(+), 81 deletions(-) diff --git a/projects/bmi-calculator/index.html b/projects/bmi-calculator/index.html index 45359e9..fd167fe 100644 --- a/projects/bmi-calculator/index.html +++ b/projects/bmi-calculator/index.html @@ -1,40 +1,23 @@ - - - - - BMI - - - + + + + + BMI Calculator + + +
-

Body Mass Index (BMI) Calculator

- Your Height (cm): - - Your Weight (kg): - - - Your BMI: - -

- Weight Condition: -

+

Body Mass Index (BMI) Calculator

+ Your Height (cm): + + Your Weight (kg): + + + +

Weight Condition:

- - + + \ No newline at end of file diff --git a/projects/bmi-calculator/index.js b/projects/bmi-calculator/index.js index f1e90ff..b798ee0 100644 --- a/projects/bmi-calculator/index.js +++ b/projects/bmi-calculator/index.js @@ -1,13 +1,14 @@ const btnEl = document.getElementById("btn"); -const BMIInputEl = document.getElementById("bmi"); +const bmiInputEl = document.getElementById("bmi-result"); const weightConditionEl = document.getElementById("weight-condition"); function calculateBMI() { - const HeightValue = document.getElementById("height").value / 100; - + const heightValue = document.getElementById("height").value / 100; const weightValue = document.getElementById("weight").value; - const bmiValue = weightValue / (HeightValue * HeightValue); - BMIInputEl.value = bmiValue; + + const bmiValue = weightValue / (heightValue * heightValue); + + bmiInputEl.value = bmiValue; if (bmiValue < 18.5) { weightConditionEl.innerText = "Under weight"; diff --git a/projects/bmi-calculator/style.css b/projects/bmi-calculator/style.css index 6c2c61b..7d94328 100644 --- a/projects/bmi-calculator/style.css +++ b/projects/bmi-calculator/style.css @@ -1,53 +1,52 @@ -body { - margin: 0; - display: flex; - min-height: 100vh; - justify-content: center; - align-items: center; - background: linear-gradient(to left bottom, lightgreen, lightblue); - font-family: "Courier New", Courier, monospace; +body{ + margin: 0; + background: linear-gradient(to left bottom, lightgreen, lightblue); + display: flex; + min-height: 100vh; + justify-content: center; + align-items: center; + font-family: 'Courier New', Courier, monospace; } -.container { - background: rgba(255, 255, 255, 0.3); - padding: 20px; - display: flex; - flex-direction: column; - border-radius: 5px; - box-shadow: 0 10px 10px rgba(0, 0, 0, 0.3); - text-align: start; - margin: 5px; +.container{ + background: rgba(255,255,255, .3); + padding: 20px; + display: flex; + flex-direction: column; + border-radius: 5px; + box-shadow: 0 10px 10px rgba(0,0,0,.3); + margin: 5px; } -.heading { - font-size: 30px; +.heading{ + font-size: 30px; } -.input { - padding: 10px 20px; - font-size: 18px; - background: rgba(255, 255, 255, 0.4); - border-color: rgba(255, 255, 255, 0.5); - margin: 10px; +.input{ + padding: 10px 20px; + font-size: 18px; + background: rgba(255,255,255, .4); + border-color: rgba(255,255,255, .5); + margin: 10px; } -.btn { - background-color: lightgreen; - border: none; - padding: 10px 20px; - border-radius: 5px; - margin: 10px; - font-size: 20px; - cursor: pointer; - box-shadow: 0 0 4px rgba(0, 0, 0, 0.3); +.btn{ + background-color: lightgreen; + border: none; + padding: 10px 20px; + border-radius: 5px; + margin: 10px; + font-size: 20px; + box-shadow: 0 0 4px rgba(0,0,0,.3); + cursor: pointer; } -.btn:hover { - box-shadow: 0 0 8px rgba(0, 0, 0, 0.3); - transition: all 300ms ease; +.btn:hover{ + box-shadow: 0 0 8px rgba(0,0,0,.3); + transition: all 300ms ease; } -.info-text { - font-size: 20px; - font-weight: 500; -} +.info-text{ + font-size: 20px; + font-weight: 500; +} \ No newline at end of file From f7ab3df2388b41ed857abfd00940d48e8a40e2dc Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Wed, 21 Dec 2022 08:58:11 +0700 Subject: [PATCH 22/54] update 2 projects --- projects/temp-converter/icon.png | Bin 8895 -> 0 bytes projects/temp-converter/index.html | 74 ++++---- projects/temp-converter/index.js | 21 +++ projects/temp-converter/script.js | 39 ---- projects/temp-converter/style.css | 172 +++++------------- projects/weight-converter/Assets/Assets.png | Bin 76519 -> 0 bytes projects/weight-converter/index.html | 4 +- .../weight-converter/{app.js => index.js} | 0 8 files changed, 109 insertions(+), 201 deletions(-) delete mode 100644 projects/temp-converter/icon.png create mode 100644 projects/temp-converter/index.js delete mode 100644 projects/temp-converter/script.js delete mode 100644 projects/weight-converter/Assets/Assets.png rename projects/weight-converter/{app.js => index.js} (100%) diff --git a/projects/temp-converter/icon.png b/projects/temp-converter/icon.png deleted file mode 100644 index 496496ffd769a1c54c69803d111f89f9d3842bc5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8895 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 diff --git a/projects/temp-converter/index.html b/projects/temp-converter/index.html index b4911a9..b7efe8c 100644 --- a/projects/temp-converter/index.html +++ b/projects/temp-converter/index.html @@ -4,49 +4,47 @@ - Temperature Convertor -
-
-
Temperature Convertor
-
-
- - -
-
- - -
-
- - -
-
+
+
Temperature Convertor
+
+ +
-
+
+ + +
+
+ + +
+
- + diff --git a/projects/temp-converter/index.js b/projects/temp-converter/index.js new file mode 100644 index 0000000..f4c1cda --- /dev/null +++ b/projects/temp-converter/index.js @@ -0,0 +1,21 @@ +const celsiusEl = document.getElementById("celsius"); +const fahrenheitEl = document.getElementById("fahrenheit"); +const kelvinEl = document.getElementById("kelvin"); + +function computeTemp(e) { + const value = +e.target.value; + switch (e.target.name) { + case "celsius": + kelvinEl.value = (value + 273.32).toFixed(2); + fahrenheitEl.value = (value * 1.8 + 32).toFixed(2); + break; + case "fahrenheit": + celsiusEl.value = ((value - 32) / 1.8).toFixed(2); + result = kelvinEl.value = ((value - 32) / 1.8 + 273.15).toFixed(2); + break; + case "kelvin": + celsiusEl.value = (value - 273.15).toFixed(2); + fahrenheitEl.value = ((value - 273.15) * 1.8 + 32).toFixed(2); + break; + } +} diff --git a/projects/temp-converter/script.js b/projects/temp-converter/script.js deleted file mode 100644 index 2876905..0000000 --- a/projects/temp-converter/script.js +++ /dev/null @@ -1,39 +0,0 @@ -// taking input element -const celsius =document.getElementById('celsius'); -const fahrenheit =document.getElementById('fahrenheit'); -const kelvin =document.getElementById('kelvin'); - -const input_box = document.getElementsByClassName('input_box'); - -for(let i=0; i0N4o5X&e^6_6qbs5A*Bw1l3h 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

|B*v$H1foEqBRMs-T*KTSwzJPf!UjTHe8%<_*|y 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 - Weight Converstion Tool + Weight Conversion

- + diff --git a/projects/weight-converter/app.js b/projects/weight-converter/index.js similarity index 100% rename from projects/weight-converter/app.js rename to projects/weight-converter/index.js From 255472a73ec5c9e8a663ac6fec1002628a0cb8fa Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Wed, 21 Dec 2022 18:13:46 +0700 Subject: [PATCH 23/54] update temperature convertor project --- projects/temp-converter/index.js | 21 ---------- .../index.html | 21 +++++----- projects/temperature-convertor/index.js | 24 +++++++++++ .../style.css | 40 +++++++++---------- 4 files changed, 52 insertions(+), 54 deletions(-) delete mode 100644 projects/temp-converter/index.js rename projects/{temp-converter => temperature-convertor}/index.html (83%) create mode 100644 projects/temperature-convertor/index.js rename projects/{temp-converter => temperature-convertor}/style.css (70%) diff --git a/projects/temp-converter/index.js b/projects/temp-converter/index.js deleted file mode 100644 index f4c1cda..0000000 --- a/projects/temp-converter/index.js +++ /dev/null @@ -1,21 +0,0 @@ -const celsiusEl = document.getElementById("celsius"); -const fahrenheitEl = document.getElementById("fahrenheit"); -const kelvinEl = document.getElementById("kelvin"); - -function computeTemp(e) { - const value = +e.target.value; - switch (e.target.name) { - case "celsius": - kelvinEl.value = (value + 273.32).toFixed(2); - fahrenheitEl.value = (value * 1.8 + 32).toFixed(2); - break; - case "fahrenheit": - celsiusEl.value = ((value - 32) / 1.8).toFixed(2); - result = kelvinEl.value = ((value - 32) / 1.8 + 273.15).toFixed(2); - break; - case "kelvin": - celsiusEl.value = (value - 273.15).toFixed(2); - fahrenheitEl.value = ((value - 273.15) * 1.8 + 32).toFixed(2); - break; - } -} diff --git a/projects/temp-converter/index.html b/projects/temperature-convertor/index.html similarity index 83% rename from projects/temp-converter/index.html rename to projects/temperature-convertor/index.html index b7efe8c..20ae02d 100644 --- a/projects/temp-converter/index.html +++ b/projects/temperature-convertor/index.html @@ -9,42 +9,41 @@
-
Temperature Convertor
-
+

Temperature Convertor

+
-
+
-
+
- diff --git a/projects/temperature-convertor/index.js b/projects/temperature-convertor/index.js new file mode 100644 index 0000000..e2dfcf3 --- /dev/null +++ b/projects/temperature-convertor/index.js @@ -0,0 +1,24 @@ +const celsiusEl = document.getElementById("celsius"); +const fahrenheitEl = document.getElementById("fahrenheit"); +const kelvinEl = document.getElementById("kelvin"); + +function computeTemp(event) { + const currentValue = +event.target.value; + + switch (event.target.name) { + case "celsius": + kelvinEl.value = (currentValue + 273.32).toFixed(2); + fahrenheitEl.value = (currentValue * 1.8 + 32).toFixed(2); + break; + case "fahrenheit": + celsiusEl.value = ((currentValue - 32) / 1.8).toFixed(2); + kelvinEl.value = ((currentValue - 32) / 1.8 + 273.32).toFixed(2); + break; + case "kelvin": + celsiusEl.value = (currentValue - 273.32).toFixed(2); + fahrenheitEl.value = ((currentValue - 273.32) * 1.8 + 32).toFixed(2); + break; + default: + break; + } +} diff --git a/projects/temp-converter/style.css b/projects/temperature-convertor/style.css similarity index 70% rename from projects/temp-converter/style.css rename to projects/temperature-convertor/style.css index efb8122..ea02485 100644 --- a/projects/temp-converter/style.css +++ b/projects/temperature-convertor/style.css @@ -6,40 +6,35 @@ body { justify-content: center; align-items: center; font-family: monospace; - font-size: 1.25rem; color: darkcyan; } -.heading { - height: 58px; - line-height: 58px; - width: 100%; - font-size: 2rem; - font-weight: bolder; - text-align: center; - border-radius: 10px; - padding: 0 15px; - margin-bottom: 28px; -} .container { + background: rgba(255, 255, 255, 0.3); + padding: 20px; + box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3); + border-radius: 10px; width: 85%; max-width: 450px; min-width: 350px; - padding: 20px; display: flex; flex-direction: column; align-items: center; - border-radius: 10px; - background: rgba(255, 255, 255, 0.3); - box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3); } -.box { + +.heading { + font-size: 32px; +} + +.temp-container { width: 100%; padding: 15px; font-weight: bold; + font-size: 18px; } -.input_box { - width: 14rem; + +.input { + width: 220px; font-family: monospace; padding: 5px; float: right; @@ -47,9 +42,10 @@ body { background: rgba(255, 255, 255, 0.3); border-color: rgba(255, 255, 255, 0.5); color: darkgreen; - font-size: 1.25rem; + font-size: 18px; } -.input_box::placeholder { - color: darkgray; + +.input::placeholder{ + color: darkgray; } From 8017149cdc11738528606ab6cbd8da32ad366d05 Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Wed, 21 Dec 2022 21:33:16 +0700 Subject: [PATCH 24/54] update weight converter project --- projects/weight-converter/index.html | 40 ++++++++++++--------- projects/weight-converter/index.js | 54 +++++++++++++--------------- projects/weight-converter/style.css | 48 +++++++++++++++++++------ 3 files changed, 84 insertions(+), 58 deletions(-) diff --git a/projects/weight-converter/index.html b/projects/weight-converter/index.html index 0dba6e8..6e551de 100644 --- a/projects/weight-converter/index.html +++ b/projects/weight-converter/index.html @@ -1,22 +1,28 @@ - - - - - - Weight Conversion - - -
-
-

Weight Converter (pounds to kg)

-

Enter weight value in pounds:

- - -

Your weight in Kilograms is:

-
+ + + + + + Weight Converter + + +
+

Weight Converter

+
+ + +
+

Your weight in kg is:

+
- + diff --git a/projects/weight-converter/index.js b/projects/weight-converter/index.js index b992071..9ce859a 100644 --- a/projects/weight-converter/index.js +++ b/projects/weight-converter/index.js @@ -1,34 +1,28 @@ -const form = document.querySelector('form'); - +const inputEl = document.getElementById("input"); +const errorEl = document.getElementById("error"); +const resultsEl = document.getElementById("result"); //add an event listener to the form +let time; +let errorTime; + +function updateResults() { + if (inputEl.value <= 0 || isNaN(inputEl.value)) { + clearTimeout(errorTime); + errorEl.innerText = "Please enter a valid number!"; + errorTime = setTimeout(function () { + errorEl.innerText = ""; + }, 2000); + inputEl.value = ""; + } else { + clearTimeout(time); -form.addEventListener('submit', function(e){ - e.preventDefault(); - const input = document.querySelector('input'); - let results = document.querySelector('span'); - let poundsToKG; + resultsEl.innerText = (+inputEl.value / 2.2).toFixed(2); + time = setTimeout(function () { + resultsEl.innerText = ""; + inputEl.value = ""; + }, 10000); + } +} - if ((input.value <= 0) || (isNaN(input.value))){ - results.classList.add('error'); - results.innerHTML = "

Please enter a value number!

" - setTimeout(function(){ - results.innerHTML = ''; - - results.classList.remove('error'); - }, 2000) - input.value = ''; - } else { - poundsToKG = Number(input.value) / 2.2; - results.classList.add('no-error'); - results.innerHTML = `${poundsToKG.toFixed(2)}`; - setTimeout(function(){ - results.innerHTML = ''; - input.value = ''; - results.classList.remove('no-error'); - }, 10000) - - } - - -}) +inputEl.addEventListener("input", updateResults); diff --git a/projects/weight-converter/style.css b/projects/weight-converter/style.css index 67bd921..2d971a2 100644 --- a/projects/weight-converter/style.css +++ b/projects/weight-converter/style.css @@ -1,16 +1,42 @@ -form { - background-color: rgb(241, 9, 144); - color: white; - width: 500px; - height: 300px; - margin: 100px auto 100px; - padding: 25px; +body { + background: linear-gradient(to left top, yellow, lightblue, yellow); + min-height: 100vh; + margin: 0; + display: flex; + justify-content: center; + align-items: center; + font-family: "Courier New", Courier, monospace; + color: darkcyan; } -.error{ - color: red; +.container { + background: rgba(255, 255, 255, 0.3); + padding: 20px; + width: 85%; + max-width: 450px; + box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3); + border-radius: 10px; } -.no-error{ - color: rgb(6, 48, 2); +.input-container { + display: flex; + justify-content: space-between; + align-items: center; + font-size: 18px; + font-weight: 700; +} + +.input { + padding: 10px; + width: 70%; + background: rgba(255, 255, 255, 0.3); + border-color: rgba(255, 255, 255, 0.5); + font-size: 18px; + border-radius: 10px; + color: darkgreen; + outline: none; +} + +.error { + color: red; } From 45ef139e6d8e0afac7808cc43d1a22c71a07e38b Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Wed, 21 Dec 2022 21:35:34 +0700 Subject: [PATCH 25/54] fix the typo in temperature converter project --- .../index.html | 4 ++-- .../{temperature-convertor => temperature-converter}/index.js | 0 .../style.css | 0 3 files changed, 2 insertions(+), 2 deletions(-) rename projects/{temperature-convertor => temperature-converter}/index.html (93%) rename projects/{temperature-convertor => temperature-converter}/index.js (100%) rename projects/{temperature-convertor => temperature-converter}/style.css (100%) diff --git a/projects/temperature-convertor/index.html b/projects/temperature-converter/index.html similarity index 93% rename from projects/temperature-convertor/index.html rename to projects/temperature-converter/index.html index 20ae02d..dd23f99 100644 --- a/projects/temperature-convertor/index.html +++ b/projects/temperature-converter/index.html @@ -4,12 +4,12 @@ - Temperature Convertor + Temperature Converter
-

Temperature Convertor

+

Temperature Converter

Date: Thu, 22 Dec 2022 17:12:13 +0700 Subject: [PATCH 26/54] update weight converter project --- projects/weight-converter/index.html | 38 +++++++--------- projects/weight-converter/index.js | 22 ++++----- projects/weight-converter/style.css | 68 ++++++++++++++-------------- 3 files changed, 59 insertions(+), 69 deletions(-) diff --git a/projects/weight-converter/index.html b/projects/weight-converter/index.html index 6e551de..d441ffd 100644 --- a/projects/weight-converter/index.html +++ b/projects/weight-converter/index.html @@ -1,28 +1,22 @@ - - - - - + + + + Weight Converter - - + + +
-

Weight Converter

-
- - -
-

Your weight in kg is:

- +

Weight Converter

+
+ + +
+

Your weight in kg is:

+

- - + + \ No newline at end of file diff --git a/projects/weight-converter/index.js b/projects/weight-converter/index.js index 9ce859a..faf2a44 100644 --- a/projects/weight-converter/index.js +++ b/projects/weight-converter/index.js @@ -1,25 +1,21 @@ const inputEl = document.getElementById("input"); const errorEl = document.getElementById("error"); -const resultsEl = document.getElementById("result"); - -//add an event listener to the form -let time; +const resultEl = document.getElementById("result"); let errorTime; - +let resultTime; function updateResults() { if (inputEl.value <= 0 || isNaN(inputEl.value)) { - clearTimeout(errorTime); errorEl.innerText = "Please enter a valid number!"; - errorTime = setTimeout(function () { + clearTimeout(errorTime); + errorTime = setTimeout(() => { errorEl.innerText = ""; + inputEl.value = ""; }, 2000); - inputEl.value = ""; } else { - clearTimeout(time); - - resultsEl.innerText = (+inputEl.value / 2.2).toFixed(2); - time = setTimeout(function () { - resultsEl.innerText = ""; + resultEl.innerText = (+inputEl.value / 2.2).toFixed(2); + clearTimeout(resultTime); + resultTime = setTimeout(() => { + resultEl.innerText = ""; inputEl.value = ""; }, 10000); } diff --git a/projects/weight-converter/style.css b/projects/weight-converter/style.css index 2d971a2..e69936b 100644 --- a/projects/weight-converter/style.css +++ b/projects/weight-converter/style.css @@ -1,42 +1,42 @@ -body { - background: linear-gradient(to left top, yellow, lightblue, yellow); - min-height: 100vh; - margin: 0; - display: flex; - justify-content: center; - align-items: center; - font-family: "Courier New", Courier, monospace; - color: darkcyan; +body{ + margin: 0; + background: linear-gradient(to left top, yellow, lightblue, yellow); + min-height: 100vh; + display: flex; + justify-content: center; + align-items: center; + font-family: 'Courier New', Courier, monospace; + color: darkcyan; } -.container { - background: rgba(255, 255, 255, 0.3); - padding: 20px; - width: 85%; - max-width: 450px; - box-shadow: 0 4px 10px rgba(0, 0, 0, 0.3); - border-radius: 10px; +.container{ + background: rgba(255,255,255,0.3); + padding: 20px; + box-shadow: 0 4px 10px rgba(0,0,0,.3); + border-radius: 10px; + width: 85%; + max-width: 450px; } -.input-container { - display: flex; - justify-content: space-between; - align-items: center; - font-size: 18px; - font-weight: 700; +.input-container{ + display: flex; + justify-content: space-between; + align-items: center; + font-size: 18px; + font-weight: 700; } -.input { - padding: 10px; - width: 70%; - background: rgba(255, 255, 255, 0.3); - border-color: rgba(255, 255, 255, 0.5); - font-size: 18px; - border-radius: 10px; - color: darkgreen; - outline: none; +.input{ + padding: 10px; + width: 70%; + background: rgba(255,255,255,0.3); + border-color: rgba(255,255,255,0.5); + font-size: 18px; + border-radius: 10px; + color: darkgreen; + outline: none; } -.error { - color: red; -} +.error{ + color: red; +} \ No newline at end of file From 8811dbcbaa8d8b39d528d7056e5acbbecb23be7c Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Fri, 23 Dec 2022 18:55:10 +0700 Subject: [PATCH 27/54] update feedback UI project --- projects/feedback-ui/assets/review.png | Bin 1800 -> 0 bytes projects/feedback-ui/font/sans.ttf | Bin 55852 -> 0 bytes projects/feedback-ui/index.html | 31 +++----- projects/feedback-ui/index.js | 32 ++++++++ projects/feedback-ui/script.js | 29 -------- projects/feedback-ui/style.css | 97 +++++++------------------ 6 files changed, 69 insertions(+), 120 deletions(-) delete mode 100644 projects/feedback-ui/assets/review.png delete mode 100644 projects/feedback-ui/font/sans.ttf create mode 100644 projects/feedback-ui/index.js delete mode 100644 projects/feedback-ui/script.js diff --git a/projects/feedback-ui/assets/review.png b/projects/feedback-ui/assets/review.png deleted file mode 100644 index 12102214dab13333fcf607fd98027f590c6567b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1800 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 z 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 diff --git a/projects/feedback-ui/index.html b/projects/feedback-ui/index.html index bf8cda1..da15c92 100644 --- a/projects/feedback-ui/index.html +++ b/projects/feedback-ui/index.html @@ -4,45 +4,32 @@ - Feedback UI -

Feedback Design UI

-
-

- How satisfied are you with our
- customer support performance? -

-
+
+

Feedback UI

+ +
- + Unhappy
- + Neutral
- + Satisfied
- +
- + diff --git a/projects/feedback-ui/index.js b/projects/feedback-ui/index.js new file mode 100644 index 0000000..015bb66 --- /dev/null +++ b/projects/feedback-ui/index.js @@ -0,0 +1,32 @@ +const ratingEls = document.querySelectorAll(".rating"); +const ratingsContainerEl = document.getElementById("ratings-container"); +const btnEl = document.getElementById("btn"); +const containerEl = document.getElementById("container"); +let selectedRating = ""; + +ratingEls.forEach((ratingEl) => { + ratingEl.addEventListener("click", (e) => { + removeActive(); + selectedRating = e.target.innerText || e.target.parentNode.innerText; + e.target.parentNode.classList.add("active"); + e.target.classList.add("active"); + }); +}); + +btnEl.addEventListener("click", () => { + if (selectedRating !== "") { + containerEl.innerHTML = ` + Thank You! +
+
+ Feedback : ${selectedRating} +

We'll use your feedback to improve our customer support.

+ `; + } +}); + +function removeActive() { + ratingEls.forEach((ratingEl) => { + ratingEl.classList.remove("active"); + }); +} diff --git a/projects/feedback-ui/script.js b/projects/feedback-ui/script.js deleted file mode 100644 index 60bfd0f..0000000 --- a/projects/feedback-ui/script.js +++ /dev/null @@ -1,29 +0,0 @@ -const ratings = document.querySelectorAll(".rating"); -const ratingsContainer = document.querySelector(".ratings-container"); -const sendBtn = document.querySelector("#send"); -const panel = document.querySelector("#panel"); -let selectedRating = "Unhappy"; - -ratingsContainer.addEventListener("click", (e) => { - console.log(e.target.parentNode.innerText); - removeActive(); - selectedRating = e.target.innerText || e.target.parentNode.innerText; - e.target.parentNode.classList.toggle("active"); - e.target.classList.toggle("active"); -}); - -sendBtn.addEventListener("click", (e) => { - panel.innerHTML = ` - - Thank You! -
- Feedback : ${selectedRating} -

We'll use your feedback to improve our customer support.

- `; -}); - -function removeActive() { - for (let i = 0; i < ratings.length; i++) { - ratings[i].classList.remove("active"); - } -} diff --git a/projects/feedback-ui/style.css b/projects/feedback-ui/style.css index ef76253..9682dce 100644 --- a/projects/feedback-ui/style.css +++ b/projects/feedback-ui/style.css @@ -1,79 +1,48 @@ -* { - padding: 0; - box-sizing: border-box; - font-family: "sans"; -} - -@font-face { - font-family: "sans"; - src: url(font/sans.ttf); -} - body { - overflow: hidden; - background: #19172e; - color: #fff; + margin: 0; + background: lightcyan; + color: darkgreen; display: flex; align-items: center; justify-content: center; min-height: 100vh; + font-family: monospace; } -footer, a, h3,small { - color: #fff; -} - -h1 { - color: #fff; +.heading { text-align: center; - position: absolute; - left: 0; - right: 0; - top: 0; - padding-top: 10px; + margin: 5px; + font-size: 30px; } -.box { - background: rgba(255, 255, 255, 0.05); - box-shadow: 0 15px 25px rgba(0, 0, 0, 0.1); +.container { + background: rgba(255, 255, 255, 0.3); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.3); border-radius: 10px; - backdrop-filter: blur(20px); - padding: 1rem; - width: 400px; - text-align: center; -} - -.panel-container { - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - text-align: center; - padding: 30px; + padding: 20px; max-width: 400px; -} - -.panel-container strong { - line-height: 20px; + width: 85%; + text-align: center; + font-size: 20px; } .ratings-container { display: flex; - margin: 20px 0; + padding: 20px 0; } .rating { - flex: 1; cursor: pointer; - padding: 20px; + padding: 10px; margin: 10px 5px; } .rating:hover, .rating.active { - border-radius: 4px; + border-radius: 10px; box-shadow: 0 0 10px rgba(0, 0, 0, 0.3); - background: salmon; + background: darkseagreen; + transition: all 300ms ease; } .rating img { @@ -81,40 +50,30 @@ h1 { } .rating small { - display: inline-block; - margin: 10px 0 0; + margin: 5px 0; + font-size: 18px; } .rating:hover small, .rating.active small { - color: green; + color: aliceblue; } .btn { - background-color: #302d2b; + background-color: darkcyan; color: #fff; border: 0; + margin: 10px; border-radius: 4px; padding: 12px 30px; cursor: pointer; } -.btn:focus { - outline: 0; +.btn:hover { + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.3); + transition: all 300ms ease; } .btn:active { - transform: scale(0.98); + transform: scale(0.96); } - -.fa-heart { - color: red; - font-size: 30px; - margin-bottom: 10px; -} - -footer { - text-align: center; - position: absolute; - bottom: 0; -} \ No newline at end of file From 420c6ab233216d2a429716d6e46abef08fb7df8a Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Sat, 24 Dec 2022 16:12:39 +0700 Subject: [PATCH 28/54] update the feedback ui project --- projects/feedback-ui/index.html | 12 +++------ projects/feedback-ui/index.js | 18 +++++++------ projects/feedback-ui/style.css | 45 +++++++++++++-------------------- 3 files changed, 32 insertions(+), 43 deletions(-) diff --git a/projects/feedback-ui/index.html b/projects/feedback-ui/index.html index da15c92..3101d24 100644 --- a/projects/feedback-ui/index.html +++ b/projects/feedback-ui/index.html @@ -2,26 +2,23 @@ + - Feedback UI + - -
+

Feedback UI

-
Unhappy
-
- + Neutral
-
Satisfied @@ -29,7 +26,6 @@

Feedback UI

- diff --git a/projects/feedback-ui/index.js b/projects/feedback-ui/index.js index 015bb66..5bf81a0 100644 --- a/projects/feedback-ui/index.js +++ b/projects/feedback-ui/index.js @@ -1,27 +1,29 @@ const ratingEls = document.querySelectorAll(".rating"); -const ratingsContainerEl = document.getElementById("ratings-container"); const btnEl = document.getElementById("btn"); + const containerEl = document.getElementById("container"); + let selectedRating = ""; ratingEls.forEach((ratingEl) => { - ratingEl.addEventListener("click", (e) => { + ratingEl.addEventListener("click", (event) => { removeActive(); - selectedRating = e.target.innerText || e.target.parentNode.innerText; - e.target.parentNode.classList.add("active"); - e.target.classList.add("active"); + selectedRating = + event.target.innerText || event.target.parentNode.innerText; + event.target.classList.add("active"); + event.target.parentNode.classList.add("active"); }); }); btnEl.addEventListener("click", () => { if (selectedRating !== "") { containerEl.innerHTML = ` - Thank You! + Thank you!

- Feedback : ${selectedRating} + Feedback: ${selectedRating}

We'll use your feedback to improve our customer support.

- `; + `; } }); diff --git a/projects/feedback-ui/style.css b/projects/feedback-ui/style.css index 9682dce..7e1c812 100644 --- a/projects/feedback-ui/style.css +++ b/projects/feedback-ui/style.css @@ -1,31 +1,30 @@ body { margin: 0; - background: lightcyan; + background-color: lightcyan; color: darkgreen; display: flex; - align-items: center; - justify-content: center; min-height: 100vh; + justify-content: center; + align-items: center; font-family: monospace; } -.heading { - text-align: center; - margin: 5px; - font-size: 30px; -} - .container { background: rgba(255, 255, 255, 0.3); box-shadow: 0 5px 10px rgba(0, 0, 0, 0.3); border-radius: 10px; padding: 20px; - max-width: 400px; width: 85%; + max-width: 400px; text-align: center; font-size: 20px; } +.heading { + margin: 5px; + font-size: 30px; +} + .ratings-container { display: flex; padding: 20px 0; @@ -38,30 +37,18 @@ body { } .rating:hover, -.rating.active { +.rating.active +{ + background: darkseagreen; border-radius: 10px; box-shadow: 0 0 10px rgba(0, 0, 0, 0.3); - background: darkseagreen; - transition: all 300ms ease; -} - -.rating img { - width: 40px; -} - -.rating small { - margin: 5px 0; - font-size: 18px; -} - -.rating:hover small, -.rating.active small { color: aliceblue; + transition: all 300ms ease; } .btn { background-color: darkcyan; - color: #fff; + color: aliceblue; border: 0; margin: 10px; border-radius: 4px; @@ -77,3 +64,7 @@ body { .btn:active { transform: scale(0.96); } + +.rating img { + width: 40px; +} From b3160367ea386e734c7cfbf4199787485ac4bd7e Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Mon, 26 Dec 2022 09:06:03 +0700 Subject: [PATCH 29/54] update Dad Joke Generator project --- projects/dad-jokes-generator/index.html | 18 + projects/dad-jokes-generator/index.js | 37 + projects/dad-jokes-generator/style.css | 54 + projects/project-idea-generator/index.html | 43 - .../project-idea-generator/src/css/styles.css | 102 -- .../project-idea-generator/src/js/main.js | 15 - .../project-idea-generator/src/js/projects.js | 1514 ----------------- 7 files changed, 109 insertions(+), 1674 deletions(-) create mode 100644 projects/dad-jokes-generator/index.html create mode 100644 projects/dad-jokes-generator/index.js create mode 100644 projects/dad-jokes-generator/style.css delete mode 100644 projects/project-idea-generator/index.html delete mode 100644 projects/project-idea-generator/src/css/styles.css delete mode 100644 projects/project-idea-generator/src/js/main.js delete mode 100644 projects/project-idea-generator/src/js/projects.js diff --git a/projects/dad-jokes-generator/index.html b/projects/dad-jokes-generator/index.html new file mode 100644 index 0000000..36c32fb --- /dev/null +++ b/projects/dad-jokes-generator/index.html @@ -0,0 +1,18 @@ + + + + + + + Dad Joke Generator + + + +
+

Dad Joke Generator

+

Dad Joke

+ +
+ + + diff --git a/projects/dad-jokes-generator/index.js b/projects/dad-jokes-generator/index.js new file mode 100644 index 0000000..6bbe74d --- /dev/null +++ b/projects/dad-jokes-generator/index.js @@ -0,0 +1,37 @@ +const btnEl = document.getElementById("btn"); +const jokeEl = document.getElementById("joke"); + +const apiKey = "SAXb3lrT9IIorMjQkAFWBg==KCDQCZgWgcoAU4ai"; + +const options = { + method: "GET", + headers: { + "X-Api-Key": apiKey, + }, +}; + +const apiURL = `https://api.api-ninjas.com/v1/dadjokes?limit=1`; + +async function getJoke() { + try { + btnEl.innerText = "Loading..."; + btnEl.disabled = true; + jokeEl.innerText = "Updating..."; + const response = await fetch(apiURL, options); + const data = await response.json(); + const jokeContent = data[0].joke; + jokeEl.innerText = jokeContent; + btnEl.innerText = "Tell me a joke"; + btnEl.disabled = false; + console.log(data); + } catch (error) { + console.log(error); + jokeEl.innerText = "An error happened, try again later"; + btnEl.innerText = "Tell me a joke"; + btnEl.disabled = false; + } +} + +getJoke(); + +btnEl.addEventListener("click", getJoke); diff --git a/projects/dad-jokes-generator/style.css b/projects/dad-jokes-generator/style.css new file mode 100644 index 0000000..5e7e85a --- /dev/null +++ b/projects/dad-jokes-generator/style.css @@ -0,0 +1,54 @@ +body { + margin: 0; + display: flex; + min-height: 100vh; + justify-content: center; + align-items: center; + font-family: monospace; + background: linear-gradient(to left bottom, lightblue, lightpink, lightblue); +} + +.container { + background-color: rgba(255, 255, 255, 0.3); + box-shadow: 0 6px 10px rgba(0, 0, 0, 0.3); + padding: 20px; + border-radius: 15px; + width: 85%; + text-align: center; + color: darkgreen; +} + +.heading { + font-size: 35px; + font-weight: 200; + font-family: Impact; + letter-spacing: 2px; + + text-shadow: 5px 5px 2px rgba(0, 0, 0, 0.3); +} + +.joke { + font-size: 25px; + font-weight: 500; + margin: 40px; +} + +.btn { + font-size: 18px; + font-weight: 700; + border-radius: 5px; + cursor: pointer; + padding: 10px; + margin-top: 15px; + background-color: rgba(255, 255, 255, 0.3); + border-color: rgba(255, 255, 255, 0.6); + text-transform: uppercase; + width: 300px; + color: darkgreen; +} + +.btn:hover { + background-color: rgba(255, 255, 255, 0.5); + box-shadow: 0 4px 4px rgba(0, 0, 0, 0.3); + transition: all 300ms ease; +} diff --git a/projects/project-idea-generator/index.html b/projects/project-idea-generator/index.html deleted file mode 100644 index 5262bbf..0000000 --- a/projects/project-idea-generator/index.html +++ /dev/null @@ -1,43 +0,0 @@ - - - - - Project Idea Generator - - - - - - - - - -

Project Idea Generator

-

- Generate your next coding project
-
- Note: Some projects may be in a specific language but you - can try doing them in a language you like! -

- -
- -

-
- - - - - diff --git a/projects/project-idea-generator/src/css/styles.css b/projects/project-idea-generator/src/css/styles.css deleted file mode 100644 index 2e23832..0000000 --- a/projects/project-idea-generator/src/css/styles.css +++ /dev/null @@ -1,102 +0,0 @@ -* { - box-sizing: border-box; - padding: 10px -} -body { - position: relative; - margin: 0; - padding: 0; - font-family: 'Poppins', sans-serif; - text-align: center; - color: black; - background: #3498DB; -} - -h1 { - display: block; - font-family: 'Poppins', sans-serif; - text-align: center; -} - -h2 { - font-weight: 500; - font-size: 24px; -} - -.fa-code { - font-size: 30px; - font-weight: bolder; - color: white; -} - -h3 { - font-weight: 500; -} - -a { - color: inherit; - text-decoration: underline; -} - -p { - color: white; -} - -.title { - font-weight: 600; - color: white; - font-size: 54px; - padding: 0 16px; -} - -#generate-project { - padding: 15px 40px; - background: none; - border: 3px solid white; - border-radius: 10px; - font-family: 'Poppins', sans-serif; - font-size: 24px; - cursor: pointer; - transition: all 0.3s ease; -} - -#generate-project:hover { - background: white; -} - -#give-idea { - padding: 10px 20px; - background: none; - border: 3px solid white; - border-radius: 10px; - font-family: 'Poppins', sans-serif; - font-size: 16px; - cursor: pointer; - transition: all 0.3s ease; -} - -.fa-github { - font-size: 20px; - font-weight: 600; -} - -#give-idea:hover { - background: white; -} - -#new-project { - margin-top: 20px; - font-size: 44px; -} - -#project-generation { - font-size: 50px; -} - -#project-generation span { - margin-top: 70px; -} - -ul li { - list-style-type: none; -} \ No newline at end of file diff --git a/projects/project-idea-generator/src/js/main.js b/projects/project-idea-generator/src/js/main.js deleted file mode 100644 index 3b8dee5..0000000 --- a/projects/project-idea-generator/src/js/main.js +++ /dev/null @@ -1,15 +0,0 @@ -document.getElementById("generate-project").addEventListener( - "click", - function() { - let project = projects[Math.floor(Math.random() * projects.length)]; - let link = document.getElementById('new-project') - - if (project.link !== "") { - link.innerHTML = ` - ${project.title} - `; - } else { - link.innerHTML = `${project.title}`; - }; - } - ); \ No newline at end of file diff --git a/projects/project-idea-generator/src/js/projects.js b/projects/project-idea-generator/src/js/projects.js deleted file mode 100644 index 4637c82..0000000 --- a/projects/project-idea-generator/src/js/projects.js +++ /dev/null @@ -1,1514 +0,0 @@ -let projects = [ - { - "title": "Build Your Own Text Editor", - "link": "https://viewsourcecode.org/snaptoken/kilo/index.html" - }, - { - "title": "Let's Build a Simple Database", - "link": "https://cstack.github.io/db_tutorial" - }, - { - "title": "Build a spell-checker in Clojure", - "link": "https://bernhardwenzel.com/articles/clojure-spellchecker/" - }, - { - "title": "Build a Twitter Bot in Clojure", - "link": "https://howistart.org/posts/clojure/1/index.html" - }, - { - "title": "Build an Intrpreter", - "link": "https://www.craftinginterpreters.com/" - }, - { - "title": "Write a Shell in C", - "link": "https://brennan.io/2015/01/16/write-a-shell-in-c/" - }, - { - "title": "Build your own Lisp", - "link": "http://www.buildyourownlisp.com/" - }, - { - "title": "Write an OS from scratch", - "link": "https://github.com/tuhdo/os01" - }, - { - "title": "How to create an OS from scratch", - "link": "https://github.com/cfenollosa/os-tutorial" - }, - { - "title": "Building a Simple Chat App With Elixir and Phoenix", - "link": "https://sheharyar.me/blog/simple-chat-phoenix-elixir/" - }, - { - "title": "Write a super fast link shortener with Elixir, Phoenix, and Mnesia", - "link": "https://medium.com/free-code-camp/how-to-write-a-super-fast-link-shortener-with-elixir-phoenix-and-mnesia-70ffa1564b3c" - }, - { - "title": "Write your own Excel in 100 lines of F#", - "link": "http://tomasp.net/blog/2018/write-your-own-excel/" - }, - { - "title": "ChatBus : build your first multi-user chat room app with Erlang/OTP", - "link": "https://medium.com/@kansi/chatbus-build-your-first-multi-user-chat-room-app-with-erlang-otp-b55f72064901" - }, - { - "title": "How to Write a Jupyter Notebook Extension", - "link": "https://towardsdatascience.com/how-to-write-a-jupyter-notebook-extension-a63f9578a38c" - }, - { - "title": "Build a React Native Todo Application", - "link": "https://egghead.io/courses/build-a-react-native-todo-application" - }, - { - "title": "How to build a news app with React Native", - "link": "https://www.freecodecamp.org/news/create-a-news-app-using-react-native-ced249263627/" - }, - { - "title": "Reverse a String", - "link": "" - }, - { - "title": "RSS Feed Creator", - "link": "" - }, - { - "title": "P2P File Sharing App", - "link": "" - }, - { - "title": "Hotel Reservation System", - "link": "" - }, - { - "title": "WYSIWG Editor", - "link": "" - }, - { - "title": "CAPTCHA Maker", - "link": "" - }, - { - "title": "Build the Hangman game", - "link": "" - }, - { - "title": "Build a microblog with Flask", - "link": "https://blog.miguelgrinberg.com/post/the-flask-mega-tutorial-part-i-hello-world" - }, - { - "title": "Mining Twitter Data with Python", - "link": "https://marcobonzanini.com/2015/03/02/mining-twitter-data-with-python-part-1/" - }, - { - "title": "Build a Job Scrapping Web App", - "link": "https://www.freecodecamp.org/news/how-i-built-a-job-scraping-web-app-using-node-js-and-indreed-7fbba124bbdc/" - }, - { - "title": "Create a Character voting app", - "link": "http://sahatyalkabov.com/create-a-character-voting-app-using-react-nodejs-mongodb-and-socketio/" - }, - { - "title": "Build Git from Scratch", - "link": "http://gitlet.maryrosecook.com/docs/gitlet.html" - }, - { - "title": "Build a TCP/IP stack in C", - "link": "https://www.saminiir.com/lets-code-tcp-ip-stack-1-ethernet-arp/" - }, - { - "title": "Build a Network Stack in Ruby", - "link": "https://medium.com/geckoboard-under-the-hood/how-to-build-a-network-stack-in-ruby-f73aeb1b661b" - }, - { - "title": "C++: Introduction to Ray Tracing: a Simple Method for Creating 3D Images", - "link": "https://www.scratchapixel.com/lessons/3d-basic-rendering/introduction-to-ray-tracing/how-does-it-work" - }, - { - "title": "C++: How OpenGL works: software rendering in 500 lines of code", - "link": "https://github.com/ssloy/tinyrenderer/wiki" - }, - { - "title": "C++: Raycasting engine of Wolfenstein 3D", - "link": "http://lodev.org/cgtutor/raycasting.html" - }, - { - "title": "C++: Physically Based Rendering:From Theory To Implementation", - "link": "http://www.pbr-book.org/" - }, - { - "title": "C++: Rasterization: a Practical Implementation", - "link": "https://www.scratchapixel.com/lessons/3d-basic-rendering/rasterization-practical-implementation/overview-rasterization-algorithm" - }, - { - "title": "C# / TypeScript / JavaScript: Learning how to write a 3D soft engine from scratch in C#, TypeScript or JavaScript", - "link": "https://www.davrous.com/2013/06/13/tutorial-series-learning-how-to-write-a-3d-soft-engine-from-scratch-in-c-typescript-or-javascript/" - }, - { - "title": "Java / JavaScript: Build your own 3D renderer", - "link": "https://avik-das.github.io/build-your-own-raytracer/" - }, - { - "title": "Java: How to create your own simple 3D render engine in pure Java", - "link": "http://blog.rogach.org/2015/08/how-to-create-your-own-simple-3d-render.html" - }, - { - "title": "JavaScript / Pseudocode: Computer Graphics from scratch", - "link": "http://www.gabrielgambetta.com/computer-graphics-from-scratch/introduction.html" - }, - { - "title": "Python: A 3D Modeller", - "link": "http://aosabook.org/en/500L/a-3d-modeller.html" - }, - { - "title": "C#: How To: Augmented Reality App Tutorial for Beginners with Vuforia and Unity 3D", - "link": "https://www.youtube.com/watch?v=uXNjNcqW4kY" - }, - { - "title": "C#: How To Unity ARCore", - "link": "https://www.youtube.com/playlist?list=PLKIKuXdn4ZMjuUAtdQfK1vwTZPQn_rgSv" - }, - { - "title": "C#: AR Portal Tutorial with Unity", - "link": "https://www.youtube.com/playlist?list=PLPCqNOwwN794Gz5fzUSi1p4OqLU0HTmvn" - }, - { - "title": "C#: How to create a Dragon in Augmented Reality in Unity ARCore", - "link": "https://fr-film.net/v-how-to-create-a-dragon-in-augmented-reality-in-unity-arcore-tutorial-qTSDPkPyPqs.html" - }, - { - "title": "C#: How to Augmented Reality AR Tutorial: ARKit Portal to the Upside Down", - "link": "https://www.youtube.com/watch?v=Z5AmqMuNi08" - }, - { - "title": "Python: Augmented Reality with Python and OpenCV", - "link": "https://bitesofcode.wordpress.com/2017/09/12/augmented-reality-with-python-and-opencv-part-1/" - }, - { - "title": "C#: Building a BitTorrent client from scratch in C#", - "link": "https://www.seanjoflynn.com/research/bittorrent.html" - }, - { - "title": "Go: Building a BitTorrent client from the ground up in Go", - "link": "https://blog.jse.li/posts/torrent/" - }, - { - "title": "Nim: Writing a Bencode Parser", - "link": "https://xmonader.github.io/nimdays/day02_bencode.html" - }, - { - "title": "Node.js: Write your own bittorrent client", - "link": "https://allenkim67.github.io/programming/2016/05/04/how-to-make-your-own-bittorrent-client.html" - }, - { - "title": "Python: A BitTorrent client in Python 3.5", - "link": "http://markuseliasson.se/article/bittorrent-in-python/" - }, - { - "title": "ATS: Functional Blockchain", - "link": "https://beta.observablehq.com/@galletti94/functional-blockchain" - }, - { - "title": "C#: Programming The Blockchain in C#", - "link": "https://programmingblockchain.gitbooks.io/programmingblockchain/" - }, - { - "title": "Crystal: Write your own blockchain and PoW algorithm using Crystal", - "link": "https://medium.com/@bradford_hamilton/write-your-own-blockchain-and-pow-algorithm-using-crystal-d53d5d9d0c52" - }, - { - "title": "Go: Building Blockchain in Go", - "link": "https://jeiwan.cc/posts/building-blockchain-in-go-part-1/" - }, - { - "title": "Go: Code your own blockchain in less than 200 lines of Go", - "link": "https://medium.com/@mycoralhealth/code-your-own-blockchain-in-less-than-200-lines-of-go-e296282bcffc" - }, - { - "title": "Java: Creating Your First Blockchain with Java", - "link": "https://medium.com/programmers-blockchain/create-simple-blockchain-java-tutorial-from-scratch-6eeed3cb03fa" - }, - { - "title": "JavaScript: A cryptocurrency implementation in less than 1500 lines of code", - "link": "https://github.com/conradoqg/naivecoin" - }, - { - "title": "JavaScript: Build your own Blockchain in JavaScript", - "link": "https://github.com/nambrot/blockchain-in-js" - }, - { - "title": "JavaScript: Learn & Build a JavaScript Blockchain", - "link": "https://medium.com/digital-alchemy-holdings/learn-build-a-javascript-blockchain-part-1-ca61c285821e" - }, - { - "title": "JavaScript: Creating a blockchain with JavaScript", - "link": "https://github.com/SavjeeTutorials/SavjeeCoin" - }, - { - "title": "JavaScript: How To Launch Your Own Production-Ready Cryptocurrency", - "link": "https://hackernoon.com/how-to-launch-your-own-production-ready-cryptocurrency-ab97cb773371" - }, - { - "title": "JavaScript: Writing a Blockchain in Node.js", - "link": "https://www.jsmonday.dev/articles/34/writing-a-blockchain-in-node-js" - }, - { - "title": "Kotlin: Let’s implement a cryptocurrency in Kotlin", - "link": "https://medium.com/@vasilyf/lets-implement-a-cryptocurrency-in-kotlin-part-1-blockchain-8704069f8580" - }, - { - "title": "Python: Learn Blockchains by Building One", - "link": "https://hackernoon.com/learn-blockchains-by-building-one-117428612f46" - }, - { - "title": "Python: Build your own blockchain: a Python tutorial", - "link": "http://ecomunsing.com/build-your-own-blockchain" - }, - { - "title": "Python: A Practical Introduction to Blockchain with Python", - "link": "http://adilmoujahid.com/posts/2018/03/intro-blockchain-bitcoin-python/" - }, - { - "title": "Python: Let’s Build the Tiniest Blockchain", - "link": "https://medium.com/crypto-currently/lets-build-the-tiniest-blockchain-e70965a248b" - }, - { - "title": "Ruby: Programming Blockchains Step-by-Step (Manuscripts Book Edition)", - "link": "https://github.com/yukimotopress/programming-blockchains-step-by-step" - }, - { - "title": "Scala: How to build a simple actor-based blockchain", - "link": "https://medium.freecodecamp.org/how-to-build-a-simple-actor-based-blockchain-aac1e996c177" - }, - { - "title": "TypeScript: Naivecoin: a tutorial for building a cryptocurrency", - "link": "https://lhartikk.github.io/" - }, - { - "title": "TypeScript: NaivecoinStake: a tutorial for building a cryptocurrency with the Proof of Stake consensus", - "link": "https://naivecoinstake.learn.uno/" - }, - { - "title": "Haskell: Roll your own IRC bot", - "link": "https://wiki.haskell.org/Roll_your_own_IRC_bot" - }, - { - "title": "Java: How To Make a Scary Russian Twitter Bot With Java", - "link": "https://medium.com/@SeloSlav/how-to-make-a-scary-russian-twitter-bot-with-java-b7b62768a3ac" - }, - { - "title": "Node.js: Creating a Simple Facebook Messenger AI Bot with API.ai in Node.js", - "link": "https://tutorials.botsfloor.com/creating-a-simple-facebook-messenger-ai-bot-with-api-ai-in-node-js-50ae2fa5c80d" - }, - { - "title": "Node.js: How to make a responsive telegram bot", - "link": "https://www.sohamkamani.com/blog/2016/09/21/making-a-telegram-bot/" - }, - { - "title": "Node.js: Create a Discord bot", - "link": "https://discordjs.guide/" - }, - { - "title": "Node.js: gifbot - Building a GitHub App", - "link": "https://blog.scottlogic.com/2017/05/22/gifbot-github-integration.html" - }, - { - "title": "Node.js: Building A Simple AI Chatbot With Web Speech API And Node.js", - "link": "https://www.smashingmagazine.com/2017/08/ai-chatbot-web-speech-api-node-js/" - }, - { - "title": "Python: Chatbot Fundamentals: An interactive guide to writing bots in Python", - "link": "https://apps.worldwritable.com/tutorials/chatbot/" - }, - { - "title": "Python: How to Build Your First Slack Bot with Python", - "link": "https://www.fullstackpython.com/blog/build-first-slack-bot-python.html" - }, - { - "title": "Python: How to build a Slack Bot with Python using Slack Events API & Django under 20 minute", - "link": "https://medium.com/freehunch/how-to-build-a-slack-bot-with-python-using-slack-events-api-django-under-20-minute-code-included-269c3a9bf64e" - }, - { - "title": "Python: Build a Reddit Bot", - "link": "http://pythonforengineers.com/build-a-reddit-bot-part-1/" - }, - { - "title": "Python: How To Make A Reddit Bot", - "link": "https://www.youtube.com/watch?v=krTUf7BpTc0" - }, - { - "title": "Python: How To Create a Telegram Bot Using Python", - "link": "https://khashtamov.com/en/how-to-create-a-telegram-bot-using-python/" - }, - { - "title": "Python: Create a Twitter Bot in Python Using Tweepy", - "link": "https://medium.freecodecamp.org/creating-a-twitter-bot-in-python-with-tweepy-ac524157a607" - }, - { - "title": "Python: Creating Reddit Bot with Python & PRAW", - "link": "https://www.youtube.com/playlist?list=PLIFBTFgFpoJ9vmYYlfxRFV6U_XhG-4fpP" - }, - { - "title": "R: Build A Cryptocurrency Trading Bot with R", - "link": "https://towardsdatascience.com/build-a-cryptocurrency-trading-bot-with-r-1445c429e1b1" - }, - { - "title": "Rust: A bot for Starcraft in Rust, C or any other language", - "link": "https://habr.com/en/post/436254/" - }, - { - "title": "C: Rewriting the cat command from scratch", - "link": "https://learnto.computer/screencasts/bsd-cat" - }, - { - "title": "Go: Visualize your local git contributions with Go", - "link": "https://flaviocopes.com/go-git-contributions/" - }, - { - "title": "Go: Build a command line app with Go: lolcat", - "link": "https://flaviocopes.com/go-tutorial-lolcat/" - }, - { - "title": "Go: Building a cli command with Go: cowsay", - "link": "https://flaviocopes.com/go-tutorial-cowsay/" - }, - { - "title": "Go: Go CLI tutorial: fortune clone", - "link": "https://flaviocopes.com/go-tutorial-fortune/" - }, - { - "title": "Nim: Writing a stow alternative to manage dotfiles", - "link": "https://xmonader.github.io/nimdays/day06_nistow.html" - }, - { - "title": "C: Let's Build a Simple Database", - "link": "https://cstack.github.io/db_tutorial/" - }, - { - "title": "C++: Implementing a Key-Value Store", - "link": "http://codecapsule.com/2012/11/07/ikvs-implementing-a-key-value-store-table-of-contents/" - }, - { - "title": "C#: Build Your Own Database", - "link": "https://www.codeproject.com/Articles/1029838/Build-Your-Own-Database" - }, - { - "title": "Clojure: An Archaeology-Inspired Database", - "link": "http://aosabook.org/en/500L/an-archaeology-inspired-database.html" - }, - { - "title": "Crystal: Why you should build your own NoSQL Database", - "link": "https://medium.com/@marceloboeira/why-you-should-build-your-own-nosql-database-9bbba42039f5" - }, - { - "title": "JavaScript: Dagoba: an in-memory graph database", - "link": "http://aosabook.org/en/500L/dagoba-an-in-memory-graph-database.html" - }, - { - "title": "Python: DBDB: Dog Bed Database", - "link": "http://aosabook.org/en/500L/dbdb-dog-bed-database.html" - }, - { - "title": "Python: Write your own miniature Redis with Python", - "link": "http://charlesleifer.com/blog/building-a-simple-redis-server-with-python/" - }, - { - "title": "C: Linux containers in 500 lines of code", - "link": "https://blog.lizzie.io/linux-containers-in-500-loc.html" - }, - { - "title": "Go: Build Your Own Container Using Less than 100 Lines of Go", - "link": "https://www.infoq.com/articles/build-a-container-golang" - }, - { - "title": "Go: Building a container from scratch in Go", - "link": "https://www.youtube.com/watch?v=8fi7uSYlOdc" - }, - { - "title": "Python: A workshop on Linux containers: Rebuild Docker from Scratch", - "link": "https://github.com/Fewbytes/rubber-docker" - }, - { - "title": "Python: A proof-of-concept imitation of Docker, written in 100% Python", - "link": "https://github.com/tonybaloney/mocker" - }, - { - "title": "Shell: Docker implemented in around 100 lines of bash", - "link": "https://github.com/p8952/bocker" - }, - { - "title": "C: Virtual machine in C", - "link": "https://blog.felixangell.com/virtual-machine-in-c/" - }, - { - "title": "C: Write your Own Virtual Machine", - "link": "https://justinmeiners.github.io/lc3-vm/" - }, - { - "title": "C: Writing a Game Boy emulator, Cinoop", - "link": "https://cturt.github.io/cinoop.html" - }, - { - "title": "C++: How to write an emulator (CHIP-8 interpreter)", - "link": "http://www.multigesture.net/articles/how-to-write-an-emulator-chip-8-interpreter/" - }, - { - "title": "C++: Emulation tutorial (CHIP-8 interpreter)", - "link": "http://www.codeslinger.co.uk/pages/projects/chip8.html" - }, - { - "title": "C++: Emulation tutorial (GameBoy emulator)", - "link": "http://www.codeslinger.co.uk/pages/projects/gameboy.html" - }, - { - "title": "C++: Emulation tutorial (Master System emulator)", - "link": "http://www.codeslinger.co.uk/pages/projects/mastersystem/memory.html" - }, - { - "title": "Common Lisp: CHIP-8 in Common Lisp", - "link": "http://stevelosh.com/blog/2016/12/chip8-cpu/" - }, - { - "title": "JavaScript: GameBoy Emulation in JavaScript", - "link": "http://imrannazar.com/GameBoy-Emulation-in-JavaScript" - }, - { - "title": "Python: Emulation Basics: Write your own Chip 8 Emulator/Interpreter", - "link": "http://omokute.blogspot.com.br/2012/06/emulation-basics-write-your-own-chip-8.html" - }, - { - "title": "JavaScript: WTF is JSX (Let's Build a JSX Renderer)", - "link": "https://jasonformat.com/wtf-is-jsx/" - }, - { - "title": "JavaScript: A DIY guide to build your own React", - "link": "https://github.com/hexacta/didact" - }, - { - "title": "JavaScript: Reverse Engineering React", - "link": "https://vimeo.com/album/3930691" - }, - { - "title": "JavaScript: Building React From Scratch", - "link": "https://www.youtube.com/watch?v=_MAD4Oly9yg" - }, - { - "title": "JavaScript: Building Your Own React Clone in Five Easy Steps", - "link": "https://blog.javascripting.com/2016/10/05/building-your-own-react-clone-in-five-easy-steps/" - }, - { - "title": "JavaScript: Gooact: React in 160 lines of JavaScript", - "link": "https://medium.com/@sweetpalma/gooact-react-in-160-lines-of-javascript-44e0742ad60f" - }, - { - "title": "JavaScript: React Internals", - "link": "http://www.mattgreer.org/articles/react-internals-part-one-basic-rendering/" - }, - { - "title": "JavaScript: Learn how React Reconciler package works by building your own lightweight React DOM", - "link": "https://hackernoon.com/learn-you-some-custom-react-renderers-aed7164a4199" - }, - { - "title": "JavaScript: Build Yourself a Redux", - "link": "https://zapier.com/engineering/how-to-build-redux/" - }, - { - "title": "JavaScript: Let’s Write Redux!", - "link": "https://www.jamasoftware.com/blog/lets-write-redux/" - }, - { - "title": "JavaScript: Redux: Implementing Store from Scratch", - "link": "https://egghead.io/lessons/react-redux-implementing-store-from-scratch" - }, - { - "title": "JavaScript: Build Your own Simplified AngularJS in 200 Lines of JavaScript", - "link": "https://blog.mgechev.com/2015/03/09/build-learn-your-own-light-lightweight-angularjs/" - }, - { - "title": "JavaScript: Make Your Own AngularJS", - "link": "http://teropa.info/blog/2013/11/03/make-your-own-angular-part-1-scopes-and-digest.html" - }, - { - "title": "JavaScript: How to write your own Virtual DOM", - "link": "https://medium.com/@deathmood/how-to-write-your-own-virtual-dom-ee74acc13060" - }, - { - "title": "JavaScript: Building a frontend framework, from scratch, with components (templating, state, VDOM)", - "link": "https://mfrachet.github.io/create-frontend-framework/" - }, - { - "title": "JavaScript: Build your own React", - "link": "https://pomb.us/build-your-own-react/" - }, - { - "title": "C: Handmade Hero", - "link": "https://handmadehero.org/" - }, - { - "title": "C: How to Program an NES game in C", - "link": "https://nesdoug.com/" - }, - { - "title": "C: Chess Engine In C", - "link": "https://www.youtube.com/playlist?list=PLZ1QII7yudbc-Ky058TEaOstZHVbT-2hg" - }, - { - "title": "C: Let's Make: Dangerous Dave", - "link": "https://www.youtube.com/playlist?list=PLSkJey49cOgTSj465v2KbLZ7LMn10bCF9" - }, - { - "title": "C: Learn Video Game Programming in C", - "link": "https://www.youtube.com/playlist?list=PLT6WFYYZE6uLMcPGS3qfpYm7T_gViYMMt" - }, - { - "title": "C: Coding A Sudoku Solver in C", - "link": "https://www.youtube.com/playlist?list=PLkTXsX7igf8edTYU92nU-f5Ntzuf-RKvW" - }, - { - "title": "C: Coding a Rogue/Nethack RPG in C", - "link": "https://www.youtube.com/playlist?list=PLkTXsX7igf8erbWGYT4iSAhpnJLJ0Nk5G" - }, - { - "title": "C: On Tetris and Reimplementation", - "link": "https://brennan.io/2015/06/12/tetris-reimplementation/" - }, - { - "title": "C++: Breakout", - "link": "https://learnopengl.com/In-Practice/2D-Game/Breakout" - }, - { - "title": "C++: Beginning Game Programming v2.0", - "link": "http://lazyfoo.net/tutorials/SDL/" - }, - { - "title": "C++: Tetris tutorial in C++ platform independent focused in game logic for beginners", - "link": "http://javilop.com/gamedev/tetris-tutorial-in-c-platform-independent-focused-in-game-logic-for-beginners/" - }, - { - "title": "C++: Remaking Cavestory in C++", - "link": "https://www.youtube.com/watch?v=ETvApbD5xRo&list=PLNOBk_id22bw6LXhrGfhVwqQIa-M2MsLa" - }, - { - "title": "C++: Reconstructing Cave Story", - "link": "https://www.youtube.com/playlist?list=PL006xsVEsbKjSKBmLu1clo85yLrwjY67X" - }, - { - "title": "C++: Space Invaders from Scratch", - "link": "http://nicktasios.nl/posts/space-invaders-from-scratch-part-1.html" - }, - { - "title": "C#: Learn C# by Building a Simple RPG", - "link": "http://scottlilly.com/learn-c-by-building-a-simple-rpg-index/" - }, - { - "title": "C#: Creating a Roguelike Game in C#", - "link": "https://roguesharp.wordpress.com/" - }, - { - "title": "C#: Build a C#/WPF RPG", - "link": "https://scottlilly.com/build-a-cwpf-rpg/" - }, - { - "title": "Go: Games With Go", - "link": "https://gameswithgo.org/" - }, - { - "title": "Java: 3D Game Development with LWJGL 3", - "link": "https://lwjglgamedev.gitbooks.io/3d-game-development-with-lwjgl/content/" - }, - { - "title": "JavaScript: 2D breakout game using Phaser", - "link": "https://developer.mozilla.org/en-US/docs/Games/Tutorials/2D_breakout_game_Phaser" - }, - { - "title": "JavaScript: How to Make Flappy Bird in HTML5 With Phaser", - "link": "http://www.lessmilk.com/tutorial/flappy-bird-phaser-1" - }, - { - "title": "JavaScript: Developing Games with React, Redux, and SVG", - "link": "https://auth0.com/blog/developing-games-with-react-redux-and-svg-part-1/" - }, - { - "title": "JavaScript: Build your own 8-Ball Pool game from scratch", - "link": "https://www.youtube.com/watch?v=aXwCrtAo4Wc" - }, - { - "title": "JavaScript: How to Make Your First Roguelike", - "link": "https://gamedevelopment.tutsplus.com/tutorials/how-to-make-your-first-roguelike--gamedev-13677" - }, - { - "title": "JavaScript: Think like a programmer: How to build Snake using only JavaScript, HTML & CSS", - "link": "https://medium.freecodecamp.org/think-like-a-programmer-how-to-build-snake-using-only-javascript-html-and-css-7b1479c3339e" - }, - { - "title": "Lua: BYTEPATH", - "link": "https://github.com/SSYGEN/blog/issues/30" - }, - { - "title": "Python: Developing Games With PyGame", - "link": "https://pythonprogramming.net/pygame-python-3-part-1-intro/" - }, - { - "title": "Python: Making Games with Python & Pygame", - "link": "https://inventwithpython.com/makinggames.pdf [pdf]" - }, - { - "title": "Python: The Complete Roguelike Tutorial", - "link": "https://www.youtube.com/playlist?list=PLKUel_nHsTQ1yX7tQxR_SQRdcOFyXfNAb" - }, - { - "title": "Python: Roguelike Tutorial Revised", - "link": "http://rogueliketutorials.com/" - }, - { - "title": "Ruby: Developing Games With Ruby", - "link": "https://leanpub.com/developing-games-with-ruby/read" - }, - { - "title": "Ruby: Ruby Snake", - "link": "https://www.diatomenterprises.com/gamedev-on-ruby-why-not/" - }, - { - "title": "Rust: Adventures in Rust: A Basic 2D Game", - "link": "https://a5huynh.github.io/posts/2018/adventures-in-rust/" - }, - { - "title": "Rust: Roguelike Tutorial in Rust + tcod", - "link": "https://tomassedovic.github.io/roguelike-tutorial/" - }, - { - "title": "Haskell: Reimplementing “git clone” in Haskell from the bottom up", - "link": "http://stefan.saasen.me/articles/git-clone-in-haskell-from-the-bottom-up/" - }, - { - "title": "JavaScript: Gitlet", - "link": "http://gitlet.maryrosecook.com/docs/gitlet.html" - }, - { - "title": "JavaScript: Build GIT - Learn GIT", - "link": "https://kushagragour.in/blog/2014/01/build-git-learn-git/" - }, - { - "title": "Python: Just enough of a Git client to create a repo, commit, and push itself to GitHub", - "link": "https://benhoyt.com/writings/pygit/" - }, - { - "title": "Python: Write yourself a Git!", - "link": "https://wyag.thb.lt/" - }, - { - "title": "Ruby: Rebuilding Git in Ruby", - "link": "https://robots.thoughtbot.com/rebuilding-git-in-ruby" - }, - { - "title": "C: Beej's Guide to Network Programming", - "link": "http://beej.us/guide/bgnet/" - }, - { - "title": "C: Let's code a TCP/IP stack", - "link": "http://www.saminiir.com/lets-code-tcp-ip-stack-1-ethernet-arp/" - }, - { - "title": "Ruby: How to build a network stack in Ruby", - "link": "https://medium.com/geckoboard-under-the-hood/how-to-build-a-network-stack-in-ruby-f73aeb1b661b" - }, - { - "title": "C#: Neural Network OCR", - "link": "https://www.codeproject.com/Articles/11285/Neural-Network-OCR" - }, - { - "title": "F#: Building Neural Networks in F#", - "link": "https://towardsdatascience.com/building-neural-networks-in-f-part-1-a2832ae972e6" - }, - { - "title": "Go: Build a multilayer perceptron with Golang", - "link": "https://made2591.github.io/posts/neuralnetwork" - }, - { - "title": "Go: How to build a simple artificial neural network with Go", - "link": "https://sausheong.github.io/posts/how-to-build-a-simple-artificial-neural-network-with-go/" - }, - { - "title": "Go: Building a Neural Net from Scratch in Go", - "link": "https://datadan.io/blog/neural-net-with-go" - }, - { - "title": "JavaScript / Java: Neural Networks - The Nature of Code", - "link": "https://www.youtube.com/playlist?list=PLRqwX-V7Uu6aCibgK1PTWWu9by6XFdCfh" - }, - { - "title": "JavaScript: Neural Network implementation in JavaScript, by an example", - "link": "https://franpapers.com/en/machine-learning-ai-en/2017-neural-network-implementation-in-javascript-by-an-example/" - }, - { - "title": "JavaScript: Neural networks from scratch for JavaScript linguists (Part1 — The Perceptron)", - "link": "https://hackernoon.com/neural-networks-from-scratch-for-javascript-linguists-part1-the-perceptron-632a4d1fbad2" - }, - { - "title": "Python: A Neural Network in 11 lines of Python", - "link": "https://iamtrask.github.io/2015/07/12/basic-python-network/" - }, - { - "title": "Python: Implement a Neural Network from Scratch", - "link": "https://victorzhou.com/blog/intro-to-neural-networks/" - }, - { - "title": "Python: Optical Character Recognition (OCR)", - "link": "http://aosabook.org/en/500L/optical-character-recognition-ocr.html" - }, - { - "title": "Python: Traffic signs classification with a convolutional network", - "link": "https://navoshta.com/traffic-signs-classification/" - }, - { - "title": "Python: Generate Music using LSTM Neural Network in Keras", - "link": "https://towardsdatascience.com/how-to-generate-music-using-a-lstm-neural-network-in-keras-68786834d4c5" - }, - { - "title": "Python: An Introduction to Convolutional Neural Networks", - "link": "https://victorzhou.com/blog/intro-to-cnns-part-1/" - }, - { - "title": "Assembly: Writing a Tiny x86 Bootloader", - "link": "http://joebergeron.io/posts/post_two.html" - }, - { - "title": "Assembly: Baking Pi – Operating Systems Development", - "link": "http://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/os/index.html" - }, - { - "title": "C: Building a software and hardware stack for a simple computer from scratch", - "link": "https://www.youtube.com/watch?v=ZjwvMcP3Nf0&list=PLU94OURih-CiP4WxKSMt3UcwMSDM3aTtX" - }, - { - "title": "C: Operating Systems: From 0 to 1", - "link": "https://tuhdo.github.io/os01/" - }, - { - "title": "C: The little book about OS development", - "link": "https://littleosbook.github.io/" - }, - { - "title": "C: Roll your own toy UNIX-clone OS", - "link": "http://jamesmolloy.co.uk/tutorial_html/" - }, - { - "title": "C: Kernel 101 – Let’s write a Kernel", - "link": "https://arjunsreedharan.org/post/82710718100/kernel-101-lets-write-a-kernel" - }, - { - "title": "C: Kernel 201 – Let’s write a Kernel with keyboard and screen support", - "link": "https://arjunsreedharan.org/post/99370248137/kernel-201-lets-write-a-kernel-with-keyboard" - }, - { - "title": "C: Build a minimal multi-tasking kernel for ARM from scratch", - "link": "https://github.com/jserv/mini-arm-os" - }, - { - "title": "C: How to create an OS from scratch", - "link": "https://github.com/cfenollosa/os-tutorial" - }, - { - "title": "C: Malloc tutorial", - "link": "https://danluu.com/malloc-tutorial/" - }, - { - "title": "C: Hack the virtual memory", - "link": "https://blog.holbertonschool.com/hack-the-virtual-memory-c-strings-proc/" - }, - { - "title": "C: Learning operating system development using Linux kernel and Raspberry Pi", - "link": "https://github.com/s-matyukevich/raspberry-pi-os" - }, - { - "title": "C: Operating systems development for Dummies", - "link": "https://medium.com/@lduck11007/operating-systems-development-for-dummies-3d4d786e8ac" - }, - { - "title": "C++: Write your own Operating System", - "link": "https://www.youtube.com/playlist?list=PLHh55M_Kq4OApWScZyPl5HhgsTJS9MZ6M" - }, - { - "title": "C++: Writing a Bootloader", - "link": "http://3zanders.co.uk/2017/10/13/writing-a-bootloader/" - }, - { - "title": "Rust: Writing an OS in Rust", - "link": "https://os.phil-opp.com/" - }, - { - "title": "C: Video Game Physics Tutorial", - "link": "https://www.toptal.com/game/video-game-physics-part-i-an-introduction-to-rigid-body-dynamics" - }, - { - "title": "C++: Game physics series by Allen Chou", - "link": "http://allenchou.net/game-physics-series/" - }, - { - "title": "C++: How to Create a Custom Physics Engine", - "link": "https://gamedevelopment.tutsplus.com/series/how-to-create-a-custom-physics-engine--gamedev-12715" - }, - { - "title": "C++: 3D Physics Engine Tutorial", - "link": "https://www.youtube.com/playlist?list=PLEETnX-uPtBXm1KEr_2zQ6K_0hoGH6JJ0" - }, - { - "title": "JavaScript: Build your own basic physics engine in JavaScript", - "link": "https://www.graphitedigital.com/blog/build-your-own-basic-physics-engine-in-javascript" - }, - { - "title": "JavaScript: How Physics Engines Work", - "link": "http://buildnewgames.com/gamephysics/" - }, - { - "title": "JavaScript: Broad Phase Collision Detection Using Spatial Partitioning", - "link": "http://buildnewgames.com/broad-phase-collision-detection/" - }, - { - "title": "JavaScript: Build a simple 2D physics engine for JavaScript games", - "link": "https://www.ibm.com/developerworks/library/wa-build2dphysicsengine/index.html" - }, - { - "title": "(any): mal - Make a Lisp", - "link": "https://github.com/kanaka/mal#mal---make-a-lisp" - }, - { - "title": "Assembly: Jonesforth", - "link": "https://github.com/nornagon/jonesforth/blob/master/jonesforth.S" - }, - { - "title": "C: Baby's First Garbage Collector", - "link": "http://journal.stuffwithstuff.com/2013/12/08/babys-first-garbage-collector/" - }, - { - "title": "C: Build Your Own Lisp: Learn C and build your own programming language in 1000 lines of code", - "link": "http://www.buildyourownlisp.com/" - }, - { - "title": "C: Writing a Simple Garbage Collector in C", - "link": "http://maplant.com/gc.html" - }, - { - "title": "C: C interpreter that interprets itself.", - "link": "https://github.com/lotabout/write-a-C-interpreter" - }, - { - "title": "C: A C & x86 version of the \"Let's Build a Compiler\" by Jack Crenshaw", - "link": "https://github.com/lotabout/Let-s-build-a-compiler" - }, - { - "title": "C++: Writing Your Own Toy Compiler Using Flex", - "link": "https://gnuu.org/2009/09/18/writing-your-own-toy-compiler/" - }, - { - "title": "C++: How to Create a Compiler", - "link": "https://www.youtube.com/watch?v=eF9qWbuQLuw" - }, - { - "title": "C++: Kaleidoscope: Implementing a Language with LLVM", - "link": "https://llvm.org/docs/tutorial/MyFirstLanguageFrontend/index.html" - }, - { - "title": "F#: Understanding Parser Combinators", - "link": "https://fsharpforfunandprofit.com/posts/understanding-parser-combinators/" - }, - { - "title": "Elixir: Demystifying compilers by writing your own", - "link": "https://www.youtube.com/watch?v=zMJYoYwOCd4" - }, - { - "title": "Go: The Super Tiny Compiler", - "link": "https://github.com/hazbo/the-super-tiny-compiler" - }, - { - "title": "Go: Lexical Scanning in Go", - "link": "https://www.youtube.com/watch?v=HxaD_trXwRE" - }, - { - "title": "Haskell: Let's Build a Compiler", - "link": "https://g-ford.github.io/cradle/" - }, - { - "title": "Haskell: Write You a Haskell", - "link": "http://dev.stephendiehl.com/fun/" - }, - { - "title": "Haskell: Write Yourself a Scheme in 48 Hours", - "link": "https://en.wikibooks.org/wiki/Write_Yourself_a_Scheme_in_48_Hours" - }, - { - "title": "Haskell: Write You A Scheme", - "link": "https://www.wespiser.com/writings/wyas/home.html" - }, - { - "title": "Java: Crafting interpreters: A handbook for making programming languages", - "link": "http://www.craftinginterpreters.com/" - }, - { - "title": "Java: Creating JVM Language", - "link": "http://jakubdziworski.github.io/categories.html#Enkel-ref" - }, - { - "title": "JavaScript: The Super Tiny Compiler", - "link": "https://github.com/jamiebuilds/the-super-tiny-compiler" - }, - { - "title": "JavaScript: The Super Tiny Interpreter", - "link": "https://github.com/keyanzhang/the-super-tiny-interpreter" - }, - { - "title": "JavaScript: Little Lisp interpreter", - "link": "https://maryrosecook.com/blog/post/little-lisp-interpreter" - }, - { - "title": "JavaScript: How to implement a programming language in JavaScript", - "link": "http://lisperator.net/pltut/" - }, - { - "title": "OCaml: Writing a C Compiler", - "link": "https://norasandler.com/2017/11/29/Write-a-Compiler.html" - }, - { - "title": "OCaml: Writing a Lisp, the series", - "link": "https://bernsteinbear.com/blog/lisp/" - }, - { - "title": "Pascal: Let's Build a Compiler", - "link": "https://compilers.iecc.com/crenshaw/" - }, - { - "title": "Python: A Python Interpreter Written in Python", - "link": "http://aosabook.org/en/500L/a-python-interpreter-written-in-python.html" - }, - { - "title": "Python: lisp.py: Make your own Lisp interpreter", - "link": "http://khamidou.com/compilers/lisp.py/" - }, - { - "title": "Python: Simple Iterator-based Parsing", - "link": "http://effbot.org/zone/simple-iterator-parser.htm" - }, - { - "title": "Python: Simple Top-Down Parsing in Python", - "link": "http://effbot.org/zone/simple-top-down-parsing.htm" - }, - { - "title": "Python: How to Write a Lisp Interpreter in Python", - "link": "http://norvig.com/lispy.html" - }, - { - "title": "Python: Let’s Build A Simple Interpreter", - "link": "https://ruslanspivak.com/lsbasi-part1/" - }, - { - "title": "Python: Make Your Own Simple Interpreted Programming Language", - "link": "https://www.youtube.com/watch?v=dj9CBS3ikGA&list=PLZQftyCk7_SdoVexSmwy_tBgs7P0b97yD&index=1" - }, - { - "title": "Racket: Beautiful Racket: How to make your own programming languages with Racket", - "link": "https://beautifulracket.com/" - }, - { - "title": "Ruby: A Compiler From Scratch", - "link": "https://www.destroyallsoftware.com/screencasts/catalog/a-compiler-from-scratch" - }, - { - "title": "Ruby: Markdown compiler from scratch in Ruby", - "link": "https://blog.beezwax.net/2017/07/07/writing-a-markdown-compiler/" - }, - { - "title": "Rust: So You Want to Build a Language VM", - "link": "https://blog.subnetzero.io/post/building-language-vm-part-00/" - }, - { - "title": "Rust: Learning Parser Combinators With Rust", - "link": "https://bodil.lol/parser-combinators/" - }, - { - "title": "Swift: Building a LISP from scratch with Swift", - "link": "https://www.uraimo.com/2017/02/05/building-a-lisp-from-scratch-with-swift/" - }, - { - "title": "TypeScript: Build your own WebAssembly Compiler", - "link": "https://blog.scottlogic.com/2019/05/17/webassembly-compiler.html" - }, - { - "title": "C: A Regular Expression Matcher", - "link": "https://www.cs.princeton.edu/courses/archive/spr09/cos333/beautiful.html" - }, - { - "title": "C: Regular Expression Matching Can Be Simple And Fast", - "link": "https://swtch.com/~rsc/regexp/regexp1.html" - }, - { - "title": "JavaScript: Build a Regex Engine in Less than 40 Lines of Code", - "link": "https://nickdrane.com/build-your-own-regex/" - }, - { - "title": "JavaScript: How to implement regular expressions in functional javascript using derivatives", - "link": "http://dpk.io/dregs/toydregs" - }, - { - "title": "JavaScript: Implementing a Regular Expression Engine", - "link": "https://deniskyashif.com/2019/02/17/implementing-a-regular-expression-engine/" - }, - { - "title": "Perl: How Regexes Work", - "link": "https://perl.plover.com/Regex/article.html" - }, - { - "title": "Scala: No Magic: Regular Expressions", - "link": "https://rcoh.svbtle.com/no-magic-regular-expressions" - }, - { - "title": "CSS: A search engine in CSS", - "link": "https://stories.algolia.com/a-search-engine-in-css-b5ec4e902e97" - }, - { - "title": "Python: Building a search engine using Redis and redis-py", - "link": "http://www.dr-josiah.com/2010/07/building-search-engine-using-redis-and.html" - }, - { - "title": "Python: Building a Vector Space Indexing Engine in Python", - "link": "https://boyter.org/2010/08/build-vector-space-search-engine-python/" - }, - { - "title": "Python: Building A Python-Based Search Engine", - "link": "https://www.youtube.com/watch?v=cY7pE7vX6MU" - }, - { - "title": "Python: Making text search learn from feedback", - "link": "https://medium.com/filament-ai/making-text-search-learn-from-feedback-4fe210fd87b0" - }, - { - "title": "Python: Finding Important Words in Text Using TF-IDF", - "link": "https://stevenloria.com/tf-idf/" - }, - { - "title": "C: Tutorial - Write a Shell in C", - "link": "https://brennan.io/2015/01/16/write-a-shell-in-c/" - }, - { - "title": "C: Let's build a shell!", - "link": "https://github.com/kamalmarhubi/shell-workshop" - }, - { - "title": "C: Writing a UNIX Shell", - "link": "https://indradhanush.github.io/blog/writing-a-unix-shell-part-1/" - }, - { - "title": "C: Build Your Own Shell", - "link": "https://github.com/tokenrove/build-your-own-shell" - }, - { - "title": "Go: Writing a simple shell in Go", - "link": "https://sj14.gitlab.io/post/2018-07-01-go-unix-shell/" - }, - { - "title": "Ruby: A Unix Shell in Ruby", - "link": "https://www.jstorimer.com/blogs/workingwithcode/7766107-a-unix-shell-in-ruby" - }, - { - "title": "Rust: Build Your Own Shell using Rust", - "link": "https://www.joshmcguigan.com/blog/build-your-own-shell-rust/" - }, - { - "title": "JavaScript: JavaScript template engine in just 20 lines", - "link": "http://krasimirtsonev.com/blog/article/Javascript-template-engine-in-just-20-line" - }, - { - "title": "JavaScript: Understanding JavaScript Micro-Templating", - "link": "https://medium.com/wdstack/understanding-javascript-micro-templating-f37a37b3b40e" - }, - { - "title": "Python: Approach: Building a toy template engine in Python", - "link": "http://alexmic.net/building-a-template-engine/" - }, - { - "title": "Python: A Template Engine", - "link": "http://aosabook.org/en/500L/a-template-engine.html" - }, - { - "title": "Ruby: How to write a template engine in less than 30 lines of code", - "link": "http://bits.citrusbyte.com/how-to-write-a-template-library/" - }, - { - "title": "C: Build Your Own Text Editor", - "link": "https://viewsourcecode.org/snaptoken/kilo/" - }, - { - "title": "C++: Designing a Simple Text Editor", - "link": "http://www.fltk.org/doc-1.1/editor.html" - }, - { - "title": "Python: Python Tutorial: Make Your Own Text Editor", - "link": "https://www.youtube.com/watch?v=xqDonHEYPgA" - }, - { - "title": "Python: Create a Simple Python Text Editor!", - "link": "http://www.instructables.com/id/Create-a-Simple-Python-Text-Editor/" - }, - { - "title": "Ruby: Build a Collaborative Text Editor Using Rails", - "link": "https://blog.aha.io/text-editor/" - }, - { - "title": "Python: Developing a License Plate Recognition System with Machine Learning in Python", - "link": "https://blog.devcenter.co/developing-a-license-plate-recognition-system-with-machine-learning-in-python-787833569ccd" - }, - { - "title": "Python: Building a Facial Recognition Pipeline with Deep Learning in Tensorflow", - "link": "https://hackernoon.com/building-a-facial-recognition-pipeline-with-deep-learning-in-tensorflow-66e7645015b8" - }, - { - "title": "C++: Let's Make a Voxel Engine", - "link": "https://sites.google.com/site/letsmakeavoxelengine/home" - }, - { - "title": "Java: Let's make a voxel engine", - "link": "https://www.youtube.com/watch?v=C_Fo9PcrVXA&list=PLXa65xzz2vplye7cn1HH4GyE6_FjnDSug&index=1" - }, - { - "title": "Java: Java Voxel Engine Tutorial", - "link": "https://www.youtube.com/watch?v=QZ4Vk2PkPZk&list=PL80Zqpd23vJfyWQi-8FKDbeO_ZQamLKJL" - }, - { - "title": "PHP: Code a Search Engine in PHP", - "link": "https://boyter.org/2013/01/code-for-a-search-engine-in-php-part-1/" - }, - { - "title": "Ruby: Write an Internet search engine with 200 lines of Ruby code", - "link": "https://blog.saush.com/2009/03/17/write-an-internet-search-engine-with-200-lines-of-ruby-code/" - }, - { - "title": "C#: Writing a Web Server from Scratch", - "link": "https://www.codeproject.com/Articles/859108/Writing-a-Web-Server-from-Scratch" - }, - { - "title": "Node.js: Let's code a web server from scratch with NodeJS Streams", - "link": "https://www.codementor.io/ziad-saab/let-s-code-a-web-server-from-scratch-with-nodejs-streams-h4uc9utji" - }, - { - "title": "Node.js: lets-build-express", - "link": "https://github.com/antoaravinth/lets-build-express" - }, - { - "title": "PHP: Writing a webserver in pure PHP", - "link": "http://station.clancats.com/writing-a-webserver-in-pure-php/" - }, - { - "title": "Python: A Simple Web Server", - "link": "http://aosabook.org/en/500L/a-simple-web-server.html" - }, - { - "title": "Python: Let’s Build A Web Server.", - "link": "https://ruslanspivak.com/lsbaws-part1/" - }, - { - "title": "Python: Web application from scratch", - "link": "https://defn.io/2018/02/25/web-app-from-scratch-01/" - }, - { - "title": "Python: Building a basic HTTP Server from scratch in Python", - "link": "http://joaoventura.net/blog/2017/python-webserver/" - }, - { - "title": "Python: Implementing a RESTful Web API with Python & Flask", - "link": "http://blog.luisrei.com/articles/flaskrest.html" - }, - { - "title": "Ruby: Building a simple websockets server from scratch in Ruby", - "link": "http://blog.honeybadger.io/building-a-simple-websockets-server-from-scratch-in-ruby/" - }, - { - "title": "(any): From NAND to Tetris: Building a Modern Computer From First Principles", - "link": "http://nand2tetris.org/" - }, - { - "title": "Alloy: The Same-Origin Policy", - "link": "http://aosabook.org/en/500L/the-same-origin-policy.html" - }, - { - "title": "C: How to Write a Video Player in Less Than 1000 Lines", - "link": "http://dranger.com/ffmpeg/ffmpeg.html" - }, - { - "title": "C: Learn how to write a hash table in C", - "link": "https://github.com/jamesroutley/write-a-hash-table" - }, - { - "title": "C: The very basics of a terminal emulator", - "link": "https://www.uninformativ.de/blog/postings/2018-02-24/0/POSTING-en.html" - }, - { - "title": "C: Write a System Call", - "link": "https://brennan.io/2016/11/14/kernel-dev-ep3/" - }, - { - "title": "C: Sol - An MQTT broker from scratch", - "link": "https://codepr.github.io/posts/sol-mqtt-broker" - }, - { - "title": "C++: Build your own VR headset for $100", - "link": "https://github.com/relativty/Relativ" - }, - { - "title": "C++: How X Window Managers work and how to write one", - "link": "https://seasonofcode.com/posts/how-x-window-managers-work-and-how-to-write-one-part-i.html" - }, - { - "title": "C++: Writing a Linux Debugger", - "link": "https://blog.tartanllama.xyz/writing-a-linux-debugger-setup/" - }, - { - "title": "C++: How a 64k intro is made", - "link": "http://www.lofibucket.com/articles/64k_intro.html" - }, - { - "title": "C#: C# Networking: Create a TCP chater server, TCP games, UDP Pong and more", - "link": "https://16bpp.net/tutorials/csharp-networking" - }, - { - "title": "C#: Loading and rendering 3D skeletal animations from scratch in C# and GLSL", - "link": "https://www.seanjoflynn.com/research/skeletal-animation.html" - }, - { - "title": "Clojure: Building a spell-checker", - "link": "https://bernhardwenzel.com/articles/clojure-spellchecker/" - }, - { - "title": "Go: Let's Create a Simple Load Balancer", - "link": "https://kasvith.github.io/posts/lets-create-a-simple-lb-go/" - }, - { - "title": "Java: How to Build an Android Reddit App", - "link": "https://www.youtube.com/playlist?list=PLgCYzUzKIBE9HUJU-upNvl3TRVAo9W47y" - }, - { - "title": "JavaScript: Build Your Own Module Bundler - Minipack", - "link": "https://github.com/ronami/minipack" - }, - { - "title": "JavaScript: Learn JavaScript Promises by Building a Promise from Scratch", - "link": "https://levelup.gitconnected.com/understand-javascript-promises-by-building-a-promise-from-scratch-84c0fd855720" - }, - { - "title": "JavaScript: Implementing promises from scratch (TDD way)", - "link": "https://www.mauriciopoppe.com/notes/computer-science/computation/promises/" - }, - { - "title": "JavaScript: Implement your own — call(), apply() and bind() method in JavaScript", - "link": "https://blog.usejournal.com/implement-your-own-call-apply-and-bind-method-in-javascript-42cc85dba1b" - }, - { - "title": "JavaScript: JavaScript Algorithms and Data Structures", - "link": "https://github.com/trekhleb/javascript-algorithms" - }, - { - "title": "JavaScript: How to Make an Evolutionary Tetris AI", - "link": "https://www.youtube.com/watch?v=xLHCMMGuN0Q" - }, - { - "title": "JavaScript: Build a ride hailing app with React Native", - "link": "https://pusher.com/tutorials/ride-hailing-react-native" - }, - { - "title": "Kotlin: Build Your Own Cache", - "link": "https://github.com/kezhenxu94/cache-lite" - }, - { - "title": "Nim: Writing a Redis Protocol Parser", - "link": "https://xmonader.github.io/nimdays/day12_resp.html" - }, - { - "title": "Nim: Writing a Build system", - "link": "https://xmonader.github.io/nimdays/day11_buildsystem.html" - }, - { - "title": "Nim: Writing a MiniTest Framework", - "link": "https://xmonader.github.io/nimdays/day08_minitest.html" - }, - { - "title": "Nim: Writing a DMIDecode Parser", - "link": "https://xmonader.github.io/nimdays/day01_dmidecode.html" - }, - { - "title": "Nim: Writing a INI Parser", - "link": "https://xmonader.github.io/nimdays/day05_iniparser.html" - }, - { - "title": "Nim: Writing a Link Checker", - "link": "https://xmonader.github.io/nimdays/day04_asynclinkschecker.html" - }, - { - "title": "Nim: Writing a URL Shortening Service", - "link": "https://xmonader.github.io/nimdays/day07_shorturl.html" - }, - { - "title": "Node.js: Build a static site generator in 40 lines with Node.js", - "link": "https://www.webdevdrops.com/build-static-site-generator-nodejs-8969ebe34b22/" - }, - { - "title": "Node.js: Building A Simple Single Sign On(SSO) Server And Solution From Scratch In Node.js.", - "link": "https://codeburst.io/building-a-simple-single-sign-on-sso-server-and-solution-from-scratch-in-node-js-ea6ee5fdf340" - }, - { - "title": "Node.js: How to create a real-world Node CLI app with Node", - "link": "https://medium.freecodecamp.org/how-to-create-a-real-world-node-cli-app-with-node-391b727bbed3" - }, - { - "title": "PHP: Write your own MVC from scratch in PHP", - "link": "https://chaitya62.github.io/2018/04/29/Writing-your-own-MVC-from-Scratch-in-PHP.html" - }, - { - "title": "PHP: Make your own blog", - "link": "https://ilovephp.jondh.me.uk/en/tutorial/make-your-own-blog" - }, - { - "title": "PHP: Modern PHP Without a Framework", - "link": "https://kevinsmith.io/modern-php-without-a-framework" - }, - { - "title": "Python: Build a Deep Learning Library", - "link": "https://www.youtube.com/watch?v=o64FV-ez6Gw" - }, - { - "title": "Python: How to Build a Kick-Ass Mobile Document Scanner in Just 5 Minutes", - "link": "https://www.pyimagesearch.com/2014/09/01/build-kick-ass-mobile-document-scanner-just-5-minutes/" - }, - { - "title": "Python: Continuous Integration System", - "link": "http://aosabook.org/en/500L/a-continuous-integration-system.html" - }, - { - "title": "Python: Recommender Systems in Python: Beginner Tutorial", - "link": "https://www.datacamp.com/community/tutorials/recommender-systems-python" - }, - { - "title": "Python: Write SMS-spam detector with Scikit-learn", - "link": "https://medium.com/@kopilov.vlad/detect-sms-spam-in-kaggle-with-scikit-learn-5f6afa7a3ca2" - }, - { - "title": "Python: A Simple Content-Based Recommendation Engine in Python", - "link": "http://blog.untrod.com/2016/06/simple-similar-products-recommendation-engine-in-python.html" - }, - { - "title": "Python: Stock Market Predictions with LSTM in Python", - "link": "https://www.datacamp.com/community/tutorials/lstm-python-stock-market" - }, - { - "title": "Python: Build your own error-correction fountain code with Luby Transform Codes", - "link": "https://franpapers.com/en/algorithmic/2018-introduction-to-fountain-codes-lt-codes-with-python/" - }, - { - "title": "Python: Building a simple Generative Adversial Network (GAN) using Tensorflow", - "link": "https://blog.paperspace.com/implementing-gans-in-tensorflow/" - }, - { - "title": "Python: Learn ML Algorithms by coding: Decision Trees", - "link": "https://lethalbrains.com/learn-ml-algorithms-by-coding-decision-trees-439ac503c9a4" - }, - { - "title": "Python: JSON Decoding Algorithm", - "link": "https://github.com/cheery/json-algorithm" - }, - { - "title": "Ruby: A Pedometer in the Real World", - "link": "http://aosabook.org/en/500L/a-pedometer-in-the-real-world.html" - }, - { - "title": "Ruby: Creating a Linux Desktop application with Ruby", - "link": "https://iridakos.com/tutorials/2018/01/25/creating-a-gtk-todo-application-with-ruby" - }, - { - "title": "Rust: Let's build a browser engine", - "link": "https://limpet.net/mbrubeck/2014/08/08/toy-layout-engine-1.html" - }, - { - "title": "Rust: Building a DNS server in Rust", - "link": "https://github.com/EmilHernvall/dnsguide/blob/master/README.md" - }, - { - "title": "Rust: Writing Scalable Chat Service from Scratch", - "link": "https://nbaksalyar.github.io/2015/07/10/writing-chat-in-rust.html" - }, - { - "title": "TypeScript: Tiny Package Manager: Learns how npm or Yarn works", - "link": "https://github.com/g-plane/tiny-package-manager" - }, - { - "title": "Write a CSV to HTML program", - "link": "https://programmingpraxis.com/2020/03/17/csv-to-html/" - }, - { - "title": "Write a Texas Hold 'Em Poker program", - "link": "https://programmingpraxis.com/2010/03/23/texas-hold-em/" - }, - { - "title": "Write a Turing Machine Simulator", - "link": "https://programmingpraxis.com/2009/03/27/a-turing-machine-simulator/" - }, - { - "title": "Nim: A two-player game of mathematical logic", - "link": "https://programmingpraxis.com/2010/01/08/nim/" - }, - { - "title": "Traveling Salesman: Brute Force: Examine all possible permutations to find the least-cost tour", - "link": "https://programmingpraxis.com/2010/03/12/traveling-salesman-brute-force/" - }, - { - "title": "The Seven Bridges of Königsberg: A classic graph puzzle due to Leonhard Euler", - "link": "https://programmingpraxis.com/2013/05/31/the-seven-bridges-of-knigsberg/" - }, - { - "title": "Adi Shamir’s Threshold Scheme: Use cryptography to share a secret, by Graham Enos", - "link": "https://programmingpraxis.com/2011/06/17/adi-shamirs-threshold-scheme/" - }, - { - "title": "Knight Rider: Classic problem of the knight’s tour", - "link": "https://programmingpraxis.com/2011/12/02/knight-rider/" - }, - { - "title": "Unix Paths: Convert relative Unix path to absolute, by Robert Fisher", - "link": "https://programmingpraxis.com/2013/08/13/unix-paths/" - }, - { - "title": "The First Computer Program: Ada Lovelace’s program to compute Bernoulli numbers for Charles Babbage’s Analytical Engine", - "link": "https://programmingpraxis.com/2011/02/08/the-first-computer-program/" - }, - { - "title": "Steve Yegge’s Phone-Screen Coding Exercises", - "link": "https://programmingpraxis.com/2009/06/30/steve-yegges-phone-screen-coding-exercises/" - }, - { - "title": "Word Count: An implementation of the unix wc program", - "link": "https://programmingpraxis.com/2009/12/08/word-count/" - }, - { - "title": "Grep: Simple version of the classic unix regular-expression matching utility", - "link": "https://programmingpraxis.com/2009/09/25/grep/" - }, - { - "title": "Cal: Print a twelve-month calendar", - "link": "https://programmingpraxis.com/2010/01/01/cal-2/" - }, - { - "title": "Diff: Find the differences between two text files", - "link": "https://programmingpraxis.com/2010/06/08/diff/" - }, - { - "title": "J K Rowling: Identify an author using forensic linguistics", - "link": "https://programmingpraxis.com/2013/07/19/j-k-rowling/" - }, - { - "title": "How to write your first Quine program", - "link": "https://towardsdatascience.com/how-to-write-your-first-quine-program-947f2b7e4a6f" - }, - { - "title": "Code The Game Of Life With React", - "link": "https://www.freecodecamp.org/news/create-gameoflife-with-react-in-one-hour-8e686a410174/" - }, - { - "title": "Build A Chat App with Sentiment Analysis", - "link": "https://codeburst.io/build-a-chat-app-with-sentiment-analysis-using-next-js-c43ebf3ea643" - }, -] From 8371c437b4d4d964afd3e2d3635a13da56b4ee73 Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Mon, 26 Dec 2022 09:07:19 +0700 Subject: [PATCH 30/54] update and fix minor styling --- projects/dad-jokes-generator/index.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/projects/dad-jokes-generator/index.html b/projects/dad-jokes-generator/index.html index 36c32fb..f27e4e4 100644 --- a/projects/dad-jokes-generator/index.html +++ b/projects/dad-jokes-generator/index.html @@ -4,13 +4,13 @@ - Dad Joke Generator + Dad Jokes Generator
-

Dad Joke Generator

-

Dad Joke

+

Dad Jokes Generator

+

Dad Jokes

From 65b18899a223412dd37514ba145657f54d88bd02 Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Mon, 26 Dec 2022 19:30:53 +0700 Subject: [PATCH 31/54] update the dad jokes generator project part2 --- projects/dad-jokes-generator/index.html | 24 +++---- projects/dad-jokes-generator/index.js | 22 +++---- projects/dad-jokes-generator/style.css | 86 ++++++++++++------------- 3 files changed, 64 insertions(+), 68 deletions(-) diff --git a/projects/dad-jokes-generator/index.html b/projects/dad-jokes-generator/index.html index f27e4e4..8693912 100644 --- a/projects/dad-jokes-generator/index.html +++ b/projects/dad-jokes-generator/index.html @@ -1,18 +1,18 @@ - - - - + + + + Dad Jokes Generator - - - + + +
-

Dad Jokes Generator

-

Dad Jokes

- +

Dad Joke Generator

+

Dad Joke

+
- - + + \ No newline at end of file diff --git a/projects/dad-jokes-generator/index.js b/projects/dad-jokes-generator/index.js index 6bbe74d..7a1e90d 100644 --- a/projects/dad-jokes-generator/index.js +++ b/projects/dad-jokes-generator/index.js @@ -1,7 +1,7 @@ const btnEl = document.getElementById("btn"); const jokeEl = document.getElementById("joke"); -const apiKey = "SAXb3lrT9IIorMjQkAFWBg==KCDQCZgWgcoAU4ai"; +const apiKey = "4kqGcJx8uDXo3XIskcbzokAz7rN8nWJs3PL9Mcll"; const options = { method: "GET", @@ -10,28 +10,26 @@ const options = { }, }; -const apiURL = `https://api.api-ninjas.com/v1/dadjokes?limit=1`; +const apiURL = "https://api.api-ninjas.com/v1/dadjokes?limit=1"; async function getJoke() { try { - btnEl.innerText = "Loading..."; - btnEl.disabled = true; jokeEl.innerText = "Updating..."; + btnEl.disabled = true; + btnEl.innerText = "Loading..."; const response = await fetch(apiURL, options); const data = await response.json(); - const jokeContent = data[0].joke; - jokeEl.innerText = jokeContent; - btnEl.innerText = "Tell me a joke"; + btnEl.disabled = false; - console.log(data); + btnEl.innerText = "Tell me a joke"; + + jokeEl.innerText = data[0].joke; } catch (error) { - console.log(error); jokeEl.innerText = "An error happened, try again later"; - btnEl.innerText = "Tell me a joke"; btnEl.disabled = false; + btnEl.innerText = "Tell me a joke"; + console.log(error); } } -getJoke(); - btnEl.addEventListener("click", getJoke); diff --git a/projects/dad-jokes-generator/style.css b/projects/dad-jokes-generator/style.css index 5e7e85a..1b55a53 100644 --- a/projects/dad-jokes-generator/style.css +++ b/projects/dad-jokes-generator/style.css @@ -1,54 +1,52 @@ -body { - margin: 0; - display: flex; - min-height: 100vh; - justify-content: center; - align-items: center; - font-family: monospace; - background: linear-gradient(to left bottom, lightblue, lightpink, lightblue); +body{ + margin: 0; + background: linear-gradient(to left bottom, lightblue, lightpink, lightblue); + min-height: 100vh; + display: flex; + justify-content: center; + align-items: center; + font-family: monospace; } -.container { - background-color: rgba(255, 255, 255, 0.3); - box-shadow: 0 6px 10px rgba(0, 0, 0, 0.3); - padding: 20px; - border-radius: 15px; - width: 85%; - text-align: center; - color: darkgreen; +.container{ + background-color: rgba(255,255,255,.3); + padding: 20px; + box-shadow: 0 6px 10px rgba(0,0,0,.3); + border-radius: 15px; + width: 85%; + text-align: center; + color: darkgreen; } -.heading { - font-size: 35px; - font-weight: 200; - font-family: Impact; - letter-spacing: 2px; - - text-shadow: 5px 5px 2px rgba(0, 0, 0, 0.3); +.heading{ + font-size: 35px; + font-weight: 200; + font-family: Impact, Haettenschweiler, 'Arial Narrow Bold', sans-serif; + text-shadow: 5px 5px 2px rgba(0,0,0,.3); + letter-spacing: 2px; } -.joke { - font-size: 25px; - font-weight: 500; - margin: 40px; +.joke{ + font-size: 25px; + font-weight: 500; + margin: 40px } -.btn { - font-size: 18px; - font-weight: 700; - border-radius: 5px; - cursor: pointer; - padding: 10px; - margin-top: 15px; - background-color: rgba(255, 255, 255, 0.3); - border-color: rgba(255, 255, 255, 0.6); - text-transform: uppercase; - width: 300px; - color: darkgreen; +.btn{ + font-size: 18px; + font-weight: 700; + border-radius: 5px; + cursor: pointer; + padding: 10px; + background-color: rgba(255,255,255,.3); + border-color: rgba(255,255,255,.6); + text-transform: uppercase; + width: 300px; + color: darkgreen; } -.btn:hover { - background-color: rgba(255, 255, 255, 0.5); - box-shadow: 0 4px 4px rgba(0, 0, 0, 0.3); - transition: all 300ms ease; -} +.btn:hover{ + background-color: rgba(255,255,255,.5); + box-shadow: 0 4px 4px rgba(0,0,0,.3); + transition: all 300ms ease; +} \ No newline at end of file From 6064fbc2fe1b9248689490da718b7bb00edd5e41 Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Thu, 2 Mar 2023 19:45:51 +0700 Subject: [PATCH 32/54] add weather app --- projects/dad-jokes-generator/index.js | 1 + projects/weather-app/index.html | 38 +++++++++ projects/weather-app/script.js | 71 ++++++++++++++++ projects/weather-app/style.css | 117 ++++++++++++++++++++++++++ 4 files changed, 227 insertions(+) create mode 100644 projects/weather-app/index.html create mode 100644 projects/weather-app/script.js create mode 100644 projects/weather-app/style.css diff --git a/projects/dad-jokes-generator/index.js b/projects/dad-jokes-generator/index.js index 7a1e90d..12d9337 100644 --- a/projects/dad-jokes-generator/index.js +++ b/projects/dad-jokes-generator/index.js @@ -33,3 +33,4 @@ async function getJoke() { } btnEl.addEventListener("click", getJoke); + diff --git a/projects/weather-app/index.html b/projects/weather-app/index.html new file mode 100644 index 0000000..de6cdb0 --- /dev/null +++ b/projects/weather-app/index.html @@ -0,0 +1,38 @@ + + + + + Weather App + + + +
+

Weather App

+
+ + +
+
+
+
+
+
+
+ + +
+ + + diff --git a/projects/weather-app/script.js b/projects/weather-app/script.js new file mode 100644 index 0000000..ada1704 --- /dev/null +++ b/projects/weather-app/script.js @@ -0,0 +1,71 @@ +// Set the API key to be used for making requests to the OpenWeatherMap API +const apiKey = "ec24604fb141c0188e07713025f2b7b8"; + +// Get the element that will display the weather data on the page +const weatherData = document.getElementById("weather-data"); + +// Get the input element for the city from the HTML form +const cityInput = document.getElementById("city-input"); + +// Get the HTML form element +const form = document.querySelector("form"); + +// Add a submit event listener to the form, which will get the value from the city input field and use it to get weather data +form.addEventListener("submit", (event) => { + event.preventDefault(); // Prevent the default form submission behavior + const city = cityInput.value; // Get the value from the city input field + getWeatherData(city); // Call the function to get weather data for the specified city +}); + +// Define an async function to get weather data for a given city +async function getWeatherData(city) { + try { + // Make a request to the OpenWeatherMap API to get weather data for the specified city + const response = await fetch(` +https://api.openweathermap.org/data/2.5/weather?q=${city}&appid=${apiKey}&units=metric`); + + // Check if the response from the API is not ok (e.g. 404 error) + if (!response.ok) { + throw new Error("Network response was not ok"); + } + + // Parse the response from the API as JSON + const data = await response.json(); + + // Check if the API returned an error message + if (data.cod === "404") { + throw new Error(data.message); + } + + // Extract the temperature, description, icon, and other weather details from the API response + const temperature = Math.round(data.main.temp); + const description = data.weather[0].description; + const icon = data.weather[0].icon; + const details = [ + `Feels like: ${Math.round(data.main.feels_like)}°C`, + `Humidity: ${data.main.humidity}%`, + `Wind speed: ${data.wind.speed} m/s`, + ]; + + // Set the HTML content of the weather data display elements to the retrieved weather data + weatherData.querySelector( + ".icon" + ).innerHTML = `Weather Icon`; + weatherData.querySelector(".temperature").textContent = `${temperature}°C`; + weatherData.querySelector(".description").textContent = description; + weatherData.querySelector(".details").innerHTML = details + .map((detail) => `
${detail}
`) + .join(""); + } catch (error) { + console.log(error); + + // If there was an error fetching weather data, clear the HTML content of the weather data display elements and display an error message + weatherData.querySelector(".icon").innerHTML = ""; + weatherData.querySelector(".temperature").textContent = ""; + weatherData.querySelector(".description").textContent = + "Error fetching weather data. Please try again."; + weatherData.querySelector(".details").innerHTML = ""; + } +} + +// The above code uses the Fetch API to retrieve weather data from the OpenWeatherMap API, and the async/await syntax to handle the asynchronous nature of the API call. The code also dynamically updates the HTML content of the weather data display elements with the retrieved weather data. diff --git a/projects/weather-app/style.css b/projects/weather-app/style.css new file mode 100644 index 0000000..bed3d24 --- /dev/null +++ b/projects/weather-app/style.css @@ -0,0 +1,117 @@ +body { + margin: 0; /* Reset default margin */ + font-family: "Montserrat", sans-serif; /* Use Montserrat font for all text */ + background-color: #f7f7f7; /* Set light gray background color */ +} + +.container { + max-width: 600px; /* Set maximum width of container */ + margin: 0 auto; /* Center container horizontally */ + padding: 20px; /* Add padding inside container */ + border-radius: 5px; /* Add rounded corners to container */ + box-shadow: 0 0 20px rgba(0, 0, 0, 0.2); /* Add shadow effect to container */ + background-color: #fff; /* Set white background color for container */ + margin-top: 50px; /* Add margin to the top of the container */ + text-align: center; /* Center align the content inside container */ +} + +form { + display: flex; /* Use flexbox for layout */ + justify-content: center; /* Center children horizontally */ + align-items: center; /* Center children vertically */ + margin-bottom: 20px; /* Add margin to bottom */ +} + +form input[type="text"] { + padding: 10px; /* Add padding to all sides */ + border: none; /* Remove border */ + border-radius: 5px; /* Add rounded corners */ + font-size: 18px; /* Set font size */ + width: 60%; /* Set width */ + outline: none; /* Remove outline */ +} + +form input[type="submit"] { + background-color: #007bff; /* set background color for the submit button */ + color: #fff; /* set text color for the submit button */ + border: none; /* remove border from the submit button */ + padding: 10px 20px; /* set padding for the submit button */ + border-radius: 5px; /* set border radius for the submit button */ + font-size: 18px; /* set font size for the submit button text */ + cursor: pointer; /* change cursor to pointer on hover */ + outline: none; /* remove outline on focus */ + transition: background-color 0.3s ease; /* add transition effect for background color change */ +} + +form input[type="submit"]:hover { + background-color: #0062cc; /* set background color on hover */ +} + +.icon { + width: 100px; /* set width of the icon */ + height: 100px; /* set height of the icon */ + margin: 0 auto; /* center the icon horizontally */ + background-size: contain; /* scale the background image to fit within the container */ + background-repeat: no-repeat; /* prevent the background image from repeating */ + background-position: center center; /* center the background image within the container */ +} + +.temperature { + font-size: 48px; /* set font size for the temperature display */ + font-weight: bold; /* set font weight for the temperature display */ + margin: 20px 0; /* add margin to the top and bottom of the temperature display */ +} + +.description { + font-size: 24px; /* set font size for the weather description */ + margin-bottom: 20px; /* add margin to the bottom of the weather description */ +} + +.details { + display: flex; /* set display property to flex */ + justify-content: center; /* center the child elements horizontally */ + align-items: center; /* center the child elements vertically */ + flex-wrap: wrap; /* allow the child elements to wrap onto a new line if needed */ +} + +.details > div { + flex: 1; /* Use the remaining available space for each div */ + margin: 10px; /* Add margin around each div */ + padding: 20px; /* Add padding inside each div */ + background-color: #f1f1f1; /* Set background color for each div */ + border-radius: 5px; /* Round the corners of each div */ + text-align: center; /* Center the content horizontally */ + min-height: 45px; /* Set a minimum height for each div */ + align-items: center; /* Center the content vertically */ + justify-content: center; /* Center the content horizontally */ +} + +.details > div > h3 { + margin-top: 0; /* Remove the top margin of the heading */ + font-size: 18px; /* Set the font size for the heading */ + font-weight: bold; /* Set the font weight for the heading */ +} + +.details > div > p { + margin-bottom: 0; /* Remove the bottom margin of the paragraph */ + font-size: 16px; /* Set the font size for the paragraph */ +} + +.details > div > p:first-child { + font-weight: bold; /* Set the font weight for the first paragraph */ +} + +.details > div > p:last-child { + margin-top: 10px; /* Add margin to the top of the last paragraph */ +} + +@media (max-width: 768px) { + form { + flex-direction: column; /* Change the direction of the flex items to column */ + } + + form input[type="text"] { + width: 100%; /* Set the width of the input field to 100% */ + margin-bottom: 10px; /* Add margin to the bottom of the input field */ + } +} From d51b3e3eecdc0bede933c34898b4bd1645439a9d Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Sat, 4 Mar 2023 07:30:52 +0700 Subject: [PATCH 33/54] update weather app --- projects/weather-app/index.html | 32 +++---- projects/weather-app/index.js | 58 +++++++++++++ projects/weather-app/script.js | 71 --------------- projects/weather-app/style.css | 149 ++++++++++++++------------------ 4 files changed, 134 insertions(+), 176 deletions(-) create mode 100644 projects/weather-app/index.js delete mode 100644 projects/weather-app/script.js diff --git a/projects/weather-app/index.html b/projects/weather-app/index.html index de6cdb0..7fe9e3a 100644 --- a/projects/weather-app/index.html +++ b/projects/weather-app/index.html @@ -1,7 +1,9 @@ - + + + Weather App @@ -9,30 +11,22 @@

Weather App

- +
-
+
+ +
-
+
+ +
- -
- + diff --git a/projects/weather-app/index.js b/projects/weather-app/index.js new file mode 100644 index 0000000..f773a49 --- /dev/null +++ b/projects/weather-app/index.js @@ -0,0 +1,58 @@ +const apikey = "46f80a02ecae410460d59960ded6e1c6"; + +const weatherDataEl = document.getElementById("weather-data"); + +const cityInputEl = document.getElementById("city-input"); + +const formEl = document.querySelector("form"); + +formEl.addEventListener("submit", (event) => { + event.preventDefault(); + const cityValue = cityInputEl.value; + getWeatherData(cityValue); +}); + +async function getWeatherData(cityValue) { + try { + const response = await fetch( + `https://api.openweathermap.org/data/2.5/weather?q=${cityValue}&appid=${apikey}&units=metric` + ); + + if (!response.ok) { + throw new Error("Network response was not ok"); + } + + const data = await response.json(); + + const temperature = Math.round(data.main.temp); + + const description = data.weather[0].description; + + const icon = data.weather[0].icon; + + const details = [ + `Feels like: ${Math.round(data.main.feels_like)}`, + `Humidity: ${data.main.humidity}%`, + `Wind speed: ${data.wind.speed} m/s`, + ]; + + weatherDataEl.querySelector( + ".icon" + ).innerHTML = `Weather Icon`; + weatherDataEl.querySelector( + ".temperature" + ).textContent = `${temperature}°C`; + weatherDataEl.querySelector(".description").textContent = description; + + weatherDataEl.querySelector(".details").innerHTML = details + .map((detail) => `
${detail}
`) + .join(""); + } catch (error) { + weatherDataEl.querySelector(".icon").innerHTML = ""; + weatherDataEl.querySelector(".temperature").textContent = ""; + weatherDataEl.querySelector(".description").textContent = + "An error happened, please try again later"; + + weatherDataEl.querySelector(".details").innerHTML = ""; + } +} diff --git a/projects/weather-app/script.js b/projects/weather-app/script.js deleted file mode 100644 index ada1704..0000000 --- a/projects/weather-app/script.js +++ /dev/null @@ -1,71 +0,0 @@ -// Set the API key to be used for making requests to the OpenWeatherMap API -const apiKey = "ec24604fb141c0188e07713025f2b7b8"; - -// Get the element that will display the weather data on the page -const weatherData = document.getElementById("weather-data"); - -// Get the input element for the city from the HTML form -const cityInput = document.getElementById("city-input"); - -// Get the HTML form element -const form = document.querySelector("form"); - -// Add a submit event listener to the form, which will get the value from the city input field and use it to get weather data -form.addEventListener("submit", (event) => { - event.preventDefault(); // Prevent the default form submission behavior - const city = cityInput.value; // Get the value from the city input field - getWeatherData(city); // Call the function to get weather data for the specified city -}); - -// Define an async function to get weather data for a given city -async function getWeatherData(city) { - try { - // Make a request to the OpenWeatherMap API to get weather data for the specified city - const response = await fetch(` -https://api.openweathermap.org/data/2.5/weather?q=${city}&appid=${apiKey}&units=metric`); - - // Check if the response from the API is not ok (e.g. 404 error) - if (!response.ok) { - throw new Error("Network response was not ok"); - } - - // Parse the response from the API as JSON - const data = await response.json(); - - // Check if the API returned an error message - if (data.cod === "404") { - throw new Error(data.message); - } - - // Extract the temperature, description, icon, and other weather details from the API response - const temperature = Math.round(data.main.temp); - const description = data.weather[0].description; - const icon = data.weather[0].icon; - const details = [ - `Feels like: ${Math.round(data.main.feels_like)}°C`, - `Humidity: ${data.main.humidity}%`, - `Wind speed: ${data.wind.speed} m/s`, - ]; - - // Set the HTML content of the weather data display elements to the retrieved weather data - weatherData.querySelector( - ".icon" - ).innerHTML = `Weather Icon`; - weatherData.querySelector(".temperature").textContent = `${temperature}°C`; - weatherData.querySelector(".description").textContent = description; - weatherData.querySelector(".details").innerHTML = details - .map((detail) => `
${detail}
`) - .join(""); - } catch (error) { - console.log(error); - - // If there was an error fetching weather data, clear the HTML content of the weather data display elements and display an error message - weatherData.querySelector(".icon").innerHTML = ""; - weatherData.querySelector(".temperature").textContent = ""; - weatherData.querySelector(".description").textContent = - "Error fetching weather data. Please try again."; - weatherData.querySelector(".details").innerHTML = ""; - } -} - -// The above code uses the Fetch API to retrieve weather data from the OpenWeatherMap API, and the async/await syntax to handle the asynchronous nature of the API call. The code also dynamically updates the HTML content of the weather data display elements with the retrieved weather data. diff --git a/projects/weather-app/style.css b/projects/weather-app/style.css index bed3d24..2030f24 100644 --- a/projects/weather-app/style.css +++ b/projects/weather-app/style.css @@ -1,117 +1,94 @@ body { - margin: 0; /* Reset default margin */ - font-family: "Montserrat", sans-serif; /* Use Montserrat font for all text */ - background-color: #f7f7f7; /* Set light gray background color */ + margin: 0; + font-family: "Montserrat", sans-serif; + background-color: #f7f7f7; } .container { - max-width: 600px; /* Set maximum width of container */ - margin: 0 auto; /* Center container horizontally */ - padding: 20px; /* Add padding inside container */ - border-radius: 5px; /* Add rounded corners to container */ - box-shadow: 0 0 20px rgba(0, 0, 0, 0.2); /* Add shadow effect to container */ - background-color: #fff; /* Set white background color for container */ - margin-top: 50px; /* Add margin to the top of the container */ - text-align: center; /* Center align the content inside container */ + background-color: #fff; + box-shadow: 0 0 20px rgba(0, 0, 0, 0.2); + margin: 0 auto; + margin-top: 50px; + text-align: center; + max-width: 600px; + border-radius: 5px; + padding: 20px; } form { - display: flex; /* Use flexbox for layout */ - justify-content: center; /* Center children horizontally */ - align-items: center; /* Center children vertically */ - margin-bottom: 20px; /* Add margin to bottom */ + display: flex; + justify-content: center; + align-items: center; + margin-bottom: 20px; } form input[type="text"] { - padding: 10px; /* Add padding to all sides */ - border: none; /* Remove border */ - border-radius: 5px; /* Add rounded corners */ - font-size: 18px; /* Set font size */ - width: 60%; /* Set width */ - outline: none; /* Remove outline */ + padding: 10px; + border: none; + outline: none; + font-size: 18px; + width: 60%; } form input[type="submit"] { - background-color: #007bff; /* set background color for the submit button */ - color: #fff; /* set text color for the submit button */ - border: none; /* remove border from the submit button */ - padding: 10px 20px; /* set padding for the submit button */ - border-radius: 5px; /* set border radius for the submit button */ - font-size: 18px; /* set font size for the submit button text */ - cursor: pointer; /* change cursor to pointer on hover */ - outline: none; /* remove outline on focus */ - transition: background-color 0.3s ease; /* add transition effect for background color change */ + background-color: #007bff; + color: #fff; + border: none; + padding: 10px 20px; + border-radius: 5px; + font-size: 18px; + cursor: pointer; + outline: none; + transition: background-color 0.3s ease; } form input[type="submit"]:hover { - background-color: #0062cc; /* set background color on hover */ + background-color: #0062cc; } -.icon { - width: 100px; /* set width of the icon */ - height: 100px; /* set height of the icon */ - margin: 0 auto; /* center the icon horizontally */ - background-size: contain; /* scale the background image to fit within the container */ - background-repeat: no-repeat; /* prevent the background image from repeating */ - background-position: center center; /* center the background image within the container */ +.icon img { + width: 100px; + height: 100px; + background-size: contain; + background-repeat: no-repeat; + background-position: center center; } .temperature { - font-size: 48px; /* set font size for the temperature display */ - font-weight: bold; /* set font weight for the temperature display */ - margin: 20px 0; /* add margin to the top and bottom of the temperature display */ + font-size: 48px; + font-weight: bold; + margin: 20px 0; } -.description { - font-size: 24px; /* set font size for the weather description */ - margin-bottom: 20px; /* add margin to the bottom of the weather description */ +.description{ + font-size: 24px; + margin-bottom: 20px; } -.details { - display: flex; /* set display property to flex */ - justify-content: center; /* center the child elements horizontally */ - align-items: center; /* center the child elements vertically */ - flex-wrap: wrap; /* allow the child elements to wrap onto a new line if needed */ +.details{ + display: flex; + justify-content: center; + align-items: center; + flex-wrap: wrap; } -.details > div { - flex: 1; /* Use the remaining available space for each div */ - margin: 10px; /* Add margin around each div */ - padding: 20px; /* Add padding inside each div */ - background-color: #f1f1f1; /* Set background color for each div */ - border-radius: 5px; /* Round the corners of each div */ - text-align: center; /* Center the content horizontally */ - min-height: 45px; /* Set a minimum height for each div */ - align-items: center; /* Center the content vertically */ - justify-content: center; /* Center the content horizontally */ +.details > div{ + padding: 20px; + background-color: #f1f1f1; + margin: 10px; + flex: 1; + border-radius: 5px; + text-align: center; + min-height: 45px; } -.details > div > h3 { - margin-top: 0; /* Remove the top margin of the heading */ - font-size: 18px; /* Set the font size for the heading */ - font-weight: bold; /* Set the font weight for the heading */ -} - -.details > div > p { - margin-bottom: 0; /* Remove the bottom margin of the paragraph */ - font-size: 16px; /* Set the font size for the paragraph */ -} - -.details > div > p:first-child { - font-weight: bold; /* Set the font weight for the first paragraph */ -} - -.details > div > p:last-child { - margin-top: 10px; /* Add margin to the top of the last paragraph */ -} - -@media (max-width: 768px) { - form { - flex-direction: column; /* Change the direction of the flex items to column */ - } +@media (max-width: 768px){ + form { + flex-direction: column; + } - form input[type="text"] { - width: 100%; /* Set the width of the input field to 100% */ - margin-bottom: 10px; /* Add margin to the bottom of the input field */ - } + form input[type="text"]{ + width: 100%; + margin-bottom: 10px; + } } From 99e37f27712cbb61c16566c92672dbc8037ff4bc Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Sat, 4 Mar 2023 21:36:03 +0700 Subject: [PATCH 34/54] add new projects --- projects/basic-calculator/index.html | 32 +++++ projects/basic-calculator/script.js | 35 +++++ projects/basic-calculator/style.css | 82 ++++++++++++ projects/image-search-app/app.js | 70 ++++++++++ projects/image-search-app/index.html | 28 ++++ projects/image-search-app/style.css | 170 +++++++++++++++++++++++++ projects/music-player/index.html | 34 +++++ projects/music-player/pause.png | Bin 0 -> 10406 bytes projects/music-player/play.png | Bin 0 -> 4747 bytes projects/music-player/script.js | 90 +++++++++++++ projects/music-player/songs/song1.m4a | Bin 0 -> 401133 bytes projects/music-player/songs/song2.m4a | Bin 0 -> 401133 bytes projects/music-player/songs/song3.m4a | Bin 0 -> 377289 bytes projects/music-player/style.css | 90 +++++++++++++ projects/simple-stopwatch/index.html | 16 +++ projects/simple-stopwatch/stopwatch.js | 78 ++++++++++++ projects/simple-stopwatch/style.css | 56 ++++++++ 17 files changed, 781 insertions(+) create mode 100644 projects/basic-calculator/index.html create mode 100644 projects/basic-calculator/script.js create mode 100644 projects/basic-calculator/style.css create mode 100644 projects/image-search-app/app.js create mode 100644 projects/image-search-app/index.html create mode 100644 projects/image-search-app/style.css create mode 100644 projects/music-player/index.html create mode 100644 projects/music-player/pause.png create mode 100644 projects/music-player/play.png create mode 100644 projects/music-player/script.js create mode 100644 projects/music-player/songs/song1.m4a create mode 100644 projects/music-player/songs/song2.m4a create mode 100644 projects/music-player/songs/song3.m4a create mode 100644 projects/music-player/style.css create mode 100644 projects/simple-stopwatch/index.html create mode 100644 projects/simple-stopwatch/stopwatch.js create mode 100644 projects/simple-stopwatch/style.css diff --git a/projects/basic-calculator/index.html b/projects/basic-calculator/index.html new file mode 100644 index 0000000..f9cf785 --- /dev/null +++ b/projects/basic-calculator/index.html @@ -0,0 +1,32 @@ + + + + Simple Calculator + + + +
+

+
+ + + + + + + + + + + + + + + + + +
+
+ + + diff --git a/projects/basic-calculator/script.js b/projects/basic-calculator/script.js new file mode 100644 index 0000000..c898ec4 --- /dev/null +++ b/projects/basic-calculator/script.js @@ -0,0 +1,35 @@ +const resultField = document.getElementById("result"); +const buttons = document.querySelectorAll("button"); + +for (let i = 0; i < buttons.length; i++) { + const button = buttons[i]; + button.addEventListener("click", function () { + const buttonValue = button.textContent; + if (buttonValue === "C") { + clearResult(); + } else if (buttonValue === "=") { + calculate(); + } else { + appendValue(buttonValue); + } + }); +} + +function appendValue(val) { + resultField.value += val; +} + +function clearResult() { + resultField.value = ""; +} + +function calculate() { + const expression = resultField.value; + const result = eval(expression); + // In JavaScript, eval() is a built-in function that evaluates a string as if it were a JavaScript code and returns the result. It can be used to dynamically evaluate expressions or code that is generated at runtime. + + // In the context of a calculator, eval() can be used to evaluate the arithmetic expression entered by the user and return the result. + + // For example, if the user enters the expression "2 + 3 * 4", eval("2 + 3 * 4") will return 14, which is the result of evaluating the expression. + resultField.value = result; +} diff --git a/projects/basic-calculator/style.css b/projects/basic-calculator/style.css new file mode 100644 index 0000000..dbf9d16 --- /dev/null +++ b/projects/basic-calculator/style.css @@ -0,0 +1,82 @@ +* { + box-sizing: border-box; +} + +/* By setting box-sizing: border-box on all elements, we are ensuring that any padding or border we add to an element will be included in its total size. */ + +.calculator { + max-width: 400px; + margin: 0 auto; + margin-top: 30px; + padding: 20px; + background-color: #f2f2f2; + border: 1px solid #ccc; + border-radius: 5px; + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3); +} + +#result { + width: 100%; + padding: 10px; + font-size: 24px; + border: none; + border-radius: 5px; + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3) inset; + + /* In this case, the box-shadow property is set to 0 2px 5px rgba(0, 0, 0, 0.3) inset. This means that the shadow will have no horizontal offset (0), a vertical offset of 2px, a blur radius of 5px, and a color of rgba(0, 0, 0, 0.3). The inset keyword is used to specify that the shadow should be an inset shadow, rather than an outset shadow. */ +} + +.buttons { + display: grid; + grid-template-columns: repeat(4, 1fr); + /* grid-template-columns: repeat(4, 1fr) is a CSS property that sets the size of each column in a grid container. In this case, the repeat(4, 1fr) value creates a grid with four equal-sized columns. + +The fr unit stands for "fractional unit" and is used to divide the available space in a grid container. In this case, each column takes up an equal fraction of the available space, regardless of the size of the container. + +So, with grid-template-columns: repeat(4, 1fr), the grid container will be divided into four equal-sized columns, which is what we want for our calculator layout. */ + grid-gap: 10px; + margin-top: 20px; +} + +button { + padding: 10px; + font-size: 24px; + border: none; + border-radius: 5px; + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3); + cursor: pointer; + transition: background-color 0.3s ease; +} + +button:hover { + background-color: #ddd; +} + +.clear { + background-color: #ff4136; + color: #fff; +} + +.operator { + background-color: #0074d9; + color: #fff; +} + +.number { + background-color: #fff; + color: #333; +} + +.equals { + grid-row: span 3; + /* grid-row: span 3; is a CSS property that sets the number of rows an element spans in a CSS grid container. + +In this case, span 3 is used to make the element span three rows in the grid container. */ + background-color: #01ff70; + color: #fff; +} + +.decimal { + background-color: #fff; + color: #333; +} diff --git a/projects/image-search-app/app.js b/projects/image-search-app/app.js new file mode 100644 index 0000000..e342813 --- /dev/null +++ b/projects/image-search-app/app.js @@ -0,0 +1,70 @@ +// Set the access key for the Unsplash API +const accessKey = "3I7M0FgMDBz0BC9OMC4e4wi9ByTMXZYt0Rk4fQ15TKs"; + +// Get elements from the HTML document using their IDs +const searchForm = document.getElementById("search-form"); +const searchInput = document.getElementById("search-input"); +const searchResults = document.getElementById("search-results"); +const showMoreButton = document.getElementById("show-more-button"); + +// Initialize variables +let page = 1; +let query = ""; + +// Create an asynchronous function to search for images +async function searchImages() { + // Set the query value to the input value from the search form + query = searchInput.value; + // Create the URL for the Unsplash API with the page number, query, and access key + const url = `https://api.unsplash.com/search/photos?page=${page}&query=${query}&client_id=${accessKey}`; + // Send a request to the API and wait for the response + const response = await fetch(url); + // Parse the response data as JSON + const data = await response.json(); + // Get the results array from the response data + const results = data.results; + + // If this is the first page of results, clear the search results div + if (page === 1) { + searchResults.innerHTML = ""; + } + + // Loop through each result and create a div with an image and link for each one + results.forEach((result) => { + const imageWrapper = document.createElement("div"); + imageWrapper.classList.add("search-result"); + + const image = document.createElement("img"); + image.src = result.urls.small; + image.alt = result.alt_description; + + const imageLink = document.createElement("a"); + imageLink.href = result.links.html; + imageLink.target = "_blank"; + imageLink.textContent = result.alt_description; + + imageWrapper.appendChild(image); + imageWrapper.appendChild(imageLink); + searchResults.appendChild(imageWrapper); + }); + + // Increment the page number for the next search + page++; + + // Show the "show more" button if there are more than one page of results + if (page > 1) { + showMoreButton.style.display = "block"; + } +} + +// Listen for a submit event on the search form, prevent the default action, and search for images +searchForm.addEventListener("submit", (event) => { + event.preventDefault(); + page = 1; + searchImages(); +}); + +// Listen for a click event on the "show more" button and search for more images +showMoreButton.addEventListener("click", () => { + searchImages(); +}); diff --git a/projects/image-search-app/index.html b/projects/image-search-app/index.html new file mode 100644 index 0000000..92e769d --- /dev/null +++ b/projects/image-search-app/index.html @@ -0,0 +1,28 @@ + + + + + Unsplash Image Search App + + + +

Image Search App

+
+ + +
+
+ +
+ + + + + diff --git a/projects/image-search-app/style.css b/projects/image-search-app/style.css new file mode 100644 index 0000000..07fc2e5 --- /dev/null +++ b/projects/image-search-app/style.css @@ -0,0 +1,170 @@ +body { + background-color: #f9f9f9; /* Sets the background color of the body element to a light gray */ + font-family: Arial, sans-serif; /* Sets the font family of the text inside the body to Arial or a generic sans-serif font */ + font-size: 16px; /* Sets the font size of the text inside the body to 16 pixels */ + line-height: 1.6; /* Sets the line height of the text inside the body to 1.6 times the font size */ + color: #333; /* Sets the color of the text inside the body to a dark gray */ +} + +h1 { + font-size: 36px; /* Sets the font size of the h1 heading to 36 pixels */ + font-weight: bold; /* Makes the h1 heading bold */ + text-align: center; /* Centers the h1 heading horizontally within its container */ + margin-top: 40px; /* Adds a top margin of 40 pixels to the h1 heading */ + margin-bottom: 60px; /* Adds a bottom margin of 60 pixels to the h1 heading */ +} + +#search-form { + display: flex; /* Set the display property of the element to flex */ + justify-content: center; /* Center the child elements horizontally */ + align-items: center; /* Center the child elements vertically */ + margin-bottom: 60px; /* Add a bottom margin of 60 pixels to the element */ +} + +#search-input { + width: 60%; /* Set the width of the element to 60% of its container */ + max-width: 400px; /* Set the maximum width of the element to 400 pixels */ + padding: 10px 20px; /* Add 10 pixels of padding to the top and bottom and 20 pixels of padding to the left and right of the element */ + border: none; /* Remove the border from the element */ + border-radius: 5px; /* Add a 5-pixel radius to the element's border corners */ + box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.2); /* Add a 5-pixel box shadow to the element */ + font-size: 18px; /* Set the font size of the element to 18 pixels */ + color: #333; /* Set the text color of the element to #333 */ +} + +#search-button { + padding: 10px 20px; /* Sets the padding of the button */ + background-color: #4caf50; /* Sets the background color of the button */ + color: white; /* Sets the text color of the button */ + font-size: 18px; /* Sets the font size of the button text */ + border: none; /* Removes the border of the button */ + border-radius: 5px; /* Sets the border radius of the button */ + box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.2); /* Sets the box shadow of the button */ + cursor: pointer; /* Changes the cursor to pointer when hovering over the button */ + transition: background-color 0.3s ease-in-out; /* Sets the transition effect when the background color changes */ +} + +#search-button:hover { + background-color: #3e8e41; /* Changes the background color when hovering over the button */ +} + +#search-results { + display: flex; /* sets the display type of the element to flex*/ + flex-wrap: wrap; /* allows the flex items to wrap to multiple lines*/ + justify-content: space-between; /* aligns the flex items along the main axis with equal spacing between them*/ + margin: 0 auto; /* sets the top and bottom margins to 0 and the left and right margins to auto*/ + max-width: 1200px; /* sets the maximum width of the element to 1200 pixels*/ +} + +/* Sets the styles for an individual search result element */ +.search-result { + /* Adds 60px margin to the bottom of each search result element */ + margin-bottom: 60px; + + /* Sets the width of the search result element to 30% of the parent container */ + width: 30%; + + /* Adds rounded corners to the search result element */ + border-radius: 5px; + + /* Adds a box shadow to the search result element */ + box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.2); + + /* Hides any content that overflows the search result element */ + overflow: hidden; +} + +.search-result img { + /* Sets the width of the image to 100% of its container element */ + width: 100%; + + /* Sets the height of the image to 200 pixels */ + height: 200px; + + /* Determines how the image should be resized to cover its container without distorting its aspect ratio */ + object-fit: cover; + + /* Specifies that any changes to the transform property of the image should be transitioned over a duration of 0.3 seconds with an easing function */ + transition: transform 0.3s ease-in-out; +} + +.search-result:hover img { + transform: scale(1.05); + /* The transform property scales the image by 1.05, making it 5% larger than its original size. This creates a zoom effect when the user hovers over the image. */ +} + +.search-result a { + display: block; /* sets the display type to block */ + padding: 10px; /* adds padding to the top and bottom of the element */ + color: #333; /* sets the text color to dark gray */ + text-decoration: none; /* removes any text decoration */ + transition: background-color 0.3s ease-in-out; /* sets a transition effect when the background color changes */ +} + +.search-result a:hover { + background-color: rgba( + 0, + 0, + 0, + 0.1 + ); /* changes the background color to a light gray when the element is hovered over */ +} + +#show-more-button { + background-color: #008cba; /* Sets the background color of the button to a shade of blue */ + border: none; /* Removes the border around the button */ + color: white; /* Sets the font color of the button text to white */ + padding: 10px 20px; /* Sets the padding of the button to 10px on the top and bottom, and 20px on the left and right */ + text-align: center; /* Centers the button text horizontally */ + text-decoration: none; /* Removes any text decoration such as underlining */ + display: inline-block; /* Displays the button as an inline-level block container */ + font-size: 16px; /* Sets the font size of the button text to 16px */ + border-radius: 5px; /* Rounds the corners of the button to 5px */ + margin-top: 20px; /* Adds a 20px margin on the top of the button */ + transition: background-color 0.3s ease; /* Specifies a transition effect for the background color when hovering over the button */ + display: none; /* Hides the button */ + margin: 0 auto; /* Centers the button horizontally */ + margin-bottom: 40px; /* Adds a 40px margin on the bottom of the button */ + cursor: pointer; /* Sets the cursor to a pointer when hovering over the button */ +} + +#show-more-button:hover { + background-color: #0077b5; /* Changes the background color of the button to a darker shade of blue when hovering over it */ +} + +/* This is a CSS media query, which applies different styles based on the size of the screen. + +The first media query applies when the screen width is a maximum of 768px. In this case, it changes the justify-content property of #search-results to center the search results horizontally. It also changes the width of .search-result to 45%. + +The second media query applies when the screen width is a maximum of 480px. In this case, it changes the flex-direction property of #search-form to column, which stacks the search input and button vertically. It also adds a margin bottom to #search-input and changes the width of .search-result to 100%, making each search result take up the full width of the screen. */ + +/* The following styles will apply when the screen size is 768px or smaller */ +@media screen and (max-width: 768px) { + /* Centers the search result items */ + #search-results { + justify-content: center; + } + + /* Decreases the width of each search result item */ + .search-result { + width: 45%; + } +} + +/* The following styles will apply when the screen size is 480px or smaller */ +@media screen and (max-width: 480px) { + /* Changes the direction of the search form to be vertical */ + #search-form { + flex-direction: column; + } + + /* Adds margin to the bottom of the search input */ + #search-input { + margin-bottom: 20px; + } + + /* Makes each search result item full width */ + .search-result { + width: 100%; + } +} diff --git a/projects/music-player/index.html b/projects/music-player/index.html new file mode 100644 index 0000000..20b6976 --- /dev/null +++ b/projects/music-player/index.html @@ -0,0 +1,34 @@ + + + + Music Player + + + +
+ + + diff --git a/projects/music-player/pause.png b/projects/music-player/pause.png new file mode 100644 index 0000000000000000000000000000000000000000..3c877cc4ee6711d85c7b3ce802c4f80a5c79dc9a GIT binary patch literal 10406 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 literal 0 HcmV?d00001 diff --git a/projects/music-player/play.png b/projects/music-player/play.png new file mode 100644 index 0000000000000000000000000000000000000000..7019bf19e9654098f39159fc1192d9c76101ef10 GIT binary patch literal 4747 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 PUjTaN47G~R+J^rNu=Y9e literal 0 HcmV?d00001 diff --git a/projects/music-player/script.js b/projects/music-player/script.js new file mode 100644 index 0000000..c037a17 --- /dev/null +++ b/projects/music-player/script.js @@ -0,0 +1,90 @@ +const playlist = [ + { title: "Song 1", src: "songs/song1.m4a" }, + { title: "Song 2", src: "songs/song2.m4a" }, + { title: "Song 3", src: "songs/song3.m4a" }, +]; + +const links = document.querySelectorAll(".playlist__item a"); + +links.forEach((link) => { + link.addEventListener("click", function (e) { + e.preventDefault(); + const source = this.getAttribute("data-src"); + document.querySelector("#player").setAttribute("src", source); + playSong(); + + // Remove active class from all links + links.forEach((link) => { + link.classList.remove("active-song"); + }); + + // Add active class to clicked link + this.classList.add("active-song"); + }); +}); + +function playSong() { + const player = document.querySelector("#player"); + const playButton = document.querySelector(".player__button--play"); + const pauseButton = document.querySelector(".player__button--pause"); + const progressBar = document.querySelector(".player__progress-bar"); + + if (player.paused) { + player.play(); + playButton.classList.remove("active"); + pauseButton.classList.add("active"); + } else { + player.pause(); + playButton.classList.add("active"); + pauseButton.classList.remove("active"); + } + + player.addEventListener("timeupdate", function () { + const progress = (player.currentTime / player.duration) * 100; + progressBar.style.width = `${progress}%`; + }); + + progressBar.addEventListener("click", function (e) { + const progressWidth = this.offsetWidth; + const clickedWidth = e.offsetX; + const percent = (clickedWidth / progressWidth) * 100; + player.currentTime = (player.duration / 100) * percent; + progressBar.style.width = `${percent}%`; + }); +} + +function playFirstSong() { + const firstSong = playlist[0].src; + document.querySelector("#player").setAttribute("src", firstSong); + playSong(); +} + +const playButton = document.querySelector(".player__button--play"); +const pauseButton = document.querySelector(".player__button--pause"); + +playButton.addEventListener("click", function () { + const player = document.querySelector("#player"); + player.play(); + playButton.classList.remove("active"); + pauseButton.classList.add("active"); +}); + +pauseButton.addEventListener("click", function () { + const player = document.querySelector("#player"); + player.pause(); + playButton.classList.add("active"); + pauseButton.classList.remove("active"); +}); + +const player = document.querySelector("#player"); +player.addEventListener("play", function () { + playButton.classList.remove("active"); + pauseButton.classList.add("active"); +}); + +player.addEventListener("pause", function () { + playButton.classList.add("active"); + pauseButton.classList.remove("active"); +}); + +playFirstSong(); diff --git a/projects/music-player/songs/song1.m4a b/projects/music-player/songs/song1.m4a new file mode 100644 index 0000000000000000000000000000000000000000..90842b1d0445c791b491934f29af5010008bebd4 GIT binary patch literal 401133 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 rXQk0*cuyS1S7ZO4f8Fa-W>c^3S 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®sf+B>fkZ-6!u+f6S(!-&ez+7NUVLv@;$fzo87F6U zbnJDqLrB7gUjMHA-(3nRVa(G|DKt==WMX8oo}mbKR>BSUF2^I(z1MTZz?p)A)BUz2 zr~HmJ-~XFN)^WnRn)Ycl)7KA={%|>L0tO`Yb{D@_-mw*Z=&yDQfzZ9|f@T%VD|W%i zr!}EEOwBHApjV=7QZ&vPX-Bxb>(6ODe6pc#u;e70IFqpEDBN&RoVqHE zp%9i3MM-nl!e}l=?7qB$gv|rpU)*Kd*ztb8h_K8M-Y!e6f7J1faT(hHWV91b~I9A~HOUof}Mp(x2uOzQh>9V&YJ-D$Ch>D4nbl0h;K z;_+kQz>B{*MAad%Nb(W3_o*e?n5oMpAq0vMo40YGChTCfl^Ct&`0hK>e$RL=6NKjv z44y=9{8tau)_n5`^hZ)>XaRux|IPhgxUjji;Z+L_7LT-D=a^CpUtB0jQ_OLK)eUC4 z6XWL8PH@KdP)z-YWasj;XntPrx@H#hF(sDi#EWJTT||$#0KxRM;ShBYVdnT4jT}f( zfhT`kGTMgHP0JInNFbN$*(vnKhkLQcfbB0m7OFysQmaC6WGf^8c%j6tc0XKh1Vai} zJ5x5L01px7ON6M>xE90t2OZF+ByD`Z-geWVeofv3yu(D3<^4b8^XPv|3P_>!CLlJe zX!Eu$GHYa-oM3TfDmOi;ct_|kxmJjDa3l?p%(QC=RFWa2uP7gQ%6KHqre$cRSm)hc zr4*mG=3fXCsR-qfH%l^Lls2e1XDlnjk62kz*=LOH4V=HlF~f*SUnoZ-YgOyETRZny z{n7YJunsCCjfRJqfpmz~2x=I;3;JvH*;>9EPd{tPbj&wpt!1r!fc=2b0T%Dy>k0tG zhS@676M+i{iZHC0-Ir*oP|4RgHq5^ayEF4t$J>*B`#yO#=p#SBRE z2@TalDP$~7dU39J^B-_QDB>_vd+%V03$iIla6t$t?IodSFoniRbae4k3A zP!%T1Uf>q-KfhN$Oku+6`djA?B~3n&H+qs0<&XD4tG;rTcm)6RY|-w*QMEwCPY){) zm_mG)I@(?Fs^GIxDFeD~Bxp7Zj9)S?!Ak!M2)(DsHv|hmNuw8K58I_EaLMo>TZUIO1+>t%+)W?Ts z|CEORrVy+CQ({79q@XjX=UK}F2R1A*pxX7|jkG`HPULXT8J8tPFHr!Q(?^6N;_1f- zCFL9``3#V+AM|eUv+key8C|M_^Vl1zxNXU=Zy||n5+}6nfzX3PEyC(w1K zOE}SDXuCQfdtbww#wF`cxdX(MSgYJQIfV@2E#p(nFJ9rH_>WU$A$-wr^&j`HH*5x8 z8lt1c%`SzAE#fgkyGDC?JFn?XQY64o-(hkv)flnN4C4NGn7P$$n0oTp6&_L-@mXI< z>4iBH*67=V*|X-@Cvrn0A~^{VqEl0pML>ew)~qr%1uQ|K9P-?GUh`3F0SYOXB5w@t zH#fyO$MUpL^&RhmSBjzIA9Qr$|EHbB-$k&4@6u#I)l}uJ^;bwoCAWJtz$X6F&JOl% zOKnKvf?(k&*j-md#WjOh;qJpXmudT4c!l^5Jg{T=8m$zj#6Svk=!+J=K&u~ih|E%I zpy`p=D{ZbGWcigHuAYc!C4Zm@AZH&Y$`1ZZ3o?P!!n1%N1LRyQjjuV~aXHRcEMf-B z;WGy5$(4ep8@$mdi(jm8yYo`@AUbq?nQWnnQ|4MvLDyOOp0eqtdxiH$@0j$a*P$VR9f^IRJf)!#8xmM?NO$FLNI+Pq=nZUkdzD=oHELamT@%+ zys#b0P`+N4*Gb&_>F7Vd@xt$j^dj&gm_m-#!Rn!7_~GaMGY{jdN=Pz*roqg=)jTpH6(a_uD|iRm;>PMGDH=$D3(v$G}#s zt80|6m!8AiiBTayh0`~-DAQez{*J(}fOZYhd556+--lFBWYH+0W?KKd8pw9x?BP56 zXc^^EYVB$j67d8L!etarsJ!%KH`Ze&yRE^MoEBXkUEf5}4ew#Glfs6mW*YDyAk+m= z)#^2R%9;Hdiix`DNtO5R4}cY#>O&t>8>? zjvj`xR0DL8)f??&5N^7-Ty~PfRT#&&DJwu!>7kc%ISLkuj}hRL$s#R!5<=SMs-x)CKVDnHg?RC>V@xPxP)T&&}yzwh9R^WNQ{7PdIHUG+? z#Lnv3YLClW(6Ezi>%uEftM>hrNpXihbUJYayv~~~hiJ-1(@f6-{#{Ju2rE@{?y853 z50x9~QsJ&`Qk9{+B!R+&?@kTq{ft*V4S0Le?V-Zc;Xw`8^osdrBaTkcldqj^_G#s6 zP_XmO_deuHih@pxK!7NezZGJf(U;;`5w~!Q!j;`3hT27%{=njy#4`CdOiNoWresP&#-cMmM~`s=WT+u`8fK~pUk%be)aYDJ`UjCMhomMJ?Ti^K z`;DFT7cL}O#1@7B(wjr!?<*Q<>8$UV3a5%rOfZX_H+)(?mO607p?NZz#5!f*_F*ly z_nzRLt16dB<`j{=*G#N_{u@fk?sc-%-+=j9e_YLq2X>!0;JCl%`_o=v9)9OE;^3jRYzzhs7E3mpVvsC10_4N9azlo|IhvP71^ zp(A9w#PIj2p;DO12MXl6BqcpQJRrg`{t^qcSMpsj@y#>{ONLHak35z5G@nsj~w#7a3=u5NRyN+@6%P2 zYZq=znJUurQIO*|m9HT6Cd4G^9daEULL>#}p5uU%=ad#LL`;-ci?(YSo%gr5nmS2~ zaungz)rnk%r7Ic#e8^r@U65EkdOlcUXVc$Ca!91wsA(A3!JK5ytXlc`B{SC+9s^M+ zhgqA_?2U>8OR4|EiHxutCuQt~K`aX)9Uz?g!oXbKv-ug8Mvgiz^*b<1biKPj2v!n} z+1*g7Gx6Yis06gaNQP3bk`Hc`Nd$^<6Ms|~Ww%IA^;}fuwndXIrvH}iS*nchs!sVF zf;iSZq%0z`=hx2!CEE~YN&VIR6-1_-sbwPYKQ}q+-k?2vdzC7lJdRPlwig?0c(WOX zARl_9wvOx;KU|v2A~$lTMc4dzwd|W+7fwBpf# zJo5cllNZmXY?_6-?s*v3u9htaMI=403b&i26alI$0wWv#Ak$~Vk{VUR&fjr0E?q5++q1qR(?UQDPJgE*9mxZ9GB?_c4__#*JuqW_8aBc^I4Km7*MPfR& ze+hg12g(u3N$E8%Ckg_^sLry<(LeKXnW$ii_{{F)EAk||7~}@0%V@lJeiNhFr9e9vvXl7n$0Vx^6 zd+xS?>AJ*m=^WGn!RD?RV6T#lrZMc*i3^5V4^RF0Y1Pp7+y~tklWb1i?z0Xk*fxu= z6Ox(t&2rz#@Y^Wb{A{xh2aM`@xk&T-l~u#Gee>k}vK5qL%yauW;WS(Ub=gDiN9FVf z;qdH!5ejo38UfKZISv$Y!}L|AU*m_jJzN(ym|fvX$$pZAFTwvsguZK--rnx+j~+=W zy=Vd9G0BEU+FmT`75d}o;sCflEv#%mTWSsZ5pPVrq06z>34TeiC<@(NbjdN(W#6UANI?jy z;|eJM9<1D#2LuP&$H$qj~rBYA^}rCJyqy#lsSndDpE%jBEi&7)oeLQkWM zX%I;%l5vBO?7mp#?Ii&Jlgdj&)=at3an>Szc&>J!UbK}87L6m0rAR4RWdj7@sS6`% z$sIe(xQuj?-GahJK^3V?@9U_zcj*2nDo!jUW@3{r`TPuGf88}r4|cuJrZ)U|ITtp< zOM#j8i zFkxi-Of4LfzW(k4p71fFe(bM3HBr030Olu>B`QjH0_23;-a9 zrN1|LL-;3l?HE)7D7gRFO9d~6xsf1AAsH~BGDcAW8`SMI;Ufmcq`$md1q&nPMelX_ zt1JY5q2JO0y(A@5HI%FLc>ISB+TDZYP+TZJeJCkukjx;*Cg+MTU*v?|2OPdYxrR@E zqme2=p>)SqUa`;^A3~9q9H45b8G0q%+6SHdAXF&3!CP8xq51fh0XlE`=2-~*tTqTE zkwVkaLP)Rw$xi#PpJo7=n>6}DfhB1%XYTxZhnzdl3D4GGd0Di#DgeIDT8aN7Eq-eB z&+3nDSoAD~JX2H??s)-Kyn#K7ST>ue@pLbOxI#X~R2<4C4@W0x3}=zycjDK}o%)5$iDD5#eFoXZlFX)~owW5H`k|=wDJWBx94JY1RLFFxv@-y;w{NlimaF zBAIvm_xM-*xhp&ZFxjZ!)_i=^E_$tZ#X2{?E&Gdi(}cZDC%?YjC@R8!%5sV___(a% z^5*Xv+A_m?ksJIcuFPg&N&AWAnK*Km(&Q%?+?Mn{ZG=8o# z?2o|Wk5PZVCGCPmFaCsSiZe8I*M3&f(u*ZpBYa6-qa6Sq1 zAI^Bhi}E{@02H2tTEVFwbv%< z04FWEWaX$$3E7c(FHB>R<@_T~WUoI<9Rz>@|00VHG9?*#gc3F!v=HWL#6@S2J|S_M8T>3u7{Oam`t#A zD}J!91+jOkVb_25Ntq|E@>bF9}p&d&rDZUi|W zvmIQ08?B0zf7_ErqH3Hb{YsP^^59TeM)C7wr^(n*Q^JyHSek;seB&aX;vqVG?!R$U zU@x%G*jPq9}2no?w`>X~QtXu$(k3H}GP9uwU!?Md<|}=c^YgNTiE*yKMT- zY<+K)-K5;a;f;hvN_y+3y; zLKr>tksBTeh@wQarmmT5gf!N}3TUu`H*Z+o9(vT}D_xRj`X?BXakSEu@iy9{e z+-O$a3)$)|NrPJ#vl~ks9YPV3_)RD;HZ75IGM_9S^hq~=5~~3hwnMnA0l1e;i^3sO zxFl(yE9xm41lnELEMQ;<6m(93f48I1OpKyZ4kR~n!O%~54dWs56~uY`ctY)a zG=8=NK1<{IRqlSRNM+h>@PrymFg>7R4rO6BMy&crN+dl~(6xlvf0*cAy$G_?Q6Tob zR@rN-NR(Lgka=+l)Q?sPP#f&xjkQDgG%<(pIB@Z3l)dY-@C?EWXO z#`jE%yNdqVB-m*`M@iSS92!2q&fJQ%HoyFswNi#kh*MLq)Y5?X<;yV^Ao8bO*`L>g zQpUq6O&$MmKfRn*W%_5LK}v^k*imq0C`~S%3ROa`DdNY^k3Ja;70rPpoSc#~V)MUR z>F649;daQAXgUL zkKDhBn#~!1TAN{xMGhV(Xz)Ch-RO6jHY96c1kNc0X3p++^p?yV1d_LGdC^>b zq5P-H-&7Und2GXL9(RVxo|A@y=66S(n~g(F76VP~7}*r6E@}JPOe5>A?1ec##<^_g z0ZQqIB;G)oR3XfYjJX#FinnMkj9>2deAl36^Yb`=$OKoGWTN88XJSl?Vct8WtXqhV zRKg1g&zs3|u3%6SUKOB>DMTP~6yHK7RskaaaD%DANFxD~b6r5MNan;8=aVzc`!tq@ zB~7rwbBJOg?6-#;o&RY(T-iT=Jeu@79eVW6#5?#s^AgD5A~&c;#7q+tP%V-K25(Ve zhtFNg3JTg&V{dZt8Akhf(rLznwAQs!RvG{7TJiFKI8k`993U4> z6gpx?P88{|PmzU4yAM`|hRW)yQ~^V&JV8#(bR!X-%t$aW{IyUpz5`K8xMER;6)?Fc zoH`jNMW0F}6D-3ci3H>pr$GUAPXF$)~ats6ln=%9nwgj4(xoJ0q(#)LeROb!&d6=JQ-&p$RH_P3%oNm@ zjuN0tFwC>O&hU!Kn?hyH)~Hh?EziG?UT0I0-%Br9@XE?XN)G25?9*GlKDc(I;5rDLG`g>pmB=Ak6KX4;xo|!e?U%T$qOcpAA$@)Hq&zLnAe$SG+@y znKQ#xvdM3+G)3kLVHNoPu=jTFs<>4BR#AVdM*U6pcoZGv^()ZEX-%rb?zgG(a~Z5q z8>$u84`LIUl#wren;NK0(k2Rnr((U-Qn`a#Dyq{h@Qo+gCqr)^#=vkVJcw) zXSly{Op_lKYiiYKA9D=UQ5m`&j#ylW;!7%jK{NE^p;k2s{2Ryck}vo7ctC)mv5?*d zekF`9LZ`Sk45~2EuqB&k65H-5?T}!sLOmtZcqQqj0~?0 zpK5OZFFnGfNB{GQV(@@k7^R9@Eh5oEiXm7kH7cyXdB(P+h8L?Uk>eJebmoeDO|vZ? z+e=DheJMDbO!}_lqT-2G(#b%QaOBeXy+{H`HzF@z@ww!U=xNI>imAX3T1eA&Y0N9ZvD2G zO17@cQ*pebo3^k>nFS9CvJQ-#h76f7X9<5KUfjga8Ztfu1J_R9ft!R2MiSqC#?`k^ zKJC^8Rn$&>Im*@#@rdvU6e6%S*|odIyEA@R^>u*ECeyWyGc-V4{YRz9DgbQQXA(*P zEL=cEPo!g zZ=WUhF$4He!p9J(U^$1|f%~FD&PA>ESPu4Xz_^8y@1enP(2wBM4D{EeAb)%)5 zG98hMF;s{^zK%7*Q@3x-$?{02`AorkQ(p^6zLCpkD4mkTfl-n|P_i}!&SP`71#6}Bge+(GezSb%EXCEki}%`4R>#4Rr+ajV!LCDXqz^|XY$MRH&i7cHdGUkC>_O#dDSeN=r!TH(?r_K1v zriyBDbZLl_F_TfAt{P|<%4eFkC7??wde>DfsGyzq?xAz-@h0$yXr~Meq7ri zpv!e(aWqJg3e8|L@v+EKmx)uXDOL#+pF90`@9`a$B@7G|l@gWwXgIa@$vRS(Vsvk% z3``QeKr}XP<=!CQ^?bq;9=!l&&#zbecS&8@xBkqEN6 z+(2T14>&)t&h!r|rP@s|%0%=;KscYDgV`lA#S&svC8^a`il|}bzh}-mwd*mE$o~rPj)$Zz&*w7{eUf!nTA!m?7v@BR?fTF z=7Xx@EyZnLtXOT)yflSYzqrhBJNzAffY%UMEPMFmWiI&UTOjq-B4^5D$};FH+J61j zH=;q2L;W8l$-*;Pp#Gn^pN(kR7p63E__E)Ue*^iRyq+;n#mW>FtX&J7X6)ssn20|_ z@5MQHGVCpCIEZB(rI2iL(Prj|>lCK~5Gy-ovTx9K^vZarBAAH;P=TZaTYlTi&Vc_d zu6UvJJVXJtgA_8nSmfU~6@)C5#?^#LQTc*01`u!tK+s5~LYggmOZh*t9Suu-sfl6f zUjLXlpD0*yK?Xj>)OX%gT&d|)@X`OgiD+TD+)G`6*IzoQHH^S@g-CfBHa~0hz}9#2 z(1Nl#?t5Rs-2f zP`W|7k&@1rbH3;IUf2E)_S$Pd&sz8WxmBSqf+Di^D!GNgqDsclS_Q5+I#MAMc~p*E zNC?otn`1K4nkm?n0Cz(uCWv%^5k)88E;%U?vR7?atW0(0Hdq=S)Y8ls(b}Y0FONUt6!s?o{@TWLM;KOm|n-**vk4vIUo8Pn(w z4g9`fkV~?ytsf1SVU?rR9*^8HN407Tmc`2qIaZu*-Ry#N|fk=B)Br+laGPlU^hj|wRh9C2-veb^80c8A1J!uNf3$05T1 z&hZmFyZgh`*C{(4hr0HT8vlH6;MA(>5+GuZnbCQP%0+|8FF&Pb${(|}iQohjGK65g z$~2RSf*w=H#fLN1DgSSAEccMC0HA6H8KsqRz@ha)IyxCTlDod;I2o2<3bW95>MF zLBX-jEC%4E%?pvw!)^t4@x1umRc z2=j9hQCCj)NZGHrKnDsU;PYsetI>$c51&NDM zqxhB&j~8aMy?EX;B@`ee2#diy!@3q$X^=Ei{@L@BH)|WiIg?ms<=NYcD%RI)wDY}* z*uJuP6`$1B&y^{O!Qwxf{l8{Q%bGpPquZqzrrp&u1q{ndL5MfkW{+t(6IniL?r6fp z;k8P#BsmWQZH{)kk~RAdDVcw-OKaTdl( z21Av!cz)XLnS+ZJSOr6I+|^tH(p4DN>DEx_K>~Cjv^R5zFOU-4#emI~Q>$)}46Hj{ z9(51hlr6siVaE*CaN}cgCSLA5Q;e)4M-(A z0>V@%N2sU5tA99?UcfjOSWoHy&Az_<>VJ~uKm4~)1Klc~^(*2y`7QUiaVuR7-253& zc_{HU0cxr)v^XnU1pS?a$D?W7@ZC}7&o6E?G$<3Xb$}o|hc{ctU632n)mgi!WSyuE zS8KZDD^JzOo$P1rEH=_x{Z-S9o_0JN(4?>dW5=mPm-(V%W!yPZZB28}eMUfrPgo$$ zn{{X}4iW!eM18t(p@H3806e$O=JY7BRWhp#vW`Z6(|la<<#kffrt{VD zanA6cj=%jBZ(=XiI!A&kl~OP=*wpoV)B4VS;(qb%LI+1(@meSToWia?MD}ZqDKR~Z zaN3_2*5dYSuDflZ3fm4nkiRSGa3AvwbE;MxZI-4VTj80pA8VX>m5@9Y|8I^mAlVg* zY`JxAAFKAuu>Rs|={7&Yadm4>tm%q<(`Ip_HbqyE&0bDExSjDJrgGm>t{vQe|pfE_YLhl02gvTF@X8@)?r!yH9juT(W`^ z;egYsakb%Wz0<8r(bHUx-NGhS%WyJgF-J_s)?dKbDmpEYn(fHYh2Kj|R{@$T`?<$^ z!a{SRf3i$fo*IJc?K1wu{TZkON{=p1G`IdAdMl-yK*1aOZ$9@n>+#Js zrLAJ*s|VNE5lVxTWON1w!Pm6b3xLT5YD_6S2x?&Eox}LrR|WR3?aNN=C%U- zN+<&xdBdv870N$&DS@)6lAo1iId7!Ngk^^!&bvwLHDp`MO`QO;DzR^3Fy)f6^B+BF z-vgMS>_=8B2&^iwJbg)7-~DHhc^)LlFWur3FuL82jYE~wUUUC|HgT=}8M7rKF%NSkgX zAWL(PyTwoM%!uwvO=#ih$E!m$MPZzDtGqZ0>TO9S`l53i^K@bB@lyl8PhS`aV@3Ww zd9+|Av<5E|13(J=C>^+iPC`fNzs`7?I+{O58Tp8dCLuRID@r1(2YAj+Jy$TI8d@|T z$j&u!6%ojDWpT8;uEMgl9Xe2Zx8zGcyMdS`b!o-4s?k-n~k-S)UG5HT~s3>?(y#~IwFP5x2Emj;LRR4GGc=ewOk)$6< zfWV zgquFqVu~(r5YZ*|R)BRz8f9#Y*CMSx&$5e6`D z)(?bSp!imJG^0-{H&BJ~rOj`h85c4nAUf><@6Rl`=g$rQ!r3G~GCXZ5F%As68godz znnO!fWk-G6h-+gGML3d(nl+<^Y8J2)+b>yh5r_aVr@%#d1az3_uNQrhytv!cP9J{i zyfa$K%Iui==IJ~4;sdtAj~!dPG5)f58T1J~N;VgwYi(gLRH+c1#8ZJxhKf_#0Wb%SI-Fpazs&Ll9Gl^EfKo)rovBkGohZ6tC zfkX>91-NATF=?*jqv1=7uIgnCUZa&Vh25}}k$;CDi5GTujU(;a3qxFZ184h`t=oHG zWBw+X6ZnLE4<|Bh{?g&tmV=gi5HpVNg(-Tq@0)9i_7)zf=@ZZ|q0$X_J1H#zu53!4 z0*kk#bgqwhf0^BA)@B(xJ~N~C|F>F1rl}s*k`*Dwy(w_|xmiJ?!HGK}1rKWnBDA_9dXR zJHa72-oI8&%PpI9>%<6%r@hePYtx2U8jm^!S}vI8e-QTbPAswy-Q zb0P`dE&fH@;e}c2C*0RdWXQ$8?+}y}q9qK-YMj-y;vuv|p~KIyvi3U-nn=LkM5E^n zod(9S;U?oMf6oB>3o+?&6m4FrA}~7(KgJ{*yvRiu<`3BB&jo@ODep zT8u&$%jWqeZ+YrO55c*p0uLvCT~S*TmZuh{UVqRPRpy5NtVv>=Wb2;Kaw|WkrKgW) zf44&3rX0B@FA^=}n3**6K2mvIml7(4`EZ;*-9&~N`c5sf-_E{x+TiM!@Y%2G2G^(T zZgmEO7YvPXPs$W?i|j&9nq4+g{p?)HZU_N${h`FDU|@I5|IK6HNv)cmRC_KbsD6Jt zQ{M5hb+%sb@=e?imTKVm&0rj%tXk6<#7Hh<;aM*aLz?5b8-xXm)j##-SGH^2B1Wvw zIEbMitgY6FV+EnhigF7-BM`)D6RVV%Ge@D~$hW+yhMk4u(i9I|Z;ZXv~id4)!t>iaGN(A}o zhsO)QM1!~_dI$%-5quz{TU*5-_)9&^*ibJccRHSy_aH43<^@Qv+47Z`0QiJ!s`ccM z(_s`69zNlMn|9EAtry{E4t3nc{$Wzse--=v-Q!@VjHgLIz2QCC;|~81`|_aW`+USZqt-917fer=YtR?Uu?# zHFaAwzW90KITs3E7+o>A2^lbtzIjA;`aSlr?E^ctzS@scJQU(8%t-T$)T6(0Jar-g zaSoA!(8pTnM`IZJ1E}tC<01({L&XRam)_O~c7B^wTVEHuHOIyZefh77ep~Q#3i{q~ zoUahjOjR-fKoW9|Mt8Iccs@ja+j-bEX@>c+9>e2AcqQ>FtF=S!KZw4N_0E^$iv0`0 zM!hi6C>iea(|8D|83IO2TvU9OsGr3pKCL1U6o-5V=DCixXO`1eHnR*H3MX0Sz0{Q**omW|4&^B&ym% z0~33!pq}XQZ?yKE@s4p1l@3at{ap}`(&*6d-#Qtfg%z60bSXXWqvm~1 zZ}8!X<&d^V5mnrWiYAy65)K{TN>Rl`BAybJKhVd0)rg3Wy~+@`pJs)9(o;@iAIpWz zY_0=SifFYhCyk5l;;VKtg_DyY1frlf*1_`zobxZ95RS>eiYfRyZNT|MPpRnaMtSKRC2`TWgR`cPTiNfjpOg>mUqkvYVi^7x}< z1CQWZ)dqo}TV@)s8@iQQ@K&euxcsdJB#D>IHlR0G&9gOOTQ(s+4jcm(#D=CV);UZN z5WN}lE8pV+a5C{3W0slCzHc=Lkv}~$G9~Ya>Vfoa=>}4C(oO9^0*>=rc_GOSZoNNQ zh6f8EV_AF3vM-LQ<>#`{77W-G8F)Vt6vm)02kwfu8f$HP1%4OH~PdT*6p_n7nK0pUW4Y z&Ia~QX9coT!cxiq%dBR90m1T?7p8gAD!mj31d9oN`r~9~kfR1aR025EPmRNtW6pB6 z^>ZK~`T!JTPDx{C9n^Dmj?)KPPbjJ%I~Wug^1&FBZANd)lABG9X#9fMyA$>H|NUN> z3y%ja3+z`LJA96*D29X2&hP^mMDycPwityD*D_O~wXPX9ihXXtVFwo6svLP}@C0)! z)0fGMf1;Z9ElX!;R2%vxDgDUp+g6xInM_1j#4xrkfe&akjz#uB}^mb~|UklBOwA>2eWDS_PX(tIqg zg(b8Z`G{D-U;?>>7#>~Vpx~b$7H9}lLaSie9#9cc@`uoBry+n4Cz%j5@sl7T`|J&G z$})!SpW?7N{Zl zx&i#POgD1qf{ApM$FSffH zwc=J&QSH|1mQ!d%mn?vWsTX{$_^PV_kt1+n_O=OCq7g36#|iO3$FQR{t?%RDu3>y{ zYFdCDh)=_C(P5(hU=q|FrbZKS^loa`V}cRF1tNz5bV#d@YiUC*&RPlr|Ie!PAAr`r z4xD2vu(h={QL+dbL;;qB5P_m=821AF5*jgRT@r*i$45;wx7JLG3HFg7AnZVj?izr;q%RC|+VF0nPIE^p$q_r4GRzTv z*0l2c(4O5}&>g(sMSGk~04y~1zaJ`gw6&I!Ur`1ghBw3i*i-@_WsNk z9RT3+W?#T($XiR(Rt89zF0#l?=pqXA^L}VTMU@Z}P#o`lk~(P=3(ztk9BPpmBCJh7 zB$&PuPvFp*w@2umVpEI=)s*g359`_t7z{?Pr&0;8Y*1FOtv%A-6`&#CNl~SF__U(Q zt-5bJA;GgQGE|?5vVJkVCgD?f!)}kNLQ{ZfSMZv9SY7veLq=C;>{jbRtw#mQrf9Wx zf(I60PG^1?K;O9ke3l~P>s(Qi?(yNPpS(>civn@o#-qK8#~B044|dc-$_&f(I0>!j^0&ahRQ>=NL} zQN&IO;dj*Z+Cpw3sW+-hNyM^9bs63@mq85q2d%`LHS6}+Dxuw)t{{2YPd_c!OS6~@ zNxS9fWt9&plMh0_4W)fm`uzJJ;7_GISqI%#udL{SKDA~B48~mWD;um1!ZbA{>?F$C z-^$ab)2yN3seClgoY7Eo9gT)vF6x{ds^;^N_(xobx5UUmI z)-XB8w#qdG$|-Ox!HG$;`V?(?c%T4M=iKS@B!;VBT>bqv9SA<_Ul_KLH*Mh6IvQs( z!(f_1s*PGP^eR}?f!gqHHc&`~TeApIjpk=dwY-FT3-#r^9{`=U)?Q!Wh@GVsjnl`R z=h8{3$j^ox5scCm|C=LPFtU4g?fv`R++u?4wSlVHf&|q;=D=*j^&D?|Tu0!4Ry-op zDlZphr9>$ZEYWyn8S#o)QcWe9F?~E~a2tNmmMZg$!iCf~1K7&HOA+!c1N9@=h$&tS*i@OX59!d$MmTMi_BdPLq%B&ljcyfsh`#Oo`|F-ND*0)&nmPH}35K|U zv++4tEE7|_UHaDEFh{YC-|IQ6itYg&EC)~jq>&wQiJZKx6exyr7)YLDw=fmTXAz{p51oOfgt< z+&x-Z#D`ZhwYv^&Q?O|h4Fp&dRNvuXC4KVXNdeRwZ*gePPb;ltDsg(zv(Y6 z6Sp&X6OxEn^U~zs2Eihb(EtU4dUM?8<(Tb!gl;i7-jp`%G8%k#(<7w52N2%k1OPzu zT_r)ZXqbNChB9Mx7Xo3KY!sV5$)&0Yc{WibfD@o?O0Wd)eUBeiz=(xr>b9!~k17#@ zw6z+1!1C;Ht-lnsS)v>$2NjWs7La#TO1eWe@W*VVFqn>Fx( z%ME|ul=$4nnI*&0NYj1#Oc$ain}Z@v6O-j_eb~l)mo|Q|?&4H+rd+fc`cthiet~-J zc6(*1S(J3H`jbZ=e3a#eyvMzjpUCLiYUILOF}wU(JX9q9ydqpC*;7GdR%p4YawR;D z;H!kqZXB(>trT5;vG2Jz-$#M6f>90^;`hrZpP6LlpvpyB(e zccz1t3K%auRJ2hVz1TSa#aSw8N+h@8w*DrQzw$p&{IMJ>t^!sBa!yj5^ zfoI=2!J{tR#meERBfui<&_zqS32^=#aL@v-yCcgM2hVwqpLzILuFolZ)lsbbDh1mb z+du(@USZH|)OyrGrER`i{r?}=8b6!^WdJBpX8OaoGs|+CrQB_r+@=U|-gx3mTaMfy zdc_QSJJ|WJzG%iJ%-|qA>2o>C0+82zuhWaceR|HH^zIW+IH#43n$|C`Kru+iEwR@ob?um=O#N9VbJ6m!-l5W+#S-&9I!Gh?1A{S%8B| zEz%8cslIBp?oGEGRJ{=gP5ac0wBb~33Q~hG$Bm@d8@>ugGJHtM2F+7o&EZ3b?()?1 z&C=pie|caRRUN?*D{rHi#VHB(+WAUGM~i$%-H3p~-M5Pp(FV;}oS9^OcCPKCz~+mo zQ?46M+O3H-nKGrXLorXW9fI*r>VxVb5?}9av+}VSMU&S20uz_wWmQmSd)JG#1+ZKc zK1+QafCoY&v3ED+X zw%<)DAbxrkkHdiMs$(kX7FikKi0(@+9C^~Dliw?uV zr6ER_@ZB4-Wkn^q7*0xdVj4YV%z2?)n&1-D($e9~r=K}kD$Q!XpUXRRa!iR(K7`{> zJg04paa>uvT3Ofpf3WhGvnvu9t1#``M?DusW*HC!27Ofso)QNqcD;r0C8$v{j>8l| z+)a`DB4m`lk(@f@fMaFZJP&vc+ukhBfwZPYqNL3vYVK6icWJ}g!BBO$Y6g>DB>PNW zMdg)Vu%fKcWEU<~fi~Gy<)k9*6$xvA5*4p8V7Pq8;PkT6LFM;4LwaZx914`zbrK0b zNkJJL;4j{pR@iz+*jSO+!-*J|j)TUsWl*HTRI(Hpy7j8JYR}asU2`kaHZ1QP*ji%%5PDvtYi`SWxG zG3hJSU~2{Pv4Kqekt@}RQ#(MSb1^IjzkRlk+@ zF}+Xy<1m=juFMJVH=YLmSD*i1|JKRPNFUxTrj@J|=4dJYFFkJj^ep8vIqGdh%dT?K!R2l$yek;y;>Jh?J z@aIuicB2z64NRYlH`i7Mb3_VH+GK=|&>}2c=Co%EMoG}uC;c}?Nd6UOkR}r>1wy=p zORo8y?8b+Kf0scapZp5N5w%ab1++d_xnQz|w?ZgVH5I^|NewFvUd&+wKtiQIk|O5d zHUQRKpjVn$!4#u6A;323wy*0sU=RzI`{{=to5e<%6Ajib$6-Ew$`W_xT4?Op2<}{ zBHy32w*4kX;;C@r!%Cu=Ru*T%=X!*XW8RLSrp>oWQva%QA)&)NvTOK487-2}i=7kO zYwZO={t}Ax-`Br;^Q9Ag5mP(yc#ag81@`)s9wFIFkgc8uIVTV-0oUxv z3d~ddkbMP+C)+Lb&UwhbwwxnW_dhcb%rInuK?*?O(e%;*R8rhc2%VRBcr5uMZq7U) zFd~%?tBqC*Qfdg6DEUDgH2cH;z2?-Vq2c^;`MJbV9v6W}124lWzqO?PQh2o;o zLk0RGnT9@&=slOF#0N_r4>~Cev1@vq% z&Ho_ld>hM|a9>@{k4PRh$l;CfSR$a`SKg^bv{g6MHJkjAz*#%*f@PeXZu>Bp3hlfs z%HeW)uySV}!BPqZ=FfJ&cw{#~sK-j)ovNF>Ot@pQZn$)q2U^1husGo>d7qRZ{Ze+E zvf}V0K#Pn!FkRs-9Kt>8@GVt&c1T_hgoTu$9g0(c{T|;k8?+1aune}un1*3q+0>eC zZz}B+gejx6WJyV1?(1t!wK6Ytx&eW9lZ3YS7!0VtoLz?m>l3h~dD>FdX{gwVZ8obh zQ^|x0OZgW<{$#&oT^>HJ+M*Y#6)o*DBCSOJic9zIoj$q!YO+4NeBjYffKH9bpEyG6 zvxtxS<#Sk{Wadj?*K`t*E%NS+N zp=Q8CB1|I+bF-fL8PLu+Nf?AJf`%mVs!apCXZb}h>HbhJ0HESHKHh>QV$zRbSy|~| zdj$phbVFNGDqx4zJl_@R(rlTXt^3t7xeb&Gv4iM!hj>PZgQ5ID1I*CWH447kZ=H#v zQS9$jPsvlD@^5UrV!>l0X}K>$M?zPfLZi$Lf;_?jh0+($Em#*>0A%@@fuibz#qKDX zdnq>oZ;qHaL>^GIMJP15OhA{1un2HyCAr@F<-O3%o00%XhvIZ>4xd!M+7#kO*W*xC zNH;iu%*+Ydg}h)VdzAnomfPLL){AQNIlW7#u$LEwGc^Pxp2AUclfLVrw66HLwkd$` zpw|&F@_3T3f1Xp^L@zb(EArRh^PlgKsTo(Ao2B1<C9y8Es z8?$C2mr_V($ww)pG|=yaiEUDJIYp(FtBkYBidLce8nTwPFZi(Dg=NY@JI_u;dOJfm zHRh;<)G(926%8isF5VgQ&+oBD}E(ZnrznDFwC2p|S)8ZB7OzETO^(UpcJ4Xnk{d}D%R zbY!j>Ey0$k_dau<0My{G!NnWB{gK2Q$qKf(g+{*tIN(Hc^Mh8>~EWn6lNqYe*BByfa_D=K-Rv$|sD-j6){ppd;F1K#LW1#&mjq zN&zTh0|e1lW9ZDyC~>i+^F?~-AZ3(zrZHu&>xEe|n6)uGsoqCZM>5$!3$-JXHZQaz z7IR7^XG2POJzdYO#O91?%)?t~p;7~$_Drv(M?yT@q0jdrgEv_8d( zq)1&Cyjbj+pWdW7@3Q&4c?x(VDVe_@SBK;PmLrj0MDL8(52Lz_AzIaAaQD@bXV&03 zb@>z^VM{^(U^Pw6@+@G$BKcuVur);jV=`MUjKo0=pL~3y>2~om&TqzJ^_;fGNB?l- z6EQZ~SLe(R zSPL{qu!=WCgK}~2Ro71308wPWh;`Yst~SkrTLl+~MZu8?K{BLfHnogjXD}#kueGBv zh`Btdkx?j-NvHoRRR8yk`d{%H6DJw{aw`G?M`0?`v3jqAq)HEZpP+_48)3Kwb<_a! zK{?+fF(pRwez8m#;Qk$NuAZC)8|ca~z+i0&)gY0}R|@7hAyGb>WO}uX33JH@Ak7L6 zCXx^btSJ&WTpH9wkVgvf07g0qMuDLbyp-phN(P`lK9s+&J)(~qT8>QD@E}Pbl`D7^K(we=npsWki4O0 zo=>;b)>5Tg$?DJ5P0^0Hw6FFX{@7o%^Nz$Qa@#M5I#kb-Gcnf7&AoV^DEnliLh-YK z8k`H9&Agx+TA{v=;?7T%CHdk#xgy<;s!3D-Qo%XmJ))hTKE0m(d%bHss;lwn-tmJ* z-WONo%bmaIQBLL`vhu2!TS#Wxg>}2>SHY$qMowqxy5Y)3X76fl=grhy~Xu zmb{MdEobbC){^Ui)_>dgUq*pP`zW1tSG#OvDl@H@YnEV!%S@hh!T|UF@@a zT(0=*3H49wapZ)4JMVWEhF3I33fu8UaHZFkucD@)X*I1y-B=9uAsv8L6GS4cEdDEy zHXajMeU1F0S}T{#1#MKY)RkdbX(uM?=%7$3i&m+nITcuH&|aE@=r`v)?Nx3+yZ z>T73bYX;F4u55fMFfc|(w=0})0qtg7_W?elpm?#Vk7%Uy5Pwd_zC+PKDb)S8l4FRotjG8FSL z=~-I8eN`cO8h{L+MH!o1zqy(x{=7(T=&qyItn0J*%$B&wlA*j}8sEQ)vM3~xaHB+y zzy1Svo>?AQc!-goBf+&(ltH99OPoUSgwoS)aGbPWmDR5G{V(JkLgdL=xp$4#=kFTv zf1-)+-bcirl0QMVT>f;>-*`VXf{w+h=>P5hz%BbLmk%UVlT=6?HAz5%>> zdx0{@<#PB5JJL%e?d@`W{x+5D>PdMIC@x7NHFP2Ey3urz^z3Ku;g|> z+kEqnjN1O~3`!+hPM8@VMPvox60GdpWnN|CUe|76;&s;BwipkA9m-Gf7Q){gs{~V= zm^;W!<@_if=zgix-WG6`v=573Ha`7K)HoU187zGB4y%zQ#8-MmPw}eIY(`g=_0M@b zA8Ix82)nU7$hX%`OeSH5H}f~k*pge7nf^!sMvRVGeVh*X(%)CaNWN$9&)5dN!S!fK z%>QgT#<_y4|0iLDvlLqC7;n5SuhE_@(m@eddvfW0^gDY9-!#0dNW5I_JNLy;ej7v| zxUJ#qgDD6NUXsV#oXUi8aA7FY)wE0JiZcFw?MBCBfPAK{$2h^`jQv zVOi2m-EAA)IbmO~x9`!lEcR#ox4jtO=;Gs35M>vREpg{d z9{pVy^Q4~}>07wi>S&hGo`wD((a+y&&}=kcIpy}0TRz7-)?(huG$cHU(|m~ZoBs!w zSRvT}#3}V}StWd-O>b*R?x?_2Iy2Uu=;fvDTH#+V( zS%IbhY3_q63_Kwq&Puf$DLbOgFcLO+U4?4E{9e>*l_}HJB zU9f3MS!Hbe+>6Z`05ohF{e+$TRPlD3s7mRLlBqYGs?XY=mE*cYK&9`{*RW z$1zwhwYFUJrTI(azj#Cs|4!K`(6$k?M$U=v#Gh%>tu7}%?o;=ql-HK9tC!%}_3d5# z`_IztEThv?!|@Zt(o6+(Gwmh>TUmKAO&+D6yfRLPqZt%sKiC1z{ogC(IKtNQ$H9r- zDw7I-es#~ZJuB^zHevbb1ZJ0Xu|8&xWBOv>_{)^IaZ7-n>=A2O)oJ6ZYf5y5bQk{? zWLw?MLF*Qs2scLqdVp^SYxnbgE4)~@8Io`4sb6M}l>PWX{W+%=To%;LAXLY_mFUC4 zuNGkk*c3!iJ_%;9CJyw_6(5CqAIs)!>GU* zBS`YAm6}t(vscYx<33c<=v%u61Sv%@evGDpu^0qmeA7=05l6 z&5Hya94mt&Dnf_IR zLDL#9%GmHXsDn&4QL+(g6!}9V%U>KYAFu2u-1s+!dRL*Z#CM=gEAG+)w=iNqB56sJ z=473-tpVX0YH4;{

U7*E-C&KXLaW;_}!-z8H|)Mu3|-oy)#O+zjh8V5YnX*Xq&T zts6_90Bv1~8eG1n7dO6Ge=p4^WcoK*wjMiG=Zj=6{-nj3wBE1c-qZdPRYX0?iW>{F zvc?D-5w3Kl<@sRJhy|goF>wp32-YOJ$uWn(XV*6hK+QAP;u^`Urw(bQ{Ai6{UN+5`p){J zL97vlP`I@gJSJ}cpvX==J)H`blnUu9S9|BAztyd*Le{@T7V3OC8=bV7J!6>SZ@fP} zL&Ki*(@Bav-H!$7ClXW_Ds%TIr0KM$3a%CoT8{I0@-u)D6jH|!sE}%JXy2|=4`yGa zqhh0zZ25;l*LHG+aM^Vl7|$4?{a8?~@w@v=A%=>B=fGo=@24isUw)wH{(4y2GBR7O z*RMAX{C~9i{~MFtvfg&`({dLk8W%BZGrSa@AWowO zM-lNLRUg=SHKIr`=Di*|T^s>Pee`cR5FlSx^CPdO9SQ`$>ZUT!K!bd)&>s3w#M2K& zVco!NIUe^gf)u=RBxH;Wz-f|pMA*heFc>#c;_Vt<2Baiv)aJF%CFxbsOK!C=g)*b` z^S>>9CB>Nml0(nt+?tADFhc-rq6*Kwd?@hb(Gxx&afyD!JbL-ilLZY6Aupsu${;Mw z!GhVIp>f!xb$FuGOS{@YGxSNY~ zql~X+jBLhJ(i#W#4nuXep)Pvr}nB%$6yAk~=hcW#5hw)f%`cnf`gx5Hhi?gKttW zU8~)U<%agD=W*(z`=Y8>YtY)l-EcU+`FzTcTStza^pPW7imQ#Dh~xmDhcv}wcIUni zo@inda`7oP$nXCG>duVT;SU&8R79`Hrsvc}Jd*cro}N9!=Y*b=*_}9Of(iF{9`&E| z`pm<^@VUHM<~aSni`qf8dfQZdHjXQZc(>V2wx^O3kWf0&iEvS|s-M#8%G0XGZ>V*R zF`LTAQ97}a@VgvoPmz%S{?|*o(j)D(*vU=Hqaru?%Le1kdMxkohB- z^xvh5QVYJ^QHE+?e0NI@GlUtkS$i3?x0JlnUUIuIZ(Qhyx3sLi%wMR-=^Vc0GaNA! zphT)(T;7e!hQ7IY^zkM3z`zm?CixADWJp5>a8pg6vgzuuo2Cte=zVGC8yfk5jd+}W~Ym>N)uiNd|iqp z!363E`%jah$FDefZ&|jbLqG@;#x6P&XA-sC1ZA{nUCG+aO>v!-+T;{<08jigsUpIO(RHpjPM=-0yu zKo=VrvP3%_E~xdC;M})mEN{oCWR4R1<4JUV?F5&8(T8u>r5x|vYr24@Owx(qnDyOQ zRBW1H4M`ojgMg@#Tf=(cpsTcwj@X}1aYw{>aODi^IZxD2E#izP^Qr9Lg{B%xYwpIj zP8_)I@G=sBM}MS#=g`#$NK`|_`To5vy%FpcL7jZ2KFv+d zzw!%DdtN<%bm(cej?;WockJ^&Ig#-msspMJ9QuP3-PKKEUMfUJku zRx;m+r>ZC`pUo{HDdOdFETcB1T%ZoYb zNcat&l0OnRUTaedOv3sIPUMwVFGhSpDG7${(7Q6I(UX2w=FoAFPF9jXCxaD&;dFs* z(!7)I+?IPPjA;6_e2;lXUU&97oJC0FLqh!x4Cey%_~y*Nx;u2k5-tue%=TYP0$R`X z!LFrnV#YC01))fN7&;fh(9S`hY!6lh4aXz?nK#rcsGUz7b%T}8S{ptJS)kH82vu$? z!$}@U4E22twL(H5%g91ymiEB_Z@f28hh;w-9R*Ag0Pp+wf0hd(jra?VPGTR&oZqR< ztU?$le0I%7*G8yjbY?>;b#mD^Ocg5EpWiF4K=CrPi3$b8l{Rd2?o6%|z%HdtX zOl(3+!O59BxyY%-;$tI?SNcUm#k_5(P0eYate8bTsMEIk7wJa7$POw4FTk!kBCn!$ zR}p*IK(9KP7F?km9lra$o;1o~rrZ#}eH8-zRgud_oce9Myio~QxuJP3W!dpE6^wEB z;M!-C055upyVQsLgZ@TsX;%=U)FtlpUCivYdIh)vIZfhGoKs%C=f>d1hZ0Ew`9JeC zxkpKBX6#q5WnW}xt%)otlDff-eMxAlTea_yAAD7lFwt>4yyD)iNeLnCN?X6Sx68J; zm#N5)AVK}*bYMO7UP*;(vI|{pKTA=lF`9*7)xQ)b-&C|_qx_dCwL~GFQK@_5VCHr8 zUS8)@k*x$t&O@r3l@e<6rTw%t>iFy#lZz+%2QX9CiJ~zRWc>uE5~LIg<30G`j_HC^ zEBpwimSW1TMX(iUHiTw$!Tt$veOn)FM*Fxrs0;h{+%{Ydn2vq6cTH>9%t=lc?9SLP zbD~LF`5~xNXpeFDu$ucf4(VH{q4yis5ZikNwT@Ncp1*i=Z@*OC?0imfLxl3M1-M0G zNb-KM@V&IRNpdF07v38FcZg$)8P;Nx6#6q)gN`;$1hw`Y>0Ucak?^P+3>_j5F(#2= z5e)q5e-#j^B?r*}l4A};$T>Fltn^OsT&H9g>hbJ$_EN zsZo5Q7MHnrrlrAn9r9&JhUo3uw^s-68QR9{X5jd!eli&F3eUUAy zN4uW{{<9+r1EEvtE=89X{_NFyks1H=x0uEouTRu%QQ}Qq%;1V^l>uMrN#Y+v{Iq6? zY%?FSGT8@H6hfXn1)3O|z?`V^6&~pl4$}xa7q26@Z|d7ik>?>hj_^fc)B7YR|FqOX zY}_BDFdB?Uzt*4MJ_~vWd?`NAcA0x#jL_wun(kVetnm>}7pD!jGqIQ6Btz|)Tz(%k zJ}w}>tNu~PGWKektG51syWn4`Ddp77pNbcWNOezp+_Z;=#CGo$tvr4unE59VZG2_({^!5?2lQg zl$%0k@UM!lMpHDl&W*{>4S&8qdj6|YGW$mp8m+?1@1b3a6Gq)Y%d_iM7!^$LJ|T%T z6y)vxt$rX!&97cUk!F+pZbAR4WJr7=<}>K}(MZEd#9Fllp@fYr(u zgi?_%`tSimaFPKN7mzKO09B$stF(br%;F&wBK?%75ZdYQF*}dMct$7;|29nskd2n4 z>0pyFwW1v=WLAX~4(~9)de>l#0QOa4+Do8Rt9oGH3#E(&S%DT9C{xXC5g|r;s!XM- zJal?*U!$N&!F8L=fPT=?vEg%`AcnM$8=dx`c60qhqmV~jkA}7Br-g&c-@o2VQ5pk> zLIv}aq>cjLhy5_GW4bEg5wqUhO`_B{zi}I_gvebbUhm+`4g@XX@3x3Apw9B(liXk4 zZ&{khiYuPsS@SmCbL9lf3%f2qeis(*HG>*heBJ>`*}B_A(mI=x{#4i*%9iIJxn+{1+En zIISUua99Z#8lGXXUklis8~R%LCdO8uHiOIo^R=HQ53)MP=W_12n!95iD%m$DZW5Ee z!I*z*f^BB7MYiGJMV|4TQ09rUD|S?WvfxNQluVAAN%s>bJwbCb=IPvJ`T1 z69yR3p@g@d{d3vGa-Zj+GW;!Za?bD(l4-i*?&lnzlV3e^?7s5MK97tfH7RlJ)W#$; zuEc8tZ)AdXwB*>d2)C&WCxpHf(67Bknjz=ziQ2dpw?+8cxOogyb`&)evI3e3=Ze0r z6kNoqd^k;B2ZlUQK9BXQw&?U{a*r9J(@#ivPyhbS;i+(^w|-kv!;hCfKGXSfirIj~*$_2BRBMy2gmnAl=d+(y4TghK-i)R7xpDx`#TYVQU6^yWCDpadQ%L5PjBQV_kvTllQoUC+AzvtR*I<3@>eB4t4#7 zEBSc ztv3w{eScZ0ynef2VGEf3HCER8(EdOc`HytZ38 zjpvI{6V1_V1RCxIW>tS-;)Rah7S5LvV8H(-gJ-vzJc6`pnNSS%v5`VJmmDwmTL3Nh z(y4(*8g1DRRNBE7w#L-g7*2HQ5K)U<&?iG#GnES?F4FIHQPYemEiJ7HjifB(#dv4p z?G;Q$tCRqV=N5XoghizUFn1;m7<=SWNdscw;rySb20OJ$m(O{Ol^WpoEy9-CvQ;}g zZQ%a;^{SacMx~M_=sAz?vJjvo(zdf0^SP9PPq@Z0rx;UPGI5@iwO2VIiO9{h(*a!aSAVMl6)@{BzGG1Nk?MujC2?Nh2MK3oW=7tBe$n(t@-#KQTp z#RB~gXrN4t3MNLO_$#Q=>#CtrY)p1nL*fOZG}fP1 zXLicE(GhSuG}ziwJRsf~4R9@-DZQ3W>V9z-OpT8%SM^T2i8%`?f6j2dI{rkh=|)TB zUZt1)kHx~WTWB)oyK)FEwgrt!OmQOT2oyKPD#$e@tKD_=C6ovSUeYtM`?s?H6JTv& z&U3+3rAI>y^R`I7`z)(4(mFD2h2J_#m+P^;SEcphMF|}MbJ)`2#DPK)<_fY6Hx*m! z-`puBlC^_2lYy-~4HebcB2WzK#3Ah|1(LYN>GJIH90U0*jbl@6ARX4jVs%>Kw9ts_ z#Ti4Z1CQ@vjGw-&+L5-SB0cTJpEB1&yG*PPVp7Lx2n1)2M$dPyc1xmv6d3PesQm}n z{{Oiva645&Q^6?i%h&2xg_W@8O{^&STmkD>su4iyoPeBzXWkw?Tn05SjO) zHhwrgRZ%IA*0g4h+fnQ(Qr$pH9=JawSjV0U{z@r#T;r8uKE`DJSs15K-V2|E-LO+l z2z5Y2Tl#XQDA8Azn-cv)p~(6LV*>Hy$~N|>zAV-l94eIyqkzS-iJA!m*(#I{DxMCe zg(XL5$b3zbOYxjLN$+_KASm~s{X3+BR3p_~?IyPk$j!@AB`SWgj*^V+fp)+YR8+np z^j=En49n~bhbGRGwCsbY6lSBoR5LgfIBG1;X#SEN0|dwu6O1MH^?%xg z56`npZ8k_`u#)Jh`5g1j2yreC$+%bzgO%8g77_FXOjy7cE zd{hix>J$^bt@jl?k{4o}!d72VmGDik^6$QZ{Amw24fqL>Bm~0&Mx}jR-V4UiV%TTd zn9kka9_kF6KjVUd#a#d|`-?g7JZ~Xpg2PM};Ng=CX8YHH&Re9Maykyl(6#ii7)nB! zx(`$Eho*E4g2ypB~M9lt6d z05`)hd2(IxaWMTKdG=P0o-le0#~MRbM~@6Mt`JY=^jRs3(n}WZv`b=h9+4D0?ffw+ zfUYJm%}9eUmeDbWa}Tf`KI(H|Lx07?>)1$e=XM2 z@%#zn1@7^82>oc-AyJ!5_(u%#=z5N;j`P>k&%kVo|CHk{$E9a&qnS(hv>H?a?P!}A z;;Uqm*%^s-Pg-!g?r)Ccztx7}yc|%I9O;zPi&_#y#fuWL8UoV$7^TJ4U z(vq{eI{8N5lWJbAIryE*S{aqJNBGD|{>nM&1EhobF-ImD9BQQs-k;lJ0->kBI_TcYhWWsROnmswh5e&**Jb4T34aDD~lq!Xf;|`wgeY6fY2Ha=wBnKR_?Z}0B^OS;VCJ`u6jR=|xps`Ro~*`gpd#M~fF z`*8$3KK?71f5gnf=m~JgaI}llw2QPutMvim+?|z028WM6UMQ3tP;X$4`G@~U-8(ic3-c~<=14?@RmUIud4$+bUqZa-%UIIx6j z7cK;IDe$ji*U}jT#Le(@#oxT@zX7|kzy+4e1X141iw~J;99s@{+m~>*o|<94S^Sr> z1|vOPu`agTz7!1`*bz=dsoE-`5zeuS4!=5W4u#nKJ=f6!&PfM4j)$EKqqkCdeYvdp~~N4NjIMaraT2)G}uoDH$viNqJ;Vgy|OwoX+7bttjq&STtzj z2-Xs+B>3+oCl&21OG1D9^{-LG!VAio1tO9ts@@wxdc;L^wdo>Iy66Q^t6F<`B z_HIK|IB2)$jOF@Rv3?iT0m1XJ$bZQ zT#{HD`+a-UoKp-rHzNQ2ng3mE%&(*^3*AcPK2*p>qPX8J=X4m@xvI^jw|BpaEm8X< zUEWAiSEVGcjbHmr>Yb2J{nN(%!`xNT;plNAPF|~}@RMSjD&v@VK|?gCtu<9GdDkc3 zm)e^QgK%URL?NLfrrU7(rv2Rl59Vm!WNEYnRC+2R%O18~)vc@@-Zca%>OCjT3}5eG zYB3Ux1yO7AO)*s1RBJv{*AgDWDu@@zOeiDsJ+Ec~j2xfvaM-H3OVKl<&%7j(9AHlO z-3#=ist$Kc9ML%c$Ss`xeAKlXpBCXLeG|l29-Oe(>xvBJ_>qHE!+t4Jdt{> z4A0mSA(<3WV|3RR7Cx)OO2H^MwDR0v$9wD1R|t43I!*?Floi0*WqBwVC5{!u!y5mFuLsL*_3oH-+>I3sRN=KTFC<_;vG}UPN4lV9Dbd zZrF#a;(WMlV9$}l$SI$9^$()PASyY@*PpCp>k7b9Tep`F2u!d3>3Fa*D6{eWVhEJ2M&XVvwQH*Ge zt)1gynmsB+n@IWA&VIJ=0Twq=so!9iaGrb143l-Y`$!PhVb4*lscqWPIjO2zEW&g* zUn%FIq<1jSc!Qnvbqpx0bZrCuDBX6Ft-P;;-x<-eZ2xS2u=JAnUvX-F2Z)}6z~Cqi z=QBT$K6k{~c8;$2y|se4V3Gn%nK)u1eJDAP?1aBBS^bhyp~r^p;|SS@Xb2`5J43vU zS|aKwZ4Re6_TvtR>gaVCmk6R%zY(EPkiMD1AZ({JX`aKQS49cF7PQVNf!%Eo;Tcu+-;rht{9+T=PgReek) zE{O8TIdGMW_UcqT5TEO;u{P%$Rr^o_+^Sqhz}j?VNM!|HZp_Bjmr>1KgR))!Q*yg{Z|6uua0*NE%opQw7MsI)@|S$U;Rl79YPEf`g>(HGE1-+Ijg< zl1`jP@V?hfc<`lQZi2tKFpg&r9~mTu_s~@nb%z^A%DF~6-{PL@;@nT-)!+=Z_4!R8 zdOPfsd{glA!S+{Dfp4>rxToX29qgr_#(fK-NW1@jL^13pZQ$f+{?g*CSoGR&+QttZ zy{$S+!Of8$P#H@vsd#t3;7KeIcQ-Cts-C^RUAT5 zTy%t$AQec-_me!rel0_RUM>R`%c!KCXtHf97LKdTBN6+Ylql&5SegEfQOuw`Wsi2$qL$2CZbkxtwYqH~)#kIo%zqySLsU(*7HW+1%PsK1>r1_=@ldfNt zHk=TR|)0lBGtvlUrFaP{z7(2(I2+a4{hE^JlaD%Su|xMrJ0if*hlh4?x3;M_+I zzP7scuHbc*Q`b8yramdfHfP{OsI+xF=nEqP9PxM&bkVaUSnYgI9KS zhoPlXCG8x{Jud50!q5uV1tJ@_ZV?gOcn3*wUU0)#mEFT;A2w#gkVGG|@DuU|G~g`@ zA0$t1@HZcp4)2dfN|$ZJ3BZh4(}BqoXZk{KwzBED97bNgtUvZp_MRzfdXgUXZ-dcu zzDCXveo@Qx;l8tXsBNY|NRm$GUriycHv0J4#hbB!&(j*5XOizbou7+fV|HO3oAv;f zA?APO{-bu%46{@X6U&($(0`-%#o5kqvHIhnK{Yni2{EoC{x?=bq{hA?T!HMnioTKo zQAw}^JKuec^Si}4$eVfOQo4rE(*!B|G7OCH5DdT*=8Qe6HOFkVE6d3Fvur-yR5-c* zc4|5}ed!Dvp%2fE>o0}KL+s!$8R9gRnZL4$nxp0Fytv7Q8$qWBRk+dq1}Xe|&$wGA zpvn}bZ0vQVr}nhVT-7-`K1x|GnMo_2ynYzy?#qX~{6Je2Rg|X|=tF6)Mqe2-!uiL9 zIv(v*qoVJ`{9w;^?M~A@-WU;=sh%65>5nVsn5fGD*~Ej4A4wWoJ&x@c@~7`n3)Ti) z{ZJ+6xwRj^4HvO8{t3FBduc7thv=_{dwasVlpr$++GL{PBb<}5ykY~n{f!FDARUS` zx8xzK>wV(;=4fS1So7wix0a~$(f01Ekm-qHK*xX%q?)74J@AjkA~o^nsln1ht|3fX z93IFua%J5^QLjCo>J--5HhE_3%1q(`vTwV;fNRT5IW=G1`)EOI+Hy_M=f(mbxKhU2 z$$L+JdJOjz6NX`#5aQhb`5|lh4v|v8b4kb`dg}*epR67fR_il<7?}T(J}2-06Zf~} zx`wAr>|fc>f5A#1$pT7zn>Sn}QQFBEOR0Gk9JBsTGA~?W{^Uji)ZdK2b2t8Y zYFir*fLS%0#ke@eT*yp3h6&0(&cLXasvb)(v5J}RYz^$57kO?@6jKmsBY{9lBE=boig8l40wmV zY_CO@%UZk%t*>P3m68qhIF)+f@mXYXAK5NW@J}OGkIL3+3W?K%e6bD3N$Jtptdn=< zF`7hwqc!dwZ9WdcX2} z^9VOTZ%s)7VnHe?Dxul)3*Tn(ud9A!`>IC;g7E9+vxJb0jqCgEetaP}H+dFt))aG6 z6F+8)Me=L|KaGXSz~U4RQPDlg5)+>bWmC(+vneri!C={*uz4SJz^+>RrAy3ug9Cmq{7-tfcrP(FO_&%Nx3z=Z zw}|&KhkEzj1%!w?gbBRZUlL_}LvkdjIl6fQw_R%%Q z9v?)B5(=1iq;EJ4*l;#HC2{3cS3ml<+!xG#P#TEIS!Ad^>TGR`Vmz!Xaq0eXCAmuA50(BuVvbF+H(eNl288OCC%MZOE<73_pc> zpMG?nW;OXFqZx({Ti}0xez*Gicam3M+q;Hml%nuXJYV+FdhVJl0KPwSY|0+(sdPM( za!?xE>ZeHY_kqdgmC7$u*p~g^;&Ud(h3W`afP~EB=WA9_hf;s8dJ+d6hWIbE-PTCo z0w|XVgW|b`xR~egYu2tyI9sWwqDg$>CDf0e%9u zP%B*xfl39TklYba7^ayprX;_NGVX{EK4Ig}?P=mhNtY1dSfLD-W+|W1d*M#euC!H+ zu>)89FLPfy(oFF;)9#zVthNBJQlj`+DQ7?PTFv(R7%6S*g+s$k507%kF$oXAlXMx+ zZ!&2M1qTN?uhK_q!wzc9SQ53)#2+n^|R|42S;r!r~6r&x=dwAm??KV8+|$%L3+ z1WR#ZsaerkN%8@JXAJm^n&3>cAD~S!7$2U26(752O2Tlij}*#tOo{7*fNFCnJPYiCmVP%o@-%p*CFcve$CbS7mlMs+NsHdce2}?AIi{fIDXOjqqMXM66E7;AJx-a#rcIe(-Q zjSNS;7fI?lbM?}5>ePK1n*ly1rwTJJRc!5YzOW084*~=xj3XP~Mf$2f+~kqcY+50R z2i{hR$82!wN1>Gj5^Xxe%KwZ|BmpN?QplQ^xK^!p&heKAO0WUON;-aw_)aSYhb8Ka zi~YpG2js@7Bcd`fkXH0$RY1bt*>8IG?$f>rf5faXq}{fMmE>hmPv3G z8q&`?Bd=j1$od!aEm*zR5vudFy;~yO6^8>`?NK<42P>ByM{H$pO7$~&Q%gIl&eE>l zDM(#JI~hAGu)gs-XpVc(5o2DIJj;<;8;d@7br?rNxRM4IYj%>tc64*JCYd-P;v-=k$O_u^c=_Ge#BhkEN$5KgH?rke1*!c zmC-D}K~kYC$|y}?ASQ-z!Ef7&dw^l|Qsms?|k>glfRVy*M zBsp-x3|z8=;4gZIe%q6yAHO_6(RB#@N&eL+7v!gK_CPbU>#ZX{a%_h?mRe(T8YD*u zEgejWyO71s)>5SYZVbd2`~!9B!xUeh`-}++RSz3?L^l+m;~#3EgU zc)>&Jv97g|pEtyH@zqgUREca5+uCoC(DdYZ6Q0xaRB6p1T#{mAqX&Qr5Q1;$7(6|- z4TSmUHqayt3H>Ui=&}ZOrD*CCmJ8uitMo?k^Y{K zvt_DAq_xsD6@{2S9r0?OuYx)j?0$RN!CCy0QqHr=AFDk?uUVJEaGY{-1t^D=Bs3;4 z!#hwNT-p=Z6D^|C&r=a{_U?3G>(*YB-~O(G^WwpCN*&M4IVoCL=hqSJbN^n@PyJvvBn+ zlz?)Y2xKK#JRbI7zbo>8;(`AtWbgi5)?B7Mms3N*Rhz>e4O}RdqDOh`V@nsu5j_k& zMzMDlBm^F-K?xiBh6V7}`)-md^R}(xSxwrAm_(xV-Ivt>JYOwdU}J~VIQ_$rI!rT$ zmTw_7L_D0nvkH)CPGtb;pf#4@oWWuk+|#BUy9-&)-O^2y9hdUmhMq5rr%L=#ouyZ+{jkjbsd&}ptz-S46##g6*wmC z9NXGcD?3kg0RwtYPSlw)B{n@9@~DK&5c0j+F$kpI{ix7#p?*$5`0pN^`hc3 z&Ey&BvJG$ob6;O7t!Mt#SSb8TUnOoPX>h4&hva@`|U z1*wV?-Fiw1i03geWWb@}ct>z{wtYm6=Q$5rZT*R=%A{M`J;%-G{g1CPP_g7DY@bJR z@M+Mo)EJz4_Bu1$+3DvCouO1`x0qHgpG6@6EbijxKi9l2g>lVQrCXKL4OD4req;Ks8nz1-?$`Q`jBed1V&8tbWs8Fgbs zXHg!pOuQ-kZ+f|>X4o|P&#s7;Bx9OoLZS3^qzxhKN|6lqDZdc5z*;B8q0?63WQ?*1Sjc$okBg5uBp zGnZul{L{KMSu60AUHfolgSvn7wRTFjSM49S+7-$DCzarcuUPQU4mTQXxAtFKA+lTO zYj(E36}ME|U&nvkA|HM0kBQZ)^n`Ie8`zRnoN=j`k30=%N*Q;|#PJdcyMQw$RN4Ts zQK#=jl-1!RAhS2DsN5C|&Z8G0HY@ue^X5LT}h^dvNhSA>ek9l?wI}!8y^tbtZhi-s+g9@?C3vS$Yd77zuj`LJ1O;(98UUf`9 z(ig#nDI(aoqzj$PwJM3kf#_KJ2U0c z*vj#J$K5C#+H*_XhId3M4s6{nY#)?)$3CAeBzYSt_QVAfPrrPua(KBkG=ULH5DPye zI~3D!RR?M9p2VaO7?)Av;8}>^;(mkyB~DYyUq+Wq-sO!?2qiuURE_d}e33v)GmzdN zwK08h_to+?IQgH6z`k#GE62eOMqt^LKwOucTv(;r9fx7iJM1tk%Kxe#|Es`vyL|Nx zcMjh(r7^C!(&B@;`4EBWFc2;Wz>#g@5RFDheB?Muo=WFX<4At?J(u;<*#^niUX__> zRcscJ4cVm4&|Kcxfqdg@_lXtEyEsaaKSw?Adq%Sfx zyms>VlhAOSRE_9JV;}h#)RUEPe9PzguDX6f7alxe9cJz9|L z0kXb6w!}mMqJ*auk;Mi-t#+3t_gj=Y=v|n&Fb|&`?}1a35OS@XtOKC{I!9`bKp#@m zzsk?e@hY{|LGCntMw_60bk-E?QLR;q@r1N-e?iL7<7cBYJ~&XInM_CCcUks&S9QupqJxAzr(4UwI)p$4B))#T$0Z>}1bJoqj|E@OmX2iIWhhI5 z9^2{`_Qk{Ti^6HMF@KjUf!$psg>c8@yIb4vum@_Z~ zWb6iokO2T>vj0*ZY&V%59>Py#e>&ZbAOgAWgGyz4((egT%+rRK7b$lXw>ps1wPRI< ze^Iy0z~H_Re_L7awGS}n>dA={((iurD5j6sfy#R|_yIT5X8+5@_;W>nSy`BFKH3qk zU0ub0<_G0YEBhQeB!w+yoXM^*l`?AQ=x@P@PUiWXNM{R4&UnKkiB+H0TB9~rbTMH$ zb&_~ZTd4d#i6OZrxMV5y(|w@-pqyqr)WLYN!PJ{vVhs2mR*R=m-<{8S8C)@|hB!;0 z7$bhivNF?MP%Y<&i)_K-CL_|hG0nkof`J9mQjJ3Hk1-`#FeT$x)a2n7bKpYlzTd%L zq}?aWAxg(VM-S@Y1dc4q?y<{HDmTH4y+6I@n%7RL8kijKZ9h427r(vGB2qcrCmgif zC3&|e!~5s{CrbayY4l1|EkfN-%%0rh{Wg`pK5W(4VI2U*IPjx9@_gpr z=e)_Qj0PNaqp+R%%vir*Ns?S0RF{y{bF={AMUNV$X*wGbocG4lAUCqh;El(`@ZxsD zxmCC8)%a7!prrEe`~pj+#>w*@^mg4++sWqr+h1vKN%{xXTsuSOucUmk9Kn`UfZsS; z$FUP^s|1P0=6%03p#BTOvzSTEAIIS(=jqeHHX1-IiR~yJ9)ye_#6wIMF&?e?h<>1v zs~@8I$Hn<^9kZE84xc3zB~kv#2}zWnS%9R1(^5yK3zGyh&IkVDVTN^Yqp(pd)RIGr zyTi!vZwSmfjeTsS%*0X}nTuhNG6yyM&Swdnv#+h|8Gt`j6|MwP!->?ZKczVU!Z~`t z?pr(aMOEf}edjPWH@@wi)MT0H*wBuoq>fNId9eRgT3DPq7Mhf|hgD?$(u>uzJ|w`) zU~e#T&bE-QF~&)f`~85126k2{3QkJI#;`rF>sn;4%mVNq#*{18I&M8)oz=xmUkdoe z{`^hmgc7B|13sni-sJb3Ma;cMG&OkWLwld>!Jx*ifn)i;1a3BYel8*_BfA#qq|_^O zw%6vxWF~wHu}_Ot}#M@5u<^Mr9CJ(c4q!D|0ck$AQTXa_n%6_{85GUG?J*Q zrXy9g+|FK?{E4SY6yGMc9EVF5Ic~JPFg|f4cnMOo2wHiq;?6frOsyB~%4n$rjeHE_ zSp7Fg(n;yL9`bM}8}TdfNc@;~l;0-Z8e8X)TO1*tVhbY)00>5nr7tn$at26I&VFMe z6>7=FDMZkCxQ-l{7ihf@gH+;-#@u7KkHyec=wL!47IfN8Jji7aX2)P^_L@nWb=EH& zC$C-dRX0k}pm(gGGMe<<6$i%@t5LF{eh&~hMFU-eRzN2HgVRf6E0Mo2LD=0&f13;& zPBvu&WQ&-8;fd*r#r~`x0mwr12fua;S7^raAGO;u`6i79C`5rg8bs6;$d z{HA+mco$&qLdZ*xInk%Kr$=lz3x`Ih<}XB$!pbe#YTVQ{_K4o@x{~5jR-79zXarE1 zYD&>p^nhMCdLV8XII^}aQuS2=9d400#(8}IMfkn&a;H6H^7Jp@KmIHb%OmMe@^L(< z((~fNaBVv}qA0725w8#|x@m>%HfXQmjVT3l%A^Q6jTGR9oaXB0*h=cI1%P8$z%peb zz&+-@1cX=y9)mp#8hVMe$WkEAf^hY5zEsJ69)+SBbV%xx@rya0>SK8+gaLmKk`IS? z0hMNT-`+%W9wNO+m^2?K*rQc3tLD`Eo4QdFy`yIehor4lBx`4X+&j8oJ1BqGyu1RW zr7o&>sf7wW90sBUtu;$pLY4T0MQl+Yli8^Mjngyhv4&UFm2HyIo>n!idsT_q`zrYn z69iTh03+e*-iTNK=vKwCD};2MGD*?vD5IcBw&0S$pjBTI_8gb3DK^qHp9L~ZU&aJW zvQNVG9>>97(qk6`wvP2cS6c$#!PSqQmi`Y$OeXsFL98~`r#q$OD)JC&2fXl9Gm^Gi z5=6-kii^n?mqdW_*BzfCd$-DO(mhJIUv+sKKv&HaswDAXU%t2&au9Z}33;24IZ z<|BW}p>QBL9BjntZTxO0=$Gl2*Z%8b?GtP)dfKiyu+e2>0Flgj{l$WEH$}9Z4<8+L8@V_New?=Q_`{2$ z{mg9zV!^SZo1Pr=(EL~Iv=Mu@$WW(#3Fu_C38 z%u$T*@Yav9^a`^HFD;&-N8ranjoB0EVJ4-LOld z^#?ZXN`8HtGOuPJ>LOsTsP8nYAP7UgIjE7PZ<8t zM};bw=0n=YzX2zjucum=J1A(K0mI$sIZer3|L0p5?86IhD&92?E;1Z5y*Oq_OvkxY z_ouJVl#`(>7+xJw=w}egUu&Y+@8sb?ZEye05q58Y9@*mW&*nL!yOyDYYC3O_*_k%* ztOF}Me{ZNTR|H3fz!=|W{uQRI-wXOu-hFah&o|1W&t)ql4uA1;?J zE3N2=utEKtY(wd~8jpekGgNh!>8OYlVOO9ca|)%kxXV5fGXyehq2vn4kh9&`LsVDs z%uk7ZOzE2Au)$Tx0z@ZmkcbOr2qT`rCt9c80Bzm95HtB&_@R)91ORy80PEY`4AvMwJ@Os;$`0m3!|?CR_S?89J|^N)&n zw{6dCRmF9ad|TmVtb)`o0kbG;N21zMPzHmo3X6CkgmwU0Ng>EhV{24k%hH{i2SUjw zYgCvHAD?oIuJCw_5CRp&u6fTv?c@SOVw2dnG8G+$X9gG?f;7C(l{dAdvi_Vvs zLtTj++H8VQNYrMDc;w|gwuHX98 zVTf(%!}!LX8GcCClRMYauiXl_KER-en{c(ul?Oo<%b9|!U+6ohV7j5;!uB=+onv9C zifuCH3DKRj{9cF>WLqS8Yw0HVhjwrMOaX!t<|w7 z-2vSCF!t0j(t2tzY4B)>O6cTi<^8^6JEAb`+}Ox#Vs6o|tode+T3puDl-_H2GE-a0 zd+jQv(d{TT5Az#i`<3x&$56^APoOdvp7F>TQY%_%tXS;)+dMffUABP`y+6zde+JP= zhd*SOgK{i{sR4Cz6 zY&fm=^jYm-`Mq3%vX08Xchn?)q__AC1p(QKm2i;;67jqH+9T^!FZF)t3w*Udhe_4Q zsRZe&vTvS$ZBAb#u5{f!g<7mKZsl`@$2NVqKO6X3*?+Ewx!w4K(yPCGF@gND(E@(F z_5@@-&hKTO(YYnIq^ed#bEQx~r#dr<_m?g0174kc`FuY-s|nCOW1ty35zuskaV00= z68&jJkchLkBrPjrN6^dk_W#-Xj#;obf=rQBjm&x@TYU?v+IXu^zlYT4FKG`xRT+vu z@y@4XC$;+aNV7Fn$eY(xFGyp10oEKl1wPBiBw+GJryrn=p-bEDe`A+Z&25Hwh_sT` zA@nASSH(u}nbiE-gv&HIABl>($Pyw|+bOnh6g6!HOp2cP1XUbLJEtDSs3_hnN0d3A zwi2bTC^#hrafgc7mAk>mBxIdg-+iFyntWobmr8ubkl4QAClGrsI(JR~ysL7p?eMdP z*>!U7g=N3DumA1t*zyz7>stwX65m2NNpsCYy-aBOUYfB=wGWvU+LMMClkx*u@A|OT zI=1%`IZlrc7l#su^+z=mhi*_~xLTxYLeBW|tBbny{P{I!QiJu^)W-Xnx+?N%#P)6$ytxJ^&IO-sQcC3l_qNm%xtnv~!;ikKQnUvBi|59@)`d_w$5I zrK2k}b8veozpH&EFA*NWfad)C2a6hAx@8*Rn^R^TMDii(`7EBwJKmF=#x>as}GX_F~I5(dVLZJ#(46-7Kq{H z+be(whzgrz7yA*zLh$%w0t9R&tr0|3(hpwWx-+xy4iQlE;*C^)n@AaJ`CuoM~Z zC#GN3$~>%CQ4(<)xtc4w8s+lCY|-7R(v4&d@Fo{lH4+7jMjbH>-j66+1iXpXIS=Z7 z;W|hG=dzDV`bD#(8plQ5UP#8m?0K2d{-#L2@A_O+vH%96SCOkrt{^YWFK9{UOv&9( zkHU24C3ETVa5U%ogX#au*1hVnY0sOBlE}?wwAV)0lH+W?YE*0(>XUVt`SCCV3joFo zE8~kLaFynq>U1X;=~c2aLfwp5j3P;3nn?8smL`+2!LYoM28rlESA!?*cadQ$Hma)I69BlkT0&$9~z*7&AcI1BHZ3Xxt6V~wsGJQ9a5bV`p zeV5MFIA5%vuK#a78;d8tjbgyR{YC78rLu#3_V|S+rV1Deww)efS&>}oJvW!6(yHy~ zeR^k7Mq1{f;V5BQcl$gk6RrWfg4rc8sY(jsP(c zRiLSYQKhQ^P9In$xo+#{g*07d+YVk-E4R3&i^F1OukWPY-OGZQ_l~A}>l54qRf@?4 zgQ!8`ZoH6V5CCu@TUy|Z2$H!fR5-)wk9}~}`uCLLLFMaZJbnm{W}ntC(LZJd$IEB2 zq&-@{fHB9`cfBdM?*IjZCbqZeb*j_-y@L{Uyc1Tb_d3 z&71~|qOaNGr6MF{b&6NgR4!%-V&0MsJ~IMB?e|}c))}1CZK4*?_IDpV{i5lM*2y&S zM;N{=O0INBD^IT)x7r2~{GKB|nx3$Dm9&-1IxyQ4h*uOgcJ#^U($#$_;oi0E_F7HS zzD?|;mEfr2%*^Vk|LxKCcejyCJ->!!Fe;|T2A(|MW)>{DZ1MTwb+}IS_~j(ix{Wu# zbp8A~neaub_TSKi$wDvHBUq>NaIWVi_n}bXT5hV1$oi%$^CYUMuqVC(1YVm7Nc`4q zc$|*B!Km!b5ed^sex^?E=VS0KObpnoDg$oC5mV&b-WYdg41SRw*9-TWry=}2S41vk zNvQ*m3y?j3%N;$j(5(jmP(DU}Mo0kwid~P}XX#rJNk$@~LN(MOnWtIgW2#9d-xdIzcJ+QM&Kl53se_%XwG(B=eKH}6=#l} zN^(906IzWJGybz_|04KVF|*+2gx>JC`b8RvjX&vRZsgYV?ZKoxfub^Y5(!N22ChWR zSvA+pL$GmNDY=@HgZ~PwN^aEnT|fIwVtv&KPyJ+$DYlj+c~Mp^cgCpwP|ye8x+Nh{ zD}DW9DV*wo-*NYS^!whd*Y3W94aK|S$ti&xKW+zn1O$D`AtfE*Q^d@6Eu9~Jfkr9@ zg3Aug>^__h3>=&FHoo;cq#zE-vi#5wOiKNRr;z49eH9eHP@g1x^2l2XcPkF-{p3d< z6jEK1-1oEfN3*ahljCW=NV)#6K(VDd&$>* zrllVRXhT&0$h^(Nj|xIQ9`-%GtA0BaU0pI(NN1{1p!0 zd0@&2w)bTHcwfRy{z@>X`(|mX<}Ka!f}WirhmDN2d+}R0fPj_1csFV* zNlL}>`5%|8#g%quavkUx&y^*Fp5pWg0c0_7Ou7BII5_K!i=TGGn#uVeEyb6Qq)})!^Q+~g!r0-7M3{ZhLkT;%fNFyS=ov)bs<}u zswMkB%{%eaWC*vjd7eCILCI-68~s{p-1&Nh`nrAKA^k`3Dzc0`nB~N^q(a4$PNAs5 zEofnXCXSgL2OaIR(s&zCDj@Oz9@*&K7arB99&mMi#UKGAR+9_$mWQnPZlIb=aG(c-Wa}gQ-D_Rc^u9s5pGSU=WaZ*6$y<3I6 zn#wl(K|X19K#NtE1ySkZsy?XuhyW|bY<{Hj$RQA$IVEp2j{&7w5ovC)5G4mbKJHL9{WRpXVDLo=3 zgrAi8kD9lG#zEH~j>y?CSfZb*5gzAEGe;b?ohi??#W($}as=I*D!GheWr*)8UAYcU z6#qY>-h!*mXluB|3GUY71b24}8r-co!3w3g6?d25uEnjm6?fM{ai>6`SSilU`ObOA z%}>a)#@>6`oN=`~Z$=rDwdrLgVb*>cCxZgEri`#Ju^HMx?*ULBvFFQ`SJU_78wRVnnsI9gX%hkX}C zb@6oVcd#Sw+zG&n{!v~E%Kh{tfFm*5>N^ZE3a;Zq>5#&3mq;r1s z-99D$A-8|Q_e3J1Z2s{zrM|oA-1YwLt4zjfQw2TOZ1J#T{THKzbD}C7G2jsdcvU;c zqq%Kg6C$M;_QL}JsGtDbVMIJxPp~jmu_KlvK)Y44ax#_L z{_$VULx#>lS4PO+@85)-gVi;|1g&&)sJK8!ck{=8c5al*9Xh&74!&3sJO%zdr^AI~ zOh})=8Tr@{x7$Tm!_0juDY%Fp5yBl0+dc13BsB!8jx1X+ zDxsu=iJ+9i+0R&ZwMnG6fW{zC-J_w9r9_91ddB9GlKZwY$uiyq-hE(Z?;%aKF#1DX zXQ^OcLKgv*O=SZEzlpdCmK!8F;}b|oC4&^DNBb)bWx!Q!IEpDrACW}V(->UwiXEg% z=h#B7eS?!78c6finR`V5$;cPlB`_N_e&Vo$a|#N&PI5|ee7_C;tcA6uo)tAwaii&uGeKh1@rxs{j=*xVxd|N7i zQU+N_<23c~YI$dCR%L;ScdgS+8u$hnuAlou!1OZ{EoO2FGHvG8(vIxhB{1&ZS*&~t z$kkr(Ytuw&5LBL>@O|O8`t?(7fmI2=B!#ly(ToSr#*>i}qX{S!INrX`tTW^+=^M_2 zeuJ(N6&eGn$9>)$+ws3^NW05j#$1l4{<%+uAQNCF>^Mkm->&uL0OgL*!%F5T-u)!U z;A+C)SH^E`&aifI4@2ZIbAD8Rc&*PZA=eAWhEwy1oedfdK27>BYJmN@@I8QjLPz`;{Q*J5p95~e+8&@6^&0|(2DXl7nYu88N?Zai zySUo(FcE;JtWd zQlr6toWm@ZKA|r~cx=}Ke?y7EA&*&Owyhbuq(1z^fkskH{aZzLlE$GRRF&3FrHG|? z94fm<`#pH*pWmTJRH*&ISSbSf){#oHiftQ?CqjFWS}2oH^Q;L3ZW1Gn!Jtg9GeHV6 zIx=q82>wpR!PL%jE0FC2#5mo5x|oN-%LU zkF)E0iE;)+9?^v^`BmFK_(cv_!eSbh2?WDkanS=CKuQ+uDVXB5&hPb52{3 ziucB_c~!U`p$8RR-uuh{fAaC|&;9xXlX(U+Gtf8*X8s$8AuNiw41-{=VoEmki}d>_ z0u+Ucs~Od-5fBl+ZW|I0Aq)4R2SGN1%bw2hhAhn*O>#z>bRI0@WGt%>Ei05p?`R|o zz=i!cV>S&yHgMCF66OGD)==MRrYLFFv>nD3aW1Pce=tO3&LgBP&&OFwDo(=d_{_!I ziz{FRgOQ5&56;$olgV7$H^k9eY6558hC^Z5ePHsAL-idBEHS^z-HC8qAhN{KvDUs3a- z$W+Ur{l#-~q?3%)$fgR(9Pr2E!428N_bYZzOTx;jPQnB9>^62(+}0X%bIMXzy55j zvB?-joTk@5+b5JDl#SA(8w#i^Ds8V9mv)%sR5~U;6s=2tAX4|SeywaY_QwK6jf5BN z*=uScnup2)l0i&~Q4ArosdH&6g_okY7-mDP-{v)?&f_+msG1!dIlF17$ z34m-`31<4V$A_6d4?tComC~CMMOV!_#Q}zCa&x1Vm3?aei0R1F8tlFu8j!8PjGH{A z!a6;pD*^{qNd*}VkD#EE2XqG{VR#4^;pW#S71iu(GEDJo@(LaoLbc`^A5=2};DYzG z*p%Np|LDBA_V9w7u7eoW3?HO9Du!ppmFddV`r58-t+|nmqhrahRa0NTym*G! z`v*uQ^PXu$l`x7Yf3FG;6h0}KbotVvF!~Zmkks_5kH?*}Ry(!=re9tUqNc`8K*#Li z9d6=2xprjG50XXP8q!MCE*yxY&^tVIO?_Rj^&Y(tE%^s#$NT*lFj#Hf^7_x|Ho;`8 z^J%8ngzRQ|i7KrKQ7Hwk78w`rO>|4p_jw`)d!}M|W216Bu=IzH6tiTr-tJ%Zlf|2d zj}f<5B@FP?ymF8_vx5gGs}(bzwRl1?2Za&!vih3GqxMzOi~b2owA6xvk`CV3J@YC` zd8TCw=W{Mh@-l#%KA?@4?48Gf_=)*L!Bl=bom(8O6OO~= z06!VfZvh)PLWkb`jnl}7HRVw$nka^7>oEJ`+C{^uKw zl+Pfo$UQxsZCiRXIeN+{|Z(LqFf?L6LgSU!2dz&{zf z{AFfS8W|3%ERq>DctZ3us?f7S!jKXSwA8amoPi;gG?&! zU_b}Gmo~08o9yBb*5i?RHd?skSVTsqnCPEwmmE7bn?q8X_6~~tLTCVvn4f$`kUO79 z9$!?w9lK|2VcYZVvbl-!AyTjE97a@&3Y>aF*-a<`bV^PL(4s!5$aCG1x;F*4}C zm=f2ar2gk%F@XCI73V*!Paa%e_rf4T=--igt$C#?4gaYiBUKEV)MH2ht``s9_Jb>1 zrh1h|n#q`0LpshU36kY6a8NqvEQ|mtn~l-9_0m%`B(2`%Rqa3x9nPYnUkICdZTRuT z%V?UVdH3gLlWc*zpu-)*X{P$Cz7;?<44<^i;nH-3jnvFMkg z=~I0Doox@=EVdH`MNw*1;_+NE*n7uupiY@1kd7RcDrDk?nCx8xC6P?bDToDRWkV3r z%zHf79PNNaJ64aXai{vMP=0ItSPg3@nU9H2x-mQE#F{|})6dI_XbO7a?Wb8%#3#R) zdz0#N1aU21K7P{|nEf@|o5MsUvBT6BTl(9ZB&m%d&a)=(paX#->&#lL*`T`GYX&Osu1vZcS>Dx38L1*Wkxqj<0xHbABB?M|G1h* znxH|*V%AnvW892xOlDFz=`~GN_l)UaeEDJ=l^4>vA~0 zHslGi{o5W@WA{1ZA@}6Iw{pee^n;>@Fr$ZMepaWy(lXV>%Uo7$C{D(gJyncjqkhYi z_EAQ}Hp2xLDrp1Rj*S#Q5K(-X;Nfv}pQTST$geB{|_Fm%?_QRGY10{NT zbNmPoHbLqbnpjWyj?V^9g-0umCnhv_=dF7tnhsl##aEbjjJ~LAe!YtU2c8IGdyz;@ zxMaEZvjA0IiXVlNYajf>KbANUlE_DV+ES~N%oSJlq z>0`8uXciCBOd}*pIn=gi+P0sOkBGHs=5A~R)8af~uf)SRyr2wa&z>%uSk}rk;R~!3 z;N&n#5bF#A3Y%<`5OGHnS53O ze>=P=Lnp2%x7W{1zbI1-T>C8;>@7BafZS)U{zQKhjBG z(|GgD@WM-~>DRZ#64b|GXDuT9K6=$R&VwhF3*j%`7nUmaG#I(hhm^w+Uzs!r;V4%# z^}B3NS~081<=Gqf^bZ(%N_dJm3?|F3k;Hr{^}jj=tCze`^8KA9aHB1wJ4?TRk<(;M z_ryaIJxxD3v;z`TeZvh3feW_lYzl`@7*7R`BHkPEY*VTeyNyS^j0Si`sGZpiI9p9>1RkMNRenBN}AmplM)7KjLDUOvRjDVk?j!hHuGlFf}{&K z?}7o`vhQ3iGu3h%T`f(NYK&A0VWK>RE-6)n4L|>o)SS_>bGS+Pm$$>e5;F8#A~&b7 zG1M#niX%~^Sy!T9+N<37s?XhPg?Cqw5xyJDnciQITk6JG7baHJN?czhZ7H;Ndmo;~ zDABHjeIkMTs$@b;!&5wU^#I||56I=i1iYWUI>v{;mYe356d@sJf6K+YdeirX$ou_w zG7UEL@xp=2^L2BhIVxz_+FA>k#Kb}(377hNnTWtfR5-x>^75f{?ugtn# z=at`XIc7Sy%1NecN)yY%b)Pc%1WdP|Gj|FUg5F&i;)Z&E{B=Cr(sh1Xu#W%-HURT^>E1j9e0SXRHppADzJOb{eecRb4h`Uza=V5cFm4SUE{H%LcFajc(+L zKew*#zb5@co(}l@)MK^x9ho-QqW*WCqsq$PQ*v!4ekY5+1*CsxGp3ELYTr>;6%!k& zzCd%i#f~@0?~l9!%4P#Bo@!omjHv#7I)Wr7ue_s@|6^)yRpQ$D5y2qoZ&^aa3keHb zn0!)Hz*@h;bUyod=`^DAWii7+5}Um|Ho6J`GL{flx&NgVO*VLM#kqnofGvv)spLK5 zL_xT=bowRmmsVFbeqU)&j1=)$GSY5o4!)e-%n(pllgRen+bJXpO2_WxOTRGwNkhw} z?)`9Q*%w+o*HN$6<3_V?EANbSLojBFX#6 zVpYdsiGcI+i`G33Uz@L0!58JYEC80};VcWoNeuKQGQadbKf9}lP{?CA{>FgvC=j2v zXQv|4N7_@NyFfi3%WYQgy`}KFBC@FdI z0lppc!Kq~-#c@UhO~=W0o-;cCjzk1vF=BCwe4O4RDyad>Wdtq+d<1$6TmX}XP47HV z8$V>gIozx4f|zEYOpiip1NT{a(RALDI_!&WVke^xxaeTaBhX}M%>3ER6V|n-IMSGY z@=ak8Rm{?c?^IPh#)qK#xHg9zH!wKkE83U~lrQ<3e(N7(j(lwu2^4OltD+Vgmn4ja zf2MG|_AC`vkqyEmqxx}LJ6da9BKVrK0NoSw5=q?r$Uj@ki2L42pU|4h5xq_O8DpnE z^(4eX{!zejnp7?E^Rh_S$rjF9zQrO^*vEt|nP5;_JhS{iJUmtnbzwel7RAbgkpWjA zKEas!Tv7pkvvEAx2U(;*RbWt(T-7KN$OFMWUnK_EYEBS^a)HGZY-YvN+H{0OlbZVr zX^&@0P8|itJ<=JMi)GD>0~}bC2LGB=XQ0O~^kq<&fF{Li5|tXG*o%=vm4ZNr3nVTO z^LpNtK8tIlnl}#2%+Lt416>|-5|E_SK%X;LV;q~d-Dw!H&rEPAmfykR?C&(h7I398 zb6w%VsF9Zao&z!wabhh_NJJ}Jx7tZx@B`y=#hIKiS0=&*^lmtOS<8esPiFBa723`a zeowG9;E;y_iz-B>5WV4|;TdW}5RyMhAav6 zN(nwi|KJ+X70p5JC3$?_0ehyx_?<9MAMB0FlL1U3WT~pEYHW;Zrf1(np{DiyZYa*t zke{Ka&N=~JD<4fWJm5?0cpzL#thGfS>I&kE0?~v! z;iMYJRD=;ZjhB%2Mn6GS9jnKyeCUa%$Phz@yq4+)-gfhlrDIuQPIYnXkUzw(Ufs9) z+i}!fyMBsMbfDp(K_U#nm$p5O+s#7@EE6gWLSre-inSy0xg*I<64QbtC?1bq*G$SL zeYVd)z3*VG^Fz4lLo*DJhYof zHKe;2&$T##t9|PiSirY(C)1M`IX84I6k^*yEw_EE5v8Jl4TI*y#ZqG@iL@{|4M3)> zltb)4cd0<-#AxNu#)I{qY&S&4;bnPAYI(-g(QN3TFCH!BYUTKoEB`WQTlN+Qi+$!B z(QQ$Op4Ixwsa4#leJ90iPguvjY(G0MPzw;H`!t_;{ zoZ^pKcpsC@!3f;wznqV-|1sv!5a0;Be)+50p}Dce{}&Cth+d`JPuQL)+QB*n>|Jeo z{>W36e8#nON~@u#v>-}zRU(H9N6UtjWwk!l=ex0>(jlBI2X^Fdu3Y#l`M;|;UmPTeC;SJ>V;E)!)z3fJ> zq`KS;vVj%pQDsFXSAXjJDZQjw_!zn%K{zsDu~BMN@%HF!GQ`MmAa>6AVLP#oAtN*v zaq5>689CSt5liudgR4qW%HUB#=C#PoXwi0qjV5FJOa3yet^zEAYc9kF*6h3Ee;N)NKz|IgP&|8B+DIN*bL`%e9&hrh>w22K7&soW4? zp+UJRD*cb1OtLG8T(0zsEo$XMk%U`5UC*9u$0(rIRB<4{}R)Z?Gq<2z?LBqxsVw9@xJP2qE6?s{PKZIGBayT-F7|Y@LN-dSkkBPbzN6SEq zSBKX`O^~nW-_1|`%*e}-({WicS%rFb{Y%`+ssvKmRj{2XaC-sJB z<#)fG3d}km-^IY!Nf_Fnj;~@v!bQ5OXFlNZp7vDBAn@)euO0WRgdTs73T+pZq<=gn zZaUT@@tXA#zV_iHPrCI?$Q=!T8wtwE%U8O7Q}$4!AH5ALkslxYOo|{+u08zPnYh_~ zY-|_Ua9ftKLb{jaP(}S9<0NuDfIzOldqR1>48T3uQ>X5P9PN*rxnTOy>aEGp>*N`K z6P~l?s>rr~wWSx=vn=ye{PBz9va>@OzirZsCy*Ec-SDpjwk^FHMh$=aVG_mvc>r(Z z{u?T^87ukhWr-dwz^4>VdN9@9`A`2Na#3VaSgK;b&&de;AB? z4cooTK88MAs|Y?R@Dy6AEZbQ4L1Rb-eQ9CDu(TNo=C%?;rkAprc{0AEj z62CAye8XaO|9QAKlQy*#CkqqiC2deI!Jqhl%G~C(UTve5!ESw7j*$enU8HyRi|+!Z zqFUazpDJ8-gcgnLl;+BiM`oYcwdNoF6zUvlo5E8wz0yZj_53^h?pWB_aP<0< zFP-UecUvZNr+$Rf{hCvf)=xJsBX^bKgCacJW9pcnHrJ6{_ibAIShQDO0=*?#ncE8( z-NnW8IR&&e@c6^@GgT&YR;S%TRBydv`wf7qX!7;CAEsY}=)dcGrHUa99e9mU#2iiZ zWU6L(AS^!a*5}aU?~@I@4`5L68B)AYP|dtHC#g zUdc)slXvIw?ke4DD+!|?ZX_j&+Y*)Z5mFNL~@jprK`MsCzN>Z09NpytN@ zA?MzqjqW%>dw}i`vz$OqY2~*PTh>%iYH)^?YiamTX3Zh${}EzM3S|Ck_oLxoF_sG? zQ$DMs?R6YFo5e+XwDC(QF_)>bLAx(|Af#)u`8YJf7P7!Lf)~+9+O1RUSC6nVfj4{# zm<|IqjZYe~lY~T*aC%vC`^(GBXo-HST;=Zs?6?$GP7CU;(Ok)zR z@4p)ml892CczY{=Z~ECS5D7MGM&Gkl(?H??y0Q+Yy9_{FG4a%T4t z&eJ#>lYaQ0DsyiW74cI!uKzV2np>bw(jR~4M7e#Szu_48aj__Q-Wfq6=0Ns4FK&Kd zAEc{=2ZtG9j4n>49p6s(H+X=alC8x-b&iek1I$w&rzp;zR07oi5B4jTYMbZTL6~;O z6~k1Bjy#vF=^{cvrN;2=1}LQYjKXPWxYK>Lr8_I*HmA@%-6$zx;r2a$));~xW4o$U z&|5}4`ZDV{n|XF}-$??)=vSG^Zs*jpvtRd#SZm2Tg2n;eBkXZpWNWtlC}}<%s6Lzm z1nV6D%BBM~1P<}i55}z~xVaTn>5H+=#0Tsd*ic<;9U27ZwqoE8mV z9{%EF>DgAEr`mN|b+i2N)D-Zk(lR{`!ai87`b)g4z3X*SZ~Mu$5k;gPPcZH1-r=kB z|3%cXEG(k3&FedeB-zSMy;*O0JXVm=Lpze@A!GYa$-9}B{-6#r-l&`NV2*cF zLF48JkWeWG>L<$2Jw0NfR<4?K)i_>8pcMM#Tm(1Ec9gmbaVSLi^2d2W*XXBBJJoFggS8jahsEn+l4CSqP!iOn8CArr5f7O zDPGf~oB(6-(b@6O>oe;&;!jhKB^A4)t~OI@3?oO*TY5MSx8$hzZhZ+xnoVGNy6LR) ziW0R%DuVikxKVmi^%^fN;{=mDQ5kDXs89P20GX7UX2OStY=DschT5Xr&{DGt_nUQQGeO5IJsOAICDX4xgoUthK&JlE^p7W z1Cy&fY?3mgmjDUz;HTOz52XVS>u}(SPI{NH9(?i-YM`L*Mqav-DZJ)HEagy)_K)r4 z!iGv;f-}Y96$I301CL&SK3}creDmHN?##ZrLM6G?(!1Zu#D2;g5$94gMyEV6usIEZ zbmcU8iLuwB$mRazJRX?CY3fH!x3$?f zI>*vxccJ8KMXQm53*6B_nAx8RYgQJ#Asj;|&#T(MKI6U)ilRO+;Nc8Xk$Jn*D+4Pv zMvG8lqnW?Czv;Y+AO&=JC1s@nYpzC1uoMMFyIkna)G(?9}apuw^yy(Y{hXccE zki|W+{Cd{}#CCf(4@N-d^fu~85j8@;(T=P<1!#$mhukF0Dn@lb?0l7(>8d8ct-`#;!oV^a=mRn<-%lgyn6*Sx1wlWf}fniC&J6cIU$~U zZ8c~*&JUDMVFv!=Reulnon?UDdE&(YBpgGhGnB;u`tILok?DM&J-w~3?q=^o1j#Y- z@`P)R1e_Y(KDEn~SwUH5E(fd9Ykh`J_{(oY)}BrN!I?Y6wm0(>{Jae*x$}N3vxv)$ zf_XzmFjstzOf3#@VyXxYEnC`($z`wSlF=#I`;YuBADf%AECr5nHN@!#0CTlei)!rC3^9t(+YfDM}ry1-I ziwAC4MTM{mM)Q*Ga6JrXq7Yy6;RZUZp4R_>8n}8tK$6q)3f?b)9zNl;D#GsPu?vy` zqiY;RNDb}I)W6xJ)9;Gg$15s7!)h%bpIRO-PO+g!^l2r}4>=o6o*O@Ya`0kZ}Hm-E*rzADQQjOR>@D+f-C+n)G~!dd#*@Rs1-?_OV|I$Mc`Fw{jV_P;?bnwtKU7>WaWx zT9DO!UStZ1>nm$xd8bwtdtP@8+kqB49uo=G5Um>?03b_(Gm`++Hlf|pEA~|@QxBfb zn&kE-vO@rpU}dkq%P>;)xagWOdY@8bL164qI5Z{ptJ_ynu9hSP*(-MFGGVNdjcqc+ z3WSVk-}6AKN)#)R$3X1$mx8gbE_rlg8D*rEs77LP-`j!MC4C&H)djW}#|*{)ps=)# z^IOnh4)mrVSI?bJqJ^iku3{ug6(ad~RtHp}HNLiXphE%3?Zt3EKT^Ha0?Y|nFDAo1((vgvLc<7lK z2Ks{~N9oAicx#u8khiya&kU+Y+ij< zy)=v6e_32H>)CoLft-oh#vjlB^^B}uVDA6I_%C}PRJ=ww*Jm!^-`uO@-{fex%#_H> zgB9;sHbo?WL!&B$SzZA^Cbs%QqCMU%21G+;7Um3luVnU+T=|=zwMWF!C2;&({ zPVUBkkO4Gzb%9>uOHLgZ>G-ZL)M<>jrB&idEtY)ieXu;lp23s9xx z_cbyNDefX)B|Hs@>O)xG9RtATIBQr2)5swuLYG9g?sTcmqlDhEbt|Zg=@?r9Zm_og^XZ=z+9 zh!FLDmX7Zg7yXUxqG>gfm-{myXU{-fu6oQu8^j)^FE`dP?5l5?I(r=$vH_!B5pF-+ zxGxUqS!_{0nqq1(iY*9Uyf?z>Cz=U{l|^7bs-PX%*}?y;#L5sY677L zQRq~qwA@B|(H@4W3jocFI{11v)}h1L+Y4+r8$9=XaWs|% zXL@dseTLGxs~UnB15P!i%8MPzr>IuM5|4kx`6E>;w_t%#5jy1=BhHv?jcYKn$x2`= zW(`pvs#}!~`W9RuIsHSYMn}CEXoNKKp&DIn$|xkR79mFV3Fqu!Y|kcMf+<-Kq}bHn z(~*et51+{gNr@5RYcx|@Cgjs@U|{%_Jzc9GrHA1=yNCQndOS0ax0w}2%Fp8h#NuBQ zWehOxvN+e>iUFM_?j85CbBV1+oU}9_V_ZL}dEbYVN4Fmn;R;tN)3)oeQe+7OD-~+d z6az1lcXfsf2bWo}UiVuC%x)Pt>L$p9-0`mAD~R60W~x>_gRN7OnG}QaZ6CB~6ac1G zVSeXJXrT?!Snp3-j*YB*A6|+j`wT~B^|U7+_27vH`-ncH%%f7_!&y7;MWUMAMtgrA zT%|sj`sEoK5d?4iYIr|JL|W0uc%Eo%W}7IRr5T}5^*~jVNow)G7AF?I?INQJ_&20v$z=^;JUE01`OMwiv`Mdu53V&RddkmwqeqqI zJvF(aF>n&R)b@M5KQR>QUVqx|5Ss4`n4};5zOIu@CRl#lY&NuZ7}a?BcJ?N+@DpYy z$LaeIlY-)f1(!z^Y_C%_Q8S?f<}jAiiuo{sDFurl*+rZM@N9!}ij86)gPvmps|!*w zTo`_mAy_UnrN~q$9YoI=w%g3aV|QKnU=)8r^gO&zIUkB$rtT16l>NQ-YMy3%>{e7> zb^U#-^<6-#HC4ZqxKHu-*>Cyk*j-7!^5Ntjv6ta}VTu+7A&QQ>5175a9>)5)|HvEW zEosOP@*Hy&ga8ZDLYfl)?2ximZNU9hYe*%;eo69hH}D9#nLs~02392CIdN#R*C_Sz z1AEMgpJzGbB7cx%;;9FqN)yV}$uWdY%%}r;jTMn8nk@wm@2I?dio^DO`}5Gk zJBU@N@q z`pYl$cWKNgLC>Jr#FwexqTLklGbPq}D2?H{@I5KYIN_fHiJnlc*80AoN>$fC)h8Uz zY>w_ylV~D!$u!jM$-KqO5Bb@}AW}k{Xe2N*H9?`^=?6C&Mx6UsYPU8z^v|3xdvrg4 z9{EnjG=&`#@*mmdwol?^dx_nxCx`@+oR6ve<2MLkm8U?w%cn!~l&6~Co>5c!^qC6m zH|zF30TKS|^FkZu*gM?ZZ871R+_d|DeN8%P>%;t=-I<3ahFH^j$B!;II=kb`e>M4s z*|tAL9JbSM_+_-^<)m9%3i^3r3rumaGf+|48+alE zgu^e1rsp7bN8=S0wJ!VE(!7C9CS)kegT~*TtF;G&H0q-aa*7P?3$4=ou*$ zvFQcKm~H6;<}oSl!i*sFv=DeI5$~Fa=D%S$-O#;Ekp$GP8)h5@bFj-QFotT-u_}`r zJO{&pt9a~Gn(YeW2v5vvdJ*xc3!9&aFD6bQG#&B*%wcT{wCtxd& zvuFs*SE5q>Wfpft?rBVfscFuVYU^N0;%9oglx@6FI$u2h&!kR2j;P`BC7ANt+!AS? zmo>2noLl~`WVv}+JE@ujdFA+}3Zk}V2OC#z#_o#|g8rA;{7-c+`p^%|0ER^qf_=Xm zLz$J>4N%MyQS96&HlIq8q=+7505_?UR3Pn&qqx8uM*2| zoMS4}3m>ZV!>`u5_7A05FPWhz!AW``^4CJ@c3=ZHo1SehAy6aN>!%Pv(u51ig0%0+ zs03*yjx_M<{*ly#*MMa4ioV5LBs%quc@J@eo5cP(d(`Q>5qXaOy6k;AyS_f==1R(aLZ z|30AOC|Jur{&AlFNZq^|(b3&_Mx^GDGA~l^XBn?={`R(dcg4=_*AJH;g*NpoAvq%& zf_&VgM&=uwIv#ffJhWOzvTxy)(k{`3W2fqQcYc4CWk3<0!@v|A3@MB z*Sp!3W!gqlZxlhOLQI?k;LMC>9PW|Zz47P|-Bcn%A)w;~M&}eRVKePBef}g54yu|3 z<@2TJB%G}#?xx2S<{FSdt8;qi2GSH#AN>9Qed-<9&13z%lLmG@h=tMvJ6sP!QVXer zlRWT=%kbil8imM)PAgLV)o@7jyu)_q=-moe7Z2yw=N*5iVd8uM%AHhRzGF%qBjYm5 zrHdX)$($8Fq2((jplx%p^Rucn6eT@}snp>T?L^&Rh83 z5C}YT6BsFF4=^Fj78cvyx}&&Tx-`#rL!hJeKEj;4OmRpNgvmdmNP6x1ld%*^@5;>+ z(Vz)GM~eY5p)3=ok*nD^XaavahaP7`#mZGcNA2l|ecE-TQQBSu^pf%_?#G9CP?qr} zwCfRGj=+Jo7P)n5zC$~K7&{lJc@%6&6>uTbQEd%P=b=xPmp!qUHP@pBWGE^siYI`8 zdG3kSq`|s!obzura%e?}dJ;|SADD8(0Hx7%qEacY5UzFvz3`p%lPIS26EJyLs)I2Q zA_r_2B%bS%2kA_H5Bpk}^*Je?E7l4+xI(K$KpnL%%+d;;0SlsE(hGd{OhKp_C*Zz5 z=*OVmdpfyCf||W?q2j*h|vIWg5l##pP5*c%!8Z}DUaPmzx6}KT@#YF;#Pgj*k)wSMH(k+!#}miviM*7RH$=`lVsCpcU@hC zKja$Kg+UGP-WM>R{pmI>2)$N8`@B{RK^;t?IX}`FkD+yX?U8>%71?i>xS{2<>Jx|i z&vc{7gEVY6)U*oy8EId?);`UU)>v16UB9|ZSA)LhG8oH|R&2k5KsUrhPg86F;K_lh zEE>i*``AG)1b_%7i&aLkh-Krmn|fud4Ix0%KFf}0qFEqCy$k1=qP5QxrjPF6!W~)o zMl7G8%o3FLAX)HC^ql=0>Q=LmOrGN>j7C7ie?m`iul1|^5-%SFYOyMX*5Fg%%e8~> z#sz?#f+lvZfEXFopkg+^QIBNG=D2;M;`9(Dm-;1AH@k zNUX|p1?c;M2T>3+-@d*=`j48lB1wBob2jT6+ts^k(Wc-#762u)MyR~+3S3bzdjiJQ zeB$cqDK#Zl8hA_Fi&i~o>ZS6_%ZHga$>avtx(=$@9({ZEbV(X|yIriS<;>`l;TM#A zH_HywpNAPlTWF^_%}u_Sg(C&!JN$i|4(zTCc-eXGo5^w3nM{*pMVS;){slu0!d*9N z5qoTT`~zwRpRFWp{jw~7vUljk@m`4N+RBqfwv}tm(p{sL<4$`HyxYXqDN~PieCfQv zvZoHM$D>DZbxJ1Y{PB<=@NRHY^y2+}Wl!j`XLuK$n#1FJ(fC2+_Q0#>Y~JxNj2*at zsg!9iIMj3p4A?cX>C@<(PDDFG44l|x#`DQ&4gy7!F5fh0B8qHKNBlw~m-^Bc-*0|B zT^Db^(y8R8+W#{!)>B=28EZh9e8ux{5hR2De~lY|DcIwsN~*pO3|=wPKGyZB*46jo zxV6@x+j`N*fFB_E18*mDfe9ft?Cfj*uFG(^qK!#O z6^%di0*w1ku)&lX&(x_#28$`f?DW9?HyZvfnoiVt%TN)BK4CP)9z2-*7R`!IQ#6v) zi~vUE@gPIn>3OOMivGZsln!b(o0q#)pQSKhkgAB|f zV19bZ)CHdboUt)0w#>zd>+7O-n8hj$-0%`_T%Hb@STDiI233#L1z+Qy-vrOYxQp`( ze1j&fLbi{00n^WPy}GiCPOJJJoXiuZ7> z3dZ`Aisn{(C3bAYXvLxA1P#oW3A)DT;|=o?M!+*t;40=S(Iew5q45ysP)~NlC-ZZ8 zpS#Es7eR5o(dCArJw$H==5c{?@8I=(5GG1R%gu{W#?UB0M-%!xCKCf&%ODN2gbR|D zY4rIW2@#LR;KQ4^hl4>mp2%O>iMIrw!V?dzAw&({g-f0j2{i<%kvhra*V)=P4)-P`9DnNZ|enU_bJs_$e8`O=hFEqi{$P8$EDU z$;rPv_MqK_Ki*G=AWX@eLsvM1-=)sjo}Wmm235TN6wINaWuOwx4sH65Awk9p-`1Q4 z-&6*dmvgYkm4TS8%(==GFWUvk$0h@UM&lwa^zumDmYiXjC-)iK@yRte7k zu=pZ9=YLTZ7@T&mz;J1cIYfNQ`|>g-RMow|UPC2ZQbik##a^qQKJBH{Jmews?*{lg zBjFmnvYvsgnPW>+N0@_Aya)U+FNY08te#qsFgu-j*OV;Jm-H800(;v z0b%mUmc}HQ3dqI@u9f^X2?=E~fhW<;`i>K+3x$%Ap6EK^pBY8!N{|qYh#j)Rlahl8 zL%>S-GJwH4m7rQ0JS+^p2Q0{3yeb?6ozX$fI+G&xhp>DoA*PZaf-bHCVs1u^g4ngl z^c5z#mT(17x@13NeCKNDs{%01r0>4=yQ*luxNlW_3g~?@Vi32JLJ*&(lG5FwtJy?@ zCHiOtX#+eeE@tqJeccp!*pCtNAo6^QPpmjpiTj(&bKj{h0!BYzFhm5(6!oMsXeBf}}E%#yxU_m?ltxp~-}l30-;Gm|@;XWD*Tn z^8`sLu69Ar4iaEgN>e<9>89vg9`mc~gR7UB`>tS&CfGD}P*0#c#_gR@@r}_Zfzt;y z*0QDsH?OF9>e|q6?Paoib?oh%XY4|scGtJkw%4&DeLR~ZPTY?-qH}v`*dnM%PDnsU zNA4&l?sC>#nzYlJoSzT&<5g6;(F=*<-YFRqIV(PB=%QjK;!M30FeQ04DZhNk_%rE) zpEXlB9{GoA;)Pe^_`WOOs)H>S@sx}q2g((!z=!q!3Mv?|9Ow1z?Y?>ldlleXh%Yw` zTt5BlO0TK&VH^_OUa2UCb*}i)1*ic z%Ry#Cn5As2#{mHmC-kizG{TkUG*fNB&4{xlkZUy2NB z6^k8|Vu=<^*ns7gF76i;Kg~j7SW7MUY0hs{^m&(tFqatD`6Ip&!hKy(RzC-HPLSTn zyh%omEmTi2xE89i*d!qyAq$hJ58_rUro|c8hR`L(d&$ws8?sFaKes}oMk9l8bIo6I zpE&DI!>!fYtLA__R0wgdd@W`v7smU`4k#VOF$S3e@ZYF}UnRZgeN0HXxN6pu`hLB= z_1m@B>S{`zbGT6VuZE_W&pS3@c~YA2H9KB_A>T||n}U0*bOWolsM!B)s)<(Iqm}MJ zuADyL6A^-F;CYBcK9Bt6FLbqFySIc_-}1tCh}J`d6$DTodW3NF|I`VQy`%>-nZLN@ z)b*#Bi?!-;0;(|65i!(ksHqQKUuGe*eS_Y!j-^cuf-Hz^7g)sK0^%1yn;6zbq#L{n zorFiDMhfvyy(})h!c@(b{~#>ISb)!8Ue+?jvuNBL1NoSJKo#sXF$sQCIQltr>YnUa@$PKA1m|8tB183D5b{Xpj(Ouf0Kb_x~yV`GC3c;gAR z^ym%(SX2Wv+MuLxaL!SQcZqKz!jjiQZ()uZ_r!snML2(l14G>lw(47DpAGMEXddd` zkc)7xPXkp4bYENXcD5U6%}S`IJ8+J+pOgQy%3}@lNzT!lj9Z#)ZjMFhvc&q(cmv=7 z(Qx^(#*9dR=}{*DrNA&t4;>ji34OWZ0a8q4d^D6(W)?gq%jb^|n*xNPS&D<=@&dXI z6>Og%X#Ay4){3XA@=Sof3J?;HAtv&+rEy?>5|=aezqC%}nX%c9$4|+&_2SeXh9Z_s zstuBsO~_x-4H-1Xt1{@5-~E3?{RLNC(bBaI;~u0TNN{Le1Hl~{Y24l2LU0T2E{(ec z5AN>nF2UV`LvVOG=iJZt?XiEt8ntT8nsrUK>IN%>>$u6a2XCXO0ZczSw!{e0m+`i5H1V;O&JqQ-UZ$fMv@#R z<;w0|v|C0TFZP~;5`+@SAr(!TT)kw`rwBc~7N0=4(})6Fih`bY z<#{TKjU&4;!QWynlViTCR}`zT_r)%qi}AXU^jLFHJsq*fRqZR-4X?Evj6ka9u@e_v z#*%9Z5wlTTYrn{T5yN}$;tZE41oVdyVK&e~Z5^AR8WvXH|}0985dFroXm7yn;aS z|AN*+mN%K)X&slt_S|emBI2^`s(SmIIxd@kFXZu0l(lr!kXj_cFdR<9u}~EdAxaUe z$(o@qO&-onoUI?1WQUpNPY$<)jKJ221&8Usg-KrCKN>3 zJCWl}I648Xsy+S&`EM#Bayq4b5iFkXv^PLeuq!l5E)Pryoo3(zmnGKZz~t%3$!H-p z2Y}v2WqI!pTt5+!V_S*6E3+GJ!mELXBukX%H64Fa>f60FOdEz)0@C^RJO_9cK6947 zMulc9JU7L&8Z$oDx+Yly8%)ck9L}o*4>2!H@$)V52_z4k(i^se73p zxvR%PLCWeD=yG$ZxY}B|RjyVPu9daLbU@v@DDM<(-rK_RtSt|BYb1|#R`{vF>zCDU z3w^&7hAzRdHv8eKf^;cdUCi79|JH$uEdoNcef25ZoxZFNzUz%dhZ%2qb9!e!sV1S> zLFbAeu)b?FXe_7?THgn@dMkyF9*l?dfil^Pr$WhnUn!6cP=3)>FbbxE`4k0Vo{Rh2 zqJt}dz$QMR$Qy20XFyFBr)TL6WgHIu##`0*7HHnN0UkUJuzG z^pP$;Xqd%hr@YK7m9)%gWkq?GGl^>0H6~%>1B)Xk=y{+_Ne-Zqee9vYhv@Dnj7xa; za)YzE77F}PNyRTv^+4*5U)3gq;3dgbsd$4jKv|`G8mckBP!wRwmV+vY!mAq^M6t$> z(!|oF{773|sH5I?Krkz$syWCBIdKE|kA)4K(pxjjC$QrJb1ABfY!q~uLE#|rokFT# znk8?ZNnHbH0ThVcvU{^E$#%(y>-*%3qd->2NksGzAGvSibgCZEf~znIb1tEEudSw% zLs(=;v<;=e0c_Tv<^Iq*5sgH5LU526Ih2n3D!`D|^XsBGr%7M`7}GU`+z3A}u^+Oj@c!h!kH~oXC}2Ma49MW}+_A zzCe+X)nEO&7J>>t_h(RGc1;8 z79{!8ZJ-L7wPkJoZ4F2+o2OCaC3y-!4cnMqgq_pgB(l-fxZvdGj3-Ns@AC^?bVM0$ zPlHaT_#Rc>D@&qEfDKcFj4eL7FiZpzhf0hF6H}9AF)9(sdxZp$3oye$#McBinc?ZB z9q4b0L;2VfNb$PQ2kp89db<`XxDe_^t+r+9vC^3_D3bfGyktm15kDgc6sP8;%jd-4 zl58q@i##k>{bO(8{QEMsX;?J0P2sn%Y2n+Ui3CA@Yn`Qzr4*&Zt16Vr7j!03*R9N# zk=&H()*Z&s9t{INm}a8aJA)pfpp~~V^odb~nlBmI2V-*^=yaKi>#?=9n8-*5joF#c#go3P&;5Qv%lmIOuT#cu zb?M&U9)u=+_XlvphNE1=T8r0Pyt|JltXHqgS#$ZVgFR-xmWtt;_>2ilhc`?y6}+vg z_hb*|+vEHYO1jIHsXDCUF^$dYdf;87Q5+j{SFDP!J9K68pFFd+wT|q4Ai3!3hbH@9 zyxafu`-juVWoAsiI0)E{TuoV~1qh)}65ZfggMuDT@wvexE|AtBD^++8&Q{i(3=v)E z#SWYbGE*f77$I4l#LAUysUGe>a+q2fvDbjZ;4mq~8b5X&j~vhhokJ47h_OgTgA!)W z!N*MhNb!9CDf7TUrseqszo)jW6!+?Ob`_i0fdfFJhH}xWJaDf?Y32s-n z%?$hm59x#!p{XMToDNduLF47<1Z=&f)Yv`Jd6&S-J>+?P{x%hUNT4uj5v~7p98aWX zi(!0QkZh!*WC!shsr;Qn!vnK0j#&oB`LC)y4ugd!(&Kf)YuJePOZn25z~a=7P^)F^ z4c4gz0XE9fNKCR8>lj9A zMEqmV>V)|9%A)bmaNM8tCJl`T>N9?ejPYw=F)zXq)0Dzme5}QVeCBC1xx^JOC-DeL zO=3k@<;M8yVfd`B=0h=Y-6r{EfKaG&>~xA^MhB=cj2>jy7Iv# z7yI{l+hEz;zko2JzH{@g<#-~p%Q?rur5?m@{N*BD@)X7hlQh&V8DCpbC*XuVVcW;e zAe2x#Uzjp<$_NhkYH|w-9q_Jnc*{unn(NzNukbQPy3V6?OT|V7R@Gk-tcH>6yOU7>of^R(#X@-`O@-)>8hpJmHExvHEhb35`$P9(R8f z9G91RF8t3ED1h@lGhlif1WfUpzEqT{Ldm;6Mkqtk{u+}Z0id3mgBkOIVUnRE@1Y4O z^qY#a-^5H_QETR_4_`NF>gwceBOt^WW|LYjlOR&&mQzCi%9?Cl;YJi^7T;1vGt%&{ zeZ7mCHmCtJiPubB9zzWipMSfe`@O|s?Pja_MTe!Q!4*noG&f8dZPuz9jL854Ax9?O zppa*1^GW%I6a&pBMKQc*1I$_meZ~JUw(L1_i>jAk_9sRdn+&c-T$#1yszTw;kaAmv z#Pl`4DvTd0-M*Mj0K&MNmULmGC^GH_@S6zbg{t3Z!tRmZhnGK+XxoR#g?N8v)Tii( z{a}iW_-jx$!pm+fa;mtMf9LZzgP!~}0`42FfMr|{_au%5Ec?GT6MLr$p@Bb}<5cmA zx!#QQP8au51)R0M!~~d>#{$G1E$P0TvUtkw$&N)-)V^=hN=!L(kiajE@aQtKME&4^ zl)z81&AU{)0B&XP07WK_WudIg4cM`|V{h0NkH#6q_g08!V|}6k><^P+We)HAAMc$u zwT-yNAGo%0T{Ub!MtaVW7S>>rj3t)f;kgpZB2#H6ZG%>qp@EiS`xRL?^sF`)sU>{o zfgE2Jv^}{xm1AiK(y9Yj9XVy#M4!d3H@UBN+*5;xY{s8R-#i-xiuFttiKBPkx6=6&&Id>E^u zmFZhHwxTjbAEQJhw4T@nH!#hzAj%e}eFVEUm!DTe$s>_7`|{MwiSpH282S=Lk7MEH zn6LFm<*SMbo7?Wbe3uZ#Er_$HNT;Fir-5_CmTC<2y^K&5qe5S>p|7PTq>c)YU)Vs5 zDR~rL@DpV3uf+j4T6(!Sra8kInT4?^fQ_iaFd+HN(C{3vzgYx*@`8;i>8vfZwF{F;7w6@=(ROwKb&j zr!VD%fAL|1#Mfg%NN(X7J^eIX6WOH)8nMBGg?%daCww+3^I2#4=+P1>)V=-jr)Ak5 z&-%Wjjh3b6DHETJi?8`FkvTVb1@E*ov|O^Utl?uy3DtJFm%OQXw?vOmHU)ahD+90$|P5Iy%lsx|%N)w|WKgwn=>`$V`>R5jH~4#?bp7*~R->Ck2%iGIdQC za-DeY4F8XOvIa}h#4S9j3P_Sx)Nfu`gPo5!mYKx1s7e+eTCqsbhMsziJ0g0B6J}a_`<5MFDzEsX6 zJtJ682|Svjjdo!1hi93C+=5j9c?BWPAN8N8e6qBmWf=CVgdB^dkNn}1!8qS;jOqVJld?-Zh~&sJEsYogg) z1P=;NPK3T%r=nT63;)bCd*9vehWfCa{0Bqv`GaudToOc|T1vH1`4K9cn5+Hw-A2>Y z1}^!c8z|_rG1*Te8jqIUo)Xp>hk2F4NW+}e0TphJ#hK{`KCye2<*4-Sc3CrkK|8CS zZ~cAFxn(x&*nVbXYT1sv=sUI{14l)j9G`BhET)8}gDeU^Pa*mhM~bqC=L!=pZfdTe z7vOf4;nY|SV|YT-2i(Gu^2f6&7KJP>4i((k{6G*^~6&UYAyGsK=d2EzrJ4w5Bc zPjly_wt+thA|?Kd&q^RKp(BBwWV6KxTlBmr{$^5G?`)j-Rj6lgyZzU=B&8{o5HSOfdR#YoR;t}Iy-enpWhep5pF3U{YI@|RvFA$)vf zxsjHij?Ux4s5C@=R!WYJ04jHGvCIE*HS$vLyAHF4x*^t&92;dU#}gztqxGQ&B1Gt{ zv8Rf0@O~0KL^y0ClEt(ZE}x!DQtkZKfggL2!2-t9|z`D8emf#7X)DD@89sL-BRD)UL4kE68$*DWsP(&q( zL|KCtj!IHOS5C58y6>t-59=V%VOm(>4-jg_EGK@%KP4>eLNgx9;hG9);XEDeMWx%W zl<|tH9MK33#L{!$P3};@j$RK%qy4}0#_=COPAiRaz!%`vIB*F}xc(aL}hw+UA6dnVut(1gXodo@kL&Po_+ z;(=Ul?(D+07x$4C1xTu>hwyJ0*V5;%+w_RK*=)=jN9N2!jrxL7E(#eKYUeRWeP4-|yg+)|2IIq}U%&>EIy zojWP831}jqgUyahg`hX;py6_NvM%sw+E2APLe>U}Z%Y%w^7_w0b0<$i#EpV>Yo82B zJpYEx55y2TVaPiJmg!)ETcFfif#*aW# z8(Vu97kZ6b+%}Za9>m|3g8yzJ-qV|ff0CL{`RcXTr_470*!Z-X`r}xNs)f7OJuJx? z>D1`0sztzHn4LZPJG+g`KivYofj9Ba@2`BOnd~b?b?`2Me5t9ZN*VUAQfayJfk&gu zJeu5D!HFZ=zYsOG|_42Lmuj*iMKi z%KU6tPUAZAAsmdB{T0XS= zH-opF)n?ZJx0dn!RoHx1Z#|cs?t}kK0fG*8RRDAw#~tx70K{WRr!f7)$o##RjIaw@_9#X03>y)2;=xH^EWq26{Z5t3ig|ET=AdYPm0Hu>Y6%0RGQOeFH6Yh!Y{UC<0s`evIV z$}jNtOpmsEKq^ifab75Ior7DdH`W3nEK1%h9~B~QeX#R&#SJGe1N~;=2dHs~t6H}E zNFll>J|KA(_{LX4stD|srlc^&;vKHogSj^KQ43|mm>Fi{?}CbwA{rPh$VX_!!c49O z4u@;@LjufvmxT~xl|kfx^JzF+-bOI7Pe>~#dnlkRsPf<#^Z4(*xJGpgWnMVj%3(u` zjvp_w3_9s>BKh{ouf0AOrPPQwHA0gmFrZ%jWSgOGo&iQM5w7@XF$I#r6j6&}U|)mX z*(Ans=9mT6M}zzrCt@SzZ@nba?89mlBU{-wb)RBBDpAdnUbtQ4NW0`-XGA1|&Gls8 z$%3!^N)qO6Wv|m4;g+dwc+q{R$tg3-OxE+S>P^w`9yM90|9<~5;{R{UiyfeMvLg-3 zRRohMiQr=0J7T%FkYF^tNNOeM8|HA%j#cYSKtz}YV&h31O?ea3RE0jhuYFp%-Xj}z z`;K9K_bgX%&^ISwaz}w2JWm=(jewmZ8fHXE8(56lYmOA_EJ+*Skx3wcJ21W01Rg&>R|>>wGl!EJ_+GeQEwvqz{$lcAq}IwVIC^23e6 z3rw!O8q<4f0@LDE5G%fqC^2p)p zOr5x_$mytmvNkAoS;r-8CK+KXQ^QrK`{{bG5+VoCg2KeCZKO=Z!jO-hqy@wC|8YZJ~h=(!re|L`)XUbt)mlztVZGz2K z0UlW+bCfXP#)GVu_fp^zH9^Ty|3DEbgcBguYY`=C!sfk&-DREx1k$DErnHLI4_PjY zn8t8AdhNWb$?WW7!ok8iN7C?k-W$p!pgethHd2n*#qk;aQ)yj>b^Yel4fghV=3if? zE8T|8CHr6QhVk_#5neRsr;2xWEG3__v*ulCRGS3c7f(ONeosBSnlr2V?@Jq}R!4sS zM`3dLFFMWnOD0 zwgiRkAUITR)g|9&_2~HD!ec?N|L~gMCClt1*j?vVV_LAtLZ|tZ^CQFoQlDLVZB><| zM)PwNENCOc?@xsvkgu)^arZS%XU9vlQ-$O&GtSjuLqFHrpR}nTdw7}7d-+XDCgF&D zD@orgZV#a?U{gX0kx&(1wu&cih-{t;bBBjw978D!YgS?sH6bTT!44}BtDm&3WUFl@ z2+TS7^H=cre!{XQUm%)ik5&SvyN-2KW!=Ms1j+A{OZEeq^PjIarVv6EK#Vby%oQu3dBXAevT^RWsD z28x!7BU9@m2z+IxTpqR<67Sgo@j0Zp}MouVWaVCi#z=yxl0d0a36IFAL}8emmD z$)RIH5Dbs)^vGatiuZY6s%0>P2B+o?d&uFNyxCY~j8pD_{PE)p!x5T%y_KIa6Ae#b*LeH3cIa!S)jAm`#&4Vb)hi9H^3}yt`d3O z(i#v6&Fd5C9f=Wzm;wG{OL+kDv4*{4KGW5qve!>@tjE6{cwlk7>9+6>9pzVP&s)2n z7JtG+?F$L(d$#}gJITFyl^Sp^gqVigkPQ0Iz>pj)Wk7kLAh9vZax{kg z*6ZeqRZFycA+;>Ky&odQ=_mPVStxb>uSFb`#d~do`qcm2ienh34MFXt&52+Bd`EGm z@=sW~WyVekBdb;KY=@LzoPZOxRubfnyj5a+6s|TS2ML*6RF=~YkF4_KaBa74oJKy% z0@5zG=jH#9^)CNuZXK5>fKnfO7!Y8gnv%$=%O4!1n;3dAc&JQd&~4^cQUqLC4+TA( z({xxl=Pk0jWPrjqC`aa-C;pwzY1L}p#DW1(Hi`&#d-^<>>wE!1R+~HQzhuRRNo}(A z>)p1*Gc!m6?eM@SgATchNY6UI7i5$R8!IoHm#iuew5y|}V0_s56d+8UCUVnSHpFH4 zhTQN#&>4=P8tRH47MVqb30Z;2F3T=El7%YE)9CZ?SXJ~;)2*vJ>#)@C=KmQT$!*%`@f>cECd4Pf*?UzQ-gMG(lJz$UHilC>ekLgkUR*hJ1l%#n7s623@9~|CZyWBdYH5<>&CaQoHGO z;|abeG$~}Du%`QAR)@3^2UcLsAH;_fa8dr}yXAG74lcE3`G4Hbwc{;bIuqrFawnh9 ztkDHGI_ABl-BZ5^UMy&y^o{f6bn^4q*6pxsh~E)dk`iZjwiVOAEF3mG-tRzig#TJ< z_3?&cRV_2k*$3W`{H8S?aPzVVT!(p4Tf<{A$PyVzyR#DVaoI)K@MtMQx#YY^@%|kw zY%%tJcK?5az>nPxReL_mFt80W)qjBWHL7UkqI419>yd|ILK9%XMck#2RFXT~h-$WE z$e7(|Ah`^OO7zTLhOeQtR0{PSiI^G&p7Y`eB_fg(H1(+IZ5tcUvR-H@x1wWz5y^N_ z*{Y4XfmSgfP$gr43#98Exa98qSE0$7_|J%vDOyG)4~_|PZyeY?eHIxRff^qq4wrfN z7S2YLMgnFXRwhS-t}V~RAW^_8rQ-V{=B5~wjU>8W>+Dc)(w@!MDdYr+%KQbGGmU#mCHQ`e9v-e=8(@a3_objF{NuZ!^u;gCfMn zLIWGiWQ<#HIt~j2*kFa-eSRNg9u4Zr>x#6yRhnnVk=&>$(fQewLQqEfKv z@0|R0F0#*!B<0Ke`G$tL&1iotP#`Z24wpQ(nE%C}8mTqA0 zcr;`9e8U^nKIb8;D{{|^SLo?9{9(_LRWOe&2%BFBr^8%8z@{)P4xrbgNbmQODjG0T z9MOh^FlX4K5j>%-<6mn#!?!o3Sh5{dAWV+two#NUhAAVkzEyFIewa83-slzl4B6v!SF6G zvcO_)CO@!2g;Zvkf`%3ZI`=hf>Xt>gm1o#}b8mMI9qII@wEbRp8(aKFNsWDUHs|S& z%3ShAJfx=Paia$sDRO8ds!J3#K2Qi#v&VKXjYi zg18(?%K#7ENsBxNoe>Rf5jdmbBTt(XI=kAB8%)vydp8eJ5=eR@DLb7bi<_%(^qX>> zS$GaQosXCq&i0}sVVn^>m~Edz)*jG9hwSfYFjB_dy7*R{R?kp)eT^1aVbdi~`C3(m=L*#}$-LKiC+%uT=eeJDQpyg&V{ z<(VuhGW7NqZytP@LvOmd__odG6Rb42A-Cv8K*DD*TRpNeV~!hD){UcDr#~SbQ4CrX z=m+tWPl0dHdllg4!FW}G%OppBhS>NkE>@}mFBl2W@O@XFStT?xM@oJ9UVsE^j102) z$T^X>Z}<;7fOb}97(CnrM*RrX&)Pf<;D=mJ!dNl~Jc)RN*vt6)5=qc*A2@Af#M9*APT?=#9)j2*iizda2! z7X&kcexeH?X6XcVYh+>kYVMM_sYoSx8`D#ZbZrO|DiN>QsBMdN8R^D`y_9P?fBY96 zE0E!%p_ZLy(Y24e>VEN=XBk8KOLR8EdKl3|Lm|sKOvLcB2_yTGVdL(Mqk`;?fKWU( zU${j7@?dZ0`j0BU+{6~{&&;Z>LJ5^YoZlJ^)^u0&U%S#QS8r_6j5yc@LY4|q@Vfv1 zz#9M=TRa?Oi`hoI#ftnxEWv=KP><^yqH3&`HVyDd*37TS!|DRCQegsLXiOtOAV`?- zrxbIf1d-MLAgx4VT=AGOm6uvA0@I|AoPc8zl2Q-2*u;^1GDkfpUIX4B|KyxNUv!4| z4QM$9K~vx27Ha-Pan_N-#5gcneSW+ZQfWQqh~f6zOCn{w3KBG&wG5D!KtHG{?kU^V z0nM3$2_j}vM-|!&XaPlBgY-hk=?Rd(hKtDCQ8yQ;L+GMUf`Y8Rt+0>*)+C4HFoy?m z_xD<~Lru{SngrpmlmFrs8OckEw8018c*PVb9K8uJ_)Az^d9Y`}d;u${G;C`??HZ-Li z4~O@9j}6ts|4O*J%98533GKB&rg`uZphWNwKB!*XBj{Y4r^b_)BjVw)D;C0(-vH(M z5FiwG7=wMkL^*+LL~T54vLJ^9DtthXMfTSu$>;a#`vXF)bc@gFL?;+yjO(y<5^IO@ z@bu8~DEr6%HrzgQQa(m4Ya7f!kI|26B-P#%WKfr3~(%``y9|NV}dV6{tVU zfDe?`L(;qjd>*JSbkLx!55F4|WU6crMT%MmWpO7Ha=6ZuQ)qocw@oeBdxGPN4--)x zh4BD`iqmCz_*jvZA{3w;aeqNnm64g@p&~G}L)0O1`R@;L$>PxD2-)h;blA4WrXS&l zZ}(XtvT`GrmJJCdy!{?Z-=J-UopLZ*bf?gwWjHUQ-GKd9B#O%$brY`|rgmYb5>e-` z@~3|z3`#ew7~8jhwoSP`P^M(Qa@ zA-Ep|@>;3xzyK*4?;u4-v+rns0X&qW-5M(%>plVC;e0V=`Oa&@ksf3=?$i;Bo?$p( zcmXD=dLArXMto8?__$omGIp2eB^5jPU-I}BGrW_EqUBc$mEl#z4_aPGF*0nnx?5mh z+tYZYKVcY_r)zL$1fyL=e65GXi9mB@@8r)DftsG~jn z%1h6RX88m2=@Ew7iZ}ZX{zZg?g;h?@>e}lex-9d3ARRMPrg7~=5lwhU)Gak7OU)Z! zW~Md|r~5I~hjBU)3F_X@z4^bsqj?%kf)*(tL>$afp|=*MW~N3Km!jkycc|D&0#!LJiWfFsxvo}GK1ENgl8>V zj=r#%qzEr)pm5Hb{8;+lGyrKtRE0kfL6+3%;)RpK-8m!=(>Tt1H2)Lp%F~ABgc4Ef zp9rfzYL7_ze!vTz#1*l8A zd&NI!;H~fyOc&zKQN!)Nf&djCIT9!~S!gPR8J1)$VM}NWN6m=tcrn7;T2C-?itcE) z3Zr&r{}*YTCC}O#YXCM<&9&e_My@pH)bQQCwpu}W%?k&*V)wvd9V^Y-oUU>93e?HB*x8R0@*fXu){C<}J1`zDjOtWZzrbHD zNi}~%lMKof3X1026O2Qh@_;h51HM|9QxXGKRX`%NlTi?`a7BC!zgAA zZTzN*Tn&RmnA+?Iojh*xmw-BOT&>JGVE30??N3Nc-P(c4aDFzWi=(!CO`j~%g2Isq)=kGvy?U0IivgaFvS{80hhww890vS>8sf` zRb@A=WKl12!!_>W2D5*Vxn9Aab8cW3Xe`eYFzn!l;OBv@r_+DeX*BMZ-4WPV<^D>D zkM9;QI5kMTJE9c;#@ed!7shS?W7b5z{NeEK74&jdu77CnvHbTblNlDT95=Rk0{embBT>1!WjJ;OpCSOn8pf-bFcFaLZC z_E#KndfoRv&@DxYj)tISFC6QCEb%>1uw+osAKaY(-a$8ys1GG^!e5!sk&#$FmdyRt zw6s)}Hw-PIx1hI3M*S!KC^LptC#cw=6!2K1+BgD`C5vPT9EZU8cvK)gclPVy)2HBC7OcgvcVi?<+S*2y$<1sB%7E^b6;DeYwu9^6Z@L0`3Z zJs3<5FqOu67D>E3|G4uU(|X$2gb?$k`hkR@YuN<^@}H;fe>5woU7MoEEzmq`kO%JX zL&qU;T2T0in#{_4-j#1Aqrk-6kH@C?`tUmWm&D&3rWzr9+>zipYarAsZ=Fn7q`*0= zf2(IqEY@?#ZWC?kSxC$@lBGzf)mlD7b5)P~2!SD@pPmcb$DY4wpDkHH9<+Hbsz|W#cB9ZkS_+@5T zak_qU2eq1HwdJU0SH}hjK$wyhvwtk+>m-;82^}?={gEIzs(u$uh9~3q@1@--#)Ilh z7@9FA35T@6qmOj?JzvQ?Ple9QXA*M! zX`&|*2KSLK9O3?@iF)$F{cSy$tqwq1i`#FjWkZ)XrEm$5uLEyJCPez7bfjQ>;L8tr z^^1`{KcL)vu@eF8m5o+Dq%aQn0vakg=t}^P4OfaOax-y{uqUF#F?7UJgV#Lh)G~XL zVIvyipGj1ak?g};MezFCMyv?wus9J^z>K#t{UH*6%X$8}LTk6mS)T;-ASzWZihe^u zAa($Si@APFg=fQ0hDiei1?v>-cn*nXw{AC& zeJMul4tj)?(0;<9;bBiW)c?ZqXR$TNT3c8V%8tSTUw|2gx8BFbywu6%iXai&JpEa+ zf^OnW15oKfTVs4`29TG=>;t4Ar@)V56l?jsghVo6%h-o5hA)yAKCZh?8Z388Cf#N}{M2$%}MMFVt#g zFdSUQ1O)HC6=3pkEcX_nTt|N2KMM03Rme}DY?8lCHvN%x&u1a=$EbpHnXct;zGh}M zjxh#?DlgHG;(uNL{IkPl_x^8>SkH}r)32&qV~c96L%Xbt?e6z%S;x8c9f2zHKfyPJ zRc>Wnpp!u;?gY+Y2fg@YxwZCUqjszj^(`68x=@`uwra;__A! zuW?|i5?frQWtk2-{OLz;e>>rTl-I8Zd4*lynD7UgIk5*n#`hC0yHcZpy5Jf$r>fw!&$>f1kWMT{(VRo0C)Gwi- z*FbNq0|4(vw`henJ;A3KHostosDJM{ z-Qi+kz!8zw*L$;clC6mqZh;>|e~dcLr_(LUc?23tUX&6u856Je1w@N694ed_zZ;Q& zWSdCbDI?j@u$X1sv$rT?5D@0%LKvY{Z7@B7zRZuciWFHx42V(oK+G|{M`_=luwPlm}7Cb`xYzv0hNK5C!G(H=sj9*vw>ndp=QT8VUe;e<@_I2ZD?=j{Z2^ zpuUz-@j_1g#;Ia1Yu*q=sX4>a7Qbk3%!{&TZ%QTx39|KyB)XTr$zxRdh@RtzH5PU! z;9V~arAebhW&(O4Bi2Wi>=l}Vt?lof!KL)60itfE25?u4VY3n*zaA+9(S7P1whp2z1z52#H{Kf{6_S;7DU)Mtf$vOx8<+6#l$v(~P+ja4XYeGC(}p z(4Kj>(JFHjQTkDF0t~l=BlV-c7+_zudS=ZuIKAY0S~H5t6>jOyY#X~#7Z&{glogj3 zRlZM1m|$j^xI!iBhTm<$^ks=UqZnR(P{P{O13{8}I3clu;Ab|?)V+E{DpxG}8nF6r zZK*m!F;wa?iie~&q+ku3^Tl}gu%LqeWB$#|$>_>l`To*q1`2b$JRfjirH^?bd_Dz* z5>{OJ7-OK3cky-qM+Rgl#8y-){0Fxmf_MnUisqO79v}2#{u8c&{m1u+hl>~>>vd?A zO=tY$T7V-XGfX~;6;K9f6{JJCI#R#*P1c8ySQVBk)zlO&5zk5T(V85~^9Udl^tW@Z zJM?$`;P>ek*SKES*90gV=L*hSn}CBgK3i2`ea;GB) zg>GL#lS#MG+4r*({#Tul4ZK@DpWsBonJ&t=1jQSblv=*3We(zmRvyA;Zy0kL;8Hy+ z4_oKO=9j=%3te-<-mWg5J-mbQry}pIX{=>W!e}RzTKwDAy{j1TtTIE5h*^j9ca$#a zodtP3Y=!K$l#&LS@WuSfK|;1M3B;+FUv8xaRhTaLEF3!(rLaVNZ?X3ogvFggBppE% zP9{|A*S3Z-KQMgFu75h|s@Wr#NnrSmw?up?gcFV4?Yc}S`ZY0qbusO}C@5;3@PgIJ z!a3ZI{3|B5CPaBBCCHuD2h~I5A`S`(_5UsW-ao89lx#VFuwF)>HK^9tsOW3UN_0js z`Jq5!>z{roFzS=pInlT{83z(*|NWbDWSY-#Adob$CfF~gr_4Y^g^hvnblngFq`;@{082%8A*}%AGZA9 zPsH&#$nd zJ5iSfs6&87EK@4nFpe!kBkA}0d-Hfh%sW5MNSk=FfA4!suNL1Xue?aK?TAI4+RIqZ zr(KxMLnR~MT@V^Cr3Fv?x(x}NYJYS$6LdfB=vw-8yzEJRMVj~~0oZ9PGkDbZ4SN!t zI!UYa4YS$zSc%FGK06@id1*^t?u3@jA=2vEkGp%(`Fcqah0tSEJPTz1#G?|>l}{?; zW5wYS!dn1T#7RT>vcx^ZB{~($MV(_^S=9ga_axvuG^Ov2XY1BxGL*9tWHNtx!HD1cVqZIy%}?uv^C!K$Ov? zzg?>uZdp;1Z33l&Qi{CmBLatS$wtVR@!uB3nYusK4Tm`w8loKv7VDm0Fd5Ejc0TXp zCu<*RY!Gxgn+YDpF!eYi*dO}5>~&h-6uSv*Z_4(BCy7;DJZXo)+w!Yi%!d+e?ZuRk z_3@#clfG|;)#H^Fcs>4YH0-o#_QVxGCg8SKWAi;FxH|u}r`Hx2IQBAuZoWA;!1MfuR@3&X*0sSQU2Zmyz68g;`sWQ-gS!$W-GAG-(Qm#DpOfgC z!EuV!i#V$GrF7!mp7MePfmKgU45KGySPLudwdPFQm~ZPpUN|{*m9l(-ja$C!yBkh+ zN|6%|$aB|Z%?(%GsBd8(In(l@1YD%5Azwu)Ig*6v# zo>WT5RIbypOr86EsqprA_TjhEVFlt7FF(1$uOGt=Rmd*MSbAW?!WN}ZQg)F>BOf^N zL#)=7q^Hf2iD_(_7I(?dKi?_Y%i-|w1yaKX8i{)aRw#6v%$y{#a>$!318q*fuZpv(N2o_l%TFpDX-?ib5=hNvX!3Dl6?QCUdl%9xp zvQfGuyn^Fxy{GPDrda5;xF^ZE#_>rGtMirHpGaF|+O9E*oLKiJ%}%?daB!7S?5wYM zBM#;)I6CLqt>e*ku1)tVzIh2PmmYp{snaDfJ#!TouF{WU-GC9c@lxAP)N%vAbzG2N zSoDOGqO7f|#H}28;mD|$&)wEpe6wed|ISe#xHp!4#=?Kc8}$vorI8w{K{+y_F`*W_ zKlv$U@13->UUTo6l$rIF@x6KB0GaQLDl&9Tx?hxi{`#`JYqD#ZNfP@>&IIA37sq#e z)8Wr4YOhwi7}>RasVMux-){=8s_qJr7ZooUIKTRNd7Mp%j7vshV#uC7Vq?3sqn*E; zo_KfCUVeL!=BPOlqCZqOdf2JfY>w5M$l)c_9(cBWx9S+)y1)X-wzP*asv#wkSC426 zl`HUdaewx6YGGX5V&&`B%F&4|yL}t?I;lm}6}2^}nkgSX>+3hZdhX+rkL})rx2uNa ztZ6KH`%d!Sr6b#xkKDV3b;RyS*0Ch}Dd$x!9*zvKjB;R0=r^Zx4NrHhYWpoa{+#bV zg`M$bhI>3BTGyA{&zCBF(^6Knu9K@CsF20iJtlXBza*=%u27vHp(PXLp7Y#$$vhP? z%cG(Pm(^UnU{D*OUOQK-Ui(x{zUpR8y9JN+iu(PM$&f6KD6tU2A z>dS=ftL(3R6Hare7fYPLiY%HMR-B)BR$6PZp7-WC9cu6Nwh zedZwz!ciV2`T2*-EX~z5Cwc2y4G}g!P#TgJa_sSp)bJPwt2CuB$s@bv-Fe}i5p0oD z2Sgsqk3A(OT2Y!Rbm4$+qf+`IG4DkqBSjphzUf(Co;2P?s=(H+_k%Q)bZfh;$Huvd zoNhh1x@d+^Luz(}rAU0ZaGY6p@$LJCb@R%bg12sO>nZd8wCzgDh}S({$`<^PQM#&n z>JEihUdc^eondwC)6tt+eE+-Sf;O33wB8m=e_eaT=bT73YY|uW#x7 zoCI-~jI0B0=6scyqX`;bjZY@V9rE*vvFEucB=IJy=VaKO9D6*=VmaR`N8&zTO`B(t zrMY`ap{j@`J0wJH$)EO|ml4jANr_Gq$6g9MIY&)JYN6j4?$JCOKqJz*>mMMrKA^$)+??r75;tR+!1rP zWUbmiP&2wkPIT6_s|ucLBArY_$Bow5HR*xb`>SrV*R8GZ+_2{H0pHo$Up>w`WC-nd zwviZ-t90OA$B)HY9m~Ex+ZEtt{5-VtOwhgGE|}Gh75A||^(m;sc>6rP=Cd!pjodVP z=!08>zOFi_b-ZhQ{1|D~fTO?r&vEv>$9@07LuTfDx6((Wdg^+XMQl2IvEoI3^AUXy z-zL-G{M+oBfAr5CQFGf{j}&6)vseLd_QWBiOG3kSHG?w@nnGvLed z5Yuxv2E48)Rn9$HQmAEov%B!;iy5c%=FCc*9{A#`7w5Xy>K_}2ID9@*+mYG%z2|X& z@yZu1KZ5H{X}K%#ce+37-LDQ*9#nO>t8SdAoccLiNmg$qx#(^uWWOqWQlo$H5$=Ml zdZCTq{Kl5Yd|zn-pWNk z^>Kjhz3hoHhaNo~qT<2RSn~cr(LASwSl0@TCGin1`<)@(|q@5hDzGL@r zhsfH99V)s~Ym&2PPgdec%~M~zd669BM3sz8o-|SS+4(!ybjo)d?*{SX-^Ug~zVgJHXjZKYS4B0UAph}E~cT3r$ZCg7OOh)EvO2o}c-2Te6>2~rY zjUn!~T$2Ms92&CXUKzQhgqsf=@gv53<)Sj)Uyt2|2F2bm{$waNWycP^g;%f2$QkkX z*l~C<+3C-P#~gl|;52z(ibzt9{tV9aThq_HIp!GFxyPaP_SWvBcRnb8pT#M=`qp)1 z>gZwea(A{BB-i`P$Lt6^t%`uQommW^YQJ`oOg8&sf9z%LWAB zSbK1!>8AlYR#$Sv6_t&00vG-_;aau5E9G)|jxvjNVr+VfhBU`joT5Dcv{N zq0+f(?Oh&k;W(9g*HEQmPe~u=I6E74pTQCd1@W6&+kC~wMMMS8l@)beF1!2tpkvOu zqB=aqtyX8mBNxn`a_g33y4YbG2cMV2!ZnnOOFwTJlYB6K!OQ`CTmE!S-E6+R)sQxy zb#g4;@(uav$77@dQ(|vdeXA%M#CbE*EKqh?@tfkP({lB*mH8I4&6jmd2&)+UE$IDF zjig<|_jI#MIKv#}{}f{%3O!;cW|Pw4`(C*G_E(b#yHam?`)fihKPPs#{iTi*4snY_ z0(Spi_%&5MxM#0dwfFGWkV{QL>kkhcn`^|2+3QfGCTegn_uzW}4>P$|f%+Uzv&5e& zUmiv*x>4pQ$`AQsXV4O0Yru;wzjmYCs32ijIDglirSZAr>!fYZPI|t(Y}do1w_b6? zy;^Ri+KAnMsZ=N_+f)}jxhdkYl-k0ltJEL9Gg%ttYczj`9Cx($xs4YegehgOh%o+-)hQ~2hD@9EXO8ln zv*Lg9o{MD9n8hyJk(e_5q{`oK;;ZuM%1hh-ySWqF%FQKY`rZ)!5$n50vn$PHO_d~D zj4L;v<5JpMbdf2s&T#FA91lxnx3$DmeBN<s>GK=U z#@u~bVsEQ6J+D@C5kJpFJIW&>Qu6TT>PT&O?+b%f&J-PrlX@wAV#UP`gS0~m-Sgtw zI42|GOjzzF;?m>qzS(?lpNZnZ#>Jc|lBqKlhst}bzn*FnZ)$nnZCXioshRAqC5^vz z-*Q>)=i+DOaddET=0#CE7VlAvyp~MOXa5WzPQ|#NQx3(AGqaAd&raJiN^a)$qn0H{ z6P>2zy_vl_uj*oHCQn5@Rn5}HT&vtEI&Z6gr=?3~#yh#9F)tdzrbN zu9}9krK63FPBxo;U3tN^?wq(oxYCACYdZoRTei*$b5c{=YGNgF|AbOV?MG!PuVts% zk9fnRZ`u}5mJ09Qkm&e>Ys8Nmc5<8H`G&`-c}t}&{8pZs_E0Im&^cnaZJ6nLp;IIF z9X6=5J+@-xB*ifi*F1U@O%5o>E}nd4^1ZDColAJ@9Y$qOFsqp)rMPnaey>W`roxVEFYdhatq~4-D?P~Y<2m!}4!W)uFSRCY(J=L=5NQ{x{sH)g%v z?L7F&0G&^RHWcj`_37#8-($T3B}3S629N!3ka1Ae>aIKmQIRl_`InSf!kTUl8JV1^ zd#%>ld^7u?saSj`a(Q5+iEEb8+oDVB&K-Iy7bAM_2mJvUUF{du;j3*GZt~L z>8PkicL&VX9H1RJ;+{~x$nI4i6q|XOx$QUB6qlFA&r?s>^+YRNF@N8KmbQF#=Z3b0 z=4Vz_#VDjJdz?{`{k~wS;+%k!DhmU9)R#TIJN%6;YtHSN#`=23x^fp>+Cq6rac+9t z;NLjSM;tQRRtWRu>qgl6)K~R9P8nGI!sf;j@78!5vstgTK5TMeCx$r;=sI7!t<6^G z$Dub0`hWF)K3s|F^}<;LL$^NQrr0`X##T<%Z0QP9n_M|$-DvZTFux&%Zx;?+O2KR zUSn9^a!ssxq%3dA5HB%S#+(sPdrn$TFAetgRb5uUZ*sRj-?q6%X}OEC*0sU*3pxtx z4^A!*oIj5fX&qxH^!?_{_Owf0GuQ78>OALjIV^E?+=pR-V?K{)8`nDXcCDkL%%d|d z{2YJRkH;VGD!so!!G6KjuFu{XVlr>88&@{(f4@|%r{d$Y=+X1WORL^vLq;5DxbRTTr)6LL zlnkQtl(?dwbF|niCm(Xx(2ixV(6CQ0-Tk9_akNBBoMW1u>?)H86AAC4-k)81`>eA0 z@%Ow(L-VCW46RwYaG93pVO!IvU1DbYK8T!t<#qn&oHL><#bWDN_P0Mv zw)PAxd(U%y5v!d@>Yv#K-$3pNaQ8&c9DF5y?9 z|Ht0(dwTzJ-%fbg;K)B_AH!+CbBT3gQF&PF&%|e*=gftVmGu<7e4cp9Y|M+g?#ow? zW_~VfdOPmIltBeMW1cI0y0`XyV$PZvZ??{tbE0cUtm%-*+;*`0{*HoN?_^uOo$rpm z>)=is>^(*Lwc}zBrSd%u30oV~W~ZIrb9b`nh$(HB13I^8EM2$r23OXg`AzgA|J-*$ zeiQzf?KbqRwE05kgxmgGht8S&v}#uDdHstWJw0VxU)yTgj`?KTlXtt}th0%7>krGn zKVhkA#((~=ieoo_EG#u{d^v2|x%EZa!$fDDHA>hn9e2Az*_6$8QeEmO zzsbNg#xhgo&zP+))7P*n#n{7S*>0LClf#Z zMSIzLZPvQ#&)YVdJ&<i{_pvJI&L5y!v(X1{W2d z4QDvb!=CPX6<|Jm$Ityt?n4o^gZ`uiG+XFN-0mP6G1l)^#s|ZD(Op0 zo~Y_MSMAuk*`RvxM)944?(co8t0{40XoFOO=nBo6;ra!(-kqCjUv|$i>>f3I_0$dV zVYQJhn_6bhcs5cdQGaBV)v500oqD5hm@PlWl?~W$U+pDi#aCgM=as(98<=6XwtJOi z?Uo-yMg`upbXuX+b*fq+VD?f6vj>mTPLKHBq?jHbS$-)Z&8%?s{-}}(KBuh*HSjxv2>;&wKx2U0y`R^cZ+-Y}?y2rOv5!A@PB>xzGPBTV$IwgfwZA-G z-gD0Gx_ym7=)36BK#>Ivj-02Hvs%wz4dikUC*1i*gjQExYVTXItYp}FpE&D{l+D(4 z=0$Jc6l$`qX1~yZ#SNmilY?mR0vEf644pm8tg4`DNx@f3NI?#p-UQ{IkQSE=rVp-X7KF{5n?E z?EOZeq**`yk_w)wUXvKoDtF1%}TWSc@Oi)aF)B=4QDMJ@Rs=uvyM%0c<0$UL%pmxbJ*coT2aaIYp&0;&M((ck#fr& zR3o3-*p+x_G^hCGt{Cncz1iVE)+uvN{dTDHm|nPIbaJM%cX5T!bqPCm`inLjOU20> z5<_24t8*x^{&}y;Fl@xegH_`*M;`SrhbtZ z#yRUdCUK=iV@!4QMzc*h%k=|o_`IM)0W(yThE;^AJKvfR@9ERw^+)H`;c=|2(}o*A zJ6osUV`UFWyWs8P9JGx!*vn$?LmiHJx`Yicy>LZJ+|Hh!;~owFG>=ieWh5npCF3?W zfjwdJ0o8&aBkO0TU8-;Q8rkn^^9z^|S0=P~sm_2)d!8$c%Gw*VHz+9ob^UTgRx3-) zZuuz1-xGi2%+`@rZd<%kQ}(khJ8k*+sQIgNToYUxI(+8k4B*;{`#QyLH{7$qw&1e4 zh0?XgEdQ0U2^RXtV^;W%U&A@$CgiNWNBodbLc0HZG52z5%Q*AfaiuSHI!mpJxJRCB zs=jGqm^4e@;h&Z z#AgrFby%kIo7AFGUE9f0S>i1*OLzM%7#dJ?%T{-_TtrG;@8`8_8vfgY((E&?{HxY; z$Ha2&cwqN`xmSv^91g^ojjr%sMafF4wCCP{e z%dgi@3A6X{&W-Py@TKeyFFbf<*AvmSee*Nw^%lqS<5UOkcqaSD7h7ksqHvcH4JGFW zdUU3V&z$k`so6VTxvR5L_|x+y$zv-`P7bcs$Upr%ckb`1wW(hm4%xSlwBc*8EJurE zi*b`rOmg>BRUPcguIn+f4F6+&SoF&a%0H8*ZC#Mdo-(^l-Fn4fYkz~5MHiNE4Lv(9 z-5+<^+to!W)ZEl-cF|S#hsOs>BBuCj4&@9z7%O(8_+XA~tbOk%Hp}@Pi`4hFv``Ws zr7|_7yfSpvOCPJasQc}4$H(U9_WsMJ)2&~if;J)rNH|0z;8oTUkyE86ztYhU=sad=&N-T zi%xw^-{1OsS8Hs&*Flci<)byWqaVDe588P>m=lp3((&oGTGs&6Y^iU0Z8!h(8KbL=U;-w;p!oF#FcC1p0Q)PCe_nwSffDo_suIkvM2QxjhM`1&f%*lM zKnWFx;9>%HCUhp~IekvBrl&c<{7RHyXF@a5`#P9_2?Gyu1ttO}*qIO%znoAaP=cMw zFFFJ-fQf(!iitqQzrTPIDEYUEUw;oJ0wvg){K`Y{3Y-X>U}qvw@vkp{M1TbI>%VOD z`z@G&Nk0y>FTq5>1dlm1Bv`-_BwE2rf0p+$9q`IRui!!Q*IY6(HoyMM)F4&4c=34wwE7D|W(`iWvfSAsZ_ zzzvECoe5eFVFD#kLM+fv>`drN@SM}<20Ig~6SN${1oJBu32F&Jf}IHi5-{n<1n3tncz=VMZxdIab6YNX~ieFAB5h%eM{eICQcmYfVOi)Y& zD*pWilt9V9P5kS$PJW039&#wku#wy z!2sLm200U|6U?uK334V>B&a0>33et7NWi2Y6MSo!Dg`}$B0(`BNbueq1|(S1 z3z%SMLU)3eLzrM^LRW&GLzLjXISfirOb8RquV6wfFq~ilCJa2t6$V&36Z9N`668$4 zgkYebC?-%s*FkQe1WJen`iY$hT?uw3eQuC5p*q3*N|@kbn2H3ogdjoAgaHYd^kagY z2~`Su4sn8>Lq&pOLXaS5!hi%h69E(KOz2L~atIUbOz29`bBGe;Oc<1)m=GqIU%`Y} zU^u}9Oc;2OD-5u7Cg?c=CCHh83Bf==QB0tOu7lh_36u~E^bFck@E2|Bj^)6RH&S9O48$hl&KngdjoAgaHY1CITkdnb4h}=MW{xnJ_3pF(FJazk&&|z;J>Im@x1lR~TUFOwe-#N{}-F6M}($qL@GlT?e^= z5-1@S=qGk2bS2oC^tnOKgz5zID`A3%VJZ^T5`qLd69yz;(vJypCR8ctIm8Ki4iyQC z2|{%OOm#GodR%&ml^XGhtAIVnUc;egzX^f#C!bFk#?9t}wvT znV{zglptpUCIkchL@|L9x(;#!B~U^v&`<14=t{6N>2rge3DpVaSHc7j!&D@wB?Jj_ zCJacxq#qOHOsG=ObBGi494ZnN6M_Ue69y#6nFyF*XF_*^mP43eXF^wkocR=V8XzITw#EvGeOT0C_&ByOb7=0iDCjJbRFadN}z;Tpr6>8(3N0k z(&q*_6RH!;uY?I6hN(zUO9&F=Oc;=WNk1mYnNX#m=MX38IaDMlCIks`CJacBGZ8Ss z&V=p+Er&3{&V;T6J%=bk&V)e;iV0zY`4vov1%?w$z=VMZxxxTTXM&z1P=cHZm=Fx~ z6U78d=sL&^lt2lwKtHiFp)0}8q|XgOc;R z7^WgYEg?vdGhsjiCjFQoXF`>Nod_&I}^GR z^c0!&!HkgF(F8h zGhsl2oQZ%5b|!QuXgP!lb|!Qs=s83QawZH)P)rCD%&%ZVEHIp40wxSR$Q1@yIurC9 zffD3Qz=U9+pC~3!Lf1iVpae>Y1^S7d30(`drR&~gY9>`drN&~u0q;@J%@?}#e^V1&V&I8awY;M*qP9s zpyd!I*qP9kpyv=J$eA!GK`|jrFu#HcvA}SG379bOAXgY*=}gdb1WJ%I0TY6OexjH_ z30()dff6Vo7U(B-CUhm(ne@3q&V=d&^DAM3hhZub)DnUOITHpXVA78Xawb$M=sCm* zdJYu{iU~o2oCyOG zs3immawZH&z@#4&hi&~u0r^c*S@6cd63ITHpX$e9S3U}r*if|f&=U}r*Cf}TT^ zAZNm$1jU3f!Tbs)!~(+!CSbzAgIr;Nr87a#5hy{<1WX79`iWu!C3GF+21=lWSfHQS znb4JBXVT{eITNZA%&&wA9)_t%P)i6B3pyv=L=s8p*C?*66awZH& zkTVf5!On#41TBX!!On!P1U-i+LC%Ch35p3}g83Cphy{idOu&SJ2f4xkOJ{1{1oJDH z5DN?^n1Bfb4|0V8md*q{N1y~b6EGnd=qHK^l+bmM8z_MiVu5~QXF^wkok^b?he zFuxKeco?Q4K`kLjkTYRG0w(>KAZJ3Af}TU1pyyDLpqLOO$eA!8LC!?L1UnPD6SN${ z1UnPD67(FR1UVB1B`79@3FcQYAr=@;FaZ+=9^?uGES(8@jz9@=CSXD^&`%T-D52{h zH&6m4!~*@q&V;T6JCi;)$eB=`V16Y`@Gwk8f?7h5AZNmW1WfudLC%CK1wDs2LC>Kg zK`|jnkTYRGf}Dwf33euQCuli@33euQCFnUs334V3N>EG)6U?t*LM$+xU;-u#JjfLW zSUMB*9Dx$#Ou&R-pr0rvP(s&1ZlDB8hz0tIoe5nDb|!spkTan=!Td^?;9;1G1hs@9 zLC%B$37GU_f}9Ce3VIH4f}TS~f?`6DAZNmW1UVA{6YNarPSA1)6YNarO3-tN668!6 zl%SXpCYWErgjirW!30bgc#ta$uyiKqIRYifnScqwKtEATpoFf2+&~GG5DWAZI}^GR z>`eOHAZJ2#g87v&!NV{W32F&Jf}9Bh5-{n<1UVC`6!aY81U-j}1jU3PLC%B$334U^ zCfJ$KouK6qCfJ$Km7wPkCCHgDC_ynHOfbKK39-O%f(e)~@E}(hVChWIa|B9|GXWEV zfqtTxKnYz3xq%WWAr|N-b|!Qs*qQXXLC%Eg1oJClf`?%$64Vlc1UVB1Bw*5y334V> zDd;)G33?6{35p3pf}9Bh668z-Ot3SdJ3-4KOt3SdD?!g8N{};QP=aDYm|%Vd6Jmkk z1QRe};6bi1z|xtZ=LnP_X96Y!1N}rXffBk7aswq$LM+fv>`drNuruj%gPaM~3FcSA z1P{YhB&a0>334V3NWi2Y6XZ;&QqXgV6Z9M^5)>1H1UVB1B*>Wvm|$l@cY>Bfm|$l@ cSAw2HlptrqpajK)Fv0u^Cd2~6*^kNp0nXzSxBvhE literal 0 HcmV?d00001 diff --git a/projects/music-player/songs/song2.m4a b/projects/music-player/songs/song2.m4a new file mode 100644 index 0000000000000000000000000000000000000000..13c7c3d87b95ff23367ce6aabbd6f36b705afcab GIT binary patch literal 401133 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 YOl0ez8!#azc$tt2Hb4m};dajd0W&qUWdHyG literal 0 HcmV?d00001 diff --git a/projects/music-player/songs/song3.m4a b/projects/music-player/songs/song3.m4a new file mode 100644 index 0000000000000000000000000000000000000000..02ba7a4b6dded7f0f208b3f26240cc6c4ff4467c GIT binary patch literal 377289 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 R;% + + + Stopwatch + + + +
00:00:00
+
+ + + +
+ + + diff --git a/projects/simple-stopwatch/stopwatch.js b/projects/simple-stopwatch/stopwatch.js new file mode 100644 index 0000000..df0d14a --- /dev/null +++ b/projects/simple-stopwatch/stopwatch.js @@ -0,0 +1,78 @@ +// Get references to the timer and button elements +var timer = document.getElementById("timer"); +var startButton = document.getElementById("start"); +var stopButton = document.getElementById("stop"); +var resetButton = document.getElementById("reset"); + +// Initialize variables for tracking the start time, elapsed time, and timer interval +var startTime, + elapsedTime = 0, + timerInterval; + +// Function to start the timer +function startTimer() { + // Calculate the start time by subtracting the elapsed time from the current time + startTime = Date.now() - elapsedTime; + + // Start an interval that updates the timer display every 10 milliseconds + timerInterval = setInterval(function printTime() { + // Calculate the elapsed time by subtracting the start time from the current time + elapsedTime = Date.now() - startTime; + + // Update the timer display with the formatted elapsed time + timer.textContent = formatTime(elapsedTime); + }, 10); + + // Disable the start button and enable the stop button + startButton.disabled = true; + stopButton.disabled = false; +} + +// Function to stop the timer +function stopTimer() { + // Clear the interval that updates the timer display + clearInterval(timerInterval); + + // Enable the start button and disable the stop button + startButton.disabled = false; + stopButton.disabled = true; +} + +// Function to reset the timer +function resetTimer() { + // Clear the interval that updates the timer display + clearInterval(timerInterval); + + // Reset the elapsed time to 0 and update the timer display + elapsedTime = 0; + timer.textContent = "00:00:00"; + + // Enable the start button and disable the stop button + startButton.disabled = false; + stopButton.disabled = true; +} + +// Function to format the elapsed time as a string +function formatTime(time) { + var hours = Math.floor(time / (1000 * 60 * 60)); + var minutes = Math.floor((time % (1000 * 60 * 60)) / (1000 * 60)); + var seconds = Math.floor((time % (1000 * 60)) / 1000); + var milliseconds = Math.floor((time % 1000) / 10); + // The ternary operator hours ? (hours > 9 ? hours : "0" + hours) : "00" checks if the hours variable has a value greater than zero. If it does, it checks if it is greater than 9. If it is, it returns the value of hours. If it is less than or equal to 9, it adds a leading zero to the hours value and returns it. If hours is zero, it returns the string "00". + + // The same logic is applied to format the minutes and seconds values. + return ( + (hours ? (hours > 9 ? hours : "0" + hours) : "00") + + ":" + + (minutes ? (minutes > 9 ? minutes : "0" + minutes) : "00") + + ":" + + (seconds ? (seconds > 9 ? seconds : "0" + seconds) : "00") + + "." + + (milliseconds > 9 ? milliseconds : "0" + milliseconds) + ); +} + +// Add event listeners to the button elements to trigger the timer functions +startButton.addEventListener("click", startTimer); +stopButton.addEventListener("click", stopTimer); +resetButton.addEventListener("click", resetTimer); diff --git a/projects/simple-stopwatch/style.css b/projects/simple-stopwatch/style.css new file mode 100644 index 0000000..f1a4e31 --- /dev/null +++ b/projects/simple-stopwatch/style.css @@ -0,0 +1,56 @@ +body { + background-color: #f0f0f0; + font-family: "Poppins", sans-serif; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + height: 100vh; + overflow: hidden; +} + +#timer { + font-size: 7rem; + font-weight: 700; + color: #f92672; + text-shadow: 2px 2px #f8a5c2; + /* In the current code, the value 2px 2px #f8a5c2 sets a shadow that is 2 pixels to the right and 2 pixels down of the text, with a blur radius of 0 (no blur), and a color of #f8a5c2. */ + width: 600px; + text-align: center; + margin: 40px auto; +} + +#buttons { + display: flex; + justify-content: center; +} + +button { + background-color: #f92672; + color: white; + border: none; + border-radius: 30px; + font-size: 2rem; + font-weight: bold; + padding: 1.5rem 4rem; + /* In the current code, the value 1.5rem 4rem sets a padding of 1.5rem (24px) for the top and bottom sides of the buttons, and 4rem (64px) for the left and right sides of the buttons. */ + margin: 1rem; + cursor: pointer; + transition: background-color 0.2s; + box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.3); +} + +button:hover { + background-color: #f44583; + box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.5); +} + +button:active { + background-color: #f34282; + box-shadow: none; +} + +button[disabled] { + opacity: 0.5; + cursor: default; +} From d464c78ce257eefe24f2746dd6ead420107a0baa Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Mon, 6 Mar 2023 08:16:47 +0700 Subject: [PATCH 35/54] update image search app project --- projects/image-search-app/index.html | 51 ++++++-- projects/image-search-app/index.js | 54 ++++++++ projects/image-search-app/style.css | 183 ++++++++++----------------- 3 files changed, 163 insertions(+), 125 deletions(-) create mode 100644 projects/image-search-app/index.js diff --git a/projects/image-search-app/index.html b/projects/image-search-app/index.html index 92e769d..47214ed 100644 --- a/projects/image-search-app/index.html +++ b/projects/image-search-app/index.html @@ -2,27 +2,56 @@ - Unsplash Image Search App + + + Image Search App

Image Search App

-
+ - +
-
+
- - - + + diff --git a/projects/image-search-app/index.js b/projects/image-search-app/index.js new file mode 100644 index 0000000..87a94e1 --- /dev/null +++ b/projects/image-search-app/index.js @@ -0,0 +1,54 @@ +const accessKey = "RZEIOVfPhS7vMLkFdd2TSKGFBS4o9_FmcV1Nje3FSjw"; + +const formEl = document.querySelector("form"); +const searchInputEl = document.getElementById("search-input"); +const searchResultsEl = document.querySelector(".search-results"); +const showMoreButtonEl = document.getElementById("show-more-button"); + +let inputData = ""; +let page = 1; + +async function searchImages() { + inputData = searchInputEl.value; + const url = `https://api.unsplash.com/search/photos?page=${page}&query=${inputData}&client_id=${accessKey}`; + + const response = await fetch(url); + const data = await response.json(); + if (page === 1) { + searchResultsEl.innerHTML = ""; + } + + const results = data.results; + + results.map((result) => { + const imageWrapper = document.createElement("div"); + imageWrapper.classList.add("search-result"); + const image = document.createElement("img"); + image.src = result.urls.small; + image.alt = result.alt_description; + const imageLink = document.createElement("a"); + imageLink.href = result.links.html; + imageLink.target = "_blank"; + imageLink.textContent = result.alt_description; + + imageWrapper.appendChild(image); + imageWrapper.appendChild(imageLink); + searchResultsEl.appendChild(imageWrapper); + }); + + page++; + + if (page > 1) { + showMoreButtonEl.style.display = "block"; + } +} + +formEl.addEventListener("submit", (event) => { + event.preventDefault(); + page = 1; + searchImages(); +}); + +showMoreButtonEl.addEventListener("click", () => { + searchImages(); +}); diff --git a/projects/image-search-app/style.css b/projects/image-search-app/style.css index 07fc2e5..875a68a 100644 --- a/projects/image-search-app/style.css +++ b/projects/image-search-app/style.css @@ -1,170 +1,125 @@ body { - background-color: #f9f9f9; /* Sets the background color of the body element to a light gray */ - font-family: Arial, sans-serif; /* Sets the font family of the text inside the body to Arial or a generic sans-serif font */ - font-size: 16px; /* Sets the font size of the text inside the body to 16 pixels */ - line-height: 1.6; /* Sets the line height of the text inside the body to 1.6 times the font size */ - color: #333; /* Sets the color of the text inside the body to a dark gray */ + background-color: #f9f9f9; + font-family: Arial, Helvetica, sans-serif; + line-height: 1.6; + margin: 0; } h1 { - font-size: 36px; /* Sets the font size of the h1 heading to 36 pixels */ - font-weight: bold; /* Makes the h1 heading bold */ - text-align: center; /* Centers the h1 heading horizontally within its container */ - margin-top: 40px; /* Adds a top margin of 40 pixels to the h1 heading */ - margin-bottom: 60px; /* Adds a bottom margin of 60 pixels to the h1 heading */ + font-size: 36px; + font-weight: bold; + text-align: center; + margin-top: 40px; + margin-bottom: 60px; } -#search-form { - display: flex; /* Set the display property of the element to flex */ - justify-content: center; /* Center the child elements horizontally */ - align-items: center; /* Center the child elements vertically */ - margin-bottom: 60px; /* Add a bottom margin of 60 pixels to the element */ +form { + display: flex; + justify-content: center; + align-items: center; + margin-bottom: 60px; } #search-input { - width: 60%; /* Set the width of the element to 60% of its container */ - max-width: 400px; /* Set the maximum width of the element to 400 pixels */ - padding: 10px 20px; /* Add 10 pixels of padding to the top and bottom and 20 pixels of padding to the left and right of the element */ - border: none; /* Remove the border from the element */ - border-radius: 5px; /* Add a 5-pixel radius to the element's border corners */ - box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.2); /* Add a 5-pixel box shadow to the element */ - font-size: 18px; /* Set the font size of the element to 18 pixels */ - color: #333; /* Set the text color of the element to #333 */ + width: 60%; + max-width: 400px; + padding: 10px 20px; + border: none; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.2); + border-radius: 5px; + font-size: 18px; + color: #333; } #search-button { - padding: 10px 20px; /* Sets the padding of the button */ - background-color: #4caf50; /* Sets the background color of the button */ - color: white; /* Sets the text color of the button */ - font-size: 18px; /* Sets the font size of the button text */ - border: none; /* Removes the border of the button */ - border-radius: 5px; /* Sets the border radius of the button */ - box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.2); /* Sets the box shadow of the button */ - cursor: pointer; /* Changes the cursor to pointer when hovering over the button */ - transition: background-color 0.3s ease-in-out; /* Sets the transition effect when the background color changes */ + padding: 10px 20px; + background-color: #4caf50; + color: white; + border: none; + font-size: 18px; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.2); + cursor: pointer; + border-radius: 5px; + transition: background-color 0.3s ease-in-out; } #search-button:hover { - background-color: #3e8e41; /* Changes the background color when hovering over the button */ + background-color: #3e8e41; } -#search-results { - display: flex; /* sets the display type of the element to flex*/ - flex-wrap: wrap; /* allows the flex items to wrap to multiple lines*/ - justify-content: space-between; /* aligns the flex items along the main axis with equal spacing between them*/ - margin: 0 auto; /* sets the top and bottom margins to 0 and the left and right margins to auto*/ - max-width: 1200px; /* sets the maximum width of the element to 1200 pixels*/ +.search-results { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + max-width: 1200px; + margin: 0 auto; + padding: 20px; } -/* Sets the styles for an individual search result element */ .search-result { - /* Adds 60px margin to the bottom of each search result element */ margin-bottom: 60px; - - /* Sets the width of the search result element to 30% of the parent container */ width: 30%; - - /* Adds rounded corners to the search result element */ border-radius: 5px; - - /* Adds a box shadow to the search result element */ - box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.2); - - /* Hides any content that overflows the search result element */ + box-shadow: 0 0 5px rgba(0, 0, 0, 0.2); overflow: hidden; } +.search-result:hover img { + transform: scale(1.05); +} + .search-result img { - /* Sets the width of the image to 100% of its container element */ width: 100%; - - /* Sets the height of the image to 200 pixels */ height: 200px; - - /* Determines how the image should be resized to cover its container without distorting its aspect ratio */ object-fit: cover; - - /* Specifies that any changes to the transform property of the image should be transitioned over a duration of 0.3 seconds with an easing function */ transition: transform 0.3s ease-in-out; } - -.search-result:hover img { - transform: scale(1.05); - /* The transform property scales the image by 1.05, making it 5% larger than its original size. This creates a zoom effect when the user hovers over the image. */ -} - .search-result a { - display: block; /* sets the display type to block */ - padding: 10px; /* adds padding to the top and bottom of the element */ - color: #333; /* sets the text color to dark gray */ - text-decoration: none; /* removes any text decoration */ - transition: background-color 0.3s ease-in-out; /* sets a transition effect when the background color changes */ + padding: 10px; + display: block; + color: #333; + text-decoration: none; + transition: background-color 0.3s ease-in-out; } -.search-result a:hover { - background-color: rgba( - 0, - 0, - 0, - 0.1 - ); /* changes the background color to a light gray when the element is hovered over */ +.search-result:hover a { + background-color: rgba(0, 0, 0, 0.1); } #show-more-button { - background-color: #008cba; /* Sets the background color of the button to a shade of blue */ - border: none; /* Removes the border around the button */ - color: white; /* Sets the font color of the button text to white */ - padding: 10px 20px; /* Sets the padding of the button to 10px on the top and bottom, and 20px on the left and right */ - text-align: center; /* Centers the button text horizontally */ - text-decoration: none; /* Removes any text decoration such as underlining */ - display: inline-block; /* Displays the button as an inline-level block container */ - font-size: 16px; /* Sets the font size of the button text to 16px */ - border-radius: 5px; /* Rounds the corners of the button to 5px */ - margin-top: 20px; /* Adds a 20px margin on the top of the button */ - transition: background-color 0.3s ease; /* Specifies a transition effect for the background color when hovering over the button */ - display: none; /* Hides the button */ - margin: 0 auto; /* Centers the button horizontally */ - margin-bottom: 40px; /* Adds a 40px margin on the bottom of the button */ - cursor: pointer; /* Sets the cursor to a pointer when hovering over the button */ + background-color: #008cba; + border: none; + color: white; + padding: 10px 20px; + display: block; + margin: 20px auto; + text-align: center; + border-radius: 5px; + cursor: pointer; + transition: background-color 0.3s ease-in-out; + display: none; } #show-more-button:hover { - background-color: #0077b5; /* Changes the background color of the button to a darker shade of blue when hovering over it */ + background-color: #0077b5; } -/* This is a CSS media query, which applies different styles based on the size of the screen. - -The first media query applies when the screen width is a maximum of 768px. In this case, it changes the justify-content property of #search-results to center the search results horizontally. It also changes the width of .search-result to 45%. - -The second media query applies when the screen width is a maximum of 480px. In this case, it changes the flex-direction property of #search-form to column, which stacks the search input and button vertically. It also adds a margin bottom to #search-input and changes the width of .search-result to 100%, making each search result take up the full width of the screen. */ - -/* The following styles will apply when the screen size is 768px or smaller */ @media screen and (max-width: 768px) { - /* Centers the search result items */ - #search-results { - justify-content: center; - } - - /* Decreases the width of each search result item */ .search-result { width: 45%; } } - -/* The following styles will apply when the screen size is 480px or smaller */ @media screen and (max-width: 480px) { - /* Changes the direction of the search form to be vertical */ - #search-form { + .search-result { + width: 100%; + } + + form { flex-direction: column; } - /* Adds margin to the bottom of the search input */ #search-input { margin-bottom: 20px; - } - - /* Makes each search result item full width */ - .search-result { - width: 100%; + width: 85%; } } From 55fd9ba11128e1f1b19ba2eb4acdf882e5100572 Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Wed, 8 Mar 2023 06:22:15 +0700 Subject: [PATCH 36/54] update basic calculator project --- projects/basic-calculator/index.html | 61 +++++++++-------- projects/basic-calculator/index.js | 29 ++++++++ projects/basic-calculator/style.css | 98 ++++++++++++---------------- 3 files changed, 103 insertions(+), 85 deletions(-) create mode 100644 projects/basic-calculator/index.js diff --git a/projects/basic-calculator/index.html b/projects/basic-calculator/index.html index f9cf785..432ea60 100644 --- a/projects/basic-calculator/index.html +++ b/projects/basic-calculator/index.html @@ -1,32 +1,35 @@ - - - Simple Calculator - - - + + + + + + Basic Calculator + + +
-

-
- - - - - - - - - - - - - - - - - -
+ +
+ + + + + + + + + + + + + + + + + +
- - - + + + \ No newline at end of file diff --git a/projects/basic-calculator/index.js b/projects/basic-calculator/index.js new file mode 100644 index 0000000..40fa6e8 --- /dev/null +++ b/projects/basic-calculator/index.js @@ -0,0 +1,29 @@ +const buttonsEl = document.querySelectorAll("button"); + +const inputFieldEl = document.getElementById("result"); + +for (let i = 0; i < buttonsEl.length; i++) { + buttonsEl[i].addEventListener("click", () => { + const buttonValue = buttonsEl[i].textContent; + if (buttonValue === "C") { + clearResult(); + } else if (buttonValue === "=") { + calculateResult(); + } else { + appendValue(buttonValue); + } + }); +} + +function clearResult() { + inputFieldEl.value = ""; +} + +function calculateResult() { + inputFieldEl.value = eval(inputFieldEl.value); +} + +function appendValue(buttonValue) { + inputFieldEl.value += buttonValue; + // inputFieldEl.value = inputFieldEl.value + buttonValue; +} diff --git a/projects/basic-calculator/style.css b/projects/basic-calculator/style.css index dbf9d16..baf4abd 100644 --- a/projects/basic-calculator/style.css +++ b/projects/basic-calculator/style.css @@ -1,82 +1,68 @@ * { box-sizing: border-box; + margin: 0; } -/* By setting box-sizing: border-box on all elements, we are ensuring that any padding or border we add to an element will be included in its total size. */ - .calculator { + background-color: #f2f2f2; + padding: 20px; max-width: 400px; margin: 0 auto; - margin-top: 30px; - padding: 20px; - background-color: #f2f2f2; - border: 1px solid #ccc; - border-radius: 5px; + border: solid 1px #ccc; box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3); -} - -#result { - width: 100%; - padding: 10px; - font-size: 24px; - border: none; border-radius: 5px; - box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3) inset; - - /* In this case, the box-shadow property is set to 0 2px 5px rgba(0, 0, 0, 0.3) inset. This means that the shadow will have no horizontal offset (0), a vertical offset of 2px, a blur radius of 5px, and a color of rgba(0, 0, 0, 0.3). The inset keyword is used to specify that the shadow should be an inset shadow, rather than an outset shadow. */ + margin-top: 40px; } -.buttons { - display: grid; - grid-template-columns: repeat(4, 1fr); - /* grid-template-columns: repeat(4, 1fr) is a CSS property that sets the size of each column in a grid container. In this case, the repeat(4, 1fr) value creates a grid with four equal-sized columns. - -The fr unit stands for "fractional unit" and is used to divide the available space in a grid container. In this case, each column takes up an equal fraction of the available space, regardless of the size of the container. - -So, with grid-template-columns: repeat(4, 1fr), the grid container will be divided into four equal-sized columns, which is what we want for our calculator layout. */ - grid-gap: 10px; - margin-top: 20px; +#result{ + width: 100%; + padding: 10px; + font-size: 24px; + border: none; + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3) inset; + border-radius: 5px; } -button { - padding: 10px; - font-size: 24px; - border: none; - border-radius: 5px; - box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3); - cursor: pointer; - transition: background-color 0.3s ease; +.buttons{ + display: grid; + grid-template-columns: repeat(4, 1fr); + grid-gap: 10px; + margin-top: 20px; } -button:hover { - background-color: #ddd; -} +button{ + padding: 10px; + font-size: 24px; + border: none; + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.3); + border-radius: 5px; + cursor: pointer; + transition: background-color 0.3s ease; -.clear { - background-color: #ff4136; - color: #fff; } -.operator { - background-color: #0074d9; - color: #fff; +button:hover{ + background-color: #ddd; } -.number { - background-color: #fff; - color: #333; +.clear{ + background-color: #ff4136; + color: #fff; } -.equals { - grid-row: span 3; - /* grid-row: span 3; is a CSS property that sets the number of rows an element spans in a CSS grid container. +.number, .decimal{ + background-color: #fff; + color: #333; -In this case, span 3 is used to make the element span three rows in the grid container. */ - background-color: #01ff70; - color: #fff; } -.decimal { - background-color: #fff; - color: #333; +.operator{ + background-color: #0074d9; + color: #fff; } + +.equals{ + background-color: #01ff70; + grid-row: span 3; + color: #fff; +} \ No newline at end of file From d3c6e3cd7298a19708f63513d404b20e4bd4df6b Mon Sep 17 00:00:00 2001 From: Sahand Ghavidel Date: Fri, 10 Mar 2023 14:12:23 +0700 Subject: [PATCH 37/54] Update README.md --- README.md | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 0f57702..e54352e 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,15 @@ -# HTML-CSS-JavaScript-projects-for-beginners - -This is the source code of the YouTube video (10 projects) https://www.youtube.com/watch?v=ePzOFu2xXUQ. - -Part 2 (16 projects) : https://youtu.be/EWv2jnhZErc - -NEW HTML CSS JavaScript Projects Interesting HTML CSS JavaScript projects Learn HTML, CSS, and JavaScript 2021 to create modern websites. Fun learning HTML, CSS, and JavaScript! - -I'm Sahand, a web developer in computer science. I've been doing this for over a decade. This course was created to share my knowledge and experience with you. Build simple websites using HTML, CSS, and JavaScript. Responsive web design employs HTML, CSS, and JavaScript. This is a skill you'll learn in this course. This new course teaches students how to install Visual Studio Code and its extensions. Then we start from scratch with each project. After finishing HTML, it's on to CSS and JavaScript. Building in HTML, CSS, or JavaScript is fine. This guide explains HTML, CSS, and JavaScript syntax. - -Every project is started from scratch and finished without using copied code. Then they are used on the project to ensure everyone understands. This program's exciting project-based curriculum includes building modern, super cool, and responsive websites! Let's get started learning HTML, CSS, and JavaScript. - -Contact me if you have any questions through my twitter: @codewithsahand. +#
50 HTML CSS JavaScript Projects + +This is the source code of the Udemy course: 50 HTML CSS JavaScript Projects +
+ Visit 100jsprojects.com to preview the projects. + +
+
+

About

+

Hi there! I'm Sahand, a web developer with over a decade of experience. This course, "50 HTML CSS JavaScript Projects," was created to share my knowledge and experience with you. In this course, you'll learn how to build simple, responsive websites using HTML, CSS, and JavaScript.

+

In this course, you'll learn how to install Visual Studio Code and its extensions, and then we'll start from scratch with each project. After finishing HTML, we'll move on to CSS and JavaScript. Building in HTML, CSS, or JavaScript is fine, and this guide will explain HTML, CSS, and JavaScript syntax.

+

Each project in this course is started from scratch and finished without using copied code. Then, we'll go over the code together to ensure that everyone understands. This program's exciting project-based curriculum includes building modern, super cool, and responsive websites!

+

If you have any questions, please feel free to contact me through my Twitter: @codewithsahand.

+ Visit my website +
From ce561ee048ed7f436a0cd0110fdae0e4ab708232 Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Thu, 16 Mar 2023 10:53:15 +0700 Subject: [PATCH 38/54] update and clean files --- projects/basic-calculator/script.js | 35 ---------- projects/image-search-app/app.js | 70 ------------------- projects/new-year-countdown/index.html | 2 +- projects/new-year-countdown/index.js | 2 +- .../{Q&A-section => q-and-a-section}/app.js | 0 .../index.html | 0 .../styles.css | 0 7 files changed, 2 insertions(+), 107 deletions(-) delete mode 100644 projects/basic-calculator/script.js delete mode 100644 projects/image-search-app/app.js rename projects/{Q&A-section => q-and-a-section}/app.js (100%) rename projects/{Q&A-section => q-and-a-section}/index.html (100%) rename projects/{Q&A-section => q-and-a-section}/styles.css (100%) diff --git a/projects/basic-calculator/script.js b/projects/basic-calculator/script.js deleted file mode 100644 index c898ec4..0000000 --- a/projects/basic-calculator/script.js +++ /dev/null @@ -1,35 +0,0 @@ -const resultField = document.getElementById("result"); -const buttons = document.querySelectorAll("button"); - -for (let i = 0; i < buttons.length; i++) { - const button = buttons[i]; - button.addEventListener("click", function () { - const buttonValue = button.textContent; - if (buttonValue === "C") { - clearResult(); - } else if (buttonValue === "=") { - calculate(); - } else { - appendValue(buttonValue); - } - }); -} - -function appendValue(val) { - resultField.value += val; -} - -function clearResult() { - resultField.value = ""; -} - -function calculate() { - const expression = resultField.value; - const result = eval(expression); - // In JavaScript, eval() is a built-in function that evaluates a string as if it were a JavaScript code and returns the result. It can be used to dynamically evaluate expressions or code that is generated at runtime. - - // In the context of a calculator, eval() can be used to evaluate the arithmetic expression entered by the user and return the result. - - // For example, if the user enters the expression "2 + 3 * 4", eval("2 + 3 * 4") will return 14, which is the result of evaluating the expression. - resultField.value = result; -} diff --git a/projects/image-search-app/app.js b/projects/image-search-app/app.js deleted file mode 100644 index e342813..0000000 --- a/projects/image-search-app/app.js +++ /dev/null @@ -1,70 +0,0 @@ -// Set the access key for the Unsplash API -const accessKey = "3I7M0FgMDBz0BC9OMC4e4wi9ByTMXZYt0Rk4fQ15TKs"; - -// Get elements from the HTML document using their IDs -const searchForm = document.getElementById("search-form"); -const searchInput = document.getElementById("search-input"); -const searchResults = document.getElementById("search-results"); -const showMoreButton = document.getElementById("show-more-button"); - -// Initialize variables -let page = 1; -let query = ""; - -// Create an asynchronous function to search for images -async function searchImages() { - // Set the query value to the input value from the search form - query = searchInput.value; - // Create the URL for the Unsplash API with the page number, query, and access key - const url = `https://api.unsplash.com/search/photos?page=${page}&query=${query}&client_id=${accessKey}`; - // Send a request to the API and wait for the response - const response = await fetch(url); - // Parse the response data as JSON - const data = await response.json(); - // Get the results array from the response data - const results = data.results; - - // If this is the first page of results, clear the search results div - if (page === 1) { - searchResults.innerHTML = ""; - } - - // Loop through each result and create a div with an image and link for each one - results.forEach((result) => { - const imageWrapper = document.createElement("div"); - imageWrapper.classList.add("search-result"); - - const image = document.createElement("img"); - image.src = result.urls.small; - image.alt = result.alt_description; - - const imageLink = document.createElement("a"); - imageLink.href = result.links.html; - imageLink.target = "_blank"; - imageLink.textContent = result.alt_description; - - imageWrapper.appendChild(image); - imageWrapper.appendChild(imageLink); - searchResults.appendChild(imageWrapper); - }); - - // Increment the page number for the next search - page++; - - // Show the "show more" button if there are more than one page of results - if (page > 1) { - showMoreButton.style.display = "block"; - } -} - -// Listen for a submit event on the search form, prevent the default action, and search for images -searchForm.addEventListener("submit", (event) => { - event.preventDefault(); - page = 1; - searchImages(); -}); - -// Listen for a click event on the "show more" button and search for more images -showMoreButton.addEventListener("click", () => { - searchImages(); -}); diff --git a/projects/new-year-countdown/index.html b/projects/new-year-countdown/index.html index c4c0578..3638291 100644 --- a/projects/new-year-countdown/index.html +++ b/projects/new-year-countdown/index.html @@ -9,7 +9,7 @@

Countdown to New Year

-
2022
+
2024
00
00
diff --git a/projects/new-year-countdown/index.js b/projects/new-year-countdown/index.js index 1a89f36..3ee8cd0 100644 --- a/projects/new-year-countdown/index.js +++ b/projects/new-year-countdown/index.js @@ -3,7 +3,7 @@ const hourEl = document.getElementById("hour"); const minuteEl = document.getElementById("minute"); const secondEl = document.getElementById("second"); -const newYearTime = new Date("Jan 1, 2022 00:00:00").getTime(); +const newYearTime = new Date("Jan 1, 2024 00:00:00").getTime(); updateCountdown(); diff --git a/projects/Q&A-section/app.js b/projects/q-and-a-section/app.js similarity index 100% rename from projects/Q&A-section/app.js rename to projects/q-and-a-section/app.js diff --git a/projects/Q&A-section/index.html b/projects/q-and-a-section/index.html similarity index 100% rename from projects/Q&A-section/index.html rename to projects/q-and-a-section/index.html diff --git a/projects/Q&A-section/styles.css b/projects/q-and-a-section/styles.css similarity index 100% rename from projects/Q&A-section/styles.css rename to projects/q-and-a-section/styles.css From e62d1612cced50fd90ddb8083119370e5aa72a54 Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Thu, 16 Mar 2023 10:56:48 +0700 Subject: [PATCH 39/54] clean files 2 --- projects/Navbar-project/index.html | 34 ----------------- projects/navbar/index.html | 38 +++++++++++++++++++ projects/{Navbar-project => navbar}/index.js | 0 projects/{Navbar-project => navbar}/logo.svg | 0 .../{Navbar-project => navbar}/styles.css | 0 .../{Sidebar-project => sidebar}/index.html | 0 .../{Sidebar-project => sidebar}/index.js | 0 .../{Sidebar-project => sidebar}/logo.svg | 0 .../{Sidebar-project => sidebar}/styles.css | 0 9 files changed, 38 insertions(+), 34 deletions(-) delete mode 100644 projects/Navbar-project/index.html create mode 100644 projects/navbar/index.html rename projects/{Navbar-project => navbar}/index.js (100%) rename projects/{Navbar-project => navbar}/logo.svg (100%) rename projects/{Navbar-project => navbar}/styles.css (100%) rename projects/{Sidebar-project => sidebar}/index.html (100%) rename projects/{Sidebar-project => sidebar}/index.js (100%) rename projects/{Sidebar-project => sidebar}/logo.svg (100%) rename projects/{Sidebar-project => sidebar}/styles.css (100%) diff --git a/projects/Navbar-project/index.html b/projects/Navbar-project/index.html deleted file mode 100644 index 4975da5..0000000 --- a/projects/Navbar-project/index.html +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - Sahand Ghavidel - - - - - - - - \ No newline at end of file diff --git a/projects/navbar/index.html b/projects/navbar/index.html new file mode 100644 index 0000000..78fd71b --- /dev/null +++ b/projects/navbar/index.html @@ -0,0 +1,38 @@ + + + + + + + Navbar project + + + + + + + + diff --git a/projects/Navbar-project/index.js b/projects/navbar/index.js similarity index 100% rename from projects/Navbar-project/index.js rename to projects/navbar/index.js diff --git a/projects/Navbar-project/logo.svg b/projects/navbar/logo.svg similarity index 100% rename from projects/Navbar-project/logo.svg rename to projects/navbar/logo.svg diff --git a/projects/Navbar-project/styles.css b/projects/navbar/styles.css similarity index 100% rename from projects/Navbar-project/styles.css rename to projects/navbar/styles.css diff --git a/projects/Sidebar-project/index.html b/projects/sidebar/index.html similarity index 100% rename from projects/Sidebar-project/index.html rename to projects/sidebar/index.html diff --git a/projects/Sidebar-project/index.js b/projects/sidebar/index.js similarity index 100% rename from projects/Sidebar-project/index.js rename to projects/sidebar/index.js diff --git a/projects/Sidebar-project/logo.svg b/projects/sidebar/logo.svg similarity index 100% rename from projects/Sidebar-project/logo.svg rename to projects/sidebar/logo.svg diff --git a/projects/Sidebar-project/styles.css b/projects/sidebar/styles.css similarity index 100% rename from projects/Sidebar-project/styles.css rename to projects/sidebar/styles.css From f04e0e3acfb7b2ecf5a58c4f7445432e0d0e3814 Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Thu, 16 Mar 2023 10:58:02 +0700 Subject: [PATCH 40/54] update folder name --- .../background-video.mp4 | Bin .../index.html | 0 .../index.js | 0 .../preloader.gif | Bin .../styles.css | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename projects/{background-video-project => background-video}/background-video.mp4 (100%) rename projects/{background-video-project => background-video}/index.html (100%) rename projects/{background-video-project => background-video}/index.js (100%) rename projects/{background-video-project => background-video}/preloader.gif (100%) rename projects/{background-video-project => background-video}/styles.css (100%) diff --git a/projects/background-video-project/background-video.mp4 b/projects/background-video/background-video.mp4 similarity index 100% rename from projects/background-video-project/background-video.mp4 rename to projects/background-video/background-video.mp4 diff --git a/projects/background-video-project/index.html b/projects/background-video/index.html similarity index 100% rename from projects/background-video-project/index.html rename to projects/background-video/index.html diff --git a/projects/background-video-project/index.js b/projects/background-video/index.js similarity index 100% rename from projects/background-video-project/index.js rename to projects/background-video/index.js diff --git a/projects/background-video-project/preloader.gif b/projects/background-video/preloader.gif similarity index 100% rename from projects/background-video-project/preloader.gif rename to projects/background-video/preloader.gif diff --git a/projects/background-video-project/styles.css b/projects/background-video/styles.css similarity index 100% rename from projects/background-video-project/styles.css rename to projects/background-video/styles.css From 61d4cf2ce5b5525a4cb3dea0ed6b9f8be7079d84 Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Thu, 23 Mar 2023 06:20:56 +0700 Subject: [PATCH 41/54] update stopwatch project --- projects/simple-stopwatch/style.css | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/projects/simple-stopwatch/style.css b/projects/simple-stopwatch/style.css index f1a4e31..bea5522 100644 --- a/projects/simple-stopwatch/style.css +++ b/projects/simple-stopwatch/style.css @@ -54,3 +54,24 @@ button[disabled] { opacity: 0.5; cursor: default; } + +/* add media query */ + +@media (max-width: 800px) { + #timer { + font-size: 4rem; + width: 350px; + } + + button { + font-size: 1.5rem; + padding: 1rem 2rem; + } + +} + + + + +/* add media query for tablet size */ + From 3ff1ee95a8894bdef8f6526ee485f8812474e85e Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Fri, 24 Mar 2023 06:24:51 +0700 Subject: [PATCH 42/54] update stopwatch project --- projects/simple-stopwatch/index.html | 16 ---- projects/simple-stopwatch/stopwatch.js | 78 ------------------- projects/stopwatch/index.html | 20 +++++ projects/stopwatch/index.js | 54 +++++++++++++ .../{simple-stopwatch => stopwatch}/style.css | 26 ++----- 5 files changed, 79 insertions(+), 115 deletions(-) delete mode 100644 projects/simple-stopwatch/index.html delete mode 100644 projects/simple-stopwatch/stopwatch.js create mode 100644 projects/stopwatch/index.html create mode 100644 projects/stopwatch/index.js rename projects/{simple-stopwatch => stopwatch}/style.css (62%) diff --git a/projects/simple-stopwatch/index.html b/projects/simple-stopwatch/index.html deleted file mode 100644 index d61ac22..0000000 --- a/projects/simple-stopwatch/index.html +++ /dev/null @@ -1,16 +0,0 @@ - - - - Stopwatch - - - -
00:00:00
-
- - - -
- - - diff --git a/projects/simple-stopwatch/stopwatch.js b/projects/simple-stopwatch/stopwatch.js deleted file mode 100644 index df0d14a..0000000 --- a/projects/simple-stopwatch/stopwatch.js +++ /dev/null @@ -1,78 +0,0 @@ -// Get references to the timer and button elements -var timer = document.getElementById("timer"); -var startButton = document.getElementById("start"); -var stopButton = document.getElementById("stop"); -var resetButton = document.getElementById("reset"); - -// Initialize variables for tracking the start time, elapsed time, and timer interval -var startTime, - elapsedTime = 0, - timerInterval; - -// Function to start the timer -function startTimer() { - // Calculate the start time by subtracting the elapsed time from the current time - startTime = Date.now() - elapsedTime; - - // Start an interval that updates the timer display every 10 milliseconds - timerInterval = setInterval(function printTime() { - // Calculate the elapsed time by subtracting the start time from the current time - elapsedTime = Date.now() - startTime; - - // Update the timer display with the formatted elapsed time - timer.textContent = formatTime(elapsedTime); - }, 10); - - // Disable the start button and enable the stop button - startButton.disabled = true; - stopButton.disabled = false; -} - -// Function to stop the timer -function stopTimer() { - // Clear the interval that updates the timer display - clearInterval(timerInterval); - - // Enable the start button and disable the stop button - startButton.disabled = false; - stopButton.disabled = true; -} - -// Function to reset the timer -function resetTimer() { - // Clear the interval that updates the timer display - clearInterval(timerInterval); - - // Reset the elapsed time to 0 and update the timer display - elapsedTime = 0; - timer.textContent = "00:00:00"; - - // Enable the start button and disable the stop button - startButton.disabled = false; - stopButton.disabled = true; -} - -// Function to format the elapsed time as a string -function formatTime(time) { - var hours = Math.floor(time / (1000 * 60 * 60)); - var minutes = Math.floor((time % (1000 * 60 * 60)) / (1000 * 60)); - var seconds = Math.floor((time % (1000 * 60)) / 1000); - var milliseconds = Math.floor((time % 1000) / 10); - // The ternary operator hours ? (hours > 9 ? hours : "0" + hours) : "00" checks if the hours variable has a value greater than zero. If it does, it checks if it is greater than 9. If it is, it returns the value of hours. If it is less than or equal to 9, it adds a leading zero to the hours value and returns it. If hours is zero, it returns the string "00". - - // The same logic is applied to format the minutes and seconds values. - return ( - (hours ? (hours > 9 ? hours : "0" + hours) : "00") + - ":" + - (minutes ? (minutes > 9 ? minutes : "0" + minutes) : "00") + - ":" + - (seconds ? (seconds > 9 ? seconds : "0" + seconds) : "00") + - "." + - (milliseconds > 9 ? milliseconds : "0" + milliseconds) - ); -} - -// Add event listeners to the button elements to trigger the timer functions -startButton.addEventListener("click", startTimer); -stopButton.addEventListener("click", stopTimer); -resetButton.addEventListener("click", resetTimer); diff --git a/projects/stopwatch/index.html b/projects/stopwatch/index.html new file mode 100644 index 0000000..05d8b2b --- /dev/null +++ b/projects/stopwatch/index.html @@ -0,0 +1,20 @@ + + + + + + + Stopwatch + + + + +
00:00:00
+
+ + + +
+ + + \ No newline at end of file diff --git a/projects/stopwatch/index.js b/projects/stopwatch/index.js new file mode 100644 index 0000000..0cbd647 --- /dev/null +++ b/projects/stopwatch/index.js @@ -0,0 +1,54 @@ +const timerEl = document.getElementById("timer"); +const startButtonEl = document.getElementById("start"); +const stopButtonEl = document.getElementById("stop"); +const resetButtonEl = document.getElementById("reset"); + +let startTime = 0; +let elapsedTime = 0; +let timerInterval; + +function startTimer() { + startTime = Date.now() - elapsedTime; + + timerInterval = setInterval(() => { + elapsedTime = Date.now() - startTime; + timerEl.textContent = formatTime(elapsedTime); + }, 10); + + startButtonEl.disabled = true; + stopButtonEl.disabled = false; +} + +function formatTime(elapsedTime) { + const milliseconds = Math.floor((elapsedTime % 1000) / 10); + const seconds = Math.floor((elapsedTime % (1000 * 60)) / 1000); + const minutes = Math.floor((elapsedTime % (1000 * 60 * 60)) / (1000 * 60)); + const hours = Math.floor(elapsedTime / (1000 * 60 * 60)); + return ( + (hours ? (hours > 9 ? hours : "0" + hours) : "00") + + ":" + + (minutes ? (minutes > 9 ? minutes : "0" + minutes) : "00") + + ":" + + (seconds ? (seconds > 9 ? seconds : "0" + seconds) : "00") + + "." + + (milliseconds > 9 ? milliseconds : "0" + milliseconds) + ); +} +function stopTimer() { + clearInterval(timerInterval); + startButtonEl.disabled = false; + stopButtonEl.disabled = true; +} +function resetTimer() { + clearInterval(timerInterval); + + elapsedTime = 0; + timerEl.textContent = "00:00:00"; + + startButtonEl.disabled = false; + stopButtonEl.disabled = true; +} + +startButtonEl.addEventListener("click", startTimer); +stopButtonEl.addEventListener("click", stopTimer); +resetButtonEl.addEventListener("click", resetTimer); diff --git a/projects/simple-stopwatch/style.css b/projects/stopwatch/style.css similarity index 62% rename from projects/simple-stopwatch/style.css rename to projects/stopwatch/style.css index bea5522..cf0859d 100644 --- a/projects/simple-stopwatch/style.css +++ b/projects/stopwatch/style.css @@ -4,17 +4,16 @@ body { display: flex; flex-direction: column; justify-content: center; - align-items: center; - height: 100vh; + min-height: 100vh; overflow: hidden; + align-items: center; } #timer { font-size: 7rem; font-weight: 700; - color: #f92672; text-shadow: 2px 2px #f8a5c2; - /* In the current code, the value 2px 2px #f8a5c2 sets a shadow that is 2 pixels to the right and 2 pixels down of the text, with a blur radius of 0 (no blur), and a color of #f8a5c2. */ + color: #f92672; width: 600px; text-align: center; margin: 40px auto; @@ -29,15 +28,14 @@ button { background-color: #f92672; color: white; border: none; - border-radius: 30px; font-size: 2rem; font-weight: bold; padding: 1.5rem 4rem; - /* In the current code, the value 1.5rem 4rem sets a padding of 1.5rem (24px) for the top and bottom sides of the buttons, and 4rem (64px) for the left and right sides of the buttons. */ margin: 1rem; + border-radius: 30px; cursor: pointer; - transition: background-color 0.2s; box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.3); + transition: all 0.2s; } button:hover { @@ -45,18 +43,11 @@ button:hover { box-shadow: 2px 2px 10px rgba(0, 0, 0, 0.5); } -button:active { - background-color: #f34282; - box-shadow: none; -} - button[disabled] { opacity: 0.5; cursor: default; } -/* add media query */ - @media (max-width: 800px) { #timer { font-size: 4rem; @@ -67,11 +58,4 @@ button[disabled] { font-size: 1.5rem; padding: 1rem 2rem; } - } - - - - -/* add media query for tablet size */ - From 051f5a567b3b1f15b9bdcf63064391fcd96e438a Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Fri, 24 Mar 2023 06:42:33 +0700 Subject: [PATCH 43/54] update double landing page projects --- projects/double-landing-page/style.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/projects/double-landing-page/style.css b/projects/double-landing-page/style.css index 5a62c04..0d37d66 100644 --- a/projects/double-landing-page/style.css +++ b/projects/double-landing-page/style.css @@ -11,7 +11,7 @@ body { h1 { font-size: 100px; color: aliceblue; - backdrop-filter: brightness(0.5); + background-color: rgba(0, 0, 0, 0.3); letter-spacing: 4px; } From 0c0e315a232d39f5c68ae549c22090148c135f62 Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Sat, 25 Mar 2023 05:33:17 +0700 Subject: [PATCH 44/54] add rock paper scissors game and pomodoro timer projects --- projects/pomodoro-timer/index.html | 19 +++++ projects/pomodoro-timer/index.js | 47 ++++++++++++ projects/pomodoro-timer/style.css | 62 ++++++++++++++++ projects/rock-paper-scissors-game/index.html | 27 +++++++ projects/rock-paper-scissors-game/index.js | 44 ++++++++++++ projects/rock-paper-scissors-game/style.css | 75 ++++++++++++++++++++ 6 files changed, 274 insertions(+) create mode 100644 projects/pomodoro-timer/index.html create mode 100644 projects/pomodoro-timer/index.js create mode 100644 projects/pomodoro-timer/style.css create mode 100644 projects/rock-paper-scissors-game/index.html create mode 100644 projects/rock-paper-scissors-game/index.js create mode 100644 projects/rock-paper-scissors-game/style.css diff --git a/projects/pomodoro-timer/index.html b/projects/pomodoro-timer/index.html new file mode 100644 index 0000000..39dfbb7 --- /dev/null +++ b/projects/pomodoro-timer/index.html @@ -0,0 +1,19 @@ + + + + Pomodoro Timer + + + +
+

Pomodoro Timer

+

25:00

+
+ + + +
+
+ + + diff --git a/projects/pomodoro-timer/index.js b/projects/pomodoro-timer/index.js new file mode 100644 index 0000000..af8598e --- /dev/null +++ b/projects/pomodoro-timer/index.js @@ -0,0 +1,47 @@ +const startEl = document.getElementById("start"); +const stopEl = document.getElementById("stop"); +const resetEl = document.getElementById("reset"); +const timerEl = document.getElementById("timer"); + +let intervalId; +let timeLeft = 1500; // 25 minutes in seconds + +function updateTimer() { + let minutes = Math.floor(timeLeft / 60); + let seconds = timeLeft % 60; + let formattedTime = `${minutes.toString().padStart(2, "0")}:${seconds + .toString() + .padStart(2, "0")}`; + // padStart() is a built-in method in JavaScript that allows you to pad a string with another string until it reaches a specified length. It's often used to format strings to a specific length, such as adding leading zeros to a number. + // const str = '7'; + // const paddedStr = str.padStart(2, '0'); + + // console.log(paddedStr); // Output: '07' + + timerEl.innerHTML = formattedTime; +} + +function startTimer() { + intervalId = setInterval(() => { + timeLeft--; + updateTimer(); + if (timeLeft === 0) { + clearInterval(intervalId); + alert("Time's up!"); + } + }, 1000); +} + +function stopTimer() { + clearInterval(intervalId); +} + +function resetTimer() { + clearInterval(intervalId); + timeLeft = 1500; + updateTimer(); +} + +startEl.addEventListener("click", startTimer); +stopEl.addEventListener("click", stopTimer); +resetEl.addEventListener("click", resetTimer); diff --git a/projects/pomodoro-timer/style.css b/projects/pomodoro-timer/style.css new file mode 100644 index 0000000..8583f8f --- /dev/null +++ b/projects/pomodoro-timer/style.css @@ -0,0 +1,62 @@ +/* Pomodoro Timer styles */ + +.container { + font-family: "Roboto", Arial, Helvetica, sans-serif; + margin: 0 auto; + max-width: 400px; + padding: 20px; + text-align: center; +} + +.title { + font-size: 36px; + margin-bottom: 10px; + color: #2c3e50; +} + +.timer { + font-size: 72px; + color: #2c3e50; +} + +.button-wrapper { + display: flex; + justify-content: center; +} + +.button { + border: none; + border-radius: 4px; + color: #fff; + font-size: 18px; + font-weight: bold; + margin-right: 10px; + padding: 10px 20px; + text-transform: uppercase; + transition: all 0.2s; + cursor: pointer; +} + +.button--start { + background-color: #27ae60; +} + +.button--start:hover { + background-color: #229954; +} + +.button--stop { + background-color: #c0392b; +} + +.button--stop:hover { + background-color: #a93226; +} + +.button--reset { + background-color: #7f8c8d; +} + +.button--reset:hover { + background-color: #6c7a7d; +} diff --git a/projects/rock-paper-scissors-game/index.html b/projects/rock-paper-scissors-game/index.html new file mode 100644 index 0000000..d736e45 --- /dev/null +++ b/projects/rock-paper-scissors-game/index.html @@ -0,0 +1,27 @@ + + + + Rock Paper Scissors + + + + + +

Rock Paper Scissors Game

+

Choose your move:

+
+ + + + + +
+

+

+ Your score: 0 Computer's score: + 0 +

+ + + + diff --git a/projects/rock-paper-scissors-game/index.js b/projects/rock-paper-scissors-game/index.js new file mode 100644 index 0000000..e003110 --- /dev/null +++ b/projects/rock-paper-scissors-game/index.js @@ -0,0 +1,44 @@ +const buttons = document.querySelectorAll("button"); +let playerScore = 0; +let computerScore = 0; + +buttons.forEach((button) => { + button.addEventListener("click", () => { + playRound(button.id, computerPlay()); + }); +}); + +function computerPlay() { + const choices = ["rock", "paper", "scissors"]; + return choices[Math.floor(Math.random() * choices.length)]; +} + +function playRound(playerSelection, computerSelection) { + if (playerSelection === computerSelection) { + document.getElementById("result").textContent = "Tie game!"; + } else if ( + (playerSelection === "rock" && computerSelection === "scissors") || + (playerSelection === "paper" && computerSelection === "rock") || + (playerSelection === "scissors" && computerSelection === "paper") + ) { + playerScore++; + document.getElementById( + "result" + ).textContent = `You win! ${playerSelection} beats ${computerSelection}`; + } else { + computerScore++; + document.getElementById( + "result" + ).textContent = `You lose! ${computerSelection} beats ${playerSelection}`; + } + updateScore(); +} + +function updateScore() { + document.getElementById( + "player-score" + ).textContent = `Your score: ${playerScore}`; + document.getElementById( + "computer-score" + ).textContent = `Computer's score: ${computerScore}`; +} diff --git a/projects/rock-paper-scissors-game/style.css b/projects/rock-paper-scissors-game/style.css new file mode 100644 index 0000000..8962ff0 --- /dev/null +++ b/projects/rock-paper-scissors-game/style.css @@ -0,0 +1,75 @@ +* { + box-sizing: border-box; +} + +body { + background-color: #f1f1f1; + font-family: Arial, sans-serif; + margin: 0; + padding: 0; +} + +h1 { + font-size: 2rem; + text-align: center; + padding-top: 100px; +} + +p { + font-size: 1.2rem; + margin-bottom: 0.5rem; + text-align: center; +} + +.buttons { + display: flex; + justify-content: center; +} + +button { + border: none; + border-radius: 5px; + color: white; + cursor: pointer; + font-size: 3rem; + margin: 0 0.5rem; + padding: 0.5rem; + transition: all 0.3s ease-in-out; +} + +button:hover { + opacity: 0.7; +} + +#rock { + background-color: #f44336; /* Red */ +} + +#paper { + background-color: #2196f3; /* Blue */ +} + +#scissors { + background-color: #4caf50; /* Green */ +} + +#result { + font-size: 1.5rem; + font-weight: bold; + margin: 1rem 0; +} + +#scores { + font-size: 1.2rem; + font-weight: bold; + text-align: center; +} + +#player-score { + color: #4caf50; + margin-right: 0.5rem; +} + +#computer-score { + color: #f44336; +} From 07a16873b84779a27b0dad8d78148b1aded64f18 Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Sat, 25 Mar 2023 13:44:14 +0700 Subject: [PATCH 45/54] update Rock Paper Scissors Game project --- projects/rock-paper-scissors-game/index.html | 34 ++++++++-------- projects/rock-paper-scissors-game/index.js | 36 ++++++++--------- projects/rock-paper-scissors-game/style.css | 41 ++++++-------------- 3 files changed, 45 insertions(+), 66 deletions(-) diff --git a/projects/rock-paper-scissors-game/index.html b/projects/rock-paper-scissors-game/index.html index d736e45..c458606 100644 --- a/projects/rock-paper-scissors-game/index.html +++ b/projects/rock-paper-scissors-game/index.html @@ -1,27 +1,25 @@ - - - Rock Paper Scissors - - - - - + + + + + + Rock Paper Scissors Game + + +

Rock Paper Scissors Game

Choose your move:

- - - - - + + +

- Your score: 0 Computer's score: - 0 + Your score: 0 + Computer score: 0

- - - + + \ No newline at end of file diff --git a/projects/rock-paper-scissors-game/index.js b/projects/rock-paper-scissors-game/index.js index e003110..4944f3e 100644 --- a/projects/rock-paper-scissors-game/index.js +++ b/projects/rock-paper-scissors-game/index.js @@ -1,44 +1,42 @@ const buttons = document.querySelectorAll("button"); + +const resultEl = document.getElementById("result"); + +const playerScoreEl = document.getElementById("user-score"); + +const computerScoreEl = document.getElementById("computer-score"); + let playerScore = 0; let computerScore = 0; buttons.forEach((button) => { button.addEventListener("click", () => { - playRound(button.id, computerPlay()); + const result = playRound(button.id, computerPlay()); + resultEl.textContent = result; + }); }); function computerPlay() { const choices = ["rock", "paper", "scissors"]; - return choices[Math.floor(Math.random() * choices.length)]; + const randomChoice = Math.floor(Math.random() * choices.length); + return choices[randomChoice]; } function playRound(playerSelection, computerSelection) { if (playerSelection === computerSelection) { - document.getElementById("result").textContent = "Tie game!"; + return "It's a tie!"; } else if ( (playerSelection === "rock" && computerSelection === "scissors") || (playerSelection === "paper" && computerSelection === "rock") || (playerSelection === "scissors" && computerSelection === "paper") ) { playerScore++; - document.getElementById( - "result" - ).textContent = `You win! ${playerSelection} beats ${computerSelection}`; + playerScoreEl.textContent = playerScore; + return "You win! " + playerSelection + " beats " + computerSelection; } else { computerScore++; - document.getElementById( - "result" - ).textContent = `You lose! ${computerSelection} beats ${playerSelection}`; + computerScoreEl.textContent = computerScore; + return "You lose! " + computerSelection + " beats " + playerSelection; } - updateScore(); -} - -function updateScore() { - document.getElementById( - "player-score" - ).textContent = `Your score: ${playerScore}`; - document.getElementById( - "computer-score" - ).textContent = `Computer's score: ${computerScore}`; } diff --git a/projects/rock-paper-scissors-game/style.css b/projects/rock-paper-scissors-game/style.css index 8962ff0..940eff4 100644 --- a/projects/rock-paper-scissors-game/style.css +++ b/projects/rock-paper-scissors-game/style.css @@ -1,10 +1,6 @@ -* { - box-sizing: border-box; -} - body { background-color: #f1f1f1; - font-family: Arial, sans-serif; + font-family: "Arial", sans-serif; margin: 0; padding: 0; } @@ -16,9 +12,10 @@ h1 { } p { - font-size: 1.2rem; - margin-bottom: 0.5rem; + font-size: 1.5rem; + font-weight: 600; text-align: center; + margin-bottom: 0.5rem; } .buttons { @@ -28,12 +25,11 @@ p { button { border: none; - border-radius: 5px; - color: white; - cursor: pointer; font-size: 3rem; margin: 0 0.5rem; padding: 0.5rem; + cursor: pointer; + border-radius: 5px; transition: all 0.3s ease-in-out; } @@ -42,34 +38,21 @@ button:hover { } #rock { - background-color: #f44336; /* Red */ + background-color: #ff0000; } #paper { - background-color: #2196f3; /* Blue */ + background-color: #2196f3; } #scissors { - background-color: #4caf50; /* Green */ -} - -#result { - font-size: 1.5rem; - font-weight: bold; - margin: 1rem 0; -} - -#scores { - font-size: 1.2rem; - font-weight: bold; - text-align: center; + background-color: #4caf50; } -#player-score { - color: #4caf50; - margin-right: 0.5rem; +#user-score { + color: #2196f3; } #computer-score { - color: #f44336; + color: #ff0000; } From dfb834e9d2d33469623af5e9b860685d0fc7fa53 Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Sun, 26 Mar 2023 14:44:28 +0700 Subject: [PATCH 46/54] update pomodoro timer project --- projects/pomodoro-timer/index.html | 31 ++++++++++---------- projects/pomodoro-timer/index.js | 21 ++++++-------- projects/pomodoro-timer/style.css | 45 ++++++++++-------------------- 3 files changed, 40 insertions(+), 57 deletions(-) diff --git a/projects/pomodoro-timer/index.html b/projects/pomodoro-timer/index.html index 39dfbb7..7cfe584 100644 --- a/projects/pomodoro-timer/index.html +++ b/projects/pomodoro-timer/index.html @@ -1,19 +1,22 @@ - - + + + + + Pomodoro Timer - - - + + +
-

Pomodoro Timer

-

25:00

-
- - - -
+

Pomodoro Timer

+

25:00

+
+ + + +
- - + + \ No newline at end of file diff --git a/projects/pomodoro-timer/index.js b/projects/pomodoro-timer/index.js index af8598e..22b4ede 100644 --- a/projects/pomodoro-timer/index.js +++ b/projects/pomodoro-timer/index.js @@ -3,8 +3,8 @@ const stopEl = document.getElementById("stop"); const resetEl = document.getElementById("reset"); const timerEl = document.getElementById("timer"); -let intervalId; -let timeLeft = 1500; // 25 minutes in seconds +let interval; +let timeLeft = 1500; function updateTimer() { let minutes = Math.floor(timeLeft / 60); @@ -12,32 +12,27 @@ function updateTimer() { let formattedTime = `${minutes.toString().padStart(2, "0")}:${seconds .toString() .padStart(2, "0")}`; - // padStart() is a built-in method in JavaScript that allows you to pad a string with another string until it reaches a specified length. It's often used to format strings to a specific length, such as adding leading zeros to a number. - // const str = '7'; - // const paddedStr = str.padStart(2, '0'); - - // console.log(paddedStr); // Output: '07' timerEl.innerHTML = formattedTime; } function startTimer() { - intervalId = setInterval(() => { + interval = setInterval(() => { timeLeft--; updateTimer(); if (timeLeft === 0) { - clearInterval(intervalId); + clearInterval(interval); alert("Time's up!"); + timeLeft = 1500; + updateTimer(); } }, 1000); } - function stopTimer() { - clearInterval(intervalId); + clearInterval(interval); } - function resetTimer() { - clearInterval(intervalId); + clearInterval(interval); timeLeft = 1500; updateTimer(); } diff --git a/projects/pomodoro-timer/style.css b/projects/pomodoro-timer/style.css index 8583f8f..0e6970b 100644 --- a/projects/pomodoro-timer/style.css +++ b/projects/pomodoro-timer/style.css @@ -1,11 +1,9 @@ -/* Pomodoro Timer styles */ - .container { - font-family: "Roboto", Arial, Helvetica, sans-serif; margin: 0 auto; max-width: 400px; - padding: 20px; text-align: center; + padding: 20px; + font-family: "Roboto", sans-serif; } .title { @@ -19,44 +17,31 @@ color: #2c3e50; } -.button-wrapper { - display: flex; - justify-content: center; -} +button { + font-size: 18px; + padding: 10px 20px; + margin: 10px; + color: white; -.button { border: none; border-radius: 4px; - color: #fff; - font-size: 18px; - font-weight: bold; - margin-right: 10px; - padding: 10px 20px; - text-transform: uppercase; - transition: all 0.2s; cursor: pointer; + text-transform: uppercase; + transition: opacity 0.3s ease-in-out; } -.button--start { - background-color: #27ae60; +button:hover { + opacity: 0.7; } -.button--start:hover { - background-color: #229954; +#start { + background-color: #27ae60; } -.button--stop { +#stop { background-color: #c0392b; } -.button--stop:hover { - background-color: #a93226; -} - -.button--reset { +#reset { background-color: #7f8c8d; } - -.button--reset:hover { - background-color: #6c7a7d; -} From 26176999fd74b2b2ed11231ccf9f4991c7374655 Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Mon, 27 Mar 2023 21:21:39 +0700 Subject: [PATCH 47/54] add 2 new projects --- projects/dice-roll-simulator/dice-roll.js | 50 +++++++++++ projects/dice-roll-simulator/index.html | 18 ++++ projects/dice-roll-simulator/style.css | 71 +++++++++++++++ projects/recipe-book-app/index.html | 23 +++++ projects/recipe-book-app/index.js | 48 ++++++++++ projects/recipe-book-app/style.css | 101 ++++++++++++++++++++++ 6 files changed, 311 insertions(+) create mode 100644 projects/dice-roll-simulator/dice-roll.js create mode 100644 projects/dice-roll-simulator/index.html create mode 100644 projects/dice-roll-simulator/style.css create mode 100644 projects/recipe-book-app/index.html create mode 100644 projects/recipe-book-app/index.js create mode 100644 projects/recipe-book-app/style.css diff --git a/projects/dice-roll-simulator/dice-roll.js b/projects/dice-roll-simulator/dice-roll.js new file mode 100644 index 0000000..6e161a8 --- /dev/null +++ b/projects/dice-roll-simulator/dice-roll.js @@ -0,0 +1,50 @@ +const diceElement = document.getElementById("dice"); +const rollButton = document.getElementById("roll-button"); +const rollHistory = document.getElementById("roll-history"); +let historyList = []; + +function rollDice() { + const rollResult = Math.floor(Math.random() * 6) + 1; + const diceFace = getDiceFace(rollResult); + diceElement.textContent = diceFace; + historyList.push(rollResult); + updateRollHistory(); +} + +function getDiceFace(rollResult) { + switch (rollResult) { + case 1: + return "⚀"; + case 2: + return "⚁"; + case 3: + return "⚂"; + case 4: + return "⚃"; + case 5: + return "⚄"; + case 6: + return "⚅"; + default: + return ""; + } +} + +function updateRollHistory() { + rollHistory.innerHTML = ""; + for (let i = 0; i < historyList.length; i++) { + const listItem = document.createElement("li"); + listItem.innerHTML = `Roll ${i + 1}: ${getDiceFace( + historyList[i] + )}`; + rollHistory.appendChild(listItem); + } +} + +rollButton.addEventListener("click", () => { + diceElement.classList.add("roll-animation"); + setTimeout(() => { + diceElement.classList.remove("roll-animation"); + rollDice(); + }, 1000); +}); diff --git a/projects/dice-roll-simulator/index.html b/projects/dice-roll-simulator/index.html new file mode 100644 index 0000000..d88b92d --- /dev/null +++ b/projects/dice-roll-simulator/index.html @@ -0,0 +1,18 @@ + + + + Dice Roll Simulator + + + +

Dice Roll Simulator

+
+ +
    +
  • Roll 1:
  • +
  • Roll 2:
  • +
+ + + + diff --git a/projects/dice-roll-simulator/style.css b/projects/dice-roll-simulator/style.css new file mode 100644 index 0000000..841de74 --- /dev/null +++ b/projects/dice-roll-simulator/style.css @@ -0,0 +1,71 @@ +body { + font-family: "Open Sans", sans-serif; + text-align: center; + margin: 0; +} + +h1 { + font-size: 3rem; + margin-top: 2rem; +} + +.dice { + font-size: 7rem; + margin: 5px; + animation-duration: 1s; + animation-fill-mode: forwards; +} + +.roll-animation { + animation-name: roll; +} + +@keyframes roll { + 0% { + transform: rotateY(0deg) rotateX(0deg); + } + 100% { + transform: rotateY(720deg) rotateX(720deg); + } +} + +button { + background-color: #47a5c4; + color: white; + font-size: 1.5rem; + border: none; + padding: 1rem 2rem; + margin: 5px; + border-radius: 1rem; + cursor: pointer; + transition: background-color 0.3s ease; +} + +button:hover { + background-color: #2e8baf; +} + +ul { + list-style: none; + padding: 0; + margin: 2rem; + max-width: 600px; + margin: 0 auto; +} + +li { + font-size: 1.5rem; + padding: 0.5rem; + margin: 0.5rem; + background-color: #f2f2f2; + border-radius: 0.5rem; + box-shadow: 0 2px 2px rgba(0, 0, 0, 0.3); + display: flex; + justify-content: space-between; + align-items: center; +} + +li span { + font-size: 3rem; + margin-right: 1rem; +} diff --git a/projects/recipe-book-app/index.html b/projects/recipe-book-app/index.html new file mode 100644 index 0000000..6cc0f1d --- /dev/null +++ b/projects/recipe-book-app/index.html @@ -0,0 +1,23 @@ + + + + + Recipe Book + + + + +
+

Recipe Book

+
+ +
+
    +
    + + + + diff --git a/projects/recipe-book-app/index.js b/projects/recipe-book-app/index.js new file mode 100644 index 0000000..7fcf11a --- /dev/null +++ b/projects/recipe-book-app/index.js @@ -0,0 +1,48 @@ +const API_KEY = "275d58779ccf4e22af03e792e8819fff"; + +// Call the API and retrieve a list of recipes +const recipeList = document.getElementById("recipe-list"); + +async function getRecipes() { + const response = await fetch( + `https://api.spoonacular.com/recipes/random?number=10&apiKey=${API_KEY}` + ); + const data = await response.json(); + return data.recipes; +} + +function displayRecipes(recipes) { + recipeList.innerHTML = ""; + recipes.forEach((recipe) => { + const recipeItem = document.createElement("li"); + recipeItem.classList.add("recipe-item"); + const recipeImage = document.createElement("img"); + recipeImage.src = recipe.image; + + const recipeTitle = document.createElement("h2"); + recipeTitle.innerText = recipe.title; + + const recipeIngredients = document.createElement("p"); + recipeIngredients.innerHTML = `Ingredients: ${recipe.extendedIngredients + .map((ingredient) => ingredient.original) + .join(", ")}`; + + const recipeLink = document.createElement("a"); + recipeLink.href = recipe.sourceUrl; + recipeLink.innerText = "View Recipe"; + + recipeItem.appendChild(recipeImage); + recipeItem.appendChild(recipeTitle); + recipeItem.appendChild(recipeIngredients); + recipeItem.appendChild(recipeLink); + + recipeList.appendChild(recipeItem); + }); +} + +async function init() { + const recipes = await getRecipes(); + displayRecipes(recipes); +} + +init(); diff --git a/projects/recipe-book-app/style.css b/projects/recipe-book-app/style.css new file mode 100644 index 0000000..d1405d5 --- /dev/null +++ b/projects/recipe-book-app/style.css @@ -0,0 +1,101 @@ +body { + margin: 0; + padding: 0; + font-family: Arial, sans-serif; +} + +header { + background-color: #0c2461; + color: #fff; + padding: 20px; + text-align: center; +} + +h1 { + margin: 0; + font-size: 36px; +} + +.container { + max-width: 1200px; + margin: 0 auto; + padding: 20px; +} + +.recipe-list { + list-style: none; + margin: 0; + padding: 0; +} + +.recipe-item { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 20px; + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); + border-radius: 5px; + overflow: hidden; +} + +.recipe-item img { + width: 150px; + height: 150px; + object-fit: cover; +} + +.recipe-item h2 { + margin: 0; + font-size: 20px; + min-width: 200px; + padding: 10px; +} + +.recipe-item p { + margin: 0; + padding: 10px; +} + +.recipe-item a { + padding: 10px; + background-color: #0c2461; + color: #fff; + text-align: center; + text-decoration: none; + transition: background-color 0.2s ease-in-out; + min-width: 150px; +} + +.recipe-item a:hover { + background-color: #1e3799; +} + +@media only screen and (max-width: 800px) { + .container { + max-width: 90%; + } + + .recipe-item { + flex-wrap: wrap; + } + + .recipe-item img { + width: 100%; + height: auto; + margin-bottom: 10px; + } + + .recipe-item h2 { + font-size: 20px; + padding: 0; + margin-bottom: 10px; + } + + .recipe-item p { + font-size: 14px; + margin-bottom: 10px; + } + .recipe-item a { + width: 100%; + } +} From 0643a11eb20d0b10e850047edd364cad54b089a4 Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Tue, 28 Mar 2023 13:04:04 +0700 Subject: [PATCH 48/54] add 2 more projects --- projects/age-calculator/index.html | 21 ++++++++++ projects/age-calculator/index.js | 51 +++++++++++++++++++++++ projects/age-calculator/style.css | 67 ++++++++++++++++++++++++++++++ projects/tip-calculator/index.html | 24 +++++++++++ projects/tip-calculator/index.js | 11 +++++ projects/tip-calculator/style.css | 57 +++++++++++++++++++++++++ 6 files changed, 231 insertions(+) create mode 100644 projects/age-calculator/index.html create mode 100644 projects/age-calculator/index.js create mode 100644 projects/age-calculator/style.css create mode 100644 projects/tip-calculator/index.html create mode 100644 projects/tip-calculator/index.js create mode 100644 projects/tip-calculator/style.css diff --git a/projects/age-calculator/index.html b/projects/age-calculator/index.html new file mode 100644 index 0000000..dd793a3 --- /dev/null +++ b/projects/age-calculator/index.html @@ -0,0 +1,21 @@ + + + + + Age Calculator + + + +
    +

    Age Calculator

    +
    + + + +

    +
    +
    + + + + diff --git a/projects/age-calculator/index.js b/projects/age-calculator/index.js new file mode 100644 index 0000000..2d829c4 --- /dev/null +++ b/projects/age-calculator/index.js @@ -0,0 +1,51 @@ +// Get the elements from the DOM +const birthdayInput = document.getElementById("birthday"); +const calculateButton = document.getElementById("calculate"); +const resultElement = document.getElementById("result"); + +// Add click event listener to the calculate button +calculateButton.addEventListener("click", calculateAge); + +// Function to calculate the age + +function calculateAge() { + // Get the value from the input + const birthday = birthdayInput.value; + + // Check if the value is empty + if (birthday === "") { + // If the value is empty, show an alert + alert("Please enter your birthday"); + } else { + // If the value is not empty, calculate the age + const age = getAge(birthday); + + // Show the result + resultElement.innerHTML = `Your age is ${age} ${ + age > 1 ? "years" : "year" // Check if the age is more than 1 + } old`; + } +} + +// Function to calculate the age +function getAge(birthDay) { + // Get the current date + const currentDate = new Date(); + + // Get the birthday date + const birthdayDate = new Date(birthDay); + + // Calculate the age + const age = currentDate.getFullYear() - birthdayDate.getFullYear(); + + const month = currentDate.getMonth() - birthdayDate.getMonth(); + if ( + month < 0 || + (month === 0 && currentDate.getDate() < birthdayDate.getDate()) + ) { + age--; + } + + // Return the age + return age; +} diff --git a/projects/age-calculator/style.css b/projects/age-calculator/style.css new file mode 100644 index 0000000..88f0382 --- /dev/null +++ b/projects/age-calculator/style.css @@ -0,0 +1,67 @@ +/* General styles */ +body { + margin: 0; + padding: 20px; + font-family: "Montserrat", sans-serif; + font-size: 16px; + line-height: 1.5; + background-color: #f7f7f7; +} + +.container { + max-width: 600px; + margin: 0 auto; + padding: 20px; + background-color: #fff; + box-shadow: 0 0 20px rgba(0, 0, 0, 0.2); + border-radius: 5px; +} + +h1 { + font-size: 36px; + text-align: center; + margin-top: 0; + margin-bottom: 20px; +} + +.form { + display: flex; + flex-direction: column; + align-items: center; +} + +label { + font-weight: bold; + margin-bottom: 10px; +} + +input[type="date"] { + padding: 8px; + border: 1px solid #ccc; + border-radius: 4px; + width: 100%; + max-width: 300px; + box-sizing: border-box; +} + +button { + background-color: #007bff; + color: #fff; + border: none; + padding: 10px 20px; + border-radius: 4px; + margin-top: 10px; + cursor: pointer; + transition: background-color 0.2s ease; +} + +button:hover { + background-color: #0062cc; +} + +#result { + margin-top: 20px; + font-size: 24px; + font-weight: bold; + text-align: center; +} diff --git a/projects/tip-calculator/index.html b/projects/tip-calculator/index.html new file mode 100644 index 0000000..aa0dc58 --- /dev/null +++ b/projects/tip-calculator/index.html @@ -0,0 +1,24 @@ + + + + Tip Calculator + + + +
    +

    Tip Calculator

    +

    Enter the bill amount and tip percentage to calculate the total.

    + + +
    + + +
    + +
    + + +
    + + + diff --git a/projects/tip-calculator/index.js b/projects/tip-calculator/index.js new file mode 100644 index 0000000..515b4de --- /dev/null +++ b/projects/tip-calculator/index.js @@ -0,0 +1,11 @@ +const calculateBtn = document.getElementById("calculate"); +const billInput = document.getElementById("bill"); +const tipInput = document.getElementById("tip"); +const totalSpan = document.getElementById("total"); + +calculateBtn.addEventListener("click", function () { + const bill = billInput.value; + const tip = tipInput.value; + const total = bill * (1 + tip / 100); + totalSpan.innerText = `$${total.toFixed(2)}`; +}); diff --git a/projects/tip-calculator/style.css b/projects/tip-calculator/style.css new file mode 100644 index 0000000..9db5f26 --- /dev/null +++ b/projects/tip-calculator/style.css @@ -0,0 +1,57 @@ +/* Set body styles */ +* { + box-sizing: border-box; +} + +body { + background-color: #f2f2f2; + font-family: "Helvetica Neue", sans-serif; +} + +/* Set container styles */ +.container { + margin: 100px auto; + max-width: 600px; + padding: 20px; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.2); + background-color: #fff; + border-radius: 10px; +} + +/* Set heading styles */ +h1 { + margin-top: 0; + text-align: center; +} + +/* Set input styles */ +input[type="number"] { + padding: 10px; + border: 1px solid #ccc; + border-radius: 4px; + margin: 10px 0; + width: 100%; +} + +/* Set button styles */ +button { + background-color: #4caf50; + color: white; + padding: 10px; + border: none; + border-radius: 4px; + cursor: pointer; + margin: 10px 0; + width: 100%; +} + +button:hover { + background-color: #45a049; +} + +/* Set result styles */ +#total { + font-size: 24px; + font-weight: bold; + margin-top: 10px; +} From 6d61e9ce23b3ee95d4cc2b9d3233836d786fc558 Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Wed, 29 Mar 2023 13:19:23 +0700 Subject: [PATCH 49/54] update roll dice simulator --- projects/dice-roll-simulator/index.html | 14 ++--- .../{dice-roll.js => index.js} | 51 ++++++++++--------- projects/dice-roll-simulator/style.css | 7 ++- 3 files changed, 38 insertions(+), 34 deletions(-) rename projects/dice-roll-simulator/{dice-roll.js => index.js} (54%) diff --git a/projects/dice-roll-simulator/index.html b/projects/dice-roll-simulator/index.html index d88b92d..edf81b5 100644 --- a/projects/dice-roll-simulator/index.html +++ b/projects/dice-roll-simulator/index.html @@ -1,18 +1,20 @@ - + + + + Dice Roll Simulator

    Dice Roll Simulator

    -
    +
      -
    • Roll 1:
    • -
    • Roll 2:
    • +
    - - + diff --git a/projects/dice-roll-simulator/dice-roll.js b/projects/dice-roll-simulator/index.js similarity index 54% rename from projects/dice-roll-simulator/dice-roll.js rename to projects/dice-roll-simulator/index.js index 6e161a8..8deecde 100644 --- a/projects/dice-roll-simulator/dice-roll.js +++ b/projects/dice-roll-simulator/index.js @@ -1,50 +1,53 @@ -const diceElement = document.getElementById("dice"); -const rollButton = document.getElementById("roll-button"); -const rollHistory = document.getElementById("roll-history"); +const buttonEl = document.getElementById("roll-button"); + +const diceEl = document.getElementById("dice"); + +const rollHistoryEl = document.getElementById("roll-history"); + let historyList = []; function rollDice() { const rollResult = Math.floor(Math.random() * 6) + 1; const diceFace = getDiceFace(rollResult); - diceElement.textContent = diceFace; + diceEl.innerHTML = diceFace; historyList.push(rollResult); updateRollHistory(); } +function updateRollHistory() { + rollHistoryEl.innerHTML = ""; + for (let i = 0; i < historyList.length; i++) { + const listItem = document.createElement("li"); + listItem.innerHTML = `Roll ${i + 1}: ${getDiceFace( + historyList[i] + )}`; + rollHistoryEl.appendChild(listItem); + } +} + function getDiceFace(rollResult) { switch (rollResult) { case 1: - return "⚀"; + return "⚀"; case 2: - return "⚁"; + return "⚁"; case 3: - return "⚂"; + return "⚂"; case 4: - return "⚃"; + return "⚃"; case 5: - return "⚄"; + return "⚄"; case 6: - return "⚅"; + return "⚅"; default: return ""; } } -function updateRollHistory() { - rollHistory.innerHTML = ""; - for (let i = 0; i < historyList.length; i++) { - const listItem = document.createElement("li"); - listItem.innerHTML = `Roll ${i + 1}: ${getDiceFace( - historyList[i] - )}`; - rollHistory.appendChild(listItem); - } -} - -rollButton.addEventListener("click", () => { - diceElement.classList.add("roll-animation"); +buttonEl.addEventListener("click", () => { + diceEl.classList.add("roll-animation"); setTimeout(() => { - diceElement.classList.remove("roll-animation"); + diceEl.classList.remove("roll-animation"); rollDice(); }, 1000); }); diff --git a/projects/dice-roll-simulator/style.css b/projects/dice-roll-simulator/style.css index 841de74..439ab24 100644 --- a/projects/dice-roll-simulator/style.css +++ b/projects/dice-roll-simulator/style.css @@ -24,6 +24,7 @@ h1 { 0% { transform: rotateY(0deg) rotateX(0deg); } + 100% { transform: rotateY(720deg) rotateX(720deg); } @@ -33,9 +34,8 @@ button { background-color: #47a5c4; color: white; font-size: 1.5rem; - border: none; padding: 1rem 2rem; - margin: 5px; + border: none; border-radius: 1rem; cursor: pointer; transition: background-color 0.3s ease; @@ -48,9 +48,8 @@ button:hover { ul { list-style: none; padding: 0; - margin: 2rem; max-width: 600px; - margin: 0 auto; + margin: 2rem auto; } li { From 0894ef2fb7758346a77213cb3033e65f80347b76 Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Thu, 30 Mar 2023 11:04:46 +0700 Subject: [PATCH 50/54] update recipe book app --- projects/recipe-book-app/index.html | 43 +++++++++++++++++++++++++---- 1 file changed, 38 insertions(+), 5 deletions(-) diff --git a/projects/recipe-book-app/index.html b/projects/recipe-book-app/index.html index 6cc0f1d..81489f7 100644 --- a/projects/recipe-book-app/index.html +++ b/projects/recipe-book-app/index.html @@ -3,10 +3,6 @@ Recipe Book - @@ -15,7 +11,44 @@

    Recipe Book

    -
      +
        +
      • + Recipe 1 +

        Recipe 1

        +

        + Ingredients: Ingredient 1, Ingredient 2, Ingredient + 3 +

        + View Recipe +
      • +
      • + Recipe 2 +

        Recipe 2

        +

        + Ingredients: Ingredient 4, Ingredient 5, Ingredient + 6 +

        + View Recipe +
      • +
      • + Recipe 3 +

        Recipe 3

        +

        + Ingredients: Ingredient 7, Ingredient 8, Ingredient + 9 +

        + View Recipe +
      • +
      From cde2cb9634615d9cce876a6733a7038b72888913 Mon Sep 17 00:00:00 2001 From: Sahandgha Date: Tue, 11 Apr 2023 21:30:22 +0700 Subject: [PATCH 51/54] update last 4 projects --- projects/age-calculator/index.html | 32 ++++++++------- projects/age-calculator/index.js | 46 ++++++--------------- projects/age-calculator/style.css | 22 ++++------ projects/recipe-book-app/index.html | 25 +++++------ projects/recipe-book-app/index.js | 64 +++++++++++++++-------------- projects/recipe-book-app/style.css | 29 +++++++------ projects/tip-calculator/index.html | 42 ++++++++++--------- projects/tip-calculator/index.js | 16 ++++---- projects/tip-calculator/style.css | 18 ++++---- 9 files changed, 140 insertions(+), 154 deletions(-) diff --git a/projects/age-calculator/index.html b/projects/age-calculator/index.html index dd793a3..7ef5c27 100644 --- a/projects/age-calculator/index.html +++ b/projects/age-calculator/index.html @@ -1,21 +1,23 @@ - - - + + + + + Age Calculator - - - + + +
      -

      Age Calculator

      -
      - - - -

      -
      +

      Age Calculator

      +
      + + + +

      Your age is 21 years old

      +
      - - + + \ No newline at end of file diff --git a/projects/age-calculator/index.js b/projects/age-calculator/index.js index 2d829c4..b2888ee 100644 --- a/projects/age-calculator/index.js +++ b/projects/age-calculator/index.js @@ -1,44 +1,23 @@ -// Get the elements from the DOM -const birthdayInput = document.getElementById("birthday"); -const calculateButton = document.getElementById("calculate"); -const resultElement = document.getElementById("result"); - -// Add click event listener to the calculate button -calculateButton.addEventListener("click", calculateAge); - -// Function to calculate the age +const btnEl = document.getElementById("btn"); +const birthdayEl = document.getElementById("birthday"); +const resultEl = document.getElementById("result"); function calculateAge() { - // Get the value from the input - const birthday = birthdayInput.value; - - // Check if the value is empty - if (birthday === "") { - // If the value is empty, show an alert + const birthdayValue = birthdayEl.value; + if (birthdayValue === "") { alert("Please enter your birthday"); } else { - // If the value is not empty, calculate the age - const age = getAge(birthday); - - // Show the result - resultElement.innerHTML = `Your age is ${age} ${ - age > 1 ? "years" : "year" // Check if the age is more than 1 - } old`; + const age = getAge(birthdayValue); + resultEl.innerText = `Your age is ${age} ${age > 1 ? "years" : "year"} old`; } } -// Function to calculate the age -function getAge(birthDay) { - // Get the current date +function getAge(birthdayValue) { const currentDate = new Date(); - - // Get the birthday date - const birthdayDate = new Date(birthDay); - - // Calculate the age - const age = currentDate.getFullYear() - birthdayDate.getFullYear(); - + const birthdayDate = new Date(birthdayValue); + let age = currentDate.getFullYear() - birthdayDate.getFullYear(); const month = currentDate.getMonth() - birthdayDate.getMonth(); + if ( month < 0 || (month === 0 && currentDate.getDate() < birthdayDate.getDate()) @@ -46,6 +25,7 @@ function getAge(birthDay) { age--; } - // Return the age return age; } + +btnEl.addEventListener("click", calculateAge); diff --git a/projects/age-calculator/style.css b/projects/age-calculator/style.css index 88f0382..0229675 100644 --- a/projects/age-calculator/style.css +++ b/projects/age-calculator/style.css @@ -1,20 +1,18 @@ -/* General styles */ body { margin: 0; padding: 20px; font-family: "Montserrat", sans-serif; - font-size: 16px; - line-height: 1.5; background-color: #f7f7f7; } .container { + background-color: white; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.2); + padding: 20px; max-width: 600px; margin: 0 auto; - padding: 20px; - background-color: #fff; - box-shadow: 0 0 20px rgba(0, 0, 0, 0.2); border-radius: 5px; + margin-top: 50px; } h1 { @@ -35,24 +33,23 @@ label { margin-bottom: 10px; } -input[type="date"] { +input { padding: 8px; border: 1px solid #ccc; - border-radius: 4px; + border-radius: 5px; width: 100%; max-width: 300px; - box-sizing: border-box; } button { background-color: #007bff; - color: #fff; + color: white; border: none; padding: 10px 20px; - border-radius: 4px; + border-radius: 5px; margin-top: 10px; cursor: pointer; - transition: background-color 0.2s ease; + transition: background-color 0.3s ease; } button:hover { @@ -63,5 +60,4 @@ button:hover { margin-top: 20px; font-size: 24px; font-weight: bold; - text-align: center; } diff --git a/projects/recipe-book-app/index.html b/projects/recipe-book-app/index.html index 81489f7..b93360d 100644 --- a/projects/recipe-book-app/index.html +++ b/projects/recipe-book-app/index.html @@ -2,17 +2,19 @@ - Recipe Book + + + Document
      -

      Recipe Book

      +

      Recipe Book App

      -
        -
      • +
          +
      - diff --git a/projects/recipe-book-app/index.js b/projects/recipe-book-app/index.js index 7fcf11a..d35b3b8 100644 --- a/projects/recipe-book-app/index.js +++ b/projects/recipe-book-app/index.js @@ -1,43 +1,45 @@ const API_KEY = "275d58779ccf4e22af03e792e8819fff"; +const recipeListEl = document.getElementById("recipe-list"); -// Call the API and retrieve a list of recipes -const recipeList = document.getElementById("recipe-list"); +function displayRecipes(recipes) { + recipeListEl.innerHTML = ""; + recipes.forEach((recipe) => { + const recipeItemEl = document.createElement("li"); + recipeItemEl.classList.add("recipe-item"); + recipeImageEl = document.createElement("img"); + recipeImageEl.src = recipe.image; + recipeImageEl.alt = "recipe image"; + + recipeTitleEl = document.createElement("h2"); + recipeTitleEl.innerText = recipe.title; + + recipeIngredientsEl = document.createElement("p"); + recipeIngredientsEl.innerHTML = ` + Ingredients: ${recipe.extendedIngredients + .map((ingredient) => ingredient.original) + .join(", ")} + `; + + recipeLinkEl = document.createElement("a"); + recipeLinkEl.href = recipe.sourceUrl; + recipeLinkEl.innerText = "View Recipe"; + + recipeItemEl.appendChild(recipeImageEl); + recipeItemEl.appendChild(recipeTitleEl); + recipeItemEl.appendChild(recipeIngredientsEl); + recipeItemEl.appendChild(recipeLinkEl); + recipeListEl.appendChild(recipeItemEl); + }); +} async function getRecipes() { const response = await fetch( `https://api.spoonacular.com/recipes/random?number=10&apiKey=${API_KEY}` ); - const data = await response.json(); - return data.recipes; -} - -function displayRecipes(recipes) { - recipeList.innerHTML = ""; - recipes.forEach((recipe) => { - const recipeItem = document.createElement("li"); - recipeItem.classList.add("recipe-item"); - const recipeImage = document.createElement("img"); - recipeImage.src = recipe.image; - - const recipeTitle = document.createElement("h2"); - recipeTitle.innerText = recipe.title; - - const recipeIngredients = document.createElement("p"); - recipeIngredients.innerHTML = `Ingredients: ${recipe.extendedIngredients - .map((ingredient) => ingredient.original) - .join(", ")}`; - const recipeLink = document.createElement("a"); - recipeLink.href = recipe.sourceUrl; - recipeLink.innerText = "View Recipe"; - - recipeItem.appendChild(recipeImage); - recipeItem.appendChild(recipeTitle); - recipeItem.appendChild(recipeIngredients); - recipeItem.appendChild(recipeLink); + const data = await response.json(); - recipeList.appendChild(recipeItem); - }); + return data.recipes; } async function init() { diff --git a/projects/recipe-book-app/style.css b/projects/recipe-book-app/style.css index d1405d5..9e56d02 100644 --- a/projects/recipe-book-app/style.css +++ b/projects/recipe-book-app/style.css @@ -5,7 +5,7 @@ body { } header { - background-color: #0c2461; + background: #0c2461; color: #fff; padding: 20px; text-align: center; @@ -17,8 +17,8 @@ h1 { } .container { - max-width: 1200px; margin: 0 auto; + max-width: 1200px; padding: 20px; } @@ -33,7 +33,7 @@ h1 { align-items: center; justify-content: space-between; margin-bottom: 20px; - box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2); border-radius: 5px; overflow: hidden; } @@ -47,36 +47,37 @@ h1 { .recipe-item h2 { margin: 0; font-size: 20px; - min-width: 200px; padding: 10px; + min-width: 200px; } .recipe-item p { margin: 0; padding: 10px; + color: #777; } .recipe-item a { - padding: 10px; - background-color: #0c2461; + background: #0c2461; color: #fff; - text-align: center; - text-decoration: none; - transition: background-color 0.2s ease-in-out; min-width: 150px; + padding: 10px; + text-decoration: none; + text-transform: uppercase; + font-size: 14px; + transition: background 0.3s ease; } .recipe-item a:hover { - background-color: #1e3799; + background: #1e3799; } -@media only screen and (max-width: 800px) { +@media screen and (max-width: 768px) { .container { max-width: 90%; } - .recipe-item { - flex-wrap: wrap; + flex-direction: column; } .recipe-item img { @@ -95,7 +96,9 @@ h1 { font-size: 14px; margin-bottom: 10px; } + .recipe-item a { width: 100%; + text-align: center; } } diff --git a/projects/tip-calculator/index.html b/projects/tip-calculator/index.html index aa0dc58..029457b 100644 --- a/projects/tip-calculator/index.html +++ b/projects/tip-calculator/index.html @@ -1,24 +1,28 @@ - - + + + + + Tip Calculator - - - + + +
      -

      Tip Calculator

      -

      Enter the bill amount and tip percentage to calculate the total.

      - - -
      - - -
      - -
      - - +

      Tip Calculator

      +

      Enter the bill amount and tip percentage to calculate the total.

      + + +
      + + +
      + +
      + + +
      - - + + \ No newline at end of file diff --git a/projects/tip-calculator/index.js b/projects/tip-calculator/index.js index 515b4de..98cb079 100644 --- a/projects/tip-calculator/index.js +++ b/projects/tip-calculator/index.js @@ -1,11 +1,13 @@ -const calculateBtn = document.getElementById("calculate"); +const btnEl = document.getElementById("calculate"); const billInput = document.getElementById("bill"); const tipInput = document.getElementById("tip"); const totalSpan = document.getElementById("total"); -calculateBtn.addEventListener("click", function () { - const bill = billInput.value; - const tip = tipInput.value; - const total = bill * (1 + tip / 100); - totalSpan.innerText = `$${total.toFixed(2)}`; -}); +function calculateTotal() { + const billValue = billInput.value; + const tipValue = tipInput.value; + const totalValue = billValue * (1 + tipValue / 100); + totalSpan.innerText = totalValue.toFixed(2); +} + +btnEl.addEventListener("click", calculateTotal); diff --git a/projects/tip-calculator/style.css b/projects/tip-calculator/style.css index 9db5f26..786e129 100644 --- a/projects/tip-calculator/style.css +++ b/projects/tip-calculator/style.css @@ -1,31 +1,27 @@ -/* Set body styles */ * { box-sizing: border-box; } body { background-color: #f2f2f2; - font-family: "Helvetica Neue", sans-serif; + font-family: "Helvetica", sans-serif; } -/* Set container styles */ .container { - margin: 100px auto; + background-color: white; max-width: 600px; + margin: 100px auto; padding: 20px; box-shadow: 0 0 10px rgba(0, 0, 0, 0.2); - background-color: #fff; border-radius: 10px; } -/* Set heading styles */ h1 { margin-top: 0; text-align: center; } -/* Set input styles */ -input[type="number"] { +input { padding: 10px; border: 1px solid #ccc; border-radius: 4px; @@ -33,23 +29,23 @@ input[type="number"] { width: 100%; } -/* Set button styles */ button { background-color: #4caf50; color: white; padding: 10px; border: none; - border-radius: 4px; cursor: pointer; margin: 10px 0; width: 100%; + font-size: 18px; + text-transform: uppercase; + transition: background-color 0.2s ease; } button:hover { background-color: #45a049; } -/* Set result styles */ #total { font-size: 24px; font-weight: bold; From b395884f4fb3fdd42fae861b2f661180ae0e8469 Mon Sep 17 00:00:00 2001 From: Sahand Ghavidel Date: Sun, 4 Jun 2023 08:54:31 +0700 Subject: [PATCH 52/54] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index e54352e..408019f 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,13 @@ # 50 HTML CSS JavaScript Projects -This is the source code of the Udemy course: 50 HTML CSS JavaScript Projects +This is the source code of the Udemy course: 60 HTML CSS JavaScript Projects
      Visit 100jsprojects.com to preview the projects.

      About

      -

      Hi there! I'm Sahand, a web developer with over a decade of experience. This course, "50 HTML CSS JavaScript Projects," was created to share my knowledge and experience with you. In this course, you'll learn how to build simple, responsive websites using HTML, CSS, and JavaScript.

      +

      Hi there! I'm Sahand, a web developer with over a decade of experience. This course, "60 HTML CSS JavaScript Projects," was created to share my knowledge and experience with you. In this course, you'll learn how to build simple, responsive websites using HTML, CSS, and JavaScript.

      In this course, you'll learn how to install Visual Studio Code and its extensions, and then we'll start from scratch with each project. After finishing HTML, we'll move on to CSS and JavaScript. Building in HTML, CSS, or JavaScript is fine, and this guide will explain HTML, CSS, and JavaScript syntax.

      Each project in this course is started from scratch and finished without using copied code. Then, we'll go over the code together to ensure that everyone understands. This program's exciting project-based curriculum includes building modern, super cool, and responsive websites!

      If you have any questions, please feel free to contact me through my Twitter: @codewithsahand.

      From 383128a15d7c87ac7dae37a60049efa976823a39 Mon Sep 17 00:00:00 2001 From: Sahand Ghavidel Date: Sun, 4 Jun 2023 08:54:49 +0700 Subject: [PATCH 53/54] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 408019f..55d6ee3 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# 50 HTML CSS JavaScript Projects +# 60 HTML CSS JavaScript Projects This is the source code of the Udemy course: 60 HTML CSS JavaScript Projects
      From 9178903cb14285736df153332c97209e8eab3ab1 Mon Sep 17 00:00:00 2001 From: Sahand Ghavidel Date: Tue, 3 Oct 2023 09:08:20 +0800 Subject: [PATCH 54/54] Update README.md --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 55d6ee3..af383c5 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,15 @@ -# 60 HTML CSS JavaScript Projects +# HTML CSS JavaScript Projects -This is the source code of the Udemy course: 60 HTML CSS JavaScript Projects +This is the source code of the website: 100 HTML CSS JavaScript Projects
      Visit 100jsprojects.com to preview the projects.

      About

      -

      Hi there! I'm Sahand, a web developer with over a decade of experience. This course, "60 HTML CSS JavaScript Projects," was created to share my knowledge and experience with you. In this course, you'll learn how to build simple, responsive websites using HTML, CSS, and JavaScript.

      +

      Hi there! I'm Sahand, a web developer with over a decade of experience. This course, "HTML CSS JavaScript Projects," was created to share my knowledge and experience with you. In this course, you'll learn how to build simple, responsive websites using HTML, CSS, and JavaScript.

      In this course, you'll learn how to install Visual Studio Code and its extensions, and then we'll start from scratch with each project. After finishing HTML, we'll move on to CSS and JavaScript. Building in HTML, CSS, or JavaScript is fine, and this guide will explain HTML, CSS, and JavaScript syntax.

      Each project in this course is started from scratch and finished without using copied code. Then, we'll go over the code together to ensure that everyone understands. This program's exciting project-based curriculum includes building modern, super cool, and responsive websites!

      -

      If you have any questions, please feel free to contact me through my Twitter: @codewithsahand.

      - Visit my website +

      If you have any questions, please feel free to contact me through my email: codewithsahand@gmail.com

      + Visit my website