프로토~ 6

This commit is contained in:
doyeon 2025-10-20 15:02:31 +09:00
parent 2668acd226
commit af5672847f
6 changed files with 853 additions and 8 deletions

View File

@ -256,11 +256,11 @@
}; };
window.goToEvents = function() { window.goToEvents = function() {
Toast.show('이벤트 목록으로 이동'); window.location.href = '26-이벤트목록.html';
}; };
window.goToMy = function() { window.goToMy = function() {
Toast.show('마이페이지로 이동'); window.location.href = '25-마이페이지.html';
}; };
// Cleanup on page unload // Cleanup on page unload

View File

@ -455,11 +455,11 @@
}; };
window.goToEvents = function() { window.goToEvents = function() {
Toast.show('이벤트 목록으로 이동'); window.location.href = '26-이벤트목록.html';
}; };
window.goToMy = function() { window.goToMy = function() {
Toast.show('마이페이지로 이동'); window.location.href = '25-마이페이지.html';
}; };
})(); })();
</script> </script>

View File

@ -335,11 +335,11 @@
}; };
window.goToEvents = function() { window.goToEvents = function() {
Toast.show('이벤트 목록으로 이동'); window.location.href = '26-이벤트목록.html';
}; };
window.goToMy = function() { window.goToMy = function() {
Toast.show('마이페이지로 이동'); window.location.href = '25-마이페이지.html';
}; };
})(); })();
</script> </script>

View File

@ -320,11 +320,11 @@
}; };
window.goToEvents = function() { window.goToEvents = function() {
Toast.show('이벤트 목록으로 이동'); window.location.href = '26-이벤트목록.html';
}; };
window.goToMy = function() { window.goToMy = function() {
Toast.show('마이페이지로 이동'); window.location.href = '25-마이페이지.html';
}; };
})(); })();
</script> </script>

View File

