404lab 2.0.4 → 2.0.6

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/utils/fs.js CHANGED
@@ -51,7 +51,7 @@ export async function safeWrite(filePath, content, options = {}) {
51
51
  }
52
52
 
53
53
  log.warn(`File exists: ${relPath}`);
54
- const shouldOverwrite = await confirm("Overwrite?", true);
54
+ const shouldOverwrite = await confirm("Overwrite?", false);
55
55
 
56
56
  if (!shouldOverwrite) {
57
57
  log.info(`Skipped: ${relPath}`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "404lab",
3
- "version": "2.0.4",
3
+ "version": "2.0.6",
4
4
  "description": "A CLI tool for generating beautiful custom 404 pages in Next.js projects",
5
5
  "type": "module",
6
6
  "preferGlobal": true,
@@ -4,7 +4,6 @@ import { useEffect, useRef, useState } from "react";
4
4
  import Image from "next/image";
5
5
  import Link from "next/link";
6
6
  import { VT323 } from "next/font/google";
7
- import { cn } from "@/components/ui/cn";
8
7
 
9
8
  const vt323 = VT323({
10
9
  weight: "400",
@@ -37,11 +36,7 @@ const AmongUs = ({ className }: { className?: string }) => {
37
36
  return (
38
37
  <div
39
38
  ref={containerRef}
40
- className={cn(
41
- "relative flex min-h-screen w-full flex-col items-center justify-center overflow-hidden bg-[#000000] text-white",
42
- vt323.className,
43
- className
44
- )}
39
+ className={`relative flex min-h-screen w-full flex-col items-center justify-center overflow-hidden bg-[#000000] text-white ${vt323.className} ${className || ""}`}
45
40
  >
46
41
  <style jsx global>{`
47
42
 
@@ -2,8 +2,6 @@
2
2
 
3
3
  import { useEffect, useState } from "react";
4
4
  import Link from "next/link";
5
- import { cn } from "@/components/ui/cn";
6
-
7
5
  const BlueGlitch = ({
8
6
  fullScreen = true,
9
7
  className,
@@ -22,11 +20,7 @@ const BlueGlitch = ({
22
20
 
23
21
  return (
24
22
  <main
25
- className={cn(
26
- "relative flex items-center justify-center bg-[#000084] overflow-hidden select-none font-mono",
27
- fullScreen ? "min-h-screen" : "h-full",
28
- className
29
- )}
23
+ className={`relative flex items-center justify-center bg-[#000084] overflow-hidden select-none font-mono ${fullScreen ? "min-h-screen" : "h-full"} ${className || ""}`}
30
24
  >
31
25
  <style jsx global>{`
32
26
  @font-face {
@@ -2,7 +2,6 @@
2
2
 
3
3
  import { useEffect, useRef, useState, useCallback } from 'react';
4
4
  import Link from 'next/link';
5
- import { cn } from '@/components/ui/cn';
6
5
 
7
6
  export default function BugGame404() {
8
7
  const canvasRef = useRef<HTMLCanvasElement>(null);
@@ -3,15 +3,11 @@
3
3
  import Image from "next/image";
4
4
  import Link from "next/link";
5
5
  import { Search, GraduationCap, Code2, Terminal, BookOpen } from "lucide-react";
6
- import { cn } from "@/components/ui/cn";
7
6
 
8
7
  const GeeksforGeeks = ({ className }: { className?: string }) => {
9
8
  return (
10
9
  <div
11
- className={cn(
12
- "min-h-screen flex flex-col items-center justify-center bg-[#f8f9fa] relative overflow-hidden px-4 py-12",
13
- className
14
- )}
10
+ className={`min-h-screen flex flex-col items-center justify-center bg-[#f8f9fa] relative overflow-hidden px-4 py-12 ${className || ""}`}
15
11
  >
16
12
  <style jsx global>{`
17
13
  @keyframes fadeIn {
@@ -118,11 +114,9 @@ const GeeksforGeeks = ({ className }: { className?: string }) => {
118
114
  const Card = ({ title, icon, color, description }: { title: string; icon: React.ReactNode; color: string; description: string }) => {
119
115
  return (
120
116
  <div
121
- className={cn(
122
- "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 hover:-translate-y-2 hover:scale-[1.02]"
123
- )}
117
+ className="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 hover:-translate-y-2 hover:scale-[1.02]"
124
118
  >
125
- <div className={cn("p-4 rounded-xl mb-4 transition-colors group-hover:scale-110", color)}>
119
+ <div className={`p-4 rounded-xl mb-4 transition-colors group-hover:scale-110 ${color}`}>
126
120
  {icon}
127
121
  </div>
128
122
  <h3 className="font-bold text-gray-900 mb-1">{title}</h3>
@@ -1,17 +1,11 @@
1
1
  "use client";
2
2
 
3
3
  import Link from "next/link";
4
- import { cn } from "@/components/ui/cn";
5
4
  import Image from "next/image";
6
-
7
-
8
5
  const Google = ({ className }: { className?: string }) => {
9
6
  return (
10
7
  <div
11
- className={cn(
12
- "min-h-screen bg-white flex flex-col items-center justify-center font-sans relative overflow-hidden",
13
- className
14
- )}
8
+ className={`min-h-screen bg-white flex flex-col items-center justify-center font-sans relative overflow-hidden ${className || ""}`}
15
9
  >
16
10
  <div className="absolute top-6 sm:top-10 left-6 sm:left-10 md:left-20">
17
11
  <Image
@@ -2,13 +2,11 @@
2
2
 
3
3
  import { useEffect, useRef, useState, KeyboardEvent } from "react";
4
4
  import { useRouter } from "next/navigation";
5
- import { cn } from "@/components/ui/cn";
6
5
 
7
6
  type OutputLine = {
8
7
  type: "command" | "output" | "error" | "system" | "warning";
9
8
  text: string;
10
9
  };
11
-
12
10
  const MacOs = ({ className }: { className?: string }) => {
13
11
  const router = useRouter();
14
12
  const inputRef = useRef<HTMLInputElement>(null);
@@ -68,7 +66,7 @@ const MacOs = ({ className }: { className?: string }) => {
68
66
  };
69
67
 
70
68
  return (
71
- <main className={cn("min-h-screen flex items-center justify-center bg-[#0d1117] relative overflow-hidden font-mono", className)}>
69
+ <main className={`min-h-screen flex items-center justify-center bg-[#0d1117] relative overflow-hidden font-mono ${className || ""}`}>
72
70
  <div className="absolute inset-0 z-0">
73
71
  <div className="absolute top-[-10%] right-[-10%] w-[500px] h-[500px] bg-purple-600/10 rounded-full blur-[120px]" />
74
72
  <div className="absolute bottom-[-10%] left-[-10%] w-[500px] h-[500px] bg-blue-600/10 rounded-full blur-[120px]" />
@@ -2,15 +2,11 @@
2
2
 
3
3
 
4
4
  import Link from "next/link";
5
- import { cn } from "@/components/ui/cn";
6
5
 
7
6
  const ModernPage = ({ className }: { className?: string }) => {
8
7
  return (
9
8
  <div
10
- className={cn(
11
- "min-h-screen bg-[#050505] flex items-center justify-center p-6 overflow-hidden relative font-sans",
12
- className
13
- )}
9
+ className={`min-h-screen bg-[#050505] flex items-center justify-center p-6 overflow-hidden relative font-sans ${className || ""}`}
14
10
  >
15
11
  {/* Mesh Gradient Background */}
16
12
  <div className="absolute inset-0 overflow-hidden pointer-events-none">
@@ -4,7 +4,6 @@ import { useEffect, useState } from "react";
4
4
  import Particles, { initParticlesEngine } from "@tsparticles/react";
5
5
  import { loadSlim } from "@tsparticles/slim";
6
6
  import { type Container, type ISourceOptions } from "@tsparticles/engine";
7
- import { cn } from "@/components/ui/cn";
8
7
  import Link from "next/link";
9
8
 
10
9
  const Custom404Clean = ({
@@ -132,11 +131,7 @@ const Custom404Clean = ({
132
131
 
133
132
  return (
134
133
  <div
135
- className={cn(
136
- "relative flex items-center justify-center bg-black text-white overflow-hidden select-none",
137
- fullScreen ? "h-screen w-full" : "h-full w-full",
138
- className
139
- )}
134
+ className={`relative flex items-center justify-center bg-black text-white overflow-hidden select-none ${fullScreen ? "h-screen w-full" : "h-full w-full"} ${className || ""}`}
140
135
  >
141
136
  {init && (
142
137
  <Particles
@@ -2,17 +2,13 @@
2
2
 
3
3
 
4
4
  import Link from "next/link";
5
- import { cn } from "@/components/ui/cn";
6
5
 
7
6
  const Poet = ({ className }: { className?: string }) => {
8
7
 
9
8
 
10
9
  return (
11
10
  <div
12
- className={cn(
13
- "min-h-screen bg-[#1a1a1a] flex items-center justify-center p-6 relative overflow-hidden font-serif",
14
- className
15
- )}
11
+ className={`min-h-screen bg-[#1a1a1a] flex items-center justify-center p-6 relative overflow-hidden font-serif ${className || ""}`}
16
12
  >
17
13
  <style jsx global>{`
18
14
  @import url('https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,700;0,900;1,400&display=swap');
@@ -3,8 +3,6 @@
3
3
  import { useEffect, useRef, useState } from "react";
4
4
  import Link from "next/link";
5
5
 
6
- import { cn } from "@/components/ui/cn";
7
-
8
6
  const RetroTv = ({ className }: { className?: string }) => {
9
7
  const canvasRef = useRef<HTMLCanvasElement>(null);
10
8
  const [isOn, setIsOn] = useState(false);
@@ -60,10 +58,7 @@ const RetroTv = ({ className }: { className?: string }) => {
60
58
 
61
59
  return (
62
60
  <div
63
- className={cn(
64
- "min-h-screen bg-[#1a1a1a] flex items-center justify-center p-4 sm:p-8 font-mono overflow-hidden select-none",
65
- className
66
- )}
61
+ className={`min-h-screen bg-[#1a1a1a] flex items-center justify-center p-4 sm:p-8 font-mono overflow-hidden select-none ${className || ""}`}
67
62
  >
68
63
  <style jsx global>{`
69
64
  .crt-curve {
@@ -189,10 +184,7 @@ const RetroTv = ({ className }: { className?: string }) => {
189
184
 
190
185
  <button
191
186
  onClick={() => setIsOn(!isOn)}
192
- className={cn(
193
- "px-4 py-2 text-xs rounded-md transition-all border-b-2 border-black font-bold",
194
- isOn ? "bg-red-900 text-red-100" : "bg-green-900 text-green-100"
195
- )}
187
+ className={`px-4 py-2 text-xs rounded-md transition-all border-b-2 border-black font-bold ${isOn ? "bg-red-900 text-red-100" : "bg-green-900 text-green-100"}`}
196
188
  >
197
189
  {isOn ? "POWER OFF" : "POWER ON"}
198
190
  </button>
@@ -2,15 +2,11 @@
2
2
 
3
3
 
4
4
  import Link from "next/link";
5
- import { cn } from "@/components/ui/cn";
6
5
 
7
6
  const SimplePage = ({ className }: { className?: string }) => {
8
7
  return (
9
8
  <div
10
- className={cn(
11
- "min-h-screen bg-white dark:bg-[#050505] flex items-center justify-center p-6 font-sans relative",
12
- className
13
- )}
9
+ className={`min-h-screen bg-white dark:bg-[#050505] flex items-center justify-center p-6 font-sans relative ${className || ""}`}
14
10
  >
15
11
  <style jsx global>{`
16
12
  @keyframes fadeInUp {
@@ -3,8 +3,6 @@
3
3
  import { useEffect, useRef, useState } from "react";
4
4
  import Link from "next/link";
5
5
 
6
- import { cn } from "@/components/ui/cn";
7
-
8
6
  const Snow = ({ className }: { className?: string }) => {
9
7
  const canvasRef = useRef<HTMLCanvasElement>(null);
10
8
  const [isHovered, setIsHovered] = useState(false);
@@ -80,10 +78,7 @@ const Snow = ({ className }: { className?: string }) => {
80
78
 
81
79
  return (
82
80
  <div
83
- className={cn(
84
- "min-h-screen w-full flex flex-col items-center justify-center overflow-hidden bg-gradient-to-b from-[#b7d1e5] via-[#e8f2f6] to-white relative",
85
- className
86
- )}
81
+ className={`min-h-screen w-full flex flex-col items-center justify-center overflow-hidden bg-gradient-to-b from-[#b7d1e5] via-[#e8f2f6] to-white relative ${className || ""}`}
87
82
  >
88
83
  <canvas ref={canvasRef} className="absolute inset-0 z-10 pointer-events-none opacity-60" />
89
84
 
@@ -3,7 +3,7 @@
3
3
  import { useEffect, useState } from "react";
4
4
  import Link from "next/link";
5
5
  import { Arvo } from "next/font/google";
6
- import { cn } from "@/components/ui/cn";
6
+
7
7
 
8
8
  const arvo = Arvo({
9
9
  weight: ["400", "700"],
@@ -22,11 +22,7 @@ const StoneAge = ({ className }: { className?: string }) => {
22
22
 
23
23
  return (
24
24
  <div
25
- className={cn(
26
- "min-h-screen w-full bg-[#fcf8f0] flex flex-col items-center justify-center p-8 overflow-hidden relative",
27
- arvo.className,
28
- className
29
- )}
25
+ className={`min-h-screen w-full bg-[#fcf8f0] flex flex-col items-center justify-center p-8 overflow-hidden relative ${arvo.className} ${className || ""}`}
30
26
  >
31
27
  <style jsx global>{`
32
28
  .paper-texture {
@@ -1,16 +1,11 @@
1
1
  "use client";
2
2
 
3
- import { cn } from "@/components/ui/cn";
4
-
5
3
  import Link from "next/link";
6
4
 
7
5
  const StrangerThings = ({ className }: { className?: string }) => {
8
6
  return (
9
7
  <div
10
- className={cn(
11
- "min-h-[500px] flex flex-col items-center justify-center p-6 overflow-hidden transition-colors duration-500 bg-background",
12
- className
13
- )}
8
+ className={`min-h-[500px] flex flex-col items-center justify-center p-6 overflow-hidden transition-colors duration-500 bg-background ${className || ""}`}
14
9
  style={{ perspective: "1200px" }}
15
10
  >
16
11
  <style jsx>{`
@@ -3,8 +3,6 @@
3
3
  import { useEffect, useRef, useState } from "react";
4
4
  import Link from "next/link";
5
5
 
6
- import { cn } from "@/components/ui/cn";
7
-
8
6
  const Terminal = ({ className }: { className?: string }) => {
9
7
  const canvasRef = useRef<HTMLCanvasElement>(null);
10
8
  const [displayText, setDisplayText] = useState("");
@@ -83,10 +81,7 @@ const Terminal = ({ className }: { className?: string }) => {
83
81
 
84
82
  return (
85
83
  <div
86
- className={cn(
87
- "min-h-screen bg-black flex flex-col items-center justify-center p-8 overflow-hidden font-mono relative",
88
- className
89
- )}
84
+ className={`min-h-screen bg-black flex flex-col items-center justify-center p-8 overflow-hidden font-mono relative ${className || ""}`}
90
85
  >
91
86
  <style jsx global>{`
92
87
  @keyframes fadeInScale {
@@ -2,7 +2,6 @@
2
2
 
3
3
 
4
4
  import Link from "next/link";
5
- import { cn } from "@/components/ui/cn";
6
5
  import { useEffect, useState } from "react";
7
6
 
8
7
  const allLogs = [
@@ -38,10 +37,7 @@ const Vercel = ({ className }: { className?: string }) => {
38
37
 
39
38
  return (
40
39
  <div
41
- className={cn(
42
- "min-h-screen w-full bg-black text-white flex flex-col items-center justify-center p-8 overflow-hidden font-sans relative",
43
- className
44
- )}
40
+ className={`min-h-screen w-full bg-black text-white flex flex-col items-center justify-center p-8 overflow-hidden font-sans relative ${className || ""}`}
45
41
  >
46
42
  <style jsx global>{`
47
43
  @keyframes fadeIn {
@@ -130,10 +126,7 @@ const Vercel = ({ className }: { className?: string }) => {
130
126
  {logs.map((log, i) => (
131
127
  <div
132
128
  key={i}
133
- className={cn(
134
- "flex gap-4 animate-fade-in-right",
135
- log.text.includes("Error") || log.text.includes("failed") ? "text-red-400" : "text-gray-400"
136
- )}
129
+ className={`flex gap-4 animate-fade-in-right ${log.text.includes("Error") || log.text.includes("failed") ? "text-red-400" : "text-gray-400"}`}
137
130
  >
138
131
  <span className="text-gray-600">[{log.time}]</span>
139
132
  <span>{log.text}</span>
@@ -2,7 +2,6 @@
2
2
 
3
3
  import { useEffect, useRef, useState } from "react";
4
4
  import Link from "next/link";
5
- import { cn } from "@/components/ui/cn";
6
5
 
7
6
  export default function Void({ className }: { className?: string }) {
8
7
  const canvasRef = useRef<HTMLCanvasElement | null>(null);
@@ -211,7 +210,7 @@ export default function Void({ className }: { className?: string }) {
211
210
  }, []);
212
211
 
213
212
  return (
214
- <div className={cn("relative min-h-screen flex flex-col items-center justify-center bg-[#05050a] text-[#f0f0f3] overflow-hidden font-sans", className)}>
213
+ <div className={`relative min-h-screen flex flex-col items-center justify-center bg-[#05050a] text-[#f0f0f3] overflow-hidden font-sans ${className || ""}`}>
215
214
  <style jsx global>{`
216
215
  @keyframes fadeIn {
217
216
  from { opacity: 0; transform: translateY(10px); }
@@ -257,7 +256,7 @@ export default function Void({ className }: { className?: string }) {
257
256
  ))}
258
257
  </div>
259
258
 
260
- <div className={cn("transition-all duration-500 transform", isChanging ? "opacity-0 translate-y-2" : "opacity-100 translate-y-0")}>
259
+ <div className={`transition-all duration-500 transform ${isChanging ? "opacity-0 translate-y-2" : "opacity-100 translate-y-0"}`}>
261
260
  <h1 className="text-2xl md:text-5xl font-bold tracking-tight mb-4 flex flex-col items-center">
262
261
  <span className="text-white/80">{messages[titleIdx].title[0]}</span>
263
262
  <span className="text-[#00e5c7] drop-shadow-[0_0_15px_rgba(0,229,199,0.3)]">