Add Astro landing site for 和光同坤 with logo, contact, and gitignore
Made-with: Cursor
This commit is contained in:
24
.gitignore
vendored
Normal file
24
.gitignore
vendored
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
# Dependencies
|
||||||
|
node_modules/
|
||||||
|
|
||||||
|
# Astro
|
||||||
|
dist/
|
||||||
|
.astro/
|
||||||
|
|
||||||
|
# Environment
|
||||||
|
.env
|
||||||
|
.env.*
|
||||||
|
!.env.example
|
||||||
|
|
||||||
|
# Logs & debug
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
|
||||||
|
# OS
|
||||||
|
.DS_Store
|
||||||
|
Thumbs.db
|
||||||
|
|
||||||
|
# Editor (optional local)
|
||||||
|
*.swp
|
||||||
|
*.swo
|
||||||
@@ -1,2 +1 @@
|
|||||||
# HeguangtongkunLanding
|
# HeguangtongkunLanding
|
||||||
# HeguangtongkunLanding
|
|
||||||
|
|||||||
6
astro.config.mjs
Normal file
6
astro.config.mjs
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
import { defineConfig } from "astro/config";
|
||||||
|
|
||||||
|
// https://astro.build/config
|
||||||
|
export default defineConfig({
|
||||||
|
site: "https://hga3d.com",
|
||||||
|
});
|
||||||
5075
package-lock.json
generated
Normal file
5075
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
16
package.json
Normal file
16
package.json
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"name": "heguangtongkun-landing",
|
||||||
|
"type": "module",
|
||||||
|
"version": "0.0.1",
|
||||||
|
"scripts": {
|
||||||
|
"dev": "astro dev",
|
||||||
|
"build": "astro build",
|
||||||
|
"preview": "astro preview"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"astro": "^4.16.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"typescript": "^5.6.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
24
public/favicon.svg
Normal file
24
public/favicon.svg
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" fill="none">
|
||||||
|
<defs>
|
||||||
|
<radialGradient id="fh" cx="50%" cy="38%" r="70%">
|
||||||
|
<stop offset="0%" stop-color="#fff0e0"/>
|
||||||
|
<stop offset="50%" stop-color="#c9a06c"/>
|
||||||
|
<stop offset="100%" stop-color="#0a0d12" stop-opacity="0"/>
|
||||||
|
</radialGradient>
|
||||||
|
<linearGradient id="fb" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||||
|
<stop offset="0%" stop-color="#d4a574"/>
|
||||||
|
<stop offset="100%" stop-color="#38b8aa"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="fs" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||||
|
<stop offset="0%" stop-color="#ffd9b0" stop-opacity="0.9"/>
|
||||||
|
<stop offset="100%" stop-color="#d4a574" stop-opacity="0"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<rect width="32" height="32" rx="8" fill="#0a0d12"/>
|
||||||
|
<path d="M9 8 Q16 3 23 8" stroke="url(#fs)" stroke-width="1.2" stroke-linecap="round" fill="none" opacity="0.8"/>
|
||||||
|
<ellipse cx="16" cy="10" rx="4.5" ry="5.5" fill="url(#fh)"/>
|
||||||
|
<ellipse cx="16" cy="9.5" rx="2" ry="2.5" fill="#fff6ea" opacity="0.45"/>
|
||||||
|
<path d="M16 15.5v6" stroke="url(#fb)" stroke-width="1.5" stroke-linecap="round"/>
|
||||||
|
<path d="M16 21.5l-5.5 7M16 21.5l5.5 7" stroke="url(#fb)" stroke-width="1.4" stroke-linecap="round"/>
|
||||||
|
<path d="M5 29h8M19 29h8" stroke="url(#fb)" stroke-width="1.35" stroke-linecap="round"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
32
public/logo-mark.svg
Normal file
32
public/logo-mark.svg
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" fill="none">
|
||||||
|
<defs>
|
||||||
|
<radialGradient id="hg-light" cx="50%" cy="30%" r="58%" fx="50%" fy="30%">
|
||||||
|
<stop offset="0%" stop-color="#fff6ec"/>
|
||||||
|
<stop offset="32%" stop-color="#e0bc8c"/>
|
||||||
|
<stop offset="62%" stop-color="#b8895c"/>
|
||||||
|
<stop offset="100%" stop-color="#b8895c" stop-opacity="0"/>
|
||||||
|
</radialGradient>
|
||||||
|
<linearGradient id="hg-earth" x1="0%" y1="0%" x2="100%" y2="0%">
|
||||||
|
<stop offset="0%" stop-color="#5c4a3d"/>
|
||||||
|
<stop offset="48%" stop-color="#d4a574"/>
|
||||||
|
<stop offset="100%" stop-color="#38b8aa"/>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="hg-ray" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||||
|
<stop offset="0%" stop-color="#ffe8cc" stop-opacity="0.85"/>
|
||||||
|
<stop offset="100%" stop-color="#d4a574" stop-opacity="0"/>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<circle cx="32" cy="20" r="20" fill="url(#hg-light)"/>
|
||||||
|
<circle cx="32" cy="20" r="5.5" fill="#fff9f0" opacity="0.55"/>
|
||||||
|
<g opacity="0.42" stroke="url(#hg-ray)" stroke-width="1.3" stroke-linecap="round">
|
||||||
|
<path d="M32 5v9M18 11l8 6M46 11l-8 6"/>
|
||||||
|
</g>
|
||||||
|
<g stroke="url(#hg-earth)" stroke-width="2.5" stroke-linecap="round" opacity="0.95">
|
||||||
|
<path d="M7 36h16 M33 36h16"/>
|
||||||
|
<path d="M7 43h16 M33 43h16"/>
|
||||||
|
<path d="M7 50h16 M33 50h16"/>
|
||||||
|
</g>
|
||||||
|
<g stroke="rgba(212,165,116,0.4)" stroke-width="1.5" stroke-linecap="round">
|
||||||
|
<path d="M10 56h12 M38 56h12"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.4 KiB |
65
src/components/LogoMark.astro
Normal file
65
src/components/LogoMark.astro
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
---
|
||||||
|
interface Props {
|
||||||
|
class?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
const { class: className = "" } = Astro.props;
|
||||||
|
---
|
||||||
|
|
||||||
|
<svg
|
||||||
|
class={className}
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
viewBox="0 0 64 64"
|
||||||
|
fill="none"
|
||||||
|
aria-hidden="true"
|
||||||
|
focusable="false"
|
||||||
|
width="40"
|
||||||
|
height="40"
|
||||||
|
>
|
||||||
|
<defs>
|
||||||
|
<radialGradient id="hg-head" cx="50%" cy="38%" r="65%" fx="50%" fy="38%">
|
||||||
|
<stop offset="0%" stop-color="#fff8f0"></stop>
|
||||||
|
<stop offset="35%" stop-color="#e4c49a"></stop>
|
||||||
|
<stop offset="70%" stop-color="#b8895c"></stop>
|
||||||
|
<stop offset="100%" stop-color="#b8895c" stop-opacity="0"></stop>
|
||||||
|
</radialGradient>
|
||||||
|
<linearGradient id="hg-body" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||||
|
<stop offset="0%" stop-color="#d4a574"></stop>
|
||||||
|
<stop offset="100%" stop-color="#38b8aa"></stop>
|
||||||
|
</linearGradient>
|
||||||
|
<linearGradient id="hg-sky" x1="50%" y1="0%" x2="50%" y2="100%">
|
||||||
|
<stop offset="0%" stop-color="#ffe8cc" stop-opacity="0.95"></stop>
|
||||||
|
<stop offset="100%" stop-color="#d4a574" stop-opacity="0"></stop>
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
|
||||||
|
<!-- 顶天:穹顶弧线 + 天光(非正圆,略向上) -->
|
||||||
|
<path
|
||||||
|
d="M18 14 Q32 4 46 14"
|
||||||
|
stroke="url(#hg-sky)"
|
||||||
|
stroke-width="2"
|
||||||
|
stroke-linecap="round"
|
||||||
|
fill="none"
|
||||||
|
opacity="0.75"
|
||||||
|
></path>
|
||||||
|
<ellipse cx="32" cy="18" rx="9" ry="11" fill="url(#hg-head)"></ellipse>
|
||||||
|
<ellipse cx="32" cy="17" rx="4.2" ry="5" fill="#fff9f0" opacity="0.5"></ellipse>
|
||||||
|
|
||||||
|
<!-- 躯干:连接天地 -->
|
||||||
|
<path
|
||||||
|
d="M32 29 L32 40"
|
||||||
|
stroke="url(#hg-body)"
|
||||||
|
stroke-width="2.8"
|
||||||
|
stroke-linecap="round"
|
||||||
|
></path>
|
||||||
|
|
||||||
|
<!-- 立地:双腿 + 两脚如「__」踏地 -->
|
||||||
|
<g stroke="url(#hg-body)" stroke-width="2.6" stroke-linecap="round" stroke-linejoin="round">
|
||||||
|
<path d="M32 40 L21 54"></path>
|
||||||
|
<path d="M32 40 L43 54"></path>
|
||||||
|
</g>
|
||||||
|
<g stroke="url(#hg-body)" stroke-width="2.5" stroke-linecap="round" opacity="0.95">
|
||||||
|
<path d="M12 56 h14"></path>
|
||||||
|
<path d="M38 56 h14"></path>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
2
src/env.d.ts
vendored
Normal file
2
src/env.d.ts
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
/// <reference path="../.astro/types.d.ts" />
|
||||||
|
/// <reference types="astro/client" />
|
||||||
33
src/layouts/BaseLayout.astro
Normal file
33
src/layouts/BaseLayout.astro
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
---
|
||||||
|
import "../styles/global.css";
|
||||||
|
|
||||||
|
interface Props {
|
||||||
|
title: string;
|
||||||
|
description?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
const {
|
||||||
|
title,
|
||||||
|
description = "上海和光同坤科技有限公司(和光同坤,语出和光同尘)— AI Native 企业,银发关怀、美妆原料自动化与三维设计一体化方案。",
|
||||||
|
} = Astro.props;
|
||||||
|
---
|
||||||
|
|
||||||
|
<!doctype html>
|
||||||
|
<html lang="zh-CN">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
|
<meta name="description" content={description} />
|
||||||
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg" />
|
||||||
|
<link rel="preconnect" href="https://fonts.googleapis.com" />
|
||||||
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
|
||||||
|
<link
|
||||||
|
href="https://fonts.googleapis.com/css2?family=Noto+Sans+SC:wght@400;500;600;700&family=ZCOOL+XiaoWei&display=swap"
|
||||||
|
rel="stylesheet"
|
||||||
|
/>
|
||||||
|
<title>{title}</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<slot />
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
572
src/pages/index.astro
Normal file
572
src/pages/index.astro
Normal file
@@ -0,0 +1,572 @@
|
|||||||
|
---
|
||||||
|
import BaseLayout from "../layouts/BaseLayout.astro";
|
||||||
|
import LogoMark from "../components/LogoMark.astro";
|
||||||
|
---
|
||||||
|
|
||||||
|
<BaseLayout title="上海和光同坤科技有限公司 · AI Native">
|
||||||
|
<header class="site-header">
|
||||||
|
<div class="wrap header-inner">
|
||||||
|
<a href="/" class="brand" aria-label="上海和光同坤科技有限公司 首页">
|
||||||
|
<LogoMark class="brand-mark" />
|
||||||
|
<span class="brand-text">和光同坤</span>
|
||||||
|
</a>
|
||||||
|
<nav class="nav" aria-label="主导航">
|
||||||
|
<a href="#products">产品</a>
|
||||||
|
<a href="#contact" class="nav-cta">联系我们</a>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<main>
|
||||||
|
<section class="hero">
|
||||||
|
<div class="wrap hero-inner">
|
||||||
|
<p class="eyebrow">AI Native 企业</p>
|
||||||
|
<h1 class="hero-title">
|
||||||
|
以人工智能为底座,<br />
|
||||||
|
<span class="hero-highlight">让技术更懂人、更懂行业</span>
|
||||||
|
</h1>
|
||||||
|
<p class="hero-lead">
|
||||||
|
我们聚焦隐私可控的边缘智能、垂直行业的流程自动化,以及三维数字化闭环,为家庭关怀与企业降本提供可落地的 AI 方案。
|
||||||
|
</p>
|
||||||
|
<div class="hero-actions">
|
||||||
|
<a href="#products" class="btn btn-primary">了解产品线</a>
|
||||||
|
<a href="#contact" class="btn btn-ghost">商务合作</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="products" class="products">
|
||||||
|
<div class="wrap">
|
||||||
|
<header class="section-head">
|
||||||
|
<h2>三大产品线</h2>
|
||||||
|
<p>从陪伴到合规填报,再到三维设计与测量,覆盖「人—业—形」全链路场景。</p>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<ul class="product-grid">
|
||||||
|
<li class="product-card product-card--warm">
|
||||||
|
<span class="product-index">01</span>
|
||||||
|
<h3>银发 AI 伴侣与回忆录</h3>
|
||||||
|
<p class="product-desc">
|
||||||
|
面向长者的智能陪伴:通过自然对话采集人生故事与家庭记忆,自动生成结构化的<strong>回忆录</strong>文稿,让温情被记录、被传承。
|
||||||
|
</p>
|
||||||
|
<ul class="product-bullets">
|
||||||
|
<li>移动端 App 与适老化交互</li>
|
||||||
|
<li>可选<strong>边缘推理一体机</strong>,数据不出本地,满足隐私与合规诉求</li>
|
||||||
|
<li>离线/弱网环境下的稳定体验</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="product-card product-card--teal">
|
||||||
|
<span class="product-index">02</span>
|
||||||
|
<h3>化妆品与原料 · AI 自动化填表</h3>
|
||||||
|
<p class="product-desc">
|
||||||
|
针对化妆品功效评价、原料档案与注册申报等场景,提供<strong>智能抽取、校验与表单自动填充</strong>,减少重复录入与人工差错。
|
||||||
|
</p>
|
||||||
|
<ul class="product-bullets">
|
||||||
|
<li>评价报告、原料规格书等多源文档理解</li>
|
||||||
|
<li>与企业现有流程、模板对齐,可审计可追溯</li>
|
||||||
|
<li>助力研发与合规团队<strong>降本增效</strong></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="product-card product-card--violet">
|
||||||
|
<span class="product-index">03</span>
|
||||||
|
<h3>AI 三维扫描 · 测量 · 设计一体化</h3>
|
||||||
|
<p class="product-desc">
|
||||||
|
一体化软件打通<strong>扫描、精密测量与数字化设计</strong>,支撑从数据采集到方案输出的完整工作流。
|
||||||
|
</p>
|
||||||
|
<ul class="product-bullets">
|
||||||
|
<li><strong>数字矫形</strong>:足部、矫形器等个性化定制</li>
|
||||||
|
<li><strong>定制电商</strong>:量体、鞋服与配饰的 C2M 链路</li>
|
||||||
|
<li><strong>医疗美容</strong>:术前规划与效果沟通的数字化基础</li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section class="values">
|
||||||
|
<div class="wrap values-inner">
|
||||||
|
<div class="value-block">
|
||||||
|
<h3>隐私优先</h3>
|
||||||
|
<p>关键场景支持端侧与一体机部署,最小化数据外发风险。</p>
|
||||||
|
</div>
|
||||||
|
<div class="value-block">
|
||||||
|
<h3>行业可落地</h3>
|
||||||
|
<p>与真实业务流程对齐,而非泛化聊天;强调可集成、可运维。</p>
|
||||||
|
</div>
|
||||||
|
<div class="value-block">
|
||||||
|
<h3>全链路智能</h3>
|
||||||
|
<p>从感知、理解到生成与设计,形成可复用的 AI 能力栈。</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<section id="contact" class="contact">
|
||||||
|
<div class="wrap contact-inner">
|
||||||
|
<h2>开启合作</h2>
|
||||||
|
<p>若您希望了解产品演示、私有化部署或行业方案,欢迎来访、来电或邮件联系,我们将尽快与您联系。</p>
|
||||||
|
|
||||||
|
<div class="contact-details">
|
||||||
|
<div class="contact-block">
|
||||||
|
<span class="contact-label">地址</span>
|
||||||
|
<address class="contact-address">
|
||||||
|
上海市闵行区永德路787号宝龙中心G3栋6楼上海交大科创中心
|
||||||
|
</address>
|
||||||
|
</div>
|
||||||
|
<div class="contact-block">
|
||||||
|
<span class="contact-label">电话</span>
|
||||||
|
<a class="contact-phone" href="tel:+8619801050941">198 0105 0941</a>
|
||||||
|
</div>
|
||||||
|
<div class="contact-block">
|
||||||
|
<span class="contact-label">邮箱</span>
|
||||||
|
<p class="contact-email-line">
|
||||||
|
<a href="mailto:admin@hga3d.com" class="contact-mail">admin@hga3d.com</a>
|
||||||
|
<span class="contact-email-note">(主题请注明来意)</span>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<footer class="site-footer">
|
||||||
|
<div class="wrap footer-inner">
|
||||||
|
<span>© {new Date().getFullYear()} 上海和光同坤科技有限公司</span>
|
||||||
|
<span class="footer-note">产品与合作细节以实际沟通为准。</span>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
</BaseLayout>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.site-header {
|
||||||
|
position: sticky;
|
||||||
|
top: 0;
|
||||||
|
z-index: 50;
|
||||||
|
backdrop-filter: blur(12px);
|
||||||
|
background: rgba(7, 9, 13, 0.75);
|
||||||
|
border-bottom: 1px solid var(--border);
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-inner {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
padding-block: 1rem 1.1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 0.65rem;
|
||||||
|
color: var(--text);
|
||||||
|
font-weight: 600;
|
||||||
|
letter-spacing: 0.06em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand-mark {
|
||||||
|
width: 2.25rem;
|
||||||
|
height: 2.25rem;
|
||||||
|
flex-shrink: 0;
|
||||||
|
display: block;
|
||||||
|
border-radius: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.brand-text {
|
||||||
|
font-family: var(--font-display);
|
||||||
|
font-size: 1.25rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 1.75rem;
|
||||||
|
font-size: 0.95rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav a {
|
||||||
|
color: var(--text-muted);
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav a:hover {
|
||||||
|
color: var(--text);
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-cta {
|
||||||
|
padding: 0.45rem 1rem;
|
||||||
|
border-radius: 999px;
|
||||||
|
border: 1px solid var(--border);
|
||||||
|
color: var(--text) !important;
|
||||||
|
background: rgba(255, 255, 255, 0.04);
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav-cta:hover {
|
||||||
|
border-color: rgba(61, 214, 198, 0.45);
|
||||||
|
}
|
||||||
|
|
||||||
|
.hero {
|
||||||
|
padding: clamp(3.5rem, 12vw, 7rem) 0 clamp(4rem, 10vw, 6rem);
|
||||||
|
}
|
||||||
|
|
||||||
|
.eyebrow {
|
||||||
|
display: inline-block;
|
||||||
|
margin: 0 0 1rem;
|
||||||
|
padding: 0.35rem 0.85rem;
|
||||||
|
font-size: 0.8rem;
|
||||||
|
font-weight: 600;
|
||||||
|
letter-spacing: 0.12em;
|
||||||
|
text-transform: uppercase;
|
||||||
|
color: var(--accent-teal);
|
||||||
|
border: 1px solid rgba(61, 214, 198, 0.35);
|
||||||
|
border-radius: 999px;
|
||||||
|
background: rgba(61, 214, 198, 0.06);
|
||||||
|
}
|
||||||
|
|
||||||
|
.hero-title {
|
||||||
|
margin: 0 0 1.25rem;
|
||||||
|
font-family: var(--font-display);
|
||||||
|
font-size: clamp(2rem, 5vw, 3.15rem);
|
||||||
|
font-weight: 400;
|
||||||
|
line-height: 1.2;
|
||||||
|
letter-spacing: 0.02em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hero-highlight {
|
||||||
|
background: linear-gradient(105deg, var(--text) 0%, var(--accent-warm) 45%, var(--accent-teal) 100%);
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
background-clip: text;
|
||||||
|
color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hero-lead {
|
||||||
|
max-width: 38rem;
|
||||||
|
margin: 0 0 2rem;
|
||||||
|
font-size: 1.05rem;
|
||||||
|
color: var(--text-muted);
|
||||||
|
}
|
||||||
|
|
||||||
|
.hero-actions {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 0.85rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
padding: 0.75rem 1.5rem;
|
||||||
|
font-size: 0.95rem;
|
||||||
|
font-weight: 600;
|
||||||
|
border-radius: 999px;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
transition:
|
||||||
|
transform 0.2s var(--ease),
|
||||||
|
box-shadow 0.2s var(--ease),
|
||||||
|
background 0.2s var(--ease);
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn:hover {
|
||||||
|
transform: translateY(-1px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-primary {
|
||||||
|
color: #0a0d12;
|
||||||
|
background: linear-gradient(135deg, var(--accent-teal), #2eb8aa);
|
||||||
|
box-shadow: 0 8px 28px rgba(61, 214, 198, 0.25);
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-primary:hover {
|
||||||
|
box-shadow: 0 12px 36px rgba(61, 214, 198, 0.32);
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-ghost {
|
||||||
|
color: var(--text);
|
||||||
|
border-color: var(--border);
|
||||||
|
background: rgba(255, 255, 255, 0.04);
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-ghost:hover {
|
||||||
|
border-color: rgba(255, 255, 255, 0.18);
|
||||||
|
}
|
||||||
|
|
||||||
|
.section-head {
|
||||||
|
margin-bottom: 2.75rem;
|
||||||
|
max-width: 36rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.section-head h2 {
|
||||||
|
margin: 0 0 0.65rem;
|
||||||
|
font-family: var(--font-display);
|
||||||
|
font-size: clamp(1.65rem, 3.5vw, 2.15rem);
|
||||||
|
font-weight: 400;
|
||||||
|
}
|
||||||
|
|
||||||
|
.section-head p {
|
||||||
|
margin: 0;
|
||||||
|
color: var(--text-muted);
|
||||||
|
font-size: 1.02rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.products {
|
||||||
|
padding-bottom: clamp(3rem, 8vw, 5rem);
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-grid {
|
||||||
|
list-style: none;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
display: grid;
|
||||||
|
gap: 1.5rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: 900px) {
|
||||||
|
.product-grid {
|
||||||
|
grid-template-columns: repeat(3, 1fr);
|
||||||
|
align-items: stretch;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-card {
|
||||||
|
position: relative;
|
||||||
|
padding: 1.75rem 1.6rem 1.65rem;
|
||||||
|
border-radius: var(--radius);
|
||||||
|
border: 1px solid var(--border);
|
||||||
|
background: var(--bg-card);
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
|
transition:
|
||||||
|
border-color 0.25s var(--ease),
|
||||||
|
background 0.25s var(--ease),
|
||||||
|
transform 0.25s var(--ease);
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-card:hover {
|
||||||
|
background: var(--bg-card-hover);
|
||||||
|
transform: translateY(-3px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-card--warm:hover {
|
||||||
|
border-color: rgba(212, 165, 116, 0.35);
|
||||||
|
box-shadow: 0 20px 50px rgba(212, 165, 116, 0.08);
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-card--teal:hover {
|
||||||
|
border-color: rgba(61, 214, 198, 0.35);
|
||||||
|
box-shadow: 0 20px 50px rgba(61, 214, 198, 0.08);
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-card--violet:hover {
|
||||||
|
border-color: rgba(155, 140, 255, 0.35);
|
||||||
|
box-shadow: 0 20px 50px rgba(155, 140, 255, 0.08);
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-index {
|
||||||
|
display: block;
|
||||||
|
margin-bottom: 1rem;
|
||||||
|
font-size: 0.75rem;
|
||||||
|
font-weight: 700;
|
||||||
|
letter-spacing: 0.2em;
|
||||||
|
opacity: 0.45;
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-card--warm .product-index {
|
||||||
|
color: var(--accent-warm);
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-card--teal .product-index {
|
||||||
|
color: var(--accent-teal);
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-card--violet .product-index {
|
||||||
|
color: var(--accent-violet);
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-card h3 {
|
||||||
|
margin: 0 0 0.85rem;
|
||||||
|
font-size: 1.2rem;
|
||||||
|
font-weight: 600;
|
||||||
|
line-height: 1.4;
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-desc {
|
||||||
|
margin: 0 0 1.1rem;
|
||||||
|
color: var(--text-muted);
|
||||||
|
font-size: 0.95rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-bullets {
|
||||||
|
margin: 0;
|
||||||
|
padding-left: 1.15rem;
|
||||||
|
color: var(--text-muted);
|
||||||
|
font-size: 0.9rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-bullets li {
|
||||||
|
margin-bottom: 0.45rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.product-bullets li:last-child {
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.values {
|
||||||
|
padding: clamp(2.5rem, 6vw, 4rem) 0;
|
||||||
|
border-top: 1px solid var(--border);
|
||||||
|
border-bottom: 1px solid var(--border);
|
||||||
|
}
|
||||||
|
|
||||||
|
.values-inner {
|
||||||
|
display: grid;
|
||||||
|
gap: 1.75rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: 720px) {
|
||||||
|
.values-inner {
|
||||||
|
grid-template-columns: repeat(3, 1fr);
|
||||||
|
gap: 2rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.value-block h3 {
|
||||||
|
margin: 0 0 0.5rem;
|
||||||
|
font-size: 1rem;
|
||||||
|
font-weight: 600;
|
||||||
|
color: var(--accent-teal);
|
||||||
|
}
|
||||||
|
|
||||||
|
.value-block p {
|
||||||
|
margin: 0;
|
||||||
|
font-size: 0.92rem;
|
||||||
|
color: var(--text-muted);
|
||||||
|
line-height: 1.6;
|
||||||
|
}
|
||||||
|
|
||||||
|
.contact {
|
||||||
|
padding: clamp(3.5rem, 9vw, 6rem) 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.contact-inner {
|
||||||
|
text-align: center;
|
||||||
|
max-width: 36rem;
|
||||||
|
margin-inline: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.contact-inner h2 {
|
||||||
|
margin: 0 0 0.75rem;
|
||||||
|
font-family: var(--font-display);
|
||||||
|
font-size: 1.85rem;
|
||||||
|
font-weight: 400;
|
||||||
|
}
|
||||||
|
|
||||||
|
.contact-inner > p {
|
||||||
|
margin: 0 0 1.75rem;
|
||||||
|
color: var(--text-muted);
|
||||||
|
font-size: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.contact-details {
|
||||||
|
text-align: left;
|
||||||
|
margin-top: 0.25rem;
|
||||||
|
padding: 1.35rem 1.5rem;
|
||||||
|
border-radius: var(--radius);
|
||||||
|
border: 1px solid var(--border);
|
||||||
|
background: var(--bg-card);
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.contact-block {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 3.25rem 1fr;
|
||||||
|
gap: 0.65rem 1rem;
|
||||||
|
align-items: start;
|
||||||
|
padding-block: 0.85rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.contact-block + .contact-block {
|
||||||
|
border-top: 1px solid rgba(255, 255, 255, 0.06);
|
||||||
|
}
|
||||||
|
|
||||||
|
.contact-label {
|
||||||
|
font-size: 0.78rem;
|
||||||
|
font-weight: 600;
|
||||||
|
letter-spacing: 0.08em;
|
||||||
|
color: var(--accent-teal);
|
||||||
|
padding-top: 0.2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.contact-address {
|
||||||
|
margin: 0;
|
||||||
|
font-size: 0.95rem;
|
||||||
|
font-style: normal;
|
||||||
|
line-height: 1.65;
|
||||||
|
color: var(--text-muted);
|
||||||
|
}
|
||||||
|
|
||||||
|
.contact-phone {
|
||||||
|
font-size: 1.05rem;
|
||||||
|
font-weight: 600;
|
||||||
|
font-variant-numeric: tabular-nums;
|
||||||
|
letter-spacing: 0.04em;
|
||||||
|
color: var(--text);
|
||||||
|
}
|
||||||
|
|
||||||
|
.contact-phone:hover {
|
||||||
|
color: var(--accent-teal);
|
||||||
|
}
|
||||||
|
|
||||||
|
.contact-email-line {
|
||||||
|
margin: 0;
|
||||||
|
font-size: 0.95rem;
|
||||||
|
line-height: 1.55;
|
||||||
|
}
|
||||||
|
|
||||||
|
.contact-mail {
|
||||||
|
font-weight: 600;
|
||||||
|
color: var(--accent-teal);
|
||||||
|
}
|
||||||
|
|
||||||
|
.contact-email-note {
|
||||||
|
display: block;
|
||||||
|
margin-top: 0.35rem;
|
||||||
|
font-size: 0.82rem;
|
||||||
|
font-weight: 400;
|
||||||
|
color: var(--text-muted);
|
||||||
|
opacity: 0.9;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 480px) {
|
||||||
|
.contact-block {
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
gap: 0.35rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.contact-label {
|
||||||
|
padding-top: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.site-footer {
|
||||||
|
padding: 1.5rem 0 2rem;
|
||||||
|
border-top: 1px solid var(--border);
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer-inner {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 0.5rem;
|
||||||
|
font-size: 0.82rem;
|
||||||
|
color: var(--text-muted);
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: 640px) {
|
||||||
|
.footer-inner {
|
||||||
|
flex-direction: row;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.footer-note {
|
||||||
|
opacity: 0.75;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
81
src/styles/global.css
Normal file
81
src/styles/global.css
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
:root {
|
||||||
|
--bg-deep: #07090d;
|
||||||
|
--bg-card: rgba(18, 22, 32, 0.72);
|
||||||
|
--bg-card-hover: rgba(24, 30, 45, 0.88);
|
||||||
|
--border: rgba(255, 255, 255, 0.08);
|
||||||
|
--text: rgba(245, 243, 238, 0.94);
|
||||||
|
--text-muted: rgba(200, 196, 186, 0.72);
|
||||||
|
--accent-warm: #d4a574;
|
||||||
|
--accent-teal: #3dd6c6;
|
||||||
|
--accent-violet: #9b8cff;
|
||||||
|
--glow-warm: rgba(212, 165, 116, 0.15);
|
||||||
|
--glow-teal: rgba(61, 214, 198, 0.12);
|
||||||
|
--font-display: "ZCOOL XiaoWei", "Noto Serif SC", serif;
|
||||||
|
--font-body: "Noto Sans SC", system-ui, sans-serif;
|
||||||
|
--radius: 16px;
|
||||||
|
--ease: cubic-bezier(0.22, 1, 0.36, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
*,
|
||||||
|
*::before,
|
||||||
|
*::after {
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
html {
|
||||||
|
scroll-behavior: smooth;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
min-height: 100vh;
|
||||||
|
font-family: var(--font-body);
|
||||||
|
font-size: 1rem;
|
||||||
|
line-height: 1.65;
|
||||||
|
color: var(--text);
|
||||||
|
background: var(--bg-deep);
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
}
|
||||||
|
|
||||||
|
body::before {
|
||||||
|
content: "";
|
||||||
|
position: fixed;
|
||||||
|
inset: 0;
|
||||||
|
pointer-events: none;
|
||||||
|
background:
|
||||||
|
radial-gradient(ellipse 80% 50% at 50% -20%, var(--glow-warm), transparent 55%),
|
||||||
|
radial-gradient(ellipse 60% 40% at 100% 30%, var(--glow-teal), transparent 50%),
|
||||||
|
linear-gradient(180deg, #0a0d12 0%, var(--bg-deep) 45%);
|
||||||
|
z-index: -2;
|
||||||
|
}
|
||||||
|
|
||||||
|
body::after {
|
||||||
|
content: "";
|
||||||
|
position: fixed;
|
||||||
|
inset: 0;
|
||||||
|
pointer-events: none;
|
||||||
|
opacity: 0.35;
|
||||||
|
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 256 256' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.06'/%3E%3C/svg%3E");
|
||||||
|
z-index: -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
color: var(--accent-teal);
|
||||||
|
text-decoration: none;
|
||||||
|
transition: opacity 0.2s var(--ease);
|
||||||
|
}
|
||||||
|
|
||||||
|
a:hover {
|
||||||
|
opacity: 0.85;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wrap {
|
||||||
|
width: min(1120px, calc(100% - 3rem));
|
||||||
|
margin-inline: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 640px) {
|
||||||
|
.wrap {
|
||||||
|
width: calc(100% - 1.75rem);
|
||||||
|
}
|
||||||
|
}
|
||||||
3
tsconfig.json
Normal file
3
tsconfig.json
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"extends": "astro/tsconfigs/strict"
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user