129 |
130 |
공학용 계산기
131 |
138 |
139 |
140 |
141 |
147 |
153 |
154 |
155 |
156 |
{expression}
157 |
{result}
158 |
159 |
160 |
161 | {standardKeypad.flat().map((key) => (
162 |
173 | ))}
174 |
175 |
176 | {isEngineeringMode && (
177 |
178 | {engineeringFunctions.map((func) => (
179 |
186 | ))}
187 |
188 | )}
189 |
190 | {history.length > 0 && (
191 |
192 |
계산 기록:
193 | {history.map((item, index) => (
194 |
195 |
{item.expression}
196 |
{item.result}
197 |
198 | ))}
199 |
200 | )}
201 |
202 | );
203 | };
204 |
205 | export default Calculator;
206 |
--------------------------------------------------------------------------------
/src/App.css:
--------------------------------------------------------------------------------
1 | /* CSS 변수 정의 */
2 | :root {
3 | --text-color: #333;
4 | --header-color: #2196f3;
5 | --calculator-bg: #f5f5f5;
6 | --calculator-shadow: rgba(0, 0, 0, 0.1);
7 | --toggle-bg: #333;
8 | --toggle-border: #ddd;
9 | --mode-toggle-bg: #e0e0e0;
10 | --mode-active-bg: #fff;
11 | --mode-active-color: #333;
12 | --display-bg: #fff;
13 | --display-shadow: rgba(0, 0, 0, 0.1);
14 | --expression-color: #757575;
15 | --result-color: #333;
16 | --key-bg: #fff;
17 | --key-hover-bg: #f0f0f0;
18 | --operator-bg: #2196f3;
19 | --operator-color: #fff;
20 | --equals-bg: #4caf50;
21 | --equals-color: #fff;
22 | --clear-bg: #ff9800;
23 | --clear-color: #fff;
24 | --function-bg: #e3f2fd;
25 | --function-color: #333;
26 | --functions-area-bg: #e3f2fd;
27 | --history-bg: #fff;
28 | --history-border: #e0e0e0;
29 | --history-expression: #757575;
30 | --history-result: #333;
31 | }
32 |
33 | #root {
34 | max-width: 1280px;
35 | margin: 0 auto;
36 | padding: 2rem;
37 | text-align: center;
38 | }
39 |
40 | .logo {
41 | height: 6em;
42 | padding: 1.5em;
43 | will-change: filter;
44 | transition: filter 300ms;
45 | }
46 | .logo:hover {
47 | filter: drop-shadow(0 0 2em #646cffaa);
48 | }
49 | .logo.react:hover {
50 | filter: drop-shadow(0 0 2em #61dafbaa);
51 | }
52 |
53 | @keyframes logo-spin {
54 | from {
55 | transform: rotate(0deg);
56 | }
57 | to {
58 | transform: rotate(360deg);
59 | }
60 | }
61 |
62 | @media (prefers-reduced-motion: no-preference) {
63 | a:nth-of-type(2) .logo {
64 | animation: logo-spin infinite 20s linear;
65 | }
66 | }
67 |
68 | .card {
69 | padding: 2em;
70 | }
71 |
72 | .read-the-docs {
73 | color: #888;
74 | }
75 |
76 | /* 계산기 스타일 */
77 | .container {
78 | max-width: 800px;
79 | margin: 0 auto;
80 | padding: 20px;
81 | font-family: 'Arial', sans-serif;
82 | color: var(--text-color);
83 | }
84 |
85 | header {
86 | margin-bottom: 30px;
87 | }
88 |
89 | header h1 {
90 | color: var(--header-color);
91 | margin-bottom: 10px;
92 | }
93 |
94 | .calculator {
95 | display: flex;
96 | flex-direction: column;
97 | background-color: var(--calculator-bg);
98 | border-radius: 24px;
99 | box-shadow: 0 4px 12px var(--calculator-shadow);
100 | overflow: hidden;
101 | max-width: 400px;
102 | margin: 0 auto;
103 | padding: 20px;
104 | transition: background-color 0.3s ease, box-shadow 0.3s ease;
105 | }
106 |
107 | .calculator-header {
108 | display: flex;
109 | justify-content: space-between;
110 | align-items: center;
111 | margin-bottom: 16px;
112 | }
113 |
114 | .calculator-title {
115 | font-size: 20px;
116 | font-weight: bold;
117 | color: var(--text-color);
118 | }
119 |
120 | .theme-toggle {
121 | width: 40px;
122 | height: 40px;
123 | border-radius: 50%;
124 | background-color: var(--toggle-bg);
125 | border: 2px solid var(--toggle-border);
126 | cursor: pointer;
127 | display: flex;
128 | align-items: center;
129 | justify-content: center;
130 | transition: background-color 0.3s ease, border-color 0.3s ease;
131 | }
132 |
133 | .mode-toggle {
134 | display: flex;
135 | margin-bottom: 16px;
136 | border-radius: 16px;
137 | overflow: hidden;
138 | background-color: var(--mode-toggle-bg);
139 | transition: background-color 0.3s ease;
140 | }
141 |
142 | .mode-toggle button {
143 | flex: 1;
144 | padding: 10px;
145 | border: none;
146 | background-color: transparent;
147 | cursor: pointer;
148 | font-size: 16px;
149 | transition: background-color 0.2s;
150 | color: var(--text-color);
151 | }
152 |
153 | .mode-toggle button.active {
154 | background-color: var(--mode-active-bg);
155 | color: var(--mode-active-color);
156 | font-weight: bold;
157 | }
158 |
159 | .calculator-display {
160 | background-color: var(--display-bg);
161 | padding: 16px;
162 | border-radius: 12px;
163 | margin-bottom: 16px;
164 | box-shadow: inset 0 1px 3px var(--display-shadow);
165 | transition: background-color 0.3s ease, box-shadow 0.3s ease;
166 | }
167 |
168 | .calculator-expression {
169 | font-size: 16px;
170 | color: var(--expression-color);
171 | min-height: 24px;
172 | margin-bottom: 8px;
173 | word-break: break-all;
174 | text-align: left;
175 | }
176 |
177 | .calculator-result {
178 | font-size: 32px;
179 | font-weight: bold;
180 | color: var(--result-color);
181 | min-height: 40px;
182 | word-break: break-all;
183 | text-align: right;
184 | }
185 |
186 | .calculator-keypad {
187 | display: grid;
188 | grid-template-columns: repeat(5, 1fr);
189 | gap: 8px;
190 | margin-bottom: 16px;
191 | }
192 |
193 | .calculator-key {
194 | background-color: var(--key-bg);
195 | border: none;
196 | font-size: 20px;
197 | padding: 16px 0;
198 | border-radius: 12px;
199 | cursor: pointer;
200 | transition: background-color 0.2s, color 0.2s, box-shadow 0.2s;
201 | box-shadow: 0 1px 3px var(--calculator-shadow);
202 | color: var(--text-color);
203 | }
204 |
205 | .calculator-key:hover {
206 | background-color: var(--key-hover-bg);
207 | }
208 |
209 | .calculator-key.operator {
210 | background-color: var(--operator-bg);
211 | color: var(--operator-color);
212 | }
213 |
214 | .calculator-key.equals {
215 | background-color: var(--equals-bg);
216 | color: var(--equals-color);
217 | }
218 |
219 | .calculator-key.clear {
220 | background-color: var(--clear-bg);
221 | color: var(--clear-color);
222 | }
223 |
224 | .calculator-key.function {
225 | background-color: var(--function-bg);
226 | color: var(--function-color);
227 | }
228 |
229 | .calculator-key.backspace {
230 | background-color: var(--key-hover-bg);
231 | }
232 |
233 | .calculator-functions {
234 | display: grid;
235 | grid-template-columns: repeat(5, 1fr);
236 | gap: 8px;
237 | margin-bottom: 16px;
238 | background-color: var(--functions-area-bg);
239 | padding: 8px;
240 | border-radius: 8px;
241 | transition: background-color 0.3s ease;
242 | }
243 |
244 | .calculator-function {
245 | background-color: var(--key-bg);
246 | border: none;
247 | font-size: 16px;
248 | padding: 10px 0;
249 | border-radius: 8px;
250 | cursor: pointer;
251 | transition: background-color 0.2s;
252 | color: var(--text-color);
253 | }
254 |
255 | .calculator-function:hover {
256 | background-color: var(--key-hover-bg);
257 | }
258 |
259 | .calculator-history {
260 | margin-top: 16px;
261 | background-color: var(--history-bg);
262 | border-radius: 12px;
263 | padding: 16px;
264 | box-shadow: 0 1px 3px var(--calculator-shadow);
265 | transition: background-color 0.3s ease, box-shadow 0.3s ease;
266 | }
267 |
268 | .calculator-history h3 {
269 | margin-top: 0;
270 | margin-bottom: 12px;
271 | font-size: 16px;
272 | color: var(--text-color);
273 | text-align: left;
274 | }
275 |
276 | .history-item {
277 | padding: 8px 0;
278 | border-bottom: 1px solid var(--history-border);
279 | text-align: right;
280 | }
281 |
282 | .history-item:last-child {
283 | border-bottom: none;
284 | }
285 |
286 | .history-expression {
287 | font-size: 14px;
288 | color: var(--history-expression);
289 | }
290 |
291 | .history-result {
292 | font-size: 16px;
293 | font-weight: bold;
294 | color: var(--history-result);
295 | }
296 |
--------------------------------------------------------------------------------
/docs/assets/calculator-wireframe.svg:
--------------------------------------------------------------------------------
1 |
2 |