init commit

This commit is contained in:
2025-10-19 18:27:00 +09:00
commit 150891b29d
219 changed files with 70016 additions and 0 deletions

337
views/about-old.ejs Normal file
View File

@@ -0,0 +1,337 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>회사 소개 - SmartSolTech</title>
<!-- SEO Meta Tags -->
<meta name="description" content="SmartSolTech 회사 소개 - 혁신적인 기술로 고객의 성공을 이끌어가는 디지털 솔루션 전문 기업입니다.">
<meta name="keywords" content="SmartSolTech, 회사소개, 기업정보, 디지털솔루션, 웹개발, 모바일앱">
<!-- Open Graph -->
<meta property="og:title" content="회사 소개 - SmartSolTech">
<meta property="og:description" content="혁신적인 기술로 고객의 성공을 이끌어가는 디지털 솔루션 전문 기업">
<meta property="og:type" content="website">
<!-- PWA -->
<meta name="theme-color" content="#3B82F6">
<link rel="manifest" href="/manifest.json">
<link rel="apple-touch-icon" href="/images/icons/icon-192x192.png">
<!-- Styles -->
<link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
<link href="https://unpkg.com/aos@2.3.1/dist/aos.css" rel="stylesheet">
<link href="/css/main.css" rel="stylesheet">
<link href="/css/fixes.css" rel="stylesheet">
</head>
<body class="font-sans">
<%- include('partials/navigation') %>
<!-- Hero Section -->
<section class="relative bg-gradient-to-br from-blue-900 via-purple-900 to-indigo-900 py-32">
<div class="absolute inset-0 bg-black opacity-40"></div>
<div class="relative max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 text-center">
<h1 class="text-5xl md:text-6xl font-bold text-white mb-6" data-aos="fade-up">
About <span class="text-transparent bg-clip-text bg-gradient-to-r from-blue-400 to-purple-400">SmartSolTech</span>
</h1>
<p class="text-xl md:text-2xl text-gray-300 max-w-3xl mx-auto" data-aos="fade-up" data-aos-delay="200">
혁신적인 기술로 고객의 성공을 이끌어가는 디지털 솔루션 전문 기업
</p>
</div>
</section>
<!-- Company Overview -->
<section class="py-20 bg-white">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="grid grid-cols-1 lg:grid-cols-2 gap-12 items-center">
<div data-aos="fade-right">
<h2 class="text-4xl font-bold text-gray-900 mb-6">
<span class="text-blue-600">혁신</span>과 <span class="text-purple-600">창의</span>로 만드는 미래
</h2>
<p class="text-lg text-gray-600 mb-6">
SmartSolTech는 2020년 설립된 디지털 솔루션 전문 기업으로, 웹 개발, 모바일 앱, UI/UX 디자인 분야에서
혁신적인 기술과 창의적인 아이디어를 바탕으로 고객의 비즈니스 성공을 지원합니다.
</p>
<p class="text-lg text-gray-600 mb-8">
우리는 단순히 기술을 제공하는 것이 아니라, 고객의 목표를 이해하고 그에 맞는 최적의 솔루션을
제안하여 함께 성장하는 파트너가 되고자 합니다.
</p>
<div class="grid grid-cols-3 gap-8">
<div class="text-center">
<div class="text-3xl font-bold text-blue-600 mb-2">100+</div>
<div class="text-gray-600">완료 프로젝트</div>
</div>
<div class="text-center">
<div class="text-3xl font-bold text-purple-600 mb-2">50+</div>
<div class="text-gray-600">만족한 고객</div>
</div>
<div class="text-center">
<div class="text-3xl font-bold text-green-600 mb-2">4년</div>
<div class="text-gray-600">업계 경험</div>
</div>
</div>
</div>
<div data-aos="fade-left">
<div class="relative">
<div class="bg-gradient-to-br from-blue-500 to-purple-600 rounded-2xl p-8 text-white">
<h3 class="text-2xl font-bold mb-4">우리의 미션</h3>
<p class="text-lg mb-6">
"기술을 통해 모든 비즈니스가 디지털 시대에서 성공할 수 있도록 돕는 것"
</p>
<h3 class="text-2xl font-bold mb-4">우리의 비전</h3>
<p class="text-lg">
"한국을 대표하는 글로벌 디지털 솔루션 기업으로 성장하여
전 세계 고객들의 디지털 혁신을 주도하는 것"
</p>
</div>
<div class="absolute -bottom-6 -right-6 w-24 h-24 bg-yellow-400 rounded-full opacity-20"></div>
<div class="absolute -top-6 -left-6 w-16 h-16 bg-pink-400 rounded-full opacity-20"></div>
</div>
</div>
</div>
</div>
</section>
<!-- Our Values -->
<section class="py-20 bg-gray-50">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="text-center mb-16" data-aos="fade-up">
<h2 class="text-4xl md:text-5xl font-bold text-gray-900 mb-4">
Core <span class="text-blue-600">Values</span>
</h2>
<p class="text-xl text-gray-600 max-w-3xl mx-auto">
SmartSolTech가 추구하는 핵심 가치들
</p>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-8">
<div class="text-center p-8 bg-white rounded-2xl shadow-lg card-hover" data-aos="fade-up">
<div class="w-16 h-16 bg-blue-100 rounded-full flex items-center justify-center mx-auto mb-6">
<i class="fas fa-lightbulb text-2xl text-blue-600"></i>
</div>
<h3 class="text-xl font-bold text-gray-900 mb-4">혁신 (Innovation)</h3>
<p class="text-gray-600">
끊임없는 연구개발과 최신 기술 도입으로 혁신적인 솔루션을 제공합니다.
</p>
</div>
<div class="text-center p-8 bg-white rounded-2xl shadow-lg card-hover" data-aos="fade-up" data-aos-delay="100">
<div class="w-16 h-16 bg-purple-100 rounded-full flex items-center justify-center mx-auto mb-6">
<i class="fas fa-users text-2xl text-purple-600"></i>
</div>
<h3 class="text-xl font-bold text-gray-900 mb-4">협력 (Collaboration)</h3>
<p class="text-gray-600">
고객과의 긴밀한 소통과 협력을 통해 최상의 결과를 만들어냅니다.
</p>
</div>
<div class="text-center p-8 bg-white rounded-2xl shadow-lg card-hover" data-aos="fade-up" data-aos-delay="200">
<div class="w-16 h-16 bg-green-100 rounded-full flex items-center justify-center mx-auto mb-6">
<i class="fas fa-award text-2xl text-green-600"></i>
</div>
<h3 class="text-xl font-bold text-gray-900 mb-4">품질 (Quality)</h3>
<p class="text-gray-600">
높은 품질 기준을 유지하며 고객이 만족할 수 있는 완성도 높은 제품을 제공합니다.
</p>
</div>
<div class="text-center p-8 bg-white rounded-2xl shadow-lg card-hover" data-aos="fade-up" data-aos-delay="300">
<div class="w-16 h-16 bg-yellow-100 rounded-full flex items-center justify-center mx-auto mb-6">
<i class="fas fa-rocket text-2xl text-yellow-600"></i>
</div>
<h3 class="text-xl font-bold text-gray-900 mb-4">성장 (Growth)</h3>
<p class="text-gray-600">
고객과 함께 성장하며, 지속적인 학습과 발전을 추구합니다.
</p>
</div>
</div>
</div>
</section>
<!-- Team Section -->
<section class="py-20 bg-white">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="text-center mb-16" data-aos="fade-up">
<h2 class="text-4xl md:text-5xl font-bold text-gray-900 mb-4">
Our <span class="text-purple-600">Team</span>
</h2>
<p class="text-xl text-gray-600 max-w-3xl mx-auto">
전문성과 열정을 갖춘 SmartSolTech 팀을 소개합니다
</p>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
<div class="text-center p-8 bg-gray-50 rounded-2xl card-hover" data-aos="fade-up">
<div class="w-24 h-24 bg-gradient-to-br from-blue-500 to-purple-600 rounded-full flex items-center justify-center mx-auto mb-6">
<span class="text-white text-2xl font-bold">KH</span>
</div>
<h3 class="text-xl font-bold text-gray-900 mb-2">김현우</h3>
<p class="text-blue-600 font-semibold mb-4">CEO & Founder</p>
<p class="text-gray-600 mb-4">
10년 이상의 웹 개발 경험을 바탕으로 SmartSolTech를 설립하여
혁신적인 디지털 솔루션을 제공하고 있습니다.
</p>
<div class="flex justify-center space-x-4">
<a href="#" class="text-gray-400 hover:text-blue-600 transition-colors">
<i class="fab fa-linkedin text-xl"></i>
</a>
<a href="#" class="text-gray-400 hover:text-blue-600 transition-colors">
<i class="fab fa-github text-xl"></i>
</a>
</div>
</div>
<div class="text-center p-8 bg-gray-50 rounded-2xl card-hover" data-aos="fade-up" data-aos-delay="100">
<div class="w-24 h-24 bg-gradient-to-br from-purple-500 to-pink-600 rounded-full flex items-center justify-center mx-auto mb-6">
<span class="text-white text-2xl font-bold">LJ</span>
</div>
<h3 class="text-xl font-bold text-gray-900 mb-2">이정민</h3>
<p class="text-purple-600 font-semibold mb-4">CTO & Lead Developer</p>
<p class="text-gray-600 mb-4">
풀스택 개발자로서 최신 기술 트렌드를 적용하여
확장 가능하고 안정적인 시스템을 구축합니다.
</p>
<div class="flex justify-center space-x-4">
<a href="#" class="text-gray-400 hover:text-purple-600 transition-colors">
<i class="fab fa-linkedin text-xl"></i>
</a>
<a href="#" class="text-gray-400 hover:text-purple-600 transition-colors">
<i class="fab fa-github text-xl"></i>
</a>
</div>
</div>
<div class="text-center p-8 bg-gray-50 rounded-2xl card-hover" data-aos="fade-up" data-aos-delay="200">
<div class="w-24 h-24 bg-gradient-to-br from-green-500 to-teal-600 rounded-full flex items-center justify-center mx-auto mb-6">
<span class="text-white text-2xl font-bold">PS</span>
</div>
<h3 class="text-xl font-bold text-gray-900 mb-2">박서연</h3>
<p class="text-green-600 font-semibold mb-4">UI/UX Designer</p>
<p class="text-gray-600 mb-4">
사용자 중심의 디자인 철학을 바탕으로 직관적이고
아름다운 인터페이스를 설계합니다.
</p>
<div class="flex justify-center space-x-4">
<a href="#" class="text-gray-400 hover:text-green-600 transition-colors">
<i class="fab fa-linkedin text-xl"></i>
</a>
<a href="#" class="text-gray-400 hover:text-green-600 transition-colors">
<i class="fab fa-dribbble text-xl"></i>
</a>
</div>
</div>
</div>
</div>
</section>
<!-- Technology Stack -->
<section class="py-20 bg-gray-900">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="text-center mb-16" data-aos="fade-up">
<h2 class="text-4xl md:text-5xl font-bold text-white mb-4">
Technology <span class="text-blue-400">Stack</span>
</h2>
<p class="text-xl text-gray-300 max-w-3xl mx-auto">
최신 기술과 검증된 도구들로 최고의 솔루션을 제공합니다
</p>
</div>
<div class="grid grid-cols-1 md:grid-cols-3 gap-8">
<div class="text-center p-8 bg-gray-800 rounded-2xl" data-aos="fade-up">
<h3 class="text-xl font-bold text-white mb-6">Frontend</h3>
<div class="grid grid-cols-3 gap-4">
<div class="p-4 bg-gray-700 rounded-lg">
<i class="fab fa-react text-3xl text-blue-400 mb-2"></i>
<div class="text-white text-sm">React</div>
</div>
<div class="p-4 bg-gray-700 rounded-lg">
<i class="fab fa-vuejs text-3xl text-green-400 mb-2"></i>
<div class="text-white text-sm">Vue.js</div>
</div>
<div class="p-4 bg-gray-700 rounded-lg">
<i class="fab fa-angular text-3xl text-red-400 mb-2"></i>
<div class="text-white text-sm">Angular</div>
</div>
</div>
</div>
<div class="text-center p-8 bg-gray-800 rounded-2xl" data-aos="fade-up" data-aos-delay="100">
<h3 class="text-xl font-bold text-white mb-6">Backend</h3>
<div class="grid grid-cols-3 gap-4">
<div class="p-4 bg-gray-700 rounded-lg">
<i class="fab fa-node-js text-3xl text-green-500 mb-2"></i>
<div class="text-white text-sm">Node.js</div>
</div>
<div class="p-4 bg-gray-700 rounded-lg">
<i class="fab fa-python text-3xl text-yellow-400 mb-2"></i>
<div class="text-white text-sm">Python</div>
</div>
<div class="p-4 bg-gray-700 rounded-lg">
<i class="fab fa-java text-3xl text-orange-400 mb-2"></i>
<div class="text-white text-sm">Java</div>
</div>
</div>
</div>
<div class="text-center p-8 bg-gray-800 rounded-2xl" data-aos="fade-up" data-aos-delay="200">
<h3 class="text-xl font-bold text-white mb-6">Mobile</h3>
<div class="grid grid-cols-3 gap-4">
<div class="p-4 bg-gray-700 rounded-lg">
<i class="fab fa-react text-3xl text-blue-400 mb-2"></i>
<div class="text-white text-sm">React Native</div>
</div>
<div class="p-4 bg-gray-700 rounded-lg">
<i class="fas fa-mobile-alt text-3xl text-blue-500 mb-2"></i>
<div class="text-white text-sm">Flutter</div>
</div>
<div class="p-4 bg-gray-700 rounded-lg">
<i class="fab fa-swift text-3xl text-orange-500 mb-2"></i>
<div class="text-white text-sm">Swift</div>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- CTA Section -->
<section class="py-20 cta-section">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 text-center relative z-10">
<div data-aos="fade-up">
<h2 class="text-4xl md:text-5xl font-bold text-white mb-6">
함께 성공하는 파트너가 되어보세요
</h2>
<p class="text-xl text-blue-100 mb-8 max-w-3xl mx-auto">
SmartSolTech와 함께 여러분의 비즈니스를 다음 단계로 발전시켜보세요
</p>
<div class="flex flex-col sm:flex-row gap-4 justify-center">
<a href="/contact" class="inline-flex items-center px-8 py-4 bg-white text-blue-600 font-bold rounded-full text-lg hover:bg-gray-100 transition-colors transform hover:scale-105">
<i class="fas fa-handshake mr-3"></i>
파트너십 문의
</a>
<a href="/portfolio" class="inline-flex items-center px-8 py-4 border-2 border-white text-white font-bold rounded-full text-lg hover:bg-white hover:text-blue-600 transition-colors transform hover:scale-105">
<i class="fas fa-eye mr-3"></i>
포트폴리오 보기
</a>
</div>
</div>
</div>
</section>
<%- include('partials/footer') %>
<!-- Scripts -->
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
<script src="/js/main.js"></script>
<script>
// Initialize AOS
AOS.init({
duration: 800,
once: true,
offset: 100
});
</script>
</body>
</html>

160
views/about.ejs Normal file
View File

@@ -0,0 +1,160 @@
<!DOCTYPE html>
<html lang="<%= locale %>" class="<%= theme === 'dark' ? 'dark' : '' %>">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><%- __('about.meta.title') %> - SmartSolTech</title>
<!-- SEO Meta Tags -->
<meta name="description" content="<%- __('about.meta.description') %>">
<!-- Styles -->
<link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
<link href="/css/main.css" rel="stylesheet">
<link href="/css/fixes.css" rel="stylesheet">
<link href="/css/dark-theme.css" rel="stylesheet">
</head>
<body class="font-sans dark:bg-gray-900 dark:text-gray-100">
<%- include('partials/navigation') %>
<!-- Hero Section -->
<section class="relative bg-gradient-to-br from-blue-900 via-purple-900 to-indigo-900 dark:from-gray-900 dark:via-blue-900 dark:to-purple-900 py-20 hero-section">
<div class="absolute inset-0 bg-black opacity-50 dark:opacity-70"></div>
<div class="relative max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 text-center">
<h1 class="text-5xl md:text-6xl font-bold text-white mb-6">
<%- __('about.hero.title') %>
</h1>
<p class="text-xl text-gray-300 dark:text-gray-200 max-w-3xl mx-auto">
<%- __('about.hero.subtitle') %>
</p>
</div>
</section>
<!-- About Section -->
<section class="py-20 bg-white dark:bg-gray-900">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="grid grid-cols-1 lg:grid-cols-2 gap-12 items-center">
<div>
<h2 class="text-4xl font-bold text-gray-900 dark:text-white mb-6">
<%- __('about.company.title') %>
</h2>
<p class="text-lg text-gray-600 dark:text-gray-300 mb-6">
<%- __('about.company.description1') %>
</p>
<p class="text-lg text-gray-600 dark:text-gray-300 mb-8">
<%- __('about.company.description2') %>
</p>
<!-- Stats -->
<div class="grid grid-cols-3 gap-6">
<div class="text-center">
<div class="text-3xl font-bold text-blue-600 dark:text-blue-400 mb-2">50+</div>
<div class="text-gray-600 dark:text-gray-300"><%- __('about.stats.projects') %></div>
</div>
<div class="text-center">
<div class="text-3xl font-bold text-purple-600 dark:text-purple-400 mb-2">3+</div>
<div class="text-gray-600 dark:text-gray-300"><%- __('about.stats.experience') %></div>
</div>
<div class="text-center">
<div class="text-3xl font-bold text-green-600 dark:text-green-400 mb-2">30+</div>
<div class="text-gray-600 dark:text-gray-300"><%- __('about.stats.clients') %></div>
</div>
</div>
</div>
<!-- Image placeholder -->
<div class="lg:order-first">
<div class="w-full h-96 bg-gradient-to-br from-blue-500 to-purple-600 rounded-2xl flex items-center justify-center">
<i class="fas fa-users text-white text-6xl"></i>
</div>
</div>
</div>
</div>
</section>
<!-- Mission Section -->
<section class="py-20 bg-gray-50 dark:bg-gray-800">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="text-center mb-16">
<h2 class="text-4xl font-bold text-gray-900 dark:text-white mb-4">
<%- __('about.mission.title') %>
</h2>
<p class="text-xl text-gray-600 dark:text-gray-300 max-w-3xl mx-auto">
<%- __('about.mission.description') %>
</p>
</div>
<div class="grid grid-cols-1 md:grid-cols-3 gap-8">
<!-- Innovation -->
<div class="text-center p-8 bg-white dark:bg-gray-700 rounded-2xl shadow-lg">
<div class="w-16 h-16 bg-blue-100 dark:bg-blue-900 rounded-full flex items-center justify-center mx-auto mb-6">
<i class="fas fa-lightbulb text-blue-600 dark:text-blue-400 text-2xl"></i>
</div>
<h3 class="text-2xl font-bold text-gray-900 dark:text-white mb-4">
<%- __('about.values.innovation.title') %>
</h3>
<p class="text-gray-600 dark:text-gray-300">
<%- __('about.values.innovation.description') %>
</p>
</div>
<!-- Quality -->
<div class="text-center p-8 bg-white dark:bg-gray-700 rounded-2xl shadow-lg">
<div class="w-16 h-16 bg-purple-100 dark:bg-purple-900 rounded-full flex items-center justify-center mx-auto mb-6">
<i class="fas fa-award text-purple-600 dark:text-purple-400 text-2xl"></i>
</div>
<h3 class="text-2xl font-bold text-gray-900 dark:text-white mb-4">
<%- __('about.values.quality.title') %>
</h3>
<p class="text-gray-600 dark:text-gray-300">
<%- __('about.values.quality.description') %>
</p>
</div>
<!-- Partnership -->
<div class="text-center p-8 bg-white dark:bg-gray-700 rounded-2xl shadow-lg">
<div class="w-16 h-16 bg-green-100 dark:bg-green-900 rounded-full flex items-center justify-center mx-auto mb-6">
<i class="fas fa-handshake text-green-600 dark:text-green-400 text-2xl"></i>
</div>
<h3 class="text-2xl font-bold text-gray-900 dark:text-white mb-4">
<%- __('about.values.partnership.title') %>
</h3>
<p class="text-gray-600 dark:text-gray-300">
<%- __('about.values.partnership.description') %>
</p>
</div>
</div>
</div>
</section>
<!-- CTA Section -->
<section class="py-20 cta-section">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 text-center">
<h2 class="text-4xl font-bold text-white mb-6">
<%- __('about.cta.title') %>
</h2>
<p class="text-xl text-blue-100 mb-8 max-w-3xl mx-auto">
<%- __('about.cta.subtitle') %>
</p>
<a href="/contact" class="inline-flex items-center px-8 py-4 bg-white text-blue-600 font-bold rounded-full text-lg hover:bg-gray-100 transition-colors transform hover:scale-105">
<%- __('about.cta.button') %>
<svg class="ml-2 w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 8l4 4m0 0l-4 4m4-4H3"></path>
</svg>
</a>
</div>
</section>
<%- include('partials/footer') %>
<!-- Scripts -->
<script>
// Theme initialization
document.addEventListener('DOMContentLoaded', function() {
const theme = localStorage.getItem('theme') || 'light';
document.documentElement.className = theme === 'dark' ? 'dark' : '';
});
</script>
</body>
</html>

677
views/calculator-old.ejs Normal file
View File

