AdminLTE3

This commit is contained in:
2025-10-26 22:14:47 +09:00
parent 291fc63a4c
commit 9974811a3e
226 changed files with 88284 additions and 3406 deletions

View File

@@ -0,0 +1,374 @@
import React, { useEffect, useState } from "react";
import {
ArrowRight, Calculator, Code2, Smartphone, Palette, LineChart, Eye, Menu, X,
Sun, Moon, ChevronDown, Phone, Mail, MessageCircle, Rocket, Users, Clock,
Headphones, Award
} from "lucide-react";
import AOS from "aos";
import "aos/dist/aos.css";
// Korean i18n strings to replace <%- __('...') %>
const t = {
navigation: {
home: "홈",
about: "회사소개",
services: "서비스",
portfolio: "포트폴리오",
contact: "연락처",
calculator: "비용계산기"
},
language: {
korean: "한국어",
english: "English",
russian: "Русский",
kazakh: "Қазақша"
},
hero: {
title: { smart: "스마트", solutions: "솔루션" },
subtitle: "혁신적인 기술로 비즈니스를 성장시키세요",
description: "비즈니스의 디지털 전환을 이끄는 혁신적인 웹개발, 모바일 앱, UI/UX 디자인",
cta: { start: "시작하기", portfolio: "포트폴리오 보기" },
},
services: {
title: { our: "우리의", services: "서비스" },
subtitle: "아이디어를 현실로 만드는 전문 개발 서비스",
description: "최첨단 기술과 창의적 아이디어로 완성하는 디지털 솔루션",
view_all: "모든 서비스 보기",
web: { title: "웹 개발", description: "반응형 웹사이트 및 웹 애플리케이션 개발", price: "500,000원부터" },
mobile: { title: "모바일 앱", description: "iOS 및 Android 네이티브 앱 개발", price: "1,000,000원부터" },
design: { title: "UI/UX 디자인", description: "사용자 중심의 인터페이스 및 경험 디자인", price: "300,000원부터" },
marketing: { title: "디지털 마케팅", description: "SEO, 소셜미디어 마케팅, 광고 관리", price: "200,000원부터" },
hero: {
title: "우리의",
title_highlight: "서비스",
subtitle: "혁신적인 기술로 비즈니스 성장 지원"
},
cards: {
starting_price: "시작 가격",
consultation: "상담",
calculate_cost: "비용 계산",
popular: "인기"
},
process: {
title: "프로젝트 수행 과정",
subtitle: "체계적이고 전문적인 프로세스로 프로젝트를 진행합니다",
step1: { title: "상담 및 기획", description: "고객의 요구사항을 정확히 파악하고 최적의 솔루션을 기획합니다" },
step2: { title: "디자인 및 설계", description: "사용자 중심의 직관적인 디자인과 견고한 시스템 아키텍처를 설계합니다" },
step3: { title: "개발 및 구현", description: "최신 기술과 모범 사례를 활용하여 효율적이고 확장 가능한 솔루션을 개발합니다" },
step4: { title: "테스트 및 배포", description: "철저한 테스트를 통해 품질을 보장하고 안정적인 배포를 진행합니다" }
},
why_choose: {
title: "왜 SmartSolTech를 선택해야 할까요?",
modern_tech: { title: "최신 기술 활용", description: "항상 최신 기술 트렌드를 파악하고, 검증된 기술 스택을 활용하여 미래 지향적인 솔루션을 제공합니다." },
expert_team: { title: "전문가 팀", description: "각 분야의 전문가들로 구성된 팀이 협력하여 최고 품질의 결과물을 보장합니다." },
fast_response: { title: "빠른 대응", description: "신속한 의사소통과 빠른 피드백을 통해 프로젝트를 효율적으로 진행합니다." },
continuous_support: { title: "지속적인 지원", description: "프로젝트 완료 후에도 지속적인 유지보수와 기술 지원을 제공합니다." },
quality_guarantee: { title: "품질 보장", subtitle: "최고 품질의 결과물을 약속드립니다" }
},
cta: {
title: "프로젝트를 시작할 준비가 되셨나요?",
subtitle: "지금 바로 무료 상담을 받아보세요",
calculate_cost: "비용 계산하기",
view_portfolio: "포트폴리오 보기"
}
},
portfolio: {
title: { recent: "최근", projects: "프로젝트" },
subtitle: "웹, 모바일, 브랜딩 분야의 선별된 작업들",
view_all: "전체 포트폴리오 보기",
},
calculator: {
cta: { title: "프로젝트 비용 계산기", subtitle: "몇 가지 질문에 답하여 빠른 견적을 받아보세요", button: "계산기 열기" },
},
contact: {
cta: { ready: "시작할", start: "준비가", question: " 되셨나요?", subtitle: "프로젝트에 대해 알려주세요 - 하루 안에 답변드리겠습니다" },
phone: { title: "전화", number: "+82 10-1234-5678" },
email: { title: "이메일", address: "hello@smartsoltech.kr" },
telegram: { title: "텔레그램", subtitle: "@smartsoltech" },
form: {
title: "빠른 연락",
name: "성함",
email: "이메일",
phone: "전화번호 (선택사항)",
service: {
select: "어떤 서비스에 관심이 있으신가요?",
web: "웹 개발",
mobile: "모바일 앱",
design: "UI/UX 디자인",
branding: "브랜딩",
consulting: "컨설팅",
other: "기타",
},
message: "프로젝트에 대해 알려주세요",
submit: "메시지 보내기",
},
},
common: { view_details: "자세히 보기" },
theme: { toggle: "테마 변경" }
};
const services = [
{ icon: <Code2 className="w-10 h-10" />, title: t.services.web.title, description: t.services.web.description, price: t.services.web.price, delay: 0 },
{ icon: <Smartphone className="w-10 h-10" />, title: t.services.mobile.title, description: t.services.mobile.description, price: t.services.mobile.price, delay: 100 },
{ icon: <Palette className="w-10 h-10" />, title: t.services.design.title, description: t.services.design.description, price: t.services.design.price, delay: 200 },
{ icon: <LineChart className="w-10 h-10" />, title: t.services.marketing.title, description: t.services.marketing.description, price: t.services.marketing.price, delay: 300 },
];
const demoPortfolio = [
{
_id: "p1",
title: "Fintech Dashboard",
category: "Web App",
images: [{ url: "https://picsum.photos/seed/fin/800/450", isPrimary: true }],
technologies: ["React", "Tailwind", "Node"],
description: "Realtime analytics with rolebased access.",
shortDescription: "Realtime analytics with rolebased access.",
viewCount: 423,
},
{
_id: "p2",
title: "Wellness Tracker",
category: "Mobile",
images: [{ url: "https://picsum.photos/seed/well/800/450", isPrimary: true }],
technologies: ["Kotlin", "Compose"],
description: "Personal health metrics and reminders.",
shortDescription: "Personal health metrics and reminders.",
viewCount: 1189,
},
{
_id: "p3",
title: "Brand Revamp",
category: "Branding",
images: [{ url: "https://picsum.photos/seed/brand/800/450", isPrimary: true }],
technologies: ["Figma", "Design System"],
description: "Identity, components, and marketing site.",
shortDescription: "Identity, components, and marketing site.",
viewCount: 762,
},
];
export default function LandingDemo() {
useEffect(() => {
AOS.init({ duration: 800, easing: "ease-in-out", once: true });
}, []);
return (
<div className="min-h-screen bg-gray-50 dark:bg-gray-900">
{/* Global styles for blob animation */}
<style jsx global>{`
@keyframes blob { 0% { transform: translate(0px,0px) scale(1); } 33% { transform: translate(20px,-30px) scale(1.1);} 66% { transform: translate(-10px,20px) scale(0.9);} 100% { transform: translate(0px,0px) scale(1);} }
.animate-blob { animation: blob 12s infinite; }
.animation-delay-2000 { animation-delay: 2s; }
.animation-delay-4000 { animation-delay: 4s; }
.glass-effect { backdrop-filter: blur(6px); }
.hero-section::before { content: ""; position: absolute; inset: 0; background: radial-gradient(1200px 600px at 10% -10%, rgba(99,102,241,.35), transparent 60%), radial-gradient(1000px 500px at 110% 10%, rgba(168,85,247,.35), transparent 60%); pointer-events:none; }
.cta-section { background: radial-gradient(1200px 600px at 10% 10%, rgba(59,130,246,.25), transparent 60%), linear-gradient(90deg, #3730a3, #7c3aed); }
.form-input { outline: none; }
`}</style>
{/* Hero */}
<section className="relative bg-gradient-to-br from-blue-900 via-purple-900 to-indigo-900 dark:from-gray-900 dark:via-blue-900 dark:to-purple-900 min-h-screen flex items-center overflow-hidden hero-section">
<div className="absolute inset-0 bg-black opacity-50 dark:opacity-70"></div>
<div className="absolute inset-0 bg-gradient-to-r from-blue-600/20 to-purple-600/20"></div>
{/* Animated blobs */}
<div className="absolute inset-0 overflow-hidden">
<div className="absolute -top-40 -right-32 w-80 h-80 bg-purple-500 dark:bg-purple-400 rounded-full mix-blend-multiply filter blur-xl opacity-70 animate-blob"></div>
<div className="absolute -bottom-40 -left-32 w-80 h-80 bg-blue-500 dark:bg-blue-400 rounded-full mix-blend-multiply filter blur-xl opacity-70 animate-blob animation-delay-2000"></div>
<div className="absolute top-40 left-40 w-80 h-80 bg-indigo-500 dark:bg-indigo-400 rounded-full mix-blend-multiply filter blur-xl opacity-70 animate-blob animation-delay-4000"></div>
</div>
<div className="relative max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 py-24 w-full">
<div className="text-center">
<h1 className="text-3xl md:text-5xl font-bold text-white mb-6 leading-tight" data-aos="fade-up">
{t.hero.title.smart} <span className="text-transparent bg-clip-text bg-gradient-to-r from-blue-400 to-purple-400">{t.hero.title.solutions}</span>
</h1>
<p className="text-xl md:text-2xl text-gray-300 dark:text-gray-200 mb-8 max-w-3xl mx-auto" data-aos="fade-up" data-aos-delay="200">
{t.hero.subtitle}
</p>
<div className="flex flex-col sm:flex-row gap-4 justify-center items-center" data-aos="fade-up" data-aos-delay="400">
<a href="#contact" className="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">
{t.hero.cta.start}
</a>
<a href="#portfolio" className="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">
{t.hero.cta.portfolio}
</a>
</div>
</div>
{/* Scroll indicator */}
<div className="absolute bottom-20 left-1/2 -translate-x-1/2 animate-bounce">
<svg className="w-6 h-6 text-white" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth="2" d="M19 14l-7 7m0 0l-7-7m7 7V3"></path>
</svg>
</div>
</div>
</section>
{/* Services */}
<section className="py-20 bg-white dark:bg-gray-900" id="services">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="text-center mb-16" data-aos="fade-up">
<h2 className="text-2xl md:text-3xl font-bold text-gray-900 dark:text-white mb-4">
{t.services.title.our} <span className="text-blue-600 dark:text-blue-400">{t.services.title.services}</span>
</h2>
<p className="text-lg text-gray-600 dark:text-gray-300 text-center max-w-3xl mx-auto">
{t.services.subtitle}
</p>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-8">
{services.map((s, i) => (
<div key={i} className="group p-8 bg-gray-50 dark:bg-gray-800 rounded-2xl hover:bg-white dark:hover:bg-gray-700 hover:shadow-xl transition-all duration-300 transform hover:-translate-y-2" data-aos="fade-up" data-aos-delay={s.delay}>
<div className="text-blue-600 dark:text-blue-400 mb-4 group-hover:scale-110 transition-transform duration-300">{s.icon}</div>
<h3 className="text-xl font-bold text-gray-900 dark:text-white mb-3">{s.title}</h3>
<p className="text-gray-600 dark:text-gray-300 mb-4">{s.description}</p>
<div className="text-blue-600 dark:text-blue-400 font-semibold">{s.price}</div>
</div>
))}
</div>
<div className="text-center mt-12" data-aos="fade-up">
<a href="#services" className="inline-flex items-center px-6 py-3 border border-blue-600 dark:border-blue-400 text-blue-600 dark:text-blue-400 font-semibold rounded-lg hover:bg-blue-600 hover:text-white dark:hover:bg-blue-400 dark:hover:text-gray-900 transition-colors">
{t.services.view_all}
<ArrowRight className="ml-2 w-5 h-5" />
</a>
</div>
</div>
</section>
{/* Portfolio */}
<section className="py-20 bg-gray-50 dark:bg-gray-800" id="portfolio">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="text-center mb-16" data-aos="fade-up">
<h2 className="text-2xl md:text-3xl font-bold text-gray-900 dark:text-white mb-4">
{t.portfolio.title.recent} <span className="text-purple-600 dark:text-purple-400">{t.portfolio.title.projects}</span>
</h2>
<p className="text-lg text-gray-600 dark:text-gray-300 text-center max-w-3xl mx-auto">
{t.portfolio.subtitle}
</p>
</div>
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-8">
{demoPortfolio.map((project, index) => (
<div key={project._id} className="group bg-white dark:bg-gray-700 rounded-2xl overflow-hidden shadow-lg hover:shadow-2xl transition-all duration-300 transform hover:-translate-y-2" data-aos="fade-up" data-aos-delay={index * 100}>
<div className="relative overflow-hidden">
<img src={project.images?.[0]?.url} alt={project.title} className="w-full h-48 object-cover" />
<div className="absolute inset-0 bg-gradient-to-t from-black/50 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-300"></div>
<div className="absolute bottom-4 left-4 right-4 translate-y-4 group-hover:translate-y-0 transition-transform duration-300 opacity-0 group-hover:opacity-100">
<div className="flex flex-wrap gap-2">
{project.technologies?.slice(0, 3).map((tech) => (
<span key={tech} className="px-2 py-1 bg-white/20 glass-effect text-white text-xs rounded-full">{tech}</span>
))}
</div>
</div>
</div>
<div className="p-6">
<div className="flex items-center justify-between mb-2">
<span className="px-3 py-1 bg-blue-100 dark:bg-blue-900 text-blue-600 dark:text-blue-300 text-sm rounded-full font-medium">{project.category}</span>
<span className="text-gray-500 dark:text-gray-400 text-sm flex items-center"><Eye className="w-4 h-4 mr-1" />{project.viewCount ?? 0}</span>
</div>
<h3 className="text-xl font-bold text-gray-900 dark:text-white mb-2 group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors">{project.title}</h3>
<p className="text-gray-600 dark:text-gray-300 mb-4">{project.shortDescription ?? project.description}</p>
<a href="#" className="inline-flex items-center text-blue-600 dark:text-blue-400 font-semibold hover:text-blue-700 dark:hover:text-blue-300 transition-colors">
{t.common.view_details}
<ArrowRight className="ml-1 w-4 h-4" />
</a>
</div>
</div>
))}
</div>
<div className="text-center mt-12" data-aos="fade-up">
<a href="#portfolio" className="inline-flex items-center px-6 py-3 bg-purple-600 dark:bg-purple-500 text-white font-semibold rounded-lg hover:bg-purple-700 dark:hover:bg-purple-400 transition-colors">
{t.portfolio.view_all}
<ArrowRight className="ml-2 w-5 h-5" />
</a>
</div>
</div>
</section>
{/* Calculator CTA */}
<section className="py-20 cta-section">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8 text-center relative z-10">
<div data-aos="fade-up">
<h2 className="text-2xl md:text-3xl font-bold text-white mb-6">{t.calculator.cta.title}</h2>
<p className="text-lg text-blue-100 mb-8 max-w-3xl mx-auto">{t.calculator.cta.subtitle}</p>
<a href="#calculator" className="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">
<Calculator className="mr-3" />
{t.calculator.cta.button}
</a>
</div>
</div>
</section>
{/* Contact */}
<section className="py-20 bg-white dark:bg-gray-900" id="contact">
<div className="max-w-7xl mx-auto px-4 sm:px-6 lg:px-8">
<div className="grid grid-cols-1 lg:grid-cols-2 gap-12 items-center">
<div data-aos="fade-right">
<h2 className="text-2xl md:text-3xl font-bold text-gray-900 dark:text-white mb-6">
{t.contact.cta.ready} <span className="text-blue-600 dark:text-blue-400">{t.contact.cta.start}</span>
{t.contact.cta.question}
</h2>
<p className="text-lg text-gray-600 dark:text-gray-300 mb-8">{t.contact.cta.subtitle}</p>
<div className="space-y-4">
<div className="flex items-center">
<div className="w-12 h-12 bg-blue-100 dark:bg-blue-900 rounded-full flex items-center justify-center mr-4">
<svg viewBox="0 0 24 24" className="w-6 h-6 text-blue-600 dark:text-blue-400" fill="none" stroke="currentColor"><path strokeLinecap="round" strokeLinejoin="round" strokeWidth="2" d="M3 5a2 2 0 012-2h3.28a2 2 0 011.94 1.515l.72 2.885a2 2 0 01-.52 1.94L9.12 11.88a16.001 16.001 0 006.999 6.999l1.54-1.28a2 2 0 011.94-.52l2.885.72A2 2 0 0121 20.72V24a2 2 0 01-2 2h-1C9.163 26 2 18.837 2 10V9a2 2 0 011-1.732V5z"/></svg>
</div>
<div>
<div className="font-semibold text-gray-900 dark:text-white">{t.contact.phone.title}</div>
<div className="text-gray-600 dark:text-gray-300">{t.contact.phone.number}</div>
</div>
</div>
<div className="flex items-center">
<div className="w-12 h-12 bg-purple-100 dark:bg-purple-900 rounded-full flex items-center justify-center mr-4">
<svg viewBox="0 0 24 24" className="w-6 h-6 text-purple-600 dark:text-purple-400" fill="none" stroke="currentColor"><path strokeLinecap="round" strokeLinejoin="round" strokeWidth="2" d="M16 12H8m8 4H8m8-8H8M5 20h14a2 2 0 002-2V6a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z"/></svg>
</div>
<div>
<div className="font-semibold text-gray-900 dark:text-white">{t.contact.email.title}</div>
<div className="text-gray-600 dark:text-gray-300">{t.contact.email.address}</div>
</div>
</div>
<div className="flex items-center">
<div className="w-12 h-12 bg-green-100 dark:bg-green-900 rounded-full flex items-center justify-center mr-4">
<svg viewBox="0 0 24 24" className="w-6 h-6 text-green-600 dark:text-green-400" fill="none" stroke="currentColor"><path strokeLinecap="round" strokeLinejoin="round" strokeWidth="2" d="M12 11c1.657 0 3-1.343 3-3S13.657 5 12 5 9 6.343 9 8s1.343 3 3 3zm-7 9a7 7 0 1114 0H5z"/></svg>
</div>
<div>
<div className="font-semibold text-gray-900 dark:text-white">{t.contact.telegram.title}</div>
<div className="text-gray-600 dark:text-gray-300">{t.contact.telegram.subtitle}</div>
</div>
</div>
</div>
</div>
<div data-aos="fade-left">
<div className="p-8 rounded-2xl shadow-lg bg-white dark:bg-gray-800">
<h3 className="text-2xl font-bold text-gray-900 dark:text-white mb-6">{t.contact.form.title}</h3>
<form className="space-y-4" onSubmit={(e) => e.preventDefault()}>
<input type="text" placeholder={t.contact.form.name} required className="w-full px-4 py-3 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent dark:bg-gray-700 dark:text-white" />
<input type="email" placeholder={t.contact.form.email} required className="w-full px-4 py-3 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent dark:bg-gray-700 dark:text-white" />
<input type="tel" placeholder={t.contact.form.phone} className="w-full px-4 py-3 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent dark:bg-gray-700 dark:text-white" />
<select className="w-full px-4 py-3 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent dark:bg-gray-700 dark:text-white">
<option value="">{t.contact.form.service.select}</option>
<option value="web">{t.contact.form.service.web}</option>
<option value="mobile">{t.contact.form.service.mobile}</option>
<option value="design">{t.contact.form.service.design}</option>
<option value="branding">{t.contact.form.service.branding}</option>
<option value="consulting">{t.contact.form.service.consulting}</option>
<option value="other">{t.contact.form.service.other}</option>
</select>
<textarea rows={4} placeholder={t.contact.form.message} required className="w-full px-4 py-3 border border-gray-300 dark:border-gray-600 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent resize-none dark:bg-gray-700 dark:text-white"></textarea>
<button type="submit" className="w-full 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">
{t.contact.form.submit}
</button>
</form>
</div>
</div>
</div>
</div>
</section>
</div>
);
}