@ -0,0 +1,480 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="KT AI 기반 소상공인 이벤트 자동 생성 서비스 - 마이페이지">
<title>마이페이지 - KT 이벤트 마케팅</title>
<!-- Styles -->
<link rel="stylesheet" href="css/common.css">
<!-- Fonts -->
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css">
</head>
<body>
<!-- Skip Link -->
<a href="#main-content" class="skip-link">본문으로 건너뛰기</a>
<!-- App Wrapper -->
<div class="app-wrapper">
<!-- Top App Bar -->
<header class="app-bar">
<h1 class="app-bar__title">마이페이지</h1>
<button class="app-bar__action" aria-label="설정">
<span class="material-icons">settings</span>
</button>
</header>
<!-- Main Content -->
<main id="main-content" class="app-content" style="padding-bottom: 80px;">
<div class="container">
<!-- Profile Section -->
<section style="margin-bottom: 24px;">
<div class="card" style="padding: 24px;">
<div style="display: flex; align-items: center; gap: 16px;">
<!-- Profile Image -->
<div style="width: 64px; height: 64px; background: linear-gradient(135deg, var(--color-primary-main), #C71F24); border-radius: 50%; display: flex; align-items: center; justify-content: center; flex-shrink: 0;">
<span class="material-icons" style="font-size: 36px; color: white;">person</span>
</div>
<!-- Profile Info -->
<div style="flex: 1;">
<div class="h3" style="margin-bottom: 4px;" id="userName">홍길동</div>
<div class="body-s text-muted" id="userEmail">hong@example.com</div>
<div class="body-s text-muted" id="userPhone">010-1234-5678</div>
</div>
<!-- Edit Button -->
<button class="btn btn-secondary btn-sm" onclick="editProfile()">
수정
</button>
</div>
</div>
</section>
<!-- Store Info Section -->
<section style="margin-bottom: 24px;">
<div style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 12px;">
<h2 class="h3">매장 정보</h2>
<button class="btn btn-text btn-sm" style="color: var(--color-primary-main);" onclick="editStore()">
수정
</button>
</div>
<div class="card" style="padding: 20px;" id="storeInfo">
<div style="text-align: center; padding: 20px 0; color: var(--color-gray-400);">
<span class="material-icons" style="font-size: 48px; margin-bottom: 12px;">store</span>
<p class="body-m text-muted">등록된 매장이 없습니다</p>
<button class="btn btn-primary btn-sm" style="margin-top: 12px;" onclick="window.location.href='02-매장정보등록.html'">
매장 등록하기
</button>
</div>
</div>
</section>
<!-- Menu List -->
<section style="margin-bottom: 24px;">
<h2 class="h3" style="margin-bottom: 12px;">서비스 관리</h2>
<div class="card" style="padding: 0; overflow: hidden;">
<!-- Subscription -->
<button class="menu-item" onclick="manageSubscription()">
<span class="material-icons" style="color: var(--color-primary-main);">card_membership</span>
<span style="flex: 1;">구독 관리</span>
<span class="badge badge-primary">무료 체험</span>
<span class="material-icons" style="color: var(--color-gray-400);">chevron_right</span>
</button>
<!-- Payment History -->
<button class="menu-item">
<span class="material-icons" style="color: var(--color-secondary-main);">receipt_long</span>
<span style="flex: 1;">결제 내역</span>
<span class="material-icons" style="color: var(--color-gray-400);">chevron_right</span>
</button>
<!-- Coupon -->
<button class="menu-item">
<span class="material-icons" style="color: var(--color-warning);">local_offer</span>
<span style="flex: 1;">쿠폰함</span>
<span class="badge badge-error">1</span>
<span class="material-icons" style="color: var(--color-gray-400);">chevron_right</span>
</button>
</div>
</section>
<!-- Settings -->
<section style="margin-bottom: 24px;">
<h2 class="h3" style="margin-bottom: 12px;">설정</h2>
<div class="card" style="padding: 0; overflow: hidden;">
<!-- Notifications -->
<button class="menu-item">
<span class="material-icons" style="color: var(--color-info);">notifications</span>
<span style="flex: 1;">알림 설정</span>
<span class="material-icons" style="color: var(--color-gray-400);">chevron_right</span>
</button>
<!-- Language -->
<button class="menu-item">
<span class="material-icons" style="color: var(--color-success);">language</span>
<span style="flex: 1;">언어 설정</span>
<span class="body-s text-muted">한국어</span>
<span class="material-icons" style="color: var(--color-gray-400);">chevron_right</span>
</button>
<!-- Privacy -->
<button class="menu-item">
<span class="material-icons" style="color: var(--color-gray-600);">privacy_tip</span>
<span style="flex: 1;">개인정보 처리방침</span>
<span class="material-icons" style="color: var(--color-gray-400);">chevron_right</span>
</button>
<!-- Terms -->
<button class="menu-item">
<span class="material-icons" style="color: var(--color-gray-600);">description</span>
<span style="flex: 1;">서비스 이용약관</span>
<span class="material-icons" style="color: var(--color-gray-400);">chevron_right</span>
</button>
</div>
</section>
<!-- Support -->
<section style="margin-bottom: 24px;">
<h2 class="h3" style="margin-bottom: 12px;">고객 지원</h2>
<div class="card" style="padding: 0; overflow: hidden;">
<!-- FAQ -->
<button class="menu-item">
<span class="material-icons" style="color: var(--color-secondary-main);">help</span>
<span style="flex: 1;">자주 묻는 질문</span>
<span class="material-icons" style="color: var(--color-gray-400);">chevron_right</span>
</button>
<!-- Customer Service -->
<button class="menu-item">
<span class="material-icons" style="color: var(--color-primary-main);">headset_mic</span>
<span style="flex: 1;">1:1 문의</span>
<span class="material-icons" style="color: var(--color-gray-400);">chevron_right</span>
</button>
<!-- App Version -->
<div class="menu-item" style="cursor: default;">
<span class="material-icons" style="color: var(--color-gray-400);">info</span>
<span style="flex: 1;">앱 버전</span>
<span class="body-s text-muted">v1.0.0</span>
</div>
</div>
</section>
<!-- Logout -->
<section style="margin-bottom: 32px;">
<button
class="btn btn-secondary btn-lg btn-block"
onclick="logout()"
style="margin-bottom: 12px;"
>
로그아웃
</button>
<button
class="btn btn-text btn-sm btn-block"
style="color: var(--color-error);"
onclick="confirmWithdraw()"
>
회원 탈퇴
</button>
</section>
</div>
</main>
<!-- Bottom Navigation -->
<nav class="bottom-nav">
<button class="bottom-nav__item" data-page="home" onclick="window.location.href='21.5-홈.html'">
<span class="material-icons">home</span>
<span></span>
</button>
<button class="bottom-nav__item" data-page="event" onclick="window.location.href='03-이벤트목적선택.html'">
<span class="material-icons">campaign</span>
<span>이벤트</span>
</button>
<button class="bottom-nav__item" data-page="analytics" onclick="window.location.href='21-실시간대시보드.html'">
<span class="material-icons">analytics</span>
<span>분석</span>
</button>
<button class="bottom-nav__item active" data-page="my">
<span class="material-icons">person</span>
<span>MY</span>
</button>
</nav>
</div>
<!-- Scripts -->
<script src="js/common.js"></script>
<script>
(function() {
'use strict';
// 사용자 정보 로드
const user = window.AppState.user;
const store = window.AppState.store;
if (user) {
document.getElementById('userName').textContent = user.name || '사용자';
if (user.email) {
document.getElementById('userEmail').textContent = user.email;
}
if (user.phone) {
document.getElementById('userPhone').textContent = user.phone;
}
}
// 매장 정보 표시
if (store) {
const storeInfo = document.getElementById('storeInfo');
storeInfo.innerHTML = `
<div style="margin-bottom: 16px;">
<div class="body-m" style="font-weight: 600; margin-bottom: 8px;">${store.name}</div>
<div class="body-s text-muted" style="margin-bottom: 4px;">
<span class="material-icons" style="font-size: 14px; vertical-align: middle;">business</span>
${store.businessTypeName || store.businessType}
</div>
<div class="body-s text-muted" style="margin-bottom: 4px;">
<span class="material-icons" style="font-size: 14px; vertical-align: middle;">location_on</span>
${store.address}
</div>
<div class="body-s text-muted">
<span class="material-icons" style="font-size: 14px; vertical-align: middle;">credit_card</span>
${store.businessNumber}
</div>
</div>
${store.menuItems && store.menuItems.length > 0 ? `
<div style="padding-top: 16px; border-top: 1px solid var(--color-gray-200);">
<div class="body-s text-muted" style="margin-bottom: 8px;">대표 메뉴</div>
<div style="display: flex; gap: 8px; flex-wrap: wrap;">
${store.menuItems.slice(0, 3).map(item => `
<span class="badge" style="background: var(--color-gray-100); color: var(--color-gray-700);">
${item.name}
</span>
`).join('')}
</div>
</div>
` : ''}
`;
}
// 프로필 수정
window.editProfile = function() {
Modal.show({
title: '프로필 수정',
body: `
<div class="form-group">
<label class="form-label">이름</label>
<input
type="text"
id="editName"
class="form-input"
value="${user?.name || ''}"
>
</div>
<div class="form-group">
<label class="form-label">이메일</label>
<input
type="email"
id="editEmail"
class="form-input"
value="${user?.email || ''}"
${user?.authType === 'kt' ? 'disabled' : ''}
>
</div>
<div class="form-group">
<label class="form-label">전화번호</label>
<input
type="tel"
id="editPhone"
class="form-input"
value="${user?.phone || ''}"
${user?.authType === 'kt' ? 'disabled' : ''}
>
</div>
`,
confirmText: '저장',
onConfirm: function() {
const name = document.getElementById('editName').value;
const email = document.getElementById('editEmail').value;
const phone = document.getElementById('editPhone').value;
if (user) {
user.name = name;
if (user.authType !== 'kt') {
user.email = email;
user.phone = phone;
}
window.AppState.save();
document.getElementById('userName').textContent = name;
if (email) document.getElementById('userEmail').textContent = email;
if (phone) document.getElementById('userPhone').textContent = phone;
Toast.success('프로필이 수정되었습니다.');
}
}
});
};
// 매장 정보 수정
window.editStore = function() {
if (!store) {
Toast.info('먼저 매장을 등록해주세요.');
return;
}
window.location.href = '02-매장정보등록.html';
};
// 구독 관리
window.manageSubscription = function() {
Modal.show({
title: '구독 관리',
body: `
<div style="text-align: center; padding: 20px;">
<div class="h2" style="color: var(--color-primary-main); margin-bottom: 16px;">무료 체험 중</div>
<p class="body-m text-muted" style="margin-bottom: 24px;">
첫 이벤트 생성 시 무료 체험 쿠폰을 사용할 수 있습니다.
</p>
<div class="card" style="padding: 16px; background: var(--color-gray-50);">
<div class="body-m" style="font-weight: 600; margin-bottom: 12px;">프리미엄 플랜</div>
<div class="h2" style="color: var(--color-primary-main); margin-bottom: 8px;">₩29,000 <span class="body-m text-muted">/ 월</span></div>
<ul style="text-align: left; margin-top: 16px; padding-left: 20px;">
<li class="body-s" style="margin-bottom: 8px;">무제한 이벤트 생성</li>
<li class="body-s" style="margin-bottom: 8px;">AI 고급 기능 사용</li>
<li class="body-s" style="margin-bottom: 8px;">우선 고객 지원</li>
<li class="body-s">상세 분석 리포트</li>
</ul>
</div>
</div>
`,
confirmText: '업그레이드',
onConfirm: function() {
Toast.info('결제 기능은 준비 중입니다.');
}
});
};
// 로그아웃
window.logout = function() {
Modal.confirm(
'로그아웃',
'정말 로그아웃 하시겠습니까?',
function() {
Loading.show('로그아웃 중...');
setTimeout(() => {
window.AppState.clear();
Loading.hide();
Toast.success('로그아웃되었습니다.');
setTimeout(() => {
window.location.href = '00-로그인.html';
}, 500);
}, 1000);
}
);
};
// 회원 탈퇴
window.confirmWithdraw = function() {
Modal.show({
title: '⚠️ 회원 탈퇴',
body: `
<div style="padding: 16px 0;">
<p class="body-m" style="margin-bottom: 16px;">
회원 탈퇴 시 모든 데이터가 삭제되며 복구할 수 없습니다.
</p>
<div class="card" style="padding: 16px; background: #FFF5F5; border: 1px solid var(--color-error);">
<div class="body-s" style="color: var(--color-error); line-height: 1.6;">
• 진행 중인 이벤트 정보<br>
• 매장 정보 및 통계<br>
• 결제 내역 및 쿠폰<br>
• 모든 분석 데이터
</div>
</div>
<p class="body-s text-muted" style="margin-top: 16px;">
정말 탈퇴하시겠습니까?
</p>
</div>
`,
confirmText: '탈퇴하기',
cancelText: '취소',
onConfirm: function() {
Loading.show('회원 탈퇴 처리 중...');
setTimeout(() => {
window.AppState.clear();
Loading.hide();
Toast.success('회원 탈퇴가 완료되었습니다.');
setTimeout(() => {
window.location.href = '00-로그인.html';
}, 500);
}, 1500);
}
});
};
// Bottom Navigation 활성화
Navigation.updateBottomNav('my');
console.log('마이페이지 로드 완료');
})();
</script>
<style>
.menu-item {
display: flex;
align-items: center;
gap: 12px;
padding: 16px 20px;
width: 100%;
background: transparent;
border: none;
border-bottom: 1px solid var(--color-gray-200);
cursor: pointer;
transition: background-color 0.2s ease;
text-align: left;
}
.menu-item:last-child {
border-bottom: none;
}
.menu-item:hover {
background-color: var(--color-gray-50);
}
.menu-item:active {
background-color: var(--color-gray-100);
}
.badge {
display: inline-flex;
align-items: center;
padding: 4px 8px;
border-radius: 12px;
font-size: 11px;
font-weight: 600;
}
.badge-primary {
background: var(--color-primary-light);
color: var(--color-primary-main);
}
.badge-error {
background: var(--color-error);
color: white;
}
.badge-success {
background: var(--color-success);
color: white;
}
</style>
</body>
</html>