@@ -0,0 +1,677 @@
<!-- Calculator Header -->
<section class="bg-gradient-to-r from-blue-600 to-purple-600 py-16">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 text-center">
<h1 class="text-4xl md:text-5xl font-bold text-white mb-4" data-aos="fade-up">
프로젝트 견적 계산기
</h1>
<p class="text-xl text-blue-100 max-w-3xl mx-auto" data-aos="fade-up" data-aos-delay="200">
원하는 서비스와 요구사항을 선택하면 실시간으로 정확한 견적을 계산해드립니다
</p>
</div>
</section>
<!-- Calculator Form -->
<section class="py-16 bg-gray-50">
<div class="max-w-5xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="bg-white rounded-3xl shadow-2xl overflow-hidden">
<div class="p-8 md:p-12">
<form id="calculator-form">
<!-- Step 1: Service Selection -->
<div class="calculator-step active" id="step-1">
<div class="text-center mb-8">
<h2 class="text-3xl font-bold text-gray-900 mb-4">1단계: 서비스 선택</h2>
<p class="text-gray-600">필요한 서비스를 선택해주세요 (복수 선택 가능)</p>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 gap-6" id="services-grid">
<!-- Services will be loaded dynamically -->
</div>
<div class="text-center mt-8">
<button type="button" class="next-step bg-blue-600 text-white px-8 py-3 rounded-lg font-semibold hover:bg-blue-700 transition-colors disabled:bg-gray-300 disabled:cursor-not-allowed" disabled>
다음 단계
</button>
</div>
</div>
<!-- Step 2: Project Details -->
<div class="calculator-step" id="step-2">
<div class="text-center mb-8">
<h2 class="text-3xl font-bold text-gray-900 mb-4">2단계: 프로젝트 세부사항</h2>
<p class="text-gray-600">프로젝트의 복잡도와 일정을 선택해주세요</p>
</div>
<div class="space-y-8">
<!-- Project Complexity -->
<div>
<label class="block text-lg font-semibold text-gray-900 mb-4">프로젝트 복잡도</label>
<div class="grid grid-cols-1 md:grid-cols-4 gap-4">
<div class="complexity-option" data-value="simple">
<div class="p-4 border-2 border-gray-200 rounded-lg cursor-pointer hover:border-blue-500 transition-colors">
<div class="text-green-600 text-2xl mb-2">🌟</div>
<div class="font-semibold">간단함</div>
<div class="text-sm text-gray-600">기본 기능, 표준 디자인</div>
<div class="text-sm text-green-600 font-medium mt-2">-30% 할인</div>
</div>
</div>
<div class="complexity-option" data-value="medium">
<div class="p-4 border-2 border-gray-200 rounded-lg cursor-pointer hover:border-blue-500 transition-colors">
<div class="text-blue-600 text-2xl mb-2">⭐</div>
<div class="font-semibold">보통</div>
<div class="text-sm text-gray-600">중간 복잡도, 커스텀 기능</div>
<div class="text-sm text-blue-600 font-medium mt-2">표준 가격</div>
</div>
</div>
<div class="complexity-option" data-value="complex">
<div class="p-4 border-2 border-gray-200 rounded-lg cursor-pointer hover:border-blue-500 transition-colors">
<div class="text-orange-600 text-2xl mb-2">🚀</div>
<div class="font-semibold">복잡함</div>
<div class="text-sm text-gray-600">고급 기능, 통합 시스템</div>
<div class="text-sm text-orange-600 font-medium mt-2">+50% 추가</div>
</div>
</div>
<div class="complexity-option" data-value="enterprise">
<div class="p-4 border-2 border-gray-200 rounded-lg cursor-pointer hover:border-blue-500 transition-colors">
<div class="text-purple-600 text-2xl mb-2">💎</div>
<div class="font-semibold">엔터프라이즈</div>
<div class="text-sm text-gray-600">대규모, 높은 복잡도</div>
<div class="text-sm text-purple-600 font-medium mt-2">+100% 추가</div>
</div>
</div>
</div>
</div>
<!-- Timeline -->
<div>
<label class="block text-lg font-semibold text-gray-900 mb-4">희망 완료 시기</label>
<div class="grid grid-cols-1 md:grid-cols-4 gap-4">
<div class="timeline-option" data-value="rush">
<div class="p-4 border-2 border-gray-200 rounded-lg cursor-pointer hover:border-blue-500 transition-colors">
<div class="text-red-600 text-2xl mb-2">⚡</div>
<div class="font-semibold">긴급 (2주 이내)</div>
<div class="text-sm text-red-600 font-medium mt-2">+80% 추가</div>
</div>
</div>
<div class="timeline-option" data-value="fast">
<div class="p-4 border-2 border-gray-200 rounded-lg cursor-pointer hover:border-blue-500 transition-colors">
<div class="text-orange-600 text-2xl mb-2">🔥</div>
<div class="font-semibold">빠름 (2-4주)</div>
<div class="text-sm text-orange-600 font-medium mt-2">+40% 추가</div>
</div>
</div>
<div class="timeline-option selected" data-value="standard">
<div class="p-4 border-2 border-blue-500 rounded-lg cursor-pointer hover:border-blue-500 transition-colors bg-blue-50">
<div class="text-blue-600 text-2xl mb-2">⏰</div>
<div class="font-semibold">표준 (1-3개월)</div>
<div class="text-sm text-blue-600 font-medium mt-2">표준 가격</div>
</div>
</div>
<div class="timeline-option" data-value="flexible">
<div class="p-4 border-2 border-gray-200 rounded-lg cursor-pointer hover:border-blue-500 transition-colors">
<div class="text-green-600 text-2xl mb-2">🌱</div>
<div class="font-semibold">여유 (3개월+)</div>
<div class="text-sm text-green-600 font-medium mt-2">-20% 할인</div>
</div>
</div>
</div>
</div>
</div>
<div class="flex justify-between mt-8">
<button type="button" class="prev-step bg-gray-300 text-gray-700 px-8 py-3 rounded-lg font-semibold hover:bg-gray-400 transition-colors">
이전 단계
</button>
<button type="button" class="next-step bg-blue-600 text-white px-8 py-3 rounded-lg font-semibold hover:bg-blue-700 transition-colors disabled:bg-gray-300 disabled:cursor-not-allowed" disabled>
다음 단계
</button>
</div>
</div>
<!-- Step 3: Additional Features -->
<div class="calculator-step" id="step-3">
<div class="text-center mb-8">
<h2 class="text-3xl font-bold text-gray-900 mb-4">3단계: 추가 기능</h2>
<p class="text-gray-600">필요한 추가 기능을 선택해주세요 (선택사항)</p>
</div>
<div class="grid grid-cols-1 md:grid-cols-3 gap-6">
<div class="feature-option" data-value="seo-optimization" data-price="300000">
<div class="p-4 border-2 border-gray-200 rounded-lg cursor-pointer hover:border-blue-500 transition-colors">
<div class="flex items-center justify-between mb-3">
<span class="font-semibold">SEO 최적화</span>
<span class="text-blue-600 font-bold">₩300,000</span>
</div>
<p class="text-sm text-gray-600">검색엔진 최적화 및 메타 태그 설정</p>
</div>
</div>
<div class="feature-option" data-value="analytics-setup" data-price="150000">
<div class="p-4 border-2 border-gray-200 rounded-lg cursor-pointer hover:border-blue-500 transition-colors">
<div class="flex items-center justify-between mb-3">
<span class="font-semibold">분석 도구 설정</span>
<span class="text-blue-600 font-bold">₩150,000</span>
</div>
<p class="text-sm text-gray-600">Google Analytics, 태그 매니저 설정</p>
</div>
</div>
<div class="feature-option" data-value="social-integration" data-price="200000">
<div class="p-4 border-2 border-gray-200 rounded-lg cursor-pointer hover:border-blue-500 transition-colors">
<div class="flex items-center justify-between mb-3">
<span class="font-semibold">소셜 미디어 연동</span>
<span class="text-blue-600 font-bold">₩200,000</span>
</div>
<p class="text-sm text-gray-600">Facebook, Instagram, 카카오톡 연동</p>
</div>
</div>
<div class="feature-option" data-value="payment-gateway" data-price="500000">
<div class="p-4 border-2 border-gray-200 rounded-lg cursor-pointer hover:border-blue-500 transition-colors">
<div class="flex items-center justify-between mb-3">
<span class="font-semibold">결제 시스템</span>
<span class="text-blue-600 font-bold">₩500,000</span>
</div>
<p class="text-sm text-gray-600">신용카드, 간편결제 시스템 연동</p>
</div>
</div>
<div class="feature-option" data-value="multilingual" data-price="400000">
<div class="p-4 border-2 border-gray-200 rounded-lg cursor-pointer hover:border-blue-500 transition-colors">
<div class="flex items-center justify-between mb-3">
<span class="font-semibold">다국어 지원</span>
<span class="text-blue-600 font-bold">₩400,000</span>
</div>
<p class="text-sm text-gray-600">한국어, 영어, 중국어 등 다국어</p>
</div>
</div>
<div class="feature-option" data-value="admin-panel" data-price="600000">
<div class="p-4 border-2 border-gray-200 rounded-lg cursor-pointer hover:border-blue-500 transition-colors">
<div class="flex items-center justify-between mb-3">
<span class="font-semibold">관리자 패널</span>
<span class="text-blue-600 font-bold">₩600,000</span>
</div>
<p class="text-sm text-gray-600">콘텐츠 관리, 사용자 관리 시스템</p>
</div>
</div>
</div>
<!-- Custom Requirements -->
<div class="mt-8">
<label class="block text-lg font-semibold text-gray-900 mb-4">특별 요구사항</label>
<textarea id="custom-requirements" rows="4" placeholder="특별한 기능이나 요구사항이 있다면 자세히 설명해주세요..." class="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent resize-none"></textarea>
</div>
<div class="flex justify-between mt-8">
<button type="button" class="prev-step bg-gray-300 text-gray-700 px-8 py-3 rounded-lg font-semibold hover:bg-gray-400 transition-colors">
이전 단계
</button>
<button type="button" class="calculate-btn bg-green-600 text-white px-8 py-3 rounded-lg font-semibold hover:bg-green-700 transition-colors">
견적 계산하기
</button>
</div>
</div>
<!-- Step 4: Results -->
<div class="calculator-step" id="step-4">
<div class="text-center mb-8">
<h2 class="text-3xl font-bold text-gray-900 mb-4">견적 결과</h2>
<p class="text-gray-600">계산된 프로젝트 견적을 확인하세요</p>
</div>
<div id="calculation-results" class="space-y-6">
<!-- Results will be loaded here -->
</div>
<!-- Contact Form -->
<div class="mt-12 bg-gray-50 p-8 rounded-2xl">
<h3 class="text-2xl font-bold text-gray-900 mb-6 text-center">견적 요청하기</h3>
<p class="text-gray-600 text-center mb-6">정확한 견적을 받으시려면 연락처를 남겨주세요</p>
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
<div>
<input type="text" id="contact-name" placeholder="이름" required class="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent">
</div>
<div>
<input type="email" id="contact-email" placeholder="이메일" required class="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent">
</div>
<div>
<input type="tel" id="contact-phone" placeholder="연락처" class="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent">
</div>
<div>
<input type="text" id="contact-company" placeholder="회사명 (선택사항)" class="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent">
</div>
</div>
<div class="mt-6">
<textarea id="project-description" rows="4" placeholder="프로젝트에 대해 자세히 설명해주세요..." required class="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent resize-none"></textarea>
</div>
<div class="text-center mt-6">
<button type="button" id="submit-estimate" class="bg-blue-600 text-white px-8 py-3 rounded-lg font-semibold hover:bg-blue-700 transition-colors">
견적 요청 보내기
</button>
</div>
</div>
<div class="flex justify-center mt-8">
<button type="button" class="restart-calculator bg-gray-300 text-gray-700 px-8 py-3 rounded-lg font-semibold hover:bg-gray-400 transition-colors">
다시 계산하기
</button>
</div>
</div>
</form>
</div>
</div>
</div>
</section>
<!-- Calculator JavaScript -->
<script>
document.addEventListener('DOMContentLoaded', function() {
let currentStep = 1;
let selectedServices = [];
let selectedComplexity = 'medium';
let selectedTimeline = 'standard';
let selectedFeatures = [];
let customRequirements = '';
let calculationResult = null;
// Load services
loadServices();
// Event listeners
document.addEventListener('click', function(e) {
if (e.target.classList.contains('next-step')) {
nextStep();
} else if (e.target.classList.contains('prev-step')) {
prevStep();
} else if (e.target.classList.contains('calculate-btn')) {
calculateEstimate();
} else if (e.target.classList.contains('restart-calculator')) {
restartCalculator();
} else if (e.target.closest('.service-option')) {
toggleService(e.target.closest('.service-option'));
} else if (e.target.closest('.complexity-option')) {
selectComplexity(e.target.closest('.complexity-option'));
} else if (e.target.closest('.timeline-option')) {
selectTimeline(e.target.closest('.timeline-option'));
} else if (e.target.closest('.feature-option')) {
toggleFeature(e.target.closest('.feature-option'));
}
});
document.getElementById('submit-estimate').addEventListener('click', submitEstimate);
async function loadServices() {
try {
const response = await fetch('/api/calculator/services');
const data = await response.json();
if (data.success) {
displayServices(data.allServices);
}
} catch (error) {
console.error('Error loading services:', error);
// Display default services
displayDefaultServices();
}
}
function displayServices(services) {
const container = document.getElementById('services-grid');
container.innerHTML = '';
services.forEach(service => {
const serviceDiv = document.createElement('div');
serviceDiv.className = 'service-option';
serviceDiv.dataset.serviceId = service._id;
serviceDiv.innerHTML = `
<div class="p-6 border-2 border-gray-200 rounded-lg cursor-pointer hover:border-blue-500 transition-colors">
<div class="flex items-center justify-between mb-4">
<h3 class="text-lg font-semibold">${service.name}</h3>
<span class="text-blue-600 font-bold">₩${service.pricing.basePrice.toLocaleString()}</span>
</div>
<p class="text-gray-600 text-sm mb-4">${service.shortDescription}</p>
<div class="flex items-center justify-between">
<span class="px-3 py-1 bg-blue-100 text-blue-600 text-xs rounded-full">${service.category}</span>
<span class="text-xs text-gray-500">${service.estimatedTime.min}-${service.estimatedTime.max} ${service.estimatedTime.unit}</span>
</div>
</div>
`;
container.appendChild(serviceDiv);
});
}
function displayDefaultServices() {
const container = document.getElementById('services-grid');
container.innerHTML = `
<div class="service-option" data-service-id="web-dev">
<div class="p-6 border-2 border-gray-200 rounded-lg cursor-pointer hover:border-blue-500 transition-colors">
<div class="flex items-center justify-between mb-4">
<h3 class="text-lg font-semibold">웹 개발</h3>
<span class="text-blue-600 font-bold">₩500,000</span>
</div>
<p class="text-gray-600 text-sm mb-4">현대적이고 반응형 웹사이트 개발</p>
<div class="flex items-center justify-between">
<span class="px-3 py-1 bg-blue-100 text-blue-600 text-xs rounded-full">development</span>
<span class="text-xs text-gray-500">2-8 weeks</span>
</div>
</div>
</div>
<div class="service-option" data-service-id="mobile-app">
<div class="p-6 border-2 border-gray-200 rounded-lg cursor-pointer hover:border-blue-500 transition-colors">
<div class="flex items-center justify-between mb-4">
<h3 class="text-lg font-semibold">모바일 앱</h3>
<span class="text-blue-600 font-bold">₩800,000</span>
</div>
<p class="text-gray-600 text-sm mb-4">iOS/Android 네이티브 앱 개발</p>
<div class="flex items-center justify-between">
<span class="px-3 py-1 bg-blue-100 text-blue-600 text-xs rounded-full">development</span>
<span class="text-xs text-gray-500">4-12 weeks</span>
</div>
</div>
</div>
`;
}
function toggleService(element) {
const serviceId = element.dataset.serviceId;
const border = element.querySelector('div');
if (selectedServices.includes(serviceId)) {
selectedServices = selectedServices.filter(id => id !== serviceId);
border.classList.remove('border-blue-500', 'bg-blue-50');
border.classList.add('border-gray-200');
} else {
selectedServices.push(serviceId);
border.classList.remove('border-gray-200');
border.classList.add('border-blue-500', 'bg-blue-50');
}
updateStepButtons();
}
function selectComplexity(element) {
document.querySelectorAll('.complexity-option').forEach(el => {
el.querySelector('div').classList.remove('border-blue-500', 'bg-blue-50');
el.querySelector('div').classList.add('border-gray-200');
});
selectedComplexity = element.dataset.value;
element.querySelector('div').classList.remove('border-gray-200');
element.querySelector('div').classList.add('border-blue-500', 'bg-blue-50');
updateStepButtons();
}
function selectTimeline(element) {
document.querySelectorAll('.timeline-option').forEach(el => {
el.querySelector('div').classList.remove('border-blue-500', 'bg-blue-50');
el.querySelector('div').classList.add('border-gray-200');
});
selectedTimeline = element.dataset.value;
element.querySelector('div').classList.remove('border-gray-200');
element.querySelector('div').classList.add('border-blue-500', 'bg-blue-50');
updateStepButtons();
}
function toggleFeature(element) {
const featureValue = element.dataset.value;
const border = element.querySelector('div');
if (selectedFeatures.includes(featureValue)) {
selectedFeatures = selectedFeatures.filter(f => f !== featureValue);
border.classList.remove('border-blue-500', 'bg-blue-50');
border.classList.add('border-gray-200');
} else {
selectedFeatures.push(featureValue);
border.classList.remove('border-gray-200');
border.classList.add('border-blue-500', 'bg-blue-50');
}
}
function updateStepButtons() {
const nextButton = document.querySelector(`#step-${currentStep} .next-step`);
if (nextButton) {
if (currentStep === 1) {
nextButton.disabled = selectedServices.length === 0;
} else if (currentStep === 2) {
nextButton.disabled = !selectedComplexity || !selectedTimeline;
}
}
}
function nextStep() {
if (currentStep < 4) {
document.getElementById(`step-${currentStep}`).classList.remove('active');
currentStep++;
document.getElementById(`step-${currentStep}`).classList.add('active');
updateStepButtons();
}
}
function prevStep() {
if (currentStep > 1) {
document.getElementById(`step-${currentStep}`).classList.remove('active');
currentStep--;
document.getElementById(`step-${currentStep}`).classList.add('active');
updateStepButtons();
}
}
async function calculateEstimate() {
customRequirements = document.getElementById('custom-requirements').value;
const requestData = {
selectedServices,
projectComplexity: selectedComplexity,
timeline: selectedTimeline,
additionalFeatures: selectedFeatures,
customRequirements
};
try {
const response = await fetch('/api/calculator/calculate', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(requestData)
});
const data = await response.json();
if (data.success) {
calculationResult = data.estimate;
displayResults(data.estimate, data.selectedServices);
nextStep();
} else {
alert('견적 계산 중 오류가 발생했습니다: ' + data.message);
}
} catch (error) {
console.error('Calculation error:', error);
alert('견적 계산 중 오류가 발생했습니다. 다시 시도해주세요.');
}
}
function displayResults(estimate, services) {
const container = document.getElementById('calculation-results');
container.innerHTML = `
<div class="bg-gradient-to-r from-blue-600 to-purple-600 text-white p-8 rounded-2xl text-center">
<h3 class="text-3xl font-bold mb-2">예상 견적</h3>
<div class="text-5xl font-bold mb-4">${estimate.range.formatted}</div>
<div class="text-lg">예상 소요시간: ${estimate.timeline.formatted}</div>
<div class="text-sm mt-2 opacity-80">신뢰도: ${estimate.confidence}%</div>
</div>
<div class="bg-white border-2 border-gray-200 rounded-2xl p-6">
<h4 class="text-xl font-bold mb-4">견적 상세 내역</h4>
<div class="space-y-3">
<div class="flex justify-between">
<span>기본 서비스</span>
<span class="font-semibold">₩${estimate.breakdown.baseServices.toLocaleString()}</span>
</div>
${estimate.breakdown.complexityAdjustment !== 0 ? `
<div class="flex justify-between">
<span>복잡도 조정</span>
<span class="font-semibold ${estimate.breakdown.complexityAdjustment > 0 ? 'text-red-600' : 'text-green-600'}">
${estimate.breakdown.complexityAdjustment > 0 ? '+' : ''}₩${estimate.breakdown.complexityAdjustment.toLocaleString()}
</span>
</div>
` : ''}
${estimate.breakdown.timelineAdjustment !== 0 ? `
<div class="flex justify-between">
<span>일정 조정</span>
<span class="font-semibold ${estimate.breakdown.timelineAdjustment > 0 ? 'text-red-600' : 'text-green-600'}">
${estimate.breakdown.timelineAdjustment > 0 ? '+' : ''}₩${estimate.breakdown.timelineAdjustment.toLocaleString()}
</span>
</div>
` : ''}
${estimate.breakdown.additionalFeatures > 0 ? `
<div class="flex justify-between">
<span>추가 기능</span>
<span class="font-semibold">+₩${estimate.breakdown.additionalFeatures.toLocaleString()}</span>
</div>
` : ''}
${estimate.breakdown.customRequirements > 0 ? `
<div class="flex justify-between">
<span>특별 요구사항</span>
<span class="font-semibold">+₩${estimate.breakdown.customRequirements.toLocaleString()}</span>
</div>
` : ''}
<hr class="my-3">
<div class="flex justify-between text-lg font-bold">
<span>총 예상 비용</span>
<span>₩${estimate.total.toLocaleString()}</span>
</div>
</div>
</div>
${estimate.recommendations && estimate.recommendations.length > 0 ? `
<div class="bg-yellow-50 border-2 border-yellow-200 rounded-2xl p-6">
<h4 class="text-xl font-bold mb-4 text-yellow-800">추천 사항</h4>
<ul class="space-y-2">
${estimate.recommendations.map(rec => `<li class="flex items-start"><span class="text-yellow-600 mr-2">•</span>${rec}</li>`).join('')}
</ul>
</div>
` : ''}
<div class="bg-gray-50 rounded-2xl p-6">
<h4 class="text-xl font-bold mb-4">선택된 서비스</h4>
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
${services.map(service => `
<div class="flex justify-between items-center p-3 bg-white rounded-lg">
<span>${service.name}</span>
<span class="font-semibold text-blue-600">₩${service.basePrice.toLocaleString()}</span>
</div>
`).join('')}
</div>
</div>
`;
}
async function submitEstimate() {
const name = document.getElementById('contact-name').value;
const email = document.getElementById('contact-email').value;
const phone = document.getElementById('contact-phone').value;
const company = document.getElementById('contact-company').value;
const description = document.getElementById('project-description').value;
if (!name || !email || !description) {
alert('이름, 이메일, 프로젝트 설명은 필수 입력 항목입니다.');
return;
}
const requestData = {
services: selectedServices,
projectType: 'custom',
timeline: selectedTimeline,
budget: calculationResult ? calculationResult.range.formatted : '',
description,
contactInfo: {
name,
email,
phone,
company
}
};
try {
const response = await fetch('/api/contact/estimate', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(requestData)
});
const data = await response.json();
if (data.success) {
alert('견적 요청이 성공적으로 전송되었습니다! 곧 연락드리겠습니다.');
// Reset form or redirect
} else {
alert('견적 요청 전송 중 오류가 발생했습니다: ' + data.message);
}
} catch (error) {
console.error('Submit error:', error);
alert('견적 요청 전송 중 오류가 발생했습니다. 다시 시도해주세요.');
}
}
function restartCalculator() {
currentStep = 1;
selectedServices = [];
selectedComplexity = 'medium';
selectedTimeline = 'standard';
selectedFeatures = [];
customRequirements = '';
calculationResult = null;
// Reset UI
document.querySelectorAll('.calculator-step').forEach(step => step.classList.remove('active'));
document.getElementById('step-1').classList.add('active');
// Reset selections
document.querySelectorAll('.service-option, .complexity-option, .timeline-option, .feature-option').forEach(el => {
const border = el.querySelector('div');
border.classList.remove('border-blue-500', 'bg-blue-50');
border.classList.add('border-gray-200');
});
// Set default timeline selection
document.querySelector('.timeline-option[data-value="standard"] div').classList.remove('border-gray-200');
document.querySelector('.timeline-option[data-value="standard"] div').classList.add('border-blue-500', 'bg-blue-50');
// Clear form inputs
document.getElementById('custom-requirements').value = '';
document.getElementById('contact-name').value = '';
document.getElementById('contact-email').value = '';
document.getElementById('contact-phone').value = '';
document.getElementById('contact-company').value = '';
document.getElementById('project-description').value = '';
updateStepButtons();
}
});
</script>
<style>
.calculator-step {
display: none;
}
.calculator-step.active {
display: block;
}
.service-option, .complexity-option, .timeline-option, .feature-option {
transition: all 0.3s ease;
}
.service-option:hover, .complexity-option:hover, .timeline-option:hover, .feature-option:hover {
transform: translateY(-2px);
}
</style>

302
views/calculator.ejs Normal file
View File

