feat: 初始化硅基伙伴企业官网项目

添加项目基础结构和核心页面组件,包括:
- 首页布局与导航栏
- 产品服务展示区
- 客户案例模块
- 关于我们介绍
- 联系咨询表单
- 页脚信息

集成Vue 3 + Vite技术栈,配置TypeScript支持,添加基础样式和响应式设计
This commit is contained in:
2026-03-19 17:36:43 +08:00
commit c3341b57be
24 changed files with 5449 additions and 0 deletions

39
.gitignore vendored Normal file
View File

@@ -0,0 +1,39 @@
# Logs
logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
node_modules
.DS_Store
dist
dist-ssr
coverage
*.local
# Editor directories and files
.vscode/*
!.vscode/extensions.json
.idea
*.suo
*.ntvs*
*.njsproj
*.sln
*.sw?
*.tsbuildinfo
.eslintcache
# Cypress
/cypress/videos/
/cypress/screenshots/
# Vitest
__screenshots__/
# Vite
*.timestamp-*-*.mjs

3
.vscode/extensions.json vendored Normal file
View File

@@ -0,0 +1,3 @@
{
"recommendations": ["Vue.volar"]
}

42
README.md Normal file
View File

@@ -0,0 +1,42 @@
# silicon-partner
This template should help get you started developing with Vue 3 in Vite.
## Recommended IDE Setup
[VS Code](https://code.visualstudio.com/) + [Vue (Official)](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur).
## Recommended Browser Setup
- Chromium-based browsers (Chrome, Edge, Brave, etc.):
- [Vue.js devtools](https://chromewebstore.google.com/detail/vuejs-devtools/nhdogjmejiglipccpnnnanhbledajbpd)
- [Turn on Custom Object Formatter in Chrome DevTools](http://bit.ly/object-formatters)
- Firefox:
- [Vue.js devtools](https://addons.mozilla.org/en-US/firefox/addon/vue-js-devtools/)
- [Turn on Custom Object Formatter in Firefox DevTools](https://fxdx.dev/firefox-devtools-custom-object-formatters/)
## Type Support for `.vue` Imports in TS
TypeScript cannot handle type information for `.vue` imports by default, so we replace the `tsc` CLI with `vue-tsc` for type checking. In editors, we need [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) to make the TypeScript language service aware of `.vue` types.
## Customize configuration
See [Vite Configuration Reference](https://vite.dev/config/).
## Project Setup
```sh
npm install
```
### Compile and Hot-Reload for Development
```sh
npm run dev
```
### Type-Check, Compile and Minify for Production
```sh
npm run build
```

1
env.d.ts vendored Normal file
View File

@@ -0,0 +1 @@
/// <reference types="vite/client" />

13
index.html Normal file
View File

@@ -0,0 +1,13 @@
<!DOCTYPE html>
<html lang="">
<head>
<meta charset="UTF-8">
<link rel="icon" href="/favicon.ico">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Vite App</title>
</head>
<body>
<div id="app"></div>
<script type="module" src="/src/main.ts"></script>
</body>
</html>

2847
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

30
package.json Normal file
View File

@@ -0,0 +1,30 @@
{
"name": "silicon-partner",
"version": "0.0.0",
"private": true,
"type": "module",
"scripts": {
"dev": "vite",
"build": "run-p type-check \"build-only {@}\" --",
"preview": "vite preview",
"build-only": "vite build",
"type-check": "vue-tsc --build"
},
"dependencies": {
"vue": "^3.5.29"
},
"devDependencies": {
"@tsconfig/node24": "^24.0.4",
"@types/node": "^24.11.0",
"@vitejs/plugin-vue": "^6.0.4",
"@vue/tsconfig": "^0.8.1",
"npm-run-all2": "^8.0.4",
"typescript": "~5.9.3",
"vite": "^7.3.1",
"vite-plugin-vue-devtools": "^8.0.6",
"vue-tsc": "^3.2.5"
},
"engines": {
"node": "^20.19.0 || >=22.12.0"
}
}

BIN
public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

35
src/App.vue Normal file
View File

@@ -0,0 +1,35 @@
<template>
<div id="app">
<NavBar />
<main>
<HeroSection />
<ServicesSection />
<FeaturesSection />
<StatsSection />
<CasesSection />
<AboutSection />
<CTASection />
</main>
<FooterSection />
</div>
</template>
<script setup lang="ts">
import NavBar from './components/NavBar.vue'
import HeroSection from './components/HeroSection.vue'
import ServicesSection from './components/ServicesSection.vue'
import FeaturesSection from './components/FeaturesSection.vue'
import StatsSection from './components/StatsSection.vue'
import CasesSection from './components/CasesSection.vue'
import AboutSection from './components/AboutSection.vue'
import CTASection from './components/CTASection.vue'
import FooterSection from './components/FooterSection.vue'
</script>
<style>
@import './assets/main.css';
#app {
min-height: 100vh;
}
</style>

137
src/assets/main.css Normal file
View File

@@ -0,0 +1,137 @@
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&display=swap');
*, *::before, *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
:root {
--green: #10b981;
--green-light: #34d399;
--green-dark: #059669;
--green-50: #ecfdf5;
--green-100: #d1fae5;
--green-200: #a7f3d0;
--gray-50: #f9fafb;
--gray-100: #f3f4f6;
--gray-200: #e5e7eb;
--gray-300: #d1d5db;
--gray-400: #9ca3af;
--gray-500: #6b7280;
--gray-600: #4b5563;
--gray-700: #374151;
--gray-800: #1f2937;
--gray-900: #111827;
--white: #ffffff;
--shadow-sm: 0 1px 3px rgba(0,0,0,.06), 0 1px 2px rgba(0,0,0,.04);
--shadow: 0 4px 16px rgba(0,0,0,.06), 0 1px 4px rgba(0,0,0,.04);
--shadow-md: 0 8px 32px rgba(0,0,0,.08), 0 2px 8px rgba(0,0,0,.04);
--shadow-lg: 0 16px 48px rgba(0,0,0,.10), 0 4px 16px rgba(0,0,0,.05);
--radius: 16px;
--radius-sm: 10px;
--radius-lg: 24px;
--radius-xl: 32px;
}
html {
scroll-behavior: smooth;
}
body {
font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
background: var(--white);
color: var(--gray-900);
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
overflow-x: hidden;
}
.container {
max-width: 1440px;
margin: 0 auto;
padding: 0 80px;
}
@media (max-width: 1200px) {
.container { padding: 0 48px; }
}
@media (max-width: 768px) {
.container { padding: 0 24px; }
}
.btn-primary {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 14px 28px;
background: var(--green);
color: white;
border: none;
border-radius: 50px;
font-size: 15px;
font-weight: 600;
cursor: pointer;
transition: all .2s ease;
text-decoration: none;
letter-spacing: -.01em;
}
.btn-primary:hover {
background: var(--green-dark);
transform: translateY(-1px);
box-shadow: 0 8px 24px rgba(16,185,129,.3);
}
.btn-secondary {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 14px 28px;
background: transparent;
color: var(--gray-700);
border: 1.5px solid var(--gray-200);
border-radius: 50px;
font-size: 15px;
font-weight: 600;
cursor: pointer;
transition: all .2s ease;
text-decoration: none;
letter-spacing: -.01em;
}
.btn-secondary:hover {
border-color: var(--green);
color: var(--green);
background: var(--green-50);
}
.tag {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 6px 14px;
background: var(--green-50);
color: var(--green-dark);
border-radius: 50px;
font-size: 13px;
font-weight: 600;
letter-spacing: .02em;
text-transform: uppercase;
}
.section-title {
font-size: clamp(32px, 4vw, 52px);
font-weight: 800;
color: var(--gray-900);
letter-spacing: -.03em;
line-height: 1.1;
}
.section-sub {
font-size: 18px;
color: var(--gray-500);
line-height: 1.7;
font-weight: 400;
max-width: 560px;
}
.green { color: var(--green); }

View File

@@ -0,0 +1,138 @@
<template>
<section id="about" class="about">
<div class="container">
<div class="about-layout">
<div class="about-text">
<div class="tag">关于我们</div>
<h2 class="section-title" style="margin-top:16px">
专注 AI 落地<br>深耕企业场景
</h2>
<p class="section-sub" style="margin-top:16px">
北京硅基伙伴科技有限公司成立于 2022
总部位于北京我们由一批来自顶级互联网公司和 AI 研究院的技术专家创立
专注于企业 AI 数字化转型技术服务致力于让先进的 AI 能力真正在企业中落地生根
</p>
<p class="section-sub" style="margin-top:12px; font-size: 15px;">
我们相信AI 不应该只是大企业的特权
通过我们的产品和服务让每一家企业都能享受到 AI 带来的生产力革命
</p>
<div class="team-tags">
<span v-for="t in teamTags" :key="t">{{ t }}</span>
</div>
</div>
<div class="about-cards">
<div class="about-card" v-for="c in aboutCards" :key="c.title">
<div class="about-card-icon" v-html="c.icon"></div>
<h3>{{ c.title }}</h3>
<p>{{ c.desc }}</p>
</div>
</div>
</div>
</div>
</section>
</template>
<script setup lang="ts">
const teamTags = [
'前阿里巴巴', '前腾讯', '前百度 AI', '清华大学 CS',
'北京大学', '斯坦福大学', 'IEEE Fellow'
]
const aboutCards = [
{
title: '使命',
desc: '让 AI 成为每家企业的核心竞争力,推动中国企业数字化转型进入智能时代。',
icon: `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#10b981" stroke-width="1.8"><circle cx="12" cy="12" r="10"/><path d="M12 8v4l3 3"/></svg>`,
},
{
title: '愿景',
desc: '成为中国企业 AI 数字化转型领域最受信赖的技术伙伴,服务超过 10,000 家企业。',
icon: `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#10b981" stroke-width="1.8"><path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z"/><circle cx="12" cy="12" r="3"/></svg>`,
},
{
title: '价值观',
desc: '客户成功优先、技术诚实透明、持续创新迭代、共赢长期主义。',
icon: `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#10b981" stroke-width="1.8"><path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z"/></svg>`,
},
]
</script>
<style scoped>
.about {
padding: 120px 0;
background: var(--white);
}
.about-layout {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 80px;
align-items: center;
}
.team-tags {
display: flex;
flex-wrap: wrap;
gap: 8px;
margin-top: 32px;
}
.team-tags span {
padding: 6px 14px;
background: var(--gray-100);
border-radius: 50px;
font-size: 13px;
font-weight: 600;
color: var(--gray-600);
}
.about-cards {
display: flex;
flex-direction: column;
gap: 16px;
}
.about-card {
display: flex;
gap: 20px;
align-items: flex-start;
background: var(--gray-50);
border-radius: var(--radius-lg);
padding: 28px;
border: 1.5px solid var(--gray-100);
transition: all .2s;
}
.about-card:hover {
border-color: var(--green-200);
background: var(--green-50);
box-shadow: var(--shadow);
}
.about-card-icon {
width: 48px;
height: 48px;
background: white;
border-radius: 14px;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
box-shadow: var(--shadow-sm);
border: 1px solid var(--gray-100);
}
.about-card h3 {
font-size: 16px;
font-weight: 800;
color: var(--gray-900);
letter-spacing: -.02em;
margin-bottom: 8px;
}
.about-card p {
font-size: 14px;
color: var(--gray-500);
line-height: 1.65;
}
@media (max-width: 1024px) {
.about-layout { grid-template-columns: 1fr; }
}
@media (max-width: 640px) {
.about { padding: 80px 0; }
}
</style>

View File

@@ -0,0 +1,326 @@
<template>
<section id="contact" class="cta-section">
<div class="container">
<div class="cta-grid">
<!-- Left: Contact form -->
<div class="cta-form-wrap">
<div class="tag">联系我们</div>
<h2 class="section-title" style="margin-top:16px; font-size: clamp(28px,3vw,42px)">
开启您的<br> AI 转型之旅
</h2>
<p class="section-sub" style="margin-top:12px; font-size: 15px;">
填写信息我们的解决方案顾问将在 1 个工作日内与您联系为您提供专属方案
</p>
<form class="contact-form" @submit.prevent="submitForm">
<div class="form-row">
<div class="form-group">
<label>您的姓名 *</label>
<input v-model="form.name" type="text" placeholder="请输入姓名" required />
</div>
<div class="form-group">
<label>联系电话 *</label>
<input v-model="form.phone" type="tel" placeholder="请输入手机号" required />
</div>
</div>
<div class="form-group">
<label>公司名称</label>
<input v-model="form.company" type="text" placeholder="请输入公司名称" />
</div>
<div class="form-group">
<label>感兴趣的产品</label>
<div class="checkbox-group">
<label class="checkbox-item" v-for="p in products" :key="p">
<input type="checkbox" :value="p" v-model="form.products" />
<span>{{ p }}</span>
</label>
</div>
</div>
<div class="form-group">
<label>您的需求描述</label>
<textarea v-model="form.message" placeholder="简单描述您的业务场景和需求..." rows="4"></textarea>
</div>
<button type="submit" class="btn-primary submit-btn" :class="{ loading: submitting }">
<span v-if="!submitted">
立即提交免费咨询
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M5 12h14M12 5l7 7-7 7"/></svg>
</span>
<span v-else class="success-msg">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M20 6L9 17l-5-5"/></svg>
提交成功我们将尽快联系您
</span>
</button>
</form>
</div>
<!-- Right: Info -->
<div class="cta-info">
<div class="info-card">
<h3>快速响应承诺</h3>
<div class="promise-list">
<div class="promise" v-for="p in promises" :key="p.text">
<div class="promise-icon">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="#10b981" stroke-width="2.5"><path d="M20 6L9 17l-5-5"/></svg>
</div>
<div>
<div class="promise-title">{{ p.title }}</div>
<div class="promise-text">{{ p.text }}</div>
</div>
</div>
</div>
</div>
<div class="contact-channels">
<h3>其他联系方式</h3>
<div class="channel" v-for="c in channels" :key="c.label">
<div class="channel-icon" v-html="c.icon"></div>
<div>
<div class="channel-label">{{ c.label }}</div>
<div class="channel-val">{{ c.val }}</div>
</div>
</div>
</div>
<div class="trust-logos">
<div class="trust-label">合作伙伴</div>
<div class="logos-row">
<div class="logo-pill" v-for="l in logos" :key="l">{{ l }}</div>
</div>
</div>
</div>
</div>
</div>
</section>
</template>
<script setup lang="ts">
import { ref, reactive } from 'vue'
const submitting = ref(false)
const submitted = ref(false)
const form = reactive({
name: '',
phone: '',
company: '',
products: [] as string[],
message: '',
})
const products = ['企业知识库', '数据整合', '智能报表', 'AI 财务', 'AI 客服', '定制 MCP']
async function submitForm() {
submitting.value = true
await new Promise(r => setTimeout(r, 1000))
submitting.value = false
submitted.value = true
}
const promises = [
{ title: '1 个工作日内响应', text: '专属顾问主动联系,了解您的需求' },
{ title: '免费需求诊断', text: '提供初步的 AI 数字化转型建议方案' },
{ title: '定制演示方案', text: '针对您的场景准备专属 Demo 演示' },
{ title: '无压力咨询', text: '充分了解后再决定,绝不强行推销' },
]
const channels = [
{
label: '商务合作',
val: 'business@siliconpartner.cn',
icon: `<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="#10b981" stroke-width="2"><path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z"/><polyline points="22,6 12,13 2,6"/></svg>`,
},
{
label: '服务热线',
val: '400-888-0000',
icon: `<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="#10b981" stroke-width="2"><path d="M22 16.92v3a2 2 0 0 1-2.18 2 19.79 19.79 0 0 1-8.63-3.07A19.5 19.5 0 0 1 4.69 12 19.79 19.79 0 0 1 1.61 3.41 2 2 0 0 1 3.6 1.24h3a2 2 0 0 1 2 1.72 12.84 12.84 0 0 0 .7 2.81 2 2 0 0 1-.45 2.11L7.91 9a16 16 0 0 0 6 6l1.27-.9a2 2 0 0 1 2.11-.45 12.84 12.84 0 0 0 2.81.7A2 2 0 0 1 22 16.92z"/></svg>`,
},
]
const logos = ['阿里云', '腾讯云', '华为云', 'OpenAI', 'DeepSeek']
</script>
<style scoped>
.cta-section {
padding: 120px 0;
background: white;
}
.cta-grid {
display: grid;
grid-template-columns: 1fr 480px;
gap: 80px;
align-items: start;
}
.contact-form {
margin-top: 36px;
display: flex;
flex-direction: column;
gap: 20px;
}
.form-row {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 16px;
}
.form-group {
display: flex;
flex-direction: column;
gap: 8px;
}
.form-group label {
font-size: 13px;
font-weight: 600;
color: var(--gray-700);
}
.form-group input,
.form-group textarea {
padding: 12px 16px;
border: 1.5px solid var(--gray-200);
border-radius: var(--radius-sm);
font-size: 14px;
color: var(--gray-800);
font-family: inherit;
transition: all .15s;
outline: none;
background: var(--gray-50);
}
.form-group input:focus,
.form-group textarea:focus {
border-color: var(--green);
background: white;
box-shadow: 0 0 0 3px rgba(16,185,129,.1);
}
.form-group input::placeholder,
.form-group textarea::placeholder {
color: var(--gray-400);
}
textarea { resize: vertical; min-height: 100px; }
.checkbox-group {
display: flex;
flex-wrap: wrap;
gap: 8px;
}
.checkbox-item {
display: flex;
align-items: center;
gap: 6px;
padding: 7px 12px;
border: 1.5px solid var(--gray-200);
border-radius: 8px;
cursor: pointer;
font-size: 13px;
color: var(--gray-600);
font-weight: 500;
transition: all .15s;
}
.checkbox-item:has(input:checked) {
border-color: var(--green);
background: var(--green-50);
color: var(--green-dark);
}
.checkbox-item input { display: none; }
.submit-btn {
width: 100%;
justify-content: center;
padding: 16px !important;
font-size: 15px !important;
}
.submit-btn.loading { opacity: .7; cursor: not-allowed; }
.success-msg {
display: flex;
align-items: center;
gap: 8px;
}
/* Info side */
.info-card {
background: var(--gray-50);
border-radius: var(--radius-lg);
padding: 32px;
margin-bottom: 24px;
border: 1px solid var(--gray-100);
}
.info-card h3, .contact-channels h3 {
font-size: 16px;
font-weight: 800;
color: var(--gray-800);
letter-spacing: -.02em;
margin-bottom: 20px;
}
.promise-list {
display: flex;
flex-direction: column;
gap: 16px;
}
.promise {
display: flex;
gap: 12px;
align-items: flex-start;
}
.promise-icon {
width: 28px;
height: 28px;
background: var(--green-100);
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
margin-top: 2px;
}
.promise-title {
font-size: 14px;
font-weight: 700;
color: var(--gray-800);
margin-bottom: 2px;
}
.promise-text {
font-size: 12px;
color: var(--gray-500);
}
.contact-channels {
margin-bottom: 24px;
}
.channel {
display: flex;
align-items: center;
gap: 12px;
padding: 14px 0;
border-bottom: 1px solid var(--gray-100);
}
.channel:last-child { border-bottom: none; }
.channel-icon {
width: 40px;
height: 40px;
background: var(--green-50);
border-radius: 10px;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.channel-label { font-size: 12px; color: var(--gray-400); font-weight: 500; }
.channel-val { font-size: 14px; font-weight: 700; color: var(--gray-800); margin-top: 2px; }
.trust-logos { margin-top: 8px; }
.trust-label { font-size: 12px; color: var(--gray-400); font-weight: 600; text-transform: uppercase; letter-spacing: .05em; margin-bottom: 12px; }
.logos-row { display: flex; flex-wrap: wrap; gap: 8px; }
.logo-pill {
padding: 6px 14px;
background: var(--gray-100);
border-radius: 50px;
font-size: 12px;
font-weight: 600;
color: var(--gray-500);
}
@media (max-width: 1100px) {
.cta-grid { grid-template-columns: 1fr; }
}
@media (max-width: 600px) {
.cta-section { padding: 80px 0; }
.form-row { grid-template-columns: 1fr; }
}
</style>

View File

@@ -0,0 +1,218 @@
<template>
<section id="cases" class="cases">
<div class="container">
<div class="section-head">
<div class="tag">客户案例</div>
<h2 class="section-title" style="margin-top:16px">
他们已经先行一步
</h2>
<p class="section-sub" style="margin-top:16px">
来自不同行业的企业都在硅基伙伴的助力下实现了 AI 数字化跨越
</p>
</div>
<div class="cases-grid">
<div class="case-card" v-for="c in cases" :key="c.company">
<div class="case-header">
<div class="case-logo">{{ c.logoText }}</div>
<div class="case-industry">{{ c.industry }}</div>
</div>
<blockquote class="case-quote">"{{ c.quote }}"</blockquote>
<div class="case-results">
<div class="result" v-for="r in c.results" :key="r.label">
<div class="result-val">{{ r.val }}</div>
<div class="result-label">{{ r.label }}</div>
</div>
</div>
<div class="case-person">
<div class="person-avatar">{{ c.name[0] }}</div>
<div>
<div class="person-name">{{ c.name }}</div>
<div class="person-title">{{ c.title }}</div>
</div>
</div>
</div>
</div>
<!-- CTA strip -->
<div class="cases-cta">
<p>加入 200+ 企业开启 AI 驱动增长之旅</p>
<a href="#contact" class="btn-primary">预约一对一咨询</a>
</div>
</div>
</section>
</template>
<script setup lang="ts">
const cases = [
{
logoText: '某零售集团',
industry: '新零售',
quote: '接入硅基伙伴的多平台数据整合后,我们的运营效率提升了 8 倍,以前需要 3 个人做一整天的数据工作,现在 10 分钟自动完成。',
results: [
{ val: '8x', label: '运营效率提升' },
{ val: '60%', label: '人力成本节省' },
{ val: '实时', label: '数据同步' },
],
name: '张总监',
title: '运营总监',
},
{
logoText: '某电商品牌',
industry: '电子商务',
quote: 'AI 客服上线后,我们的售后响应时间从平均 4 小时降到了 30 秒,客户满意度提升了 40%,同时节省了大量客服人力。',
results: [
{ val: '30秒', label: '平均响应时间' },
{ val: '+40%', label: '客户满意度' },
{ val: '70%', label: '自动处理率' },
],
name: '李总',
title: 'CEO',
},
{
logoText: '某制造企业',
industry: '智能制造',
quote: '企业知识库让我们的新员工培训周期从 3 个月缩短到 3 周SOP 自动推送让合规操作率提升到 99.2%,大幅降低了生产风险。',
results: [
{ val: '3周', label: '培训周期缩短' },
{ val: '99.2%', label: '合规操作率' },
{ val: '-80%', label: '培训成本' },
],
name: '王经理',
title: '人力资源总监',
},
]
</script>
<style scoped>
.cases {
padding: 120px 0;
background: var(--gray-50);
}
.section-head {
margin-bottom: 64px;
}
.cases-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 24px;
margin-bottom: 60px;
}
.case-card {
background: white;
border-radius: var(--radius-lg);
padding: 36px;
border: 1.5px solid var(--gray-100);
display: flex;
flex-direction: column;
gap: 20px;
transition: all .25s;
}
.case-card:hover {
box-shadow: var(--shadow-md);
border-color: var(--green-200);
transform: translateY(-4px);
}
.case-header {
display: flex;
align-items: center;
justify-content: space-between;
}
.case-logo {
font-size: 16px;
font-weight: 800;
color: var(--gray-800);
letter-spacing: -.02em;
}
.case-industry {
font-size: 11px;
font-weight: 700;
color: var(--green-dark);
background: var(--green-50);
padding: 4px 10px;
border-radius: 50px;
letter-spacing: .02em;
}
.case-quote {
font-size: 14px;
color: var(--gray-600);
line-height: 1.75;
font-style: italic;
border-left: 3px solid var(--green);
padding-left: 16px;
margin: 0;
flex: 1;
}
.case-results {
display: flex;
gap: 20px;
border-top: 1px solid var(--gray-100);
border-bottom: 1px solid var(--gray-100);
padding: 16px 0;
}
.result-val {
font-size: 20px;
font-weight: 800;
color: var(--green-dark);
letter-spacing: -.03em;
}
.result-label {
font-size: 11px;
color: var(--gray-400);
margin-top: 2px;
font-weight: 500;
}
.case-person {
display: flex;
align-items: center;
gap: 12px;
}
.person-avatar {
width: 40px;
height: 40px;
background: linear-gradient(135deg, var(--green), var(--green-dark));
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
color: white;
font-weight: 700;
font-size: 16px;
flex-shrink: 0;
}
.person-name {
font-size: 14px;
font-weight: 700;
color: var(--gray-800);
}
.person-title {
font-size: 12px;
color: var(--gray-400);
margin-top: 2px;
}
.cases-cta {
background: linear-gradient(135deg, var(--green-50), white);
border: 1.5px solid var(--green-100);
border-radius: var(--radius-xl);
padding: 40px 48px;
display: flex;
align-items: center;
justify-content: space-between;
gap: 24px;
}
.cases-cta p {
font-size: 20px;
font-weight: 700;
color: var(--gray-800);
letter-spacing: -.02em;
}
@media (max-width: 1100px) {
.cases-grid { grid-template-columns: 1fr; }
}
@media (max-width: 640px) {
.cases { padding: 80px 0; }
.cases-cta { flex-direction: column; text-align: center; }
}
</style>

