diff --git a/workspace/zioinfo-web/frontend/src/pages/Common.css b/workspace/zioinfo-web/frontend/src/pages/Common.css index b751986f..eee3b085 100644 --- a/workspace/zioinfo-web/frontend/src/pages/Common.css +++ b/workspace/zioinfo-web/frontend/src/pages/Common.css @@ -1,19 +1,82 @@ -.inner-page { padding-top: var(--header-h); } +.inner-page { padding-top: var(--header-h); } + +/* Variant 스타일 page-hero */ .page-hero { - background: linear-gradient(135deg, var(--secondary), var(--primary-dark)); - padding: 60px 0; color: #fff; + background: linear-gradient(135deg, #002752 0%, #003366 60%, #005A8C 100%); + padding: 64px 0 56px; + color: #fff; + position: relative; + overflow: hidden; } -.page-hero-title { font-size: 40px; font-weight: 900; margin: 8px 0 12px; } -.page-hero p { color: rgba(255,255,255,.75); font-size: 16px; } +.page-hero::after { + content: ''; + position: absolute; + right: -80px; top: -80px; + width: 320px; height: 320px; + background: radial-gradient(circle, rgba(0,160,200,.18) 0%, transparent 70%); + pointer-events: none; +} +.section-label { + display: inline-block; + font-size: 12px; font-weight: 700; letter-spacing: .12em; + text-transform: uppercase; + color: #00A0C8; + margin-bottom: 10px; +} +.page-hero .section-label { color: #29B8D8; opacity: .9; } +.page-hero-title { + font-size: clamp(28px, 4vw, 42px); + font-weight: 900; + letter-spacing: -0.02em; + margin: 6px 0 10px; + line-height: 1.2; +} +.page-hero p { color: rgba(255,255,255,.75); font-size: 16px; line-height: 1.7; } + +/* 서브 네비게이션 Variant 스타일 */ +.sub-nav { + background: #fff; + border-bottom: 1px solid #E2E8F0; + position: sticky; top: var(--header-h); z-index: 10; + box-shadow: 0 2px 8px rgba(0,51,102,.06); +} +.sub-nav .container { display: flex; gap: 0; } +.sub-nav-item { + padding: 16px 20px; + font-size: 14px; font-weight: 500; + color: #475569; + border-bottom: 2px solid transparent; + transition: all 200ms; + text-decoration: none; +} +.sub-nav-item:hover { color: #003366; background: #F8FAFC; } +.sub-nav-item.active { + color: #003366; + border-bottom-color: #00A0C8; + font-weight: 700; +} + +/* 섹션 공통 */ +.section { padding: 80px 0; } +.section-header { text-align: center; margin-bottom: 48px; } +.section-title { + font-size: clamp(24px, 3.5vw, 38px); + font-weight: 800; + color: #003366; + letter-spacing: -0.02em; + line-height: 1.25; +} +.section-title em { color: #00A0C8; font-style: normal; } +.section-desc { font-size: 16px; color: #475569; margin-top: 12px; line-height: 1.7; } /* ── 정책/약관 페이지 ─────────────────────────────────────── */ .prose { color: var(--gray-700); line-height: 1.8; font-size: 15px; } -.prose h2 { font-size: 18px; font-weight: 700; color: var(--gray-900); margin: 32px 0 12px; border-left: 4px solid var(--accent); padding-left: 12px; } +.prose h2 { font-size: 18px; font-weight: 700; color: var(--gray-900); margin: 32px 0 12px; border-left: 4px solid #00A0C8; padding-left: 12px; } .prose p { margin-bottom: 14px; } .prose ul { margin: 0 0 14px 20px; } .prose ul li { margin-bottom: 6px; } -.prose a { color: var(--accent); } +.prose a { color: #00A0C8; } .policy-table { width: 100%; border-collapse: collapse; margin: 14px 0; font-size: 14px; } -.policy-table th, .policy-table td { padding: 10px 14px; border: 1px solid var(--gray-200); } -.policy-table th { background: var(--gray-50); font-weight: 600; color: var(--gray-700); text-align: left; } -.policy-footer { margin-top: 40px; padding: 20px; background: var(--gray-50); border-radius: 10px; font-size: 13px; color: var(--gray-500); line-height: 1.8; } +.policy-table th, .policy-table td { padding: 10px 14px; border: 1px solid #E2E8F0; } +.policy-table th { background: #F8FAFC; font-weight: 600; color: #475569; text-align: left; } +.policy-footer { margin-top: 40px; padding: 20px; background: #F8FAFC; border-radius: 10px; font-size: 13px; color: #94A3B8; line-height: 1.8; } diff --git a/workspace/zioinfo-web/frontend/src/pages/Home.jsx b/workspace/zioinfo-web/frontend/src/pages/Home.jsx index a0ab617a..bbd7c17d 100644 --- a/workspace/zioinfo-web/frontend/src/pages/Home.jsx +++ b/workspace/zioinfo-web/frontend/src/pages/Home.jsx @@ -29,37 +29,70 @@ const SLIDES = [ }, ]; -/* ── 핵심 사업 영역 ──────────────────────────────────────── */ +/* ── 핵심 사업 영역 (Variant SVG 아이콘) ─────────────────── */ const BUSINESS = [ { - icon: '🤖', + svg: ( + + + + + + + + ), title: 'AI 자동화', desc: 'GUARDiA ITSM 플랫폼으로 레거시 인프라 운영을 완전 자동화', path: '/solution/guardia', - color: 'var(--primary)', }, { - icon: '🏗️', + svg: ( + + + + + + ), title: 'SI 구축', desc: '공공기관 정보화사업 시스템 통합 및 맞춤형 개발', path: '/business/reference', - color: 'var(--accent)', }, { - icon: '💼', + svg: ( + + + + + + + + + + ), title: 'ERP·CRM·BI', desc: '기업 경영 효율화를 위한 통합 솔루션 패키지', path: '/solution/erp', - color: '#10B981', }, ]; -/* ── GUARDiA 핵심 기능 ───────────────────────────────────── */ +/* ── GUARDiA 핵심 기능 (SVG 아이콘) ─────────────────────── */ const GUARDIA_FEATURES = [ - { icon: '💬', label: 'ChatOps', desc: '메신저 명령으로 인프라 제어' }, - { icon: '🔧', label: '에이전트리스', desc: 'SSH만으로 에이전트 설치 없음' }, - { icon: '📊', label: '통합 ITSM', desc: 'SR·인시던트·변경·SLA 통합' }, - { icon: '🔒', label: '엔터프라이즈 보안', desc: 'MFA·PAM·Zero Trust' }, + { + svg: , + label: 'ChatOps', desc: '메신저 명령으로 인프라 제어', + }, + { + svg: , + label: '에이전트리스', desc: 'SSH만으로 에이전트 설치 없음', + }, + { + svg: , + label: '통합 ITSM', desc: 'SR·인시던트·변경·SLA 통합', + }, + { + svg: , + label: '엔터프라이즈 보안', desc: 'MFA·PAM·Zero Trust', + }, ]; /* ── KPI 수치 ────────────────────────────────────────────── */ @@ -152,40 +185,43 @@ export default function Home() { - {/* ── 핵심 사업 영역 ───────────────────────────────── */} -
+ {/* ── 핵심 사업 영역 (Variant 스타일) ─────────────────── */} +
-
- Our Business -

기업과 기관을 위한
맞춤형 IT 솔루션

-
+
+ 저희 서비스 +

핵심 전문성 및 솔루션

+
-
+
{BUSINESS.map((b, i) => ( - -
- {b.icon} + +
+
{b.svg}
+

{b.title}

+

{b.desc}

+ + 자세히 보기 → +
-

{b.title}

-

{b.desc}

- 자세히 보기 → ))}
- {/* ── GUARDiA 솔루션 하이라이트 ──────────────────────── */} -
+ {/* ── GUARDiA 솔루션 하이라이트 (Variant 스타일) ────────── */} +
- 대표 솔루션 -

- GUARDiA ITSM
- AI 기반 인프라 자율 운영 + 대표 솔루션 +

+ GUARDiA ITSM
+ AI 기반 인프라 자율 운영

-
+

1,000개 이상의 관공서 레거시 인프라를 메신저 한 줄 명령으로 제어하는 온프레미스 AI ChatOps 플랫폼. 에이전트 설치 없이 SSH/SFTP만으로 @@ -194,19 +230,21 @@ export default function Home() {

{GUARDIA_FEATURES.map((f, i) => (
- {f.icon} + + {f.svg} +
- {f.label} -

{f.desc}

+ {f.label} +

{f.desc}

))}
-
- +
+ GUARDiA 상세보기 - + 도입 문의
@@ -242,27 +280,37 @@ export default function Home() {
- {/* ── KPI 수치 ────────────────────────────────────────── */} -
+ {/* ── KPI 수치 (Variant 다크 네이비) ─────────────────── */} +
-
+
+ 숫자로 보는 지오정보기술 +

+ 신뢰받는 IT 파트너 +

+
+
{KPIS.map((k, i) => ( -
-
{k.value}
-
{k.label}
+
+
+ {k.value.replace(/[+%년]/g, '')} + {k.value.match(/[+%년]/)?.[0] || ''} +
+
{k.label}
))}
- {/* ── 최신 소식 ───────────────────────────────────────── */} -
+ {/* ── 최신 소식 (Variant 스타일) ──────────────────────── */} +
-
- Latest News -

지오정보기술 소식

-
+
+ 최신 소식 +

지오정보기술 소식

+
{news.length > 0 ? news.map(n => ( @@ -298,20 +346,28 @@ export default function Home() {
- {/* ── CTA 배너 ────────────────────────────────────────── */} -
+ {/* ── CTA 배너 (Variant v-cta-banner) ─────────────────── */} +
-
-
-

GUARDiA ITSM 도입을 검토하고 계신가요?

-

전문 컨설턴트가 귀 기관 환경에 맞는 최적의 방안을 제안해 드립니다.

+
+
+
+ GUARDiA ITSM 도입을 검토하고 계신가요? +
+

+ 전문 컨설턴트가 귀 기관 환경에 맞는 최적의 방안을 제안해 드립니다. +

-
- +
+ 무료 상담 신청 - - 제품 소개서 다운로드 + + 제품 소개서 →
diff --git a/workspace/zioinfo-web/frontend/src/styles/global.css b/workspace/zioinfo-web/frontend/src/styles/global.css index 60c2e0b9..ff3fb3a8 100644 --- a/workspace/zioinfo-web/frontend/src/styles/global.css +++ b/workspace/zioinfo-web/frontend/src/styles/global.css @@ -1,6 +1,7 @@ /* ============================================================ - (주)지오정보기술 글로벌 스타일 — URP 스타일 기반 + (주)지오정보기술 글로벌 스타일 — Variant 디자인 적용 ============================================================ */ +@import './tokens.css'; :root { /* ── 브랜드 컬러 ── */ @@ -27,8 +28,8 @@ --warning: #F59E0B; --danger: #EF4444; - /* ── 타이포그래피 ── */ - --font-sans: 'Noto Sans KR', 'Inter', -apple-system, sans-serif; + /* ── 타이포그래피 (Pretendard 우선) ── */ + --font-sans: 'Pretendard', 'Noto Sans KR', 'Inter', -apple-system, sans-serif; --font-en: 'Inter', sans-serif; /* ── 레이아웃 ── */ @@ -213,3 +214,181 @@ button { cursor: pointer; border: none; background: none; font-family: inherit; .grid-2, .grid-3, .grid-4 { grid-template-columns: 1fr; } .container { padding: 0 16px; } } + +/* ════════════════════════════════════════════════════ + Variant 디자인 시스템 — 공통 UI 요소 + ════════════════════════════════════════════════════ */ + +/* ── 섹션 라벨 (시안 소문자 + 굵은 텍스트) ── */ +.section-label-v { + display: inline-block; + font-size: var(--v-label-size, 12px); + font-weight: var(--v-label-weight, 700); + letter-spacing: var(--v-label-spacing, 0.1em); + text-transform: uppercase; + color: var(--v-cyan-500, #00A0C8); + margin-bottom: 12px; +} + +/* ── 섹션 제목 (Variant 스타일) ── */ +.section-title-v { + font-size: clamp(28px, 3.5vw, 42px); + font-weight: 800; + color: var(--v-navy-700, #003366); + line-height: 1.2; + letter-spacing: -0.02em; + margin-bottom: 16px; +} + +/* ── 언더라인 강조 (시안) ── */ +.section-underline { + width: 48px; height: 3px; + background: var(--v-cyan-500, #00A0C8); + border-radius: 2px; + margin: 0 auto 40px; +} +.section-underline.left { margin-left: 0; } + +/* ── 서비스 아이콘 카드 (Variant 스타일) ── */ +.v-icon-box { + width: 64px; height: 64px; + background: var(--v-blue-100, #E8F0F8); + border-radius: var(--v-radius-md, 12px); + display: flex; align-items: center; justify-content: center; + margin-bottom: 20px; + transition: all var(--v-ease, 240ms); +} +.v-icon-box svg { width: 32px; height: 32px; } +.v-card:hover .v-icon-box { + background: var(--v-cyan-100, #E8F7FB); + transform: scale(1.08); +} + +/* ── 서비스 카드 (Variant 스타일) ── */ +.v-card { + background: #fff; + border-radius: var(--v-radius-lg, 16px); + border: 1px solid var(--v-gray-200, #E2E8F0); + padding: 32px 28px; + box-shadow: var(--v-shadow-sm); + transition: all var(--v-ease, 240ms); +} +.v-card:hover { + box-shadow: var(--v-shadow-lg); + transform: translateY(-4px); + border-color: var(--v-blue-200, #C5D8EF); +} +.v-card-title { + font-size: 18px; font-weight: 700; + color: var(--v-navy-700, #003366); + margin-bottom: 10px; +} +.v-card-desc { + font-size: 14px; line-height: 1.7; + color: var(--v-gray-600, #475569); +} + +/* ── 통계 섹션 (다크 네이비) ── */ +.v-stats-section { + background: var(--v-navy-800, #002752); + padding: var(--v-section-py, 96px) 0; +} +.v-stat-number { + font-size: clamp(32px, 4vw, 52px); + font-weight: 900; + color: #fff; + letter-spacing: -0.02em; + line-height: 1; +} +.v-stat-label { + font-size: 14px; color: rgba(255,255,255,.65); + margin-top: 8px; font-weight: 500; +} +.v-stat-unit { + font-size: 18px; font-weight: 700; color: var(--v-cyan-400, #29B8D8); + margin-left: 4px; +} + +/* ── CTA 배너 (다크) ── */ +.v-cta-banner { + background: linear-gradient(135deg, var(--v-navy-700), var(--v-navy-500)); + border-radius: var(--v-radius-xl, 24px); + padding: 48px 56px; + display: flex; align-items: center; justify-content: space-between; gap: 32px; + box-shadow: var(--v-shadow-lg); +} +.v-cta-title { + font-size: clamp(20px, 2.5vw, 28px); + font-weight: 800; color: #fff; +} +.v-cta-sub { + font-size: 15px; color: rgba(255,255,255,.7); + margin-top: 8px; +} + +/* ── Variant 버튼 스타일 ── */ +.btn-v-primary { + display: inline-flex; align-items: center; gap: 8px; + padding: 13px 28px; + background: var(--v-navy-700, #003366); + color: #fff; font-weight: 700; font-size: 15px; + border-radius: var(--v-radius-full, 9999px); + border: none; cursor: pointer; + transition: all var(--v-ease, 240ms); + text-decoration: none; +} +.btn-v-primary:hover { + background: var(--v-navy-600, #004080); + box-shadow: var(--v-shadow-md); + transform: translateY(-2px); +} +.btn-v-ghost { + display: inline-flex; align-items: center; gap: 8px; + padding: 12px 28px; + background: transparent; + color: var(--v-navy-700, #003366); font-weight: 600; font-size: 15px; + border-radius: var(--v-radius-full, 9999px); + border: 2px solid var(--v-navy-700, #003366); + cursor: pointer; transition: all var(--v-ease, 240ms); + text-decoration: none; +} +.btn-v-ghost:hover { + background: var(--v-blue-100, #E8F0F8); +} +.btn-v-cyan { + background: var(--v-cyan-500, #00A0C8); +} +.btn-v-cyan:hover { background: var(--v-cyan-400, #29B8D8); } + +/* ── 파트너 로고 바 ── */ +.v-partners-bar { + display: flex; align-items: center; justify-content: center; + gap: 40px; flex-wrap: wrap; + padding: 32px 0; + border-top: 1px solid var(--v-gray-200); + border-bottom: 1px solid var(--v-gray-200); + margin: 32px 0; +} +.v-partner-item { + font-size: 15px; font-weight: 700; + color: var(--v-gray-400, #94A3B8); + display: flex; align-items: center; gap: 8px; + transition: color var(--v-ease); +} +.v-partner-item:hover { color: var(--v-navy-700); } + +/* ── 섹션 배경 종류 ── */ +.bg-white { background: #fff; } +.bg-light { background: var(--v-gray-50, #F8FAFC); } +.bg-navy { background: var(--v-navy-800, #002752); } +.bg-navy-dark { background: var(--v-navy-900, #001a33); } + +/* ── 섹션 패딩 ── */ +.py-section { padding: var(--v-section-py, 96px) 0; } +.py-section-sm { padding: var(--v-section-py-sm, 64px) 0; } + +@media (max-width: 768px) { + .v-cta-banner { flex-direction: column; padding: 32px 24px; } + .v-stat-number { font-size: 28px; } + .v-section-py { padding: 60px 0; } +} diff --git a/workspace/zioinfo-web/frontend/src/styles/tokens.css b/workspace/zioinfo-web/frontend/src/styles/tokens.css new file mode 100644 index 00000000..033b6ad7 --- /dev/null +++ b/workspace/zioinfo-web/frontend/src/styles/tokens.css @@ -0,0 +1,50 @@ +/* ── zio Variant 디자인 토큰 ── */ +@import url('https://cdn.jsdelivr.net/gh/orioncactus/pretendard/dist/web/static/pretendard.css'); + +:root { + /* Variant 색상 팔레트 */ + --v-navy-900: #001a33; + --v-navy-800: #002752; + --v-navy-700: #003366; + --v-navy-600: #004080; + --v-navy-500: #005A8C; + --v-cyan-500: #00A0C8; + --v-cyan-400: #29B8D8; + --v-cyan-100: #E8F7FB; + --v-blue-100: #E8F0F8; + --v-blue-200: #C5D8EF; + + /* 뉴트럴 */ + --v-gray-50: #F8FAFC; + --v-gray-100: #F1F5F9; + --v-gray-200: #E2E8F0; + --v-gray-400: #94A3B8; + --v-gray-600: #475569; + --v-gray-800: #1E293B; + --v-gray-900: #0F172A; + + /* 섹션 라벨 */ + --v-label-color: var(--v-cyan-500); + --v-label-size: 12px; + --v-label-weight: 700; + --v-label-spacing: 0.1em; + + /* 간격 */ + --v-section-py: 96px; + --v-section-py-sm: 64px; + + /* 반경 */ + --v-radius-sm: 8px; + --v-radius-md: 12px; + --v-radius-lg: 16px; + --v-radius-xl: 24px; + --v-radius-full: 9999px; + + /* 그림자 */ + --v-shadow-sm: 0 1px 3px rgba(0,51,102,.08), 0 1px 2px rgba(0,51,102,.06); + --v-shadow-md: 0 4px 12px rgba(0,51,102,.10), 0 2px 6px rgba(0,51,102,.06); + --v-shadow-lg: 0 10px 30px rgba(0,51,102,.12), 0 4px 10px rgba(0,51,102,.06); + + /* 전환 */ + --v-ease: 240ms cubic-bezier(.4,0,.2,1); +}