@@ -0,0 +1,302 @@
<!DOCTYPE html>
<html lang="<%= locale %>" class="<%= theme === 'dark' ? 'dark' : '' %>">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><%- __('calculator.meta.title') %> - SmartSolTech</title>
<!-- SEO Meta Tags -->
<meta name="description" content="<%- __('calculator.meta.description') %>">
<!-- Styles -->
<link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
<link href="/css/main.css" rel="stylesheet">
<link href="/css/fixes.css" rel="stylesheet">
<link href="/css/dark-theme.css" rel="stylesheet">
</head>
<body class="font-sans dark:bg-gray-900 dark:text-gray-100">
<%- include('partials/navigation') %>
<!-- Calculator Header -->
<section class="relative bg-gradient-to-r from-blue-600 to-purple-600 dark:from-blue-800 dark:to-purple-800 py-20 mt-16 hero-section">
<div class="absolute inset-0 bg-black opacity-20"></div>
<div class="relative max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 text-center">
<h1 class="text-4xl md:text-5xl font-bold text-white mb-4">
<%- __('calculator.title') %>
</h1>
<p class="text-xl text-blue-100 max-w-3xl mx-auto">
<%- __('calculator.subtitle') %>
</p>
</div>
</section>
<!-- Calculator Form -->
<section class="py-16 bg-gray-50 dark:bg-gray-800">
<div class="max-w-5xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="bg-white dark:bg-gray-900 rounded-3xl shadow-2xl overflow-hidden">
<div class="p-8 md:p-12">
<!-- Progress Bar -->
<div class="calculator-progress mb-8">
<div class="calculator-progress-bar step-1"></div>
</div>
<form id="calculator-form">
<!-- Step 1: Service Selection -->
<div class="calculator-step active" id="step-1">
<div class="text-center mb-8">
<h2 class="text-3xl font-bold text-gray-900 dark:text-white mb-4">
<%- __('calculator.step1.title') %>
</h2>
<p class="text-gray-600 dark:text-gray-300">
<%- __('calculator.step1.subtitle') %>
</p>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 gap-6" id="services-grid">
<!-- Web Development -->
<div class="service-option p-6 border-2 border-gray-200 dark:border-gray-600 rounded-xl cursor-pointer hover:border-blue-500 dark:hover:border-blue-400 transition-all bg-gray-50 dark:bg-gray-800" data-service="web" data-base-price="500000">
<div class="flex items-center mb-4">
<div class="w-12 h-12 bg-blue-100 dark:bg-blue-900 rounded-lg flex items-center justify-center mr-4">
<i class="fas fa-code text-blue-600 dark:text-blue-400 text-xl"></i>
</div>
<div>
<h3 class="text-lg font-semibold text-gray-900 dark:text-white">
<%- __('services.web.title') %>
</h3>
<div class="text-blue-600 dark:text-blue-400 font-bold"><%- __('services.web.price') %></div>
</div>
</div>
<p class="text-gray-600 dark:text-gray-300 text-sm">
<%- __('services.web.description') %>
</p>
</div>
<!-- Mobile App -->
<div class="service-option p-6 border-2 border-gray-200 dark:border-gray-600 rounded-xl cursor-pointer hover:border-blue-500 dark:hover:border-blue-400 transition-all bg-gray-50 dark:bg-gray-800" data-service="mobile" data-base-price="800000">
<div class="flex items-center mb-4">
<div class="w-12 h-12 bg-green-100 dark:bg-green-900 rounded-lg flex items-center justify-center mr-4">
<i class="fas fa-mobile-alt text-green-600 dark:text-green-400 text-xl"></i>
</div>
<div>
<h3 class="text-lg font-semibold text-gray-900 dark:text-white">
<%- __('services.mobile.title') %>
</h3>
<div class="text-green-600 dark:text-green-400 font-bold"><%- __('services.mobile.price') %></div>
</div>
</div>
<p class="text-gray-600 dark:text-gray-300 text-sm">
<%- __('services.mobile.description') %>
</p>
</div>
<!-- UI/UX Design -->
<div class="service-option p-6 border-2 border-gray-200 dark:border-gray-600 rounded-xl cursor-pointer hover:border-blue-500 dark:hover:border-blue-400 transition-all bg-gray-50 dark:bg-gray-800" data-service="design" data-base-price="300000">
<div class="flex items-center mb-4">
<div class="w-12 h-12 bg-purple-100 dark:bg-purple-900 rounded-lg flex items-center justify-center mr-4">
<i class="fas fa-palette text-purple-600 dark:text-purple-400 text-xl"></i>
</div>
<div>
<h3 class="text-lg font-semibold text-gray-900 dark:text-white">
<%- __('services.design.title') %>
</h3>
<div class="text-purple-600 dark:text-purple-400 font-bold"><%- __('services.design.price') %></div>
</div>
</div>
<p class="text-gray-600 dark:text-gray-300 text-sm">
<%- __('services.design.description') %>
</p>
</div>
<!-- Digital Marketing -->
<div class="service-option p-6 border-2 border-gray-200 dark:border-gray-600 rounded-xl cursor-pointer hover:border-blue-500 dark:hover:border-blue-400 transition-all bg-gray-50 dark:bg-gray-800" data-service="marketing" data-base-price="200000">
<div class="flex items-center mb-4">
<div class="w-12 h-12 bg-yellow-100 dark:bg-yellow-900 rounded-lg flex items-center justify-center mr-4">
<i class="fas fa-chart-line text-yellow-600 dark:text-yellow-400 text-xl"></i>
</div>
<div>
<h3 class="text-lg font-semibold text-gray-900 dark:text-white">
<%- __('services.marketing.title') %>
</h3>
<div class="text-yellow-600 dark:text-yellow-400 font-bold"><%- __('services.marketing.price') %></div>
</div>
</div>
<p class="text-gray-600 dark:text-gray-300 text-sm">
<%- __('services.marketing.description') %>
</p>
</div>
</div>
<div class="text-center mt-8">
<button type="button" class="next-step bg-blue-600 dark:bg-blue-500 text-white px-8 py-3 rounded-lg font-semibold hover:bg-blue-700 dark:hover:bg-blue-400 transition-colors disabled:bg-gray-300 disabled:cursor-not-allowed" disabled>
<%- __('calculator.next_step') %>
</button>
</div>
</div>
<!-- Step 2: Project Details -->
<div class="calculator-step" id="step-2" style="display: none;">
<div class="text-center mb-8">
<h2 class="text-3xl font-bold text-gray-900 dark:text-white mb-4">
<%- __('calculator.step2.title') %>
</h2>
<p class="text-gray-600 dark:text-gray-300">
<%- __('calculator.step2.subtitle') %>
</p>
</div>
<div class="space-y-8">
<!-- Project Complexity -->
<div>
<label class="block text-lg font-semibold text-gray-900 dark:text-white mb-4">
<%- __('calculator.complexity.title') %>
</label>
<div class="grid grid-cols-1 md:grid-cols-3 gap-4">
<div class="complexity-option p-4 border-2 border-gray-200 dark:border-gray-600 rounded-lg cursor-pointer hover:border-blue-500 dark:hover:border-blue-400 transition-colors bg-gray-50 dark:bg-gray-800" data-value="simple" data-multiplier="1">
<div class="text-center">
<div class="text-2xl mb-2">🟢</div>
<h4 class="font-semibold text-gray-900 dark:text-white"><%- __('calculator.complexity.simple') %></h4>
<p class="text-sm text-gray-600 dark:text-gray-300 mt-2"><%- __('calculator.complexity.simple_desc') %></p>
</div>
</div>
<div class="complexity-option p-4 border-2 border-gray-200 dark:border-gray-600 rounded-lg cursor-pointer hover:border-blue-500 dark:hover:border-blue-400 transition-colors bg-gray-50 dark:bg-gray-800" data-value="medium" data-multiplier="1.5">
<div class="text-center">
<div class="text-2xl mb-2">🟡</div>
<h4 class="font-semibold text-gray-900 dark:text-white"><%- __('calculator.complexity.medium') %></h4>
<p class="text-sm text-gray-600 dark:text-gray-300 mt-2"><%- __('calculator.complexity.medium_desc') %></p>
</div>
</div>
<div class="complexity-option p-4 border-2 border-gray-200 dark:border-gray-600 rounded-lg cursor-pointer hover:border-blue-500 dark:hover:border-blue-400 transition-colors bg-gray-50 dark:bg-gray-800" data-value="complex" data-multiplier="2.5">
<div class="text-center">
<div class="text-2xl mb-2">🔴</div>
<h4 class="font-semibold text-gray-900 dark:text-white"><%- __('calculator.complexity.complex') %></h4>
<p class="text-sm text-gray-600 dark:text-gray-300 mt-2"><%- __('calculator.complexity.complex_desc') %></p>
</div>
</div>
</div>
</div>
<!-- Timeline -->
<div>
<label class="block text-lg font-semibold text-gray-900 dark:text-white mb-4">
<%- __('calculator.timeline.title') %>
</label>
<div class="grid grid-cols-1 md:grid-cols-3 gap-4">
<div class="timeline-option p-4 border-2 border-gray-200 dark:border-gray-600 rounded-lg cursor-pointer hover:border-blue-500 dark:hover:border-blue-400 transition-colors bg-gray-50 dark:bg-gray-800" data-value="standard" data-multiplier="1">
<div class="text-center">
<div class="text-2xl mb-2">📅</div>
<h4 class="font-semibold text-gray-900 dark:text-white"><%- __('calculator.timeline.standard') %></h4>
<p class="text-sm text-gray-600 dark:text-gray-300 mt-2"><%- __('calculator.timeline.standard_desc') %></p>
</div>
</div>
<div class="timeline-option p-4 border-2 border-gray-200 dark:border-gray-600 rounded-lg cursor-pointer hover:border-blue-500 dark:hover:border-blue-400 transition-colors bg-gray-50 dark:bg-gray-800" data-value="rush" data-multiplier="1.5">
<div class="text-center">
<div class="text-2xl mb-2">⚡</div>
<h4 class="font-semibold text-gray-900 dark:text-white"><%- __('calculator.timeline.rush') %></h4>
<p class="text-sm text-gray-600 dark:text-gray-300 mt-2"><%- __('calculator.timeline.rush_desc') %></p>
</div>
</div>
<div class="timeline-option p-4 border-2 border-gray-200 dark:border-gray-600 rounded-lg cursor-pointer hover:border-blue-500 dark:hover:border-blue-400 transition-colors bg-gray-50 dark:bg-gray-800" data-value="extended" data-multiplier="0.8">
<div class="text-center">
<div class="text-2xl mb-2">🗓️</div>
<h4 class="font-semibold text-gray-900 dark:text-white"><%- __('calculator.timeline.extended') %></h4>
<p class="text-sm text-gray-600 dark:text-gray-300 mt-2"><%- __('calculator.timeline.extended_desc') %></p>
</div>
</div>
</div>
</div>
</div>
<div class="flex justify-between mt-8">
<button type="button" class="prev-step bg-gray-600 text-white px-8 py-3 rounded-lg font-semibold hover:bg-gray-700 transition-colors">
<%- __('calculator.prev_step') %>
</button>
<button type="button" class="next-step bg-blue-600 dark:bg-blue-500 text-white px-8 py-3 rounded-lg font-semibold hover:bg-blue-700 dark:hover:bg-blue-400 transition-colors disabled:bg-gray-300 disabled:cursor-not-allowed" disabled>
<%- __('calculator.calculate') %>
</button>
</div>
</div>
<!-- Step 3: Results -->
<div class="calculator-step" id="step-3" style="display: none;">
<div class="text-center mb-8">
<h2 class="text-3xl font-bold text-gray-900 dark:text-white mb-4">
<%- __('calculator.result.title') %>
</h2>
<p class="text-gray-600 dark:text-gray-300">
<%- __('calculator.result.subtitle') %>
</p>
</div>
<div class="max-w-2xl mx-auto">
<!-- Price Display -->
<div class="bg-gradient-to-r from-blue-600 to-purple-600 rounded-2xl p-8 text-white text-center mb-8">
<h3 class="text-2xl font-bold mb-4"><%- __('calculator.result.estimated_price') %></h3>
<div class="text-5xl font-bold" id="final-price">₩0</div>
<p class="mt-4 text-blue-100"><%- __('calculator.result.price_note') %></p>
</div>
<!-- Project Summary -->
<div class="bg-white dark:bg-gray-800 rounded-xl p-6 shadow-lg mb-8">
<h4 class="text-xl font-bold text-gray-900 dark:text-white mb-4"><%- __('calculator.result.summary') %></h4>
<div id="project-summary" class="space-y-2 text-gray-600 dark:text-gray-300">
<!-- Summary will be populated by JavaScript -->
</div>
</div>
<!-- Action Buttons -->
<div class="text-center space-y-4">
<div class="flex flex-col sm:flex-row gap-4 justify-center">
<a href="/contact" class="inline-flex items-center px-8 py-3 bg-blue-600 dark:bg-blue-500 text-white font-semibold rounded-lg hover:bg-blue-700 dark:hover:bg-blue-400 transition-colors">
<i class="fas fa-paper-plane mr-2"></i>
<%- __('calculator.result.get_quote') %>
</a>
<button type="button" class="restart-calculator inline-flex items-center px-8 py-3 border-2 border-blue-600 dark:border-blue-400 text-blue-600 dark:text-blue-400 font-semibold rounded-lg hover:bg-blue-600 hover:text-white dark:hover:bg-blue-400 dark:hover:text-gray-900 transition-colors">
<i class="fas fa-redo mr-2"></i>
<%- __('calculator.result.recalculate') %>
</button>
</div>
<p class="text-sm text-gray-500 dark:text-gray-400">
<%- __('calculator.result.contact_note') %>
</p>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</section>
<%- include('partials/footer') %>
<!-- Scripts -->
<script src="/js/calculator.js"></script>
<script>
// Localized service names for calculator
window.calculatorTranslations = {
services: {
web: '<%- __("services.web.title") %>',
mobile: '<%- __("services.mobile.title") %>',
design: '<%- __("services.design.title") %>',
marketing: '<%- __("services.marketing.title") %>'
},
complexity: {
simple: '<%- __("calculator.complexity.simple") %>',
medium: '<%- __("calculator.complexity.medium") %>',
complex: '<%- __("calculator.complexity.complex") %>'
},
timeline: {
standard: '<%- __("calculator.timeline.standard") %>',
rush: '<%- __("calculator.timeline.rush") %>',
extended: '<%- __("calculator.timeline.extended") %>'
},
labels: {
selected_services: '<%- __("calculator.result.selected_services") %>',
complexity: '<%- __("calculator.result.complexity") %>',
timeline: '<%- __("calculator.result.timeline") %>'
}
};
</script>
</body>
</html>

491
views/contact-old.ejs Normal file
View File

@@ -0,0 +1,491 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>연락처 - SmartSolTech</title>
<!-- SEO Meta Tags -->
<meta name="description" content="SmartSolTech에 연락하세요. 프로젝트 문의, 상담 요청, 파트너십 제안 등 언제든지 연락 주시면 빠르게 답변드리겠습니다.">
<meta name="keywords" content="연락처, 문의, 상담, 프로젝트, SmartSolTech, 컨설팅">
<!-- Open Graph -->
<meta property="og:title" content="연락처 - SmartSolTech">
<meta property="og:description" content="SmartSolTech에 연락하세요. 프로젝트 문의 및 상담 요청">
<meta property="og:type" content="website">
<!-- PWA -->
<meta name="theme-color" content="#3B82F6">
<link rel="manifest" href="/manifest.json">
<link rel="apple-touch-icon" href="/images/icons/icon-192x192.png">
<!-- Styles -->
<link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
<link href="https://unpkg.com/aos@2.3.1/dist/aos.css" rel="stylesheet">
<link href="/css/main.css" rel="stylesheet">
<link href="/css/fixes.css" rel="stylesheet">
</head>
<body>
<%- include('partials/navigation') %>
<!-- Contact Hero Section -->
<section class="hero-section bg-gradient-to-br from-blue-600 via-purple-600 to-blue-800 pt-20">
<div class="container mx-auto px-4 py-20 text-center text-white">
<h1 class="text-5xl md:text-6xl font-bold mb-6" data-aos="fade-up">
<span class="text-yellow-300">연락처</span>
</h1>
<p class="text-xl md:text-2xl mb-8 opacity-90" data-aos="fade-up" data-aos-delay="200">
프로젝트 문의부터 기술 상담까지, 언제든 연락주세요
</p>
</div>
</section>
<!-- Contact Content -->
<section class="section-padding">
<div class="container mx-auto px-4">
<div class="grid grid-cols-1 lg:grid-cols-2 gap-12">
<!-- Contact Form -->
<div class="bg-white rounded-2xl shadow-xl p-8" data-aos="fade-right">
<div class="mb-8">
<h2 class="text-3xl font-bold text-gray-900 mb-4">
프로젝트 문의하기
</h2>
<p class="text-gray-600">
아래 양식을 작성해 주시면 24시간 내에 답변드리겠습니다.
</p>
</div>
<form id="contact-form" class="space-y-6">
<!-- Name & Email Row -->
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
<div>
<label for="name" class="block text-sm font-medium text-gray-700 mb-2">
이름 *
</label>
<input type="text"
id="name"
name="name"
required
class="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors"
placeholder="홍길동">
</div>
<div>
<label for="email" class="block text-sm font-medium text-gray-700 mb-2">
이메일 *
</label>
<input type="email"
id="email"
name="email"
required
class="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors"
placeholder="example@email.com">
</div>
</div>
<!-- Phone & Company -->
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
<div>
<label for="phone" class="block text-sm font-medium text-gray-700 mb-2">
전화번호
</label>
<input type="tel"
id="phone"
name="phone"
class="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors"
placeholder="010-1234-5678">
</div>
<div>
<label for="company" class="block text-sm font-medium text-gray-700 mb-2">
회사명
</label>
<input type="text"
id="company"
name="company"
class="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors"
placeholder="회사명을 입력하세요">
</div>
</div>
<!-- Service Type -->
<div>
<label for="service" class="block text-sm font-medium text-gray-700 mb-2">
관심 있는 서비스 *
</label>
<select id="service"
name="service"
required
class="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors">
<option value="">서비스를 선택해 주세요</option>
<option value="web-development">웹 개발</option>
<option value="mobile-app">모바일 앱 개발</option>
<option value="ui-ux-design">UI/UX 디자인</option>
<option value="branding">브랜딩</option>
<option value="digital-marketing">디지털 마케팅</option>
<option value="consulting">기술 컨설팅</option>
<option value="other">기타</option>
</select>
</div>
<!-- Budget -->
<div>
<label for="budget" class="block text-sm font-medium text-gray-700 mb-2">
예산 범위
</label>
<select id="budget"
name="budget"
class="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors">
<option value="">예산을 선택해 주세요</option>
<option value="under-500">50만원 미만</option>
<option value="500-1000">50-100만원</option>
<option value="1000-3000">100-300만원</option>
<option value="3000-5000">300-500만원</option>
<option value="5000-10000">500-1000만원</option>
<option value="over-10000">1000만원 이상</option>
<option value="discuss">상담 후 결정</option>
</select>
</div>
<!-- Message -->
<div>
<label for="message" class="block text-sm font-medium text-gray-700 mb-2">
프로젝트 상세 내용 *
</label>
<textarea id="message"
name="message"
required
rows="6"
class="w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 transition-colors resize-vertical"
placeholder="프로젝트에 대한 자세한 내용, 요구사항, 일정 등을 알려주세요..."></textarea>
</div>
<!-- Privacy Agreement -->
<div class="flex items-start">
<input type="checkbox"
id="privacy"
name="privacy"
required
class="mt-1 mr-3 h-4 w-4 text-blue-600 border-gray-300 rounded focus:ring-blue-500">
<label for="privacy" class="text-sm text-gray-600">
개인정보 수집 및 이용에 동의합니다.
<a href="/privacy" class="text-blue-600 hover:underline">개인정보처리방침 보기</a>
</label>
</div>
<!-- Submit Button -->
<button type="submit"
class="w-full bg-gradient-to-r from-blue-600 to-purple-600 text-white py-4 px-6 rounded-lg font-semibold hover:from-blue-700 hover:to-purple-700 transition-all duration-300 transform hover:scale-105 focus:ring-4 focus:ring-blue-300">
<i class="fas fa-paper-plane mr-2"></i>
문의 보내기
</button>
</form>
<!-- Form Status Messages -->
<div id="form-success" class="hidden mt-6 p-4 bg-green-100 border border-green-400 text-green-700 rounded-lg">
<i class="fas fa-check-circle mr-2"></i>
문의가 성공적으로 접수되었습니다. 빠른 시일 내에 답변드리겠습니다.
</div>
<div id="form-error" class="hidden mt-6 p-4 bg-red-100 border border-red-400 text-red-700 rounded-lg">
<i class="fas fa-exclamation-circle mr-2"></i>
<span id="error-message">문의 전송 중 오류가 발생했습니다. 다시 시도해 주세요.</span>
</div>
</div>
<!-- Contact Information -->
<div class="space-y-8" data-aos="fade-left">
<!-- Contact Cards -->
<div class="bg-white rounded-2xl shadow-xl p-8">
<h3 class="text-2xl font-bold text-gray-900 mb-6">
연락처 정보
</h3>
<div class="space-y-6">
<!-- Email -->
<div class="flex items-center">
<div class="w-12 h-12 bg-blue-100 rounded-full flex items-center justify-center mr-4">
<i class="fas fa-envelope text-blue-600 text-lg"></i>
</div>
<div>
<h4 class="font-semibold text-gray-900">이메일</h4>
<a href="mailto:info@smartsoltech.kr" class="text-blue-600 hover:underline">
info@smartsoltech.kr
</a>
</div>
</div>
<!-- Phone -->
<div class="flex items-center">
<div class="w-12 h-12 bg-green-100 rounded-full flex items-center justify-center mr-4">
<i class="fas fa-phone text-green-600 text-lg"></i>
</div>
<div>
<h4 class="font-semibold text-gray-900">전화번호</h4>
<a href="tel:+82-10-1234-5678" class="text-green-600 hover:underline">
+82-10-1234-5678
</a>
</div>
</div>
<!-- Location -->
<div class="flex items-center">
<div class="w-12 h-12 bg-purple-100 rounded-full flex items-center justify-center mr-4">
<i class="fas fa-map-marker-alt text-purple-600 text-lg"></i>
</div>
<div>
<h4 class="font-semibold text-gray-900">주소</h4>
<p class="text-gray-600">Seoul, South Korea</p>
</div>
</div>
<!-- Business Hours -->
<div class="flex items-center">
<div class="w-12 h-12 bg-orange-100 rounded-full flex items-center justify-center mr-4">
<i class="fas fa-clock text-orange-600 text-lg"></i>
</div>
<div>
<h4 class="font-semibold text-gray-900">운영시간</h4>
<p class="text-gray-600">평일 09:00 - 18:00</p>
<p class="text-gray-600 text-sm">주말 및 공휴일 휴무</p>
</div>
</div>
</div>
</div>
<!-- Social Media -->
<div class="bg-white rounded-2xl shadow-xl p-8">
<h3 class="text-2xl font-bold text-gray-900 mb-6">
소셜 미디어
</h3>
<div class="grid grid-cols-2 gap-4">
<a href="#" class="flex items-center justify-center p-4 bg-blue-50 rounded-lg hover:bg-blue-100 transition-colors group">
<i class="fab fa-facebook text-blue-600 text-2xl group-hover:scale-110 transition-transform"></i>
</a>
<a href="#" class="flex items-center justify-center p-4 bg-blue-50 rounded-lg hover:bg-blue-100 transition-colors group">
<i class="fab fa-twitter text-blue-400 text-2xl group-hover:scale-110 transition-transform"></i>
</a>
<a href="#" class="flex items-center justify-center p-4 bg-blue-50 rounded-lg hover:bg-blue-100 transition-colors group">
<i class="fab fa-linkedin text-blue-700 text-2xl group-hover:scale-110 transition-transform"></i>
</a>
<a href="#" class="flex items-center justify-center p-4 bg-pink-50 rounded-lg hover:bg-pink-100 transition-colors group">
<i class="fab fa-instagram text-pink-600 text-2xl group-hover:scale-110 transition-transform"></i>
</a>
</div>
</div>
<!-- Quick Actions -->
<div class="bg-gradient-to-br from-blue-600 to-purple-600 rounded-2xl shadow-xl p-8 text-white">
<h3 class="text-2xl font-bold mb-6">빠른 시작</h3>
<div class="space-y-4">
<a href="/calculator" class="block bg-white bg-opacity-20 backdrop-blur-sm rounded-lg p-4 hover:bg-opacity-30 transition-all">
<div class="flex items-center">
<i class="fas fa-calculator text-2xl mr-4"></i>
<div>
<h4 class="font-semibold">비용 계산하기</h4>
<p class="text-sm opacity-80">프로젝트 예상 비용을 즉시 확인</p>
</div>
</div>
</a>
<a href="/portfolio" class="block bg-white bg-opacity-20 backdrop-blur-sm rounded-lg p-4 hover:bg-opacity-30 transition-all">
<div class="flex items-center">
<i class="fas fa-folder-open text-2xl mr-4"></i>
<div>
<h4 class="font-semibold">포트폴리오 보기</h4>
<p class="text-sm opacity-80">우리의 작업 사례 확인</p>
</div>
</div>
</a>
<a href="/services" class="block bg-white bg-opacity-20 backdrop-blur-sm rounded-lg p-4 hover:bg-opacity-30 transition-all">
<div class="flex items-center">
<i class="fas fa-cogs text-2xl mr-4"></i>
<div>
<h4 class="font-semibold">서비스 살펴보기</h4>
<p class="text-sm opacity-80">제공하는 서비스 정보</p>
</div>
</div>
</a>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- FAQ Section -->
<section class="section-padding bg-gray-50">
<div class="container mx-auto px-4">
<div class="text-center mb-12" data-aos="fade-up">
<h2 class="text-3xl md:text-4xl font-bold text-gray-900 mb-4">
자주 묻는 질문
</h2>
<p class="text-xl text-gray-600">
프로젝트와 관련된 궁금한 점들을 확인해보세요
</p>
</div>
<div class="max-w-4xl mx-auto">
<div class="space-y-4" data-aos="fade-up">
<!-- FAQ Item 1 -->
<div class="bg-white rounded-lg shadow-md overflow-hidden">
<button class="faq-button w-full text-left p-6 focus:outline-none hover:bg-gray-50 transition-colors" type="button">
<div class="flex justify-between items-center">
<h3 class="text-lg font-semibold text-gray-900">프로젝트는 얼마나 걸리나요?</h3>
<i class="fas fa-chevron-down text-gray-400 transform transition-transform"></i>
</div>
</button>
<div class="faq-content hidden px-6 pb-6">
<p class="text-gray-600">
프로젝트 규모와 복잡도에 따라 다르지만, 일반적으로 웹사이트는 2-8주, 모바일 앱은 4-16주,
UI/UX 디자인은 1-6주 정도 소요됩니다. 정확한 일정은 상담을 통해 안내드립니다.
</p>
</div>
</div>
<!-- FAQ Item 2 -->
<div class="bg-white rounded-lg shadow-md overflow-hidden">
<button class="faq-button w-full text-left p-6 focus:outline-none hover:bg-gray-50 transition-colors" type="button">
<div class="flex justify-between items-center">
<h3 class="text-lg font-semibold text-gray-900">비용은 어떻게 책정되나요?</h3>
<i class="fas fa-chevron-down text-gray-400 transform transition-transform"></i>
</div>
</button>
<div class="faq-content hidden px-6 pb-6">
<p class="text-gray-600">
프로젝트의 범위, 기능, 디자인 복잡도, 개발 기간 등을 종합적으로 고려하여 책정합니다.
온라인 계산기를 통해 예상 비용을 확인하시거나, 직접 상담을 통해 정확한 견적을 받아보세요.
</p>
</div>
</div>
<!-- FAQ Item 3 -->
<div class="bg-white rounded-lg shadow-md overflow-hidden">
<button class="faq-button w-full text-left p-6 focus:outline-none hover:bg-gray-50 transition-colors" type="button">
<div class="flex justify-between items-center">
<h3 class="text-lg font-semibold text-gray-900">유지보수는 어떻게 진행되나요?</h3>
<i class="fas fa-chevron-down text-gray-400 transform transition-transform"></i>
</div>
</button>
<div class="faq-content hidden px-6 pb-6">
<p class="text-gray-600">
프로젝트 완료 후 6개월간 무료 유지보수를 제공합니다. 이후에는 월 단위 또는 연 단위
유지보수 계약을 통해 지속적인 관리와 업데이트를 지원합니다.
</p>
</div>
</div>
<!-- FAQ Item 4 -->
<div class="bg-white rounded-lg shadow-md overflow-hidden">
<button class="faq-button w-full text-left p-6 focus:outline-none hover:bg-gray-50 transition-colors" type="button">
<div class="flex justify-between items-center">
<h3 class="text-lg font-semibold text-gray-900">원격으로도 작업이 가능한가요?</h3>
<i class="fas fa-chevron-down text-gray-400 transform transition-transform"></i>
</div>
</button>
<div class="faq-content hidden px-6 pb-6">
<p class="text-gray-600">
네, 전 세계 어디서든 원격으로 프로젝트를 진행할 수 있습니다.
온라인 미팅, 협업 도구, 프로젝트 관리 시스템을 통해 효율적으로 소통하며 작업합니다.
</p>
</div>
</div>
</div>
</div>
</div>
</section>
<%- include('partials/footer') %>
<!-- Scripts -->
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
<script src="/js/main.js"></script>
<script>
// Contact form handling
document.addEventListener('DOMContentLoaded', function() {
const contactForm = document.getElementById('contact-form');
const successMessage = document.getElementById('form-success');
const errorMessage = document.getElementById('form-error');
const errorText = document.getElementById('error-message');
contactForm.addEventListener('submit', async function(e) {
e.preventDefault();
const submitButton = contactForm.querySelector('button[type="submit"]');
const originalText = submitButton.innerHTML;
// Show loading state
submitButton.innerHTML = '<i class="fas fa-spinner fa-spin mr-2"></i> 전송 중...';
submitButton.disabled = true;
try {
const formData = new FormData(contactForm);
const response = await fetch('/contact', {
method: 'POST',
body: formData
});
const result = await response.json();
if (result.success) {
successMessage.classList.remove('hidden');
errorMessage.classList.add('hidden');
contactForm.reset();
// Scroll to success message
successMessage.scrollIntoView({ behavior: 'smooth' });
} else {
throw new Error(result.message || '전송에 실패했습니다.');
}
} catch (error) {
errorText.textContent = error.message;
errorMessage.classList.remove('hidden');
successMessage.classList.add('hidden');
// Scroll to error message
errorMessage.scrollIntoView({ behavior: 'smooth' });
} finally {
// Restore button state
submitButton.innerHTML = originalText;
submitButton.disabled = false;
}
});
// FAQ functionality
const faqButtons = document.querySelectorAll('.faq-button');
faqButtons.forEach(button => {
button.addEventListener('click', function() {
const content = this.nextElementSibling;
const icon = this.querySelector('i');
// Close all other FAQs
faqButtons.forEach(otherButton => {
if (otherButton !== this) {
const otherContent = otherButton.nextElementSibling;
const otherIcon = otherButton.querySelector('i');
otherContent.classList.add('hidden');
otherIcon.classList.remove('rotate-180');
}
});
// Toggle current FAQ
if (content.classList.contains('hidden')) {
content.classList.remove('hidden');
icon.classList.add('rotate-180');
} else {
content.classList.add('hidden');
icon.classList.remove('rotate-180');
}
});
});
});
</script>
</body>
</html>

