├── README.md ├── api-projects ├── country-api │ ├── index.html │ ├── script.js │ └── styles.css ├── googlemapapi │ ├── index.html │ └── style.css ├── saas-jobs │ ├── data.json │ ├── index.html │ ├── profile.png │ ├── script.js │ └── style.css └── weatherapi │ ├── index.html │ ├── script.js │ └── style.css ├── assets ├── css │ └── style.css ├── js │ ├── projects.json │ └── script.js ├── projects-img │ ├── agecalc.png │ ├── basic-calc.png │ ├── calc-tilt.png │ ├── color-switcher.png │ ├── counter.png │ ├── countryapi.png │ ├── digiclock.png │ ├── emoji-flicker.png │ ├── gmap-api.png │ ├── issuetracker.png │ ├── neoclock.png │ ├── percentcalc.png │ ├── pwdgen.png │ ├── quizapp.png │ ├── saas-api.png │ ├── songify.png │ ├── stopwatch.png │ ├── tempconvert.png │ ├── todo.png │ ├── twonumcalc.png │ ├── weatherapi.png │ ├── wekeep.png │ └── wordcount.png └── site-img │ ├── cmsoon.png │ ├── favicon.png │ ├── h1.png │ ├── hero-bg.png │ └── site-construct.png ├── index.html ├── mini-projects ├── bgcolor-switcher │ ├── index.html │ └── style.css ├── digiclock │ ├── index.html │ └── style.css ├── emoji-flicker │ ├── index.html │ ├── script.js │ └── style.css └── simplecounter │ ├── index.html │ ├── script.js │ └── style.css └── projects ├── agecalc ├── index.html ├── script.js └── style.css ├── basic-calc ├── index.html ├── script.js └── style.css ├── issuetracker ├── index.html ├── script.js └── style.css ├── neoclock ├── clock.png ├── index.html ├── script.js └── style.css ├── percentcalc ├── index.html ├── script.js └── style.css ├── pwdgen ├── index.html ├── script.js └── style.css ├── quizapp ├── assets │ ├── fav.png │ ├── quizes.js │ └── script.js └── index.html ├── songify ├── assets │ ├── favicon.ico │ ├── images │ │ ├── cover1.jpg │ │ ├── cover10.jpg │ │ ├── cover11.jpg │ │ ├── cover12.jpg │ │ ├── cover13.jpg │ │ ├── cover2.jpg │ │ ├── cover3.jpg │ │ ├── cover4.jpg │ │ ├── cover5.jpg │ │ ├── cover6.jpg │ │ ├── cover7.jpg │ │ ├── cover8.jpg │ │ └── cover9.jpg │ ├── script.js │ ├── songs.js │ └── styles │ │ ├── _anim.scss │ │ ├── _colors.scss │ │ ├── _controls.scss │ │ ├── _mixins.scss │ │ ├── _music_list.scss │ │ ├── _music_player.scss │ │ ├── _player_cover.scss │ │ ├── _progress.scss │ │ ├── style.css │ │ ├── style.css.map │ │ └── style.scss └── index.html ├── stopwatch ├── assets │ ├── fav.ico │ ├── script.js │ └── style.css └── index.html ├── tempconvert ├── assets │ ├── fav.ico │ ├── script.js │ └── style.css └── index.html ├── todo ├── index.html ├── script.js └── style.css ├── twonumcalc ├── index.html ├── script.js └── style.css ├── wekeep ├── assets │ ├── fav.ico │ └── script.js └── index.html └── wordcount ├── assets ├── favic.ico ├── script.js └── style.css └── index.html /README.md: -------------------------------------------------------------------------------- 1 | ## JavaScript-Projects 2 | 3 | The JavaScript Projects Site is a centralized platform housing significant projects, all accessible from a single location. 4 | 5 | Crafted using fundamental technologies like HTML, CSS, TailwindCSS, SCSS, JavaScript, and jQuery, it offers a seamless experience for project exploration and engagement. 6 | 7 | [Visit Now](https://jigar-sable.github.io/JavaScript-Projects) 🚀 8 | 9 | ## Tech Stack 10 | [![HTML](https://img.shields.io/badge/html5%20-%23E34F26.svg?&style=for-the-badge&logo=html5&logoColor=white)](https://github.com/jigar-sable/JavaScript-Projects/search?l=html)  11 | [![CSS](https://img.shields.io/badge/css3%20-%231572B6.svg?&style=for-the-badge&logo=css3&logoColor=white)](https://github.com/jigar-sable/JavaScript-Projects/search?l=css)  12 | [![JS](https://img.shields.io/badge/javascript%20-%23323330.svg?&style=for-the-badge&logo=javascript&logoColor=%23F7DF1E)](https://github.com/jigar-sable/JavaScript-Projects/search?l=javascript) 13 | 14 | ## Sneak Peek of Home Page 🙈 : 15 | ![jsprothumb3](https://user-images.githubusercontent.com/64949957/124395721-3eac3880-dd23-11eb-99ca-b43f2c2e0d38.png) 16 | 17 | 18 |

📬 Contact

19 | 20 | Feel free to reach me through the below handles if you'd like to contact me. 21 | 22 | [![linkedin](https://img.shields.io/badge/LinkedIn-0077B5?style=for-the-badge&logo=linkedin&logoColor=white)](https://www.linkedin.com/in/jigar-sablee) 23 | [![instagram](https://img.shields.io/badge/Instagram-E4405F?style=for-the-badge&logo=instagram&logoColor=white)](https://www.instagram.com/jigarsable.dev) 24 | -------------------------------------------------------------------------------- /api-projects/country-api/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | Country Search API 12 | 13 | 14 |
15 |

Country Search App