View File

@@ -0,0 +1,240 @@
<template>
<section id="features" class="features">
<div class="container">
<div class="features-layout">
<!-- Left text -->
<div class="features-text">
<div class="tag">核心优势</div>
<h2 class="section-title" style="margin-top:16px">
为什么选择<br>硅基伙伴
</h2>
<p class="section-sub" style="margin-top:16px">
深耕企业 AI 数字化场景以技术为引擎以数据为燃料
助力企业在智能时代保持竞争优势
</p>
<div class="feature-list">
<div class="feature-item" v-for="(f, i) in features" :key="i" :class="{ active: activeIdx === i }" @click="activeIdx = i">
<div class="feature-num">0{{ i + 1 }}</div>
<div class="feature-content">
<div class="feature-title">{{ f.title }}</div>
<div class="feature-desc">{{ f.desc }}</div>
</div>
<div class="feature-arrow">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M5 12h14M12 5l7 7-7 7"/></svg>
</div>
</div>
</div>
</div>
<!-- Right visual -->
<div class="features-visual">
<div class="visual-card" v-for="(f, i) in features" :key="i" :class="{ visible: activeIdx === i }">
<div class="visual-icon">
<span v-html="f.icon"></span>
</div>
<h3>{{ f.title }}</h3>
<p>{{ f.detail }}</p>
<div class="visual-metrics">
<div class="vm" v-for="m in f.metrics" :key="m.label">
<div class="vm-val">{{ m.val }}</div>
<div class="vm-label">{{ m.label }}</div>
</div>
</div>
</div>
</div>
</div>
</div>
</section>
</template>
<script setup lang="ts">
import { ref } from 'vue'
const activeIdx = ref(0)
const features = [
{
title: '极速部署,快速见效',
desc: '最快 7 天完成系统上线,轻量接入,无需改造现有业务流程。',
detail: '采用模块化架构,标准化 API 接口,可快速与企业现有系统集成。支持私有化部署和 SaaS 模式,灵活选择,保障数据安全与业务连续性。',
icon: `<svg width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="#10b981" stroke-width="1.8"><path d="M13 2L3 14h9l-1 8 10-12h-9l1-8z"/></svg>`,
metrics: [
{ val: '7天', label: '最快上线' },
{ val: '99.9%', label: 'SLA 保障' },
{ val: '0', label: '业务中断' },
],
},
{
title: '安全可靠,数据自主',
desc: '企业数据不出域,支持私有化部署,通过等保三级认证。',
detail: '全链路数据加密传输,支持本地私有化部署方案,确保企业核心数据资产完全自主可控。严格遵循数据安全合规要求,通过国家信息安全等级保护三级认证。',
icon: `<svg width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="#10b981" stroke-width="1.8"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/></svg>`,
metrics: [
{ val: '等保三级', label: '安全认证' },
{ val: '256bit', label: 'AES 加密' },
{ val: '100%', label: '数据自主' },
],
},
{
title: '持续学习,越用越准',
desc: '基于企业专属数据持续微调,模型与业务同步成长。',
detail: '通过 RLHF 强化学习机制,持续收集企业用户反馈,让 AI 模型不断适应企业专属业务场景,随时间推移准确率和效率持续提升。',
icon: `<svg width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="#10b981" stroke-width="1.8"><path d="M12 20h9"/><path d="M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4L16.5 3.5z"/></svg>`,
metrics: [
{ val: '98.7%', label: '问答准确率' },
{ val: '持续', label: '自主学习' },
{ val: '3个月', label: '显著提升周期' },
],
},
{
title: '专属服务,全程陪伴',
desc: '一对一客户成功经理,提供从实施到运营的全生命周期服务。',
detail: '配备专属解决方案架构师和客户成功经理,提供需求分析、方案设计、系统实施、员工培训、持续运营优化的全生命周期服务支持。',
icon: `<svg width="32" height="32" viewBox="0 0 24 24" fill="none" stroke="#10b981" stroke-width="1.8"><path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/><path d="M23 21v-2a4 4 0 0 0-3-3.87"/><path d="M16 3.13a4 4 0 0 1 0 7.75"/></svg>`,
metrics: [
{ val: '1v1', label: '专属服务' },
{ val: '7×24h', label: '技术支持' },
{ val: '98%', label: '客户续约率' },
],
},
]
</script>
<style scoped>
.features {
padding: 120px 0;
background: var(--gray-50);
}
.features-layout {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 80px;
align-items: start;
}
.feature-list {
margin-top: 40px;
display: flex;
flex-direction: column;
gap: 4px;
}
.feature-item {
display: flex;
align-items: center;
gap: 16px;
padding: 20px 20px;
border-radius: var(--radius);
cursor: pointer;
transition: all .2s ease;
border: 1.5px solid transparent;
}
.feature-item:hover {
background: white;
border-color: var(--gray-200);
}
.feature-item.active {
background: white;
border-color: var(--green-200);
box-shadow: var(--shadow);
}
.feature-num {
font-size: 13px;
font-weight: 800;
color: var(--gray-300);
letter-spacing: .05em;
width: 28px;
flex-shrink: 0;
transition: color .2s;
}
.feature-item.active .feature-num { color: var(--green); }
.feature-content { flex: 1; }
.feature-title {
font-size: 15px;
font-weight: 700;
color: var(--gray-700);
margin-bottom: 4px;
transition: color .2s;
}
.feature-item.active .feature-title { color: var(--gray-900); }
.feature-desc {
font-size: 13px;
color: var(--gray-400);
line-height: 1.5;
}
.feature-arrow {
color: var(--gray-300);
transition: all .2s;
}
.feature-item.active .feature-arrow { color: var(--green); transform: translateX(3px); }
/* Visual panel */
.features-visual {
position: sticky;
top: 100px;
}
.visual-card {
background: white;
border-radius: var(--radius-xl);
padding: 48px;
box-shadow: var(--shadow-lg);
border: 1px solid var(--gray-100);
display: none;
}
.visual-card.visible { display: block; animation: fadeSlide .3s ease; }
@keyframes fadeSlide {
from { opacity: 0; transform: translateY(12px); }
to { opacity: 1; transform: translateY(0); }
}
.visual-icon {
width: 72px;
height: 72px;
background: linear-gradient(135deg, var(--green-50), var(--green-100));
border-radius: 20px;
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 28px;
}
.visual-card h3 {
font-size: 24px;
font-weight: 800;
color: var(--gray-900);
letter-spacing: -.03em;
margin-bottom: 16px;
}
.visual-card p {
font-size: 15px;
color: var(--gray-500);
line-height: 1.75;
margin-bottom: 36px;
}
.visual-metrics {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 16px;
border-top: 1px solid var(--gray-100);
padding-top: 28px;
}
.vm-val {
font-size: 22px;
font-weight: 800;
color: var(--green-dark);
letter-spacing: -.03em;
margin-bottom: 4px;
}
.vm-label {
font-size: 12px;
color: var(--gray-400);
font-weight: 500;
}
@media (max-width: 1024px) {
.features-layout { grid-template-columns: 1fr; }
.features-visual { position: static; }
}
@media (max-width: 640px) {
.features { padding: 80px 0; }
.visual-card { padding: 32px 24px; }
.visual-metrics { grid-template-columns: 1fr; }
}
</style>

