├── README.md
├── design
├── desktop-preview.jpg
├── active-states-theme-1.jpg
├── active-states-theme-2.jpg
├── active-states-theme-3.jpg
├── desktop-design-theme-1.jpg
├── desktop-design-theme-2.jpg
├── desktop-design-theme-3.jpg
├── mobile-design-theme-1.jpg
├── mobile-design-theme-2.jpg
└── mobile-design-theme-3.jpg
└── prjct
├── prjct.html
├── prjct.css
└── prjct.js
/README.md:
--------------------------------------------------------------------------------
1 | # Calculator
2 | A calculator using HTML CSS and JavaScript (Frontend mentor challenge).
3 |
--------------------------------------------------------------------------------
/design/desktop-preview.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AghilesTMA/Calculator/HEAD/design/desktop-preview.jpg
--------------------------------------------------------------------------------
/design/active-states-theme-1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AghilesTMA/Calculator/HEAD/design/active-states-theme-1.jpg
--------------------------------------------------------------------------------
/design/active-states-theme-2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AghilesTMA/Calculator/HEAD/design/active-states-theme-2.jpg
--------------------------------------------------------------------------------
/design/active-states-theme-3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AghilesTMA/Calculator/HEAD/design/active-states-theme-3.jpg
--------------------------------------------------------------------------------
/design/desktop-design-theme-1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AghilesTMA/Calculator/HEAD/design/desktop-design-theme-1.jpg
--------------------------------------------------------------------------------
/design/desktop-design-theme-2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AghilesTMA/Calculator/HEAD/design/desktop-design-theme-2.jpg
--------------------------------------------------------------------------------
/design/desktop-design-theme-3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AghilesTMA/Calculator/HEAD/design/desktop-design-theme-3.jpg
--------------------------------------------------------------------------------
/design/mobile-design-theme-1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AghilesTMA/Calculator/HEAD/design/mobile-design-theme-1.jpg
--------------------------------------------------------------------------------
/design/mobile-design-theme-2.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AghilesTMA/Calculator/HEAD/design/mobile-design-theme-2.jpg
--------------------------------------------------------------------------------
/design/mobile-design-theme-3.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AghilesTMA/Calculator/HEAD/design/mobile-design-theme-3.jpg
--------------------------------------------------------------------------------
/prjct/prjct.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | prjct
8 |
9 |
10 |
11 |
12 |
calc
13 |
14 |
THEME
15 |
16 | - 1
17 | - 2
18 | - 3
19 |
20 |
23 |
24 |
25 |
0
26 |
46 |
47 |
48 |
49 |
50 |
--------------------------------------------------------------------------------
/prjct/prjct.css:
--------------------------------------------------------------------------------
1 | @import url('https://fonts.googleapis.com/css2?family=League+Spartan:wght@100;200;300;400;500;600;700;800;900&display=swap');
2 |
3 | :root{
4 | --Bg-main-bg: hsl(222, 26%, 31%);
5 | --Bg-keyborad-toggle: hsl(223, 31%, 20%);
6 | --Bg-screen: hsl(224, 36%, 15%);
7 |
8 | --Key-bg: hsl(30, 25%, 89%);
9 | --Key-shadow:hsl(28, 16%, 65%);
10 | --Key2-bg: hsl(6, 63%, 50%);
11 | --Key2-shadow: hsl(6, 70%, 34%);
12 | --Key3-bg: hsl(225, 21%, 49%);
13 | --Key3-shadow: hsl(224, 28%, 35%);
14 |
15 | --Text-calc-head: hsl(36, 10%, 90%);
16 | --Text-num-btn: hsl(221, 14%, 31%);
17 | --Text-diff-btn: hsl(36, 10%, 90%);
18 | --Text-screen: hsl(36, 10%, 90%);
19 | --Text-solve-btn: hsl(36, 10%, 90%);
20 |
21 | --Font-size: 32px;
22 | --Font-weight: 700;
23 | --Font-family: 'League Spartan', sans-serif;
24 | }
25 | *{
26 | box-sizing: border-box;
27 | margin: 0;
28 | padding: 0;
29 | font-family: var(--Font-family);
30 | }
31 | body{
32 | background-color: var(--Bg-main-bg);
33 | padding: 1rem;
34 | min-height: 100vh;
35 | display: flex;
36 | align-items: center;
37 | justify-content: center;
38 | }
39 | /* Calculator styling: */
40 | @media(max-width: 50rem){
41 | .calc-container{
42 | width: 100%;
43 | max-width: 400px;
44 | }
45 | }
46 | @media(min-width: 50rem){
47 | .calc-container{
48 | width: 50%;
49 | max-width: 500px;
50 | }
51 | }
52 |
53 | .calc-container{
54 | background-color: var(--Bg-main-bg);
55 | display: flex;
56 | flex-direction: column;
57 | align-items: center;
58 | justify-content: space-between;
59 | gap: 2rem;
60 | }
61 | .calc-head{
62 | display: flex;
63 | width: 100%;
64 | align-items: flex-end;
65 | justify-content: space-between;
66 | color: var(--Text-calc-head);
67 | }
68 | .calc-name{
69 | font-weight: var(--Font-weight);
70 | font-size: var(--Font-size);
71 | }
72 | .themes{
73 | display: grid;
74 | grid-template-columns: 1fr 1fr;
75 | column-gap: 1.5rem;
76 | grid-template-areas:
77 | ". numbers"
78 | "theme btn"
79 | ;
80 | max-width: 150px;
81 | font-weight: 600;
82 | }
83 | .toggle-btn{
84 | background-color: var(--Bg-keyborad-toggle);
85 | width: 100%;
86 | height: 100%;
87 | grid-area: btn;
88 | border-radius: 100px;
89 | padding: .2rem;
90 | display: flex;
91 | align-items: center;
92 | justify-content: flex-start;
93 | }
94 | .toggle-btn:hover{
95 | cursor: pointer;
96 | }
97 | .select{
98 | background-color: var(--Key2-bg);
99 | height: 100%;
100 | aspect-ratio: 1/1;
101 | border-radius: 100px;
102 | transition: transform 250ms ease;
103 | }
104 |
105 | .numbers{
106 | display: flex;
107 | list-style: none;
108 | grid-area: numbers;
109 | align-items: center;
110 | justify-content: space-between;
111 | padding: .2rem;
112 | }
113 | .theme{
114 | grid-area: theme;
115 | }
116 |
117 |
118 | .screen{
119 | width: 100%;
120 | aspect-ratio: 7/2;
121 | border-radius: 20px;
122 | background-color: var(--Bg-screen);
123 | display: flex;
124 | align-items: center;
125 | justify-content: flex-end;
126 | padding: 1rem;
127 | font-size: var(--Font-size);
128 | font-weight: var(--Font-weight);
129 | overflow-x: hidden;
130 | color: var(--Text-screen);
131 | }
132 |
133 |
134 | .buttons{
135 | list-style: none;
136 | background-color: var(--Bg-keyborad-toggle);
137 | width: 100%;
138 | display: grid;
139 | grid-template-columns: 1fr 1fr 1fr 1fr;
140 | gap: 1rem;
141 | padding: 1rem;
142 | border-radius: 5px;
143 | }
144 | .button{
145 | height: 50px;
146 | border-radius: 5px;
147 | display: grid;
148 | place-items: center;
149 | font-size: 1.5rem;
150 | font-weight: var(--Font-weight);
151 | transition: box-shadow 150ms ease;
152 | transition: transform 150ms ease;
153 | }
154 | .num-or-op{
155 | background-color: var(--Key-bg);
156 | color: var(--Text-num-btn);
157 | box-shadow: 0 5px 0px var(--Key-shadow);
158 | }
159 | .del,.reset{
160 | background-color: var(--Key3-bg);
161 | box-shadow: 0 5px 0 var(--Key3-shadow);
162 | color: var(--Text-diff-btn);
163 | }
164 | .solve{
165 | background-color: var(--Key2-bg);
166 | box-shadow: 0 5px 0 var(--Key2-shadow);
167 | color: var(--Text-solve-btn);
168 | }
169 | .button:hover{
170 | filter: brightness(110%);
171 | cursor: pointer;
172 | }
173 | .button:active{
174 | box-shadow: none;
175 | transform: translateY(5px);
176 | }
177 | .reset{
178 | grid-column: 1/3;
179 | }
180 | .solve{
181 | grid-column: 3/5;
182 | }
--------------------------------------------------------------------------------
/prjct/prjct.js:
--------------------------------------------------------------------------------
1 | //calculation logic:
2 | //defining variables:
3 | const buttons = document.querySelector(".buttons");
4 | const button = document.querySelectorAll(".button");
5 | const screen = document.querySelector(".screen");
6 | let equationArr = [];
7 | let theme = 0;
8 | const toggleBtn = document.querySelector(".toggle-btn");
9 | const toggleDot = document.querySelector(".select");
10 | let root = document.querySelector(":root");
11 | let rootStyles = getComputedStyle(root);
12 |
13 | if (localStorage.getItem("theme")!== null) {
14 | theme = parseInt(localStorage.getItem("theme"));
15 | changeTheme();
16 | }
17 |
18 |
19 | function isNumber(num) {
20 | return !isNaN(num);
21 | }
22 | function solveEquation() {
23 | let secondArr = [];
24 | let simplyfiedArr = [];
25 | let solutionArr = [];
26 | let number = "";
27 | if (matchOp(equationArr.at(-1))) {
28 | equationArr.pop();
29 | }
30 | for (let k = 0; k < equationArr.length; k++) {
31 | if (isNumber(equationArr[k]) || equationArr[k] == ".") {
32 | number += equationArr[k];
33 | }
34 | if (matchOp(equationArr[k])) {
35 | secondArr.push(number);
36 | secondArr.push(equationArr[k]);
37 | number = "";
38 | }
39 | }
40 | secondArr.push(number);
41 | number = "";
42 |
43 | let n = 0;
44 | while (n < secondArr.length) {
45 | if (secondArr[n] != "x" && secondArr[n] != "/") {
46 | simplyfiedArr.push(secondArr[n]);
47 | } else {
48 | if (secondArr[n] == "x") {
49 | let prev = simplyfiedArr.pop();
50 | let curr = parseFloat(prev) * parseFloat(secondArr[n + 1]);
51 | simplyfiedArr.push(curr);
52 | n++;
53 | } else {
54 | if (parseFloat(secondArr[n + 1]) == 0) {
55 | equationArr = [];
56 | secondArr = [];
57 | simplyfiedArr = [];
58 | screen.innerHTML = "Error can't devide by zero";
59 | return;
60 | } else {
61 | let prev = simplyfiedArr.pop();
62 | let curr = parseFloat(prev) / parseFloat(secondArr[n + 1]);
63 | simplyfiedArr.push(curr);
64 | n++;
65 | }
66 | }
67 | }
68 | n++;
69 | }
70 |
71 | let m = 0;
72 | while (m < simplyfiedArr.length) {
73 | if (simplyfiedArr[m] != "+" && simplyfiedArr[m] != "-") {
74 | solutionArr.push(simplyfiedArr[m]);
75 | } else {
76 | if (simplyfiedArr[m] == "+") {
77 | let prev = solutionArr.pop();
78 | let curr = parseFloat(prev) + parseFloat(simplyfiedArr[m + 1]);
79 | solutionArr.push(curr);
80 | } else {
81 | let prev = solutionArr.pop();
82 | let curr = parseFloat(prev) - parseFloat(simplyfiedArr[m + 1]);
83 | solutionArr.push(curr);
84 | }
85 | m++;
86 | }
87 | m++;
88 | }
89 | equationArr = [solutionArr.join("")];
90 | screen.innerHTML = parseFloat(solutionArr.join(""));
91 | }
92 | function matchOp(content) {
93 | let operations = new Set();
94 | operations.add("+");
95 | operations.add("-");
96 | operations.add("/");
97 | operations.add("x");
98 | if (operations.has(content)) {
99 | return true;
100 | } else {
101 | return false;
102 | }
103 | }
104 | button.forEach((btn) => {
105 | btn.addEventListener("click", (e) => {
106 | if (btn.classList.contains("reset")) {
107 | equationArr = [];
108 | screen.innerHTML = "0";
109 | } else if (btn.classList.contains("del")) {
110 | equationArr.pop();
111 | let screenStr = equationArr.join("");
112 | screen.innerHTML = screenStr;
113 | } else if (btn.classList.contains("solve")) {
114 | solveEquation();
115 | } else {
116 | if (
117 | (matchOp(btn.innerHTML) && equationArr.length == 0) ||
118 | (matchOp(btn.innerHTML) && matchOp(equationArr.at(-1)))
119 | ) {
120 | return;
121 | } else {
122 | equationArr.push(btn.innerHTML);
123 | let screenContent = equationArr.join("");
124 | screen.innerHTML = screenContent;
125 | }
126 | }
127 | });
128 | });
129 |
130 | //changing themes:
131 |
132 | function changeTheme() {
133 | toggleDot.style.transform = `translateX(${15 * theme}px)`;
134 | if (theme == 0) {
135 | root.style.cssText = `--Bg-main-bg: hsl(222, 26%, 31%);
136 | --Bg-keyborad-toggle: hsl(223, 31%, 20%);
137 | --Bg-screen: hsl(224, 36%, 15%);
138 |
139 | --Key-bg: hsl(30, 25%, 89%);
140 | --Key-shadow:hsl(28, 16%, 65%);
141 | --Key2-bg: hsl(6, 63%, 50%);
142 | --Key2-shadow: hsl(6, 70%, 34%);
143 | --Key3-bg: hsl(225, 21%, 49%);
144 | --Key3-shadow: hsl(224, 28%, 35%);
145 |
146 | --Text-dark: hsl(221, 14%, 31%);
147 | --Text-light: hsl(0, 0%, 100%);
148 | --Text-light-sec: hsl(36, 10%, 90%);
149 | --Text-solve-btn: hsl(36, 10%, 90%);
150 | `;
151 | }
152 | if (theme == 1) {
153 | root.style.cssText = `--Bg-main-bg: hsl(0, 0%, 90%);
154 | --Bg-keyborad-toggle: hsl(0, 5%, 81%);
155 | --Bg-screen: hsl(0, 0%, 93%);
156 |
157 | --Key3-bg: hsl(185, 42%, 37%);
158 | --Key3-shadow:hsl(185, 58%, 25%);
159 | --Key2-bg: hsl(25, 98%, 40%);
160 | --Key2-shadow: hsl(25, 99%, 27%);
161 | --Key-bg: hsl(45, 7%, 89%);
162 | --Key-shadow: hsl(35, 11%, 61%);
163 |
164 | --Text-calc-head: hsl(52, 8%, 19%);
165 | --Text-num-btn: hsl(52, 8%, 19%);
166 | --Text-diff-btn: #fff;
167 | --Text-screen: hsl(52, 8%, 19%);
168 | --Text-solve-btn: #fff;
169 | `;
170 | document.querySelector(".calc-head").style.color = "hsl(60, 9%, 20%))";
171 | }
172 | if (theme == 2) {
173 | root.style.cssText = `--Bg-main-bg: hsl(268, 75%, 9%);
174 | --Bg-keyborad-toggle: hsl(268, 71%, 12%);
175 | --Bg-screen: hsl(268, 71%, 12%);
176 |
177 | --Key-bg: hsl(281, 89%, 26%);
178 | --Key-shadow:hsl(285, 91%, 52%);
179 | --Key2-bg: hsl(176, 100%, 44%);
180 | --Key2-shadow: hsl(177, 92%, 70%);
181 | --Key3-bg: hsl(268, 47%, 21%);
182 | --Key3-shadow: hsl(290, 70%, 36%);
183 |
184 | --Text-calc-head: hsl(52, 93%, 62%);
185 | --Text-num-btn: hsl(52, 93%, 62%);
186 | --Text-diff-btn: #fff;
187 | --Text-screen: hsl(52, 93%, 62%);
188 | --Text-solve-btn: hsl(185, 100%, 11%);
189 | `;
190 | }
191 | }
192 |
193 | toggleBtn.addEventListener("click", (e) => {
194 | theme = (theme + 1) % 3;
195 | window.localStorage.setItem("theme", `${theme}`);
196 | changeTheme();
197 | });
198 |
--------------------------------------------------------------------------------