메인페이지 스타일 1차 적용

This commit is contained in:
현성필
2025-11-15 13:59:30 +09:00
parent 8b84033d63
commit aae7a5ac89
12 changed files with 966 additions and 551 deletions
+332 -246
View File
@@ -620,14 +620,13 @@ hr {
top: 0;
left: 0;
right: 0;
background: rgba(255, 255, 255, 0.95);
background-color: #E5F8FF;
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
box-shadow: var(--shadow-sm);
z-index: 1000;
height: 65px;
height: 90px;
transition: all 0.3s ease;
border-bottom: 1px solid #5F666C;
border-bottom: 1px solid #dddddd;
}
.header-content {
@@ -638,6 +637,7 @@ hr {
max-width: 1920px;
margin: 0 auto;
padding: 0 20px;
margin-top: 20px;
}
.header-left {
@@ -3628,33 +3628,26 @@ select.form-control {
font-size: 14px;
transition: all 0.3s ease;
}
.login-btn:hover {
background: #EFF6FF;
color: #4B9BFF;
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1);
}
.login-btn-box {
width: 75px;
height: 37px;
padding: 0;
display: inline-flex;
align-items: center;
justify-content: center;
color: #1A1A2E;
gap: 4px;
padding: 4px 10px;
color: #212529;
text-decoration: none;
border: 1px solid #000000;
border-radius: 5.5px;
font-weight: 400;
font-size: 14px;
border: 1px solid #212529;
border-radius: 6px;
font-family: "Noto Sans CJK KR", "Pretendard", -apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans KR", sans-serif;
font-weight: 700;
font-size: 16px;
background: transparent;
transition: all 0.3s ease;
}
.login-btn-box:hover {
background: #F8FAFC;
color: #1A1A2E;
transform: translateY(-1px);
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
.login-btn-box .user-icon {
width: 24px;
height: 24px;
flex-shrink: 0;
}
.user-profile-dropdown {
@@ -4516,279 +4509,368 @@ select.form-control {
animation: slideDown 0.3s ease;
}
.hero-section {
.hero-carousel-section {
position: relative;
padding: 160px 0 100px;
background: linear-gradient(180deg, #EFF6FF 0%, #FFFFFF 100%);
width: 100%;
overflow: hidden;
}
.hero-carousel-container {
position: relative;
width: 100%;
height: 800px;
overflow: hidden;
}
@media (max-width: 1024px) {
.hero-carousel-container {
height: 800px;
}
}
@media (max-width: 768px) {
.hero-section {
padding: 120px 0 60px;
.hero-carousel-container {
height: 600px;
}
}
.hero-patterns {
.hero-carousel-track {
position: relative;
width: 100%;
height: 100%;
}
.hero-slide {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
pointer-events: none;
}
.hero-patterns .pattern-circle {
position: absolute;
border-radius: 50%;
opacity: 0.1;
}
.hero-patterns .pattern-circle.pattern-1 {
width: 400px;
height: 400px;
background: #00D4FF;
border-radius: 50%;
opacity: 0.1;
position: absolute;
top: -200px;
right: -100px;
animation: float 20s ease-in-out infinite;
}
.hero-patterns .pattern-circle.pattern-2 {
width: 300px;
height: 300px;
background: #FFD93D;
border-radius: 50%;
opacity: 0.1;
position: absolute;
bottom: -150px;
left: -50px;
animation: float 15s ease-in-out infinite reverse;
}
.hero-patterns .pattern-dots {
position: absolute;
top: 50%;
left: 10%;
width: 100px;
height: 100px;
background-image: radial-gradient(circle, #A78BFA 2px, transparent 2px);
background-size: 20px 20px;
opacity: 0.3;
}
.hero-content {
text-align: center;
position: relative;
z-index: 1;
max-width: 1280px;
margin: 0 auto;
padding: 0 24px;
}
.hero-badge {
display: inline-flex;
width: 100%;
height: 780px;
display: flex;
align-items: center;
gap: 8px;
padding: 8px 24px;
background: #FFFFFF;
border: 2px solid #FFD93D;
border-radius: 50px;
margin-bottom: 24px;
font-size: 14px;
font-weight: 600;
color: #1A1A2E;
animation: slideInDown 0.6s ease-out;
justify-content: center;
opacity: 0;
visibility: hidden;
transition: opacity 0.6s ease-in-out, visibility 0.6s ease-in-out;
}
.hero-badge .badge-icon {
font-size: 20px;
animation: bounce 2s infinite;
.hero-slide.active {
opacity: 1;
visibility: visible;
}
.hero-slide[data-slide="0"] {
background: #E5F8FF;
}
.hero-slide[data-slide="1"] {
background: #E5F8FF;
}
.hero-slide[data-slide="2"] {
background: #E5F8FF;
}
.main-headline {
font-size: 56px;
font-weight: 800;
line-height: 1.2;
margin-bottom: 24px;
color: #1A1A2E;
animation: slideInUp 0.8s ease-out;
.hero-slide-content {
width: 100%;
max-width: 1280px;
height: 100%;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 80px;
position: relative;
margin: 0 auto;
}
@media (min-width: 1440px) {
.hero-slide-content {
padding: 0 320px;
}
}
@media (min-width: 1280px) {
.hero-slide-content {
padding: 0 160px;
}
}
@media (max-width: 1024px) {
.hero-slide-content {
flex-direction: column;
padding: 80px 40px;
justify-content: center;
gap: 40px;
}
}
@media (max-width: 768px) {
.main-headline {
.hero-slide-content {
padding: 60px 20px;
gap: 30px;
}
}
.hero-text-content {
flex: 0 0 auto;
display: flex;
flex-direction: column;
gap: 46px;
z-index: 2;
}
@media (max-width: 1024px) {
.hero-text-content {
align-items: center;
text-align: center;
}
}
.hero-text .hero-subtitle {
font-family: "Noto Sans KR", sans-serif;
font-size: 36px;
font-weight: 400;
line-height: 1;
color: #212529;
margin: 0 0 12px 0;
}
@media (max-width: 1024px) {
.hero-text .hero-subtitle {
font-size: 28px;
}
}
@media (max-width: 768px) {
.hero-text .hero-subtitle {
font-size: 24px;
}
}
.hero-text .hero-title {
font-family: "Noto Sans KR", sans-serif;
font-size: 50px;
font-weight: 700;
line-height: 1.2;
color: #000000;
margin: 0;
}
@media (max-width: 1024px) {
.hero-text .hero-title {
font-size: 40px;
}
}
@media (max-width: 480px) {
.main-headline {
@media (max-width: 768px) {
.hero-text .hero-title {
font-size: 32px;
}
}
.main-headline .headline-highlight {
background: linear-gradient(135deg, #00D4FF 0%, #4B9BFF 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.sub-headline {
font-size: 20px;
font-weight: 400;
line-height: 1.6;
margin-bottom: 40px;
color: #64748B;
animation: slideInUp 0.9s ease-out;
}
@media (max-width: 768px) {
.sub-headline {
font-size: 16px;
}
}
.hero-buttons {
display: flex;
gap: 16px;
justify-content: center;
margin-bottom: 64px;
animation: slideInUp 1s ease-out;
}
@media (max-width: 768px) {
.hero-buttons {
flex-direction: column;
align-items: center;
}
}
.hero-buttons .btn {
.btn-hero-signup {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 16px 32px;
border-radius: 12px;
font-weight: 600;
font-size: 16px;
justify-content: center;
width: 178px;
height: 60px;
padding: 10px;
background: #0049B4;
color: #FFFFFF;
font-family: "Noto Sans KR", sans-serif;
font-size: 20px;
font-weight: 700;
border-radius: 10px;
text-decoration: none;
transition: all 0.3s ease;
cursor: pointer;
border: none;
}
.hero-buttons .btn:hover {
transform: translateY(-3px);
.btn-hero-signup:hover {
background: rgb(0, 52.3166666667, 129);
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0, 73, 180, 0.3);
}
.hero-buttons .btn.btn-primary {
background: linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%);
color: #FFFFFF;
box-shadow: 0 4px 12px rgba(75, 155, 255, 0.1);
.btn-hero-signup:active {
transform: translateY(0);
}
.hero-buttons .btn.btn-primary:hover {
box-shadow: 0 16px 40px rgba(75, 155, 255, 0.2);
}
.hero-buttons .btn.btn-secondary {
background: #FFFFFF;
color: #4B9BFF;
border: 2px solid #4B9BFF;
}
.hero-buttons .btn.btn-secondary:hover {
background: #EFF6FF;
}
@media (max-width: 480px) {
.hero-buttons .btn {
width: 100%;
justify-content: center;
@media (max-width: 1024px) {
.btn-hero-signup {
width: 200px;
}
}
.hero-stats {
.hero-image-content {
flex: 0 0 auto;
width: 556px;
height: 455px;
display: flex;
align-items: center;
justify-content: center;
gap: 64px;
animation: fadeIn 1.2s ease-out;
z-index: 1;
}
@media (min-width: 1280px) {
.hero-image-content {
width: 450px;
height: 370px;
}
}
@media (max-width: 1024px) {
.hero-image-content {
width: 400px;
height: 330px;
}
}
@media (max-width: 768px) {
.hero-stats {
flex-direction: column;
gap: 24px;
.hero-image-content {
width: 100%;
max-width: 350px;
height: auto;
}
}
.hero-stats .stat-item {
display: flex;
flex-direction: column;
align-items: center;
}
.hero-stats .stat-item .stat-number {
font-size: 40px;
font-weight: 800;
background: linear-gradient(135deg, #4B9BFF 0%, #2E7FF7 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.hero-stats .stat-item .stat-label {
font-size: 14px;
color: #64748B;
font-weight: 500;
}
.hero-image {
position: relative;
margin-top: 64px;
text-align: center;
}
.hero-image img {
max-width: 100%;
height: auto;
border-radius: 16px;
box-shadow: 0 16px 40px rgba(75, 155, 255, 0.2);
}
.hero-image .hero-decoration {
position: absolute;
.hero-image-content .hero-image {
width: 100%;
height: 100%;
top: 0;
left: 0;
pointer-events: none;
object-fit: contain;
}
.hero-image .hero-decoration::before, .hero-image .hero-decoration::after {
content: "";
.hero-nav-btn {
position: absolute;
border-radius: 50%;
}
.hero-image .hero-decoration::before {
top: 50%;
transform: translateY(-50%);
width: 60px;
height: 60px;
background: linear-gradient(135deg, #FFD93D 0%, #FF6B6B 100%);
top: -30px;
right: 10%;
animation: bounce 2s infinite;
background: rgba(255, 255, 255, 0.5);
border: none;
border-radius: 50px;
cursor: pointer;
display: none;
align-items: center;
justify-content: center;
z-index: 10;
transition: all 0.3s ease;
}
.hero-image .hero-decoration::after {
width: 40px;
height: 40px;
background: linear-gradient(135deg, #00D4FF 0%, #4B9BFF 100%);
bottom: -20px;
left: 15%;
animation: bounce 2s infinite 0.5s;
.hero-nav-btn:hover {
background: rgba(255, 255, 255, 0.8);
transform: translateY(-50%) scale(1.1);
}
.hero-nav-btn:active {
transform: translateY(-50%) scale(0.95);
}
.hero-nav-btn svg {
width: 22px;
height: 22px;
}
@media (min-width: 1280px) {
.hero-nav-btn {
display: flex;
}
}
.hero-nav-prev {
left: 210px;
}
.hero-nav-prev svg {
transform: rotate(180deg);
}
@media (min-width: 1280px) {
.hero-nav-prev {
left: 100px;
}
}
@media (max-width: 1024px) {
.hero-nav-prev {
left: 40px;
}
}
@media (max-width: 768px) {
.hero-nav-prev {
left: 20px;
}
}
.hero-nav-next {
right: 210px;
}
@media (min-width: 1280px) {
.hero-nav-next {
right: 100px;
}
}
@media (max-width: 1024px) {
.hero-nav-next {
right: 40px;
}
}
@media (max-width: 768px) {
.hero-nav-next {
right: 20px;
}
}
.hero-carousel-indicators {
position: absolute;
bottom: 160px;
left: 50%;
transform: translateX(-50%);
display: flex;
gap: 12px;
z-index: 10;
}
@media (max-width: 768px) {
.hero-carousel-indicators {
bottom: 30px;
gap: 8px;
}
}
.hero-indicator {
width: 14px;
height: 14px;
border-radius: 50%;
background: #F1F1F1;
border: none;
cursor: pointer;
padding: 0;
transition: all 0.3s ease;
}
.hero-indicator.active {
background: #0049B4;
}
.hero-indicator:hover:not(.active) {
background: rgba(0, 0, 0, 0.5);
}
@media (max-width: 768px) {
.hero-indicator {
width: 10px;
height: 10px;
}
.hero-indicator.active {
width: 28px;
border-radius: 5px;
}
}
.hero-autoplay-toggle {
display: flex;
align-items: center;
justify-content: center;
margin-left: 8px;
cursor: pointer;
padding: 0;
transition: all 0.3s ease;
position: relative;
}
.hero-autoplay-toggle svg {
position: absolute;
opacity: 0;
transition: opacity 0.3s ease;
}
.hero-autoplay-toggle svg.active {
opacity: 1;
}
.hero-autoplay-toggle:hover {
background: rgb(255, 255, 255);
border-color: #0049B4;
box-shadow: 0 2px 8px rgba(0, 73, 180, 0.2);
}
@media (max-width: 768px) {
.hero-autoplay-toggle {
margin-left: 6px;
}
.hero-autoplay-toggle svg {
width: 10px;
height: 12px;
}
}
.api-search-section {
position: relative;
min-height: 314px;
padding: 0;
margin-bottom: 80px;
}
.api-search-section .curved-background {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 314px;
background: linear-gradient(180deg, rgba(229, 248, 255, 0.3) 0%, rgba(255, 255, 255, 0.8) 100%);
z-index: 0;
}
.api-search-section .curved-background::after {
content: "";
position: absolute;
bottom: -50px;
left: 0;
width: 100%;
height: 100px;
background: #FFFFFF;
border-radius: 50% 50% 0 0/100% 100% 0 0;
margin-top: -80px;
}
.api-search-section .search-content-wrapper {
position: relative;
@@ -5001,6 +5083,8 @@ select.form-control {
.api-showcase {
position: relative;
display: flex;
align-items: center;
padding: 80px 0 100px;
background: #FFFFFF;
}
@@ -5009,6 +5093,7 @@ select.form-control {
margin: 0 auto;
padding: 0 20px;
position: relative;
width: 100%;
}
.api-showcase .section-header {
text-align: center;
@@ -5045,7 +5130,6 @@ select.form-control {
line-height: 1.5;
color: #1E1E1E;
margin: 0;
text-align: center !important;
}
@media (max-width: 1024px) {
.api-showcase .section-subtitle {
@@ -5174,6 +5258,7 @@ select.form-control {
min-height: 980px;
display: flex;
align-items: center;
margin-top: 150px;
}
.info-section .info-background {
position: absolute;
@@ -5326,10 +5411,11 @@ select.form-control {
padding: 100px 0;
background: #f2f6fb;
overflow: hidden;
min-height: 980px;
}
.support-center .support-background-pattern {
position: absolute;
right: 120px;
right: 320px;
top: 0;
width: 700px;
height: 660px;
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Binary file not shown.

After

Width:  |  Height:  |  Size: 676 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 581 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 149 KiB

@@ -31,35 +31,27 @@
font-size: $font-size-sm;
transition: $transition-base;
&:hover {
background: $light-bg;
color: $primary-blue;
transform: translateY(-2px);
box-shadow: $shadow-md;
}
// Box style for Figma design (75x37px with black border)
// Box style for Figma design (node-id: 721-1489)
&-box {
width: 75px;
height: 37px;
padding: 0;
display: inline-flex;
align-items: center;
justify-content: center;
color: $text-dark;
gap: 4px; // 아이콘-텍스트 간격
padding: 4px 10px;
color: #212529; // 강조 텍스트 색상
text-decoration: none;
border: 1px solid #000000;
border-radius: 5.5px;
font-weight: $font-weight-regular;
font-size: $font-size-sm;
border: 1px solid #212529;
border-radius: 6px;
font-family: 'Noto Sans CJK KR', $font-family-primary;
font-weight: $font-weight-bold; // 700
font-size: $font-size-base; // 16px
background: transparent;
transition: $transition-base;
&:hover {
background: $gray-bg;
color: $text-dark;
transform: translateY(-1px);
box-shadow: $shadow-sm;
.user-icon {
width: 24px;
height: 24px;
flex-shrink: 0;
}
}
}
@@ -55,14 +55,14 @@
top: 0;
left: 0;
right: 0;
background: rgba(255, 255, 255, 0.95);
//background-color: #C3DFEA;
background-color: #E5F8FF;
backdrop-filter: blur(10px);
-webkit-backdrop-filter: blur(10px);
box-shadow: var(--shadow-sm);
z-index: 1000;
height: 65px;
height: 90px;
transition: all 0.3s ease;
border-bottom: 1px solid #5F666C;
border-bottom: 1px solid #dddddd;
}
.header-content {
@@ -73,6 +73,7 @@
max-width: 1920px;
margin: 0 auto;
padding: 0 20px;
margin-top: 20px;
}
// ===========================
+322 -221
View File
@@ -1,249 +1,366 @@
// -----------------------------------------------------------------------------
// Hero section styles - Modern vibrant design
// Hero Carousel Section - Figma Design
// -----------------------------------------------------------------------------
.hero-section {
.hero-carousel-section {
position: relative;
padding: 160px 0 100px;
background: linear-gradient(180deg, $light-bg 0%, $white 100%);
width: 100%;
overflow: hidden;
}
.hero-carousel-container {
position: relative;
width: 100%;
height: 800px;
overflow: hidden;
@include respond-to('md') {
height: 800px;
}
@include respond-to('sm') {
padding: 120px 0 60px;
height: 600px;
}
}
// Background patterns
.hero-patterns {
.hero-carousel-track {
position: relative;
width: 100%;
height: 100%;
}
// Individual slide
.hero-slide {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
pointer-events: none;
width: 100%;
height: 780px;
display: flex;
align-items: center;
justify-content: center;
opacity: 0;
visibility: hidden;
transition: opacity 0.6s ease-in-out, visibility 0.6s ease-in-out;
.pattern-circle {
position: absolute;
border-radius: 50%;
opacity: 0.1;
&.pattern-1 {
@include pattern-circle(400px, $accent-cyan);
top: -200px;
right: -100px;
@include animate-float;
}
&.pattern-2 {
@include pattern-circle(300px, $accent-yellow);
bottom: -150px;
left: -50px;
animation: float 15s ease-in-out infinite reverse;
}
&.active {
opacity: 1;
visibility: visible;
}
.pattern-dots {
position: absolute;
top: 50%;
left: 10%;
width: 100px;
height: 100px;
background-image: radial-gradient(circle, $accent-purple 2px, transparent 2px);
background-size: 20px 20px;
opacity: 0.3;
// Slide backgrounds
&[data-slide="0"] {
background: #E5F8FF;
}
&[data-slide="1"] {
background: #E5F8FF;
}
&[data-slide="2"] {
background: #E5F8FF;
}
}
// Hero content
.hero-content {
text-align: center;
.hero-slide-content {
width: 100%;
max-width: 1280px;
height: 100%;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 80px; // 기본 패딩 줄임
position: relative;
z-index: 1;
max-width: $container-max-width;
margin: 0 auto;
padding: 0 $spacing-lg;
margin: 0 auto; // 가운데 정렬 보장
@include respond-to('xl') {
padding: 0 320px; // 1440px 이상에서만 패딩
}
@include respond-to('lg') {
padding: 0 160px; // 1280px 이상에서 중간 패딩
}
@include respond-to('md') {
flex-direction: column;
padding: 80px 40px;
justify-content: center;
gap: 40px;
}
@include respond-to('sm') {
padding: 60px 20px;
gap: 30px;
}
}
// Hero badge
.hero-badge {
.hero-text-content {
flex: 0 0 auto;
display: flex;
flex-direction: column;
gap: 46px;
z-index: 2;
@include respond-to('md') {
align-items: center;
text-align: center;
}
}
.hero-text {
.hero-subtitle {
font-family: 'Noto Sans KR', sans-serif;
font-size: 36px;
font-weight: 400;
line-height: 1;
color: #212529;
margin: 0 0 12px 0;
@include respond-to('md') {
font-size: 28px;
}
@include respond-to('sm') {
font-size: 24px;
}
}
.hero-title {
font-family: 'Noto Sans KR', sans-serif;
font-size: 50px;
font-weight: 700;
line-height: 1.2;
color: #000000;
margin: 0;
@include respond-to('md') {
font-size: 40px;
}
@include respond-to('sm') {
font-size: 32px;
}
}
}
.btn-hero-signup {
display: inline-flex;
align-items: center;
gap: $spacing-sm;
padding: $spacing-sm $spacing-lg;
background: $white;
border: 2px solid $accent-yellow;
border-radius: $border-radius-full;
margin-bottom: $spacing-lg;
font-size: $font-size-sm;
font-weight: $font-weight-semibold;
color: $text-dark;
@include animate-slide-in-down;
.badge-icon {
font-size: $font-size-lg;
@include animate-bounce;
}
}
// Main headline
.main-headline {
font-size: $font-size-5xl;
font-weight: $font-weight-extrabold;
line-height: $line-height-tight;
margin-bottom: $spacing-lg;
color: $text-dark;
@include animate-slide-in-up;
@include respond-to('sm') {
font-size: $font-size-3xl;
}
@include respond-to('xs') {
font-size: $font-size-2xl;
}
.headline-highlight {
@include gradient-text($gradient-accent);
}
}
// Sub headline
.sub-headline {
font-size: $font-size-lg;
font-weight: $font-weight-regular;
line-height: $line-height-normal;
margin-bottom: $spacing-2xl;
color: $text-gray;
animation: slideInUp 0.9s ease-out;
@include respond-to('sm') {
font-size: $font-size-base;
}
}
// Hero buttons
.hero-buttons {
display: flex;
gap: $spacing-md;
justify-content: center;
margin-bottom: $spacing-4xl;
animation: slideInUp 1s ease-out;
width: 178px;
height: 60px;
padding: 10px;
background: #0049B4;
color: #FFFFFF;
font-family: 'Noto Sans KR', sans-serif;
font-size: 20px;
font-weight: 700;
border-radius: 10px;
text-decoration: none;
transition: all 0.3s ease;
@include respond-to('sm') {
flex-direction: column;
align-items: center;
&:hover {
background: darken(#0049B4, 10%);
transform: translateY(-2px);
box-shadow: 0 4px 12px rgba(0, 73, 180, 0.3);
}
.btn {
@include button-base;
&:active {
transform: translateY(0);
}
&.btn-primary {
background: $gradient-primary;
color: $white;
box-shadow: $shadow-md;
&:hover {
box-shadow: $shadow-xl;
}
}
&.btn-secondary {
background: $white;
color: $primary-blue;
border: 2px solid $primary-blue;
&:hover {
background: $light-bg;
}
}
@include respond-to('xs') {
width: 100%;
justify-content: center;
}
@include respond-to('md') {
width: 200px;
}
}
// Hero stats
.hero-stats {
.hero-image-content {
flex: 0 0 auto;
width: 556px;
height: 455px;
display: flex;
align-items: center;
justify-content: center;
gap: $spacing-4xl;
@include animate-fade-in;
z-index: 1;
@include respond-to('lg') {
width: 450px;
height: 370px;
}
@include respond-to('md') {
width: 400px;
height: 330px;
}
@include respond-to('sm') {
flex-direction: column;
gap: $spacing-lg;
}
.stat-item {
display: flex;
flex-direction: column;
align-items: center;
.stat-number {
font-size: $font-size-3xl;
font-weight: $font-weight-extrabold;
@include gradient-text($gradient-primary);
}
.stat-label {
font-size: $font-size-sm;
color: $text-gray;
font-weight: $font-weight-medium;
}
}
}
// Hero image/illustration
.hero-image {
position: relative;
margin-top: $spacing-4xl;
text-align: center;
img {
max-width: 100%;
width: 100%;
max-width: 350px;
height: auto;
border-radius: $border-radius-xl;
box-shadow: $shadow-xl;
}
.hero-decoration {
position: absolute;
.hero-image {
width: 100%;
height: 100%;
top: 0;
left: 0;
pointer-events: none;
object-fit: contain;
}
}
&::before,
&::after {
content: '';
position: absolute;
border-radius: 50%;
}
// Navigation buttons
.hero-nav-btn {
position: absolute;
top: 50%;
transform: translateY(-50%);
width: 60px;
height: 60px;
background: rgba(255, 255, 255, 0.5);
border: none;
border-radius: 50px;
cursor: pointer;
display: none; // 기본값: 숨김
align-items: center;
justify-content: center;
z-index: 10;
transition: all 0.3s ease;
&::before {
width: 60px;
height: 60px;
background: $gradient-warm;
top: -30px;
right: 10%;
@include animate-bounce;
}
&:hover {
background: rgba(255, 255, 255, 0.8);
transform: translateY(-50%) scale(1.1);
}
&::after {
width: 40px;
height: 40px;
background: $gradient-accent;
bottom: -20px;
left: 15%;
animation: bounce 2s infinite 0.5s;
&:active {
transform: translateY(-50%) scale(0.95);
}
svg {
width: 22px;
height: 22px;
}
// 1280px 이상에서만 표시
@include respond-to('lg') {
display: flex;
}
}
.hero-nav-prev {
left: 210px;
svg {
transform: rotate(180deg);
}
@include respond-to('lg') {
left: 100px;
}
@include respond-to('md') {
left: 40px;
}
@include respond-to('sm') {
left: 20px;
}
}
.hero-nav-next {
right: 210px;
@include respond-to('lg') {
right: 100px;
}
@include respond-to('md') {
right: 40px;
}
@include respond-to('sm') {
right: 20px;
}
}
// Carousel indicators
.hero-carousel-indicators {
position: absolute;
bottom: 160px;
left: 50%;
transform: translateX(-50%);
display: flex;
gap: 12px;
z-index: 10;
@include respond-to('sm') {
bottom: 30px;
gap: 8px;
}
}
.hero-indicator {
width: 14px;
height: 14px;
border-radius: 50%;
background: #F1F1F1;
border: none;
cursor: pointer;
padding: 0;
transition: all 0.3s ease;
&.active {
background: #0049B4;
}
&:hover:not(.active) {
background: rgba(0, 0, 0, 0.5);
}
@include respond-to('sm') {
width: 10px;
height: 10px;
&.active {
width: 28px;
border-radius: 5px;
}
}
}
// Auto play toggle button
.hero-autoplay-toggle {
display: flex;
align-items: center;
justify-content: center;
margin-left: 8px;
cursor: pointer;
padding: 0;
transition: all 0.3s ease;
position: relative;
svg {
position: absolute;
opacity: 0;
transition: opacity 0.3s ease;
&.active {
opacity: 1;
}
}
&:hover {
background: rgba(255, 255, 255, 1);
border-color: #0049B4;
box-shadow: 0 2px 8px rgba(0, 73, 180, 0.2);
}
@include respond-to('sm') {
margin-left: 6px;
svg {
width: 10px;
height: 12px;
}
}
}
// -----------------------------------------------------------------------------
// API Search section styles - 검색 섹션
@@ -251,30 +368,9 @@
.api-search-section {
position: relative;
min-height: 314px;
padding: 0;
margin-bottom: 80px;
.curved-background {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 314px;
background: linear-gradient(180deg, rgba(229, 248, 255, 0.3) 0%, rgba(255, 255, 255, 0.8) 100%);
z-index: 0;
&::after {
content: '';
position: absolute;
bottom: -50px;
left: 0;
width: 100%;
height: 100px;
background: $white;
border-radius: 50% 50% 0 0 / 100% 100% 0 0;
}
}
margin-top: -80px;
.search-content-wrapper {
position: relative;
@@ -499,6 +595,8 @@
.api-showcase {
position: relative;
display: flex;
align-items: center; // 수직 중앙 정렬
padding: 80px 0 100px;
background: $white;
@@ -507,6 +605,7 @@
margin: 0 auto;
padding: 0 20px;
position: relative;
width: 100%;
}
.section-header {
@@ -543,12 +642,12 @@
line-height: 1.5;
color: #1E1E1E;
margin: 0;
text-align: center !important;
@include respond-to('md') {
font-size: 20px;
}
@include respond-to('sm') {
font-size: 18px;
}
@@ -684,6 +783,7 @@
min-height: 980px;
display: flex;
align-items: center;
margin-top: 150px;
.info-background {
position: absolute;
@@ -861,10 +961,11 @@
padding: $spacing-6xl 0;
background: #f2f6fb;
overflow: hidden;
min-height: 980px;
.support-background-pattern {
position: absolute;
right: 120px;
right: 320px;
top: 0;
width: 700px;
height: 660px;
@@ -5,41 +5,96 @@
<body>
<th:block layout:fragment="contentFragment">
<section class="hero-section">
<div class="hero-patterns">
<div class="pattern-circle pattern-1"></div>
<div class="pattern-circle pattern-2"></div>
<div class="pattern-dots"></div>
</div>
<div class="container">
<div class="hero-content">
<div class="hero-badge">
<span class="badge-icon">🚀</span>
<span>Wa bank 생태계에 오신 것을 환영합니다!</span>
<!-- Hero Carousel Section -->
<section class="hero-carousel-section">
<!-- Carousel Container -->
<div class="hero-carousel-container">
<div class="hero-carousel-track">
<!-- Slide 1 -->
<div class="hero-slide active" data-slide="0">
<div class="hero-slide-content">
<div class="hero-text-content">
<div class="hero-text">
<p class="hero-subtitle">세상의 모든 서비스</p>
<p class="hero-title">광주은행 API가 함께 합니다.</p>
</div>
<a th:href="@{/signup}" class="btn-hero-signup">회원가입하기</a>
</div>
<div class="hero-image-content">
<img th:src="@{/img/hero_image_1.png}" alt="광주은행 API 서비스" class="hero-image">
</div>
</div>
</div>
<h1 class="main-headline">
<span class="headline-wa">Wa한</span> 금융 혁신,<br>
여러분의 아이디어로 시작됩니다
</h1>
<h2 class="sub-headline">
광주은행 오픈 API로 새로운 금융 서비스를 만들어보세요.<br>
안전하고 빠르게, 그리고 쉽게 연동할 수 있습니다.
</h2>
<div class="hero-buttons">
<a href="/apis" class="btn btn-primary">
<i class="fas fa-code"></i> API 둘러보기
</a>
<a href="#get-started" class="btn btn-secondary">
<i class="fas fa-play"></i> 5분 만에 시작하기
</a>
<!-- Slide 2 -->
<div class="hero-slide" data-slide="1">
<div class="hero-slide-content">
<div class="hero-text-content">
<div class="hero-text">
<p class="hero-subtitle">세상의 모든 서비스</p>
<p class="hero-title">광주은행 API가 함께 합니다.</p>
</div>
<a th:href="@{/signup}" class="btn-hero-signup">회원가입하기</a>
</div>
<div class="hero-image-content">
<img th:src="@{/img/hero_image_2.png}" alt="광주은행 API 서비스" class="hero-image">
</div>
</div>
</div>
<!-- Slide 3 -->
<div class="hero-slide" data-slide="2">
<div class="hero-slide-content">
<div class="hero-text-content">
<div class="hero-text">
<p class="hero-subtitle">세상의 모든 서비스</p>
<p class="hero-title">광주은행 API가 함께 합니다.</p>
</div>
<a th:href="@{/signup}" class="btn-hero-signup">회원가입하기</a>
</div>
<div class="hero-image-content">
<img th:src="@{/img/hero_image_3.png}" alt="광주은행 API 서비스" class="hero-image">
</div>
</div>
</div>
</div>
<!-- Navigation Buttons -->
<button class="hero-nav-btn hero-nav-prev" id="heroPrevBtn" aria-label="이전 슬라이드">
<svg width="18" height="32" viewBox="0 0 18 32" fill="none" xmlns="http://www.w3.org/2000/svg" style="transform: scaleX(-1);">
<path d="M2.17021 31.1127L-0.000440909 28.942L13.3853 15.5564L-0.000438653 2.17065L2.17021 4.76837e-07L17.7266 15.5564L2.17021 31.1127Z" fill="#0049B4"/>
</svg>
</button>
<button class="hero-nav-btn hero-nav-next" id="heroNextBtn" aria-label="다음 슬라이드">
<svg width="18" height="32" viewBox="0 0 18 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2.17021 31.1127L-0.000440909 28.942L13.3853 15.5564L-0.000438653 2.17065L2.17021 4.76837e-07L17.7266 15.5564L2.17021 31.1127Z" fill="#0049B4"/>
</svg>
</button>
<!-- Carousel Indicators -->
<div class="hero-carousel-indicators">
<button class="hero-indicator active" data-slide-to="0" aria-label="슬라이드 1"></button>
<button class="hero-indicator" data-slide-to="1" aria-label="슬라이드 2"></button>
<button class="hero-indicator" data-slide-to="2" aria-label="슬라이드 3"></button>
<!-- Auto Play Toggle Button -->
<button class="hero-autoplay-toggle" id="heroAutoplayToggle" aria-label="자동 재생 일시정지">
<!-- Pause Icon (default) -->
<svg class="pause-icon active" width="12" height="14" viewBox="0 0 12 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8 14V0H12V14H8ZM0 14V0H4V14H0Z" fill="#1D1B20"/>
</svg>
<!-- Play Icon -->
<svg class="play-icon" width="12" height="14" viewBox="0 0 12 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 0V14L12 7L0 0Z" fill="#0049B4"/>
</svg>
</button>
</div>
</div>
</section>
<!-- API 검색 섹션 -->
<section class="api-search-section">
<div class="curved-background"></div>
<div class="search-content-wrapper">
<div class="search-character">
<img th:src="@{/img/img_search_character.png}" alt="검색">
@@ -75,7 +130,7 @@
</div>
</section>
<!-- 추천 API 섹션 - Figma Design -->
<!-- 추천 API 섹션 -->
<section class="api-showcase">
<div class="showcase-wrapper">
<div class="section-header">
@@ -137,7 +192,7 @@
</div>
</section>
<!-- 정보 섹션 - Figma Design -->
<!-- 정보 섹션 -->
<section class="info-section">
<div class="info-background"></div>
<!-- <div class="info-point-image"></div>-->
@@ -170,7 +225,7 @@
</div>
</section>
<!-- 지원 센터 섹션 - Figma Design -->
<!-- 지원 센터 섹션 -->
<section class="support-center">
<div class="support-background-pattern"></div>
<div class="container">
@@ -215,7 +270,7 @@
</div>
</section>
<!-- API 활용 현황 섹션 - Figma Design -->
<!-- API 활용 현황 섹션 -->
<section class="api-stats-section">
<div class="stats-background"></div>
<div class="container">
@@ -281,7 +336,7 @@
</div>
</section>
<!-- 지금 바로 회원가입 CTA 섹션 - Figma Design -->
<!-- 지금 바로 회원가입 CTA 섹션 -->
<section class="signup-cta-section">
<div class="cta-background"></div>
<div class="container">
@@ -296,8 +351,208 @@
</body>
<th:block layout:fragment="contentScript">
<script>
// 숫자 카운트업 애니메이션
document.addEventListener('DOMContentLoaded', function() {
// ========================================
// Hero Carousel
// ========================================
const heroCarousel = {
currentSlide: 0,
totalSlides: 3,
autoPlayInterval: null,
autoPlayDelay: 5000,
isPlaying: true,
init: function() {
this.slides = document.querySelectorAll('.hero-slide');
this.indicators = document.querySelectorAll('.hero-indicator');
this.prevBtn = document.getElementById('heroPrevBtn');
this.nextBtn = document.getElementById('heroNextBtn');
this.autoplayToggle = document.getElementById('heroAutoplayToggle');
this.pauseIcon = this.autoplayToggle?.querySelector('.pause-icon');
this.playIcon = this.autoplayToggle?.querySelector('.play-icon');
if (!this.slides.length) return;
this.bindEvents();
this.startAutoPlay();
},
bindEvents: function() {
// Previous button
if (this.prevBtn) {
this.prevBtn.addEventListener('click', () => {
this.goToSlide(this.currentSlide - 1);
this.resetAutoPlay();
});
}
// Next button
if (this.nextBtn) {
this.nextBtn.addEventListener('click', () => {
this.goToSlide(this.currentSlide + 1);
this.resetAutoPlay();
});
}
// Indicators
this.indicators.forEach((indicator, index) => {
indicator.addEventListener('click', () => {
this.goToSlide(index);
this.resetAutoPlay();
});
});
// Auto play toggle button
if (this.autoplayToggle) {
this.autoplayToggle.addEventListener('click', () => {
this.toggleAutoPlay();
});
}
// Pause on hover (only if playing)
const container = document.querySelector('.hero-carousel-container');
if (container) {
container.addEventListener('mouseenter', () => {
if (this.isPlaying) {
this.pauseAutoPlay();
}
});
container.addEventListener('mouseleave', () => {
if (this.isPlaying) {
this.startAutoPlay();
}
});
}
// Touch events for mobile
let touchStartX = 0;
let touchEndX = 0;
if (container) {
container.addEventListener('touchstart', (e) => {
touchStartX = e.changedTouches[0].screenX;
});
container.addEventListener('touchend', (e) => {
touchEndX = e.changedTouches[0].screenX;
this.handleSwipe(touchStartX, touchEndX);
});
}
},
goToSlide: function(index) {
// Wrap around
if (index < 0) {
index = this.totalSlides - 1;
} else if (index >= this.totalSlides) {
index = 0;
}
// Update slides
this.slides.forEach((slide, i) => {
slide.classList.toggle('active', i === index);
});
// Update indicators
this.indicators.forEach((indicator, i) => {
indicator.classList.toggle('active', i === index);
});
this.currentSlide = index;
},
handleSwipe: function(startX, endX) {
const minSwipeDistance = 50;
const distance = startX - endX;
if (Math.abs(distance) > minSwipeDistance) {
if (distance > 0) {
// Swipe left - next slide
this.goToSlide(this.currentSlide + 1);
} else {
// Swipe right - previous slide
this.goToSlide(this.currentSlide - 1);
}
this.resetAutoPlay();
}
},
startAutoPlay: function() {
this.pauseAutoPlay();
this.autoPlayInterval = setInterval(() => {
this.goToSlide(this.currentSlide + 1);
}, this.autoPlayDelay);
},
pauseAutoPlay: function() {
if (this.autoPlayInterval) {
clearInterval(this.autoPlayInterval);
this.autoPlayInterval = null;
}
},
resetAutoPlay: function() {
if (this.isPlaying) {
this.pauseAutoPlay();
this.startAutoPlay();
}
},
toggleAutoPlay: function() {
this.isPlaying = !this.isPlaying;
if (this.isPlaying) {
// Start auto play
this.startAutoPlay();
// Update icons
if (this.pauseIcon) this.pauseIcon.classList.add('active');
if (this.playIcon) this.playIcon.classList.remove('active');
// Update aria-label
if (this.autoplayToggle) {
this.autoplayToggle.setAttribute('aria-label', '자동 재생 일시정지');
}
} else {
// Stop auto play
this.pauseAutoPlay();
// Update icons
if (this.pauseIcon) this.pauseIcon.classList.remove('active');
if (this.playIcon) this.playIcon.classList.add('active');
// Update aria-label
if (this.autoplayToggle) {
this.autoplayToggle.setAttribute('aria-label', '자동 재생 시작');
}
}
}
};
// Initialize hero carousel
heroCarousel.init();
// ========================================
// API 검색 기능
// ========================================
const searchInput = document.getElementById('apiSearchInput');
const searchForm = document.querySelector('.search-form');
const hashtags = document.querySelectorAll('.hashtag-link');
// 해시태그 클릭 이벤트
hashtags.forEach(tag => {
tag.addEventListener('click', function(e) {
e.preventDefault();
const searchTerm = this.getAttribute('data-search');
if (searchInput) {
searchInput.value = searchTerm;
}
// 폼 제출
if (searchForm) {
searchForm.submit();
}
});
});
// ========================================
// 숫자 카운트업 애니메이션
// ========================================
const observerOptions = {
threshold: 0.5,
rootMargin: '0px 0px -100px 0px'
@@ -338,24 +593,6 @@
if (statsSection) {
observer.observe(statsSection);
}
// API 검색 기능
const searchInput = document.getElementById('apiSearchInput');
const searchForm = document.querySelector('.search-form');
const hashtags = document.querySelectorAll('.hashtag');
// 해시태그 클릭 이벤트
hashtags.forEach(tag => {
tag.addEventListener('click', function(e) {
e.preventDefault();
const searchTerm = this.getAttribute('data-search');
searchInput.value = searchTerm;
// 폼 제출
if (searchForm) {
searchForm.submit();
}
});
});
});
</script>
</th:block>
@@ -38,7 +38,9 @@
<!-- Login State (Anonymous) -->
<div class="auth-group" sec:authorize="isAnonymous()">
<a th:href="@{/login}" class="login-btn login-btn-box">로그인</a>
<a th:href="@{/login}" class="login-btn login-btn-box">
<img th:src="@{/img/user_icon.svg}" alt="User" class="user-icon">로그인</a>
</div>
<!-- Logout State (Authenticated) -->
@@ -167,10 +169,6 @@
<!-- Anonymous User Actions -->
<div sec:authorize="isAnonymous()">
<a th:href="@{/login}" class="drawer-login-btn">로그인</a>
<a th:href="@{/signup}" class="drawer-signup-btn">
<span>회원 가입</span>
<i class="fas fa-arrow-right"></i>
</a>
</div>
<!-- Authenticated User Actions -->