16 |
17 |
18 | 19 |
20 |
21 | 22 |
23 |
24 |
25 |
26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /api-projects/country-api/script.js: -------------------------------------------------------------------------------- 1 | const searchBar = document.querySelector(".search-bar"); 2 | const searchBtn = document.querySelector("#search-btn"); 3 | const result = document.querySelector(".result"); 4 | const searchSection = document.querySelector(".search-section"); 5 | 6 | searchBtn.addEventListener("click", () => { 7 | let url = `https://restcountries.com/v3.1/name/${searchBar.value}`; 8 | fetch(url) 9 | .then((res) => res.json()) 10 | .then((data) => displayCountry(data)); 11 | }); 12 | 13 | const displayCountry = (data) => { 14 | // console.log(data); 15 | data.forEach((country) => { 16 | const div = document.createElement("div"); 17 | div.className = "card d-flex m-5 shadow"; 18 | div.style.width = "18rem"; 19 | div.innerHTML = ` 20 | ... 21 |
22 |

${country.name.common}

23 |
24 | `; 25 | result.appendChild(div); 26 | }); 27 | }; 28 | -------------------------------------------------------------------------------- /api-projects/country-api/styles.css: -------------------------------------------------------------------------------- 1 | .result { 2 | display: flex; 3 | flex-wrap: wrap; 4 | justify-content: center; 5 | } 6 | 7 | .card { 8 | cursor: pointer; 9 | } 10 | -------------------------------------------------------------------------------- /api-projects/googlemapapi/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Google Maps API | Project 9 | 10 | 11 |

My Simple Google Maps API Project

12 |
13 | 14 | 15 | 16 | 17 | 33 | -------------------------------------------------------------------------------- /api-projects/googlemapapi/style.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@300;400&display=swap'); 2 | 3 | html, 4 | body { 5 | height: 100%; 6 | margin: 0; 7 | padding: 0; 8 | box-sizing: border-box; 9 | overflow: hidden; 10 | font-family: 'Poppins', sans-serif; 11 | background: rgb(15, 1, 53); 12 | } 13 | #map { 14 | width: 800px; 15 | height: 550px; 16 | margin: 0 auto; 17 | border-radius: 6px; 18 | } 19 | h2{ 20 | text-align: center; 21 | color: #fff; 22 | } -------------------------------------------------------------------------------- /api-projects/saas-jobs/data.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "id": 1, 4 | "company": "TekStrea", 5 | "logo": "https://pbs.twimg.com/profile_images/1871386426/TSIconButtonSM_400x400.png", 6 | "roleName": "Pega Developer - 100% Remote", 7 | "postedTime": "5h ago", 8 | "type": "Full Time", 9 | "location": "United States", 10 | "website": "https://linkedin.com/TekStrea", 11 | "applicationLink": "https://linkedin.com/TekStrea/apply", 12 | "requirements": { 13 | "intro": "A TekStrea client, a healthcare technology company, has an immediate need for a Pega Developer for a remote long term contract. We're looking for an experienced developer to support defects, issues and development.", 14 | "content": "The ideal candidate is as passionate about solving challenges through technology.", 15 | "items": [ 16 | "Needs to be experienced in the PEGA platform on at least 7.22 with PEGA 8.x preferred.", 17 | "Pega Marketing or Pega Customer Decision Hub certification (for developers).", 18 | "Blues experience highly preferred, Healthcare experience required.", 19 | "Must be USA based and open to work standard business hours of 8-5pm ET." 20 | ] 21 | } 22 | }, 23 | { 24 | "id": 2, 25 | "company": "Facebook", 26 | "logo": "https://media-exp1.licdn.com/dms/image/C560BAQGrV5i4K9YdhQ/company-logo_200_200/0/1621582241755?e=1632960000&v=beta&t=nOdXGCQjrjyGuhl8JlhvQtSQCIz64Nr8jQbYZjAoX28", 27 | "roleName": "3D Web Software Engineer", 28 | "postedTime": "20h ago", 29 | "type": "Part Time", 30 | "location": "United States", 31 | "website": "https://linkedin.com/Facebook", 32 | "applicationLink": "https://linkedin.com/Facebook/apply", 33 | "requirements": { 34 | "intro": "Facebook's mission is to give people the power to build community and bring the world closer together. ", 35 | "content": "Come work alongside expert software engineers and research scientists to create the technology that makes VR and AR pervasive and universal. Join the adventure of a lifetime as we make science fiction real and change the world.", 36 | "items": [ 37 | "BS Computer Science or equivalent experience", 38 | "3+ years of experience developing 3D/XR web applications or frameworks", 39 | "5+ years of experience using JavaScript in a professional software development setting" 40 | ] 41 | } 42 | }, 43 | { 44 | "id": 3, 45 | "company": "Jobot", 46 | "logo": "https://media-exp1.licdn.com/dms/image/C560BAQEGgYq8v01oVg/company-logo_200_200/0/1620205047267?e=1632960000&v=beta&t=IwXDuGaCCMq-nL3_thY1tesHiJQkuIpqKowe_QZM3-0", 47 | "roleName": "SR. Software Engineer - Python Django", 48 | "postedTime": "1d ago", 49 | "type": "Part Time", 50 | "location": "United States", 51 | "website": "https://linkedin.com/Jobot", 52 | "applicationLink": "https://linkedin.com/Jobot/apply", 53 | "requirements": { 54 | "intro": "Are you a fit? Easy Apply now by clicking the 'Apply' button and sending us your resume.", 55 | "content": "We're looking for Sr. level backend software engineers that have at least 7 years of writing code for web-based Python applications.", 56 | "items": [ 57 | "You will need at least 3 years of writing Python Django applications and at least 10 years of software engineering experience.", 58 | "The frontend of this application is written in React.js - if you are comfortable in a full-stack role, then even better, but not a requirement.", 59 | "Ideally, you have tenure in all of the companies you've worked for, so you can show growth and technical challenges that you've overcome over time." 60 | ] 61 | } 62 | }, 63 | { 64 | "id": 4, 65 | "company": "SpringbokIT", 66 | "logo": "https://media-exp1.licdn.com/dms/image/C560BAQFVeIIhYnGo6g/company-logo_200_200/0/1566232530771?e=1632960000&v=beta&t=tfQAp5vydhZo-j54X4RyBaycug52wjWTE2fQkuFnEhI", 67 | "roleName": "Frontend Content Developer", 68 | "postedTime": "2d ago", 69 | "type": "Full Time", 70 | "location": "United States", 71 | "website": "https://linkedin.com/SpringbokIT", 72 | "applicationLink": "https://linkedin.com/SpringbokIT/apply", 73 | "requirements": { 74 | "intro": "A global leader in the retail space has migrated to Salesforce and is looking to add to its content development team. ", 75 | "content": "The company holds a “Greater Together” mentality and the Content Production Manager, to which this role reports, embodies that mantra. ", 76 | "items": [ 77 | "Experience with Salesforce Commerce Cloud (SFCC) Business Manager", 78 | "HTML, CSS, Javascript, and Bootstrap", 79 | "Experience working with a collaborative group in a process-oriented production environment." 80 | ] 81 | } 82 | }, 83 | { 84 | "id": 5, 85 | "company": "Dice", 86 | "logo": "https://media-exp1.licdn.com/dms/image/C560BAQEYK67Tel_mng/company-logo_200_200/0/1624162747433?e=1632960000&v=beta&t=F2NDtQwFDzIZzYfL2hVY6Ik7jY1uAXX43F8u0b_qRG0", 87 | "roleName": "Front End Developer", 88 | "postedTime": "2d ago", 89 | "type": "Part Time", 90 | "location": "United States", 91 | "website": "https://linkedin.com/Dice", 92 | "applicationLink": "https://linkedin.com/Dice/apply", 93 | "requirements": { 94 | "intro": "Dice is the leading career destination for tech experts at every stage of their careers. Our client, TrustMinds, Inc., is seeking the following. Apply via Dice today!", 95 | "content": "Seeking front end developers to build and maintain websites, landing pages, and display ad banners using HTMLCSSJavaScript to build responsive designs from provided mockups ", 96 | "items": [ 97 | "advanced HTML, CSS, and JavaScript", 98 | "build systems based on NPM, Gulp, Webpack, Sass", 99 | "should feel confident using GitGitflow branching strategies" 100 | ] 101 | } 102 | }, 103 | { 104 | "id": 6, 105 | "company": "The Population Project", 106 | "logo": "https://media-exp1.licdn.com/dms/image/C560BAQHqd8XtvITvMw/company-logo_200_200/0/1620162734126?e=1632960000&v=beta&t=s_UAIFXLLnVUJJnlpd1X686SWG-7I3IjyyYwA5p-WNM", 107 | "roleName": "CTO / Co-founder", 108 | "postedTime": "2d ago", 109 | "type": "Part Time", 110 | "location": "United States", 111 | "website": "https://linkedin.com/ThePopulationProject", 112 | "applicationLink": "https://linkedin.com/ThePopulationProject/apply", 113 | "requirements": { 114 | "intro": "The Population Project, a non-profit organization striving to list the name and date of birth of all humans alive, is looking for its CTO / technical co-founder.", 115 | "content": "This is a non- to low-paying position, requiring 10 to 40 hours a week depending on your involvement.", 116 | "items": [ 117 | "Maintaining a large Postgres AWS-hosted database", 118 | "Building the next version of our website when we decide to publicly expose our data", 119 | "Monitoring the Wrike and Discord collaboration platforms with which we interact with our volunteers" 120 | ] 121 | } 122 | }, 123 | { 124 | "id": 7, 125 | "company": "Georgia IT, Inc.", 126 | "logo": "https://media-exp1.licdn.com/dms/image/C510BAQHTI2pFWjn2UA/company-logo_200_200/0/1519897797698?e=1632960000&v=beta&t=5H-Vp8dCcXJ8fICwNGmB2YQzJYqyimjkZFYF-4j5fj0", 127 | "roleName": "Full Stack Engineer - REMOTE or Onsite", 128 | "postedTime": "2d ago", 129 | "type": "Part Time", 130 | "location": "United States", 131 | "website": "https://linkedin.com/GeorgiaITInc", 132 | "applicationLink": "https://linkedin.com/GeorgiaITInc/apply", 133 | "requirements": { 134 | "intro": "This company hasn't provided an intro.", 135 | "content": "Able to interface with customer digital sales and lead generation tools and following the lead into their CRM (SalesForce) system for conversion by an agent.", 136 | "items": [ 137 | "US Citizens and Green Card Only, No third party", 138 | "Engineers with solid JavaScript and AWS background.", 139 | "Experience in React.JS, Node.JS, and Angular is preferred" 140 | ] 141 | } 142 | }, 143 | { 144 | "id": 8, 145 | "company": "Michael Page", 146 | "logo": "https://media-exp1.licdn.com/dms/image/C560BAQFWT_CW-6Hd2Q/company-logo_200_200/0/1623848489646?e=1632960000&v=beta&t=eyDm2mqsK9xeBZawTXTUsBYze8WRduxd3uukb4T26Ao", 147 | "roleName": "Frontend Software Engineer Remote Banking $130k/yr", 148 | "postedTime": "2d ago", 149 | "type": "Part Time", 150 | "location": "United States", 151 | "website": "https://linkedin.com/MichaelPage", 152 | "applicationLink": "https://linkedin.com/MichaelPage/apply", 153 | "requirements": { 154 | "intro": "This company is a Boston based company that partners with hundreds of banks and credit unions. Voted one of the fastest growing FinTech companies in the world in 2020, our client strives to produce a product to help streamline the banking industry.", 155 | "content": "Tech Stack: Typescript, JavaScript, Angular, AWS, CSS", 156 | "items": [ 157 | "4+ years of hands on development experience", 158 | "Experience in frontend development using Typescript, JavaScript and Angular", 159 | "Experience delivering applications using AWS" 160 | ] 161 | } 162 | }, 163 | { 164 | "id": 9, 165 | "company": "GAOTek Inc.", 166 | "logo": "https://media-exp1.licdn.com/dms/image/C510BAQGg0dos_fVHhA/company-logo_200_200/0/1567998421321?e=1632960000&v=beta&t=X7EYf4jI7lCJfyrtzOKhv2bkz4rrML4AmbMN1g1jqLY", 167 | "roleName": "Software Development Intern (Virtual)", 168 | "postedTime": "2d ago", 169 | "type": "Part Time", 170 | "location": "United States", 171 | "website": "https://linkedin.com/GAOTekInc", 172 | "applicationLink": "https://linkedin.com/GAOTekInc/apply", 173 | "requirements": { 174 | "intro": "You shall be keen to learn, willing to work hard, maintaining productivity and committed to the job. ", 175 | "content": "This position is for those who are currently residing in the US and have the correct VISA to work in the country.", 176 | "items": [ 177 | "Software development plans", 178 | "Software architecture", 179 | "White papers" 180 | ] 181 | } 182 | }, 183 | { 184 | "id": 10, 185 | "company": "RemoteHub", 186 | "logo": "https://media-exp1.licdn.com/dms/image/C4E0BAQGQ_EPbBXR8Hg/company-logo_200_200/0/1604324330666?e=1632960000&v=beta&t=53alZNNXv3B7o_J5jHG4pe7plcWIMBB8kdgxS1ooMCQ", 187 | "roleName": "Work from Home Opportunities", 188 | "postedTime": "2d ago", 189 | "type": "Part Time", 190 | "location": "United States", 191 | "website": "https://linkedin.com/RemoteHub", 192 | "applicationLink": "https://linkedin.com/RemoteHub/apply", 193 | "requirements": { 194 | "intro": "Appen is a global leader in speech and search technology services and we have several part time work from home opportunities that you can apply for!", 195 | "content": "We are looking for applicants for an exciting work from home opportunity. Applicants must be self-motivated and internet savvy and there is no previous work experience or college degree required to apply for our jobs.", 196 | "items": [ 197 | "Linguistic Specialties (Text to Speech, Computational, Phonetics, Pronunciation, Annotation, etc.)", 198 | "Social Media Evaluation (Help improve social media around the globe)", 199 | "Search Engine Evaluation (Work with the world’s top search engine companies)" 200 | ] 201 | } 202 | }, 203 | { 204 | "id": 11, 205 | "company": "Suncap Technology", 206 | "logo": "https://media-exp1.licdn.com/dms/image/C4E0BAQEROuteF2F3gQ/company-logo_200_200/0/1555514992609?e=1632960000&v=beta&t=7P8pg3cma4GKzE6l7SmGRp-zjdd_WC_KSkMEwGzmWAw", 207 | "roleName": "Front-end Web Developer /Remote (San Bruno, CA Post Covid) 12 mth+ contract", 208 | "postedTime": "2d ago", 209 | "type": "Part Time", 210 | "location": "United States", 211 | "website": "https://linkedin.com/SuncapTechnology", 212 | "applicationLink": "https://linkedin.com/SuncapTechnology/apply", 213 | "requirements": { 214 | "intro": "This company hasn't provided an intro.", 215 | "content": "Front-end Web Developer includes:", 216 | "items": [ 217 | "Design, and develop Web and Mobile Web pages", 218 | "Effectively collaborate with Product, UX, and Marketing teams", 219 | "Provide subject matter expertise for web and mobile web responsive designs" 220 | ] 221 | } 222 | }, 223 | { 224 | "id": 12, 225 | "company": "HomeLister", 226 | "logo": "https://media-exp1.licdn.com/dms/image/C4E0BAQHCaYJPwpvdIQ/company-logo_200_200/0/1519892616664?e=1632960000&v=beta&t=SFdjFVBx6X3Ynpxd2SrxF9lbBufwgSNqf-SGQZ3vJcE", 227 | "roleName": "Data Entry Specialist - Full Time - Work From Home", 228 | "postedTime": "2d ago", 229 | "type": "Part Time", 230 | "location": "United States", 231 | "website": "https://linkedin.com/HomeLister", 232 | "applicationLink": "https://linkedin.com/HomeLister/apply", 233 | "requirements": { 234 | "intro": "[Office Assistant / Remote] - Anywhere in U.S. / up to $44k-yr / Medical-Dental-PTO-401(k) Matching / Real Estate Experience Not Required", 235 | "content": "As a Data Entry Specialist you'll: Gain valuable experience learning about residential real estate, and join a great team;", 236 | "items": [ 237 | "Be proficient at standard office software", 238 | "Quick to learn new programs", 239 | "Possess excellent written and verbal communication skills" 240 | ] 241 | } 242 | }, 243 | { 244 | "id": 13, 245 | "company": "WMI Worldwide", 246 | "logo": "https://media-exp1.licdn.com/dms/image/C4D0BAQESmXHE28MpUw/company-logo_200_200/0/1519905226668?e=1632960000&v=beta&t=gi-x1SZrOMdTO-Oc6sdZ-G7UDr8Y5M7ixo5ddribOKk", 247 | "roleName": "Software Engineer II", 248 | "postedTime": "2d ago", 249 | "type": "Part Time", 250 | "location": "United States", 251 | "website": "https://linkedin.com/WMIWorldwide", 252 | "applicationLink": "https://linkedin.com/WMIWorldwide/apply", 253 | "requirements": { 254 | "intro": "Our client's game inspires millions to create together, connects people across the globe, and brings together a community that is among the most active and passionate in the world. The team is looking for a developer to lead and drive the timely delivery of next generation game technology and foundations.", 255 | "content": "The Software Engineer II has built large-scale cloud services running in Azure and will take end-to-end ownership for development and quality of products and services that delight customers and add strategic value to our client. ", 256 | "items": [ 257 | "Developing and coordinating features using Microsoft Azure compute and storage", 258 | "Defining initiatives that impact our games", 259 | "Ensuring timely, high quality deliverables" 260 | ] 261 | } 262 | }, 263 | { 264 | "id": 14, 265 | "company": "RIT Solutions, Inc.", 266 | "logo": "https://media-exp1.licdn.com/dms/image/C560BAQEP3xJYibhYmQ/company-logo_200_200/0/1595879151058?e=1632960000&v=beta&t=19s3Bsxz2fGxZoJ_ybc4BJ4SbCQopUPcAC6NZ601T-Y", 267 | "roleName": "UI developer - REMOTE", 268 | "postedTime": "2d ago", 269 | "type": "Part Time", 270 | "location": "United States", 271 | "website": "https://linkedin.com/RITSolutionsInc", 272 | "applicationLink": "https://linkedin.com/RITSolutionsInc/apply", 273 | "requirements": { 274 | "intro": "Looking for a UI Developer with a strong background in ReactJS. ", 275 | "content": "Must have strong exp. with ReactJs ", 276 | "items": [ 277 | "Have 8+ years of experience developing software apps", 278 | "HTML, CSS, Responsive Web", 279 | "HTML, CSS, Responsive Web JSON, XML and Agile" 280 | ] 281 | } 282 | }, 283 | { 284 | "id": 15, 285 | "company": "RemoteHub", 286 | "logo": "https://media-exp1.licdn.com/dms/image/C560BAQH3PRxm6epbWg/company-logo_200_200/0/1519887943661?e=1632960000&v=beta&t=Jiyz0IaBcktNiy4SqWZr8ZD2sFw-fPgPkqlRtIF57gE", 287 | "roleName": "Freelance Data Entry Associate (Work From Home)", 288 | "postedTime": "2d ago", 289 | "type": "Part Time", 290 | "location": "United States", 291 | "website": "https://linkedin.com/RemoteHub", 292 | "applicationLink": "https://linkedin.com/RemoteHub/apply", 293 | "requirements": { 294 | "intro": "Anywhere in U.S. / Competitive pay / Contract position with potential for future assignments", 295 | "content": "As a Data Entry Associate you'll: Assist in the creation of content;", 296 | "items": [ 297 | "Compile and sort information to prepare source data", 298 | "Review data for deficiencies or errors", 299 | "Retrieve data from the database or electronic files as requested" 300 | ] 301 | } 302 | } 303 | ] -------------------------------------------------------------------------------- /api-projects/saas-jobs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Find Jobs | Jigar 10 | 11 | 12 |
13 |
14 | 17 | Find Jobs 18 |
19 |
20 | 33 | 34 |
35 |

Showing 15 Jobs

36 |
37 |
38 |
39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /api-projects/saas-jobs/profile.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/api-projects/saas-jobs/profile.png -------------------------------------------------------------------------------- /api-projects/saas-jobs/script.js: -------------------------------------------------------------------------------- 1 | let inputBox = document.getElementById('filter-jobs'); 2 | inputBox.onkeyup = (e)=>{ 3 | if(e.keyCode==13){ 4 | let text = document.getElementById('filter-jobs').value; 5 | getJobs().then(jobs => { 6 | let filteredJobs = filterJobs(jobs, text); 7 | showJobs(filteredJobs); 8 | }) 9 | } 10 | } 11 | 12 | 13 | document.querySelector('.button-container') 14 | .addEventListener("click", () => { 15 | let text = document.getElementById('filter-jobs').value; 16 | getJobs().then(jobs => { 17 | let filteredJobs = filterJobs(jobs, text); 18 | showJobs(filteredJobs); 19 | }) 20 | }) 21 | 22 | function getJobs() { 23 | return fetch("data.json") 24 | .then(response => response.json()) 25 | .then(data => { 26 | return data 27 | }) 28 | } 29 | 30 | function filterJobs(jobs, searchText){ 31 | if(searchText){ 32 | let filteredJobs = jobs.filter(job => { 33 | if(job.roleName.toLowerCase().includes(searchText) 34 | || job.type.toLowerCase().includes(searchText) 35 | || job.company.toLowerCase().includes(searchText) 36 | || job.requirements.content.toLowerCase().includes(searchText)){ 37 | return true; 38 | } else { 39 | return false; 40 | } 41 | }) 42 | return filteredJobs; 43 | } else { 44 | return jobs; 45 | } 46 | } 47 | function showJobs(jobs) { 48 | let jobsContainer = document.querySelector(".jobs-container"); 49 | let jobsHTML = ""; 50 | jobs.forEach(job => { 51 | jobsHTML += ` 52 |
53 |
54 | 55 | 56 | 57 | 58 |
59 |
60 | ${job.roleName} 61 |
62 |
63 | ${job.requirements.content} 64 |
65 |
66 |
67 | Apply Now 68 | 69 |
70 |
71 | Message 72 |
73 |
74 |
` 75 | }); 76 | jobsContainer.innerHTML = jobsHTML; 77 | } 78 | 79 | getJobs().then(data => { 80 | showJobs(data); 81 | }) -------------------------------------------------------------------------------- /api-projects/saas-jobs/style.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Nunito:wght@200;300;400;600&display=swap'); 2 | 3 | *{ 4 | box-sizing: border-box; 5 | font-family: 'Nunito', sans-serif; 6 | } 7 | body{ 8 | margin: 0; 9 | color: #fff; 10 | background: #11121A; 11 | } 12 | 13 | header { 14 | background: #1C1C24; 15 | background: linear-gradient(to right, #4a00e0, #8e2de2); 16 | height: 70px; 17 | display: flex; 18 | justify-content: center; 19 | align-items: center; 20 | font-size: 20px; 21 | margin-bottom: 25px; 22 | position: fixed; 23 | left: 0; right: 0; 24 | top: 0; 25 | z-index: 10; 26 | } 27 | .header-container { 28 | max-width: 1250px; 29 | width: 100%; 30 | display: flex; 31 | align-items: center; 32 | padding: 0 25px; 33 | } 34 | .header-container .logo { 35 | height: 60px; 36 | margin-right: 10px; 37 | } 38 | .header-container .logo img { 39 | height: 100%; 40 | object-fit: cover; 41 | border-radius: 50%; 42 | } 43 | 44 | .search { 45 | width: 100%; 46 | max-width: 1250px; 47 | margin: 0 auto; 48 | padding: 0 25px; 49 | margin-top: 90px; 50 | } 51 | .search-container { 52 | background: #1C1C24; 53 | height: 60px; 54 | border-radius: 10px; 55 | border: 2px solid #222328; 56 | display: flex; 57 | overflow: hidden; 58 | } 59 | .input-container{ 60 | flex-grow: 1; 61 | display: flex; 62 | align-items: center; 63 | } 64 | .input-container input{ 65 | flex-grow: 1; 66 | background: transparent; 67 | border: none; outline: none; 68 | color: #fff; 69 | font-size: 20px; 70 | margin-left: 20px; 71 | } 72 | .input-container i { 73 | font-size: 20px; 74 | margin-left: 25px; 75 | } 76 | .button-container{ 77 | background: #5513cf; 78 | width: 100px; 79 | display: flex; 80 | justify-content: center; 81 | align-items: center; 82 | cursor: pointer; 83 | transition: all .2s ease; 84 | } 85 | .button-container:hover{ 86 | background: #3d03a8; 87 | } 88 | 89 | .jobs-list{ 90 | background: #11121A; 91 | max-width: 1250px; 92 | width: 100%; 93 | height: 100vh; 94 | margin: 0 auto; 95 | display: flex; 96 | flex-direction: column; 97 | padding: 0 25px; 98 | } 99 | .jobs-list h1{ 100 | margin-left: 25px; 101 | font-size: 20px; 102 | } 103 | .jobs-container { 104 | display: grid; 105 | gap: 40px; 106 | grid-template-columns: repeat(3, 1fr); 107 | background: #11121A; 108 | } 109 | .job-tile{ 110 | background: #1C1C24; 111 | border-radius: 10px; 112 | display: flex; 113 | flex-direction: column; 114 | justify-content: flex-start; 115 | color: #fff; 116 | padding: 30px; 117 | transition: transform 0.2s; 118 | } 119 | .job-tile:hover { 120 | transform: scale(1.05); 121 | } 122 | 123 | .top { 124 | width: 100%; 125 | display: flex; 126 | justify-content: space-between; 127 | } 128 | .top img{ 129 | width: 50px; 130 | height: 50px; 131 | border-radius: 10px; 132 | } 133 | 134 | .rolename { 135 | padding: 20px 0; 136 | } 137 | .rolename span { 138 | font-size: 22px; 139 | } 140 | .description { 141 | height: 105px; 142 | overflow: hidden; 143 | font-size: 18px; 144 | color: #969398; 145 | flex-grow: 1; 146 | } 147 | .buttons { 148 | color: #000; 149 | margin-top: 20px; 150 | display: flex; 151 | justify-content: space-between; 152 | height: 45px; 153 | } 154 | .button { 155 | flex: 1; 156 | display: flex; 157 | justify-content: center; 158 | align-items: center; 159 | border-radius: 10px; 160 | color: #030303; 161 | background: #ff8800; 162 | font-size: 14px; 163 | cursor: pointer; 164 | } 165 | .button:hover { 166 | background: #df7802; 167 | } 168 | .apply-now{ 169 | color: #fff; 170 | background: #550ddb; 171 | margin-right: 15px; 172 | transition: .2s; 173 | } 174 | .apply-now i{ 175 | font-size: 11px; 176 | margin-left: 2px; 177 | } 178 | .apply-now a{ 179 | text-decoration: none; 180 | color: #fff; 181 | } 182 | .apply-now:hover { 183 | background: #4409b1; 184 | color: rgb(255, 255, 255); 185 | } 186 | 187 | @media screen and (max-width: 930px){ 188 | .jobs-container{ 189 | grid-template-columns: repeat(2, 1fr); 190 | } 191 | } 192 | @media screen and (max-width: 600px){ 193 | .jobs-container{ 194 | grid-template-columns: repeat(1, 1fr); 195 | } 196 | } -------------------------------------------------------------------------------- /api-projects/weatherapi/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Weather App | JavaScript Projects 10 | 11 | 12 |
13 | 14 |
15 |
16 |

Simple Weather App

17 |
18 | 19 | 20 |
21 |
22 | 36 |
37 |
38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /api-projects/weatherapi/script.js: -------------------------------------------------------------------------------- 1 | function showData(){ 2 | let city = document.getElementById('city-input').value; 3 | let output = document.querySelector('.output-wrapper'); 4 | 5 | const key = "a0e78d3b449db7059df0a38abd3952f8"; 6 | if(city){ 7 | fetch( 8 | `https://api.openweathermap.org/data/2.5/weather?q=${city}&units=metric&APPID=${key}` 9 | ) 10 | .then((res) => res.json()) 11 | .then((data) => { 12 | if(data.main){ 13 | output.style.visibility="visible"; 14 | 15 | output.innerHTML = ` 16 |
17 | ${data.main.temp} °C 18 |

${data.weather[0].description}

19 |
20 |
21 |
22 | Min : ${data.main.temp_min} °C 23 | Max : ${data.main.temp_max} °C 24 |
25 |
26 | Humidity : ${data.main.humidity} % 27 | Wind : ${data.wind.speed} km/hr 28 |
29 |
`; 30 | }else{ 31 | output.style.visibility="hidden"; 32 | alert("City Data Not Found!"); 33 | } 34 | }); 35 | } else { 36 | alert("Please Enter City!") 37 | } 38 | } -------------------------------------------------------------------------------- /api-projects/weatherapi/style.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@200;300;400;500;600;700&display=swap'); 2 | 3 | *{ 4 | margin: 0; 5 | padding: 0; 6 | box-sizing: border-box; 7 | } 8 | body{ 9 | width: 100%; 10 | height: 100vh; 11 | background: linear-gradient(to right, #8e2de2, #4a00e0); 12 | font-size: 62.5%; 13 | overflow: hidden; 14 | } 15 | .container { 16 | background: rgba(255, 255, 255, 0.40); 17 | transform-style: preserve-3d; 18 | transition: .3s; 19 | box-shadow: 0 15px 35px rgba(0, 0, 0, 0.6); 20 | max-width: 30rem; 21 | width: 100%; 22 | margin: 5rem auto; 23 | padding: 1rem 2rem 1rem 2rem; 24 | border-radius: .5rem; 25 | box-shadow: 0px 10px 15px rgba(0,0,0,0.1); 26 | } 27 | .container *{ 28 | border: none; 29 | outline: none; 30 | font-family: 'Poppins', sans-serif; 31 | } 32 | h3{ 33 | font-size: 1.5rem; 34 | text-align: center; 35 | margin-bottom: 1rem; 36 | } 37 | .input-wrapper{ 38 | background: rgb(252, 45, 45); 39 | padding: 2rem 1.5rem; 40 | border-radius: .5rem; 41 | box-shadow: 0 15px 20px rgba(0, 0, 0, 0.3); 42 | margin-bottom: 20px; 43 | } 44 | input { 45 | height: 3rem; 46 | background: #fff; 47 | color: #000; 48 | font-weight: 500; 49 | border-radius: .4rem; 50 | width: 60%; 51 | padding: 0 1.5rem; 52 | font-size: 1rem; 53 | } 54 | button{ 55 | width: 30%; 56 | float: right; 57 | cursor: pointer; 58 | height: 3rem; 59 | background: #fff; 60 | color: #000; 61 | font-weight: 600; 62 | border-radius: .4rem; 63 | transition: .3s; 64 | display: inline-block; 65 | font-size: 1rem; 66 | } 67 | button:hover{ 68 | background: rgb(253, 253, 0); 69 | } 70 | button span { 71 | cursor: pointer; 72 | display: inline-block; 73 | position: relative; 74 | transition: 0.5s; 75 | } 76 | button span:after { 77 | content: '\00bb'; 78 | position: absolute; 79 | opacity: 0; 80 | top: -13px; 81 | font-size: 2rem; 82 | right: -12px; 83 | transition: 0.5s; 84 | } 85 | button:hover span { 86 | padding-right: 20px; 87 | } 88 | button:hover span:after { 89 | opacity: 1; 90 | right: 0; 91 | } 92 | 93 | .output-wrapper { 94 | width: 100%; 95 | margin-bottom: 1.5rem; 96 | width: 100%; 97 | background: rgb(252, 34, 34); 98 | border-radius: 0.5rem; 99 | color: #fff; 100 | padding: 1rem 0; 101 | box-shadow: 0 15px 20px rgba(0, 0, 0, 0.3); 102 | visibility: hidden; 103 | } 104 | .temp { 105 | text-align: center; 106 | font-size: 3rem; 107 | font-weight: 600; 108 | padding: 1.5rem; 109 | color: #120331; 110 | } 111 | .temp .desc { 112 | font-size: 1.5rem; 113 | text-transform: capitalize; 114 | } 115 | .details-container { 116 | display: flex; 117 | flex-direction: row; 118 | font-size: 0.8rem; 119 | color: rgb(255, 255, 255); 120 | font-weight: 500; 121 | justify-content: space-evenly; 122 | } 123 | .details { 124 | display: flex; 125 | flex-direction: column; 126 | justify-content: space-between; 127 | align-items: flex-start; 128 | margin: .5rem; 129 | } 130 | .details span{ 131 | text-align: left; 132 | margin: .2rem; 133 | font-size: 1rem; 134 | } 135 | 136 | 137 | .backbtn { 138 | position: absolute; 139 | font-size: 2rem; 140 | float: left; 141 | cursor: pointer; 142 | top: 3rem; 143 | margin-left: 10rem; 144 | color:rgb(255, 255, 255); 145 | } 146 | .backbtn a{ 147 | text-decoration: none; 148 | color: inherit; 149 | } -------------------------------------------------------------------------------- /assets/css/style.css: -------------------------------------------------------------------------------- 1 | @import url("https://fonts.googleapis.com/css2?family=Roboto:wght@100;300;400&display=swap"); 2 | @import url("https://fonts.googleapis.com/css2?family=Nunito:wght@200;300;400;600;700&display=swap"); 3 | 4 | :root { 5 | --violet: #5320e0; 6 | } 7 | * { 8 | margin: 0; 9 | padding: 0; 10 | box-sizing: border-box; 11 | outline: none; 12 | border: none; 13 | text-decoration: none; 14 | text-transform: capitalize; 15 | font-family: "Roboto", sans-serif; 16 | } 17 | 18 | *::selection { 19 | background: var(--violet); 20 | color: #fff; 21 | } 22 | 23 | html { 24 | font-size: 62.5%; 25 | overflow-x: hidden; 26 | } 27 | html::-webkit-scrollbar { 28 | width: 0.7rem; 29 | } 30 | html::-webkit-scrollbar-track { 31 | background: rgb(175, 175, 175); 32 | } 33 | html::-webkit-scrollbar-thumb { 34 | background: #ff7300; 35 | } 36 | 37 | body { 38 | background: #f9f9f9; 39 | } 40 | 41 | section { 42 | min-height: 100vh; 43 | padding: 0 7%; 44 | } 45 | .heading { 46 | font-size: 3.5rem; 47 | color: rgb(48, 48, 48); 48 | font-weight: 800; 49 | font-family: "Nunito", sans-serif; 50 | } 51 | .heading span { 52 | color: rgb(115, 3, 167); 53 | } 54 | 55 | header { 56 | width: 100%; 57 | background: rgb(62, 4, 155); 58 | display: flex; 59 | align-items: center; 60 | justify-content: space-between; 61 | position: fixed; 62 | top: 0; 63 | left: 0; 64 | z-index: 1000; 65 | padding: 0.8rem 7%; 66 | box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.1); 67 | } 68 | header .logo { 69 | font-size: 2.5rem; 70 | color: rgb(255, 255, 255); 71 | text-decoration: none; 72 | transition: 0.2s; 73 | } 74 | header .logo i { 75 | color: #ffd900; 76 | } 77 | header .logo:hover { 78 | color: #ffd900; 79 | transform: scale(1.1); 80 | } 81 | header .navbar ul { 82 | display: flex; 83 | align-items: center; 84 | justify-content: center; 85 | list-style: none; 86 | } 87 | header .navbar ul li { 88 | margin-left: 2.5rem; 89 | } 90 | header .navbar ul li a { 91 | text-decoration: none; 92 | font-size: 2rem; 93 | color: rgb(255, 255, 255); 94 | } 95 | header .navbar ul li a.active, 96 | header .navbar ul li a:hover { 97 | color: #ffd900; 98 | border-bottom: 0.2rem solid #ffd900; 99 | padding: 0.7rem 0; 100 | } 101 | #menu { 102 | font-size: 3rem; 103 | color: #ffd900; 104 | cursor: pointer; 105 | display: none; 106 | } 107 | header a.conbtn { 108 | background: #fff; 109 | border-radius: 1rem; 110 | padding: 6px 10px; 111 | font-size: 1.6rem; 112 | margin-left: 2rem; 113 | border-radius: 4px; 114 | font-weight: 700; 115 | color: rgb(62, 4, 155); 116 | text-decoration: none; 117 | margin-top: 0.3rem; 118 | } 119 | header a.conbtn:hover { 120 | color: rgb(62, 4, 155); 121 | background: rgb(255, 230, 0); 122 | } 123 | 124 | /* hero */ 125 | .home { 126 | display: flex; 127 | flex-wrap: wrap; 128 | gap: 1.5rem; 129 | min-height: 100vh; 130 | align-items: center; 131 | background: url("../site-img/hero-bg.png") no-repeat; 132 | background-size: cover; 133 | scroll-behavior: smooth; 134 | background-position: center; 135 | } 136 | .home .content { 137 | flex: 1 1 40rem; 138 | } 139 | .home .image { 140 | flex: 1 1 40rem; 141 | } 142 | .home .image img { 143 | width: 90%; 144 | padding: 1rem; 145 | animation: float 4s linear infinite; 146 | } 147 | @keyframes float { 148 | 0%, 149 | 100% { 150 | transform: translateY(0rem); 151 | } 152 | 50% { 153 | transform: translateY(3rem); 154 | } 155 | } 156 | .home .content h3 { 157 | font-size: 5rem; 158 | font-weight: 800; 159 | color: #012970; 160 | font-family: "Nunito", sans-serif; 161 | } 162 | .home .btn { 163 | font-family: "Nunito", sans-serif; 164 | line-height: 0; 165 | padding: 1.7rem 3rem; 166 | border-radius: 4em; 167 | transition: 0.5s; 168 | color: #fff; 169 | background: #7115eb; 170 | box-shadow: 0px 5px 15px rgba(109, 39, 238, 0.6); 171 | } 172 | .home .btn span { 173 | font-family: "Nunito", sans-serif; 174 | font-weight: 700; 175 | font-size: 1.6rem; 176 | letter-spacing: 0.1rem; 177 | } 178 | .home .btn i { 179 | margin-left: 0.3rem; 180 | font-size: 1.5rem; 181 | transition: 0.3s; 182 | } 183 | .home .btn:hover i { 184 | transform: translateX(5px); 185 | } 186 | 187 | /* text anim */ 188 | #container { 189 | text-align: left; 190 | position: relative; 191 | } 192 | #text { 193 | display: inline-block; 194 | vertical-align: middle; 195 | color: orange; 196 | letter-spacing: 2px; 197 | font-weight: 600; 198 | font-size: 2.5rem; 199 | padding: 1rem 0; 200 | font-family: "Nunito", sans-serif; 201 | margin-bottom: 2rem; 202 | } 203 | 204 | #cursor { 205 | display: inline-block; 206 | vertical-align: center; 207 | width: 3px; 208 | height: 3rem; 209 | background-color: orange; 210 | animation: blink 0.75s step-end infinite; 211 | } 212 | 213 | @keyframes blink { 214 | from, 215 | to { 216 | background-color: transparent; 217 | } 218 | 50% { 219 | background-color: orange; 220 | } 221 | } 222 | /* hero end */ 223 | 224 | /* project section starts */ 225 | .project { 226 | background: #e5ecfb; 227 | } 228 | .project .heading { 229 | text-align: center; 230 | padding: 2rem; 231 | font-weight: 600; 232 | } 233 | .project .box-container { 234 | display: flex; 235 | justify-content: center; 236 | align-items: center; 237 | flex-wrap: wrap; 238 | } 239 | .project .box-container .box { 240 | border: 0.1rem solid rgba(0, 0, 0, 0.2); 241 | margin: 2rem; 242 | width: 33rem; 243 | border-radius: 0.5rem; 244 | box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.3); 245 | text-align: center; 246 | position: relative; 247 | overflow: hidden; 248 | height: 45rem; 249 | background: #fff; 250 | } 251 | .project .box-container .box img { 252 | height: 60%; 253 | width: 100%; 254 | object-fit: cover; 255 | position: relative; 256 | } 257 | .project .box-container .box .content { 258 | position: relative; 259 | padding: 1rem; 260 | text-align: center; 261 | display: flex; 262 | flex-direction: column; 263 | } 264 | .project .box-container .box .content h3 { 265 | font-size: 2.5rem; 266 | color: #012970; 267 | padding: 0.2rem 0; 268 | font-weight: 600; 269 | } 270 | .project .box-container .box .content p { 271 | font-size: 1.4rem; 272 | color: rgb(53, 53, 53); 273 | text-align: left; 274 | margin-left: 1.5rem; 275 | } 276 | .project .box-container .box:hover { 277 | transform: translateY(-1rem); 278 | box-shadow: 0 0.8rem 1.1rem rgba(0, 0, 0, 0.4); 279 | } 280 | .project .btns { 281 | display: flex; 282 | padding: 1rem; 283 | justify-content: space-between; 284 | align-items: center; 285 | } 286 | .project .btns .btn { 287 | font-family: "Nunito", sans-serif; 288 | line-height: 0; 289 | display: inline; 290 | padding: 1.2rem 2rem; 291 | border-radius: 0.5rem; 292 | font-size: 1.6rem; 293 | color: #fff; 294 | background: #4225c7f5; 295 | } 296 | .project .btn:hover { 297 | background: #6547e9f5; 298 | } 299 | /* project section ends */ 300 | 301 | /* basic section starts */ 302 | .basic { 303 | background: #e6ddfa; 304 | padding-bottom: 2rem; 305 | } 306 | .basic .heading { 307 | text-align: center; 308 | padding: 2rem; 309 | font-weight: 600; 310 | } 311 | .basic .box-container { 312 | display: flex; 313 | flex-wrap: wrap; 314 | justify-content: center; 315 | align-items: center; 316 | flex-direction: column; 317 | } 318 | .basic .box-container .box { 319 | display: flex; 320 | flex-direction: row; 321 | max-width: 80rem; 322 | min-width: 80rem; 323 | border-radius: 0.5rem; 324 | box-shadow: 0.2rem 0.5rem 1rem rgba(0, 0, 0, 0.2); 325 | text-align: center; 326 | position: relative; 327 | margin-top: 2rem; 328 | overflow: hidden; 329 | transition: 0.3s; 330 | background: rgb(252, 252, 252); 331 | } 332 | .basic .box-container .box:hover { 333 | transform: scale(1.03); 334 | box-shadow: 1rem 0.5rem 1.2rem rgba(0, 0, 0, 0.3); 335 | } 336 | .basic .box-container .box .content { 337 | position: relative; 338 | display: flex; 339 | flex-direction: column; 340 | padding: 1rem; 341 | flex-wrap: wrap; 342 | flex: 1 1 60rem; 343 | } 344 | .basic .box-container .box img { 345 | object-fit: cover; 346 | position: relative; 347 | width: 28%; 348 | height: 18rem; 349 | flex: 1 1 25rem; 350 | } 351 | .basic .box-container .box .content h3 { 352 | font-size: 2rem; 353 | color: #012970; 354 | padding: 0.2rem 0; 355 | font-weight: 600; 356 | text-align: left; 357 | margin-left: 2rem; 358 | } 359 | .basic .box-container .box .content p { 360 | font-size: 1.5rem; 361 | color: rgb(70, 70, 70); 362 | padding: 0.5rem; 363 | margin-left: 1.5rem; 364 | text-align: left; 365 | } 366 | .basic .btns { 367 | display: flex; 368 | padding: 1.2rem; 369 | justify-content: space-between; 370 | align-items: flex-start; 371 | } 372 | .basic .btns .btn { 373 | font-family: "Nunito", sans-serif; 374 | line-height: 0; 375 | display: inline; 376 | padding: 1rem 2rem; 377 | border-radius: 0.5rem; 378 | font-size: 1.5rem; 379 | color: rgb(14, 14, 14); 380 | margin-right: 2rem; 381 | border: 2px solid #4225c7f5; 382 | } 383 | .basic .btn:hover { 384 | background: #4225c7f5; 385 | color: #fff; 386 | } 387 | /* basic section ends */ 388 | 389 | /* apibased section starts */ 390 | .apibased { 391 | background: rgb(206, 252, 206); 392 | min-height: 70vh; 393 | } 394 | .apibased .heading { 395 | text-align: center; 396 | padding: 2rem; 397 | font-weight: 600; 398 | } 399 | .apibased .box-container { 400 | display: flex; 401 | flex-wrap: wrap; 402 | gap: 1.5rem; 403 | margin: 2rem; 404 | } 405 | .apibased .box-container .box { 406 | flex: 1 1 30rem; 407 | border-radius: 0.5rem; 408 | border: none; 409 | box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.4); 410 | position: relative; 411 | overflow: hidden; 412 | height: 30rem; 413 | background: rgb(243, 243, 243); 414 | } 415 | .apibased .box-container .box img { 416 | height: 100%; 417 | width: 100%; 418 | object-fit: cover; 419 | } 420 | .apibased .box-container .box .content { 421 | height: 100%; 422 | width: 100%; 423 | position: absolute; 424 | top: -85%; 425 | left: 0; 426 | background: rgba(255, 255, 255, 1); 427 | display: flex; 428 | flex-direction: column-reverse; 429 | transition: 0.2s ease-in; 430 | } 431 | .apibased .box-container .box .content .tag { 432 | display: flex; 433 | flex-direction: row; 434 | justify-content: space-between; 435 | align-items: center; 436 | height: 4.5rem; 437 | width: 100%; 438 | padding-left: 1rem; 439 | background: #ffd900; 440 | } 441 | .apibased .box-container .box .content .tag h3 { 442 | font-size: 2rem; 443 | font-weight: 600; 444 | } 445 | .apibased .box-container .box:hover .content { 446 | top: -40%; 447 | } 448 | .apibased .box-container .box:hover .content .tag { 449 | display: none; 450 | } 451 | .apibased .desc { 452 | margin: 2rem; 453 | display: flex; 454 | flex-direction: column; 455 | justify-content: center; 456 | } 457 | .apibased .desc p { 458 | font-size: 1.5rem; 459 | } 460 | .apibased .desc .btns { 461 | display: flex; 462 | justify-content: space-between; 463 | width: 100%; 464 | margin-top: 2rem; 465 | } 466 | .apibased .desc .btns .btn { 467 | line-height: 0; 468 | display: inline; 469 | padding: 1.3rem 2.5rem; 470 | border-radius: 0.5rem; 471 | font-size: 1.6rem; 472 | color: #fff; 473 | background: #4225c7f5; 474 | margin-right: 2rem; 475 | } 476 | .apibased .desc .btns .btn:hover { 477 | background: #6547e9f5; 478 | } 479 | /* apibased section ends */ 480 | 481 | /* media queries */ 482 | @media (max-width: 991px) { 483 | html { 484 | font-size: 60%; 485 | } 486 | } 487 | @media (max-width: 768px) { 488 | #menu { 489 | display: block; 490 | } 491 | header .navbar { 492 | position: fixed; 493 | top: 5.3rem; 494 | right: -120%; 495 | width: 70%; 496 | height: 100%; 497 | text-align: left; 498 | align-items: flex-start; 499 | background-color: rgb(32, 32, 32); 500 | } 501 | header .navbar ul { 502 | flex-flow: column; 503 | padding: 2rem; 504 | } 505 | header .navbar ul li { 506 | text-align: center; 507 | width: 100%; 508 | margin: 1rem 0; 509 | border-bottom: 3px solid #ffd900; 510 | border-radius: 0.5rem; 511 | width: 22rem; 512 | } 513 | header .navbar ul li a { 514 | display: block; 515 | padding: 1rem; 516 | text-align: left; 517 | } 518 | header .navbar ul li a.active, 519 | header .navbar ul li a:hover { 520 | padding: 1rem; 521 | background: var(--violet); 522 | color: #fff; 523 | border-radius: 0.5rem; 524 | } 525 | .fa-times { 526 | transform: rotate(180deg); 527 | } 528 | header .navbar.nav-toggle { 529 | right: 0; 530 | } 531 | header a.conbtn { 532 | margin-top: 1rem; 533 | width: 100%; 534 | margin-left: -1rem; 535 | text-align: center; 536 | } 537 | .home .content { 538 | text-align: center; 539 | } 540 | .home .image img { 541 | position: absolute; 542 | top: 60%; 543 | } 544 | .project .heading { 545 | padding: 0.5rem; 546 | } 547 | .project .box-container .box { 548 | width: 42rem; 549 | height: 46rem; 550 | margin: 1rem; 551 | } 552 | .project .box-container .box .content p { 553 | font-size: 1.7rem; 554 | } 555 | #container { 556 | text-align: center; 557 | } 558 | .basic .box-container .box { 559 | min-width: 40rem; 560 | } 561 | .basic .box-container .box .content { 562 | flex: 1 1 30rem; 563 | } 564 | .basic .box-container .box img { 565 | width: 25%; 566 | height: 18rem; 567 | flex: 1 1 20rem; 568 | } 569 | .basic .box-container .box .content h3 { 570 | font-size: 1.8rem; 571 | padding: 0.2rem 0; 572 | margin-left: 0.2rem; 573 | } 574 | .basic .box-container .box .content p { 575 | font-size: 1.4rem; 576 | margin: 0; 577 | padding: 0; 578 | } 579 | .basic .btns { 580 | padding: 0.5rem; 581 | } 582 | .basic .btns .btn { 583 | padding: 0.8rem; 584 | } 585 | .apibased { 586 | margin: 0; 587 | padding: 0.5rem; 588 | } 589 | } 590 | 591 | @media (max-width: 500px) { 592 | html { 593 | font-size: 52%; 594 | } 595 | section { 596 | padding: 0 3%; 597 | padding-top: 2rem; 598 | } 599 | } 600 | 601 | /* Footer */ 602 | .site-footer { 603 | background-color: #08142c; 604 | padding: 30px 0 10px; 605 | font-size: 15px; 606 | line-height: 20px; 607 | color: rgb(209, 203, 203); 608 | } 609 | .site-footer .social-icons { 610 | text-align: right; 611 | } 612 | .site-footer .social-icons a { 613 | width: 40px; 614 | height: 40px; 615 | line-height: 40px; 616 | margin-left: 6px; 617 | margin-right: 0; 618 | border-radius: 100%; 619 | background-color: #fdfdfd; 620 | } 621 | .copyright-text { 622 | margin-top: 10px; 623 | font-family: "Nunito", sans-serif; 624 | } 625 | @media (max-width: 991px) { 626 | .site-footer [class^="col-"] { 627 | margin-bottom: 30px; 628 | } 629 | } 630 | @media (max-width: 767px) { 631 | .site-footer { 632 | padding-bottom: 0; 633 | } 634 | .site-footer .copyright-text, 635 | .site-footer .social-icons { 636 | text-align: center; 637 | } 638 | } 639 | .social-icons { 640 | padding-left: 0; 641 | margin-bottom: 0; 642 | list-style: none; 643 | } 644 | .social-icons li { 645 | display: inline-block; 646 | margin-bottom: 14px; 647 | } 648 | .social-icons li.title { 649 | margin-right: 15px; 650 | text-transform: uppercase; 651 | color: #171718; 652 | font-weight: 700; 653 | font-size: 18px; 654 | } 655 | .social-icons a { 656 | background-color: #eceeef; 657 | color: #1b1b1b; 658 | font-size: 16px; 659 | display: inline-block; 660 | line-height: 44px; 661 | width: 44px; 662 | height: 44px; 663 | text-align: center; 664 | margin-right: 8px; 665 | border-radius: 100%; 666 | -webkit-transition: all 0.2s linear; 667 | -o-transition: all 0.2s linear; 668 | transition: all 0.2s linear; 669 | } 670 | .social-icons a:active, 671 | .social-icons a:focus, 672 | .social-icons a:hover { 673 | color: #fff; 674 | background-color: #29aafe; 675 | } 676 | .social-icons.size-sm a { 677 | line-height: 34px; 678 | height: 34px; 679 | width: 34px; 680 | font-size: 14px; 681 | } 682 | .social-icons a.github:hover { 683 | background-color: #141414; 684 | } 685 | .social-icons a.twitter:hover { 686 | background-color: #00aced; 687 | } 688 | .social-icons a.linkedin:hover { 689 | background-color: #007bb6; 690 | } 691 | .social-icons a.youtube:hover { 692 | background-color: #e60606; 693 | } 694 | .social-icons a.instagram:hover { 695 | background-color: #b8046d; 696 | } 697 | @media (max-width: 767px) { 698 | .social-icons li.title { 699 | display: block; 700 | margin-right: 0; 701 | font-weight: 600; 702 | } 703 | } 704 | @media (max-width: 450px) { 705 | .site-footer p span { 706 | left: 50%; 707 | top: 120%; 708 | } 709 | } 710 | /* Footer */ 711 | 712 | /* footer made with love */ 713 | .site-footer span { 714 | color: rgb(177, 174, 174); 715 | font-size: 1.3rem; 716 | display: block; 717 | position: absolute; 718 | left: 80%; 719 | top: 35%; 720 | transform: translateX(-50%) translateY(-50%); 721 | text-align: center; 722 | font-family: "Nunito", sans-serif; 723 | } 724 | .site-footer span a { 725 | text-decoration: none; 726 | } 727 | .site-footer .fa { 728 | color: #e90606; 729 | margin: 0 0.3rem; 730 | font-size: 1.1rem; 731 | animation: pound 0.35s infinite alternate; 732 | } 733 | @-webkit-keyframes pound { 734 | to { 735 | transform: scale(1.1); 736 | } 737 | } 738 | @keyframes pound { 739 | to { 740 | transform: scale(1.1); 741 | } 742 | } 743 | /* footer made with love */ 744 | 745 | /* scroll top starts */ 746 | #scroll-top { 747 | position: fixed; 748 | top: -140%; 749 | right: 2rem; 750 | padding: 1rem 1.5rem; 751 | font-size: 2rem; 752 | background: #ffae00; 753 | color: rgb(13, 0, 44); 754 | border-radius: 50%; 755 | transition: 0.5s ease-in; 756 | z-index: 1000; 757 | text-decoration: none; 758 | box-shadow: 0 0.2rem 1rem rgba(0, 0, 0, 0.3); 759 | } 760 | #scroll-top.active { 761 | top: calc(100% - 12rem); 762 | } 763 | /* scroll top ends */ 764 | -------------------------------------------------------------------------------- /assets/js/projects.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "WeKeep Notes", 4 | "desc": "We keep notes saver. Stores Notes in LocalStorage. TailwindCSS", 5 | "meta": "wekeep" 6 | }, 7 | { 8 | "name": "Songify Music Player", 9 | "desc": "Music Player with play, pause, playlist and all major features. SASS/SCSS", 10 | "meta": "songify" 11 | }, 12 | { 13 | "name": "Quiz Web App", 14 | "desc": "Simple quiz application. tailwindCSS framework.", 15 | "meta": "quizapp" 16 | }, 17 | { 18 | "name": "Temperature Converter", 19 | "desc": "Temperature converter celsius to kelvin and fahrenhiet live.", 20 | "meta": "tempconvert" 21 | }, 22 | { 23 | "name": "Words Counter", 24 | "desc": "Words and character counter. Live Counter JavaScript Project.", 25 | "meta": "wordcount" 26 | }, 27 | { 28 | "name": "Simple Stopwatch", 29 | "desc": "Simple stopwatch with start, stop and reset features.", 30 | "meta": "stopwatch" 31 | }, 32 | { 33 | "name": "Basic Percentage Calc", 34 | "desc": "Percentage And Grade Calculator Based On The Marks Enter By The User.", 35 | "meta": "percentcalc" 36 | }, 37 | { 38 | "name": "Simple Calculator", 39 | "desc": "Simple Operations Calculator Based On The Two User Inputs.", 40 | "meta": "twonumcalc" 41 | }, 42 | { 43 | "name": "Todo List", 44 | "desc": "Simple Todo List Webapp With Modern UI And Glassmorphism.", 45 | "meta": "todo" 46 | }, 47 | { 48 | "name": "Age Calculator", 49 | "desc": "Calculates The Age Of The User. Wishes Too On Birthday.", 50 | "meta": "agecalc" 51 | }, 52 | { 53 | "name": "Password Generator", 54 | "desc": "A Basic Password Generator As Per The User Selected Criteria.", 55 | "meta": "pwdgen" 56 | }, 57 | { 58 | "name": "Issue Tracker", 59 | "desc": "Assign Issue With The Auto Generated Id By Using ChanceJS. Uses LocalStorage.", 60 | "meta": "issuetracker" 61 | }, 62 | { 63 | "name": "Simple Calculator", 64 | "desc": "A Simple Caculator Built Using JQuery.", 65 | "meta": "basic-calc" 66 | }, 67 | { 68 | "name": "Neomorphism Clock", 69 | "desc": "Basic Neomorphism Clock With Hour, Min, Sec With Light And Dark Mode. Tilt Effect.", 70 | "meta": "neoclock" 71 | } 72 | ] 73 | -------------------------------------------------------------------------------- /assets/js/script.js: -------------------------------------------------------------------------------- 1 | $(document).ready(function () { 2 | 3 | $('#menu').click(function () { 4 | $(this).toggleClass('fa-times'); 5 | $('.navbar').toggleClass('nav-toggle'); 6 | }); 7 | 8 | $(window).on('scroll load', function () { 9 | $('#menu').removeClass('fa-times'); 10 | $('.navbar').removeClass('nav-toggle'); 11 | 12 | if (window.scrollY > 60) { 13 | document.querySelector('#scroll-top').classList.add('active'); 14 | } else { 15 | document.querySelector('#scroll-top').classList.remove('active'); 16 | } 17 | 18 | // scroll spy 19 | $('section').each(function () { 20 | let height = $(this).height(); 21 | let offset = $(this).offset().top - 200; 22 | let top = $(window).scrollTop(); 23 | let id = $(this).attr('id'); 24 | 25 | if (top > offset && top < offset + height) { 26 | $('.navbar ul li a').removeClass('active'); 27 | $('.navbar').find(`[href="#${id}"]`).addClass('active'); 28 | } 29 | }); 30 | }); 31 | 32 | // smooth scrolling 33 | 34 | $('a[href*="#"]').on('click', function (e) { 35 | e.preventDefault(); 36 | $('html, body').animate({ 37 | scrollTop: $($(this).attr('href')).offset().top, 38 | }, 500, 'linear') 39 | }) 40 | }); 41 | 42 | // fetch projects 43 | const projectsContainer = document.getElementById('projects-container'); 44 | let project = ''; 45 | 46 | fetch('./assets/js/projects.json') 47 | .then(res => res.json()) 48 | .then(projects => { 49 | // console.log(projects); 50 | 51 | projects.forEach(proj => { 52 | // console.log(proj); 53 | project += ` 54 |
55 | project 56 |
57 |

${proj.name}

58 |

${proj.desc}

59 |
60 | View 61 | Code 62 |
63 |
64 |
`; 65 | }); 66 | projectsContainer.innerHTML = project; 67 | }); 68 | 69 | 70 | // text animation 71 | var _CONTENT = [ 72 | "Build a JavaScript Calculator.", 73 | "Build a JavaScript Todo List.", 74 | "Build a JavaScript Age Calculator.", 75 | "Build a JavaScript Clock.", 76 | "Build a JavaScript Issue Tracker.", 77 | "Build a Password Generator.", 78 | "Build a JavaScript Weather API.", 79 | "So Let's Get Started!" 80 | ]; 81 | 82 | var _PART = 0; 83 | var _PART_INDEX = 0; 84 | var _INTERVAL_VAL; 85 | var _ELEMENT = document.querySelector("#text"); 86 | var _CURSOR = document.querySelector("#cursor"); 87 | 88 | // typing effect 89 | function Type() { 90 | var text = _CONTENT[_PART].substring(0, _PART_INDEX + 1); 91 | _ELEMENT.innerHTML = text; 92 | _PART_INDEX++; 93 | 94 | if (text === _CONTENT[_PART]) { 95 | // hide the cursor 96 | _CURSOR.style.display = 'none'; 97 | clearInterval(_INTERVAL_VAL); 98 | setTimeout(function () { 99 | _INTERVAL_VAL = setInterval(Delete, 50); 100 | }, 1000); 101 | } 102 | } 103 | 104 | // deleting effect 105 | function Delete() { 106 | var text = _CONTENT[_PART].substring(0, _PART_INDEX - 1); 107 | _ELEMENT.innerHTML = text; 108 | _PART_INDEX--; 109 | 110 | if (text === '') { 111 | clearInterval(_INTERVAL_VAL); 112 | 113 | if (_PART == (_CONTENT.length - 1)) 114 | _PART = 0; 115 | else 116 | _PART++; 117 | 118 | _PART_INDEX = 0; 119 | setTimeout(function () { 120 | _CURSOR.style.display = 'inline-block'; 121 | _INTERVAL_VAL = setInterval(Type, 100); 122 | }, 200); 123 | } 124 | } 125 | _INTERVAL_VAL = setInterval(Type, 100); -------------------------------------------------------------------------------- /assets/projects-img/agecalc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/assets/projects-img/agecalc.png -------------------------------------------------------------------------------- /assets/projects-img/basic-calc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/assets/projects-img/basic-calc.png -------------------------------------------------------------------------------- /assets/projects-img/calc-tilt.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/assets/projects-img/calc-tilt.png -------------------------------------------------------------------------------- /assets/projects-img/color-switcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/assets/projects-img/color-switcher.png -------------------------------------------------------------------------------- /assets/projects-img/counter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/assets/projects-img/counter.png -------------------------------------------------------------------------------- /assets/projects-img/countryapi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/assets/projects-img/countryapi.png -------------------------------------------------------------------------------- /assets/projects-img/digiclock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/assets/projects-img/digiclock.png -------------------------------------------------------------------------------- /assets/projects-img/emoji-flicker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/assets/projects-img/emoji-flicker.png -------------------------------------------------------------------------------- /assets/projects-img/gmap-api.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/assets/projects-img/gmap-api.png -------------------------------------------------------------------------------- /assets/projects-img/issuetracker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/assets/projects-img/issuetracker.png -------------------------------------------------------------------------------- /assets/projects-img/neoclock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/assets/projects-img/neoclock.png -------------------------------------------------------------------------------- /assets/projects-img/percentcalc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/assets/projects-img/percentcalc.png -------------------------------------------------------------------------------- /assets/projects-img/pwdgen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/assets/projects-img/pwdgen.png -------------------------------------------------------------------------------- /assets/projects-img/quizapp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/assets/projects-img/quizapp.png -------------------------------------------------------------------------------- /assets/projects-img/saas-api.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/assets/projects-img/saas-api.png -------------------------------------------------------------------------------- /assets/projects-img/songify.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/assets/projects-img/songify.png -------------------------------------------------------------------------------- /assets/projects-img/stopwatch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/assets/projects-img/stopwatch.png -------------------------------------------------------------------------------- /assets/projects-img/tempconvert.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/assets/projects-img/tempconvert.png -------------------------------------------------------------------------------- /assets/projects-img/todo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/assets/projects-img/todo.png -------------------------------------------------------------------------------- /assets/projects-img/twonumcalc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/assets/projects-img/twonumcalc.png -------------------------------------------------------------------------------- /assets/projects-img/weatherapi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/assets/projects-img/weatherapi.png -------------------------------------------------------------------------------- /assets/projects-img/wekeep.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/assets/projects-img/wekeep.png -------------------------------------------------------------------------------- /assets/projects-img/wordcount.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/assets/projects-img/wordcount.png -------------------------------------------------------------------------------- /assets/site-img/cmsoon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/assets/site-img/cmsoon.png -------------------------------------------------------------------------------- /assets/site-img/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/assets/site-img/favicon.png -------------------------------------------------------------------------------- /assets/site-img/h1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/assets/site-img/h1.png -------------------------------------------------------------------------------- /assets/site-img/hero-bg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/assets/site-img/hero-bg.png -------------------------------------------------------------------------------- /assets/site-img/site-construct.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/assets/site-img/site-construct.png -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | JavaScript Projects | Jigar Sable 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 35 | 36 |
37 | 38 | 39 | 40 |
41 |
42 |

Welcome To JavaScript Projects

43 |
44 |
45 |
46 | get started 47 | 48 | 49 |
50 |
51 | project 52 |
53 |
54 | 55 | 56 | 57 |
58 | 59 |

Overview of projects made using JavaScript

60 | 61 |
62 | 63 | 74 | 75 |
76 |
77 | 78 | 79 | 80 |
81 | 82 |

Simple projects made using JavaScript

83 | 84 |
85 |
86 | project 87 |
88 |

Digital Clock | Live Gradient Changing Effect

89 |

Displays live hour, minutes, seconds and milli-seconds. Gradient Changing effect.

90 |
91 | View 92 | Code 93 |
94 |
95 |
96 | 97 |
98 | project 99 |
100 |

Simple Counter | Modern UI

101 |

It's a basic counter made using increment and decrement functionality. Also it prevents negative values.

102 |
103 | View 104 | Code 105 |
106 |
107 |
108 | 109 |
110 | project 111 |
112 |

Background Color Switcher

113 |

It simply switches the background color as user clicks on the button. Colors stored in array.

114 |
115 | View 116 | Code 117 |
118 |
119 |
120 | 121 |
122 | project 123 |
124 |

Emoji Flicker | Something Lazy Fun

125 |

Flickers the emoji as happy to sad and vice versa as we click on it. Do checkout once.

126 |
127 | View 128 | Code 129 |
130 |
131 |
132 | 133 |
134 |
135 | 136 | 137 | 138 |
139 | 140 |

Projects Based on API

141 | 142 |
143 | 144 |
145 | project 146 |
147 |
148 |

Country Search App

149 |
150 |
151 |

Simple country search app built using HTML, Bootstrap and JavaScript. API Used Rest Countries

152 |
153 | View 154 | Code 155 |
156 |
157 |
158 |
159 | 160 |
161 | project 162 |
163 |
164 |

Live Weather App

165 |
166 |
167 |

It's a simple web page which fetch live weather data of the city entered by the user using open Weather API.

168 |
169 | View 170 | Code 171 |
172 |
173 |
174 |
175 | 176 |
177 | project 178 |
179 |
180 |

Google Map API

181 |
182 |
183 |

It's built using Google map API. Points on single location/coordinates. Uses Google Cloud Platform.

184 |
185 | View 186 | Code 187 |
188 |
189 |
190 |
191 | 192 |
193 | project 194 |
195 |
196 |

Job Finder Website

197 |
198 |
199 |

It fetch dummy JSON data and allow feature to search within the content displayed. It can developed by using live APIs.

200 |
201 | View 202 | Code 203 |
204 |
205 |
206 |
207 | 208 |
209 |
210 | 211 | 212 | 213 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | -------------------------------------------------------------------------------- /mini-projects/bgcolor-switcher/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | BG Color Switch 8 | 9 | 10 | 11 | 12 | 13 | 21 | 22 | -------------------------------------------------------------------------------- /mini-projects/bgcolor-switcher/style.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@300;400&display=swap'); 2 | 3 | body { 4 | margin: 0; 5 | padding: 0; 6 | background: #29ec5a; 7 | box-sizing: border-box; 8 | } 9 | button { 10 | font-size: 2.5rem; 11 | font-family: 'Poppins', sans-serif; 12 | font-weight: 600; 13 | position: absolute; 14 | top: 40%;left: 40%; 15 | padding: 1rem; 16 | border-radius: .5rem; 17 | background: #fff; 18 | border: none; outline: none; 19 | cursor: pointer; 20 | } -------------------------------------------------------------------------------- /mini-projects/digiclock/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Digital Clock | Glowing Effect 6 | 7 | 8 | 9 |
10 |
11 |
12 |
13 |
14 | 43 | 44 | -------------------------------------------------------------------------------- /mini-projects/digiclock/style.css: -------------------------------------------------------------------------------- 1 | *{ 2 | margin: 0; 3 | padding: 0; 4 | font-family: 'Poppins', sans-serif; 5 | } 6 | html,body{ 7 | display: grid; 8 | height: 100%; 9 | place-items: center; 10 | background: #000; 11 | } 12 | .wrapper{ 13 | height: 100px; 14 | width: 420px; 15 | position: relative; 16 | border: 6px solid orange; 17 | border-radius: 10px; 18 | cursor: default; 19 | animation: animate 1.5s linear infinite; 20 | } 21 | .wrapper .display{ 22 | position: absolute; 23 | top: 50%; 24 | left: 50%; 25 | transform: translate(-50%, -50%); 26 | z-index: 999; 27 | height: 85px; 28 | width: 450px; 29 | background: transparent; 30 | border-radius: 6px; 31 | text-align: center; 32 | } 33 | .display #time{ 34 | line-height: 85px; 35 | color: rgb(0, 0, 0); 36 | font-size: 50px; 37 | font-weight: 600; 38 | letter-spacing: 1px; 39 | background: linear-gradient(135deg, #14ffe9, #ffeb3b, #ff00e0); 40 | -webkit-background-clip: text; 41 | -webkit-text-fill-color: transparent; 42 | animation: animate 1.5s linear infinite; 43 | } 44 | @keyframes animate { 45 | 100%{ 46 | filter: hue-rotate(360deg); 47 | } 48 | } -------------------------------------------------------------------------------- /mini-projects/emoji-flicker/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Emoji Flicker 8 | 9 | 10 | 11 |
😔
12 |
😊
13 | 14 | 15 | -------------------------------------------------------------------------------- /mini-projects/emoji-flicker/script.js: -------------------------------------------------------------------------------- 1 | const closeface = document.querySelector('.closed'); 2 | const openface = document.querySelector('.open'); 3 | 4 | //event listener 5 | closeface.addEventListener('click', () => { 6 | if(openface.classList.contains('open')){ 7 | openface.classList.add('active'); 8 | closeface.classList.remove('active'); 9 | } 10 | }); 11 | 12 | openface.addEventListener('click', () => { 13 | if(closeface.classList.contains('closed')){ 14 | closeface.classList.add('active'); 15 | openface.classList.remove('active'); 16 | } 17 | }); -------------------------------------------------------------------------------- /mini-projects/emoji-flicker/style.css: -------------------------------------------------------------------------------- 1 | *{ 2 | padding: 0; 3 | margin: 0; 4 | box-sizing: border-box; 5 | } 6 | 7 | body{ 8 | display: flex; 9 | flex-direction: column; 10 | height: 100vh; 11 | align-items: center; 12 | justify-content: center; 13 | background: linear-gradient(to right, #aa076b, #61045f); 14 | } 15 | .emoji{ 16 | font-size: 20rem; 17 | cursor: pointer; 18 | user-select: none; 19 | } 20 | .closed{ 21 | display: none; 22 | } 23 | .open{ 24 | display: none; 25 | } 26 | .active{ 27 | display: block; 28 | } -------------------------------------------------------------------------------- /mini-projects/simplecounter/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Simple Counter 9 | 10 | 11 | 12 |
13 |

Counter

14 |

0

15 | 16 | 17 |
18 | 19 | 20 | -------------------------------------------------------------------------------- /mini-projects/simplecounter/script.js: -------------------------------------------------------------------------------- 1 | const counter = document.getElementById('counter'); 2 | const incr = document.querySelector('.incr'); 3 | const decr = document.querySelector('.decr'); 4 | 5 | let count = 0; 6 | incr.addEventListener("click", () => { 7 | count++; 8 | counter.innerHTML = count; 9 | }) 10 | decr.addEventListener("click", () => { 11 | if(count<=0){ 12 | count+=1; 13 | } 14 | count--; 15 | counter.innerHTML = count; 16 | }) 17 | -------------------------------------------------------------------------------- /mini-projects/simplecounter/style.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@200;300;400&display=swap'); 2 | 3 | *{ 4 | margin: 0; 5 | padding: 0; 6 | box-sizing: border-box; 7 | } 8 | body{ 9 | display: flex; 10 | justify-content: center; 11 | align-items: center; 12 | height: 100vh; 13 | background: linear-gradient(to right, #fc00ff, #00dbde); 14 | } 15 | .container { 16 | width: 150px; 17 | height: 150px; 18 | background: #ffd000; 19 | color: rgb(0, 0, 0); 20 | display: flex; 21 | justify-content: center; 22 | align-items: center; 23 | flex-direction: column; 24 | position: relative; 25 | border-radius: 15px; 26 | box-shadow: 0 10px 15px rgba(0,0,0,.6); 27 | } 28 | .counter{ 29 | font-size: 4rem; 30 | } 31 | .heading{ 32 | font-family: 'Poppins', sans-serif; 33 | font-size: 1.5rem; 34 | } 35 | button{ 36 | width: 40px; 37 | height: 40px; 38 | position: absolute; 39 | cursor: pointer; 40 | font-size: 1.2em; 41 | background: #fff; 42 | color: rgb(34,34,34); 43 | border: none; 44 | border-radius: 50%; 45 | box-shadow: 0 0 10px rgb(51,51,51,0.158); 46 | } 47 | .decr{ 48 | left: -15%; 49 | top: 40%; 50 | } 51 | .incr{ 52 | top: 40%; 53 | right: -15%; 54 | } -------------------------------------------------------------------------------- /projects/agecalc/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | Age Calculator | JavaScript Projects 10 | 11 | 12 |
13 | 14 |
15 |
16 |

Age Calculator

17 |
18 | 19 | 20 |
21 |
22 |
23 | 24 | - 25 | 26 |

27 | Years 28 |

29 |
30 |
31 | 32 | - 33 | 34 |

35 | Months 36 |

37 |
38 |
39 | 40 | - 41 | 42 |

43 | Days 44 |

45 |
46 |
47 |
48 |

🎂 🎊 Happy Birthday To You! 🎉 🎉

49 |
50 |
51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /projects/agecalc/script.js: -------------------------------------------------------------------------------- 1 | const months = [31,28,31,30,31,30,31,31,30,31,30,31]; 2 | 3 | function ageCalc(){ 4 | let today = new Date(); 5 | let inputDate = new Date(document.getElementById("input-date").value); 6 | let ageMonth,ageDays,ageYear; 7 | let birthDetails = { 8 | date:inputDate.getDate(), 9 | month:inputDate.getMonth()+1, 10 | year:inputDate.getFullYear() 11 | } 12 | let currYear = today.getFullYear(); 13 | let currMonth = today.getMonth()+1; 14 | let currDate = today.getDate(); 15 | 16 | leapCheck(currYear); 17 | 18 | if( birthDetails.year > currYear || 19 | (birthDetails.month > currMonth && birthDetails.year == currYear) || 20 | (birthDetails.date > currDate && birthDetails.month == currMonth && birthDetails.year == currYear) 21 | ){ 22 | alert("Not Born Yet!!"); 23 | displayResult("-","-","-"); 24 | return; 25 | } 26 | 27 | ageYear = currYear - birthDetails.year; 28 | 29 | if(currMonth >= birthDetails.month){ 30 | ageMonth = currMonth - birthDetails.month; 31 | } 32 | else{ 33 | ageYear--; 34 | ageMonth = 12 + currMonth - birthDetails.month; 35 | } 36 | 37 | if(currDate >= birthDetails.date){ 38 | ageDays = currDate - birthDetails.date; 39 | } 40 | else{ 41 | ageMonth--; 42 | let days = months[currMonth - 2]; 43 | ageDays = days + currDate - birthDetails.date; 44 | if(ageMonth < 0){ 45 | ageMonth = 11; 46 | ageYear--; 47 | } 48 | } 49 | displayResult(ageDays,ageMonth,ageYear); 50 | 51 | // current date is birthdate 52 | if((birthDetails.month == currMonth && 53 | birthDetails.date == currDate)){ 54 | document.getElementById('wishmsg').style.display = 'block'; 55 | } else { 56 | document.getElementById('wishmsg').style.display = 'none'; 57 | } 58 | } 59 | 60 | function displayResult(bDate,bMonth,bYear){ 61 | document.getElementById("years").textContent = bYear; 62 | document.getElementById("months").textContent = bMonth; 63 | document.getElementById("days").textContent = bDate; 64 | } 65 | 66 | // leap year checker 67 | function leapCheck(year){ 68 | if(year % 4 == 0 || (year % 100 == 0 && year % 400 == 0)){ 69 | months[1] = 29; 70 | } 71 | else{ 72 | months[1] = 28; 73 | } 74 | } -------------------------------------------------------------------------------- /projects/agecalc/style.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@200;300;400;500;600;700&display=swap'); 2 | 3 | *{ 4 | margin: 0; 5 | padding: 0; 6 | box-sizing: border-box; 7 | } 8 | body{ 9 | width: 100%; 10 | height: 100vh; 11 | background: linear-gradient(to right, #8e2de2, #4a00e0); 12 | font-size: 62.5%; 13 | overflow: hidden; 14 | } 15 | .container { 16 | background: rgba(255, 255, 255, 0.40); 17 | transform-style: preserve-3d; 18 | transition: .3s; 19 | box-shadow: 0 15px 35px rgba(0, 0, 0, 0.6); 20 | max-width: 30rem; 21 | width: 100%; 22 | margin: 8rem auto; 23 | padding: 1rem 2rem 1rem 2rem; 24 | border-radius: .5rem; 25 | box-shadow: 0px 10px 15px rgba(0,0,0,0.1); 26 | } 27 | .container *{ 28 | border: none; 29 | outline: none; 30 | font-family: 'Poppins', sans-serif; 31 | } 32 | h3{ 33 | font-size: 1.5rem; 34 | text-align: center; 35 | margin-bottom: 1rem; 36 | } 37 | .input-wrapper{ 38 | background: rgb(252, 45, 45); 39 | padding: 2rem 1.5rem; 40 | border-radius: .5rem; 41 | box-shadow: 0 15px 20px rgba(0, 0, 0, 0.3); 42 | margin-bottom: 50px; 43 | } 44 | input { 45 | height: 3rem; 46 | background: #fff; 47 | color: #000; 48 | font-weight: 500; 49 | border-radius: .4rem; 50 | width: 60%; 51 | padding: 0 1.5rem; 52 | font-size: 1rem; 53 | } 54 | button{ 55 | width: 30%; 56 | float: right; 57 | cursor: pointer; 58 | height: 3rem; 59 | background: #fff; 60 | color: #000; 61 | font-weight: 600; 62 | border-radius: .4rem; 63 | transition: .3s; 64 | display: inline-block; 65 | } 66 | button:hover{ 67 | background: rgb(253, 253, 0); 68 | } 69 | button span { 70 | cursor: pointer; 71 | display: inline-block; 72 | position: relative; 73 | transition: 0.5s; 74 | } 75 | button span:after { 76 | content: '\00bb'; 77 | position: absolute; 78 | opacity: 0; 79 | top: -9px; 80 | font-size: 24px; 81 | right: -10px; 82 | transition: 0.5s; 83 | } 84 | button:hover span { 85 | padding-right: 15px; 86 | } 87 | button:hover span:after { 88 | opacity: 1; 89 | right: 0; 90 | } 91 | 92 | .output-wrapper { 93 | width: 100%; 94 | display: flex; 95 | justify-content: space-between; 96 | margin-bottom: 1.5rem; 97 | } 98 | .output-wrapper div{ 99 | height: 6rem; 100 | width: 6rem; 101 | background: rgb(252, 34, 34); 102 | border-radius: 0.5rem; 103 | color: #fff; 104 | display: grid; 105 | place-items: center; 106 | padding: 1rem 0; 107 | box-shadow: 0 15px 20px rgba(0, 0, 0, 0.3); 108 | } 109 | .details span{ 110 | font-size: 2rem; 111 | font-weight: 500; 112 | } 113 | .details p{ 114 | font-size: 0.8rem; 115 | color: rgb(0, 0, 0); 116 | font-weight: 400; 117 | } 118 | #wishmsg{ 119 | color: rgb(0, 0, 0); 120 | display: none; 121 | font-family: 'Lobster Two', cursive; 122 | } 123 | 124 | .backbtn { 125 | position: absolute; 126 | font-size: 2rem; 127 | float: left; 128 | cursor: pointer; 129 | top: 3rem; 130 | margin-left: 10rem; 131 | color:rgb(255, 255, 255); 132 | } 133 | .backbtn a{ 134 | text-decoration: none; 135 | color: inherit; 136 | } -------------------------------------------------------------------------------- /projects/basic-calc/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Basic Calculator | JavaScript jQuery 8 | 9 | 10 | 11 | 12 |
13 |

Calculator

14 |
15 | 16 |
17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 |
29 | 30 | 31 | 32 |
33 | 34 |
35 |
36 |
37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /projects/basic-calc/script.js: -------------------------------------------------------------------------------- 1 | $(document).ready(function () { 2 | $('#one').click(function () { 3 | document.forms.display.value += 1; 4 | }); 5 | $('#two').click(function () { 6 | document.forms.display.value += 2; 7 | }); 8 | $('#three').click(function () { 9 | document.forms.display.value += 3; 10 | }); 11 | $('#four').click(function () { 12 | document.forms.display.value += 4; 13 | }); 14 | $('#five').click(function () { 15 | document.forms.display.value += 5; 16 | }); 17 | $('#six').click(function () { 18 | document.forms.display.value += 6; 19 | }); 20 | $('#seven').click(function () { 21 | document.forms.display.value += 7; 22 | }); 23 | $('#eight').click(function () { 24 | document.forms.display.value += 8; 25 | }); 26 | $('#nine').click(function () { 27 | document.forms.display.value += 9; 28 | }); 29 | $('#zero').click(function () { 30 | document.forms.display.value += 0; 31 | }); 32 | $('#add').click(function () { 33 | document.forms.display.value += '+'; 34 | }); 35 | $('#subs').click(function () { 36 | document.forms.display.value += '-'; 37 | }); 38 | $('#multi').click(function () { 39 | document.forms.display.value += '*'; 40 | }); 41 | $('#divide').click(function () { 42 | document.forms.display.value += '/'; 43 | }); 44 | $('#dot').click(function () { 45 | document.forms.display.value += '.'; 46 | }); 47 | $('#equal').click(function () { 48 | if (display.value == "") { 49 | alert("Enter numbers to calculate!"); 50 | } else { 51 | document.forms.display.value = 52 | eval(document.forms.display.value); 53 | } 54 | }); 55 | $('#clear').click(function () { 56 | document.forms.display.value = ""; 57 | }); 58 | }) -------------------------------------------------------------------------------- /projects/basic-calc/style.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Nunito&family=Poppins:wght@300&display=swap'); 2 | 3 | * { 4 | margin: 0; 5 | padding: 0; 6 | outline: none; 7 | box-sizing: border-box; 8 | } 9 | body { 10 | font-family: 'Nutino', sans-serif; 11 | display: flex; 12 | text-align: center; 13 | justify-content: center; 14 | align-items: center; 15 | min-height: 100vh; 16 | background: linear-gradient(to right, #8e2de2, #4a00e0); 17 | overflow: hidden; 18 | } 19 | .container { 20 | background: rgba(190, 183, 183, 0.4); 21 | transform-style: preserve-3d; 22 | transition: .3s; 23 | box-shadow: 0 15px 35px rgba(0, 0, 0, 0.6); 24 | max-width: 23rem; 25 | width: 100%; 26 | margin: 0 auto; 27 | padding: 1rem 2rem; 28 | border-radius: .5rem; 29 | } 30 | .container h2{ 31 | color: rgb(255, 255, 255); 32 | font-size: 2rem; 33 | } 34 | input[type="text"] { 35 | height: 60px; 36 | width: 300px; 37 | margin: 0 auto; 38 | margin-top: 15px; 39 | border-radius: 10px; 40 | border: none; 41 | color: rgb(12, 12, 12); 42 | font-size: 22px; 43 | font-weight: bold; 44 | text-align: right; 45 | padding-right: 20px; 46 | outline: none; 47 | background: #fff; 48 | box-shadow: 0 15px 10px rgba(0, 0, 0, 0.2); 49 | } 50 | form .btns { 51 | width: 300px; 52 | margin: 0 auto; 53 | margin-top: 20px; 54 | } 55 | input[type="button"] { 56 | width: 58px; 57 | height: 55px; 58 | margin: 5px; 59 | font-size: 22px; 60 | font-weight: bold; 61 | border-radius: 6px; 62 | border: none; 63 | background: #fdfdfd; 64 | box-shadow: 0 15px 10px rgba(0, 0, 0, 0.2); 65 | cursor: pointer; 66 | margin-bottom: 10px; 67 | } 68 | input[type="button"]:hover { 69 | transition: 0.5s; 70 | background: linear-gradient(#b8df0b, #18e65d); 71 | } 72 | input#clear { 73 | background: #e20404; 74 | border: none; 75 | transition: .2s; 76 | color: white; 77 | } 78 | input#clear:hover{ 79 | transform: scale(1.05); 80 | background: #bd0303; 81 | } 82 | input#equal { 83 | width: 275px; 84 | margin: 10px 0 10px 0; 85 | font-size: 30px; 86 | color: white; 87 | background: #ff7c01; 88 | border: none; 89 | transition: all .2s; 90 | } 91 | input#equal:hover{ 92 | transform: scale(1.05); 93 | background: #df6d03; 94 | } 95 | 96 | @media (max-width:360px){ 97 | .container{ 98 | width: 20rem; 99 | padding: .5rem; 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /projects/issuetracker/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | JavaScript Issue Tracker | JS Projects 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 |
18 |
19 |

JavaScript Issue Tracker

20 |
21 |

Add New Issue :

22 |
23 |
24 | 25 | 26 |
27 |
28 | 29 | 34 |
35 |
36 | 37 | 38 |
39 | 40 | 41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /projects/issuetracker/script.js: -------------------------------------------------------------------------------- 1 | document.getElementById('issueInputForm').addEventListener('submit', saveIssue); 2 | 3 | function fetchIssues () { 4 | var issues = JSON.parse(localStorage.getItem('issues')); 5 | var issuesList = document.getElementById('issuesList'); 6 | 7 | issuesList.innerHTML = ''; 8 | 9 | for (var i = 0; i < issues.length; i++) { 10 | var id = issues[i].id; 11 | var desc = issues[i].description; 12 | var severity = issues[i].severity; 13 | var assignedTo = issues[i].assignedTo; 14 | var status = issues[i].status; 15 | 16 | issuesList.innerHTML += '
'+ 17 | '

' + status + '

'+ 18 | '
Issue ID: ' + id + '
'+ 19 | '

' + desc + '

'+ 20 | '

' + severity + ' '+ 21 | ' ' + assignedTo + '

'+ 22 | ' Close '+ 23 | ' Delete'+ 24 | '
'; 25 | } 26 | } 27 | 28 | 29 | function saveIssue(e) { 30 | var issueId = chance.guid(); 31 | var issueDesc = document.getElementById('issueDescInput').value; 32 | var issueSeverity = document.getElementById('issueSeverityInput').value; 33 | var issueAssignedTo = document.getElementById('issueAssignedToInput').value; 34 | var issueStatus = 'Open'; 35 | var issue = { 36 | id: issueId, 37 | description: issueDesc, 38 | severity: issueSeverity, 39 | assignedTo: issueAssignedTo, 40 | status: issueStatus 41 | } 42 | 43 | if (localStorage.getItem('issues') === null) { 44 | var issues = []; 45 | issues.push(issue); 46 | localStorage.setItem('issues', JSON.stringify(issues)); 47 | } else { 48 | var issues = JSON.parse(localStorage.getItem('issues')); 49 | issues.push(issue); 50 | localStorage.setItem('issues', JSON.stringify(issues)); 51 | } 52 | 53 | document.getElementById('issueInputForm').reset(); 54 | fetchIssues(); 55 | e.preventDefault(); 56 | } 57 | 58 | // close status 59 | function setStatusClosed (id) { 60 | var issues = JSON.parse(localStorage.getItem('issues')); 61 | 62 | for(var i = 0; i < issues.length; i++) { 63 | if (issues[i].id == id) { 64 | issues[i].status = "Closed"; 65 | } 66 | } 67 | 68 | localStorage.setItem('issues', JSON.stringify(issues)); 69 | fetchIssues(); 70 | } 71 | 72 | // delete issue 73 | function deleteIssue (id) { 74 | var issues = JSON.parse(localStorage.getItem('issues')); 75 | 76 | for(var i = 0; i < issues.length; i++) { 77 | if (issues[i].id == id) { 78 | issues.splice(i, 1); 79 | } 80 | } 81 | localStorage.setItem('issues', JSON.stringify(issues)); 82 | fetchIssues(); 83 | } 84 | 85 | //clear all issues 86 | // function clearall () { 87 | // var issues = JSON.parse(localStorage.getItem('issues')); 88 | // issues=[]; 89 | // localStorage.setItem('issues', JSON.stringify(issues)); 90 | // fetchIssues(); 91 | // } 92 | 93 | // Work in progress -------------------------------------------------------------------------------- /projects/issuetracker/style.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@200;300;400;500;600;700&display=swap'); 2 | @import url('https://fonts.googleapis.com/css2?family=Roboto+Mono:wght@200;300;400&display=swap'); 3 | 4 | *{ 5 | padding: 0; 6 | margin: 0; 7 | box-sizing: border-box; 8 | } 9 | html{ 10 | font-size: 62.5%; 11 | } 12 | body{ 13 | background: linear-gradient(to right, #da22ff, #9733ee); 14 | font-family: 'Poppins', sans-serif; 15 | color: #000; 16 | } 17 | h1{ 18 | text-align: center; 19 | } 20 | .jumbotron { 21 | background: rgba(255, 255, 255, 0.40); 22 | transform-style: preserve-3d; 23 | transition: .3s; 24 | box-shadow: 0 15px 35px rgba(0, 0, 0, 0.6); 25 | max-width: 60rem; 26 | width: 100%; 27 | margin: 2rem auto; 28 | padding: 1.5rem; 29 | border-radius: .5rem; 30 | box-shadow: 0px 10px 15px rgba(0,0,0,0.1); 31 | } 32 | .well{ 33 | background: rgb(248, 248, 248); 34 | max-width: 60rem; 35 | width: 100%; 36 | margin: 1rem auto; 37 | padding: 1.5rem; 38 | border-radius: .5rem; 39 | border: none; 40 | box-shadow: 0px 10px 15px rgba(0,0,0,0.2); 41 | } 42 | #savebtn{ 43 | font-size: 1.5rem; 44 | background: #0730e9; 45 | outline: none; 46 | border: none; 47 | } 48 | #savebtn:hover{ 49 | background: #0423ad; 50 | } 51 | #clrbtn{ 52 | font-size: 1.5rem; 53 | background: #b90404; 54 | outline: none; 55 | float: right; 56 | border: none; 57 | } 58 | #clrbtn:hover{ 59 | background: #b40404; 60 | } 61 | 62 | 63 | 64 | /* issue list */ 65 | .labid{ 66 | display: flex; 67 | gap: 1rem; 68 | font-family: 'Roboto Mono', monospace; 69 | border-bottom: 1px solid #333; 70 | } 71 | .labid span{ 72 | background: rgb(255, 94, 0); 73 | color: rgb(255, 255, 255); 74 | } 75 | .labid h6{ 76 | margin-top: 5px; 77 | } 78 | .well p glyphicon-user{ 79 | margin-left: 1rem; 80 | padding: 5rem; 81 | } 82 | .well #closebtn{ 83 | background: rgb(4, 161, 38); 84 | outline: none; 85 | border: none; 86 | } 87 | .well #closebtn:hover{ 88 | background: rgb(3, 119, 28); 89 | } 90 | .well #delbtn{ 91 | background: rgb(219, 4, 4); 92 | outline: none; 93 | border: none; 94 | } 95 | .well #delbtn:hover{ 96 | background: rgb(173, 2, 2); 97 | } 98 | 99 | 100 | /* back button */ 101 | .backbtn { 102 | position: absolute; 103 | font-size: 3rem; 104 | float: left; 105 | cursor: pointer; 106 | margin-top: 2rem; 107 | margin-left: 13rem; 108 | color:rgb(255, 255, 255); 109 | } 110 | .backbtn a{ 111 | text-decoration: none; 112 | color: inherit; 113 | } -------------------------------------------------------------------------------- /projects/neoclock/clock.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/projects/neoclock/clock.png -------------------------------------------------------------------------------- /projects/neoclock/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Neomorphism Clock | Tilt JS 9 | 10 | 11 | 12 |
13 | 14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /projects/neoclock/script.js: -------------------------------------------------------------------------------- 1 | function toggleClass(){ 2 | const body = document.querySelector('body') 3 | body.classList.toggle('light'); 4 | } 5 | 6 | const deg = 6; 7 | const hr = document.querySelector('#hr'); 8 | const mn = document.querySelector('#mn'); 9 | const sc = document.querySelector('#sc'); 10 | 11 | setInterval(() => { 12 | let day = new Date(); 13 | let hh = day.getHours()*30; 14 | let mm = day.getMinutes()*deg; 15 | let ss = day.getSeconds()*deg; 16 | 17 | hr.style.transform = `rotateZ(${(hh)+(mm/12)}deg)`; 18 | mn.style.transform = `rotateZ(${mm}deg)`; 19 | sc.style.transform = `rotateZ(${ss}deg)`; 20 | }) 21 | 22 | VanillaTilt.init(document.querySelectorAll(".tilt"), { 23 | max: 20, 24 | scale: 1.1 25 | }); 26 | 27 | -------------------------------------------------------------------------------- /projects/neoclock/style.css: -------------------------------------------------------------------------------- 1 | *{ 2 | margin: 0; 3 | padding: 0; 4 | box-sizing: border-box; 5 | } 6 | body{ 7 | display: flex; 8 | justify-content: center; 9 | align-items: center; 10 | min-height: 100vh; 11 | background: #091921; 12 | } 13 | body.light{ 14 | background: #d1dae3; 15 | } 16 | .clock{ 17 | width: 400px; 18 | height: 397px; 19 | display: flex; 20 | justify-content: center; 21 | align-items: center; 22 | border: 4px solid #091921; 23 | background-size: cover; 24 | border-radius: 50%; 25 | background: #091921 url(./clock.png); 26 | box-shadow: 0 -15px 15px rgba(255, 255, 255, 0.05), 27 | inset 0 -15px 15px rgba(255, 255, 255, 0.05), 28 | 0 15px 15px rgba(0,0,0,0.3), 29 | inset 0 15px 15px rgba(0,0,0,0.3); 30 | cursor: pointer; 31 | } 32 | body.light .clock{ 33 | background: #d1dae3 url(./clock.png); 34 | background-size: cover; 35 | border: 4px solid #cad3dc; 36 | box-shadow: -8px -8px 15px rgba(255, 255, 255, 0.5), 37 | 10px 10px 10px rgba(0, 0, 0, 0.5), 38 | inset -8px -8px 15px rgba(255,255,255,0.1), 39 | inset 10px 10px 10px rgba(0,0,0,0.1); 40 | } 41 | .clock::before{ 42 | content: ''; 43 | position: absolute; 44 | width: 15px; 45 | height: 15px; 46 | background: #fff; 47 | border-radius: 50%; 48 | z-index: 100000; 49 | } 50 | body.light .clock::before{ 51 | background: #008eff; 52 | } 53 | .clock .hour, .clock .min, .clock .sec{ 54 | position: absolute; 55 | } 56 | .clock .hour, .hr{ 57 | width: 160px; 58 | height: 160px; 59 | } 60 | .clock .min{ 61 | width: 190px; 62 | height: 190px; 63 | } 64 | .clock .sec{ 65 | width: 230px; 66 | height: 230px; 67 | } 68 | .clock .millisec{ 69 | width: 280px; 70 | height: 280px; 71 | } 72 | .hr, .min , .sec, .millisec{ 73 | display: flex; 74 | justify-content: center; 75 | position: absolute; 76 | border-radius: 50%; 77 | } 78 | .hr:before{ 79 | content: ''; 80 | position: absolute; 81 | width: 8px; 82 | height: 80px; 83 | background: #ff105e; 84 | z-index: 10; 85 | border-radius: 6px 6px 0 0; 86 | } 87 | .mn:before{ 88 | content: ''; 89 | position: absolute; 90 | width: 4px; 91 | height: 90px; 92 | background: #fff; 93 | z-index: 11; 94 | border-radius: 6px 6px 0 0; 95 | } 96 | .sc:before{ 97 | content: ''; 98 | position: absolute; 99 | width: 2px; 100 | height: 150px; 101 | background: rgb(13, 54, 235); 102 | z-index: 12; 103 | border-radius: 6px 6px 0 0; 104 | } 105 | .toggleClass{ 106 | position: absolute; 107 | top: 30px; 108 | right: 150px; 109 | width: 20px; 110 | height: 20px; 111 | font-size: 18px; 112 | border-radius: 50%; 113 | background: #d1dae3; 114 | color: #d1dae3; 115 | font-family: consolas, sans-serif; 116 | cursor: pointer; 117 | transition: 0.5s; 118 | display: flex; 119 | align-items: center; 120 | } 121 | .toggleClass:before{ 122 | position: absolute; 123 | content: 'Light Mode'; 124 | left: 25px; 125 | white-space: nowrap; 126 | } 127 | body.light .toggleClass{ 128 | background: #091921; 129 | color: #091921; 130 | } 131 | body.light .toggleClass:before{ 132 | content: 'Dark Mode'; 133 | left: 25px; 134 | white-space: nowrap; 135 | } 136 | .backbtn { 137 | position: absolute; 138 | font-size: 2rem; 139 | left: 2rem; 140 | top: 2.5rem; 141 | margin-left: 6rem; 142 | cursor: pointer; 143 | color:#fff; 144 | } 145 | .backbtn a{ 146 | text-decoration: none; 147 | color: #fff; 148 | } -------------------------------------------------------------------------------- /projects/percentcalc/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 |
13 | 14 |
15 |
16 |
17 |
18 |
19 |
20 | Student Grade Calcy 21 |
22 |
23 |
24 |
25 |
26 | 27 |
28 |
29 | 30 |
31 |
32 | 33 |
34 |
35 | 36 |
37 |
38 | 39 |
40 | 45 |
46 |
47 | 48 |
49 |
50 |

51 |
52 |
53 |
54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /projects/percentcalc/script.js: -------------------------------------------------------------------------------- 1 | const calc = () =>{ 2 | let phy = document.getElementById('phy').value; 3 | let chem = document.getElementById('chem').value; 4 | let maths = document.getElementById('math').value; 5 | let cs = document.getElementById('cs').value; 6 | let eng = document.getElementById('eng').value; 7 | let grade = ""; 8 | 9 | let totalGrade = parseFloat(phy) + parseFloat(chem) + parseFloat(maths) + parseFloat(cs) + parseFloat(eng); 10 | let percent = (totalGrade/500) * 100; 11 | 12 | if(percent <= 100 && percent >= 80){ 13 | grade = 'A'; 14 | }else if(percent <= 79 && percent >= 60){ 15 | grade = 'B'; 16 | }else if(percent <= 59 && percent >= 40){ 17 | grade = 'C'; 18 | }else{ 19 | grade = 'F'; 20 | } 21 | 22 | if(percent >= 39.5){ 23 | document.getElementById('result').innerHTML = `Total Marks Out of 500 : ${totalGrade}
Percentage : ${percent}%
Grade : ${grade} (You are Pass) ` 24 | } 25 | else{ 26 | document.getElementById('result').innerHTML = `Total Marks Out of 500 : ${totalGrade}
Percentage : ${percent}%
Grade : ${grade} (You are Fail) ` 27 | } 28 | } -------------------------------------------------------------------------------- /projects/percentcalc/style.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@300;400&display=swap'); 2 | 3 | body { 4 | background: linear-gradient(to right, #da22ff, #9733ee);; 5 | font-size: 62.5%; 6 | overflow: hidden; 7 | } 8 | body, button, input { 9 | font-family: 'Poppins', sans-serif; 10 | font-weight: 700; 11 | letter-spacing: .1rem; 12 | } 13 | .background { 14 | display: flex; 15 | min-height: 100vh; 16 | } 17 | .backbtn { 18 | position: absolute; 19 | font-size: 2rem; 20 | float: left; 21 | cursor: pointer; 22 | margin-top: 1.5rem; 23 | margin-left: 10rem; 24 | color:#fff; 25 | } 26 | .backbtn a{ 27 | text-decoration: none; 28 | color: inherit; 29 | } 30 | .container { 31 | flex: 0 1 30rem; 32 | margin: auto; 33 | padding: 1rem; 34 | } 35 | .screen { 36 | position: relative; 37 | border-radius: 1rem; 38 | background: rgba(0, 0, 0, 0.7); 39 | transform-style: preserve-3d; 40 | transition: .1s; 41 | box-shadow: 0 15px 35px rgba(0, 0, 0, 0.5); 42 | } 43 | .screen-body { 44 | display: block; 45 | } 46 | .form-body { 47 | flex: 1; 48 | padding: 2rem; 49 | } 50 | .title { 51 | justify-content: center; 52 | align-items: center; 53 | color: #ffee04; 54 | font-size: 2rem; 55 | padding: 1.5rem; 56 | text-transform: uppercase; 57 | display: flex; 58 | } 59 | .inputs { 60 | margin-bottom: 1rem; 61 | } 62 | input { 63 | padding: 10px 0; 64 | background: none; 65 | border: none; 66 | border-bottom: 1px solid rgb(199, 198, 198); 67 | color: rgb(252, 252, 252); 68 | font-size: .9rem; 69 | text-transform: uppercase; 70 | outline: none; 71 | transition: border-color .2s; 72 | width: 100%; 73 | } 74 | input::placeholder { 75 | color: rgb(230, 227, 227); 76 | } 77 | input:focus { 78 | border-bottom-color: rgb(235, 233, 233); 79 | } 80 | .result{ 81 | color: rgb(255, 255, 255); 82 | font-size: 1rem; 83 | padding-bottom: .2rem; 84 | margin-left: 1rem; 85 | text-align: left; 86 | } 87 | .form-btn{ 88 | margin-top: 2rem; 89 | text-align: center; 90 | } 91 | .btn { 92 | line-height: 0; 93 | padding: 1rem 1rem; 94 | border-radius: .5rem; 95 | transition: 0.5s; 96 | color: #fff; 97 | cursor: pointer; 98 | background: #e41919; 99 | } 100 | .btn span { 101 | font-weight: 600; 102 | font-size: 1rem; 103 | } 104 | .btn i { 105 | margin-left: 0.2rem; 106 | font-size: .8rem; 107 | transition: 0.3s; 108 | } 109 | .btn:hover i { 110 | transform: translateX(5px); 111 | } -------------------------------------------------------------------------------- /projects/pwdgen/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Password Generator 9 | 10 | 11 | 12 |
13 | 14 |
15 |
16 |

Password Generator

17 |
18 | 19 | 22 |
23 |
24 |
25 | 26 | 27 |
28 |
29 | 30 | 31 |
32 |
33 | 34 | 35 |
36 |
37 | 38 | 39 |
40 |
41 | 42 | 43 |
44 | 45 |
46 |
47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /projects/pwdgen/script.js: -------------------------------------------------------------------------------- 1 | const empty = ""; 2 | const uCase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 3 | const lCase = "abcdefghijklmnopqrstuvwxyz"; 4 | const number = "0123456789"; 5 | const symbol = "!@#$%^&*=-_"; 6 | 7 | const pLength = document.getElementById('plength'); 8 | const upperCase = document.getElementById('puppercase'); 9 | const lowerCase = document.getElementById('plowercase'); 10 | const pNumber = document.getElementById('pnumber'); 11 | const pSymbol = document.getElementById('psymbol'); 12 | const submit = document.getElementById('submit'); 13 | const password = document.getElementById('pwd'); 14 | 15 | submit.addEventListener('click', ()=>{ 16 | let initPwd = empty; 17 | (upperCase.checked) ? initPwd += uCase : ""; 18 | (lowerCase.checked) ? initPwd += lCase : ""; 19 | (pNumber.checked) ? initPwd += number : ""; 20 | (pSymbol.checked) ? initPwd += symbol : ""; 21 | 22 | password.value = generatePwd(pLength.value,initPwd); 23 | }); 24 | 25 | function generatePwd(l, initPwd){ 26 | let pass = ""; 27 | for (let i=0;i { 36 | if(password.value == ""){ 37 | alert("Please generate a password!"); 38 | }else{ 39 | password.select(); 40 | document.execCommand("copy"); 41 | alert("Password has been copied to clipboard."); 42 | } 43 | }); -------------------------------------------------------------------------------- /projects/pwdgen/style.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500&display=swap'); 2 | @import url('https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500&display=swap'); 3 | @import url('https://fonts.googleapis.com/css2?family=Nunito:wght@200;300;400;600;700&display=swap'); 4 | 5 | *{ 6 | padding: 0; 7 | margin: 0; 8 | box-sizing: border-box; 9 | } 10 | body{ 11 | background-image: linear-gradient(-225deg, #AC32E4 0%, #7918F2 48%, #4801FF 100%); 12 | display: flex; 13 | justify-content: center; 14 | font-family: 'Roboto', sans-serif; 15 | align-items: center; 16 | height: 100vh; 17 | } 18 | 19 | .container{ 20 | background: linear-gradient(#FF4331, #D31A50); 21 | padding: 20px; 22 | border-radius: 5px; 23 | width: 350px; 24 | } 25 | h1{ 26 | font-size: 30px; 27 | letter-spacing: 1px; 28 | color: #fff; 29 | text-align: center; 30 | margin-bottom: 10px; 31 | } 32 | .form-control{ 33 | display: flex; 34 | justify-content: space-between; 35 | align-items: center; 36 | padding: 10px 0; 37 | color: #fff; 38 | border-bottom: 1px solid #eee; 39 | } 40 | .form-control label{ 41 | cursor: pointer; 42 | } 43 | .header{ 44 | position: relative; 45 | } 46 | .header input{ 47 | width: 100%; 48 | height: 100%; 49 | background: rgb(68, 68, 68); 50 | padding: 14px; 51 | color: #fff; 52 | outline: none; 53 | border: none; 54 | border-radius: 4px; 55 | font-size: 16px; 56 | } 57 | 58 | .header button, 59 | .form-control input[type=number]{ 60 | padding: 3px 5px; 61 | background-color: #eee; 62 | outline: none; 63 | border: none; 64 | border-radius: 3px; 65 | } 66 | .header button{ 67 | position: absolute; 68 | padding: 11px; 69 | font-size: 21px; 70 | right: 0; 71 | cursor: pointer; 72 | color: rgb(41, 41, 41); 73 | } 74 | #submit{ 75 | width: 100%; 76 | padding: 15px; 77 | margin-top: 10px; 78 | background: #222222; 79 | font-size: 18px; 80 | font-family: 'Nunito', sans-serif; 81 | font-weight: 600; 82 | outline: none;border: none; 83 | border-radius: 3px; 84 | color: #fff; 85 | cursor: pointer; 86 | transition: .3s; 87 | display: inline-block; 88 | } 89 | #submit:hover{ 90 | background: rgb(51, 51, 51); 91 | } 92 | #submit span { 93 | cursor: pointer; 94 | display: inline-block; 95 | position: relative; 96 | transition: 0.5s; 97 | } 98 | #submit span:after { 99 | content: '\00bb'; 100 | position: absolute; 101 | opacity: 0; 102 | top: -8px; 103 | font-size: 28px; 104 | right: -20px; 105 | transition: 0.5s; 106 | } 107 | #submit:hover span { 108 | padding-right: 25px; 109 | } 110 | #submit:hover span:after { 111 | opacity: 1; 112 | right: 0; 113 | } 114 | 115 | 116 | .backbtn { 117 | position: absolute; 118 | font-size: 2rem; 119 | float: left; 120 | cursor: pointer; 121 | top: 3rem; 122 | left: 8rem; 123 | } 124 | .backbtn a{ 125 | text-decoration: none; 126 | color: #fff; 127 | } -------------------------------------------------------------------------------- /projects/quizapp/assets/fav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/projects/quizapp/assets/fav.png -------------------------------------------------------------------------------- /projects/quizapp/assets/quizes.js: -------------------------------------------------------------------------------- 1 | const quizArr = [ 2 | { 3 | question:"What does HTML stand for?", 4 | opt1:"Hyperlinks Text Mark Language", 5 | opt2:"Hyper Text Markup Language", 6 | opt3:"Hyper Tag Markup Language", 7 | opt4:"Hyper Tool Multi Language", 8 | ans:"ans2" 9 | }, 10 | { 11 | question:"What does CSS stand for?", 12 | opt1:"Computer Style Sheets", 13 | opt2:"Colorful Style Sheets", 14 | opt3:"Cascading Style Sheets", 15 | opt4:"Creative Style Sheets", 16 | ans:"ans3" 17 | }, 18 | { 19 | question:"What does XML stand for?", 20 | opt1:"eXecutale Markup Language", 21 | opt2:"eXtensible Markup Language", 22 | opt3:"eXamine Multiple Language", 23 | opt4:"eXtra Multi-Program Language", 24 | ans:"ans2" 25 | }, 26 | { 27 | question:"What does PHP stand for?", 28 | opt1:"Hypertext Programming", 29 | opt2:"Hometext Preprocessor", 30 | opt3:"Hypertext Preprogramming", 31 | opt4:"Hypertext Preprocessor", 32 | ans:"ans4" 33 | }, 34 | { 35 | question:"What does SQL stand for?", 36 | opt1:"Stylesheet Query Language", 37 | opt2:"Structured Query Language", 38 | opt3:"Stylish Query Language", 39 | opt4:"Statement Query Language", 40 | ans:"ans2" 41 | } 42 | ]; -------------------------------------------------------------------------------- /projects/quizapp/assets/script.js: -------------------------------------------------------------------------------- 1 | const question = document.querySelector('.question'); 2 | const option1 = document.querySelector('#opt1'); 3 | const option2 = document.querySelector('#opt2'); 4 | const option3 = document.querySelector('#opt3'); 5 | const option4 = document.querySelector('#opt4'); 6 | const submitBtn = document.querySelector('#submit'); 7 | const options = document.querySelectorAll('.answer'); 8 | const quizWrapper = document.querySelector('#quiz-wrapper'); 9 | const result = document.querySelector('#result'); 10 | 11 | let queIndex = 0; 12 | let score = 0; 13 | 14 | const loadQuestion = () => { 15 | let queList = quizArr[queIndex]; 16 | question.innerHTML = `${queIndex + 1}. ${queList.question}`; 17 | option1.innerHTML = queList.opt1; 18 | option2.innerHTML = queList.opt2; 19 | option3.innerHTML = queList.opt3; 20 | option4.innerHTML = queList.opt4; 21 | } 22 | 23 | loadQuestion(queIndex); 24 | 25 | const getCheckedAnswer = () => { 26 | let selectedOption; 27 | 28 | options.forEach((option) => { 29 | if(option.checked){ 30 | selectedOption = option.id; 31 | } 32 | }); 33 | return selectedOption; 34 | } 35 | 36 | const deselectAll = () => { 37 | options.forEach(option => option.checked = false); 38 | } 39 | 40 | submitBtn.addEventListener('click', () => { 41 | const checkedAnswer = getCheckedAnswer(); 42 | // console.log(checkedAnswer); 43 | deselectAll(); 44 | if(checkedAnswer === quizArr[queIndex].ans) { 45 | score++; 46 | // console.log(score); 47 | } 48 | queIndex++; 49 | if(queIndex < quizArr.length){ 50 | loadQuestion(queIndex); 51 | } else { 52 | quizWrapper.classList.add('hidden'); 53 | result.innerHTML = ` 54 | Your Score Is : ${score}/${quizArr.length} 55 | 56 | `; 57 | } 58 | }); -------------------------------------------------------------------------------- /projects/quizapp/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Quiz App | JavaScript 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 |
21 |

1. Question

22 |
    23 |
  • 24 | 25 | 26 |
  • 27 | 28 |
  • 29 | 30 | 31 |
  • 32 | 33 |
  • 34 | 35 | 36 |
  • 37 | 38 |
  • 39 | 40 | 41 |
  • 42 |
43 | 44 | 45 |
46 | 47 |
48 | 50 |
51 |
52 | 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /projects/songify/assets/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/projects/songify/assets/favicon.ico -------------------------------------------------------------------------------- /projects/songify/assets/images/cover1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/projects/songify/assets/images/cover1.jpg -------------------------------------------------------------------------------- /projects/songify/assets/images/cover10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/projects/songify/assets/images/cover10.jpg -------------------------------------------------------------------------------- /projects/songify/assets/images/cover11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/projects/songify/assets/images/cover11.jpg -------------------------------------------------------------------------------- /projects/songify/assets/images/cover12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/projects/songify/assets/images/cover12.jpg -------------------------------------------------------------------------------- /projects/songify/assets/images/cover13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/projects/songify/assets/images/cover13.jpg -------------------------------------------------------------------------------- /projects/songify/assets/images/cover2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/projects/songify/assets/images/cover2.jpg -------------------------------------------------------------------------------- /projects/songify/assets/images/cover3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/projects/songify/assets/images/cover3.jpg -------------------------------------------------------------------------------- /projects/songify/assets/images/cover4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/projects/songify/assets/images/cover4.jpg -------------------------------------------------------------------------------- /projects/songify/assets/images/cover5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/projects/songify/assets/images/cover5.jpg -------------------------------------------------------------------------------- /projects/songify/assets/images/cover6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/projects/songify/assets/images/cover6.jpg -------------------------------------------------------------------------------- /projects/songify/assets/images/cover7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/projects/songify/assets/images/cover7.jpg -------------------------------------------------------------------------------- /projects/songify/assets/images/cover8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/projects/songify/assets/images/cover8.jpg -------------------------------------------------------------------------------- /projects/songify/assets/images/cover9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/projects/songify/assets/images/cover9.jpg -------------------------------------------------------------------------------- /projects/songify/assets/script.js: -------------------------------------------------------------------------------- 1 | const musicPlayer = document.querySelector('.music_player'), 2 | musicImg = musicPlayer.querySelector('.imgBox img'), 3 | musicName = musicPlayer.querySelector('.songDetails .name'), 4 | musicArtist = musicPlayer.querySelector('.songDetails .artist'), 5 | mainAudio = musicPlayer.querySelector('#mainAudio'), 6 | playPauseBtn = musicPlayer.querySelector('.play-pause'), 7 | prevBtn = musicPlayer.querySelector('#prev'), 8 | nextBtn = musicPlayer.querySelector('#next'), 9 | progressArea = musicPlayer.querySelector('.progressBox'), 10 | progressBar = musicPlayer.querySelector('.progress-bar'), 11 | equalizer = musicPlayer.querySelector('#equalizer'), 12 | 13 | musicList = document.querySelector('.music_list'), 14 | volMuteBtn = musicPlayer.querySelector('#vol'); 15 | 16 | let musicIndex = Math.floor((Math.random() * songs.length) + 1); 17 | 18 | window.addEventListener('load', () => { 19 | loadMusic(musicIndex); 20 | playingNow(); 21 | }); 22 | 23 | const loadMusic = (indexNum) => { 24 | musicName.textContent = songs[indexNum - 1].name; 25 | musicArtist.textContent = songs[indexNum - 1].artist; 26 | musicImg.src = `./assets/images/${songs[indexNum - 1].img}.jpg` 27 | mainAudio.src = `https://www.mboxdrive.com/${songs[indexNum - 1].src}.mp3` 28 | } 29 | 30 | // play music function 31 | const playMusic = () => { 32 | musicPlayer.classList.add('paused'); 33 | playPauseBtn.querySelector('i').textContent = "pause"; 34 | musicImg.classList.add('anim'); 35 | mainAudio.play(); 36 | equalizer.load("https://assets7.lottiefiles.com/packages/lf20_btTua7.json"); 37 | } 38 | 39 | // pause music function 40 | const pauseMusic = () => { 41 | musicPlayer.classList.remove('paused'); 42 | playPauseBtn.querySelector('i').textContent = "play_arrow"; 43 | musicImg.classList.remove('anim'); 44 | mainAudio.pause(); 45 | equalizer.load(""); 46 | } 47 | 48 | // next music function 49 | const nextMusic = () => { 50 | musicIndex++; 51 | musicIndex > songs.length ? musicIndex = 1 : musicIndex = musicIndex; 52 | loadMusic(musicIndex); 53 | playMusic(); 54 | playingNow(); 55 | } 56 | 57 | // prev music function 58 | const prevMusic = () => { 59 | musicIndex--; 60 | musicIndex < 1 ? musicIndex = songs.length : musicIndex = musicIndex; 61 | loadMusic(musicIndex); 62 | playMusic(); 63 | playingNow(); 64 | } 65 | 66 | // play pause btn event 67 | playPauseBtn.addEventListener('click', () => { 68 | const isMusicPaused = musicPlayer.classList.contains('paused'); 69 | isMusicPaused ? pauseMusic() : playMusic(); 70 | playingNow(); 71 | }); 72 | 73 | // next music btn event 74 | nextBtn.addEventListener('click', () => { 75 | nextMusic(); 76 | }); 77 | 78 | // prev music btn event 79 | prevBtn.addEventListener('click', () => { 80 | prevMusic(); 81 | }); 82 | 83 | // vol mute unmute feature 84 | let isMute = false; 85 | 86 | const mute = () => { 87 | isMute = true; 88 | volMuteBtn.textContent = "volume_off"; 89 | mainAudio.muted = true; 90 | } 91 | const unMute = () => { 92 | isMute = false; 93 | volMuteBtn.textContent = "volume_up"; 94 | mainAudio.muted = false; 95 | } 96 | 97 | // vol mute unmute btn event 98 | volMuteBtn.addEventListener('click', () => { 99 | isMute ? unMute() : mute(); 100 | }); 101 | 102 | // update progressbar according to song duration 103 | mainAudio.addEventListener('timeupdate', (e) => { 104 | // console.log(e); 105 | const currentTime = e.target.currentTime; 106 | const duration = e.target.duration; 107 | 108 | let progressWidth = (currentTime / duration) * 100; 109 | progressBar.style.width = `${progressWidth}%`; 110 | 111 | let musicCurrentTime = musicPlayer.querySelector('.current'), 112 | musicDuration = musicPlayer.querySelector('.duration'); 113 | 114 | mainAudio.addEventListener('loadeddata', () => { 115 | // update song total duration 116 | let audioDuration = mainAudio.duration; 117 | let totalMin = Math.floor(audioDuration / 60); 118 | let totalSec = Math.floor(audioDuration % 60); 119 | if(totalMin<10){ 120 | totalMin = `0${totalMin}`; 121 | } 122 | if(totalSec<10){ 123 | totalSec = `0${totalSec}`; 124 | } 125 | musicDuration.textContent = `${totalMin}:${totalSec}`; 126 | }); 127 | // update playing song current time 128 | let currentMin = Math.floor(currentTime / 60); 129 | let currentSec = Math.floor(currentTime % 60); 130 | if(currentMin < 10) { 131 | currentMin = `0${currentMin}`; 132 | } 133 | if(currentSec < 10) { 134 | currentSec = `0${currentSec}`; 135 | } 136 | musicCurrentTime.textContent = `${currentMin}:${currentSec}`; 137 | }); 138 | 139 | // update song current time according to progress 140 | progressArea.addEventListener('click', (e) => { 141 | mainAudio.currentTime = (e.offsetX / progressArea.clientWidth) * mainAudio.duration; 142 | playMusic(); 143 | }); 144 | 145 | // repeat, shuffle song text according to the icon 146 | const repeatBtn = musicPlayer.querySelector('#repeat-plist'); 147 | repeatBtn.addEventListener('click', () => { 148 | let getTxt = repeatBtn.textContent; 149 | 150 | switch(getTxt) { 151 | case "repeat" : 152 | repeatBtn.textContent = "repeat_one"; 153 | repeatBtn.setAttribute('title', 'Song Looped'); 154 | break; 155 | 156 | case "repeat_one" : 157 | repeatBtn.textContent = "shuffle"; 158 | repeatBtn.setAttribute('title', 'Playback Shuffle'); 159 | break; 160 | 161 | case "shuffle" : 162 | repeatBtn.textContent = "repeat"; 163 | repeatBtn.setAttribute('title', 'Playlist Looped'); 164 | break; 165 | } 166 | }); 167 | 168 | // repeat shuffle functionality 169 | mainAudio.addEventListener('ended', () => { 170 | let getTxt = repeatBtn.textContent; 171 | 172 | switch(getTxt) { 173 | case "repeat" : 174 | nextMusic(); 175 | break; 176 | 177 | case "repeat_one" : 178 | mainAudio.currentTime = 0; 179 | loadMusic(musicIndex); 180 | playMusic(); 181 | break; 182 | 183 | case "shuffle" : 184 | let randIndex = Math.floor((Math.random() * songs.length) + 1); 185 | do{ 186 | randIndex = Math.floor((Math.random() * songs.length) + 1); 187 | } while(musicIndex == randIndex); 188 | musicIndex = randIndex; 189 | loadMusic(musicIndex); 190 | playMusic(); 191 | playingNow(); 192 | break; 193 | } 194 | }); 195 | 196 | // music list set items from song list 197 | const ulTag = document.querySelector('ul'); 198 | 199 | songs.forEach((elm, index) => { 200 | let liTag = `
  • 201 |
    202 | ${elm.name} 203 |

    ${elm.artist}

    204 |
    205 | 206 | 00:00 207 |
  • `; 208 | ulTag.insertAdjacentHTML('beforeend', liTag); 209 | 210 | let liAudioTagDuration = ulTag.querySelector(`#${elm.src}`); 211 | let liAudioTag = ulTag.querySelector(`.${elm.src}`); 212 | 213 | liAudioTag.addEventListener('loadeddata', () => { 214 | let audioDuration = liAudioTag.duration; 215 | let totalMin = Math.floor(audioDuration / 60); 216 | let totalSec = Math.floor(audioDuration % 60); 217 | if(totalMin<10){ 218 | totalMin = `0${totalMin}`; 219 | } 220 | if(totalSec<10){ 221 | totalSec = `0${totalSec}`; 222 | } 223 | liAudioTagDuration.textContent = `${totalMin}:${totalSec}`; 224 | liAudioTagDuration.setAttribute('t-duration', `${totalMin}:${totalSec}`); 225 | }); 226 | }); 227 | 228 | // play particular song on click list item 229 | const allLiTags = ulTag.querySelectorAll('li'); 230 | 231 | // add class and set duration of playing song 232 | const playingNow = () => { 233 | 234 | allLiTags.forEach((liTag) => { 235 | let audioDur = liTag.querySelector('.audio-duration'); 236 | 237 | if(liTag.classList.contains('playing')){ 238 | liTag.classList.remove('playing'); 239 | audioDur.textContent = audioDur.getAttribute('t-duration');; 240 | } 241 | 242 | if(liTag.getAttribute('liIndex') == musicIndex) { 243 | liTag.classList.add('playing'); 244 | audioDur.textContent = "Playing Now"; 245 | } 246 | 247 | liTag.setAttribute('onclick', "clicked(this)"); 248 | }); 249 | 250 | } 251 | 252 | // play song on click of list item 253 | const clicked = (el) => { 254 | let liIndex = el.getAttribute('liIndex'); 255 | musicIndex = liIndex; 256 | loadMusic(musicIndex); 257 | playMusic(); 258 | playingNow(); 259 | } -------------------------------------------------------------------------------- /projects/songify/assets/songs.js: -------------------------------------------------------------------------------- 1 | let songs = [ 2 | { 3 | name: "Flares", 4 | artist: "NIVIRO", 5 | img: "cover8", 6 | src: "song8" 7 | }, 8 | { 9 | name: "Phoenix", 10 | artist: "Halvorsen, Netrum", 11 | img: "cover2", 12 | src: "song2" 13 | }, 14 | { 15 | name: "Father", 16 | artist: "Diamond Eyes", 17 | img: "cover3", 18 | src: "song3" 19 | }, 20 | { 21 | name: "Anonymous Music", 22 | artist: "Unknown", 23 | img: "cover1", 24 | src: "song1" 25 | }, 26 | { 27 | name: "Bittersweet", 28 | artist: "Roses, Time To Talk", 29 | img: "cover4", 30 | src: "song4" 31 | }, 32 | { 33 | name: "Time", 34 | artist: "Syn Cole", 35 | img: "cover5", 36 | src: "song5" 37 | }, 38 | { 39 | name: "Lights", 40 | artist: "Whales", 41 | img: "cover10", 42 | src: "song10" 43 | }, 44 | { 45 | name: "Never Give Up", 46 | artist: "Steve Hartz", 47 | img: "cover11", 48 | src: "song11" 49 | }, 50 | { 51 | name: "Memory", 52 | artist: "RUD, Elektronomia", 53 | img: "cover12", 54 | src: "song12" 55 | }, 56 | { 57 | name: "Victory", 58 | artist: "Poylow", 59 | img: "cover6", 60 | src: "song6" 61 | }, 62 | { 63 | name: "Grow", 64 | artist: "VØR, Alisky", 65 | img: "cover7", 66 | src: "song7" 67 | }, 68 | { 69 | name: "Firefly", 70 | artist: "Andromedik", 71 | img: "cover9", 72 | src: "song9" 73 | }, 74 | { 75 | name: "Chasing Stars", 76 | artist: "STAR SEED", 77 | img: "cover13", 78 | src: "song13" 79 | } 80 | ] -------------------------------------------------------------------------------- /projects/songify/assets/styles/_anim.scss: -------------------------------------------------------------------------------- 1 | @keyframes rotateCover { 2 | from { 3 | transform: rotate(0deg); 4 | } 5 | to { 6 | transform: rotate(360deg); 7 | } 8 | } -------------------------------------------------------------------------------- /projects/songify/assets/styles/_colors.scss: -------------------------------------------------------------------------------- 1 | $yellow : #ffd900; 2 | $orange : #ff6600; 3 | $lightblack : #444; 4 | $white : #ffffff; 5 | $darkwhite : #cecaca; -------------------------------------------------------------------------------- /projects/songify/assets/styles/_controls.scss: -------------------------------------------------------------------------------- 1 | @import 'colors'; 2 | @import 'mixins'; 3 | 4 | .controls { 5 | @include flexCenter; 6 | margin: 4rem 0 .5rem 0; 7 | 8 | i { 9 | font-size: 3rem; 10 | color: $orange; 11 | cursor: pointer; 12 | 13 | &:nth-child(2), 14 | &:nth-child(4) { 15 | font-size: 4rem; 16 | } 17 | 18 | &:hover { 19 | color: #d85600; 20 | } 21 | } 22 | 23 | #prev { 24 | margin-right: -1.2rem; 25 | } 26 | 27 | #next { 28 | margin-left: -1.2rem; 29 | } 30 | 31 | .play-pause { 32 | height: 5rem; 33 | width: 5rem; 34 | background: $orange; 35 | box-shadow: 0 .2rem 2rem .1rem $yellow; 36 | border-radius: 50%; 37 | display: flex; 38 | align-items: center; 39 | justify-content: center; 40 | transition: .2s ease-out; 41 | 42 | i { 43 | height: 4rem; 44 | width: 4rem; 45 | line-height: 4rem; 46 | text-align: center; 47 | border-radius: inherit; 48 | background: inherit; 49 | position: relative; 50 | color: $white; 51 | } 52 | 53 | &:hover { 54 | background: #d85600; 55 | transform: scale(1.07); 56 | } 57 | } 58 | } -------------------------------------------------------------------------------- /projects/songify/assets/styles/_mixins.scss: -------------------------------------------------------------------------------- 1 | @mixin flexCenter { 2 | display: flex; 3 | justify-content: space-between; 4 | align-items: center; 5 | } -------------------------------------------------------------------------------- /projects/songify/assets/styles/_music_list.scss: -------------------------------------------------------------------------------- 1 | @import 'colors'; 2 | @import 'mixins'; 3 | 4 | .music_list { 5 | padding: 2rem 3rem 1.5rem 3rem; 6 | max-height: 55rem; 7 | width: 35rem; 8 | border-radius: 1.5rem; 9 | background: $white; 10 | transition: all .14s ease-out; 11 | box-shadow: 0px .5rem 1.5rem rgba(0, 0, 0, .35); 12 | 13 | .header { 14 | @include flexCenter; 15 | justify-content: flex-start; 16 | font-size: 2rem; 17 | color: $lightblack; 18 | 19 | span { 20 | margin-left: 1rem; 21 | } 22 | } 23 | 24 | ul { 25 | margin: 1rem 0; 26 | max-height: 50rem; 27 | height: 100%; 28 | overflow-y: auto; 29 | 30 | &::-webkit-scrollbar { 31 | width: .3rem; 32 | height: .3rem; 33 | } 34 | &::-webkit-scrollbar-thumb { 35 | background: $orange; 36 | } 37 | &::-webkit-scrollbar-track { 38 | background: rgb(221, 221, 221); 39 | } 40 | 41 | li { 42 | @include flexCenter; 43 | list-style: none; 44 | cursor: pointer; 45 | padding: 1rem 1rem 1rem 0; 46 | color: $lightblack; 47 | border-bottom: .1rem solid #e5e5e5; 48 | 49 | &:last-child { 50 | border-bottom: 0px; 51 | } 52 | 53 | .row { 54 | span { 55 | font-size: 1.8rem; 56 | } 57 | p { 58 | font-size: 1.1rem; 59 | opacity: .9; 60 | } 61 | } 62 | 63 | .audio-duration { 64 | font-size: 1.5rem; 65 | } 66 | 67 | &:hover { 68 | background: rgba(0,0,0,.03); 69 | } 70 | } 71 | 72 | .playing { 73 | color: $orange; 74 | pointer-events: none; 75 | font-weight: 500; 76 | 77 | } 78 | } 79 | } -------------------------------------------------------------------------------- /projects/songify/assets/styles/_music_player.scss: -------------------------------------------------------------------------------- 1 | @import 'colors'; 2 | @import 'mixins'; 3 | 4 | .music_player { 5 | position: relative; 6 | overflow: hidden; 7 | width: 35rem; 8 | min-height: 50rem; 9 | border-radius: 1.5rem; 10 | padding: 3rem; 11 | background: $white; 12 | box-shadow: 0px .5rem 1.5rem rgba(0, 0, 0, .35); 13 | 14 | .header { 15 | @include flexCenter; 16 | 17 | i { 18 | font-size: 3rem; 19 | color: $lightblack; 20 | } 21 | 22 | span { 23 | font-size: 2rem; 24 | color: $lightblack; 25 | } 26 | } 27 | 28 | .songDetails { 29 | text-align: center; 30 | margin: 3rem 0; 31 | color: $lightblack; 32 | 33 | .name { 34 | font-size: 2.2rem; 35 | font-weight: 500; 36 | } 37 | 38 | .artist { 39 | opacity: .8; 40 | font-size: 1.6rem; 41 | } 42 | } 43 | } -------------------------------------------------------------------------------- /projects/songify/assets/styles/_player_cover.scss: -------------------------------------------------------------------------------- 1 | @import 'colors'; 2 | @import 'mixins'; 3 | @import 'anim'; 4 | 5 | 6 | .imgBox { 7 | width: 25rem; 8 | height: 25rem; 9 | margin: auto; 10 | margin-top: 2.5rem; 11 | 12 | img { 13 | width: 100%; 14 | height: 100%; 15 | object-fit: cover; 16 | border-radius: 50%; 17 | box-shadow: 0 .5rem 3rem .1rem rgba(0, 0, 0, .2); 18 | } 19 | .anim { 20 | animation: rotateCover 3s linear infinite; 21 | } 22 | } -------------------------------------------------------------------------------- /projects/songify/assets/styles/_progress.scss: -------------------------------------------------------------------------------- 1 | @import 'colors'; 2 | @import 'mixins'; 3 | 4 | .progressBox { 5 | height: .6rem; 6 | width: 100%; 7 | border-radius: 5rem; 8 | background: #e9e9e9; 9 | cursor: pointer; 10 | 11 | .progress-bar { 12 | height: inherit; 13 | width: 0%; 14 | position: relative; 15 | border-radius: inherit; 16 | background: linear-gradient(90deg, $yellow 0%, $orange 100%); 17 | 18 | &::before { 19 | content: ''; 20 | position: absolute; 21 | height: 1.2rem; 22 | width: 1.2rem; 23 | border-radius: inherit; 24 | top: 50%; 25 | right: -.5rem; 26 | transform: translateY(-50%); 27 | background: $orange; 28 | pointer-events: none; 29 | z-index: 2; 30 | opacity: 0; 31 | transition: opacity .2s ease; 32 | } 33 | } 34 | 35 | &:hover .progress-bar::before { 36 | opacity: 1; 37 | } 38 | 39 | .timer { 40 | @include flexCenter; 41 | margin-top: .5rem; 42 | 43 | span { 44 | font-size: 1.3rem; 45 | font-weight: 500; 46 | color: $lightblack; 47 | } 48 | } 49 | } -------------------------------------------------------------------------------- /projects/songify/assets/styles/style.css: -------------------------------------------------------------------------------- 1 | @import url("https://fonts.googleapis.com/css2?family=Poppins:wght@200;300;400;500;600;700&display=swap"); 2 | *, 3 | *::before, *::after { 4 | margin: 0; 5 | padding: 0; 6 | } 7 | 8 | html { 9 | font-size: 62.5%; 10 | font-family: 'Poppins', sans-serif; 11 | } 12 | 13 | .container { 14 | display: -webkit-box; 15 | display: -ms-flexbox; 16 | display: flex; 17 | -webkit-box-pack: center; 18 | -ms-flex-pack: center; 19 | justify-content: center; 20 | -webkit-box-align: center; 21 | -ms-flex-align: center; 22 | align-items: center; 23 | gap: 2rem; 24 | -ms-flex-wrap: wrap; 25 | flex-wrap: wrap; 26 | min-height: 100vh; 27 | background: -webkit-gradient(linear, left top, right top, from(#da22ff), to(#9733ee)); 28 | background: linear-gradient(to right, #da22ff, #9733ee); 29 | } 30 | 31 | @media screen and (max-width: 460px) { 32 | html { 33 | font-size: 55%; 34 | } 35 | .container { 36 | padding: 1.5rem; 37 | } 38 | } 39 | 40 | .music_player { 41 | position: relative; 42 | overflow: hidden; 43 | width: 35rem; 44 | min-height: 50rem; 45 | border-radius: 1.5rem; 46 | padding: 3rem; 47 | background: #ffffff; 48 | -webkit-box-shadow: 0px 0.5rem 1.5rem rgba(0, 0, 0, 0.35); 49 | box-shadow: 0px 0.5rem 1.5rem rgba(0, 0, 0, 0.35); 50 | } 51 | 52 | .music_player .header { 53 | display: -webkit-box; 54 | display: -ms-flexbox; 55 | display: flex; 56 | -webkit-box-pack: justify; 57 | -ms-flex-pack: justify; 58 | justify-content: space-between; 59 | -webkit-box-align: center; 60 | -ms-flex-align: center; 61 | align-items: center; 62 | } 63 | 64 | .music_player .header i { 65 | font-size: 3rem; 66 | color: #444; 67 | } 68 | 69 | .music_player .header span { 70 | font-size: 2rem; 71 | color: #444; 72 | } 73 | 74 | .music_player .songDetails { 75 | text-align: center; 76 | margin: 3rem 0; 77 | color: #444; 78 | } 79 | 80 | .music_player .songDetails .name { 81 | font-size: 2.2rem; 82 | font-weight: 500; 83 | } 84 | 85 | .music_player .songDetails .artist { 86 | opacity: .8; 87 | font-size: 1.6rem; 88 | } 89 | 90 | @-webkit-keyframes rotateCover { 91 | from { 92 | -webkit-transform: rotate(0deg); 93 | transform: rotate(0deg); 94 | } 95 | to { 96 | -webkit-transform: rotate(360deg); 97 | transform: rotate(360deg); 98 | } 99 | } 100 | 101 | @keyframes rotateCover { 102 | from { 103 | -webkit-transform: rotate(0deg); 104 | transform: rotate(0deg); 105 | } 106 | to { 107 | -webkit-transform: rotate(360deg); 108 | transform: rotate(360deg); 109 | } 110 | } 111 | 112 | .imgBox { 113 | width: 25rem; 114 | height: 25rem; 115 | margin: auto; 116 | margin-top: 2.5rem; 117 | } 118 | 119 | .imgBox img { 120 | width: 100%; 121 | height: 100%; 122 | -o-object-fit: cover; 123 | object-fit: cover; 124 | border-radius: 50%; 125 | -webkit-box-shadow: 0 0.5rem 3rem 0.1rem rgba(0, 0, 0, 0.2); 126 | box-shadow: 0 0.5rem 3rem 0.1rem rgba(0, 0, 0, 0.2); 127 | } 128 | 129 | .imgBox .anim { 130 | -webkit-animation: rotateCover 3s linear infinite; 131 | animation: rotateCover 3s linear infinite; 132 | } 133 | 134 | .progressBox { 135 | height: .6rem; 136 | width: 100%; 137 | border-radius: 5rem; 138 | background: #e9e9e9; 139 | cursor: pointer; 140 | } 141 | 142 | .progressBox .progress-bar { 143 | height: inherit; 144 | width: 0%; 145 | position: relative; 146 | border-radius: inherit; 147 | background: -webkit-gradient(linear, left top, right top, from(#ffd900), to(#ff6600)); 148 | background: linear-gradient(90deg, #ffd900 0%, #ff6600 100%); 149 | } 150 | 151 | .progressBox .progress-bar::before { 152 | content: ''; 153 | position: absolute; 154 | height: 1.2rem; 155 | width: 1.2rem; 156 | border-radius: inherit; 157 | top: 50%; 158 | right: -.5rem; 159 | -webkit-transform: translateY(-50%); 160 | transform: translateY(-50%); 161 | background: #ff6600; 162 | pointer-events: none; 163 | z-index: 2; 164 | opacity: 0; 165 | -webkit-transition: opacity .2s ease; 166 | transition: opacity .2s ease; 167 | } 168 | 169 | .progressBox:hover .progress-bar::before { 170 | opacity: 1; 171 | } 172 | 173 | .progressBox .timer { 174 | display: -webkit-box; 175 | display: -ms-flexbox; 176 | display: flex; 177 | -webkit-box-pack: justify; 178 | -ms-flex-pack: justify; 179 | justify-content: space-between; 180 | -webkit-box-align: center; 181 | -ms-flex-align: center; 182 | align-items: center; 183 | margin-top: .5rem; 184 | } 185 | 186 | .progressBox .timer span { 187 | font-size: 1.3rem; 188 | font-weight: 500; 189 | color: #444; 190 | } 191 | 192 | .controls { 193 | display: -webkit-box; 194 | display: -ms-flexbox; 195 | display: flex; 196 | -webkit-box-pack: justify; 197 | -ms-flex-pack: justify; 198 | justify-content: space-between; 199 | -webkit-box-align: center; 200 | -ms-flex-align: center; 201 | align-items: center; 202 | margin: 4rem 0 .5rem 0; 203 | } 204 | 205 | .controls i { 206 | font-size: 3rem; 207 | color: #ff6600; 208 | cursor: pointer; 209 | } 210 | 211 | .controls i:nth-child(2), .controls i:nth-child(4) { 212 | font-size: 4rem; 213 | } 214 | 215 | .controls i:hover { 216 | color: #d85600; 217 | } 218 | 219 | .controls #prev { 220 | margin-right: -1.2rem; 221 | } 222 | 223 | .controls #next { 224 | margin-left: -1.2rem; 225 | } 226 | 227 | .controls .play-pause { 228 | height: 5rem; 229 | width: 5rem; 230 | background: #ff6600; 231 | -webkit-box-shadow: 0 0.2rem 2rem 0.1rem #ffd900; 232 | box-shadow: 0 0.2rem 2rem 0.1rem #ffd900; 233 | border-radius: 50%; 234 | display: -webkit-box; 235 | display: -ms-flexbox; 236 | display: flex; 237 | -webkit-box-align: center; 238 | -ms-flex-align: center; 239 | align-items: center; 240 | -webkit-box-pack: center; 241 | -ms-flex-pack: center; 242 | justify-content: center; 243 | -webkit-transition: .2s ease-out; 244 | transition: .2s ease-out; 245 | } 246 | 247 | .controls .play-pause i { 248 | height: 4rem; 249 | width: 4rem; 250 | line-height: 4rem; 251 | text-align: center; 252 | border-radius: inherit; 253 | background: inherit; 254 | position: relative; 255 | color: #ffffff; 256 | } 257 | 258 | .controls .play-pause:hover { 259 | background: #d85600; 260 | -webkit-transform: scale(1.07); 261 | transform: scale(1.07); 262 | } 263 | 264 | .music_list { 265 | padding: 2rem 3rem 1.5rem 3rem; 266 | max-height: 55rem; 267 | width: 35rem; 268 | border-radius: 1.5rem; 269 | background: #ffffff; 270 | -webkit-transition: all .14s ease-out; 271 | transition: all .14s ease-out; 272 | -webkit-box-shadow: 0px 0.5rem 1.5rem rgba(0, 0, 0, 0.35); 273 | box-shadow: 0px 0.5rem 1.5rem rgba(0, 0, 0, 0.35); 274 | } 275 | 276 | .music_list .header { 277 | display: -webkit-box; 278 | display: -ms-flexbox; 279 | display: flex; 280 | -webkit-box-pack: justify; 281 | -ms-flex-pack: justify; 282 | justify-content: space-between; 283 | -webkit-box-align: center; 284 | -ms-flex-align: center; 285 | align-items: center; 286 | -webkit-box-pack: start; 287 | -ms-flex-pack: start; 288 | justify-content: flex-start; 289 | font-size: 2rem; 290 | color: #444; 291 | } 292 | 293 | .music_list .header span { 294 | margin-left: 1rem; 295 | } 296 | 297 | .music_list ul { 298 | margin: 1rem 0; 299 | max-height: 50rem; 300 | height: 100%; 301 | overflow-y: auto; 302 | } 303 | 304 | .music_list ul::-webkit-scrollbar { 305 | width: .3rem; 306 | height: .3rem; 307 | } 308 | 309 | .music_list ul::-webkit-scrollbar-thumb { 310 | background: #ff6600; 311 | } 312 | 313 | .music_list ul::-webkit-scrollbar-track { 314 | background: #dddddd; 315 | } 316 | 317 | .music_list ul li { 318 | display: -webkit-box; 319 | display: -ms-flexbox; 320 | display: flex; 321 | -webkit-box-pack: justify; 322 | -ms-flex-pack: justify; 323 | justify-content: space-between; 324 | -webkit-box-align: center; 325 | -ms-flex-align: center; 326 | align-items: center; 327 | list-style: none; 328 | cursor: pointer; 329 | padding: 1rem 1rem 1rem 0; 330 | color: #444; 331 | border-bottom: .1rem solid #e5e5e5; 332 | } 333 | 334 | .music_list ul li:last-child { 335 | border-bottom: 0px; 336 | } 337 | 338 | .music_list ul li .row span { 339 | font-size: 1.8rem; 340 | } 341 | 342 | .music_list ul li .row p { 343 | font-size: 1.1rem; 344 | opacity: .9; 345 | } 346 | 347 | .music_list ul li .audio-duration { 348 | font-size: 1.5rem; 349 | } 350 | 351 | .music_list ul li:hover { 352 | background: rgba(0, 0, 0, 0.03); 353 | } 354 | 355 | .music_list ul .playing { 356 | color: #ff6600; 357 | pointer-events: none; 358 | font-weight: 500; 359 | } 360 | /*# sourceMappingURL=style.css.map */ -------------------------------------------------------------------------------- /projects/songify/assets/styles/style.css.map: -------------------------------------------------------------------------------- 1 | { 2 | "version": 3, 3 | "mappings": "AAAA,OAAO,CAAC,iGAAI;AAEZ,AAAA,CAAC;AACD,CAAC,AAAA,QAAQ,EAAE,CAAC,AAAA,OAAO,CAAC;EAChB,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,CAAC;CACb;;AAED,AAAA,IAAI,CAAC;EACD,SAAS,EAAE,KAAK;EAChB,WAAW,EAAE,qBAAqB;CACrC;;AAED,AAAA,UAAU,CAAC;EACP,OAAO,EAAE,IAAI;EACb,eAAe,EAAE,MAAM;EACvB,WAAW,EAAE,MAAM;EACnB,GAAG,EAAE,IAAI;EACT,SAAS,EAAE,IAAI;EACf,UAAU,EAAE,KAAK;EACjB,UAAU,EAAE,2CAA2C;CAC1D;;AAED,MAAM,CAAC,MAAM,MAAM,SAAS,EAAE,KAAK;EAC/B,AAAA,IAAI,CAAC;IACD,SAAS,EAAE,GAAG;GACjB;EACD,AAAA,UAAU,CAAC;IACP,OAAO,EAAE,MAAM;GAClB;;;AC1BL,AAAA,aAAa,CAAC;EACV,QAAQ,EAAE,QAAQ;EAClB,QAAQ,EAAE,MAAM;EAChB,KAAK,EAAE,KAAK;EACZ,UAAU,EAAE,KAAK;EACjB,aAAa,EAAE,MAAM;EACrB,OAAO,EAAG,IAAI;EACd,UAAU,ECPL,OAAO;EDQZ,UAAU,EAAE,GAAG,CAAC,MAAK,CAAC,MAAM,CAAC,mBAAkB;CA+BlD;;AAvCD,AAUI,aAVS,CAUT,OAAO,CAAC;EEZR,OAAO,EAAE,IAAI;EACb,eAAe,EAAE,aAAa;EAC9B,WAAW,EAAE,MAAM;CFsBlB;;AAtBL,AAaQ,aAbK,CAUT,OAAO,CAGH,CAAC,CAAC;EACE,SAAS,EAAE,IAAI;EACf,KAAK,EChBH,IAAI;CDiBT;;AAhBT,AAkBQ,aAlBK,CAUT,OAAO,CAQH,IAAI,CAAC;EACD,SAAS,EAAE,IAAI;EACf,KAAK,ECrBH,IAAI;CDsBT;;AArBT,AAwBI,aAxBS,CAwBT,YAAY,CAAC;EACT,UAAU,EAAE,MAAM;EAClB,MAAM,EAAE,MAAM;EACd,KAAK,EC5BC,IAAI;CDuCb;;AAtCL,AA6BQ,aA7BK,CAwBT,YAAY,CAKR,KAAK,CAAC;EACF,SAAS,EAAE,MAAM;EACjB,WAAW,EAAE,GAAG;CACnB;;AAhCT,AAkCQ,aAlCK,CAwBT,YAAY,CAUR,OAAO,CAAC;EACJ,OAAO,EAAE,EAAE;EACX,SAAS,EAAE,MAAM;CACpB;;AMxCT,UAAU,CAAV,WAAU;EACN,IAAI;IACA,SAAS,EAAE,YAAY;;EAE3B,EAAE;IACE,SAAS,EAAE,cAAc;;;;AHAjC,AAAA,OAAO,CAAC;EACJ,KAAK,EAAE,KAAK;EACZ,MAAM,EAAE,KAAK;EACb,MAAM,EAAE,IAAI;EACZ,UAAU,EAAE,MAAM;CAYrB;;AAhBD,AAMI,OANG,CAMH,GAAG,CAAC;EACA,KAAK,EAAE,IAAI;EACX,MAAM,EAAE,IAAI;EACZ,UAAU,EAAE,KAAK;EACjB,aAAa,EAAE,GAAG;EAClB,UAAU,EAAE,CAAC,CAAC,MAAK,CAAC,IAAI,CAAC,MAAK,CAAC,kBAAiB;CACnD;;AAZL,AAaI,OAbG,CAaH,KAAK,CAAC;EACF,SAAS,EAAE,8BAA8B;CAC5C;;AIjBL,AAAA,YAAY,CAAC;EACT,MAAM,EAAE,KAAK;EACb,KAAK,EAAE,IAAI;EACX,aAAa,EAAE,IAAI;EACnB,UAAU,EAAE,OAAO;EACnB,MAAM,EAAE,OAAO;CAwClB;;AA7CD,AAOI,YAPQ,CAOR,aAAa,CAAC;EACV,MAAM,EAAE,OAAO;EACf,KAAK,EAAE,EAAE;EACT,QAAQ,EAAE,QAAQ;EAClB,aAAa,EAAE,OAAO;EACtB,UAAU,EAAE,gDAAgD;CAiB/D;;AA7BL,AAcQ,YAdI,CAOR,aAAa,AAOR,QAAQ,CAAC;EACN,OAAO,EAAE,EAAE;EACX,QAAQ,EAAE,QAAQ;EAClB,MAAM,EAAE,MAAM;EACd,KAAK,EAAE,MAAM;EACb,aAAa,EAAE,OAAO;EACtB,GAAG,EAAE,GAAG;EACR,KAAK,EAAE,MAAM;EACb,SAAS,EAAE,gBAAgB;EAC3B,UAAU,ENzBZ,OAAO;EM0BL,cAAc,EAAE,IAAI;EACpB,OAAO,EAAE,CAAC;EACV,OAAO,EAAE,CAAC;EACV,UAAU,EAAE,gBAAgB;CAC/B;;AA5BT,AA+BI,YA/BQ,AA+BP,MAAM,CAAC,aAAa,AAAA,QAAQ,CAAC;EAC1B,OAAO,EAAE,CAAC;CACb;;AAjCL,AAmCI,YAnCQ,CAmCR,MAAM,CAAC;ELrCP,OAAO,EAAE,IAAI;EACb,eAAe,EAAE,aAAa;EAC9B,WAAW,EAAE,MAAM;EKqCf,UAAU,EAAE,KAAK;CAOpB;;AA5CL,AAuCQ,YAvCI,CAmCR,MAAM,CAIF,IAAI,CAAC;EACD,SAAS,EAAE,MAAM;EACjB,WAAW,EAAE,GAAG;EAChB,KAAK,EN3CH,IAAI;CM4CT;;AG3CT,AAAA,SAAS,CAAC;ERFN,OAAO,EAAE,IAAI;EACb,eAAe,EAAE,aAAa;EAC9B,WAAW,EAAE,MAAM;EQEnB,MAAM,EAAE,cAAc;CAoDzB;;AAtDD,AAII,SAJK,CAIL,CAAC,CAAC;EACE,SAAS,EAAE,IAAI;EACf,KAAK,ETRH,OAAO;ESST,MAAM,EAAE,OAAO;CAUlB;;AAjBL,AASQ,SATC,CAIL,CAAC,AAKI,UAAW,CAAA,CAAC,GATrB,SAAS,CAIL,CAAC,AAMI,UAAW,CAAA,CAAC,EAAE;EACX,SAAS,EAAE,IAAI;CAClB;;AAZT,AAcQ,SAdC,CAIL,CAAC,AAUI,MAAM,CAAC;EACJ,KAAK,EAAE,OAAO;CACjB;;AAhBT,AAmBI,SAnBK,CAmBL,KAAK,CAAC;EACF,YAAY,EAAE,OAAO;CACxB;;AArBL,AAuBI,SAvBK,CAuBL,KAAK,CAAC;EACF,WAAW,EAAE,OAAO;CACvB;;AAzBL,AA2BI,SA3BK,CA2BL,WAAW,CAAC;EACR,MAAM,EAAE,IAAI;EACZ,KAAK,EAAE,IAAI;EACX,UAAU,EThCR,OAAO;ESiCT,UAAU,EAAE,CAAC,CAAC,MAAK,CAAC,IAAI,CAAC,MAAK,CTlC5B,OAAO;ESmCT,aAAa,EAAE,GAAG;EAClB,OAAO,EAAE,IAAI;EACb,WAAW,EAAE,MAAM;EACnB,eAAe,EAAE,MAAM;EACvB,UAAU,EAAE,YAAY;CAiB3B;;AArDL,AAsCQ,SAtCC,CA2BL,WAAW,CAWP,CAAC,CAAC;EACE,MAAM,EAAE,IAAI;EACZ,KAAK,EAAE,IAAI;EACX,WAAW,EAAE,IAAI;EACjB,UAAU,EAAE,MAAM;EAClB,aAAa,EAAE,OAAO;EACtB,UAAU,EAAE,OAAO;EACnB,QAAQ,EAAE,QAAQ;EAClB,KAAK,ET9CR,OAAO;CS+CP;;AA/CT,AAiDQ,SAjDC,CA2BL,WAAW,AAsBN,MAAM,CAAC;EACJ,UAAU,EAAE,OAAO;EACnB,SAAS,EAAE,WAAW;CACzB;;AGpDT,AAAA,WAAW,CAAC;EACR,OAAO,EAAE,qBAAqB;EAC9B,UAAU,EAAE,KAAK;EACjB,KAAK,EAAE,KAAK;EACZ,aAAa,EAAE,MAAM;EACrB,UAAU,EZLL,OAAO;EYMZ,UAAU,EAAE,iBAAiB;EAC7B,UAAU,EAAE,GAAG,CAAC,MAAK,CAAC,MAAM,CAAC,mBAAkB;CAoElD;;AA3ED,AASI,WATO,CASP,OAAO,CAAC;EXXR,OAAO,EAAE,IAAI;EACb,eAAe,EAAE,aAAa;EAC9B,WAAW,EAAE,MAAM;EWWf,eAAe,EAAE,UAAU;EAC3B,SAAS,EAAE,IAAI;EACf,KAAK,EZdC,IAAI;CYmBb;;AAlBL,AAeQ,WAfG,CASP,OAAO,CAMH,IAAI,CAAC;EACD,WAAW,EAAE,IAAI;CACpB;;AAjBT,AAoBI,WApBO,CAoBP,EAAE,CAAC;EACC,MAAM,EAAE,MAAM;EACd,UAAU,EAAE,KAAK;EACjB,MAAM,EAAE,IAAI;EACZ,UAAU,EAAE,IAAI;CAkDnB;;AA1EL,AA0BQ,WA1BG,CAoBP,EAAE,AAMG,mBAAmB,CAAC;EACjB,KAAK,EAAE,KAAK;EACZ,MAAM,EAAE,KAAK;CAChB;;AA7BT,AA8BQ,WA9BG,CAoBP,EAAE,AAUG,yBAAyB,CAAC;EACvB,UAAU,EZjCZ,OAAO;CYkCR;;AAhCT,AAiCQ,WAjCG,CAoBP,EAAE,AAaG,yBAAyB,CAAC;EACvB,UAAU,EAAE,OAAkB;CACjC;;AAnCT,AAqCQ,WArCG,CAoBP,EAAE,CAiBE,EAAE,CAAC;EXvCP,OAAO,EAAE,IAAI;EACb,eAAe,EAAE,aAAa;EAC9B,WAAW,EAAE,MAAM;EWuCX,UAAU,EAAE,IAAI;EAChB,MAAM,EAAE,OAAO;EACf,OAAO,EAAE,gBAAgB;EACzB,KAAK,EZ3CH,IAAI;EY4CN,aAAa,EAAE,mBAAmB;CAuBrC;;AAlET,AA6CY,WA7CD,CAoBP,EAAE,CAiBE,EAAE,AAQG,WAAW,CAAC;EACT,aAAa,EAAE,GAAG;CACrB;;AA/Cb,AAkDgB,WAlDL,CAoBP,EAAE,CAiBE,EAAE,CAYE,IAAI,CACA,IAAI,CAAC;EACL,SAAS,EAAE,MAAM;CAChB;;AApDjB,AAqDgB,WArDL,CAoBP,EAAE,CAiBE,EAAE,CAYE,IAAI,CAIA,CAAC,CAAC;EACE,SAAS,EAAE,MAAM;EACjB,OAAO,EAAE,EAAE;CACd;;AAxDjB,AA2DY,WA3DD,CAoBP,EAAE,CAiBE,EAAE,CAsBE,eAAe,CAAC;EACZ,SAAS,EAAE,MAAM;CACpB;;AA7Db,AA+DY,WA/DD,CAoBP,EAAE,CAiBE,EAAE,AA0BG,MAAM,CAAC;EACJ,UAAU,EAAE,mBAAe;CAC9B;;AAjEb,AAoEQ,WApEG,CAoBP,EAAE,CAgDE,QAAQ,CAAC;EACL,KAAK,EZvEP,OAAO;EYwEL,cAAc,EAAE,IAAI;EACpB,WAAW,EAAE,GAAG;CAEnB", 4 | "sources": [ 5 | "style.scss", 6 | "_music_player.scss", 7 | "_colors.scss", 8 | "_mixins.scss", 9 | "_player_cover.scss", 10 | "_colors.scss", 11 | "_mixins.scss", 12 | "_anim.scss", 13 | "_progress.scss", 14 | "_colors.scss", 15 | "_mixins.scss", 16 | "_controls.scss", 17 | "_colors.scss", 18 | "_mixins.scss", 19 | "_music_list.scss", 20 | "_colors.scss", 21 | "_mixins.scss" 22 | ], 23 | "names": [], 24 | "file": "style.css" 25 | } -------------------------------------------------------------------------------- /projects/songify/assets/styles/style.scss: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@200;300;400;500;600;700&display=swap'); 2 | 3 | *, 4 | *::before, *::after { 5 | margin: 0; 6 | padding: 0; 7 | } 8 | 9 | html { 10 | font-size: 62.5%; 11 | font-family: 'Poppins', sans-serif; 12 | } 13 | 14 | .container { 15 | display: flex; 16 | justify-content: center; 17 | align-items: center; 18 | gap: 2rem; 19 | flex-wrap: wrap; 20 | min-height: 100vh; 21 | background: linear-gradient(to right, #da22ff, #9733ee); 22 | } 23 | 24 | @media screen and (max-width: 460px) { 25 | html { 26 | font-size: 55%; 27 | } 28 | .container { 29 | padding: 1.5rem; 30 | } 31 | } 32 | 33 | @import 'music_player'; 34 | @import 'player_cover'; 35 | @import 'progress'; 36 | @import 'controls'; 37 | @import 'music_list'; -------------------------------------------------------------------------------- /projects/songify/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | Songify | Music Player 12 | 13 | 14 | 15 | 16 | 17 |
    18 | 19 | 20 |
    21 | 22 |
    23 | audiotrack 24 | Now Playing 25 | 26 |
    27 | 28 |
    29 | Player Cover 30 |
    31 | 32 |
    33 |

    Song Name

    34 |

    Jhon Doe

    35 |
    36 | 37 |
    38 |
    39 |
    40 | 00:00 41 | 00:00 42 |
    43 | 44 |
    45 | 46 |
    47 | repeat 48 | skip_previous 49 |
    50 | play_arrow 51 |
    52 | skip_next 53 | volume_up 54 |
    55 | 56 |
    57 | 58 | 59 |
    60 | 61 |
    62 | queue_music 63 | Music List 64 |
    65 | 66 |
      67 | 74 |
    75 | 76 |
    77 | 78 |
    79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /projects/stopwatch/assets/fav.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/projects/stopwatch/assets/fav.ico -------------------------------------------------------------------------------- /projects/stopwatch/assets/script.js: -------------------------------------------------------------------------------- 1 | const hrTxt = document.getElementById('hr'); 2 | const minTxt = document.getElementById('min'); 3 | const secTxt = document.getElementById('sec'); 4 | const countTxt = document.getElementById('count'); 5 | 6 | let hr = 0; 7 | let min = 0; 8 | let sec = 0; 9 | let count = 0; 10 | let timer = false; 11 | 12 | const start = () => { 13 | timer = true; 14 | stopwatch(); 15 | } 16 | const stop = () => { 17 | timer = false; 18 | } 19 | const reset = () => { 20 | timer = false; 21 | hr = 0; 22 | min = 0; 23 | sec = 0; 24 | count = 0; 25 | hrTxt.innerHTML = "00"; 26 | minTxt.innerHTML = "00"; 27 | secTxt.innerHTML = "00"; 28 | countTxt.innerHTML = "00"; 29 | } 30 | 31 | const stopwatch = () => { 32 | if(timer == true) { 33 | count += 1; 34 | 35 | if(count == 100) { 36 | sec += 1; 37 | count = 0; 38 | } 39 | if(sec == 60) { 40 | min += 1; 41 | sec = 0; 42 | } 43 | if(min == 60) { 44 | hr += 1; 45 | min = 0; 46 | sec = 0; 47 | } 48 | 49 | var hrStr = hr; 50 | var minStr = min; 51 | var secStr = sec; 52 | var countStr = count; 53 | if(hr < 10) { 54 | hrstr = "0" + hrStr; 55 | } 56 | if(min < 10) { 57 | minStr = "0" + minStr; 58 | } 59 | if(sec < 10) { 60 | secStr = "0" + secStr; 61 | } 62 | if(count < 10) { 63 | countStr = "0" + countStr; 64 | } 65 | hrTxt.innerHTML = hrstr; 66 | minTxt.innerHTML = minStr; 67 | secTxt.innerHTML = secStr; 68 | countTxt.innerHTML = countStr; 69 | 70 | setTimeout("stopwatch()",10); 71 | } 72 | } -------------------------------------------------------------------------------- /projects/stopwatch/assets/style.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@200;300;400;500;600;700&display=swap'); 2 | 3 | * { 4 | margin: 0; 5 | padding: 0; 6 | box-sizing: border-box; 7 | } 8 | body { 9 | min-height: 100vh; 10 | min-width: 100%; 11 | font-size: 62.5%; 12 | overflow: hidden; 13 | background: linear-gradient(to right, #8e2de2, #4a00e0); 14 | font-family: 'Poppins', sans-serif; 15 | } 16 | 17 | .container { 18 | background: rgba(255, 255, 255, 0.4); 19 | transform-style: preserve-3d; 20 | box-shadow: 0 15px 35px rgba(0, 0, 0, 0.3); 21 | max-width: 35rem; 22 | width: 100%; 23 | margin: 8rem auto; 24 | padding: 1rem 2rem; 25 | border-radius: .5rem; 26 | transition: .3s; 27 | } 28 | h2{ 29 | font-size: 2.5rem; 30 | text-align: center; 31 | color: #111; 32 | } 33 | .time { 34 | width: 100%; 35 | display: flex; 36 | justify-content: space-between; 37 | margin-bottom: 1.5rem; 38 | margin-top: 2rem; 39 | } 40 | .time div{ 41 | display: flex; 42 | flex-direction: column; 43 | justify-content: center; 44 | align-items: center; 45 | width: 7rem; 46 | background: rgb(255, 255, 255); 47 | border-radius: 0.5rem; 48 | color: rgb(29, 29, 29); 49 | padding: 1rem 2rem; 50 | box-shadow: 0 15px 20px rgba(0, 0, 0, 0.3); 51 | } 52 | .time div .digit { 53 | font-size: 2.5rem; 54 | font-weight: 600; 55 | } 56 | .time div .txt { 57 | font-size: 1.2rem; 58 | font-weight: 500; 59 | } 60 | 61 | .btns { 62 | display: flex; 63 | justify-content: space-between; 64 | /* background: yellow; */ 65 | margin: 0 3rem; 66 | margin-top: 2rem; 67 | } 68 | .btns .btn { 69 | border: none; 70 | outline: none; 71 | padding: .7rem 1.5rem; 72 | border-radius: .2rem; 73 | font-size: 1.1rem; 74 | text-transform: uppercase; 75 | background: #161616; 76 | color: #fff; 77 | cursor: pointer; 78 | box-shadow: 0 .2rem 1rem rgba(0, 0, 0, 0.3); 79 | transition: .2s ease-out; 80 | } 81 | .btns .btn:hover { 82 | background: rgb(0, 0, 0); 83 | color: #ffffff; 84 | } 85 | .btns .btn.stop { 86 | background: #d40101; 87 | color: rgb(255, 255, 255); 88 | } 89 | .btns .btn.stop:hover { 90 | background: #940000; 91 | color: rgb(255, 255, 255); 92 | } 93 | 94 | @media screen and (max-width:768px) { 95 | html { 96 | font-size: 82.5%; 97 | } 98 | } 99 | @media screen and (max-width:460px) { 100 | html { 101 | font-size: 60%; 102 | } 103 | } -------------------------------------------------------------------------------- /projects/stopwatch/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Stopwatch 9 | 10 | 11 | 12 | 13 |
    14 |

    StopWatch

    15 |
    16 |
    17 | 00 18 | Hr 19 |
    20 |
    21 | 00 22 | Min 23 |
    24 |
    25 | 00 26 | Sec 27 |
    28 |
    29 | 00 30 | Millisec 31 |
    32 |
    33 | 34 |
    35 | 36 | 37 | 38 |
    39 | 40 |
    41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /projects/tempconvert/assets/fav.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/projects/tempconvert/assets/fav.ico -------------------------------------------------------------------------------- /projects/tempconvert/assets/script.js: -------------------------------------------------------------------------------- 1 | const cel = document.getElementById('cel'); 2 | const fah = document.getElementById('fah'); 3 | const kel = document.getElementById('kel'); 4 | 5 | cel.addEventListener('input', function() { 6 | if(this.value != ""){ 7 | let c = this.value; 8 | let f = (c * 9/5) + 32; 9 | let k = +c + 273.15; 10 | if(!Number.isInteger(f)) { 11 | f = f.toFixed(4); 12 | } 13 | if(!Number.isInteger(k)) { 14 | k = k.toFixed(4); 15 | } 16 | fah.value = f; 17 | kel.value = k; 18 | } else { 19 | fah.value = ""; 20 | kel.value = ""; 21 | } 22 | }); 23 | 24 | fah.addEventListener('input', function() { 25 | if(this.value != ""){ 26 | let f = this.value; 27 | let c = (f - 32) * 5/9; 28 | let k = c + 273.15; 29 | if(!Number.isInteger(c)) { 30 | c = c.toFixed(4); 31 | } 32 | if(!Number.isInteger(k)) { 33 | k = k.toFixed(4); 34 | } 35 | cel.value = c; 36 | kel.value = k; 37 | } else { 38 | cel.value = ""; 39 | kel.value = ""; 40 | } 41 | }); 42 | 43 | kel.addEventListener('input', function() { 44 | if(this.value != ""){ 45 | let k = this.value; 46 | let c = k - 273.15; 47 | let f = (k - 273.15) * 9/5 + 32; 48 | if(!Number.isInteger(c)) { 49 | c = c.toFixed(4); 50 | } 51 | if(!Number.isInteger(f)) { 52 | f = f.toFixed(4); 53 | } 54 | cel.value = c; 55 | fah.value = f; 56 | } else { 57 | cel.value = ""; 58 | fah.value = ""; 59 | } 60 | }); -------------------------------------------------------------------------------- /projects/tempconvert/assets/style.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@200;300;400;500;600;700&display=swap'); 2 | 3 | * { 4 | margin: 0; 5 | padding: 0; 6 | box-sizing: border-box; 7 | } 8 | html { 9 | font-size: 62.5%; 10 | } 11 | body { 12 | background: linear-gradient(to right, #ff512f, #dd2476); 13 | min-height: 100vh; 14 | overflow: hidden; 15 | font-family: 'Poppins', sans-serif; 16 | } 17 | h1 { 18 | font-size: 2.5rem; 19 | text-align: center; 20 | } 21 | #container { 22 | text-align: center; 23 | background: #ffffff; 24 | padding: 2rem; 25 | border-radius: .7rem; 26 | width: 40rem; 27 | margin: 10rem auto; 28 | box-shadow: 0 .2rem 1rem rgba(0,0,0,.4); 29 | transition: .3s; 30 | } 31 | .input-wrapper { 32 | display: flex; 33 | flex-direction: column; 34 | justify-content: center; 35 | margin: 1rem; 36 | } 37 | .input-wrapper label { 38 | font-size: 1.8rem; 39 | text-align: left; 40 | } 41 | .input-wrapper input { 42 | padding: 1.2rem; 43 | font-size: 3rem; 44 | width: 100%; 45 | margin-top: -1rem; 46 | font-weight: bold; 47 | text-align: center; 48 | outline: none; 49 | border: 1px solid gray; 50 | border-radius: .5rem; 51 | } 52 | .input-wrapper input:focus { 53 | border: 1px solid blueviolet; 54 | } 55 | .input-wrapper input::-webkit-outer-spin-button, ::-webkit-inner-spin-button { 56 | display: none; 57 | } 58 | 59 | @media screen and (max-width:460px) { 60 | html { 61 | font-size: 52%; 62 | } 63 | } -------------------------------------------------------------------------------- /projects/tempconvert/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Temperature Converter 8 | 9 | 10 | 11 | 12 | 13 |
    14 |

    Temperature Converter

    15 | 16 |
    17 |
    18 | 19 |
    20 | 21 |
    22 |
    23 | 24 |
    25 | 26 |
    27 |
    28 | 29 |
    30 | 31 |
    32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /projects/todo/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | JavaScript Todo 8 | 9 | 10 | 11 | 12 |
    13 | 14 |
    15 |
    16 |
    Todo App
    17 |
    18 | 19 | 20 |
    21 |
      22 | 23 |
    24 | 28 |
    29 | 30 | 31 | -------------------------------------------------------------------------------- /projects/todo/script.js: -------------------------------------------------------------------------------- 1 | const inputBox = document.querySelector(".inputf input"); 2 | const addBtn = document.querySelector(".inputf button"); 3 | const todoList = document.querySelector(".todoList"); 4 | const deleteAllBtn = document.querySelector(".footer button"); 5 | 6 | inputBox.onkeyup = (e) => { 7 | let userEnteredValue = inputBox.value; 8 | if(userEnteredValue.trim() != 0){ 9 | addBtn.classList.add("active"); 10 | if(e.keyCode==13){ 11 | addBtn.click(); 12 | } 13 | }else{ 14 | addBtn.classList.remove("active"); 15 | } 16 | } 17 | showTodos(); 18 | 19 | addBtn.onclick = () => { 20 | let userEnteredValue = inputBox.value; 21 | let getLocalStorageData = localStorage.getItem("Todos"); 22 | if(getLocalStorageData == null){ 23 | listArray = []; 24 | }else{ 25 | listArray = JSON.parse(getLocalStorageData); 26 | } 27 | listArray.push(userEnteredValue); 28 | localStorage.setItem("Todos", JSON.stringify(listArray)); 29 | showTodos(); 30 | addBtn.classList.remove("active"); 31 | } 32 | 33 | function showTodos(){ 34 | let getLocalStorageData = localStorage.getItem("Todos"); 35 | if(getLocalStorageData == null){ 36 | listArray = []; 37 | }else{ 38 | listArray = JSON.parse(getLocalStorageData); 39 | } 40 | const pendingTasksNumb = document.querySelector(".pendingTasks"); 41 | pendingTasksNumb.textContent = listArray.length; 42 | if(listArray.length > 0){ 43 | deleteAllBtn.classList.add("active"); 44 | }else{ 45 | deleteAllBtn.classList.remove("active"); 46 | } 47 | let newLiTag = ""; 48 | listArray.forEach((element, index) => { 49 | newLiTag += `
  • ${index+1}. ${element}
  • `; 50 | }); 51 | todoList.innerHTML = newLiTag; 52 | inputBox.value = ""; 53 | } 54 | 55 | // delete todo 56 | function deleteTask(index){ 57 | let getLocalStorageData = localStorage.getItem("Todos"); 58 | listArray = JSON.parse(getLocalStorageData); 59 | listArray.splice(index, 1); 60 | localStorage.setItem("Todos", JSON.stringify(listArray)); 61 | showTodos(); 62 | } 63 | 64 | // delete all todos 65 | deleteAllBtn.onclick = ()=>{ 66 | listArray = []; 67 | localStorage.setItem("Todos", JSON.stringify(listArray)); 68 | showTodos(); 69 | } -------------------------------------------------------------------------------- /projects/todo/style.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@200;300;400;500;600;700&display=swap'); 2 | *{ 3 | margin: 0; 4 | padding: 0; 5 | box-sizing: border-box; 6 | font-family: 'Poppins', sans-serif; 7 | } 8 | ::selection{ 9 | color: #ffff; 10 | background: rgb(130, 62, 219); 11 | } 12 | body{ 13 | width: 100%; 14 | height: 100vh; 15 | padding: 10px; 16 | background: linear-gradient(to right, #11998e, #38ef7d); 17 | } 18 | .container{ 19 | background: rgba(255, 255, 255, 0.40); 20 | transform-style: preserve-3d; 21 | transition: .3s; 22 | backdrop-filter: blur(100px); 23 | box-shadow: 0 15px 35px rgba(0, 0, 0, 0.6); 24 | max-width: 400px; 25 | width: 100%; 26 | margin: 120px auto; 27 | padding: 25px; 28 | border-radius: 5px; 29 | box-shadow: 0px 10px 15px rgba(0,0,0,0.1); 30 | } 31 | .container header{ 32 | font-size: 30px; 33 | font-weight: 600; 34 | text-align: center; 35 | } 36 | .container .inputf{ 37 | margin: 20px 0; 38 | width: 100%; 39 | display: flex; 40 | height: 45px; 41 | } 42 | .inputf input{ 43 | width: 85%; 44 | height: 100%; 45 | outline: none; 46 | border-radius: 3px; 47 | border: 1px solid #ccc; 48 | font-size: 17px; 49 | padding-left: 15px; 50 | transition: all 0.3s ease; 51 | } 52 | .inputf input:focus{ 53 | border-color: #7c05b3; 54 | } 55 | .inputf button{ 56 | width: 50px; 57 | height: 100%; 58 | border: none; 59 | color: #fff; 60 | margin-left: 5px; 61 | font-size: 21px; 62 | outline: none; 63 | background: #7c05b3; 64 | cursor: pointer; 65 | border-radius: 3px; 66 | opacity: 0.6; 67 | pointer-events: none; 68 | transition: all 0.3s ease; 69 | } 70 | .inputf button:hover, 71 | .footer button:hover{ 72 | background: rgb(137, 67, 228); 73 | } 74 | .inputf button.active{ 75 | opacity: 1; 76 | pointer-events: auto; 77 | } 78 | .container .todoList{ 79 | max-height: 250px; 80 | overflow-y: auto; 81 | } 82 | .todoList li{ 83 | position: relative; 84 | list-style: none; 85 | height: 45px; 86 | line-height: 45px; 87 | margin-bottom: 8px; 88 | background: #f2f2f2; 89 | border-radius: 3px; 90 | padding: 0 15px; 91 | cursor: default; 92 | overflow: hidden; 93 | } 94 | .todoList li .icon{ 95 | position: absolute; 96 | right: -45px; 97 | background: #dd4230; 98 | width: 45px; 99 | text-align: center; 100 | color: #fff; 101 | border-radius: 0 3px 3px 0; 102 | cursor: pointer; 103 | transition: all 0.2s ease; 104 | } 105 | .todoList li:hover .icon{ 106 | right: 0px; 107 | } 108 | .container .footer{ 109 | display: flex; 110 | width: 100%; 111 | margin-top: 20px; 112 | align-items: center; 113 | justify-content: space-between; 114 | } 115 | .footer button{ 116 | padding: 6px 10px; 117 | border-radius: 3px; 118 | border: none; 119 | outline: none; 120 | color: #fff; 121 | font-weight: 400; 122 | font-size: 16px; 123 | margin-left: 5px; 124 | background: #7c05b3; 125 | cursor: pointer; 126 | user-select: none; 127 | opacity: 0.6; 128 | pointer-events: none; 129 | transition: all 0.3s ease; 130 | } 131 | .footer button.active{ 132 | opacity: 1; 133 | pointer-events: auto; 134 | } 135 | .backbtn { 136 | position: absolute; 137 | font-size: 2rem; 138 | float: left; 139 | cursor: pointer; 140 | margin-top: 1.5rem; 141 | margin-left: 10rem; 142 | color:rgb(0, 0, 0); 143 | } 144 | .backbtn a{ 145 | text-decoration: none; 146 | color: inherit; 147 | } -------------------------------------------------------------------------------- /projects/twonumcalc/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Simple Calculator | JavaScript-Projects 5 | 6 | 7 | 8 | 9 | 10 |
    11 | 12 |
    13 |
    14 |
    15 |

    JavaScript 2 Num Calc

    16 |
    17 |
    18 | 19 | 20 | 21 | 22 |
    23 | 24 | 30 |
    31 | 36 |
    37 |
    38 |
    39 |

    40 |
    41 |
    42 |
    43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /projects/twonumcalc/script.js: -------------------------------------------------------------------------------- 1 | function calc(){ 2 | var num2 = document.getElementById('num1').value; 3 | var num1 = document.getElementById('num2').value; 4 | var operation = document.getElementById('operations').value; 5 | var result = document.getElementById('resdata'); 6 | var res=""; 7 | 8 | switch(operation){ 9 | case 'add': sum = parseFloat(num1) + parseFloat(num2); 10 | res = "The addition of two number is " + sum; 11 | break; 12 | case 'sub': sub = parseFloat(num1) - parseFloat(num2); 13 | res = "The subtraction of two number is " + sub; 14 | break; 15 | case 'mult': mult = parseFloat(num1) * parseFloat(num2); 16 | res = "The multiplication of two number is " + mult; 17 | break; 18 | case 'div': div = parseFloat(num1) / parseFloat(num2); 19 | res = "The division of two number is " + div; 20 | break; 21 | default: res = "Sorry it not exist!"; 22 | } 23 | result.innerHTML=res; 24 | } -------------------------------------------------------------------------------- /projects/twonumcalc/style.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@300;400&display=swap'); 2 | 3 | *{ 4 | margin: 0; 5 | padding: 0; 6 | box-sizing: border-box; 7 | } 8 | body { 9 | background: linear-gradient(to right, #8e2de2, #4a00e0); 10 | font-size: 62.5%; 11 | overflow: hidden; 12 | font-family: 'Poppins', sans-serif; 13 | display: flex; 14 | min-height: 100vh; 15 | } 16 | body, button, input { 17 | font-weight: 700; 18 | letter-spacing: .1rem; 19 | } 20 | .container { 21 | flex: 0 1 30rem; 22 | margin: auto; 23 | padding: 1rem; 24 | } 25 | .screen { 26 | position: relative; 27 | background: rgba(240, 240, 240); 28 | border-radius: 15px; 29 | box-shadow: 0 15px 35px rgba(0, 0, 0, 0.5); 30 | } 31 | .screen-body{ 32 | flex: 1; 33 | padding: 1rem 3rem 3rem 3rem; 34 | } 35 | h3 { 36 | text-align: center; 37 | color: #2f019b; 38 | font-size: 26px; 39 | text-transform: uppercase; 40 | padding: 10px; 41 | } 42 | .form-control { 43 | width: 100%; 44 | padding: .5rem; 45 | background: #4f25e4; 46 | border: none; 47 | border-bottom: 2px solid rgb(245, 180, 1); 48 | color: rgb(255, 255, 255); 49 | font-size: 1rem; 50 | margin-bottom: 10px; 51 | text-transform: uppercase; 52 | font-family: 'Poppins', sans-serif; 53 | outline: none; 54 | transition: border-color .2s; 55 | border-radius: .2rem; 56 | letter-spacing: .1rem; 57 | } 58 | .form-control::placeholder { 59 | font-size: .8rem; 60 | color: rgb(224, 223, 223); 61 | } 62 | .form-control:focus { 63 | border-bottom-color: rgb(238, 27, 27); 64 | } 65 | .showdata{ 66 | text-align: center; 67 | color: rgb(44, 0, 80); 68 | font-size: 1.2rem; 69 | padding: 0 1rem 1.5rem 1rem; 70 | } 71 | .options select{ 72 | padding: 0.5rem; 73 | width: 100%; 74 | font-size: 1rem; 75 | font-weight: 500; 76 | border: 2px solid #333; 77 | border-radius: .2rem; 78 | } 79 | .submitbtn{ 80 | margin-top: 2rem; 81 | text-align: center; 82 | } 83 | #submit { 84 | line-height: 0; 85 | padding: 1rem 1rem; 86 | border-radius: .5em; 87 | transition: 0.5s; 88 | color: rgb(20, 20, 20); 89 | cursor: pointer; 90 | background: #ffa600; 91 | } 92 | #submit:hover{ 93 | background: #e79702; 94 | } 95 | #submit span { 96 | font-weight: 600; 97 | font-size: 1rem; 98 | } 99 | #submit i { 100 | margin-left: 0.2rem; 101 | font-size: .8rem; 102 | transition: 0.3s; 103 | } 104 | #submit:hover i { 105 | transform: translateX(5px); 106 | } 107 | 108 | 109 | .backbtn { 110 | position: absolute; 111 | font-size: 2rem; 112 | float: left; 113 | cursor: pointer; 114 | top: 3rem; 115 | margin-left: 10rem; 116 | color:rgb(255, 255, 255); 117 | } 118 | .backbtn a{ 119 | text-decoration: none; 120 | color: inherit; 121 | } -------------------------------------------------------------------------------- /projects/wekeep/assets/fav.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/projects/wekeep/assets/fav.ico -------------------------------------------------------------------------------- /projects/wekeep/assets/script.js: -------------------------------------------------------------------------------- 1 | const addBtn = document.getElementById('addBtn'); 2 | 3 | const updateNote = () => { 4 | const textAreaData = document.querySelectorAll('textarea') 5 | const notes = []; 6 | textAreaData.forEach((note) => { 7 | if(note.value != ""){ 8 | return notes.push(note.value); 9 | } 10 | }); 11 | localStorage.setItem('notes', JSON.stringify(notes)); 12 | } 13 | 14 | const addNewNote = (txt = '') => { 15 | 16 | const notesContainer = document.getElementById('notesContainer'); 17 | const note = document.createElement('div'); 18 | const classes = ['note','h-52','p-2','bg-purple-800','rounded','flex','flex-col','shadow-lg','border-b-4','border-yellow-400']; 19 | note.classList.add(...classes); 20 | 21 | const htmlData = ` 22 |
    23 | 24 | 25 |
    26 | 27 |
    28 | `; 29 | 30 | note.insertAdjacentHTML('afterbegin',htmlData); 31 | 32 | const editBtn = note.querySelector('.edit'); 33 | const delBtn = note.querySelector('.delete'); 34 | const noteTxt = note.querySelector('.noteTxt'); 35 | const textArea = note.querySelector('textarea'); 36 | 37 | // delete note 38 | delBtn.addEventListener('click', () => { 39 | note.classList.add('animate-ping','opacity-30'); 40 | setTimeout(() => { 41 | note.remove(); 42 | updateNote(); 43 | }, 200); 44 | }); 45 | 46 | textArea.value = txt; 47 | noteTxt.innerHTML = txt; 48 | 49 | // edit btn event 50 | editBtn.addEventListener('click', () => { 51 | noteTxt.classList.toggle('hidden'); 52 | textArea.classList.toggle('hidden'); 53 | if(textArea.classList.contains('hidden')) { 54 | editBtn.textContent = "edit_note"; 55 | } else { 56 | editBtn.textContent = "done"; 57 | } 58 | updateNote(); 59 | }); 60 | 61 | textArea.addEventListener('change', (event) => { 62 | const value = event.target.value; 63 | noteTxt.innerHTML = value; 64 | if(note.value != ""){ 65 | updateNote(); 66 | } 67 | }); 68 | 69 | notesContainer.appendChild(note); 70 | } 71 | 72 | // fetch stored notes from localstorage 73 | const notes = JSON.parse(localStorage.getItem('notes')); 74 | if(notes) { 75 | notes.forEach((note) => addNewNote(note)); 76 | } 77 | 78 | // add new note btn event 79 | addBtn.addEventListener('click', () => addNewNote() ); -------------------------------------------------------------------------------- /projects/wekeep/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | We Keep | Notes 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
    19 | 20 | 24 |
    25 | 26 |
    27 | 28 | 37 | 38 |
    39 | 40 | 41 | 42 | -------------------------------------------------------------------------------- /projects/wordcount/assets/favic.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jigar-sable/JavaScript-Projects/8ff97cbaa40f77591b2da8439851835f29704dbd/projects/wordcount/assets/favic.ico -------------------------------------------------------------------------------- /projects/wordcount/assets/script.js: -------------------------------------------------------------------------------- 1 | const textArea = document.getElementById('textArea'); 2 | 3 | textArea.addEventListener('input', function() { 4 | let text = this.value; 5 | document.getElementById('char').innerHTML = text.length 6 | text = text.trim(); 7 | let words = text.split(" "); 8 | // console.log(words); 9 | let wordArr = words.filter(elm => elm != ""); 10 | // console.log(wordArr); 11 | document.getElementById('word').innerHTML = wordArr.length; 12 | }); -------------------------------------------------------------------------------- /projects/wordcount/assets/style.css: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@200;300;400;500;600;700&display=swap'); 2 | 3 | * { 4 | margin: 0; 5 | padding: 0; 6 | box-sizing: border-box; 7 | } 8 | 9 | body { 10 | min-height: 100vh; 11 | width: 100%; 12 | font-size: 62.5%; 13 | overflow: hidden; 14 | background: linear-gradient(to right, #8e2de2, #4a00e0); 15 | font-family: 'Poppins', sans-serif; 16 | } 17 | .container { 18 | background: rgba(255, 255, 255, 0.4); 19 | transform-style: preserve-3d; 20 | box-shadow: 0 15px 35px rgba(0, 0, 0, 0.3); 21 | max-width: 35rem; 22 | width: 100%; 23 | margin: 6rem auto; 24 | padding: 1rem 2rem; 25 | border-radius: .5rem; 26 | transition: .3s; 27 | 28 | display: flex; 29 | flex-direction: column; 30 | justify-content: center; 31 | align-items: center; 32 | } 33 | 34 | 35 | h1 { 36 | font-size: 1.7rem; 37 | text-align: center; 38 | color: #111; 39 | } 40 | textarea { 41 | resize: none; 42 | margin-top: .8rem; 43 | width: 100%; 44 | border-radius: .5rem; 45 | font-size: 1.3rem; 46 | padding: .5rem; 47 | outline: none; 48 | border: 2px solid rgb(55, 0, 158); 49 | } 50 | p { 51 | font-size: 2.1rem; 52 | font-weight: bold; 53 | color: rgb(83, 0, 0); 54 | padding: .8rem; 55 | } 56 | p #word, #char{ 57 | color: #000000; 58 | } 59 | 60 | @media screen and (max-width:570px) { 61 | html { 62 | font-size: 65%; 63 | } 64 | } -------------------------------------------------------------------------------- /projects/wordcount/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Word Char Counter 9 | 10 | 11 | 12 |
    13 | 14 |

    Word & Character Counter

    15 | 16 |

    17 | 0 Words 18 | 0 Character 19 |

    20 | 21 |
    22 | 23 | 24 | 25 | 26 | --------------------------------------------------------------------------------