View File

@ -0,0 +1,365 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="KT AI 기반 소상공인 이벤트 자동 생성 서비스 - 이벤트 목록">
<title>이벤트 목록 - KT 이벤트 마케팅</title>
<!-- Styles -->
<link rel="stylesheet" href="css/common.css">
<!-- Fonts -->
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/orioncactus/pretendard@v1.3.9/dist/web/static/pretendard.min.css">
</head>
<body>
<!-- Skip Link -->
<a href="#main-content" class="skip-link">본문으로 건너뛰기</a>
<!-- App Wrapper -->
<div class="app-wrapper">
<!-- Top App Bar -->
<header class="app-bar">
<h1 class="app-bar__title">이벤트 목록</h1>
<button class="app-bar__action" aria-label="검색">
<span class="material-icons">search</span>
</button>
</header>
<!-- Main Content -->
<main id="main-content" class="app-content" style="padding-bottom: 100px;">
<div class="container">
<!-- Filter Tabs -->
<section style="margin-bottom: 24px;">
<div style="display: flex; gap: 8px; overflow-x: auto; padding: 4px 0;">
<button class="filter-chip active" onclick="filterEvents('all')">
전체 <span class="badge" style="background: var(--color-primary-main); color: white; margin-left: 4px;">0</span>
</button>
<button class="filter-chip" onclick="filterEvents('active')">
진행중 <span class="badge" style="background: var(--color-success); color: white; margin-left: 4px;">0</span>
</button>
<button class="filter-chip" onclick="filterEvents('scheduled')">
예정 <span class="badge" style="background: var(--color-info); color: white; margin-left: 4px;">0</span>
</button>
<button class="filter-chip" onclick="filterEvents('completed')">
종료 <span class="badge" style="background: var(--color-gray-400); color: white; margin-left: 4px;">0</span>
</button>
</div>
</section>
<!-- Event List -->
<section id="eventList">
<!-- Empty State -->
<div class="card" style="padding: 60px 24px; text-align: center;">
<div style="width: 80px; height: 80px; background: var(--color-gray-100); border-radius: 50%; display: flex; align-items: center; justify-content: center; margin: 0 auto 24px;">
<span class="material-icons" style="font-size: 48px; color: var(--color-gray-400);">event_busy</span>
</div>
<div class="h3" style="margin-bottom: 12px;">진행 중인 이벤트가 없습니다</div>
<p class="body-m text-muted" style="margin-bottom: 24px;">
AI가 자동으로 이벤트를 기획해드립니다.<br>
첫 이벤트를 만들어보세요!
</p>
<button
class="btn btn-primary btn-md"
onclick="window.location.href='03-이벤트목적선택.html'"
>
<span class="material-icons" style="font-size: 20px; margin-right: 4px;">add_circle</span>
새 이벤트 만들기
</button>
</div>
<!-- Example Event Cards (주석 처리됨 - 실제 이벤트가 있을 때 표시) -->
<!--
<div class="card" style="padding: 20px; margin-bottom: 16px; cursor: pointer;" onclick="viewEvent(1)">
<div style="display: flex; justify-content: space-between; align-items: start; margin-bottom: 12px;">
<div style="flex: 1;">
<div class="body-m" style="font-weight: 600; margin-bottom: 4px;">설날 특별 할인 이벤트</div>
<div class="body-s text-muted">2025.01.20 ~ 2025.02.10</div>
</div>
<span class="badge badge-success">진행중</span>
</div>
<div style="display: flex; gap: 16px; padding: 16px; background: var(--color-gray-50); border-radius: 8px; margin-bottom: 16px;">
<div style="flex: 1; text-align: center;">
<div class="body-s text-muted" style="margin-bottom: 4px;">참여자</div>
<div class="body-l" style="font-weight: 600;">1,234</div>
</div>
<div style="flex: 1; text-align: center; border-left: 1px solid var(--color-gray-200);">
<div class="body-s text-muted" style="margin-bottom: 4px;">조회수</div>
<div class="body-l" style="font-weight: 600;">5,678</div>
</div>
<div style="flex: 1; text-align: center; border-left: 1px solid var(--color-gray-200);">
<div class="body-s text-muted" style="margin-bottom: 4px;">ROI</div>
<div class="body-l" style="font-weight: 600; color: var(--color-success);">+245%</div>
</div>
</div>
<div style="display: flex; gap: 8px;">
<button class="btn btn-secondary btn-sm" style="flex: 1;" onclick="event.stopPropagation(); editEvent(1)">
수정
</button>
<button class="btn btn-text btn-sm" onclick="event.stopPropagation(); viewAnalytics(1)">
분석 보기
</button>
</div>
</div>
-->
</section>
</div>
</main>
<!-- Floating Action Button -->
<button
class="fab"
onclick="window.location.href='03-이벤트목적선택.html'"
aria-label="새 이벤트 만들기"
>
<span class="material-icons">add</span>
</button>
<!-- Bottom Navigation -->
<nav class="bottom-nav">
<button class="bottom-nav__item" data-page="home" onclick="window.location.href='21.5-홈.html'">
<span class="material-icons">home</span>
<span></span>
</button>
<button class="bottom-nav__item active" data-page="event">
<span class="material-icons">campaign</span>
<span>이벤트</span>
</button>
<button class="bottom-nav__item" data-page="analytics" onclick="window.location.href='21-실시간대시보드.html'">
<span class="material-icons">analytics</span>
<span>분석</span>
</button>
<button class="bottom-nav__item" data-page="my" onclick="window.location.href='25-마이페이지.html'">
<span class="material-icons">person</span>
<span>MY</span>
</button>
</nav>
</div>
<!-- Scripts -->
<script src="js/common.js"></script>
<script>
(function() {
'use strict';
let currentFilter = 'all';
let events = []; // 실제로는 서버에서 가져옴
// 이벤트 필터링
window.filterEvents = function(filter) {
currentFilter = filter;
// 필터 칩 활성화
document.querySelectorAll('.filter-chip').forEach(chip => {
chip.classList.remove('active');
});
event.target.closest('.filter-chip').classList.add('active');
// 이벤트 목록 다시 렌더링
renderEventList();
};
// 이벤트 목록 렌더링
function renderEventList() {
const eventList = document.getElementById('eventList');
// 필터링된 이벤트 가져오기
let filteredEvents = events;
if (currentFilter !== 'all') {
filteredEvents = events.filter(e => e.status === currentFilter);
}
// 이벤트가 없을 경우
if (filteredEvents.length === 0) {
eventList.innerHTML = `
<div class="card" style="padding: 60px 24px; text-align: center;">
<div style="width: 80px; height: 80px; background: var(--color-gray-100); border-radius: 50%; display: flex; align-items: center; justify-content: center; margin: 0 auto 24px;">
<span class="material-icons" style="font-size: 48px; color: var(--color-gray-400);">event_busy</span>
</div>
<div class="h3" style="margin-bottom: 12px;">
${currentFilter === 'all' ? '진행 중인 이벤트가 없습니다' : `${getFilterName(currentFilter)} 이벤트가 없습니다`}
</div>
<p class="body-m text-muted" style="margin-bottom: 24px;">
AI가 자동으로 이벤트를 기획해드립니다.<br>
첫 이벤트를 만들어보세요!
</p>
<button
class="btn btn-primary btn-md"
onclick="window.location.href='03-이벤트목적선택.html'"
>
<span class="material-icons" style="font-size: 20px; margin-right: 4px;">add_circle</span>
새 이벤트 만들기
</button>
</div>
`;
return;
}
// 이벤트 카드 렌더링
eventList.innerHTML = filteredEvents.map(event => `
<div class="card" style="padding: 20px; margin-bottom: 16px; cursor: pointer;" onclick="viewEvent('${event.id}')">
<div style="display: flex; justify-content: space-between; align-items: start; margin-bottom: 12px;">
<div style="flex: 1;">
<div class="body-m" style="font-weight: 600; margin-bottom: 4px;">${event.title}</div>
<div class="body-s text-muted">${event.startDate} ~ ${event.endDate}</div>
</div>
<span class="badge ${getStatusBadgeClass(event.status)}">${getStatusText(event.status)}</span>
</div>
<div style="display: flex; gap: 16px; padding: 16px; background: var(--color-gray-50); border-radius: 8px; margin-bottom: 16px;">
<div style="flex: 1; text-align: center;">
<div class="body-s text-muted" style="margin-bottom: 4px;">참여자</div>
<div class="body-l" style="font-weight: 600;">${Utils.formatNumber(event.participants)}</div>
</div>
<div style="flex: 1; text-align: center; border-left: 1px solid var(--color-gray-200);">
<div class="body-s text-muted" style="margin-bottom: 4px;">조회수</div>
<div class="body-l" style="font-weight: 600;">${Utils.formatNumber(event.views)}</div>
</div>
<div style="flex: 1; text-align: center; border-left: 1px solid var(--color-gray-200);">
<div class="body-s text-muted" style="margin-bottom: 4px;">ROI</div>
<div class="body-l" style="font-weight: 600; color: var(--color-success);">+${event.roi}%</div>
</div>
</div>
<div style="display: flex; gap: 8px;">
<button class="btn btn-secondary btn-sm" style="flex: 1;" onclick="event.stopPropagation(); editEvent('${event.id}')">
수정
</button>
<button class="btn btn-text btn-sm" onclick="event.stopPropagation(); viewAnalytics('${event.id}')">
분석 보기
</button>
</div>
</div>
`).join('');
}
// 필터 이름 반환
function getFilterName(filter) {
const names = {
active: '진행중',
scheduled: '예정',
completed: '종료'
};
return names[filter] || '전체';
}
// 상태 텍스트 반환
function getStatusText(status) {
const texts = {
active: '진행중',
scheduled: '예정',
completed: '종료'
};
return texts[status] || status;
}
// 상태 배지 클래스 반환
function getStatusBadgeClass(status) {
const classes = {
active: 'badge-success',
scheduled: 'badge-info',
completed: 'badge-gray'
};
return classes[status] || '';
}
// 이벤트 상세 보기
window.viewEvent = function(eventId) {
Toast.info(`이벤트 상세 페이지로 이동 (ID: ${eventId})`);
// 실제로는 이벤트 상세 페이지로 이동
// window.location.href = `이벤트상세.html?id=${eventId}`;
};
// 이벤트 수정
window.editEvent = function(eventId) {
Toast.info(`이벤트 수정 (ID: ${eventId})`);
// 실제로는 이벤트 수정 페이지로 이동
};
// 분석 보기
window.viewAnalytics = function(eventId) {
window.location.href = '21-실시간대시보드.html';
};
// Bottom Navigation 활성화
Navigation.updateBottomNav('event');
// 초기화
renderEventList();
console.log('이벤트 목록 페이지 로드 완료');
})();
</script>
<style>
.filter-chip {
display: inline-flex;
align-items: center;
padding: 8px 16px;
border-radius: 20px;
border: 1px solid var(--color-gray-300);
background: white;
color: var(--color-gray-700);
font-size: 14px;
font-weight: 500;
cursor: pointer;
transition: all 0.2s ease;
white-space: nowrap;
}
.filter-chip:hover {
background: var(--color-gray-50);
}
.filter-chip.active {
background: var(--color-primary-main);
color: white;
border-color: var(--color-primary-main);
}
.fab {
position: fixed;
bottom: 90px;
right: 20px;
width: 56px;
height: 56px;
border-radius: 50%;
background: linear-gradient(135deg, var(--color-primary-main), #C71F24);
color: white;
border: none;
box-shadow: 0 4px 12px rgba(227, 30, 36, 0.4);
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.3s ease;
z-index: 100;
}
.fab:hover {
transform: scale(1.1);
box-shadow: 0 6px 16px rgba(227, 30, 36, 0.5);
}
.fab:active {
transform: scale(0.95);
}
.fab .material-icons {
font-size: 28px;
}
.badge-info {
background: var(--color-info);
color: white;
}
.badge-gray {
background: var(--color-gray-400);
color: white;
}
</style>
</body>
</html>