211
views/contact.ejs Normal file
View File

@@ -0,0 +1,211 @@
<!DOCTYPE html>
<html lang="<%= locale %>" class="<%= theme === 'dark' ? 'dark' : '' %>">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><%- __('contact.meta.title') %> - SmartSolTech</title>
<!-- SEO Meta Tags -->
<meta name="description" content="<%- __('contact.meta.description') %>">
<!-- Styles -->
<link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
<link href="/css/main.css" rel="stylesheet">
<link href="/css/fixes.css" rel="stylesheet">
<link href="/css/dark-theme.css" rel="stylesheet">
</head>
<body class="font-sans dark:bg-gray-900 dark:text-gray-100">
<%- include('partials/navigation') %>
<!-- Hero Section -->
<section class="relative bg-gradient-to-br from-blue-900 via-purple-900 to-indigo-900 dark:from-gray-900 dark:via-blue-900 dark:to-purple-900 py-20 hero-section">
<div class="absolute inset-0 bg-black opacity-50 dark:opacity-70"></div>
<div class="relative max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 text-center">
<h1 class="text-5xl md:text-6xl font-bold text-white mb-6">
<%- __('contact.hero.title') %>
</h1>
<p class="text-xl text-gray-300 dark:text-gray-200 max-w-3xl mx-auto">
<%- __('contact.hero.subtitle') %>
</p>
</div>
</section>
<!-- Contact Section -->
<section class="py-20 bg-white dark:bg-gray-900">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="grid grid-cols-1 lg:grid-cols-2 gap-12">
<!-- Contact Form -->
<div>
<h2 class="text-3xl font-bold text-gray-900 dark:text-white mb-6">
<%- __('contact.form.title') %>
</h2>
<form id="contact-form" class="space-y-6">
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
<div>
<label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">
<%- __('contact.form.name') %>
</label>
<input type="text" name="name" required class="form-input w-full px-4 py-3 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent dark:bg-gray-700 dark:text-white">
</div>
<div>
<label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">
<%- __('contact.form.email') %>
</label>
<input type="email" name="email" required class="form-input w-full px-4 py-3 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent dark:bg-gray-700 dark:text-white">
</div>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">
<%- __('contact.form.phone') %>
</label>
<input type="tel" name="phone" class="form-input w-full px-4 py-3 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent dark:bg-gray-700 dark:text-white">
</div>
<div>
<label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">
<%- __('contact.form.service.title') %>
</label>
<select name="serviceInterest" class="form-input w-full px-4 py-3 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent dark:bg-gray-700 dark:text-white">
<option value=""><%- __('contact.form.service.select') %></option>
<option value="web-development"><%- __('contact.form.service.web') %></option>
<option value="mobile-app"><%- __('contact.form.service.mobile') %></option>
<option value="ui-ux-design"><%- __('contact.form.service.design') %></option>
<option value="branding"><%- __('contact.form.service.branding') %></option>
<option value="consulting"><%- __('contact.form.service.consulting') %></option>
<option value="other"><%- __('contact.form.service.other') %></option>
</select>
</div>
<div>
<label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">
<%- __('contact.form.message') %>
</label>
<textarea name="message" rows="5" required class="form-input w-full px-4 py-3 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent resize-none dark:bg-gray-700 dark:text-white"></textarea>
</div>
<button type="submit" class="w-full btn-primary bg-gradient-to-r from-blue-600 to-purple-600 text-white font-semibold py-3 rounded-lg hover:from-blue-700 hover:to-purple-700 transition-all duration-300 transform hover:scale-105">
<%- __('contact.form.submit') %>
</button>
</form>
</div>
<!-- Contact Info -->
<div>
<h2 class="text-3xl font-bold text-gray-900 dark:text-white mb-6">
<%- __('contact.info.title') %>
</h2>
<div class="space-y-6">
<!-- Phone -->
<div class="flex items-start">
<div class="w-12 h-12 bg-blue-100 dark:bg-blue-900 rounded-full flex items-center justify-center mr-4 flex-shrink-0">
<i class="fas fa-phone text-blue-600 dark:text-blue-400"></i>
</div>
<div>
<h3 class="text-lg font-semibold text-gray-900 dark:text-white mb-2">
<%- __('contact.phone.title') %>
</h3>
<p class="text-gray-600 dark:text-gray-300">
<%- __('contact.phone.number') %>
</p>
<p class="text-sm text-gray-500 dark:text-gray-400">
<%- __('contact.phone.hours') %>
</p>
</div>
</div>
<!-- Email -->
<div class="flex items-start">
<div class="w-12 h-12 bg-purple-100 dark:bg-purple-900 rounded-full flex items-center justify-center mr-4 flex-shrink-0">
<i class="fas fa-envelope text-purple-600 dark:text-purple-400"></i>
</div>
<div>
<h3 class="text-lg font-semibold text-gray-900 dark:text-white mb-2">
<%- __('contact.email.title') %>
</h3>
<p class="text-gray-600 dark:text-gray-300">
<%- __('contact.email.address') %>
</p>
<p class="text-sm text-gray-500 dark:text-gray-400">
<%- __('contact.email.response') %>
</p>
</div>
</div>
<!-- Telegram -->
<div class="flex items-start">
<div class="w-12 h-12 bg-green-100 dark:bg-green-900 rounded-full flex items-center justify-center mr-4 flex-shrink-0">
<i class="fab fa-telegram text-green-600 dark:text-green-400"></i>
</div>
<div>
<h3 class="text-lg font-semibold text-gray-900 dark:text-white mb-2">
<%- __('contact.telegram.title') %>
</h3>
<p class="text-gray-600 dark:text-gray-300">
@smartsoltech
</p>
<p class="text-sm text-gray-500 dark:text-gray-400">
<%- __('contact.telegram.subtitle') %>
</p>
</div>
</div>
<!-- Address -->
<div class="flex items-start">
<div class="w-12 h-12 bg-gray-100 dark:bg-gray-700 rounded-full flex items-center justify-center mr-4 flex-shrink-0">
<i class="fas fa-map-marker-alt text-gray-600 dark:text-gray-400"></i>
</div>
<div>
<h3 class="text-lg font-semibold text-gray-900 dark:text-white mb-2">
<%- __('contact.address.title') %>
</h3>
<p class="text-gray-600 dark:text-gray-300">
<%- __('contact.address.line1') %><br>
<%- __('contact.address.line2') %>
</p>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
<%- include('partials/footer') %>
<!-- Scripts -->
<script>
// Theme initialization
document.addEventListener('DOMContentLoaded', function() {
const theme = localStorage.getItem('theme') || 'light';
document.documentElement.className = theme === 'dark' ? 'dark' : '';
});
// Contact form handler
document.getElementById('contact-form').addEventListener('submit', function(e) {
e.preventDefault();
const formData = new FormData(this);
fetch('/contact', {
method: 'POST',
body: formData
})
.then(response => response.json())
.then(data => {
if (data.success) {
alert('<%- __("contact.form.success") %>');
this.reset();
} else {
alert('<%- __("contact.form.error") %>');
}
})
.catch(error => {
console.error('Error:', error);
alert('<%- __("contact.form.error") %>');
});
});
</script>
</body>
</html>

86
views/error.ejs Normal file
View File

@@ -0,0 +1,86 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>오류 - SmartSolTech</title>
<!-- PWA -->
<meta name="theme-color" content="#3B82F6">
<link rel="manifest" href="/manifest.json">
<link rel="apple-touch-icon" href="/images/icons/icon-192x192.png">
<!-- Styles -->
<link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
<link href="/css/main.css" rel="stylesheet">
</head>
<body class="bg-gray-50">
<%- include('partials/navigation') %>
<!-- Error Section -->
<section class="min-h-screen flex items-center justify-center py-20">
<div class="container mx-auto px-4 text-center">
<div class="bg-white rounded-2xl shadow-xl p-12 max-w-2xl mx-auto">
<!-- Error Icon -->
<div class="w-24 h-24 bg-red-100 rounded-full flex items-center justify-center mx-auto mb-8">
<i class="fas fa-exclamation-triangle text-red-600 text-4xl"></i>
</div>
<!-- Error Title -->
<h1 class="text-4xl md:text-5xl font-bold text-gray-900 mb-6">
<%= title || '오류가 발생했습니다' %>
</h1>
<!-- Error Message -->
<p class="text-xl text-gray-600 mb-8 leading-relaxed">
<%= message || '요청을 처리하는 중 문제가 발생했습니다.' %>
</p>
<!-- Action Buttons -->
<div class="flex flex-col sm:flex-row gap-4 justify-center">
<a href="/"
class="bg-blue-600 text-white px-8 py-3 rounded-full hover:bg-blue-700 transition-colors font-semibold">
<i class="fas fa-home mr-2"></i>
홈으로 돌아가기
</a>
<button onclick="history.back()"
class="border-2 border-blue-600 text-blue-600 px-8 py-3 rounded-full hover:bg-blue-600 hover:text-white transition-colors font-semibold">
<i class="fas fa-arrow-left mr-2"></i>
이전 페이지로
</button>
</div>
<!-- Help Section -->
<div class="mt-12 pt-8 border-t border-gray-200">
<h3 class="text-lg font-semibold text-gray-900 mb-4">도움이 필요하신가요?</h3>
<p class="text-gray-600 mb-6">
문제가 지속되면 언제든지 저희에게 연락해 주세요.
</p>
<div class="flex flex-col sm:flex-row gap-4 justify-center">
<a href="/contact"
class="text-blue-600 hover:text-blue-700 font-semibold">
<i class="fas fa-envelope mr-2"></i>
문의하기
</a>
<a href="mailto:info@smartsoltech.kr"
class="text-blue-600 hover:text-blue-700 font-semibold">
<i class="fas fa-at mr-2"></i>
info@smartsoltech.kr
</a>
<a href="tel:+82-10-1234-5678"
class="text-blue-600 hover:text-blue-700 font-semibold">
<i class="fas fa-phone mr-2"></i>
+82-10-1234-5678
</a>
</div>
</div>
</div>
</div>
</section>
<!-- Scripts -->
<script src="/js/main.js"></script>
</body>
</html>

390
views/index-old.ejs Normal file
View File

@@ -0,0 +1,390 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><%= title || 'SmartSolTech - 혁신적인 기술 솔루션' %></title>
<!-- SEO Meta Tags -->
<meta name="description" content="SmartSolTech - 웹 개발, 모바일 앱, UI/UX 디자인을 통한 혁신적인 디지털 솔루션을 제공합니다.">
<meta name="keywords" content="웹개발, 모바일앱, UI/UX디자인, 디지털마케팅, SmartSolTech, 한국">
<!-- Open Graph -->
<meta property="og:title" content="SmartSolTech - 혁신적인 기술 솔루션">
<meta property="og:description" content="웹 개발, 모바일 앱, UI/UX 디자인을 통한 혁신적인 디지털 솔루션">
<meta property="og:type" content="website">
<!-- PWA -->
<meta name="theme-color" content="#3B82F6">
<link rel="manifest" href="/manifest.json">
<link rel="apple-touch-icon" href="/images/icons/icon-192x192.png">
<!-- Styles -->
<link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
<link href="https://unpkg.com/aos@2.3.1/dist/aos.css" rel="stylesheet">
<link href="/css/main.css" rel="stylesheet">
<link href="/css/fixes.css" rel="stylesheet">
</head>
<body class="font-sans">
<%- include('partials/navigation') %>
<!-- Hero Section -->
<section class="relative bg-gradient-to-br from-blue-900 via-purple-900 to-indigo-900 min-h-screen flex items-center overflow-hidden">
<div class="absolute inset-0 bg-black opacity-50"></div>
<div class="absolute inset-0 bg-gradient-to-r from-blue-600/20 to-purple-600/20"></div>
<!-- Animated Background Elements -->
<div class="absolute inset-0 overflow-hidden">
<div class="absolute -top-40 -right-32 w-80 h-80 bg-purple-500 rounded-full mix-blend-multiply filter blur-xl opacity-70 animate-blob"></div>
<div class="absolute -bottom-40 -left-32 w-80 h-80 bg-blue-500 rounded-full mix-blend-multiply filter blur-xl opacity-70 animate-blob animation-delay-2000"></div>
<div class="absolute top-40 left-40 w-80 h-80 bg-indigo-500 rounded-full mix-blend-multiply filter blur-xl opacity-70 animate-blob animation-delay-4000"></div>
</div>
<div class="relative max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-24">
<div class="text-center">
<h1 class="text-5xl md:text-7xl font-bold text-white mb-6 leading-tight" data-aos="fade-up">
Smart Technology
<span class="text-transparent bg-clip-text bg-gradient-to-r from-blue-400 to-purple-400">Solutions</span>
</h1>
<p class="text-xl md:text-2xl text-gray-300 mb-8 max-w-3xl mx-auto" data-aos="fade-up" data-aos-delay="200">
혁신적인 웹 개발, 모바일 앱, UI/UX 디자인으로 비즈니스의 디지털 전환을 이끌어갑니다
</p>
<div class="flex flex-col sm:flex-row gap-4 justify-center items-center" data-aos="fade-up" data-aos-delay="400">
<a href="/contact" class="btn-primary bg-gradient-to-r from-blue-500 to-purple-600 text-white px-8 py-4 rounded-full text-lg font-semibold hover:from-blue-600 hover:to-purple-700 transition-all duration-300 transform hover:scale-105 shadow-lg">
프로젝트 시작하기
</a>
<a href="/portfolio" class="border-2 border-white text-white px-8 py-4 rounded-full text-lg font-semibold hover:bg-white hover:text-gray-900 transition-all duration-300 transform hover:scale-105">
포트폴리오 보기
</a>
</div>
</div>
<!-- Scroll indicator -->
<div class="absolute bottom-8 left-1/2 transform -translate-x-1/2 animate-bounce">
<svg class="w-6 h-6 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 14l-7 7m0 0l-7-7m7 7V3"></path>
</svg>
</div>
</div>
</section>
<!-- Services Section -->
<section class="py-20 bg-white">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="text-center mb-16" data-aos="fade-up">
<h2 class="text-4xl md:text-5xl font-bold text-gray-900 mb-4">
Our <span class="text-blue-600">Services</span>
</h2>
<p class="text-xl text-gray-600 max-w-3xl mx-auto">
최신 기술과 창의적인 아이디어로 완성하는 디지털 솔루션
</p>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-8">
<!-- Default services -->
<div class="group p-8 bg-gray-50 rounded-2xl hover:bg-white hover:shadow-xl transition-all duration-300 transform hover:-translate-y-2 card-hover" data-aos="fade-up">
<div class="text-blue-600 mb-4 group-hover:scale-110 transition-transform duration-300">
<i class="fas fa-code text-4xl"></i>
</div>
<h3 class="text-xl font-bold text-gray-900 mb-3">웹 개발</h3>
<p class="text-gray-600 mb-4">현대적이고 반응형 웹사이트 및 웹 애플리케이션 개발</p>
<div class="text-blue-600 font-semibold">₩500,000~</div>
</div>
<div class="group p-8 bg-gray-50 rounded-2xl hover:bg-white hover:shadow-xl transition-all duration-300 transform hover:-translate-y-2 card-hover" data-aos="fade-up" data-aos-delay="100">
<div class="text-blue-600 mb-4 group-hover:scale-110 transition-transform duration-300">
<i class="fas fa-mobile-alt text-4xl"></i>
</div>
<h3 class="text-xl font-bold text-gray-900 mb-3">모바일 앱</h3>
<p class="text-gray-600 mb-4">iOS와 Android를 위한 네이티브 및 크로스플랫폼 앱</p>
<div class="text-blue-600 font-semibold">₩800,000~</div>
</div>
<div class="group p-8 bg-gray-50 rounded-2xl hover:bg-white hover:shadow-xl transition-all duration-300 transform hover:-translate-y-2 card-hover" data-aos="fade-up" data-aos-delay="200">
<div class="text-blue-600 mb-4 group-hover:scale-110 transition-transform duration-300">
<i class="fas fa-palette text-4xl"></i>
</div>
<h3 class="text-xl font-bold text-gray-900 mb-3">UI/UX 디자인</h3>
<p class="text-gray-600 mb-4">사용자 중심의 직관적이고 아름다운 인터페이스 디자인</p>
<div class="text-blue-600 font-semibold">₩300,000~</div>
</div>
<div class="group p-8 bg-gray-50 rounded-2xl hover:bg-white hover:shadow-xl transition-all duration-300 transform hover:-translate-y-2 card-hover" data-aos="fade-up" data-aos-delay="300">
<div class="text-blue-600 mb-4 group-hover:scale-110 transition-transform duration-300">
<i class="fas fa-chart-line text-4xl"></i>
</div>
<h3 class="text-xl font-bold text-gray-900 mb-3">디지털 마케팅</h3>
<p class="text-gray-600 mb-4">SEO, 소셜미디어, 온라인 광고를 통한 디지털 마케팅</p>
<div class="text-blue-600 font-semibold">₩200,000~</div>
</div>
</div>
<div class="text-center mt-12" data-aos="fade-up">
<a href="/services" class="inline-flex items-center px-6 py-3 border border-blue-600 text-blue-600 font-semibold rounded-lg hover:bg-blue-600 hover:text-white transition-colors">
모든 서비스 보기
<svg class="ml-2 w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 8l4 4m0 0l-4 4m4-4H3"></path>
</svg>
</a>
</div>
</div>
</section>
<!-- Portfolio Section -->
<section class="py-20 bg-gray-50">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="text-center mb-16" data-aos="fade-up">
<h2 class="text-4xl md:text-5xl font-bold text-gray-900 mb-4">
Recent <span class="text-purple-600">Projects</span>
</h2>
<p class="text-xl text-gray-600 max-w-3xl mx-auto">
고객의 성공을 위해 완성한 프로젝트들을 확인해보세요
</p>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
<% if (featuredPortfolio && featuredPortfolio.length > 0) { %>
<% featuredPortfolio.forEach((project, index) => { %>
<div class="group bg-white rounded-2xl overflow-hidden shadow-lg hover:shadow-2xl transition-all duration-300 transform hover:-translate-y-2 card-hover" data-aos="fade-up" data-aos-delay="<%= index * 100 %>">
<div class="relative overflow-hidden portfolio-item">
<% if (project.images && project.images.length > 0) { %>
<img src="<%= project.images.find(img => img.isPrimary)?.url || project.images[0].url %>"
alt="<%= project.images.find(img => img.isPrimary)?.alt || project.title %>"
class="w-full h-48 object-cover portfolio-image">
<% } else { %>
<div class="w-full h-48 bg-gradient-to-br from-blue-500 to-purple-600 flex items-center justify-center">
<span class="text-white text-2xl font-bold"><%= project.title.charAt(0) %></span>
</div>
<% } %>
<div class="absolute inset-0 bg-gradient-to-t from-black/50 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-300"></div>
<div class="absolute bottom-4 left-4 right-4 transform translate-y-4 group-hover:translate-y-0 transition-transform duration-300 opacity-0 group-hover:opacity-100">
<div class="flex flex-wrap gap-2">
<% if (project.technologies && project.technologies.length > 0) { %>
<% project.technologies.slice(0, 3).forEach(tech => { %>
<span class="px-2 py-1 bg-white/20 glass-effect text-white text-xs rounded-full"><%= tech %></span>
<% }) %>
<% } %>
</div>
</div>
</div>
<div class="p-6">
<div class="flex items-center justify-between mb-2">
<span class="px-3 py-1 bg-blue-100 text-blue-600 text-sm rounded-full font-medium"><%= project.category %></span>
<span class="text-gray-500 text-sm">
<i class="fas fa-eye mr-1"></i><%= project.viewCount || 0 %>
</span>
</div>
<h3 class="text-xl font-bold text-gray-900 mb-2 group-hover:text-blue-600 transition-colors"><%= project.title %></h3>
<p class="text-gray-600 mb-4"><%= project.shortDescription || project.description %></p>
<a href="/portfolio/<%= project._id %>" class="inline-flex items-center text-blue-600 font-semibold hover:text-blue-700 transition-colors">
자세히 보기
<svg class="ml-1 w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 8l4 4m0 0l-4 4m4-4H3"></path>
</svg>
</a>
</div>
</div>
<% }) %>
<% } else { %>
<!-- Default portfolio items -->
<div class="group bg-white rounded-2xl overflow-hidden shadow-lg hover:shadow-2xl transition-all duration-300 transform hover:-translate-y-2 card-hover" data-aos="fade-up">
<div class="relative overflow-hidden portfolio-item">
<div class="w-full h-48 bg-gradient-to-br from-blue-500 to-purple-600 flex items-center justify-center">
<span class="text-white text-2xl font-bold">E</span>
</div>
<div class="absolute inset-0 bg-gradient-to-t from-black/50 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-300"></div>
<div class="absolute bottom-4 left-4 right-4 transform translate-y-4 group-hover:translate-y-0 transition-transform duration-300 opacity-0 group-hover:opacity-100">
<div class="flex flex-wrap gap-2">
<span class="px-2 py-1 bg-white/20 glass-effect text-white text-xs rounded-full">React</span>
<span class="px-2 py-1 bg-white/20 glass-effect text-white text-xs rounded-full">Node.js</span>
</div>
</div>
</div>
<div class="p-6">
<div class="flex items-center justify-between mb-2">
<span class="px-3 py-1 bg-blue-100 text-blue-600 text-sm rounded-full font-medium">E-commerce</span>
<span class="text-gray-500 text-sm">
<i class="fas fa-eye mr-1"></i>1,234
</span>
</div>
<h3 class="text-xl font-bold text-gray-900 mb-2 group-hover:text-blue-600 transition-colors">온라인 쇼핑몰 플랫폼</h3>
<p class="text-gray-600 mb-4">현대적인 UI/UX와 완벽한 결제 시스템을 갖춘 전자상거래 솔루션</p>
<a href="#" class="inline-flex items-center text-blue-600 font-semibold hover:text-blue-700 transition-colors">
자세히 보기
<svg class="ml-1 w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 8l4 4m0 0l-4 4m4-4H3"></path>
</svg>
</a>
</div>
</div>
<% } %>
</div>
<div class="text-center mt-12" data-aos="fade-up">
<a href="/portfolio" class="inline-flex items-center px-6 py-3 bg-purple-600 text-white font-semibold rounded-lg hover:bg-purple-700 transition-colors">
전체 포트폴리오 보기
<svg class="ml-2 w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 8l4 4m0 0l-4 4m4-4H3"></path>
</svg>
</a>
</div>
</div>
</section>
<!-- Calculator CTA Section -->
<section class="py-20 cta-section">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 text-center relative z-10">
<div data-aos="fade-up">
<h2 class="text-4xl md:text-5xl font-bold text-white mb-6">
프로젝트 견적을 확인해보세요
</h2>
<p class="text-xl text-blue-100 mb-8 max-w-3xl mx-auto">
원하는 서비스와 요구사항을 선택하면 실시간으로 견적을 계산해드립니다
</p>
<a href="/calculator" class="inline-flex items-center px-8 py-4 bg-white text-blue-600 font-bold rounded-full text-lg hover:bg-gray-100 transition-colors transform hover:scale-105">
<i class="fas fa-calculator mr-3"></i>
견적 계산기 사용하기
</a>
</div>
</div>
</section>
<!-- Contact Section -->
<section class="py-20 bg-white">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="grid grid-cols-1 lg:grid-cols-2 gap-12 items-center">
<div data-aos="fade-right">
<h2 class="text-4xl md:text-5xl font-bold text-gray-900 mb-6">
프로젝트를 <span class="text-blue-600">시작</span>할 준비가 되셨나요?
</h2>
<p class="text-xl text-gray-600 mb-8">
아이디어를 현실로 만들어보세요. 전문가들이 최고의 솔루션을 제공합니다.
</p>
<div class="space-y-4">
<div class="flex items-center">
<div class="w-12 h-12 bg-blue-100 rounded-full flex items-center justify-center mr-4">
<i class="fas fa-phone text-blue-600"></i>
</div>
<div>
<div class="font-semibold text-gray-900">전화 상담</div>
<div class="text-gray-600">+82-10-0000-0000</div>
</div>
</div>
<div class="flex items-center">
<div class="w-12 h-12 bg-purple-100 rounded-full flex items-center justify-center mr-4">
<i class="fas fa-envelope text-purple-600"></i>
</div>
<div>
<div class="font-semibold text-gray-900">이메일 문의</div>
<div class="text-gray-600">info@smartsoltech.kr</div>
</div>
</div>
<div class="flex items-center">
<div class="w-12 h-12 bg-green-100 rounded-full flex items-center justify-center mr-4">
<i class="fab fa-telegram text-green-600"></i>
</div>
<div>
<div class="font-semibold text-gray-900">텔레그램 채팅</div>
<div class="text-gray-600">즉시 답변 가능</div>
</div>
</div>
</div>
</div>
<div data-aos="fade-left">
<div class="contact-form p-8 rounded-2xl shadow-lg">
<h3 class="text-2xl font-bold text-gray-900 mb-6">무료 상담 신청</h3>
<form id="quick-contact-form" class="space-y-4">
<div>
<input type="text" name="name" placeholder="이름" required class="form-input w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent">
</div>
<div>
<input type="email" name="email" placeholder="이메일" required class="form-input w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent">
</div>
<div>
<input type="tel" name="phone" placeholder="연락처" class="form-input w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent">
</div>
<div>
<select name="serviceInterest" class="form-input w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent">
<option value="">관심 서비스 선택</option>
<option value="web-development">웹 개발</option>
<option value="mobile-app">모바일 앱</option>
<option value="ui-ux-design">UI/UX 디자인</option>
<option value="branding">브랜딩</option>
<option value="consulting">컨설팅</option>
<option value="other">기타</option>
</select>
</div>
<div>
<textarea name="message" rows="4" placeholder="프로젝트에 대해 간단히 설명해주세요" required class="form-input w-full px-4 py-3 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent resize-none"></textarea>
</div>
<button type="submit" class="w-full btn-primary bg-gradient-to-r from-blue-600 to-purple-600 text-white font-semibold py-3 rounded-lg hover:from-blue-700 hover:to-purple-700 transition-all duration-300 transform hover:scale-105">
상담 신청하기
</button>
</form>
</div>
</div>
</div>
</div>
</section>
<%- include('partials/footer') %>
<!-- Scripts -->
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
<script src="/js/main.js"></script>
<script>
// Initialize AOS
AOS.init({
duration: 800,
once: true,
offset: 100
});
// Blob animation
const style = document.createElement('style');
style.textContent = `
@keyframes blob {
0% { transform: translate(0px, 0px) scale(1); }
33% { transform: translate(30px, -50px) scale(1.1); }
66% { transform: translate(-20px, 20px) scale(0.9); }
100% { transform: translate(0px, 0px) scale(1); }
}
.animate-blob {
animation: blob 7s infinite;
}
.animation-delay-2000 {
animation-delay: 2s;
}
.animation-delay-4000 {
animation-delay: 4s;
}
`;
document.head.appendChild(style);
// Contact form handler
document.getElementById('quick-contact-form').addEventListener('submit', function(e) {
e.preventDefault();
const formData = new FormData(this);
fetch('/contact', {
method: 'POST',
body: formData
})
.then(response => response.json())
.then(data => {
if (data.success) {
alert('문의가 성공적으로 전송되었습니다!');
this.reset();
} else {
alert('전송 중 오류가 발생했습니다. 다시 시도해주세요.');
}
})
.catch(error => {
console.error('Error:', error);
alert('전송 중 오류가 발생했습니다. 다시 시도해주세요.');
});
});
</script>
</body>
</html>

