1
1
import React , { useState , useEffect } from 'react' ;
2
2
import { Footer } from '../../components/Footer/Footer' ;
3
3
import portfoliosData from './portfolio.json' ; // Import the JSON file
4
+ import styled from 'styled-components' ;
4
5
5
6
const Navbar = ( ) => {
6
7
return (
@@ -14,7 +15,6 @@ const Navbar = () => {
14
15
< span className = "hidden md:inline" > Back</ span >
15
16
</ button >
16
17
</ a >
17
-
18
18
< div className = "text-2xl font-bold" >
19
19
< img src = "./DevDisplay ICON.png" alt = "DevDisplay" className = "h-12 w-12" />
20
20
</ div >
@@ -23,6 +23,197 @@ const Navbar = () => {
23
23
) ;
24
24
} ;
25
25
26
+ const StyledWrapper = styled . div `
27
+ .relative {
28
+ position: relative;
29
+ }
30
+
31
+ .inline-block {
32
+ display: inline-block;
33
+ }
34
+
35
+ .py-3 {
36
+ padding-top: 0.75rem;
37
+ padding-bottom: 0.75rem;
38
+ }
39
+
40
+ :backdrop {
41
+ --tw-ring-offset-shadow: 0 0 #0000;
42
+ --tw-ring-shadow: 0 0 #0000;
43
+ --tw-shadow: 0 0 #0000;
44
+ }
45
+
46
+ .pointer-events-none {
47
+ pointer-events: none;
48
+ }
49
+
50
+ .absolute {
51
+ position: absolute;
52
+ }
53
+
54
+ .inset-0 {
55
+ inset: 0;
56
+ }
57
+
58
+ button {
59
+ font-family: inherit;
60
+ font-feature-settings: inherit;
61
+ font-variation-settings: inherit;
62
+ font-size: 100%;
63
+ font-weight: inherit;
64
+ line-height: inherit;
65
+ color: inherit;
66
+ margin: 0;
67
+ padding: 0;
68
+ width: 300px !important;
69
+ }
70
+
71
+ button {
72
+ text-transform: none;
73
+ }
74
+
75
+ button {
76
+ cursor: pointer;
77
+ }
78
+
79
+ .inline-flex {
80
+ display: inline-flex;
81
+ }
82
+
83
+ .justify-center {
84
+ justify-content: center;
85
+ }
86
+
87
+ .rounded-lg {
88
+ border-radius: 0.5rem;
89
+ }
90
+
91
+ .bg-primary {
92
+ --tw-bg-opacity: 1;
93
+ background-color: rgba(15, 27, 53, 0);
94
+ }
95
+
96
+ .py-2 {
97
+ padding-top: 0.5rem;
98
+ padding-bottom: 0.5rem;
99
+ }
100
+
101
+ .py-2\.5 {
102
+ padding-top: 0.625rem;
103
+ padding-bottom: 0.625rem;
104
+ }
105
+
106
+ .text-sm {
107
+ font-size: 0.875rem;
108
+ line-height: 1.25rem;
109
+ }
110
+
111
+ .font-medium {
112
+ font-weight: 500;
113
+ }
114
+
115
+ .text-white {
116
+ --tw-text-opacity: 1;
117
+ color: rgb(255 255 255 / var(--tw-text-opacity));
118
+ }
119
+
120
+ .transition-all {
121
+ transition-property: all;
122
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
123
+ transition-duration: 0.15s;
124
+ }
125
+
126
+ #style-AQliM.style-AQliM {
127
+ top: 1%;
128
+ left: 99%;
129
+ }
130
+ #style-WCb99.style-WCb99 {
131
+ top: 7%;
132
+ left: 1%;
133
+ }
134
+ #style-dBNZV.style-dBNZV {
135
+ top: 93%;
136
+ left: 23%;
137
+ }
138
+ #style-tiisO.style-tiisO {
139
+ top: 43%;
140
+ left: 15%;
141
+ }
142
+ #style-re9B7.style-re9B7 {
143
+ top: 93%;
144
+ left: 9%;
145
+ }
146
+ #style-BKG4G.style-BKG4G {
147
+ top: 21%;
148
+ left: 88%;
149
+ }
150
+ #style-NaoVe.style-NaoVe {
151
+ top: 99%;
152
+ left: 95%;
153
+ }
154
+ #style-pwIlv.style-pwIlv {
155
+ top: 64%;
156
+ left: 99%;
157
+ }
158
+ #style-QmcAd.style-QmcAd {
159
+ top: 14%;
160
+ left: 45%;
161
+ }
162
+ #style-VG2eL.style-VG2eL {
163
+ top: 2%;
164
+ left: 48%;
165
+ }
166
+
167
+ /* Keyframes for sparkle animation */
168
+ @keyframes sparkle {
169
+ 0% {
170
+ opacity: 0;
171
+ }
172
+ 50% {
173
+ opacity: 1;
174
+ }
175
+ 100% {
176
+ opacity: 0;
177
+ }
178
+ }
179
+
180
+ /* Add animation to sparkle elements */
181
+ .animate-magic-sparkle {
182
+ animation: sparkle 2s infinite;
183
+ }
184
+
185
+ .style-AQliM {
186
+ animation-delay: 0.5s;
187
+ }
188
+ .style-WCb99 {
189
+ animation-delay: 0.33s;
190
+ }
191
+ .style-dBNZV {
192
+ animation-delay: 0.6s;
193
+ }
194
+ .style-tiisO {
195
+ animation-delay: 0.9s;
196
+ }
197
+ .style-re9B7 {
198
+ animation-delay: 1.2s;
199
+ }
200
+ .style-BKG4G {
201
+ animation-delay: 1.5s;
202
+ }
203
+ .style-NaoVe {
204
+ animation-delay: 1.8s;
205
+ }
206
+ .style-pwIlv {
207
+ animation-delay: 1.9s;
208
+ }
209
+ .style-QmcAd {
210
+ animation-delay: 1.4s;
211
+ }
212
+ .style-VG2eL {
213
+ animation-delay: 1.7s;
214
+ }
215
+ ` ;
216
+
26
217
const SearchBar = ( { onSearch } ) => {
27
218
return (
28
219
< div className = "relative" >
@@ -84,6 +275,211 @@ const PortfolioIdeas = () => {
84
275
85
276
return (
86
277
< div className = "p-6" >
278
+ < div className = "flex w-full flex-col items-center justify-center px-8 text-center" >
279
+ < div className = "my-0" > </ div >
280
+ < StyledWrapper >
281
+ < div className = "modgp relative inline-block w-full py-3" >
282
+ < div className = "relative" >
283
+ < div className = "bg-primary enabled:hover:bg-primary-dark enabled:active:bg-primary-dark enabled:focus:bg-primary-dark px-18 relative inline-flex w-full items-center justify-center rounded-lg py-5 text-6xl font-bold text-white transition-all focus:outline-none enabled:hover:shadow-md disabled:opacity-50" >
284
+ < div className = "flex w-full items-center justify-center" > Portfolio Showcase</ div >
285
+ </ div >
286
+ </ div >
287
+ < div className = "pointer-events-none absolute inset-0" >
288
+ < StyledWrapper >
289
+ < div className = "modgp relative inline-block w-full py-3" >
290
+ < div className = "relative" >
291
+ < div className = "bg-primary enabled:hover:bg-primary-dark enabled:active:bg-primary-dark enabled:focus:bg-primary-dark px-18 relative inline-flex w-full items-center justify-center rounded-lg py-5 text-6xl font-bold text-white transition-all focus:outline-none enabled:hover:shadow-md disabled:opacity-50" >
292
+ < div className = "flex w-full items-center justify-center" > Portfolio Showcase</ div >
293
+ </ div >
294
+ </ div >
295
+ < div className = "pointer-events-none absolute inset-0" >
296
+ < div
297
+ id = "style-AQliM"
298
+ className = "animate-magic-sparkle style-AQliM pointer-events-none absolute z-10"
299
+ >
300
+ < svg
301
+ style = { { filter : 'drop-shadow(rgb(96, 165, 250) 0px 0px 2px)' } }
302
+ fill = "none"
303
+ viewBox = "0 0 68 68"
304
+ height = { 8 }
305
+ width = { 8 }
306
+ className = "animate-spin-slow"
307
+ >
308
+ < path
309
+ fill = "white"
310
+ d = "M26.5 25.5C19.0043 33.3697 0 34 0 34C0 34 19.1013 35.3684 26.5 43.5C33.234 50.901 34 68 34 68C34 68 36.9884 50.7065 44.5 43.5C51.6431 36.647 68 34 68 34C68 34 51.6947 32.0939 44.5 25.5C36.5605 18.2235 34 0 34 0C34 0 33.6591 17.9837 26.5 25.5Z"
311
+ />
312
+ </ svg >
313
+ </ div >
314
+ < div
315
+ id = "style-WCb99"
316
+ className = "animate-magic-sparkle style-WCb99 pointer-events-none absolute z-10"
317
+ >
318
+ < svg
319
+ style = { { filter : 'drop-shadow(rgb(96, 165, 250) 0px 0px 2px)' } }
320
+ fill = "none"
321
+ viewBox = "0 0 68 68"
322
+ height = { 11 }
323
+ width = { 11 }
324
+ className = "animate-spin-slow"
325
+ >
326
+ < path
327
+ fill = "white"
328
+ d = "M26.5 25.5C19.0043 33.3697 0 34 0 34C0 34 19.1013 35.3684 26.5 43.5C33.234 50.901 34 68 34 68C34 68 36.9884 50.7065 44.5 43.5C51.6431 36.647 68 34 68 34C68 34 51.6947 32.0939 44.5 25.5C36.5605 18.2235 34 0 34 0C34 0 33.6591 17.9837 26.5 25.5Z"
329
+ />
330
+ </ svg >
331
+ </ div >
332
+ < div
333
+ id = "style-dBNZV"
334
+ className = "animate-magic-sparkle style-dBNZV pointer-events-none absolute z-10"
335
+ >
336
+ < svg
337
+ style = { { filter : 'drop-shadow(rgb(96, 165, 250) 0px 0px 2px)' } }
338
+ fill = "none"
339
+ viewBox = "0 0 68 68"
340
+ height = { 9 }
341
+ width = { 9 }
342
+ className = "animate-spin-slow"
343
+ >
344
+ < path
345
+ fill = "white"
346
+ d = "M26.5 25.5C19.0043 33.3697 0 34 0 34C0 34 19.1013 35.3684 26.5 43.5C33.234 50.901 34 68 34 68C34 68 36.9884 50.7065 44.5 43.5C51.6431 36.647 68 34 68 34C68 34 51.6947 32.0939 44.5 25.5C36.5605 18.2235 34 0 34 0C34 0 33.6591 17.9837 26.5 25.5Z"
347
+ />
348
+ </ svg >
349
+ </ div >
350
+ < div
351
+ id = "style-tiisO"
352
+ className = "animate-magic-sparkle style-tiisO pointer-events-none absolute z-10"
353
+ >
354
+ < svg
355
+ style = { { filter : 'drop-shadow(rgb(96, 165, 250) 0px 0px 2px)' } }
356
+ fill = "none"
357
+ viewBox = "0 0 68 68"
358
+ height = { 8 }
359
+ width = { 8 }
360
+ className = "animate-spin-slow"
361
+ >
362
+ < path
363
+ fill = "white"
364
+ d = "M26.5 25.5C19.0043 33.3697 0 34 0 34C0 34 19.1013 35.3684 26.5 43.5C33.234 50.901 34 68 34 68C34 68 36.9884 50.7065 44.5 43.5C51.6431 36.647 68 34 68 34C68 34 51.6947 32.0939 44.5 25.5C36.5605 18.2235 34 0 34 0C34 0 33.6591 17.9837 26.5 25.5Z"
365
+ />
366
+ </ svg >
367
+ </ div >
368
+ < div
369
+ id = "style-re9B7"
370
+ className = "animate-magic-sparkle style-re9B7 pointer-events-none absolute z-10"
371
+ >
372
+ < svg
373
+ style = { { filter : 'drop-shadow(rgb(96, 165, 250) 0px 0px 2px)' } }
374
+ fill = "none"
375
+ viewBox = "0 0 68 68"
376
+ height = { 11 }
377
+ width = { 11 }
378
+ className = "animate-spin-slow"
379
+ >
380
+ < path
381
+ fill = "white"
382
+ d = "M26.5 25.5C19.0043 33.3697 0 34 0 34C0 34 19.1013 35.3684 26.5 43.5C33.234 50.901 34 68 34 68C34 68 36.9884 50.7065 44.5 43.5C51.6431 36.647 68 34 68 34C68 34 51.6947 32.0939 44.5 25.5C36.5605 18.2235 34 0 34 0C34 0 33.6591 17.9837 26.5 25.5Z"
383
+ />
384
+ </ svg >
385
+ </ div >
386
+ < div
387
+ id = "style-BKG4G"
388
+ className = "animate-magic-sparkle style-BKG4G pointer-events-none absolute z-10"
389
+ >
390
+ < svg
391
+ style = { { filter : 'drop-shadow(rgb(96, 165, 250) 0px 0px 2px)' } }
392
+ fill = "none"
393
+ viewBox = "0 0 68 68"
394
+ height = { 7 }
395
+ width = { 7 }
396
+ className = "animate-spin-slow"
397
+ >
398
+ < path
399
+ fill = "white"
400
+ d = "M26.5 25.5C19.0043 33.3697 0 34 0 34C0 34 19.1013 35.3684 26.5 43.5C33.234 50.901 34 68 34 68C34 68 36.9884 50.7065 44.5 43.5C51.6431 36.647 68 34 68 34C68 34 51.6947 32.0939 44.5 25.5C36.5605 18.2235 34 0 34 0C34 0 33.6591 17.9837 26.5 25.5Z"
401
+ />
402
+ </ svg >
403
+ </ div >
404
+ < div
405
+ id = "style-NaoVe"
406
+ className = "animate-magic-sparkle style-NaoVe pointer-events-none absolute z-10"
407
+ >
408
+ < svg
409
+ style = { { filter : 'drop-shadow(rgb(96, 165, 250) 0px 0px 2px)' } }
410
+ fill = "none"
411
+ viewBox = "0 0 68 68"
412
+ height = { 8 }
413
+ width = { 8 }
414
+ className = "animate-spin-slow"
415
+ >
416
+ < path
417
+ fill = "white"
418
+ d = "M26.5 25.5C19.0043 33.3697 0 34 0 34C0 34 19.1013 35.3684 26.5 43.5C33.234 50.901 34 68 34 68C34 68 36.9884 50.7065 44.5 43.5C51.6431 36.647 68 34 68 34C68 34 51.6947 32.0939 44.5 25.5C36.5605 18.2235 34 0 34 0C34 0 33.6591 17.9837 26.5 25.5Z"
419
+ />
420
+ </ svg >
421
+ </ div >
422
+ < div
423
+ id = "style-pwIlv"
424
+ className = "animate-magic-sparkle style-pwIlv pointer-events-none absolute z-10"
425
+ >
426
+ < svg
427
+ style = { { filter : 'drop-shadow(rgb(96, 165, 250) 0px 0px 2px)' } }
428
+ fill = "none"
429
+ viewBox = "0 0 68 68"
430
+ height = { 11 }
431
+ width = { 11 }
432
+ className = "animate-spin-slow"
433
+ >
434
+ < path
435
+ fill = "white"
436
+ d = "M26.5 25.5C19.0043 33.3697 0 34 0 34C0 34 19.1013 35.3684 26.5 43.5C33.234 50.901 34 68 34 68C34 68 36.9884 50.7065 44.5 43.5C51.6431 36.647 68 34 68 34C68 34 51.6947 32.0939 44.5 25.5C36.5605 18.2235 34 0 34 0C34 0 33.6591 17.9837 26.5 25.5Z"
437
+ />
438
+ </ svg >
439
+ </ div >
440
+ < div
441
+ id = "style-QmcAd"
442
+ className = "animate-magic-sparkle style-QmcAd pointer-events-none absolute z-10"
443
+ >
444
+ < svg
445
+ style = { { filter : 'drop-shadow(rgb(96, 165, 250) 0px 0px 2px)' } }
446
+ fill = "none"
447
+ viewBox = "0 0 68 68"
448
+ height = { 7 }
449
+ width = { 7 }
450
+ className = "animate-spin-slow"
451
+ >
452
+ < path
453
+ fill = "white"
454
+ d = "M26.5 25.5C19.0043 33.3697 0 34 0 34C0 34 19.1013 35.3684 26.5 43.5C33.234 50.901 34 68 34 68C34 68 36.9884 50.7065 44.5 43.5C51.6431 36.647 68 34 68 34C68 34 51.6947 32.0939 44.5 25.5C36.5605 18.2235 34 0 34 0C34 0 33.6591 17.9837 26.5 25.5Z"
455
+ />
456
+ </ svg >
457
+ </ div >
458
+ < div
459
+ id = "style-VG2eL"
460
+ className = "animate-magic-sparkle style-VG2eL pointer-events-none absolute z-10"
461
+ >
462
+ < svg
463
+ style = { { filter : 'drop-shadow(rgb(96, 165, 250) 0px 0px 2px)' } }
464
+ fill = "none"
465
+ viewBox = "0 0 68 68"
466
+ height = { 11 }
467
+ width = { 11 }
468
+ className = "animate-spin-slow"
469
+ >
470
+ < path
471
+ fill = "white"
472
+ d = "M26.5 25.5C19.0043 33.3697 0 34 0 34C0 34 19.1013 35.3684 26.5 43.5C33.234 50.901 34 68 34 68C34 68 36.9884 50.7065 44.5 43.5C51.6431 36.647 68 34 68 34C68 34 51.6947 32.0939 44.5 25.5C36.5605 18.2235 34 0 34 0C34 0 33.6591 17.9837 26.5 25.5Z"
473
+ />
474
+ </ svg >
475
+ </ div >
476
+ </ div >
477
+ </ div >
478
+ </ StyledWrapper >
479
+ </ div >
480
+ </ div >
481
+ </ StyledWrapper >
482
+ </ div >
87
483
< div className = "mb-8 flex items-center justify-between" >
88
484
< div className = "w-64" >
89
485
< SearchBar onSearch = { setSearchTerm } />
@@ -99,140 +495,60 @@ const PortfolioIdeas = () => {
99
495
{ isModalOpen && (
100
496
< div className = "fixed inset-0 z-50 flex items-center justify-center bg-black bg-opacity-50" >
101
497
< div className = "w-full max-w-md rounded-lg bg-gray-800 p-6 text-white" >
102
- < div className = "mb-4 flex items-center justify-between" >
103
- < h2 className = "text-xl font-semibold" > Add New Portfolio</ h2 >
104
- < button onClick = { ( ) => setIsModalOpen ( false ) } className = "text-gray-400 hover:text-white" >
105
- ×
106
- </ button >
107
- </ div >
498
+ { /* ... (Modal content remains the same) */ }
499
+ </ div >
500
+ </ div >
501
+ ) }
108
502
109
- < form onSubmit = { handleSubmit } className = "space-y-4" >
110
- < div >
111
- < label className = "mb-1 block text-sm font-medium" > Author</ label >
112
- < input
113
- type = "text"
114
- value = { newPortfolio . author }
115
- onChange = { ( e ) => setNewPortfolio ( { ...newPortfolio , author : e . target . value } ) }
116
- className = "w-full rounded-lg bg-gray-700 px-3 py-2 text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-[#00a6fb]"
117
- required
118
- />
119
- </ div >
120
- < div >
121
- < label className = "mb-1 block text-sm font-medium" > Screenshot URL</ label >
122
- < input
123
- type = "url"
124
- value = { newPortfolio . screenshot }
125
- onChange = { ( e ) => setNewPortfolio ( { ...newPortfolio , screenshot : e . target . value } ) }
126
- className = "w-full rounded-lg bg-gray-700 px-3 py-2 text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-[#00a6fb]"
127
- required
128
- />
129
- </ div >
130
- < div >
131
- < label className = "mb-1 block text-sm font-medium" > Live URL</ label >
132
- < input
133
- type = "url"
134
- value = { newPortfolio . liveUrl }
135
- onChange = { ( e ) => setNewPortfolio ( { ...newPortfolio , liveUrl : e . target . value } ) }
136
- className = "w-full rounded-lg bg-gray-700 px-3 py-2 text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-[#00a6fb]"
137
- required
138
- />
139
- </ div >
140
- < div >
141
- < label className = "mb-1 block text-sm font-medium" > Repository URL</ label >
142
- < input
143
- type = "url"
144
- value = { newPortfolio . repo }
145
- onChange = { ( e ) => setNewPortfolio ( { ...newPortfolio , repo : e . target . value } ) }
146
- className = "w-full rounded-lg bg-gray-700 px-3 py-2 text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-[#00a6fb]"
147
- required
148
- />
149
- </ div >
150
- < div >
151
- < label className = "mb-1 block text-sm font-medium" > Tech Stack</ label >
152
- < input
153
- type = "text"
154
- value = { newPortfolio . techStack }
155
- onChange = { ( e ) => setNewPortfolio ( { ...newPortfolio , techStack : e . target . value } ) }
156
- className = "w-full rounded-lg bg-gray-700 px-3 py-2 text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-[#00a6fb]"
157
- required
158
- placeholder = "e.g., React, Node.js, MongoDB"
159
- />
160
- </ div >
161
- < div className = "mt-6 flex gap-2" >
162
- < button
163
- type = "submit"
164
- className = "w-full rounded-lg bg-[#00a6fb] px-4 py-2 text-white transition-colors hover:bg-[#0089d2]"
503
+ < div className = "grid grid-cols-1 gap-4 md:grid-cols-2 lg:grid-cols-4" >
504
+ { filteredPortfolios . map ( ( portfolio , index ) => (
505
+ < div key = { index } className = "rounded-lg bg-gray-800 p-4 shadow-md" >
506
+ < div className = "relative mb-4 h-48" >
507
+ < img
508
+ src = { portfolio . screenshot }
509
+ alt = { `${ portfolio . author } 's portfolio` }
510
+ className = "h-full w-full rounded-lg object-cover"
511
+ />
512
+ < div className = "absolute inset-0 flex items-center justify-center bg-black opacity-0 transition-opacity duration-300 hover:opacity-80" >
513
+ < a
514
+ href = { portfolio . liveUrl }
515
+ target = "_blank"
516
+ rel = "noopener noreferrer"
517
+ className = "mr-2 rounded-lg bg-[#00a6fb] px-4 py-2 text-white"
165
518
>
166
- Submit
167
- </ button >
168
- < button
169
- type = "button"
170
- onClick = { ( ) => setIsModalOpen ( false ) }
171
- className = "w-full rounded-lg bg-gray-700 px-4 py-2 text-white transition-colors hover:bg-gray-600"
519
+ View Live
520
+ </ a >
521
+ < a
522
+ href = { portfolio . repo }
523
+ target = "_blank"
524
+ rel = "noopener noreferrer"
525
+ className = "rounded-lg bg-[#00a6fb] px-4 py-2 text-white"
172
526
>
173
- Cancel
174
- </ button >
527
+ View Code
528
+ </ a >
175
529
</ div >
176
- </ form >
530
+ </ div >
531
+ < h3 className = "mb-2 text-lg font-semibold" > { portfolio . author } </ h3 >
532
+ < div className = "flex flex-wrap gap-2" >
533
+ { portfolio . techStack . split ( ',' ) . map ( ( tag , tagIndex ) => (
534
+ < span
535
+ key = { tagIndex }
536
+ className = "inline-flex items-center rounded-full border border-[#00a6fb] bg-gray-900 px-3 py-1 text-xs text-gray-300"
537
+ >
538
+ { tag . trim ( ) }
539
+ </ span >
540
+ ) ) }
541
+ </ div >
177
542
</ div >
178
- </ div >
179
- ) }
180
-
181
- < div className = "overflow-x-auto" >
182
- < table className = "min-w-full rounded-lg bg-gray-800 text-white" >
183
- < thead className = "bg-gray-700" >
184
- < tr >
185
- < th className = "px-6 py-3 text-left text-xs font-medium uppercase" > Author</ th >
186
- < th className = "px-6 py-3 text-left text-xs font-medium uppercase" > Screenshot</ th >
187
- < th className = "px-6 py-3 text-left text-xs font-medium uppercase" > Live URL</ th >
188
- < th className = "px-6 py-3 text-left text-xs font-medium uppercase" > Repository</ th >
189
- < th className = "px-6 py-3 text-left text-xs font-medium uppercase" > Tech Stack</ th >
190
- </ tr >
191
- </ thead >
192
- < tbody className = "divide-y divide-gray-700" >
193
- { filteredPortfolios . map ( ( portfolio , index ) => (
194
- < tr key = { index } >
195
- < td className = "whitespace-nowrap px-6 py-4" > { portfolio . author } </ td >
196
- < td className = "px-6 py-4" >
197
- < img
198
- src = { portfolio . screenshot }
199
- alt = { `${ portfolio . author } 's portfolio` }
200
- className = "h-20 w-32 rounded object-cover"
201
- />
202
- </ td >
203
- < td className = "px-6 py-4" >
204
- < a
205
- href = { portfolio . liveUrl }
206
- target = "_blank"
207
- rel = "noopener noreferrer"
208
- className = "text-[#00a6fb] hover:underline"
209
- >
210
- View Live
211
- </ a >
212
- </ td >
213
- < td className = "px-6 py-4" >
214
- < a
215
- href = { portfolio . repo }
216
- target = "_blank"
217
- rel = "noopener noreferrer"
218
- className = "text-[#00a6fb] hover:underline"
219
- >
220
- View Code
221
- </ a >
222
- </ td >
223
- < td className = "px-6 py-4" > { portfolio . techStack } </ td >
224
- </ tr >
225
- ) ) }
226
- </ tbody >
227
- </ table >
543
+ ) ) }
228
544
</ div >
229
545
</ div >
230
546
) ;
231
547
} ;
232
548
233
549
const ProjectsPage = ( ) => {
234
550
return (
235
- < div className = "flex min-h-screen flex-col bg-gray-900" >
551
+ < div className = "background-wrapper1 flex min-h-screen flex-col bg-gray-900" >
236
552
< Navbar />
237
553
< div className = "flex-grow" >
238
554
< PortfolioIdeas />
0 commit comments