Main functions
This commit is contained in:
@@ -1,337 +0,0 @@
|
||||
<!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>
|
||||
@@ -1,22 +1,4 @@
|
||||
<!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') %>
|
||||
<!-- About page content starts here -->
|
||||
|
||||
<!-- 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 hero-section-compact">
|
||||
@@ -39,10 +21,10 @@
|
||||
<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">
|
||||
<p class="text-lg text-white text-center mb-6">
|
||||
<%- __('about.company.description1') %>
|
||||
</p>
|
||||
<p class="text-lg text-gray-600 dark:text-gray-300 mb-8">
|
||||
<p class="text-lg text-white text-center mb-8">
|
||||
<%- __('about.company.description2') %>
|
||||
</p>
|
||||
|
||||
@@ -80,7 +62,7 @@
|
||||
<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">
|
||||
<p class="text-xl text-white text-center max-w-3xl mx-auto">
|
||||
<%- __('about.mission.description') %>
|
||||
</p>
|
||||
</div>
|
||||
@@ -146,15 +128,12 @@
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<%- include('partials/footer') %>
|
||||
<!-- About page content ends here -->
|
||||
|
||||
<!-- Scripts -->
|
||||
<script>
|
||||
// Theme initialization
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
const theme = localStorage.getItem('theme') || 'light';
|
||||
document.documentElement.className = theme === 'dark' ? 'dark' : '';
|
||||
});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
<script>
|
||||
// Theme initialization
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
const theme = localStorage.getItem('theme') || 'light';
|
||||
document.documentElement.className = theme === 'dark' ? 'dark' : '';
|
||||
});
|
||||
</script>
|
||||
@@ -1,93 +1,4 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="ru">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title><%= title %> - SmartSolTech Admin</title>
|
||||
|
||||
<!-- Tailwind CSS -->
|
||||
<script src="https://cdn.tailwindcss.com"></script>
|
||||
|
||||
<!-- Font Awesome -->
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
|
||||
|
||||
<!-- Custom CSS -->
|
||||
<link rel="stylesheet" href="/css/main.css">
|
||||
<link rel="stylesheet" href="/css/fixes.css">
|
||||
</head>
|
||||
<body class="bg-gray-100">
|
||||
<!-- Admin Header -->
|
||||
<header class="bg-white shadow-sm border-b">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="flex justify-between items-center h-16">
|
||||
<div class="flex items-center">
|
||||
<h1 class="text-xl font-semibold text-gray-900">
|
||||
<i class="fas fa-cogs mr-2"></i>
|
||||
SmartSolTech Admin
|
||||
</h1>
|
||||
</div>
|
||||
<div class="flex items-center space-x-4">
|
||||
<span class="text-sm text-gray-600">
|
||||
Добро пожаловать, <%= user ? user.name : 'Admin' %>!
|
||||
</span>
|
||||
<a href="/" class="text-gray-500 hover:text-gray-700">
|
||||
<i class="fas fa-external-link-alt mr-1"></i>
|
||||
Посмотреть сайт
|
||||
</a>
|
||||
<form action="/admin/logout" method="post" class="inline">
|
||||
<button type="submit" class="text-red-600 hover:text-red-800">
|
||||
<i class="fas fa-sign-out-alt mr-1"></i>
|
||||
Выход
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<div class="flex">
|
||||
<!-- Admin Sidebar -->
|
||||
<aside class="w-64 bg-white shadow-sm admin-sidebar min-h-screen">
|
||||
<nav class="mt-5 px-2">
|
||||
<div class="space-y-1">
|
||||
<a href="/admin/dashboard" class="group flex items-center px-2 py-2 text-sm font-medium rounded-md bg-blue-100 text-blue-700">
|
||||
<i class="fas fa-tachometer-alt mr-3"></i>
|
||||
Панель управления
|
||||
</a>
|
||||
<a href="/admin/portfolio" class="group flex items-center px-2 py-2 text-sm font-medium rounded-md text-gray-600 hover:bg-gray-50 hover:text-gray-900">
|
||||
<i class="fas fa-briefcase mr-3"></i>
|
||||
Портфолио
|
||||
</a>
|
||||
<a href="/admin/services" class="group flex items-center px-2 py-2 text-sm font-medium rounded-md text-gray-600 hover:bg-gray-50 hover:text-gray-900">
|
||||
<i class="fas fa-cog mr-3"></i>
|
||||
Услуги
|
||||
</a>
|
||||
<a href="/admin/contacts" class="group flex items-center px-2 py-2 text-sm font-medium rounded-md text-gray-600 hover:bg-gray-50 hover:text-gray-900">
|
||||
<i class="fas fa-envelope mr-3"></i>
|
||||
Сообщения
|
||||
</a>
|
||||
<a href="/admin/media" class="group flex items-center px-2 py-2 text-sm font-medium rounded-md text-gray-600 hover:bg-gray-50 hover:text-gray-900">
|
||||
<i class="fas fa-images mr-3"></i>
|
||||
Медиа
|
||||
</a>
|
||||
<a href="/admin/settings" class="group flex items-center px-2 py-2 text-sm font-medium rounded-md text-gray-600 hover:bg-gray-50 hover:text-gray-900">
|
||||
<i class="fas fa-cogs mr-3"></i>
|
||||
Настройки
|
||||
</a>
|
||||
<a href="/admin/telegram" class="group flex items-center px-2 py-2 text-sm font-medium rounded-md text-gray-600 hover:bg-gray-50 hover:text-gray-900">
|
||||
<i class="fab fa-telegram mr-3"></i>
|
||||
Telegram Bot
|
||||
</a>
|
||||
<a href="/admin/banner-editor" class="group flex items-center px-2 py-2 text-sm font-medium rounded-md text-gray-600 hover:bg-gray-50 hover:text-gray-900">
|
||||
<i class="fas fa-paint-brush mr-3"></i>
|
||||
Редактор баннеров
|
||||
</a>
|
||||
</div>
|
||||
</nav>
|
||||
</aside>
|
||||
|
||||
<!-- Main Content -->
|
||||
<main class="flex-1 p-8">
|
||||
<div class="space-y-6">
|
||||
<!-- Header -->
|
||||
<div class="bg-white shadow rounded-lg p-6">
|
||||
@@ -314,10 +225,3 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
|
||||
<!-- JavaScript -->
|
||||
<script src="/js/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -6,7 +6,7 @@
|
||||
<title><%= title %> - SmartSolTech Admin</title>
|
||||
|
||||
<!-- Tailwind CSS -->
|
||||
<script src="https://cdn.tailwindcss.com"></script>
|
||||
<link rel="stylesheet" href="/css/tailwind.css">
|
||||
|
||||
<!-- Font Awesome -->
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css">
|
||||
@@ -56,7 +56,7 @@
|
||||
<aside class="w-64 bg-white shadow-sm admin-sidebar">
|
||||
<nav class="mt-5 px-2">
|
||||
<div class="space-y-1">
|
||||
<a href="/admin/dashboard" class="group flex items-center px-2 py-2 text-sm font-medium rounded-md text-gray-600 hover:bg-gray-50 hover:text-gray-900">
|
||||
<a href="/admin/dashboard" class="group flex items-center px-2 py-2 text-sm font-medium rounded-md <%= currentPage === 'dashboard' ? 'bg-blue-100 text-blue-700' : 'text-gray-600 hover:bg-gray-50 hover:text-gray-900' %>">
|
||||
<i class="fas fa-tachometer-alt mr-3"></i>
|
||||
Панель управления
|
||||
</a>
|
||||
|
||||
@@ -16,71 +16,6 @@
|
||||
<link rel="stylesheet" href="/css/fixes.css">
|
||||
</head>
|
||||
<body class="bg-gray-100">
|
||||
<!-- Admin Header -->
|
||||
<header class="bg-white shadow-sm border-b">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="flex justify-between items-center h-16">
|
||||
<div class="flex items-center">
|
||||
<h1 class="text-xl font-semibold text-gray-900">
|
||||
<i class="fas fa-cogs mr-2"></i>
|
||||
SmartSolTech Admin
|
||||
</h1>
|
||||
</div>
|
||||
<div class="flex items-center space-x-4">
|
||||
<span class="text-sm text-gray-600">
|
||||
Добро пожаловать, <%= user ? user.name : 'Admin' %>!
|
||||
</span>
|
||||
<a href="/" class="text-gray-500 hover:text-gray-700">
|
||||
<i class="fas fa-external-link-alt mr-1"></i>
|
||||
Посмотреть сайт
|
||||
</a>
|
||||
<form action="/admin/logout" method="post" class="inline">
|
||||
<button type="submit" class="text-red-600 hover:text-red-800">
|
||||
<i class="fas fa-sign-out-alt mr-1"></i>
|
||||
Выход
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<div class="flex">
|
||||
<!-- Admin Sidebar -->
|
||||
<aside class="w-64 bg-white shadow-sm admin-sidebar min-h-screen">
|
||||
<nav class="mt-5 px-2">
|
||||
<div class="space-y-1">
|
||||
<a href="/admin/dashboard" class="group flex items-center px-2 py-2 text-sm font-medium rounded-md text-gray-600 hover:bg-gray-50 hover:text-gray-900">
|
||||
<i class="fas fa-tachometer-alt mr-3"></i>
|
||||
Панель управления
|
||||
</a>
|
||||
<a href="/admin/portfolio" class="group flex items-center px-2 py-2 text-sm font-medium rounded-md text-gray-600 hover:bg-gray-50 hover:text-gray-900">
|
||||
<i class="fas fa-briefcase mr-3"></i>
|
||||
Портфолио
|
||||
</a>
|
||||
<a href="/admin/services" class="group flex items-center px-2 py-2 text-sm font-medium rounded-md text-gray-600 hover:bg-gray-50 hover:text-gray-900">
|
||||
<i class="fas fa-cog mr-3"></i>
|
||||
Услуги
|
||||
</a>
|
||||
<a href="/admin/contacts" class="group flex items-center px-2 py-2 text-sm font-medium rounded-md text-gray-600 hover:bg-gray-50 hover:text-gray-900">
|
||||
<i class="fas fa-envelope mr-3"></i>
|
||||
Сообщения
|
||||
</a>
|
||||
<a href="/admin/media" class="group flex items-center px-2 py-2 text-sm font-medium rounded-md bg-blue-100 text-blue-700">
|
||||
<i class="fas fa-images mr-3"></i>
|
||||
Медиа
|
||||
</a>
|
||||
<a href="/admin/settings" class="group flex items-center px-2 py-2 text-sm font-medium rounded-md text-gray-600 hover:bg-gray-50 hover:text-gray-900">
|
||||
<i class="fas fa-cogs mr-3"></i>
|
||||
Настройки
|
||||
</a>
|
||||
<a href="/admin/banner-editor" class="group flex items-center px-2 py-2 text-sm font-medium rounded-md text-gray-600 hover:bg-gray-50 hover:text-gray-900">
|
||||
<i class="fas fa-paint-brush mr-3"></i>
|
||||
Редактор баннеров
|
||||
</a>
|
||||
</div>
|
||||
</nav>
|
||||
</aside>
|
||||
|
||||
<!-- Main Content -->
|
||||
<main class="flex-1 p-8">
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
<p class="mt-1 text-sm text-gray-500">Заполните информацию о проекте для добавления в портфолио</p>
|
||||
</div>
|
||||
<div class="flex space-x-3">
|
||||
<button type="button" onclick="saveDraft()" class="inline-flex items-center px-3 py-2 border border-gray-300 shadow-sm text-sm leading-4 font-medium rounded-md text-gray-700 bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500">
|
||||
<button type="button" data-action="save-draft" class="inline-flex items-center px-3 py-2 border border-gray-300 shadow-sm text-sm leading-4 font-medium rounded-md text-gray-700 bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-blue-500">
|
||||
<i class="fas fa-save mr-2"></i>
|
||||
Сохранить черновик
|
||||
</button>
|
||||
@@ -152,7 +152,7 @@
|
||||
Подробное описание проекта *
|
||||
</label>
|
||||
<div id="descriptionEditor" class="min-h-40 border border-gray-300 rounded-lg"></div>
|
||||
<textarea name="description" id="description" style="display: none;" required></textarea>
|
||||
<textarea name="description" id="description" style="display: none;"></textarea>
|
||||
<p class="mt-2 text-sm text-gray-500">Опишите задачи, решения и результаты проекта</p>
|
||||
</div>
|
||||
|
||||
@@ -166,8 +166,9 @@
|
||||
placeholder="Введите технологию и нажмите Enter"
|
||||
class="block w-full border-gray-300 rounded-lg shadow-sm focus:ring-blue-500 focus:border-blue-500 sm:text-sm">
|
||||
<div class="absolute right-2 top-2">
|
||||
<button type="button" onclick="addTechnology()" class="text-blue-600 hover:text-blue-800">
|
||||
<i class="fas fa-plus"></i>
|
||||
<button type="button" data-action="add-technology" class="text-blue-600 hover:text-blue-800">
|
||||
<i class="fas fa-plus mr-1"></i>
|
||||
Добавить
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -180,7 +181,7 @@
|
||||
<div class="flex flex-wrap gap-2">
|
||||
<% const popularTechs = ['React', 'Vue.js', 'Node.js', 'Express.js', 'MongoDB', 'PostgreSQL', 'MySQL', 'JavaScript', 'TypeScript', 'HTML5', 'CSS3', 'Tailwind CSS', 'Bootstrap', 'Webpack', 'Docker', 'Git', 'AWS', 'Figma', 'Photoshop']; %>
|
||||
<% popularTechs.forEach(tech => { %>
|
||||
<button type="button" onclick="addTechnologyFromList('<%= tech %>')"
|
||||
<button type="button" data-action="add-technology-from-list" data-tech="<%= tech %>"
|
||||
class="px-2 py-1 text-xs border border-gray-300 rounded-md text-gray-600 hover:bg-gray-100">
|
||||
<%= tech %>
|
||||
</button>
|
||||
@@ -229,9 +230,9 @@
|
||||
<div id="imagePreviewContainer" style="display: none;">
|
||||
<div class="flex items-center justify-between mb-4">
|
||||
<h5 class="text-sm font-medium text-gray-900">Загруженные изображения</h5>
|
||||
<button type="button" onclick="clearAllImages()" class="text-red-600 hover:text-red-800 text-sm">
|
||||
<button type="button" data-action="clear-all-images" class="text-red-600 hover:text-red-800 text-sm">
|
||||
<i class="fas fa-trash mr-1"></i>
|
||||
Удалить все
|
||||
Очистить все
|
||||
</button>
|
||||
</div>
|
||||
<div id="imagePreview" class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4"></div>
|
||||
@@ -303,7 +304,7 @@
|
||||
<!-- Submit Buttons -->
|
||||
<div class="flex justify-between items-center pt-6 border-t border-gray-200">
|
||||
<div class="flex space-x-3">
|
||||
<button type="button" onclick="previewProject()" class="inline-flex items-center px-4 py-2 border border-gray-300 shadow-sm text-sm font-medium rounded-md text-gray-700 bg-white hover:bg-gray-50">
|
||||
<button type="button" data-action="preview-project" class="inline-flex items-center px-4 py-2 border border-gray-300 shadow-sm text-sm font-medium rounded-md text-gray-700 bg-white hover:bg-gray-50">
|
||||
<i class="fas fa-eye mr-2"></i>
|
||||
Предпросмотр
|
||||
</button>
|
||||
@@ -313,7 +314,7 @@
|
||||
<a href="/admin/portfolio" class="inline-flex items-center px-4 py-2 border border-gray-300 shadow-sm text-sm font-medium rounded-md text-gray-700 bg-white hover:bg-gray-50">
|
||||
Отмена
|
||||
</a>
|
||||
<button type="button" onclick="saveDraft()" class="inline-flex items-center px-4 py-2 border border-gray-300 shadow-sm text-sm font-medium rounded-md text-gray-700 bg-white hover:bg-gray-50">
|
||||
<button type="button" data-action="save-draft" class="inline-flex items-center px-4 py-2 border border-gray-300 shadow-sm text-sm font-medium rounded-md text-gray-700 bg-white hover:bg-gray-50">
|
||||
<i class="fas fa-save mr-2"></i>
|
||||
Сохранить как черновик
|
||||
</button>
|
||||
@@ -342,6 +343,7 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||
initializeTechnologyInput();
|
||||
initializeFormValidation();
|
||||
setupCharacterCounters();
|
||||
initializeEventListeners();
|
||||
});
|
||||
|
||||
// Initialize Rich Text Editor
|
||||
@@ -412,7 +414,7 @@ function updateTechnologiesList() {
|
||||
container.innerHTML = selectedTechnologies.map((tech, index) => `
|
||||
<span class="inline-flex items-center px-3 py-1 rounded-full text-sm font-medium bg-blue-100 text-blue-800">
|
||||
${tech}
|
||||
<button type="button" onclick="removeTechnology(${index})" class="ml-2 text-blue-600 hover:text-blue-800">
|
||||
<button type="button" data-action="remove-technology" data-index="${index}" class="ml-2 text-blue-600 hover:text-blue-800">
|
||||
<i class="fas fa-times"></i>
|
||||
</button>
|
||||
</span>
|
||||
@@ -517,9 +519,9 @@ function updateImagePreview() {
|
||||
</div>
|
||||
${index === 0 ? '<div class="absolute top-2 left-2 bg-blue-600 text-white text-xs px-2 py-1 rounded">Главное</div>' : ''}
|
||||
<div class="absolute top-2 right-2 opacity-0 group-hover:opacity-100 transition-opacity space-x-1">
|
||||
${index > 0 ? '<button type="button" onclick="moveImage(' + index + ', -1)" class="bg-white text-gray-600 rounded-full w-6 h-6 flex items-center justify-center text-xs shadow hover:bg-gray-50" title="Переместить влево"><i class="fas fa-chevron-left"></i></button>' : ''}
|
||||
${index < uploadedImages.length - 1 ? '<button type="button" onclick="moveImage(' + index + ', 1)" class="bg-white text-gray-600 rounded-full w-6 h-6 flex items-center justify-center text-xs shadow hover:bg-gray-50" title="Переместить вправо"><i class="fas fa-chevron-right"></i></button>' : ''}
|
||||
<button type="button" onclick="removeImage(${index})" class="bg-red-600 text-white rounded-full w-6 h-6 flex items-center justify-center text-xs shadow hover:bg-red-700" title="Удалить">
|
||||
${index > 0 ? '<button type="button" data-action="move-image" data-index="' + index + '" data-direction="-1" class="bg-white text-gray-600 rounded-full w-6 h-6 flex items-center justify-center text-xs shadow hover:bg-gray-50" title="Переместить влево"><i class="fas fa-chevron-left"></i></button>' : ''}
|
||||
${index < uploadedImages.length - 1 ? '<button type="button" data-action="move-image" data-index="' + index + '" data-direction="1" class="bg-white text-gray-600 rounded-full w-6 h-6 flex items-center justify-center text-xs shadow hover:bg-gray-50" title="Переместить вправо"><i class="fas fa-chevron-right"></i></button>' : ''}
|
||||
<button type="button" data-action="remove-image" data-index="${index}" class="bg-red-600 text-white rounded-full w-6 h-6 flex items-center justify-center text-xs shadow hover:bg-red-700" title="Удалить">
|
||||
<i class="fas fa-times"></i>
|
||||
</button>
|
||||
</div>
|
||||
@@ -773,4 +775,46 @@ function showNotification(message, type = 'info') {
|
||||
}, 300);
|
||||
}, 5000);
|
||||
}
|
||||
|
||||
// Initialize event listeners for data-action buttons
|
||||
function initializeEventListeners() {
|
||||
document.addEventListener('click', function(e) {
|
||||
const action = e.target.closest('[data-action]')?.dataset.action;
|
||||
if (!action) return;
|
||||
|
||||
e.preventDefault();
|
||||
|
||||
switch(action) {
|
||||
case 'save-draft':
|
||||
saveDraft();
|
||||
break;
|
||||
case 'preview-project':
|
||||
previewProject();
|
||||
break;
|
||||
case 'add-technology':
|
||||
addTechnology();
|
||||
break;
|
||||
case 'remove-technology':
|
||||
const techIndex = parseInt(e.target.closest('[data-index]').dataset.index);
|
||||
removeTechnology(techIndex);
|
||||
break;
|
||||
case 'clear-all-images':
|
||||
clearAllImages();
|
||||
break;
|
||||
case 'move-image':
|
||||
const moveIndex = parseInt(e.target.closest('[data-index]').dataset.index);
|
||||
const direction = parseInt(e.target.closest('[data-direction]').dataset.direction);
|
||||
moveImage(moveIndex, direction);
|
||||
break;
|
||||
case 'remove-image':
|
||||
const removeIndex = parseInt(e.target.closest('[data-index]').dataset.index);
|
||||
removeImage(removeIndex);
|
||||
break;
|
||||
case 'add-technology-from-list':
|
||||
const techName = e.target.closest('[data-tech]').dataset.tech;
|
||||
addTechnologyFromList(techName);
|
||||
break;
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
@@ -16,77 +16,7 @@
|
||||
<link rel="stylesheet" href="/css/fixes.css">
|
||||
</head>
|
||||
<body class="bg-gray-100">
|
||||
<!-- Admin Header -->
|
||||
<header class="bg-white shadow-sm border-b">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="flex justify-between items-center h-16">
|
||||
<div class="flex items-center">
|
||||
<h1 class="text-xl font-semibold text-gray-900">
|
||||
<i class="fas fa-cogs mr-2"></i>
|
||||
SmartSolTech Admin
|
||||
</h1>
|
||||
</div>
|
||||
<div class="flex items-center space-x-4">
|
||||
<span class="text-sm text-gray-600">
|
||||
Добро пожаловать, <%= user ? user.name : 'Admin' %>!
|
||||
</span>
|
||||
<a href="/" class="text-gray-500 hover:text-gray-700">
|
||||
<i class="fas fa-external-link-alt mr-1"></i>
|
||||
Посмотреть сайт
|
||||
</a>
|
||||
<form action="/admin/logout" method="post" class="inline">
|
||||
<button type="submit" class="text-red-600 hover:text-red-800">
|
||||
<i class="fas fa-sign-out-alt mr-1"></i>
|
||||
Выход
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<div class="flex">
|
||||
<!-- Admin Sidebar -->
|
||||
<aside class="w-64 bg-white shadow-sm admin-sidebar min-h-screen">
|
||||
<nav class="mt-5 px-2">
|
||||
<div class="space-y-1">
|
||||
<a href="/admin/dashboard" class="group flex items-center px-2 py-2 text-sm font-medium rounded-md text-gray-600 hover:bg-gray-50 hover:text-gray-900">
|
||||
<i class="fas fa-tachometer-alt mr-3"></i>
|
||||
Панель управления
|
||||
</a>
|
||||
<a href="/admin/portfolio" class="group flex items-center px-2 py-2 text-sm font-medium rounded-md text-gray-600 hover:bg-gray-50 hover:text-gray-900">
|
||||
<i class="fas fa-briefcase mr-3"></i>
|
||||
Портфолио
|
||||
</a>
|
||||
<a href="/admin/services" class="group flex items-center px-2 py-2 text-sm font-medium rounded-md text-gray-600 hover:bg-gray-50 hover:text-gray-900">
|
||||
<i class="fas fa-cog mr-3"></i>
|
||||
Услуги
|
||||
</a>
|
||||
<a href="/admin/contacts" class="group flex items-center px-2 py-2 text-sm font-medium rounded-md text-gray-600 hover:bg-gray-50 hover:text-gray-900">
|
||||
<i class="fas fa-envelope mr-3"></i>
|
||||
Сообщения
|
||||
</a>
|
||||
<a href="/admin/media" class="group flex items-center px-2 py-2 text-sm font-medium rounded-md text-gray-600 hover:bg-gray-50 hover:text-gray-900">
|
||||
<i class="fas fa-images mr-3"></i>
|
||||
Медиа
|
||||
</a>
|
||||
<a href="/admin/settings" class="group flex items-center px-2 py-2 text-sm font-medium rounded-md bg-blue-100 text-blue-700">
|
||||
<i class="fas fa-cogs mr-3"></i>
|
||||
Настройки
|
||||
</a>
|
||||
<a href="/admin/telegram" class="group flex items-center px-2 py-2 text-sm font-medium rounded-md text-gray-600 hover:bg-gray-50 hover:text-gray-900">
|
||||
<i class="fab fa-telegram mr-3"></i>
|
||||
Telegram Bot
|
||||
</a>
|
||||
<a href="/admin/banner-editor" class="group flex items-center px-2 py-2 text-sm font-medium rounded-md text-gray-600 hover:bg-gray-50 hover:text-gray-900">
|
||||
<i class="fas fa-paint-brush mr-3"></i>
|
||||
Редактор баннеров
|
||||
</a>
|
||||
</div>
|
||||
</nav>
|
||||
</aside>
|
||||
|
||||
<!-- Main Content -->
|
||||
<!-- Main Content -->
|
||||
<main class="flex-1 p-8">
|
||||
<div class="space-y-6">
|
||||
<!-- Header -->
|
||||
|
||||
@@ -16,75 +16,6 @@
|
||||
<link rel="stylesheet" href="/css/fixes.css">
|
||||
</head>
|
||||
<body class="bg-gray-100">
|
||||
<!-- Admin Header -->
|
||||
<header class="bg-white shadow-sm border-b">
|
||||
<div class="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
|
||||
<div class="flex justify-between items-center h-16">
|
||||
<div class="flex items-center">
|
||||
<h1 class="text-xl font-semibold text-gray-900">
|
||||
<i class="fas fa-cogs mr-2"></i>
|
||||
SmartSolTech Admin
|
||||
</h1>
|
||||
</div>
|
||||
<div class="flex items-center space-x-4">
|
||||
<span class="text-sm text-gray-600">
|
||||
Добро пожаловать, <%= user ? user.name : 'Admin' %>!
|
||||
</span>
|
||||
<a href="/" class="text-gray-500 hover:text-gray-700">
|
||||
<i class="fas fa-external-link-alt mr-1"></i>
|
||||
Посмотреть сайт
|
||||
</a>
|
||||
<form action="/admin/logout" method="post" class="inline">
|
||||
<button type="submit" class="text-red-600 hover:text-red-800">
|
||||
<i class="fas fa-sign-out-alt mr-1"></i>
|
||||
Выход
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
|
||||
<div class="flex">
|
||||
<!-- Admin Sidebar -->
|
||||
<aside class="w-64 bg-white shadow-sm admin-sidebar min-h-screen">
|
||||
<nav class="mt-5 px-2">
|
||||
<div class="space-y-1">
|
||||
<a href="/admin/dashboard" class="group flex items-center px-2 py-2 text-sm font-medium rounded-md text-gray-600 hover:bg-gray-50 hover:text-gray-900">
|
||||
<i class="fas fa-tachometer-alt mr-3"></i>
|
||||
Панель управления
|
||||
</a>
|
||||
<a href="/admin/portfolio" class="group flex items-center px-2 py-2 text-sm font-medium rounded-md text-gray-600 hover:bg-gray-50 hover:text-gray-900">
|
||||
<i class="fas fa-briefcase mr-3"></i>
|
||||
Портфолио
|
||||
</a>
|
||||
<a href="/admin/services" class="group flex items-center px-2 py-2 text-sm font-medium rounded-md text-gray-600 hover:bg-gray-50 hover:text-gray-900">
|
||||
<i class="fas fa-cog mr-3"></i>
|
||||
Услуги
|
||||
</a>
|
||||
<a href="/admin/contacts" class="group flex items-center px-2 py-2 text-sm font-medium rounded-md text-gray-600 hover:bg-gray-50 hover:text-gray-900">
|
||||
<i class="fas fa-envelope mr-3"></i>
|
||||
Сообщения
|
||||
</a>
|
||||
<a href="/admin/media" class="group flex items-center px-2 py-2 text-sm font-medium rounded-md text-gray-600 hover:bg-gray-50 hover:text-gray-900">
|
||||
<i class="fas fa-images mr-3"></i>
|
||||
Медиа
|
||||
</a>
|
||||
<a href="/admin/settings" class="group flex items-center px-2 py-2 text-sm font-medium rounded-md text-gray-600 hover:bg-gray-50 hover:text-gray-900">
|
||||
<i class="fas fa-cogs mr-3"></i>
|
||||
Настройки
|
||||
</a>
|
||||
<a href="/admin/telegram" class="group flex items-center px-2 py-2 text-sm font-medium rounded-md bg-blue-100 text-blue-700">
|
||||
<i class="fab fa-telegram mr-3"></i>
|
||||
Telegram Bot
|
||||
</a>
|
||||
<a href="/admin/banner-editor" class="group flex items-center px-2 py-2 text-sm font-medium rounded-md text-gray-600 hover:bg-gray-50 hover:text-gray-900">
|
||||
<i class="fas fa-paint-brush mr-3"></i>
|
||||
Редактор баннеров
|
||||
</a>
|
||||
</div>
|
||||
</nav>
|
||||
</aside>
|
||||
|
||||
<!-- Main Content -->
|
||||
<main class="flex-1 p-8">
|
||||
@@ -260,7 +191,6 @@
|
||||
<% } %>
|
||||
</div>
|
||||
</div>
|
||||
<% } %>
|
||||
|
||||
<!-- Message Sender -->
|
||||
<div class="bg-white shadow rounded-lg p-6">
|
||||
|
||||
572
views/calculator-modern.ejs
Normal file
572
views/calculator-modern.ejs
Normal file
@@ -0,0 +1,572 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="<%= currentLanguage %>" class="<%= theme === 'dark' ? 'dark' : '' %>">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title><%- __('calculator.title') %> | <%= siteSettings?.siteName || 'SmartSolTech' %></title>
|
||||
<meta name="description" content="<%- __('calculator.subtitle') %>">
|
||||
|
||||
<!-- Preload critical resources -->
|
||||
<link rel="preload" href="/css/tailwind.css" as="style">
|
||||
<link rel="preload" href="/css/main.css" as="style">
|
||||
|
||||
<!-- Stylesheets -->
|
||||
<link rel="stylesheet" href="/css/tailwind.css">
|
||||
<link rel="stylesheet" href="/css/base.css">
|
||||
<link rel="stylesheet" href="/css/main.css">
|
||||
<link rel="stylesheet" href="/css/dark-theme.css">
|
||||
|
||||
<!-- Meta tags -->
|
||||
<meta name="robots" content="index, follow">
|
||||
<link rel="canonical" href="<%= process.env.SITE_URL || 'http://localhost:3000' %>/calculator">
|
||||
|
||||
<!-- Favicon -->
|
||||
<link rel="icon" type="image/x-icon" href="/favicon.ico">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32.png">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16.png">
|
||||
|
||||
<!-- PWA manifest -->
|
||||
<link rel="manifest" href="/manifest.json">
|
||||
|
||||
<!-- Theme color -->
|
||||
<meta name="theme-color" content="#3b82f6">
|
||||
<meta name="msapplication-TileColor" content="#3b82f6">
|
||||
</head>
|
||||
<body class="bg-background text-foreground transition-colors duration-300">
|
||||
<%- include('partials/navigation') %>
|
||||
|
||||
<!-- Modern Calculator with UX-polished design -->
|
||||
<div class="min-h-screen bg-gradient-to-br from-blue-50 to-indigo-100 dark:from-gray-900 dark:to-gray-800 pt-20">
|
||||
<div class="container mx-auto px-4 py-8 max-w-4xl">
|
||||
<!-- Header with price display and dark mode toggle -->
|
||||
<div class="flex flex-col lg:flex-row justify-between items-start lg:items-center mb-12 gap-6">
|
||||
<div class="text-center lg:text-left w-full lg:flex-1">
|
||||
<h1 class="text-2xl lg:text-3xl font-bold bg-gradient-to-r from-blue-600 to-purple-600 bg-clip-text text-transparent mb-4">
|
||||
<%- __('calculator.title') %>
|
||||
</h1>
|
||||
<p class="text-lg text-gray-600 dark:text-gray-300">
|
||||
<%- __('calculator.subtitle') %>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="flex items-center gap-4 w-full lg:w-auto justify-center lg:justify-end">
|
||||
<!-- Reset Button -->
|
||||
<button
|
||||
id="resetButton"
|
||||
class="bg-gray-100 hover:bg-gray-200 dark:bg-gray-700 dark:hover:bg-gray-600 text-gray-700 dark:text-gray-300 px-4 py-2 rounded-lg font-medium transition-colors duration-200 flex items-center gap-2"
|
||||
title="<%- __('calculator.reset') %>"
|
||||
aria-label="<%- __('calculator.reset') %>">
|
||||
<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"></path>
|
||||
</svg>
|
||||
<%- __('calculator.reset') %>
|
||||
</button>
|
||||
|
||||
|
||||
<!-- Live Price Display будет перемещен вниз -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Progress Steps -->
|
||||
<div class="w-full mb-20">
|
||||
<div class="flex justify-between items-center mb-6">
|
||||
<!-- Step 1 -->
|
||||
<div class="flex items-center" data-step="0">
|
||||
<div class="relative">
|
||||
<div class="w-12 h-12 rounded-full flex items-center justify-center text-sm font-bold transition-all duration-300 bg-blue-600 text-white shadow-lg" id="step-indicator-0">
|
||||
<svg class="w-6 h-6 hidden" id="check-0" fill="currentColor" viewBox="0 0 20 20">
|
||||
<path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd"></path>
|
||||
</svg>
|
||||
<span class="step-number" id="number-0">1</span>
|
||||
</div>
|
||||
<div class="absolute -top-8 left-1/2 transform -translate-x-1/2 whitespace-nowrap">
|
||||
<span class="text-sm font-medium text-gray-700 dark:text-gray-300"><%- __('calculator.step1.nav_title') %></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Progress Line 1 -->
|
||||
<div class="flex-1 h-1 bg-gray-200 dark:bg-gray-700 mx-4 rounded-full overflow-hidden">
|
||||
<div class="h-full bg-gradient-to-r from-blue-600 to-purple-600 transition-all duration-500 w-0" id="progress-line-0"></div>
|
||||
</div>
|
||||
|
||||
<!-- Step 2 -->
|
||||
<div class="flex items-center" data-step="1">
|
||||
<div class="relative">
|
||||
<div class="w-12 h-12 rounded-full flex items-center justify-center text-sm font-bold transition-all duration-300 bg-gray-300 dark:bg-gray-600 text-gray-600 dark:text-gray-400" id="step-indicator-1">
|
||||
<svg class="w-6 h-6 hidden" id="check-1" fill="currentColor" viewBox="0 0 20 20">
|
||||
<path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd"></path>
|
||||
</svg>
|
||||
<span class="step-number" id="number-1">2</span>
|
||||
</div>
|
||||
<div class="absolute -top-8 left-1/2 transform -translate-x-1/2 whitespace-nowrap">
|
||||
<span class="text-sm font-medium text-gray-700 dark:text-gray-300"><%- __('calculator.step2.nav_title') %></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Progress Line 2 -->
|
||||
<div class="flex-1 h-1 bg-gray-200 dark:bg-gray-700 mx-4 rounded-full overflow-hidden">
|
||||
<div class="h-full bg-gradient-to-r from-blue-600 to-purple-600 transition-all duration-500 w-0" id="progress-line-1"></div>
|
||||
</div>
|
||||
|
||||
<!-- Step 3 -->
|
||||
<div class="flex items-center" data-step="2">
|
||||
<div class="relative">
|
||||
<div class="w-12 h-12 rounded-full flex items-center justify-center text-sm font-bold transition-all duration-300 bg-gray-300 dark:bg-gray-600 text-gray-600 dark:text-gray-400" id="step-indicator-2">
|
||||
<svg class="w-6 h-6 hidden" id="check-2" fill="currentColor" viewBox="0 0 20 20">
|
||||
<path fill-rule="evenodd" d="M16.707 5.293a1 1 0 010 1.414l-8 8a1 1 0 01-1.414 0l-4-4a1 1 0 011.414-1.414L8 12.586l7.293-7.293a1 1 0 011.414 0z" clip-rule="evenodd"></path>
|
||||
</svg>
|
||||
<span class="step-number" id="number-2">3</span>
|
||||
</div>
|
||||
<div class="absolute -top-8 left-1/2 transform -translate-x-1/2 whitespace-nowrap">
|
||||
<span class="text-sm font-medium text-gray-700 dark:text-gray-300"><%- __('calculator.result.nav_title') %></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Overall Progress Bar -->
|
||||
<div class="w-full bg-gray-200 dark:bg-gray-700 rounded-full h-3 mt-20 shadow-inner">
|
||||
<div id="overallProgress" class="bg-gradient-to-r from-blue-600 to-purple-600 h-3 rounded-full transition-all duration-500 shadow-sm" style="width: 33.33%"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Main Calculator Content -->
|
||||
<div class="bg-white/90 dark:bg-gray-800/90 rounded-3xl shadow-2xl overflow-hidden border border-gray-100 dark:border-gray-700 backdrop-blur-sm mt-4">
|
||||
|
||||
<!-- Step 1: Service Selection -->
|
||||
<div id="step-1" class="step-content p-8 md:p-12">
|
||||
<div class="text-center mb-10">
|
||||
<div class="w-16 h-16 bg-blue-100 dark:bg-blue-900 rounded-full flex items-center justify-center mx-auto mb-4">
|
||||
<svg class="w-8 h-8 text-blue-600 dark:text-blue-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 13.255A23.931 23.931 0 0112 15c-3.183 0-6.22-.62-9-1.745M16 6V4a2 2 0 00-2-2h-4a2 2 0 00-2-2v2m8 0V6a2 2 0 012 2v6a2 2 0 01-2 2H8a2 2 0 01-2-2V8a2 2 0 012-2h8z"></path>
|
||||
</svg>
|
||||
</div>
|
||||
<h2 class="text-2xl font-bold mb-3"><%- __('calculator.step1.title') %></h2>
|
||||
<p class="text-lg text-gray-600 dark:text-gray-400"><%- __('calculator.step1.subtitle') %></p>
|
||||
</div>
|
||||
|
||||
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
|
||||
<!-- Web Development -->
|
||||
<div class="service-card group cursor-pointer transition-all duration-300 hover:scale-105" data-service="web" data-price="500000">
|
||||
<div class="bg-gradient-to-br from-blue-50 to-blue-100 dark:from-blue-900 dark:to-blue-800 rounded-2xl p-8 border-2 border-transparent group-hover:border-blue-500 transition-all duration-300">
|
||||
<div class="flex items-start justify-between mb-6">
|
||||
<div class="w-14 h-14 bg-blue-500 rounded-xl flex items-center justify-center shadow-lg">
|
||||
<svg class="w-8 h-8 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M21 12a9 9 0 01-9 9m9-9a9 9 0 00-9-9m9 9H3m9 9v-9m0-9v9"></path>
|
||||
</svg>
|
||||
</div>
|
||||
<div class="w-6 h-6 rounded-full border-2 border-gray-300 group-hover:border-blue-500 transition-colors duration-300">
|
||||
<div class="w-full h-full rounded-full bg-blue-500 scale-0 group-hover:scale-100 transition-transform duration-300 service-indicator"></div>
|
||||
</div>
|
||||
</div>
|
||||
<h3 class="text-lg font-bold mb-3 text-gray-900 dark:text-white"><%- __('services.web.title') %></h3>
|
||||
<p class="text-gray-600 dark:text-gray-400 mb-4"><%- __('services.web.description') %></p>
|
||||
<div class="flex items-center justify-between">
|
||||
<span class="text-sm font-medium text-blue-600 dark:text-blue-400 bg-blue-100 dark:bg-blue-900 px-3 py-1 rounded-full">
|
||||
<%- __('navigation.services') %>
|
||||
</span>
|
||||
<span class="text-lg font-bold text-gray-900 dark:text-white">₩500,000</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Mobile Development -->
|
||||
<div class="service-card group cursor-pointer transition-all duration-300 hover:scale-105" data-service="mobile" data-price="800000">
|
||||
<div class="bg-gradient-to-br from-green-50 to-green-100 dark:from-green-900 dark:to-green-800 rounded-2xl p-8 border-2 border-transparent group-hover:border-green-500 transition-all duration-300">
|
||||
<div class="flex items-start justify-between mb-6">
|
||||
<div class="w-14 h-14 bg-green-500 rounded-xl flex items-center justify-center shadow-lg">
|
||||
<svg class="w-8 h-8 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 18h.01M8 21h8a2 2 0 002-2V5a2 2 0 00-2-2H8a2 2 0 00-2 2v14a2 2 0 002 2z"></path>
|
||||
</svg>
|
||||
</div>
|
||||
<div class="w-6 h-6 rounded-full border-2 border-gray-300 group-hover:border-green-500 transition-colors duration-300">
|
||||
<div class="w-full h-full rounded-full bg-green-500 scale-0 group-hover:scale-100 transition-transform duration-300 service-indicator"></div>
|
||||
</div>
|
||||
</div>
|
||||
<h3 class="text-lg font-bold mb-3 text-gray-900 dark:text-white"><%- __('services.mobile.title') %></h3>
|
||||
<p class="text-gray-600 dark:text-gray-400 mb-4"><%- __('services.mobile.description') %></p>
|
||||
<div class="flex items-center justify-between">
|
||||
<span class="text-sm font-medium text-green-600 dark:text-green-400 bg-green-100 dark:bg-green-900 px-3 py-1 rounded-full">
|
||||
<%- __('navigation.services') %>
|
||||
</span>
|
||||
<span class="text-lg font-bold text-gray-900 dark:text-white">₩800,000</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- UI/UX Design -->
|
||||
<div class="service-card group cursor-pointer transition-all duration-300 hover:scale-105" data-service="design" data-price="300000">
|
||||
<div class="bg-gradient-to-br from-purple-50 to-purple-100 dark:from-purple-900 dark:to-purple-800 rounded-2xl p-8 border-2 border-transparent group-hover:border-purple-500 transition-all duration-300">
|
||||
<div class="flex items-start justify-between mb-6">
|
||||
<div class="w-14 h-14 bg-purple-500 rounded-xl flex items-center justify-center shadow-lg">
|
||||
<svg class="w-8 h-8 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M7 21a4 4 0 01-4-4V5a2 2 0 012-2h4a2 2 0 012 2v12a4 4 0 01-4 4zM21 5a2 2 0 00-2-2h-4a2 2 0 00-2 2v12a4 4 0 004 4h4a2 2 0 002-2V5z"></path>
|
||||
</svg>
|
||||
</div>
|
||||
<div class="w-6 h-6 rounded-full border-2 border-gray-300 group-hover:border-purple-500 transition-colors duration-300">
|
||||
<div class="w-full h-full rounded-full bg-purple-500 scale-0 group-hover:scale-100 transition-transform duration-300 service-indicator"></div>
|
||||
</div>
|
||||
</div>
|
||||
<h3 class="text-lg font-bold mb-3 text-gray-900 dark:text-white"><%- __('services.design.title') %></h3>
|
||||
<p class="text-gray-600 dark:text-gray-400 mb-4"><%- __('services.design.description') %></p>
|
||||
<div class="flex items-center justify-between">
|
||||
<span class="text-sm font-medium text-purple-600 dark:text-purple-400 bg-purple-100 dark:bg-purple-900 px-3 py-1 rounded-full">
|
||||
<%- __('navigation.services') %>
|
||||
</span>
|
||||
<span class="text-lg font-bold text-gray-900 dark:text-white">₩300,000</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Digital Marketing -->
|
||||
<div class="service-card group cursor-pointer transition-all duration-300 hover:scale-105" data-service="marketing" data-price="200000">
|
||||
<div class="bg-gradient-to-br from-yellow-50 to-yellow-100 dark:from-yellow-900 dark:to-yellow-800 rounded-2xl p-8 border-2 border-transparent group-hover:border-yellow-500 transition-all duration-300">
|
||||
<div class="flex items-start justify-between mb-6">
|
||||
<div class="w-14 h-14 bg-yellow-500 rounded-xl flex items-center justify-center shadow-lg">
|
||||
<svg class="w-8 h-8 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 7h8m0 0v8m0-8l-8 8-4-4-6 6"></path>
|
||||
</svg>
|
||||
</div>
|
||||
<div class="w-6 h-6 rounded-full border-2 border-gray-300 group-hover:border-yellow-500 transition-colors duration-300">
|
||||
<div class="w-full h-full rounded-full bg-yellow-500 scale-0 group-hover:scale-100 transition-transform duration-300 service-indicator"></div>
|
||||
</div>
|
||||
</div>
|
||||
<h3 class="text-lg font-bold mb-3 text-gray-900 dark:text-white"><%- __('services.marketing.title') %></h3>
|
||||
<p class="text-gray-600 dark:text-gray-400 mb-4"><%- __('services.marketing.description') %></p>
|
||||
<div class="flex items-center justify-between">
|
||||
<span class="text-sm font-medium text-yellow-600 dark:text-yellow-400 bg-yellow-100 dark:bg-yellow-900 px-3 py-1 rounded-full">
|
||||
<%- __('navigation.services') %>
|
||||
</span>
|
||||
<span class="text-lg font-bold text-gray-900 dark:text-white">₩200,000</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Step 2: Project Details -->
|
||||
<div id="step-2" class="step-content hidden p-8 md:p-12">
|
||||
<div class="text-center mb-10">
|
||||
<div class="w-16 h-16 bg-purple-100 dark:bg-purple-900 rounded-full flex items-center justify-center mx-auto mb-4">
|
||||
<svg class="w-8 h-8 text-purple-600 dark:text-purple-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 6V4m0 2a2 2 0 100 4m0-4a2 2 0 110 4m-6 8a2 2 0 100-4m0 4a2 2 0 100 4m0-4v2m0-6V4m6 6v10m6-2a2 2 0 100-4m0 4a2 2 0 100 4m0-4v2m0-6V4"></path>
|
||||
</svg>
|
||||
</div>
|
||||
<h2 class="text-2xl font-bold mb-3"><%- __('calculator.step2.title') %></h2>
|
||||
<p class="text-lg text-gray-600 dark:text-gray-400"><%- __('calculator.step2.subtitle') %></p>
|
||||
</div>
|
||||
|
||||
<!-- Complexity Section -->
|
||||
<div class="mb-12">
|
||||
<h3 class="text-xl font-bold mb-6 text-center text-gray-900 dark:text-white">
|
||||
<%- __('calculator.complexity.title') %>
|
||||
</h3>
|
||||
<div class="grid grid-cols-1 md:grid-cols-3 gap-6">
|
||||
<div class="complexity-card group cursor-pointer" data-complexity="simple" data-multiplier="1">
|
||||
<div class="bg-gradient-to-br from-green-50 to-green-100 dark:from-green-900 dark:to-green-800 rounded-2xl p-6 border-2 border-transparent group-hover:border-green-500 transition-all duration-300 h-full">
|
||||
<div class="flex flex-col items-center text-center h-full">
|
||||
<div class="w-12 h-12 bg-green-500 rounded-full flex items-center justify-center mb-4 shadow-lg">
|
||||
<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="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"></path>
|
||||
</svg>
|
||||
</div>
|
||||
<h4 class="text-lg font-bold mb-2 text-gray-900 dark:text-white"><%- __('calculator.complexity.simple') %></h4>
|
||||
<p class="text-gray-600 dark:text-gray-400 text-sm mb-4 flex-grow"><%- __('calculator.complexity.simple_desc') %></p>
|
||||
<div class="flex items-center justify-between w-full">
|
||||
<span class="text-xs font-medium text-green-600 dark:text-green-400 bg-green-100 dark:bg-green-900 px-2 py-1 rounded-full">
|
||||
Стандарт
|
||||
</span>
|
||||
<span class="text-sm font-bold text-gray-900 dark:text-white">×1.0</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="complexity-card group cursor-pointer" data-complexity="medium" data-multiplier="1.5">
|
||||
<div class="bg-gradient-to-br from-yellow-50 to-yellow-100 dark:from-yellow-900 dark:to-yellow-800 rounded-2xl p-6 border-2 border-transparent group-hover:border-yellow-500 transition-all duration-300 h-full">
|
||||
<div class="flex flex-col items-center text-center h-full">
|
||||
<div class="w-12 h-12 bg-yellow-500 rounded-full flex items-center justify-center mb-4 shadow-lg">
|
||||
<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="M13 10V3L4 14h7v7l9-11h-7z"></path>
|
||||
</svg>
|
||||
</div>
|
||||
<h4 class="text-lg font-bold mb-2 text-gray-900 dark:text-white"><%- __('calculator.complexity.medium') %></h4>
|
||||
<p class="text-gray-600 dark:text-gray-400 text-sm mb-4 flex-grow"><%- __('calculator.complexity.medium_desc') %></p>
|
||||
<div class="flex items-center justify-between w-full">
|
||||
<span class="text-xs font-medium text-yellow-600 dark:text-yellow-400 bg-yellow-100 dark:bg-yellow-900 px-2 py-1 rounded-full">
|
||||
+50%
|
||||
</span>
|
||||
<span class="text-sm font-bold text-gray-900 dark:text-white">×1.5</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="complexity-card group cursor-pointer" data-complexity="complex" data-multiplier="2.5">
|
||||
<div class="bg-gradient-to-br from-red-50 to-red-100 dark:from-red-900 dark:to-red-800 rounded-2xl p-6 border-2 border-transparent group-hover:border-red-500 transition-all duration-300 h-full">
|
||||
<div class="flex flex-col items-center text-center h-full">
|
||||
<div class="w-12 h-12 bg-red-500 rounded-full flex items-center justify-center mb-4 shadow-lg">
|
||||
<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="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"></path>
|
||||
</svg>
|
||||
</div>
|
||||
<h4 class="text-lg font-bold mb-2 text-gray-900 dark:text-white"><%- __('calculator.complexity.complex') %></h4>
|
||||
<p class="text-gray-600 dark:text-gray-400 text-sm mb-4 flex-grow"><%- __('calculator.complexity.complex_desc') %></p>
|
||||
<div class="flex items-center justify-between w-full">
|
||||
<span class="text-xs font-medium text-red-600 dark:text-red-400 bg-red-100 dark:bg-red-900 px-2 py-1 rounded-full">
|
||||
+150%
|
||||
</span>
|
||||
<span class="text-sm font-bold text-gray-900 dark:text-white">×2.5</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Timeline Section -->
|
||||
<div>
|
||||
<h3 class="text-xl font-bold mb-6 text-center text-gray-900 dark:text-white">
|
||||
<%- __('calculator.timeline.title') %>
|
||||
</h3>
|
||||
<div class="grid grid-cols-1 md:grid-cols-3 gap-6">
|
||||
<div class="timeline-card group cursor-pointer" data-timeline="extended" data-multiplier="0.8">
|
||||
<div class="bg-gradient-to-br from-emerald-50 to-emerald-100 dark:from-emerald-900 dark:to-emerald-800 rounded-2xl p-6 border-2 border-transparent group-hover:border-emerald-500 transition-all duration-300 h-full">
|
||||
<div class="flex flex-col items-center text-center h-full">
|
||||
<div class="w-12 h-12 bg-emerald-500 rounded-full flex items-center justify-center mb-4 shadow-lg">
|
||||
<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="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"></path>
|
||||
</svg>
|
||||
</div>
|
||||
<h4 class="text-lg font-bold mb-2 text-gray-900 dark:text-white"><%- __('calculator.timeline.extended') %></h4>
|
||||
<p class="text-gray-600 dark:text-gray-400 text-sm mb-4 flex-grow"><%- __('calculator.timeline.extended_desc') %></p>
|
||||
<div class="flex items-center justify-between w-full">
|
||||
<span class="text-xs font-medium text-emerald-600 dark:text-emerald-400 bg-emerald-100 dark:bg-emerald-900 px-2 py-1 rounded-full">
|
||||
Скидка 20%
|
||||
</span>
|
||||
<span class="text-sm font-bold text-gray-900 dark:text-white">×0.8</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="timeline-card group cursor-pointer" data-timeline="standard" data-multiplier="1">
|
||||
<div class="bg-gradient-to-br from-blue-50 to-blue-100 dark:from-blue-900 dark:to-blue-800 rounded-2xl p-6 border-2 border-transparent group-hover:border-blue-500 transition-all duration-300 h-full">
|
||||
<div class="flex flex-col items-center text-center h-full">
|
||||
<div class="w-12 h-12 bg-blue-500 rounded-full flex items-center justify-center mb-4 shadow-lg">
|
||||
<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="M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"></path>
|
||||
</svg>
|
||||
</div>
|
||||
<h4 class="text-lg font-bold mb-2 text-gray-900 dark:text-white"><%- __('calculator.timeline.standard') %></h4>
|
||||
<p class="text-gray-600 dark:text-gray-400 text-sm mb-4 flex-grow"><%- __('calculator.timeline.standard_desc') %></p>
|
||||
<div class="flex items-center justify-between w-full">
|
||||
<span class="text-xs font-medium text-blue-600 dark:text-blue-400 bg-blue-100 dark:bg-blue-900 px-2 py-1 rounded-full">
|
||||
Рекомендуется
|
||||
</span>
|
||||
<span class="text-sm font-bold text-gray-900 dark:text-white">×1.0</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="timeline-card group cursor-pointer" data-timeline="rush" data-multiplier="1.5">
|
||||
<div class="bg-gradient-to-br from-orange-50 to-orange-100 dark:from-orange-900 dark:to-orange-800 rounded-2xl p-6 border-2 border-transparent group-hover:border-orange-500 transition-all duration-300 h-full">
|
||||
<div class="flex flex-col items-center text-center h-full">
|
||||
<div class="w-12 h-12 bg-orange-500 rounded-full flex items-center justify-center mb-4 shadow-lg">
|
||||
<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="M13 10V3L4 14h7v7l9-11h-7z"></path>
|
||||
</svg>
|
||||
</div>
|
||||
<h4 class="text-lg font-bold mb-2 text-gray-900 dark:text-white"><%- __('calculator.timeline.rush') %></h4>
|
||||
<p class="text-gray-600 dark:text-gray-400 text-sm mb-4 flex-grow"><%- __('calculator.timeline.rush_desc') %></p>
|
||||
<div class="flex items-center justify-between w-full">
|
||||
<span class="text-xs font-medium text-orange-600 dark:text-orange-400 bg-orange-100 dark:bg-orange-900 px-2 py-1 rounded-full">
|
||||
Доплата 50%
|
||||
</span>
|
||||
<span class="text-sm font-bold text-gray-900 dark:text-white">×1.5</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Step 3: Results -->
|
||||
<div id="step-3" class="step-content hidden p-8 md:p-12">
|
||||
<div class="text-center mb-10">
|
||||
<div class="w-16 h-16 bg-green-100 dark:bg-green-900 rounded-full flex items-center justify-center mx-auto mb-4">
|
||||
<svg class="w-8 h-8 text-green-600 dark:text-green-400" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z"></path>
|
||||
</svg>
|
||||
</div>
|
||||
<h2 class="text-2xl font-bold mb-3"><%- __('calculator.result.title') %></h2>
|
||||
<p class="text-lg text-gray-600 dark:text-gray-400"><%- __('calculator.result.subtitle') %></p>
|
||||
</div>
|
||||
|
||||
<!-- Price Breakdown Card -->
|
||||
<div class="max-w-2xl mx-auto mb-8">
|
||||
<div class="bg-gradient-to-br from-blue-50 to-purple-50 dark:from-blue-900 dark:to-purple-900 rounded-3xl p-8 border border-blue-200 dark:border-blue-700 shadow-xl">
|
||||
<div class="flex items-center justify-center mb-6">
|
||||
<div class="w-12 h-12 bg-blue-500 rounded-full flex items-center justify-center mr-4">
|
||||
<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="M9 7h6m0 10v-3m-3 3h.01M9 17h.01M9 14h.01M12 14h.01M15 11h.01M12 11h.01M9 11h.01M7 21h10a2 2 0 002-2V5a2 2 0 00-2-2H7a2 2 0 00-2 2v14a2 2 0 002 2z"></path>
|
||||
</svg>
|
||||
</div>
|
||||
<h3 class="text-xl font-bold text-gray-900 dark:text-white">Расчет стоимости</h3>
|
||||
</div>
|
||||
|
||||
<div class="space-y-4" id="priceBreakdown">
|
||||
<!-- Price breakdown items will be inserted here by JavaScript -->
|
||||
</div>
|
||||
|
||||
<!-- Promo Code Section -->
|
||||
<div class="mt-6 pt-6 border-t border-gray-200 dark:border-gray-700">
|
||||
<div class="flex gap-3">
|
||||
<input type="text" id="promoCode" placeholder="Введите промокод"
|
||||
class="flex-1 px-4 py-3 rounded-xl border border-gray-300 dark:border-gray-600 bg-white dark:bg-gray-800 text-gray-900 dark:text-white focus:ring-2 focus:ring-blue-500 focus:border-transparent transition-all duration-300">
|
||||
<button type="button" id="applyPromo"
|
||||
class="px-6 py-3 bg-blue-500 hover:bg-blue-600 text-white rounded-xl font-medium transition-all duration-300 hover:scale-105 focus:ring-2 focus:ring-blue-500 focus:ring-offset-2">
|
||||
Применить
|
||||
</button>
|
||||
</div>
|
||||
<div id="promoStatus" class="mt-2 text-sm"></div>
|
||||
</div>
|
||||
|
||||
<!-- Total Price -->
|
||||
<div class="mt-8 pt-6 border-t-2 border-gray-300 dark:border-gray-600">
|
||||
<div class="flex items-center justify-between">
|
||||
<span class="text-xl font-bold text-gray-900 dark:text-white">Итого</span>
|
||||
<span id="finalPrice" class="text-3xl font-bold bg-gradient-to-r from-blue-600 to-purple-600 bg-clip-text text-transparent">₩0</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Action Buttons -->
|
||||
<div class="flex flex-col sm:flex-row gap-4 max-w-lg mx-auto">
|
||||
<button type="button" id="getQuoteBtn"
|
||||
class="flex-1 bg-gradient-to-r from-blue-600 to-purple-600 hover:from-blue-700 hover:to-purple-700 text-white font-bold py-4 px-8 rounded-xl transition-all duration-300 hover:scale-105 focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 shadow-lg flex items-center justify-center">
|
||||
<svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 19l9 2-9-18-9 18 9-2zm0 0v-8"></path>
|
||||
</svg>
|
||||
<%- __('calculator.result.get_quote') %>
|
||||
</button>
|
||||
<button type="button" id="recalculateBtn"
|
||||
class="flex-1 bg-gray-200 dark:bg-gray-700 hover:bg-gray-300 dark:hover:bg-gray-600 text-gray-900 dark:text-white font-bold py-4 px-8 rounded-xl transition-all duration-300 hover:scale-105 focus:ring-2 focus:ring-gray-500 focus:ring-offset-2">
|
||||
<%- __('calculator.result.recalculate') %>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Navigation Buttons -->
|
||||
<div id="navigation" class="flex justify-between items-center p-8 border-t border-gray-200 dark:border-gray-700">
|
||||
<button type="button" id="prevBtn"
|
||||
class="hidden bg-gray-200 dark:bg-gray-700 hover:bg-gray-300 dark:hover:bg-gray-600 text-gray-900 dark:text-white font-semibold py-3 px-6 rounded-xl transition-all duration-300 hover:scale-105 focus:ring-2 focus:ring-gray-500 focus:ring-offset-2 flex items-center">
|
||||
<svg class="w-5 h-5 mr-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 19l-7-7 7-7"></path>
|
||||
</svg>
|
||||
<%- __('calculator.prev_step') %>
|
||||
</button>
|
||||
|
||||
<div class="flex-1"></div>
|
||||
|
||||
<button type="button" id="nextBtn"
|
||||
class="bg-gradient-to-r from-blue-600 to-purple-600 hover:from-blue-700 hover:to-purple-700 text-white font-semibold py-3 px-6 rounded-xl transition-all duration-300 hover:scale-105 focus:ring-2 focus:ring-blue-500 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed disabled:hover:scale-100 flex items-center" disabled>
|
||||
<span id="nextBtnText"><%- __('calculator.next_step') %></span>
|
||||
<svg class="w-5 h-5 ml-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
||||
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"></path>
|
||||
</svg>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Sticky Price Island - Independent floating block -->
|
||||
<div id="stickyPriceContainer" class="fixed bottom-4 left-1/2 transform -translate-x-1/2 z-50" style="display: none;">
|
||||
<!-- Independent price island with own background -->
|
||||
<div id="priceDisplay" class="bg-white/95 dark:bg-gray-800/95 backdrop-blur-lg rounded-2xl px-6 py-4 border border-gray-200/50 dark:border-gray-600/50 shadow-2xl transition-all duration-300 min-w-96 max-w-lg">
|
||||
<!-- Price breakdown header -->
|
||||
<div class="flex items-center justify-between mb-3 pb-2 border-b border-gray-200/50 dark:border-gray-600/50">
|
||||
<div class="flex items-center gap-2">
|
||||
<div class="w-3 h-3 bg-green-500 rounded-full animate-pulse"></div>
|
||||
<p class="text-sm font-medium text-gray-600 dark:text-gray-300"><%- __('calculator.result.price_breakdown') %></p>
|
||||
</div>
|
||||
<p id="currentPrice" class="text-xl font-bold text-gray-900 dark:text-white" aria-live="polite">
|
||||
₩0
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<!-- Detailed breakdown -->
|
||||
<div id="priceBreakdown" class="space-y-2 text-sm">
|
||||
<!-- Service selection -->
|
||||
<div id="selectedService" class="hidden">
|
||||
<div class="flex justify-between items-center">
|
||||
<span class="font-semibold text-gray-900 dark:text-white" id="serviceName"></span>
|
||||
<span class="font-medium text-gray-700 dark:text-gray-300" id="servicePrice"></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Complexity multiplier -->
|
||||
<div id="selectedComplexity" class="hidden">
|
||||
<div class="flex justify-between items-center text-gray-600 dark:text-gray-400">
|
||||
<span><%- __('calculator.complexity.label') %> <span id="complexityName"></span></span>
|
||||
<span>× <span id="complexityMultiplier"></span></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Timeline multiplier -->
|
||||
<div id="selectedTimeline" class="hidden">
|
||||
<div class="flex justify-between items-center text-gray-600 dark:text-gray-400">
|
||||
<span><%- __('calculator.timeline.label') %> <span id="timelineName"></span></span>
|
||||
<span>× <span id="timelineMultiplier"></span></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Promo code discount -->
|
||||
<div id="appliedPromo" class="hidden">
|
||||
<div class="flex justify-between items-center text-green-600 dark:text-green-400">
|
||||
<span><%- __('calculator.promo.discount') %> <span id="promoCode"></span></span>
|
||||
<span id="promoDiscount"></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Final calculation line -->
|
||||
<div class="pt-2 border-t border-gray-200/50 dark:border-gray-600/50">
|
||||
<div class="flex justify-between items-center">
|
||||
<span class="font-medium text-gray-700 dark:text-gray-300"><%- __('calculator.result.total') %>:</span>
|
||||
<span id="finalCalculation" class="font-bold text-lg text-blue-600 dark:text-blue-400"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Mobile Price Display -->
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Sticky Price Display - Fixed at bottom with backdrop blur -->
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Calculator translations for JavaScript -->
|
||||
<script>
|
||||
window.calculatorTranslations = {
|
||||
'calculator.result.estimated_price': '<%- __('calculator.result.estimated_price') %>',
|
||||
'calculator.next_step': '<%- __('calculator.next_step') %>',
|
||||
'calculator.calculate': '<%- __('calculator.calculate') %>',
|
||||
'services.web.title': '<%- __('services.web.title') %>',
|
||||
'services.mobile.title': '<%- __('services.mobile.title') %>',
|
||||
'services.design.title': '<%- __('services.design.title') %>',
|
||||
'services.marketing.title': '<%- __('services.marketing.title') %>'
|
||||
};
|
||||
</script>
|
||||
|
||||
<!-- Modern Calculator JavaScript -->
|
||||
<script src="/js/calculator-modern.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,677 +0,0 @@
|
||||
<!-- 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>
|
||||
@@ -1,302 +0,0 @@
|
||||
<!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 mt-16 hero-section-compact">
|
||||
<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>
|
||||
@@ -1,491 +0,0 @@
|
||||
<!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>
|
||||
@@ -1,22 +1,4 @@
|
||||
<!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') %>
|
||||
<!-- Contact page content starts here -->
|
||||
|
||||
<!-- 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 hero-section-compact">
|
||||
@@ -173,39 +155,36 @@
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<%- include('partials/footer') %>
|
||||
<!-- Contact page content ends here -->
|
||||
|
||||
<!-- Scripts -->
|
||||
<script>
|
||||
// Theme initialization
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
const theme = localStorage.getItem('theme') || 'light';
|
||||
document.documentElement.className = theme === 'dark' ? 'dark' : '';
|
||||
});
|
||||
<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);
|
||||
// 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>
|
||||
});
|
||||
</script>
|
||||
@@ -1,390 +0,0 @@
|
||||
<!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>
|
||||
118
views/index.ejs
118
views/index.ejs
@@ -1,58 +1,4 @@
|
||||
<!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 || 'SmartSolTech - Innovative Technology Solutions' %></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/icon-192x192.png">
|
||||
|
||||
<!-- Custom CSS (load first) -->
|
||||
<link href="/css/base.css" rel="stylesheet">
|
||||
<link href="/css/main.css" rel="stylesheet">
|
||||
<link href="/css/fixes.css" rel="stylesheet">
|
||||
|
||||
<!-- Tailwind CSS via CDN -->
|
||||
<script src="https://cdn.tailwindcss.com?plugins=forms,typography,aspect-ratio"></script>
|
||||
|
||||
<!-- Font Awesome -->
|
||||
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" rel="stylesheet" integrity="sha512-DTOQO9RWCH3ppGqcWaEA1BIZOC6xxalwEsw9c2QQeAIftl+Vegovlnee1c9QX4TctnWMn13TZye+giMm8e2LwA==" crossorigin="anonymous">
|
||||
|
||||
<!-- AOS Animation Library -->
|
||||
<link href="https://unpkg.com/aos@2.3.1/dist/aos.css" rel="stylesheet">
|
||||
|
||||
<!-- Tailwind Configuration -->
|
||||
<script>
|
||||
tailwind.config = {
|
||||
theme: {
|
||||
extend: {
|
||||
colors: {
|
||||
'primary': '#3B82F6',
|
||||
'secondary': '#8B5CF6',
|
||||
'accent': '#10B981',
|
||||
},
|
||||
fontFamily: {
|
||||
'sans': ['Inter', 'system-ui', 'sans-serif'],
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</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">
|
||||
@@ -68,7 +14,7 @@
|
||||
|
||||
<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">
|
||||
<h1 class="text-3xl md:text-5xl 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>
|
||||
@@ -98,10 +44,10 @@
|
||||
<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">
|
||||
<h2 class="text-2xl md:text-3xl 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">
|
||||
<p class="text-lg text-white text-center max-w-3xl mx-auto">
|
||||
<%- __('services.subtitle') %>
|
||||
</p>
|
||||
</div>
|
||||
@@ -163,10 +109,10 @@
|
||||
<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">
|
||||
<h2 class="text-2xl md:text-3xl 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">
|
||||
<p class="text-lg text-white text-center max-w-3xl mx-auto">
|
||||
<%- __('portfolio.subtitle') %>
|
||||
</p>
|
||||
</div>
|
||||
@@ -264,10 +210,10 @@
|
||||
<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 class="text-2xl md:text-3xl font-bold text-white mb-6">
|
||||
<%- __('calculator.cta.title') %>
|
||||
</h2>
|
||||
<p class="text-xl text-blue-100 mb-8 max-w-3xl mx-auto">
|
||||
<p class="text-lg 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">
|
||||
@@ -283,10 +229,10 @@
|
||||
<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">
|
||||
<h2 class="text-2xl md:text-3xl 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">
|
||||
<p class="text-lg text-white text-center mb-8">
|
||||
<%- __('contact.cta.subtitle') %>
|
||||
</p>
|
||||
<div class="space-y-4">
|
||||
@@ -356,39 +302,15 @@
|
||||
</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>
|
||||
|
||||
<!-- Initialize AOS -->
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
if (typeof AOS !== 'undefined') {
|
||||
AOS.init({
|
||||
duration: 800,
|
||||
easing: 'ease-in-out',
|
||||
once: true
|
||||
});
|
||||
}
|
||||
});
|
||||
</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);
|
||||
});
|
||||
<!-- Initialize AOS -->
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
if (typeof AOS !== 'undefined') {
|
||||
AOS.init({
|
||||
duration: 800,
|
||||
easing: 'ease-in-out',
|
||||
once: true
|
||||
});
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
</html>
|
||||
});
|
||||
</script>
|
||||
@@ -33,10 +33,10 @@
|
||||
<!-- 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">
|
||||
<link href="https://fonts.googleapis.com/css2?family=Ubuntu:wght@300;400;500;700&display=swap" rel="stylesheet">
|
||||
|
||||
<!-- Tailwind CSS (newer version with CDN Play) -->
|
||||
<script src="https://cdn.tailwindcss.com"></script>
|
||||
<!-- Tailwind CSS -->
|
||||
<link rel="stylesheet" href="/css/tailwind.css">
|
||||
|
||||
<!-- Font Awesome -->
|
||||
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" rel="stylesheet">
|
||||
@@ -48,24 +48,10 @@
|
||||
<link href="/css/base.css" rel="stylesheet">
|
||||
<link href="/css/main.css" rel="stylesheet">
|
||||
<link href="/css/fixes.css" rel="stylesheet">
|
||||
<link href="/css/theme-toggle.css" rel="stylesheet">
|
||||
<link href="/css/sticky-price.css" rel="stylesheet">
|
||||
|
||||
<!-- Tailwind Configuration -->
|
||||
<script>
|
||||
tailwind.config = {
|
||||
theme: {
|
||||
extend: {
|
||||
colors: {
|
||||
'primary': '#3B82F6',
|
||||
'secondary': '#8B5CF6',
|
||||
'accent': '#10B981',
|
||||
},
|
||||
fontFamily: {
|
||||
'sans': ['Inter', 'system-ui', 'sans-serif'],
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
</head>
|
||||
<body class="font-sans dark:bg-gray-900 dark:text-gray-100">
|
||||
<!-- Navigation -->
|
||||
@@ -109,5 +95,8 @@
|
||||
gtag('config', '<%= settings.seo.googleAnalytics %>');
|
||||
</script>
|
||||
<% } %>
|
||||
|
||||
<!-- Page-specific scripts -->
|
||||
<%- script %>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,103 +0,0 @@
|
||||
<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>
|
||||
@@ -1,80 +0,0 @@
|
||||
<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>
|
||||
@@ -36,12 +36,20 @@
|
||||
<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">
|
||||
<%
|
||||
let currentFlag = '🇰🇷';
|
||||
if (currentLanguage === 'en') currentFlag = '🇺🇸';
|
||||
else if (currentLanguage === 'ru') currentFlag = '🇷🇺';
|
||||
else if (currentLanguage === 'kk') currentFlag = '🇰🇿';
|
||||
let languageKey = 'korean';
|
||||
if (currentLanguage === 'en') {
|
||||
currentFlag = '🇺🇸';
|
||||
languageKey = 'english';
|
||||
} else if (currentLanguage === 'ru') {
|
||||
currentFlag = '🇷🇺';
|
||||
languageKey = 'russian';
|
||||
} else if (currentLanguage === 'kk') {
|
||||
currentFlag = '🇰🇿';
|
||||
languageKey = 'kazakh';
|
||||
}
|
||||
%>
|
||||
<span class="mr-2"><%= currentFlag %></span>
|
||||
<%= __('language.' + currentLanguage) %>
|
||||
<%= __('language.' + languageKey) %>
|
||||
<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">
|
||||
@@ -60,14 +68,18 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- iOS Style Theme Toggle -->
|
||||
<div class="relative inline-block" title="<%= __('theme.toggle') %>">
|
||||
<!-- Animated Theme Toggle -->
|
||||
<div class="relative inline-block ml-4" title="<%= __('theme.toggle') %>">
|
||||
<input type="checkbox" id="theme-toggle" class="sr-only">
|
||||
<label for="theme-toggle" class="flex items-center cursor-pointer">
|
||||
<div class="relative w-12 h-6 bg-gray-300 dark:bg-gray-600 rounded-full transition-colors duration-200">
|
||||
<div class="absolute top-0.5 left-0.5 w-5 h-5 bg-white rounded-full shadow-md transform transition-transform duration-200 flex items-center justify-center theme-toggle-slider">
|
||||
<i class="fas fa-sun text-yellow-500 text-xs theme-sun-icon"></i>
|
||||
<i class="fas fa-moon text-blue-500 text-xs hidden theme-moon-icon"></i>
|
||||
<div class="relative w-14 h-7 bg-gradient-to-r from-blue-200 to-yellow-200 dark:from-gray-700 dark:to-gray-600 rounded-full border-2 border-gray-300 dark:border-gray-500 transition-all duration-300 shadow-sm">
|
||||
<div class="absolute top-0.5 left-1 w-5 h-5 bg-white dark:bg-gray-200 rounded-full shadow-md transform transition-all duration-300 flex items-center justify-center theme-toggle-slider">
|
||||
<div class="relative w-full h-full flex items-center justify-center">
|
||||
<!-- Sun Icon -->
|
||||
<i class="fas fa-sun absolute text-yellow-500 text-xs theme-sun-icon transition-all duration-300 transform"></i>
|
||||
<!-- Moon Icon -->
|
||||
<i class="fas fa-moon absolute text-blue-500 text-xs theme-moon-icon transition-all duration-300 transform"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</label>
|
||||
@@ -113,57 +125,6 @@
|
||||
|
||||
<script>
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
// Theme Management
|
||||
const themeToggle = document.getElementById('theme-toggle');
|
||||
const html = document.documentElement;
|
||||
const slider = document.querySelector('.theme-toggle-slider');
|
||||
const sunIcon = document.querySelector('.theme-sun-icon');
|
||||
const moonIcon = document.querySelector('.theme-moon-icon');
|
||||
|
||||
// Get current theme
|
||||
const currentTheme = localStorage.getItem('theme') ||
|
||||
(window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light');
|
||||
|
||||
// Apply theme and update toggle
|
||||
function applyTheme(isDark) {
|
||||
if (isDark) {
|
||||
html.classList.add('dark');
|
||||
themeToggle.checked = true;
|
||||
if (slider) {
|
||||
slider.style.transform = 'translateX(24px)';
|
||||
slider.style.backgroundColor = '#374151';
|
||||
}
|
||||
if (sunIcon) sunIcon.classList.add('hidden');
|
||||
if (moonIcon) moonIcon.classList.remove('hidden');
|
||||
} else {
|
||||
html.classList.remove('dark');
|
||||
themeToggle.checked = false;
|
||||
if (slider) {
|
||||
slider.style.transform = 'translateX(0)';
|
||||
slider.style.backgroundColor = '#ffffff';
|
||||
}
|
||||
if (sunIcon) sunIcon.classList.remove('hidden');
|
||||
if (moonIcon) moonIcon.classList.add('hidden');
|
||||
}
|
||||
}
|
||||
|
||||
// Initial theme application
|
||||
applyTheme(currentTheme === 'dark');
|
||||
|
||||
// Theme toggle handler
|
||||
function toggleTheme() {
|
||||
const isDark = html.classList.contains('dark');
|
||||
const newTheme = isDark ? 'light' : 'dark';
|
||||
|
||||
applyTheme(!isDark);
|
||||
localStorage.setItem('theme', newTheme);
|
||||
fetch(`/theme/${newTheme}`);
|
||||
}
|
||||
|
||||
if (themeToggle) {
|
||||
themeToggle.addEventListener('change', toggleTheme);
|
||||
}
|
||||
|
||||
// Mobile Menu Management
|
||||
const mobileMenuToggle = document.getElementById('mobile-menu-toggle');
|
||||
const mobileMenu = document.getElementById('mobile-menu');
|
||||
@@ -193,5 +154,14 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Handle language change clicks
|
||||
document.querySelectorAll('a[href^="/lang/"]').forEach(link => {
|
||||
link.addEventListener('click', function(e) {
|
||||
const newLang = this.href.split('/lang/')[1];
|
||||
sessionStorage.setItem('expectedLanguage', newLang);
|
||||
console.log('Setting expected language:', newLang);
|
||||
});
|
||||
});
|
||||
});
|
||||
</script>
|
||||
@@ -1,18 +1,4 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="<%= locale || 'ko' %>" class="<%= theme === 'dark' ? 'dark' : '' %>">
|
||||
<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">
|
||||
<!-- Portfolio detail page content starts here -->
|
||||
<% if (portfolio.images && portfolio.images.length > 0) { %>
|
||||
<meta property="og:image" content="<%= portfolio.images.find(img => img.isPrimary)?.url || portfolio.images[0].url %>">
|
||||
<% } %>
|
||||
@@ -29,10 +15,7 @@
|
||||
<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">
|
||||
<link href="/css/dark-theme.css" rel="stylesheet">
|
||||
</head>
|
||||
<body class="font-sans dark:bg-gray-900 dark:text-gray-100">
|
||||
<%- include('partials/navigation') %>
|
||||
|
||||
|
||||
<!-- Portfolio Header -->
|
||||
<section class="pt-20 pb-12 bg-gradient-to-br from-gray-900 via-blue-900 to-purple-900">
|
||||
@@ -336,7 +319,7 @@
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<%- include('partials/footer') %>
|
||||
<!-- Portfolio detail page content ends here -->
|
||||
|
||||
<!-- Scripts -->
|
||||
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
|
||||
@@ -469,6 +452,4 @@
|
||||
};
|
||||
return categoryNames[category] || category;
|
||||
}
|
||||
%>
|
||||
</body>
|
||||
</html>
|
||||
%>
|
||||
@@ -1,34 +1,9 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="<%= locale || 'ko' %>" class="<%= theme === 'dark' ? 'dark' : '' %>">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title><%- __('portfolio.meta.title') %> - SmartSolTech</title>
|
||||
|
||||
<!-- SEO Meta Tags -->
|
||||
<meta name="description" content="<%- __('portfolio.meta.description') %>">
|
||||
<meta name="keywords" content="<%- __('portfolio.meta.keywords') %>">
|
||||
|
||||
<!-- Open Graph -->
|
||||
<meta property="og:title" content="<%- __('portfolio.meta.og_title') %>">
|
||||
<meta property="og:description" content="<%- __('portfolio.meta.og_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">
|
||||
|
||||
<!-- Portfolio page content starts here -->
|
||||
<!-- 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') %>
|
||||
|
||||
|
||||
<!-- Portfolio Hero Section -->
|
||||
<section class="hero-section-compact bg-gradient-to-br from-blue-600 via-purple-600 to-blue-800">
|
||||
@@ -197,11 +172,10 @@
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<%- include('partials/footer') %>
|
||||
<!-- Portfolio page content ends here -->
|
||||
|
||||
<!-- Scripts -->
|
||||
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
|
||||
<script src="/js/main.js"></script>
|
||||
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
|
||||
<script src="/js/main.js"></script>
|
||||
|
||||
<script>
|
||||
// Portfolio filtering functionality
|
||||
@@ -293,6 +267,4 @@
|
||||
};
|
||||
return categoryMap[category] ? __(categoryMap[category]) : category;
|
||||
}
|
||||
%>
|
||||
</body>
|
||||
</html>
|
||||
%>
|
||||
@@ -1,29 +1,6 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="<%= locale || 'ko' %>" class="<%= theme === 'dark' ? 'dark' : '' %>">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title><%- __('services.meta.title') %> - SmartSolTech</title>
|
||||
|
||||
<!-- SEO Meta Tags -->
|
||||
<meta name="description" content="<%- __('services.meta.description') %>">
|
||||
<meta name="keywords" content="<%- __('services.meta.keywords') %>">
|
||||
|
||||
<!-- 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">
|
||||
<!-- Services page content starts here -->
|
||||
<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') %>
|
||||
|
||||
|
||||
<!-- Services Hero Section - Компактный -->
|
||||
<section class="hero-section-compact bg-gradient-to-br from-blue-600 via-purple-600 to-blue-800">
|
||||
@@ -40,70 +17,99 @@
|
||||
<!-- 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">
|
||||
<div class="max-w-4xl mx-auto space-y-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"
|
||||
<div class="relative overflow-hidden rounded-3xl shadow-2xl hover:shadow-3xl transition-all duration-500 transform hover:-translate-y-1 mx-auto max-w-3xl"
|
||||
data-aos="fade-up"
|
||||
data-aos-delay="<%= index * 100 %>">
|
||||
data-aos-delay="<%= index * 150 %>">
|
||||
|
||||
<!-- 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>
|
||||
<!-- Background with Gradient -->
|
||||
<div class="relative h-64 bg-gradient-to-r
|
||||
<% if (index % 4 === 0) { %>from-blue-600 to-purple-600<% } %>
|
||||
<% if (index % 4 === 1) { %>from-green-500 to-teal-600<% } %>
|
||||
<% if (index % 4 === 2) { %>from-purple-600 to-pink-600<% } %>
|
||||
<% if (index % 4 === 3) { %>from-orange-500 to-red-600<% } %>
|
||||
overflow-hidden">
|
||||
|
||||
<!-- Service Image/Icon Area -->
|
||||
<div class="absolute left-0 top-0 w-1/2 h-full flex items-center justify-center">
|
||||
<div class="relative z-10">
|
||||
<!-- Large service icon -->
|
||||
<div class="w-32 h-32 bg-white bg-opacity-20 rounded-full flex items-center justify-center mb-6 backdrop-blur-sm">
|
||||
<i class="<%= service.icon || 'fas fa-cog' %> text-white text-6xl"></i>
|
||||
</div>
|
||||
|
||||
<!-- Decorative elements -->
|
||||
<div class="absolute -top-8 -left-8 w-24 h-24 bg-white bg-opacity-10 rounded-full animate-pulse"></div>
|
||||
<div class="absolute -bottom-4 -right-4 w-16 h-16 bg-white bg-opacity-10 rounded-full animate-pulse" style="animation-delay: 1s;"></div>
|
||||
</div>
|
||||
|
||||
<!-- Gradient fade to center -->
|
||||
<div class="absolute right-0 top-0 w-1/2 h-full bg-gradient-to-r from-transparent to-current opacity-30"></div>
|
||||
</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>
|
||||
<!-- Service Content Area -->
|
||||
<div class="absolute right-0 top-0 w-1/2 h-full flex items-center">
|
||||
<div class="p-8 text-right w-full">
|
||||
|
||||
<!-- Service Category Badge -->
|
||||
<div class="inline-block mb-4">
|
||||
<span class="bg-white bg-opacity-20 text-white px-4 py-2 rounded-full text-sm font-medium backdrop-blur-sm">
|
||||
<%= service.category %>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<!-- Pricing -->
|
||||
<% if (service.pricing) { %>
|
||||
<div class="mb-6">
|
||||
<div class="text-sm text-gray-500 mb-1"><%- __('services.cards.starting_price') %></div>
|
||||
<div class="text-2xl font-bold text-blue-600">
|
||||
<%= service.pricing.basePrice ? service.pricing.basePrice.toLocaleString() : __('services.cards.consultation') %>
|
||||
<% if (service.pricing.basePrice) { %>
|
||||
<span class="text-sm text-gray-500">원~</span>
|
||||
<!-- Service Title -->
|
||||
<h3 class="text-3xl font-bold text-white mb-4 leading-tight">
|
||||
<%= service.name %>
|
||||
</h3>
|
||||
|
||||
<!-- Service Description -->
|
||||
<p class="text-white text-opacity-90 mb-6 leading-relaxed text-lg">
|
||||
<%= service.shortDescription || service.description %>
|
||||
</p>
|
||||
|
||||
<!-- Pricing -->
|
||||
<% if (service.pricing) { %>
|
||||
<div class="mb-6">
|
||||
<div class="text-white text-opacity-75 text-sm mb-1"><%- __('services.cards.starting_price') %></div>
|
||||
<div class="text-3xl font-bold text-white">
|
||||
<%= service.pricing.basePrice ? service.pricing.basePrice.toLocaleString() : __('services.cards.consultation') %>
|
||||
<% if (service.pricing.basePrice) { %>
|
||||
<span class="text-lg text-white text-opacity-75">원~</span>
|
||||
<% } %>
|
||||
</div>
|
||||
</div>
|
||||
<% } %>
|
||||
|
||||
<!-- Action Buttons -->
|
||||
<div class="flex flex-col gap-3 items-end">
|
||||
<a href="/contact?service=<%= service._id %>"
|
||||
class="bg-white text-gray-900 px-6 py-3 rounded-xl font-semibold hover:bg-gray-100 transition-all duration-300 transform hover:scale-105 shadow-lg">
|
||||
<%- __('services.cards.contact') %>
|
||||
</a>
|
||||
<a href="/calculator?service=<%= service._id %>"
|
||||
class="border-2 border-white text-white px-6 py-3 rounded-xl font-semibold hover:bg-white hover:text-gray-900 transition-all duration-300 transform hover:scale-105">
|
||||
<%- __('services.cards.calculate_cost') %>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<!-- Featured Badge -->
|
||||
<% if (service.featured) { %>
|
||||
<div class="absolute top-4 right-4">
|
||||
<span class="bg-yellow-400 text-gray-900 px-3 py-1 rounded-full text-sm font-bold shadow-lg">
|
||||
<i class="fas fa-star"></i> <%- __('services.cards.popular') %>
|
||||
</span>
|
||||
</div>
|
||||
<% } %>
|
||||
</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">
|
||||
<%- __('services.cards.contact') %>
|
||||
</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">
|
||||
<%- __('services.cards.calculate_cost') %>
|
||||
</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> <%- __('services.cards.popular') %>
|
||||
</span>
|
||||
</div>
|
||||
<% } %>
|
||||
</div>
|
||||
<% }) %>
|
||||
<% } else { %>
|
||||
<div class="col-span-full text-center py-12">
|
||||
<div class="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"><%- __('services.cards.coming_soon') %></h3>
|
||||
<p class="text-gray-400"><%- __('services.cards.coming_soon_desc') %></p>
|
||||
@@ -120,7 +126,7 @@
|
||||
<h2 class="text-3xl md:text-4xl font-bold text-gray-900 mb-4">
|
||||
<%- __('services.process.title') %>
|
||||
</h2>
|
||||
<p class="text-lg text-gray-600 mb-12 max-w-3xl mx-auto">
|
||||
<p class="text-lg text-gray-700 text-center mb-12 max-w-3xl mx-auto">
|
||||
<%- __('services.process.subtitle') %>
|
||||
</p>
|
||||
</div>
|
||||
@@ -131,10 +137,9 @@
|
||||
<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">
|
||||
고객의 요구사항을 정확히 파악하고
|
||||
최적의 솔루션을 기획합니다
|
||||
<h3 class="text-xl font-bold text-gray-900 mb-4"><%- __('services.process.step1.title') %></h3>
|
||||
<p class="text-gray-700 text-center">
|
||||
<%- __('services.process.step1.description') %>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -143,10 +148,9 @@
|
||||
<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">
|
||||
사용자 중심의 직관적인 디자인과
|
||||
견고한 시스템 아키텍처를 설계합니다
|
||||
<h3 class="text-xl font-bold text-gray-900 mb-4"><%- __('services.process.step2.title') %></h3>
|
||||
<p class="text-gray-700 text-center">
|
||||
<%- __('services.process.step2.description') %>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -155,10 +159,9 @@
|
||||
<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">
|
||||
최신 기술과 모범 사례를 활용하여
|
||||
효율적이고 확장 가능한 솔루션을 개발합니다
|
||||
<h3 class="text-xl font-bold text-gray-900 mb-4"><%- __('services.process.step3.title') %></h3>
|
||||
<p class="text-gray-700 text-center">
|
||||
<%- __('services.process.step3.description') %>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
@@ -167,10 +170,9 @@
|
||||
<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">
|
||||
철저한 테스트를 통해 품질을 보장하고
|
||||
안정적인 배포를 진행합니다
|
||||
<h3 class="text-xl font-bold text-gray-900 mb-4"><%- __('services.process.step4.title') %></h3>
|
||||
<p class="text-gray-700 text-center">
|
||||
<%- __('services.process.step4.description') %>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -184,7 +186,7 @@
|
||||
<!-- Content -->
|
||||
<div data-aos="fade-right">
|
||||
<h2 class="text-3xl md:text-4xl font-bold text-gray-900 mb-6">
|
||||
왜 SmartSolTech를 선택해야 할까요?
|
||||
<%- __('services.why_choose.title') %>
|
||||
</h2>
|
||||
|
||||
<div class="space-y-6">
|
||||
@@ -194,10 +196,9 @@
|
||||
<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>
|
||||
<h3 class="text-xl font-semibold text-gray-900 mb-2"><%- __('services.why_choose.modern_tech.title') %></h3>
|
||||
<p class="text-gray-600">
|
||||
항상 최신 기술 트렌드를 파악하고, 검증된 기술 스택을 활용하여
|
||||
미래 지향적인 솔루션을 제공합니다.
|
||||
<%- __('services.why_choose.modern_tech.description') %>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -208,10 +209,9 @@
|
||||
<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>
|
||||
<h3 class="text-xl font-semibold text-gray-900 mb-2"><%- __('services.why_choose.expert_team.title') %></h3>
|
||||
<p class="text-gray-600">
|
||||
각 분야의 전문가들로 구성된 팀이 협력하여
|
||||
최고 품질의 결과물을 보장합니다.
|
||||
<%- __('services.why_choose.expert_team.description') %>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -222,10 +222,9 @@
|
||||
<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>
|
||||
<h3 class="text-xl font-semibold text-gray-900 mb-2"><%- __('services.why_choose.fast_response.title') %></h3>
|
||||
<p class="text-gray-600">
|
||||
신속한 커뮤니케이션과 효율적인 프로젝트 관리로
|
||||
정해진 일정 내에 프로젝트를 완료합니다.
|
||||
<%- __('services.why_choose.fast_response.description') %>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -236,10 +235,9 @@
|
||||
<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>
|
||||
<h3 class="text-xl font-semibold text-gray-900 mb-2"><%- __('services.why_choose.continuous_support.title') %></h3>
|
||||
<p class="text-gray-600">
|
||||
프로젝트 완료 후에도 지속적인 유지보수와 기술 지원을
|
||||
통해 장기적인 파트너십을 유지합니다.
|
||||
<%- __('services.why_choose.continuous_support.description') %>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -251,10 +249,9 @@
|
||||
<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>
|
||||
<h3 class="text-2xl font-bold text-gray-900 mb-2"><%- __('services.why_choose.quality_guarantee.title') %></h3>
|
||||
<p class="text-gray-600">
|
||||
고객 만족을 위한<br>
|
||||
최고 품질의 서비스
|
||||
<%- __('services.why_choose.quality_guarantee.subtitle') %>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -267,29 +264,23 @@
|
||||
<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">
|
||||
프로젝트를 시작할 준비가 되셨나요?
|
||||
<%- __('services.cta.title') %>
|
||||
</h2>
|
||||
<p class="text-xl mb-8 opacity-90" data-aos="fade-up" data-aos-delay="200">
|
||||
무료 상담을 통해 최적의 솔루션을 제안해드리겠습니다
|
||||
<%- __('services.cta.subtitle') %>
|
||||
</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">
|
||||
비용 계산하기
|
||||
<%- __('services.cta.calculate_cost') %>
|
||||
</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">
|
||||
포트폴리오 보기
|
||||
<%- __('services.cta.view_portfolio') %>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<%- include('partials/footer') %>
|
||||
<!-- Services page content ends here -->
|
||||
|
||||
<!-- Scripts -->
|
||||
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
|
||||
<script src="/js/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
<script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script>
|
||||
<script src="/js/main.js"></script>
|
||||
Reference in New Issue
Block a user