Skip to content

Commit 91ab005

Browse files
committedMar 11, 2025·
v2.0
1 parent 3d802ea commit 91ab005

File tree

2 files changed

+441
-125
lines changed

2 files changed

+441
-125
lines changed
 

‎src/Page/PortfolioIdeas/PortfolioIdeas.jsx

+439-123
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import React, { useState, useEffect } from 'react';
22
import { Footer } from '../../components/Footer/Footer';
33
import portfoliosData from './portfolio.json'; // Import the JSON file
4+
import styled from 'styled-components';
45

56
const Navbar = () => {
67
return (
@@ -14,7 +15,6 @@ const Navbar = () => {
1415
<span className="hidden md:inline">Back</span>
1516
</button>
1617
</a>
17-
1818
<div className="text-2xl font-bold">
1919
<img src="./DevDisplay ICON.png" alt="DevDisplay" className="h-12 w-12" />
2020
</div>
@@ -23,6 +23,197 @@ const Navbar = () => {
2323
);
2424
};
2525

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+
26217
const SearchBar = ({ onSearch }) => {
27218
return (
28219
<div className="relative">
@@ -84,6 +275,211 @@ const PortfolioIdeas = () => {
84275

85276
return (
86277
<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>
87483
<div className="mb-8 flex items-center justify-between">
88484
<div className="w-64">
89485
<SearchBar onSearch={setSearchTerm} />
@@ -99,140 +495,60 @@ const PortfolioIdeas = () => {
99495
{isModalOpen && (
100496
<div className="fixed inset-0 z-50 flex items-center justify-center bg-black bg-opacity-50">
101497
<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+
)}
108502

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"
165518
>
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"
172526
>
173-
Cancel
174-
</button>
527+
View Code
528+
</a>
175529
</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>
177542
</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+
))}
228544
</div>
229545
</div>
230546
);
231547
};
232548

233549
const ProjectsPage = () => {
234550
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">
236552
<Navbar />
237553
<div className="flex-grow">
238554
<PortfolioIdeas />

‎src/Page/PortfolioIdeas/portfolio.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -2384,7 +2384,7 @@
23842384
"screenshot": "https://github.com/user-attachments/assets/ab2ffdbe-bf3b-459f-97f5-621754bc8699",
23852385
"liveUrl": "https://thughari.github.io",
23862386
"repo": "https://github.com/thughari/thughari.github.io",
2387-
"techStack": "HTML, CSS, JS, Google sheets integrated responses with mail notification(app script)"
2387+
"techStack": "HTML, CSS, JS, (app script)"
23882388
},
23892389
{
23902390
"author": "Sawad",
@@ -2398,7 +2398,7 @@
23982398
"screenshot": "https://github.com/user-attachments/assets/174443cc-d0fe-4d0c-85d8-7e1a11e1d861",
23992399
"liveUrl": "https://carlosdubon.dev",
24002400
"repo": "None",
2401-
"techStack": "Next.js 14 (App Router), TailwindCSS, TypeScript, Framer Motion, Velite"
2401+
"techStack": "Next.js 14, TailwindCSS, TypeScript, Framer Motion, Velite"
24022402
},
24032403
{
24042404
"author": "Umesh Nagare",

0 commit comments

Comments
 (0)
Please sign in to comment.