Add Astro landing site for 和光同坤 with logo, contact, and gitignore

Made-with: Cursor
This commit is contained in:
zaikun xu
2026-04-03 11:08:05 +08:00
parent c3349ef410
commit be26d87075
13 changed files with 5933 additions and 1 deletions

24
.gitignore vendored Normal file
View 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

View File

@@ -1,2 +1 @@
# HeguangtongkunLanding
# HeguangtongkunLanding

6
astro.config.mjs Normal file
View 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

File diff suppressed because it is too large Load Diff

16
package.json Normal file
View 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
View 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
View 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

View 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
View File

@@ -0,0 +1,2 @@
/// <reference path="../.astro/types.d.ts" />
/// <reference types="astro/client" />

View 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
View 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
View 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
View File

@@ -0,0 +1,3 @@
{
"extends": "astro/tsconfigs/strict"
}