46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
|
# File 'lib/eksa.rb', line 46
def core_call(env)
request = Rack::Request.new(env)
flash_message = request.cookies['eksa_flash']
route = @routes[request.path_info]
if route
controller_instance = route[:controller].new(request)
controller_instance.flash[:notice] = flash_message if flash_message
response_data = controller_instance.send(route[:action])
if response_data.is_a?(Array) && response_data.size == 3
status, , body = response_data
response = Rack::Response.new(body, status, )
else
response = Rack::Response.new
if controller_instance.status == 302
response.redirect(controller_instance.redirect_url, 302)
else
response.write(response_data)
response['content-type'] = 'text/html'
end
end
response.delete_cookie('eksa_flash') if flash_message
response.finish
else
html = <<~HTML
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>404 - Halaman Tidak Ditemukan</title>
<script src="https://cdn.tailwindcss.com"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/4.1.1/animate.min.css" rel="stylesheet">
<script src="https://unpkg.com/lucide@latest"></script>
<style>
body { background: radial-gradient(circle at top left, #1e1b4b 0%, #000000 100%); min-height: 100vh; color: white; font-family: sans-serif; display: flex; align-items: center; justify-content: center; overflow: hidden; margin: 0; }
.glass { background: rgba(255, 255, 255, 0.03); backdrop-filter: blur(20px); border: 1px solid rgba(255, 255, 255, 0.1); box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5); }
.glow { position: absolute; width: 400px; height: 400px; background: radial-gradient(circle, rgba(79, 70, 229, 0.15) 0%, transparent 70%); z-index: -1; filter: blur(40px); }
</style>
</head>
<body>
<div class="glow" style="top: 0; left: 0; transform: translate(-50%, -50%);"></div>
<div class="glow" style="bottom: 0; right: 0; transform: translate(50%, 50%);"></div>
<div class="glass" style="max-width: 512px; width: 100%; padding: 48px; border-radius: 40px; text-align: center; animation: zoomIn 0.8s;">
<div style="margin-bottom: 32px; position: relative; display: inline-block;">
<div style="position: absolute; inset: 0; background: rgba(79, 70, 229, 0.2); filter: blur(3xl); border-radius: 9999px;"></div>
<div style="position: relative; background: rgba(79, 70, 229, 0.2); padding: 24px; border-radius: 24px; border: 1px solid rgba(99, 102, 241, 0.3);">
<i data-lucide="ghost" style="width: 64px; height: 64px; color: #a5b4fc;"></i>
</div>
</div>
<h1 style="font-size: 80px; font-weight: 900; margin: 0; letter-spacing: -0.05em; color: white; opacity: 0.9;">404</h1>
<h2 style="font-size: 24px; font-weight: 700; margin: 16px 0; color: rgba(255, 255, 255, 0.9);">Oops! Halaman Hilang.</h2>
<p style="color: rgba(255, 255, 255, 0.5); margin-bottom: 40px; line-height: 1.6;">Sepertinya halaman yang Anda cari tidak ada atau sudah berpindah alamat. Jangan khawatir, kita bisa kembali.</p>
<div style="display: flex; flex-direction: column; gap: 16px; justify-content: center;">
<a href="/" style="padding: 16px 32px; background: white; color: black; font-weight: 700; border-radius: 16px; text-decoration: none; display: flex; items-center: center; justify-content: center; gap: 8px;">
<i data-lucide="home" style="width: 20px; height: 20px;"></i> Kembali ke Beranda
</a>
</div>
</div>
<script>lucide.createIcons();</script>
</body>
</html>
HTML
[404, { 'content-type' => 'text/html' }, [html]]
end
end
|