akra35567 commited on
Commit
66dd59b
·
verified ·
1 Parent(s): 580c0bf

Upload 3 files

Browse files
Files changed (3) hide show
  1. src/react/App.css +536 -0
  2. src/react/App.js +369 -0
  3. src/react/index.js +11 -0
src/react/App.css ADDED
@@ -0,0 +1,536 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* SoftEdge Corporation - React Components Styles */
2
+
3
+ .react-app {
4
+ opacity: 0;
5
+ transform: translateY(20px);
6
+ transition: all 0.6s ease;
7
+ }
8
+
9
+ .react-app.visible {
10
+ opacity: 1;
11
+ transform: translateY(0);
12
+ }
13
+
14
+ .react-container {
15
+ max-width: 1200px;
16
+ margin: 0 auto;
17
+ padding: 2rem;
18
+ background: rgba(30, 41, 59, 0.8);
19
+ backdrop-filter: blur(20px);
20
+ border-radius: 1rem;
21
+ border: 1px solid rgba(148, 163, 184, 0.1);
22
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
23
+ }
24
+
25
+ .react-header {
26
+ text-align: center;
27
+ margin-bottom: 2rem;
28
+ padding-bottom: 1rem;
29
+ border-bottom: 1px solid rgba(148, 163, 184, 0.2);
30
+ }
31
+
32
+ .react-header h3 {
33
+ color: #06b6d4;
34
+ font-size: 1.5rem;
35
+ font-weight: 600;
36
+ margin-bottom: 0.5rem;
37
+ }
38
+
39
+ .react-header p {
40
+ color: #94a3b8;
41
+ font-size: 0.9rem;
42
+ }
43
+
44
+ /* Navigation */
45
+ .react-nav {
46
+ display: flex;
47
+ gap: 0.5rem;
48
+ margin-bottom: 2rem;
49
+ flex-wrap: wrap;
50
+ justify-content: center;
51
+ }
52
+
53
+ .nav-item {
54
+ display: flex;
55
+ align-items: center;
56
+ gap: 0.5rem;
57
+ padding: 0.75rem 1rem;
58
+ background: rgba(51, 65, 85, 0.5);
59
+ border: 1px solid rgba(148, 163, 184, 0.2);
60
+ border-radius: 0.5rem;
61
+ color: #cbd5e1;
62
+ font-size: 0.9rem;
63
+ font-weight: 500;
64
+ cursor: pointer;
65
+ transition: all 0.3s ease;
66
+ }
67
+
68
+ .nav-item:hover {
69
+ background: rgba(6, 182, 212, 0.1);
70
+ border-color: rgba(6, 182, 212, 0.3);
71
+ color: #06b6d4;
72
+ transform: translateY(-2px);
73
+ }
74
+
75
+ .nav-item.active {
76
+ background: linear-gradient(135deg, rgba(6, 182, 212, 0.2), rgba(59, 130, 246, 0.2));
77
+ border-color: rgba(6, 182, 212, 0.4);
78
+ color: #06b6d4;
79
+ box-shadow: 0 0 20px rgba(6, 182, 212, 0.2);
80
+ }
81
+
82
+ .nav-icon {
83
+ font-size: 1rem;
84
+ }
85
+
86
+ /* Content */
87
+ .content-container {
88
+ min-height: 400px;
89
+ }
90
+
91
+ .content-section {
92
+ text-align: center;
93
+ }
94
+
95
+ .content-section h2 {
96
+ color: #f1f5f9;
97
+ font-size: 2rem;
98
+ font-weight: 700;
99
+ margin-bottom: 1rem;
100
+ background: linear-gradient(135deg, #06b6d4, #3b82f6);
101
+ -webkit-background-clip: text;
102
+ -webkit-text-fill-color: transparent;
103
+ background-clip: text;
104
+ }
105
+
106
+ .content-section > p {
107
+ color: #94a3b8;
108
+ font-size: 1.1rem;
109
+ margin-bottom: 2rem;
110
+ max-width: 600px;
111
+ margin-left: auto;
112
+ margin-right: auto;
113
+ }
114
+
115
+ /* Feature Grid */
116
+ .feature-grid {
117
+ display: grid;
118
+ grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
119
+ gap: 1.5rem;
120
+ margin-top: 2rem;
121
+ }
122
+
123
+ .feature-card {
124
+ background: rgba(51, 65, 85, 0.5);
125
+ border: 1px solid rgba(148, 163, 184, 0.2);
126
+ border-radius: 0.75rem;
127
+ padding: 1.5rem;
128
+ transition: all 0.3s ease;
129
+ }
130
+
131
+ .feature-card:hover {
132
+ transform: translateY(-5px);
133
+ border-color: rgba(6, 182, 212, 0.3);
134
+ box-shadow: 0 10px 25px rgba(6, 182, 212, 0.1);
135
+ }
136
+
137
+ .feature-icon {
138
+ font-size: 2rem;
139
+ margin-bottom: 1rem;
140
+ }
141
+
142
+ .feature-card h3 {
143
+ color: #f1f5f9;
144
+ font-size: 1.25rem;
145
+ font-weight: 600;
146
+ margin-bottom: 0.5rem;
147
+ }
148
+
149
+ .feature-card p {
150
+ color: #94a3b8;
151
+ font-size: 0.9rem;
152
+ line-height: 1.5;
153
+ }
154
+
155
+ /* Services Grid */
156
+ .services-grid {
157
+ display: grid;
158
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
159
+ gap: 1.5rem;
160
+ margin-top: 2rem;
161
+ }
162
+
163
+ .service-card {
164
+ background: rgba(51, 65, 85, 0.5);
165
+ border: 1px solid rgba(148, 163, 184, 0.2);
166
+ border-radius: 0.75rem;
167
+ padding: 1.5rem;
168
+ transition: all 0.3s ease;
169
+ text-align: left;
170
+ }
171
+
172
+ .service-card:hover {
173
+ transform: translateY(-5px);
174
+ border-color: rgba(6, 182, 212, 0.3);
175
+ box-shadow: 0 10px 25px rgba(6, 182, 212, 0.1);
176
+ }
177
+
178
+ .service-icon {
179
+ font-size: 2.5rem;
180
+ margin-bottom: 1rem;
181
+ }
182
+
183
+ .service-card h3 {
184
+ color: #f1f5f9;
185
+ font-size: 1.25rem;
186
+ font-weight: 600;
187
+ margin-bottom: 0.5rem;
188
+ }
189
+
190
+ .service-card p {
191
+ color: #94a3b8;
192
+ font-size: 0.9rem;
193
+ line-height: 1.5;
194
+ margin-bottom: 1rem;
195
+ }
196
+
197
+ .tech-stack {
198
+ display: flex;
199
+ flex-wrap: wrap;
200
+ gap: 0.5rem;
201
+ }
202
+
203
+ .tech-tag {
204
+ background: rgba(6, 182, 212, 0.1);
205
+ color: #06b6d4;
206
+ padding: 0.25rem 0.75rem;
207
+ border-radius: 9999px;
208
+ font-size: 0.75rem;
209
+ font-weight: 500;
210
+ border: 1px solid rgba(6, 182, 212, 0.2);
211
+ }
212
+
213
+ /* Projects Grid */
214
+ .projects-grid {
215
+ display: grid;
216
+ grid-template-columns: repeat(auto-fit, minmax(350px, 1fr));
217
+ gap: 1.5rem;
218
+ margin-top: 2rem;
219
+ }
220
+
221
+ .project-card {
222
+ background: rgba(51, 65, 85, 0.5);
223
+ border: 1px solid rgba(148, 163, 184, 0.2);
224
+ border-radius: 0.75rem;
225
+ padding: 1.5rem;
226
+ transition: all 0.3s ease;
227
+ text-align: left;
228
+ }
229
+
230
+ .project-card:hover {
231
+ transform: translateY(-5px);
232
+ border-color: rgba(147, 51, 234, 0.3);
233
+ box-shadow: 0 10px 25px rgba(147, 51, 234, 0.1);
234
+ }
235
+
236
+ .project-header {
237
+ display: flex;
238
+ justify-content: space-between;
239
+ align-items: flex-start;
240
+ margin-bottom: 1rem;
241
+ }
242
+
243
+ .project-header h3 {
244
+ color: #f1f5f9;
245
+ font-size: 1.25rem;
246
+ font-weight: 600;
247
+ flex: 1;
248
+ }
249
+
250
+ .status {
251
+ padding: 0.25rem 0.75rem;
252
+ border-radius: 9999px;
253
+ font-size: 0.75rem;
254
+ font-weight: 500;
255
+ text-transform: uppercase;
256
+ }
257
+
258
+ .status.concluído {
259
+ background: rgba(34, 197, 94, 0.1);
260
+ color: #22c55e;
261
+ border: 1px solid rgba(34, 197, 94, 0.2);
262
+ }
263
+
264
+ .status.em-andamento {
265
+ background: rgba(251, 191, 36, 0.1);
266
+ color: #fbbf24;
267
+ border: 1px solid rgba(251, 191, 36, 0.2);
268
+ }
269
+
270
+ .project-card p {
271
+ color: #94a3b8;
272
+ font-size: 0.9rem;
273
+ line-height: 1.5;
274
+ margin-bottom: 1rem;
275
+ }
276
+
277
+ /* About Section */
278
+ .about-content {
279
+ max-width: 800px;
280
+ margin: 0 auto;
281
+ }
282
+
283
+ .team-section {
284
+ margin-bottom: 2rem;
285
+ }
286
+
287
+ .team-section h3 {
288
+ color: #f1f5f9;
289
+ font-size: 1.5rem;
290
+ font-weight: 600;
291
+ margin-bottom: 1.5rem;
292
+ text-align: center;
293
+ }
294
+
295
+ .team-members {
296
+ display: grid;
297
+ grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
298
+ gap: 1rem;
299
+ }
300
+
301
+ .team-member {
302
+ display: flex;
303
+ align-items: center;
304
+ gap: 1rem;
305
+ background: rgba(51, 65, 85, 0.5);
306
+ border: 1px solid rgba(148, 163, 184, 0.2);
307
+ border-radius: 0.5rem;
308
+ padding: 1rem;
309
+ transition: all 0.3s ease;
310
+ }
311
+
312
+ .team-member:hover {
313
+ border-color: rgba(6, 182, 212, 0.3);
314
+ transform: translateY(-2px);
315
+ }
316
+
317
+ .member-avatar {
318
+ width: 40px;
319
+ height: 40px;
320
+ border-radius: 50%;
321
+ background: linear-gradient(135deg, #06b6d4, #3b82f6);
322
+ display: flex;
323
+ align-items: center;
324
+ justify-content: center;
325
+ color: white;
326
+ font-weight: 600;
327
+ font-size: 1.1rem;
328
+ }
329
+
330
+ .member-info h4 {
331
+ color: #f1f5f9;
332
+ font-size: 1rem;
333
+ font-weight: 600;
334
+ margin-bottom: 0.25rem;
335
+ }
336
+
337
+ .member-info p {
338
+ color: #94a3b8;
339
+ font-size: 0.8rem;
340
+ }
341
+
342
+ .mission-section h3 {
343
+ color: #f1f5f9;
344
+ font-size: 1.5rem;
345
+ font-weight: 600;
346
+ margin-bottom: 1rem;
347
+ text-align: center;
348
+ }
349
+
350
+ .mission-section p {
351
+ color: #94a3b8;
352
+ font-size: 1rem;
353
+ line-height: 1.6;
354
+ text-align: center;
355
+ }
356
+
357
+ /* Contact Form */
358
+ .contact-form {
359
+ max-width: 500px;
360
+ margin: 0 auto;
361
+ background: rgba(51, 65, 85, 0.5);
362
+ border: 1px solid rgba(148, 163, 184, 0.2);
363
+ border-radius: 0.75rem;
364
+ padding: 2rem;
365
+ }
366
+
367
+ .form-group {
368
+ margin-bottom: 1.5rem;
369
+ text-align: left;
370
+ }
371
+
372
+ .form-group label {
373
+ display: block;
374
+ color: #f1f5f9;
375
+ font-size: 0.9rem;
376
+ font-weight: 500;
377
+ margin-bottom: 0.5rem;
378
+ }
379
+
380
+ .form-group input,
381
+ .form-group textarea {
382
+ width: 100%;
383
+ padding: 0.75rem;
384
+ background: rgba(30, 41, 59, 0.5);
385
+ border: 1px solid rgba(148, 163, 184, 0.2);
386
+ border-radius: 0.5rem;
387
+ color: #f1f5f9;
388
+ font-size: 0.9rem;
389
+ transition: all 0.3s ease;
390
+ }
391
+
392
+ .form-group input:focus,
393
+ .form-group textarea:focus {
394
+ outline: none;
395
+ border-color: rgba(6, 182, 212, 0.4);
396
+ box-shadow: 0 0 0 3px rgba(6, 182, 212, 0.1);
397
+ }
398
+
399
+ .submit-btn {
400
+ width: 100%;
401
+ padding: 0.75rem;
402
+ background: linear-gradient(135deg, #06b6d4, #3b82f6);
403
+ color: white;
404
+ border: none;
405
+ border-radius: 0.5rem;
406
+ font-size: 1rem;
407
+ font-weight: 600;
408
+ cursor: pointer;
409
+ transition: all 0.3s ease;
410
+ }
411
+
412
+ .submit-btn:hover {
413
+ transform: translateY(-2px);
414
+ box-shadow: 0 5px 15px rgba(6, 182, 212, 0.3);
415
+ }
416
+
417
+ .success-message {
418
+ text-align: center;
419
+ padding: 2rem;
420
+ background: rgba(34, 197, 94, 0.1);
421
+ border: 1px solid rgba(34, 197, 94, 0.2);
422
+ border-radius: 0.75rem;
423
+ }
424
+
425
+ .success-message h3 {
426
+ color: #22c55e;
427
+ font-size: 1.25rem;
428
+ margin-bottom: 0.5rem;
429
+ }
430
+
431
+ .success-message p {
432
+ color: #94a3b8;
433
+ margin-bottom: 1rem;
434
+ }
435
+
436
+ .success-message button {
437
+ padding: 0.5rem 1rem;
438
+ background: rgba(34, 197, 94, 0.2);
439
+ color: #22c55e;
440
+ border: 1px solid rgba(34, 197, 94, 0.3);
441
+ border-radius: 0.5rem;
442
+ cursor: pointer;
443
+ transition: all 0.3s ease;
444
+ }
445
+
446
+ .success-message button:hover {
447
+ background: rgba(34, 197, 94, 0.3);
448
+ }
449
+
450
+ /* Footer */
451
+ .react-footer {
452
+ text-align: center;
453
+ margin-top: 2rem;
454
+ padding-top: 1rem;
455
+ border-top: 1px solid rgba(148, 163, 184, 0.2);
456
+ }
457
+
458
+ .react-footer p {
459
+ color: #94a3b8;
460
+ font-size: 0.9rem;
461
+ }
462
+
463
+ /* Responsive Design */
464
+ @media (max-width: 768px) {
465
+ .react-container {
466
+ padding: 1rem;
467
+ }
468
+
469
+ .react-nav {
470
+ flex-direction: column;
471
+ align-items: stretch;
472
+ }
473
+
474
+ .nav-item {
475
+ justify-content: center;
476
+ }
477
+
478
+ .feature-grid,
479
+ .services-grid,
480
+ .projects-grid {
481
+ grid-template-columns: 1fr;
482
+ }
483
+
484
+ .team-members {
485
+ grid-template-columns: 1fr;
486
+ }
487
+
488
+ .content-section h2 {
489
+ font-size: 1.5rem;
490
+ }
491
+ }
492
+
493
+ /* Animations */
494
+ @keyframes fadeInUp {
495
+ from {
496
+ opacity: 0;
497
+ transform: translateY(30px);
498
+ }
499
+ to {
500
+ opacity: 1;
501
+ transform: translateY(0);
502
+ }
503
+ }
504
+
505
+ .content-section {
506
+ animation: fadeInUp 0.6s ease-out;
507
+ }
508
+
509
+ .react-nav {
510
+ animation: fadeInUp 0.6s ease-out 0.2s both;
511
+ }
512
+
513
+ /* Loading states */
514
+ .loading {
515
+ opacity: 0.7;
516
+ pointer-events: none;
517
+ }
518
+
519
+ .loading::after {
520
+ content: '';
521
+ position: absolute;
522
+ top: 50%;
523
+ left: 50%;
524
+ width: 20px;
525
+ height: 20px;
526
+ margin: -10px 0 0 -10px;
527
+ border: 2px solid rgba(6, 182, 212, 0.3);
528
+ border-top: 2px solid #06b6d4;
529
+ border-radius: 50%;
530
+ animation: spin 1s linear infinite;
531
+ }
532
+
533
+ @keyframes spin {
534
+ 0% { transform: rotate(0deg); }
535
+ 100% { transform: rotate(360deg); }
536
+ }
src/react/App.js ADDED
@@ -0,0 +1,369 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React, { useState, useEffect } from 'react';
2
+ import './App.css';
3
+
4
+ // Componente principal da aplicação React
5
+ function App() {
6
+ const [currentSection, setCurrentSection] = useState('home');
7
+ const [isVisible, setIsVisible] = useState(false);
8
+
9
+ useEffect(() => {
10
+ // Animação de entrada
11
+ setTimeout(() => setIsVisible(true), 100);
12
+
13
+ // Detectar seção atual baseada na URL
14
+ const path = window.location.pathname;
15
+ if (path.includes('servicos')) setCurrentSection('services');
16
+ else if (path.includes('projetos')) setCurrentSection('projects');
17
+ else if (path.includes('sobre')) setCurrentSection('about');
18
+ else if (path.includes('contato')) setCurrentSection('contact');
19
+ else setCurrentSection('home');
20
+ }, []);
21
+
22
+ return (
23
+ <div className={`react-app ${isVisible ? 'visible' : ''}`}>
24
+ <div className="react-container">
25
+ <div className="react-header">
26
+ <h3>🚀 SoftEdge Corporation - React Integration</h3>
27
+ <p>Componentes React integrados com PHP</p>
28
+ </div>
29
+
30
+ <div className="react-content">
31
+ <Navigation currentSection={currentSection} onNavigate={setCurrentSection} />
32
+ <ContentSection section={currentSection} />
33
+ </div>
34
+
35
+ <div className="react-footer">
36
+ <p>React + PHP = 💪 Potência Total</p>
37
+ </div>
38
+ </div>
39
+ </div>
40
+ );
41
+ }
42
+
43
+ // Componente de navegação
44
+ function Navigation({ currentSection, onNavigate }) {
45
+ const sections = [
46
+ { id: 'home', label: 'Início', icon: '🏠' },
47
+ { id: 'services', label: 'Serviços', icon: '⚙️' },
48
+ { id: 'projects', label: 'Projetos', icon: '📁' },
49
+ { id: 'about', label: 'Sobre', icon: '👥' },
50
+ { id: 'contact', label: 'Contato', icon: '📧' }
51
+ ];
52
+
53
+ return (
54
+ <nav className="react-nav">
55
+ {sections.map(section => (
56
+ <button
57
+ key={section.id}
58
+ className={`nav-item ${currentSection === section.id ? 'active' : ''}`}
59
+ onClick={() => onNavigate(section.id)}
60
+ >
61
+ <span className="nav-icon">{section.icon}</span>
62
+ <span className="nav-label">{section.label}</span>
63
+ </button>
64
+ ))}
65
+ </nav>
66
+ );
67
+ }
68
+
69
+ // Componente de conteúdo dinâmico
70
+ function ContentSection({ section }) {
71
+ const [stats, setStats] = useState(null);
72
+ const [loading, setLoading] = useState(false);
73
+
74
+ useEffect(() => {
75
+ if (section === 'stats') {
76
+ fetchStats();
77
+ }
78
+ }, [section]);
79
+
80
+ const fetchStats = async () => {
81
+ setLoading(true);
82
+ try {
83
+ // Simular chamada para API PHP
84
+ const response = await fetch('/api.php?r=stats');
85
+ const data = await response.json();
86
+ setStats(data);
87
+ } catch (error) {
88
+ console.error('Erro ao buscar estatísticas:', error);
89
+ // Dados mock para demonstração
90
+ setStats({
91
+ projects: 70,
92
+ satisfaction: 4.9,
93
+ support: '24/7',
94
+ codeQuality: '100%'
95
+ });
96
+ }
97
+ setLoading(false);
98
+ };
99
+
100
+ const renderContent = () => {
101
+ switch (section) {
102
+ case 'home':
103
+ return (
104
+ <div className="content-section">
105
+ <h2>Bem-vindo à SoftEdge Corporation</h2>
106
+ <p>Transformamos ideias em soluções digitais de excelência.</p>
107
+ <div className="feature-grid">
108
+ <div className="feature-card">
109
+ <div className="feature-icon">🚀</div>
110
+ <h3>Desenvolvimento Full Stack</h3>
111
+ <p>Tecnologias modernas para aplicações completas</p>
112
+ </div>
113
+ <div className="feature-card">
114
+ <div className="feature-icon">🤖</div>
115
+ <h3>IA & Automação</h3>
116
+ <p>Inteligência artificial para otimizar processos</p>
117
+ </div>
118
+ <div className="feature-card">
119
+ <div className="feature-icon">⚡</div>
120
+ <h3>Performance</h3>
121
+ <p>Otimização e consultoria especializada</p>
122
+ </div>
123
+ </div>
124
+ </div>
125
+ );
126
+
127
+ case 'services':
128
+ return (
129
+ <div className="content-section">
130
+ <h2>Nossos Serviços</h2>
131
+ <div className="services-grid">
132
+ <ServiceCard
133
+ icon="💻"
134
+ title="Desenvolvimento Web"
135
+ description="Aplicações web modernas com React, Next.js e PHP"
136
+ technologies={['React', 'Next.js', 'PHP', 'MySQL']}
137
+ />
138
+ <ServiceCard
139
+ icon="📱"
140
+ title="Aplicativos Mobile"
141
+ description="Apps nativos e multiplataforma"
142
+ technologies={['Flutter', 'React Native', 'Firebase']}
143
+ />
144
+ <ServiceCard
145
+ icon="🧠"
146
+ title="Inteligência Artificial"
147
+ description="Soluções de IA personalizadas"
148
+ technologies={['Python', 'TensorFlow', 'OpenAI']}
149
+ />
150
+ <ServiceCard
151
+ icon="☁️"
152
+ title="Cloud & DevOps"
153
+ description="Deploy e infraestrutura escalável"
154
+ technologies={['Docker', 'AWS', 'Railway', 'Render']}
155
+ />
156
+ </div>
157
+ </div>
158
+ );
159
+
160
+ case 'projects':
161
+ return (
162
+ <div className="content-section">
163
+ <h2>Projetos em Destaque</h2>
164
+ <div className="projects-grid">
165
+ <ProjectCard
166
+ title="AKIRA IA"
167
+ description="Assistente virtual angolano com processamento de linguagem natural"
168
+ status="Concluído"
169
+ technologies={['Python', 'TensorFlow', 'FastAPI']}
170
+ />
171
+ <ProjectCard
172
+ title="ERP Gestão Total"
173
+ description="Sistema completo de gestão empresarial"
174
+ status="Concluído"
175
+ technologies={['Laravel', 'Vue.js', 'MySQL']}
176
+ />
177
+ <ProjectCard
178
+ title="E-commerce ShopFast"
179
+ description="Plataforma de vendas online de alta performance"
180
+ status="Concluído"
181
+ technologies={['Next.js', 'Stripe', 'Prisma']}
182
+ />
183
+ </div>
184
+ </div>
185
+ );
186
+
187
+ case 'about':
188
+ return (
189
+ <div className="content-section">
190
+ <h2>Sobre a SoftEdge</h2>
191
+ <div className="about-content">
192
+ <div className="team-section">
193
+ <h3>Nossa Equipe</h3>
194
+ <div className="team-members">
195
+ <TeamMember name="Isaac Quarenta" role="CEO & Fundador" />
196
+ <TeamMember name="José Lopes" role="CTO" />
197
+ <TeamMember name="Stefânio Costa" role="Desenvolvedor Senior" />
198
+ <TeamMember name="Tiago Rodrigues" role="Designer & UX" />
199
+ </div>
200
+ </div>
201
+ <div className="mission-section">
202
+ <h3>Nossa Missão</h3>
203
+ <p>Transformar ideias em soluções tecnológicas que fazem a diferença no mundo digital.</p>
204
+ </div>
205
+ </div>
206
+ </div>
207
+ );
208
+
209
+ case 'contact':
210
+ return (
211
+ <div className="content-section">
212
+ <h2>Entre em Contato</h2>
213
+ <ContactForm />
214
+ </div>
215
+ );
216
+
217
+ default:
218
+ return (
219
+ <div className="content-section">
220
+ <h2>Seção não encontrada</h2>
221
+ <p>Selecione uma seção no menu de navegação.</p>
222
+ </div>
223
+ );
224
+ }
225
+ };
226
+
227
+ return (
228
+ <div className="content-container">
229
+ {renderContent()}
230
+ </div>
231
+ );
232
+ }
233
+
234
+ // Componentes auxiliares
235
+ function ServiceCard({ icon, title, description, technologies }) {
236
+ return (
237
+ <div className="service-card">
238
+ <div className="service-icon">{icon}</div>
239
+ <h3>{title}</h3>
240
+ <p>{description}</p>
241
+ <div className="tech-stack">
242
+ {technologies.map(tech => (
243
+ <span key={tech} className="tech-tag">{tech}</span>
244
+ ))}
245
+ </div>
246
+ </div>
247
+ );
248
+ }
249
+
250
+ function ProjectCard({ title, description, status, technologies }) {
251
+ return (
252
+ <div className="project-card">
253
+ <div className="project-header">
254
+ <h3>{title}</h3>
255
+ <span className={`status ${status.toLowerCase()}`}>{status}</span>
256
+ </div>
257
+ <p>{description}</p>
258
+ <div className="tech-stack">
259
+ {technologies.map(tech => (
260
+ <span key={tech} className="tech-tag">{tech}</span>
261
+ ))}
262
+ </div>
263
+ </div>
264
+ );
265
+ }
266
+
267
+ function TeamMember({ name, role }) {
268
+ return (
269
+ <div className="team-member">
270
+ <div className="member-avatar">
271
+ <span>{name.charAt(0)}</span>
272
+ </div>
273
+ <div className="member-info">
274
+ <h4>{name}</h4>
275
+ <p>{role}</p>
276
+ </div>
277
+ </div>
278
+ );
279
+ }
280
+
281
+ function ContactForm() {
282
+ const [formData, setFormData] = useState({
283
+ name: '',
284
+ email: '',
285
+ message: ''
286
+ });
287
+ const [submitted, setSubmitted] = useState(false);
288
+
289
+ const handleSubmit = async (e) => {
290
+ e.preventDefault();
291
+ try {
292
+ const response = await fetch('/api.php?r=contact', {
293
+ method: 'POST',
294
+ headers: {
295
+ 'Content-Type': 'application/json',
296
+ },
297
+ body: JSON.stringify(formData)
298
+ });
299
+
300
+ if (response.ok) {
301
+ setSubmitted(true);
302
+ setFormData({ name: '', email: '', message: '' });
303
+ }
304
+ } catch (error) {
305
+ console.error('Erro ao enviar formulário:', error);
306
+ }
307
+ };
308
+
309
+ const handleChange = (e) => {
310
+ setFormData({
311
+ ...formData,
312
+ [e.target.name]: e.target.value
313
+ });
314
+ };
315
+
316
+ if (submitted) {
317
+ return (
318
+ <div className="success-message">
319
+ <h3>✅ Mensagem enviada com sucesso!</h3>
320
+ <p>Entraremos em contato em breve.</p>
321
+ <button onClick={() => setSubmitted(false)}>Enviar outra mensagem</button>
322
+ </div>
323
+ );
324
+ }
325
+
326
+ return (
327
+ <form className="contact-form" onSubmit={handleSubmit}>
328
+ <div className="form-group">
329
+ <label htmlFor="name">Nome</label>
330
+ <input
331
+ type="text"
332
+ id="name"
333
+ name="name"
334
+ value={formData.name}
335
+ onChange={handleChange}
336
+ required
337
+ />
338
+ </div>
339
+
340
+ <div className="form-group">
341
+ <label htmlFor="email">Email</label>
342
+ <input
343
+ type="email"
344
+ id="email"
345
+ name="email"
346
+ value={formData.email}
347
+ onChange={handleChange}
348
+ required
349
+ />
350
+ </div>
351
+
352
+ <div className="form-group">
353
+ <label htmlFor="message">Mensagem</label>
354
+ <textarea
355
+ id="message"
356
+ name="message"
357
+ value={formData.message}
358
+ onChange={handleChange}
359
+ rows="5"
360
+ required
361
+ />
362
+ </div>
363
+
364
+ <button type="submit" className="submit-btn">Enviar Mensagem</button>
365
+ </form>
366
+ );
367
+ }
368
+
369
+ export default App;
src/react/index.js ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import React from 'react';
2
+ import ReactDOM from 'react-dom/client';
3
+ import App from './App';
4
+ import './App.css';
5
+
6
+ const root = ReactDOM.createRoot(document.getElementById('root'));
7
+ root.render(
8
+ <React.StrictMode>
9
+ <App />
10
+ </React.StrictMode>
11
+ );