404lab 2.0.1 → 2.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/cli/core/templates.js +1 -0
- package/package.json +3 -3
- package/templates/AmongUs.tsx +213 -119
- package/templates/BlueGlitch.tsx +190 -100
- package/templates/GeeksforGeeks.tsx +125 -37
- package/templates/Google.tsx +97 -29
- package/templates/MacOs.tsx +116 -212
- package/templates/ModernPage.tsx +73 -11
- package/templates/Particles.tsx +173 -67
- package/templates/Poet.tsx +139 -54
- package/templates/RetroTv.tsx +182 -130
- package/templates/SimplePage.tsx +60 -16
- package/templates/Snow.tsx +113 -179
- package/templates/StoneAge.tsx +91 -23
- package/templates/StrangerThings.tsx +79 -193
- package/templates/Terminal404.tsx +124 -242
- package/templates/Vercel.tsx +127 -0
package/templates/BlueGlitch.tsx
CHANGED
|
@@ -1,129 +1,219 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
</div>
|
|
24
|
-
|
|
25
|
-
<div className="centered">
|
|
26
|
-
|
|
27
|
-
<span className="shadow">
|
|
28
|
-
|
|
29
|
-
</span>
|
|
30
|
-
</div>
|
|
3
|
+
import { useEffect, useState } from "react";
|
|
4
|
+
import { motion, AnimatePresence } from "framer-motion";
|
|
5
|
+
import Link from "next/link";
|
|
6
|
+
import { cn } from "@/components/ui/cn";
|
|
7
|
+
|
|
8
|
+
const BlueGlitch = ({
|
|
9
|
+
fullScreen = true,
|
|
10
|
+
className,
|
|
11
|
+
}: {
|
|
12
|
+
fullScreen?: boolean;
|
|
13
|
+
className?: string;
|
|
14
|
+
}) => {
|
|
15
|
+
const [bootStep, setBootStep] = useState(0);
|
|
16
|
+
|
|
17
|
+
useEffect(() => {
|
|
18
|
+
const timer = setInterval(() => {
|
|
19
|
+
setBootStep((prev) => (prev < 8 ? prev + 1 : prev));
|
|
20
|
+
}, 400);
|
|
21
|
+
return () => clearInterval(timer);
|
|
22
|
+
}, []);
|
|
31
23
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
<div className="row">
|
|
45
|
-
lose any unsaved information in all applications.
|
|
46
|
-
</div>
|
|
47
|
-
<div className="row"> </div>
|
|
48
|
-
|
|
49
|
-
<div className="centered">
|
|
50
|
-
Please refresh the page...Or Return to safety
|
|
51
|
-
<span className="blink">█</span>
|
|
52
|
-
</div>
|
|
53
|
-
</div>
|
|
54
|
-
|
|
55
|
-
{/* ALL CSS INLINE */}
|
|
56
|
-
<style jsx>{`
|
|
57
|
-
* {
|
|
58
|
-
box-sizing: border-box;
|
|
24
|
+
return (
|
|
25
|
+
<main
|
|
26
|
+
className={cn(
|
|
27
|
+
"relative flex items-center justify-center bg-[#000084] overflow-hidden select-none font-mono",
|
|
28
|
+
fullScreen ? "min-h-screen" : "h-full",
|
|
29
|
+
className
|
|
30
|
+
)}
|
|
31
|
+
>
|
|
32
|
+
<style jsx global>{`
|
|
33
|
+
@font-face {
|
|
34
|
+
font-family: 'DOS-VGA';
|
|
35
|
+
src: url('https://fonts.cdnfonts.com/s/17263/Perfect%20DOS%20VGA%20437.woff') format('woff');
|
|
59
36
|
}
|
|
60
37
|
|
|
61
|
-
.
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
38
|
+
.crt-container {
|
|
39
|
+
position: relative;
|
|
40
|
+
width: 100%;
|
|
41
|
+
height: 100%;
|
|
42
|
+
background: #000084;
|
|
43
|
+
display: flex;
|
|
44
|
+
flex-direction: column;
|
|
45
|
+
padding: 2rem;
|
|
46
|
+
box-shadow: inset 0 0 100px rgba(0,0,0,0.5);
|
|
67
47
|
}
|
|
68
48
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
49
|
+
.crt-container::before {
|
|
50
|
+
content: " ";
|
|
51
|
+
display: block;
|
|
52
|
+
position: absolute;
|
|
53
|
+
top: 0;
|
|
54
|
+
left: 0;
|
|
55
|
+
bottom: 0;
|
|
56
|
+
right: 0;
|
|
57
|
+
background: linear-gradient(rgba(18, 16, 16, 0) 50%, rgba(0, 0, 0, 0.25) 50%), linear-gradient(90deg, rgba(255, 0, 0, 0.06), rgba(0, 255, 0, 0.02), rgba(0, 0, 255, 0.06));
|
|
58
|
+
z-index: 10;
|
|
59
|
+
background-size: 100% 2px, 3px 100%;
|
|
60
|
+
pointer-events: none;
|
|
73
61
|
}
|
|
74
62
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
63
|
+
.crt-container::after {
|
|
64
|
+
content: " ";
|
|
65
|
+
display: block;
|
|
66
|
+
position: absolute;
|
|
67
|
+
top: 0;
|
|
68
|
+
left: 0;
|
|
69
|
+
bottom: 0;
|
|
70
|
+
right: 0;
|
|
71
|
+
background: rgba(18, 16, 16, 0.1);
|
|
72
|
+
opacity: 0;
|
|
73
|
+
z-index: 10;
|
|
74
|
+
pointer-events: none;
|
|
75
|
+
animation: flicker 0.15s infinite;
|
|
80
76
|
}
|
|
81
77
|
|
|
82
|
-
|
|
83
|
-
|
|
78
|
+
@keyframes flicker {
|
|
79
|
+
0% { opacity: 0.27861; }
|
|
80
|
+
5% { opacity: 0.34769; }
|
|
81
|
+
10% { opacity: 0.23604; }
|
|
82
|
+
15% { opacity: 0.90626; }
|
|
83
|
+
20% { opacity: 0.18128; }
|
|
84
|
+
25% { opacity: 0.83891; }
|
|
85
|
+
30% { opacity: 0.65583; }
|
|
86
|
+
35% { opacity: 0.57807; }
|
|
87
|
+
40% { opacity: 0.26559; }
|
|
88
|
+
45% { opacity: 0.84693; }
|
|
89
|
+
50% { opacity: 0.96019; }
|
|
90
|
+
55% { opacity: 0.08523; }
|
|
91
|
+
60% { opacity: 0.71056; }
|
|
92
|
+
65% { opacity: 0.73437; }
|
|
93
|
+
70% { opacity: 0.28557; }
|
|
94
|
+
75% { opacity: 0.96303; }
|
|
95
|
+
80% { opacity: 0.2268; }
|
|
96
|
+
85% { opacity: 0.20415; }
|
|
97
|
+
90% { opacity: 0.85617; }
|
|
98
|
+
95% { opacity: 0.41032; }
|
|
99
|
+
100% { opacity: 0.9576; }
|
|
84
100
|
}
|
|
85
101
|
|
|
86
|
-
.
|
|
87
|
-
|
|
102
|
+
.dos-font {
|
|
103
|
+
font-family: 'DOS-VGA', monospace;
|
|
104
|
+
color: #bbb;
|
|
105
|
+
text-shadow: 2px 2px 0px #000;
|
|
88
106
|
}
|
|
89
107
|
|
|
90
|
-
.inverted {
|
|
108
|
+
.inverted-box {
|
|
91
109
|
background-color: #bbb;
|
|
92
110
|
color: #000084;
|
|
111
|
+
padding: 0 10px;
|
|
112
|
+
display: inline-block;
|
|
113
|
+
text-shadow: none;
|
|
93
114
|
}
|
|
94
115
|
|
|
95
|
-
.
|
|
96
|
-
|
|
97
|
-
|
|
116
|
+
.scanline {
|
|
117
|
+
width: 100%;
|
|
118
|
+
height: 100px;
|
|
119
|
+
z-index: 11;
|
|
120
|
+
background: linear-gradient(0deg, rgba(0, 0, 0, 0) 0%, rgba(255, 255, 255, 0.05) 10%, rgba(0, 0, 0, 0.1) 100%);
|
|
121
|
+
opacity: 0.1;
|
|
122
|
+
position: absolute;
|
|
123
|
+
bottom: 100%;
|
|
124
|
+
animation: scanline 10s linear infinite;
|
|
98
125
|
}
|
|
99
126
|
|
|
100
|
-
|
|
101
|
-
|
|
127
|
+
@keyframes scanline {
|
|
128
|
+
0% { bottom: 100%; }
|
|
129
|
+
100% { bottom: -100px; }
|
|
102
130
|
}
|
|
131
|
+
`}</style>
|
|
103
132
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
133
|
+
<div className="crt-container max-w-5xl h-[80vh] border-8 border-double border-[#bbb]/20 rounded-lg overflow-hidden flex flex-col items-center justify-center">
|
|
134
|
+
<div className="scanline" />
|
|
135
|
+
|
|
136
|
+
<div className="w-full max-w-3xl dos-font text-xs sm:text-lg lg:text-xl space-y-4">
|
|
137
|
+
<div className="text-center mb-8">
|
|
138
|
+
<motion.div
|
|
139
|
+
initial={{ scale: 0.9, opacity: 0 }}
|
|
140
|
+
animate={{ scale: 1, opacity: 1 }}
|
|
141
|
+
className="inline-block"
|
|
142
|
+
>
|
|
143
|
+
<div className="inverted-box text-3xl sm:text-5xl font-bold py-2 px-6">
|
|
144
|
+
WINDOWS
|
|
145
|
+
</div>
|
|
146
|
+
</motion.div>
|
|
147
|
+
</div>
|
|
148
|
+
|
|
149
|
+
<AnimatePresence>
|
|
150
|
+
{bootStep >= 1 && (
|
|
151
|
+
<motion.div initial={{ opacity: 0 }} animate={{ opacity: 1 }}>
|
|
152
|
+
A fatal exception 404 has occurred at C0DE:ABAD1DEA.
|
|
153
|
+
</motion.div>
|
|
154
|
+
)}
|
|
155
|
+
|
|
156
|
+
{bootStep >= 2 && (
|
|
157
|
+
<motion.div initial={{ opacity: 0 }} animate={{ opacity: 1 }}>
|
|
158
|
+
* The system could not find the file you requested.
|
|
159
|
+
</motion.div>
|
|
160
|
+
)}
|
|
161
|
+
|
|
162
|
+
{bootStep >= 3 && (
|
|
163
|
+
<motion.div initial={{ opacity: 0 }} animate={{ opacity: 1 }}>
|
|
164
|
+
* Press ANY BUTTON to try finding it again in the void.
|
|
165
|
+
</motion.div>
|
|
166
|
+
)}
|
|
167
|
+
|
|
168
|
+
{bootStep >= 4 && (
|
|
169
|
+
<motion.div initial={{ opacity: 0 }} animate={{ opacity: 1 }}>
|
|
170
|
+
* Contact your network administrator if this continues.
|
|
171
|
+
</motion.div>
|
|
172
|
+
)}
|
|
173
|
+
|
|
174
|
+
{bootStep >= 5 && (
|
|
175
|
+
<motion.div initial={{ opacity: 0 }} animate={{ opacity: 1 }} className="pt-8">
|
|
176
|
+
Current State: <span className="text-red-500 underline">ERROR_PAGE_NOT_FOUND</span>
|
|
177
|
+
</motion.div>
|
|
178
|
+
)}
|
|
179
|
+
|
|
180
|
+
{bootStep >= 6 && (
|
|
181
|
+
<motion.div
|
|
182
|
+
initial={{ opacity: 0 }}
|
|
183
|
+
animate={{ opacity: 1 }}
|
|
184
|
+
className="text-center pt-12"
|
|
185
|
+
>
|
|
186
|
+
Press any button to return home
|
|
187
|
+
<span className="inline-block w-3 h-6 bg-[#bbb] ml-2 animate-pulse align-middle" />
|
|
188
|
+
</motion.div>
|
|
189
|
+
)}
|
|
190
|
+
|
|
191
|
+
{bootStep >= 7 && (
|
|
192
|
+
<motion.div
|
|
193
|
+
initial={{ opacity: 0, y: 20 }}
|
|
194
|
+
animate={{ opacity: 1, y: 0 }}
|
|
195
|
+
className="flex justify-center pt-8"
|
|
196
|
+
>
|
|
197
|
+
<Link
|
|
198
|
+
href="/"
|
|
199
|
+
className="inverted-box hover:bg-white hover:text-[#000084] transition-colors duration-200 px-8 py-2 font-bold uppercase tracking-widest text-sm sm:text-base border-2 border-transparent"
|
|
200
|
+
>
|
|
201
|
+
Return to Safety
|
|
202
|
+
</Link>
|
|
203
|
+
</motion.div>
|
|
204
|
+
)}
|
|
205
|
+
</AnimatePresence>
|
|
206
|
+
</div>
|
|
115
207
|
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
font-style: normal;
|
|
123
|
-
}
|
|
124
|
-
`}</style>
|
|
208
|
+
<div className="absolute bottom-4 left-4 opacity-30 text-[10px] dos-font uppercase tracking-tighter">
|
|
209
|
+
Kernel Memory: 0x4041337 | IRQ: 07 | DMA: 02
|
|
210
|
+
</div>
|
|
211
|
+
</div>
|
|
212
|
+
|
|
213
|
+
<div className="absolute inset-0 pointer-events-none bg-[radial-gradient(circle_at_center,_transparent_0%,_rgba(0,0,0,0.4)_100%)] z-20" />
|
|
125
214
|
</main>
|
|
126
215
|
);
|
|
127
216
|
};
|
|
128
217
|
|
|
129
218
|
export default BlueGlitch;
|
|
219
|
+
|
|
@@ -1,53 +1,141 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
1
3
|
import Image from "next/image";
|
|
2
4
|
import Link from "next/link";
|
|
5
|
+
import { motion } from "framer-motion";
|
|
6
|
+
import { Search, GraduationCap, Code2, Terminal, BookOpen } from "lucide-react";
|
|
7
|
+
import { cn } from "@/components/ui/cn";
|
|
8
|
+
|
|
9
|
+
const GeeksforGeeks = ({ className }: { className?: string }) => {
|
|
10
|
+
const containerVariants = {
|
|
11
|
+
hidden: { opacity: 0 },
|
|
12
|
+
visible: {
|
|
13
|
+
opacity: 1,
|
|
14
|
+
transition: {
|
|
15
|
+
staggerChildren: 0.1,
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
const itemVariants = {
|
|
21
|
+
hidden: { opacity: 0, y: 20 },
|
|
22
|
+
visible: { opacity: 1, y: 0 },
|
|
23
|
+
};
|
|
3
24
|
|
|
4
|
-
const GeeksforGeeks = () => {
|
|
5
25
|
return (
|
|
6
|
-
<div
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
/>
|
|
15
|
-
|
|
16
|
-
<h1 className="text-2xl font-semibold text-gray-900 mb-2">
|
|
17
|
-
Whoops, that page is gone.
|
|
18
|
-
</h1>
|
|
19
|
-
|
|
20
|
-
<p className="text-gray-600 text-center max-w-md mb-10">
|
|
21
|
-
While you’re here, feast your eyes upon these popular recommendations
|
|
22
|
-
for you.
|
|
23
|
-
</p>
|
|
24
|
-
|
|
25
|
-
<div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6">
|
|
26
|
-
<Card title="Problem of the day" color="from-blue-400 to-blue-300" />
|
|
27
|
-
<Card title="Courses @90% Refund" color="from-pink-400 to-pink-300" />
|
|
28
|
-
<Card title="Interview Series" color="from-yellow-400 to-yellow-300" />
|
|
29
|
-
<Card title="Python Tutorial" color="from-green-400 to-green-300" />
|
|
30
|
-
</div>
|
|
26
|
+
<div
|
|
27
|
+
className={cn(
|
|
28
|
+
"min-h-screen flex flex-col items-center justify-center bg-[#f8f9fa] relative overflow-hidden px-4 py-12",
|
|
29
|
+
className
|
|
30
|
+
)}
|
|
31
|
+
>
|
|
32
|
+
<div className="absolute inset-0 z-0 opacity-[0.03] pointer-events-none"
|
|
33
|
+
style={{ backgroundImage: 'radial-gradient(#2f8d46 1px, transparent 1px)', backgroundSize: '30px 30px' }} />
|
|
31
34
|
|
|
32
|
-
<
|
|
33
|
-
|
|
34
|
-
|
|
35
|
+
<motion.div
|
|
36
|
+
className="z-10 w-full max-w-5xl flex flex-col items-center"
|
|
37
|
+
variants={containerVariants}
|
|
38
|
+
initial="hidden"
|
|
39
|
+
animate="visible"
|
|
35
40
|
>
|
|
36
|
-
|
|
37
|
-
|
|
41
|
+
<motion.div variants={itemVariants} className="mb-8">
|
|
42
|
+
<Image
|
|
43
|
+
src="https://media.geeksforgeeks.org/auth-dashboard-uploads/Illustration.svg"
|
|
44
|
+
alt="404 Illustration"
|
|
45
|
+
width={400}
|
|
46
|
+
height={300}
|
|
47
|
+
priority
|
|
48
|
+
className="w-full max-w-[380px] h-auto drop-shadow-2xl"
|
|
49
|
+
/>
|
|
50
|
+
</motion.div>
|
|
51
|
+
|
|
52
|
+
<motion.h1
|
|
53
|
+
variants={itemVariants}
|
|
54
|
+
className="text-4xl md:text-5xl font-bold text-[#2f8d46] mb-4 text-center"
|
|
55
|
+
>
|
|
56
|
+
Data Structure Not Found
|
|
57
|
+
</motion.h1>
|
|
58
|
+
|
|
59
|
+
<motion.p
|
|
60
|
+
variants={itemVariants}
|
|
61
|
+
className="text-gray-600 text-center max-w-xl mb-12 text-lg"
|
|
62
|
+
>
|
|
63
|
+
Even the most efficient algorithms occasionally hit a null pointer.
|
|
64
|
+
While we garbage collect this error, why not explore these popular topics?
|
|
65
|
+
</motion.p>
|
|
66
|
+
|
|
67
|
+
<motion.div
|
|
68
|
+
variants={itemVariants}
|
|
69
|
+
className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6 w-full mb-12"
|
|
70
|
+
>
|
|
71
|
+
<Card
|
|
72
|
+
title="DSA Self Paced"
|
|
73
|
+
icon={<Code2 className="w-6 h-6" />}
|
|
74
|
+
color="bg-blue-50 text-blue-600 border-blue-100"
|
|
75
|
+
description="Master Data Structures"
|
|
76
|
+
/>
|
|
77
|
+
<Card
|
|
78
|
+
title="Complete Interview"
|
|
79
|
+
icon={<GraduationCap className="w-6 h-6" />}
|
|
80
|
+
color="bg-purple-50 text-purple-600 border-purple-100"
|
|
81
|
+
description="A-Z Preparation"
|
|
82
|
+
/>
|
|
83
|
+
<Card
|
|
84
|
+
title="System Design"
|
|
85
|
+
icon={<Terminal className="w-6 h-6" />}
|
|
86
|
+
color="bg-amber-50 text-amber-600 border-amber-100"
|
|
87
|
+
description="Scalable Architectures"
|
|
88
|
+
/>
|
|
89
|
+
<Card
|
|
90
|
+
title="Python Master"
|
|
91
|
+
icon={<BookOpen className="w-6 h-6" />}
|
|
92
|
+
color="bg-emerald-50 text-emerald-600 border-emerald-100"
|
|
93
|
+
description="For Data Science"
|
|
94
|
+
/>
|
|
95
|
+
</motion.div>
|
|
96
|
+
|
|
97
|
+
<motion.div variants={itemVariants} className="flex flex-col sm:flex-row gap-4 items-center">
|
|
98
|
+
<div className="relative group">
|
|
99
|
+
<div className="absolute inset-y-0 left-3 flex items-center pointer-events-none">
|
|
100
|
+
<Search className="w-4 h-4 text-gray-400" />
|
|
101
|
+
</div>
|
|
102
|
+
<input
|
|
103
|
+
type="text"
|
|
104
|
+
placeholder="Search for tutorials..."
|
|
105
|
+
className="pl-10 pr-4 py-3 bg-white border border-gray-200 rounded-full w-64 md:w-80 focus:outline-none focus:ring-2 focus:ring-[#2f8d46]/20 focus:border-[#2f8d46] transition-all shadow-sm"
|
|
106
|
+
/>
|
|
107
|
+
</div>
|
|
108
|
+
|
|
109
|
+
<Link
|
|
110
|
+
href="/"
|
|
111
|
+
className="px-8 py-3 bg-[#2f8d46] text-white font-semibold rounded-full hover:bg-[#267339] transition-all shadow-md hover:shadow-lg active:scale-95"
|
|
112
|
+
>
|
|
113
|
+
Back to Dashboard
|
|
114
|
+
</Link>
|
|
115
|
+
</motion.div>
|
|
116
|
+
</motion.div>
|
|
117
|
+
|
|
118
|
+
<div className="absolute bottom-0 left-0 w-full h-1 bg-gradient-to-r from-transparent via-[#2f8d46]/20 to-transparent" />
|
|
38
119
|
</div>
|
|
39
120
|
);
|
|
40
121
|
};
|
|
41
122
|
|
|
42
|
-
const Card = ({ title, color }: { title: string; color: string }) => {
|
|
123
|
+
const Card = ({ title, icon, color, description }: { title: string; icon: React.ReactNode; color: string; description: string }) => {
|
|
43
124
|
return (
|
|
44
|
-
<div
|
|
45
|
-
|
|
125
|
+
<motion.div
|
|
126
|
+
whileHover={{ y: -8, scale: 1.02 }}
|
|
127
|
+
className={cn(
|
|
128
|
+
"p-6 rounded-2xl border bg-white flex flex-col items-center text-center shadow-sm hover:shadow-xl transition-all duration-300 cursor-pointer group"
|
|
129
|
+
)}
|
|
46
130
|
>
|
|
47
|
-
<div className="
|
|
48
|
-
|
|
49
|
-
|
|
131
|
+
<div className={cn("p-4 rounded-xl mb-4 transition-colors group-hover:scale-110", color)}>
|
|
132
|
+
{icon}
|
|
133
|
+
</div>
|
|
134
|
+
<h3 className="font-bold text-gray-900 mb-1">{title}</h3>
|
|
135
|
+
<p className="text-sm text-gray-500">{description}</p>
|
|
136
|
+
</motion.div>
|
|
50
137
|
);
|
|
51
138
|
};
|
|
52
139
|
|
|
53
140
|
export default GeeksforGeeks;
|
|
141
|
+
|
package/templates/Google.tsx
CHANGED
|
@@ -1,30 +1,98 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
className="
|
|
24
|
-
/>
|
|
25
|
-
</div>
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
import { motion } from "framer-motion";
|
|
4
|
+
import Link from "next/link";
|
|
5
|
+
import { cn } from "@/components/ui/cn";
|
|
6
|
+
import Image from "next/image";
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
const Google = ({ className }: { className?: string }) => {
|
|
10
|
+
return (
|
|
11
|
+
<div
|
|
12
|
+
className={cn(
|
|
13
|
+
"min-h-screen bg-white flex flex-col items-center justify-center font-sans relative overflow-hidden",
|
|
14
|
+
className
|
|
15
|
+
)}
|
|
16
|
+
>
|
|
17
|
+
<div className="absolute top-10 left-10 md:left-20">
|
|
18
|
+
<Image
|
|
19
|
+
src="https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_92x30dp.png"
|
|
20
|
+
alt="Google"
|
|
21
|
+
width={92}
|
|
22
|
+
height={30}
|
|
23
|
+
className="opacity-80"
|
|
24
|
+
/>
|
|
25
|
+
</div>
|
|
26
|
+
|
|
27
|
+
<div className="w-full max-w-5xl px-8 flex flex-col md:flex-row items-center justify-between gap-16 text-center md:text-left z-10">
|
|
28
|
+
<motion.div
|
|
29
|
+
initial={{ opacity: 0, x: -30 }}
|
|
30
|
+
animate={{ opacity: 1, x: 0 }}
|
|
31
|
+
transition={{ duration: 0.8, ease: "easeOut" }}
|
|
32
|
+
className="max-w-md"
|
|
33
|
+
>
|
|
34
|
+
<h1 className="text-2xl md:text-3xl font-medium text-[#3c4043] mb-4">
|
|
35
|
+
<span className="font-bold text-4xl block mb-2">404.</span>
|
|
36
|
+
That's an error.
|
|
37
|
+
</h1>
|
|
38
|
+
<p className="text-[#70757a] text-lg leading-relaxed mb-10">
|
|
39
|
+
The requested URL was not found on this server.{" "}
|
|
40
|
+
<span className="text-[#3c4043] font-medium italic">That's all we know.</span>
|
|
41
|
+
</p>
|
|
42
|
+
|
|
43
|
+
<div className="flex flex-col sm:flex-row gap-4 justify-center md:justify-start">
|
|
44
|
+
<Link
|
|
45
|
+
href="/"
|
|
46
|
+
className="px-8 py-3 bg-[#1a73e8] text-white font-medium rounded-md hover:bg-[#185abc] hover:shadow-md transition-all active:scale-95"
|
|
47
|
+
>
|
|
48
|
+
Back to Safety
|
|
49
|
+
</Link>
|
|
50
|
+
<button className="px-8 py-3 text-[#1a73e8] font-medium rounded-md hover:bg-[#f1f3f4] transition-all">
|
|
51
|
+
Try a search
|
|
52
|
+
</button>
|
|
53
|
+
</div>
|
|
54
|
+
</motion.div>
|
|
55
|
+
|
|
56
|
+
<motion.div
|
|
57
|
+
initial={{ opacity: 0, scale: 0.8, rotate: 10 }}
|
|
58
|
+
animate={{ opacity: 1, scale: 1, rotate: 0 }}
|
|
59
|
+
transition={{
|
|
60
|
+
duration: 1,
|
|
61
|
+
type: "spring",
|
|
62
|
+
stiffness: 100,
|
|
63
|
+
delay: 0.2
|
|
64
|
+
}}
|
|
65
|
+
className="relative group"
|
|
66
|
+
>
|
|
67
|
+
<motion.div
|
|
68
|
+
animate={{
|
|
69
|
+
y: [0, -15, 0],
|
|
70
|
+
rotate: [0, -2, 2, 0]
|
|
71
|
+
}}
|
|
72
|
+
transition={{
|
|
73
|
+
duration: 6,
|
|
74
|
+
repeat: Infinity,
|
|
75
|
+
ease: "easeInOut"
|
|
76
|
+
}}
|
|
77
|
+
>
|
|
78
|
+
<img
|
|
79
|
+
src="https://www.google.com/images/errors/robot.png"
|
|
80
|
+
alt="Broken robot"
|
|
81
|
+
className="w-[280px] md:w-[350px] h-auto drop-shadow-[0_20px_40px_rgba(0,0,0,0.1)] group-hover:drop-shadow-[0_30px_60px_rgba(0,0,0,0.15)] transition-all"
|
|
82
|
+
/>
|
|
83
|
+
</motion.div>
|
|
84
|
+
|
|
85
|
+
<div className="absolute -z-10 bottom-4 left-1/2 -translate-x-1/2 w-32 h-6 bg-black opacity-[0.05] rounded-full blur-xl scale-x-150 animate-pulse" />
|
|
86
|
+
</motion.div>
|
|
87
|
+
</div>
|
|
88
|
+
|
|
89
|
+
<div className="absolute -bottom-24 -left-24 w-64 h-64 bg-[#4285F4] opacity-[0.03] rounded-full blur-3xl animate-pulse" />
|
|
90
|
+
<div className="absolute top-20 -right-24 w-80 h-80 bg-[#EA4335] opacity-[0.03] rounded-full blur-3xl" />
|
|
91
|
+
<div className="absolute bottom-20 right-40 w-48 h-48 bg-[#FBBC05] opacity-[0.03] rounded-full blur-3xl animate-bounce duration-[10s]" />
|
|
92
|
+
<div className="absolute top-40 left-1/3 w-32 h-32 bg-[#34A853] opacity-[0.03] rounded-full blur-3xl" />
|
|
93
|
+
</div>
|
|
94
|
+
);
|
|
95
|
+
};
|
|
96
|
+
|
|
30
97
|
export default Google;
|
|
98
|
+
|