400
views/index.ejs Normal file
View File

@@ -0,0 +1,400 @@
<!DOCTYPE html>
<html lang="<%= locale %>" class="<%= theme === 'dark' ? 'dark' : '' %>">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><%- __(title || 'meta.title') %></title>
<!-- SEO Meta Tags -->
<meta name="description" content="<%- __('meta.description') %>">
<meta name="keywords" content="<%- __('meta.keywords') %>">
<!-- Open Graph -->
<meta property="og:title" content="<%- __('meta.title') %>">
<meta property="og:description" content="<%- __('meta.description') %>">
<meta property="og:type" content="website">
<!-- PWA -->
<meta name="theme-color" content="#3B82F6">
<link rel="manifest" href="/manifest.json">
<link rel="apple-touch-icon" href="/images/icons/icon-192x192.png">
<!-- Styles -->
<link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
<link href="https://unpkg.com/aos@2.3.1/dist/aos.css" rel="stylesheet">
<link href="/css/main.css" rel="stylesheet">
<link href="/css/fixes.css" rel="stylesheet">
<link href="/css/dark-theme.css" rel="stylesheet">
</head>
<body class="font-sans dark:bg-gray-900 dark:text-gray-100">
<%- include('partials/navigation') %>
<!-- Hero Section -->
<section class="relative bg-gradient-to-br from-blue-900 via-purple-900 to-indigo-900 dark:from-gray-900 dark:via-blue-900 dark:to-purple-900 min-h-screen flex items-center overflow-hidden hero-section">
<div class="absolute inset-0 bg-black opacity-50 dark:opacity-70"></div>
<div class="absolute inset-0 bg-gradient-to-r from-blue-600/20 to-purple-600/20"></div>
<!-- Animated Background Elements -->
<div class="absolute inset-0 overflow-hidden">
<div class="absolute -top-40 -right-32 w-80 h-80 bg-purple-500 dark:bg-purple-400 rounded-full mix-blend-multiply filter blur-xl opacity-70 animate-blob"></div>
<div class="absolute -bottom-40 -left-32 w-80 h-80 bg-blue-500 dark:bg-blue-400 rounded-full mix-blend-multiply filter blur-xl opacity-70 animate-blob animation-delay-2000"></div>
<div class="absolute top-40 left-40 w-80 h-80 bg-indigo-500 dark:bg-indigo-400 rounded-full mix-blend-multiply filter blur-xl opacity-70 animate-blob animation-delay-4000"></div>
</div>
<div class="relative max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-24">
<div class="text-center">
<h1 class="text-5xl md:text-7xl font-bold text-white mb-6 leading-tight" data-aos="fade-up">
<%- __('hero.title.smart') %>
<span class="text-transparent bg-clip-text bg-gradient-to-r from-blue-400 to-purple-400"><%- __('hero.title.solutions') %></span>
</h1>
<p class="text-xl md:text-2xl text-gray-300 dark:text-gray-200 mb-8 max-w-3xl mx-auto" data-aos="fade-up" data-aos-delay="200">
<%- __('hero.subtitle') %>
</p>
<div class="flex flex-col sm:flex-row gap-4 justify-center items-center" data-aos="fade-up" data-aos-delay="400">
<a href="/contact" class="btn-primary bg-gradient-to-r from-blue-500 to-purple-600 text-white px-8 py-4 rounded-full text-lg font-semibold hover:from-blue-600 hover:to-purple-700 transition-all duration-300 transform hover:scale-105 shadow-lg">
<%- __('hero.cta.start') %>
</a>
<a href="/portfolio" class="border-2 border-white text-white px-8 py-4 rounded-full text-lg font-semibold hover:bg-white hover:text-gray-900 transition-all duration-300 transform hover:scale-105">
<%- __('hero.cta.portfolio') %>
</a>
</div>
</div>
<!-- Scroll indicator -->
<div class="absolute bottom-8 left-1/2 transform -translate-x-1/2 animate-bounce">
<svg class="w-6 h-6 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 14l-7 7m0 0l-7-7m7 7V3"></path>
</svg>
</div>
</div>
</section>
<!-- Services Section -->
<section class="py-20 bg-white dark:bg-gray-900">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="text-center mb-16" data-aos="fade-up">
<h2 class="text-4xl md:text-5xl font-bold text-gray-900 dark:text-white mb-4">
<%- __('services.title.our') %> <span class="text-blue-600 dark:text-blue-400"><%- __('services.title.services') %></span>
</h2>
<p class="text-xl text-gray-600 dark:text-gray-300 max-w-3xl mx-auto">
<%- __('services.subtitle') %>
</p>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-8">
<!-- Web Development Service -->
<div class="group p-8 bg-gray-50 dark:bg-gray-800 rounded-2xl hover:bg-white dark:hover:bg-gray-700 hover:shadow-xl transition-all duration-300 transform hover:-translate-y-2 card-hover" data-aos="fade-up">
<div class="text-blue-600 dark:text-blue-400 mb-4 group-hover:scale-110 transition-transform duration-300">
<i class="fas fa-code text-4xl"></i>
</div>
<h3 class="text-xl font-bold text-gray-900 dark:text-white mb-3"><%- __('services.web.title') %></h3>
<p class="text-gray-600 dark:text-gray-300 mb-4"><%- __('services.web.description') %></p>
<div class="text-blue-600 dark:text-blue-400 font-semibold"><%- __('services.web.price') %></div>
</div>
<!-- Mobile App Service -->
<div class="group p-8 bg-gray-50 dark:bg-gray-800 rounded-2xl hover:bg-white dark:hover:bg-gray-700 hover:shadow-xl transition-all duration-300 transform hover:-translate-y-2 card-hover" data-aos="fade-up" data-aos-delay="100">
<div class="text-blue-600 dark:text-blue-400 mb-4 group-hover:scale-110 transition-transform duration-300">
<i class="fas fa-mobile-alt text-4xl"></i>
</div>
<h3 class="text-xl font-bold text-gray-900 dark:text-white mb-3"><%- __('services.mobile.title') %></h3>
<p class="text-gray-600 dark:text-gray-300 mb-4"><%- __('services.mobile.description') %></p>
<div class="text-blue-600 dark:text-blue-400 font-semibold"><%- __('services.mobile.price') %></div>
</div>
<!-- UI/UX Design Service -->
<div class="group p-8 bg-gray-50 dark:bg-gray-800 rounded-2xl hover:bg-white dark:hover:bg-gray-700 hover:shadow-xl transition-all duration-300 transform hover:-translate-y-2 card-hover" data-aos="fade-up" data-aos-delay="200">
<div class="text-blue-600 dark:text-blue-400 mb-4 group-hover:scale-110 transition-transform duration-300">
<i class="fas fa-palette text-4xl"></i>
</div>
<h3 class="text-xl font-bold text-gray-900 dark:text-white mb-3"><%- __('services.design.title') %></h3>
<p class="text-gray-600 dark:text-gray-300 mb-4"><%- __('services.design.description') %></p>
<div class="text-blue-600 dark:text-blue-400 font-semibold"><%- __('services.design.price') %></div>
</div>
<!-- Digital Marketing Service -->
<div class="group p-8 bg-gray-50 dark:bg-gray-800 rounded-2xl hover:bg-white dark:hover:bg-gray-700 hover:shadow-xl transition-all duration-300 transform hover:-translate-y-2 card-hover" data-aos="fade-up" data-aos-delay="300">
<div class="text-blue-600 dark:text-blue-400 mb-4 group-hover:scale-110 transition-transform duration-300">
<i class="fas fa-chart-line text-4xl"></i>
</div>
<h3 class="text-xl font-bold text-gray-900 dark:text-white mb-3"><%- __('services.marketing.title') %></h3>
<p class="text-gray-600 dark:text-gray-300 mb-4"><%- __('services.marketing.description') %></p>
<div class="text-blue-600 dark:text-blue-400 font-semibold"><%- __('services.marketing.price') %></div>
</div>
</div>
<div class="text-center mt-12" data-aos="fade-up">
<a href="/services" class="inline-flex items-center px-6 py-3 border border-blue-600 dark:border-blue-400 text-blue-600 dark:text-blue-400 font-semibold rounded-lg hover:bg-blue-600 hover:text-white dark:hover:bg-blue-400 dark:hover:text-gray-900 transition-colors">
<%- __('services.view_all') %>
<svg class="ml-2 w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 8l4 4m0 0l-4 4m4-4H3"></path>
</svg>
</a>
</div>
</div>
</section>
<!-- Portfolio Section -->
<section class="py-20 bg-gray-50 dark:bg-gray-800">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="text-center mb-16" data-aos="fade-up">
<h2 class="text-4xl md:text-5xl font-bold text-gray-900 dark:text-white mb-4">
<%- __('portfolio.title.recent') %> <span class="text-purple-600 dark:text-purple-400"><%- __('portfolio.title.projects') %></span>
</h2>
<p class="text-xl text-gray-600 dark:text-gray-300 max-w-3xl mx-auto">
<%- __('portfolio.subtitle') %>
</p>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
<% if (featuredPortfolio && featuredPortfolio.length > 0) { %>
<% featuredPortfolio.forEach((project, index) => { %>
<div class="group bg-white dark:bg-gray-700 rounded-2xl overflow-hidden shadow-lg hover:shadow-2xl transition-all duration-300 transform hover:-translate-y-2 card-hover" data-aos="fade-up" data-aos-delay="<%= index * 100 %>">
<div class="relative overflow-hidden portfolio-item">
<% if (project.images && project.images.length > 0) { %>
<img src="<%= project.images.find(img => img.isPrimary)?.url || project.images[0].url %>"
alt="<%= project.images.find(img => img.isPrimary)?.alt || project.title %>"
class="w-full h-48 object-cover portfolio-image">
<% } else { %>
<div class="w-full h-48 bg-gradient-to-br from-blue-500 to-purple-600 flex items-center justify-center">
<span class="text-white text-2xl font-bold"><%= project.title.charAt(0) %></span>
</div>
<% } %>
<div class="absolute inset-0 bg-gradient-to-t from-black/50 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-300"></div>
<div class="absolute bottom-4 left-4 right-4 transform translate-y-4 group-hover:translate-y-0 transition-transform duration-300 opacity-0 group-hover:opacity-100">
<div class="flex flex-wrap gap-2">
<% if (project.technologies && project.technologies.length > 0) { %>
<% project.technologies.slice(0, 3).forEach(tech => { %>
<span class="px-2 py-1 bg-white/20 glass-effect text-white text-xs rounded-full"><%= tech %></span>
<% }) %>
<% } %>
</div>
</div>
</div>
<div class="p-6">
<div class="flex items-center justify-between mb-2">
<span class="px-3 py-1 bg-blue-100 dark:bg-blue-900 text-blue-600 dark:text-blue-300 text-sm rounded-full font-medium"><%= project.category %></span>
<span class="text-gray-500 dark:text-gray-400 text-sm">
<i class="fas fa-eye mr-1"></i><%= project.viewCount || 0 %>
</span>
</div>
<h3 class="text-xl font-bold text-gray-900 dark:text-white mb-2 group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors"><%= project.title %></h3>
<p class="text-gray-600 dark:text-gray-300 mb-4"><%= project.shortDescription || project.description %></p>
<a href="/portfolio/<%= project._id %>" class="inline-flex items-center text-blue-600 dark:text-blue-400 font-semibold hover:text-blue-700 dark:hover:text-blue-300 transition-colors">
<%- __('common.view_details') %>
<svg class="ml-1 w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 8l4 4m0 0l-4 4m4-4H3"></path>
</svg>
</a>
</div>
</div>
<% }) %>
<% } else { %>
<!-- Default portfolio items -->
<div class="group bg-white dark:bg-gray-700 rounded-2xl overflow-hidden shadow-lg hover:shadow-2xl transition-all duration-300 transform hover:-translate-y-2 card-hover" data-aos="fade-up">
<div class="relative overflow-hidden portfolio-item">
<div class="w-full h-48 bg-gradient-to-br from-blue-500 to-purple-600 flex items-center justify-center">
<span class="text-white text-2xl font-bold">E</span>
</div>
<div class="absolute inset-0 bg-gradient-to-t from-black/50 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-300"></div>
<div class="absolute bottom-4 left-4 right-4 transform translate-y-4 group-hover:translate-y-0 transition-transform duration-300 opacity-0 group-hover:opacity-100">
<div class="flex flex-wrap gap-2">
<span class="px-2 py-1 bg-white/20 glass-effect text-white text-xs rounded-full">React</span>
<span class="px-2 py-1 bg-white/20 glass-effect text-white text-xs rounded-full">Node.js</span>
</div>
</div>
</div>
<div class="p-6">
<div class="flex items-center justify-between mb-2">
<span class="px-3 py-1 bg-blue-100 dark:bg-blue-900 text-blue-600 dark:text-blue-300 text-sm rounded-full font-medium"><%- __('portfolio.default.ecommerce') %></span>
<span class="text-gray-500 dark:text-gray-400 text-sm">
<i class="fas fa-eye mr-1"></i>1,234
</span>
</div>
<h3 class="text-xl font-bold text-gray-900 dark:text-white mb-2 group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors"><%- __('portfolio.default.title') %></h3>
<p class="text-gray-600 dark:text-gray-300 mb-4"><%- __('portfolio.default.description') %></p>
<a href="#" class="inline-flex items-center text-blue-600 dark:text-blue-400 font-semibold hover:text-blue-700 dark:hover:text-blue-300 transition-colors">
<%- __('common.view_details') %>
<svg class="ml-1 w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 8l4 4m0 0l-4 4m4-4H3"></path>
</svg>
</a>
</div>
</div>
<% } %>
</div>
<div class="text-center mt-12" data-aos="fade-up">
<a href="/portfolio" class="inline-flex items-center px-6 py-3 bg-purple-600 dark:bg-purple-500 text-white font-semibold rounded-lg hover:bg-purple-700 dark:hover:bg-purple-400 transition-colors">
<%- __('portfolio.view_all') %>
<svg class="ml-2 w-5 h-5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17 8l4 4m0 0l-4 4m4-4H3"></path>
</svg>
</a>
</div>
</div>
</section>
<!-- Calculator CTA Section -->
<section class="py-20 cta-section">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 text-center relative z-10">
<div data-aos="fade-up">
<h2 class="text-4xl md:text-5xl font-bold text-white mb-6">
<%- __('calculator.cta.title') %>
</h2>
<p class="text-xl text-blue-100 mb-8 max-w-3xl mx-auto">
<%- __('calculator.cta.subtitle') %>
</p>
<a href="/calculator" class="inline-flex items-center px-8 py-4 bg-white text-blue-600 font-bold rounded-full text-lg hover:bg-gray-100 transition-colors transform hover:scale-105">
<i class="fas fa-calculator mr-3"></i>
<%- __('calculator.cta.button') %>
</a>
</div>
</div>
</section>
<!-- Contact Section -->
<section class="py-20 bg-white dark:bg-gray-900">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="grid grid-cols-1 lg:grid-cols-2 gap-12 items-center">
<div data-aos="fade-right">
<h2 class="text-4xl md:text-5xl font-bold text-gray-900 dark:text-white mb-6">
<%- __('contact.cta.ready') %> <span class="text-blue-600 dark:text-blue-400"><%- __('contact.cta.start') %></span><%- __('contact.cta.question') %>
</h2>
<p class="text-xl text-gray-600 dark:text-gray-300 mb-8">
<%- __('contact.cta.subtitle') %>
</p>
<div class="space-y-4">
<div class="flex items-center">
<div class="w-12 h-12 bg-blue-100 dark:bg-blue-900 rounded-full flex items-center justify-center mr-4">
<i class="fas fa-phone text-blue-600 dark:text-blue-400"></i>
</div>
<div>
<div class="font-semibold text-gray-900 dark:text-white"><%- __('contact.phone.title') %></div>
<div class="text-gray-600 dark:text-gray-300"><%- __('contact.phone.number') %></div>
</div>
</div>
<div class="flex items-center">
<div class="w-12 h-12 bg-purple-100 dark:bg-purple-900 rounded-full flex items-center justify-center mr-4">
<i class="fas fa-envelope text-purple-600 dark:text-purple-400"></i>
</div>
<div>
<div class="font-semibold text-gray-900 dark:text-white"><%- __('contact.email.title') %></div>
<div class="text-gray-600 dark:text-gray-300"><%- __('contact.email.address') %></div>
</div>
</div>
<div class="flex items-center">
<div class="w-12 h-12 bg-green-100 dark:bg-green-900 rounded-full flex items-center justify-center mr-4">
<i class="fab fa-telegram text-green-600 dark:text-green-400"></i>
</div>
<div>
<div class="font-semibold text-gray-900 dark:text-white"><%- __('contact.telegram.title') %></div>
<div class="text-gray-600 dark:text-gray-300"><%- __('contact.telegram.subtitle') %></div>
</div>
</div>
</div>
</div>
<div data-aos="fade-left">
<div class="contact-form p-8 rounded-2xl shadow-lg bg-white dark:bg-gray-800">
<h3 class="text-2xl font-bold text-gray-900 dark:text-white mb-6"><%- __('contact.form.title') %></h3>
<form id="quick-contact-form" class="space-y-4">
<div>
<input type="text" name="name" placeholder="<%- __('contact.form.name') %>" required class="form-input w-full px-4 py-3 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent dark:bg-gray-700 dark:text-white">
</div>
<div>
<input type="email" name="email" placeholder="<%- __('contact.form.email') %>" required class="form-input w-full px-4 py-3 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent dark:bg-gray-700 dark:text-white">
</div>
<div>
<input type="tel" name="phone" placeholder="<%- __('contact.form.phone') %>" class="form-input w-full px-4 py-3 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent dark:bg-gray-700 dark:text-white">
</div>
<div>
<select name="serviceInterest" class="form-input w-full px-4 py-3 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent dark:bg-gray-700 dark:text-white">
<option value=""><%- __('contact.form.service.select') %></option>
<option value="web-development"><%- __('contact.form.service.web') %></option>
<option value="mobile-app"><%- __('contact.form.service.mobile') %></option>
<option value="ui-ux-design"><%- __('contact.form.service.design') %></option>
<option value="branding"><%- __('contact.form.service.branding') %></option>
<option value="consulting"><%- __('contact.form.service.consulting') %></option>
<option value="other"><%- __('contact.form.service.other') %></option>
</select>
</div>
<div>
<textarea name="message" rows="4" placeholder="<%- __('contact.form.message') %>" required class="form-input w-full px-4 py-3 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent resize-none dark:bg-gray-700 dark:text-white"></textarea>
</div>
<button type="submit" class="w-full btn-primary bg-gradient-to-r from-blue-600 to-purple-600 text-white font-semibold py-3 rounded-lg hover:from-blue-700 hover:to-purple-700 transition-all duration-300 transform hover:scale-105">
<%- __('contact.form.submit') %>
</button>
</form>
</div>
</div>
</div>
</div>
</section>
<%- include('partials/footer') %>
<!-- Scripts -->
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
<script src="/js/main.js"></script>
<script>
// Initialize AOS
AOS.init({
duration: 800,
once: true,
offset: 100
});
// Blob animation
const style = document.createElement('style');
style.textContent = `
@keyframes blob {
0% { transform: translate(0px, 0px) scale(1); }
33% { transform: translate(30px, -50px) scale(1.1); }
66% { transform: translate(-20px, 20px) scale(0.9); }
100% { transform: translate(0px, 0px) scale(1); }
}
.animate-blob {
animation: blob 7s infinite;
}
.animation-delay-2000 {
animation-delay: 2s;
}
.animation-delay-4000 {
animation-delay: 4s;
}
`;
document.head.appendChild(style);
// Contact form handler
document.getElementById('quick-contact-form').addEventListener('submit', function(e) {
e.preventDefault();
const formData = new FormData(this);
fetch('/contact', {
method: 'POST',
body: formData
})
.then(response => response.json())
.then(data => {
if (data.success) {
alert('<%- __("contact.form.success") %>');
this.reset();
} else {
alert('<%- __("contact.form.error") %>');
}
})
.catch(error => {
console.error('Error:', error);
alert('<%- __("contact.form.error") %>');
});
});
// Theme initialization
document.addEventListener('DOMContentLoaded', function() {
const theme = localStorage.getItem('theme') || 'light';
document.documentElement.className = theme === 'dark' ? 'dark' : '';
});
</script>
</body>
</html>

