Public Source Viewer

비나래아카이브 개발자 포털

실제 서비스 구조를 살펴볼 수 있는 공개용 코드 뷰어입니다. 인증, 세션, 외부 연동, 토큰, 관리자 식별 등 보안상 민감한 구현은 파일 단위 또는 줄 단위로 검열됩니다.

Redacted View
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