Public Source Viewer
비나래아카이브 개발자 포털
실제 서비스 구조를 살펴볼 수 있는 공개용 코드 뷰어입니다. 인증, 세션, 외부 연동, 토큰, 관리자 식별 등 보안상 민감한 구현은 파일 단위 또는 줄 단위로 검열됩니다.
view/hinana/forbidden.ejs
공개 가능
1
<!DOCTYPE html>
2
<html lang="ko">
3
<head>
4
<meta charset="utf-8" />
5
<meta name="color-scheme" content="light dark">
6
<meta name="viewport" content="width=device-width, initial-scale=1">
7
<meta name="theme-color" content="<%= theme === 'dark' ? '#000000' : '#ffffff' %>">
8
<title><%= title %> — 비나래 아카이브</title>
9
<link rel="stylesheet" href="/vendors/bootstrap/css/bootstrap.min.css" />
10
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons/font/bootstrap-icons.css">
11
<style>
12
:root {
13
--font-family: 'Noto Sans KR', sans-serif;
14
--bg-main: #ffffff; --bg-secondary: #f7f9f9; --bg-tertiary: #eff3f4;
15
--text-primary: #0f1419; --text-secondary: #536471;
16
--accent-color: #1d9bf0; --border-color: #eff3f4;
17
}
18
body.dark-mode {
19
--bg-main: #000000; --bg-secondary: #16181c; --bg-tertiary: #202327;
20
--text-primary: #e7e9ea; --text-secondary: #71767b; --border-color: #2f3336;
21
}
22
html, body { min-height:100%; margin:0; font-family:var(--font-family); background:var(--bg-main); color:var(--text-primary); }
23
a { color:inherit; text-decoration:none; }
24
.global-header {
25
height:60px; background:var(--bg-main); border-bottom:1px solid var(--border-color);
26
display:flex; align-items:center; justify-content:space-between; padding:0 20px;
27
}
28
.header-logo { height:28px; width:auto; mix-blend-mode:multiply; }
29
body.dark-mode .header-logo { mix-blend-mode:screen; }
30
.page-shell {
31
min-height:calc(100vh - 60px); display:flex; align-items:center; justify-content:center;
32
padding:32px 20px;
33
}
34
.notice {
35
width:min(420px, 100%); text-align:center; border:1px solid var(--border-color);
36
border-radius:8px; background:var(--bg-secondary); padding:34px 24px;
37
}
38
.notice-icon { font-size:2rem; color:var(--accent-color); margin-bottom:12px; }
39
.notice h1 { font-size:1.25rem; margin-bottom:10px; }
40
.notice p { color:var(--text-secondary); margin-bottom:22px; }
41
.notice-actions { display:flex; justify-content:center; gap:8px; }
42
.action-btn {
43
border:1px solid var(--border-color); border-radius:8px; background:var(--bg-main);
44
color:var(--text-primary); padding:10px 14px;
45
}
46
.action-btn:hover { border-color:var(--accent-color); color:var(--accent-color); }
47
</style>
48
</head>
49
<body class="<%= theme === 'dark' ? 'dark-mode' : '' %>">
50
<header class="global-header">
51
<a href="/hinana/index">
52
<img src="/image/<%= theme === 'dark' ? 'archive1.png' : 'archive.png' %>" alt="Hinana Archive" class="header-logo">
53
</a>
54
</header>
55
<main class="page-shell">
56
<section class="notice">
57
<div class="notice-icon"><i class="bi bi-shield-lock"></i></div>
58
<h1><%= title %></h1>
59
<p><%= message %></p>
60
<div class="notice-actions">
61
<a href="/hinana/index" class="action-btn">홈으로</a>
62
<a href="/hinana/ai" class="action-btn">대화로 돌아가기</a>
63
</div>
64
</section>
65
</main>
66
</body>
67
</html>
68