88
views/layout.ejs Normal file
View File

@@ -0,0 +1,88 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><%= title %></title>
<!-- PWA Meta Tags -->
<meta name="theme-color" content="#1a202c">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta name="apple-mobile-web-app-title" content="SmartSolTech">
<!-- SEO Meta Tags -->
<meta name="description" content="<%= settings && settings.seo ? settings.seo.metaDescription : 'SmartSolTech - Innovative Technology Solutions' %>">
<meta name="keywords" content="<%= settings && settings.seo ? settings.seo.keywords : 'web development, mobile apps, UI/UX design, Korea' %>">
<meta name="author" content="SmartSolTech">
<!-- Open Graph -->
<meta property="og:title" content="<%= title %>">
<meta property="og:description" content="<%= settings && settings.seo ? settings.seo.metaDescription : 'SmartSolTech - Innovative Technology Solutions' %>">
<meta property="og:type" content="website">
<meta property="og:url" content="<%= process.env.SITE_URL || 'https://smartsoltech.kr' %>">
<meta property="og:image" content="<%= process.env.SITE_URL || 'https://smartsoltech.kr' %>/images/og-image.png">
<!-- Favicon -->
<link rel="icon" href="/favicon.ico">
<link rel="apple-touch-icon" href="/images/icon-192x192.png">
<!-- PWA Manifest -->
<link rel="manifest" href="/manifest.json">
<!-- Fonts -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap" rel="stylesheet">
<!-- CSS -->
<link href="https://cdnjs.cloudflare.com/ajax/libs/tailwindcss/2.2.19/tailwind.min.css" rel="stylesheet">
<link rel="stylesheet" href="/css/main.css">
<!-- Animation Library -->
<link href="https://cdnjs.cloudflare.com/ajax/libs/aos/2.3.4/aos.css" rel="stylesheet">
</head>
<body class="bg-gray-50 font-inter">
<!-- Navigation -->
<%- include('partials/navigation') %>
<!-- Main Content -->
<main>
<%- body %>
</main>
<!-- Footer -->
<%- include('partials/footer') %>
<!-- Scripts -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/aos/2.3.4/aos.js"></script>
<script src="/js/main.js"></script>
<!-- PWA Service Worker -->
<script>
if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
navigator.serviceWorker.register('/sw.js')
.then(registration => {
console.log('SW registered: ', registration);
})
.catch(registrationError => {
console.log('SW registration failed: ', registrationError);
});
});
}
</script>
<!-- Analytics -->
<% if (settings && settings.seo && settings.seo.googleAnalytics) { %>
<!-- Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=<%= settings.seo.googleAnalytics %>"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', '<%= settings.seo.googleAnalytics %>');
</script>
<% } %>
</body>
</html>

View File

@@ -0,0 +1,103 @@
<footer class="bg-gray-900 text-white">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12">
<div class="grid grid-cols-1 md:grid-cols-4 gap-8">
<!-- Company Info -->
<div class="md:col-span-2">
<div class="flex items-center mb-4">
<img class="h-8 w-auto" src="<%= settings && settings.logo ? settings.logo : '/images/logo.png' %>" alt="SmartSolTech">
<span class="ml-2 text-xl font-bold">SmartSolTech</span>
</div>
<p class="text-gray-300 mb-4">
<%= settings && settings.siteDescription ? settings.siteDescription : '혁신적인 기술 솔루션으로 비즈니스의 성장을 지원합니다.' %>
</p>
<!-- Social Links -->
<div class="flex space-x-4">
<% if (settings && settings.social) { %>
<% if (settings.social.facebook) { %>
<a href="<%= settings.social.facebook %>" target="_blank" class="text-gray-300 hover:text-white transition-colors">
<svg class="h-6 w-6" fill="currentColor" viewBox="0 0 24 24">
<path d="M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z"/>
</svg>
</a>
<% } %>
<% if (settings.social.twitter) { %>
<a href="<%= settings.social.twitter %>" target="_blank" class="text-gray-300 hover:text-white transition-colors">
<svg class="h-6 w-6" fill="currentColor" viewBox="0 0 24 24">
<path d="M23.953 4.57a10 10 0 01-2.825.775 4.958 4.958 0 002.163-2.723c-.951.555-2.005.959-3.127 1.184a4.92 4.92 0 00-8.384 4.482C7.69 8.095 4.067 6.13 1.64 3.162a4.822 4.822 0 00-.666 2.475c0 1.71.87 3.213 2.188 4.096a4.904 4.904 0 01-2.228-.616v.06a4.923 4.923 0 003.946 4.827 4.996 4.996 0 01-2.212.085 4.936 4.936 0 004.604 3.417 9.867 9.867 0 01-6.102 2.105c-.39 0-.779-.023-1.17-.067a13.995 13.995 0 007.557 2.209c9.053 0 13.998-7.496 13.998-13.985 0-.21 0-.42-.015-.63A9.935 9.935 0 0024 4.59z"/>
</svg>
</a>
<% } %>
<% if (settings.social.linkedin) { %>
<a href="<%= settings.social.linkedin %>" target="_blank" class="text-gray-300 hover:text-white transition-colors">
<svg class="h-6 w-6" fill="currentColor" viewBox="0 0 24 24">
<path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/>
</svg>
</a>
<% } %>
<% if (settings.social.github) { %>
<a href="<%= settings.social.github %>" target="_blank" class="text-gray-300 hover:text-white transition-colors">
<svg class="h-6 w-6" fill="currentColor" viewBox="0 0 24 24">
<path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/>
</svg>
</a>
<% } %>
<% } %>
</div>
</div>
<!-- Quick Links -->
<div>
<h3 class="text-lg font-semibold mb-4">빠른 링크</h3>
<ul class="space-y-2">
<li><a href="/" class="text-gray-300 hover:text-white transition-colors">홈</a></li>
<li><a href="/about" class="text-gray-300 hover:text-white transition-colors">회사소개</a></li>
<li><a href="/services" class="text-gray-300 hover:text-white transition-colors">서비스</a></li>
<li><a href="/portfolio" class="text-gray-300 hover:text-white transition-colors">포트폴리오</a></li>
<li><a href="/calculator" class="text-gray-300 hover:text-white transition-colors">견적 계산기</a></li>
</ul>
</div>
<!-- Contact Info -->
<div>
<h3 class="text-lg font-semibold mb-4">연락처</h3>
<ul class="space-y-2 text-gray-300">
<li class="flex items-center">
<svg class="h-5 w-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 8l7.89 4.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"></path>
</svg>
<a href="mailto:<%= settings && settings.contact ? settings.contact.email : 'info@smartsoltech.kr' %>" class="hover:text-white transition-colors">
<%= settings && settings.contact ? settings.contact.email : 'info@smartsoltech.kr' %>
</a>
</li>
<li class="flex items-center">
<svg class="h-5 w-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z"></path>
</svg>
<a href="tel:<%= settings && settings.contact ? settings.contact.phone : '+82-10-0000-0000' %>" class="hover:text-white transition-colors">
<%= settings && settings.contact ? settings.contact.phone : '+82-10-0000-0000' %>
</a>
</li>
<li class="flex items-start">
<svg class="h-5 w-5 mr-2 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z"></path>
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 11a3 3 0 11-6 0 3 3 0 016 0z"></path>
</svg>
<span><%= settings && settings.contact ? settings.contact.address : 'Seoul, South Korea' %></span>
</li>
</ul>
</div>
</div>
<!-- Bottom Section -->
<div class="border-t border-gray-800 mt-8 pt-8 flex flex-col md:flex-row justify-between items-center">
<p class="text-gray-300 text-sm">
© <%= new Date().getFullYear() %> SmartSolTech. All rights reserved.
</p>
<div class="flex space-x-6 mt-4 md:mt-0">
<a href="/privacy" class="text-gray-300 hover:text-white text-sm transition-colors">개인정보처리방침</a>
<a href="/terms" class="text-gray-300 hover:text-white text-sm transition-colors">이용약관</a>
</div>
</div>
</div>
</footer>

125
views/partials/footer.ejs Normal file
View File

@@ -0,0 +1,125 @@
<footer class="bg-gray-900 dark:bg-gray-950 text-white footer-gradient">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-12">
<div class="grid grid-cols-1 md:grid-cols-4 gap-8">
<!-- Company Info -->
<div class="md:col-span-2">
<div class="flex items-center mb-4">
<img class="h-8 w-auto" src="<%= settings && settings.logo ? settings.logo : '/images/logo.png' %>" alt="SmartSolTech">
<span class="ml-2 text-xl font-bold">SmartSolTech</span>
</div>
<p class="text-gray-300 dark:text-gray-400 mb-4">
<%- __('footer.company.description') %>
</p>
<!-- Social Links -->
<div class="flex space-x-4">
<% if (settings && settings.social) { %>
<% if (settings.social.facebook) { %>
<a href="<%= settings.social.facebook %>" target="_blank" class="text-gray-300 dark:text-gray-400 hover:text-white dark:hover:text-gray-200 transition-colors">
<svg class="h-6 w-6" fill="currentColor" viewBox="0 0 24 24">
<path d="M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z"/>
</svg>
</a>
<% } %>
<% if (settings.social.twitter) { %>
<a href="<%= settings.social.twitter %>" target="_blank" class="text-gray-300 dark:text-gray-400 hover:text-white dark:hover:text-gray-200 transition-colors">
<svg class="h-6 w-6" fill="currentColor" viewBox="0 0 24 24">
<path d="M23.953 4.57a10 10 0 01-2.825.775 4.958 4.958 0 002.163-2.723c-.951.555-2.005.959-3.127 1.184a4.92 4.92 0 00-8.384 4.482C7.69 8.095 4.067 6.13 1.64 3.162a4.822 4.822 0 00-.666 2.475c0 1.71.87 3.213 2.188 4.096a4.904 4.904 0 01-2.228-.616v.06a4.923 4.923 0 003.946 4.827 4.996 4.996 0 01-2.212.085 4.936 4.936 0 004.604 3.417 9.867 9.867 0 01-6.102 2.105c-.39 0-.779-.023-1.17-.067a13.995 13.995 0 007.557 2.209c9.053 0 13.998-7.496 13.998-13.985 0-.21 0-.42-.015-.63A9.935 9.935 0 0024 4.59z"/>
</svg>
</a>
<% } %>
<% if (settings.social.linkedin) { %>
<a href="<%= settings.social.linkedin %>" target="_blank" class="text-gray-300 dark:text-gray-400 hover:text-white dark:hover:text-gray-200 transition-colors">
<svg class="h-6 w-6" fill="currentColor" viewBox="0 0 24 24">
<path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/>
</svg>
</a>
<% } %>
<% if (settings.social.github) { %>
<a href="<%= settings.social.github %>" target="_blank" class="text-gray-300 dark:text-gray-400 hover:text-white dark:hover:text-gray-200 transition-colors">
<svg class="h-6 w-6" fill="currentColor" viewBox="0 0 24 24">
<path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/>
</svg>
</a>
<% } %>
<% } else { %>
<!-- Default social links -->
<a href="#" class="text-gray-300 dark:text-gray-400 hover:text-white dark:hover:text-gray-200 transition-colors">
<svg class="h-6 w-6" fill="currentColor" viewBox="0 0 24 24">
<path d="M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z"/>
</svg>
</a>
<a href="#" class="text-gray-300 dark:text-gray-400 hover:text-white dark:hover:text-gray-200 transition-colors">
<svg class="h-6 w-6" fill="currentColor" viewBox="0 0 24 24">
<path d="M23.953 4.57a10 10 0 01-2.825.775 4.958 4.958 0 002.163-2.723c-.951.555-2.005.959-3.127 1.184a4.92 4.92 0 00-8.384 4.482C7.69 8.095 4.067 6.13 1.64 3.162a4.822 4.822 0 00-.666 2.475c0 1.71.87 3.213 2.188 4.096a4.904 4.904 0 01-2.228-.616v.06a4.923 4.923 0 003.946 4.827 4.996 4.996 0 01-2.212.085 4.936 4.936 0 004.604 3.417 9.867 9.867 0 01-6.102 2.105c-.39 0-.779-.023-1.17-.067a13.995 13.995 0 007.557 2.209c9.053 0 13.998-7.496 13.998-13.985 0-.21 0-.42-.015-.63A9.935 9.935 0 0024 4.59z"/>
</svg>
</a>
<a href="#" class="text-gray-300 dark:text-gray-400 hover:text-white dark:hover:text-gray-200 transition-colors">
<svg class="h-6 w-6" fill="currentColor" viewBox="0 0 24 24">
<path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433c-1.144 0-2.063-.926-2.063-2.065 0-1.138.92-2.063 2.063-2.063 1.14 0 2.064.925 2.064 2.063 0 1.139-.925 2.065-2.064 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/>
</svg>
</a>
<a href="#" class="text-gray-300 dark:text-gray-400 hover:text-white dark:hover:text-gray-200 transition-colors">
<svg class="h-6 w-6" fill="currentColor" viewBox="0 0 24 24">
<path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/>
</svg>
</a>
<% } %>
</div>
</div>
<!-- Quick Links -->
<div>
<h3 class="text-lg font-semibold mb-4"><%- __('footer.links.title') %></h3>
<ul class="space-y-2">
<li><a href="/" class="text-gray-300 dark:text-gray-400 hover:text-white dark:hover:text-gray-200 transition-colors"><%- __('nav.home') %></a></li>
<li><a href="/about" class="text-gray-300 dark:text-gray-400 hover:text-white dark:hover:text-gray-200 transition-colors"><%- __('nav.about') %></a></li>
<li><a href="/services" class="text-gray-300 dark:text-gray-400 hover:text-white dark:hover:text-gray-200 transition-colors"><%- __('nav.services') %></a></li>
<li><a href="/portfolio" class="text-gray-300 dark:text-gray-400 hover:text-white dark:hover:text-gray-200 transition-colors"><%- __('nav.portfolio') %></a></li>
<li><a href="/calculator" class="text-gray-300 dark:text-gray-400 hover:text-white dark:hover:text-gray-200 transition-colors"><%- __('nav.calculator') %></a></li>
</ul>
</div>
<!-- Contact Info -->
<div>
<h3 class="text-lg font-semibold mb-4"><%- __('footer.contact.title') %></h3>
<ul class="space-y-2 text-gray-300 dark:text-gray-400">
<li class="flex items-center">
<svg class="h-5 w-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 8l7.89 4.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"></path>
</svg>
<a href="mailto:<%= settings && settings.contact ? settings.contact.email : __('footer.contact.email') %>" class="hover:text-white dark:hover:text-gray-200 transition-colors">
<%= settings && settings.contact ? settings.contact.email : __('footer.contact.email') %>
</a>
</li>
<li class="flex items-center">
<svg class="h-5 w-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z"></path>
</svg>
<a href="tel:<%= settings && settings.contact ? settings.contact.phone : __('footer.contact.phone') %>" class="hover:text-white dark:hover:text-gray-200 transition-colors">
<%= settings && settings.contact ? settings.contact.phone : __('footer.contact.phone') %>
</a>
</li>
<li class="flex items-start">
<svg class="h-5 w-5 mr-2 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z"></path>
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 11a3 3 0 11-6 0 3 3 0 016 0z"></path>
</svg>
<span><%= settings && settings.contact ? settings.contact.address : __('footer.contact.address') %></span>
</li>
</ul>
</div>
</div>
<!-- Bottom Section -->
<div class="border-t border-gray-800 dark:border-gray-700 mt-8 pt-8 flex flex-col md:flex-row justify-between items-center">
<p class="text-gray-300 dark:text-gray-400 text-sm">
<%- __('footer.copyright', { year: new Date().getFullYear() }) %>
</p>
<div class="flex space-x-6 mt-4 md:mt-0">
<a href="/privacy" class="text-gray-300 dark:text-gray-400 hover:text-white dark:hover:text-gray-200 text-sm transition-colors"><%- __('footer.privacy') %></a>
<a href="/terms" class="text-gray-300 dark:text-gray-400 hover:text-white dark:hover:text-gray-200 text-sm transition-colors"><%- __('footer.terms') %></a>
</div>
</div>
</div>
</footer>

View File

@@ -0,0 +1,80 @@
<nav class="bg-white shadow-lg fixed w-full z-50 top-0">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="flex justify-between h-16">
<div class="flex items-center">
<!-- Logo -->
<a href="/" class="flex-shrink-0 flex items-center">
<img class="h-8 w-auto" src="<%= settings && settings.logo ? settings.logo : '/images/logo.png' %>" alt="SmartSolTech">
<span class="ml-2 text-xl font-bold text-gray-900">SmartSolTech</span>
</a>
</div>
<!-- Desktop Navigation -->
<div class="hidden md:flex items-center space-x-8">
<a href="/" class="<%= currentPage === 'home' ? 'text-blue-600 border-b-2 border-blue-600' : 'text-gray-700 hover:text-blue-600' %> px-3 py-2 text-sm font-medium transition-colors">
</a>
<a href="/about" class="<%= currentPage === 'about' ? 'text-blue-600 border-b-2 border-blue-600' : 'text-gray-700 hover:text-blue-600' %> px-3 py-2 text-sm font-medium transition-colors">
회사소개
</a>
<a href="/services" class="<%= currentPage === 'services' ? 'text-blue-600 border-b-2 border-blue-600' : 'text-gray-700 hover:text-blue-600' %> px-3 py-2 text-sm font-medium transition-colors">
서비스
</a>
<a href="/portfolio" class="<%= currentPage === 'portfolio' ? 'text-blue-600 border-b-2 border-blue-600' : 'text-gray-700 hover:text-blue-600' %> px-3 py-2 text-sm font-medium transition-colors">
포트폴리오
</a>
<a href="/calculator" class="<%= currentPage === 'calculator' ? 'text-blue-600 border-b-2 border-blue-600' : 'text-gray-700 hover:text-blue-600' %> px-3 py-2 text-sm font-medium transition-colors">
견적 계산기
</a>
<a href="/contact" class="<%= currentPage === 'contact' ? 'text-blue-600 border-b-2 border-blue-600' : 'text-gray-700 hover:text-blue-600' %> px-3 py-2 text-sm font-medium transition-colors">
연락처
</a>
<!-- CTA Button -->
<a href="/contact" class="bg-blue-600 text-white px-4 py-2 rounded-lg text-sm font-medium hover:bg-blue-700 transition-colors">
프로젝트 시작하기
</a>
</div>
<!-- Mobile menu button -->
<div class="md:hidden flex items-center">
<button type="button" class="mobile-menu-button text-gray-400 hover:text-gray-500 hover:bg-gray-100 focus:outline-none focus:ring-2 focus:ring-inset focus:ring-blue-500 p-2 rounded-md">
<span class="sr-only">메뉴 열기</span>
<svg class="h-6 w-6" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16" />
</svg>
</button>
</div>
</div>
</div>
<!-- Mobile Navigation Menu -->
<div class="mobile-menu hidden md:hidden">
<div class="px-2 pt-2 pb-3 space-y-1 sm:px-3 bg-white border-t">
<a href="/" class="<%= currentPage === 'home' ? 'bg-blue-50 text-blue-600' : 'text-gray-700 hover:bg-gray-50' %> block px-3 py-2 rounded-md text-base font-medium">
</a>
<a href="/about" class="<%= currentPage === 'about' ? 'bg-blue-50 text-blue-600' : 'text-gray-700 hover:bg-gray-50' %> block px-3 py-2 rounded-md text-base font-medium">
회사소개
</a>
<a href="/services" class="<%= currentPage === 'services' ? 'bg-blue-50 text-blue-600' : 'text-gray-700 hover:bg-gray-50' %> block px-3 py-2 rounded-md text-base font-medium">
서비스
</a>
<a href="/portfolio" class="<%= currentPage === 'portfolio' ? 'bg-blue-50 text-blue-600' : 'text-gray-700 hover:bg-gray-50' %> block px-3 py-2 rounded-md text-base font-medium">
포트폴리오
</a>
<a href="/calculator" class="<%= currentPage === 'calculator' ? 'bg-blue-50 text-blue-600' : 'text-gray-700 hover:bg-gray-50' %> block px-3 py-2 rounded-md text-base font-medium">
견적 계산기
</a>
<a href="/contact" class="<%= currentPage === 'contact' ? 'bg-blue-50 text-blue-600' : 'text-gray-700 hover:bg-gray-50' %> block px-3 py-2 rounded-md text-base font-medium">
연락처
</a>
<a href="/contact" class="bg-blue-600 text-white block px-3 py-2 rounded-md text-base font-medium">
프로젝트 시작하기
</a>
</div>
</div>
</nav>
<!-- Spacer for fixed navigation -->
<div class="h-16"></div>

