이용약관 디자인 적용
This commit is contained in:
@@ -58,6 +58,11 @@
|
||||
height: 112px;
|
||||
transition: all 0.3s ease;
|
||||
border-bottom: 1px solid #dddddd;
|
||||
|
||||
// Index page header with light blue background
|
||||
&.index-header {
|
||||
background-color: #E5F8FF;
|
||||
}
|
||||
}
|
||||
|
||||
.header-content {
|
||||
|
||||
@@ -58,6 +58,7 @@
|
||||
@import 'pages/user-management';
|
||||
@import 'pages/commission';
|
||||
@import 'pages/terms-agreements';
|
||||
@import 'pages/api-statistics';
|
||||
|
||||
// 6. Themes
|
||||
@import 'themes/dark';
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// -----------------------------------------------------------------------------
|
||||
// Terms and Agreements Page - Modern Design
|
||||
// Terms and Agreements Page - Modern Design (Figma: 3003-1988)
|
||||
// 이용약관 및 개인정보처리방침 페이지
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
@@ -17,27 +17,31 @@
|
||||
.terms-container {
|
||||
max-width: $container-max-width;
|
||||
margin: 0 auto;
|
||||
position: relative;
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
// Page Header
|
||||
// Page Header - Title Bar (Figma: 타이틀백바)
|
||||
.terms-header {
|
||||
margin-bottom: $spacing-3xl;
|
||||
background: #f6f9fb;
|
||||
border-radius: 12px;
|
||||
padding: 20px 40px;
|
||||
margin-bottom: $spacing-xl;
|
||||
|
||||
@media (max-width: $breakpoint-sm) {
|
||||
margin-bottom: $spacing-2xl;
|
||||
padding: $spacing-md $spacing-lg;
|
||||
margin-bottom: $spacing-lg;
|
||||
}
|
||||
|
||||
.page-title {
|
||||
font-size: $font-size-3xl;
|
||||
font-size: 28px;
|
||||
font-weight: $font-weight-bold;
|
||||
color: $text-dark;
|
||||
margin-bottom: $spacing-md;
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
background-clip: text;
|
||||
margin: 0;
|
||||
line-height: 1;
|
||||
|
||||
@media (max-width: $breakpoint-sm) {
|
||||
font-size: $font-size-2xl;
|
||||
font-size: $font-size-xl;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,6 +49,7 @@
|
||||
font-size: $font-size-base;
|
||||
color: $text-gray;
|
||||
line-height: $line-height-normal;
|
||||
margin-top: $spacing-sm;
|
||||
|
||||
@media (max-width: $breakpoint-sm) {
|
||||
font-size: $font-size-sm;
|
||||
@@ -60,16 +65,16 @@
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
// Tab Navigation
|
||||
// Tab Navigation (Figma: 질문제목box)
|
||||
.terms-tabs {
|
||||
display: flex;
|
||||
gap: 0;
|
||||
background: $gray-bg;
|
||||
padding: $spacing-xs;
|
||||
border-bottom: 1px solid $border-gray;
|
||||
background: transparent;
|
||||
padding: 0;
|
||||
border-bottom: none;
|
||||
|
||||
@media (max-width: $breakpoint-sm) {
|
||||
padding: $spacing-xs;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.tab-link {
|
||||
@@ -78,184 +83,118 @@
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: $spacing-sm;
|
||||
padding: $spacing-md $spacing-lg;
|
||||
font-size: $font-size-base;
|
||||
font-weight: $font-weight-semibold;
|
||||
color: $text-gray;
|
||||
padding: 18px $spacing-lg;
|
||||
font-size: 22px;
|
||||
font-weight: $font-weight-bold;
|
||||
color: #8c959f;
|
||||
text-decoration: none;
|
||||
background: transparent;
|
||||
border-radius: $border-radius-md;
|
||||
background: #eceff4;
|
||||
transition: $transition-base;
|
||||
text-align: center;
|
||||
position: relative;
|
||||
|
||||
border-radius: 12px 12px 0 0;
|
||||
|
||||
@media (max-width: $breakpoint-sm) {
|
||||
padding: $spacing-sm $spacing-md;
|
||||
font-size: $font-size-sm;
|
||||
padding: $spacing-md $spacing-md;
|
||||
font-size: $font-size-base;
|
||||
gap: $spacing-xs;
|
||||
}
|
||||
|
||||
i {
|
||||
font-size: $font-size-md;
|
||||
transition: $transition-base;
|
||||
|
||||
@media (max-width: $breakpoint-sm) {
|
||||
font-size: $font-size-base;
|
||||
}
|
||||
display: none; // 아이콘 숨김 (Figma 디자인에 없음)
|
||||
}
|
||||
|
||||
&:hover {
|
||||
color: $primary-blue;
|
||||
background: rgba($primary-blue, 0.05);
|
||||
|
||||
i {
|
||||
transform: scale(1.1);
|
||||
}
|
||||
background: #e4e8ed;
|
||||
}
|
||||
|
||||
&.active {
|
||||
color: $white;
|
||||
background: $primary-blue;
|
||||
box-shadow: $shadow-sm;
|
||||
background: #3ba4ed;
|
||||
font-weight: $font-weight-bold;
|
||||
|
||||
i {
|
||||
color: $white;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Version Selector
|
||||
// Version Selector (Figma: 검색창 986-2208)
|
||||
.terms-selector {
|
||||
padding: $spacing-lg $spacing-2xl;
|
||||
background: $light-bg;
|
||||
border-bottom: 1px solid $border-gray;
|
||||
padding: $spacing-lg;
|
||||
background: #F6F9FB;
|
||||
border-bottom: none;
|
||||
|
||||
@media (max-width: $breakpoint-sm) {
|
||||
padding: $spacing-md $spacing-lg;
|
||||
padding: $spacing-md 0;
|
||||
}
|
||||
|
||||
form {
|
||||
max-width: 400px;
|
||||
max-width: 340px;
|
||||
}
|
||||
|
||||
.custom-select {
|
||||
position: relative;
|
||||
// Native select styling (Figma: 검색입력창)
|
||||
.terms-select {
|
||||
width: 340px;
|
||||
height: 44px;
|
||||
padding: 9px 22px 9px 20px;
|
||||
background: $white;
|
||||
border: 1px solid #dadada;
|
||||
border-radius: 12px;
|
||||
font-family: 'Noto Sans KR', sans-serif;
|
||||
font-size: 14px;
|
||||
font-weight: 400;
|
||||
color: #212529;
|
||||
cursor: pointer;
|
||||
transition: $transition-base;
|
||||
appearance: none;
|
||||
-webkit-appearance: none;
|
||||
-moz-appearance: none;
|
||||
// 드롭다운 화살표 아이콘 (색상: #515961)
|
||||
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='5' viewBox='0 0 10 5'%3E%3Cpath fill='%23515961' d='M5 5L0 0h10z'/%3E%3C/svg%3E");
|
||||
background-repeat: no-repeat;
|
||||
background-position: right 16px center;
|
||||
background-size: 10px 5px;
|
||||
|
||||
.select-selected {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: $spacing-sm;
|
||||
padding: $spacing-md $spacing-lg;
|
||||
background: $white;
|
||||
border: 2px solid $border-gray;
|
||||
border-radius: $border-radius-md;
|
||||
font-size: $font-size-sm;
|
||||
font-weight: $font-weight-medium;
|
||||
color: $text-dark;
|
||||
transition: $transition-base;
|
||||
cursor: pointer;
|
||||
|
||||
@media (max-width: $breakpoint-sm) {
|
||||
padding: $spacing-sm $spacing-md;
|
||||
font-size: $font-size-xs;
|
||||
}
|
||||
|
||||
i {
|
||||
&:first-child {
|
||||
color: $primary-blue;
|
||||
}
|
||||
|
||||
&:last-child {
|
||||
margin-left: auto;
|
||||
font-size: $font-size-xs;
|
||||
color: $text-gray;
|
||||
transition: $transition-base;
|
||||
}
|
||||
}
|
||||
|
||||
span {
|
||||
font-weight: $font-weight-semibold;
|
||||
color: $primary-blue;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
border-color: $primary-blue;
|
||||
box-shadow: 0 0 0 3px rgba($primary-blue, 0.1);
|
||||
}
|
||||
|
||||
&.select-arrow-active {
|
||||
border-color: $primary-blue;
|
||||
|
||||
i:last-child {
|
||||
transform: rotate(180deg);
|
||||
}
|
||||
}
|
||||
@media (max-width: $breakpoint-sm) {
|
||||
width: 100%;
|
||||
height: 40px;
|
||||
padding: $spacing-sm 36px $spacing-sm $spacing-md;
|
||||
font-size: $font-size-xs;
|
||||
}
|
||||
|
||||
.select-items {
|
||||
position: absolute;
|
||||
top: calc(100% + $spacing-xs);
|
||||
left: 0;
|
||||
right: 0;
|
||||
background: $white;
|
||||
border: 2px solid $primary-blue;
|
||||
border-radius: $border-radius-md;
|
||||
box-shadow: $shadow-lg;
|
||||
max-height: 240px;
|
||||
overflow-y: auto;
|
||||
z-index: $z-index-dropdown;
|
||||
list-style: none;
|
||||
padding: $spacing-xs;
|
||||
margin: 0;
|
||||
&:hover {
|
||||
border-color: $primary-blue;
|
||||
}
|
||||
|
||||
&.select-hide {
|
||||
display: none;
|
||||
}
|
||||
&:focus {
|
||||
outline: none;
|
||||
border-color: $primary-blue;
|
||||
}
|
||||
|
||||
li {
|
||||
padding: $spacing-sm $spacing-md;
|
||||
font-size: $font-size-sm;
|
||||
color: $text-dark;
|
||||
border-radius: $border-radius-sm;
|
||||
cursor: pointer;
|
||||
transition: $transition-base;
|
||||
|
||||
@media (max-width: $breakpoint-sm) {
|
||||
padding: $spacing-xs $spacing-sm;
|
||||
font-size: $font-size-xs;
|
||||
}
|
||||
|
||||
&:hover {
|
||||
background: $light-bg;
|
||||
color: $primary-blue;
|
||||
}
|
||||
|
||||
&.selected {
|
||||
background: $primary-blue;
|
||||
color: $white;
|
||||
font-weight: $font-weight-semibold;
|
||||
}
|
||||
}
|
||||
option {
|
||||
padding: $spacing-sm $spacing-md;
|
||||
font-size: 14px;
|
||||
color: #212529;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Terms Content
|
||||
// Terms Content (Figma: 컨텐츠 영역)
|
||||
.terms-content {
|
||||
padding: $spacing-3xl $spacing-2xl;
|
||||
padding: 0 $spacing-xl;
|
||||
min-height: 400px;
|
||||
background-color: #F6F9FB;
|
||||
|
||||
@media (max-width: $breakpoint-sm) {
|
||||
padding: $spacing-2xl $spacing-lg;
|
||||
padding: $spacing-lg 0;
|
||||
min-height: 300px;
|
||||
}
|
||||
|
||||
.content-body {
|
||||
font-size: $font-size-base;
|
||||
font-size: 16px;
|
||||
color: $text-dark;
|
||||
line-height: $line-height-loose;
|
||||
white-space: pre-wrap;
|
||||
line-height: 1.8;
|
||||
word-wrap: break-word;
|
||||
|
||||
@media (max-width: $breakpoint-sm) {
|
||||
@@ -271,39 +210,44 @@
|
||||
}
|
||||
}
|
||||
|
||||
h1, h2, h3, h4, h5, h6 {
|
||||
// 장 제목 (제1장 총칙)
|
||||
h1, .chapter-title {
|
||||
font-size: 20px;
|
||||
font-weight: $font-weight-bold;
|
||||
color: $text-dark;
|
||||
margin-top: $spacing-xl;
|
||||
margin-bottom: $spacing-md;
|
||||
font-weight: $font-weight-semibold;
|
||||
color: $text-dark;
|
||||
line-height: $line-height-tight;
|
||||
line-height: 1.4;
|
||||
|
||||
&:first-child {
|
||||
margin-top: 0;
|
||||
}
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: $font-size-2xl;
|
||||
font-weight: $font-weight-bold;
|
||||
padding-bottom: $spacing-md;
|
||||
border-bottom: 2px solid $border-gray;
|
||||
|
||||
@media (max-width: $breakpoint-sm) {
|
||||
font-size: $font-size-xl;
|
||||
font-size: 18px;
|
||||
}
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: $font-size-xl;
|
||||
// 조 제목 (제1조 (목적))
|
||||
h2, .article-title {
|
||||
font-size: 18px;
|
||||
font-weight: $font-weight-bold;
|
||||
color: $text-dark;
|
||||
margin-top: $spacing-lg;
|
||||
margin-bottom: $spacing-sm;
|
||||
line-height: 1.4;
|
||||
|
||||
@media (max-width: $breakpoint-sm) {
|
||||
font-size: $font-size-lg;
|
||||
font-size: 16px;
|
||||
}
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: $font-size-lg;
|
||||
font-weight: $font-weight-semibold;
|
||||
color: $text-dark;
|
||||
margin-top: $spacing-md;
|
||||
margin-bottom: $spacing-sm;
|
||||
|
||||
@media (max-width: $breakpoint-sm) {
|
||||
font-size: $font-size-base;
|
||||
@@ -332,24 +276,18 @@
|
||||
|
||||
ul, ol {
|
||||
margin: $spacing-md 0;
|
||||
padding-left: $spacing-2xl;
|
||||
padding-left: 0;
|
||||
list-style: none;
|
||||
|
||||
@media (max-width: $breakpoint-sm) {
|
||||
padding-left: $spacing-lg;
|
||||
padding-left: 0;
|
||||
}
|
||||
}
|
||||
|
||||
ul {
|
||||
list-style-type: disc;
|
||||
}
|
||||
|
||||
ol {
|
||||
list-style-type: decimal;
|
||||
}
|
||||
|
||||
li {
|
||||
margin-bottom: $spacing-sm;
|
||||
line-height: $line-height-normal;
|
||||
margin-bottom: $spacing-xs;
|
||||
line-height: 1.8;
|
||||
padding-left: 0;
|
||||
|
||||
&:last-child {
|
||||
margin-bottom: 0;
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
<html xmlns:th="http://www.thymeleaf.org"
|
||||
xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
|
||||
<body>
|
||||
<th:block th:fragment="headerFragment">
|
||||
<th:block th:fragment="headerFragment(headerClass)">
|
||||
<!-- Global Header Container -->
|
||||
<header class="global-header">
|
||||
<header class="global-header" th:classappend="${headerClass}">
|
||||
<div class="container">
|
||||
<div class="header-content">
|
||||
|
||||
@@ -63,6 +63,7 @@
|
||||
</li>
|
||||
<li sec:authorize="hasRole('ROLE_APP')">
|
||||
<a th:href="@{/myapikey}"><i class="fas fa-key"></i>인증 키 관리</a>
|
||||
<a th:href="@{/statistics/api}"><i class="fas fa-chart-bar"></i>이용 통계</a>
|
||||
<a th:href="@{/commission/manage}"><i class="fas fa-money-bill"></i>과금 관리</a>
|
||||
</li>
|
||||
<li><a th:href="@{/mypage}"><i class="fas fa-user-circle"></i>내 정보 관리</a></li>
|
||||
@@ -149,6 +150,11 @@
|
||||
<i class="fas fa-key"></i> 인증 키 관리
|
||||
</a>
|
||||
</li>
|
||||
<li sec:authorize="hasRole('ROLE_APP')">
|
||||
<a th:href="@{/statistics/api}" class="drawer-link">
|
||||
<i class="fas fa-chart-bar"></i> 이용 통계
|
||||
</a>
|
||||
</li>
|
||||
<li sec:authorize="isAuthenticated()">
|
||||
<a th:href="@{/mypage}" class="drawer-link">
|
||||
<i class="fas fa-user-circle"></i> 내 정보 관리
|
||||
|
||||
@@ -1,278 +0,0 @@
|
||||
<!doctype html>
|
||||
<html xmlns:th="http://www.thymeleaf.org"
|
||||
xmlns:sec="http://www.thymeleaf.org/extras/spring-security">
|
||||
<body>
|
||||
<th:block th:fragment="headerFragment">
|
||||
<!-- Global Header Container -->
|
||||
<header class="global-header" style="background-color: #E5F8FF;">
|
||||
<div class="container">
|
||||
<div class="header-content">
|
||||
|
||||
<!-- Desktop Header Layout -->
|
||||
<div class="desktop-header">
|
||||
<div class="header-left">
|
||||
<div class="logo-wrapper">
|
||||
<a th:href="@{/}" class="logo-link">
|
||||
<img src="/img/logo/logo.png" alt="광주은행" class="logo" width="114" height="22">
|
||||
</a>
|
||||
<a th:href="@{/}" class="logo-text">API Portal</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<nav class="header-center">
|
||||
<ul class="nav-menu">
|
||||
<li><a href="#docs" class="nav-link">서비스 소개</a></li>
|
||||
<li><a href="/apis" class="nav-link">오픈 API</a></li>
|
||||
<li>
|
||||
<a href="#playground" class="nav-link">고객지원</a>
|
||||
<ul class="sub-menu">
|
||||
<li><a th:href="@{/portalnotice}">공지사항</a></li>
|
||||
<li><a th:href="@{/faq_list}">FAQ</a></li>
|
||||
<li><a th:href="@{/inquiry}">Q&A</a></li>
|
||||
<li><a th:href="@{/partnership}">사업 제휴 문의</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<div class="header-right">
|
||||
|
||||
<!-- Login State (Anonymous) -->
|
||||
<div class="auth-group" sec:authorize="isAnonymous()">
|
||||
|
||||
<a th:href="@{/login}" class="login-btn login-btn-box">
|
||||
<img th:src="@{/img/user_icon.svg}" alt="User" class="user-icon">로그인</a>
|
||||
</div>
|
||||
|
||||
<!-- Logout State (Authenticated) -->
|
||||
<div class="auth-group authenticated" sec:authorize="isAuthenticated()">
|
||||
<div class="header-user-info">
|
||||
<div class="user-identity">
|
||||
<img th:src="@{/img/user_icon.svg}" alt="User" class="user-icon">
|
||||
<span class="user-name">[[${#authentication.principal.userName}]]님</span>
|
||||
</div>
|
||||
<span class="divider">•</span>
|
||||
<a th:href="@{/actionLogout.do}" class="header-link">로그아웃</a>
|
||||
<span class="divider">•</span>
|
||||
<div class="mypage-dropdown">
|
||||
<button class="header-link mypage-toggle" type="button">마이페이지</button>
|
||||
<div class="mypage-dropdown-menu">
|
||||
<ul class="mypage-menu-list">
|
||||
<li sec:authorize="hasRole('ROLE_USER_MANAGER')">
|
||||
<a th:href="@{/users}"><i class="fas fa-users"></i>이용자 관리</a>
|
||||
</li>
|
||||
<li sec:authorize="hasRole('ROLE_APP')">
|
||||
<a th:href="@{/myapikey}"><i class="fas fa-key"></i>인증 키 관리</a>
|
||||
<a th:href="@{/commission/manage}"><i class="fas fa-money-bill"></i>과금 관리</a>
|
||||
</li>
|
||||
<li><a th:href="@{/mypage}"><i class="fas fa-user-circle"></i>내 정보 관리</a></li>
|
||||
<li><a th:href="@{/change_password}"><i class="fas fa-lock"></i>비밀번호 변경</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Mobile Header Layout -->
|
||||
<div class="mobile-header">
|
||||
<div class="mobile-left">
|
||||
<a th:href="@{/}" class="mobile-logo-link">
|
||||
<img src="/img/logo/logo.png" alt="광주은행" class="mobile-logo">
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="mobile-center">
|
||||
<h1 class="mobile-title">개발자 포털</h1>
|
||||
</div>
|
||||
|
||||
<div class="mobile-right">
|
||||
<button class="mobile-menu-btn" id="mobileMenuToggle">
|
||||
<span class="hamburger-line"></span>
|
||||
<span class="hamburger-line"></span>
|
||||
<span class="hamburger-line"></span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<!-- Mobile Drawer/Modal -->
|
||||
<div class="mobile-drawer" id="mobileDrawer">
|
||||
<div class="drawer-overlay" id="drawerOverlay"></div>
|
||||
<div class="drawer-content">
|
||||
<div class="drawer-header">
|
||||
<div class="drawer-logo">
|
||||
<a th:href="@{/}" class="drawer-logo-link">
|
||||
<img src="/img/logo/logo.png" alt="광주은행" class="logo">
|
||||
</a>
|
||||
<a th:href="@{/}" class="logo-text">개발자 포털</a>
|
||||
</div>
|
||||
<button class="drawer-close" id="drawerClose">
|
||||
<i class="fas fa-times"></i>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<!-- Authenticated User Info (Mobile) -->
|
||||
<div class="drawer-user-info" sec:authorize="isAuthenticated()">
|
||||
<div class="drawer-profile">
|
||||
<div class="profile-avatar">
|
||||
<i class="fas fa-user-circle"></i>
|
||||
</div>
|
||||
<div class="profile-info">
|
||||
<p class="profile-name">[[${#authentication.principal.userName}]]님</p>
|
||||
<span class="profile-greeting">즐거운 하루 되세요!</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<nav class="drawer-nav">
|
||||
<ul class="drawer-menu">
|
||||
<li><a href="#docs" class="drawer-link">서비스 소개</a></li>
|
||||
<li><a href="/apis" class="drawer-link">오픈 API</a></li>
|
||||
<li><a href="#playground" class="drawer-link">고객지원</a></li>
|
||||
|
||||
<!-- Authenticated Menu Items -->
|
||||
<li sec:authorize="isAuthenticated()">
|
||||
<a href="#community" class="drawer-link">커뮤니티</a>
|
||||
</li>
|
||||
<li sec:authorize="hasRole('ROLE_USER_MANAGER')">
|
||||
<a th:href="@{/users}" class="drawer-link">
|
||||
<i class="fas fa-users"></i> 이용자 관리
|
||||
</a>
|
||||
</li>
|
||||
<li sec:authorize="hasRole('ROLE_APP')">
|
||||
<a th:href="@{/myapikey}" class="drawer-link">
|
||||
<i class="fas fa-key"></i> 인증 키 관리
|
||||
</a>
|
||||
</li>
|
||||
<li sec:authorize="isAuthenticated()">
|
||||
<a th:href="@{/mypage}" class="drawer-link">
|
||||
<i class="fas fa-user-circle"></i> 내 정보 관리
|
||||
</a>
|
||||
</li>
|
||||
<li sec:authorize="isAuthenticated()">
|
||||
<a th:href="@{/change_password}" class="drawer-link">
|
||||
<i class="fas fa-lock"></i> 비밀번호 변경
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</nav>
|
||||
|
||||
<div class="drawer-actions">
|
||||
<!-- Anonymous User Actions -->
|
||||
<div sec:authorize="isAnonymous()">
|
||||
<a th:href="@{/login}" class="drawer-login-btn">로그인</a>
|
||||
</div>
|
||||
|
||||
<!-- Authenticated User Actions -->
|
||||
<div sec:authorize="isAuthenticated()">
|
||||
<a th:href="@{/actionLogout.do}" class="drawer-logout-btn">
|
||||
<i class="fas fa-sign-out-alt"></i>
|
||||
로그아웃
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</th:block>
|
||||
|
||||
<!-- Mobile Menu & Dropdown JavaScript -->
|
||||
<th:block th:fragment="headerScript">
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
// Mobile Drawer
|
||||
const menuToggle = document.getElementById('mobileMenuToggle');
|
||||
const drawer = document.getElementById('mobileDrawer');
|
||||
const drawerClose = document.getElementById('drawerClose');
|
||||
const drawerOverlay = document.getElementById('drawerOverlay');
|
||||
|
||||
function openDrawer() {
|
||||
drawer.classList.add('active');
|
||||
document.body.style.overflow = 'hidden';
|
||||
}
|
||||
|
||||
function closeDrawer() {
|
||||
drawer.classList.remove('active');
|
||||
document.body.style.overflow = '';
|
||||
}
|
||||
|
||||
menuToggle?.addEventListener('click', openDrawer);
|
||||
drawerClose?.addEventListener('click', closeDrawer);
|
||||
drawerOverlay?.addEventListener('click', closeDrawer);
|
||||
|
||||
// Close drawer when clicking on nav links
|
||||
document.querySelectorAll('.drawer-link').forEach(link => {
|
||||
link.addEventListener('click', closeDrawer);
|
||||
});
|
||||
|
||||
// Mypage Dropdown
|
||||
const mypageToggle = document.querySelector('.mypage-toggle');
|
||||
const mypageDropdown = document.querySelector('.mypage-dropdown');
|
||||
|
||||
if (mypageToggle && mypageDropdown) {
|
||||
mypageToggle.addEventListener('click', function(e) {
|
||||
e.stopPropagation();
|
||||
mypageDropdown.classList.toggle('active');
|
||||
});
|
||||
|
||||
// Close dropdown when clicking outside
|
||||
document.addEventListener('click', function(e) {
|
||||
if (!mypageDropdown.contains(e.target)) {
|
||||
mypageDropdown.classList.remove('active');
|
||||
}
|
||||
});
|
||||
|
||||
// Prevent dropdown from closing when clicking inside
|
||||
mypageDropdown.addEventListener('click', function(e) {
|
||||
e.stopPropagation();
|
||||
});
|
||||
}
|
||||
|
||||
// Desktop Navigation Submenu Toggle (Click-based for mobile-like behavior on desktop)
|
||||
const navItems = document.querySelectorAll('.header-center .nav-menu > li');
|
||||
|
||||
navItems.forEach(item => {
|
||||
const link = item.querySelector(':scope > a');
|
||||
const submenu = item.querySelector('.sub-menu');
|
||||
|
||||
if (submenu) {
|
||||
// Add click handler for toggle
|
||||
link.addEventListener('click', function(e) {
|
||||
e.preventDefault();
|
||||
e.stopPropagation();
|
||||
|
||||
// Close other submenus
|
||||
navItems.forEach(otherItem => {
|
||||
if (otherItem !== item && otherItem.classList.contains('submenu-open')) {
|
||||
otherItem.classList.remove('submenu-open');
|
||||
}
|
||||
});
|
||||
|
||||
// Toggle current submenu
|
||||
item.classList.toggle('submenu-open');
|
||||
});
|
||||
|
||||
// Close submenu when clicking outside
|
||||
document.addEventListener('click', function(e) {
|
||||
if (!item.contains(e.target)) {
|
||||
item.classList.remove('submenu-open');
|
||||
}
|
||||
});
|
||||
|
||||
// Prevent submenu from closing when clicking inside
|
||||
submenu.addEventListener('click', function(e) {
|
||||
e.stopPropagation();
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</th:block>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -5,102 +5,52 @@
|
||||
<section layout:fragment="title">
|
||||
<div class="page-title-banner">
|
||||
<img th:src="@{/img/img_title_bg.png}" class="title-image">
|
||||
<h1 th:text="${agreementTitle}">비밀번호 변경</h1>
|
||||
|
||||
<h1 th:text="${agreementTitle}">이용 약관</h1>
|
||||
</div>
|
||||
</section>
|
||||
<section layout:fragment="contentFragment">
|
||||
<div class="org-info-notice">
|
||||
<ul>
|
||||
<li>광주은행 서비스 이용약관 및 개인정보처리방침을 확인하실 수 있습니다.</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="terms-container">
|
||||
<!-- Tab Navigation -->
|
||||
<!-- Title Bar (Figma: 타이틀백바) -->
|
||||
<div class="common-title-bar">
|
||||
<h2 class="common-title" th:text="${isTermsOfUse ? '이용약관' : '개인정보처리방침'}">이용약관</h2>
|
||||
</div>
|
||||
|
||||
<!-- Tab Navigation (Figma: 질문제목box) -->
|
||||
<div class="terms-tabs">
|
||||
<a th:href="@{/agreements/terms(tab='terms')}"
|
||||
class="tab-link"
|
||||
th:classappend="${isTermsOfUse ? 'active' : ''}">
|
||||
<i class="fas fa-file-alt"></i>
|
||||
이용약관
|
||||
</a>
|
||||
<a th:href="@{/agreements/terms(tab='privacy')}"
|
||||
class="tab-link"
|
||||
th:classappend="${isPrivacyPolicy ? 'active' : ''}">
|
||||
<i class="fas fa-shield-alt"></i>
|
||||
개인정보처리방침
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<!-- Version Selector -->
|
||||
<!-- Version Selector (Figma: 검색창) -->
|
||||
<div class="terms-selector">
|
||||
<form id="agreementForm" th:action="@{/agreements/terms}" method="get">
|
||||
<input type="hidden" name="tab" th:value="${currentTab}">
|
||||
<div class="custom-select" id="agreement_select">
|
||||
<div class="select-selected">
|
||||
<i class="fas fa-calendar-alt"></i>
|
||||
시행일자 : <span th:text="${#temporals.format(selectedAgreement.publishedOn, 'yyyy.MM.dd')}"></span>
|
||||
<i class="fas fa-chevron-down"></i>
|
||||
</div>
|
||||
<ul class="select-items select-hide">
|
||||
<li th:each="agreement : ${agreementsList}"
|
||||
th:data-id="${#temporals.format(agreement.publishedOn, 'yyyy-MM-dd')}"
|
||||
th:text="'시행일자 : ' + ${#temporals.format(agreement.publishedOn, 'yyyy.MM.dd')}"
|
||||
th:class="${#temporals.format(agreement.publishedOn, 'yyyy-MM-dd') == selectedDate ? 'selected' : ''}">
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<input type="hidden" name="publishedOn" id="publishedOnInput">
|
||||
<select name="publishedOn" id="publishedOnSelect" class="terms-select" onchange="this.form.submit()">
|
||||
<option th:each="agreement : ${agreementsList}"
|
||||
th:value="${#temporals.format(agreement.publishedOn, 'yyyy-MM-dd')}"
|
||||
th:text="'시행일자 : ' + ${#temporals.format(agreement.publishedOn, 'yyyy. MM. dd')}"
|
||||
th:selected="${#temporals.format(agreement.publishedOn, 'yyyy-MM-dd') == selectedDate}">
|
||||
</option>
|
||||
</select>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<!-- Terms Content -->
|
||||
<!-- Terms Content (Figma: 컨텐츠 영역) -->
|
||||
<div class="terms-content">
|
||||
<div class="content-body" th:utext="${selectedAgreement.contents}"></div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
<script layout:fragment="contentScript">
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
const customSelect = document.getElementById('agreement_select');
|
||||
const selectSelected = customSelect.querySelector('.select-selected');
|
||||
const selectItems = customSelect.querySelector('.select-items');
|
||||
const form = document.getElementById('agreementForm');
|
||||
const publishedOnInput = document.getElementById('publishedOnInput');
|
||||
|
||||
// Toggle dropdown on click
|
||||
selectSelected.addEventListener('click', function(e) {
|
||||
e.stopPropagation();
|
||||
selectItems.classList.toggle('select-hide');
|
||||
selectSelected.classList.toggle('select-arrow-active');
|
||||
});
|
||||
|
||||
// Handle option selection
|
||||
const options = selectItems.querySelectorAll('li');
|
||||
options.forEach(option => {
|
||||
option.addEventListener('click', function() {
|
||||
const selectedDate = this.getAttribute('data-id');
|
||||
publishedOnInput.value = selectedDate;
|
||||
|
||||
// Update selected state
|
||||
options.forEach(opt => opt.classList.remove('selected'));
|
||||
this.classList.add('selected');
|
||||
|
||||
// Close dropdown
|
||||
selectItems.classList.add('select-hide');
|
||||
selectSelected.classList.remove('select-arrow-active');
|
||||
|
||||
// Submit form
|
||||
form.submit();
|
||||
});
|
||||
});
|
||||
|
||||
// Close dropdown when clicking outside
|
||||
document.addEventListener('click', function() {
|
||||
selectItems.classList.add('select-hide');
|
||||
selectSelected.classList.remove('select-arrow-active');
|
||||
});
|
||||
});
|
||||
// Native select is used, no custom JavaScript needed
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -10,8 +10,8 @@
|
||||
<body>
|
||||
|
||||
<!-- header -->
|
||||
<th:block th:replace="fragment/kjbank/header_container :: headerFragment"></th:block>
|
||||
<th:block th:replace="fragment/kjbank/header_container :: headerScript"></th:block>
|
||||
<th:block th:replace="~{fragment/kjbank/header_container :: headerFragment('')}"></th:block>
|
||||
<th:block th:replace="~{fragment/kjbank/header_container :: headerScript}"></th:block>
|
||||
|
||||
<!-- csrf -->
|
||||
<div>
|
||||
|
||||
@@ -10,8 +10,8 @@
|
||||
<body>
|
||||
|
||||
<!-- header -->
|
||||
<th:block th:replace="fragment/kjbank/header_container :: headerFragment"></th:block>
|
||||
<th:block th:replace="fragment/kjbank/header_container :: headerScript"></th:block>
|
||||
<th:block th:replace="~{fragment/kjbank/header_container :: headerFragment('')}"></th:block>
|
||||
<th:block th:replace="~{fragment/kjbank/header_container :: headerScript}"></th:block>
|
||||
|
||||
<div>
|
||||
<section layout:fragment="contentFragment">
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<th:block th:replace="fragment/kjbank/header_container :: headerFragment"></th:block>
|
||||
<th:block th:replace="fragment/kjbank/header_container :: headerScript"></th:block>
|
||||
<th:block th:replace="~{fragment/kjbank/header_container :: headerFragment('')}"></th:block>
|
||||
<th:block th:replace="~{fragment/kjbank/header_container :: headerScript}"></th:block>
|
||||
<div class="loading-overlay" style="display: none;">
|
||||
<div class="loading-spinner"></div>
|
||||
</div>
|
||||
|
||||
@@ -9,8 +9,8 @@
|
||||
|
||||
<body>
|
||||
<!-- header -->
|
||||
<th:block th:replace="fragment/kjbank/index_header_container :: headerFragment"></th:block>
|
||||
<th:block th:replace="fragment/kjbank/header_container :: headerScript"></th:block>
|
||||
<th:block th:replace="~{fragment/kjbank/header_container :: headerFragment('index-header')}"></th:block>
|
||||
<th:block th:replace="~{fragment/kjbank/header_container :: headerScript}"></th:block>
|
||||
|
||||
<th:block layout:fragment="contentFragment">
|
||||
</th:block>
|
||||
|
||||
@@ -7,8 +7,8 @@
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<th:block th:replace="fragment/kjbank/header_container :: headerFragment"></th:block>
|
||||
<th:block th:replace="fragment/kjbank/header_container :: headerScript"></th:block>
|
||||
<th:block th:replace="~{fragment/kjbank/header_container :: headerFragment('')}"></th:block>
|
||||
<th:block th:replace="~{fragment/kjbank/header_container :: headerScript}"></th:block>
|
||||
<div class="loading-overlay" style="display: none;">
|
||||
<div class="loading-spinner"></div>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user