├── 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 | [](https://github.com/jigar-sable/JavaScript-Projects/search?l=html)
11 | [](https://github.com/jigar-sable/JavaScript-Projects/search?l=css)
12 | [](https://github.com/jigar-sable/JavaScript-Projects/search?l=javascript)
13 |
14 | ## Sneak Peek of Home Page 🙈 :
15 | 
16 |
17 |
18 |
📬 Contact
19 |
20 | Feel free to reach me through the below handles if you'd like to contact me.
21 |
22 | [](https://www.linkedin.com/in/jigar-sablee)
23 | [](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 | Search
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 |
20 |
21 |
22 |
23 |
24 |
27 |
28 |
29 | Find Job
30 |
31 |
32 |
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 |
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 |
15 |
16 |
Simple Weather App
17 |
18 |
19 | Submit
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 |
56 |
57 |
${proj.name}
58 |
${proj.desc}
59 |
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 | Projects
24 |
25 |
26 |
27 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
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 |
87 |
88 |
Digital Clock | Live Gradient Changing Effect
89 |
Displays live hour, minutes, seconds and milli-seconds. Gradient Changing effect.
90 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
Simple Counter | Modern UI
101 |
It's a basic counter made using increment and decrement functionality. Also it prevents negative values.
102 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
Background Color Switcher
113 |
It simply switches the background color as user clicks on the button. Colors stored in array.
114 |
118 |
119 |
120 |
121 |
122 |
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 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 | Projects Based on API
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
Country Search App
149 |
150 |
151 |
Simple country search app built using HTML, Bootstrap and JavaScript. API Used Rest Countries
152 |
156 |
157 |
158 |
159 |
160 |
161 |
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 |
172 |
173 |
174 |
175 |
176 |
177 |
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 |
188 |
189 |
190 |
191 |
192 |
193 |
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 |
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 | Switch Color
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 |
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 |
15 |
16 |
Age Calculator
17 |
18 |
19 | Calculate
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 |
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 |
18 |
19 |
JavaScript Issue Tracker
20 |
21 |
Add New Issue :
22 |
42 |
43 |
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 |
15 |
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 |
15 |
16 |
17 |
18 |
19 |
20 | Student Grade Calcy
21 |
22 |
23 |
47 |
48 |
49 |
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 |
15 |
16 |
Password Generator
17 |
23 |
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 | Restart
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 |
43 |
44 |
Submit
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 |
27 |
28 |
29 |
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 |
65 |
66 |
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 | Start
36 | Stop
37 | Reset
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 |
32 |
33 |
34 |
35 |
--------------------------------------------------------------------------------
/projects/todo/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | JavaScript Todo
8 |
9 |
10 |
11 |
12 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
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 |
13 |
14 |
15 |
JavaScript 2 Num Calc
16 |
38 |
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 | ${txt ? "edit_note" : "done" }
24 | delete
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 |
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 |
--------------------------------------------------------------------------------