View File

@@ -0,0 +1,207 @@
<nav class="bg-white dark:bg-gray-900 shadow-lg fixed w-full z-50 top-0 transition-colors duration-300">
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div class="flex justify-between h-16">
<div class="flex items-center">
<!-- Logo -->
<a href="/" class="flex-shrink-0 flex items-center">
<img class="h-8 w-auto" src="<%= settings && settings.logo ? settings.logo : '/images/logo.png' %>" alt="SmartSolTech">
<span class="ml-2 text-xl font-bold text-gray-900 dark:text-white">SmartSolTech</span>
</a>
</div>
<!-- Desktop Navigation -->
<div class="hidden md:flex items-center space-x-6">
<!-- Navigation Links -->
<a href="/" class="<%= currentPage === 'home' ? 'text-blue-600 border-b-2 border-blue-600' : 'text-gray-700 dark:text-gray-300 hover:text-blue-600' %> px-3 py-2 text-sm font-medium transition-colors nav-link">
<%- __('navigation.home') %>
</a>
<a href="/about" class="<%= currentPage === 'about' ? 'text-blue-600 border-b-2 border-blue-600' : 'text-gray-700 dark:text-gray-300 hover:text-blue-600' %> px-3 py-2 text-sm font-medium transition-colors nav-link">
<%- __('navigation.about') %>
</a>
<a href="/services" class="<%= currentPage === 'services' ? 'text-blue-600 border-b-2 border-blue-600' : 'text-gray-700 dark:text-gray-300 hover:text-blue-600' %> px-3 py-2 text-sm font-medium transition-colors nav-link">
<%- __('navigation.services') %>
</a>
<a href="/portfolio" class="<%= currentPage === 'portfolio' ? 'text-blue-600 border-b-2 border-blue-600' : 'text-gray-700 dark:text-gray-300 hover:text-blue-600' %> px-3 py-2 text-sm font-medium transition-colors nav-link">
<%- __('navigation.portfolio') %>
</a>
<a href="/calculator" class="<%= currentPage === 'calculator' ? 'text-blue-600 border-b-2 border-blue-600' : 'text-gray-700 dark:text-gray-300 hover:text-blue-600' %> px-3 py-2 text-sm font-medium transition-colors nav-link">
<%- __('navigation.calculator') %>
</a>
<a href="/contact" class="<%= currentPage === 'contact' ? 'text-blue-600 border-b-2 border-blue-600' : 'text-gray-700 dark:text-gray-300 hover:text-blue-600' %> px-3 py-2 text-sm font-medium transition-colors nav-link">
<%- __('navigation.contact') %>
</a>
<!-- Language Dropdown -->
<div class="relative group">
<button class="flex items-center text-gray-700 dark:text-gray-300 hover:text-blue-600 px-3 py-2 text-sm font-medium transition-colors" id="language-dropdown">
<i class="fas fa-globe mr-2"></i>
<%- __('language.' + currentLanguage) %>
<i class="fas fa-chevron-down ml-1 text-xs"></i>
</button>
<div class="absolute right-0 mt-2 w-40 bg-white dark:bg-gray-800 rounded-lg shadow-lg border dark:border-gray-700 opacity-0 invisible group-hover:opacity-100 group-hover:visible transition-all duration-200">
<a href="/lang/ko" class="block px-4 py-2 text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-t-lg">
🇰🇷 <%- __('language.korean') %>
</a>
<a href="/lang/en" class="block px-4 py-2 text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700">
🇺🇸 <%- __('language.english') %>
</a>
<a href="/lang/ru" class="block px-4 py-2 text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700">
🇷🇺 <%- __('language.russian') %>
</a>
<a href="/lang/kk" class="block px-4 py-2 text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-b-lg">
🇰🇿 <%- __('language.kazakh') %>
</a>
</div>
</div>
<!-- Theme Toggle -->
<button id="theme-toggle" class="p-2 text-gray-700 dark:text-gray-300 hover:text-blue-600 transition-colors" title="<%- __('theme.toggle') %>">
<i class="fas fa-sun dark:hidden"></i>
<i class="fas fa-moon hidden dark:block"></i>
</button>
<!-- CTA Button -->
<a href="/contact" class="bg-blue-600 text-white px-4 py-2 rounded-lg text-sm font-medium hover:bg-blue-700 transition-colors btn-primary">
<%- __('hero.cta_primary') %>
</a>
</div>
<!-- Mobile menu button -->
<div class="md:hidden flex items-center space-x-2">
<!-- Mobile Theme Toggle -->
<button id="mobile-theme-toggle" class="p-2 text-gray-700 dark:text-gray-300 hover:text-blue-600 transition-colors">
<i class="fas fa-sun dark:hidden"></i>
<i class="fas fa-moon hidden dark:block"></i>
</button>
<!-- Mobile Language Toggle -->
<div class="relative">
<button id="mobile-language-toggle" class="p-2 text-gray-700 dark:text-gray-300 hover:text-blue-600 transition-colors">
<i class="fas fa-globe"></i>
</button>
<div id="mobile-language-menu" class="absolute right-0 mt-2 w-40 bg-white dark:bg-gray-800 rounded-lg shadow-lg border dark:border-gray-700 hidden">
<a href="/lang/ko" class="block px-4 py-2 text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-t-lg">
🇰🇷 <%- __('language.korean') %>
</a>
<a href="/lang/en" class="block px-4 py-2 text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700">
🇺🇸 <%- __('language.english') %>
</a>
<a href="/lang/ru" class="block px-4 py-2 text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700">
🇷🇺 <%- __('language.russian') %>
</a>
<a href="/lang/kk" class="block px-4 py-2 text-sm text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700 rounded-b-lg">
🇰🇿 <%- __('language.kazakh') %>
</a>
</div>
</div>
<!-- Hamburger Menu -->
<button id="mobile-menu-toggle" class="p-2 text-gray-700 dark:text-gray-300 hover:text-blue-600 transition-colors">
<svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16"></path>
</svg>
</button>
</div>
</div>
</div>
<!-- Mobile Navigation Menu -->
<div id="mobile-menu" class="md:hidden hidden bg-white dark:bg-gray-900 border-t dark:border-gray-700">
<div class="px-2 pt-2 pb-3 space-y-1">
<a href="/" class="<%= currentPage === 'home' ? 'bg-blue-50 dark:bg-blue-900 text-blue-600' : 'text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700' %> block px-3 py-2 rounded-md text-base font-medium">
<%- __('navigation.home') %>
</a>
<a href="/about" class="<%= currentPage === 'about' ? 'bg-blue-50 dark:bg-blue-900 text-blue-600' : 'text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700' %> block px-3 py-2 rounded-md text-base font-medium">
<%- __('navigation.about') %>
</a>
<a href="/services" class="<%= currentPage === 'services' ? 'bg-blue-50 dark:bg-blue-900 text-blue-600' : 'text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700' %> block px-3 py-2 rounded-md text-base font-medium">
<%- __('navigation.services') %>
</a>
<a href="/portfolio" class="<%= currentPage === 'portfolio' ? 'bg-blue-50 dark:bg-blue-900 text-blue-600' : 'text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700' %> block px-3 py-2 rounded-md text-base font-medium">
<%- __('navigation.portfolio') %>
</a>
<a href="/calculator" class="<%= currentPage === 'calculator' ? 'bg-blue-50 dark:bg-blue-900 text-blue-600' : 'text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700' %> block px-3 py-2 rounded-md text-base font-medium">
<%- __('navigation.calculator') %>
</a>
<a href="/contact" class="<%= currentPage === 'contact' ? 'bg-blue-50 dark:bg-blue-900 text-blue-600' : 'text-gray-700 dark:text-gray-300 hover:bg-gray-100 dark:hover:bg-gray-700' %> block px-3 py-2 rounded-md text-base font-medium">
<%- __('navigation.contact') %>
</a>
<!-- Mobile CTA -->
<div class="pt-4 pb-2">
<a href="/contact" class="block w-full bg-blue-600 text-white text-center px-4 py-2 rounded-lg text-sm font-medium hover:bg-blue-700 transition-colors">
<%- __('hero.cta_primary') %>
</a>
</div>
</div>
</div>
</nav>
<script>
document.addEventListener('DOMContentLoaded', function() {
// Theme Management
const themeToggle = document.getElementById('theme-toggle');
const mobileThemeToggle = document.getElementById('mobile-theme-toggle');
const html = document.documentElement;
// Get current theme
const currentTheme = localStorage.getItem('theme') ||
(window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light');
// Apply theme
if (currentTheme === 'dark') {
html.classList.add('dark');
} else {
html.classList.remove('dark');
}
// Theme toggle handlers
function toggleTheme() {
const isDark = html.classList.contains('dark');
if (isDark) {
html.classList.remove('dark');
localStorage.setItem('theme', 'light');
fetch('/theme/light');
} else {
html.classList.add('dark');
localStorage.setItem('theme', 'dark');
fetch('/theme/dark');
}
}
if (themeToggle) {
themeToggle.addEventListener('click', toggleTheme);
}
if (mobileThemeToggle) {
mobileThemeToggle.addEventListener('click', toggleTheme);
}
// Mobile Menu Management
const mobileMenuToggle = document.getElementById('mobile-menu-toggle');
const mobileMenu = document.getElementById('mobile-menu');
if (mobileMenuToggle && mobileMenu) {
mobileMenuToggle.addEventListener('click', function() {
mobileMenu.classList.toggle('hidden');
});
}
// Mobile Language Menu
const mobileLanguageToggle = document.getElementById('mobile-language-toggle');
const mobileLanguageMenu = document.getElementById('mobile-language-menu');
if (mobileLanguageToggle && mobileLanguageMenu) {
mobileLanguageToggle.addEventListener('click', function() {
mobileLanguageMenu.classList.toggle('hidden');
});
// Close language menu when clicking outside
document.addEventListener('click', function(event) {
if (!mobileLanguageToggle.contains(event.target) && !mobileLanguageMenu.contains(event.target)) {
mobileLanguageMenu.classList.add('hidden');
}
});
}
});
</script>

473
views/portfolio-detail.ejs Normal file
View File

@@ -0,0 +1,473 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title><%= portfolio.title %> - SmartSolTech 포트폴리오</title>
<!-- SEO Meta Tags -->
<meta name="description" content="<%= portfolio.seo?.metaDescription || portfolio.shortDescription || portfolio.description %>">
<meta name="keywords" content="<%= portfolio.seo?.keywords?.join(', ') || portfolio.technologies?.join(', ') %>">
<!-- Open Graph -->
<meta property="og:title" content="<%= portfolio.title %> - SmartSolTech">
<meta property="og:description" content="<%= portfolio.shortDescription || portfolio.description %>">
<meta property="og:type" content="article">
<% if (portfolio.images && portfolio.images.length > 0) { %>
<meta property="og:image" content="<%= portfolio.images.find(img => img.isPrimary)?.url || portfolio.images[0].url %>">
<% } %>
<!-- PWA -->
<meta name="theme-color" content="#3B82F6">
<link rel="manifest" href="/manifest.json">
<link rel="apple-touch-icon" href="/images/icons/icon-192x192.png">
<!-- Styles -->
<link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
<link href="https://unpkg.com/aos@2.3.1/dist/aos.css" rel="stylesheet">
<link href="https://unpkg.com/swiper@8/swiper-bundle.min.css" rel="stylesheet">
<link href="/css/main.css" rel="stylesheet">
<link href="/css/fixes.css" rel="stylesheet">
</head>
<body>
<%- include('partials/navigation') %>
<!-- Portfolio Header -->
<section class="pt-20 pb-12 bg-gradient-to-br from-gray-900 via-blue-900 to-purple-900">
<div class="container mx-auto px-4">
<!-- Breadcrumb -->
<nav class="flex text-white text-sm mb-8" data-aos="fade-up">
<a href="/" class="hover:text-blue-300 transition-colors">홈</a>
<span class="mx-2">/</span>
<a href="/portfolio" class="hover:text-blue-300 transition-colors">포트폴리오</a>
<span class="mx-2">/</span>
<span class="text-blue-300"><%= portfolio.title %></span>
</nav>
<div class="grid grid-cols-1 lg:grid-cols-2 gap-12 items-center">
<!-- Project Info -->
<div class="text-white" data-aos="fade-right">
<div class="flex items-center gap-4 mb-4">
<span class="bg-blue-600 text-white px-4 py-2 rounded-full text-sm font-semibold">
<%= getCategoryName(portfolio.category) %>
</span>
<% if (portfolio.featured) { %>
<span class="bg-yellow-500 text-white px-3 py-1 rounded-full text-xs font-bold">
<i class="fas fa-star"></i> FEATURED
</span>
<% } %>
<% if (portfolio.status === 'completed') { %>
<span class="bg-green-500 text-white px-3 py-1 rounded-full text-xs font-semibold">
<i class="fas fa-check"></i> 완료
</span>
<% } else if (portfolio.status === 'in-progress') { %>
<span class="bg-orange-500 text-white px-3 py-1 rounded-full text-xs font-semibold">
<i class="fas fa-cog fa-spin"></i> 진행 중
</span>
<% } %>
</div>
<h1 class="text-4xl md:text-5xl font-bold mb-6">
<%= portfolio.title %>
</h1>
<p class="text-xl text-gray-300 mb-8 leading-relaxed">
<%= portfolio.description %>
</p>
<!-- Project Stats -->
<div class="grid grid-cols-3 gap-6 mb-8">
<div class="text-center">
<div class="text-2xl font-bold text-blue-300"><%= portfolio.viewCount || 0 %></div>
<div class="text-sm text-gray-400">조회수</div>
</div>
<div class="text-center">
<div class="text-2xl font-bold text-red-300"><%= portfolio.likes || 0 %></div>
<div class="text-sm text-gray-400">좋아요</div>
</div>
<div class="text-center">
<div class="text-2xl font-bold text-yellow-300">
<%= portfolio.completedAt ? new Date(portfolio.completedAt).getFullYear() : new Date().getFullYear() %>
</div>
<div class="text-sm text-gray-400">완료년도</div>
</div>
</div>
<!-- Action Buttons -->
<div class="flex flex-col sm:flex-row gap-4">
<% if (portfolio.projectUrl) { %>
<a href="<%= portfolio.projectUrl %>"
target="_blank"
rel="noopener noreferrer"
class="bg-white text-blue-900 px-6 py-3 rounded-full font-semibold hover:bg-gray-100 transition-colors flex items-center justify-center">
<i class="fas fa-external-link-alt mr-2"></i>
프로젝트 보기
</a>
<% } %>
<button id="like-btn"
class="border-2 border-white text-white px-6 py-3 rounded-full font-semibold hover:bg-white hover:text-blue-900 transition-colors flex items-center justify-center">
<i class="fas fa-heart mr-2"></i>
좋아요 (<span id="like-count"><%= portfolio.likes || 0 %></span>)
</button>
</div>
</div>
<!-- Project Preview Image -->
<div class="relative" data-aos="fade-left">
<% if (portfolio.images && portfolio.images.length > 0) { %>
<div class="relative rounded-2xl overflow-hidden shadow-2xl">
<img src="<%= portfolio.images.find(img => img.isPrimary)?.url || portfolio.images[0].url %>"
alt="<%= portfolio.title %>"
class="w-full h-auto max-h-96 object-cover">
<div class="absolute inset-0 bg-gradient-to-t from-black/20 to-transparent"></div>
</div>
<% } else { %>
<div class="w-full h-96 bg-gradient-to-br from-blue-400 to-purple-500 rounded-2xl flex items-center justify-center">
<i class="fas fa-code text-white text-6xl opacity-50"></i>
</div>
<% } %>
</div>
</div>
</div>
</section>
<!-- Project Details -->
<section class="section-padding">
<div class="container mx-auto px-4">
<div class="grid grid-cols-1 lg:grid-cols-3 gap-12">
<!-- Main Content -->
<div class="lg:col-span-2">
<!-- Project Images Gallery -->
<% if (portfolio.images && portfolio.images.length > 1) { %>
<div class="mb-12" data-aos="fade-up">
<h2 class="text-3xl font-bold text-gray-900 mb-6">프로젝트 갤러리</h2>
<!-- Swiper -->
<div class="swiper portfolio-swiper">
<div class="swiper-wrapper">
<% portfolio.images.forEach(image => { %>
<div class="swiper-slide">
<div class="relative rounded-xl overflow-hidden shadow-lg">
<img src="<%= image.url %>"
alt="<%= image.alt || portfolio.title %>"
class="w-full h-64 md:h-80 object-cover">
<div class="absolute bottom-0 left-0 right-0 bg-gradient-to-t from-black/70 to-transparent p-4">
<p class="text-white text-sm"><%= image.alt || portfolio.title %></p>
</div>
</div>
</div>
<% }) %>
</div>
<div class="swiper-pagination"></div>
<div class="swiper-button-next"></div>
<div class="swiper-button-prev"></div>
</div>
</div>
<% } %>
<!-- Project Description -->
<div class="mb-12" data-aos="fade-up">
<h2 class="text-3xl font-bold text-gray-900 mb-6">프로젝트 개요</h2>
<div class="prose max-w-none text-gray-600 leading-relaxed">
<%= portfolio.description %>
</div>
</div>
<!-- Technologies Used -->
<% if (portfolio.technologies && portfolio.technologies.length > 0) { %>
<div class="mb-12" data-aos="fade-up">
<h2 class="text-3xl font-bold text-gray-900 mb-6">사용된 기술</h2>
<div class="grid grid-cols-2 md:grid-cols-3 gap-4">
<% portfolio.technologies.forEach(tech => { %>
<div class="bg-gradient-to-r from-blue-50 to-purple-50 border border-blue-200 rounded-lg p-4 text-center hover:shadow-md transition-shadow">
<div class="font-semibold text-gray-800"><%= tech %></div>
</div>
<% }) %>
</div>
</div>
<% } %>
<!-- Share Section -->
<div class="border-t pt-8" data-aos="fade-up">
<h3 class="text-xl font-bold text-gray-900 mb-4">이 프로젝트 공유하기</h3>
<div class="flex gap-4">
<button onclick="shareOnSocial('facebook')"
class="bg-blue-600 text-white p-3 rounded-full hover:bg-blue-700 transition-colors">
<i class="fab fa-facebook text-lg"></i>
</button>
<button onclick="shareOnSocial('twitter')"
class="bg-blue-400 text-white p-3 rounded-full hover:bg-blue-500 transition-colors">
<i class="fab fa-twitter text-lg"></i>
</button>
<button onclick="shareOnSocial('linkedin')"
class="bg-blue-700 text-white p-3 rounded-full hover:bg-blue-800 transition-colors">
<i class="fab fa-linkedin text-lg"></i>
</button>
<button onclick="copyToClipboard()"
class="bg-gray-600 text-white p-3 rounded-full hover:bg-gray-700 transition-colors">
<i class="fas fa-link text-lg"></i>
</button>
</div>
</div>
</div>
<!-- Sidebar -->
<div class="lg:col-span-1">
<!-- Project Info -->
<div class="bg-white rounded-2xl shadow-lg p-6 mb-8" data-aos="fade-up">
<h3 class="text-xl font-bold text-gray-900 mb-6">프로젝트 정보</h3>
<div class="space-y-4">
<% if (portfolio.clientName) { %>
<div>
<div class="text-sm text-gray-500 font-medium">클라이언트</div>
<div class="text-gray-900"><%= portfolio.clientName %></div>
</div>
<% } %>
<div>
<div class="text-sm text-gray-500 font-medium">카테고리</div>
<div class="text-gray-900"><%= getCategoryName(portfolio.category) %></div>
</div>
<% if (portfolio.completedAt) { %>
<div>
<div class="text-sm text-gray-500 font-medium">완료일</div>
<div class="text-gray-900">
<%= new Date(portfolio.completedAt).toLocaleDateString('ko-KR') %>
</div>
</div>
<% } %>
<% if (portfolio.projectUrl) { %>
<div>
<div class="text-sm text-gray-500 font-medium">프로젝트 URL</div>
<a href="<%= portfolio.projectUrl %>"
target="_blank"
rel="noopener noreferrer"
class="text-blue-600 hover:underline break-all">
<%= portfolio.projectUrl %>
</a>
</div>
<% } %>
</div>
</div>
<!-- Contact CTA -->
<div class="bg-gradient-to-br from-blue-600 to-purple-600 rounded-2xl shadow-lg p-6 text-white" data-aos="fade-up">
<h3 class="text-xl font-bold mb-4">비슷한 프로젝트가 필요하신가요?</h3>
<p class="text-blue-100 mb-6">
이런 프로젝트에 관심이 있으시다면 언제든 연락주세요.
무료 상담을 통해 최적의 솔루션을 제안해드리겠습니다.
</p>
<div class="space-y-3">
<a href="/contact"
class="block w-full bg-white text-blue-600 text-center py-3 rounded-lg font-semibold hover:bg-gray-100 transition-colors">
프로젝트 문의하기
</a>
<a href="/calculator"
class="block w-full border-2 border-white text-white text-center py-3 rounded-lg font-semibold hover:bg-white hover:text-blue-600 transition-colors">
비용 계산하기
</a>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- Related Projects -->
<section class="section-padding bg-gray-50">
<div class="container mx-auto px-4">
<div class="text-center mb-12" data-aos="fade-up">
<h2 class="text-3xl md:text-4xl font-bold text-gray-900 mb-4">
관련 프로젝트
</h2>
<p class="text-xl text-gray-600">
비슷한 카테고리의 다른 프로젝트들도 확인해보세요
</p>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
<% if (relatedProjects && relatedProjects.length > 0) { %>
<% relatedProjects.forEach((project, index) => { %>
<div class="bg-white rounded-xl shadow-lg overflow-hidden hover:shadow-xl transition-all duration-300 transform hover:-translate-y-2"
data-aos="fade-up"
data-aos-delay="<%= index * 100 %>">
<div class="relative h-48 overflow-hidden">
<% if (project.images && project.images.length > 0) { %>
<img src="<%= project.images.find(img => img.isPrimary)?.url || project.images[0].url %>"
alt="<%= project.title %>"
class="w-full h-full object-cover transition-transform duration-300 hover:scale-110">
<% } else { %>
<div class="w-full h-full bg-gradient-to-br from-blue-400 to-purple-500 flex items-center justify-center">
<i class="fas fa-code text-white text-3xl opacity-50"></i>
</div>
<% } %>
</div>
<div class="p-6">
<h3 class="text-xl font-bold text-gray-900 mb-2 line-clamp-1">
<%= project.title %>
</h3>
<p class="text-gray-600 mb-4 line-clamp-2">
<%= project.shortDescription || project.description %>
</p>
<a href="/portfolio/<%= project._id %>"
class="text-blue-600 font-semibold hover:underline">
자세히 보기 →
</a>
</div>
</div>
<% }) %>
<% } else { %>
<div class="col-span-full text-center py-8">
<p class="text-gray-500">관련 프로젝트가 없습니다.</p>
</div>
<% } %>
</div>
</div>
</section>
<%- include('partials/footer') %>
<!-- Scripts -->
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
<script src="https://unpkg.com/swiper@8/swiper-bundle.min.js"></script>
<script src="/js/main.js"></script>
<script>
// Initialize Swiper
if (document.querySelector('.portfolio-swiper')) {
const swiper = new Swiper('.portfolio-swiper', {
loop: true,
pagination: {
el: '.swiper-pagination',
clickable: true,
},
navigation: {
nextEl: '.swiper-button-next',
prevEl: '.swiper-button-prev',
},
autoplay: {
delay: 5000,
},
breakpoints: {
640: {
slidesPerView: 1,
},
768: {
slidesPerView: 1,
},
1024: {
slidesPerView: 1,
},
}
});
}
// Like functionality
document.getElementById('like-btn').addEventListener('click', async function() {
try {
const response = await fetch(`/api/portfolio/<%= portfolio._id %>/like`, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
}
});
const result = await response.json();
if (result.success) {
document.getElementById('like-count').textContent = result.likes;
this.classList.add('animate-pulse');
setTimeout(() => {
this.classList.remove('animate-pulse');
}, 1000);
}
} catch (error) {
console.error('Error liking project:', error);
}
});
// Social sharing
function shareOnSocial(platform) {
const url = encodeURIComponent(window.location.href);
const title = encodeURIComponent('<%= portfolio.title %>');
const description = encodeURIComponent('<%= portfolio.shortDescription || portfolio.description %>');
let shareUrl = '';
switch(platform) {
case 'facebook':
shareUrl = `https://www.facebook.com/sharer/sharer.php?u=${url}`;
break;
case 'twitter':
shareUrl = `https://twitter.com/intent/tweet?url=${url}&text=${title}`;
break;
case 'linkedin':
shareUrl = `https://www.linkedin.com/sharing/share-offsite/?url=${url}`;
break;
}
if (shareUrl) {
window.open(shareUrl, '_blank', 'width=600,height=400');
}
}
// Copy link to clipboard
function copyToClipboard() {
navigator.clipboard.writeText(window.location.href).then(function() {
// Show toast message
const toast = document.createElement('div');
toast.className = 'fixed bottom-4 right-4 bg-green-500 text-white px-4 py-2 rounded-lg shadow-lg z-50';
toast.textContent = '링크가 복사되었습니다!';
document.body.appendChild(toast);
setTimeout(() => {
toast.remove();
}, 3000);
}).catch(function(err) {
console.error('Error copying to clipboard:', err);
});
}
// Update view count
fetch(`/api/portfolio/<%= portfolio._id %>/view`, {
method: 'POST'
}).catch(err => console.error('Error updating view count:', err));
// Category name helper
function getCategoryName(category) {
const categoryNames = {
'web-development': '웹 개발',
'mobile-app': '모바일 앱',
'ui-ux-design': 'UI/UX 디자인',
'branding': '브랜딩',
'marketing': '디지털 마케팅'
};
return categoryNames[category] || category;
}
</script>
<%
// Helper function for category names
function getCategoryName(category) {
const categoryNames = {
'web-development': '웹 개발',
'mobile-app': '모바일 앱',
'ui-ux-design': 'UI/UX 디자인',
'branding': '브랜딩',
'marketing': '디지털 마케팅'
};
return categoryNames[category] || category;
}
%>
</body>
</html>

