├── README.md
├── index.html
├── script.js
└── style.css
/README.md:
--------------------------------------------------------------------------------
1 | # qr-code-generator-v1
2 | This is a mini generator for creating a QR Code by writing a text or links.
3 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | QR Code Generator v1
7 |
8 |
9 |
10 |
11 |
15 |
16 |
17 | Generate QR Code
18 |
19 |
20 |
21 |
22 |
25 |
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------
/script.js:
--------------------------------------------------------------------------------
1 | const wrapper = document.querySelector(".wrapper"),
2 | qrInput = wrapper.querySelector(".form input"),
3 | generateBtn = wrapper.querySelector(".form button"),
4 | qrImg = wrapper.querySelector(".qr-code img");
5 | let preValue;
6 |
7 | generateBtn.addEventListener("click", () => {
8 | let qrValue = qrInput.value.trim();
9 | if (!qrValue || preValue === qrValue) return;
10 | preValue = qrValue;
11 | generateBtn.innerText = "Generating QR Code...";
12 | qrImg.src = `https://api.qrserver.com/v1/create-qr-code/?size=200x200&data=${qrValue}`;
13 | qrImg.addEventListener("load", () => {
14 | wrapper.classList.add("active");
15 | generateBtn.innerText = "Generate QR Code";
16 | });
17 | });
18 |
19 | qrInput.addEventListener("keyup", () => {
20 | if (!qrInput.value.trim()) {
21 | wrapper.classList.remove("active");
22 | preValue = "";
23 | }
24 | });
--------------------------------------------------------------------------------
/style.css:
--------------------------------------------------------------------------------
1 | @import url("https://fonts.googleapis.com/css2?family=Poppins:wght@400;500;600;700&display=swap");
2 | @import url("https://fonts.googleapis.com/css2?family=Timmana&display=swap");
3 |
4 | * {
5 | margin: 0;
6 | padding: 0;
7 | box-sizing: border-box;
8 | font-family: "Poppins", sans-serif;
9 | }
10 | body {
11 | display: flex;
12 | margin: 0;
13 | padding: 0;
14 | font-family: Arial, sans-serif;
15 | background: #333;
16 | color: #fff;
17 | font-size: 1.1em;
18 | line-height: 1.5;
19 | align-items: center;
20 | text-align: center;
21 | background-image: linear-gradient(-45deg, #f06, #9f6);
22 | background-size: 400% 400%;
23 | animation: gradient 1s linear infinite;
24 | }
25 |
26 | @keyframes gradient {
27 | 0% {
28 | background-position: 0% 50%;
29 | }
30 | 50% {
31 | background-position: 100% 50%;
32 | }
33 | 100% {
34 | background-position: 0% 50%;
35 | }
36 | }
37 |
38 | .wrapper {
39 | max-width: 500px;
40 | margin: 0 auto;
41 | padding: 20px;
42 | border-radius: 5px;
43 | background: rgba(0, 0, 0, 0.8);
44 | box-shadow: 0 0 25px #000;
45 | }
46 |
47 | .wrapper.active {
48 | height: 530px;
49 | }
50 |
51 | header h1 {
52 | font-size: 21px;
53 | font-weight: 500;
54 | color: #fff;
55 | text-align: center;
56 | }
57 |
58 | header p {
59 | margin-top: 5px;
60 | color: #aaa;
61 | font-size: 16px;
62 | text-align: center;
63 | }
64 |
65 | .wrapper .form {
66 | margin: 20px 0 25px;
67 | }
68 |
69 | .form :where(input, button) {
70 | width: 100%;
71 | height: 55px;
72 | border: none;
73 | outline: none;
74 | border-radius: 5px;
75 | transition: 0.1s ease;
76 | }
77 |
78 | .form input {
79 | font-size: 18px;
80 | padding: 0 17px;
81 | border: 1px solid #999;
82 | color: #fff;
83 | background: #333;
84 | }
85 |
86 | .form input:focus {
87 | box-shadow: 0 3px 6px rgba(0, 0, 0, 0.13);
88 | }
89 |
90 | .form input::placeholder {
91 | color: #999;
92 | }
93 |
94 | .form button {
95 | color: #fff;
96 | cursor: pointer;
97 | margin-top: 20px;
98 | font-size: 17px;
99 | background: #444;
100 | transition: background 0.3s ease, transform 0.2s ease;
101 | }
102 |
103 | .form button:hover {
104 | background: #333;
105 | }
106 |
107 | .form button:active {
108 | transform: scale(0.95);
109 | }
110 |
111 | .qr-code {
112 | opacity: 0;
113 | display: flex;
114 | padding: 33px 0;
115 | border-radius: 5px;
116 | align-items: center;
117 | pointer-events: none;
118 | justify-content: center;
119 | border: 1px solid #ccc;
120 | }
121 |
122 | .wrapper.active .qr-code {
123 | opacity: 1;
124 | pointer-events: auto;
125 | transition: opacity 0.5s 0.05s ease;
126 | }
127 |
128 | .qr-code img {
129 | width: 170px;
130 | }
131 |
132 | @media (max-width: 430px) {
133 | .wrapper {
134 | height: 255px;
135 | padding: 16px 20px;
136 | }
137 | .wrapper.active {
138 | height: 510px;
139 | }
140 | header p {
141 | color: #696969;
142 | }
143 | .form :where(input, button) {
144 | height: 52px;
145 | }
146 | .qr-code img {
147 | width: 160px;
148 | }
149 | }
150 | .wrapper .footer p {
151 | color: #aed8cc;
152 | text-align: center;
153 | font-family: "Timmana", sans-serif;
154 | margin-top: 7px;
155 | }
156 | .wrapper .footer p .ig {
157 | color: #45ffca;
158 | text-align: center;
159 | font-family: "Timmana", sans-serif;
160 | }
161 |
--------------------------------------------------------------------------------