From 1ee7a28779e9d073467ad16dac4b6f1e1f792896 Mon Sep 17 00:00:00 2001 From: amisha Date: Wed, 17 Jul 2024 21:23:41 +0530 Subject: [PATCH 001/167] Added_Random_color_app --- Source-Code/RandomColorGenerator/index.html | 20 +++++++++++ Source-Code/RandomColorGenerator/script.js | 17 +++++++++ Source-Code/RandomColorGenerator/style.css | 40 +++++++++++++++++++++ 3 files changed, 77 insertions(+) create mode 100644 Source-Code/RandomColorGenerator/index.html create mode 100644 Source-Code/RandomColorGenerator/script.js create mode 100644 Source-Code/RandomColorGenerator/style.css diff --git a/Source-Code/RandomColorGenerator/index.html b/Source-Code/RandomColorGenerator/index.html new file mode 100644 index 0000000..a5570f9 --- /dev/null +++ b/Source-Code/RandomColorGenerator/index.html @@ -0,0 +1,20 @@ + + + + + + Document + + + +
+
+

#fff

+ +
+
+ + + \ No newline at end of file diff --git a/Source-Code/RandomColorGenerator/script.js b/Source-Code/RandomColorGenerator/script.js new file mode 100644 index 0000000..1c853c8 --- /dev/null +++ b/Source-Code/RandomColorGenerator/script.js @@ -0,0 +1,17 @@ +const getColor = () => + { + const randomNumber=Math.floor(Math.random() * 1677215); + const randomCode = "#" + randomNumber.toString(16); + console.log(randomNumber,randomCode); + document.body.style.backgroundColor = randomCode + document.getElementById("color-code").innerText = randomCode + navigator.clipboard.writeText(randomCode)//Copy the color code to clipboard also + } + //function call + document.getElementById("btn").addEventListener( + "click", + getColor + ) + //init call + getColor(); + \ No newline at end of file diff --git a/Source-Code/RandomColorGenerator/style.css b/Source-Code/RandomColorGenerator/style.css new file mode 100644 index 0000000..fc3bdcf --- /dev/null +++ b/Source-Code/RandomColorGenerator/style.css @@ -0,0 +1,40 @@ +*{ + margin: 0; + padding: 0; + box-sizing: border-box; + font-family: sans-serif; +} +body +{ + transition: 1s; +} +.main +{ + width: 100%; + height: 100vh; + display: flex; + justify-content: center; + align-items: center; +} +.container +{ + width: 30rem; + padding: 10px; + border-radius: 10px; + background-color: aliceblue; + font-size: 40px; + text-align: center; + + +} +button{ +display: block; +width: 100%; +background-color: black; +color: white; +border: none; +border-radius: 5px; + font-size: 40px; + margin-top: 5px; + +} \ No newline at end of file From 914d99845e2d84e02ab78eb5ca39349c381475a3 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Thu, 18 Jul 2024 03:31:45 +0530 Subject: [PATCH 002/167] Solve linter error --- Source-Code/RandomColorGenerator/index.html | 33 +++++----- Source-Code/RandomColorGenerator/script.js | 32 +++++----- Source-Code/RandomColorGenerator/style.css | 70 +++++++++++---------- 3 files changed, 69 insertions(+), 66 deletions(-) diff --git a/Source-Code/RandomColorGenerator/index.html b/Source-Code/RandomColorGenerator/index.html index a5570f9..22f878c 100644 --- a/Source-Code/RandomColorGenerator/index.html +++ b/Source-Code/RandomColorGenerator/index.html @@ -1,20 +1,21 @@ - - - - Document - - - + + + + Random Color Generator + + + +
+

Random Color Generator

+
-
-

#fff

- -
+
+

#fff

+ +
- - - \ No newline at end of file + + + diff --git a/Source-Code/RandomColorGenerator/script.js b/Source-Code/RandomColorGenerator/script.js index 1c853c8..a11f409 100644 --- a/Source-Code/RandomColorGenerator/script.js +++ b/Source-Code/RandomColorGenerator/script.js @@ -1,17 +1,15 @@ -const getColor = () => - { - const randomNumber=Math.floor(Math.random() * 1677215); - const randomCode = "#" + randomNumber.toString(16); - console.log(randomNumber,randomCode); - document.body.style.backgroundColor = randomCode - document.getElementById("color-code").innerText = randomCode - navigator.clipboard.writeText(randomCode)//Copy the color code to clipboard also - } - //function call - document.getElementById("btn").addEventListener( - "click", - getColor - ) - //init call - getColor(); - \ No newline at end of file +const getColor = () => { + const randomNumber = Math.floor(Math.random() * 1677215); + const randomCode = `#${randomNumber.toString(16)}`; + console.log(randomNumber, randomCode); + document.body.style.backgroundColor = randomCode; + document.getElementById('color-code').innerText = randomCode; + navigator.clipboard.writeText(randomCode);// Copy the color code to clipboard also +}; +// function call +document.getElementById('btn').addEventListener( + 'click', + getColor, +); +// init call +getColor(); diff --git a/Source-Code/RandomColorGenerator/style.css b/Source-Code/RandomColorGenerator/style.css index fc3bdcf..a36ff4a 100644 --- a/Source-Code/RandomColorGenerator/style.css +++ b/Source-Code/RandomColorGenerator/style.css @@ -1,40 +1,44 @@ -*{ - margin: 0; - padding: 0; - box-sizing: border-box; - font-family: sans-serif; +* { + margin: 0; + padding: 0; + box-sizing: border-box; + font-family: sans-serif; } -body -{ - transition: 1s; + +body { + transition: 1s; } -.main -{ - width: 100%; - height: 100vh; - display: flex; - justify-content: center; - align-items: center; + +h1 { + font-size: 35px; + text-align: center; } -.container -{ - width: 30rem; - padding: 10px; - border-radius: 10px; - background-color: aliceblue; - font-size: 40px; - text-align: center; +.main { + width: 100%; + height: 100vh; + display: flex; + justify-content: center; + align-items: center; +} +.container { + width: 30rem; + padding: 10px; + border-radius: 10px; + background-color: aliceblue; + font-size: 40px; + text-align: center; } -button{ -display: block; -width: 100%; -background-color: black; -color: white; -border: none; -border-radius: 5px; - font-size: 40px; - margin-top: 5px; -} \ No newline at end of file +button { + display: block; + width: 100%; + background-color: black; + color: white; + border: none; + border-radius: 5px; + font-size: 40px; + margin-top: 5px; + cursor: pointer; +} From 9855428b56a335aaf959c4f3eba05128a4d4d8d6 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Thu, 18 Jul 2024 03:32:02 +0530 Subject: [PATCH 003/167] update the readme --- README.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/README.md b/README.md index 3709f2b..73ca3d1 100644 --- a/README.md +++ b/README.md @@ -199,6 +199,17 @@ In order to run this project you need: +
  • +
    +Random Color Generator +

    Random Color Generator is a user-friendly tool built using HTML, CSS, and JavaScript. The Random Color Generator project is a beginner-friendly web development project designed to help users generate random colors effortlessly. Users can click a button to instantly see randomly generated colors.

    + +
    +
  • +

    (back to top)

    @@ -233,6 +244,10 @@ In order to run this project you need: - GitHub: [olanikegloria](https://github.com/olanikegloria) - LinkedIn: [olanikegloria](https://www.linkedin.com/in/olani/) +👤 **amiii123malviya** + +- GitHub: [amiii123malviya](https://github.com/amiii123malvi) +

    (back to top)

    ## ⭐️ Show your support From 6dc4782f06fe09dd9ad8c88ffea864d887f6ed78 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Sun, 21 Jul 2024 02:16:44 +0530 Subject: [PATCH 004/167] created template for age calculator --- Source-Code/AgeCalculator/index.html | 13 +++++++++++++ Source-Code/AgeCalculator/script.js | 0 Source-Code/AgeCalculator/style.css | 0 3 files changed, 13 insertions(+) create mode 100644 Source-Code/AgeCalculator/index.html create mode 100644 Source-Code/AgeCalculator/script.js create mode 100644 Source-Code/AgeCalculator/style.css diff --git a/Source-Code/AgeCalculator/index.html b/Source-Code/AgeCalculator/index.html new file mode 100644 index 0000000..d903295 --- /dev/null +++ b/Source-Code/AgeCalculator/index.html @@ -0,0 +1,13 @@ + + + + + + Age Calculator + + + + + + + \ No newline at end of file diff --git a/Source-Code/AgeCalculator/script.js b/Source-Code/AgeCalculator/script.js new file mode 100644 index 0000000..e69de29 diff --git a/Source-Code/AgeCalculator/style.css b/Source-Code/AgeCalculator/style.css new file mode 100644 index 0000000..e69de29 From acb9009fde2e286e3c05ac6a9a2e64b7e475f634 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Sun, 21 Jul 2024 02:53:09 +0530 Subject: [PATCH 005/167] create container to display age --- Source-Code/AgeCalculator/index.html | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/Source-Code/AgeCalculator/index.html b/Source-Code/AgeCalculator/index.html index d903295..bcd17d9 100644 --- a/Source-Code/AgeCalculator/index.html +++ b/Source-Code/AgeCalculator/index.html @@ -7,7 +7,17 @@ - +
    +
    +

    +

    Enter the DOB in format: (MM/DD/YYYY)

    + + +
    +
    +

    +
    +
    - \ No newline at end of file + From 269e827f23168edd7aac34a3d672d623be4b4c91 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Sun, 21 Jul 2024 02:53:22 +0530 Subject: [PATCH 006/167] Add styles --- Source-Code/AgeCalculator/style.css | 79 +++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/Source-Code/AgeCalculator/style.css b/Source-Code/AgeCalculator/style.css index e69de29..f492f48 100644 --- a/Source-Code/AgeCalculator/style.css +++ b/Source-Code/AgeCalculator/style.css @@ -0,0 +1,79 @@ +*{ + margin:0; + padding:0; + box-sizing:border-box; + font-family:cursive; +} +.center{ + display:flex; + justify-content:center; + align-items:center; + height:100vh; +} +.container{ + display:flex; + width:600px; + /* margin:auto; + margin-top:10%; + margin-bottom:10%; */ + align-items:center; + justify-content:center; + flex-direction:column; + background-color:rgb(169, 216, 80); + box-shadow:8px 8px black; + color:white; + padding:5% 0%; +} + +#currDate{ + font-size:30px; + margin:20px; + font-weight:bold; +} + +input{ + font-size:20px; + padding:15px; + margin:20px; + text-align:center; + border-radius:20px; + border:1px solid yellow; + cursor:pointer; +} + +button{ + font-size:20px; + padding:10px 20px; + border-radius:10px; + border:none; + background-color:yellow; + color:black; + margin:20px; + text-transform: uppercase; + font-weight:bold; + cursor:pointer; +} + +button:hover{ + background-color:white; + color:rgb(169, 216, 80); +} + +#displayAge{ + display:flex; + align-items:center; + justify-content:center; + width:620px; + height:490px; + background-color:rgb(91, 228, 141); + border-radius:30px; + position:absolute; + visibility: hidden; +} + +#age{ + color:white; + font-size:50px; + margin:20px; + font-weight:bold; +} \ No newline at end of file From b296466ab575372f29363b526a39a7c6fb7432c8 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Sun, 21 Jul 2024 02:54:45 +0530 Subject: [PATCH 007/167] Add functionalities --- Source-Code/AgeCalculator/script.js | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/Source-Code/AgeCalculator/script.js b/Source-Code/AgeCalculator/script.js index e69de29..b386593 100644 --- a/Source-Code/AgeCalculator/script.js +++ b/Source-Code/AgeCalculator/script.js @@ -0,0 +1,26 @@ +document.addEventListener("DOMContentLoaded", () => { + const currDate = document.getElementById("currDate"); + const dateOfBirth = document.querySelector("#DOB"); + const calcAgeButton = document.getElementById("CalcAge"); + const displayAge = document.getElementById("displayAge"); + const ageText = document.getElementById("age"); + const today = new Date(); + + currDate.innerText = `Today's Date is: ${today.toLocaleDateString("en-US")}`; + + calcAgeButton.addEventListener("click", () => { + const birthDate = new Date(dateOfBirth.value); + let age = today.getFullYear() - birthDate.getFullYear(); + const monthDifference = today.getMonth() - birthDate.getMonth(); + + if ( + monthDifference < 0 || + (monthDifference === 0 && today.getDate() < birthDate.getDate()) + ) { + age--; + } + + displayAge.style.visibility = "visible"; + ageText.innerText = `You are ${age} years old.`; + }); +}); From 0f51fc49b9b0346aae0ef6ed6445426ddc77a2f1 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Sun, 21 Jul 2024 02:58:09 +0530 Subject: [PATCH 008/167] solve linter errors --- Source-Code/AgeCalculator/index.html | 24 ++--- Source-Code/AgeCalculator/script.js | 24 ++--- Source-Code/AgeCalculator/style.css | 129 ++++++++++++++------------- 3 files changed, 90 insertions(+), 87 deletions(-) diff --git a/Source-Code/AgeCalculator/index.html b/Source-Code/AgeCalculator/index.html index bcd17d9..39f9756 100644 --- a/Source-Code/AgeCalculator/index.html +++ b/Source-Code/AgeCalculator/index.html @@ -1,23 +1,23 @@ - - - + + + Age Calculator - - - + + +
    -
    +

    Enter the DOB in format: (MM/DD/YYYY)

    - + -
    -
    +
    +

    +
    -
    - + diff --git a/Source-Code/AgeCalculator/script.js b/Source-Code/AgeCalculator/script.js index b386593..c7cc5d4 100644 --- a/Source-Code/AgeCalculator/script.js +++ b/Source-Code/AgeCalculator/script.js @@ -1,26 +1,26 @@ -document.addEventListener("DOMContentLoaded", () => { - const currDate = document.getElementById("currDate"); - const dateOfBirth = document.querySelector("#DOB"); - const calcAgeButton = document.getElementById("CalcAge"); - const displayAge = document.getElementById("displayAge"); - const ageText = document.getElementById("age"); +document.addEventListener('DOMContentLoaded', () => { + const currDate = document.getElementById('currDate'); + const dateOfBirth = document.querySelector('#DOB'); + const calcAgeButton = document.getElementById('CalcAge'); + const displayAge = document.getElementById('displayAge'); + const ageText = document.getElementById('age'); const today = new Date(); - currDate.innerText = `Today's Date is: ${today.toLocaleDateString("en-US")}`; + currDate.innerText = `Today's Date is: ${today.toLocaleDateString('en-US')}`; - calcAgeButton.addEventListener("click", () => { + calcAgeButton.addEventListener('click', () => { const birthDate = new Date(dateOfBirth.value); let age = today.getFullYear() - birthDate.getFullYear(); const monthDifference = today.getMonth() - birthDate.getMonth(); if ( - monthDifference < 0 || - (monthDifference === 0 && today.getDate() < birthDate.getDate()) + monthDifference < 0 + || (monthDifference === 0 && today.getDate() < birthDate.getDate()) ) { - age--; + age -= 1; } - displayAge.style.visibility = "visible"; + displayAge.style.visibility = 'visible'; ageText.innerText = `You are ${age} years old.`; }); }); diff --git a/Source-Code/AgeCalculator/style.css b/Source-Code/AgeCalculator/style.css index f492f48..a1fdad4 100644 --- a/Source-Code/AgeCalculator/style.css +++ b/Source-Code/AgeCalculator/style.css @@ -1,79 +1,82 @@ -*{ - margin:0; - padding:0; - box-sizing:border-box; - font-family:cursive; +* { + margin: 0; + padding: 0; + box-sizing: border-box; + font-family: cursive; } -.center{ - display:flex; - justify-content:center; - align-items:center; - height:100vh; + +.center { + display: flex; + justify-content: center; + align-items: center; + height: 100vh; } -.container{ - display:flex; - width:600px; - /* margin:auto; + +.container { + display: flex; + width: 600px; + + /* margin:auto; margin-top:10%; margin-bottom:10%; */ - align-items:center; - justify-content:center; - flex-direction:column; - background-color:rgb(169, 216, 80); - box-shadow:8px 8px black; - color:white; - padding:5% 0%; + align-items: center; + justify-content: center; + flex-direction: column; + background-color: rgb(169, 216, 80); + box-shadow: 8px 8px black; + color: white; + padding: 5% 0%; } -#currDate{ - font-size:30px; - margin:20px; - font-weight:bold; +#currDate { + font-size: 30px; + margin: 20px; + font-weight: bold; } -input{ - font-size:20px; - padding:15px; - margin:20px; - text-align:center; - border-radius:20px; - border:1px solid yellow; - cursor:pointer; +input { + font-size: 20px; + padding: 15px; + margin: 20px; + text-align: center; + border-radius: 20px; + border: 1px solid yellow; + cursor: pointer; } -button{ - font-size:20px; - padding:10px 20px; - border-radius:10px; - border:none; - background-color:yellow; - color:black; - margin:20px; - text-transform: uppercase; - font-weight:bold; - cursor:pointer; +button { + font-size: 20px; + padding: 10px 20px; + border-radius: 10px; + border: none; + background-color: yellow; + color: black; + margin: 20px; + text-transform: uppercase; + font-weight: bold; + cursor: pointer; } -button:hover{ - background-color:white; - color:rgb(169, 216, 80); +button:hover { + background-color: white; + color: rgb(169, 216, 80); } -#displayAge{ - display:flex; - align-items:center; - justify-content:center; - width:620px; - height:490px; - background-color:rgb(91, 228, 141); - border-radius:30px; - position:absolute; - visibility: hidden; +#displayAge { + display: flex; + align-items: center; + justify-content: center; + width: 620px; + height: 490px; + background-color: rgb(91, 228, 141); + border-radius: 30px; + position: absolute; + visibility: hidden; } -#age{ - color:white; - font-size:50px; - margin:20px; - font-weight:bold; -} \ No newline at end of file +#age { + color: white; + font-size: 50px; + margin: 20px; + font-weight: bold; +} From 80b2387a9e5993bfa0a491e9b4be0bbdc285e888 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Sun, 21 Jul 2024 03:01:48 +0530 Subject: [PATCH 009/167] Update readme --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 73ca3d1..da812fe 100644 --- a/README.md +++ b/README.md @@ -210,6 +210,17 @@ In order to run this project you need: +
  • +
    +Age Calculator +

    Age Calculator is a user-friendly tool built using HTML, CSS, and JavaScript. The Age Calculator project is a beginner-friendly web development project designed to help users calculate their age effortlessly. Users can input their date of birth and instantly see their age in years.

    + +
    +
  • +

    (back to top)

    From b2e1cd6dac5febe34030fd65c1a9c0a071cf1b3a Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 22 Jul 2024 17:43:30 +0530 Subject: [PATCH 010/167] Create a boiler plate for project --- Source-Code/BMICalculator/index.html | 13 +++++++++++++ Source-Code/BMICalculator/script.js | 0 Source-Code/BMICalculator/style.css | 0 3 files changed, 13 insertions(+) create mode 100644 Source-Code/BMICalculator/index.html create mode 100644 Source-Code/BMICalculator/script.js create mode 100644 Source-Code/BMICalculator/style.css diff --git a/Source-Code/BMICalculator/index.html b/Source-Code/BMICalculator/index.html new file mode 100644 index 0000000..dfeb8cb --- /dev/null +++ b/Source-Code/BMICalculator/index.html @@ -0,0 +1,13 @@ + + + + + + BMI Calculator + + + + + + + \ No newline at end of file diff --git a/Source-Code/BMICalculator/script.js b/Source-Code/BMICalculator/script.js new file mode 100644 index 0000000..e69de29 diff --git a/Source-Code/BMICalculator/style.css b/Source-Code/BMICalculator/style.css new file mode 100644 index 0000000..e69de29 From d3741b325c95f6f814150c2680dc1795cd0517a8 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 22 Jul 2024 18:54:21 +0530 Subject: [PATCH 011/167] Add table and calculator container --- Source-Code/BMICalculator/index.html | 57 +++++++++++++++++++++++----- 1 file changed, 48 insertions(+), 9 deletions(-) diff --git a/Source-Code/BMICalculator/index.html b/Source-Code/BMICalculator/index.html index dfeb8cb..5e84c84 100644 --- a/Source-Code/BMICalculator/index.html +++ b/Source-Code/BMICalculator/index.html @@ -1,13 +1,52 @@ - - - + + + BMI Calculator - - - - + + + + +
    +
    +

    Body Mass Index Calculator

    +

    Height in cm

    + +

    Weight in kg

    + +

    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    BMICategory
    less than 18.5Underweight
    between 18.5 and 24.9Ideal
    between 25 and 29.9Overweight
    over 30Obesity
    +
    +
    - - \ No newline at end of file + + From ccb44260960cb6538e621a2e9f7e7ae06843a777 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 22 Jul 2024 18:55:03 +0530 Subject: [PATCH 012/167] Add funtionalites --- Source-Code/BMICalculator/script.js | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/Source-Code/BMICalculator/script.js b/Source-Code/BMICalculator/script.js index e69de29..78dddd5 100644 --- a/Source-Code/BMICalculator/script.js +++ b/Source-Code/BMICalculator/script.js @@ -0,0 +1,20 @@ +document.getElementById('btn').addEventListener('click', () => { + const height = parseFloat(document.getElementById('height').value); + const weight = parseFloat(document.getElementById('weight').value); + + if ( + Number.isNaN(height) + || Number.isNaN(weight) + || height <= 0 + || weight <= 0 + ) { + document.getElementById('result').innerHTML = 'Please enter valid positive numbers for height and weight.'; + return; + } + + const heightInMeters = height / 100; + const bmi = weight / (heightInMeters * heightInMeters); + const bmio = bmi.toFixed(2); + + document.getElementById('result').innerHTML = `Your BMI is ${bmio}`; +}); From a5245930b4d8d5bf62a33962ada6dad8b02f367b Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 22 Jul 2024 18:58:27 +0530 Subject: [PATCH 013/167] Add Styles for table and form --- Source-Code/BMICalculator/style.css | 98 +++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) diff --git a/Source-Code/BMICalculator/style.css b/Source-Code/BMICalculator/style.css index e69de29..9195295 100644 --- a/Source-Code/BMICalculator/style.css +++ b/Source-Code/BMICalculator/style.css @@ -0,0 +1,98 @@ +body { + text-align: center; + font-family: 'Courier New', Courier, monospace; + background: linear-gradient(rgb(63, 217, 220) 0%, rgb(238, 248, 248) 100%); + min-height: 100vh; +} + +.container { + margin: 20px; + display: flex; + flex-direction: column; + align-items: center; +} + +.bmi { + width: 350px; + background-color: #fff; + padding: 20px; + border-radius: 10px; + margin: auto; +} + +h2 { + font-size: 30px; + font-weight: 600; +} + +.text { + text-align: center; +} + +#weight, +#height { + color: #222f3e; + text-align: left; + font-size: 20px; + font-weight: 200; + outline: none; + border: 1px solid black; + border-radius: 7px; + width: 200px; + height: 35px; +} + +#weight:focus, +#height:focus { + width: 250px; + transition: 0.5s; +} + +#result { + color: #971f1f; + font-size: large; + font-weight: 400; +} + +#btn { + font-size: medium; + font-family: inherit; + margin-top: 10px; + border: none; + background: lightblue; + width: 150px; + padding: 10px; + border-radius: 30px; + outline: none; + cursor: pointer; + transition: 0.5s; +} + +#btn:hover { + transform: scale(1.1); + transition: 0.5s; +} + +table { + width: 400px; + border-collapse: collapse; + margin: 20px auto; +} + +tr { + background: lightblue; +} + +th { + background: #fff; + color: #000; + font-weight: bold; +} + +td, +th { + padding: 10px; + border: 1px solid #000; + text-align: center; + font-size: 18px; +} From 92953e63d4486cf70bb90bb61178d47ac29742dd Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 22 Jul 2024 19:01:07 +0530 Subject: [PATCH 014/167] Add project description --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index da812fe..1a2e3f0 100644 --- a/README.md +++ b/README.md @@ -221,6 +221,17 @@ In order to run this project you need: +
  • +
    +BMI Calculator +

    The BMI Calculator is a simple web application built using HTML, CSS, and JavaScript. It allows users to easily calculate their Body Mass Index (BMI) by entering their height and weight. The application then computes the BMI and displays the result, helping users understand their body mass relative to their height and weight. This project is beginner-friendly and provides a practical example of using basic web development skills to create a functional tool.

    + +
    +
  • +

    (back to top)

    From 50827ba6733373c9b581f549d0fb53de2e66eb7e Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 22 Jul 2024 19:36:08 +0530 Subject: [PATCH 015/167] Create a template for project --- Source-Code/GradientBackgroundGenerator/index.html | 14 ++++++++++++++ Source-Code/GradientBackgroundGenerator/script.js | 0 Source-Code/GradientBackgroundGenerator/style.css | 0 3 files changed, 14 insertions(+) create mode 100644 Source-Code/GradientBackgroundGenerator/index.html create mode 100644 Source-Code/GradientBackgroundGenerator/script.js create mode 100644 Source-Code/GradientBackgroundGenerator/style.css diff --git a/Source-Code/GradientBackgroundGenerator/index.html b/Source-Code/GradientBackgroundGenerator/index.html new file mode 100644 index 0000000..dca47fc --- /dev/null +++ b/Source-Code/GradientBackgroundGenerator/index.html @@ -0,0 +1,14 @@ + + + + + + Gradient Background Generator + + + + + + + + \ No newline at end of file diff --git a/Source-Code/GradientBackgroundGenerator/script.js b/Source-Code/GradientBackgroundGenerator/script.js new file mode 100644 index 0000000..e69de29 diff --git a/Source-Code/GradientBackgroundGenerator/style.css b/Source-Code/GradientBackgroundGenerator/style.css new file mode 100644 index 0000000..e69de29 From 0a32fa2f3178c0bb9d0a9a13f3ce1529e05147cb Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 22 Jul 2024 20:39:05 +0530 Subject: [PATCH 016/167] Add input and copy button --- .../GradientBackgroundGenerator/index.html | 44 ++++++++++++++----- 1 file changed, 34 insertions(+), 10 deletions(-) diff --git a/Source-Code/GradientBackgroundGenerator/index.html b/Source-Code/GradientBackgroundGenerator/index.html index dca47fc..dbe0756 100644 --- a/Source-Code/GradientBackgroundGenerator/index.html +++ b/Source-Code/GradientBackgroundGenerator/index.html @@ -1,14 +1,38 @@ - - - + + + Gradient Background Generator - - - - - + + + +

    Background Generator

    + + + + +

    Current CSS Background

    +
    +

    + +
    - - \ No newline at end of file + + From 49e0411f08e26ff7f294a2052ab38168da0eb4db Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 22 Jul 2024 20:39:43 +0530 Subject: [PATCH 017/167] Add functionality for copy the code --- .../GradientBackgroundGenerator/script.js | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/Source-Code/GradientBackgroundGenerator/script.js b/Source-Code/GradientBackgroundGenerator/script.js index e69de29..c29aa31 100644 --- a/Source-Code/GradientBackgroundGenerator/script.js +++ b/Source-Code/GradientBackgroundGenerator/script.js @@ -0,0 +1,33 @@ +document.addEventListener('DOMContentLoaded', () => { + const gradient = document.getElementById('gradient'); + const color1 = document.querySelector('.color1'); + const color2 = document.querySelector('.color2'); + const cssBackground = document.getElementById('css-background'); + const copyBtn = document.getElementById('copy-btn'); + + const updateBackground = () => { + const color1Value = color1.value; + const color2Value = color2.value; + const background = `linear-gradient(to right, ${color1Value}, ${color2Value})`; + + gradient.style.background = background; + cssBackground.textContent = `background: ${background};`; + }; + + const copyToClipboard = () => { + const textToCopy = cssBackground.textContent; + navigator.clipboard.writeText(textToCopy).then( + () => { + alert('CSS background value copied to clipboard!'); + }, + (err) => { + console.error('Failed to copy: ', err); + }, + ); + }; + color1.addEventListener('input', updateBackground); + color2.addEventListener('input', updateBackground); + copyBtn.addEventListener('click', copyToClipboard); + // Initialize background on page load + updateBackground(); +}); From 8edbb19d5b723d93a0da9dab09d2d9a0d1270083 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 22 Jul 2024 20:39:59 +0530 Subject: [PATCH 018/167] Add styles and transition --- .../GradientBackgroundGenerator/style.css | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/Source-Code/GradientBackgroundGenerator/style.css b/Source-Code/GradientBackgroundGenerator/style.css index e69de29..21535ab 100644 --- a/Source-Code/GradientBackgroundGenerator/style.css +++ b/Source-Code/GradientBackgroundGenerator/style.css @@ -0,0 +1,54 @@ +body { + margin: 0; + padding: 0; + font-family: Arial, sans-serif; + text-align: center; + background: linear-gradient(to right, #f00, #ff0); + transition: 0.5s ease; +} + +h1 { + margin-top: 20px; +} + +input { + margin: 10px; + border: none; + height: 40px; + width: 100px; +} + +h2, +h3 { + margin: 20px; +} + +button { + width: 250px; + height: 40px; + background: #eeeff1; + color: rgb(16, 16, 16); + border: none; + border-radius: 0.6em; + cursor: pointer; + font-size: large; + font-weight: 500; + margin-top: 1rem; + transition: 0.5s, color 0.5s, transform 0.5s; +} + +button:hover { + background: #8ce0ea; + color: #eeeff1; + transform: scale(1.1); +} + +@keyframes button-press { + 0% { transform: scale(1); } + 50% { transform: scale(0.9); } + 100% { transform: scale(1); } +} + +button:active { + animation: button-press 0.2s; +} From 4a2b255317f5cb8b0290350474c0a976d3b9ce32 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 22 Jul 2024 20:40:17 +0530 Subject: [PATCH 019/167] update the project --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 1a2e3f0..f94a9ed 100644 --- a/README.md +++ b/README.md @@ -232,6 +232,17 @@ In order to run this project you need: +
  • +
    +Gradient Background Generator +

    The Gradient Background Generator is a user-friendly tool built using HTML, CSS, and JavaScript. This project allows users to create beautiful gradient backgrounds effortlessly. Users can select two colors to generate a gradient background and see the corresponding CSS code, which they can easily copy and use in their own projects. The tool is designed to be beginner-friendly, making it an excellent project for those new to web development.

    + +
    +
  • +

    (back to top)

    From 32401653c2c2bb63bd260b55044c011417aef49c Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 22 Jul 2024 21:09:37 +0530 Subject: [PATCH 020/167] Create a template for project --- Source-Code/Calculator/index.html | 11 +++++++++++ Source-Code/Calculator/script.js | 0 Source-Code/Calculator/style.css | 0 3 files changed, 11 insertions(+) create mode 100644 Source-Code/Calculator/index.html create mode 100644 Source-Code/Calculator/script.js create mode 100644 Source-Code/Calculator/style.css diff --git a/Source-Code/Calculator/index.html b/Source-Code/Calculator/index.html new file mode 100644 index 0000000..7740e11 --- /dev/null +++ b/Source-Code/Calculator/index.html @@ -0,0 +1,11 @@ + + + + + + Calculator + + + + + \ No newline at end of file diff --git a/Source-Code/Calculator/script.js b/Source-Code/Calculator/script.js new file mode 100644 index 0000000..e69de29 diff --git a/Source-Code/Calculator/style.css b/Source-Code/Calculator/style.css new file mode 100644 index 0000000..e69de29 From adc56b8a9dd29a554df407027ff58b2c9aaf91ba Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 22 Jul 2024 21:32:33 +0530 Subject: [PATCH 021/167] Add buttons --- Source-Code/Calculator/index.html | 32 +++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/Source-Code/Calculator/index.html b/Source-Code/Calculator/index.html index 7740e11..4698951 100644 --- a/Source-Code/Calculator/index.html +++ b/Source-Code/Calculator/index.html @@ -4,8 +4,36 @@ Calculator + - +
    + +
    + + + + + + + + + + + + + + + + + + + + + + +
    +
    + - \ No newline at end of file + From 4995b96af2dc907ae913c932563282b84addeb3d Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 22 Jul 2024 21:32:55 +0530 Subject: [PATCH 022/167] Add styles for buttons --- Source-Code/Calculator/style.css | 82 ++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/Source-Code/Calculator/style.css b/Source-Code/Calculator/style.css index e69de29..8cd9620 100644 --- a/Source-Code/Calculator/style.css +++ b/Source-Code/Calculator/style.css @@ -0,0 +1,82 @@ +* { + box-sizing: border-box; +} + +body { + display: flex; + justify-content: center; + align-items: center; + height: 100vh; + background: #f9f6ee; + font-family: 'Roboto', sans-serif; +} + +.calculator { + border-radius: 10px; + overflow: hidden; + box-shadow: 0 0 20px rgba(0, 0, 0, 0.2); +} + +.calculator-screen { + width: 100%; + height: 100px; + border: none; + background-color: #252525; + color: white; + text-align: right; + padding: 10px 20px; + font-size: 2.5rem; +} + +.calculator-keys { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 10px; + padding: 20px; + background-color: #f1f3f6; +} + +button { + height: 60px; + border-radius: 5px; + border: none; + font-size: 1.5rem; + color: white; + background-color: #333; + cursor: pointer; + transition: background-color 0.2s ease; +} + +button:hover { + background-color: #555; +} + +.operator { + background-color: #f39c12; +} + +.operator:hover { + background-color: #d87a0d; +} + +.equal-sign { + height: calc(80px + 10px); + grid-column: span 4; + font-size: 30px; +} + +.all-clear { + background-color: #e74c3c; +} + +.all-clear:hover { + background-color: #c0392b; +} + +.decimal { + background-color: #9b59b6; +} + +.decimal:hover { + background-color: #8e44ad; +} From 3e5a7904f3d432ce523579df8bf23083394db5cd Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 22 Jul 2024 21:38:16 +0530 Subject: [PATCH 023/167] Add functiaonalities --- Source-Code/Calculator/index.html | 2 +- Source-Code/Calculator/script.js | 114 ++++++++++++++++++++++++++++++ 2 files changed, 115 insertions(+), 1 deletion(-) diff --git a/Source-Code/Calculator/index.html b/Source-Code/Calculator/index.html index 4698951..e601605 100644 --- a/Source-Code/Calculator/index.html +++ b/Source-Code/Calculator/index.html @@ -8,7 +8,7 @@
    - +
    diff --git a/Source-Code/Calculator/script.js b/Source-Code/Calculator/script.js index e69de29..894d78c 100644 --- a/Source-Code/Calculator/script.js +++ b/Source-Code/Calculator/script.js @@ -0,0 +1,114 @@ +let firstOperand = ""; +let secondOperand = ""; +let currentOperator = null; +let awaitingSecondOperand = false; + +const display = document.querySelector(".calculator-screen"); +const keys = document.querySelector(".calculator-keys"); + +const updateDisplay = () => { + display.value = awaitingSecondOperand ? secondOperand : firstOperand; +}; + +const resetCalculator = () => { + firstOperand = ""; + secondOperand = ""; + currentOperator = null; + awaitingSecondOperand = false; + updateDisplay(); +}; + +const inputNumber = (number) => { + if (awaitingSecondOperand) { + secondOperand += number; + } else { + firstOperand += number; + } + updateDisplay(); +}; + +const inputOperator = (operator) => { + if (!firstOperand) return; + + if (secondOperand) { + calculate(); + } + + currentOperator = operator; + awaitingSecondOperand = true; +}; + +const inputDecimal = () => { + if (awaitingSecondOperand) { + if (!secondOperand.includes(".")) { + secondOperand += "."; + } + } else { + if (!firstOperand.includes(".")) { + firstOperand += "."; + } + } + updateDisplay(); +}; + +const calculate = () => { + let result; + const first = parseFloat(firstOperand); + const second = parseFloat(secondOperand); + + if (Number.isNaN(first) || Number.isNaN(second)) return; + + switch (currentOperator) { + case "+": + result = first + second; + break; + case "-": + result = first - second; + break; + case "*": + result = first * second; + break; + case "/": + result = first / second; + break; + default: + return; + } + + firstOperand = String(result); + secondOperand = ""; + awaitingSecondOperand = false; + currentOperator = null; + updateDisplay(); +}; + +keys.addEventListener("click", (event) => { + const { target } = event; + const { value } = target; + + if (!target.matches("button")) return; + + switch (value) { + case "all-clear": + resetCalculator(); + break; + case "=": + calculate(); + break; + case ".": + inputDecimal(); + break; + case "+": + case "-": + case "*": + case "/": + inputOperator(value); + break; + default: + if (Number.isInteger(parseFloat(value))) { + inputNumber(value); + } + } +}); + +document.addEventListener("DOMContentLoaded", updateDisplay); From 4fa0ee1449022853575b866644877be61dc7b50e Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 22 Jul 2024 21:39:54 +0530 Subject: [PATCH 024/167] Solve linter errors --- Source-Code/Calculator/script.js | 73 ++++++++++++++-------------- Source-Code/Calculator/style.css | 82 ++++++++++++++++---------------- 2 files changed, 76 insertions(+), 79 deletions(-) diff --git a/Source-Code/Calculator/script.js b/Source-Code/Calculator/script.js index 894d78c..a924bde 100644 --- a/Source-Code/Calculator/script.js +++ b/Source-Code/Calculator/script.js @@ -1,18 +1,18 @@ -let firstOperand = ""; -let secondOperand = ""; +let firstOperand = ''; +let secondOperand = ''; let currentOperator = null; let awaitingSecondOperand = false; -const display = document.querySelector(".calculator-screen"); -const keys = document.querySelector(".calculator-keys"); +const display = document.querySelector('.calculator-screen'); +const keys = document.querySelector('.calculator-keys'); const updateDisplay = () => { display.value = awaitingSecondOperand ? secondOperand : firstOperand; }; const resetCalculator = () => { - firstOperand = ""; - secondOperand = ""; + firstOperand = ''; + secondOperand = ''; currentOperator = null; awaitingSecondOperand = false; updateDisplay(); @@ -27,26 +27,13 @@ const inputNumber = (number) => { updateDisplay(); }; -const inputOperator = (operator) => { - if (!firstOperand) return; - - if (secondOperand) { - calculate(); - } - - currentOperator = operator; - awaitingSecondOperand = true; -}; - const inputDecimal = () => { if (awaitingSecondOperand) { - if (!secondOperand.includes(".")) { - secondOperand += "."; - } - } else { - if (!firstOperand.includes(".")) { - firstOperand += "."; + if (!secondOperand.includes('.')) { + secondOperand += '.'; } + } else if (!firstOperand.includes('.')) { + firstOperand += '.'; } updateDisplay(); }; @@ -59,16 +46,16 @@ const calculate = () => { if (Number.isNaN(first) || Number.isNaN(second)) return; switch (currentOperator) { - case "+": + case '+': result = first + second; break; - case "-": + case '-': result = first - second; break; - case "*": + case '*': result = first * second; break; - case "/": + case '/': result = first / second; break; default: @@ -76,32 +63,42 @@ const calculate = () => { } firstOperand = String(result); - secondOperand = ""; + secondOperand = ''; awaitingSecondOperand = false; currentOperator = null; updateDisplay(); }; +const inputOperator = (operator) => { + if (!firstOperand) return; + + if (secondOperand) { + calculate(); + } + + currentOperator = operator; + awaitingSecondOperand = true; +}; -keys.addEventListener("click", (event) => { +keys.addEventListener('click', (event) => { const { target } = event; const { value } = target; - if (!target.matches("button")) return; + if (!target.matches('button')) return; switch (value) { - case "all-clear": + case 'all-clear': resetCalculator(); break; - case "=": + case '=': calculate(); break; - case ".": + case '.': inputDecimal(); break; - case "+": - case "-": - case "*": - case "/": + case '+': + case '-': + case '*': + case '/': inputOperator(value); break; default: @@ -111,4 +108,4 @@ keys.addEventListener("click", (event) => { } }); -document.addEventListener("DOMContentLoaded", updateDisplay); +document.addEventListener('DOMContentLoaded', updateDisplay); diff --git a/Source-Code/Calculator/style.css b/Source-Code/Calculator/style.css index 8cd9620..b48d8d0 100644 --- a/Source-Code/Calculator/style.css +++ b/Source-Code/Calculator/style.css @@ -1,82 +1,82 @@ * { - box-sizing: border-box; + box-sizing: border-box; } body { - display: flex; - justify-content: center; - align-items: center; - height: 100vh; - background: #f9f6ee; - font-family: 'Roboto', sans-serif; + display: flex; + justify-content: center; + align-items: center; + height: 100vh; + background: #f9f6ee; + font-family: 'Roboto', sans-serif; } .calculator { - border-radius: 10px; - overflow: hidden; - box-shadow: 0 0 20px rgba(0, 0, 0, 0.2); + border-radius: 10px; + overflow: hidden; + box-shadow: 0 0 20px rgba(0, 0, 0, 0.2); } .calculator-screen { - width: 100%; - height: 100px; - border: none; - background-color: #252525; - color: white; - text-align: right; - padding: 10px 20px; - font-size: 2.5rem; + width: 100%; + height: 100px; + border: none; + background-color: #252525; + color: white; + text-align: right; + padding: 10px 20px; + font-size: 2.5rem; } .calculator-keys { - display: grid; - grid-template-columns: repeat(4, 1fr); - gap: 10px; - padding: 20px; - background-color: #f1f3f6; + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: 10px; + padding: 20px; + background-color: #f1f3f6; } button { - height: 60px; - border-radius: 5px; - border: none; - font-size: 1.5rem; - color: white; - background-color: #333; - cursor: pointer; - transition: background-color 0.2s ease; + height: 60px; + border-radius: 5px; + border: none; + font-size: 1.5rem; + color: white; + background-color: #333; + cursor: pointer; + transition: background-color 0.2s ease; } button:hover { - background-color: #555; + background-color: #555; } .operator { - background-color: #f39c12; + background-color: #f39c12; } .operator:hover { - background-color: #d87a0d; + background-color: #d87a0d; } .equal-sign { - height: calc(80px + 10px); - grid-column: span 4; - font-size: 30px; + height: calc(80px + 10px); + grid-column: span 4; + font-size: 30px; } .all-clear { - background-color: #e74c3c; + background-color: #e74c3c; } .all-clear:hover { - background-color: #c0392b; + background-color: #c0392b; } .decimal { - background-color: #9b59b6; + background-color: #9b59b6; } .decimal:hover { - background-color: #8e44ad; + background-color: #8e44ad; } From d356a56dcd56eaae92722d864dbf5097450cc796 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 22 Jul 2024 21:43:24 +0530 Subject: [PATCH 025/167] Add project --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index f94a9ed..bf34538 100644 --- a/README.md +++ b/README.md @@ -243,6 +243,17 @@ In order to run this project you need: +
  • +
    +Calculator +

    Calculator is a straightforward and user-friendly tool developed using HTML, CSS, and JavaScript. This beginner-friendly web development project is designed to help users perform basic arithmetic operations such as addition, subtraction, multiplication, and division seamlessly. Users can input numbers and choose an operator to instantly see the calculated result. The calculator also includes functionalities for clearing the input and handling decimal numbers.

    + +
    +
  • +

    (back to top)

    From 69ebfe5df57d0090916b2d500fbd488cbd73fe57 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 22 Jul 2024 21:56:19 +0530 Subject: [PATCH 026/167] Create a template for project --- Source-Code/AnalogWatch/index.html | 11 +++++++++++ Source-Code/AnalogWatch/script.js | 0 Source-Code/AnalogWatch/style.css | 0 3 files changed, 11 insertions(+) create mode 100644 Source-Code/AnalogWatch/index.html create mode 100644 Source-Code/AnalogWatch/script.js create mode 100644 Source-Code/AnalogWatch/style.css diff --git a/Source-Code/AnalogWatch/index.html b/Source-Code/AnalogWatch/index.html new file mode 100644 index 0000000..189b1e1 --- /dev/null +++ b/Source-Code/AnalogWatch/index.html @@ -0,0 +1,11 @@ + + + + + + Analog Watch + + + + + \ No newline at end of file diff --git a/Source-Code/AnalogWatch/script.js b/Source-Code/AnalogWatch/script.js new file mode 100644 index 0000000..e69de29 diff --git a/Source-Code/AnalogWatch/style.css b/Source-Code/AnalogWatch/style.css new file mode 100644 index 0000000..e69de29 From c7267938772b8cb193a4988ad4646e62347d4335 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 22 Jul 2024 21:56:47 +0530 Subject: [PATCH 027/167] Add div containers --- Source-Code/AnalogWatch/index.html | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Source-Code/AnalogWatch/index.html b/Source-Code/AnalogWatch/index.html index 189b1e1..aa068db 100644 --- a/Source-Code/AnalogWatch/index.html +++ b/Source-Code/AnalogWatch/index.html @@ -4,8 +4,15 @@ Analog Watch + - +
    +
    +
    +
    +
    +
    + - \ No newline at end of file + From 2ba2283570043e7b7270aec3f7efbe10b9c88020 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 22 Jul 2024 21:57:57 +0530 Subject: [PATCH 028/167] Add styles --- Source-Code/AnalogWatch/style.css | 65 +++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/Source-Code/AnalogWatch/style.css b/Source-Code/AnalogWatch/style.css index e69de29..af9800a 100644 --- a/Source-Code/AnalogWatch/style.css +++ b/Source-Code/AnalogWatch/style.css @@ -0,0 +1,65 @@ +body { + display: flex; + justify-content: center; + align-items: center; + height: 100vh; + background: #f0f0f0; + margin: 0; +} + +.clock { + position: relative; + width: 300px; + height: 300px; + border: 10px solid #333; + border-radius: 50%; + background: white; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.2); +} + +.hand { + position: absolute; + background: #333; + border-radius: 50%; + transform-origin: bottom; + transform: rotate(90deg); + transition: transform 0.5s cubic-bezier(0.4, 2.3, 0.3, 1); +} + +.hour { + width: 6px; + height: 80px; + left: 50%; + top: 50%; + transform: translateX(-50%); + background: #333; +} + +.minute { + width: 4px; + height: 110px; + left: 50%; + top: 50%; + transform: translateX(-50%); + background: #666; +} + +.second { + width: 2px; + height: 120px; + left: 50%; + top: 50%; + transform: translateX(-50%); + background: red; +} + +.center { + position: absolute; + width: 14px; + height: 14px; + background: #333; + border-radius: 50%; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); +} From 1deb39153b256fd1323e4221c81a978c616e4be5 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 22 Jul 2024 22:30:47 +0530 Subject: [PATCH 029/167] Add another div --- Source-Code/AnalogWatch/index.html | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/Source-Code/AnalogWatch/index.html b/Source-Code/AnalogWatch/index.html index aa068db..456e4df 100644 --- a/Source-Code/AnalogWatch/index.html +++ b/Source-Code/AnalogWatch/index.html @@ -8,10 +8,18 @@
    -
    -
    -
    -
    +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + +
    From 04d8a8e04ba42b6e5342998082c9bd0683a2d7da Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 22 Jul 2024 22:31:34 +0530 Subject: [PATCH 030/167] remove width and update styles --- Source-Code/AnalogWatch/style.css | 133 +++++++++++++++++++----------- 1 file changed, 83 insertions(+), 50 deletions(-) diff --git a/Source-Code/AnalogWatch/style.css b/Source-Code/AnalogWatch/style.css index af9800a..68f0a42 100644 --- a/Source-Code/AnalogWatch/style.css +++ b/Source-Code/AnalogWatch/style.css @@ -1,65 +1,98 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + body { - display: flex; - justify-content: center; - align-items: center; - height: 100vh; - background: #f0f0f0; - margin: 0; + display: flex; + justify-content: center; + align-items: center; + min-height: 100vh; + background-color: #2a083d; + z-index: -1; } .clock { - position: relative; - width: 300px; - height: 300px; - border: 10px solid #333; - border-radius: 50%; - background: white; - box-shadow: 0 0 10px rgba(0, 0, 0, 0.2); + width: 350px; + height: 350px; + background: url("./assets/clock.png"); + background-size: cover; + display: flex; + justify-content: center; + align-items: center; + border-radius: 50%; + border: 4px solid #091921; + box-shadow: + 0 -15px 15px rgba(255, 255, 255, 0.25), + inset 0 -15px 15px rgba(255, 255, 255, 0.05), + 0 15px 15px rgba(0, 0, 0, 0.3), + inset 0 15px 15px rgba(0, 0, 0, 0.3); } -.hand { - position: absolute; - background: #333; - border-radius: 50%; - transform-origin: bottom; - transform: rotate(90deg); - transition: transform 0.5s cubic-bezier(0.4, 2.3, 0.3, 1); +.clock::before { + content: ""; + position: absolute; + width: 15px; + height: 15px; + background: #848484; + border: 2px solid #fff; + z-index: 10; + border-radius: 50%; } -.hour { - width: 6px; - height: 80px; - left: 50%; - top: 50%; - transform: translateX(-50%); - background: #333; +.hour, +.min, +.sec { + position: absolute; +} + +.hour, +.hr { + width: 160px; + height: 160px; +} + +.min, +.mn { + height: 190px; +} + + +.hr, +.mn, +.sc { + display: flex; + justify-content: center; + border-radius: 50%; } -.minute { - width: 4px; - height: 110px; - left: 50%; - top: 50%; - transform: translateX(-50%); - background: #666; +.hr::before { + content: ""; + position: absolute; + width: 8px; + height: 80px; + background: #848484; + z-index: 1; + border-radius: 6px 6px 0 0; } -.second { - width: 2px; - height: 120px; - left: 50%; - top: 50%; - transform: translateX(-50%); - background: red; +.mn::before { + content: ""; + position: absolute; + width: 4px; + height: 90px; + background: #d6d6d6; + z-index: 2; + border-radius: 6px 6px 0 0; } -.center { - position: absolute; - width: 14px; - height: 14px; - background: #333; - border-radius: 50%; - left: 50%; - top: 50%; - transform: translate(-50%, -50%); +.sc::before { + content: ""; + position: absolute; + width: 2px; + height: 150px; + background: #ff6767; + z-index: 3; + border-radius: 6px 6px 0 0; } From b713937f03fd7f0c5a863b95206239e4824ed770 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 22 Jul 2024 22:31:52 +0530 Subject: [PATCH 031/167] Add png --- Source-Code/AnalogWatch/assets/clock.png | Bin 0 -> 6025 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Source-Code/AnalogWatch/assets/clock.png diff --git a/Source-Code/AnalogWatch/assets/clock.png b/Source-Code/AnalogWatch/assets/clock.png new file mode 100644 index 0000000000000000000000000000000000000000..3a4b1f3c50795be6c6f17716b031842fbbeef0de GIT binary patch literal 6025 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 Date: Mon, 22 Jul 2024 22:32:34 +0530 Subject: [PATCH 032/167] Add setInterval and styles --- Source-Code/AnalogWatch/script.js | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Source-Code/AnalogWatch/script.js b/Source-Code/AnalogWatch/script.js index e69de29..de963ae 100644 --- a/Source-Code/AnalogWatch/script.js +++ b/Source-Code/AnalogWatch/script.js @@ -0,0 +1,18 @@ +document.addEventListener('DOMContentLoaded', () => { + const hr = document.querySelector('#hr'); + const mn = document.querySelector('#mn'); + const sc = document.querySelector('#sc'); + + const deg = 6; + + setInterval(() => { + const day = new Date(); + const h = day.getHours() * 30; + const m = day.getMinutes() * deg; + const s = day.getSeconds() * deg; + + hr.style.transform = `rotate(${h + m / 12}deg)`; + mn.style.transform = `rotate(${m}deg)`; + sc.style.transform = `rotate(${s}deg)`; + }); +}); From 018469937569be2a8f11e2316a34f49ef44eb210 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 22 Jul 2024 22:48:13 +0530 Subject: [PATCH 033/167] remove the unnesscary code --- Source-Code/AnalogWatch/index.html | 35 ++++++++++++++---------------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/Source-Code/AnalogWatch/index.html b/Source-Code/AnalogWatch/index.html index 456e4df..3ab34e9 100644 --- a/Source-Code/AnalogWatch/index.html +++ b/Source-Code/AnalogWatch/index.html @@ -1,26 +1,23 @@ - - - + + + Analog Watch - - - + + +
    -
    -
    -
    -
    -
    -
    -
    -
    -
    -
    - -
    +
    +
    +
    +
    +
    +
    +
    +
    +
    - + From 1d84992e2451851129215df9b468830794039d33 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 22 Jul 2024 22:48:29 +0530 Subject: [PATCH 034/167] Add the project and description --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index bf34538..04e2e49 100644 --- a/README.md +++ b/README.md @@ -254,6 +254,17 @@ In order to run this project you need: +
  • +
    +Analog Watch +

    Analog Watch is a visually appealing and functional timekeeping tool built using HTML, CSS, and JavaScript. This project features a classic analog clock design with distinct hour, minute, and second hands. The clock displays the current time with real-time updates, and its stylish design includes subtle shadowing and color adjustments to enhance its aesthetic appeal. The clock’s hands are dynamically styled with CSS for a modern and engaging look.

    + +
    +
  • +

    (back to top)

    From 98b72a054885aa968915e146b8f079bbd3c54be0 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 22 Jul 2024 22:53:32 +0530 Subject: [PATCH 035/167] Solve linter errors --- Source-Code/AnalogWatch/style.css | 1 - 1 file changed, 1 deletion(-) diff --git a/Source-Code/AnalogWatch/style.css b/Source-Code/AnalogWatch/style.css index 68f0a42..f219a4f 100644 --- a/Source-Code/AnalogWatch/style.css +++ b/Source-Code/AnalogWatch/style.css @@ -58,7 +58,6 @@ body { height: 190px; } - .hr, .mn, .sc { From 8ae8168c54483c210475b5f245eb5f37f2e05eba Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Tue, 23 Jul 2024 19:24:57 +0530 Subject: [PATCH 036/167] Correct the Heading --- Source-Code/GradientBackgroundGenerator/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source-Code/GradientBackgroundGenerator/index.html b/Source-Code/GradientBackgroundGenerator/index.html index dbe0756..3d90334 100644 --- a/Source-Code/GradientBackgroundGenerator/index.html +++ b/Source-Code/GradientBackgroundGenerator/index.html @@ -7,7 +7,7 @@ -

    Background Generator

    +

    Gradient Background Generator

    Date: Tue, 23 Jul 2024 19:29:29 +0530 Subject: [PATCH 037/167] Create a template for project --- Source-Code/FAQApplication/index.html | 17 +++++++++++++++++ Source-Code/FAQApplication/script.js | 0 Source-Code/FAQApplication/style.css | 0 3 files changed, 17 insertions(+) create mode 100644 Source-Code/FAQApplication/index.html create mode 100644 Source-Code/FAQApplication/script.js create mode 100644 Source-Code/FAQApplication/style.css diff --git a/Source-Code/FAQApplication/index.html b/Source-Code/FAQApplication/index.html new file mode 100644 index 0000000..9d81fd0 --- /dev/null +++ b/Source-Code/FAQApplication/index.html @@ -0,0 +1,17 @@ + + + + + + FAQ Application + + + + + + diff --git a/Source-Code/FAQApplication/script.js b/Source-Code/FAQApplication/script.js new file mode 100644 index 0000000..e69de29 diff --git a/Source-Code/FAQApplication/style.css b/Source-Code/FAQApplication/style.css new file mode 100644 index 0000000..e69de29 From 414459eb68078bea6d663dd39ac284f7aa0c029f Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Tue, 23 Jul 2024 19:54:29 +0530 Subject: [PATCH 038/167] Add text and icon --- Source-Code/FAQApplication/index.html | 78 ++++++++++++++++++++++++++- 1 file changed, 76 insertions(+), 2 deletions(-) diff --git a/Source-Code/FAQApplication/index.html b/Source-Code/FAQApplication/index.html index 9d81fd0..cba4bb8 100644 --- a/Source-Code/FAQApplication/index.html +++ b/Source-Code/FAQApplication/index.html @@ -10,8 +10,82 @@ integrity="sha384-SZXxX4whJ79/gErwcOYf+zWLeJdY/qpuqC4cAa9rOGUstPomtqpuNWT9wdPEn2fk" crossorigin="anonymous" /> - - + +
    +

    Frequently Asked Questions

    +
    +
    +

    1. What are the prerequisites for the training ?

    + +
    +
    +

    + Lorem ipsum dolor sit amet consectetur adipisicing elit. Inventore, + vitae officia? Modi, ut? Eius, voluptatum commodi. Porro voluptatum + quidem dolorem commodi laborum possimus voluptatibus quod minus, id + ipsum quo ducimus! +

    +
    +
    +
    +
    +

    2. When can I start my training ?

    + +
    +
    +

    + Lorem ipsum dolor sit amet consectetur adipisicing elit. Inventore, + vitae officia? Modi, ut? Eius, voluptatum commodi. Porro voluptatum + quidem dolorem commodi laborum possimus voluptatibus quod minus, id + ipsum quo ducimus! +

    +
    +
    +
    +
    +

    3. What will be the timings of the training ?

    + +
    +
    +

    + Lorem ipsum dolor sit amet consectetur adipisicing elit. Inventore, + vitae officia? Modi, ut? Eius, voluptatum commodi. Porro voluptatum + quidem dolorem commodi laborum possimus voluptatibus quod minus, id + ipsum quo ducimus! +

    +
    +
    +
    +
    +

    4. Will I get a hard copy of the certificate ?

    + +
    +
    +

    + Lorem ipsum dolor sit amet consectetur adipisicing elit. Inventore, + vitae officia? Modi, ut? Eius, voluptatum commodi. Porro voluptatum + quidem dolorem commodi laborum possimus voluptatibus quod minus, id + ipsum quo ducimus! +

    +
    +
    +
    +
    +

    5. What are the benifits of this training ?

    + +
    +
    +

    + Lorem ipsum dolor sit amet consectetur adipisicing elit. Inventore, + vitae officia? Modi, ut? Eius, voluptatum commodi. Porro voluptatum + quidem dolorem commodi laborum possimus voluptatibus quod minus, id + ipsum quo ducimus! +

    +
    +
    +
    + + From d32561c5e3e98cf412328f862afed7a0639f99c3 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Tue, 23 Jul 2024 19:54:49 +0530 Subject: [PATCH 039/167] Add styles --- Source-Code/FAQApplication/style.css | 109 +++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) diff --git a/Source-Code/FAQApplication/style.css b/Source-Code/FAQApplication/style.css index e69de29..d58b8d7 100644 --- a/Source-Code/FAQApplication/style.css +++ b/Source-Code/FAQApplication/style.css @@ -0,0 +1,109 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: "Times New Roman", Times, serif; + background: linear-gradient(to right, #26265a, #2f1532); + color: white; + background-attachment: fixed; + -ms-overflow-style: none; /* IE and Edge */ + scrollbar-width: none; /* Firefox */ +} + +section { + justify-items: center; + display: flex; + flex-direction: column; + align-items: center; + margin: auto; + padding: auto; +} + +.title { + font-size: 35px; + margin: 40px 0; + color: rgb(234, 209, 231); +} + +.faq { + max-width: 700px; + margin-top: 20px; + padding: 20px; + border: 2px solid greenyellow; + cursor: pointer; + border-radius: 15px; +} + +.question { + display: flex; + justify-content: space-between; + align-items: center; +} + +h3 { + font-size: 25px; + color: rgb(234, 209, 231); +} + +.answer { + max-height: 0; + overflow: hidden; + transition: max-height 1.4s ease; + color: rgb(191, 253, 233); +} + +.answer p { + padding-top: 20px; + line-height: 1.6; + font-size: 20px; +} + +.faq.active .answer { + max-height: 300px; + animation: fade 1s ease-in-out; +} + +i { + transition: transform 0.5s ease-in; + color: yellow; +} + +.faq.active i { + transform: rotate(180deg); +} + +@keyframes fade { + from { + opacity: 0; + transform: translateY(-10px); + } + + to { + opacity: 1; + transform: translateY(0); + } +} + +/* @media screen and (max-width: 768px) { + section { + margin: 0 auto; + } + } + + @media screen and (max-width: 1024px) { + section { + margin: 0 auto; + } + } */ + +::-webkit-scrollbar { + width: 0; + height: 0; +} + +body::-webkit-scrollbar { + display: none; /* Safari and Chrome */ +} From 08a57f15e21e794c38b808f3002ed27b7a1f232e Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Tue, 23 Jul 2024 19:55:06 +0530 Subject: [PATCH 040/167] Add toggle button --- Source-Code/FAQApplication/script.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Source-Code/FAQApplication/script.js b/Source-Code/FAQApplication/script.js index e69de29..8f4b892 100644 --- a/Source-Code/FAQApplication/script.js +++ b/Source-Code/FAQApplication/script.js @@ -0,0 +1,7 @@ +const faqs = document.querySelectorAll('.faq'); + +faqs.forEach((faq) => { + faq.addEventListener('click', () => { + faq.classList.toggle('active'); + }); +}); From d99ed6dfc82329135ed28484ed140672bcc950f5 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Tue, 23 Jul 2024 20:02:50 +0530 Subject: [PATCH 041/167] update the project --- README.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 04e2e49..779b5cb 100644 --- a/README.md +++ b/README.md @@ -260,7 +260,18 @@ In order to run this project you need:

    Analog Watch is a visually appealing and functional timekeeping tool built using HTML, CSS, and JavaScript. This project features a classic analog clock design with distinct hour, minute, and second hands. The clock displays the current time with real-time updates, and its stylish design includes subtle shadowing and color adjustments to enhance its aesthetic appeal. The clock’s hands are dynamically styled with CSS for a modern and engaging look.

    + + + +
  • +
    +FAQ Application +

    The FAQ Application is a responsive web-based tool designed to provide users with quick and easy access to frequently asked questions and their answers. Built with HTML, CSS, and JavaScript, this project showcases a clean and intuitive interface that allows users to expand and collapse answers with a simple click.

    +
  • From 09eebeef89b75be85cb9cdb5d8e68bc1b63d3d1b Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Tue, 23 Jul 2024 20:08:52 +0530 Subject: [PATCH 042/167] solve linter error --- Source-Code/FAQApplication/style.css | 1 - 1 file changed, 1 deletion(-) diff --git a/Source-Code/FAQApplication/style.css b/Source-Code/FAQApplication/style.css index d58b8d7..ead0e59 100644 --- a/Source-Code/FAQApplication/style.css +++ b/Source-Code/FAQApplication/style.css @@ -19,7 +19,6 @@ section { flex-direction: column; align-items: center; margin: auto; - padding: auto; } .title { From 80e6895fd8f95595c438fd7c83feefaca817db85 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Tue, 23 Jul 2024 20:28:30 +0530 Subject: [PATCH 043/167] create a template for project --- Source-Code/CountdownTimer/assets/eid.jpg | Bin 0 -> 99803 bytes Source-Code/CountdownTimer/index.html | 13 +++++++++++++ Source-Code/CountdownTimer/script.js | 0 Source-Code/CountdownTimer/style.css | 0 4 files changed, 13 insertions(+) create mode 100644 Source-Code/CountdownTimer/assets/eid.jpg create mode 100644 Source-Code/CountdownTimer/index.html create mode 100644 Source-Code/CountdownTimer/script.js create mode 100644 Source-Code/CountdownTimer/style.css diff --git a/Source-Code/CountdownTimer/assets/eid.jpg b/Source-Code/CountdownTimer/assets/eid.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6603387c18b07e0841f10afff406e123b9666082 GIT binary patch literal 99803 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 m=QS?oQSuN}&2WkXDu|WP#C8)(T$c#kgI4 + + + + + Countdown Timer + + + + + + + \ No newline at end of file diff --git a/Source-Code/CountdownTimer/script.js b/Source-Code/CountdownTimer/script.js new file mode 100644 index 0000000..e69de29 diff --git a/Source-Code/CountdownTimer/style.css b/Source-Code/CountdownTimer/style.css new file mode 100644 index 0000000..e69de29 From 1ac7be7b1b9e9d81d85ec268315d0b6f27c1d464 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Tue, 23 Jul 2024 21:14:05 +0530 Subject: [PATCH 044/167] Add div and span tags --- Source-Code/CountdownTimer/index.html | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/Source-Code/CountdownTimer/index.html b/Source-Code/CountdownTimer/index.html index 33ff91b..c5c6e82 100644 --- a/Source-Code/CountdownTimer/index.html +++ b/Source-Code/CountdownTimer/index.html @@ -7,7 +7,27 @@ - +

    EID CELEBRATIONS

    + +
    +
    +

    0

    + days +
    +
    +

    0

    + hours +
    +
    +

    0

    + mins +
    +
    +

    0

    + seconds +
    +
    + \ No newline at end of file From 14af187f97fb1a051f200f4b10fefb0aeb2e5974 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Tue, 23 Jul 2024 21:14:19 +0530 Subject: [PATCH 045/167] Add styles --- Source-Code/CountdownTimer/style.css | 47 ++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/Source-Code/CountdownTimer/style.css b/Source-Code/CountdownTimer/style.css index e69de29..d462bd1 100644 --- a/Source-Code/CountdownTimer/style.css +++ b/Source-Code/CountdownTimer/style.css @@ -0,0 +1,47 @@ +* { + box-sizing: border-box; +} + +body { + background-image: url(./assets/eid.jpg); + background-size: cover; + background-position: center center; + background-attachment: fixed; + background-repeat: no-repeat; + font-family: "Roboto", sans-serif; + margin-top: 4rem; + color: #c9cc6b; +} + +.container { + display: flex; + justify-content: center; + align-items: center; + margin-top: 10rem; + flex-wrap: wrap; +} + +h1 { + font-size: 4rem; + margin-top: 1rem; + text-align: center; + flex-wrap: wrap; +} + +.big-text { + font-weight: bold; + font-size: 8rem; + line-height: 0.5; + margin: 1rem 2rem; +} + +.countdown { + text-align: center; + + /* margin-left: 2rem; */ +} + +.countdown span { + /* margin-left: -1 rem; */ + font-size: 2rem; +} From e8b42aa347b543b49c307242a980182f48d3969e Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Tue, 23 Jul 2024 21:14:36 +0530 Subject: [PATCH 046/167] Add funtionalities --- Source-Code/CountdownTimer/script.js | 30 ++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/Source-Code/CountdownTimer/script.js b/Source-Code/CountdownTimer/script.js index e69de29..82113f0 100644 --- a/Source-Code/CountdownTimer/script.js +++ b/Source-Code/CountdownTimer/script.js @@ -0,0 +1,30 @@ +document.addEventListener('DOMContentLoaded', () => { + const daysEl = document.getElementById('days'); + const hoursEl = document.getElementById('hours'); + const minsEl = document.getElementById('mins'); + const secondsEl = document.getElementById('seconds'); + + const eid = '30 Mar 2025'; + const formatTime = (time) => (time < 10 ? `0${time}` : time); + const countdown = () => { + const EidDate = new Date(eid); + const currentDate = new Date(); + + const totalSeconds = (EidDate - currentDate) / 1000; + + const days = Math.floor(totalSeconds / 3600 / 24); + const hours = Math.floor(totalSeconds / 3600) % 24; + const mins = Math.floor(totalSeconds / 60) % 60; + const seconds = Math.floor(totalSeconds) % 60; + + daysEl.innerHTML = days; + hoursEl.innerHTML = formatTime(hours); + minsEl.innerHTML = formatTime(mins); + secondsEl.innerHTML = formatTime(seconds); + }; + + // initial call + countdown(); + + setInterval(countdown, 1000); +}); From 507792d187f8c04208caa2067ad1b209780dae6a Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Tue, 23 Jul 2024 21:15:15 +0530 Subject: [PATCH 047/167] remove unuseful code --- Source-Code/CountdownTimer/style.css | 3 --- 1 file changed, 3 deletions(-) diff --git a/Source-Code/CountdownTimer/style.css b/Source-Code/CountdownTimer/style.css index d462bd1..3bea40f 100644 --- a/Source-Code/CountdownTimer/style.css +++ b/Source-Code/CountdownTimer/style.css @@ -37,11 +37,8 @@ h1 { .countdown { text-align: center; - - /* margin-left: 2rem; */ } .countdown span { - /* margin-left: -1 rem; */ font-size: 2rem; } From 901cd3a82cad56fdf978d3d4280762ebcbf62099 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Tue, 23 Jul 2024 21:20:04 +0530 Subject: [PATCH 048/167] Update the project --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 779b5cb..b8b538c 100644 --- a/README.md +++ b/README.md @@ -276,6 +276,17 @@ In order to run this project you need: +
    +

    (back to top)

    From 31c2dcc81abf58fa6b725552b0b6ea7f370b25b4 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Tue, 23 Jul 2024 21:46:22 +0530 Subject: [PATCH 049/167] Create a template for project --- Source-Code/ImageFilter/index.html | 11 +++++++++++ Source-Code/ImageFilter/script.js | 0 Source-Code/ImageFilter/style.css | 0 3 files changed, 11 insertions(+) create mode 100644 Source-Code/ImageFilter/index.html create mode 100644 Source-Code/ImageFilter/script.js create mode 100644 Source-Code/ImageFilter/style.css diff --git a/Source-Code/ImageFilter/index.html b/Source-Code/ImageFilter/index.html new file mode 100644 index 0000000..874ff3e --- /dev/null +++ b/Source-Code/ImageFilter/index.html @@ -0,0 +1,11 @@ + + + + + + Image Filter + + + + + \ No newline at end of file diff --git a/Source-Code/ImageFilter/script.js b/Source-Code/ImageFilter/script.js new file mode 100644 index 0000000..e69de29 diff --git a/Source-Code/ImageFilter/style.css b/Source-Code/ImageFilter/style.css new file mode 100644 index 0000000..e69de29 From b183539d1c449cec6485733a3464efb23f6e9055 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Wed, 24 Jul 2024 05:09:38 +0530 Subject: [PATCH 050/167] Add buttons and Canva for image --- Source-Code/ImageFilter/index.html | 93 +++++++++++++++++++++++++++--- 1 file changed, 85 insertions(+), 8 deletions(-) diff --git a/Source-Code/ImageFilter/index.html b/Source-Code/ImageFilter/index.html index 874ff3e..bb4d815 100644 --- a/Source-Code/ImageFilter/index.html +++ b/Source-Code/ImageFilter/index.html @@ -1,11 +1,88 @@ - - - + + + + Image Filter - - - - - \ No newline at end of file + + + + +
    +
    +
    +
    + +
    + + +

    Filters

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

    Effects

    +
    + + + + + + + +
    + +
    + + + + + + + +
    +
    + + + +
    +
    +
    +
    + + + From fcc9f146a5eb239fe59207285f9fe539ff665f13 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Wed, 24 Jul 2024 05:10:03 +0530 Subject: [PATCH 051/167] Add styles for buttons --- Source-Code/ImageFilter/style.css | 146 ++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) diff --git a/Source-Code/ImageFilter/style.css b/Source-Code/ImageFilter/style.css index e69de29..ce958f4 100644 --- a/Source-Code/ImageFilter/style.css +++ b/Source-Code/ImageFilter/style.css @@ -0,0 +1,146 @@ +body { + font-family: Arial, sans-serif; + background-color: #f8f9fa; + margin: 0; + padding: 0; +} + +nav { + background-color: #17a2b8; + padding: 1rem; + text-align: center; +} + +.navbar-brand { + color: #fff; + text-decoration: none; + font-size: 1.5rem; +} + +.container { + max-width: 700px; + margin: 0 auto; + padding: 1rem; + display: flex; + flex-direction: column; + flex-wrap: wrap; + align-items: center; +} + +#canvas { + margin: auto; + background: #eae7e7; + width: 100%; +} + +.custom-file { + width: 100%; + height: 2.5rem; + margin-bottom: 1rem; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; +} + +canvas { + display: block; + max-width: 100%; + margin: 1rem 0; + border: 1px solid #ced4da; +} + +h4 { + font-size: 1.5rem; + margin: 1rem 0; + text-align: center; + color: #495057; +} + +.row { + display: flex; + flex-wrap: wrap; + justify-content: space-around; + margin: 1rem auto; + gap: 3px; +} + +.filter-btn { + margin-bottom: 1rem; + width: 40px; + height: 30px; + color: #f8fafc; + background-color: #17a2b8; + border-color: #007bff; + border-radius: 7px; + font-size: medium; + cursor: pointer; +} + +.filter-btn:hover { + background-color: #0069d9; + border-color: #0056b3; +} + +.btn-disabled { + width: 80px; + height: 25px; + border-color: #1d2124; + border-radius: 3px; + background-color: #fcfcfc; + color: #343739; +} + +.btn-dark { + color: #fff; + font-size: medium; + background-color: #343a40; + border-color: #343a40; + border-radius: 7px; + width: 100px; + height: 40px; + cursor: pointer; +} + +.btn-dark:hover { + color: #fff; + background-color: #23272b; + border-color: #1d2124; +} + +.btn-primary { + color: #fff; + font-size: medium; + background-color: #007bff; + border-color: #007bff; + height: 50px; + width: 150px; + border-radius: 9px; + cursor: pointer; +} + +.btn-primary:hover { + color: #fff; + background-color: #0056b3; + border-color: #004085; + height: 56px; + width: 160px; +} + +.btn-danger { + font-size: medium; + color: #fff; + background-color: #dc3545; + border-color: #dc3545; + height: 50px; + width: 150px; + border-radius: 9px; +} + +.btn-danger:hover { + color: #fff; + background-color: #c82333; + border-color: #bd2130; + height: 56px; + width: 160px; +} From ef056e403c8dcae4fa3f73d3a71d7eb47c724199 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Wed, 24 Jul 2024 05:10:22 +0530 Subject: [PATCH 052/167] Add funtionalities --- Source-Code/ImageFilter/script.js | 241 ++++++++++++++++++++++++++++++ 1 file changed, 241 insertions(+) diff --git a/Source-Code/ImageFilter/script.js b/Source-Code/ImageFilter/script.js index e69de29..a50eca2 100644 --- a/Source-Code/ImageFilter/script.js +++ b/Source-Code/ImageFilter/script.js @@ -0,0 +1,241 @@ +const canvas = document.getElementById('canvas'); +const ctx = canvas.getContext('2d'); +const img = new Image(); +const fileName = 'edited-image'; +let brightness = 0; +let contrast = 0; +let saturation = 0; +let vibrance = 0; + +// Handle file upload +document.getElementById('upload-file').addEventListener('change', (e) => { + const file = e.target.files[0]; + const reader = new FileReader(); + + reader.onload = function (event) { + img.src = event.target.result; + }; + + if (file) { + reader.readAsDataURL(file); + } +}); + +// Helper function to clamp values +function clamp(value) { + return Math.min(Math.max(value, 0), 255); +} + +// Draw image to canvas +img.onload = function () { + canvas.width = img.width; + canvas.height = img.height; + ctx.drawImage(img, 0, 0); +}; + +// Redraw image with current adjustments +function drawImage() { + ctx.drawImage(img, 0, 0); + const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); + const { data } = imageData; + + // Apply brightness + for (let i = 0; i < data.length; i += 4) { + data[i] = clamp(data[i] + brightness); // Red + data[i + 1] = clamp(data[i + 1] + brightness); // Green + data[i + 2] = clamp(data[i + 2] + brightness); // Blue + } + + // Apply contrast + const factor = (259 * (contrast + 255)) / (255 * (259 - contrast)); + for (let i = 0; i < data.length; i += 4) { + data[i] = clamp(factor * (data[i] - 128) + 128); // Red + data[i + 1] = clamp(factor * (data[i + 1] - 128) + 128); // Green + data[i + 2] = clamp(factor * (data[i + 2] - 128) + 128); // Blue + } + + // Apply saturation + for (let i = 0; i < data.length; i += 4) { + const avg = (data[i] + data[i + 1] + data[i + 2]) / 3; + data[i] = clamp(avg + (data[i] - avg) * (1 + saturation / 100)); // Red + data[i + 1] = clamp(avg + (data[i + 1] - avg) * (1 + saturation / 100)); // Green + data[i + 2] = clamp(avg + (data[i + 2] - avg) * (1 + saturation / 100)); // Blue + } + + // Apply vibrance + for (let i = 0; i < data.length; i += 4) { + const avg = (data[i] + data[i + 1] + data[i + 2]) / 3; + const max = Math.max(data[i], data[i + 1], data[i + 2]); + const amount = (((max - avg) * 2) / 255) * vibrance; + data[i] = clamp(data[i] + amount); // Red + data[i + 1] = clamp(data[i + 1] + amount); // Green + data[i + 2] = clamp(data[i + 2] + amount); // Blue + } + ctx.putImageData(imageData, 0, 0); +} + +// Apply brightness +function applyBrightness(value) { + brightness += value; + drawImage(); +} + +// Apply contrast +function applyContrast(value) { + contrast += value; + drawImage(); +} + +// Apply saturation +function applySaturation(value) { + saturation += value; + drawImage(); +} + +// Apply vibrance +function applyVibrance(value) { + vibrance += value; + drawImage(); +} + +// Apply effect +function applyEffect(effect) { + drawImage(); + const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); + const { data } = imageData; + + if (effect === 'vintage') { + // Vintage effect + for (let i = 0; i < data.length; i += 4) { + data[i] = clamp(data[i] * 0.9); // Red + data[i + 1] = clamp(data[i + 1] * 0.7); // Green + data[i + 2] = clamp(data[i + 2] * 0.5); // Blue + } + } else if (effect === 'lomo') { + // Lomo effect + for (let i = 0; i < data.length; i += 4) { + data[i] = clamp(data[i] * 1.2); // Red + data[i + 1] = clamp(data[i + 1] * 1.2); // Green + data[i + 2] = clamp(data[i + 2] * 1.2); // Blue + } + } else if (effect === 'clarity') { + // Clarity effect + // (Increase contrast) + applyContrast(20); + } else if (effect === 'sincity') { + // Sin City effect + for (let i = 0; i < data.length; i += 4) { + const avg = (data[i] + data[i + 1] + data[i + 2]) / 3; + data[i] = avg; // Red + data[i + 1] = avg; // Green + data[i + 2] = avg; // Blue + } + } else if (effect === 'crossprocess') { + // Cross Process effect + for (let i = 0; i < data.length; i += 4) { + data[i] = clamp(data[i] * 1.3); // Red + data[i + 1] = clamp(data[i + 1] * 1.1); // Green + data[i + 2] = clamp(data[i + 2] * 0.9); // Blue + } + } else if (effect === 'pinhole') { + // Pinhole effect + for (let i = 0; i < data.length; i += 4) { + const avg = (data[i] + data[i + 1] + data[i + 2]) / 3; + data[i] = avg * 0.9; // Red + data[i + 1] = avg * 0.9; // Green + data[i + 2] = avg * 0.9; // Blue + } + } else if (effect === 'nostalgia') { + // Nostalgia effect + for (let i = 0; i < data.length; i += 4) { + data[i] = clamp(data[i] * 0.9 + 50); // Red + data[i + 1] = clamp(data[i + 1] * 0.7 + 20); // Green + data[i + 2] = clamp(data[i + 2] * 0.5 + 10); // Blue + } + } else if (effect === 'hermajesty') { + // Her Majesty effect + for (let i = 0; i < data.length; i += 4) { + data[i] = clamp(data[i] * 1.1); // Red + data[i + 1] = clamp(data[i + 1] * 0.95); // Green + data[i + 2] = clamp(data[i + 2] * 1.3); // Blue + } + } + + ctx.putImageData(imageData, 0, 0); +} + +// Download image +function downloadImage() { + const link = document.createElement('a'); + link.download = fileName; + link.href = canvas.toDataURL('image/jpeg'); + link.click(); +} + +// Revert filters +function revertFilters() { + brightness = 0; + contrast = 0; + saturation = 0; + vibrance = 0; + drawImage(); +} + +// Event listeners for filter buttons +document + .querySelector('.brightness-add') + .addEventListener('click', () => applyBrightness(10)); +document + .querySelector('.brightness-remove') + .addEventListener('click', () => applyBrightness(-10)); +document + .querySelector('.contrast-add') + .addEventListener('click', () => applyContrast(10)); +document + .querySelector('.contrast-remove') + .addEventListener('click', () => applyContrast(-10)); +document + .querySelector('.saturation-add') + .addEventListener('click', () => applySaturation(10)); +document + .querySelector('.saturation-remove') + .addEventListener('click', () => applySaturation(-10)); +document + .querySelector('.vibrance-add') + .addEventListener('click', () => applyVibrance(10)); +document + .querySelector('.vibrance-remove') + .addEventListener('click', () => applyVibrance(-10)); + +// Event listeners for effect buttons +document + .querySelector('.vintage-add') + .addEventListener('click', () => applyEffect('vintage')); +document + .querySelector('.lomo-add') + .addEventListener('click', () => applyEffect('lomo')); +document + .querySelector('.clarity-add') + .addEventListener('click', () => applyEffect('clarity')); +document + .querySelector('.sincity-add') + .addEventListener('click', () => applyEffect('sincity')); + +document + .querySelector('.crossprocess-add') + .addEventListener('click', () => applyEffect('crossprocess')); +document + .querySelector('.pinhole-add') + .addEventListener('click', () => applyEffect('pinhole')); +document + .querySelector('.nostalgia-add') + .addEventListener('click', () => applyEffect('nostalgia')); +document + .querySelector('.hermajesty-add') + .addEventListener('click', () => applyEffect('hermajesty')); + +// Event listeners for download and revert buttons +document + .getElementById('download-btn') + .addEventListener('click', downloadImage); +document.getElementById('revert-btn').addEventListener('click', revertFilters); From bdac4ea2d0316ec2bdc2cbcf03bc496da221d73f Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Wed, 24 Jul 2024 05:10:35 +0530 Subject: [PATCH 053/167] Update project --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index b8b538c..f9d09cf 100644 --- a/README.md +++ b/README.md @@ -287,6 +287,17 @@ In order to run this project you need: +
  • +
    +Image Filter +

    The Image Filter Web Application allows users to upload and edit images by applying various filters (brightness, contrast, saturation, and vibrance) and effects (vintage, lomo, clarity, etc.). Users can preview changes on a canvas, download the edited image, or revert to the original. This application is built using HTML, CSS, and vanilla JavaScript.

    + +
    +
  • +

    (back to top)

    From e0a33c9144949ba68352749a3468265253a7b283 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Wed, 24 Jul 2024 05:19:53 +0530 Subject: [PATCH 054/167] corrected the code --- Source-Code/ImageFilter/script.js | 40 +++++++++++++++---------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/Source-Code/ImageFilter/script.js b/Source-Code/ImageFilter/script.js index a50eca2..2083c12 100644 --- a/Source-Code/ImageFilter/script.js +++ b/Source-Code/ImageFilter/script.js @@ -12,7 +12,7 @@ document.getElementById('upload-file').addEventListener('change', (e) => { const file = e.target.files[0]; const reader = new FileReader(); - reader.onload = function (event) { + reader.onload = (event) => { img.src = event.target.result; }; @@ -22,19 +22,17 @@ document.getElementById('upload-file').addEventListener('change', (e) => { }); // Helper function to clamp values -function clamp(value) { - return Math.min(Math.max(value, 0), 255); -} +const clamp = (value) => Math.min(Math.max(value, 0), 255); // Draw image to canvas -img.onload = function () { +img.onload = () => { canvas.width = img.width; canvas.height = img.height; ctx.drawImage(img, 0, 0); }; // Redraw image with current adjustments -function drawImage() { +const drawImage = () => { ctx.drawImage(img, 0, 0); const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); const { data } = imageData; @@ -72,34 +70,34 @@ function drawImage() { data[i + 2] = clamp(data[i + 2] + amount); // Blue } ctx.putImageData(imageData, 0, 0); -} +}; // Apply brightness -function applyBrightness(value) { +const applyBrightness = (value) => { brightness += value; drawImage(); -} +}; // Apply contrast -function applyContrast(value) { +const applyContrast = (value) => { contrast += value; drawImage(); -} +}; // Apply saturation -function applySaturation(value) { +const applySaturation = (value) => { saturation += value; drawImage(); -} +}; // Apply vibrance -function applyVibrance(value) { +const applyVibrance = (value) => { vibrance += value; drawImage(); -} +}; // Apply effect -function applyEffect(effect) { +const applyEffect = (effect) => { drawImage(); const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); const { data } = imageData; @@ -162,24 +160,24 @@ function applyEffect(effect) { } ctx.putImageData(imageData, 0, 0); -} +}; // Download image -function downloadImage() { +const downloadImage = () => { const link = document.createElement('a'); link.download = fileName; link.href = canvas.toDataURL('image/jpeg'); link.click(); -} +}; // Revert filters -function revertFilters() { +const revertFilters = () => { brightness = 0; contrast = 0; saturation = 0; vibrance = 0; drawImage(); -} +}; // Event listeners for filter buttons document From e840fb563002f9a69dfaab50a5a6ddf648bd3cfb Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Sat, 27 Jul 2024 03:37:08 +0530 Subject: [PATCH 055/167] Used semantic tags --- Source-Code/DayPredictor/index.html | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 Source-Code/DayPredictor/index.html diff --git a/Source-Code/DayPredictor/index.html b/Source-Code/DayPredictor/index.html new file mode 100644 index 0000000..5d567f3 --- /dev/null +++ b/Source-Code/DayPredictor/index.html @@ -0,0 +1,25 @@ + + + + + + + + Day Predictor + + + +
    +

    Today is:

    +
      +
    • + Display day of the week. +
    • +
    • + Display a quote +
    • +
    +
    + + + From 8365e04c5bef93d38795bf3632f3f93d994a9e9a Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Sat, 27 Jul 2024 03:37:20 +0530 Subject: [PATCH 056/167] Add styles --- Source-Code/DayPredictor/style.css | 41 ++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 Source-Code/DayPredictor/style.css diff --git a/Source-Code/DayPredictor/style.css b/Source-Code/DayPredictor/style.css new file mode 100644 index 0000000..c63b418 --- /dev/null +++ b/Source-Code/DayPredictor/style.css @@ -0,0 +1,41 @@ +body { + font-family: Arial, Helvetica, sans-serif; + margin: 50px; + background: #fff; +} + +#container { + width: 500px; + height: 350px; + background-color: rgb(157, 255, 0); + margin: auto; + border-radius: 30px; + padding: 20px; +} + +h1 { + font-size: 40px; + font-weight: 900; + text-transform: uppercase; + text-align: center; + color: #f533e8; +} + +ul { + list-style-type: none; + display: flex; + flex-direction: column; + align-items: center; +} + +#weekday { + font-size: 40px; + color: #dd5800; + font-weight: 800; +} + +#phrase { + font-size: 40px; + color: #00f; + font-weight: 800; +} From c96235bbc92d9b7e982d53775bd75b3f58d46ab1 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Sat, 27 Jul 2024 03:37:34 +0530 Subject: [PATCH 057/167] Add funtionality --- Source-Code/DayPredictor/script.js | 49 ++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 Source-Code/DayPredictor/script.js diff --git a/Source-Code/DayPredictor/script.js b/Source-Code/DayPredictor/script.js new file mode 100644 index 0000000..7b37a7c --- /dev/null +++ b/Source-Code/DayPredictor/script.js @@ -0,0 +1,49 @@ +document.addEventListener('DOMContentLoaded', () => { + // Grab day of the week from local computer + const date = new Date(); + const dayOfWeekNumber = date.getDay(); + let nameOfDay; + let quote; + + switch (dayOfWeekNumber) { + case 0: + nameOfDay = 'Sunday'; + quote = 'Time to chillax!'; + break; + case 1: + nameOfDay = 'Monday'; + quote = 'Monday morning blues!'; + break; + case 2: + nameOfDay = 'Tuesday'; + quote = 'Taco Time!'; + break; + case 3: + nameOfDay = 'Wednesday'; + quote = 'Two more days to the weekend.'; + break; + case 4: + nameOfDay = 'Thursday'; + quote = 'The weekend is almost here...'; + break; + case 5: + nameOfDay = 'Friday'; + quote = 'Weekend is here!'; + break; + case 6: + nameOfDay = 'Saturday'; + quote = 'Time to party!'; + break; + default: + nameOfDay = 'Unknown'; + quote = ''; + } + + // Display the day of the week + const weekdayDiv = document.getElementById('weekday'); + weekdayDiv.innerHTML = `${nameOfDay}`; + + // Display quote + const quoteDiv = document.getElementById('phrase'); + quoteDiv.innerHTML = `${quote}`; +}); From 7436fa870b9c0a1e3fef59c2b123f7399d40eee4 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Sat, 27 Jul 2024 03:37:44 +0530 Subject: [PATCH 058/167] update project --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index f9d09cf..9e77327 100644 --- a/README.md +++ b/README.md @@ -298,6 +298,17 @@ In order to run this project you need: +
  • +
    +Day Predictor +

    A Simple Week Day Predictor App written in HTML, CSS, and JavaScript. This app displays the current day of the week along with a corresponding motivational quote, using local computer time.

    + +
    +
  • +

    (back to top)

    From c26498a8346cb87e3afeb3c20ebe0578de278dce Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 29 Jul 2024 19:59:14 +0530 Subject: [PATCH 059/167] Create a template for project --- Source-Code/GithubProfileFinder/index.html | 11 +++++++++++ Source-Code/GithubProfileFinder/script.js | 0 Source-Code/GithubProfileFinder/style.css | 0 3 files changed, 11 insertions(+) create mode 100644 Source-Code/GithubProfileFinder/index.html create mode 100644 Source-Code/GithubProfileFinder/script.js create mode 100644 Source-Code/GithubProfileFinder/style.css diff --git a/Source-Code/GithubProfileFinder/index.html b/Source-Code/GithubProfileFinder/index.html new file mode 100644 index 0000000..268cd5f --- /dev/null +++ b/Source-Code/GithubProfileFinder/index.html @@ -0,0 +1,11 @@ + + + + + + Github Profile Finder + + + + + \ No newline at end of file diff --git a/Source-Code/GithubProfileFinder/script.js b/Source-Code/GithubProfileFinder/script.js new file mode 100644 index 0000000..e69de29 diff --git a/Source-Code/GithubProfileFinder/style.css b/Source-Code/GithubProfileFinder/style.css new file mode 100644 index 0000000..e69de29 From 61e4bf13dd96a45acfc7bc4287e2c2ad531e0a2c Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 29 Jul 2024 20:22:15 +0530 Subject: [PATCH 060/167] Add a assets --- .../GithubProfileFinder/assets/github-logo.png | Bin 0 -> 67629 bytes .../GithubProfileFinder/assets/github.avif | Bin 0 -> 10139 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Source-Code/GithubProfileFinder/assets/github-logo.png create mode 100644 Source-Code/GithubProfileFinder/assets/github.avif diff --git a/Source-Code/GithubProfileFinder/assets/github-logo.png b/Source-Code/GithubProfileFinder/assets/github-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..e927dc126ae5f02be20070e85aec867eb232a815 GIT binary patch literal 67629 zcmX_o2RK*%`~KTUr6C%U%4i}IQpwh$5{gg>*()o1D@7q%sLYZiA!N^zT~BL@9*Drol6(z{XXZsUeCCn`?;TU|AK<-`nB8FQYe)5XV08cqEKk5IOzQ8%I1n)Lsee%oJf zHX!;f%;cS{kV*6(gEz)hpX+-&{^O#(_+{mq4J(*7-Ys-GwegDH+=5k#n6<_C3`&GG zLt<~&sH>jjo1SjkO>Hj1PyGEEXebnV<>SYXpK^B2?yPKUo5?cQ(HW~)l6iUIBi)J> zp#zJe6iW5BuX=P8%JuVW*RI`t_3G6F7HxTE4b9CrnsC(p`eoFFV|-l8Eab%t>U^k* zvhou%9QgS?%)NMa@=ue&w{PEq;^X6c`1tsG@YCSWpFeN#)92?;)$z$myVItoaj&AH z3P0xNYBX=7;;*mbz_CY3*HsBS&x%=Fg3dS1(__d`~miY0ZuuA$IEO zO-|0vbE4#@m{@j}r0ZpYc!G5?^6epPe{Q1+C9C(g*jP&$+L$s6; zUKT3FgFWWM2Z8yY@#+jxj26)fG0OEnfAW}`ng$*@awMTXLBl%7?#~NlGc&V@9m3|% z+OllrnsXeL4+{(XMpRku7#jIWXTK^xIy(A8O3LP=M~{B4tW0S6^y%f#PoFxnJUu-t z8yYfeaeS_+Nvg$>tQa9#XJ=<8YHB(tx=NA~8Ka#+OYtj@mJ2?yea8;7fq{W*CZ?t; zxca;D@^ZH=TeeVDR8;V5lkQa0`q^vQcHfc{5)_&HS|w!S$p@yv**vT zBs*$i6gfKD+p9bK`W!T3FR4!bX-dBotrW-;crHFACFLi%kJi?_#^T~Pl_e!ya&}@A zO4!{F28zJ3yLaz)*xK4E;Hj1CfBbmM%flm{dNtnu%9ZENj*gjG_@`)Q7XLOrehW-A zzjFHbj{ryiwD{0u<+Q#=arCS)c<+&!ltsBsZR*JQ~d6OqKJ-vQr zZqBgOd=;f#Q=plK;?!RoE%!;-qSXcl+^?>pQkVGt{nxmUAAh8O{PR98ZK1EDA=GO@!$U&{u4!n5%uW7@`#Um{(MhFh4&ivM6q~>uSgs@{CdOtsKtq|m zhbMYCfD7zOO-;p0p0kKo9dw0-xACeaOl#)3G^oebO~$@`yCL1YMJF^$?%9hMYq5MC z0|PvlcvQlIgVmB^VhnNgt`rtd-yL|)HX2*EWnpfr>S@bbN?#^19`lPzN}FsJW^L== zz2m8>tyOA!{P=M}MKJ#y^Oh|$K|w){YAP!C-@M_Z9`V)`5ER^qUwtkrI-QZ7T|YNH zeQk1VjAvqOtlZw-p8uw;ZEkb6{qS0T{zUPHcnYPf#FCC;leKQ^!8-#sqElmIH-|er zJ0sq*EOe-dm6M64M3<^ z#e`VE#Kd&xcW*CU(9@@vRn*jc5y2Ynd$bA&32m;dto&S25hu8F=gzjOD*mdrHmUF5 zzYA%_UJ4r9DNZS9(Sbj>1**pVMd(w}$h@iFj{BqQ?d|m@->8w}P!pSza}5?!s<49I z|M~Oh7h*4cuBsZI^`N1>`5!H9%Iwszdu3tao+>=^U{8f8_j)C=A$KYT{H}0x5cZ^akB-l(7>CJuM06jk+-}(dG+^fHp zmEA8bFJGH$*>O8wA*O51um`&k3W57DjPZevp5L1QQ` zEuQd<$YTCvC-4Gj%ZhYlT* z2^X_hP|?(^j2@O|G| z0akpzTK8)F&-7QXKF`h1jPE%lBvkSyCMKY~tSl)$F78R#ssibTrY7I^_V(F(_wG&L zD}K<>u6i9;H?X_1nAT$v*60zQY16M{X=P<~MpgCaFCoK9KMB`an+sM}Nk*ooJb=HHRp*y!d>6Ol zte6M2r@ejWiIXR7qhubOTeE(>{Cax&^NefPo(pbSNs(Z~uIzpL{{6%Oe*WPItU}M% z=R#fZ8d*a_L-nIaj+80T65B?8)Pa5Q?UD6AzeCiZO^)20oSQ78lxkZzV0GD|)%%#}=+o>HPKWV8=k1s&Hfs>F1P#7Eo3DwIHT_&z z=zjeRt#q$$2CXz#HEalu`f1y?ZI4O_V?XzlbZvOHsNq1c4!FJot8`t@-Mo3T6aYuxkj6vP(%O3SX3q1+giU_DEj;PX zu|-wLy86uEeXi_jpgxw5K~bI^I9~gfncrgp-Yq zgF}W)ysDO^o!!rJ>VK4z2!I~hmK~q(66YV~QV4w({`BeLeOz3!BXeAo<{g_iZ{Enn zw3kyc{QWkOn|hsaKL2Tw2k~K7M0gMPj)A&3H^d=b>}br=NFk%LLb$kbTW#%bv2_%` z+lX+m%(nr4e&UB+rboWOR4*wiR=G52P$C1cs3VL#yu2-P=gyr_2opWBPejDgOD1YG z7szYq07bxLa&l4!n^c4cKZEZ%GXdvNioMj#$VidGa(Qfcg{Z%K&z?PpjvTR-QBtbq zrmE9XL~?R-i+-0q`Cjs1NAL!A_HY&!7Kd|on<=HpAJw|XsaM+&SptsP4gGrm`t|E= z{r&xEz(~m{6v~O!z@V_4?J@EpY3?us@7uR;E44H?Pbctru;1@sh%6~9E8FHg_PcD` z{{8!fHf`SQ8Tam;9v2P8%~L6s>CvM{j=0%-9Fi{6pWx0hrRM*6P`}`^d!7ab&4!8D zn-3-FmKd@win#Gf=%cF;3m(fQSjxBw^o1Z*+VpvjAqF7Z`6&$vLQhgFv(LvC-&nPi*;o6xq_q@CtXar6nI} ziM|@gHEY(abDJNP)mK*!8QM$npn(x>=_(1R|MpC9j{z|1oEIL0J9`afk2|}WESBf>wttfH8Vd)L}5cpzI~Jb8YU*JU;Fy3ApBYah_KRigfg+V zkj94!@uRVtL1k#B;n!z^b1?B*ePNou z27K^!S!E@A#N)@wI}aYDCjI`c7ehe$Sqf$T#LEl!yxE=3OqK2lI3+bveNqs%A*+Ya zJ;&#=TAm9TzF`%)xpyFYI8Xg)c({4RbvjC)5D6h0H`W}pr#4Fv&$tgae%P`i(hyOr zk6AQKLFK{)fkXTE_ty|~+O=ksLOE&Odv?OQx3XmiVkaAXx4En=R>^MbGN`PMHZd{z z(OVV4@wbps>QvE}F9%A$eG7!86wt0)yLQt$<^%VhA2wDxf8oM~cc>Xu;rCrdaKL@< z;^OKMsk+>!JG@uIjmF2u$Mxa3)&27e3q`kAuIof3i9*?<{Pf&DT6XCeM3}xy_N$zA zbUJmNr>J4Jqn)S8QrL)SX=x=PY)Se7zyXeui77I zDNeg_?nZz%VaKuGeF%R{2Vc@vZ^MeQpOKe;Aj;2g@l+a4+0cZIrG{Yw78kE?&GSsQl)9!^RC8EN{nD z(`InsW~PRaWt9<~BJSP4?+D7G^IokL;kp zz$1d>)}K9l#-)fLzK?w3BzCVx+g5IQFWAy+qA-+^B=uI^-JcD5F5OgbN~H~%U*xmE(m%Ly(kgxZcnMN5kx7xZ8+ zM065gobKv}V=i(6OCCq5S#JJcBnQ^}4ytKDU4IG7_5$*;h>Iv!mOoYjj}@Q!{bUWJ z)ci==Em}Ix@wFlpdizN4x&D|4PIhsJk$#PAJHE=YvPWUG6pGtX%XaC}>8=2aFjV+y z)zuds46#$j1e$NLFV}cy&z@C0B`eD>ar5`RC-@6xWRUaxvq<%iMm54@n~G_NJi@UA z69NE(VtjmNnm29?)#f@+twME35&>n&3q|PV3`_0S=1l8+#J#VQsaG}jX0MT+f|p60 zB8Da==KOhaVJ_IbCCgR^g)p%+%K)b-DqpzMK2&Xzs2cGk zpzdB&lTTq?6zN_cKfm|>K0b|1+qPxaRaEdQ+A(@00DJgdP*Dk-1Bx?ro%@rX-;`#i z?f{;M+*Pt`tE(%b1u0X!wS<8p zUDeUk!x?l?Bg^9F`zt%V*YB{qfXh@C;xeZIe@8kBy(1bjt$VGpR+HquJXm#0{NtTF z?{ocBe11qjEMY2drG4n}YY>Z}N^ zqFse-%kqH)_2QBesky)PTCy6sPAX)Ls)fwW%{v1_?tl1rbhv`vb3-B3g<^+hMEDQ!Q1&RqkC>s@rkgxHE2?{vM1_-@rhjCEcPe z1r!cz69HCm7M9g0l18)J77m&%&d&^Cd8PHG) zJP)CI^JV5M5AgB1Dh!;<0zxFPWktId%){vbn7NxviwjjC$0XmOt|gBya3~=mL8l>E zUl1#!$+3NVdEp>M0s(m9g1&xqj7-#(9M`$YUPd<2*Fi1t4!@=!vC6y=E@Nd?h&nkc zU|}A$(6&ba^hi7j50~UUc+eaR>3TGZRJgc6-!9a+MI4JG-kw;&1(V;UkF2nr^Ne0% zkzAb-&GI0CX zuV1~Ojl_~tQ+8qDo+2)|YnOII5TE*@<@~gj zIxGebX!PaY#s_ji2WDJ=R0faDF_dEa_GVfKEu>UQhWsKS4#BitZ9mi6(a-DnUmv)Z zVcC*l)iqg4rE%KrC06~72YeL_TC4p4I4yy_sHNVK8n|9!taMLAc2?HdZ^y_Tg3Y(g zfg_I^f}g5#pQw>lK30Jxp?`4V<%XqEj-{8+rQ8>@P>T#dX`!89LQL9mNlh(|kzIUx z2zRV0`hOwDgHBNU^NNtIEi;s27S)B2@9}87_D>2YE5JnvJ@2`xXBJqe78+EWQ+umX{VreEqjQQZTX=7>W zg8dB=9!YTdFreO86bXMzL3e5a-`PJTvC@Oev}H?RzQbrIqc z*IyH5Y?ks8vy1@9*fR-2cWiDrf9bNTYc6?EO0J%n8K0)}pHvMb`gt308U0wylPDCZ zCsD=-g&Z}zT1nf7GpUtP0g^A$^~xSIzB&JV>;bt8qz>l`K%^4yu7CKSUD}tRFk^Uw6vqkYqE;45IK{L zrdDwD*#mp`{=PTFUa$eza6d_wJX~DF5Ide&{N>AZ85QdyunN@^|J5v;emWACyFS?# zSRfqazeJ+7hGFu@tEW@zLPJ@Xzg|WkB}nJpt(wygh*TW01Qk0|ToDi!?~X^TztGwPV(7NvqsJaK94+X|5D_;cjc}KP5cSCmq0|K7jSsk@LBK_O%d*k zGmHjR;R~6*zUvgj=-gn#ZmO3rv*el9Cv?ZD#`^$bJ|?NVde7g1I=T6oD)-j$zNi2< z7GSJ%c8rmX2n8ED`)Z;ts;Aw!l4tz=jb#HLHfw`U+2eiN6r~m>=uk+s?a5yG@Ii+^ zyFAtr*)Y7}gLdH<2##aR>sYY#OhEfKbt->pf$j;H;-Z&Y@k=h$-zFAQ`N%Y^wMrJ?HTbOK0-r->$U1P+ImFVTI2mABF;u=|>d~}Q+1qJok zFUc^0bj)vGW5z*$=36B6ut^Xw;>uJJHN z1p_^s6nd@aZFTGoD=}})*-xS-h4F1(o+g0iO9UWEWEVA!Yu6G`SZ8f2WRv+rb^-gQ zk!1I$(WU(R8;iKXjjRCMN8I}p1!`zgWcVMKs9|lzeo)Mt~1@i?lu4C zzkS=))6Lh{n50J3fm(L$d+BXw)h6b*G11erCN?2KwWO#h_oKnL7xm!4me)6O$BGpz z?veHN1gda*e~BkG+1aD=OZ1ok4+tfOMx>w+i=5G7-|p`2WNSP}wY-gJ*ck-{c90G6 zHum=Us0S|W!)+a)w`Y0q{{8#W9Y=3W&-rZO?E$S+L4vNdaJK7Q8a~5-f@Ku#2|jBa zLD-O0USfVH&Ye5=qcPQVDbHsrwXwN3F<}!y9;f4_tpKxlD8s5@6lKm< zfPNMzBroqHu0xsC2H@HSI1+)fnTLSq%pvyn;{wgvA8?;MB+GeoxJ|37ss^0^=BH35 zw+Bg<<-@WW>FCx5D2k}qz6n$t`Uo%uooq| z%P<0uql3fmriKQM;FcB5yk27Tm85ZW)S`8MGQ=V;^CLP#%hoY*4Pg>R8pm#A`WE2w zwQzTlaR$%NmfpuneVUKQ&Cf;92tdEBjI5K#Eh7tytzbOX1F?*%#ntWO34C|TZnI@N z3sryx9G`XGbf<5=JGNX`FC8~lAP^?*SeqRiyZ=j3QFJZ1G%Y(uOJSV78nIn-wu~!c z-j!H&vO3Pb{>u%yI1hcTsM(2r>k2UT@3B^G9kFB8rl?^9Lqq3(aRJ0An3%lFC3%U$ z;*EONSu@+t>@VWs5ZC!`l@@S8&7a-DGkfD`g$BtbB$3VTFanb^Pl2fQ4 zJ6ZyH)hhe@`W}*q>B0UcD(WOFDALl;pFcMh7IxiENwI!D#3{YnOKjp4DJX0Qe=hv# z3Xlpvuxy4B>WBpq8$N4+n6z3pZd!rnT`i>AeXo%{ISij**|mJ;h7NwXOf+(Qv{oL)q$&;{uLA9mZj5M8Ahv5c9=pc#<<}JJA^-ng@q+LIy;ZM>6|Ha zZr&x2f?g=Xb+RG5&3!31dx#k)x7U9`emipXXo88caZ;$L?Eq(k1YtHFb{5>Ct&p7U zi?Tnm{ehC*I-ESBzG>5@=8%vOHB?~FQ3Vzb>Q6-icSJRzMUy){TEdYZ^7wJB?DE-` z!iTp%NY2chSwI;XQuTb@3yBN=rv(t|wZ>(xuu%I{;oymGBcJHprECYDM*q7h&DU?< zG$Ixxn&YMr^*grXY!QcJY*}{!x&E}}FBNU!Redk&Joz5JOCH1RX<*=UG@E6BIkHs% zbdgru5WvxolMVik@C_>HfO?WnQCn4*nBhMsb=ZI)zzJ&P$t9jTd3*aQmtwK3?S*U_ z=a9GZ=BU}hi<9a33#lJITv)cH>ix)%WGh!}-5T74Oi`hq6U8goT%%9o1}A4vojn40 z6^i`ju;-y*izcHL94F~qbnTa>CNbYp|Af!DpK9C>g2vL!H{mvy)Z}EPe_y|EU~urX zlhZ7Bw32bp;NaZmE;fx@9sUY22;A9re`YJRmS*dhGSJ#y#!``T*ft;J+W@pVl19+z z)60p1Rn){%{U+VQo z=W@Dw_zFz|cz_K{7hBl<4u3kk-m&TY`ELHD;h%iwy(Fqv*%{^l(_ft&Zd*DqmD6=x zuz6H^aWs4~M0mzvH}-Mo7x#cEFsZ8p&lS-Qjufy^Gb|8iQc+h+<-@U;E~=?wX@d$6;VBC@fF0 zm`OLg%k4o@xpQT&^tvlV%`hcSkZ=usQ*-l#`^!F1umSn_p6^zE1jVK4_RP1Ov3r+wPjzsUW&VyM_MfA4J;qLb?a7)-jwtbR@Z_JJa@y3Bc`ga zqoW(j&B=QB9fvsJxoR9+lv1q80@{c;H~)DVgNK_KdKI++aQc>~PoGLIrvQrX;}Z(dGD_9TY zn>Ui^re~sot)J{1DaAsaK21mwoYzV!H?HN1hvM`K0d^`SEzNEUZgkVq^6g{XNP(sI zh7+qHK_DE*l390op!ISNrARa&O3#Bs`m+hZ_$SmOs&q_| zF?F3FzIe^t*|6k8?3clyQ2L^hlMf|1{T;A>{NxG8la~J+GcM(Mi=wWrMb9l!)OGgb zzbH&ux(b?#o1dSf4zBhNB${D4_4t%-#*{Px7Ls5PRlwmL{AVWf&cMM*IgaB7Mt~^? zodJ0&aQ2}mY#!9WurLWXG+iu)+Vb0!mkrhaUXZSD%5!xd0rAnA;WBgcA)a2+EBg^a^8}5GB)XDII|V69&g{L33L+7>Do#H= z(i#s#C=HU!Kk5|u6p`i`0q_)?D0D-RJbj8t>=}J=tn0I-@a|>Px{}h93T;@!esbR4 zw~2{cO@F?3PZ3U{-LAikIX zEU+(tPd)99d0XBBQtBbC20jM?dVAV8*mKm{70|;;oLn|N%0ddPe;fIw;?8$PRmSzORxj)tB?%qInwI?mN=SnPvFKmBcFuGOCW%TOl(|3oM$Rj(E z;_f}F?IRClQZC!AqcRq@P;hth^Rt7AT5@u7DS^u-DZRud<<>kon3(T|XlI%;#M~@~ zhrSNIn2Y_;uh9q;z6_6-Pc5(a}R4Ekr~4 zxW%)rc$>Wh^ithM{2qTbmB)ne73EYyrVJ)wC-^iFLV1Bo{@Du4OGvSj;5BLtY@#18*{xeV;*}j< zPRb#Wyxl+sNB*}O4kRDCfU~JcNlq@VF#nX;)nViGme4a*;S&6)DCqtr!0Yn}u(Y_B zrR2CcQ=qdf#GWNTA*z!Mf-8C~OT_uB9xX3&WUs?;?o`j0;^M`N_$w9&wankIVDEcf zP*(A$r=^uE5ErfXBq~T^=-r?-Zf?3*CD8nrs86O*g5Nym&*l5L~ta5z3Glo zj7USsEF{7n2sS??CvQUCiwfohk=B80*Tx^fDx8v&^M!6^GeY63*x0j&j~uy=CK6m| z7yhWXvSShNk5<}`M&%$eoli|o*&mQ6)j~rZD>&oluM*YDK%#mu}6g|{`D$R4YaA8w8Do2-%x6Z5^wx{qOb~=B91{~;7p>ILH!yG&02t~E9^TNfunIO-)^~q~hD;!I z8(h9Jw6#VC29p)_)8LS58XHX-aJ2sTq1RMhecc)rfIfN**{X4W)RdGuojX3SYy+tC zA&EQx8p|^@%vP>v5oqt;s_D=XprD`-nC$Gtvw2bAV3j|cSnKoxQq{ryTb-IBA|m$@ zuz!C;Sy~JkqMq$!ett&Av1y`$1(T%)^1&e(S__C6R|Y

    Y$ZnQ#KBjN+;-AKSyv+ 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 literal 0 HcmV?d00001 diff --git a/Source-Code/GithubProfileFinder/assets/github.avif b/Source-Code/GithubProfileFinder/assets/github.avif new file mode 100644 index 0000000000000000000000000000000000000000..a8958f3a45dae7b7b15d2bef0fbd935350e1084d GIT binary patch literal 10139 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 Date: Mon, 29 Jul 2024 20:22:36 +0530 Subject: [PATCH 061/167] add input and used semantic tags --- Source-Code/GithubProfileFinder/index.html | 60 +++++++++++++++++++--- 1 file changed, 52 insertions(+), 8 deletions(-) diff --git a/Source-Code/GithubProfileFinder/index.html b/Source-Code/GithubProfileFinder/index.html index 268cd5f..36c0c4c 100644 --- a/Source-Code/GithubProfileFinder/index.html +++ b/Source-Code/GithubProfileFinder/index.html @@ -1,11 +1,55 @@ - - - + + + Github Profile Finder - - - - - \ No newline at end of file + + + + + + + + +

    +
    + + +
    + +
    +
    + avatar + Tajul Afreen + @tajulafreen +
    +
    +

    A full stack developer

    +

    58 Repositories

    +
    + +
    +
    + + + + From 431374613cebd5a7874c02580e5f49bc1f64c130 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 29 Jul 2024 20:22:48 +0530 Subject: [PATCH 062/167] add styles --- Source-Code/GithubProfileFinder/style.css | 150 ++++++++++++++++++++++ 1 file changed, 150 insertions(+) diff --git a/Source-Code/GithubProfileFinder/style.css b/Source-Code/GithubProfileFinder/style.css index e69de29..6f5aa3f 100644 --- a/Source-Code/GithubProfileFinder/style.css +++ b/Source-Code/GithubProfileFinder/style.css @@ -0,0 +1,150 @@ +*{ + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body{ + background: url(./assets/github.avif); + background-repeat: no-repeat; + background-size: cover; + background-position: center; + background-blend-mode: darken; +} +.container{ + width: 100%; +} + +.search-container{ + position: relative; + width: 550px; + height: 50px; + background-color: #fff; + border-radius: 15px; + overflow: hidden; + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + margin: 0 auto; + margin-top: 50px; + box-shadow: 0 3px 10px gray; +} + +#input{ + width: 100%; + height: 100%; + background-color: #fff; + border: none; + outline: none; + padding: 5px 160px 5px 15px; + box-sizing: border-box; +} + +#search{ + width: 160px; + height: 100%; + position: absolute; + top: 0; + right: 0; + display: flex; + justify-content: center; + align-items: center; + background-color: #000; + color : white; + cursor: pointer; + text-transform: uppercase; +} + +.profile-card{ + padding: auto; + width: 500px; + background-color: rgba(255,255,255,0.6); + margin: 0 auto; + margin-top: 30px; + border-radius: 15px; + overflow: hidden; + margin-bottom: 15px; + box-shadow: 0 3px 10px gray; + font-family: 'Lobster Two', cursive; +} + + +.main-info{ + display: flex; + flex-direction: column; + align-items: center; + border-bottom: 1px solid gray; +} + +#prof-img{ + height: 70px; + width: auto; + border-radius: 50%; + margin: 10px 0; + box-shadow: 0 3px 10px rgb(96, 93, 93); +} + +.name{ + margin-top: 15px; + font-size: 25px; +} + +#username{ + font-size: 20px; + text-decoration: none; + margin-top: 5px; + margin-bottom: 8px; +} + +a{ + text-decoration: none; +} + +.bio{ + width: 100%; + text-align: center; + padding: 20px 0; + font-size: 23px; +} + +#bio{ + font-weight: bold; + color: rgb(28, 99, 109); +} + +p{ + margin-top: 12px; +} + +.follow{ + width: 100%; + display: flex; + height: 60px; + border-top: 1px solid grey ; + font-size: 20px; +} + +.follow div{ + width: 50%; + text-align: center; + padding-top: 15px; +} + +.followers{ + border-right: 1px solid grey; +} + +@media screen and (max-width: 600px){ + .profile-card{ + width: 450px; + margin: 0 45px; + margin-top: 30px; + border-radius: 15px; + overflow: hidden; + margin-bottom: 15px; + box-shadow: 0 3px 10px gray; + font-family: 'Lobster Two', cursive; + } +} + From a375e570f0bd6d510852c6f90b482121db8ba371 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 29 Jul 2024 20:23:29 +0530 Subject: [PATCH 063/167] add functionality --- Source-Code/GithubProfileFinder/script.js | 49 +++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/Source-Code/GithubProfileFinder/script.js b/Source-Code/GithubProfileFinder/script.js index e69de29..8525543 100644 --- a/Source-Code/GithubProfileFinder/script.js +++ b/Source-Code/GithubProfileFinder/script.js @@ -0,0 +1,49 @@ +// API USED => https://api.github.com/user/user_name + +let input_user = document.querySelector("#input"); + +const userImg = document.querySelector(".main-info"); +// const name = document.querySelector("#name"); +// const userName =document.querySelector("#username"); +const bio = document.querySelector("#bio"); +const repos = document.querySelector("#repo"); +const followers = document.querySelector("#followers"); +const following = document.querySelector("#following"); + +const fetchUser = (user_name) => { + fetch(`https://api.github.com/users/${user_name}`) + .then((data) => data.json()) + .then((jsonData) => { + if (jsonData.message == "Not found") { + alert("User Not Found"); + return; + // console.log("Error" + jsonData.message); + } else { + userImg.innerHTML = ` + avatar + ${jsonData.name} + @${jsonData.login} + `; + bio.innerHTML = jsonData.bio; + repos.innerHTML = jsonData.public_repos; + followers.innerHTML = jsonData.followers; + following.innerHTML = jsonData.following; + } + }) + .catch((err) => { + console.log("Catch" + err.message); + }); +}; + +const getUser = () => { + let user_name = input_user.value.trim(); + // trim will replace before and after spaces + + if (user_name.length == 0) { + alert("Please enter a valid github username"); + } else { + fetchUser(user_name); + } + + input_user.value = " "; +}; From 42f9f101381895d19e3e635ecb6df3f92c3acd56 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 29 Jul 2024 20:58:48 +0530 Subject: [PATCH 064/167] update the code --- Source-Code/GithubProfileFinder/index.html | 2 +- Source-Code/GithubProfileFinder/script.js | 32 ++++++++++------------ Source-Code/GithubProfileFinder/style.css | 32 +++++++--------------- 3 files changed, 26 insertions(+), 40 deletions(-) diff --git a/Source-Code/GithubProfileFinder/index.html b/Source-Code/GithubProfileFinder/index.html index 36c0c4c..4dfe7ab 100644 --- a/Source-Code/GithubProfileFinder/index.html +++ b/Source-Code/GithubProfileFinder/index.html @@ -24,7 +24,7 @@ placeholder="Enter Github UserName" class="" /> - +
  • +
    +Countdown Timer +

    The Countdown Timer is an intuitive and visually appealing tool built using HTML, CSS, and JavaScript. This project allows users to set a countdown to a specific event or deadline, providing a real-time display of the remaining days, hours, minutes, and seconds. It's a great project for beginners to practice and enhance their web development skills.

    +
    +
    +
  • diff --git a/Source-Code/GithubProfileFinder/script.js b/Source-Code/GithubProfileFinder/script.js index 8525543..ee44149 100644 --- a/Source-Code/GithubProfileFinder/script.js +++ b/Source-Code/GithubProfileFinder/script.js @@ -1,49 +1,47 @@ -// API USED => https://api.github.com/user/user_name - -let input_user = document.querySelector("#input"); +const inputUser = document.querySelector("#input"); const userImg = document.querySelector(".main-info"); -// const name = document.querySelector("#name"); -// const userName =document.querySelector("#username"); +const search = document.getElementById("search"); const bio = document.querySelector("#bio"); const repos = document.querySelector("#repo"); const followers = document.querySelector("#followers"); const following = document.querySelector("#following"); -const fetchUser = (user_name) => { - fetch(`https://api.github.com/users/${user_name}`) +const fetchUser = (username) => { + fetch(`https://api.github.com/users/${username}`) .then((data) => data.json()) .then((jsonData) => { - if (jsonData.message == "Not found") { + if (jsonData.message === "Not Found") { alert("User Not Found"); return; - // console.log("Error" + jsonData.message); } else { userImg.innerHTML = ` avatar ${jsonData.name} @${jsonData.login} `; - bio.innerHTML = jsonData.bio; + bio.innerHTML = jsonData.bio ? jsonData.bio : "No bio available."; repos.innerHTML = jsonData.public_repos; followers.innerHTML = jsonData.followers; following.innerHTML = jsonData.following; } }) .catch((err) => { - console.log("Catch" + err.message); + console.log("Catch: " + err.message); }); }; const getUser = () => { - let user_name = input_user.value.trim(); - // trim will replace before and after spaces + let username = inputUser.value.trim(); - if (user_name.length == 0) { - alert("Please enter a valid github username"); + if (username.length === 0) { + alert("Please enter a valid GitHub username"); } else { - fetchUser(user_name); + fetchUser(username); } - input_user.value = " "; + inputUser.value = ""; }; + +// Attach event listener to the search button +search.addEventListener("click", getUser); diff --git a/Source-Code/GithubProfileFinder/style.css b/Source-Code/GithubProfileFinder/style.css index 6f5aa3f..83223c4 100644 --- a/Source-Code/GithubProfileFinder/style.css +++ b/Source-Code/GithubProfileFinder/style.css @@ -11,28 +11,22 @@ body{ background-position: center; background-blend-mode: darken; } -.container{ - width: 100%; -} + .search-container{ - position: relative; + width: 550px; height: 50px; background-color: #fff; - border-radius: 15px; - overflow: hidden; display: flex; - justify-content: center; - align-items: center; - flex-direction: column; + justify-content: space-evenly; margin: 0 auto; - margin-top: 50px; + margin-top: 50px; box-shadow: 0 3px 10px gray; } #input{ - width: 100%; + width: 70%; height: 100%; background-color: #fff; border: none; @@ -42,14 +36,9 @@ body{ } #search{ - width: 160px; + height: 100%; - position: absolute; - top: 0; - right: 0; - display: flex; - justify-content: center; - align-items: center; + width: 30%; background-color: #000; color : white; cursor: pointer; @@ -60,8 +49,7 @@ body{ padding: auto; width: 500px; background-color: rgba(255,255,255,0.6); - margin: 0 auto; - margin-top: 30px; + margin: 25px auto; border-radius: 15px; overflow: hidden; margin-bottom: 15px; @@ -104,7 +92,7 @@ a{ .bio{ width: 100%; text-align: center; - padding: 20px 0; + padding: 20px 10px; font-size: 23px; } @@ -144,7 +132,7 @@ p{ overflow: hidden; margin-bottom: 15px; box-shadow: 0 3px 10px gray; - font-family: 'Lobster Two', cursive; + font-family: 'Lobster Two'; } } From bc25b3df25ad7fae0b60fff797d39c5d3667c49d Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 29 Jul 2024 21:03:00 +0530 Subject: [PATCH 065/167] solve linter issues --- Source-Code/GithubProfileFinder/script.js | 31 ++-- Source-Code/GithubProfileFinder/style.css | 203 +++++++++++----------- 2 files changed, 113 insertions(+), 121 deletions(-) diff --git a/Source-Code/GithubProfileFinder/script.js b/Source-Code/GithubProfileFinder/script.js index ee44149..0468f0b 100644 --- a/Source-Code/GithubProfileFinder/script.js +++ b/Source-Code/GithubProfileFinder/script.js @@ -1,47 +1,46 @@ -const inputUser = document.querySelector("#input"); +const inputUser = document.querySelector('#input'); -const userImg = document.querySelector(".main-info"); -const search = document.getElementById("search"); -const bio = document.querySelector("#bio"); -const repos = document.querySelector("#repo"); -const followers = document.querySelector("#followers"); -const following = document.querySelector("#following"); +const userImg = document.querySelector('.main-info'); +const search = document.getElementById('search'); +const bio = document.querySelector('#bio'); +const repos = document.querySelector('#repo'); +const followers = document.querySelector('#followers'); +const following = document.querySelector('#following'); const fetchUser = (username) => { fetch(`https://api.github.com/users/${username}`) .then((data) => data.json()) .then((jsonData) => { - if (jsonData.message === "Not Found") { - alert("User Not Found"); - return; + if (jsonData.message === 'Not Found') { + alert('User Not Found'); } else { userImg.innerHTML = ` avatar ${jsonData.name} @${jsonData.login} `; - bio.innerHTML = jsonData.bio ? jsonData.bio : "No bio available."; + bio.innerHTML = jsonData.bio ? jsonData.bio : 'No bio available.'; repos.innerHTML = jsonData.public_repos; followers.innerHTML = jsonData.followers; following.innerHTML = jsonData.following; } }) .catch((err) => { - console.log("Catch: " + err.message); + console.log(`Catch: ${err.message}`); }); }; const getUser = () => { - let username = inputUser.value.trim(); + const username = inputUser.value.trim(); if (username.length === 0) { - alert("Please enter a valid GitHub username"); + alert('Please enter a valid GitHub username'); } else { fetchUser(username); } - inputUser.value = ""; + inputUser.value = ''; }; // Attach event listener to the search button -search.addEventListener("click", getUser); +search.addEventListener('click', getUser); diff --git a/Source-Code/GithubProfileFinder/style.css b/Source-Code/GithubProfileFinder/style.css index 83223c4..964856f 100644 --- a/Source-Code/GithubProfileFinder/style.css +++ b/Source-Code/GithubProfileFinder/style.css @@ -1,138 +1,131 @@ -*{ - margin: 0; - padding: 0; - box-sizing: border-box; -} - -body{ - background: url(./assets/github.avif); - background-repeat: no-repeat; - background-size: cover; - background-position: center; - background-blend-mode: darken; -} - - -.search-container{ - - width: 550px; - height: 50px; - background-color: #fff; - display: flex; - justify-content: space-evenly; - margin: 0 auto; - margin-top: 50px; - box-shadow: 0 3px 10px gray; +* { + margin: 0; + padding: 0; + box-sizing: border-box; } -#input{ - width: 70%; - height: 100%; - background-color: #fff; - border: none; - outline: none; - padding: 5px 160px 5px 15px; - box-sizing: border-box; +body { + background: url(./assets/github.avif); + background-repeat: no-repeat; + background-size: cover; + background-position: center; + background-blend-mode: darken; } -#search{ - - height: 100%; - width: 30%; - background-color: #000; - color : white; - cursor: pointer; - text-transform: uppercase; +.search-container { + width: 550px; + height: 50px; + background-color: #fff; + display: flex; + justify-content: space-evenly; + margin: 0 auto; + margin-top: 50px; + box-shadow: 0 3px 10px gray; } -.profile-card{ - padding: auto; - width: 500px; - background-color: rgba(255,255,255,0.6); - margin: 25px auto; - border-radius: 15px; - overflow: hidden; - margin-bottom: 15px; - box-shadow: 0 3px 10px gray; - font-family: 'Lobster Two', cursive; +#input { + width: 70%; + height: 100%; + background-color: #fff; + border: none; + outline: none; + padding: 5px 160px 5px 15px; + box-sizing: border-box; } +#search { + height: 100%; + width: 30%; + background-color: #000; + color: white; + cursor: pointer; + text-transform: uppercase; +} -.main-info{ - display: flex; - flex-direction: column; - align-items: center; - border-bottom: 1px solid gray; +.profile-card { + width: 500px; + background-color: rgba(255, 255, 255, 0.6); + margin: 25px auto; + border-radius: 15px; + overflow: hidden; + margin-bottom: 15px; + box-shadow: 0 3px 10px gray; + font-family: 'Lobster Two', cursive; } -#prof-img{ - height: 70px; - width: auto; - border-radius: 50%; - margin: 10px 0; - box-shadow: 0 3px 10px rgb(96, 93, 93); +.main-info { + display: flex; + flex-direction: column; + align-items: center; + border-bottom: 1px solid gray; } -.name{ - margin-top: 15px; - font-size: 25px; +#prof-img { + height: 70px; + width: auto; + border-radius: 50%; + margin: 10px 0; + box-shadow: 0 3px 10px rgb(96, 93, 93); } -#username{ - font-size: 20px; - text-decoration: none; - margin-top: 5px; - margin-bottom: 8px; +.name { + margin-top: 15px; + font-size: 25px; } -a{ - text-decoration: none; +#username { + font-size: 20px; + text-decoration: none; + margin-top: 5px; + margin-bottom: 8px; } -.bio{ - width: 100%; - text-align: center; - padding: 20px 10px; - font-size: 23px; +a { + text-decoration: none; } -#bio{ - font-weight: bold; - color: rgb(28, 99, 109); +.bio { + width: 100%; + text-align: center; + padding: 20px 10px; + font-size: 23px; } -p{ - margin-top: 12px; +#bio { + font-weight: bold; + color: rgb(28, 99, 109); } -.follow{ - width: 100%; - display: flex; - height: 60px; - border-top: 1px solid grey ; - font-size: 20px; +p { + margin-top: 12px; } -.follow div{ - width: 50%; - text-align: center; - padding-top: 15px; +.follow { + width: 100%; + display: flex; + height: 60px; + border-top: 1px solid grey; + font-size: 20px; } -.followers{ - border-right: 1px solid grey; +.follow div { + width: 50%; + text-align: center; + padding-top: 15px; } -@media screen and (max-width: 600px){ - .profile-card{ - width: 450px; - margin: 0 45px; - margin-top: 30px; - border-radius: 15px; - overflow: hidden; - margin-bottom: 15px; - box-shadow: 0 3px 10px gray; - font-family: 'Lobster Two'; - } +.followers { + border-right: 1px solid grey; } +@media screen and (max-width: 600px) { + .profile-card { + width: 450px; + margin: 0 45px; + margin-top: 30px; + border-radius: 15px; + overflow: hidden; + margin-bottom: 15px; + box-shadow: 0 3px 10px gray; + } +} From fb581095b9f19fbb583fb16f4a583571a22f4b4d Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 29 Jul 2024 21:09:58 +0530 Subject: [PATCH 066/167] update code --- Source-Code/GithubProfileFinder/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Source-Code/GithubProfileFinder/index.html b/Source-Code/GithubProfileFinder/index.html index 4dfe7ab..497556a 100644 --- a/Source-Code/GithubProfileFinder/index.html +++ b/Source-Code/GithubProfileFinder/index.html @@ -31,7 +31,7 @@
    avatar Tajul Afreen - @tajulafreen +

    A full stack developer

    From e1c2d502ff93f814794f78b50f2739658d4d9dd8 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 29 Jul 2024 21:10:09 +0530 Subject: [PATCH 067/167] Update project --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 9e77327..6ac208e 100644 --- a/README.md +++ b/README.md @@ -309,6 +309,17 @@ In order to run this project you need: +
  • +
    +Github Profile Finder +

    The GitHub User Info Finder is a web application designed to fetch and display detailed information about GitHub users. By simply entering a GitHub username, users can retrieve profile information including the avatar, name, bio, number of public repositories, followers, and following count. This project leverages the GitHub API to provide real-time data, and it is built using HTML, CSS, and JavaScript for a seamless user experience.

    + +
    +
  • +

    (back to top)

    From 2906c020156fec3ccb94f092e3945392ffe50e1f Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 29 Jul 2024 21:22:18 +0530 Subject: [PATCH 068/167] create a template for project --- Source-Code/BatteryIndicator/index.html | 11 +++++++++++ Source-Code/BatteryIndicator/script.js | 0 Source-Code/BatteryIndicator/style.css | 0 3 files changed, 11 insertions(+) create mode 100644 Source-Code/BatteryIndicator/index.html create mode 100644 Source-Code/BatteryIndicator/script.js create mode 100644 Source-Code/BatteryIndicator/style.css diff --git a/Source-Code/BatteryIndicator/index.html b/Source-Code/BatteryIndicator/index.html new file mode 100644 index 0000000..d01f779 --- /dev/null +++ b/Source-Code/BatteryIndicator/index.html @@ -0,0 +1,11 @@ + + + + + + Document + + + + + \ No newline at end of file diff --git a/Source-Code/BatteryIndicator/script.js b/Source-Code/BatteryIndicator/script.js new file mode 100644 index 0000000..e69de29 diff --git a/Source-Code/BatteryIndicator/style.css b/Source-Code/BatteryIndicator/style.css new file mode 100644 index 0000000..e69de29 From 0bdce0b105f0d4de59c35dbeacfc75fe7b346d15 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 29 Jul 2024 21:28:45 +0530 Subject: [PATCH 069/167] Add Icons and toggler --- Source-Code/BatteryIndicator/index.html | 39 +++++++++++++++++++------ 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/Source-Code/BatteryIndicator/index.html b/Source-Code/BatteryIndicator/index.html index d01f779..d70a435 100644 --- a/Source-Code/BatteryIndicator/index.html +++ b/Source-Code/BatteryIndicator/index.html @@ -1,11 +1,32 @@ - - - - Document - - - - - \ No newline at end of file + + + + + Battery Indicator + + + +
    +
    +
    +
    +

    Battery Percentage

    +
    +
    +
    +
    +
    +
    50%
    +
    +
    +
    + + + From 20f0d66094ff422a2911b8c4470d1aa5391a5ab1 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 29 Jul 2024 21:28:56 +0530 Subject: [PATCH 070/167] Add styles --- Source-Code/BatteryIndicator/style.css | 187 +++++++++++++++++++++++++ 1 file changed, 187 insertions(+) diff --git a/Source-Code/BatteryIndicator/style.css b/Source-Code/BatteryIndicator/style.css index e69de29..c704aa8 100644 --- a/Source-Code/BatteryIndicator/style.css +++ b/Source-Code/BatteryIndicator/style.css @@ -0,0 +1,187 @@ +@import url("https://fonts.googleapis.com/css2?family=Poppins&display=swap"); + +* { + margin: 0; + padding: 0; + box-sizing: border-box; + font-family: "Poppins", sans-serif; +} + +section { + position: relative; + display: flex; + justify-content: center; + align-items: center; + min-height: 100vh; +} + +section.dark { + background: #161623; +} + +section::before { + content: ""; + position: absolute; + width: 240px; + height: 240px; + background: linear-gradient(#6cff47, #3d1046); + border-radius: 50%; + transform: translate(-150px, -100px); +} + +section.dark::before { + background: linear-gradient(#ffc107, #e91e63); +} + + +section::after { + content: ""; + position: absolute; + width: 250px; + height: 250px; + background: linear-gradient(#f10050, rgb(8, 216, 253)); + border-radius: 50%; + transform: translate(150px, 100px); +} + +section.dark::after { + background: linear-gradient(#2196f3, #31ff38); +} + +.box { + position: relative; + width: 240px; + height: 300px; + background: rgba(255, 255, 255, 0.1); + z-index: 1; + box-shadow: 0 25px 45px rgba(0, 0, 0, 0.25); + border: 1px solid rgba(255, 255, 255, 0.25); + border-right: 1px solid rgba(255, 255, 255, 0.1); + border-bottom: 1px solid rgba(255, 255, 255, 0.1); + backdrop-filter: blur(25px); + border-radius: 10px; + display: flex; + justify-content: center; + align-items: center; +} + +.content { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; +} + +.box h3 { + color: #000000; + font-weight: 500; + font-size: 1.2rem; + letter-spacing: 1px; +} + +section.dark .box h3 { + color: #fff; +} + +.batteryShape { + position: relative; + width: 140px; + height: 65px; + margin: 20px 0; + border: 3px solid #333; + border-radius: 10px; +} + +section.dark .batteryShape { + border: 3px solid #fff; +} + +.batteryShape::before { + content: ""; + position: absolute; + top: 50%; + right: -12px; + transform: translateY(-50%); + width: 7px; + height: 16px; + background: #333; + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} + +section.dark .batteryShape::before { + background: #fff; +} + +.batteryShape::after { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 50%; + background: rgba(255, 255, 255, 0.1); +} + +.level { + position: absolute; + top: 4px; + left: 4px; + right: 4px; + bottom: 4px; + /* background: #333; */ + overflow: hidden; +} + +.percentage { + position: absolute; + top: 0; + left: 0; + height: 100%; + width: 50%; + background: linear-gradient(90deg, #ffeb3b, #27ff00); + border-radius: 4px; +} + +section.dark .percentage { + background: linear-gradient(90deg, #ffeb3b, #27ff00); +} + +.percent { + color: #000000; + font-size: 2em; + font-weight: 700; +} + +section.dark .percent { + color: #fff; +} + +.toggle { + position: absolute; + top: 20px; + right: 20px; + background: #070716; + width: 30px; + height: 30px; + cursor: pointer; + border-radius: 50%; + display: flex; + justify-content: center; + align-items: center; +} + +.dark .toggle { + background: #fff; +} + +.toggle::before { + content: "\f186"; + font-family: fontAwesome; + color: #fff; +} + +.dark .toggle::before { + content: "\f185"; + color: #161623; +} \ No newline at end of file From 284707faa72514c2a07de4e0f31b594fc899daa1 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 29 Jul 2024 21:29:42 +0530 Subject: [PATCH 071/167] Used getbattery function --- Source-Code/BatteryIndicator/script.js | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/Source-Code/BatteryIndicator/script.js b/Source-Code/BatteryIndicator/script.js index e69de29..890ad22 100644 --- a/Source-Code/BatteryIndicator/script.js +++ b/Source-Code/BatteryIndicator/script.js @@ -0,0 +1,15 @@ +document.addEventListener("DOMContentLoaded", () => { + let percentage = document.querySelector(".percentage"); + let percent = document.querySelector(".percent"); + + navigator.getBattery().then(function (battery) { + percentage.style.width = battery.level * 100 + "%"; + percent.innerHTML = Math.floor(battery.level * 100) + "%"; + }); + + let sec = document.querySelector(".sec"); + let toggle = document.querySelector(".toggle"); + toggle.addEventListener("click", function () { + sec.classList.toggle("dark"); + }); +}); From 6392afc44826d60d1cfd04a54eeb212007c9de8b Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 29 Jul 2024 21:35:42 +0530 Subject: [PATCH 072/167] soleve linter issue --- Source-Code/BatteryIndicator/script.js | 20 ++++++++++---------- Source-Code/BatteryIndicator/style.css | 9 +++++---- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/Source-Code/BatteryIndicator/script.js b/Source-Code/BatteryIndicator/script.js index 890ad22..8b3d32a 100644 --- a/Source-Code/BatteryIndicator/script.js +++ b/Source-Code/BatteryIndicator/script.js @@ -1,15 +1,15 @@ -document.addEventListener("DOMContentLoaded", () => { - let percentage = document.querySelector(".percentage"); - let percent = document.querySelector(".percent"); +document.addEventListener('DOMContentLoaded', () => { + const percentage = document.querySelector('.percentage'); + const percent = document.querySelector('.percent'); - navigator.getBattery().then(function (battery) { - percentage.style.width = battery.level * 100 + "%"; - percent.innerHTML = Math.floor(battery.level * 100) + "%"; + navigator.getBattery().then((battery) => { + percentage.style.width = `${battery.level * 100}%`; + percent.innerHTML = `${Math.floor(battery.level * 100)}%`; }); - let sec = document.querySelector(".sec"); - let toggle = document.querySelector(".toggle"); - toggle.addEventListener("click", function () { - sec.classList.toggle("dark"); + const sec = document.querySelector('.sec'); + const toggle = document.querySelector('.toggle'); + toggle.addEventListener('click', () => { + sec.classList.toggle('dark'); }); }); diff --git a/Source-Code/BatteryIndicator/style.css b/Source-Code/BatteryIndicator/style.css index c704aa8..2259c77 100644 --- a/Source-Code/BatteryIndicator/style.css +++ b/Source-Code/BatteryIndicator/style.css @@ -1,3 +1,4 @@ +/* stylelint-disable */ @import url("https://fonts.googleapis.com/css2?family=Poppins&display=swap"); * { @@ -33,7 +34,6 @@ section.dark::before { background: linear-gradient(#ffc107, #e91e63); } - section::after { content: ""; position: absolute; @@ -73,7 +73,7 @@ section.dark::after { } .box h3 { - color: #000000; + color: #000; font-weight: 500; font-size: 1.2rem; letter-spacing: 1px; @@ -129,6 +129,7 @@ section.dark .batteryShape::before { left: 4px; right: 4px; bottom: 4px; + /* background: #333; */ overflow: hidden; } @@ -148,7 +149,7 @@ section.dark .percentage { } .percent { - color: #000000; + color: #000; font-size: 2em; font-weight: 700; } @@ -184,4 +185,4 @@ section.dark .percent { .dark .toggle::before { content: "\f185"; color: #161623; -} \ No newline at end of file +} From eac4a804bbe26b374887d1cc47ca3f16a8699d48 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 29 Jul 2024 21:39:18 +0530 Subject: [PATCH 073/167] Add project --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 6ac208e..88563cf 100644 --- a/README.md +++ b/README.md @@ -320,6 +320,17 @@ In order to run this project you need: +
  • +
    +Battery Indicator +

    This project is a simple web application that dynamically displays the battery level of the user's device and includes a dark mode toggle feature. The battery level is visually represented as a progress bar and also shown as a percentage. The application leverages the Battery Status API to fetch the battery information and updates the display in real-time. Additionally, the user can switch between light and dark modes by clicking a toggle button, enhancing the user interface's customization options.

    + +
    +
  • +

    (back to top)

    From 4eb60d82c62aa64d236689fff765ad73acc977ad Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 29 Jul 2024 22:19:16 +0530 Subject: [PATCH 074/167] create the template for the project --- Source-Code/StopWatch/index.html | 11 +++++++++++ Source-Code/StopWatch/script.js | 0 Source-Code/StopWatch/style.css | 0 3 files changed, 11 insertions(+) create mode 100644 Source-Code/StopWatch/index.html create mode 100644 Source-Code/StopWatch/script.js create mode 100644 Source-Code/StopWatch/style.css diff --git a/Source-Code/StopWatch/index.html b/Source-Code/StopWatch/index.html new file mode 100644 index 0000000..d01f779 --- /dev/null +++ b/Source-Code/StopWatch/index.html @@ -0,0 +1,11 @@ + + + + + + Document + + + + + \ No newline at end of file diff --git a/Source-Code/StopWatch/script.js b/Source-Code/StopWatch/script.js new file mode 100644 index 0000000..e69de29 diff --git a/Source-Code/StopWatch/style.css b/Source-Code/StopWatch/style.css new file mode 100644 index 0000000..e69de29 From 9da8e0c33f2b6194ca0cef33288517fcbd0a0abc Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 29 Jul 2024 22:25:40 +0530 Subject: [PATCH 075/167] Add buttons --- Source-Code/StopWatch/index.html | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/Source-Code/StopWatch/index.html b/Source-Code/StopWatch/index.html index d01f779..c737af1 100644 --- a/Source-Code/StopWatch/index.html +++ b/Source-Code/StopWatch/index.html @@ -1,11 +1,23 @@ - - - Document + + + Stop watch + - +
    +

    Stopwatch

    +
    + 00:00:00 +
    +
    + + + +
    +
    + - \ No newline at end of file + From 1300d04b913b131fcc703840f795f1a1fc424327 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 29 Jul 2024 22:26:18 +0530 Subject: [PATCH 076/167] add segmantic tags --- Source-Code/StopWatch/index.html | 41 +++++++++++++++++--------------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/Source-Code/StopWatch/index.html b/Source-Code/StopWatch/index.html index c737af1..a53e825 100644 --- a/Source-Code/StopWatch/index.html +++ b/Source-Code/StopWatch/index.html @@ -1,23 +1,26 @@ - - - - Stop watch - - - -
    -

    Stopwatch

    -
    - 00:00:00 + + + + Stop watch + + + +
    +

    Stopwatch

    +
    + 00:00:00 +
    +
    + + + +
    -
    - - - -
    -
    - - + + From 2096c03c1636c1bd32f3943c99e1f0333ee44cb2 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 29 Jul 2024 22:28:22 +0530 Subject: [PATCH 077/167] Add styles --- Source-Code/StopWatch/style.css | 45 +++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/Source-Code/StopWatch/style.css b/Source-Code/StopWatch/style.css index e69de29..75cfd81 100644 --- a/Source-Code/StopWatch/style.css +++ b/Source-Code/StopWatch/style.css @@ -0,0 +1,45 @@ +body { + display: flex; + justify-content: center; + align-items: center; + height: 100vh; + background-color: #2e2a2a; + margin: 0; + font-family: Arial, sans-serif; + } + + .container { + display: flex; + flex-direction: column; + justify-items: center; + align-items: center; + } + + .stopwatch, h1, span{ + color: aliceblue; + } + .stopwatch { + font-size: 48px; + margin-bottom: 20px; + } + + .buttons { + display: flex; + justify-content: center; + gap: 10px; + } + + button { + padding: 10px 20px; + font-size: 16px; + cursor: pointer; + border: none; + border-radius: 5px; + background-color: #007BFF; + color: #fff; + } + + button:active { + background-color: #0056b3; + } + \ No newline at end of file From eb3cdafe3ca308822b78cabb7711262b9e5637d6 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 29 Jul 2024 22:28:37 +0530 Subject: [PATCH 078/167] Add functionality --- Source-Code/StopWatch/script.js | 49 +++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/Source-Code/StopWatch/script.js b/Source-Code/StopWatch/script.js index e69de29..bc76c00 100644 --- a/Source-Code/StopWatch/script.js +++ b/Source-Code/StopWatch/script.js @@ -0,0 +1,49 @@ +let milliseconds = 0; +let seconds = 0; +let minutes = 0; +let timer; + +const startButton = document.getElementById("start"); +const stopButton = document.getElementById("stop"); +const resetButton = document.getElementById("reset"); + +const updateTime = () => { + milliseconds += 1; + if (milliseconds === 100) { + milliseconds = 0; + seconds += 1; + } + if (seconds === 60) { + seconds = 0; + minutes += 1; + } + document.getElementById("milliseconds").innerText = + milliseconds < 10 ? `0${milliseconds}` : milliseconds; + document.getElementById("seconds").innerText = + seconds < 10 ? `0${seconds}` : seconds; + document.getElementById("minutes").innerText = + minutes < 10 ? `0${minutes}` : minutes; +}; + +const startTimer = () => { + clearInterval(timer); + timer = setInterval(updateTime, 10); +}; + +const stopTimer = () => { + clearInterval(timer); +}; + +const resetTimer = () => { + clearInterval(timer); + milliseconds = 0; + seconds = 0; + minutes = 0; + document.getElementById("milliseconds").innerText = "00"; + document.getElementById("seconds").innerText = "00"; + document.getElementById("minutes").innerText = "00"; +}; + +startButton.addEventListener("click", startTimer); +stopButton.addEventListener("click", stopTimer); +resetButton.addEventListener("click", resetTimer); From ec3cd7b1ba467dd98fa455ecf9971f5841f99698 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 29 Jul 2024 22:29:44 +0530 Subject: [PATCH 079/167] solve linter error --- Source-Code/StopWatch/script.js | 27 +++++----- Source-Code/StopWatch/style.css | 90 +++++++++++++++++---------------- 2 files changed, 58 insertions(+), 59 deletions(-) diff --git a/Source-Code/StopWatch/script.js b/Source-Code/StopWatch/script.js index bc76c00..c37cbe9 100644 --- a/Source-Code/StopWatch/script.js +++ b/Source-Code/StopWatch/script.js @@ -3,9 +3,9 @@ let seconds = 0; let minutes = 0; let timer; -const startButton = document.getElementById("start"); -const stopButton = document.getElementById("stop"); -const resetButton = document.getElementById("reset"); +const startButton = document.getElementById('start'); +const stopButton = document.getElementById('stop'); +const resetButton = document.getElementById('reset'); const updateTime = () => { milliseconds += 1; @@ -17,12 +17,9 @@ const updateTime = () => { seconds = 0; minutes += 1; } - document.getElementById("milliseconds").innerText = - milliseconds < 10 ? `0${milliseconds}` : milliseconds; - document.getElementById("seconds").innerText = - seconds < 10 ? `0${seconds}` : seconds; - document.getElementById("minutes").innerText = - minutes < 10 ? `0${minutes}` : minutes; + document.getElementById('milliseconds').innerText = milliseconds < 10 ? `0${milliseconds}` : milliseconds; + document.getElementById('seconds').innerText = seconds < 10 ? `0${seconds}` : seconds; + document.getElementById('minutes').innerText = minutes < 10 ? `0${minutes}` : minutes; }; const startTimer = () => { @@ -39,11 +36,11 @@ const resetTimer = () => { milliseconds = 0; seconds = 0; minutes = 0; - document.getElementById("milliseconds").innerText = "00"; - document.getElementById("seconds").innerText = "00"; - document.getElementById("minutes").innerText = "00"; + document.getElementById('milliseconds').innerText = '00'; + document.getElementById('seconds').innerText = '00'; + document.getElementById('minutes').innerText = '00'; }; -startButton.addEventListener("click", startTimer); -stopButton.addEventListener("click", stopTimer); -resetButton.addEventListener("click", resetTimer); +startButton.addEventListener('click', startTimer); +stopButton.addEventListener('click', stopTimer); +resetButton.addEventListener('click', resetTimer); diff --git a/Source-Code/StopWatch/style.css b/Source-Code/StopWatch/style.css index 75cfd81..1f6d343 100644 --- a/Source-Code/StopWatch/style.css +++ b/Source-Code/StopWatch/style.css @@ -1,45 +1,47 @@ body { - display: flex; - justify-content: center; - align-items: center; - height: 100vh; - background-color: #2e2a2a; - margin: 0; - font-family: Arial, sans-serif; - } - - .container { - display: flex; - flex-direction: column; - justify-items: center; - align-items: center; - } - - .stopwatch, h1, span{ - color: aliceblue; - } - .stopwatch { - font-size: 48px; - margin-bottom: 20px; - } - - .buttons { - display: flex; - justify-content: center; - gap: 10px; - } - - button { - padding: 10px 20px; - font-size: 16px; - cursor: pointer; - border: none; - border-radius: 5px; - background-color: #007BFF; - color: #fff; - } - - button:active { - background-color: #0056b3; - } - \ No newline at end of file + display: flex; + justify-content: center; + align-items: center; + height: 100vh; + background-color: #2e2a2a; + margin: 0; + font-family: Arial, sans-serif; +} + +.container { + display: flex; + flex-direction: column; + justify-items: center; + align-items: center; +} + +.stopwatch, +h1, +span { + color: aliceblue; +} + +.stopwatch { + font-size: 48px; + margin-bottom: 20px; +} + +.buttons { + display: flex; + justify-content: center; + gap: 10px; +} + +button { + padding: 10px 20px; + font-size: 16px; + cursor: pointer; + border: none; + border-radius: 5px; + background-color: #007bff; + color: #fff; +} + +button:active { + background-color: #0056b3; +} From 2b97e095c50c0fca998b656b8cf7c1e82910214b Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 29 Jul 2024 22:32:20 +0530 Subject: [PATCH 080/167] Add project --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 88563cf..fac6b93 100644 --- a/README.md +++ b/README.md @@ -331,6 +331,17 @@ In order to run this project you need: +
  • +
    +Stop Watch +

    This project is a simple and interactive stopwatch application created using HTML, CSS, and JavaScript. The stopwatch can be started, stopped, and reset, allowing users to measure elapsed time accurately. It displays minutes, seconds, and milliseconds, providing a clear and precise time tracking interface. The application is styled with CSS for a clean and modern look, and it is fully responsive, ensuring usability across different devices.

    + +
    +
  • +

    (back to top)

    From a14993959a0c4ccdada54f032c2f6a6b25cdd02c Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Wed, 31 Jul 2024 02:06:16 +0530 Subject: [PATCH 081/167] created a template for project --- Source-Code/DinosarGame/index.html | 11 +++++++++++ Source-Code/DinosarGame/script.js | 0 Source-Code/DinosarGame/style.css | 0 3 files changed, 11 insertions(+) create mode 100644 Source-Code/DinosarGame/index.html create mode 100644 Source-Code/DinosarGame/script.js create mode 100644 Source-Code/DinosarGame/style.css diff --git a/Source-Code/DinosarGame/index.html b/Source-Code/DinosarGame/index.html new file mode 100644 index 0000000..d01f779 --- /dev/null +++ b/Source-Code/DinosarGame/index.html @@ -0,0 +1,11 @@ + + + + + + Document + + + + + \ No newline at end of file diff --git a/Source-Code/DinosarGame/script.js b/Source-Code/DinosarGame/script.js new file mode 100644 index 0000000..e69de29 diff --git a/Source-Code/DinosarGame/style.css b/Source-Code/DinosarGame/style.css new file mode 100644 index 0000000..e69de29 From 95f53aefb529fdaef8df0f7c833f0a7326d6ea9d Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Wed, 31 Jul 2024 02:33:49 +0530 Subject: [PATCH 082/167] update the folder name --- Source-Code/DinosarGame/index.html | 11 ----------- Source-Code/{DinosarGame => DinosaurGame}/script.js | 0 Source-Code/{DinosarGame => DinosaurGame}/style.css | 0 3 files changed, 11 deletions(-) delete mode 100644 Source-Code/DinosarGame/index.html rename Source-Code/{DinosarGame => DinosaurGame}/script.js (100%) rename Source-Code/{DinosarGame => DinosaurGame}/style.css (100%) diff --git a/Source-Code/DinosarGame/index.html b/Source-Code/DinosarGame/index.html deleted file mode 100644 index d01f779..0000000 --- a/Source-Code/DinosarGame/index.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - Document - - - - - \ No newline at end of file diff --git a/Source-Code/DinosarGame/script.js b/Source-Code/DinosaurGame/script.js similarity index 100% rename from Source-Code/DinosarGame/script.js rename to Source-Code/DinosaurGame/script.js diff --git a/Source-Code/DinosarGame/style.css b/Source-Code/DinosaurGame/style.css similarity index 100% rename from Source-Code/DinosarGame/style.css rename to Source-Code/DinosaurGame/style.css From 9c731b68b2de100928055bc147548ed96c017f1c Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Wed, 31 Jul 2024 02:34:29 +0530 Subject: [PATCH 083/167] Add semantic tags --- Source-Code/DinosaurGame/index.html | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 Source-Code/DinosaurGame/index.html diff --git a/Source-Code/DinosaurGame/index.html b/Source-Code/DinosaurGame/index.html new file mode 100644 index 0000000..a907ec6 --- /dev/null +++ b/Source-Code/DinosaurGame/index.html @@ -0,0 +1,22 @@ + + + + + + + DINOSAUR GAME + + +

    DINOSAUR GAME 🦕

    +
    +
    + dino +
    +
    + cactus +
    +
    + + + + \ No newline at end of file From 785243ee953aae1ea983af97bcfe5e09b2128291 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Wed, 31 Jul 2024 02:57:34 +0530 Subject: [PATCH 084/167] add assets --- Source-Code/DinosaurGame/assets/cactus.png | Bin 0 -> 20672 bytes Source-Code/DinosaurGame/assets/dinosaur.png | Bin 0 -> 2585 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Source-Code/DinosaurGame/assets/cactus.png create mode 100644 Source-Code/DinosaurGame/assets/dinosaur.png diff --git a/Source-Code/DinosaurGame/assets/cactus.png b/Source-Code/DinosaurGame/assets/cactus.png new file mode 100644 index 0000000000000000000000000000000000000000..5d6dcbe172064bfea0d229be8044b9317d90f18b GIT binary patch literal 20672 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 Date: Wed, 31 Jul 2024 02:58:18 +0530 Subject: [PATCH 085/167] update the source for images --- Source-Code/DinosaurGame/index.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Source-Code/DinosaurGame/index.html b/Source-Code/DinosaurGame/index.html index a907ec6..b654bd9 100644 --- a/Source-Code/DinosaurGame/index.html +++ b/Source-Code/DinosaurGame/index.html @@ -10,10 +10,10 @@

    DINOSAUR GAME 🦕

    - dino + dino
    - cactus + cactus
    From e49206f1477cf8a12caacea72aeb4cbc5f462480 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Wed, 31 Jul 2024 02:58:32 +0530 Subject: [PATCH 086/167] add styles --- Source-Code/DinosaurGame/style.css | 74 ++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/Source-Code/DinosaurGame/style.css b/Source-Code/DinosaurGame/style.css index e69de29..bce3590 100644 --- a/Source-Code/DinosaurGame/style.css +++ b/Source-Code/DinosaurGame/style.css @@ -0,0 +1,74 @@ +* { + margin: 0; + padding: 0; + background-color: rgb(27, 75, 133); +} + +.game-heading { + text-align: center; + font-family: Arial, Helvetica, sans-serif; + color: rgb(0, 247, 255); + text-shadow: 3px 2px rgb(128, 0, 0); + font-size: 5em; + margin: 40px 0; +} + +.game { + width: 800px; + height: 300px; + margin: 60px auto; + display: flex; + border: 3px solid rgb(0, 247, 255); +} + +.cactus { + height: 40px; + object-fit: contain; + position: relative; + top: 261px; + left: 670px; + animation: block 3s infinite linear; +} + +.block { + height: 40px; +} + +.character { + height: 100px; +} + +.dino { + height: 100px; + object-fit: contain; + position: relative; + top: 200px; +} + +.animate { + animation: character 500ms; +} + +@keyframes block { + 0% { + left: 670px; + } + 100% { + left: -60px; + } +} + +@keyframes character { + 0% { + top: 203px; + } + 30% { + top: 140px; + } + 70% { + top: 140px; + } + 100% { + top: 203px; + } +} \ No newline at end of file From 1b22edfc2f1e3e41cf65ec95f89a9f539aad5076 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Wed, 31 Jul 2024 03:01:31 +0530 Subject: [PATCH 087/167] add functionality --- Source-Code/DinosaurGame/script.js | 37 ++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/Source-Code/DinosaurGame/script.js b/Source-Code/DinosaurGame/script.js index e69de29..a565b9e 100644 --- a/Source-Code/DinosaurGame/script.js +++ b/Source-Code/DinosaurGame/script.js @@ -0,0 +1,37 @@ +const character = document.querySelector(".dino"); +const block = document.querySelector(".cactus"); + +const jump = () => { + // Add class to initiate jump + character.classList.add("animate"); + + // Remove class after animation duration (500ms) + setTimeout(() => { + character.classList.remove("animate"); + }, 500); +}; + +// Trigger jump on spacebar press +document.addEventListener("keydown", (event) => { + if (event.code === "Space") { + jump(); + } +}); + +// Check for collision +const checkDead = setInterval(() => { + const blockLeft = parseInt( + window.getComputedStyle(block).getPropertyValue("left") + ); + const characterTop = parseInt( + window.getComputedStyle(character).getPropertyValue("top") + ); + + // Check for collision + if (blockLeft < 20 && blockLeft > 0 && characterTop >= 178) { + block.style.animation = "none"; + block.style.display = "none"; + alert("Uh..Oh, you lose."); + clearInterval(checkDead); // Stop checking for collisions + } +}, 100); From d31d54fe065cd29400bd878eb4db05908000c39f Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Wed, 31 Jul 2024 03:02:59 +0530 Subject: [PATCH 088/167] add event listener --- Source-Code/DinosaurGame/script.js | 66 +++++++++++++++--------------- 1 file changed, 34 insertions(+), 32 deletions(-) diff --git a/Source-Code/DinosaurGame/script.js b/Source-Code/DinosaurGame/script.js index a565b9e..c898412 100644 --- a/Source-Code/DinosaurGame/script.js +++ b/Source-Code/DinosaurGame/script.js @@ -1,37 +1,39 @@ -const character = document.querySelector(".dino"); -const block = document.querySelector(".cactus"); +document.addEventListener("DOMContentLoaded", () => { + const character = document.querySelector(".dino"); + const block = document.querySelector(".cactus"); -const jump = () => { - // Add class to initiate jump - character.classList.add("animate"); + const jump = () => { + // Add class to initiate jump + character.classList.add("animate"); - // Remove class after animation duration (500ms) - setTimeout(() => { - character.classList.remove("animate"); - }, 500); -}; + // Remove class after animation duration (500ms) + setTimeout(() => { + character.classList.remove("animate"); + }, 500); + }; -// Trigger jump on spacebar press -document.addEventListener("keydown", (event) => { - if (event.code === "Space") { - jump(); - } -}); - -// Check for collision -const checkDead = setInterval(() => { - const blockLeft = parseInt( - window.getComputedStyle(block).getPropertyValue("left") - ); - const characterTop = parseInt( - window.getComputedStyle(character).getPropertyValue("top") - ); + // Trigger jump on spacebar press + document.addEventListener("keydown", (event) => { + if (event.code === "Space") { + jump(); + } + }); // Check for collision - if (blockLeft < 20 && blockLeft > 0 && characterTop >= 178) { - block.style.animation = "none"; - block.style.display = "none"; - alert("Uh..Oh, you lose."); - clearInterval(checkDead); // Stop checking for collisions - } -}, 100); + const checkDead = setInterval(() => { + const blockLeft = parseInt( + window.getComputedStyle(block).getPropertyValue("left") + ); + const characterTop = parseInt( + window.getComputedStyle(character).getPropertyValue("top") + ); + + // Check for collision + if (blockLeft < 20 && blockLeft > 0 && characterTop >= 178) { + block.style.animation = "none"; + block.style.display = "none"; + alert("Uh..Oh, you lose."); + clearInterval(checkDead); // Stop checking for collisions + } + }, 100); +}); From fdf6166e9c495815a3387903a61e623ae4546535 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Wed, 31 Jul 2024 03:11:48 +0530 Subject: [PATCH 089/167] solve linter errors --- Source-Code/DinosaurGame/index.html | 29 +++++---- Source-Code/DinosaurGame/script.js | 26 ++++---- Source-Code/DinosaurGame/style.css | 96 +++++++++++++++-------------- 3 files changed, 78 insertions(+), 73 deletions(-) diff --git a/Source-Code/DinosaurGame/index.html b/Source-Code/DinosaurGame/index.html index b654bd9..f285bcd 100644 --- a/Source-Code/DinosaurGame/index.html +++ b/Source-Code/DinosaurGame/index.html @@ -1,22 +1,21 @@ - - - - + + + + DINOSAUR GAME - - + +

    DINOSAUR GAME 🦕

    -
    - dino -
    -
    - cactus -
    +
    + dino +
    +
    + cactus +
    - - - \ No newline at end of file + + diff --git a/Source-Code/DinosaurGame/script.js b/Source-Code/DinosaurGame/script.js index c898412..c249b6b 100644 --- a/Source-Code/DinosaurGame/script.js +++ b/Source-Code/DinosaurGame/script.js @@ -1,20 +1,20 @@ -document.addEventListener("DOMContentLoaded", () => { - const character = document.querySelector(".dino"); - const block = document.querySelector(".cactus"); +document.addEventListener('DOMContentLoaded', () => { + const character = document.querySelector('.dino'); + const block = document.querySelector('.cactus'); const jump = () => { // Add class to initiate jump - character.classList.add("animate"); + character.classList.add('animate'); // Remove class after animation duration (500ms) setTimeout(() => { - character.classList.remove("animate"); + character.classList.remove('animate'); }, 500); }; // Trigger jump on spacebar press - document.addEventListener("keydown", (event) => { - if (event.code === "Space") { + document.addEventListener('keydown', (event) => { + if (event.code === 'Space') { jump(); } }); @@ -22,17 +22,19 @@ document.addEventListener("DOMContentLoaded", () => { // Check for collision const checkDead = setInterval(() => { const blockLeft = parseInt( - window.getComputedStyle(block).getPropertyValue("left") + window.getComputedStyle(block).getPropertyValue('left'), + 10, ); const characterTop = parseInt( - window.getComputedStyle(character).getPropertyValue("top") + window.getComputedStyle(character).getPropertyValue('top'), + 10, ); // Check for collision if (blockLeft < 20 && blockLeft > 0 && characterTop >= 178) { - block.style.animation = "none"; - block.style.display = "none"; - alert("Uh..Oh, you lose."); + block.style.animation = 'none'; + block.style.display = 'none'; + alert('Uh..Oh, you lose.'); clearInterval(checkDead); // Stop checking for collisions } }, 100); diff --git a/Source-Code/DinosaurGame/style.css b/Source-Code/DinosaurGame/style.css index bce3590..46ceea6 100644 --- a/Source-Code/DinosaurGame/style.css +++ b/Source-Code/DinosaurGame/style.css @@ -1,74 +1,78 @@ * { - margin: 0; - padding: 0; - background-color: rgb(27, 75, 133); + margin: 0; + padding: 0; + background-color: rgb(27, 75, 133); } .game-heading { - text-align: center; - font-family: Arial, Helvetica, sans-serif; - color: rgb(0, 247, 255); - text-shadow: 3px 2px rgb(128, 0, 0); - font-size: 5em; - margin: 40px 0; + text-align: center; + font-family: Arial, Helvetica, sans-serif; + color: rgb(0, 247, 255); + text-shadow: 3px 2px rgb(128, 0, 0); + font-size: 5em; + margin: 40px 0; } .game { - width: 800px; - height: 300px; - margin: 60px auto; - display: flex; - border: 3px solid rgb(0, 247, 255); + width: 800px; + height: 300px; + margin: 60px auto; + display: flex; + border: 3px solid rgb(0, 247, 255); } .cactus { - height: 40px; - object-fit: contain; - position: relative; - top: 261px; - left: 670px; - animation: block 3s infinite linear; + height: 40px; + object-fit: contain; + position: relative; + top: 261px; + left: 670px; + animation: block 3s infinite linear; } .block { - height: 40px; + height: 40px; } .character { - height: 100px; + height: 100px; } .dino { - height: 100px; - object-fit: contain; - position: relative; - top: 200px; + height: 100px; + object-fit: contain; + position: relative; + top: 200px; } .animate { - animation: character 500ms; + animation: character 500ms; } @keyframes block { - 0% { - left: 670px; - } - 100% { - left: -60px; - } + 0% { + left: 670px; + } + + 100% { + left: -60px; + } } @keyframes character { - 0% { - top: 203px; - } - 30% { - top: 140px; - } - 70% { - top: 140px; - } - 100% { - top: 203px; - } -} \ No newline at end of file + 0% { + top: 203px; + } + + 30% { + top: 140px; + } + + 70% { + top: 140px; + } + + 100% { + top: 203px; + } +} From cec3ceb2664947cbfaf00766ec5acefa8c5dc2c2 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Wed, 31 Jul 2024 03:14:28 +0530 Subject: [PATCH 090/167] update the project --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index fac6b93..db09128 100644 --- a/README.md +++ b/README.md @@ -342,6 +342,17 @@ In order to run this project you need: +
  • +
    +Dinosaur Game +

    This project is a simple, interactive "Dinosaur Game" built using HTML, CSS, and JavaScript. Inspired by the classic offline game in Google Chrome, the player controls a dinosaur character that must jump over moving obstacles (cacti) to avoid collision. The game features basic animations and a scoring system, providing an engaging experience. The project demonstrates fundamental concepts of web development, including DOM manipulation, event handling, and CSS animations.

    + +
    +
  • +

    (back to top)

    From d15c520e74e7693abc385b9c79b3cfe8d3696360 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Wed, 31 Jul 2024 03:34:01 +0530 Subject: [PATCH 091/167] create a template for project --- Source-Code/JumpGame/index.html | 11 +++++++++++ Source-Code/JumpGame/script.js | 0 Source-Code/JumpGame/style.css | 0 3 files changed, 11 insertions(+) create mode 100644 Source-Code/JumpGame/index.html create mode 100644 Source-Code/JumpGame/script.js create mode 100644 Source-Code/JumpGame/style.css diff --git a/Source-Code/JumpGame/index.html b/Source-Code/JumpGame/index.html new file mode 100644 index 0000000..d01f779 --- /dev/null +++ b/Source-Code/JumpGame/index.html @@ -0,0 +1,11 @@ + + + + + + Document + + + + + \ No newline at end of file diff --git a/Source-Code/JumpGame/script.js b/Source-Code/JumpGame/script.js new file mode 100644 index 0000000..e69de29 diff --git a/Source-Code/JumpGame/style.css b/Source-Code/JumpGame/style.css new file mode 100644 index 0000000..e69de29 From eb4e7115b1f322dbb36d5f0eada3383faa9463bb Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Wed, 31 Jul 2024 03:51:34 +0530 Subject: [PATCH 092/167] add div for blocks --- Source-Code/JumpGame/index.html | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/Source-Code/JumpGame/index.html b/Source-Code/JumpGame/index.html index d01f779..e3373ea 100644 --- a/Source-Code/JumpGame/index.html +++ b/Source-Code/JumpGame/index.html @@ -1,11 +1,20 @@ - - - - Document - - - - - \ No newline at end of file + + + + Jump Game + + + +

    Jump Game

    +

    Press space to jump

    +
    +
    +
    +
    +
    +

    Score:

    + + + From 5b8e902299752e6ecddb7a8a75b56bf9208d510f Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Wed, 31 Jul 2024 03:51:48 +0530 Subject: [PATCH 093/167] Ad styles and keyframes --- Source-Code/JumpGame/style.css | 111 +++++++++++++++++++++++++++++++++ 1 file changed, 111 insertions(+) diff --git a/Source-Code/JumpGame/style.css b/Source-Code/JumpGame/style.css index e69de29..fb6f638 100644 --- a/Source-Code/JumpGame/style.css +++ b/Source-Code/JumpGame/style.css @@ -0,0 +1,111 @@ +* { + padding: 0; + margin: 0; + overflow: hidden; + text-align: center; + background-color: blue; +} + +.game { + top: 40px; + width: 500px; + height: 200px; + border: 1px solid black; + margin: 10% auto; + background-color: aqua; +} + +h2 { + text-align: center; + font-family: Arial, Helvetica, sans-serif; + color: rgb(0, 247, 255); + text-shadow: 3px 2px rgb(128, 0, 0); + font-size: 5em; +} + +p { + color: white; + font-size: 20px; +} + +#character { + width: 30px; + height: 50px; + background-color: red; + position: relative; + top: 150px; + border-radius: 70%; +} + +.animate { + animation: jump 0.3s linear; +} + +@keyframes jump { + 0% { + top: 150px; + } + 30% { + top: 100px; + } + 70% { + top: 100px; + } + 100% { + top: 150px; + } +} + +#block { + background-color: blue; + width: 20px; + height: 20px; + position: relative; + top: 130px; + left: 500px; + animation: block 1s infinite linear; +} + +#block2 { + background-color: orange; + width: 20px; + height: 20px; + position: relative; + top: 30px; + left: 500px; +} + +.animate1 { + animation: blocke 1.5s infinite linear; +} + +@keyframes blocke { + 0% { + left: 500px; + } + 100% { + left: -20px; + } +} + +@keyframes block { + 0% { + left: 500px; + } + 100% { + left: -20px; + } +} +p { + text-align: center; +} +#co { + margin-bottom: 10px; + font-weight: bold; +} +.animate2 { + animation: pa 1s ease-in-out; +} +.show { + opacity: 0; +} From 9abe934f8883739848fa9554ebba80169156aa08 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Wed, 31 Jul 2024 03:52:06 +0530 Subject: [PATCH 094/167] add functionality --- Source-Code/JumpGame/script.js | 66 ++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/Source-Code/JumpGame/script.js b/Source-Code/JumpGame/script.js index e69de29..7e13d47 100644 --- a/Source-Code/JumpGame/script.js +++ b/Source-Code/JumpGame/script.js @@ -0,0 +1,66 @@ +const character = document.getElementById("character"); +const block = document.getElementById("block"); +const block2 = document.getElementById("block2"); +const co = document.getElementById("co"); +var counter = 0; + +var je = setInterval(() => { + co.classList.add("animate2"); + setTimeout(() => { + co.classList.add("show"); + }, 2000); +}, 1000); +function jump() { + if (character.classList === "animate") { + return; + } + character.classList.add("animate"); + setTimeout(function () { + character.classList.remove("animate"); + }, 300); +} +function myFunction(event) { + var x = event.keyCode; + if (x == 32) { + jump(); + } +} +var checkDead = setInterval(function () { + let characterTop = parseInt( + window.getComputedStyle(character).getPropertyValue("top") + ); + let blockLeft = parseInt( + window.getComputedStyle(block).getPropertyValue("left") + ); + if (blockLeft < 20 && blockLeft > -20 && characterTop >= 130) { + block.style.animation = "none"; + alert("Game Over. score: " + Math.floor(counter / 100)); + counter = 0; + block.style.animation = "block 1s infinite linear"; + } else if (ka()) { + } else { + counter++; + document.getElementById("scoreSpan").innerHTML = Math.floor(counter / 100); + } +}, 10); +var add = setInterval(() => { + block2.classList.add("animate1"); + setTimeout(() => { + block2.classList.remove("animate1"); + }, 9000); +}, 7000); + +function ka() { + let characterTop = parseInt( + window.getComputedStyle(character).getPropertyValue("top") + ); + let blockTop = parseInt( + window.getComputedStyle(block2).getPropertyValue("left") + ); + if (blockTop < 20 && characterTop == 100) { + block2.classList.remove("animate1"); + alert("Game Over. score: " + Math.floor(counter / 100)); + counter = 0; + } +} +window.addEventListener("keydown", myFunction); From 126870b7843122590db9f20d5141052d5bc9a018 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Wed, 31 Jul 2024 04:20:16 +0530 Subject: [PATCH 095/167] solve linter error --- Source-Code/JumpGame/script.js | 98 +++++++++++++++++----------------- Source-Code/JumpGame/style.css | 12 +++-- 2 files changed, 58 insertions(+), 52 deletions(-) diff --git a/Source-Code/JumpGame/script.js b/Source-Code/JumpGame/script.js index 7e13d47..9b02e9b 100644 --- a/Source-Code/JumpGame/script.js +++ b/Source-Code/JumpGame/script.js @@ -1,66 +1,66 @@ -const character = document.getElementById("character"); -const block = document.getElementById("block"); -const block2 = document.getElementById("block2"); -const co = document.getElementById("co"); -var counter = 0; +const character = document.getElementById('character'); +const block = document.getElementById('block'); +const block2 = document.getElementById('block2'); +let counter = 0; -var je = setInterval(() => { - co.classList.add("animate2"); +const jump = () => { + if (character.classList.contains('animate')) return; + character.classList.add('animate'); setTimeout(() => { - co.classList.add("show"); - }, 2000); -}, 1000); -function jump() { - if (character.classList === "animate") { - return; - } - character.classList.add("animate"); - setTimeout(function () { - character.classList.remove("animate"); + character.classList.remove('animate'); }, 300); -} -function myFunction(event) { - var x = event.keyCode; - if (x == 32) { - jump(); - } -} -var checkDead = setInterval(function () { - let characterTop = parseInt( - window.getComputedStyle(character).getPropertyValue("top") +}; + +// eslint-disable-next-line no-unused-vars +const checkDead = setInterval(() => { + const characterTop = parseInt( + window.getComputedStyle(character).getPropertyValue('top'), + 10, ); - let blockLeft = parseInt( - window.getComputedStyle(block).getPropertyValue("left") + const blockLeft = parseInt( + window.getComputedStyle(block).getPropertyValue('left'), + 10, ); if (blockLeft < 20 && blockLeft > -20 && characterTop >= 130) { - block.style.animation = "none"; - alert("Game Over. score: " + Math.floor(counter / 100)); + block.style.animation = 'none'; + alert(`Game Over. Score: ${Math.floor(counter / 100)}`); counter = 0; - block.style.animation = "block 1s infinite linear"; - } else if (ka()) { + block.style.animation = 'block 1s infinite linear'; } else { - counter++; - document.getElementById("scoreSpan").innerHTML = Math.floor(counter / 100); + counter += 1; + document.getElementById('scoreSpan').innerText = Math.floor(counter / 100); } }, 10); -var add = setInterval(() => { - block2.classList.add("animate1"); + +const add = () => { + block2.classList.add('animate1'); setTimeout(() => { - block2.classList.remove("animate1"); + block2.classList.remove('animate1'); }, 9000); -}, 7000); +}; -function ka() { - let characterTop = parseInt( - window.getComputedStyle(character).getPropertyValue("top") +// Call the `add` function at regular intervals to animate block2 +setInterval(add, 7000); + +// eslint-disable-next-line no-unused-vars +const ka = () => { + const characterTop = parseInt( + window.getComputedStyle(character).getPropertyValue('top'), + 10, ); - let blockTop = parseInt( - window.getComputedStyle(block2).getPropertyValue("left") + const blockTop = parseInt( + window.getComputedStyle(block2).getPropertyValue('left'), + 10, ); - if (blockTop < 20 && characterTop == 100) { - block2.classList.remove("animate1"); - alert("Game Over. score: " + Math.floor(counter / 100)); + if (blockTop < 20 && characterTop === 100) { + block2.classList.remove('animate1'); + alert(`Game Over. Score: ${Math.floor(counter / 100)}`); counter = 0; } -} -window.addEventListener("keydown", myFunction); +}; + +window.addEventListener('keydown', (event) => { + if (event.keyCode === 32) { + jump(); + } +}); diff --git a/Source-Code/JumpGame/style.css b/Source-Code/JumpGame/style.css index fb6f638..fe3c090 100644 --- a/Source-Code/JumpGame/style.css +++ b/Source-Code/JumpGame/style.css @@ -26,6 +26,7 @@ h2 { p { color: white; font-size: 20px; + text-align: center; } #character { @@ -45,12 +46,15 @@ p { 0% { top: 150px; } + 30% { top: 100px; } + 70% { top: 100px; } + 100% { top: 150px; } @@ -83,6 +87,7 @@ p { 0% { left: 500px; } + 100% { left: -20px; } @@ -92,20 +97,21 @@ p { 0% { left: 500px; } + 100% { left: -20px; } } -p { - text-align: center; -} + #co { margin-bottom: 10px; font-weight: bold; } + .animate2 { animation: pa 1s ease-in-out; } + .show { opacity: 0; } From 472060928eccd71b2aeb0d965874ffaad0c67262 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Wed, 31 Jul 2024 04:22:40 +0530 Subject: [PATCH 096/167] update the project --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index db09128..5616387 100644 --- a/README.md +++ b/README.md @@ -353,6 +353,17 @@ In order to run this project you need: +
  • +
    +Dinosaur Game +

    This project is a simple browser-based "Jump Game" where players control a character that must jump over blocks to avoid collisions. It demonstrates the use of HTML, CSS, and JavaScript to create an interactive game with basic animations and collision detection. The player uses the spacebar to jump and scores points based on survival time. The game includes two types of moving obstacles, adding a layer of challenge.

    + +
    +
  • +

    (back to top)

    From 88ae6d450931d2efc2ac538323da603df2c9ab0b Mon Sep 17 00:00:00 2001 From: Tajul Afreen <119053190+tajulafreen@users.noreply.github.com> Date: Mon, 5 Aug 2024 10:12:38 +0530 Subject: [PATCH 097/167] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5616387..f4aba61 100644 --- a/README.md +++ b/README.md @@ -355,7 +355,7 @@ In order to run this project you need:
  • -Dinosaur Game +Jump Game

    This project is a simple browser-based "Jump Game" where players control a character that must jump over blocks to avoid collisions. It demonstrates the use of HTML, CSS, and JavaScript to create an interactive game with basic animations and collision detection. The player uses the spacebar to jump and scores points based on survival time. The game includes two types of moving obstacles, adding a layer of challenge.

    • Live Demo
    • From d7d24306046baacec68b7af07fa10a62bb09ba4b Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Thu, 8 Aug 2024 23:35:36 +0530 Subject: [PATCH 098/167] Add template for project --- Source-Code/MemoryCard/index.html | 11 +++++++++++ Source-Code/MemoryCard/script.js | 0 Source-Code/MemoryCard/style.css | 0 3 files changed, 11 insertions(+) create mode 100644 Source-Code/MemoryCard/index.html create mode 100644 Source-Code/MemoryCard/script.js create mode 100644 Source-Code/MemoryCard/style.css diff --git a/Source-Code/MemoryCard/index.html b/Source-Code/MemoryCard/index.html new file mode 100644 index 0000000..9cecf52 --- /dev/null +++ b/Source-Code/MemoryCard/index.html @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/Source-Code/MemoryCard/script.js b/Source-Code/MemoryCard/script.js new file mode 100644 index 0000000..e69de29 diff --git a/Source-Code/MemoryCard/style.css b/Source-Code/MemoryCard/style.css new file mode 100644 index 0000000..e69de29 From 8c8f0ae950bfc12beaad0e59185937c2dece593a Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Fri, 9 Aug 2024 00:30:18 +0530 Subject: [PATCH 099/167] Add div and button for generating cards --- Source-Code/MemoryCard/index.html | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/Source-Code/MemoryCard/index.html b/Source-Code/MemoryCard/index.html index 9cecf52..0037ab2 100644 --- a/Source-Code/MemoryCard/index.html +++ b/Source-Code/MemoryCard/index.html @@ -3,9 +3,17 @@ - + Memory Card Game + - +
      +

      Memory Card Game

      +
      + +
      + +
      + - \ No newline at end of file + From 9ab5fc9def27bc964f0d78ac8eda402180c996c3 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Fri, 9 Aug 2024 00:31:06 +0530 Subject: [PATCH 100/167] Add functioanlities --- Source-Code/MemoryCard/script.js | 107 +++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) diff --git a/Source-Code/MemoryCard/script.js b/Source-Code/MemoryCard/script.js index e69de29..e493312 100644 --- a/Source-Code/MemoryCard/script.js +++ b/Source-Code/MemoryCard/script.js @@ -0,0 +1,107 @@ +const cardValues = [ + '🍎', + '🍎', + '🍌', + '🍌', + '🍮', + '🍮', + '🎂', + '🎂', + '🍟', + '🍟', + '🍫', + '🍫', + '🍇', + '🍇', + '🥝', + '🥝', +]; +let shuffledValues = []; +let cardElements = []; +let flippedCards = []; +let matchedCards = []; + +const shuffleArray = (array) => { + let currentIndex = array.length; + let temporaryValue; + let randomIndex; + + while (currentIndex !== 0) { + randomIndex = Math.floor(Math.random() * currentIndex); + currentIndex -= 1; + + temporaryValue = array[currentIndex]; + array[currentIndex] = array[randomIndex]; + array[randomIndex] = temporaryValue; + } + + return array; +}; + +const checkMatch = () => { + const [card1, card2] = flippedCards; + + if ( + card1.querySelector('.card-back').textContent + === card2.querySelector('.card-back').textContent + ) { + matchedCards.push(card1, card2); + } else { + card1.classList.remove('flipped'); + card2.classList.remove('flipped'); + } + flippedCards = []; + + if (matchedCards.length === cardElements.length) { + alert('Congratulations! You found all pairs!'); + } +}; + +const flipCard = (card) => { + if ( + flippedCards.length < 2 + && !card.classList.contains('flipped') + && !matchedCards.includes(card) + ) { + card.classList.add('flipped'); + flippedCards.push(card); + + if (flippedCards.length === 2) { + setTimeout(checkMatch, 1000); + } + } +}; +const startGame = () => { + shuffledValues = shuffleArray(cardValues); + const board = document.getElementById('game-board'); + board.innerHTML = ''; + matchedCards = []; + cardElements = []; + for (let i = 0; i < shuffledValues.length; i += 1) { + const card = document.createElement('div'); + card.classList.add('card'); + + const cardInner = document.createElement('div'); + cardInner.classList.add('card-inner'); + + const cardFront = document.createElement('div'); + cardFront.classList.add('card-front'); + + const cardBack = document.createElement('div'); + cardBack.classList.add('card-back'); + cardBack.textContent = shuffledValues[i]; + + cardInner.appendChild(cardFront); + cardInner.appendChild(cardBack); + card.appendChild(cardInner); + + card.addEventListener('click', () => flipCard(card)); + board.appendChild(card); + cardElements.push(card); + } +}; + +const btn = document.querySelector('.btn'); +btn.addEventListener('click', startGame); +// Initialize the game when the page loads +window.onload = startGame; From c3e45bfb8e7dd88e0f942ec0c0e6d7ccdbfbaf02 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Fri, 9 Aug 2024 00:31:18 +0530 Subject: [PATCH 101/167] Add styles --- Source-Code/MemoryCard/style.css | 87 ++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/Source-Code/MemoryCard/style.css b/Source-Code/MemoryCard/style.css index e69de29..c787a6f 100644 --- a/Source-Code/MemoryCard/style.css +++ b/Source-Code/MemoryCard/style.css @@ -0,0 +1,87 @@ +body { + font-family: Arial, sans-serif; + display: flex; + justify-content: center; + align-items: center; + height: 100vh; + margin: 0; + background-color: #eeddf0; +} + +h1 { + color: #d38692; + font-size: 2em; +} + +.container { + text-align: center; + background-color: #a7f1c5; + padding: 20px; + border-radius: 8px; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); +} + +.game-board { + display: grid; + grid-template-columns: repeat(4, 100px); + grid-template-rows: repeat(4, 100px); + gap: 10px; + margin-bottom: 20px; +} + +.card { + width: 100px; + height: 100px; + background-color: #eee; + display: flex; + align-items: center; + justify-content: center; + font-size: 2em; + cursor: pointer; + color: transparent; + perspective: 1000px; /* Added for 3D effect */ +} + +.card-inner { + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + transition: transform 0.6s; + transform-style: preserve-3d; + position: relative; +} + +.card-front, +.card-back { + position: absolute; + width: 100%; + height: 100%; + backface-visibility: hidden; +} + +.card-front { + background-color: #e68ce0; +} + +.card-back { + background-color: #fff; + font-size: 60px; + color: #000; + transform: rotateY(180deg); +} + +.card.flipped .card-inner { + transform: rotateY(180deg); +} + +button { + padding: 15px 20px; + font-size: 18px; + font-weight: 600; + color: rgb(228, 240, 240); + border: none; + cursor: pointer; + background-color: #008cba; +} From 4282bf266cc0437c8daa3a75fcd56c9703acf439 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Fri, 9 Aug 2024 00:31:27 +0530 Subject: [PATCH 102/167] update readme --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 5616387..f989460 100644 --- a/README.md +++ b/README.md @@ -364,6 +364,17 @@ In order to run this project you need:
  • +
  • +
    +Memory Card Game +

    The Memory Card Game is a classic card-matching game designed to enhance cognitive skills and memory. Players are presented with a grid of face-down cards. The goal is to find and match all pairs of cards. This project demonstrates fundamental web development skills using HTML, CSS, and JavaScript.

    + +
    +
  • +

    (back to top)

    From a4eb9c346cc21e4b3a92405064dfb27471864cbd Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Fri, 9 Aug 2024 00:47:00 +0530 Subject: [PATCH 103/167] create a template for project --- Source-Code/ToDoList/index.html | 11 +++++++++++ Source-Code/ToDoList/script.js | 0 Source-Code/ToDoList/style.css | 0 3 files changed, 11 insertions(+) create mode 100644 Source-Code/ToDoList/index.html create mode 100644 Source-Code/ToDoList/script.js create mode 100644 Source-Code/ToDoList/style.css diff --git a/Source-Code/ToDoList/index.html b/Source-Code/ToDoList/index.html new file mode 100644 index 0000000..d01f779 --- /dev/null +++ b/Source-Code/ToDoList/index.html @@ -0,0 +1,11 @@ + + + + + + Document + + + + + \ No newline at end of file diff --git a/Source-Code/ToDoList/script.js b/Source-Code/ToDoList/script.js new file mode 100644 index 0000000..e69de29 diff --git a/Source-Code/ToDoList/style.css b/Source-Code/ToDoList/style.css new file mode 100644 index 0000000..e69de29 From 031ec3ad56f74000ecb39fb3fc8a169157110cd8 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Fri, 9 Aug 2024 01:28:15 +0530 Subject: [PATCH 104/167] Add buton and options --- Source-Code/ToDoList/index.html | 32 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/Source-Code/ToDoList/index.html b/Source-Code/ToDoList/index.html index d01f779..0f73d2a 100644 --- a/Source-Code/ToDoList/index.html +++ b/Source-Code/ToDoList/index.html @@ -3,9 +3,35 @@ - Document + To-Do List with Categories + - +
    +

    To-Do List

    +
    + + + +
    +
    + + +
    +
      + +
    +
    + - \ No newline at end of file + From 18472feee46150fdf9484599a3c1bc0ca4a9122d Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Fri, 9 Aug 2024 01:28:58 +0530 Subject: [PATCH 105/167] Add event listner and import the task --- Source-Code/ToDoList/index.js | 23 +++++++++++++++++++++++ Source-Code/ToDoList/script.js | 0 2 files changed, 23 insertions(+) create mode 100644 Source-Code/ToDoList/index.js delete mode 100644 Source-Code/ToDoList/script.js diff --git a/Source-Code/ToDoList/index.js b/Source-Code/ToDoList/index.js new file mode 100644 index 0000000..7010274 --- /dev/null +++ b/Source-Code/ToDoList/index.js @@ -0,0 +1,23 @@ +import { addTask, deleteTask } from './module/main.js'; +import filterTasks from './module/filters.js'; + +document.addEventListener('DOMContentLoaded', () => { + const taskInput = document.getElementById('task-input'); + const categorySelect = document.getElementById('category-select'); + const taskList = document.getElementById('task-list'); + const filterSelect = document.getElementById('filter-select'); + + document.querySelector('.add-btn').addEventListener('click', () => { + addTask(taskInput, categorySelect, taskList); + }); + + filterSelect.addEventListener('change', () => { + filterTasks(filterSelect, taskList); + }); + + taskList.addEventListener('click', (event) => { + if (event.target.classList.contains('delete-btn')) { + deleteTask(event.target); + } + }); +}); diff --git a/Source-Code/ToDoList/script.js b/Source-Code/ToDoList/script.js deleted file mode 100644 index e69de29..0000000 From 5313503cc034ad3c3a56e5e1a5d6ee22830ae5f7 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Fri, 9 Aug 2024 01:29:13 +0530 Subject: [PATCH 106/167] give the styles --- Source-Code/ToDoList/style.css | 82 ++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/Source-Code/ToDoList/style.css b/Source-Code/ToDoList/style.css index e69de29..3d58179 100644 --- a/Source-Code/ToDoList/style.css +++ b/Source-Code/ToDoList/style.css @@ -0,0 +1,82 @@ +body { + font-family: Arial, sans-serif; + display: flex; + justify-content: center; + align-items: center; + height: 100vh; + margin: 0; + background-color: #f4f4f4; +} + +.container { + background-color: #fff; + padding: 20px; + border-radius: 8px; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); + +} + +h1 { + text-align: center; +} + +.form-container { + margin-bottom: 20px; +} + +#task-input, #category-select, button { + margin: 5px; + padding: 10px; + border: 1px solid #ccc; + border-radius: 4px; +} + +button { + background-color: #007bff; + color: #fff; + border: none; + cursor: pointer; +} + +button:hover { + background-color: #0056b3; +} + +.filter-container { + margin-bottom: 20px; + display: flex; + justify-content: space-between; + align-items: center; +} + +ul { + list-style-type: none; + padding: 0; +} + +li { + background-color: #f9f9f9; + margin: 5px 0; + padding: 10px; + border-radius: 4px; + display: flex; + justify-content: space-between; + align-items: center; +} + +.task-text { + flex: 1; +} + +.delete-btn { + background-color: #dc3545; + color: #fff; + border: none; + padding: 5px 10px; + border-radius: 4px; + cursor: pointer; +} + +.delete-btn:hover { + background-color: #c82333; +} From c6be96b08865b7a1895c6d68a6d42da7ef5aac3a Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Fri, 9 Aug 2024 01:29:33 +0530 Subject: [PATCH 107/167] dd filter funtionality --- Source-Code/ToDoList/module/filters.js | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 Source-Code/ToDoList/module/filters.js diff --git a/Source-Code/ToDoList/module/filters.js b/Source-Code/ToDoList/module/filters.js new file mode 100644 index 0000000..ec9d708 --- /dev/null +++ b/Source-Code/ToDoList/module/filters.js @@ -0,0 +1,13 @@ +export default function filterTasks(filterSelect, taskList) { + const filterValue = filterSelect.value; + const tasks = taskList.getElementsByClassName('task-item'); + + for (let i = 0; i < tasks.length; i += 1) { + const taskCategory = tasks[i].innerText.split(' (')[1].split(')')[0]; + if (filterValue === '' || filterValue === taskCategory) { + tasks[i].style.display = ''; + } else { + tasks[i].style.display = 'none'; + } + } +} From d748447ea04a687f5dd720b8300675a4d9fade1f Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Fri, 9 Aug 2024 01:30:08 +0530 Subject: [PATCH 108/167] create the add task and delete task functionality --- Source-Code/ToDoList/module/main.js | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 Source-Code/ToDoList/module/main.js diff --git a/Source-Code/ToDoList/module/main.js b/Source-Code/ToDoList/module/main.js new file mode 100644 index 0000000..606a8a9 --- /dev/null +++ b/Source-Code/ToDoList/module/main.js @@ -0,0 +1,27 @@ +export function addTask(taskInput, categorySelect, taskList) { + const taskText = taskInput.value.trim(); + const category = categorySelect.value; + + if (taskText === '' || category === '') { + alert('Please enter a task and select a category.'); + return; + } + + const li = document.createElement('li'); + li.classList.add('task-item'); + li.innerHTML = ` + ${taskText} (${category}) + + `; + + taskList.appendChild(li); + + // Clear input fields + taskInput.value = ''; + categorySelect.value = ''; +} + +export function deleteTask(button) { + const taskList = document.getElementById('task-list'); + taskList.removeChild(button.parentElement); +} From 9ecad5619187f7e25bc710e57a6bc661f3200775 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Fri, 9 Aug 2024 01:30:17 +0530 Subject: [PATCH 109/167] update readme --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 2770c73..aa0be88 100644 --- a/README.md +++ b/README.md @@ -375,6 +375,17 @@ In order to run this project you need: +
  • +
    +TO DO LIST +

    This project is a simple web-based To-Do List application that allows users to add tasks, categorize them, and filter tasks by category. The application is built using HTML, CSS, and JavaScript, with JavaScript modules to separate concerns and improve maintainability.

    + +
    +
  • +

    (back to top)

    From f0003dc55e2ac081cda88180e5557ba0d9fdff31 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Fri, 9 Aug 2024 01:37:28 +0530 Subject: [PATCH 110/167] solve linter issue --- Source-Code/ToDoList/style.css | 91 +++++++++++++++++----------------- 1 file changed, 46 insertions(+), 45 deletions(-) diff --git a/Source-Code/ToDoList/style.css b/Source-Code/ToDoList/style.css index 3d58179..083349e 100644 --- a/Source-Code/ToDoList/style.css +++ b/Source-Code/ToDoList/style.css @@ -1,82 +1,83 @@ body { - font-family: Arial, sans-serif; - display: flex; - justify-content: center; - align-items: center; - height: 100vh; - margin: 0; - background-color: #f4f4f4; + font-family: Arial, sans-serif; + display: flex; + justify-content: center; + align-items: center; + height: 100vh; + margin: 0; + background-color: #f4f4f4; } .container { - background-color: #fff; - padding: 20px; - border-radius: 8px; - box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); - + background-color: #fff; + padding: 20px; + border-radius: 8px; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); } h1 { - text-align: center; + text-align: center; } .form-container { - margin-bottom: 20px; + margin-bottom: 20px; } -#task-input, #category-select, button { - margin: 5px; - padding: 10px; - border: 1px solid #ccc; - border-radius: 4px; +#task-input, +#category-select, +button { + margin: 5px; + padding: 10px; + border: 1px solid #ccc; + border-radius: 4px; } button { - background-color: #007bff; - color: #fff; - border: none; - cursor: pointer; + background-color: #007bff; + color: #fff; + border: none; + cursor: pointer; } button:hover { - background-color: #0056b3; + background-color: #0056b3; } .filter-container { - margin-bottom: 20px; - display: flex; - justify-content: space-between; - align-items: center; + margin-bottom: 20px; + display: flex; + justify-content: space-between; + align-items: center; } ul { - list-style-type: none; - padding: 0; + list-style-type: none; + padding: 0; } li { - background-color: #f9f9f9; - margin: 5px 0; - padding: 10px; - border-radius: 4px; - display: flex; - justify-content: space-between; - align-items: center; + background-color: #f9f9f9; + margin: 5px 0; + padding: 10px; + border-radius: 4px; + display: flex; + justify-content: space-between; + align-items: center; } .task-text { - flex: 1; + flex: 1; } .delete-btn { - background-color: #dc3545; - color: #fff; - border: none; - padding: 5px 10px; - border-radius: 4px; - cursor: pointer; + background-color: #dc3545; + color: #fff; + border: none; + padding: 5px 10px; + border-radius: 4px; + cursor: pointer; } .delete-btn:hover { - background-color: #c82333; + background-color: #c82333; } From cbcedc22f9aa773d4e15fea5078961a9e0903e45 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Fri, 30 Aug 2024 15:43:10 +0530 Subject: [PATCH 111/167] create a template for project --- Source-Code/PasswordGenerator/index.html | 19 +++++++++++++++++++ Source-Code/PasswordGenerator/script.js | 0 Source-Code/PasswordGenerator/style.css | 0 3 files changed, 19 insertions(+) create mode 100644 Source-Code/PasswordGenerator/index.html create mode 100644 Source-Code/PasswordGenerator/script.js create mode 100644 Source-Code/PasswordGenerator/style.css diff --git a/Source-Code/PasswordGenerator/index.html b/Source-Code/PasswordGenerator/index.html new file mode 100644 index 0000000..509e61b --- /dev/null +++ b/Source-Code/PasswordGenerator/index.html @@ -0,0 +1,19 @@ + + + + + + + + + Password Generator + + + + + + + + \ No newline at end of file diff --git a/Source-Code/PasswordGenerator/script.js b/Source-Code/PasswordGenerator/script.js new file mode 100644 index 0000000..e69de29 diff --git a/Source-Code/PasswordGenerator/style.css b/Source-Code/PasswordGenerator/style.css new file mode 100644 index 0000000..e69de29 From 9dde1662b7bfcd373646014c0e28b1805392f1f1 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Fri, 30 Aug 2024 16:04:21 +0530 Subject: [PATCH 112/167] Add containers and input and button --- Source-Code/PasswordGenerator/index.html | 38 +++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/Source-Code/PasswordGenerator/index.html b/Source-Code/PasswordGenerator/index.html index 509e61b..a3efb62 100644 --- a/Source-Code/PasswordGenerator/index.html +++ b/Source-Code/PasswordGenerator/index.html @@ -11,7 +11,43 @@ Password Generator - +
    +
    +

    Password Generator

    +
    + + +
    +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    +
    + + +
    From 3212bdc2aff982e757ea0470ff080e112e723862 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Fri, 30 Aug 2024 16:04:36 +0530 Subject: [PATCH 113/167] Add styles --- Source-Code/PasswordGenerator/style.css | 83 +++++++++++++++++++++++++ 1 file changed, 83 insertions(+) diff --git a/Source-Code/PasswordGenerator/style.css b/Source-Code/PasswordGenerator/style.css index e69de29..e888c47 100644 --- a/Source-Code/PasswordGenerator/style.css +++ b/Source-Code/PasswordGenerator/style.css @@ -0,0 +1,83 @@ +@import url('https://fonts.googleapis.com/css?family=Muli&display=swap'); + +* { + box-sizing: border-box; +} + +body { + background: linear-gradient(to right, #e762ea, #b3f4f0); + color: rgb(255, 255, 255); + font-family: 'Muli'; + font-weight: 500; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + height: 100vh; + overflow: hidden; + padding: 10px; + margin: 0; +} + +h2 { + margin: 10px 0 20px; + text-align: center; + font-weight: 1000; +} + +.container { + background-color: #2bd3df; + box-shadow: 0px 2px 10px rgba(255, 255, 255, 0.2); + padding: 20px; + width: 350px; + max-width: 100%; +} + +.result-container { + background-color: rgba(0, 0, 0, 0.247); + display: flex; + justify-content: flex-start; + align-items: center; + position: relative; + font-size: 18px; + font-weight: bold; + letter-spacing: 1px; + padding: 12px 10px; + height: 50px; + width: 100%; +} + +.result-container #result { + word-wrap: break-word; + max-width: calc(100% - 40px); +} + +.result-container .btn { + position: absolute; + top: 5px; + right: 5px; + width: 40px; + height: 40px; + font-size: 20px; +} + +.btn { + border: none; + background-color: #2c085c; + color: #fff; + font-size: 16px; + padding: 8px 12px; + cursor: pointer; +} + +.btn-large { + display: block; + width: 100%; +} + +.setting { + display: flex; + justify-content: space-between; + align-items: center; + margin: 15px 0; +} \ No newline at end of file From 4a7685d473777b13bab813d08ec1ad4b62bed45a Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Fri, 30 Aug 2024 16:05:01 +0530 Subject: [PATCH 114/167] Add functionality for buttons --- Source-Code/PasswordGenerator/script.js | 87 +++++++++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/Source-Code/PasswordGenerator/script.js b/Source-Code/PasswordGenerator/script.js index e69de29..dad899d 100644 --- a/Source-Code/PasswordGenerator/script.js +++ b/Source-Code/PasswordGenerator/script.js @@ -0,0 +1,87 @@ +const resultEl = document.getElementById("result"); +const lengthEl = document.getElementById("length"); +const uppercaseEl = document.getElementById("uppercase"); +const lowercaseEl = document.getElementById("lowercase"); +const numbersEl = document.getElementById("numbers"); +const symbolsEl = document.getElementById("symbols"); +const generateEl = document.getElementById("generate"); +const clipboardEl = document.getElementById("clipboard"); + +const randomFunc = { + lower: getRandomLower, + upper: getRandomUpper, + number: getRandomNumber, + symbol: getRandomSymbol, +}; + +clipboardEl.addEventListener("click", () => { + const textarea = document.createElement("textarea"); + const password = resultEl.innerText; + + if (!password) { + return; + } + + textarea.value = password; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand("copy"); + textarea.remove(); + alert("Password copied to clipboard!"); +}); + +generateEl.addEventListener("click", () => { + const length = +lengthEl.value; + const hasLower = lowercaseEl.checked; + const hasUpper = uppercaseEl.checked; + const hasNumber = numbersEl.checked; + const hasSymbol = symbolsEl.checked; + + resultEl.innerText = generatePassword( + hasLower, + hasUpper, + hasNumber, + hasSymbol, + length + ); +}); + +function generatePassword(lower, upper, number, symbol, length) { + let generatedPassword = ""; + const typesCount = lower + upper + number + symbol; + const typesArr = [{ lower }, { upper }, { number }, { symbol }].filter( + (item) => Object.values(item)[0] + ); + + if (typesCount === 0) { + return ""; + } + + for (let i = 0; i < length; i += typesCount) { + typesArr.forEach((type) => { + const funcName = Object.keys(type)[0]; + generatedPassword += randomFunc[funcName](); + }); + } + + const finalPassword = generatedPassword.slice(0, length); + + return finalPassword; +} + +function getRandomLower() { + return String.fromCharCode(Math.floor(Math.random() * 26) + 97); +} + +function getRandomUpper() { + return String.fromCharCode(Math.floor(Math.random() * 26) + 65); +} + +function getRandomNumber() { + return String.fromCharCode(Math.floor(Math.random() * 10) + 48); +} + +function getRandomSymbol() { + const symbols = "!@#$%^&*(){}[]=<>/,."; + return symbols[Math.floor(Math.random() * symbols.length)]; +} From 42fa2b2122302c5ab5ccc8b9e75abcb45a2218ef Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Fri, 30 Aug 2024 16:23:45 +0530 Subject: [PATCH 115/167] solve linter issues --- Source-Code/PasswordGenerator/index.html | 92 ++++++++++---------- Source-Code/PasswordGenerator/script.js | 103 +++++++++++------------ Source-Code/PasswordGenerator/style.css | 24 +++--- 3 files changed, 109 insertions(+), 110 deletions(-) diff --git a/Source-Code/PasswordGenerator/index.html b/Source-Code/PasswordGenerator/index.html index a3efb62..67d0781 100644 --- a/Source-Code/PasswordGenerator/index.html +++ b/Source-Code/PasswordGenerator/index.html @@ -1,55 +1,55 @@ - - - - + + + + - + Password Generator - - + +
    -
    -

    Password Generator

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

    Password Generator

    +
    + +
    - - +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    + + +
    +
    +
    +
    - + - - \ No newline at end of file + + diff --git a/Source-Code/PasswordGenerator/script.js b/Source-Code/PasswordGenerator/script.js index dad899d..846ae96 100644 --- a/Source-Code/PasswordGenerator/script.js +++ b/Source-Code/PasswordGenerator/script.js @@ -1,21 +1,15 @@ -const resultEl = document.getElementById("result"); -const lengthEl = document.getElementById("length"); -const uppercaseEl = document.getElementById("uppercase"); -const lowercaseEl = document.getElementById("lowercase"); -const numbersEl = document.getElementById("numbers"); -const symbolsEl = document.getElementById("symbols"); -const generateEl = document.getElementById("generate"); -const clipboardEl = document.getElementById("clipboard"); +/* eslint-disable no-loop-func */ +const resultEl = document.getElementById('result'); +const lengthEl = document.getElementById('length'); +const uppercaseEl = document.getElementById('uppercase'); +const lowercaseEl = document.getElementById('lowercase'); +const numbersEl = document.getElementById('numbers'); +const symbolsEl = document.getElementById('symbols'); +const generateEl = document.getElementById('generate'); +const clipboardEl = document.getElementById('clipboard'); -const randomFunc = { - lower: getRandomLower, - upper: getRandomUpper, - number: getRandomNumber, - symbol: getRandomSymbol, -}; - -clipboardEl.addEventListener("click", () => { - const textarea = document.createElement("textarea"); +clipboardEl.addEventListener('click', () => { + const textarea = document.createElement('textarea'); const password = resultEl.innerText; if (!password) { @@ -25,36 +19,43 @@ clipboardEl.addEventListener("click", () => { textarea.value = password; document.body.appendChild(textarea); textarea.select(); - document.execCommand("copy"); + document.execCommand('copy'); textarea.remove(); - alert("Password copied to clipboard!"); + alert('Password copied to clipboard!'); }); -generateEl.addEventListener("click", () => { - const length = +lengthEl.value; - const hasLower = lowercaseEl.checked; - const hasUpper = uppercaseEl.checked; - const hasNumber = numbersEl.checked; - const hasSymbol = symbolsEl.checked; +function getRandomLower() { + return String.fromCharCode(Math.floor(Math.random() * 26) + 97); +} - resultEl.innerText = generatePassword( - hasLower, - hasUpper, - hasNumber, - hasSymbol, - length - ); -}); +function getRandomUpper() { + return String.fromCharCode(Math.floor(Math.random() * 26) + 65); +} + +function getRandomNumber() { + return String.fromCharCode(Math.floor(Math.random() * 10) + 48); +} + +function getRandomSymbol() { + const symbols = '!@#$%^&*(){}[]=<>/,.'; + return symbols[Math.floor(Math.random() * symbols.length)]; +} +const randomFunc = { + lower: getRandomLower, + upper: getRandomUpper, + number: getRandomNumber, + symbol: getRandomSymbol, +}; function generatePassword(lower, upper, number, symbol, length) { - let generatedPassword = ""; + let generatedPassword = ''; const typesCount = lower + upper + number + symbol; const typesArr = [{ lower }, { upper }, { number }, { symbol }].filter( - (item) => Object.values(item)[0] + (item) => Object.values(item)[0], ); if (typesCount === 0) { - return ""; + return ''; } for (let i = 0; i < length; i += typesCount) { @@ -68,20 +69,18 @@ function generatePassword(lower, upper, number, symbol, length) { return finalPassword; } +generateEl.addEventListener('click', () => { + const length = +lengthEl.value; + const hasLower = lowercaseEl.checked; + const hasUpper = uppercaseEl.checked; + const hasNumber = numbersEl.checked; + const hasSymbol = symbolsEl.checked; -function getRandomLower() { - return String.fromCharCode(Math.floor(Math.random() * 26) + 97); -} - -function getRandomUpper() { - return String.fromCharCode(Math.floor(Math.random() * 26) + 65); -} - -function getRandomNumber() { - return String.fromCharCode(Math.floor(Math.random() * 10) + 48); -} - -function getRandomSymbol() { - const symbols = "!@#$%^&*(){}[]=<>/,."; - return symbols[Math.floor(Math.random() * symbols.length)]; -} + resultEl.innerText = generatePassword( + hasLower, + hasUpper, + hasNumber, + hasSymbol, + length, + ); +}); diff --git a/Source-Code/PasswordGenerator/style.css b/Source-Code/PasswordGenerator/style.css index e888c47..304d22d 100644 --- a/Source-Code/PasswordGenerator/style.css +++ b/Source-Code/PasswordGenerator/style.css @@ -7,7 +7,7 @@ body { background: linear-gradient(to right, #e762ea, #b3f4f0); color: rgb(255, 255, 255); - font-family: 'Muli'; + font-family: 'Courier New', Courier, monospace; font-weight: 500; display: flex; flex-direction: column; @@ -27,7 +27,7 @@ h2 { .container { background-color: #2bd3df; - box-shadow: 0px 2px 10px rgba(255, 255, 255, 0.2); + box-shadow: 0 2px 10px rgba(255, 255, 255, 0.2); padding: 20px; width: 350px; max-width: 100%; @@ -52,15 +52,6 @@ h2 { max-width: calc(100% - 40px); } -.result-container .btn { - position: absolute; - top: 5px; - right: 5px; - width: 40px; - height: 40px; - font-size: 20px; -} - .btn { border: none; background-color: #2c085c; @@ -70,6 +61,15 @@ h2 { cursor: pointer; } +.result-container .btn { + position: absolute; + top: 5px; + right: 5px; + width: 40px; + height: 40px; + font-size: 20px; +} + .btn-large { display: block; width: 100%; @@ -80,4 +80,4 @@ h2 { justify-content: space-between; align-items: center; margin: 15px 0; -} \ No newline at end of file +} From 0b3f72a362134460faa1a61cd2acaa747f904e20 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Fri, 30 Aug 2024 16:29:12 +0530 Subject: [PATCH 116/167] used Es6 format --- Source-Code/PasswordGenerator/script.js | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/Source-Code/PasswordGenerator/script.js b/Source-Code/PasswordGenerator/script.js index 846ae96..3af8d1c 100644 --- a/Source-Code/PasswordGenerator/script.js +++ b/Source-Code/PasswordGenerator/script.js @@ -24,22 +24,16 @@ clipboardEl.addEventListener('click', () => { alert('Password copied to clipboard!'); }); -function getRandomLower() { - return String.fromCharCode(Math.floor(Math.random() * 26) + 97); -} +const getRandomLower = () => String.fromCharCode(Math.floor(Math.random() * 26) + 97); -function getRandomUpper() { - return String.fromCharCode(Math.floor(Math.random() * 26) + 65); -} +const getRandomUpper = () => String.fromCharCode(Math.floor(Math.random() * 26) + 65); -function getRandomNumber() { - return String.fromCharCode(Math.floor(Math.random() * 10) + 48); -} +const getRandomNumber = () => String.fromCharCode(Math.floor(Math.random() * 10) + 48); -function getRandomSymbol() { +const getRandomSymbol = () => { const symbols = '!@#$%^&*(){}[]=<>/,.'; return symbols[Math.floor(Math.random() * symbols.length)]; -} +}; const randomFunc = { lower: getRandomLower, @@ -47,7 +41,7 @@ const randomFunc = { number: getRandomNumber, symbol: getRandomSymbol, }; -function generatePassword(lower, upper, number, symbol, length) { +const generatePassword = (lower, upper, number, symbol, length) => { let generatedPassword = ''; const typesCount = lower + upper + number + symbol; const typesArr = [{ lower }, { upper }, { number }, { symbol }].filter( @@ -68,7 +62,7 @@ function generatePassword(lower, upper, number, symbol, length) { const finalPassword = generatedPassword.slice(0, length); return finalPassword; -} +}; generateEl.addEventListener('click', () => { const length = +lengthEl.value; const hasLower = lowercaseEl.checked; From ef8f6c1abb5596c191e3cb5604e42e15f4351ad8 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Fri, 30 Aug 2024 16:38:56 +0530 Subject: [PATCH 117/167] update readme --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index aa0be88..aec14bb 100644 --- a/README.md +++ b/README.md @@ -386,6 +386,17 @@ In order to run this project you need: +
  • +
    +Password Generator +

    The Password Generator App is a web application that allows users to create secure, customizable passwords based on user-defined criteria such as length and character types. It offers a simple interface for generating and copying passwords to the clipboard. This tool enhances online security by providing strong, random passwords.

    + +
    +
  • +

    (back to top)

    From 3f1e832f5678c18c1ec3128b5e998f87263f7326 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Tue, 17 Dec 2024 00:37:24 +0530 Subject: [PATCH 118/167] create a templete for project --- Source-Code/NotesKeeper/index.html | 12 ++++++++++++ Source-Code/NotesKeeper/script.js | 0 Source-Code/NotesKeeper/style.css | 0 3 files changed, 12 insertions(+) create mode 100644 Source-Code/NotesKeeper/index.html create mode 100644 Source-Code/NotesKeeper/script.js create mode 100644 Source-Code/NotesKeeper/style.css diff --git a/Source-Code/NotesKeeper/index.html b/Source-Code/NotesKeeper/index.html new file mode 100644 index 0000000..5914054 --- /dev/null +++ b/Source-Code/NotesKeeper/index.html @@ -0,0 +1,12 @@ + + + + + + Notes Keeper + + + + + + \ No newline at end of file diff --git a/Source-Code/NotesKeeper/script.js b/Source-Code/NotesKeeper/script.js new file mode 100644 index 0000000..e69de29 diff --git a/Source-Code/NotesKeeper/style.css b/Source-Code/NotesKeeper/style.css new file mode 100644 index 0000000..e69de29 From 51bed6bc08d5eca8ff04c85a469a6d701da8a4c9 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Tue, 17 Dec 2024 00:53:44 +0530 Subject: [PATCH 119/167] Add the project --- Source-Code/NotesKeeper/index.html | 23 ++++++ Source-Code/NotesKeeper/script.js | 65 +++++++++++++++++ Source-Code/NotesKeeper/style.css | 109 +++++++++++++++++++++++++++++ 3 files changed, 197 insertions(+) diff --git a/Source-Code/NotesKeeper/index.html b/Source-Code/NotesKeeper/index.html index 5914054..3e6a629 100644 --- a/Source-Code/NotesKeeper/index.html +++ b/Source-Code/NotesKeeper/index.html @@ -7,6 +7,29 @@ + + +
    +

    Welcome to Notes App

    +
    +
    +
    + +
    +
    +

    Your Notes

    +
    +
    No notes added yet.
    +
    \ No newline at end of file diff --git a/Source-Code/NotesKeeper/script.js b/Source-Code/NotesKeeper/script.js index e69de29..77bc42a 100644 --- a/Source-Code/NotesKeeper/script.js +++ b/Source-Code/NotesKeeper/script.js @@ -0,0 +1,65 @@ +console.log('Welcome to Magic Notes App!'); + +// Function Declaration Before Use +function showNotes() { + const notesObj = JSON.parse(localStorage.getItem('notes')) || []; + const notesElem = document.getElementById('notes'); + + if (notesObj.length === 0) { + notesElem.innerHTML = 'No notes added yet.'; + return; + } + + notesElem.innerHTML = notesObj + .map( + (note, index) => ` +
    +

    Note ${index + 1}

    +

    ${note}

    + +
    + `, + ) + .join(''); +} + +// Event Listener for Add Note Button +document.getElementById('myBtn').addEventListener('click', () => { + const textArea = document.getElementById('textarea'); + const noteContent = textArea.value.trim(); + if (!noteContent) { + alert('Please enter a note!'); + return; + } + + const notesObj = JSON.parse(localStorage.getItem('notes')) || []; + notesObj.push(noteContent); + localStorage.setItem('notes', JSON.stringify(notesObj)); + textArea.value = ''; + showNotes(); +}); + +// Delete Note Function +// eslint-disable-next-line no-unused-vars +function deleteNote(index) { + const notesObj = JSON.parse(localStorage.getItem('notes')) || []; + notesObj.splice(index, 1); + localStorage.setItem('notes', JSON.stringify(notesObj)); + showNotes(); +} + +// Search Notes +document.getElementById('search').addEventListener('input', function () { + const inputVal = this.value.toLowerCase().trim(); + const noteBoxes = document.getElementsByClassName('noteBox'); + + Array.from(noteBoxes).forEach((element) => { + const boxTxt = element + .querySelector('.paraHeading') + .innerText.toLowerCase(); + element.style.display = boxTxt.includes(inputVal) ? 'block' : 'none'; + }); +}); + +// Initial Call +showNotes(); diff --git a/Source-Code/NotesKeeper/style.css b/Source-Code/NotesKeeper/style.css index e69de29..b6f5f85 100644 --- a/Source-Code/NotesKeeper/style.css +++ b/Source-Code/NotesKeeper/style.css @@ -0,0 +1,109 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: Arial, sans-serif; + background-color: #f4f4f9; + padding: 20px; +} + +.navbar { + display: flex; + justify-content: space-between; + align-items: center; + background-color: #333; + padding: 10px 20px; + color: white; +} + +.navbar #logo { + font-size: 24px; + font-weight: bold; +} + +.navbar ul { + list-style: none; + display: flex; +} + +.navbar ul li { + margin-left: 20px; +} + +.navbar ul li a { + color: white; + text-decoration: none; + font-size: 18px; +} + +.form-group input { + padding: 5px; + margin-right: 10px; +} + +.form-group button { + padding: 5px 10px; + background-color: #ff6700; + border: none; + color: white; + cursor: pointer; +} + +.container { + margin-top: 30px; +} + +.note-input { + background: white; + padding: 20px; + border-radius: 5px; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); +} + +.note-input label { + font-size: 18px; + font-weight: bold; +} + +.note-input textarea { + width: 100%; + padding: 10px; + margin-top: 10px; + border: 1px solid #ccc; + border-radius: 5px; + resize: none; +} + +.note-input button { + margin-top: 10px; + padding: 10px 20px; + background-color: #007bff; + color: white; + border: none; + border-radius: 5px; + cursor: pointer; +} + +.hrStyle { + margin: 20px 0; +} + +.notesBox { + background: white; + display: flex; + gap: 30px; + padding: 20px; + border-radius: 5px; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); + min-height: 100px; + text-align: center; + font-size: 18px; + color: #555; +} + +.buttonHeading { + padding: 5px 20px; +} From ccee6d68dda4145d0fbde50f300803d28b32bb59 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Tue, 17 Dec 2024 00:56:41 +0530 Subject: [PATCH 120/167] update the readme --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index aec14bb..ad3dbb5 100644 --- a/README.md +++ b/README.md @@ -397,6 +397,17 @@ In order to run this project you need: +
  • +
    +Notes Keeper +

    The Notes Keeper App is a web-based application designed for creating, storing, and managing personal notes. It offers a simple and intuitive interface for adding, searching, and deleting notes using local storage, ensuring data persistence across sessions.

    + +
    +
  • +

    (back to top)

    From d9ab3e87b5198fa69c416d2b339c936bbc4441b0 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Tue, 17 Dec 2024 01:26:13 +0530 Subject: [PATCH 121/167] add the project --- Source-Code/CurrencyConverter/index.html | 33 +++++++++++++++++ Source-Code/CurrencyConverter/script.js | 27 ++++++++++++++ Source-Code/CurrencyConverter/style.css | 46 ++++++++++++++++++++++++ 3 files changed, 106 insertions(+) create mode 100644 Source-Code/CurrencyConverter/index.html create mode 100644 Source-Code/CurrencyConverter/script.js create mode 100644 Source-Code/CurrencyConverter/style.css diff --git a/Source-Code/CurrencyConverter/index.html b/Source-Code/CurrencyConverter/index.html new file mode 100644 index 0000000..52d77f6 --- /dev/null +++ b/Source-Code/CurrencyConverter/index.html @@ -0,0 +1,33 @@ + + + + + + Currency Converter + + + +
    +

    Currency Converter

    +
    + + + to + + +
    +
    +
    + + + \ No newline at end of file diff --git a/Source-Code/CurrencyConverter/script.js b/Source-Code/CurrencyConverter/script.js new file mode 100644 index 0000000..afb6869 --- /dev/null +++ b/Source-Code/CurrencyConverter/script.js @@ -0,0 +1,27 @@ +document.getElementById('convert').addEventListener('click', () => { + const amount = document.getElementById('amount').value; + const fromCurrency = document.getElementById('from-currency').value; + const toCurrency = document.getElementById('to-currency').value; + + if (amount === '' || Number.isNaN(Number(amount))) { + alert('Please enter a valid amount'); + return; + } + + const apiUrl = `https://api.exchangerate-api.com/v4/latest/${fromCurrency}`; + + fetch(apiUrl) + .then((response) => response.json()) + .then((data) => { + const exchangeRate = data.rates[toCurrency]; + const convertedAmount = (amount * exchangeRate).toFixed(2); + document.getElementById( + 'result', + ).innerText = `${amount} ${fromCurrency} = ${convertedAmount} ${toCurrency}`; + }) + .catch((error) => { + document.getElementById( + 'result', + ).innerText = `Error fetching exchange rates. ${error}Try again later.`; + }); +}); diff --git a/Source-Code/CurrencyConverter/style.css b/Source-Code/CurrencyConverter/style.css new file mode 100644 index 0000000..e5cf912 --- /dev/null +++ b/Source-Code/CurrencyConverter/style.css @@ -0,0 +1,46 @@ +body { + font-family: Arial, sans-serif; + background-color: #f4f4f4; + margin: 0; + padding: 0; + display: flex; + justify-content: center; + align-items: center; + height: 100vh; +} + +.container { + background-color: white; + padding: 20px; + border-radius: 10px; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); + width: 400px; + text-align: center; +} + +h1 { + margin-bottom: 20px; +} + +input, select, button { + margin: 10px 0; + padding: 10px; + font-size: 16px; +} + +button { + background-color: #4CAF50; + color: white; + border: none; + cursor: pointer; +} + +button:hover { + background-color: #45a049; +} + +#result { + margin-top: 20px; + font-size: 18px; + font-weight: bold; +} From 7bcce3db035d0c619bd2b639e0722b174720b96b Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Tue, 17 Dec 2024 01:26:54 +0530 Subject: [PATCH 122/167] correct the css --- Source-Code/CurrencyConverter/style.css | 56 +++++++++++++------------ 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/Source-Code/CurrencyConverter/style.css b/Source-Code/CurrencyConverter/style.css index e5cf912..e318503 100644 --- a/Source-Code/CurrencyConverter/style.css +++ b/Source-Code/CurrencyConverter/style.css @@ -1,46 +1,48 @@ body { - font-family: Arial, sans-serif; - background-color: #f4f4f4; - margin: 0; - padding: 0; - display: flex; - justify-content: center; - align-items: center; - height: 100vh; + font-family: Arial, sans-serif; + background-color: #f4f4f4; + margin: 0; + padding: 0; + display: flex; + justify-content: center; + align-items: center; + height: 100vh; } .container { - background-color: white; - padding: 20px; - border-radius: 10px; - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - width: 400px; - text-align: center; + background-color: white; + padding: 20px; + border-radius: 10px; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); + width: 400px; + text-align: center; } h1 { - margin-bottom: 20px; + margin-bottom: 20px; } -input, select, button { - margin: 10px 0; - padding: 10px; - font-size: 16px; +input, +select, +button { + margin: 10px 0; + padding: 10px; + font-size: 16px; } button { - background-color: #4CAF50; - color: white; - border: none; - cursor: pointer; + background-color: #4caf50; + color: white; + border: none; + cursor: pointer; } button:hover { - background-color: #45a049; + background-color: #45a049; } #result { - margin-top: 20px; - font-size: 18px; - font-weight: bold; + margin-top: 20px; + font-size: 18px; + font-weight: bold; } From a94bc17434916dcd11c4248efdcc50dcedc1839f Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Tue, 17 Dec 2024 01:29:31 +0530 Subject: [PATCH 123/167] updat eteh readme --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index ad3dbb5..7d52ee5 100644 --- a/README.md +++ b/README.md @@ -408,6 +408,17 @@ In order to run this project you need: +
  • +
    +Currency Converter +

    This project is a Currency Converter application built using HTML, CSS, and JavaScript. It allows users to convert one currency into another by inputting an amount and selecting the currencies they want to convert from and to.

    + +
    +
  • +

    (back to top)

    From 9f278323e1155d61cb3375f690d7b7b091d89a06 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Thu, 19 Dec 2024 21:53:52 +0530 Subject: [PATCH 124/167] Add the project --- Source-Code/JustRelax/index.html | 24 +++++++ Source-Code/JustRelax/script.js | 32 +++++++++ Source-Code/JustRelax/style.css | 116 +++++++++++++++++++++++++++++++ 3 files changed, 172 insertions(+) create mode 100644 Source-Code/JustRelax/index.html create mode 100644 Source-Code/JustRelax/script.js create mode 100644 Source-Code/JustRelax/style.css diff --git a/Source-Code/JustRelax/index.html b/Source-Code/JustRelax/index.html new file mode 100644 index 0000000..796e484 --- /dev/null +++ b/Source-Code/JustRelax/index.html @@ -0,0 +1,24 @@ + + + + + + + Just Relax App + + + + +

    Just Relax !!

    +
    +
    +

    +
    + +
    +
    +
    + + + + \ No newline at end of file diff --git a/Source-Code/JustRelax/script.js b/Source-Code/JustRelax/script.js new file mode 100644 index 0000000..e7098fe --- /dev/null +++ b/Source-Code/JustRelax/script.js @@ -0,0 +1,32 @@ +/* eslint-disable no-use-before-define */ +const container = document.querySelector('.container'); +const text = document.querySelector('#text'); + +const TOTAL_TIME = 7500; +const BREATHE_TIME = (TOTAL_TIME / 5) * 2; +const HOLD_TIME = TOTAL_TIME / 7; + +// Start the animation +const startBreathingAnimation = () => { + animateBreathing(); + setInterval(animateBreathing, TOTAL_TIME); +}; + +const animateBreathing = () => { + text.textContent = 'Breathe In!'; + container.classList.add('grow'); + container.classList.remove('shrink'); + + setTimeout(() => { + text.textContent = 'Hold...'; + + setTimeout(() => { + text.textContent = 'Breathe Out!'; + container.classList.add('shrink'); + container.classList.remove('grow'); + }, HOLD_TIME); + }, BREATHE_TIME); +}; + +// Initialize the animation +startBreathingAnimation(); diff --git a/Source-Code/JustRelax/style.css b/Source-Code/JustRelax/style.css new file mode 100644 index 0000000..447fe0c --- /dev/null +++ b/Source-Code/JustRelax/style.css @@ -0,0 +1,116 @@ +@import url('https://fonts.googleapis.com/css2?family=Dancing+Script:wght@550;700&display=swap'); + +* { + box-sizing: border-box; +} + +body { + background: linear-gradient(90deg, #5567b7, #53a0ad); + color: rgb(243, 250, 235); + font-family: 'Dancing Script', sans-serif; + font-size: large; + font-weight: 500; + min-height: 100vh; + overflow: hidden; + display: flex; + align-items: center; + flex-direction: column; + margin: 0; +} + +.container { + display: flex; + align-items: center; + justify-content: center; + height: 300px; + width: 300px; + margin: auto; + position: relative; + transform: scale(1); +} + +.gradient-circle { + background: + conic-gradient( + #5567b7 0%, + #954ca4 40%, + #fff 40%, + #fff 60%, + #53afb3 60%, + #53a0ad 100% + ); + height: 320px; + width: 320px; + position: absolute; + top: -10px; + left: -10px; + z-index: -2; + border-radius: 50%; +} + +.circle { + background-color: rgb(2, 16, 43); + height: 100%; + width: 100%; + position: absolute; + top: 0; + left: 0; + z-index: -1; + border-radius: 50%; +} + +.pointer-container { + position: absolute; + top: -40px; + left: 140px; + width: 20px; + height: 190px; + animation: rotate 7.5s linear forwards infinite; + transform-origin: bottom center; +} + +.pointer { + background-color: lavender; + border-radius: 50%; + height: 20px; + width: 20px; + display: block; +} + +.container.grow { + animation: grow 3s linear forwards; +} + +.container.shrink { + animation: shrink 3s linear forwards; +} + +@keyframes rotate { + from { + transform: rotate(0deg); + } + + to { + transform: rotate(360deg); + } +} + +@keyframes grow { + from { + transform: scale(1); + } + + to { + transform: scale(1.2); + } +} + +@keyframes shrink { + from { + transform: scale(1.2); + } + + to { + transform: scale(1); + } +} From 825e5b1132407155eadd4c70bb0116d57465262a Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Thu, 19 Dec 2024 21:57:56 +0530 Subject: [PATCH 125/167] update the with the project --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 7d52ee5..a57a985 100644 --- a/README.md +++ b/README.md @@ -419,6 +419,17 @@ In order to run this project you need: +
  • +
    +Just Relax +

    The Just Relax App is a breathing exercise web application built with HTML, CSS, and JavaScript (ES6+). It guides users through a breathing exercise by animating visual cues and displaying text prompts such as "Breathe In," "Hold," and "Breathe Out." This helps users relax and practice mindfulness.

    + +
    +
  • +

    (back to top)

    From 6edc85f7d721634cec80211b8d0c352dd5d53119 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Thu, 19 Dec 2024 22:32:07 +0530 Subject: [PATCH 126/167] add the recipe app --- Source-Code/RecipeApp/index.html | 19 ++++++++++ Source-Code/RecipeApp/script.js | 38 ++++++++++++++++++++ Source-Code/RecipeApp/style.css | 61 ++++++++++++++++++++++++++++++++ 3 files changed, 118 insertions(+) create mode 100644 Source-Code/RecipeApp/index.html create mode 100644 Source-Code/RecipeApp/script.js create mode 100644 Source-Code/RecipeApp/style.css diff --git a/Source-Code/RecipeApp/index.html b/Source-Code/RecipeApp/index.html new file mode 100644 index 0000000..51ba5bf --- /dev/null +++ b/Source-Code/RecipeApp/index.html @@ -0,0 +1,19 @@ + + + + + + Recipe App + + + +

    Recipe App

    + +
    +
    + + + \ No newline at end of file diff --git a/Source-Code/RecipeApp/script.js b/Source-Code/RecipeApp/script.js new file mode 100644 index 0000000..de13836 --- /dev/null +++ b/Source-Code/RecipeApp/script.js @@ -0,0 +1,38 @@ +/* eslint-disable no-use-before-define */ + +const searchRecipes = async () => { + const query = document.getElementById('search-input').value; + if (!query) return; + + try { + const response = await fetch( + `https://www.themealdb.com/api/json/v1/1/search.php?s=${query}`, + ); + const data = await response.json(); + displayRecipes(data.meals); + } catch (error) { + console.error('Error fetching recipes:', error); + } +}; + +const displayRecipes = (meals) => { + const recipesContainer = document.getElementById('recipes'); + recipesContainer.innerHTML = ''; + + if (!meals) { + recipesContainer.innerHTML = '

    No recipes found!

    '; + return; + } + + meals.forEach((meal) => { + const recipe = document.createElement('div'); + recipe.className = 'recipe'; + recipe.innerHTML = ` + ${meal.strMeal} +

    ${meal.strMeal}

    + View Recipe + `; + recipesContainer.appendChild(recipe); + }); +}; +document.getElementById('search').addEventListener('click', searchRecipes); diff --git a/Source-Code/RecipeApp/style.css b/Source-Code/RecipeApp/style.css new file mode 100644 index 0000000..3cea222 --- /dev/null +++ b/Source-Code/RecipeApp/style.css @@ -0,0 +1,61 @@ +body { + font-family: Arial, sans-serif; + background-color: #f8f8f8; + margin: 0; + padding: 0; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + +h1 { + text-align: center; + color: #333; +} + +.search-box { + display: flex; + gap: 20px; +} + +input[type="text"] { + min-width: 300px; + max-width: 400px; + padding: 10px; + font-size: 16px; + border: 1px solid #ccc; + border-radius: 4px; +} + +button { + padding: 10px 20px; + font-size: 16px; + background: #28a745; + color: white; + border: none; + border-radius: 4px; + cursor: pointer; +} + +button:hover { + background: #218838; +} + +.recipes { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); + gap: 20px; +} + +.recipe { + background: #f4f4f4; + padding: 15px; + border-radius: 8px; + text-align: center; +} + +.recipe img { + width: 100%; + border-radius: 8px; +} From c2a2ce0de73b14a5b597ba37126d7a8d0ad3280b Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Thu, 19 Dec 2024 23:16:45 +0530 Subject: [PATCH 127/167] update the readme --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index a57a985..f34710e 100644 --- a/README.md +++ b/README.md @@ -430,6 +430,17 @@ In order to run this project you need: +
  • +
    +Recipe App +

    The Recipe App is designed to make cooking enjoyable and easy for everyone, from beginners to seasoned chefs. Discover a wide range of recipes, create your own, and share them with the community. With an intuitive interface and smart features, it helps you explore new dishes, organize your favorite recipes, and plan meals for any occasion.

    + +
    +
  • +

    (back to top)

    From 14fa618b4c2daff4de6845871395ac19614267c1 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Sun, 22 Dec 2024 01:30:42 +0530 Subject: [PATCH 128/167] Add the features for music --- Source-Code/MusicPlayer/index.html | 35 ++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 Source-Code/MusicPlayer/index.html diff --git a/Source-Code/MusicPlayer/index.html b/Source-Code/MusicPlayer/index.html new file mode 100644 index 0000000..1c3f58f --- /dev/null +++ b/Source-Code/MusicPlayer/index.html @@ -0,0 +1,35 @@ + + + + + + Music Player + + + +
    +

    Music Player

    +
    +

    No song playing

    + +
    + + + +
    + +
    +
    +

    Your Playlist

    +
      +
      +
      +

      Add Your Songs

      + + +
      +
      + + + + \ No newline at end of file From 5d00a75af34331d8f36fb64a83645d9fe1c74a01 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Sun, 22 Dec 2024 01:31:16 +0530 Subject: [PATCH 129/167] Add the styles for music player --- Source-Code/MusicPlayer/style.css | 86 +++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 Source-Code/MusicPlayer/style.css diff --git a/Source-Code/MusicPlayer/style.css b/Source-Code/MusicPlayer/style.css new file mode 100644 index 0000000..9cc2090 --- /dev/null +++ b/Source-Code/MusicPlayer/style.css @@ -0,0 +1,86 @@ +/* styles.css */ +body { + font-family: Arial, sans-serif; + background-color: #1e1e2f; + color: #fff; + display: flex; + justify-content: center; + align-items: center; + height: 100vh; + margin: 0; +} + +.music-player { + text-align: center; + background: #29293d; + padding: 20px; + border-radius: 10px; + box-shadow: 0 4px 10px rgba(0, 0, 0, 0.5); + width: 300px; +} + +.player h2 { + font-size: 18px; + margin-bottom: 20px; +} + +.controls { + display: flex; + justify-content: center; + gap: 15px; + margin-bottom: 15px; +} + +.controls button { + background: #3b3b57; + color: white; + border: none; + padding: 10px 15px; + border-radius: 5px; + cursor: pointer; + font-size: 16px; +} + +.add-song button { + background: #3b3b57; + color: white; + border: none; + padding: 10px; + margin-top: 10px; + border-radius: 5px; + cursor: pointer; +} + +.controls button:hover { + background: #50506b; +} + +#volume { + width: 100%; +} + +.song-list ul { + list-style: none; + padding: 0; + margin: 0; +} + +.song-list li { + background: #3b3b57; + padding: 10px; + margin: 5px 0; + border-radius: 5px; + cursor: pointer; +} + +.song-list li:hover { + background: #50506b; +} + +.add-song input { + margin-top: 10px; +} + +.add-song button:hover { + background: #50506b; +} From 295698abfff913511c40a60765ce095a3d89a66c Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Sun, 22 Dec 2024 01:31:43 +0530 Subject: [PATCH 130/167] Add the functiaonality of the feature --- Source-Code/MusicPlayer/script.js | 95 +++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 Source-Code/MusicPlayer/script.js diff --git a/Source-Code/MusicPlayer/script.js b/Source-Code/MusicPlayer/script.js new file mode 100644 index 0000000..980df0e --- /dev/null +++ b/Source-Code/MusicPlayer/script.js @@ -0,0 +1,95 @@ +// script.js + +const audio = document.getElementById('audio'); +const songTitle = document.getElementById('song-title'); +const playButton = document.getElementById('play'); +const nextButton = document.getElementById('next'); +const prevButton = document.getElementById('prev'); +const volumeControl = document.getElementById('volume'); +const playlist = document.getElementById('playlist'); +const fileInput = document.getElementById('file-input'); +const addSongButton = document.getElementById('add-song-btn'); + +const songs = []; +let currentSongIndex = 0; + +// Load song by index +const loadSong = (index) => { + const song = songs[index]; + audio.src = song.src; + songTitle.textContent = song.title; +}; + +// Play/Pause functionality +const togglePlay = () => { + if (audio.paused) { + audio.play(); + playButton.textContent = '⏸️'; + } else { + audio.pause(); + playButton.textContent = '▶️'; + } +}; + +// Next song +const nextSong = () => { + currentSongIndex = (currentSongIndex + 1) % songs.length; + loadSong(currentSongIndex); + audio.play(); + playButton.textContent = '⏸️'; +}; + +// Previous song +const prevSong = () => { + currentSongIndex = (currentSongIndex - 1 + songs.length) % songs.length; + loadSong(currentSongIndex); + audio.play(); + playButton.textContent = '⏸️'; +}; + +// Volume control +const changeVolume = () => { + audio.volume = volumeControl.value; +}; + +// Update playlist display +const updatePlaylist = () => { + playlist.innerHTML = ''; + songs.forEach((song, index) => { + const li = document.createElement('li'); + li.textContent = song.title; + li.addEventListener('click', () => { + currentSongIndex = index; + loadSong(currentSongIndex); + audio.play(); + playButton.textContent = '⏸️'; + }); + playlist.appendChild(li); + }); +}; +// Add a song to the playlist +function addSong(file) { + const song = { + title: file.name, + src: URL.createObjectURL(file), + }; + songs.push(song); + updatePlaylist(); +} + +// Event listeners +playButton.addEventListener('click', togglePlay); +nextButton.addEventListener('click', nextSong); +prevButton.addEventListener('click', prevSong); +volumeControl.addEventListener('input', changeVolume); + +addSongButton.addEventListener('click', () => { + const file = fileInput.files[0]; + if (file) { + addSong(file); + fileInput.value = ''; // Reset file input + } +}); + +// Initialize player with no songs +songTitle.textContent = 'No song playing'; From cf5d744c0fa82dfc2c593cf12c43c247fbcfe2ac Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Sun, 22 Dec 2024 01:31:58 +0530 Subject: [PATCH 131/167] Update the readme file --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index f34710e..72f2cb3 100644 --- a/README.md +++ b/README.md @@ -441,6 +441,17 @@ In order to run this project you need: +
    • +
      +Music Player +

      A simple, user-friendly Music Player built using HTML, CSS, and JavaScript. This app allows users to upload and manage their favorite songs dynamically, creating a personalized playlist.

      + +
      +
    • +

      (back to top)

      From d9cb1e261e690f0c95b0982d47c4b424f55c28aa Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Sun, 22 Dec 2024 02:09:06 +0530 Subject: [PATCH 132/167] Add the project --- Source-Code/QuizApp/index.html | 35 +++++++++++ Source-Code/QuizApp/script.js | 107 +++++++++++++++++++++++++++++++++ Source-Code/QuizApp/style.css | 85 ++++++++++++++++++++++++++ 3 files changed, 227 insertions(+) create mode 100644 Source-Code/QuizApp/index.html create mode 100644 Source-Code/QuizApp/script.js create mode 100644 Source-Code/QuizApp/style.css diff --git a/Source-Code/QuizApp/index.html b/Source-Code/QuizApp/index.html new file mode 100644 index 0000000..437eb41 --- /dev/null +++ b/Source-Code/QuizApp/index.html @@ -0,0 +1,35 @@ + + + + + + Quiz App + + + +
      +

      Quiz App

      +
      +
      +

      Loading question...

      +
      +
      + + + + +
      +
      + +
      +
      + +
      + + + + diff --git a/Source-Code/QuizApp/script.js b/Source-Code/QuizApp/script.js new file mode 100644 index 0000000..6a5b71a --- /dev/null +++ b/Source-Code/QuizApp/script.js @@ -0,0 +1,107 @@ +const questions = [ + { + question: 'What is the capital of France?', + answers: ['Berlin', 'Madrid', 'Paris', 'Rome'], + correct: 2, + }, + { + question: 'Which planet is known as the Red Planet?', + answers: ['Earth', 'Mars', 'Jupiter', 'Saturn'], + correct: 1, + }, + { + question: 'What is the largest ocean on Earth?', + answers: ['Atlantic', 'Indian', 'Arctic', 'Pacific'], + correct: 3, + }, + { + question: "Who wrote 'Romeo and Juliet'?", + answers: ['Shakespeare', 'Dickens', 'Hemingway', 'Austen'], + correct: 0, + }, +]; + +let currentQuestionIndex = 0; +let score = 0; + +const questionElement = document.getElementById('question'); +const answerButtons = document.querySelectorAll('.answer-btn'); +const nextButton = document.getElementById('next-btn'); +const resultContainer = document.getElementById('result-container'); +const restartButton = document.getElementById('restart-btn'); +const scoreElement = document.getElementById('score'); + +// Load question and answers +const loadQuestion = () => { + const currentQuestion = questions[currentQuestionIndex]; + questionElement.textContent = currentQuestion.question; + + answerButtons.forEach((button, index) => { + button.textContent = currentQuestion.answers[index]; + button.disabled = false; + button.style.backgroundColor = '#4CAF50'; // Reset button color + }); + + nextButton.disabled = true; // Disable next button until an answer is selected +}; + +// Handle answer selection +const handleAnswerClick = (index) => { + const currentQuestion = questions[currentQuestionIndex]; + + if (index === currentQuestion.correct) { + score += 1; + } + + // Disable all buttons after an answer is selected + answerButtons.forEach((button, i) => { + button.disabled = true; + if (i === currentQuestion.correct) { + button.style.backgroundColor = '#4CAF50'; // Correct answer + } else { + button.style.backgroundColor = '#f44336'; // Incorrect answers + } + }); + + nextButton.disabled = false; // Enable next button +}; + +// Show quiz result +const showResult = () => { + document.getElementById('quiz-box').classList.add('hidden'); + resultContainer.classList.remove('hidden'); + scoreElement.textContent = `You scored ${score} out of ${questions.length}`; +}; + +// Move to next question +const nextQuestion = () => { + currentQuestionIndex += 1; + if (currentQuestionIndex < questions.length) { + loadQuestion(); + } else { + showResult(); + } +}; + +// Restart the quiz +const restartQuiz = () => { + currentQuestionIndex = 0; + score = 0; + resultContainer.classList.add('hidden'); + document.getElementById('quiz-box').classList.remove('hidden'); + loadQuestion(); +}; + +// Add event listeners to answer buttons +answerButtons.forEach((button, index) => { + button.addEventListener('click', () => handleAnswerClick(index)); +}); + +// Add event listener to next button +nextButton.addEventListener('click', nextQuestion); + +// Add event listener to restart button +restartButton.addEventListener('click', restartQuiz); + +// Start the quiz +loadQuestion(); diff --git a/Source-Code/QuizApp/style.css b/Source-Code/QuizApp/style.css new file mode 100644 index 0000000..e492d30 --- /dev/null +++ b/Source-Code/QuizApp/style.css @@ -0,0 +1,85 @@ +/* styles.css */ +body { + font-family: Arial, sans-serif; + background-color: #f4f4f9; + display: flex; + justify-content: center; + align-items: center; + height: 100vh; + margin: 0; + } + + .quiz-container { + background: #fff; + border-radius: 8px; + padding: 20px; + width: 300px; + box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1); + } + + h1 { + text-align: center; + color: #333; + } + + #question-container { + margin-bottom: 20px; + } + + #answer-container { + margin-bottom: 20px; + } + + .answer-btn { + background-color: #4CAF50; + color: white; + padding: 10px; + width: 100%; + margin: 5px 0; + border: none; + border-radius: 5px; + cursor: pointer; + transition: background-color 0.3s; + } + + .answer-btn:hover { + background-color: #45a049; + } + + #next-btn { + background-color: #008CBA; + color: white; + padding: 10px; + width: 100%; + border: none; + border-radius: 5px; + cursor: pointer; + font-size: 16px; + } + + #next-btn:disabled { + background-color: #ccc; + } + + .hidden { + display: none; + } + + #result-container { + text-align: center; + } + + #restart-btn { + background-color: #f44336; + color: white; + padding: 10px; + border: none; + border-radius: 5px; + cursor: pointer; + width: 100%; + } + + #restart-btn:hover { + background-color: #d32f2f; + } + \ No newline at end of file From 9ade7a4bf0d8265bc5d45388ad51781c1a519df1 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Sun, 22 Dec 2024 02:11:39 +0530 Subject: [PATCH 133/167] update the readme --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 72f2cb3..76da17e 100644 --- a/README.md +++ b/README.md @@ -452,6 +452,17 @@ In order to run this project you need: +
    • +
      +Quiz App +

      A simple quiz app built using HTML, CSS, and JavaScript. The app presents multiple-choice questions, and the user can select answers to test their knowledge. At the end of the quiz, the user's score is displayed along with an option to restart the quiz.

      + +
      +
    • +

      (back to top)

      From 17e6d58018ce3dbe4fdf150c36a02e37af95b108 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Sun, 22 Dec 2024 02:15:15 +0530 Subject: [PATCH 134/167] solve linter errors --- Source-Code/QuizApp/style.css | 165 +++++++++++++++++----------------- 1 file changed, 82 insertions(+), 83 deletions(-) diff --git a/Source-Code/QuizApp/style.css b/Source-Code/QuizApp/style.css index e492d30..391b56c 100644 --- a/Source-Code/QuizApp/style.css +++ b/Source-Code/QuizApp/style.css @@ -1,85 +1,84 @@ /* styles.css */ body { - font-family: Arial, sans-serif; - background-color: #f4f4f9; - display: flex; - justify-content: center; - align-items: center; - height: 100vh; - margin: 0; - } - - .quiz-container { - background: #fff; - border-radius: 8px; - padding: 20px; - width: 300px; - box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1); - } - - h1 { - text-align: center; - color: #333; - } - - #question-container { - margin-bottom: 20px; - } - - #answer-container { - margin-bottom: 20px; - } - - .answer-btn { - background-color: #4CAF50; - color: white; - padding: 10px; - width: 100%; - margin: 5px 0; - border: none; - border-radius: 5px; - cursor: pointer; - transition: background-color 0.3s; - } - - .answer-btn:hover { - background-color: #45a049; - } - - #next-btn { - background-color: #008CBA; - color: white; - padding: 10px; - width: 100%; - border: none; - border-radius: 5px; - cursor: pointer; - font-size: 16px; - } - - #next-btn:disabled { - background-color: #ccc; - } - - .hidden { - display: none; - } - - #result-container { - text-align: center; - } - - #restart-btn { - background-color: #f44336; - color: white; - padding: 10px; - border: none; - border-radius: 5px; - cursor: pointer; - width: 100%; - } - - #restart-btn:hover { - background-color: #d32f2f; - } - \ No newline at end of file + font-family: Arial, sans-serif; + background-color: #f4f4f9; + display: flex; + justify-content: center; + align-items: center; + height: 100vh; + margin: 0; +} + +.quiz-container { + background: #fff; + border-radius: 8px; + padding: 20px; + width: 300px; + box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1); +} + +h1 { + text-align: center; + color: #333; +} + +#question-container { + margin-bottom: 20px; +} + +#answer-container { + margin-bottom: 20px; +} + +.answer-btn { + background-color: #4caf50; + color: white; + padding: 10px; + width: 100%; + margin: 5px 0; + border: none; + border-radius: 5px; + cursor: pointer; + transition: background-color 0.3s; +} + +.answer-btn:hover { + background-color: #45a049; +} + +#next-btn { + background-color: #008cba; + color: white; + padding: 10px; + width: 100%; + border: none; + border-radius: 5px; + cursor: pointer; + font-size: 16px; +} + +#next-btn:disabled { + background-color: #ccc; +} + +.hidden { + display: none; +} + +#result-container { + text-align: center; +} + +#restart-btn { + background-color: #f44336; + color: white; + padding: 10px; + border: none; + border-radius: 5px; + cursor: pointer; + width: 100%; +} + +#restart-btn:hover { + background-color: #d32f2f; +} From 4c14e71e61f78a808aee1261badff779aa690e93 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Sun, 22 Dec 2024 02:27:59 +0530 Subject: [PATCH 135/167] Add the project --- Source-Code/MemeGenerator/index.html | 24 +++++++++++++ Source-Code/MemeGenerator/script.js | 47 +++++++++++++++++++++++++ Source-Code/MemeGenerator/style.css | 52 ++++++++++++++++++++++++++++ 3 files changed, 123 insertions(+) create mode 100644 Source-Code/MemeGenerator/index.html create mode 100644 Source-Code/MemeGenerator/script.js create mode 100644 Source-Code/MemeGenerator/style.css diff --git a/Source-Code/MemeGenerator/index.html b/Source-Code/MemeGenerator/index.html new file mode 100644 index 0000000..241acb9 --- /dev/null +++ b/Source-Code/MemeGenerator/index.html @@ -0,0 +1,24 @@ + + + + + + Meme Generator + + + +
      +

      Random Meme Generator

      +
      + Random Meme +
      +
      + + + +
      +
      + + + + diff --git a/Source-Code/MemeGenerator/script.js b/Source-Code/MemeGenerator/script.js new file mode 100644 index 0000000..b505ede --- /dev/null +++ b/Source-Code/MemeGenerator/script.js @@ -0,0 +1,47 @@ +const memeImage = document.getElementById('meme-image'); +const newMemeButton = document.getElementById('new-meme'); +const downloadMemeButton = document.getElementById('download-meme'); +const shareMemeButton = document.getElementById('share-meme'); + +// Fetch random meme from the API +async function fetchMeme() { + try { + const response = await fetch('https://api.imgflip.com/get_memes'); + const data = await response.json(); + const { memes } = data.data; + const randomMeme = memes[Math.floor(Math.random() * memes.length)]; + memeImage.src = randomMeme.url; + } catch (error) { + console.error('Error fetching meme:', error); + } +} + +// Download the meme +const downloadMeme = () => { + const memeUrl = memeImage.src; + if (memeUrl) { + const a = document.createElement('a'); + a.href = memeUrl; + a.download = 'meme.jpg'; + a.click(); + } +}; + +// Share the meme +const shareMeme = () => { + const memeUrl = memeImage.src; + if (memeUrl) { + const shareUrl = `https://twitter.com/intent/tweet?url=${encodeURIComponent( + memeUrl, + )}`; + window.open(shareUrl, '_blank'); + } +}; + +// Event listeners +newMemeButton.addEventListener('click', fetchMeme); +downloadMemeButton.addEventListener('click', downloadMeme); +shareMemeButton.addEventListener('click', shareMeme); + +// Load an initial meme on page load +fetchMeme(); diff --git a/Source-Code/MemeGenerator/style.css b/Source-Code/MemeGenerator/style.css new file mode 100644 index 0000000..99a578d --- /dev/null +++ b/Source-Code/MemeGenerator/style.css @@ -0,0 +1,52 @@ +/* styles.css */ +body { + font-family: Arial, sans-serif; + background-color: #f1f1f1; + display: flex; + justify-content: center; + align-items: center; + height: 100vh; + margin: 0; + } + + .meme-container { + text-align: center; + background-color: #fff; + padding: 20px; + border-radius: 8px; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); + width: 80%; + max-width: 500px; + } + + h1 { + color: #333; + } + + #meme-box img { + width: 100%; + height: auto; + border-radius: 8px; + margin: 20px 0; + } + + #meme-buttons button { + background-color: #4CAF50; + color: white; + padding: 10px 20px; + margin: 10px; + border: none; + border-radius: 5px; + cursor: pointer; + transition: background-color 0.3s; + } + + #meme-buttons button:hover { + background-color: #45a049; + } + + #meme-buttons button:disabled { + background-color: #ccc; + cursor: not-allowed; + } + \ No newline at end of file From 2c21a8317b3b6e285d30cf615882b6b2089d6a19 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Sun, 22 Dec 2024 02:28:25 +0530 Subject: [PATCH 136/167] solve linter error --- Source-Code/MemeGenerator/style.css | 99 ++++++++++++++--------------- 1 file changed, 49 insertions(+), 50 deletions(-) diff --git a/Source-Code/MemeGenerator/style.css b/Source-Code/MemeGenerator/style.css index 99a578d..921ae3a 100644 --- a/Source-Code/MemeGenerator/style.css +++ b/Source-Code/MemeGenerator/style.css @@ -1,52 +1,51 @@ /* styles.css */ body { - font-family: Arial, sans-serif; - background-color: #f1f1f1; - display: flex; - justify-content: center; - align-items: center; - height: 100vh; - margin: 0; - } - - .meme-container { - text-align: center; - background-color: #fff; - padding: 20px; - border-radius: 8px; - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - width: 80%; - max-width: 500px; - } - - h1 { - color: #333; - } - - #meme-box img { - width: 100%; - height: auto; - border-radius: 8px; - margin: 20px 0; - } - - #meme-buttons button { - background-color: #4CAF50; - color: white; - padding: 10px 20px; - margin: 10px; - border: none; - border-radius: 5px; - cursor: pointer; - transition: background-color 0.3s; - } - - #meme-buttons button:hover { - background-color: #45a049; - } - - #meme-buttons button:disabled { - background-color: #ccc; - cursor: not-allowed; - } - \ No newline at end of file + font-family: Arial, sans-serif; + background-color: #f1f1f1; + display: flex; + justify-content: center; + align-items: center; + height: 100vh; + margin: 0; +} + +.meme-container { + text-align: center; + background-color: #fff; + padding: 20px; + border-radius: 8px; + box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); + width: 80%; + max-width: 500px; +} + +h1 { + color: #333; +} + +#meme-box img { + width: 100%; + height: auto; + border-radius: 8px; + margin: 20px 0; +} + +#meme-buttons button { + background-color: #4caf50; + color: white; + padding: 10px 20px; + margin: 10px; + border: none; + border-radius: 5px; + cursor: pointer; + transition: background-color 0.3s; +} + +#meme-buttons button:hover { + background-color: #45a049; +} + +#meme-buttons button:disabled { + background-color: #ccc; + cursor: not-allowed; +} From 71fd4e7b25d4b797611c56252f3b857907afb3b4 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Sun, 22 Dec 2024 02:31:18 +0530 Subject: [PATCH 137/167] update with description and demo link --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 76da17e..cda8db1 100644 --- a/README.md +++ b/README.md @@ -463,6 +463,17 @@ In order to run this project you need: +
    • +
      +Meme Generator +

      A fun and interactive Meme Generator app built using HTML, CSS, and JavaScript. This app fetches random memes from an API and displays them for the user to enjoy. It also provides options for users to download the meme or share it on social media.

      + +
      +
    • +

      (back to top)

      From 5d8ea78805b50c488c7101a1fdd9651fdb5b8207 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Sun, 22 Dec 2024 02:44:37 +0530 Subject: [PATCH 138/167] Add the project --- Source-Code/TypingSpeedTest/index.html | 25 +++++++++ Source-Code/TypingSpeedTest/script.js | 63 ++++++++++++++++++++++ Source-Code/TypingSpeedTest/style.css | 75 ++++++++++++++++++++++++++ 3 files changed, 163 insertions(+) create mode 100644 Source-Code/TypingSpeedTest/index.html create mode 100644 Source-Code/TypingSpeedTest/script.js create mode 100644 Source-Code/TypingSpeedTest/style.css diff --git a/Source-Code/TypingSpeedTest/index.html b/Source-Code/TypingSpeedTest/index.html new file mode 100644 index 0000000..ba0081c --- /dev/null +++ b/Source-Code/TypingSpeedTest/index.html @@ -0,0 +1,25 @@ + + + + + + Typing Speed Test + + + +
      +

      Typing Speed Test

      +
      +

      Click "Start" to begin!

      +
      + +
      +
      WPM: 0
      +
      Accuracy: 100%
      +
      + +
      + + + + diff --git a/Source-Code/TypingSpeedTest/script.js b/Source-Code/TypingSpeedTest/script.js new file mode 100644 index 0000000..4ff26f2 --- /dev/null +++ b/Source-Code/TypingSpeedTest/script.js @@ -0,0 +1,63 @@ +// Get the necessary elements +const startButton = document.getElementById('start-btn'); +const typedText = document.getElementById('typed-text'); +const randomText = document.getElementById('random-text'); +const wpmDisplay = document.getElementById('wpm'); +const accuracyDisplay = document.getElementById('accuracy'); + +const sampleTexts = [ + 'The quick brown fox jumps over the lazy dog.', + 'JavaScript is a versatile programming language.', + 'A journey of a thousand miles begins with a single step.', + 'To be or not to be, that is the question.', + 'Typing tests help improve typing speed and accuracy.', +]; + +let startTime; + +// Start the typing test +function startTest() { + const randomIndex = Math.floor(Math.random() * sampleTexts.length); + randomText.textContent = sampleTexts[randomIndex]; + typedText.disabled = false; + typedText.value = ''; + typedText.focus(); + startButton.disabled = true; + startTime = new Date().getTime(); + wpmDisplay.textContent = 'WPM: 0'; + accuracyDisplay.textContent = 'Accuracy: 100%'; +} + +// Calculate typing speed (WPM) and accuracy +function calculateResults() { + const typedValue = typedText.value; + const randomTextValue = randomText.textContent; + + // Calculate WPM + const timeTaken = (new Date().getTime() - startTime) / 1000; // in seconds + const wordsTyped = typedValue.split(' ').length; + const wpm = Math.round((wordsTyped / timeTaken) * 60); + + // Calculate accuracy + let correctChars = 0; + for (let i = 0; i < typedValue.length; i += 1) { + if (typedValue[i] === randomTextValue[i]) { + correctChars += 1; + } + } + const accuracy = Math.round((correctChars / typedValue.length) * 100); + + wpmDisplay.textContent = `WPM: ${wpm}`; + accuracyDisplay.textContent = `Accuracy: ${accuracy}%`; + + if (typedValue === randomTextValue) { + setTimeout(() => { + alert('Test Complete! Well done!'); + startButton.disabled = false; + }, 100); + } +} + +// Event listeners +startButton.addEventListener('click', startTest); +typedText.addEventListener('input', calculateResults); diff --git a/Source-Code/TypingSpeedTest/style.css b/Source-Code/TypingSpeedTest/style.css new file mode 100644 index 0000000..cff373b --- /dev/null +++ b/Source-Code/TypingSpeedTest/style.css @@ -0,0 +1,75 @@ +body { + font-family: Arial, sans-serif; + background-color: #f4f4f9; + display: flex; + justify-content: center; + align-items: center; + height: 100vh; + margin: 0; +} + +.container { + text-align: center; + background-color: #fff; + padding: 20px; + border-radius: 8px; + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); + width: 60%; + max-width: 600px; +} + +h1 { + color: #333; +} + +.text-display { + margin: 20px 0; + font-size: 1.2em; + line-height: 1.5em; +} + +textarea { + width: 80%; + height: 100px; + padding: 10px; + font-size: 1.2em; + margin-bottom: 20px; + border-radius: 8px; + border: 1px solid #ccc; + resize: none; + outline: none; +} + +textarea:disabled { + background-color: #f0f0f0; +} + +.results { + margin-top: 20px; +} + +#start-btn { + background-color: #4caf50; + color: white; + padding: 10px 20px; + border: none; + border-radius: 5px; + cursor: pointer; + font-size: 1.1em; + transition: background-color 0.3s; +} + +#start-btn:hover { + background-color: #45a049; +} + +#start-btn:disabled { + background-color: #ccc; + cursor: not-allowed; +} + +#wpm, +#accuracy { + font-size: 1.2em; + margin: 5px 0; +} From d37c389f8dd735cc3184f9cadaee0871a62cadd3 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Sun, 22 Dec 2024 02:49:08 +0530 Subject: [PATCH 139/167] update readme --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index cda8db1..ec6af70 100644 --- a/README.md +++ b/README.md @@ -474,6 +474,17 @@ In order to run this project you need: +
    • +
      +Typing Speed Test +

      The Typing Speed Test app is a simple web-based tool that allows users to test and improve their typing speed. The app displays a random sentence, and the user is asked to type it as quickly and accurately as possible. It calculates the typing speed in words per minute (WPM) and measures the accuracy based on the user's input.

      + +
      +
    • +

      (back to top)

      From 20d31cc7836d0536e8b57e07ccb247501eb2adfe Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 23 Dec 2024 00:44:14 +0530 Subject: [PATCH 140/167] Add the project --- Source-Code/MovieSearchApp/index.html | 20 +++++++ Source-Code/MovieSearchApp/script.js | 59 ++++++++++++++++++++ Source-Code/MovieSearchApp/style.css | 78 +++++++++++++++++++++++++++ 3 files changed, 157 insertions(+) create mode 100644 Source-Code/MovieSearchApp/index.html create mode 100644 Source-Code/MovieSearchApp/script.js create mode 100644 Source-Code/MovieSearchApp/style.css diff --git a/Source-Code/MovieSearchApp/index.html b/Source-Code/MovieSearchApp/index.html new file mode 100644 index 0000000..6434f2c --- /dev/null +++ b/Source-Code/MovieSearchApp/index.html @@ -0,0 +1,20 @@ + + + + + + Movie Search App + + + +
      +

      Movie Search App

      +
      + + +
      +
      +
      + + + diff --git a/Source-Code/MovieSearchApp/script.js b/Source-Code/MovieSearchApp/script.js new file mode 100644 index 0000000..860da01 --- /dev/null +++ b/Source-Code/MovieSearchApp/script.js @@ -0,0 +1,59 @@ +const searchBtn = document.getElementById('search-btn'); +const searchInput = document.getElementById('search'); +const movieContainer = document.getElementById('movie-container'); + +// API Details +const API_KEY = '40bbd9b4'; // Replace with your OMDB or TMDB API key +const API_URL = `https://www.omdbapi.com/?apikey=${API_KEY}&s=`; + +// Display Movies +const displayMovies = (movies) => { + movieContainer.innerHTML = ''; // Clear previous results + + movies.forEach((movie) => { + const movieCard = document.createElement('div'); + movieCard.classList.add('movie-card'); + + movieCard.innerHTML = ` + ${movie.Title} +

      ${movie.Title}

      +

      Year: ${movie.Year}

      + `; + + movieContainer.appendChild(movieCard); + }); +}; + +// Show Error Message +const showError = (message) => { + movieContainer.innerHTML = `

      ${message}

      `; +}; + +// Fetch Movies +async function fetchMovies(query) { + try { + const response = await fetch(`${API_URL}${query}`); + const data = await response.json(); + + if (data.Response === 'True') { + displayMovies(data.Search); + } else { + showError(data.Error); + } + } catch (error) { + console.error('Error fetching data:', error); + showError('Unable to fetch data. Please try again later.'); + } +} + +// Event Listener +searchBtn.addEventListener('click', () => { + const query = searchInput.value.trim(); + if (query) { + fetchMovies(query); + } else { + showError('Please enter a movie name.'); + } +}); diff --git a/Source-Code/MovieSearchApp/style.css b/Source-Code/MovieSearchApp/style.css new file mode 100644 index 0000000..2c8a42c --- /dev/null +++ b/Source-Code/MovieSearchApp/style.css @@ -0,0 +1,78 @@ +body { + font-family: Arial, sans-serif; + margin: 0; + padding: 0; + background-color: #f4f4f4; + text-align: center; +} + +.container { + padding: 20px; +} + +h1 { + color: #333; +} + +.search-container { + margin: 20px 0; +} + +#search { + padding: 10px; + width: 300px; + border: 1px solid #ccc; + border-radius: 4px; +} + +#search-btn { + padding: 10px 20px; + background-color: #007bff; + color: #fff; + border: none; + border-radius: 4px; + cursor: pointer; +} + +#search-btn:hover { + background-color: #0056b3; +} + +.movie-container { + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: 20px; + margin-top: 20px; +} + +.movie-card { + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); + width: 250px; + text-align: left; + overflow: hidden; +} + +.movie-card img { + width: 100%; + height: auto; +} + +.movie-card h3 { + padding: 10px; + font-size: 18px; +} + +.movie-card p { + padding: 0 10px 10px; + font-size: 14px; + color: #555; +} + +.error { + color: red; + margin-top: 20px; +} From f608698e570b217f4f679474a298474d865af7b0 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 23 Dec 2024 00:46:56 +0530 Subject: [PATCH 141/167] update the readme with the project description --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index ec6af70..ef4e7c2 100644 --- a/README.md +++ b/README.md @@ -485,6 +485,17 @@ In order to run this project you need: +
    • +
      +Movie Search App +

      The Movie Search App is a simple and responsive web application that allows users to search for movies and view their details. It utilizes a public API like OMDB to fetch and display movie information, including the title, year of release, and poster.

      + +
      +
    • +

      (back to top)

      From 7a112318132228cc8dfd290359cc2e9f84b21394 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 23 Dec 2024 01:22:16 +0530 Subject: [PATCH 142/167] Add a project --- Source-Code/PomodoroTimer/index.html | 23 ++++++++++++ Source-Code/PomodoroTimer/script.js | 54 ++++++++++++++++++++++++++++ Source-Code/PomodoroTimer/style.css | 51 ++++++++++++++++++++++++++ 3 files changed, 128 insertions(+) create mode 100644 Source-Code/PomodoroTimer/index.html create mode 100644 Source-Code/PomodoroTimer/script.js create mode 100644 Source-Code/PomodoroTimer/style.css diff --git a/Source-Code/PomodoroTimer/index.html b/Source-Code/PomodoroTimer/index.html new file mode 100644 index 0000000..e228a97 --- /dev/null +++ b/Source-Code/PomodoroTimer/index.html @@ -0,0 +1,23 @@ + + + + + + Productivity Timer + + + +
      +

      Productivity Timer

      +
      + 25:00 +
      +
      + + +
      +

      Focus Session

      +
      + + + diff --git a/Source-Code/PomodoroTimer/script.js b/Source-Code/PomodoroTimer/script.js new file mode 100644 index 0000000..cf456e9 --- /dev/null +++ b/Source-Code/PomodoroTimer/script.js @@ -0,0 +1,54 @@ +const startBtn = document.getElementById('start-btn'); +const resetBtn = document.getElementById('reset-btn'); +const minutesDisplay = document.getElementById('minutes'); +const secondsDisplay = document.getElementById('seconds'); +const statusDisplay = document.getElementById('status'); + +let timerInterval; +let isFocusSession = true; // Start with a focus session +const focusTime = 5 * 60; // 5 minutes in seconds +const breakTime = 5 * 60; // 5 minutes in seconds +let timeRemaining = focusTime; + +function updateDisplay() { + const minutes = Math.floor(timeRemaining / 60); + const seconds = timeRemaining % 60; + minutesDisplay.textContent = String(minutes).padStart(2, '0'); + secondsDisplay.textContent = String(seconds).padStart(2, '0'); +} + +function toggleSession() { + isFocusSession = !isFocusSession; + timeRemaining = isFocusSession ? focusTime : breakTime; + statusDisplay.textContent = isFocusSession + ? 'Focus Session' + : 'Break Session'; + updateDisplay(); +} + +function startTimer() { + if (timerInterval) return; // Prevent multiple intervals + timerInterval = setInterval(() => { + if (timeRemaining > 0) { + timeRemaining -= 1; + updateDisplay(); + } else { + clearInterval(timerInterval); + timerInterval = null; + toggleSession(); + } + }, 1000); +} + +function resetTimer() { + clearInterval(timerInterval); + timerInterval = null; + timeRemaining = isFocusSession ? focusTime : breakTime; + updateDisplay(); +} + +startBtn.addEventListener('click', startTimer); +resetBtn.addEventListener('click', resetTimer); + +// Initialize display +updateDisplay(); diff --git a/Source-Code/PomodoroTimer/style.css b/Source-Code/PomodoroTimer/style.css new file mode 100644 index 0000000..0d2d44d --- /dev/null +++ b/Source-Code/PomodoroTimer/style.css @@ -0,0 +1,51 @@ +body { + font-family: Arial, sans-serif; + background-color: #f0f4f8; + color: #333; + text-align: center; + margin: 0; + padding: 0; +} + +.container { + max-width: 400px; + margin: 100px auto; + padding: 20px; + background: #fff; + border-radius: 10px; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); +} + +h1 { + margin-bottom: 20px; +} + +.timer-display { + font-size: 3rem; + margin: 20px 0; +} + +.controls button { + font-size: 1rem; + padding: 10px 20px; + margin: 5px; + border: none; + border-radius: 5px; + cursor: pointer; +} + +#start-btn { + background-color: #28a745; + color: white; +} + +#reset-btn { + background-color: #dc3545; + color: white; +} + +#status { + font-size: 1.2rem; + margin-top: 20px; + color: #555; +} From 2cbdfd162f3d08d735aaef9d2c57567cb18eeafa Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 23 Dec 2024 01:25:44 +0530 Subject: [PATCH 143/167] Update the raedme with the description --- README.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/README.md b/README.md index ef4e7c2..2f103ce 100644 --- a/README.md +++ b/README.md @@ -496,6 +496,19 @@ In order to run this project you need: +
    • +
      +Pomodoro Timer +

      The Productivity Timer (Pomodoro Timer) is a simple yet effective timer application based on the Pomodoro technique. It helps users stay productive by alternating between focus intervals (e.g., 5 minutes) and short breaks (e.g., 2 minutes). The app provides visual cues through animations and sound alerts to signal transitions between focus and break periods. + +

      + +
      +
    • +

      (back to top)

      From 58eb81c2bc5646d93fdf7fec1eefa922eebe093b Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 23 Dec 2024 01:29:15 +0530 Subject: [PATCH 144/167] followed es6 --- Source-Code/PomodoroTimer/script.js | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Source-Code/PomodoroTimer/script.js b/Source-Code/PomodoroTimer/script.js index cf456e9..c7295e1 100644 --- a/Source-Code/PomodoroTimer/script.js +++ b/Source-Code/PomodoroTimer/script.js @@ -10,23 +10,23 @@ const focusTime = 5 * 60; // 5 minutes in seconds const breakTime = 5 * 60; // 5 minutes in seconds let timeRemaining = focusTime; -function updateDisplay() { +const updateDisplay = () => { const minutes = Math.floor(timeRemaining / 60); const seconds = timeRemaining % 60; minutesDisplay.textContent = String(minutes).padStart(2, '0'); secondsDisplay.textContent = String(seconds).padStart(2, '0'); -} +}; -function toggleSession() { +const toggleSession = () => { isFocusSession = !isFocusSession; timeRemaining = isFocusSession ? focusTime : breakTime; statusDisplay.textContent = isFocusSession ? 'Focus Session' : 'Break Session'; updateDisplay(); -} +}; -function startTimer() { +const startTimer = () => { if (timerInterval) return; // Prevent multiple intervals timerInterval = setInterval(() => { if (timeRemaining > 0) { @@ -38,14 +38,14 @@ function startTimer() { toggleSession(); } }, 1000); -} +}; -function resetTimer() { +const resetTimer = () => { clearInterval(timerInterval); timerInterval = null; timeRemaining = isFocusSession ? focusTime : breakTime; updateDisplay(); -} +}; startBtn.addEventListener('click', startTimer); resetBtn.addEventListener('click', resetTimer); From 29df4477e67b52ee8825b40f63d299199a7efaf4 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 23 Dec 2024 01:54:15 +0530 Subject: [PATCH 145/167] create a template for the project --- Source-Code/E-CommerceWebsite/index.html | 0 Source-Code/E-CommerceWebsite/script.js | 0 Source-Code/E-CommerceWebsite/style.css | 0 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Source-Code/E-CommerceWebsite/index.html create mode 100644 Source-Code/E-CommerceWebsite/script.js create mode 100644 Source-Code/E-CommerceWebsite/style.css diff --git a/Source-Code/E-CommerceWebsite/index.html b/Source-Code/E-CommerceWebsite/index.html new file mode 100644 index 0000000..e69de29 diff --git a/Source-Code/E-CommerceWebsite/script.js b/Source-Code/E-CommerceWebsite/script.js new file mode 100644 index 0000000..e69de29 diff --git a/Source-Code/E-CommerceWebsite/style.css b/Source-Code/E-CommerceWebsite/style.css new file mode 100644 index 0000000..e69de29 From dbe377437a1c435383017490df1aa1b9fa74b1c2 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 23 Dec 2024 02:29:58 +0530 Subject: [PATCH 146/167] Add the project --- Source-Code/E-CommerceWebsite/index.html | 33 ++++++ Source-Code/E-CommerceWebsite/script.js | 93 +++++++++++++++ Source-Code/E-CommerceWebsite/style.css | 145 +++++++++++++++++++++++ 3 files changed, 271 insertions(+) diff --git a/Source-Code/E-CommerceWebsite/index.html b/Source-Code/E-CommerceWebsite/index.html index e69de29..2f8fbc7 100644 --- a/Source-Code/E-CommerceWebsite/index.html +++ b/Source-Code/E-CommerceWebsite/index.html @@ -0,0 +1,33 @@ + + + + + + E-Commerce Product Page + + + +
      + +
      + +
      +

      Products

      +
      +
      + + +
      +
      +

      Your Cart

      +
        + +
        +
        + + + + diff --git a/Source-Code/E-CommerceWebsite/script.js b/Source-Code/E-CommerceWebsite/script.js index e69de29..7d34ddb 100644 --- a/Source-Code/E-CommerceWebsite/script.js +++ b/Source-Code/E-CommerceWebsite/script.js @@ -0,0 +1,93 @@ +/* eslint-disable no-unused-vars */ +// Fake API URL (you can replace this with a real API if needed) +const apiUrl = 'https://fakestoreapi.com/products'; + +// Elements +const productsContainer = document.getElementById('products-container'); +const cartBtn = document.getElementById('cart-btn'); +const cartModal = document.getElementById('cart-modal'); +const closeCartBtn = document.getElementById('close-cart'); +const cartItemsList = document.getElementById('cart-items'); + +// Cart array to store added products +const cart = []; + +// Display fetched products +const displayProducts = (products) => { + productsContainer.innerHTML = ''; // Clear previous products + + products.forEach((product) => { + const productElement = document.createElement('div'); + productElement.classList.add('product'); + productElement.innerHTML = ` + ${product.title} +

        ${product.title}

        +

        $${product.price}

        + + `; + productsContainer.appendChild(productElement); + }); +}; + +// Fetch products from API +async function fetchProducts() { + try { + const response = await fetch(apiUrl); + const products = await response.json(); + displayProducts(products); + } catch (error) { + console.error('Error fetching products:', error); + } +} + +// Add product to cart +const addToCart = (id, title, image, price) => { + const existingProductIndex = cart.findIndex((item) => item.id === id); + + if (existingProductIndex === -1) { + cart.push({ + id, + title, + image, + price, + quantity: 1, + }); + } else { + cart[existingProductIndex].quantity += 1; + } + + console.log(cart); // You can replace this with a cart UI or alert + alert(`${title} added to cart!`); +}; + +// Close cart modal +closeCartBtn.addEventListener('click', () => { + cartModal.style.display = 'none'; +}); + +// Display cart contents +const displayCart = () => { + cartItemsList.innerHTML = ''; // Clear previous cart items + + cart.forEach((item) => { + const cartItem = document.createElement('li'); + cartItem.innerHTML = ` + ${item.title} (x${item.quantity}) + $${item.price * item.quantity} + `; + cartItemsList.appendChild(cartItem); + }); +}; + +// Open cart modal +cartBtn.addEventListener('click', () => { + if (cart.length === 0) { + alert('Your cart is empty.'); + } else { + displayCart(); + cartModal.style.display = 'flex'; + } +}); + +// Initialize +fetchProducts(); diff --git a/Source-Code/E-CommerceWebsite/style.css b/Source-Code/E-CommerceWebsite/style.css index e69de29..ae2d61b 100644 --- a/Source-Code/E-CommerceWebsite/style.css +++ b/Source-Code/E-CommerceWebsite/style.css @@ -0,0 +1,145 @@ +body { + font-family: Arial, sans-serif; + margin: 0; + padding: 0; + background-color: #f9f9f9; + } + + header { + background-color: #333; + color: #fff; + padding: 10px 20px; + text-align: center; + } + + .navbar { + display: flex; + justify-content: space-between; + align-items: center; + } + + #cart-btn { + background-color: #28a745; + color: white; + border: none; + padding: 10px 20px; + font-size: 1rem; + cursor: pointer; + border-radius: 5px; + } + + #cart-btn:hover { + background-color: #218838; + } + + .container { + margin: 50px auto; + padding: 20px; + background: #fff; + border-radius: 10px; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); + max-width: 1000px; + } + + h1 { + margin-bottom: 30px; + } + + .products-container { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); + gap: 20px; + } + + .product { + border: 1px solid #ddd; + border-radius: 10px; + padding: 10px; + text-align: center; + background-color: #fff; + } + + .product img { + max-width: 100%; + height: 300px; + border-radius: 10px; + } + + .product .title { + font-size: 1.1rem; + font-weight: bold; + margin: 10px 0; + height: 60px; + overflow: hidden; + } + + .product .price { + font-size: 1rem; + color: #333; + margin: 10px 0; + } + + .product button { + background-color: #007bff; + color: white; + border: none; + padding: 10px; + font-size: 1rem; + cursor: pointer; + border-radius: 5px; + width: 100%; + } + + .product button:hover { + background-color: #0056b3; + } + + /* Cart Modal Styles */ + .cart-modal { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.7); + display: none; + justify-content: center; + align-items: center; + z-index: 1000; + } + + .cart-content { + background-color: white; + padding: 20px; + border-radius: 10px; + max-width: 500px; + width: 100%; + text-align: left; + } + + #cart-items { + list-style-type: none; + padding: 0; + } + + #cart-items li { + display: flex; + justify-content: space-between; + padding: 5px 0; + } + + #close-cart { + margin-top: 20px; + background-color: #dc3545; + color: white; + border: none; + padding: 10px; + font-size: 1rem; + cursor: pointer; + border-radius: 5px; + } + + #close-cart:hover { + background-color: #c82333; + } + \ No newline at end of file From 1d4bde72a1525cdccc56e2114d2058f3294e3394 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 23 Dec 2024 02:33:10 +0530 Subject: [PATCH 147/167] update the readme with the description --- README.md | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 2f103ce..3ed6348 100644 --- a/README.md +++ b/README.md @@ -499,9 +499,7 @@ In order to run this project you need:
      • Pomodoro Timer -

        The Productivity Timer (Pomodoro Timer) is a simple yet effective timer application based on the Pomodoro technique. It helps users stay productive by alternating between focus intervals (e.g., 5 minutes) and short breaks (e.g., 2 minutes). The app provides visual cues through animations and sound alerts to signal transitions between focus and break periods. - -

        +

        The Productivity Timer (Pomodoro Timer) is a simple yet effective timer application based on the Pomodoro technique. It helps users stay productive by alternating between focus intervals (e.g., 5 minutes) and short breaks (e.g., 2 minutes). The app provides visual cues through animations and sound alerts to signal transitions between focus and break periods.

        • Live Demo
        • Source
        • @@ -509,6 +507,17 @@ In order to run this project you need:
      • +
      • +
        +E-Commerce Website +

        This is a simple e-commerce product page built using **HTML**, **CSS**, and **JavaScript**. It displays a list of products fetched from a public API and allows users to add products to their cart. The page features a cart modal where users can view the products they have added, including quantity and total price.

        + +
        +
      • +

        (back to top)

        From cde2b3ba223661114cd691c7b2c2adfec471d55f Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Mon, 23 Dec 2024 02:36:56 +0530 Subject: [PATCH 148/167] solve the linter --- Source-Code/E-CommerceWebsite/style.css | 287 ++++++++++++------------ 1 file changed, 143 insertions(+), 144 deletions(-) diff --git a/Source-Code/E-CommerceWebsite/style.css b/Source-Code/E-CommerceWebsite/style.css index ae2d61b..c7c8624 100644 --- a/Source-Code/E-CommerceWebsite/style.css +++ b/Source-Code/E-CommerceWebsite/style.css @@ -1,145 +1,144 @@ body { - font-family: Arial, sans-serif; - margin: 0; - padding: 0; - background-color: #f9f9f9; - } - - header { - background-color: #333; - color: #fff; - padding: 10px 20px; - text-align: center; - } - - .navbar { - display: flex; - justify-content: space-between; - align-items: center; - } - - #cart-btn { - background-color: #28a745; - color: white; - border: none; - padding: 10px 20px; - font-size: 1rem; - cursor: pointer; - border-radius: 5px; - } - - #cart-btn:hover { - background-color: #218838; - } - - .container { - margin: 50px auto; - padding: 20px; - background: #fff; - border-radius: 10px; - box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); - max-width: 1000px; - } - - h1 { - margin-bottom: 30px; - } - - .products-container { - display: grid; - grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); - gap: 20px; - } - - .product { - border: 1px solid #ddd; - border-radius: 10px; - padding: 10px; - text-align: center; - background-color: #fff; - } - - .product img { - max-width: 100%; - height: 300px; - border-radius: 10px; - } - - .product .title { - font-size: 1.1rem; - font-weight: bold; - margin: 10px 0; - height: 60px; - overflow: hidden; - } - - .product .price { - font-size: 1rem; - color: #333; - margin: 10px 0; - } - - .product button { - background-color: #007bff; - color: white; - border: none; - padding: 10px; - font-size: 1rem; - cursor: pointer; - border-radius: 5px; - width: 100%; - } - - .product button:hover { - background-color: #0056b3; - } - - /* Cart Modal Styles */ - .cart-modal { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; - background-color: rgba(0, 0, 0, 0.7); - display: none; - justify-content: center; - align-items: center; - z-index: 1000; - } - - .cart-content { - background-color: white; - padding: 20px; - border-radius: 10px; - max-width: 500px; - width: 100%; - text-align: left; - } - - #cart-items { - list-style-type: none; - padding: 0; - } - - #cart-items li { - display: flex; - justify-content: space-between; - padding: 5px 0; - } - - #close-cart { - margin-top: 20px; - background-color: #dc3545; - color: white; - border: none; - padding: 10px; - font-size: 1rem; - cursor: pointer; - border-radius: 5px; - } - - #close-cart:hover { - background-color: #c82333; - } - \ No newline at end of file + font-family: Arial, sans-serif; + margin: 0; + padding: 0; + background-color: #f9f9f9; +} + +header { + background-color: #333; + color: #fff; + padding: 10px 20px; + text-align: center; +} + +.navbar { + display: flex; + justify-content: space-between; + align-items: center; +} + +#cart-btn { + background-color: #28a745; + color: white; + border: none; + padding: 10px 20px; + font-size: 1rem; + cursor: pointer; + border-radius: 5px; +} + +#cart-btn:hover { + background-color: #218838; +} + +.container { + margin: 50px auto; + padding: 20px; + background: #fff; + border-radius: 10px; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); + max-width: 1000px; +} + +h1 { + margin-bottom: 30px; +} + +.products-container { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); + gap: 20px; +} + +.product { + border: 1px solid #ddd; + border-radius: 10px; + padding: 10px; + text-align: center; + background-color: #fff; +} + +.product img { + max-width: 100%; + height: 300px; + border-radius: 10px; +} + +.product .title { + font-size: 1.1rem; + font-weight: bold; + margin: 10px 0; + height: 60px; + overflow: hidden; +} + +.product .price { + font-size: 1rem; + color: #333; + margin: 10px 0; +} + +.product button { + background-color: #007bff; + color: white; + border: none; + padding: 10px; + font-size: 1rem; + cursor: pointer; + border-radius: 5px; + width: 100%; +} + +.product button:hover { + background-color: #0056b3; +} + +/* Cart Modal Styles */ +.cart-modal { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(0, 0, 0, 0.7); + display: none; + justify-content: center; + align-items: center; + z-index: 1000; +} + +.cart-content { + background-color: white; + padding: 20px; + border-radius: 10px; + max-width: 500px; + width: 100%; + text-align: left; +} + +#cart-items { + list-style-type: none; + padding: 0; +} + +#cart-items li { + display: flex; + justify-content: space-between; + padding: 5px 0; +} + +#close-cart { + margin-top: 20px; + background-color: #dc3545; + color: white; + border: none; + padding: 10px; + font-size: 1rem; + cursor: pointer; + border-radius: 5px; +} + +#close-cart:hover { + background-color: #c82333; +} From efec664b91af8818aac78fe6b498195d0dc3c14a Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Wed, 25 Dec 2024 01:17:41 +0530 Subject: [PATCH 149/167] createde teh template for project --- Source-Code/LanguageTranslator/index.html | 11 +++++++++++ Source-Code/LanguageTranslator/script.js | 0 Source-Code/LanguageTranslator/style.css | 0 3 files changed, 11 insertions(+) create mode 100644 Source-Code/LanguageTranslator/index.html create mode 100644 Source-Code/LanguageTranslator/script.js create mode 100644 Source-Code/LanguageTranslator/style.css diff --git a/Source-Code/LanguageTranslator/index.html b/Source-Code/LanguageTranslator/index.html new file mode 100644 index 0000000..d01f779 --- /dev/null +++ b/Source-Code/LanguageTranslator/index.html @@ -0,0 +1,11 @@ + + + + + + Document + + + + + \ No newline at end of file diff --git a/Source-Code/LanguageTranslator/script.js b/Source-Code/LanguageTranslator/script.js new file mode 100644 index 0000000..e69de29 diff --git a/Source-Code/LanguageTranslator/style.css b/Source-Code/LanguageTranslator/style.css new file mode 100644 index 0000000..e69de29 From 0c86bbb434f584214b6f489a0d4fb9224c55d652 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Wed, 25 Dec 2024 01:31:58 +0530 Subject: [PATCH 150/167] Add a project --- Source-Code/LanguageTranslator/index.html | 81 +++++++++++++++++++++-- Source-Code/LanguageTranslator/script.js | 32 +++++++++ Source-Code/LanguageTranslator/style.css | 65 ++++++++++++++++++ 3 files changed, 173 insertions(+), 5 deletions(-) diff --git a/Source-Code/LanguageTranslator/index.html b/Source-Code/LanguageTranslator/index.html index d01f779..2359393 100644 --- a/Source-Code/LanguageTranslator/index.html +++ b/Source-Code/LanguageTranslator/index.html @@ -1,11 +1,82 @@ - - - Document + + + Language Translator App + - +
        +

        Language Translator

        +
        + +
        + + + +
        + +
        +
        + - \ No newline at end of file + diff --git a/Source-Code/LanguageTranslator/script.js b/Source-Code/LanguageTranslator/script.js index e69de29..ee14549 100644 --- a/Source-Code/LanguageTranslator/script.js +++ b/Source-Code/LanguageTranslator/script.js @@ -0,0 +1,32 @@ +const translateButton = document.getElementById('translateButton'); +const sourceText = document.getElementById('sourceText'); +const translatedText = document.getElementById('translatedText'); +const sourceLang = document.getElementById('sourceLang'); +const targetLang = document.getElementById('targetLang'); + +// Replace with your own API key +const API_URL = 'https://api.mymemory.translated.net/get'; + +translateButton.addEventListener('click', async () => { + const text = sourceText.value.trim(); + const fromLang = sourceLang.value; + const toLang = targetLang.value; + + if (!text) { + alert('Please enter text to translate.'); + return; + } + + try { + const response = await fetch( + `${API_URL}?q=${encodeURIComponent(text)}&langpair=${fromLang}|${toLang}`, + ); + const data = await response.json(); + const translated = data.responseData.translatedText; + + translatedText.value = translated; + } catch (error) { + console.error('Error fetching translation:', error); + alert('Failed to translate. Please try again later.'); + } +}); diff --git a/Source-Code/LanguageTranslator/style.css b/Source-Code/LanguageTranslator/style.css index e69de29..772a271 100644 --- a/Source-Code/LanguageTranslator/style.css +++ b/Source-Code/LanguageTranslator/style.css @@ -0,0 +1,65 @@ +body { + font-family: Arial, sans-serif; + background-color: #a4bef2; + margin: 0; + padding: 0; + display: flex; + justify-content: center; + align-items: center; + height: 100vh; + } + + .container { + text-align: center; + background: white; + padding: 20px; + border-radius: 10px; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); + min-width: 500px; + } + + h1 { + font-size: 24px; + margin-bottom: 20px; + } + + .translator { + display: flex; + flex-direction: column; + } + + textarea { + width: 90%; + height: 100px; + margin: 10px ; + padding: 10px; + border: 1px solid #ccc; + border-radius: 5px; + resize: none; + } + + .controls { + display: flex; + justify-content: space-around; + align-items: center; + } + + select { + padding: 10px; + border-radius: 5px; + border: 1px solid #ccc; + } + + button { + padding: 10px 15px; + background-color: #007bff; + color: white; + border: none; + border-radius: 5px; + cursor: pointer; + } + + button:hover { + background-color: #0056b3; + } + \ No newline at end of file From c4dc76d7e585ef27017e8bb248c25e1604cc7712 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Wed, 25 Dec 2024 01:35:12 +0530 Subject: [PATCH 151/167] update the readme with the description --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 3ed6348..cd4db08 100644 --- a/README.md +++ b/README.md @@ -518,6 +518,17 @@ In order to run this project you need: +
      • +
        +Language Translator +

        The Language Translator App is a simple and user-friendly web application that allows users to translate text between various languages. It uses the MyMemory Translation API to fetch translations.

        + +
        +
      • +

        (back to top)

        From 511b689bef7974bf195b31941204ccc2162ba39a Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Wed, 25 Dec 2024 01:38:16 +0530 Subject: [PATCH 152/167] solve linter errors --- Source-Code/LanguageTranslator/style.css | 127 +++++++++++------------ 1 file changed, 63 insertions(+), 64 deletions(-) diff --git a/Source-Code/LanguageTranslator/style.css b/Source-Code/LanguageTranslator/style.css index 772a271..1d9b219 100644 --- a/Source-Code/LanguageTranslator/style.css +++ b/Source-Code/LanguageTranslator/style.css @@ -1,65 +1,64 @@ body { - font-family: Arial, sans-serif; - background-color: #a4bef2; - margin: 0; - padding: 0; - display: flex; - justify-content: center; - align-items: center; - height: 100vh; - } - - .container { - text-align: center; - background: white; - padding: 20px; - border-radius: 10px; - box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); - min-width: 500px; - } - - h1 { - font-size: 24px; - margin-bottom: 20px; - } - - .translator { - display: flex; - flex-direction: column; - } - - textarea { - width: 90%; - height: 100px; - margin: 10px ; - padding: 10px; - border: 1px solid #ccc; - border-radius: 5px; - resize: none; - } - - .controls { - display: flex; - justify-content: space-around; - align-items: center; - } - - select { - padding: 10px; - border-radius: 5px; - border: 1px solid #ccc; - } - - button { - padding: 10px 15px; - background-color: #007bff; - color: white; - border: none; - border-radius: 5px; - cursor: pointer; - } - - button:hover { - background-color: #0056b3; - } - \ No newline at end of file + font-family: Arial, sans-serif; + background-color: #a4bef2; + margin: 0; + padding: 0; + display: flex; + justify-content: center; + align-items: center; + height: 100vh; +} + +.container { + text-align: center; + background: white; + padding: 20px; + border-radius: 10px; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); + min-width: 500px; +} + +h1 { + font-size: 24px; + margin-bottom: 20px; +} + +.translator { + display: flex; + flex-direction: column; +} + +textarea { + width: 90%; + height: 100px; + margin: 10px; + padding: 10px; + border: 1px solid #ccc; + border-radius: 5px; + resize: none; +} + +.controls { + display: flex; + justify-content: space-around; + align-items: center; +} + +select { + padding: 10px; + border-radius: 5px; + border: 1px solid #ccc; +} + +button { + padding: 10px 15px; + background-color: #007bff; + color: white; + border: none; + border-radius: 5px; + cursor: pointer; +} + +button:hover { + background-color: #0056b3; +} From f4026e82eaad31f464e54511322ae21a1fc7acb1 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Wed, 25 Dec 2024 01:51:47 +0530 Subject: [PATCH 153/167] Add the project --- Source-Code/FoodOrdering/index.html | 51 +++++++++++++++++ Source-Code/FoodOrdering/script.js | 50 ++++++++++++++++ Source-Code/FoodOrdering/style.css | 88 +++++++++++++++++++++++++++++ 3 files changed, 189 insertions(+) create mode 100644 Source-Code/FoodOrdering/index.html create mode 100644 Source-Code/FoodOrdering/script.js create mode 100644 Source-Code/FoodOrdering/style.css diff --git a/Source-Code/FoodOrdering/index.html b/Source-Code/FoodOrdering/index.html new file mode 100644 index 0000000..07813f6 --- /dev/null +++ b/Source-Code/FoodOrdering/index.html @@ -0,0 +1,51 @@ + + + + + + Food Order App + + + +
        +

        Food Order App

        + + +
        +

        Your Cart

        +
          + +
        +

        Total: $0.00

        + +
        +
        + + + + diff --git a/Source-Code/FoodOrdering/script.js b/Source-Code/FoodOrdering/script.js new file mode 100644 index 0000000..0d0ffe8 --- /dev/null +++ b/Source-Code/FoodOrdering/script.js @@ -0,0 +1,50 @@ +const addToCartButtons = document.querySelectorAll('.add-to-cart'); +const cartItemsList = document.getElementById('cart-items'); +const totalPriceElement = document.getElementById('total-price'); +const placeOrderButton = document.getElementById('place-order'); + +let cart = []; +let totalPrice = 0; + +const addToCart = (event) => { + const itemName = event.target.dataset.name; + const itemPrice = parseFloat(event.target.dataset.price); + + // Add item to cart + cart.push({ name: itemName, price: itemPrice }); + + // Update total price + totalPrice += itemPrice; + + // Add item to the cart UI + const cartItem = document.createElement('li'); + cartItem.textContent = `${itemName} - $${itemPrice.toFixed(2)}`; + cartItemsList.appendChild(cartItem); + + // Update the total price displayed + totalPriceElement.textContent = totalPrice.toFixed(2); + + // Enable the "Place Order" button + placeOrderButton.disabled = false; +}; + +addToCartButtons.forEach((button) => { + button.addEventListener('click', addToCart); +}); + +const placeOrder = () => { + if (cart.length === 0) return; + + alert('Order placed successfully!'); + cart = []; + totalPrice = 0; + + // Clear cart UI + cartItemsList.innerHTML = ''; + totalPriceElement.textContent = '0.00'; + + // Disable the "Place Order" button again + placeOrderButton.disabled = true; +}; + +placeOrderButton.addEventListener('click', placeOrder); diff --git a/Source-Code/FoodOrdering/style.css b/Source-Code/FoodOrdering/style.css new file mode 100644 index 0000000..8e1defe --- /dev/null +++ b/Source-Code/FoodOrdering/style.css @@ -0,0 +1,88 @@ +body { + font-family: Arial, sans-serif; + margin: 0; + padding: 0; + display: flex; + justify-content: center; + align-items: center; + background-color: #a5ef9d; + height: 100vh; +} + +.container { + background-color: #fff; + padding: 20px; + border-radius: 10px; + box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1); + width: 70%; + max-width: 1000px; +} + +h1 { + text-align: center; + font-size: 32px; +} + +.menu { + display: flex; + justify-content: space-around; + margin-bottom: 20px; +} + +.menu-item { + text-align: center; + width: 30%; + background-color: #f9f9f9; + padding: 10px; + border-radius: 10px; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); +} + +.menu-item img { + width: 100%; + max-height: 200px; + object-fit: cover; + border-radius: 10px; +} + +.add-to-cart { + margin-top: 10px; + padding: 10px 20px; + background-color: #28a745; + color: #fff; + border: none; + border-radius: 5px; + cursor: pointer; +} + +.add-to-cart:hover { + background-color: #218838; +} + +.cart { + margin-top: 30px; + text-align: center; +} + +.cart ul { + list-style-type: none; + padding: 0; +} + +.cart li { + margin: 10px 0; +} + +#place-order { + padding: 10px 20px; + background-color: #007bff; + color: white; + border: none; + border-radius: 5px; + cursor: pointer; +} + +#place-order:disabled { + background-color: #aaa; + cursor: not-allowed; +} From f9153725a2fafcf152441725dd3e7e7828d4030b Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Wed, 25 Dec 2024 01:54:24 +0530 Subject: [PATCH 154/167] update the readme with the description --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index cd4db08..8e353ca 100644 --- a/README.md +++ b/README.md @@ -529,6 +529,17 @@ In order to run this project you need: +
      • +
        +Food Ordering App +

        The Food Order App is a simple web application that allows users to order food items from a menu. Users can view the available items, add them to their cart, and see the total price. The app also enables users to place an order, and upon successful placement, the cart is cleared.

        + +
        +
      • +

        (back to top)

        From cd7c06f608e15e99c8e2a565c0d589f1904de454 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Wed, 25 Dec 2024 02:16:21 +0530 Subject: [PATCH 155/167] Add the project --- Source-Code/TicTacToe/index.html | 20 +++++++++ Source-Code/TicTacToe/script.js | 72 ++++++++++++++++++++++++++++++++ Source-Code/TicTacToe/style.css | 61 +++++++++++++++++++++++++++ 3 files changed, 153 insertions(+) create mode 100644 Source-Code/TicTacToe/index.html create mode 100644 Source-Code/TicTacToe/script.js create mode 100644 Source-Code/TicTacToe/style.css diff --git a/Source-Code/TicTacToe/index.html b/Source-Code/TicTacToe/index.html new file mode 100644 index 0000000..37fccff --- /dev/null +++ b/Source-Code/TicTacToe/index.html @@ -0,0 +1,20 @@ + + + + + + Tic Tac Toe + + + +
        +

        Tic Tac Toe

        +
        + +
        + +
        +
        + + + diff --git a/Source-Code/TicTacToe/script.js b/Source-Code/TicTacToe/script.js new file mode 100644 index 0000000..6f297ce --- /dev/null +++ b/Source-Code/TicTacToe/script.js @@ -0,0 +1,72 @@ +/* eslint-disable no-use-before-define */ +// Get elements +const board = document.getElementById('board'); +const restartBtn = document.getElementById('restartBtn'); +const message = document.getElementById('message'); + +let currentPlayer = 'X'; +let gameBoard = Array(9).fill(null); // 3x3 grid, initialized to null (empty) + +const winPatterns = [ + [0, 1, 2], + [3, 4, 5], + [6, 7, 8], // Rows + [0, 3, 6], + [1, 4, 7], + [2, 5, 8], // Columns + [0, 4, 8], + [2, 4, 6], // Diagonals +]; + +// Check for a winner or draw +const checkWinner = () => { + const winner = winPatterns.some(([a, b, c]) => { + if ( + gameBoard[a] + && gameBoard[a] === gameBoard[b] + && gameBoard[a] === gameBoard[c] + ) { + message.textContent = `${gameBoard[a]} wins!`; + board.style.pointerEvents = 'none'; // Disable clicks after game ends + return true; + } + return false; + }); + + if (!winner && !gameBoard.includes(null)) { + message.textContent = "It's a draw!"; + } +}; + +// Create the board cells +const createBoard = () => { + board.innerHTML = ''; // Clear any existing cells + gameBoard.forEach((cell, index) => { + const cellElement = document.createElement('div'); + cellElement.classList.add('cell'); + cellElement.textContent = cell; + cellElement.addEventListener('click', () => handleCellClick(index)); + board.appendChild(cellElement); + }); +}; + +// Handle cell click +const handleCellClick = (index) => { + if (gameBoard[index] !== null) return; // If cell is already filled, return + gameBoard[index] = currentPlayer; + currentPlayer = currentPlayer === 'X' ? 'O' : 'X'; // Switch player + createBoard(); + checkWinner(); +}; + +// Restart the game +restartBtn.addEventListener('click', () => { + gameBoard = Array(9).fill(null); // Reset the game board + currentPlayer = 'X'; // Reset to Player X + createBoard(); + message.textContent = ''; // Clear the message + board.style.pointerEvents = 'auto'; // Enable clicks again +}); + +// Initialize the game +createBoard(); diff --git a/Source-Code/TicTacToe/style.css b/Source-Code/TicTacToe/style.css new file mode 100644 index 0000000..ec93f6a --- /dev/null +++ b/Source-Code/TicTacToe/style.css @@ -0,0 +1,61 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: Arial, sans-serif; + display: flex; + justify-content: center; + align-items: center; + min-height: 100vh; + background-color: #f4f4f9; +} + +.container { + text-align: center; +} + +h1 { + margin-bottom: 20px; +} + +.board { + display: grid; + grid-template-columns: repeat(3, 100px); + grid-template-rows: repeat(3, 100px); + gap: 5px; + justify-content: center; + margin-bottom: 20px; +} + +.cell { + width: 100px; + height: 100px; + display: flex; + align-items: center; + justify-content: center; + font-size: 32px; + background-color: #fff; + border: 2px solid #333; + cursor: pointer; + transition: background-color 0.2s ease; +} + +.cell:hover { + background-color: #f0f0f0; +} + +button { + padding: 10px 20px; + font-size: 16px; + cursor: pointer; + margin-top: 10px; +} + +#message { + margin-top: 20px; + font-size: 18px; + font-weight: bold; +} From 803a7159ba11ff4d9d3be3d0a9f4afacadd5d066 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Wed, 25 Dec 2024 02:16:56 +0530 Subject: [PATCH 156/167] Update the readme file with the description --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 8e353ca..e0484ab 100644 --- a/README.md +++ b/README.md @@ -540,6 +540,17 @@ In order to run this project you need: +
      • +
        +Tic Tac Toe App +

        This is a simple Tic Tac Toe game built using HTML, CSS, and JavaScript. The game allows two players to alternate turns and try to win by getting three of their symbols (X or O) in a row, either horizontally, vertically, or diagonally. The game will automatically check for a winner or draw after each move, and players can restart the game at any time.

        + +
        +
      • +

        (back to top)

        From f43140a7b23dc8006460d7146640f0bd3c820a8a Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Thu, 26 Dec 2024 01:33:03 +0530 Subject: [PATCH 157/167] Add a project --- Source-Code/ChatApp/index.html | 20 +++++++++ Source-Code/ChatApp/script.js | 45 +++++++++++++++++++ Source-Code/ChatApp/style.css | 82 ++++++++++++++++++++++++++++++++++ 3 files changed, 147 insertions(+) create mode 100644 Source-Code/ChatApp/index.html create mode 100644 Source-Code/ChatApp/script.js create mode 100644 Source-Code/ChatApp/style.css diff --git a/Source-Code/ChatApp/index.html b/Source-Code/ChatApp/index.html new file mode 100644 index 0000000..11bd23d --- /dev/null +++ b/Source-Code/ChatApp/index.html @@ -0,0 +1,20 @@ + + + + + + Chat App + + + +
        +

        Simple Chat App

        +
        +
        + + +
        +
        + + + diff --git a/Source-Code/ChatApp/script.js b/Source-Code/ChatApp/script.js new file mode 100644 index 0000000..38bc0da --- /dev/null +++ b/Source-Code/ChatApp/script.js @@ -0,0 +1,45 @@ +const chatBox = document.getElementById('chatBox'); +const chatForm = document.getElementById('chatForm'); +const messageInput = document.getElementById('messageInput'); + +// Display a message in the chat box +const displayMessage = (message, sender) => { + const messageElement = document.createElement('div'); + messageElement.classList.add('message', sender); + messageElement.textContent = message; + chatBox.appendChild(messageElement); + chatBox.scrollTop = chatBox.scrollHeight; // Auto-scroll to the bottom +}; + +// Load messages from local storage +const loadMessages = () => { + const messages = JSON.parse(localStorage.getItem('chatMessages')) || []; + chatBox.innerHTML = ''; + messages.forEach(({ user, bot }) => { + displayMessage(user, 'user'); + displayMessage(bot, 'bot'); + }); +}; + +// Add messages to local storage +const addMessagesToStorage = (userMessage, botReply) => { + const messages = JSON.parse(localStorage.getItem('chatMessages')) || []; + messages.push({ user: userMessage, bot: botReply }); + localStorage.setItem('chatMessages', JSON.stringify(messages)); +}; + +// Handle form submission +chatForm.addEventListener('submit', (e) => { + e.preventDefault(); + const userMessage = messageInput.value.trim(); + if (userMessage) { + const botReply = userMessage; // Echo the user message + displayMessage(userMessage, 'user'); + displayMessage(botReply, 'bot'); + addMessagesToStorage(userMessage, botReply); + messageInput.value = ''; + } +}); + +// Initialize the app +loadMessages(); diff --git a/Source-Code/ChatApp/style.css b/Source-Code/ChatApp/style.css new file mode 100644 index 0000000..f05b489 --- /dev/null +++ b/Source-Code/ChatApp/style.css @@ -0,0 +1,82 @@ +body { + font-family: Arial, sans-serif; + background-color: #cbdc30; + margin: 0; + padding: 0; + display: flex; + justify-content: center; + align-items: center; + height: 100vh; +} + +.chat-container { + background-color: #fff; + border-radius: 8px; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); + width: 400px; + padding: 20px; +} + +h1 { + text-align: center; + color: #333; +} + +.chat-box { + background-color: #f9f9f9; + border: 1px solid #ddd; + border-radius: 8px; + padding: 10px; + height: 300px; + overflow-y: auto; + margin-bottom: 10px; +} + +.chat-box .message { + display: flex; + flex-direction: column; + margin: 5px 0; + padding: 10px; + border-radius: 12px 2px; + font-size: 14px; +} + +.message.user { + background-color: #cdf2f7; + color: #025f54; + float: right; + width: 50%; +} + +.message.bot { + background-color: #fbcfdd; + color: #d81b60; + float: left; + width: 50%; +} + +form { + display: flex; +} + +input[type="text"] { + flex: 1; + padding: 10px; + border: 1px solid #ddd; + border-radius: 4px; + font-size: 14px; +} + +button { + padding: 10px 20px; + border: none; + background-color: #049786; + color: white; + font-size: 14px; + border-radius: 4px; + cursor: pointer; +} + +button:hover { + background-color: #005f4b; +} From 57330869d02b0216ab0fe6c380db1c412493e715 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Thu, 26 Dec 2024 01:35:44 +0530 Subject: [PATCH 158/167] Update the raedme with description --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index e0484ab..53b244e 100644 --- a/README.md +++ b/README.md @@ -551,6 +551,17 @@ In order to run this project you need: +
      • +
        +Simple Chat App +

        This is a simple chat application that simulates a conversation where the app echoes the user's messages as a response. Messages are stored in the browser's local storage, so they persist even after the page is refreshed.

        + +
        +
      • +

        (back to top)

        From 353f0bc6ac29d67ebec371835462763e443d873d Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Thu, 26 Dec 2024 02:11:35 +0530 Subject: [PATCH 159/167] Add the project --- Source-Code/InteractivePolling/index.html | 29 ++++++++++ Source-Code/InteractivePolling/script.js | 48 ++++++++++++++++ Source-Code/InteractivePolling/style.css | 67 +++++++++++++++++++++++ 3 files changed, 144 insertions(+) create mode 100644 Source-Code/InteractivePolling/index.html create mode 100644 Source-Code/InteractivePolling/script.js create mode 100644 Source-Code/InteractivePolling/style.css diff --git a/Source-Code/InteractivePolling/index.html b/Source-Code/InteractivePolling/index.html new file mode 100644 index 0000000..2d67c99 --- /dev/null +++ b/Source-Code/InteractivePolling/index.html @@ -0,0 +1,29 @@ + + + + + + Interactive Polling App + + + +
        +

        Vote for Your Favorite Programming Language

        +
        + + + + +
        +
        +

        Results

        +
          + +
        +
        +
        + + + + + diff --git a/Source-Code/InteractivePolling/script.js b/Source-Code/InteractivePolling/script.js new file mode 100644 index 0000000..e0b4d0b --- /dev/null +++ b/Source-Code/InteractivePolling/script.js @@ -0,0 +1,48 @@ +document.addEventListener('DOMContentLoaded', () => { + const pollOptions = document.querySelectorAll('.poll-option'); + const resultsList = document.getElementById('results-list'); + + const votes = JSON.parse(localStorage.getItem('votes')) || { + Ruby: 0, + Python: 0, + Java: 0, + Javascript: 0, + }; + + // Update the results on the page + function updateResults() { + resultsList.innerHTML = ''; // Clear previous results + + const totalVotes = Object.values(votes).reduce( + (total, count) => total + count, + 0, + ); + + // Display the updated results + Object.entries(votes).forEach(([option, count]) => { + const percentage = totalVotes + ? ((count / totalVotes) * 100).toFixed(1) + : 0; + + const resultItem = document.createElement('li'); + resultItem.innerHTML = ` + ${option}: ${count} votes (${percentage}%) +
        + `; + resultsList.appendChild(resultItem); + }); + } + + // Display initial poll results + updateResults(); + + // Event listener for voting + pollOptions.forEach((option) => { + option.addEventListener('click', () => { + const selectedVote = option.getAttribute('data-vote'); + votes[selectedVote] += 1; + localStorage.setItem('votes', JSON.stringify(votes)); + updateResults(); + }); + }); +}); diff --git a/Source-Code/InteractivePolling/style.css b/Source-Code/InteractivePolling/style.css new file mode 100644 index 0000000..f85b2e4 --- /dev/null +++ b/Source-Code/InteractivePolling/style.css @@ -0,0 +1,67 @@ +body { + font-family: Arial, sans-serif; + margin: 0; + padding: 0; + display: flex; + justify-content: center; + align-items: center; + min-height: 100vh; + background-color: #f9f9f9; +} + +.poll-container { + background: #fff; + padding: 20px; + border-radius: 8px; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); + width: 100%; + max-width: 400px; + text-align: center; +} + +.poll-question { + font-size: 1.2rem; + margin-bottom: 20px; +} + +label { + display: block; + margin: 10px 0; + font-size: 1rem; +} + +button { + margin-top: 20px; + padding: 10px 20px; + background-color: #007bff; + color: #fff; + border: none; + border-radius: 4px; + cursor: pointer; +} + +button:hover { + background-color: #0056b3; +} + +.poll-results { + margin-top: 20px; + text-align: left; +} + +.poll-results ul { + list-style: none; + padding: 0; +} + +.poll-results li { + padding: 5px 0; + font-size: 1rem; +} + +.poll-results .bar { + background-color: #007bff; + height: 10px; + border-radius: 4px; + margin-top: 5px; +} From 4fb1b8e4d6ca36c843ee9a509b429148a4ef72e1 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Thu, 26 Dec 2024 02:14:31 +0530 Subject: [PATCH 160/167] Update the Readme --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index 53b244e..b5ac8c7 100644 --- a/README.md +++ b/README.md @@ -562,6 +562,17 @@ In order to run this project you need: +
      • +
        +Simple Chat App +

        This is an interactive polling app that allows users to vote on a specific question. Users can vote for their preferred options and view the results in real-time. The app tracks the votes for each option and stores them in the local storage so the votes persist even after the page is refreshed.

        + +
        +
      • +

        (back to top)

        From 01c0b8a8c18a56e866df2d68e5df94d17afaf51f Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Thu, 26 Dec 2024 02:28:52 +0530 Subject: [PATCH 161/167] Add a project --- Source-Code/DragAndDrop/index.html | 32 ++++++++++++++++ Source-Code/DragAndDrop/script.js | 54 +++++++++++++++++++++++++++ Source-Code/DragAndDrop/style.css | 60 ++++++++++++++++++++++++++++++ 3 files changed, 146 insertions(+) create mode 100644 Source-Code/DragAndDrop/index.html create mode 100644 Source-Code/DragAndDrop/script.js create mode 100644 Source-Code/DragAndDrop/style.css diff --git a/Source-Code/DragAndDrop/index.html b/Source-Code/DragAndDrop/index.html new file mode 100644 index 0000000..c49e5d6 --- /dev/null +++ b/Source-Code/DragAndDrop/index.html @@ -0,0 +1,32 @@ + + + + + + Drag and Drop App + + + +
        +
        +

        Task List 1

        +
          +
        • Task 1
        • +
        • Task 2
        • +
        • Task 3
        • +
        +
        + +
        +

        Task List 2

        +
          +
        • Task 4
        • +
        • Task 5
        • +
        • Task 6
        • +
        +
        +
        + + + + diff --git a/Source-Code/DragAndDrop/script.js b/Source-Code/DragAndDrop/script.js new file mode 100644 index 0000000..0cee99d --- /dev/null +++ b/Source-Code/DragAndDrop/script.js @@ -0,0 +1,54 @@ +// Get all the lists and list items +const lists = document.querySelectorAll('.list'); +const items = document.querySelectorAll('li'); + +// Drag start function to add the dragging class +function dragStart(e) { + e.target.classList.add('dragging'); +} + +// Drag end function to remove the dragging class +function dragEnd(e) { + e.target.classList.remove('dragging'); +} + +// Drag over function to allow dropping on the list +function dragOver(e) { + e.preventDefault(); +} + +// Drag enter function to style the list when an item is dragged over +function dragEnter(e) { + e.target.classList.add('over'); +} + +// Drag leave function to remove the styling when the item leaves the list +function dragLeave(e) { + e.target.classList.remove('over'); +} + +// Drop function to move the dragged item into the list +function drop(e) { + e.preventDefault(); + const draggedItem = document.querySelector('.dragging'); + e.target.classList.remove('over'); + + // If the target is a list, append the dragged item to it + if (e.target.classList.contains('list')) { + e.target.querySelector('ul').appendChild(draggedItem); + } +} + +// Add event listeners for dragging items +items.forEach((item) => { + item.addEventListener('dragstart', dragStart); + item.addEventListener('dragend', dragEnd); +}); + +// Add event listeners for the lists to accept dropped items +lists.forEach((list) => { + list.addEventListener('dragover', dragOver); + list.addEventListener('dragenter', dragEnter); + list.addEventListener('dragleave', dragLeave); + list.addEventListener('drop', drop); +}); diff --git a/Source-Code/DragAndDrop/style.css b/Source-Code/DragAndDrop/style.css new file mode 100644 index 0000000..b862af5 --- /dev/null +++ b/Source-Code/DragAndDrop/style.css @@ -0,0 +1,60 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: Arial, sans-serif; + display: flex; + justify-content: center; + align-items: center; + height: 100vh; + background-color: #f0f0f0; +} + +.container { + display: flex; + gap: 20px; +} + +.list { + background-color: #fff; + border-radius: 8px; + padding: 20px; + width: 200px; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1); +} + +h2 { + text-align: center; + margin-bottom: 20px; +} + +ul { + list-style-type: none; +} + +li { + padding: 10px; + margin: 5px 0; + background-color: #4caf50; + color: white; + border-radius: 4px; + cursor: grab; + transition: background-color 0.3s ease; +} + +li:hover { + background-color: #45a049; +} + +/* When dragging an item */ +li.dragging { + opacity: 0.5; +} + +.list.over { + border: 2px dashed #4caf50; + background-color: #f9f9f9; +} From 9287753e6d38fe7a97e8cc80869037540cfa079d Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Thu, 26 Dec 2024 02:30:44 +0530 Subject: [PATCH 162/167] Update readme with the description --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index b5ac8c7..b0eaa79 100644 --- a/README.md +++ b/README.md @@ -573,6 +573,17 @@ In order to run this project you need: +
      • +
        +Drag and Drop App +

        This is a simple drag-and-drop app where users can move items from one list to another. It's a basic implementation of a task manager or an image gallery where users can organize their items by dragging and dropping.

        + +
        +
      • +

        (back to top)

        From b1b3925bcbe1a9bdd4627bfae52278b455be2136 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Fri, 27 Dec 2024 01:50:17 +0530 Subject: [PATCH 163/167] create a empty file for the project --- Source-Code/AdsBlockerExtension/background.js | 0 Source-Code/AdsBlockerExtension/manifest.json | 0 Source-Code/AdsBlockerExtension/popup.html | 0 Source-Code/AdsBlockerExtension/style.css | 0 4 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 Source-Code/AdsBlockerExtension/background.js create mode 100644 Source-Code/AdsBlockerExtension/manifest.json create mode 100644 Source-Code/AdsBlockerExtension/popup.html create mode 100644 Source-Code/AdsBlockerExtension/style.css diff --git a/Source-Code/AdsBlockerExtension/background.js b/Source-Code/AdsBlockerExtension/background.js new file mode 100644 index 0000000..e69de29 diff --git a/Source-Code/AdsBlockerExtension/manifest.json b/Source-Code/AdsBlockerExtension/manifest.json new file mode 100644 index 0000000..e69de29 diff --git a/Source-Code/AdsBlockerExtension/popup.html b/Source-Code/AdsBlockerExtension/popup.html new file mode 100644 index 0000000..e69de29 diff --git a/Source-Code/AdsBlockerExtension/style.css b/Source-Code/AdsBlockerExtension/style.css new file mode 100644 index 0000000..e69de29 From 8bf1afcade09ec382e68631d824fa4c10b557f18 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Sat, 28 Dec 2024 02:17:55 +0530 Subject: [PATCH 164/167] add the feature block the ads --- Source-Code/AdsBlockerExtension/background.js | 0 Source-Code/AdsBlockerExtension/content.js | 41 ++++++++++++++++++ .../AdsBlockerExtension/icons/icon128.png | Bin 0 -> 2101 bytes .../AdsBlockerExtension/icons/icon16.png | Bin 0 -> 1066 bytes .../AdsBlockerExtension/icons/icon48.png | Bin 0 -> 1560 bytes Source-Code/AdsBlockerExtension/manifest.json | 27 ++++++++++++ Source-Code/AdsBlockerExtension/popup.css | 35 +++++++++++++++ Source-Code/AdsBlockerExtension/popup.html | 24 ++++++++++ Source-Code/AdsBlockerExtension/popup.js | 34 +++++++++++++++ Source-Code/AdsBlockerExtension/style.css | 0 10 files changed, 161 insertions(+) delete mode 100644 Source-Code/AdsBlockerExtension/background.js create mode 100644 Source-Code/AdsBlockerExtension/content.js create mode 100644 Source-Code/AdsBlockerExtension/icons/icon128.png create mode 100644 Source-Code/AdsBlockerExtension/icons/icon16.png create mode 100644 Source-Code/AdsBlockerExtension/icons/icon48.png create mode 100644 Source-Code/AdsBlockerExtension/popup.css create mode 100644 Source-Code/AdsBlockerExtension/popup.js delete mode 100644 Source-Code/AdsBlockerExtension/style.css diff --git a/Source-Code/AdsBlockerExtension/background.js b/Source-Code/AdsBlockerExtension/background.js deleted file mode 100644 index e69de29..0000000 diff --git a/Source-Code/AdsBlockerExtension/content.js b/Source-Code/AdsBlockerExtension/content.js new file mode 100644 index 0000000..a40a9fd --- /dev/null +++ b/Source-Code/AdsBlockerExtension/content.js @@ -0,0 +1,41 @@ +const adSelectors = [ + 'iframe[src*="ads"]', + 'div[class*="ad"]', + 'div[id*="ad"]', + "ins.adsbygoogle", + "[data-ad]", + ".ad-banner", +]; + +// Normalize domain +const normalizeDomain = (domain) => domain.replace(/^www\./, ""); + +chrome.storage.local.get( + { adBlockerEnabled: true, whitelist: [] }, + ({ adBlockerEnabled, whitelist }) => { + if (!adBlockerEnabled) return; + + const currentSite = normalizeDomain(window.location.hostname); + const normalizedWhitelist = whitelist.map(normalizeDomain); + + if (normalizedWhitelist.includes(currentSite)) { + console.log(`Whitelist active: Ads are allowed on ${currentSite}`); + return; // Skip ad blocking + } + + // Ad blocking logic + const blockAds = () => { + adSelectors.forEach((selector) => { + const ads = document.querySelectorAll(selector); + console.log(`Found ${ads.length} ads for selector: ${selector}`); + ads.forEach((ad) => ad.remove()); + }); + }; + + blockAds(); // Initial blocking + + // Observe dynamically loaded ads + const observer = new MutationObserver(blockAds); + observer.observe(document.body, { childList: true, subtree: true }); + } +); diff --git a/Source-Code/AdsBlockerExtension/icons/icon128.png b/Source-Code/AdsBlockerExtension/icons/icon128.png new file mode 100644 index 0000000000000000000000000000000000000000..fbebcc8680e6b55762cf502443435ec007b64311 GIT binary patch literal 2101 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 literal 0 HcmV?d00001 diff --git a/Source-Code/AdsBlockerExtension/manifest.json b/Source-Code/AdsBlockerExtension/manifest.json index e69de29..3982ced 100644 --- a/Source-Code/AdsBlockerExtension/manifest.json +++ b/Source-Code/AdsBlockerExtension/manifest.json @@ -0,0 +1,27 @@ +{ + "manifest_version": 2, + "name": "Ad Blocker", + "version": "1.0", + "description": "A simple ad blocker to remove advertisements from websites.", + "permissions": ["activeTab", "storage"], + "content_scripts": [ + { + "matches": [""], + "js": ["content.js"] + } + ], + "browser_action": { + "default_popup": "popup.html", + "default_icon": { + "16": "./icons/icon16.png", + "48": "./icons/icon48.png", + "128": "./icons/icon128.png" + } + }, + "icons": { + "16": "./icons/icon16.png", + "48": "./icons/icon48.png", + "128": "./icons/icon128.png" + } + } + \ No newline at end of file diff --git a/Source-Code/AdsBlockerExtension/popup.css b/Source-Code/AdsBlockerExtension/popup.css new file mode 100644 index 0000000..fb2d8d6 --- /dev/null +++ b/Source-Code/AdsBlockerExtension/popup.css @@ -0,0 +1,35 @@ +body { + font-family: Arial, sans-serif; + margin: 10px; + width: 250px; + } + + h1 { + font-size: 1.5em; + margin-bottom: 10px; + } + + label { + display: block; + margin-bottom: 20px; + } + + input { + margin-right: 10px; + } + + ul { + list-style-type: none; + padding: 0; + } + + li { + margin: 5px 0; + display: flex; + justify-content: space-between; + } + + button { + cursor: pointer; + } + \ No newline at end of file diff --git a/Source-Code/AdsBlockerExtension/popup.html b/Source-Code/AdsBlockerExtension/popup.html index e69de29..de88f92 100644 --- a/Source-Code/AdsBlockerExtension/popup.html +++ b/Source-Code/AdsBlockerExtension/popup.html @@ -0,0 +1,24 @@ + + + + + + Ad Blocker + + + +

        Ad Blocker

        + +
        +

        Whitelist

        + + +
          +
          +

          + + + diff --git a/Source-Code/AdsBlockerExtension/popup.js b/Source-Code/AdsBlockerExtension/popup.js new file mode 100644 index 0000000..ce29ed3 --- /dev/null +++ b/Source-Code/AdsBlockerExtension/popup.js @@ -0,0 +1,34 @@ +const whitelistInput = document.getElementById("whitelist-input"); +const addToWhitelist = document.getElementById("add-to-whitelist"); +const whitelist = document.getElementById("whitelist"); +let whitelistData = JSON.parse(localStorage.getItem("whitelist")) || []; + +// Load whitelist +function loadWhitelist() { + whitelist.innerHTML = ""; + whitelistData.forEach((site) => { + const li = document.createElement("li"); + li.textContent = site; + const removeBtn = document.createElement("button"); + removeBtn.textContent = "Remove"; + removeBtn.addEventListener("click", () => { + whitelistData = whitelistData.filter((item) => item !== site); + localStorage.setItem("whitelist", JSON.stringify(whitelistData)); + loadWhitelist(); + }); + li.appendChild(removeBtn); + whitelist.appendChild(li); + }); +} + +addToWhitelist.addEventListener("click", () => { + const site = whitelistInput.value.trim(); + if (site && !whitelistData.includes(site)) { + whitelistData.push(site); + localStorage.setItem("whitelist", JSON.stringify(whitelistData)); + whitelistInput.value = ""; + loadWhitelist(); + } +}); + +loadWhitelist(); diff --git a/Source-Code/AdsBlockerExtension/style.css b/Source-Code/AdsBlockerExtension/style.css deleted file mode 100644 index e69de29..0000000 From 351e3a2289eef7f5287977e12750488dac1bca85 Mon Sep 17 00:00:00 2001 From: afreen shaik Date: Sat, 28 Dec 2024 15:36:13 +0530 Subject: [PATCH 165/167] Add and updat ethe projec with description --- README.md | 11 ++++ Source-Code/AdsBlockerExtension/content.js | 11 ++-- Source-Code/AdsBlockerExtension/popup.css | 67 +++++++++++----------- Source-Code/AdsBlockerExtension/popup.js | 26 ++++----- 4 files changed, 63 insertions(+), 52 deletions(-) diff --git a/README.md b/README.md index b0eaa79..8927f99 100644 --- a/README.md +++ b/README.md @@ -584,6 +584,17 @@ In order to run this project you need: +
        • +
          +Ads Blocker Extension +

          This is a simple Ad Blocker Extension. AdBlocker is a lightweight browser extension designed to block intrusive advertisements and enhance your browsing experience.

          + +
          +
        • +

          (back to top)

          diff --git a/Source-Code/AdsBlockerExtension/content.js b/Source-Code/AdsBlockerExtension/content.js index a40a9fd..7e719d8 100644 --- a/Source-Code/AdsBlockerExtension/content.js +++ b/Source-Code/AdsBlockerExtension/content.js @@ -1,14 +1,15 @@ +/* eslint-disable no-undef */ const adSelectors = [ 'iframe[src*="ads"]', 'div[class*="ad"]', 'div[id*="ad"]', - "ins.adsbygoogle", - "[data-ad]", - ".ad-banner", + 'ins.adsbygoogle', + '[data-ad]', + '.ad-banner', ]; // Normalize domain -const normalizeDomain = (domain) => domain.replace(/^www\./, ""); +const normalizeDomain = (domain) => domain.replace(/^www\./, ''); chrome.storage.local.get( { adBlockerEnabled: true, whitelist: [] }, @@ -37,5 +38,5 @@ chrome.storage.local.get( // Observe dynamically loaded ads const observer = new MutationObserver(blockAds); observer.observe(document.body, { childList: true, subtree: true }); - } + }, ); diff --git a/Source-Code/AdsBlockerExtension/popup.css b/Source-Code/AdsBlockerExtension/popup.css index fb2d8d6..5ba01a8 100644 --- a/Source-Code/AdsBlockerExtension/popup.css +++ b/Source-Code/AdsBlockerExtension/popup.css @@ -1,35 +1,34 @@ body { - font-family: Arial, sans-serif; - margin: 10px; - width: 250px; - } - - h1 { - font-size: 1.5em; - margin-bottom: 10px; - } - - label { - display: block; - margin-bottom: 20px; - } - - input { - margin-right: 10px; - } - - ul { - list-style-type: none; - padding: 0; - } - - li { - margin: 5px 0; - display: flex; - justify-content: space-between; - } - - button { - cursor: pointer; - } - \ No newline at end of file + font-family: Arial, sans-serif; + margin: 10px; + width: 250px; +} + +h1 { + font-size: 1.5em; + margin-bottom: 10px; +} + +label { + display: block; + margin-bottom: 20px; +} + +input { + margin-right: 10px; +} + +ul { + list-style-type: none; + padding: 0; +} + +li { + margin: 5px 0; + display: flex; + justify-content: space-between; +} + +button { + cursor: pointer; +} diff --git a/Source-Code/AdsBlockerExtension/popup.js b/Source-Code/AdsBlockerExtension/popup.js index ce29ed3..2a544a6 100644 --- a/Source-Code/AdsBlockerExtension/popup.js +++ b/Source-Code/AdsBlockerExtension/popup.js @@ -1,19 +1,19 @@ -const whitelistInput = document.getElementById("whitelist-input"); -const addToWhitelist = document.getElementById("add-to-whitelist"); -const whitelist = document.getElementById("whitelist"); -let whitelistData = JSON.parse(localStorage.getItem("whitelist")) || []; +const whitelistInput = document.getElementById('whitelist-input'); +const addToWhitelist = document.getElementById('add-to-whitelist'); +const whitelist = document.getElementById('whitelist'); +let whitelistData = JSON.parse(localStorage.getItem('whitelist')) || []; // Load whitelist function loadWhitelist() { - whitelist.innerHTML = ""; + whitelist.innerHTML = ''; whitelistData.forEach((site) => { - const li = document.createElement("li"); + const li = document.createElement('li'); li.textContent = site; - const removeBtn = document.createElement("button"); - removeBtn.textContent = "Remove"; - removeBtn.addEventListener("click", () => { + const removeBtn = document.createElement('button'); + removeBtn.textContent = 'Remove'; + removeBtn.addEventListener('click', () => { whitelistData = whitelistData.filter((item) => item !== site); - localStorage.setItem("whitelist", JSON.stringify(whitelistData)); + localStorage.setItem('whitelist', JSON.stringify(whitelistData)); loadWhitelist(); }); li.appendChild(removeBtn); @@ -21,12 +21,12 @@ function loadWhitelist() { }); } -addToWhitelist.addEventListener("click", () => { +addToWhitelist.addEventListener('click', () => { const site = whitelistInput.value.trim(); if (site && !whitelistData.includes(site)) { whitelistData.push(site); - localStorage.setItem("whitelist", JSON.stringify(whitelistData)); - whitelistInput.value = ""; + localStorage.setItem('whitelist', JSON.stringify(whitelistData)); + whitelistInput.value = ''; loadWhitelist(); } }); From f7d378a61b5d29add0c2f22888156f8034a10c2c Mon Sep 17 00:00:00 2001 From: Tajul Afreen <119053190+tajulafreen@users.noreply.github.com> Date: Sat, 28 Dec 2024 15:58:12 +0530 Subject: [PATCH 166/167] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8927f99..6f6364f 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ In order to run this project you need:
        • Open the index.html file in your preferred web browser.
        • -

          Feel free to explore, modify, and experiment with the code to better understand how these animations and transitions are achieved.

          +

          Feel free to explore, modify, and experiment with the code to better understand.

          (back to top)

          From 84b49f65ba8fc962adc6d0fb0c33af8ab85823aa Mon Sep 17 00:00:00 2001 From: Tajul Afreen <119053190+tajulafreen@users.noreply.github.com> Date: Fri, 28 Mar 2025 16:54:56 +0530 Subject: [PATCH 167/167] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 6f6364f..c15f7cc 100644 --- a/README.md +++ b/README.md @@ -564,7 +564,7 @@ In order to run this project you need:
        • -Simple Chat App +Interactive Polling App

          This is an interactive polling app that allows users to vote on a specific question. Users can vote for their preferred options and view the results in real-time. The app tracks the votes for each option and stores them in the local storage so the votes persist even after the page is refreshed.