Initial commit: Korea Tourism Agency website with AdminJS

- Full-stack Node.js/Express application with PostgreSQL
- Modern ES modules architecture
- AdminJS admin panel with Sequelize ORM
- Tourism routes, guides, articles, bookings management
- Responsive Bootstrap 5 frontend
- Docker containerization with docker-compose
- Complete database schema with migrations
- Authentication system for admin panel
- Dynamic placeholder images for tour categories
This commit is contained in:
2025-11-29 18:13:17 +09:00
commit 409e6c146b
53 changed files with 16195 additions and 0 deletions

218
public/css/admin-custom.css Normal file
View File

@@ -0,0 +1,218 @@
/* Korea Tourism Agency Admin Panel Custom Styles */
/* Brand Customization */
.brand-link {
background-color: #1f2937 !important;
}
.brand-text {
color: #f8f9fa !important;
font-weight: 600 !important;
}
/* Sidebar Customization */
.main-sidebar {
background: linear-gradient(180deg, #1f2937 0%, #111827 100%) !important;
}
.nav-sidebar .nav-item > .nav-link {
color: #d1d5db !important;
transition: all 0.3s ease;
}
.nav-sidebar .nav-item > .nav-link:hover {
background-color: rgba(255, 255, 255, 0.1) !important;
color: #ffffff !important;
}
.nav-sidebar .nav-item > .nav-link.active {
background-color: #3b82f6 !important;
color: #ffffff !important;
border-radius: 0.375rem;
margin: 0.125rem;
}
/* Cards Enhancement */
.card {
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
border: none;
border-radius: 0.5rem;
}
.card-header {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
border-radius: 0.5rem 0.5rem 0 0 !important;
}
.card-header .card-title {
color: white !important;
font-weight: 600;
}
/* Small Boxes Enhancement */
.small-box {
border-radius: 0.75rem;
overflow: hidden;
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
transition: transform 0.2s ease;
}
.small-box:hover {
transform: translateY(-2px);
}
.small-box .icon {
top: 10px;
right: 10px;
}
/* Buttons Enhancement */
.btn {
border-radius: 0.375rem;
font-weight: 500;
transition: all 0.2s ease;
}
.btn:hover {
transform: translateY(-1px);
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
}
/* Table Enhancement */
.table {
border-radius: 0.5rem;
overflow: hidden;
}
.table thead th {
background: linear-gradient(135deg, #f8f9fa 0%, #e9ecef 100%);
border: none;
font-weight: 600;
color: #495057;
}
.table tbody tr:hover {
background-color: #f8f9fa;
}
/* Form Enhancement */
.form-control {
border-radius: 0.375rem;
border: 1px solid #d1d5db;
transition: all 0.2s ease;
}
.form-control:focus {
border-color: #3b82f6;
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
}
/* Custom File Input */
.custom-file-label {
border-radius: 0.375rem;
}
.custom-file-input:focus ~ .custom-file-label {
border-color: #3b82f6;
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
}
/* Alert Enhancement */
.alert {
border-radius: 0.5rem;
border: none;
}
.alert-success {
background: linear-gradient(135deg, #d4edda 0%, #c3e6cb 100%);
color: #155724;
}
.alert-danger {
background: linear-gradient(135deg, #f8d7da 0%, #f1b0b7 100%);
color: #721c24;
}
.alert-warning {
background: linear-gradient(135deg, #fff3cd 0%, #ffeaa7 100%);
color: #856404;
}
/* Badge Enhancement */
.badge {
font-size: 0.75rem;
font-weight: 500;
padding: 0.375rem 0.75rem;
border-radius: 0.375rem;
}
/* Loading Spinner */
.loading {
opacity: 0.7;
pointer-events: none;
}
.spinner {
border: 3px solid #f3f3f3;
border-top: 3px solid #3b82f6;
border-radius: 50%;
width: 30px;
height: 30px;
animation: spin 1s linear infinite;
margin: 10px auto;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
/* Mobile Responsiveness */
@media (max-width: 768px) {
.card-header .card-title {
font-size: 1rem;
}
.small-box .inner h3 {
font-size: 1.5rem;
}
.btn-group .btn {
padding: 0.25rem 0.5rem;
}
}
/* Dark Mode Support */
@media (prefers-color-scheme: dark) {
.card {
background-color: #374151;
color: #f9fafb;
}
.table {
color: #f9fafb;
}
.form-control {
background-color: #374151;
color: #f9fafb;
border-color: #4b5563;
}
}
/* Korean Typography */
.korean-text {
font-family: 'Noto Sans KR', 'Malgun Gothic', '맑은 고딕', sans-serif;
}
/* Success Animation */
.success-animation {
animation: successPulse 0.6s ease-in-out;
}
@keyframes successPulse {
0% { transform: scale(1); }
50% { transform: scale(1.05); }
100% { transform: scale(1); }
}