add default error
- add error setting in application.yml - update tailwind.css - add error.html - add information.html - update UserAttribute with GuestUser - add ErrorAttributes - add GuestUser
This commit is contained in:
@@ -0,0 +1,29 @@
|
||||
package ltd.hlaeja.controller.advice
|
||||
|
||||
import kotlinx.coroutines.runBlocking
|
||||
import ltd.hlaeja.security.RemoteAuthentication
|
||||
import ltd.hlaeja.security.user.GuestUser
|
||||
import org.springframework.boot.web.error.ErrorAttributeOptions
|
||||
import org.springframework.boot.web.reactive.error.DefaultErrorAttributes
|
||||
import org.springframework.security.core.context.SecurityContextImpl
|
||||
import org.springframework.stereotype.Component
|
||||
import org.springframework.web.reactive.function.server.ServerRequest
|
||||
import org.springframework.web.reactive.function.server.awaitSession
|
||||
|
||||
@Component
|
||||
class ErrorAttributes : DefaultErrorAttributes(), GuestUser {
|
||||
|
||||
override fun getErrorAttributes(
|
||||
serverRequest: ServerRequest,
|
||||
errorAttributeOptions: ErrorAttributeOptions,
|
||||
): MutableMap<String, Any> =
|
||||
super.getErrorAttributes(serverRequest, errorAttributeOptions)
|
||||
.also { attribute ->
|
||||
attribute["remoteUser"] = runBlocking {
|
||||
serverRequest.awaitSession()
|
||||
.attributes["SPRING_SECURITY_CONTEXT"]
|
||||
?.let { context -> (context as SecurityContextImpl).authentication }
|
||||
?: guestUser()
|
||||
} as RemoteAuthentication
|
||||
}
|
||||
}
|
||||
@@ -1,29 +1,24 @@
|
||||
package ltd.hlaeja.controller.advice
|
||||
|
||||
import java.util.UUID
|
||||
import kotlinx.coroutines.reactive.awaitFirstOrNull
|
||||
import ltd.hlaeja.security.RemoteAuthentication
|
||||
import ltd.hlaeja.security.RemoteUserDetail
|
||||
import ltd.hlaeja.security.user.GuestUser
|
||||
import org.springframework.security.core.context.ReactiveSecurityContextHolder
|
||||
import org.springframework.ui.Model
|
||||
import org.springframework.web.bind.annotation.ControllerAdvice
|
||||
import org.springframework.web.bind.annotation.ModelAttribute
|
||||
|
||||
@ControllerAdvice
|
||||
class UserAttribute {
|
||||
class UserAttribute : GuestUser {
|
||||
|
||||
@ModelAttribute
|
||||
suspend fun remoteUser(model: Model) {
|
||||
val remoteAuthentication: RemoteAuthentication = ReactiveSecurityContextHolder.getContext()
|
||||
.awaitFirstOrNull()
|
||||
?.let { it.authentication as RemoteAuthentication }
|
||||
?: RemoteAuthentication(
|
||||
RemoteUserDetail(
|
||||
UUID.fromString("00000000-0000-0000-0000-000000000000"),
|
||||
"n/a",
|
||||
),
|
||||
mutableListOf(),
|
||||
)
|
||||
model.addAttribute("remoteUser", remoteAuthentication)
|
||||
model.addAttribute(
|
||||
"remoteUser",
|
||||
ReactiveSecurityContextHolder.getContext()
|
||||
.awaitFirstOrNull()
|
||||
?.let { it.authentication as RemoteAuthentication }
|
||||
?: guestUser(),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
16
src/main/kotlin/ltd/hlaeja/security/user/GuestUser.kt
Normal file
16
src/main/kotlin/ltd/hlaeja/security/user/GuestUser.kt
Normal file
@@ -0,0 +1,16 @@
|
||||
package ltd.hlaeja.security.user
|
||||
|
||||
import java.util.UUID
|
||||
import ltd.hlaeja.security.RemoteAuthentication
|
||||
import ltd.hlaeja.security.RemoteUserDetail
|
||||
|
||||
interface GuestUser {
|
||||
|
||||
fun guestUser(): RemoteAuthentication = RemoteAuthentication(
|
||||
RemoteUserDetail(
|
||||
UUID.fromString("00000000-0000-0000-0000-000000000000"),
|
||||
"n/a",
|
||||
),
|
||||
mutableListOf(),
|
||||
)
|
||||
}
|
||||
@@ -17,6 +17,12 @@ spring:
|
||||
redis:
|
||||
port: 6379
|
||||
|
||||
server:
|
||||
error:
|
||||
include-exception: false
|
||||
include-message: never
|
||||
include-stacktrace: never
|
||||
|
||||
management:
|
||||
endpoints:
|
||||
access:
|
||||
@@ -55,6 +61,12 @@ spring:
|
||||
host: localhost
|
||||
database: 2
|
||||
|
||||
server:
|
||||
error:
|
||||
include-exception: true
|
||||
include-message: always
|
||||
include-stacktrace: always
|
||||
|
||||
account-registry:
|
||||
url: http://localhost:9050
|
||||
|
||||
@@ -74,6 +86,11 @@ spring:
|
||||
host: Redis
|
||||
database: 2
|
||||
|
||||
server:
|
||||
error:
|
||||
include-exception: true
|
||||
include-message: always
|
||||
|
||||
account-registry:
|
||||
url: http://AccountRegistry:8080
|
||||
|
||||
|
||||
@@ -15,16 +15,21 @@
|
||||
--color-green-600: oklch(62.7% 0.194 149.214);
|
||||
--color-green-800: oklch(44.8% 0.119 151.328);
|
||||
--color-green-900: oklch(39.3% 0.095 152.535);
|
||||
--color-teal-100: oklch(95.3% 0.051 180.801);
|
||||
--color-teal-600: oklch(60% 0.118 184.704);
|
||||
--color-gray-500: oklch(55.1% 0.027 264.364);
|
||||
--color-gray-600: oklch(44.6% 0.03 256.802);
|
||||
--color-gray-700: oklch(37.3% 0.034 259.733);
|
||||
--color-gray-800: oklch(27.8% 0.033 256.848);
|
||||
--color-gray-900: oklch(21% 0.034 264.665);
|
||||
--color-zinc-300: oklch(87.1% 0.006 286.286);
|
||||
--color-zinc-400: oklch(70.5% 0.015 286.067);
|
||||
--color-stone-400: oklch(70.9% 0.01 56.259);
|
||||
--color-black: #000;
|
||||
--color-white: #fff;
|
||||
--spacing: 0.25rem;
|
||||
--container-md: 28rem;
|
||||
--container-2xl: 42rem;
|
||||
--container-3xl: 48rem;
|
||||
--container-4xl: 56rem;
|
||||
--text-xs: 0.75rem;
|
||||
@@ -39,8 +44,20 @@
|
||||
--text-xl--line-height: calc(1.75 / 1.25);
|
||||
--text-2xl: 1.5rem;
|
||||
--text-2xl--line-height: calc(2 / 1.5);
|
||||
--text-3xl: 1.875rem;
|
||||
--text-3xl--line-height: calc(2.25 / 1.875);
|
||||
--text-4xl: 2.25rem;
|
||||
--text-4xl--line-height: calc(2.5 / 2.25);
|
||||
--text-5xl: 3rem;
|
||||
--text-5xl--line-height: 1;
|
||||
--text-6xl: 3.75rem;
|
||||
--text-6xl--line-height: 1;
|
||||
--text-7xl: 4.5rem;
|
||||
--text-7xl--line-height: 1;
|
||||
--font-weight-semibold: 600;
|
||||
--font-weight-bold: 700;
|
||||
--leading-relaxed: 1.625;
|
||||
--radius-md: 0.375rem;
|
||||
--radius-lg: 0.5rem;
|
||||
--default-transition-duration: 150ms;
|
||||
--default-transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
|
||||
@@ -245,6 +262,9 @@
|
||||
.mt-auto {
|
||||
margin-top: auto;
|
||||
}
|
||||
.mb-0 {
|
||||
margin-bottom: calc(var(--spacing) * 0);
|
||||
}
|
||||
.mb-2 {
|
||||
margin-bottom: calc(var(--spacing) * 2);
|
||||
}
|
||||
@@ -254,6 +274,12 @@
|
||||
.mb-6 {
|
||||
margin-bottom: calc(var(--spacing) * 6);
|
||||
}
|
||||
.mb-8 {
|
||||
margin-bottom: calc(var(--spacing) * 8);
|
||||
}
|
||||
.mb-50 {
|
||||
margin-bottom: calc(var(--spacing) * 50);
|
||||
}
|
||||
.block {
|
||||
display: block;
|
||||
}
|
||||
@@ -269,21 +295,69 @@
|
||||
.inline-block {
|
||||
display: inline-block;
|
||||
}
|
||||
.table {
|
||||
display: table;
|
||||
}
|
||||
.h-2 {
|
||||
height: calc(var(--spacing) * 2);
|
||||
}
|
||||
.h-6 {
|
||||
height: calc(var(--spacing) * 6);
|
||||
}
|
||||
.h-12 {
|
||||
height: calc(var(--spacing) * 12);
|
||||
}
|
||||
.h-20 {
|
||||
height: calc(var(--spacing) * 20);
|
||||
}
|
||||
.h-25 {
|
||||
height: calc(var(--spacing) * 25);
|
||||
}
|
||||
.h-30 {
|
||||
height: calc(var(--spacing) * 30);
|
||||
}
|
||||
.h-full {
|
||||
height: 100%;
|
||||
}
|
||||
.min-h-\[calc\(100vh-4rem\)\] {
|
||||
min-height: calc(100vh - 4rem);
|
||||
}
|
||||
.min-h-\[calc\(100vh-6rem\)\] {
|
||||
min-height: calc(100vh - 6rem);
|
||||
}
|
||||
.min-h-\[calc\(100vh-10rem\)\] {
|
||||
min-height: calc(100vh - 10rem);
|
||||
}
|
||||
.min-h-screen {
|
||||
min-height: 100vh;
|
||||
}
|
||||
.w-6 {
|
||||
width: calc(var(--spacing) * 6);
|
||||
}
|
||||
.w-12 {
|
||||
width: calc(var(--spacing) * 12);
|
||||
}
|
||||
.w-48 {
|
||||
width: calc(var(--spacing) * 48);
|
||||
}
|
||||
.w-100 {
|
||||
width: calc(var(--spacing) * 100);
|
||||
}
|
||||
.w-125 {
|
||||
width: calc(var(--spacing) * 125);
|
||||
}
|
||||
.w-150 {
|
||||
width: calc(var(--spacing) * 150);
|
||||
}
|
||||
.w-400 {
|
||||
width: calc(var(--spacing) * 400);
|
||||
}
|
||||
.w-full {
|
||||
width: 100%;
|
||||
}
|
||||
.max-w-2xl {
|
||||
max-width: var(--container-2xl);
|
||||
}
|
||||
.max-w-3xl {
|
||||
max-width: var(--container-3xl);
|
||||
}
|
||||
@@ -299,6 +373,12 @@
|
||||
.flex-grow {
|
||||
flex-grow: 1;
|
||||
}
|
||||
.border-collapse {
|
||||
border-collapse: collapse;
|
||||
}
|
||||
.resize {
|
||||
resize: both;
|
||||
}
|
||||
.list-none {
|
||||
list-style-type: none;
|
||||
}
|
||||
@@ -353,12 +433,18 @@
|
||||
.overflow-y-auto {
|
||||
overflow-y: auto;
|
||||
}
|
||||
.scroll-smooth {
|
||||
scroll-behavior: smooth;
|
||||
}
|
||||
.rounded {
|
||||
border-radius: 0.25rem;
|
||||
}
|
||||
.rounded-lg {
|
||||
border-radius: var(--radius-lg);
|
||||
}
|
||||
.rounded-md {
|
||||
border-radius: var(--radius-md);
|
||||
}
|
||||
.border {
|
||||
border-style: var(--tw-border-style);
|
||||
border-width: 1px;
|
||||
@@ -401,6 +487,29 @@
|
||||
.bg-stone-400 {
|
||||
background-color: var(--color-stone-400);
|
||||
}
|
||||
.bg-teal-600 {
|
||||
background-color: var(--color-teal-600);
|
||||
}
|
||||
.bg-gradient-to-br {
|
||||
--tw-gradient-position: to bottom right in oklab;
|
||||
background-image: linear-gradient(var(--tw-gradient-stops));
|
||||
}
|
||||
.from-zinc-300 {
|
||||
--tw-gradient-from: var(--color-zinc-300);
|
||||
--tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
|
||||
}
|
||||
.via-zinc-400 {
|
||||
--tw-gradient-via: var(--color-zinc-400);
|
||||
--tw-gradient-via-stops: var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-via) var(--tw-gradient-via-position), var(--tw-gradient-to) var(--tw-gradient-to-position);
|
||||
--tw-gradient-stops: var(--tw-gradient-via-stops);
|
||||
}
|
||||
.to-stone-400 {
|
||||
--tw-gradient-to: var(--color-stone-400);
|
||||
--tw-gradient-stops: var(--tw-gradient-via-stops, var(--tw-gradient-position), var(--tw-gradient-from) var(--tw-gradient-from-position), var(--tw-gradient-to) var(--tw-gradient-to-position));
|
||||
}
|
||||
.fill-green-400 {
|
||||
fill: var(--color-green-400);
|
||||
}
|
||||
.p-4 {
|
||||
padding: calc(var(--spacing) * 4);
|
||||
}
|
||||
@@ -422,15 +531,50 @@
|
||||
.py-2 {
|
||||
padding-block: calc(var(--spacing) * 2);
|
||||
}
|
||||
.py-3 {
|
||||
padding-block: calc(var(--spacing) * 3);
|
||||
}
|
||||
.py-4 {
|
||||
padding-block: calc(var(--spacing) * 4);
|
||||
}
|
||||
.py-5 {
|
||||
padding-block: calc(var(--spacing) * 5);
|
||||
}
|
||||
.py-10 {
|
||||
padding-block: calc(var(--spacing) * 10);
|
||||
}
|
||||
.py-12 {
|
||||
padding-block: calc(var(--spacing) * 12);
|
||||
}
|
||||
.text-center {
|
||||
text-align: center;
|
||||
}
|
||||
.text-left {
|
||||
text-align: left;
|
||||
}
|
||||
.font-mono {
|
||||
font-family: var(--font-mono);
|
||||
}
|
||||
.text-2xl {
|
||||
font-size: var(--text-2xl);
|
||||
line-height: var(--tw-leading, var(--text-2xl--line-height));
|
||||
}
|
||||
.text-3xl {
|
||||
font-size: var(--text-3xl);
|
||||
line-height: var(--tw-leading, var(--text-3xl--line-height));
|
||||
}
|
||||
.text-4xl {
|
||||
font-size: var(--text-4xl);
|
||||
line-height: var(--tw-leading, var(--text-4xl--line-height));
|
||||
}
|
||||
.text-5xl {
|
||||
font-size: var(--text-5xl);
|
||||
line-height: var(--tw-leading, var(--text-5xl--line-height));
|
||||
}
|
||||
.text-7xl {
|
||||
font-size: var(--text-7xl);
|
||||
line-height: var(--tw-leading, var(--text-7xl--line-height));
|
||||
}
|
||||
.text-base {
|
||||
font-size: var(--text-base);
|
||||
line-height: var(--tw-leading, var(--text-base--line-height));
|
||||
@@ -455,10 +599,20 @@
|
||||
--tw-leading: var(--leading-relaxed);
|
||||
line-height: var(--leading-relaxed);
|
||||
}
|
||||
.font-bold {
|
||||
--tw-font-weight: var(--font-weight-bold);
|
||||
font-weight: var(--font-weight-bold);
|
||||
}
|
||||
.font-semibold {
|
||||
--tw-font-weight: var(--font-weight-semibold);
|
||||
font-weight: var(--font-weight-semibold);
|
||||
}
|
||||
.break-words {
|
||||
overflow-wrap: break-word;
|
||||
}
|
||||
.whitespace-pre-wrap {
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
.text-black {
|
||||
color: var(--color-black);
|
||||
}
|
||||
@@ -474,13 +628,23 @@
|
||||
.text-red-600 {
|
||||
color: var(--color-red-600);
|
||||
}
|
||||
.text-teal-100 {
|
||||
color: var(--color-teal-100);
|
||||
}
|
||||
.text-white {
|
||||
color: var(--color-white);
|
||||
}
|
||||
.underline {
|
||||
text-decoration-line: underline;
|
||||
}
|
||||
.shadow-lg {
|
||||
--tw-shadow: 0 10px 15px -3px var(--tw-shadow-color, rgb(0 0 0 / 0.1)), 0 4px 6px -4px var(--tw-shadow-color, rgb(0 0 0 / 0.1));
|
||||
box-shadow: var(--tw-inset-shadow), var(--tw-inset-ring-shadow), var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow);
|
||||
}
|
||||
.outline {
|
||||
outline-style: var(--tw-outline-style);
|
||||
outline-width: 1px;
|
||||
}
|
||||
.filter {
|
||||
filter: var(--tw-blur,) var(--tw-brightness,) var(--tw-contrast,) var(--tw-grayscale,) var(--tw-hue-rotate,) var(--tw-invert,) var(--tw-saturate,) var(--tw-sepia,) var(--tw-drop-shadow,);
|
||||
}
|
||||
@@ -551,6 +715,24 @@
|
||||
line-height: var(--tw-leading, var(--text-2xl--line-height));
|
||||
}
|
||||
}
|
||||
.sm\:text-3xl {
|
||||
@media (width >= 40rem) {
|
||||
font-size: var(--text-3xl);
|
||||
line-height: var(--tw-leading, var(--text-3xl--line-height));
|
||||
}
|
||||
}
|
||||
.sm\:text-4xl {
|
||||
@media (width >= 40rem) {
|
||||
font-size: var(--text-4xl);
|
||||
line-height: var(--tw-leading, var(--text-4xl--line-height));
|
||||
}
|
||||
}
|
||||
.sm\:text-5xl {
|
||||
@media (width >= 40rem) {
|
||||
font-size: var(--text-5xl);
|
||||
line-height: var(--tw-leading, var(--text-5xl--line-height));
|
||||
}
|
||||
}
|
||||
.sm\:text-base {
|
||||
@media (width >= 40rem) {
|
||||
font-size: var(--text-base);
|
||||
@@ -569,11 +751,91 @@
|
||||
line-height: var(--tw-leading, var(--text-xl--line-height));
|
||||
}
|
||||
}
|
||||
.md\:h-20 {
|
||||
@media (width >= 48rem) {
|
||||
height: calc(var(--spacing) * 20);
|
||||
}
|
||||
}
|
||||
.md\:h-24 {
|
||||
@media (width >= 48rem) {
|
||||
height: calc(var(--spacing) * 24);
|
||||
}
|
||||
}
|
||||
.md\:h-40 {
|
||||
@media (width >= 48rem) {
|
||||
height: calc(var(--spacing) * 40);
|
||||
}
|
||||
}
|
||||
.md\:h-50 {
|
||||
@media (width >= 48rem) {
|
||||
height: calc(var(--spacing) * 50);
|
||||
}
|
||||
}
|
||||
.md\:h-100 {
|
||||
@media (width >= 48rem) {
|
||||
height: calc(var(--spacing) * 100);
|
||||
}
|
||||
}
|
||||
.md\:h-200 {
|
||||
@media (width >= 48rem) {
|
||||
height: calc(var(--spacing) * 200);
|
||||
}
|
||||
}
|
||||
.md\:w-20 {
|
||||
@media (width >= 48rem) {
|
||||
width: calc(var(--spacing) * 20);
|
||||
}
|
||||
}
|
||||
.md\:w-24 {
|
||||
@media (width >= 48rem) {
|
||||
width: calc(var(--spacing) * 24);
|
||||
}
|
||||
}
|
||||
.md\:w-200 {
|
||||
@media (width >= 48rem) {
|
||||
width: calc(var(--spacing) * 200);
|
||||
}
|
||||
}
|
||||
.md\:w-320 {
|
||||
@media (width >= 48rem) {
|
||||
width: calc(var(--spacing) * 320);
|
||||
}
|
||||
}
|
||||
.md\:grid-cols-2 {
|
||||
@media (width >= 48rem) {
|
||||
grid-template-columns: repeat(2, minmax(0, 1fr));
|
||||
}
|
||||
}
|
||||
.md\:text-2xl {
|
||||
@media (width >= 48rem) {
|
||||
font-size: var(--text-2xl);
|
||||
line-height: var(--tw-leading, var(--text-2xl--line-height));
|
||||
}
|
||||
}
|
||||
.md\:text-4xl {
|
||||
@media (width >= 48rem) {
|
||||
font-size: var(--text-4xl);
|
||||
line-height: var(--tw-leading, var(--text-4xl--line-height));
|
||||
}
|
||||
}
|
||||
.md\:text-5xl {
|
||||
@media (width >= 48rem) {
|
||||
font-size: var(--text-5xl);
|
||||
line-height: var(--tw-leading, var(--text-5xl--line-height));
|
||||
}
|
||||
}
|
||||
.md\:text-6xl {
|
||||
@media (width >= 48rem) {
|
||||
font-size: var(--text-6xl);
|
||||
line-height: var(--tw-leading, var(--text-6xl--line-height));
|
||||
}
|
||||
}
|
||||
.md\:text-7xl {
|
||||
@media (width >= 48rem) {
|
||||
font-size: var(--text-7xl);
|
||||
line-height: var(--tw-leading, var(--text-7xl--line-height));
|
||||
}
|
||||
}
|
||||
}
|
||||
@property --tw-space-y-reverse {
|
||||
syntax: "*";
|
||||
@@ -590,6 +852,48 @@
|
||||
inherits: false;
|
||||
initial-value: solid;
|
||||
}
|
||||
@property --tw-gradient-position {
|
||||
syntax: "*";
|
||||
inherits: false;
|
||||
}
|
||||
@property --tw-gradient-from {
|
||||
syntax: "<color>";
|
||||
inherits: false;
|
||||
initial-value: #0000;
|
||||
}
|
||||
@property --tw-gradient-via {
|
||||
syntax: "<color>";
|
||||
inherits: false;
|
||||
initial-value: #0000;
|
||||
}
|
||||
@property --tw-gradient-to {
|
||||
syntax: "<color>";
|
||||
inherits: false;
|
||||
initial-value: #0000;
|
||||
}
|
||||
@property --tw-gradient-stops {
|
||||
syntax: "*";
|
||||
inherits: false;
|
||||
}
|
||||
@property --tw-gradient-via-stops {
|
||||
syntax: "*";
|
||||
inherits: false;
|
||||
}
|
||||
@property --tw-gradient-from-position {
|
||||
syntax: "<length-percentage>";
|
||||
inherits: false;
|
||||
initial-value: 0%;
|
||||
}
|
||||
@property --tw-gradient-via-position {
|
||||
syntax: "<length-percentage>";
|
||||
inherits: false;
|
||||
initial-value: 50%;
|
||||
}
|
||||
@property --tw-gradient-to-position {
|
||||
syntax: "<length-percentage>";
|
||||
inherits: false;
|
||||
initial-value: 100%;
|
||||
}
|
||||
@property --tw-leading {
|
||||
syntax: "*";
|
||||
inherits: false;
|
||||
@@ -663,6 +967,11 @@
|
||||
inherits: false;
|
||||
initial-value: 0 0 #0000;
|
||||
}
|
||||
@property --tw-outline-style {
|
||||
syntax: "*";
|
||||
inherits: false;
|
||||
initial-value: solid;
|
||||
}
|
||||
@property --tw-blur {
|
||||
syntax: "*";
|
||||
inherits: false;
|
||||
@@ -722,6 +1031,15 @@
|
||||
--tw-space-y-reverse: 0;
|
||||
--tw-space-x-reverse: 0;
|
||||
--tw-border-style: solid;
|
||||
--tw-gradient-position: initial;
|
||||
--tw-gradient-from: #0000;
|
||||
--tw-gradient-via: #0000;
|
||||
--tw-gradient-to: #0000;
|
||||
--tw-gradient-stops: initial;
|
||||
--tw-gradient-via-stops: initial;
|
||||
--tw-gradient-from-position: 0%;
|
||||
--tw-gradient-via-position: 50%;
|
||||
--tw-gradient-to-position: 100%;
|
||||
--tw-leading: initial;
|
||||
--tw-font-weight: initial;
|
||||
--tw-shadow: 0 0 #0000;
|
||||
@@ -738,6 +1056,7 @@
|
||||
--tw-ring-offset-width: 0px;
|
||||
--tw-ring-offset-color: #fff;
|
||||
--tw-ring-offset-shadow: 0 0 #0000;
|
||||
--tw-outline-style: solid;
|
||||
--tw-blur: initial;
|
||||
--tw-brightness: initial;
|
||||
--tw-contrast: initial;
|
||||
|
||||
58
src/main/resources/templates/error/error.html
Normal file
58
src/main/resources/templates/error/error.html
Normal file
@@ -0,0 +1,58 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" class="scroll-smooth" xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
|
||||
<head>
|
||||
<title>Error - Hlæja</title>
|
||||
<th:block th:replace="~{layout.html :: metadata}"/>
|
||||
</head>
|
||||
<body class="bg-gray-900 text-green-400 min-h-screen flex flex-col">
|
||||
|
||||
<!-- Navigation -->
|
||||
<th:block th:replace="~{layout.html :: header}"/>
|
||||
|
||||
<!-- Hero Section with Stone and Zinc Gradient -->
|
||||
<section class="min-h-[calc(100vh-10rem)] flex-grow flex items-center justify-center">
|
||||
<div class="container mx-auto px-4 text-center">
|
||||
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 635.5 183.45" class="fill-green-400 mx-auto w-125 h-25 md:w-200 md:h-40 mb-4">
|
||||
<path class="cls-1"
|
||||
d="M201.82,172.27c4.87,2.68,9.15,.73,13.52,1.43-4.28,6.45-10.7,5.44-16.08,4.59-16.71-2.65-33.48-1.07-50.21-1.72-.65-.03-1.29-.13-2.24-.23,.59-1.83,2.07-2.41,4.94-3.05-4.33-1.24-7.23-.93-10.15-.59,.27,2.01,2.22,1.92,4.01,2.94-10.78,1.57-20.76,.29-30.71-1.14-4.09-.59-8.42-1.19-12.27-1.16-24.33,.17-48.54-3.06-72.86-2.35-3.53,.1-7.12,.35-10.4,1.63-3.49,1.36-7.04,1.27-10.6,1.15-3.06-.1-8.54-7.26-7.86-11.31,1.76-10.37-.89-21.03,2.28-31.25,2.53-8.17,1.13-16.58,1.6-24.87,.1-1.85-.36-3.58-1.41-5.43-1.35-2.37-2.06-5.02-.96-8.38,2.36-7.27,1.71-15.01,1.3-22.6-.04-.79,.06-1.58,.09-2.26,1.32-.71,1.88,.58,2.81,.66,.97,.08,2.19,.34,2.4-.83,.18-.96-.8-1.31-1.8-1.76C2.99,63.88-.25,61.33,.02,55.9c.33-6.72-.11-13.48,.22-20.2,.23-4.6,1.22-9.16,7.92-9.02-2.33-.82-5.02,1.77-5.96-1.48-.67-2.32,4.07-8.01,6.2-7.71,2.08,.29,3.31,1.28,3.12,3.93-.87,12.13-1.19,24.39-.97,36.44,.36,19.74,.11,39.47-.1,59.2-.16,15.21,.78,30.45-.72,45.66-.13,1.31-.89,2.21-.95,3.45-.07,1.48,.14,2.96,1.77,2.71,7-1.05,14.04,0,20.96-.38,17.21-.94,34.4-.92,51.61-.81,38.92,.23,77.83,.67,116.75,1.01,46.92,.41,93.84,.78,140.75,1.22,44.64,.43,89.29,.97,133.93,1.4,45.8,.44,91.6,.75,137.39,1.29,4.8,.06,5.74-1.57,5.72-6.06-.09-29.56,.16-59.13,.23-88.69,0-.69-.1-1.46,.47-1.65,1.04-.34,1.88,.24,2.31,1.24,1.7,3.88,3.7,7.81,4.01,12,.81,10.75,.64,21.61,1.5,32.31,1.44,18.06-.37,36.13,1.25,54.15,.2,2.23-.03,6.1-3.49,3.76-5.49-3.72-11.29-2.26-16.97-2.65-5.52-.38-11.12,.21-16.62-.32-6.05-.58-11.21,2.5-17,3.15-11.22,1.26-21.72-.96-32.47-3.32-14.82-3.26-29.76-4.34-44.73,.03-5.36,1.57-11.06,2.55-16.63,2.71-7.18,.21-14.22,.96-21.24,2.27-7.64,1.42-15.07,1.89-23,.22-6.38-1.35-13.37-.39-20.2,.28-11.89,1.16-23.95,2.85-36.09-.79-6.01-1.8-12.94-.7-19.45-.69-15.12,.03-30.23,.3-45.35,.26-12.32-.03-24.46-3.04-36.84-2.46-4.06,.19-8.14-.04-12.21-.15-5.76-.16-11.42,.45-17.11-2.22-3.35-1.57-7.91-.83-11.92-.77-6.78,.11-13.65,.15-19.76-2.89-4.92-2.45-9.02,1.15-14.51-.05Zm179.05,4.02c-1.06-1.98-1.37-3.34-4-3.12-5.89,.5-11.86,.52-17.77,.23-7.23-.36-14.22,2.62-21.51,1.53,14.24,3.24,28.66,0,43.29,1.36Zm-44.79-3.2c-13.32,2.77-27.03-.8-40.35,2.18,3.49,1.64,7.23,.87,10.65,.9,9.09,.07,18.19,.13,27.29,.27,2.81,.04,2.8-1.21,2.42-3.36Zm-71.82-.68c9.26,6.78,19.53,3.09,29.43,3.26-2.82-2.48-5.54-5.56-9.05-1.21-.71,.87-1.82,.19-2.71-.17-5.71-2.34-11.81-.99-17.67-1.87Zm154.75,1.6c-9.46-1.72-17.58-.88-19.6,1.78,6.31,.29,12.44-.56,19.6-1.78Zm-163.53-.69c-2-2.31-4.48-.58-6.66-1.04-.8-.17-.8,.88-.81,1.46-.01,1.03,.83,.77,1.35,.61,1.97-.6,3.84-1.65,6.11-1.02Z"/>
|
||||
<path class="cls-1" d="M138.4,146.09c-2.07-.82-4.29-1.37-4.33-4.07-.04-2.52,1.45-3.79,3.84-4.23,3.98-.74,4.95-3.29,4.95-7.05,.03-18.35,.59-36.69,.22-55.05-.08-3.72,.07-7.53,.11-11.3,0-.69,.53-1.37,.75-2.07,1.96-6.19,.29-9.84-6.18-12.97-1.99-.96-3.42-2.11-2.89-4.4,.57-2.44,2.75-3.26,4.88-3.33,4.88-.16,9.78,0,14.67,.04,8.15,.06,16.29,.21,24.44,.13,2.78-.03,3.65,1.05,3.51,3.65-.79,14.7-.9,29.45-.87,44.14,.03,14.32-.36,28.67,.05,43.01,.09,2.96,1.2,4.57,3.83,5.38,2.55,.79,5.35,1.36,4.5,5.02-.84,3.62-3.99,3.51-6.67,3.51-11.38,0-22.76-.21-34.14-.33-3.58-.04-7.17-.06-10.67-.08Z"/>
|
||||
<path class="cls-1" d="M492.47,149.29c-2.3-.43-4.24-1.36-4.57-3.81-.35-2.57,1.48-3.96,3.7-4.35,3.8-.66,5.18-2.89,5.12-6.44-.34-20.38,.91-40.75,.28-61.15-.14-4.61,.37-9.26,.41-13.91,.03-3.45-.93-5.67-4.39-6.46-2.45-.56-4.56-1.73-4.32-4.42,.26-2.96,2.82-3.83,5.41-3.83,13.2-.01,26.4,.1,39.6,.13,2.83,0,2.49,2.05,2.47,3.74-.23,24.07-.5,48.14-.74,72.21-.05,4.84,.11,9.68-.02,14.52-.08,3,.84,5,4,5.7,2.52,.57,4.94,1.61,4.49,4.74-.48,3.3-3.34,3.73-5.99,3.73-12.87-.03-25.74-.18-38.61-.29-2.28-.02-4.55-.08-6.83-.12Z"/>
|
||||
<path class="cls-1" d="M273,83.68c-.7-.13-1.39-.31-2.09-.39-6.68-.8-6.48-.81-6.8-7.86-.2-4.45,.54-8.83,.35-13.31-.18-4.29,4.12-1.1,6.12-2.49-1.75-1.11-4.44-.73-5.68-1.8-1.97-1.7-.4-3.67,2.14-4.96-2.65-.67-4.98-1.1-7.19-1.85-2.2-.74-4.54-1.84-4.1-4.66,.46-2.93,2.94-3.66,5.55-3.66,8.8,0,17.6,.07,26.39,.13,4.07,.03,8.14,.25,12.21,.12,2.62-.08,3.31,.93,3.27,3.4-.2,10.83-.21,21.66-.33,32.49-.03,2.52,0,4.98-3.96,3.97-1.63-.42-3.51,.09-5.55,.2,.65,.24,1.03,.45,1.43,.51,7.82,1.12,7.88,1.12,7.85,9.11-.05,13.4-.07,26.81-.34,40.21-.07,3.53,1.22,5.53,4.53,6.39,2.38,.62,4.46,1.56,4.06,4.51-.42,3.1-2.91,3.79-5.43,3.78-15.15-.04-30.31-.17-45.46-.38-2.4-.03-4.58-1.03-5.08-3.72-.5-2.66,1.3-3.96,3.54-4.38,5.3-1,5.27-4.89,5.28-8.9,.04-13.28,.32-26.57,.08-39.85-.09-4.91,1.32-7.09,6.4-6.21,.89,.15,1.82,.04,2.73,.05,.02-.15,.03-.31,.05-.46Zm-3.08-31.2c1.82,5.82,3.68,1.47,5.59,.32-1.89,.83-3.65-.31-5.59-.32Zm18.83,91.79c-3.31-.94-6.58-1.72-10.26-.64,3.53,1.63,6.86,1.42,10.26,.64Z"/>
|
||||
<path class="cls-1" d="M47.48,75.64c-.94-.42-1.21-.62-1.5-.66-2.76-.46-6.46,1.78-8.1-.84-1.24-1.98-.24-5.33-.25-8.07,0-2.74-.19-5.5,0-8.23,.31-4.56-.06-8.42-5.83-9.36-1.78-.29-2.95-1.77-2.63-4.02,.39-2.68,2.27-3.54,4.45-3.61,6.18-.18,12.38-.16,18.57-.13,6.52,.03,13.06,.5,19.55,.13,4.11-.23,5.27,1.3,4.71,4.85-.85,5.45-1.21,11.32-.87,16.39,.83,12.29,.13,24.5,.29,36.73,.19,14.37-.23,28.75-.29,43.13,0,2.53-.38,3.65-3.5,3.57-12.04-.29-24.09-.16-36.14-.24-1.45-.01-2.92-.29-4.35-.58-1.92-.39-3.29-1.4-3.38-3.55-.09-2.09,1.01-3.59,2.94-3.93,4.9-.87,5.95-3.77,5.89-8.35-.16-12.11,.29-24.22,.24-36.33,0-2.31,1.02-4.4,.81-6.65q-.98-10.36,9.39-10.25Zm10.5,3.42c1.41-.98,3.72,.87,4.91-.95,.84-1.29-.85-1.47-1.69-1.3-1.79,.37-4.09-1.41-5.3,.69-.79,1.38,1.15,.92,2.08,1.56Zm16.84,30.78c-1.74-.84-2.4-1.25-3.12-1.5-1.4-.48-2.35-2.08-4.05-1.69-.24,.06-.58,1.05-.44,1.19,1.22,1.23,2.58,2.36,4.38,2.58,.73,.09,1.51-.25,3.23-.57Z"/>
|
||||
<path class="cls-1" d="M563.72,98.87c5.76,1.36,10.91,2.02,15.57,4.3,6.32,3.09,10.31,7.74,10.37,15.08,.04,4.68,.13,9.35,.21,14.03,.02,1.09-.35,2.42,1.02,2.96,1.24,.49,2.17-.29,2.99-1.15,.22-.23,.45-.47,.69-.69,1.86-1.69,3.74-2.39,6.11-.73,2.45,1.73,2.12,3.96,1.15,6.05-2.12,4.58-5.88,7.85-10.28,10.03-9.6,4.77-19.62,5.09-29.15,.14-9.83-5.11-10.93-13.07-10.08-26.19,.28-4.37,.16-8.79-1.14-12.98-.65-2.11-1.96-4.36-4.42-4.85-3.45-.69-4.12-2.69-4.17-5.84-.05-3.32,1.82-3.86,4.37-4.52,2.72-.71,4.44-2.78,4.85-5.56,1.32-8.99,1.08-18.04,.41-27.06-.26-3.45-2.66-5.99-5.97-7.1-4.93-1.64-2.69-5.47-2.89-8.52-.06-.85,.93-1.12,1.85-1.1,11.26,.26,22.58,.12,32.81,5.97,8.42,4.81,12.46,12.18,12.35,21.65-.12,9.8-4.77,17.01-13.81,21.11-3.92,1.78-8.05,3.1-12.85,4.93Z"/>
|
||||
<path class="cls-1" d="M209.17,95.06c4.02,1.07,7.44,1.9,10.81,2.9,12.44,3.69,16.54,9.46,16.08,22.37-.1,2.9-.14,5.81-.07,8.71,.03,1.05-.28,2.42,1.08,2.98,1.27,.52,2.16-.29,2.93-1.17,2.09-2.38,4.47-3.39,7.18-1.09,2.84,2.41,1.41,4.94-.12,7.34-7.97,12.44-30.4,15.96-41.8,6.55-5.64-4.66-7.08-10.99-7.05-17.86,.02-4,0-8.01,.15-12.01,.22-5.96-1.38-11.02-7.28-13.56-3.03-1.3-2.11-3.45-2.17-5.61-.07-2.54,1.7-2.74,3.48-3.11,3.52-.72,5.18-3.1,5.67-6.44,1.07-7.36,.35-14.79,.77-22.16,.34-6.04-2.01-9.75-7.52-11.78-3.43-1.27-1.49-4.14-1.95-6.29-.46-2.15,1.14-2.56,2.6-2.59,13.79-.33,27.52-.33,38.19,10.54,10.57,10.77,7.77,29.56-5.51,36.9-4.65,2.57-9.62,4.28-15.47,5.39Zm14.12-36.35c-5.6-.79-11.19-.94-16.75,.21,5.61,1.08,11.2,1.36,16.75-.21Z"/>
|
||||
<path class="cls-1" d="M331.82,96.48c5.99,.38,10.35,4.58,16.11,5.77,5.13,1.05,9.93,8.45,8.83,18.05-.39,3.4,.24,6.67,.06,10-.06,1.08-.38,2.4,1.03,2.93,1.29,.49,2.15-.42,2.92-1.26,1.12-1.23,2.28-2.31,4.11-2.29,3.56,.03,5.45,3.2,3.84,6.33-5.67,11.01-15.34,14.62-27.01,13.96-15.61-.88-22.9-8.91-22.69-24.41,.05-3.87,.19-7.74,.14-11.61-.07-5.46-.92-10.52-7.09-12.74-2.45-.88-2.32-3.12-2.41-5.25-.1-2.43,1.44-2.86,3.35-3.27,3.88-.84,5.56-3.57,6.06-7.28,1.04-7.82,.16-15.66,.31-23.49,.09-4.65-1.96-8.28-7.01-9.7-3.34-.94-2.16-3.8-2.19-6.13-.03-1.91,.57-3.11,2.72-3.04,9.76,.3,19.59-.01,28.79,4.19,14.61,6.68,18.19,19.55,13.57,33.43-1.29,3.88-4.75,6.17-7.98,8.22-4.81,3.04-9.69,6.1-15.46,7.6Z"/>
|
||||
<path class="cls-1"
|
||||
d="M633.86,70.09c-4.23-4.83-3.33-10.78-3.34-16.39,0-4.88-.49-9.6-1.83-14.27-.58-2.01-1.78-4.25-1.35-6.08,1.7-7.21-2.93-10.7-7.73-14.22-2.41-1.77-5.34-.73-8.01-1.16-1.63-.26-2.98,.21-3.44-2.13-.44-2.2-2.83-2.29-4.46-1.93-9.18,1.99-18.33-1.3-27.87,.07,3.24,3.36,6.88,2.22,10.1,1.13,3.04-1.03,5.41-1.09,8.51,2.19-7.84-.04-14.69-.47-21.49-.03-18.57,1.21-37.13-.2-55.68,.22-4.76,.11-8.43-2.78-13.02-3.1-9.32-.65-18.39,2.16-27.71,1.33-5.28-.47-10.58-1.09-15.95-.45-2.07,.25-4.25,.28-6.32-1.95-1.59-1.7-5.12,.04-7.78,.06-5.33,.03-10.71,.34-15.97,.1-3.23-.14-3.2,2.84-5.7,3.01-5.81,.4-11.2,1.97-16.93-2.02-4.41-3.07-10.52-.95-15.87-1.01-9.34-.11-18.66,.59-28.03,.4-7.69-.16-15.5-.14-23.26,.09-7.75,.23-15.5,.05-23.3-.91-8.73-1.08-17.66-.54-27.12-.71,2.08,2.38,4.52,2.84,6.46,4.35-6.71-3.89-14.67,.36-21.3-3.63-5.23,2.84-10.93,2.1-16.53,2.09-1.63,0-3.27-.31-4.88-.16-3.12,.29-2-1.45-1.57-2.92,3.36,.28,6.71,.55,10.05,.82-3.3-.65-6.7,.33-9.97-.81-8.93-.13-17.86-1.01-26.73,1.23-2.13,.54-4.79,.3-7.18-.7-7.28-3.04-14.68-2.75-22.36-1.24-6.05,1.19-12.27-1.07-18.49-.54-5.12,.43-10.23,.07-15.43,.73-4.39,.55-8.87-2.65-14.14-5.07,13.23-3.33,25.13-2.68,37.17-.88,5.58,.84,11.39,.11,17.09,.27,6.83,.2,13.65,.58,20.47,.89,3.43,.16,6.62-1.12,9.86-1.63,6.14-.98,12.79-1.22,18.8,.12,6.31,1.4,12.57,.69,18.76,1.63,10.59,1.6,21.14,3.35,31.93,2.94,17.88-.68,35.85,1.78,53.66-1.02,4.49-.71,8.98-.93,13.43-1.47,20.92-2.55,41.81,.04,62.67,.41,20.74,.38,41.51,.15,62.27,.82,10.99,.35,22.2-.58,33.31-.69,5.5-.05,11.02,.96,16.52,.84,26.14-.57,52.19,2.59,78.34,1.74,5.95-.19,12.49,7.03,12.44,12.97-.11,14-.22,28.01-.4,42.01-.02,1.55-.49,3.09-.75,4.63,0,0,.07,.03,.07,.03ZM266.55,12.69c-.23-.16-.46-.33-.69-.49,.11,.08,.2,.2,.32,.24,.24,.07,.5,.11,.75,.15-.12,.03-.25,.06-.38,.1Z"/>
|
||||
<path class="cls-1" d="M372.93,82.78c1.92-6.29,4.53-12.35,8.28-18.51,8.34-13.71,20.57-19.31,35.33-21.72,1.47-.24,4.13-1.76,4.42,.96,.24,2.26,1.65,5.7-1.38,6.97-5.94,2.5-6.72,7.14-6.74,12.64-.07,20.82-.35,41.65-.44,62.47-.01,2.99-1.01,5.86-.13,9,.85,3.04,2.07,5.63,4.99,6.66,4.26,1.51,2.88,4.79,2.91,7.63,.02,1.86-1.38,1.79-2.79,1.62-22.32-2.61-40.55-17.45-44.51-41.6-1.43-8.71-1.36-17.16,.07-26.12Z"/>
|
||||
<path class="cls-1" d="M436.02,43.22c22.45,4.53,37.38,21.23,40.08,43.79,1.53,12.82,.33,25.09-5.34,36.64-5.99,12.2-15.67,20.52-28.89,24.5-2.95,.89-5.97,1.8-9.01,2.02-1.75,.12-4.88,2.18-5.35-.88-.39-2.48-1.83-5.88,2.44-7.81,5.78-2.61,5.87-7.85,5.6-13.56-.44-9.5,.05-19.05,.15-28.58,.13-13.07,.26-26.15,.41-39.22,.05-4.16-1.87-7.11-5.57-8.9-1.48-.72-3.64-1-.94-2.95,.25-.18,.63-.5,.6-.7q-.77-5.66,5.82-4.32Z"/>
|
||||
<path class="cls-1" d="M119.05,143.55c.04,2.42-1.46,2.37-3.29,2.35-10.06-.12-20.13-.19-30.19-.14-2.47,.01-3.05-1.09-2.92-3.23,.14-2.28-.92-4.94,2.83-5.53,9.17-1.46,16.28-6.19,21.3-13.89,1.38-2.12,2.32-4.52,3.53-6.76,1.16-2.16,2.83-3.65,5.49-3.01,2.65,.64,3.29,2.53,3.26,5.11-.12,8.37-.02,16.74,0,25.1Z"/>
|
||||
<path class="cls-1" d="M83.76,43.85c-.94-2.87,.68-2.81,2.77-2.77,9.59,.18,19.18,.37,28.77,.21,3-.05,3.59,.92,3.51,3.57-.2,6.76-.21,13.53-.2,20.29,0,2.89-.64,5.87-3.33,6.83-3.31,1.17-5.47-1.82-6.54-4.26-4.47-10.17-12.05-16.06-22.99-18.1-3.42-.64-3.16-3.27-2-5.77Zm30.5,11.8c-2.33-.55-4.37-1.12-6.48-.31,.07-.02,.13-.03,.27-.07,1.88,1.6,3.96,1.56,6.21,.38Z"/>
|
||||
<path class="cls-1" d="M83.17,90.74c.03-2.37,.79-3.19,2.18-3.74,4.62-1.84,6.88-5.69,8.46-10.09,.49-1.36,1.04-2.73,1.79-3.96,1.06-1.74,2.84-2.09,4.72-1.74,2.06,.38,3.07,1.78,3.05,3.81-.08,9.2,.01,18.41-.46,27.58-.11,2.11,.37,4.04,.32,6.07-.05,2.27-.64,4.1-3.28,4.65-2.76,.58-4.69-.69-5.39-2.99-1.79-5.91-4.18-10.96-10.44-13.72-2.25-.99-.8-4.42-.96-5.85Z"/>
|
||||
<path class="cls-1" d="M19.52,19.53c.38-2.13,2.49-.66,3.12-1.93-.23-1.6-2.05-.62-2.24-1.39-.1,0,.24,0,.58,.02,11.66,.99,23.38,.02,35.06,1.26,8.59,.91,17.24,.27,25.88-.19,7.76-.42,15.66-.95,23.35,.84,3.74,.87,7.64,.04,11.05,2.23-32.1-.28-64.42-.56-96.79-.84Z"/>
|
||||
<path class="cls-1" d="M44.71,.75c5.27,.92,10.97-3.08,15.9,1.48,.46,.43,1.58,.36,2.35,.24,9.54-1.43,18.92,1.37,28.43,1.09,8.29-.24,16.63-.33,24.9,.22,5.64,.38,11.19,1.99,17.02,2.44-1.02,.2-2.03,.55-3.05,.57-21.75,.46-43.45-3.48-65.22-.72-6.23-3.89-14.01-1.48-20.32-5.33Z"/>
|
||||
<path class="cls-1" d="M405.53,17.33c-5.71,1.8-11.45,1.01-17.19,.39,5.64-2.39,11.44-1.36,17.19-.39Z"/>
|
||||
<path class="cls-1" d="M136.86,20.64c-3.22-.09-6.44-.19-9.66-.28,3.33-1.77,6.61-1.58,9.66,.28Z"/>
|
||||
<path class="cls-1" d="M318.56,17.13c4.16-1.02,8.35-1.26,13.22-.44-4.79,1.61-8.99,1.4-13.22,.44Z"/>
|
||||
<path class="cls-1" d="M376.27,17.11c3.14,.26,6.3-1.54,9.85,.59-3.88,1.79-6.9-1.59-9.85-.59Z"/>
|
||||
<path class="cls-1" d="M633.79,70.06c.96,1.58,1.45,3.32,1.6,4.57-1.59-.74,2.06-3.87-1.52-4.54,0,0-.07-.03-.07-.03Z"/>
|
||||
<path class="cls-1" d="M141.14,19.81c-.18-.2-.35-.41-.53-.61-.05,.08-.16,.21-.14,.23,.2,.21,.42,.4,.63,.59,.01-.07,.03-.14,.04-.21Z"/>
|
||||
</svg>
|
||||
<h1 class="text-4xl md:text-6xl mb-6 text-primary-foreground font-bold">This page flopped!</h1>
|
||||
<!-- Show Message and/or Exception -->
|
||||
<th:block th:replace="~{/error/information.html :: exception-info}"/>
|
||||
<p class="text-xl md:text-2xl mb-8 text-muted-foreground max-w-2xl mx-auto font-semibold">Something went wrong in the meme universe! Try again or head back home for more lulz!</p>
|
||||
<a href="/" class="inline-block bg-accent text-primary-foreground px-6 py-3 rounded-md hover:bg-opacity-80 transition-colors font-semibold">Return Home</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- Show Stack Trace -->
|
||||
<th:block th:replace="~{/error/information.html :: exception-trace}"/>
|
||||
|
||||
<!-- Footer -->
|
||||
<th:block th:replace="~{layout.html :: footer}"/>
|
||||
|
||||
<!-- JavaScript -->
|
||||
<th:block th:replace="~{layout.html :: script}"/>
|
||||
</body>
|
||||
</html>
|
||||
21
src/main/resources/templates/error/information.html
Normal file
21
src/main/resources/templates/error/information.html
Normal file
@@ -0,0 +1,21 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
|
||||
<body>
|
||||
<th:block th:fragment="exception-info">
|
||||
<th:block th:if="${message}">
|
||||
<h2 class="text-2xl md:text-4xl font-bold mb-6 text-primary-foreground" th:text="${message}">Message</h2>
|
||||
</th:block>
|
||||
<th:block th:if="${exception}">
|
||||
<h3 class="text-1xl md:text-2xl font-bold mb-6 text-primary-foreground" th:text="${exception}">Exception</h3>
|
||||
</th:block>
|
||||
</th:block>
|
||||
<th:block th:fragment="exception-trace">
|
||||
<section th:if="${trace != null}" class="debug-section py-5 bg-teal-600">
|
||||
<div class="container mx-auto px-4 text-teal-100">
|
||||
<h2 class="text-2xl text-center md:text-6xl text-primary-foreground mb-4 terminal-glow font-semibold">Stack Trace</h2>
|
||||
<div class="stack-trace text-xs mt-2 font-mono leading-relaxed whitespace-pre-wrap break-words" th:text="${trace}">Stack Trace</div>
|
||||
</div>
|
||||
</section>
|
||||
</th:block>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user