View File

@@ -0,0 +1,217 @@
<template>
<footer class="footer">
<div class="container">
<div class="footer-grid">
<!-- Brand -->
<div class="footer-brand">
<div class="logo">
<div class="logo-icon">
<svg width="18" height="18" viewBox="0 0 24 24" fill="none">
<path d="M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</div>
<div>
<div class="logo-cn">硅基伙伴</div>
<div class="logo-en">Silicon Partner Technology</div>
</div>
</div>
<p class="brand-desc">
北京硅基伙伴科技有限公司<br>
致力于成为企业最信赖的 AI 数字化转型伙伴
</p>
<div class="socials">
<a href="#" class="social" aria-label="微信">
<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="M8.5 12.5a1 1 0 1 0 2 0 1 1 0 0 0-2 0zm5 0a1 1 0 1 0 2 0 1 1 0 0 0-2 0zM12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8z"/></svg>
</a>
<a href="#" class="social" aria-label="微博">
<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-1 14H9V8h2v8zm4 0h-2V8h2v8z"/></svg>
</a>
<a href="#" class="social" aria-label="LinkedIn">
<svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><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.433a2.062 2.062 0 0 1-2.063-2.065 2.064 2.064 0 1 1 2.063 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>
</div>
</div>
<!-- Links -->
<div class="footer-links" v-for="col in linkCols" :key="col.title">
<h4>{{ col.title }}</h4>
<ul>
<li v-for="l in col.links" :key="l.text">
<a :href="l.href">{{ l.text }}</a>
</li>
</ul>
</div>
</div>
<div class="footer-bottom">
<div class="footer-bottom-left">
<span>© 2024 北京硅基伙伴科技有限公司. 保留所有权利.</span>
<span>京ICP备XXXXXXXX号</span>
</div>
<div class="footer-bottom-right">
<a href="#">隐私政策</a>
<a href="#">服务协议</a>
<a href="#">Cookie 设置</a>
</div>
</div>
</div>
</footer>
</template>
<script setup lang="ts">
const linkCols = [
{
title: '产品',
links: [
{ text: '企业知识库', href: '#' },
{ text: '多平台数据整合', href: '#' },
{ text: '智能报表分析', href: '#' },
{ text: 'AI 智能财务', href: '#' },
{ text: 'AI 智能客服', href: '#' },
{ text: '定制企业 MCP', href: '#' },
],
},
{
title: '解决方案',
links: [
{ text: '新零售行业', href: '#' },
{ text: '电子商务', href: '#' },
{ text: '智能制造', href: '#' },
{ text: '金融服务', href: '#' },
{ text: '人力资源', href: '#' },
],
},
{
title: '公司',
links: [
{ text: '关于我们', href: '#about' },
{ text: '客户案例', href: '#cases' },
{ text: '加入我们', href: '#' },
{ text: '新闻动态', href: '#' },
{ text: '联系我们', href: '#contact' },
],
},
]
</script>
<style scoped>
.footer {
background: var(--gray-900);
color: white;
padding: 80px 0 0;
}
.footer-grid {
display: grid;
grid-template-columns: 2fr 1fr 1fr 1fr;
gap: 48px;
padding-bottom: 60px;
border-bottom: 1px solid rgba(255,255,255,.08);
}
.logo {
display: flex;
align-items: center;
gap: 10px;
margin-bottom: 20px;
}
.logo-icon {
width: 38px;
height: 38px;
background: linear-gradient(135deg, var(--green), var(--green-dark));
border-radius: 10px;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.logo-cn {
font-size: 16px;
font-weight: 800;
letter-spacing: -.02em;
}
.logo-en {
font-size: 10px;
color: rgba(255,255,255,.4);
letter-spacing: .04em;
margin-top: 2px;
}
.brand-desc {
font-size: 14px;
color: rgba(255,255,255,.45);
line-height: 1.75;
margin-bottom: 24px;
}
.socials {
display: flex;
gap: 10px;
}
.social {
width: 36px;
height: 36px;
background: rgba(255,255,255,.08);
border-radius: 10px;
display: flex;
align-items: center;
justify-content: center;
color: rgba(255,255,255,.5);
transition: all .2s;
}
.social:hover {
background: var(--green);
color: white;
}
.footer-links h4 {
font-size: 13px;
font-weight: 700;
color: rgba(255,255,255,.6);
text-transform: uppercase;
letter-spacing: .08em;
margin-bottom: 20px;
}
.footer-links ul {
list-style: none;
display: flex;
flex-direction: column;
gap: 12px;
}
.footer-links a {
text-decoration: none;
font-size: 14px;
color: rgba(255,255,255,.5);
transition: color .15s;
}
.footer-links a:hover { color: white; }
.footer-bottom {
display: flex;
align-items: center;
justify-content: space-between;
padding: 24px 0;
gap: 20px;
flex-wrap: wrap;
}
.footer-bottom-left {
display: flex;
gap: 24px;
font-size: 12px;
color: rgba(255,255,255,.3);
}
.footer-bottom-right {
display: flex;
gap: 20px;
}
.footer-bottom-right a {
font-size: 12px;
color: rgba(255,255,255,.3);
text-decoration: none;
transition: color .15s;
}
.footer-bottom-right a:hover { color: rgba(255,255,255,.7); }
@media (max-width: 1100px) {
.footer-grid { grid-template-columns: 1fr 1fr; }
.footer-brand { grid-column: 1 / -1; }
}
@media (max-width: 640px) {
.footer-grid { grid-template-columns: 1fr; }
.footer-bottom { flex-direction: column; align-items: flex-start; }
}
</style>

View File

@@ -0,0 +1,558 @@
<template>
<section class="hero">
<!-- Background decoration -->
<div class="hero-bg">
<div class="bg-orb bg-orb-1"></div>
<div class="bg-orb bg-orb-2"></div>
<div class="bg-orb bg-orb-3"></div>
<div class="grid-lines"></div>
</div>
<div class="container">
<div class="hero-content">
<div class="hero-badge">
<span class="badge-dot"></span>
企业 AI 数字化转型专家
</div>
<h1 class="hero-title">
<span class="highlight">AI</span> 成为<br>
企业最强生产力
</h1>
<p class="hero-desc">
北京硅基伙伴科技专注企业 AI 数字化转型技术服务<br>
从知识库到智能客服从数据整合到财务自动化<br>
我们是您最信赖的数字化伙伴
</p>
<div class="hero-actions">
<a href="#demo" class="btn-primary btn-lg">
免费预约演示
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M5 12h14M12 5l7 7-7 7"/></svg>
</a>
<a href="#services" class="btn-secondary btn-lg">
查看解决方案
</a>
</div>
<div class="hero-stats">
<div class="stat" v-for="s in stats" :key="s.label">
<div class="stat-value">{{ s.value }}</div>
<div class="stat-label">{{ s.label }}</div>
</div>
</div>
</div>
<!-- Hero visual -->
<div class="hero-visual">
<div class="dashboard-card">
<div class="card-header">
<div class="card-dots">
<span></span><span></span><span></span>
</div>
<span class="card-title">AI 智能驾驶舱</span>
<div class="card-status">
<span class="status-dot"></span> 实时运行中
</div>
</div>
<div class="card-body">
<!-- Mini chart -->
<div class="chart-area">
<div class="chart-bars">
<div class="bar" v-for="(h, i) in bars" :key="i" :style="{ height: h + '%' }">
<div class="bar-glow"></div>
</div>
</div>
<div class="chart-labels">
<span v-for="l in ['1月','2月','3月','4月','5月','6月']" :key="l">{{ l }}</span>
</div>
</div>
<!-- Metrics row -->
<div class="metrics-row">
<div class="metric" v-for="m in metrics" :key="m.label">
<div class="metric-val">{{ m.val }}</div>
<div class="metric-lbl">{{ m.label }}</div>
<div class="metric-chg" :class="m.up ? 'up' : 'down'">
{{ m.up ? '↑' : '↓' }} {{ m.chg }}
</div>
</div>
</div>
<!-- AI insight -->
<div class="ai-insight">
<div class="ai-icon">
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="2"><path d="M12 2a10 10 0 1 1 0 20A10 10 0 0 1 12 2z"/><path d="M12 8v4l3 3"/></svg>
</div>
<div class="ai-text">
<div class="ai-label">AI 智能洞察</div>
<div class="ai-msg">本月销售额较上月提升 <strong>23.6%</strong>建议重点关注华南区域增长机会</div>
</div>
</div>
</div>
</div>
<!-- Floating cards -->
<div class="float-card float-1">
<div class="float-icon">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="#10b981" stroke-width="2"><path d="M9 12l2 2 4-4m6 2a9 9 0 1 1-18 0 9 9 0 0 1 18 0z"/></svg>
</div>
<div>
<div class="float-title">知识库问答</div>
<div class="float-sub">响应准确率 98.7%</div>
</div>
</div>
<div class="float-card float-2">
<div class="float-icon">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="#10b981" stroke-width="2"><path d="M13 2L3 14h9l-1 8 10-12h-9l1-8z"/></svg>
</div>
<div>
<div class="float-title">自动化处理</div>
<div class="float-sub">效率提升 10x</div>
</div>
</div>
</div>
</div>
<!-- Scroll indicator -->
<div class="scroll-hint">
<div class="scroll-wheel"></div>
<span>向下探索</span>
</div>
</section>
</template>
<script setup lang="ts">
const stats = [
{ value: '200+', label: '服务企业' },
{ value: '98%', label: '客户满意度' },
{ value: '10x', label: '效率提升' },
{ value: '7×24h', label: '稳定运行' },
]
const bars = [45, 62, 55, 78, 68, 92]
const metrics = [
{ val: '¥2.4M', label: '本月营收', chg: '23.6%', up: true },
{ val: '1,284', label: '处理工单', chg: '12.1%', up: true },
{ val: '98.7%', label: '自动化率', chg: '2.3%', up: true },
]
</script>
<style scoped>
.hero {
min-height: 100vh;
display: flex;
flex-direction: column;
justify-content: center;
padding: 120px 0 80px;
position: relative;
overflow: hidden;
background: linear-gradient(160deg, #f0fdf8 0%, #ffffff 45%, #f5f3ff 100%);
}
.hero-bg {
position: absolute;
inset: 0;
pointer-events: none;
}
.bg-orb {
position: absolute;
border-radius: 50%;
filter: blur(72px);
}
.bg-orb-1 {
width: 700px;
height: 700px;
background: radial-gradient(circle, #6ee7b7 0%, #34d399 40%, transparent 70%);
top: -160px;
right: -160px;
opacity: .28;
}
.bg-orb-2 {
width: 500px;
height: 500px;
background: radial-gradient(circle, #a78bfa 0%, #818cf8 50%, transparent 70%);
bottom: -80px;
left: -120px;
opacity: .18;
}
.bg-orb-3 {
width: 360px;
height: 360px;
background: radial-gradient(circle, #fde68a 0%, #fbbf24 50%, transparent 70%);
top: 30%;
left: 38%;
opacity: .10;
}
.grid-lines {
position: absolute;
inset: 0;
background-image:
linear-gradient(rgba(16,185,129,.07) 1px, transparent 1px),
linear-gradient(90deg, rgba(16,185,129,.07) 1px, transparent 1px);
background-size: 56px 56px;
mask-image: radial-gradient(ellipse 80% 80% at 50% 50%, black 40%, transparent 100%);
}
.container {
display: grid;
grid-template-columns: 1fr 1fr;
align-items: center;
gap: 80px;
position: relative;
}
.hero-badge {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 8px 16px;
background: var(--green-50);
border: 1px solid var(--green-200);
border-radius: 50px;
font-size: 13px;
font-weight: 600;
color: var(--green-dark);
letter-spacing: .02em;
margin-bottom: 28px;
}
.badge-dot {
width: 7px;
height: 7px;
border-radius: 50%;
background: var(--green);
animation: pulse 2s infinite;
}
@keyframes pulse {
0%, 100% { opacity: 1; transform: scale(1); }
50% { opacity: .6; transform: scale(1.3); }
}
.hero-title {
font-size: clamp(42px, 5.5vw, 72px);
font-weight: 900;
letter-spacing: -.04em;
line-height: 1.08;
color: var(--gray-900);
margin-bottom: 24px;
}
.highlight {
background: linear-gradient(135deg, #10b981 0%, #059669 50%, #0891b2 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
position: relative;
}
.hero-desc {
font-size: 17px;
line-height: 1.75;
color: var(--gray-500);
margin-bottom: 40px;
font-weight: 400;
}
.hero-actions {
display: flex;
gap: 12px;
flex-wrap: wrap;
margin-bottom: 56px;
}
.btn-lg {
padding: 16px 32px !important;
font-size: 16px !important;
}
.hero-stats {
display: flex;
gap: 40px;
flex-wrap: wrap;
}
.stat-value {
font-size: 28px;
font-weight: 800;
color: var(--green-dark);
letter-spacing: -.03em;
}
.stat-label {
font-size: 13px;
color: var(--gray-500);
margin-top: 4px;
font-weight: 500;
}
.stat + .stat {
padding-left: 40px;
border-left: 1px solid rgba(16,185,129,.2);
}
/* Dashboard card */
.hero-visual {
position: relative;
}
.dashboard-card {
background: white;
border-radius: var(--radius-lg);
box-shadow: 0 20px 60px rgba(16,185,129,.12), 0 4px 16px rgba(0,0,0,.06);
border: 1px solid rgba(16,185,129,.15);
overflow: hidden;
}
.card-header {
display: flex;
align-items: center;
gap: 12px;
padding: 16px 20px;
border-bottom: 1px solid var(--gray-100);
background: var(--gray-50);
}
.card-dots {
display: flex;
gap: 6px;
}
.card-dots span {
width: 10px;
height: 10px;
border-radius: 50%;
background: var(--gray-300);
}
.card-dots span:nth-child(1) { background: #ff5f57; }
.card-dots span:nth-child(2) { background: #febc2e; }
.card-dots span:nth-child(3) { background: #28c840; }
.card-title {
font-size: 13px;
font-weight: 600;
color: var(--gray-600);
flex: 1;
text-align: center;
}
.card-status {
display: flex;
align-items: center;
gap: 5px;
font-size: 12px;
color: var(--green-dark);
font-weight: 600;
}
.status-dot {
width: 7px;
height: 7px;
background: var(--green);
border-radius: 50%;
animation: pulse 2s infinite;
}
.card-body {
padding: 24px 20px 20px;
}
.chart-area {
margin-bottom: 20px;
}
.chart-bars {
display: flex;
align-items: flex-end;
gap: 8px;
height: 120px;
padding: 0 4px;
}
.bar {
flex: 1;
background: linear-gradient(180deg, #34d399, #059669);
border-radius: 6px 6px 0 0;
position: relative;
transition: all .3s;
opacity: .9;
}
.bar:nth-child(4) { background: linear-gradient(180deg, #60a5fa, #2563eb); }
.bar:nth-child(6) { background: linear-gradient(180deg, #a78bfa, #7c3aed); }
.bar:hover { opacity: 1; transform: scaleY(1.04); transform-origin: bottom; }
.bar-glow {
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 40%;
background: linear-gradient(transparent, rgba(16,185,129,.15));
border-radius: 0 0 6px 6px;
}
.chart-labels {
display: flex;
justify-content: space-between;
padding: 8px 4px 0;
font-size: 11px;
color: var(--gray-400);
font-weight: 500;
}
.metrics-row {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 12px;
margin-bottom: 16px;
}
.metric {
background: var(--gray-50);
border-radius: var(--radius-sm);
padding: 12px;
}
.metric-val {
font-size: 16px;
font-weight: 700;
color: var(--gray-900);
letter-spacing: -.02em;
}
.metric-lbl {
font-size: 11px;
color: var(--gray-400);
margin: 3px 0 2px;
}
.metric-chg {
font-size: 11px;
font-weight: 600;
}
.metric-chg.up { color: var(--green); }
.metric-chg.down { color: #ef4444; }
.ai-insight {
display: flex;
gap: 10px;
align-items: flex-start;
background: linear-gradient(135deg, var(--green-50), white);
border: 1px solid var(--green-100);
border-radius: var(--radius-sm);
padding: 12px;
}
.ai-icon {
width: 28px;
height: 28px;
background: linear-gradient(135deg, var(--green), var(--green-dark));
border-radius: 8px;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.ai-label {
font-size: 11px;
font-weight: 700;
color: var(--green-dark);
text-transform: uppercase;
letter-spacing: .04em;
margin-bottom: 4px;
}
.ai-msg {
font-size: 12px;
color: var(--gray-600);
line-height: 1.5;
}
/* Floating cards */
.float-card {
position: absolute;
background: white;
border-radius: var(--radius);
box-shadow: var(--shadow-md);
border: 1px solid var(--gray-100);
padding: 14px 18px;
display: flex;
align-items: center;
gap: 10px;
animation: float 3s ease-in-out infinite;
}
.float-1 {
top: -24px;
left: -40px;
animation-delay: 0s;
}
.float-2 {
bottom: -24px;
right: -30px;
animation-delay: 1.5s;
}
@keyframes float {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-8px); }
}
.float-icon {
width: 36px;
height: 36px;
background: var(--green-50);
border-radius: 10px;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
}
.float-title {
font-size: 13px;
font-weight: 700;
color: var(--gray-800);
}
.float-sub {
font-size: 11px;
color: var(--green-dark);
font-weight: 600;
margin-top: 2px;
}
.scroll-hint {
position: absolute;
bottom: 40px;
left: 50%;
transform: translateX(-50%);
display: flex;
flex-direction: column;
align-items: center;
gap: 8px;
color: var(--gray-400);
font-size: 12px;
font-weight: 500;
animation: bounce 2s infinite;
}
.scroll-wheel {
width: 22px;
height: 36px;
border: 2px solid var(--gray-300);
border-radius: 12px;
position: relative;
}
.scroll-wheel::after {
content: '';
width: 4px;
height: 8px;
background: var(--green);
border-radius: 2px;
position: absolute;
top: 6px;
left: 50%;
transform: translateX(-50%);
animation: scroll-dot 2s infinite;
}
@keyframes scroll-dot {
0% { transform: translateX(-50%) translateY(0); opacity: 1; }
100% { transform: translateX(-50%) translateY(12px); opacity: 0; }
}
@keyframes bounce {
0%, 100% { transform: translateX(-50%) translateY(0); }
50% { transform: translateX(-50%) translateY(-5px); }
}
@media (max-width: 1024px) {
.container {
grid-template-columns: 1fr;
gap: 60px;
}
.hero-visual { order: -1; max-width: 560px; margin: 0 auto; width: 100%; }
.hero-content { text-align: center; }
.hero-stats { justify-content: center; }
.hero-actions { justify-content: center; }
.section-sub { margin: 0 auto; }
}
@media (max-width: 600px) {
.float-1, .float-2 { display: none; }
.hero-stats { gap: 20px; }
.stat + .stat { padding-left: 20px; }
.metrics-row { grid-template-columns: 1fr; }
}
</style>

182
src/components/NavBar.vue Normal file
View File

@@ -0,0 +1,182 @@
<template>
<nav class="navbar" :class="{ scrolled: isScrolled }">
<div class="container nav-inner">
<a href="#" class="logo">
<div class="logo-icon">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none">
<path d="M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5" stroke="white" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</div>
<div class="logo-text">
<span class="logo-cn">硅基伙伴</span>
<span class="logo-en">Silicon Partner</span>
</div>
</a>
<div class="nav-links">
<a href="#services">解决方案</a>
<a href="#features">核心优势</a>
<a href="#cases">客户案例</a>
<a href="#about">关于我们</a>
</div>
<div class="nav-actions">
<a href="#contact" class="btn-secondary" style="padding: 10px 20px; font-size: 14px;">联系我们</a>
<a href="#demo" class="btn-primary" style="padding: 10px 20px; font-size: 14px;">
免费体验
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M5 12h14M12 5l7 7-7 7"/></svg>
</a>
</div>
<button class="menu-btn" @click="menuOpen = !menuOpen">
<span></span><span></span><span></span>
</button>
</div>
<div class="mobile-menu" :class="{ open: menuOpen }">
<a href="#services" @click="menuOpen=false">解决方案</a>
<a href="#features" @click="menuOpen=false">核心优势</a>
<a href="#cases" @click="menuOpen=false">客户案例</a>
<a href="#about" @click="menuOpen=false">关于我们</a>
<a href="#contact" class="btn-primary" style="margin-top:8px;justify-content:center;" @click="menuOpen=false">免费体验</a>
</div>
</nav>
</template>
<script setup lang="ts">
import { ref, onMounted, onUnmounted } from 'vue'
const isScrolled = ref(false)
const menuOpen = ref(false)
function onScroll() {
isScrolled.value = window.scrollY > 20
}
onMounted(() => window.addEventListener('scroll', onScroll))
onUnmounted(() => window.removeEventListener('scroll', onScroll))
</script>
<style scoped>
.navbar {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 1000;
transition: all .3s ease;
padding: 20px 0;
}
.navbar.scrolled {
background: rgba(255,255,255,.92);
backdrop-filter: blur(20px);
-webkit-backdrop-filter: blur(20px);
box-shadow: 0 1px 0 rgba(0,0,0,.06);
padding: 14px 0;
}
.nav-inner {
display: flex;
align-items: center;
gap: 40px;
}
.logo {
display: flex;
align-items: center;
gap: 10px;
text-decoration: none;
flex-shrink: 0;
}
.logo-icon {
width: 38px;
height: 38px;
background: linear-gradient(135deg, var(--green), var(--green-dark));
border-radius: 10px;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 4px 12px rgba(16,185,129,.3);
}
.logo-text {
display: flex;
flex-direction: column;
line-height: 1;
}
.logo-cn {
font-size: 16px;
font-weight: 800;
color: var(--gray-900);
letter-spacing: -.02em;
}
.logo-en {
font-size: 10px;
color: var(--gray-400);
font-weight: 500;
letter-spacing: .05em;
margin-top: 2px;
}
.nav-links {
display: flex;
align-items: center;
gap: 4px;
flex: 1;
}
.nav-links a {
text-decoration: none;
color: var(--gray-600);
font-size: 14px;
font-weight: 500;
padding: 8px 14px;
border-radius: 8px;
transition: all .15s;
}
.nav-links a:hover {
color: var(--gray-900);
background: var(--gray-100);
}
.nav-actions {
display: flex;
align-items: center;
gap: 10px;
flex-shrink: 0;
}
.menu-btn {
display: none;
flex-direction: column;
gap: 5px;
background: none;
border: none;
cursor: pointer;
padding: 4px;
}
.menu-btn span {
display: block;
width: 22px;
height: 2px;
background: var(--gray-700);
border-radius: 2px;
transition: all .2s;
}
.mobile-menu {
display: none;
flex-direction: column;
padding: 16px 24px 20px;
gap: 4px;
background: white;
border-top: 1px solid var(--gray-100);
}
.mobile-menu.open {
display: flex;
}
.mobile-menu a {
text-decoration: none;
color: var(--gray-700);
font-size: 15px;
font-weight: 500;
padding: 12px 0;
border-bottom: 1px solid var(--gray-100);
}
@media (max-width: 900px) {
.nav-links, .nav-actions { display: none; }
.menu-btn { display: flex; }
.nav-inner { justify-content: space-between; }
}
</style>

View File

@@ -0,0 +1,208 @@
<template>
<section id="services" class="services">
<div class="container">
<div class="section-head">
<div class="tag">解决方案</div>
<h2 class="section-title" style="margin-top:16px">
覆盖企业 AI 转型<br>全链路需求
</h2>
<p class="section-sub" style="margin-top:16px">
六大核心产品线从数据到洞察从自动化到智能化
为企业提供端到端 AI 数字化解决方案
</p>
</div>
<div class="services-grid">
<div
class="service-card"
v-for="(svc, i) in services"
:key="i"
:class="{ featured: svc.featured }"
>
<div class="card-tag" v-if="svc.featured">热门</div>
<div class="svc-icon" :style="{ background: svc.iconBg }">
<span v-html="svc.icon"></span>
</div>
<h3 class="svc-title">{{ svc.title }}</h3>
<p class="svc-desc">{{ svc.desc }}</p>
<ul class="svc-features">
<li v-for="f in svc.features" :key="f">
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="#10b981" stroke-width="2.5"><path d="M20 6L9 17l-5-5"/></svg>
{{ f }}
</li>
</ul>
<a href="#contact" class="svc-link">
了解详情
<svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5"><path d="M5 12h14M12 5l7 7-7 7"/></svg>
</a>
</div>
</div>
</div>
</section>
</template>
<script setup lang="ts">
const services = [
{
title: '企业知识库 & SOP',
desc: '将企业文档、规章制度、业务流程转化为智能知识库,支持自然语言问答,让知识随时触手可及。',
icon: `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#10b981" stroke-width="1.8"><path d="M4 19.5A2.5 2.5 0 0 1 6.5 17H20"/><path d="M6.5 2H20v20H6.5A2.5 2.5 0 0 1 4 19.5v-15A2.5 2.5 0 0 1 6.5 2z"/><line x1="9" y1="9" x2="15" y2="9"/><line x1="9" y1="13" x2="15" y2="13"/></svg>`,
iconBg: 'linear-gradient(135deg, #ecfdf5, #d1fae5)',
features: ['文档智能解析', '多轮对话问答', '人力资源 & 财务 SOP', '权限分级管理'],
featured: false,
},
{
title: '多平台数据整合',
desc: '一键接入抖店、快手小店、微信小店、小红书等主流电商平台,统一数据清洗与标准化处理。',
icon: `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#10b981" stroke-width="1.8"><rect x="2" y="3" width="20" height="14" rx="2"/><line x1="8" y1="21" x2="16" y2="21"/><line x1="12" y1="17" x2="12" y2="21"/><path d="M7 8h10M7 12h6"/></svg>`,
iconBg: 'linear-gradient(135deg, #ecfdf5, #d1fae5)',
features: ['抖音/快手/微信小店', '小红书数据接入', '自动清洗 & 去重', 'API 实时同步'],
featured: true,
},
{
title: '智能报表分析',
desc: '自动生成日报、月报、战报,可视化大屏驾驶舱,让数据决策快人一步。',
icon: `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#10b981" stroke-width="1.8"><polyline points="22 12 18 12 15 21 9 3 6 12 2 12"/></svg>`,
iconBg: 'linear-gradient(135deg, #ecfdf5, #d1fae5)',
features: ['自动日/月/年报', '战报大屏驾驶舱', 'AI 趋势预测', '多维交叉分析'],
featured: false,
},
{
title: 'AI 智能财务',
desc: '发票智能识别与开具、报销自动整理收集,让财务工作从繁琐走向高效。',
icon: `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#10b981" stroke-width="1.8"><rect x="1" y="4" width="22" height="16" rx="2" ry="2"/><line x1="1" y1="10" x2="23" y2="10"/></svg>`,
iconBg: 'linear-gradient(135deg, #ecfdf5, #d1fae5)',
features: ['发票 OCR 识别', '自动开具发票', '报销单智能归档', '财务合规审核'],
featured: false,
},
{
title: 'AI 智能客服',
desc: '7×24 小时在线客服,覆盖售前咨询、售后处理全流程,大幅降低人力成本。',
icon: `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#10b981" stroke-width="1.8"><path d="M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"/></svg>`,
iconBg: 'linear-gradient(135deg, #ecfdf5, #d1fae5)',
features: ['售前智能导购', '售后问题处理', '多渠道统一入口', '情绪识别转人工'],
featured: false,
},
{
title: '定制企业级 MCP',
desc: '基于企业专属场景,构建量身定制的 Model Context Protocol打造私有化 AI 中枢。',
icon: `<svg width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="#10b981" stroke-width="1.8"><circle cx="12" cy="12" r="3"/><path d="M19.07 4.93a10 10 0 0 1 0 14.14M4.93 4.93a10 10 0 0 0 0 14.14"/><path d="M15.54 8.46a5 5 0 0 1 0 7.07M8.46 8.46a5 5 0 0 0 0 7.07"/></svg>`,
iconBg: 'linear-gradient(135deg, #ecfdf5, #d1fae5)',
features: ['私有化部署', '企业数据安全', '模型灵活接入', '持续迭代优化'],
featured: false,
},
]
</script>
<style scoped>
.services {
padding: 120px 0;
background: var(--white);
}
.section-head {
margin-bottom: 64px;
}
.services-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 24px;
}
.service-card {
background: var(--white);
border: 1.5px solid var(--gray-100);
border-radius: var(--radius-lg);
padding: 32px;
position: relative;
transition: all .25s ease;
overflow: hidden;
}
.service-card::before {
content: '';
position: absolute;
inset: 0;
background: linear-gradient(135deg, var(--green-50), transparent);
opacity: 0;
transition: opacity .25s;
}
.service-card:hover {
border-color: var(--green-200);
box-shadow: var(--shadow-md);
transform: translateY(-4px);
}
.service-card:hover::before { opacity: 1; }
.service-card.featured {
border-color: var(--green-200);
background: linear-gradient(135deg, var(--green-50) 0%, white 60%);
box-shadow: 0 0 0 1px var(--green-200), var(--shadow-md);
}
.card-tag {
position: absolute;
top: 20px;
right: 20px;
background: var(--green);
color: white;
font-size: 11px;
font-weight: 700;
padding: 4px 10px;
border-radius: 50px;
letter-spacing: .04em;
}
.svc-icon {
width: 52px;
height: 52px;
border-radius: 14px;
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 20px;
position: relative;
}
.svc-title {
font-size: 20px;
font-weight: 700;
color: var(--gray-900);
letter-spacing: -.02em;
margin-bottom: 12px;
}
.svc-desc {
font-size: 14px;
color: var(--gray-500);
line-height: 1.7;
margin-bottom: 20px;
}
.svc-features {
list-style: none;
display: flex;
flex-direction: column;
gap: 8px;
margin-bottom: 24px;
}
.svc-features li {
display: flex;
align-items: center;
gap: 8px;
font-size: 13px;
color: var(--gray-600);
font-weight: 500;
}
.svc-link {
display: inline-flex;
align-items: center;
gap: 6px;
color: var(--green-dark);
font-size: 13px;
font-weight: 700;
text-decoration: none;
letter-spacing: -.01em;
position: relative;
}
.svc-link:hover { color: var(--green); }
@media (max-width: 1100px) {
.services-grid { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 640px) {
.services-grid { grid-template-columns: 1fr; }
.services { padding: 80px 0; }
}
</style>

View File

@@ -0,0 +1,134 @@
<template>
<section class="stats-section">
<div class="container">
<div class="stats-inner">
<div class="stats-text">
<div class="tag">数据说话</div>
<h2 class="section-title" style="margin-top:16px; max-width: 480px;">
让数字见证<br>我们的实力
</h2>
</div>
<div class="stats-grid">
<div class="stat-card" v-for="s in stats" :key="s.label">
<div class="stat-icon" v-html="s.icon"></div>
<div class="stat-num">{{ s.value }}</div>
<div class="stat-name">{{ s.label }}</div>
<div class="stat-desc">{{ s.desc }}</div>
</div>
</div>
</div>
</div>
</section>
</template>
<script setup lang="ts">
const stats = [
{
value: '200+',
label: '服务企业数',
desc: '覆盖零售、制造、金融等多个行业',
icon: `<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="#10b981" stroke-width="2"><path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/><path d="M23 21v-2a4 4 0 0 0-3-3.87"/><path d="M16 3.13a4 4 0 0 1 0 7.75"/></svg>`,
},
{
value: '98%',
label: '客户满意度',
desc: '连续三年 NPS 评分行业第一',
icon: `<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="#10b981" stroke-width="2"><path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z"/></svg>`,
},
{
value: '10x',
label: '效率提升',
desc: '平均人效提升 10 倍以上',
icon: `<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="#10b981" stroke-width="2"><polyline points="23 6 13.5 15.5 8.5 10.5 1 18"/><polyline points="17 6 23 6 23 12"/></svg>`,
},
{
value: '7×24h',
label: '稳定运行',
desc: '99.9% SLA 高可用架构保障',
icon: `<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="#10b981" stroke-width="2"><circle cx="12" cy="12" r="10"/><polyline points="12 6 12 12 16 14"/></svg>`,
},
{
value: '50M+',
label: '日均处理量',
desc: '每天处理超五千万条数据记录',
icon: `<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="#10b981" stroke-width="2"><ellipse cx="12" cy="5" rx="9" ry="3"/><path d="M21 12c0 1.66-4 3-9 3s-9-1.34-9-3"/><path d="M3 5v14c0 1.66 4 3 9 3s9-1.34 9-3V5"/></svg>`,
},
{
value: '< 200ms',
label: '平均响应时延',
desc: 'AI 推理引擎高性能架构',
icon: `<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="#10b981" stroke-width="2"><path d="M13 2L3 14h9l-1 8 10-12h-9l1-8z"/></svg>`,
},
]
</script>
<style scoped>
.stats-section {
padding: 120px 0;
background: white;
}
.stats-inner {
display: grid;
grid-template-columns: 320px 1fr;
gap: 80px;
align-items: center;
}
.stats-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 20px;
}
.stat-card {
background: var(--gray-50);
border-radius: var(--radius-lg);
padding: 28px;
border: 1.5px solid var(--gray-100);
transition: all .2s;
}
.stat-card:hover {
border-color: var(--green-200);
background: var(--green-50);
box-shadow: var(--shadow);
}
.stat-icon {
width: 44px;
height: 44px;
background: white;
border-radius: 12px;
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 16px;
box-shadow: var(--shadow-sm);
border: 1px solid var(--gray-100);
}
.stat-num {
font-size: 32px;
font-weight: 900;
color: var(--gray-900);
letter-spacing: -.04em;
margin-bottom: 6px;
}
.stat-name {
font-size: 14px;
font-weight: 700;
color: var(--gray-700);
margin-bottom: 6px;
}
.stat-desc {
font-size: 12px;
color: var(--gray-400);
line-height: 1.5;
}
@media (max-width: 1100px) {
.stats-inner { grid-template-columns: 1fr; gap: 48px; }
}
@media (max-width: 800px) {
.stats-grid { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 480px) {
.stats-grid { grid-template-columns: 1fr; }
.stats-section { padding: 80px 0; }
}
</style>

6
src/main.ts Normal file
View File

@@ -0,0 +1,6 @@
import './assets/main.css'
import { createApp } from 'vue'
import App from './App.vue'
createApp(App).mount('#app')

18
tsconfig.app.json Normal file
View File

@@ -0,0 +1,18 @@
{
"extends": "@vue/tsconfig/tsconfig.dom.json",
"include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
"exclude": ["src/**/__tests__/*"],
"compilerOptions": {
// Extra safety for array and object lookups, but may have false positives.
"noUncheckedIndexedAccess": true,
// Path mapping for cleaner imports.
"paths": {
"@/*": ["./src/*"]
},
// `vue-tsc --build` produces a .tsbuildinfo file for incremental type-checking.
// Specified here to keep it out of the root directory.
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo"
}
}

11
tsconfig.json Normal file
View File

@@ -0,0 +1,11 @@
{
"files": [],
"references": [
{
"path": "./tsconfig.node.json"
},
{
"path": "./tsconfig.app.json"
}
]
}

28
tsconfig.node.json Normal file
View File

@@ -0,0 +1,28 @@
// TSConfig for modules that run in Node.js environment via either transpilation or type-stripping.
{
"extends": "@tsconfig/node24/tsconfig.json",
"include": [
"vite.config.*",
"vitest.config.*",
"cypress.config.*",
"nightwatch.conf.*",
"playwright.config.*",
"eslint.config.*"
],
"compilerOptions": {
// Most tools use transpilation instead of Node.js's native type-stripping.
// Bundler mode provides a smoother developer experience.
"module": "preserve",
"moduleResolution": "bundler",
// Include Node.js types and avoid accidentally including other `@types/*` packages.
"types": ["node"],
// Disable emitting output during `vue-tsc --build`, which is used for type-checking only.
"noEmit": true,
// `vue-tsc --build` produces a .tsbuildinfo file for incremental type-checking.
// Specified here to keep it out of the root directory.
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo"
}
}

18
vite.config.ts Normal file
View File

@@ -0,0 +1,18 @@
import { fileURLToPath, URL } from 'node:url'
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import vueDevTools from 'vite-plugin-vue-devtools'
// https://vite.dev/config/
export default defineConfig({
plugins: [
vue(),
vueDevTools(),
],
resolve: {
alias: {
'@': fileURLToPath(new URL('./src', import.meta.url))
},
},
})