From d618087d0bf3ed5a5355dedc1b6050993b823b1c Mon Sep 17 00:00:00 2001 From: art Date: Tue, 30 Jun 2026 16:22:09 +0900 Subject: [PATCH] =?UTF-8?q?feat(redesign):=20=EC=97=90=EB=9F=AC=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20empty-state=20=EC=99=B8=ED=98=95=20+=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EB=B6=84=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit errer.jsp에 디자인 SVG 아이콘·.empty-state 외형 이식, 403/404/기타 3분기 확장. status_code scriptlet 코드읽기 방식과 isErrorPage·requestUri/message 상세 블록 보존(errorData EL 미채택). 뷰명 errer 유지. Co-Authored-By: Claude Opus 4.8 (1M context) --- src/main/webapp/WEB-INF/views/errer.jsp | 193 ++++++++++++------------ 1 file changed, 96 insertions(+), 97 deletions(-) diff --git a/src/main/webapp/WEB-INF/views/errer.jsp b/src/main/webapp/WEB-INF/views/errer.jsp index 40718d4..9e18081 100644 --- a/src/main/webapp/WEB-INF/views/errer.jsp +++ b/src/main/webapp/WEB-INF/views/errer.jsp @@ -1,4 +1,5 @@ <%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" language="java" isErrorPage="true" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%! private String htmlEscape(Object value) { if (value == null) { @@ -67,81 +68,42 @@ align-items: center; justify-content: center; } - .error-panel { - width: min(100%, 38rem); - padding: 2rem; - box-sizing: border-box; - border: 1px solid var(--border); - border-radius: 12px; - background: var(--card-bg); - box-shadow: 0 2px 8px var(--card-shadow); + /* empty-state */ + .empty-state { text-align: center; + padding: 48px 24px; + max-width: 480px; + margin: 0 auto; } - .error-panel__media { - width: 8rem; - height: 8rem; - margin: 0 auto 1.5rem; - border-radius: 12px; - display: flex; - align-items: center; - justify-content: center; - background: linear-gradient(160deg, var(--card-media-1) 0%, var(--card-media-2) 45%, var(--card-media-3) 100%); - } - .error-panel__logo { - width: 5rem; - height: auto; - object-fit: contain; - opacity: 0.9; - filter: drop-shadow(0 2px 8px rgba(0, 0, 0, 0.12)); - } - html[data-theme="dark"] .error-panel__logo { - opacity: 0.94; - filter: drop-shadow(0 2px 10px rgba(0, 0, 0, 0.45)); - } - .error-panel__eyebrow { - margin: 0 0 0.5rem; - font-size: 0.8125rem; + .empty-state svg { display: block; margin: 0 auto; } + .empty-state .code { + display: block; + font-size: 12px; font-weight: 700; + letter-spacing: .1em; color: var(--accent); - letter-spacing: 0.02em; + margin-top: 16px; } - .error-panel__title { - margin: 0; - font-size: clamp(1.75rem, 4vw, 2.5rem); - line-height: 1.2; - letter-spacing: 0; + .empty-state h3 { + font-size: 1.35rem; + font-weight: 800; color: var(--text); + margin: 8px 0 0; } - .error-panel__description { - max-width: 28rem; - margin: 1rem auto 0; + .empty-state p { + color: var(--text-muted); font-size: 0.9375rem; line-height: 1.65; - color: var(--text-muted); + margin: 12px 0 0; } - .error-panel__meta { - margin: 1rem auto 0; - padding: 0.75rem 1rem; - border: 1px solid var(--border); - border-radius: 8px; - color: var(--text-muted); - background: rgba(0, 0, 0, 0.025); - font-size: 0.8125rem; - line-height: 1.5; - text-align: left; - word-break: break-word; - } - html[data-theme="dark"] .error-panel__meta { - background: rgba(255, 255, 255, 0.04); - } - .error-panel__actions { + .empty-actions { display: flex; flex-wrap: wrap; justify-content: center; - gap: 0.625rem; - margin-top: 1.5rem; + gap: 10px; + margin-top: 24px; } - .error-panel__button { + .btn { display: inline-flex; align-items: center; justify-content: center; @@ -157,29 +119,42 @@ cursor: pointer; -webkit-tap-highlight-color: transparent; } - .error-panel__button--primary { + .btn:hover { + border-color: rgba(232, 165, 75, 0.45); + box-shadow: 0 4px 12px var(--card-shadow); + } + .btn:active { transform: scale(0.98); } + .btn-primary { border-color: transparent; color: var(--button-text); background: var(--accent); } - .error-panel__button:hover { - border-color: rgba(232, 165, 75, 0.45); - box-shadow: 0 4px 12px var(--card-shadow); + .btn-ghost { + border-color: var(--border); + background: transparent; } - .error-panel__button:active { - transform: scale(0.98); + /* error meta detail */ + .error-meta { + margin: 1rem auto 0; + padding: 0.75rem 1rem; + border: 1px solid var(--border); + border-radius: 8px; + color: var(--text-muted); + background: rgba(0, 0, 0, 0.025); + font-size: 0.8125rem; + line-height: 1.5; + text-align: left; + word-break: break-word; + max-width: 400px; + margin-left: auto; + margin-right: auto; + } + html[data-theme="dark"] .error-meta { + background: rgba(255, 255, 255, 0.04); } @media (max-width: 480px) { - .page-main { - align-items: flex-start; - padding-top: 1.5rem; - } - .error-panel { - padding: 1.5rem 1rem; - } - .error-panel__button { - width: 100%; - } + .page-main { align-items: flex-start; padding-top: 1.5rem; } + .btn { width: 100%; } } @@ -193,25 +168,53 @@ if (message == null || String.valueOf(message).isBlank()) { message = exception != null ? exception.getMessage() : null; } + int code = (statusCode != null) ? (Integer) statusCode : 0; %>
-
-
+