diff --git a/CONTEXT.md b/CONTEXT.md index 8c84a89..2ae995f 100644 --- a/CONTEXT.md +++ b/CONTEXT.md @@ -159,6 +159,7 @@ Novalon 的 6 个核心产品,互为互补关系,常以组合形式出现在 | 生产部署模式 | 2026-08 切换为混合渲染:`next.config.mjs` 使用 `output: 'standalone'`,`Dockerfile.prod` + `docker-compose.server.yml` 启动 Next.js 容器,Nginx 托管静态资源并代理 `/api/*`、`/admin/*`、ISR 回源;生产 SQLite 位于 `data/prod.db`,通过 `DATABASE_URL=file:/app/data/prod.db` 与 `PRISMA_QUERY_ENGINE_LIBRARY` 运行 | ✅ 2026-08 确认 | | 动效强度 | 体验级全场景动效叙事(Porsche Consulting水准,但克制不炫技) | ✅ 2026-06-29 确认 | | 排版方向 | Accenture信息密度 + Bain标题对比 + Porsche图文节奏的融合方案 | ✅ 2026-06-29 确认 | +| 品牌故事页品牌名 | 使用与 footer Logo 完全相同的青柳隶书 SVG path(`BrandCalligraphyName`),不加载 4.4MB 的 AoyagiReisho 字体文件,兼顾品牌一致性与性能 | ✅ 2026-08-18 确认 | ## 页面类型与四层映射 diff --git a/public/logo.svg b/public/logo.svg index aebc640..b24b423 100644 --- a/public/logo.svg +++ b/public/logo.svg @@ -51,17 +51,10 @@ - - - - + + diff --git a/src/app/(marketing)/about/brand/brand-content.tsx b/src/app/(marketing)/about/brand/brand-content.tsx index 36530fc..146b470 100644 --- a/src/app/(marketing)/about/brand/brand-content.tsx +++ b/src/app/(marketing)/about/brand/brand-content.tsx @@ -2,6 +2,7 @@ import { motion } from 'framer-motion'; import { ScrollReveal } from '@/components/ui/scroll-reveal'; +import { BrandCalligraphyName } from '@/components/ui/brand-calligraphy-name'; import { ArrowRight, Target, @@ -91,11 +92,15 @@ export default function BrandContent() { initial={{ opacity: 0, y: 40 }} animate={{ opacity: 1, y: 0 }} transition={{ duration: 0.8, delay: 0.2, ease: EASE_OUT }} - className="text-4xl sm:text-5xl md:text-6xl lg:text-7xl xl:text-8xl font-black text-ink leading-[0.92] tracking-tightest mb-8 sm:mb-10" + className="text-4xl sm:text-5xl md:text-6xl lg:text-7xl xl:text-8xl text-ink leading-[1.05] tracking-tight mb-8 sm:mb-10" > - 睿新致远 + 睿新致遠 +
- 以技术驱动业务增长 + 以技术驱动业务增长 {/* 数据条 */} diff --git a/src/components/ui/brand-calligraphy-name.test.tsx b/src/components/ui/brand-calligraphy-name.test.tsx new file mode 100644 index 0000000..40dde0b --- /dev/null +++ b/src/components/ui/brand-calligraphy-name.test.tsx @@ -0,0 +1,31 @@ +import { describe, it, expect } from '@jest/globals'; +import { render } from '@testing-library/react'; +import '@testing-library/jest-dom'; +import { BrandCalligraphyName } from './brand-calligraphy-name'; + +describe('BrandCalligraphyName', () => { + it('renders the four calligraphy glyph paths from the logo asset', () => { + const { container } = render(); + const svg = container.querySelector('svg'); + expect(svg).toBeInTheDocument(); + expect(svg).toHaveAttribute('viewBox', '0 -40 200 48'); + expect(svg!.querySelectorAll('path')).toHaveLength(4); + expect(svg!.querySelectorAll('path')[0]!.getAttribute('d')).toContain('M 378.00 62.00'); + expect(svg!.querySelectorAll('path')[3]!.getAttribute('d')).toContain('M 799.00 85.00'); + }); + + it('is exposed as an image with a brand label by default', () => { + const { container } = render(); + const svg = container.querySelector('svg'); + expect(svg).toHaveAttribute('role', 'img'); + expect(svg).toHaveAttribute('aria-label', '睿新致遠'); + }); + + it('can be hidden from assistive technology when paired with sr-only text', () => { + const { container } = render(); + const svg = container.querySelector('svg'); + expect(svg).toHaveAttribute('aria-hidden', 'true'); + expect(svg).not.toHaveAttribute('role'); + expect(svg).not.toHaveAttribute('aria-label'); + }); +}); diff --git a/src/components/ui/brand-calligraphy-name.tsx b/src/components/ui/brand-calligraphy-name.tsx new file mode 100644 index 0000000..70e30e4 --- /dev/null +++ b/src/components/ui/brand-calligraphy-name.tsx @@ -0,0 +1,42 @@ +/** + * 品牌书法字标「睿新致遠」 + * + * 直接复用 public/logo.svg 中与 footer logo(logo-white.svg)完全相同的青柳隶书 SVG path, + * 不依赖外部字体文件,保证与 footer Logo 字形一致。 + */ +export function BrandCalligraphyName({ + className, + ariaLabel = '睿新致遠', + ariaHidden = false, +}: { + className?: string; + ariaLabel?: string; + ariaHidden?: boolean; +}) { + return ( + + + + + + + + + + + + + + + ); +} + +export default BrandCalligraphyName;