296
views/portfolio.ejs Normal file
View File

@@ -0,0 +1,296 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>포트폴리오 - SmartSolTech</title>
<!-- SEO Meta Tags -->
<meta name="description" content="SmartSolTech의 다양한 프로젝트와 성공 사례를 확인해보세요. 웹 개발, 모바일 앱, UI/UX 디자인 포트폴리오.">
<meta name="keywords" content="포트폴리오, 웹 개발, 모바일 앱, UI/UX 디자인, 프로젝트, SmartSolTech">
<!-- Open Graph -->
<meta property="og:title" content="포트폴리오 - SmartSolTech">
<meta property="og:description" content="SmartSolTech의 다양한 프로젝트와 성공 사례">
<meta property="og:type" content="website">
<!-- PWA -->
<meta name="theme-color" content="#3B82F6">
<link rel="manifest" href="/manifest.json">
<link rel="apple-touch-icon" href="/images/icons/icon-192x192.png">
<!-- Styles -->
<link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
<link href="https://unpkg.com/aos@2.3.1/dist/aos.css" rel="stylesheet">
<link href="/css/main.css" rel="stylesheet">
</head>
<body>
<%- include('partials/navigation') %>
<!-- Portfolio Hero Section -->
<section class="hero-section bg-gradient-to-br from-blue-600 via-purple-600 to-blue-800 pt-20">
<div class="container mx-auto px-4 py-20 text-center text-white">
<h1 class="text-5xl md:text-6xl font-bold mb-6" data-aos="fade-up">
우리의 <span class="text-yellow-300">포트폴리오</span>
</h1>
<p class="text-xl md:text-2xl mb-8 opacity-90" data-aos="fade-up" data-aos-delay="200">
혁신적인 프로젝트와 창의적인 솔루션들을 만나보세요
</p>
<div class="flex flex-wrap justify-center gap-4" data-aos="fade-up" data-aos-delay="400">
<button class="filter-btn bg-white text-blue-600 px-6 py-3 rounded-full font-semibold hover:bg-blue-50 transition-colors active" data-filter="all">
전체
</button>
<button class="filter-btn bg-blue-700 text-white px-6 py-3 rounded-full font-semibold hover:bg-blue-800 transition-colors" data-filter="web-development">
웹 개발
</button>
<button class="filter-btn bg-blue-700 text-white px-6 py-3 rounded-full font-semibold hover:bg-blue-800 transition-colors" data-filter="mobile-app">
모바일 앱
</button>
<button class="filter-btn bg-blue-700 text-white px-6 py-3 rounded-full font-semibold hover:bg-blue-800 transition-colors" data-filter="ui-ux-design">
UI/UX 디자인
</button>
</div>
</div>
</section>
<!-- Portfolio Grid -->
<section class="section-padding bg-gray-50">
<div class="container mx-auto px-4">
<div id="portfolio-grid" class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
<% if (portfolioItems && portfolioItems.length > 0) { %>
<% portfolioItems.forEach((item, index) => { %>
<div class="portfolio-item bg-white rounded-xl shadow-lg overflow-hidden hover:shadow-xl transition-all duration-300 transform hover:-translate-y-2"
data-category="<%= item.category %>"
data-aos="fade-up"
data-aos-delay="<%= index * 100 %>">
<!-- Project Image -->
<div class="relative overflow-hidden h-64">
<% if (item.images && item.images.length > 0) { %>
<img src="<%= item.images.find(img => img.isPrimary)?.url || item.images[0].url || '/images/placeholder-project.jpg' %>"
alt="<%= item.title %>"
class="w-full h-full object-cover transition-transform duration-300 hover:scale-110">
<% } else { %>
<div class="w-full h-full bg-gradient-to-br from-blue-400 to-purple-500 flex items-center justify-center">
<i class="fas fa-code text-white text-4xl opacity-50"></i>
</div>
<% } %>
<!-- Category Badge -->
<div class="absolute top-4 left-4">
<span class="bg-blue-600 text-white px-3 py-1 rounded-full text-sm font-semibold">
<%= getCategoryName(item.category) %>
</span>
</div>
<!-- Featured Badge -->
<% if (item.featured) { %>
<div class="absolute top-4 right-4">
<span class="bg-yellow-500 text-white px-2 py-1 rounded-full text-xs font-bold">
<i class="fas fa-star"></i> FEATURED
</span>
</div>
<% } %>
<!-- Overlay -->
<div class="absolute inset-0 bg-gradient-to-t from-black/50 to-transparent opacity-0 hover:opacity-100 transition-opacity duration-300 flex items-center justify-center">
<a href="/portfolio/<%= item._id %>" class="bg-white text-gray-900 px-6 py-3 rounded-full font-semibold hover:bg-gray-100 transition-colors">
자세히 보기
</a>
</div>
</div>
<!-- Project Info -->
<div class="p-6">
<h3 class="text-xl font-bold text-gray-900 mb-3 line-clamp-2">
<%= item.title %>
</h3>
<p class="text-gray-600 mb-4 line-clamp-3">
<%= item.shortDescription || item.description %>
</p>
<!-- Technologies -->
<div class="flex flex-wrap gap-2 mb-4">
<% if (item.technologies && item.technologies.length > 0) { %>
<% item.technologies.slice(0, 3).forEach(tech => { %>
<span class="bg-gray-100 text-gray-600 px-2 py-1 rounded text-xs font-medium">
<%= tech %>
</span>
<% }) %>
<% if (item.technologies.length > 3) { %>
<span class="bg-gray-100 text-gray-600 px-2 py-1 rounded text-xs font-medium">
+<%= item.technologies.length - 3 %>
</span>
<% } %>
<% } %>
</div>
<!-- Client & Stats -->
<div class="flex items-center justify-between text-sm text-gray-500">
<div class="flex items-center">
<% if (item.clientName) { %>
<i class="fas fa-user mr-1"></i>
<%= item.clientName %>
<% } %>
</div>
<div class="flex items-center gap-3">
<span class="flex items-center">
<i class="fas fa-eye mr-1"></i>
<%= item.viewCount || 0 %>
</span>
<span class="flex items-center">
<i class="fas fa-heart mr-1 text-red-400"></i>
<%= item.likes || 0 %>
</span>
</div>
</div>
<!-- Action Button -->
<div class="mt-4 pt-4 border-t border-gray-100">
<a href="/portfolio/<%= item._id %>" class="block w-full bg-blue-600 text-white text-center py-2 rounded-lg hover:bg-blue-700 transition-colors font-semibold">
프로젝트 상세보기
</a>
</div>
</div>
</div>
<% }) %>
<% } else { %>
<div class="col-span-full text-center py-12">
<i class="fas fa-folder-open text-6xl text-gray-300 mb-4"></i>
<h3 class="text-2xl font-bold text-gray-500 mb-2">아직 포트폴리오가 없습니다</h3>
<p class="text-gray-400">곧 멋진 프로젝트들을 공개할 예정입니다!</p>
</div>
<% } %>
</div>
<!-- Load More Button -->
<% if (portfolioItems && portfolioItems.length >= 9) { %>
<div class="text-center mt-12" data-aos="fade-up">
<button id="load-more-btn" class="bg-blue-600 text-white px-8 py-3 rounded-full hover:bg-blue-700 transition-colors font-semibold">
더 많은 프로젝트 보기
</button>
</div>
<% } %>
</div>
</section>
<!-- CTA Section -->
<section class="section-padding bg-gradient-to-r from-blue-600 to-purple-600 text-white">
<div class="container mx-auto px-4 text-center">
<h2 class="text-3xl md:text-4xl font-bold mb-6" data-aos="fade-up">
다음 프로젝트의 주인공이 되어보세요
</h2>
<p class="text-xl mb-8 opacity-90" data-aos="fade-up" data-aos-delay="200">
우리와 함께 혁신적인 디지털 솔루션을 만들어보세요
</p>
<div class="flex flex-col sm:flex-row gap-4 justify-center" data-aos="fade-up" data-aos-delay="400">
<a href="/contact" class="bg-white text-blue-600 px-8 py-3 rounded-full hover:bg-gray-100 transition-colors font-semibold">
프로젝트 문의하기
</a>
<a href="/calculator" class="border-2 border-white text-white px-8 py-3 rounded-full hover:bg-white hover:text-blue-600 transition-colors font-semibold">
비용 계산하기
</a>
</div>
</div>
</section>
<%- include('partials/footer') %>
<!-- Scripts -->
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
<script src="/js/main.js"></script>
<script>
// Portfolio filtering functionality
document.addEventListener('DOMContentLoaded', function() {
const filterButtons = document.querySelectorAll('.filter-btn');
const portfolioItems = document.querySelectorAll('.portfolio-item');
filterButtons.forEach(button => {
button.addEventListener('click', () => {
const filter = button.getAttribute('data-filter');
// Update active button
filterButtons.forEach(btn => {
btn.classList.remove('active', 'bg-white', 'text-blue-600');
btn.classList.add('bg-blue-700', 'text-white');
});
button.classList.add('active', 'bg-white', 'text-blue-600');
button.classList.remove('bg-blue-700', 'text-white');
// Filter items
portfolioItems.forEach(item => {
const itemCategory = item.getAttribute('data-category');
if (filter === 'all' || itemCategory === filter) {
item.style.display = 'block';
item.classList.remove('opacity-0');
item.classList.add('opacity-100');
} else {
item.classList.remove('opacity-100');
item.classList.add('opacity-0');
setTimeout(() => {
if (item.classList.contains('opacity-0')) {
item.style.display = 'none';
}
}, 300);
}
});
});
});
// Load more functionality
const loadMoreBtn = document.getElementById('load-more-btn');
if (loadMoreBtn) {
loadMoreBtn.addEventListener('click', async () => {
try {
const currentItems = portfolioItems.length;
const response = await fetch(`/api/portfolio?offset=${currentItems}&limit=6`);
const data = await response.json();
if (data.success && data.portfolioItems.length > 0) {
// Add new items to grid
// This would require server-side rendering or client-side templating
// For now, we'll just hide the button
if (data.portfolioItems.length < 6) {
loadMoreBtn.style.display = 'none';
}
} else {
loadMoreBtn.style.display = 'none';
}
} catch (error) {
console.error('Error loading more portfolio items:', error);
loadMoreBtn.style.display = 'none';
}
});
}
});
// Category name mapping
function getCategoryName(category) {
const categoryNames = {
'web-development': '웹 개발',
'mobile-app': '모바일 앱',
'ui-ux-design': 'UI/UX 디자인',
'branding': '브랜딩',
'marketing': '디지털 마케팅'
};
return categoryNames[category] || category;
}
</script>
<%
// Helper function for category names
function getCategoryName(category) {
const categoryNames = {
'web-development': '웹 개발',
'mobile-app': '모바일 앱',
'ui-ux-design': 'UI/UX 디자인',
'branding': '브랜딩',
'marketing': '디지털 마케팅'
};
return categoryNames[category] || category;
}
%>
</body>
</html>

293
views/services.ejs Normal file
View File

@@ -0,0 +1,293 @@
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>서비스 - SmartSolTech</title>
<!-- SEO Meta Tags -->
<meta name="description" content="SmartSolTech의 전문 서비스를 확인하세요. 웹 개발, 모바일 앱, UI/UX 디자인, 디지털 마케팅 등 다양한 기술 솔루션을 제공합니다.">
<meta name="keywords" content="웹 개발, 모바일 앱, UI/UX 디자인, 디지털 마케팅, 기술 솔루션, SmartSolTech">
<!-- PWA -->
<meta name="theme-color" content="#3B82F6">
<link rel="manifest" href="/manifest.json">
<link rel="apple-touch-icon" href="/images/icons/icon-192x192.png">
<!-- Styles -->
<link href="https://cdn.jsdelivr.net/npm/tailwindcss@2.2.19/dist/tailwind.min.css" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
<link href="https://unpkg.com/aos@2.3.1/dist/aos.css" rel="stylesheet">
<link href="/css/main.css" rel="stylesheet">
</head>
<body>
<%- include('partials/navigation') %>
<!-- Services Hero Section -->
<section class="hero-section bg-gradient-to-br from-blue-600 via-purple-600 to-blue-800 pt-20">
<div class="container mx-auto px-4 py-20 text-center text-white">
<h1 class="text-5xl md:text-6xl font-bold mb-6" data-aos="fade-up">
우리의 <span class="text-yellow-300">서비스</span>
</h1>
<p class="text-xl md:text-2xl mb-8 opacity-90" data-aos="fade-up" data-aos-delay="200">
혁신적인 기술로 비즈니스의 성장을 지원합니다
</p>
</div>
</section>
<!-- Services Grid -->
<section class="section-padding">
<div class="container mx-auto px-4">
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
<% if (services && services.length > 0) { %>
<% services.forEach((service, index) => { %>
<div class="bg-white rounded-2xl shadow-xl p-8 hover:shadow-2xl transition-all duration-300 transform hover:-translate-y-2"
data-aos="fade-up"
data-aos-delay="<%= index * 100 %>">
<!-- Service Icon -->
<div class="w-16 h-16 bg-gradient-to-r from-blue-500 to-purple-600 rounded-full flex items-center justify-center mb-6">
<i class="<%= service.icon || 'fas fa-cog' %> text-white text-2xl"></i>
</div>
<!-- Service Info -->
<h3 class="text-2xl font-bold text-gray-900 mb-4">
<%= service.name %>
</h3>
<p class="text-gray-600 mb-6 leading-relaxed">
<%= service.shortDescription || service.description %>
</p>
<!-- Pricing -->
<% if (service.pricing) { %>
<div class="mb-6">
<div class="text-sm text-gray-500 mb-1">시작가격</div>
<div class="text-2xl font-bold text-blue-600">
<%= service.pricing.basePrice ? service.pricing.basePrice.toLocaleString() : '상담' %>
<% if (service.pricing.basePrice) { %>
<span class="text-sm text-gray-500">원~</span>
<% } %>
</div>
<% if (service.pricing.priceRange) { %>
<div class="text-sm text-gray-500">
<%= service.pricing.priceRange.min.toLocaleString() %>원 -
<%= service.pricing.priceRange.max.toLocaleString() %>원
</div>
<% } %>
</div>
<% } %>
<!-- Action Buttons -->
<div class="flex flex-col gap-3">
<a href="/contact?service=<%= service._id %>"
class="block w-full bg-gradient-to-r from-blue-600 to-purple-600 text-white text-center py-3 rounded-lg font-semibold hover:from-blue-700 hover:to-purple-700 transition-all duration-300">
문의하기
</a>
<a href="/calculator?service=<%= service._id %>"
class="block w-full border-2 border-blue-600 text-blue-600 text-center py-3 rounded-lg font-semibold hover:bg-blue-600 hover:text-white transition-all duration-300">
비용 계산하기
</a>
</div>
<!-- Featured Badge -->
<% if (service.featured) { %>
<div class="absolute top-4 right-4">
<span class="bg-yellow-500 text-white px-2 py-1 rounded-full text-xs font-bold">
<i class="fas fa-star"></i> 인기
</span>
</div>
<% } %>
</div>
<% }) %>
<% } else { %>
<div class="col-span-full text-center py-12">
<i class="fas fa-cogs text-6xl text-gray-300 mb-4"></i>
<h3 class="text-2xl font-bold text-gray-500 mb-2">서비스 준비 중</h3>
<p class="text-gray-400">곧 다양한 서비스를 제공할 예정입니다!</p>
</div>
<% } %>
</div>
</div>
</section>
<!-- Process Section -->
<section class="section-padding bg-gray-50">
<div class="container mx-auto px-4">
<div class="text-center mb-16" data-aos="fade-up">
<h2 class="text-3xl md:text-4xl font-bold text-gray-900 mb-4">
프로젝트 진행 과정
</h2>
<p class="text-xl text-gray-600">
체계적이고 전문적인 프로세스로 프로젝트를 진행합니다
</p>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-8">
<!-- Step 1 -->
<div class="text-center" data-aos="fade-up" data-aos-delay="100">
<div class="w-20 h-20 bg-blue-600 rounded-full flex items-center justify-center mx-auto mb-6">
<span class="text-white text-2xl font-bold">1</span>
</div>
<h3 class="text-xl font-bold text-gray-900 mb-4">상담 및 기획</h3>
<p class="text-gray-600">
고객의 요구사항을 정확히 파악하고
최적의 솔루션을 기획합니다
</p>
</div>
<!-- Step 2 -->
<div class="text-center" data-aos="fade-up" data-aos-delay="200">
<div class="w-20 h-20 bg-purple-600 rounded-full flex items-center justify-center mx-auto mb-6">
<span class="text-white text-2xl font-bold">2</span>
</div>
<h3 class="text-xl font-bold text-gray-900 mb-4">디자인 및 설계</h3>
<p class="text-gray-600">
사용자 중심의 직관적인 디자인과
견고한 시스템 아키텍처를 설계합니다
</p>
</div>
<!-- Step 3 -->
<div class="text-center" data-aos="fade-up" data-aos-delay="300">
<div class="w-20 h-20 bg-green-600 rounded-full flex items-center justify-center mx-auto mb-6">
<span class="text-white text-2xl font-bold">3</span>
</div>
<h3 class="text-xl font-bold text-gray-900 mb-4">개발 및 구현</h3>
<p class="text-gray-600">
최신 기술과 모범 사례를 활용하여
효율적이고 확장 가능한 솔루션을 개발합니다
</p>
</div>
<!-- Step 4 -->
<div class="text-center" data-aos="fade-up" data-aos-delay="400">
<div class="w-20 h-20 bg-orange-600 rounded-full flex items-center justify-center mx-auto mb-6">
<span class="text-white text-2xl font-bold">4</span>
</div>
<h3 class="text-xl font-bold text-gray-900 mb-4">테스트 및 배포</h3>
<p class="text-gray-600">
철저한 테스트를 통해 품질을 보장하고
안정적인 배포를 진행합니다
</p>
</div>
</div>
</div>
</section>
<!-- Why Choose Us Section -->
<section class="section-padding">
<div class="container mx-auto px-4">
<div class="grid grid-cols-1 lg:grid-cols-2 gap-12 items-center">
<!-- Content -->
<div data-aos="fade-right">
<h2 class="text-3xl md:text-4xl font-bold text-gray-900 mb-6">
왜 SmartSolTech를 선택해야 할까요?
</h2>
<div class="space-y-6">
<!-- Feature 1 -->
<div class="flex items-start">
<div class="w-12 h-12 bg-blue-100 rounded-full flex items-center justify-center mr-4 flex-shrink-0">
<i class="fas fa-rocket text-blue-600 text-xl"></i>
</div>
<div>
<h3 class="text-xl font-semibold text-gray-900 mb-2">최신 기술 활용</h3>
<p class="text-gray-600">
항상 최신 기술 트렌드를 파악하고, 검증된 기술 스택을 활용하여
미래 지향적인 솔루션을 제공합니다.
</p>
</div>
</div>
<!-- Feature 2 -->
<div class="flex items-start">
<div class="w-12 h-12 bg-green-100 rounded-full flex items-center justify-center mr-4 flex-shrink-0">
<i class="fas fa-users text-green-600 text-xl"></i>
</div>
<div>
<h3 class="text-xl font-semibold text-gray-900 mb-2">전문가 팀</h3>
<p class="text-gray-600">
각 분야의 전문가들로 구성된 팀이 협력하여
최고 품질의 결과물을 보장합니다.
</p>
</div>
</div>
<!-- Feature 3 -->
<div class="flex items-start">
<div class="w-12 h-12 bg-purple-100 rounded-full flex items-center justify-center mr-4 flex-shrink-0">
<i class="fas fa-clock text-purple-600 text-xl"></i>
</div>
<div>
<h3 class="text-xl font-semibold text-gray-900 mb-2">빠른 대응</h3>
<p class="text-gray-600">
신속한 커뮤니케이션과 효율적인 프로젝트 관리로
정해진 일정 내에 프로젝트를 완료합니다.
</p>
</div>
</div>
<!-- Feature 4 -->
<div class="flex items-start">
<div class="w-12 h-12 bg-orange-100 rounded-full flex items-center justify-center mr-4 flex-shrink-0">
<i class="fas fa-headset text-orange-600 text-xl"></i>
</div>
<div>
<h3 class="text-xl font-semibold text-gray-900 mb-2">지속적인 지원</h3>
<p class="text-gray-600">
프로젝트 완료 후에도 지속적인 유지보수와 기술 지원을
통해 장기적인 파트너십을 유지합니다.
</p>
</div>
</div>
</div>
</div>
<!-- Image/Visual -->
<div class="relative" data-aos="fade-left">
<div class="bg-gradient-to-br from-blue-100 to-purple-100 rounded-2xl p-8 h-96 flex items-center justify-center">
<div class="text-center">
<i class="fas fa-award text-6xl text-blue-600 mb-4"></i>
<h3 class="text-2xl font-bold text-gray-900 mb-2">품질 보장</h3>
<p class="text-gray-600">
고객 만족을 위한<br>
최고 품질의 서비스
</p>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- CTA Section -->
<section class="section-padding bg-gradient-to-r from-blue-600 to-purple-600 text-white">
<div class="container mx-auto px-4 text-center">
<h2 class="text-3xl md:text-4xl font-bold mb-6" data-aos="fade-up">
프로젝트를 시작할 준비가 되셨나요?
</h2>
<p class="text-xl mb-8 opacity-90" data-aos="fade-up" data-aos-delay="200">
무료 상담을 통해 최적의 솔루션을 제안해드리겠습니다
</p>
<div class="flex flex-col sm:flex-row gap-4 justify-center" data-aos="fade-up" data-aos-delay="400">
<a href="/contact" class="bg-white text-blue-600 px-8 py-3 rounded-full hover:bg-gray-100 transition-colors font-semibold">
무료 상담 신청
</a>
<a href="/calculator" class="border-2 border-white text-white px-8 py-3 rounded-full hover:bg-white hover:text-blue-600 transition-colors font-semibold">
비용 계산하기
</a>
<a href="/portfolio" class="border-2 border-white text-white px-8 py-3 rounded-full hover:bg-white hover:text-blue-600 transition-colors font-semibold">
포트폴리오 보기
</a>
</div>
</div>
</section>
<%- include('partials/footer') %>
<!-- Scripts -->
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
<script src="/js/main.js"></script>
</body>
</html>