init: 初始化 AssetX 项目仓库
包含 webapp(Next.js 用户端)、webapp-back(Go 后端)、 antdesign(管理后台)、landingpage(营销落地页)、 数据库 SQL 和配置文件。
This commit is contained in:
174
landingpage/styles/design-system.css
Normal file
174
landingpage/styles/design-system.css
Normal file
@@ -0,0 +1,174 @@
|
||||
/**
|
||||
* Design System - CSS Variables
|
||||
*
|
||||
* 定义 Light 和 Dark 模式的 CSS 变量
|
||||
* 使用 [data-theme] 属性选择器来切换主题
|
||||
*/
|
||||
|
||||
/* ========================================
|
||||
Light Mode (Default)
|
||||
======================================== */
|
||||
|
||||
:root {
|
||||
/* Text Colors */
|
||||
--text-primary: #111827;
|
||||
--text-secondary: #4b5563;
|
||||
--text-tertiary: #9ca1af;
|
||||
--text-inverse: #ffffff;
|
||||
--text-disabled: #d1d5db;
|
||||
|
||||
/* Background Colors */
|
||||
--bg-base: #ffffff;
|
||||
--bg-subtle: #f9fafb;
|
||||
--bg-surface: #ffffff;
|
||||
--bg-elevated: #f3f4f6;
|
||||
--bg-overlay: rgba(0, 0, 0, 0.5);
|
||||
|
||||
/* Border Colors */
|
||||
--border-normal: #e5e7eb;
|
||||
--border-subtle: #f3f4f6;
|
||||
--border-strong: #d1d5db;
|
||||
|
||||
/* Accent Colors */
|
||||
--accent-green: #10b981;
|
||||
--accent-green-bg: #e1f8ec;
|
||||
--accent-blue: #1447e6;
|
||||
--accent-blue-bg: #ebf2ff;
|
||||
--accent-red: #ef4444;
|
||||
--accent-yellow: #f59e0b;
|
||||
|
||||
/* Special Colors */
|
||||
--special-black: #000000;
|
||||
--special-white: #ffffff;
|
||||
}
|
||||
|
||||
/* ========================================
|
||||
Dark Mode
|
||||
======================================== */
|
||||
|
||||
[data-theme="dark"] {
|
||||
/* Text Colors */
|
||||
--text-primary: #fafafa;
|
||||
--text-secondary: #a1a1aa;
|
||||
--text-tertiary: #71717a;
|
||||
--text-inverse: #111827;
|
||||
--text-disabled: #71717a;
|
||||
|
||||
/* Background Colors */
|
||||
--bg-base: #0a0a0a;
|
||||
--bg-subtle: #0a0a0a;
|
||||
--bg-surface: #18181b;
|
||||
--bg-elevated: #27272a;
|
||||
--bg-overlay: rgba(0, 0, 0, 0.7);
|
||||
|
||||
/* Border Colors */
|
||||
--border-normal: #27272a;
|
||||
--border-subtle: #18181b;
|
||||
--border-strong: #3f3f46;
|
||||
|
||||
/* Accent Colors */
|
||||
--accent-green: #10b981;
|
||||
--accent-green-bg: rgba(16, 185, 129, 0.15);
|
||||
--accent-blue: #1447e6;
|
||||
--accent-blue-bg: rgba(20, 71, 230, 0.15);
|
||||
--accent-red: #ef4444;
|
||||
--accent-yellow: #f59e0b;
|
||||
|
||||
/* Special Colors */
|
||||
--special-black: #000000;
|
||||
--special-white: #ffffff;
|
||||
}
|
||||
|
||||
/* ========================================
|
||||
Typography - Font Sizes
|
||||
======================================== */
|
||||
|
||||
:root {
|
||||
/* Serif Display */
|
||||
--serif--display--giant--bold: 100px;
|
||||
--serif--display--giant--regular: 100px;
|
||||
--serif--display--hero--bold: 64px;
|
||||
--serif--display--hero--regular: 64px;
|
||||
--serif--display--title-1--bold: 48px;
|
||||
--serif--display--title-1--regular: 48px;
|
||||
--serif--display--title-2--bold: 32px;
|
||||
--serif--display--title-2--regular: 32px;
|
||||
--serif--display--quote--bold: 24px;
|
||||
--serif--display--quote--regular: 24px;
|
||||
--serif--display--text--bold: 16px;
|
||||
--serif--display--text--regular: 16px;
|
||||
|
||||
/* Sans Heading */
|
||||
--sans--heading--h1--bold: 48px;
|
||||
--sans--heading--h1--medium: 48px;
|
||||
--sans--heading--h1--regular: 48px;
|
||||
--sans--heading--h2--bold: 32px;
|
||||
--sans--heading--h2--medium: 32px;
|
||||
--sans--heading--h2--regular: 32px;
|
||||
--sans--heading--h3--bold: 24px;
|
||||
--sans--heading--h3--medium: 24px;
|
||||
--sans--heading--h3--regular: 24px;
|
||||
--sans--heading--h4--bold: 20px;
|
||||
--sans--heading--h4--medium: 20px;
|
||||
--sans--heading--h4--regular: 20px;
|
||||
|
||||
/* Sans Body */
|
||||
--sans--body--large--bold: 18px;
|
||||
--sans--body--large--medium: 18px;
|
||||
--sans--body--large--regular: 18px;
|
||||
--sans--body--default--bold: 16px;
|
||||
--sans--body--default--medium: 16px;
|
||||
--sans--body--default--regular: 16px;
|
||||
--sans--body--small--bold: 14px;
|
||||
--sans--body--small--medium: 14px;
|
||||
--sans--body--small--regular: 14px;
|
||||
|
||||
/* Sans Caption */
|
||||
--sans--caption--tiny--bold: 12px;
|
||||
--sans--caption--tiny--medium: 12px;
|
||||
--sans--caption--tiny--regular: 12px;
|
||||
--sans--caption--minuscule--bold: 10px;
|
||||
--sans--caption--minuscule--medium: 10px;
|
||||
--sans--caption--minuscule--regular: 10px;
|
||||
|
||||
/* Mono Numeric */
|
||||
--mono--numeric--giant--extra-bold: 48px;
|
||||
--mono--numeric--giant--bold: 48px;
|
||||
--mono--numeric--giant--medium: 48px;
|
||||
--mono--numeric--giant--regular: 48px;
|
||||
--mono--numeric--huge--extra-bold: 32px;
|
||||
--mono--numeric--huge--bold: 32px;
|
||||
--mono--numeric--huge--medium: 32px;
|
||||
--mono--numeric--huge--regular: 32px;
|
||||
--mono--numeric--large--extra-bold: 24px;
|
||||
--mono--numeric--large--bold: 24px;
|
||||
--mono--numeric--large--medium: 24px;
|
||||
--mono--numeric--large--regular: 24px;
|
||||
--mono--numeric--default--extra-bold: 16px;
|
||||
--mono--numeric--default--bold: 16px;
|
||||
--mono--numeric--default--medium: 16px;
|
||||
--mono--numeric--default--regular: 16px;
|
||||
|
||||
/* Mono Code */
|
||||
--mono--code--small--extra-bold: 14px;
|
||||
--mono--code--small--bold: 14px;
|
||||
--mono--code--small--medium: 14px;
|
||||
--mono--code--small--regular: 14px;
|
||||
--mono--code--tiny--extra-bold: 12px;
|
||||
--mono--code--tiny--bold: 12px;
|
||||
--mono--code--tiny--medium: 12px;
|
||||
--mono--code--tiny--regular: 12px;
|
||||
--mono--code--minuscule--extra-bold: 10px;
|
||||
--mono--code--minuscule--bold: 10px;
|
||||
--mono--code--minuscule--medium: 10px;
|
||||
--mono--code--minuscule--regular: 10px;
|
||||
}
|
||||
|
||||
/* ========================================
|
||||
Utility Classes (Optional)
|
||||
======================================== */
|
||||
|
||||
/*
|
||||
* 如果需要,可以定义一些通用的 utility classes
|
||||
* 但主要还是通过 Tailwind 的扩展配置来使用这些变量
|
||||
*/
|
||||
17
landingpage/styles/tokens/index.ts
Normal file
17
landingpage/styles/tokens/index.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
/**
|
||||
* Design System - Tokens Index
|
||||
*
|
||||
* 统一导出所有设计 tokens
|
||||
*/
|
||||
|
||||
export { primitives } from './primitives';
|
||||
export { semanticTokens, lightTokens, darkTokens } from './semantic-tokens';
|
||||
export { radius } from './radius';
|
||||
export { spacing } from './spacing';
|
||||
export { typography } from './typography';
|
||||
|
||||
export type { PrimitiveColors } from './primitives';
|
||||
export type { SemanticTokens, LightTokens, DarkTokens } from './semantic-tokens';
|
||||
export type { Radius } from './radius';
|
||||
export type { Spacing } from './spacing';
|
||||
export type { Typography } from './typography';
|
||||
75
landingpage/styles/tokens/primitives.ts
Normal file
75
landingpage/styles/tokens/primitives.ts
Normal file
@@ -0,0 +1,75 @@
|
||||
/**
|
||||
* Design System - Primitive Colors
|
||||
*
|
||||
* 原始色板定义,包含所有基础颜色值
|
||||
* 这些值直接映射到设计规范中的颜色
|
||||
*/
|
||||
|
||||
export const primitives = {
|
||||
// 基础色
|
||||
base: {
|
||||
1: '#ffffff',
|
||||
10: '#222222',
|
||||
12: '#000000',
|
||||
},
|
||||
|
||||
// 品牌色系(灰度)
|
||||
brand: {
|
||||
1: '#fcfcfd',
|
||||
2: '#f9fafb',
|
||||
3: '#f3f4f6',
|
||||
4: '#e5e7eb',
|
||||
5: '#d1d5db',
|
||||
6: '#9ca1af',
|
||||
7: '#6b7280',
|
||||
8: '#4b5563',
|
||||
9: '#374151',
|
||||
10: '#1f2937',
|
||||
11: '#111827',
|
||||
12: '#030712',
|
||||
},
|
||||
|
||||
// 绿色系(成功/强调)
|
||||
green: {
|
||||
1: '#e1f8ec',
|
||||
9: '#10b981',
|
||||
10: '#00ad76',
|
||||
11: '#008352',
|
||||
},
|
||||
|
||||
// 蓝色系(链接/强调)
|
||||
blue: {
|
||||
1: '#ebf2ff',
|
||||
9: '#1447e6',
|
||||
10: '#0d3cc7',
|
||||
11: '#0831a8',
|
||||
},
|
||||
|
||||
// 红色系(警告/错误)
|
||||
red: {
|
||||
9: '#ef4444',
|
||||
10: '#dc2626',
|
||||
11: '#b91c1c',
|
||||
},
|
||||
|
||||
// 黄色系(警告)
|
||||
yellow: {
|
||||
9: '#f59e0b',
|
||||
10: '#d97706',
|
||||
11: '#b45309',
|
||||
},
|
||||
|
||||
// Dark Mode 专用色
|
||||
dark: {
|
||||
zinc: {
|
||||
50: '#fafafa',
|
||||
400: '#a1a1aa',
|
||||
500: '#71717a',
|
||||
800: '#27272a',
|
||||
900: '#18181b',
|
||||
950: '#0a0a0a',
|
||||
},
|
||||
},
|
||||
} as const;
|
||||
|
||||
export type PrimitiveColors = typeof primitives;
|
||||
19
landingpage/styles/tokens/radius.ts
Normal file
19
landingpage/styles/tokens/radius.ts
Normal file
@@ -0,0 +1,19 @@
|
||||
/**
|
||||
* Design System - Border Radius
|
||||
*
|
||||
* 圆角规范定义
|
||||
*/
|
||||
|
||||
export const radius = {
|
||||
none: '0',
|
||||
sm: '0.125rem', // 2px
|
||||
base: '0.25rem', // 4px
|
||||
md: '0.375rem', // 6px
|
||||
lg: '0.5rem', // 8px
|
||||
xl: '0.75rem', // 12px
|
||||
'2xl': '1rem', // 16px
|
||||
'3xl': '1.5rem', // 24px
|
||||
full: '9999px', // 圆形
|
||||
} as const;
|
||||
|
||||
export type Radius = typeof radius;
|
||||
102
landingpage/styles/tokens/semantic-tokens.ts
Normal file
102
landingpage/styles/tokens/semantic-tokens.ts
Normal file
@@ -0,0 +1,102 @@
|
||||
/**
|
||||
* Design System - Semantic Tokens
|
||||
*
|
||||
* 语义化颜色 tokens,定义 Light 和 Dark 模式下的颜色用途
|
||||
* 组件应该使用这些语义化的名称,而不是直接使用原始色板
|
||||
*/
|
||||
|
||||
import { primitives } from './primitives';
|
||||
|
||||
/**
|
||||
* Light Mode Semantic Tokens
|
||||
*/
|
||||
export const lightTokens = {
|
||||
text: {
|
||||
primary: primitives.brand[11], // #111827 - 主要文本
|
||||
secondary: primitives.brand[8], // #4b5563 - 次要文本
|
||||
tertiary: primitives.brand[6], // #9ca1af - 辅助文本
|
||||
inverse: primitives.base[1], // #ffffff - 反色文本(深色背景上)
|
||||
disabled: primitives.brand[5], // #d1d5db - 禁用文本
|
||||
},
|
||||
|
||||
bg: {
|
||||
base: primitives.base[1], // #ffffff - 主背景
|
||||
subtle: primitives.brand[2], // #f9fafb - 次级背景
|
||||
surface: primitives.base[1], // #ffffff - 卡片/表面背景
|
||||
elevated: primitives.brand[3], // #f3f4f6 - 提升背景
|
||||
overlay: 'rgba(0, 0, 0, 0.5)', // 遮罩层
|
||||
},
|
||||
|
||||
border: {
|
||||
normal: primitives.brand[4], // #e5e7eb - 标准边框
|
||||
subtle: primitives.brand[3], // #f3f4f6 - 微妙边框
|
||||
strong: primitives.brand[5], // #d1d5db - 强调边框
|
||||
},
|
||||
|
||||
accent: {
|
||||
green: primitives.green[9], // #10b981 - 绿色强调
|
||||
greenBg: primitives.green[1], // #e1f8ec - 绿色背景
|
||||
blue: primitives.blue[9], // #1447e6 - 蓝色强调
|
||||
blueBg: primitives.blue[1], // #ebf2ff - 蓝色背景
|
||||
red: primitives.red[9], // #ef4444 - 红色强调
|
||||
yellow: primitives.yellow[9], // #f59e0b - 黄色强调
|
||||
},
|
||||
|
||||
special: {
|
||||
black: primitives.base[12], // #000000 - 纯黑(特殊用途)
|
||||
white: primitives.base[1], // #ffffff - 纯白(特殊用途)
|
||||
},
|
||||
} as const;
|
||||
|
||||
/**
|
||||
* Dark Mode Semantic Tokens
|
||||
*/
|
||||
export const darkTokens = {
|
||||
text: {
|
||||
primary: primitives.dark.zinc[50], // #fafafa - 主要文本
|
||||
secondary: primitives.dark.zinc[400], // #a1a1aa - 次要文本
|
||||
tertiary: primitives.dark.zinc[500], // #71717a - 辅助文本
|
||||
inverse: primitives.brand[11], // #111827 - 反色文本(浅色背景上)
|
||||
disabled: primitives.dark.zinc[500], // #71717a - 禁用文本
|
||||
},
|
||||
|
||||
bg: {
|
||||
base: primitives.dark.zinc[950], // #0a0a0a - 主背景
|
||||
subtle: primitives.dark.zinc[950], // #0a0a0a - 次级背景
|
||||
surface: primitives.dark.zinc[900], // #18181b - 卡片/表面背景
|
||||
elevated: primitives.dark.zinc[800], // #27272a - 提升背景
|
||||
overlay: 'rgba(0, 0, 0, 0.7)', // 遮罩层
|
||||
},
|
||||
|
||||
border: {
|
||||
normal: primitives.dark.zinc[800], // #27272a - 标准边框
|
||||
subtle: primitives.dark.zinc[900], // #18181b - 微妙边框
|
||||
strong: '#3f3f46', // 强调边框
|
||||
},
|
||||
|
||||
accent: {
|
||||
green: primitives.green[9], // #10b981 - 绿色强调(保持一致)
|
||||
greenBg: 'rgba(16, 185, 129, 0.15)', // 绿色背景(透明)
|
||||
blue: primitives.blue[9], // #1447e6 - 蓝色强调(保持一致)
|
||||
blueBg: 'rgba(20, 71, 230, 0.15)', // 蓝色背景(透明)
|
||||
red: primitives.red[9], // #ef4444 - 红色强调
|
||||
yellow: primitives.yellow[9], // #f59e0b - 黄色强调
|
||||
},
|
||||
|
||||
special: {
|
||||
black: primitives.base[12], // #000000 - 纯黑(特殊用途)
|
||||
white: primitives.base[1], // #ffffff - 纯白(特殊用途)
|
||||
},
|
||||
} as const;
|
||||
|
||||
/**
|
||||
* 导出统一的 semantic tokens 结构
|
||||
*/
|
||||
export const semanticTokens = {
|
||||
light: lightTokens,
|
||||
dark: darkTokens,
|
||||
} as const;
|
||||
|
||||
export type SemanticTokens = typeof semanticTokens;
|
||||
export type LightTokens = typeof lightTokens;
|
||||
export type DarkTokens = typeof darkTokens;
|
||||
24
landingpage/styles/tokens/spacing.ts
Normal file
24
landingpage/styles/tokens/spacing.ts
Normal file
@@ -0,0 +1,24 @@
|
||||
/**
|
||||
* Design System - Spacing
|
||||
*
|
||||
* 间距规范定义
|
||||
*/
|
||||
|
||||
export const spacing = {
|
||||
0: '0',
|
||||
1: '0.25rem', // 4px
|
||||
2: '0.5rem', // 8px
|
||||
3: '0.75rem', // 12px
|
||||
4: '1rem', // 16px
|
||||
5: '1.25rem', // 20px
|
||||
6: '1.5rem', // 24px
|
||||
8: '2rem', // 32px
|
||||
10: '2.5rem', // 40px
|
||||
12: '3rem', // 48px
|
||||
16: '4rem', // 64px
|
||||
20: '5rem', // 80px
|
||||
24: '6rem', // 96px
|
||||
32: '8rem', // 128px
|
||||
} as const;
|
||||
|
||||
export type Spacing = typeof spacing;
|
||||
178
landingpage/styles/tokens/typography.ts
Normal file
178
landingpage/styles/tokens/typography.ts
Normal file
@@ -0,0 +1,178 @@
|
||||
/**
|
||||
* Design System - Typography Tokens
|
||||
*
|
||||
* 字体大小和样式规范定义
|
||||
*/
|
||||
|
||||
/**
|
||||
* Serif Display 系列 (Domine/Noto Serif)
|
||||
* 用于大标题、引用等展示性文本
|
||||
*/
|
||||
export const serifDisplay = {
|
||||
giant: {
|
||||
bold: { fontSize: '100px', lineHeight: '100%', fontWeight: '700', letterSpacing: '-0.03em' },
|
||||
regular: { fontSize: '100px', lineHeight: '100%', fontWeight: '400', letterSpacing: '-0.03em' },
|
||||
},
|
||||
hero: {
|
||||
bold: { fontSize: '64px', lineHeight: '110%', fontWeight: '700', letterSpacing: '-0.02em' },
|
||||
regular: { fontSize: '64px', lineHeight: '110%', fontWeight: '400', letterSpacing: '-0.02em' },
|
||||
},
|
||||
title1: {
|
||||
bold: { fontSize: '48px', lineHeight: '120%', fontWeight: '700', letterSpacing: '-0.01em' },
|
||||
regular: { fontSize: '48px', lineHeight: '120%', fontWeight: '400', letterSpacing: '-0.01em' },
|
||||
},
|
||||
title2: {
|
||||
bold: { fontSize: '32px', lineHeight: '120%', fontWeight: '700', letterSpacing: '-0.01em' },
|
||||
regular: { fontSize: '32px', lineHeight: '120%', fontWeight: '400', letterSpacing: '-0.01em' },
|
||||
},
|
||||
quote: {
|
||||
bold: { fontSize: '24px', lineHeight: '130%', fontWeight: '700', letterSpacing: '-0.005em' },
|
||||
regular: { fontSize: '24px', lineHeight: '130%', fontWeight: '400', letterSpacing: '-0.005em' },
|
||||
},
|
||||
text: {
|
||||
bold: { fontSize: '16px', lineHeight: '150%', fontWeight: '700' },
|
||||
regular: { fontSize: '16px', lineHeight: '150%', fontWeight: '400' },
|
||||
},
|
||||
} as const;
|
||||
|
||||
/**
|
||||
* Sans Heading 系列 (Inter/Noto Sans)
|
||||
* 用于标题和子标题
|
||||
*/
|
||||
export const sansHeading = {
|
||||
h1: {
|
||||
bold: { fontSize: '48px', lineHeight: '120%', fontWeight: '700', letterSpacing: '-0.01em' },
|
||||
medium: { fontSize: '48px', lineHeight: '120%', fontWeight: '500', letterSpacing: '-0.01em' },
|
||||
regular: { fontSize: '48px', lineHeight: '120%', fontWeight: '400', letterSpacing: '-0.01em' },
|
||||
},
|
||||
h2: {
|
||||
bold: { fontSize: '32px', lineHeight: '120%', fontWeight: '700', letterSpacing: '-0.01em' },
|
||||
medium: { fontSize: '32px', lineHeight: '120%', fontWeight: '500', letterSpacing: '-0.01em' },
|
||||
regular: { fontSize: '32px', lineHeight: '120%', fontWeight: '400', letterSpacing: '-0.01em' },
|
||||
},
|
||||
h3: {
|
||||
bold: { fontSize: '24px', lineHeight: '130%', fontWeight: '700', letterSpacing: '-0.005em' },
|
||||
medium: { fontSize: '24px', lineHeight: '130%', fontWeight: '500', letterSpacing: '-0.005em' },
|
||||
regular: { fontSize: '24px', lineHeight: '130%', fontWeight: '400', letterSpacing: '-0.005em' },
|
||||
},
|
||||
h4: {
|
||||
bold: { fontSize: '20px', lineHeight: '140%', fontWeight: '700' },
|
||||
medium: { fontSize: '20px', lineHeight: '140%', fontWeight: '500' },
|
||||
regular: { fontSize: '20px', lineHeight: '140%', fontWeight: '400' },
|
||||
},
|
||||
} as const;
|
||||
|
||||
/**
|
||||
* Sans Body 系列
|
||||
* 用于正文和段落文本
|
||||
*/
|
||||
export const sansBody = {
|
||||
large: {
|
||||
bold: { fontSize: '18px', lineHeight: '150%', fontWeight: '700' },
|
||||
medium: { fontSize: '18px', lineHeight: '150%', fontWeight: '500' },
|
||||
regular: { fontSize: '18px', lineHeight: '150%', fontWeight: '400' },
|
||||
},
|
||||
default: {
|
||||
bold: { fontSize: '16px', lineHeight: '150%', fontWeight: '700' },
|
||||
medium: { fontSize: '16px', lineHeight: '150%', fontWeight: '500' },
|
||||
regular: { fontSize: '16px', lineHeight: '150%', fontWeight: '400' },
|
||||
},
|
||||
small: {
|
||||
bold: { fontSize: '14px', lineHeight: '150%', fontWeight: '700' },
|
||||
medium: { fontSize: '14px', lineHeight: '150%', fontWeight: '500' },
|
||||
regular: { fontSize: '14px', lineHeight: '150%', fontWeight: '400' },
|
||||
},
|
||||
} as const;
|
||||
|
||||
/**
|
||||
* Sans Caption 系列
|
||||
* 用于说明文字、标签等小字
|
||||
*/
|
||||
export const sansCaption = {
|
||||
tiny: {
|
||||
bold: { fontSize: '12px', lineHeight: '150%', fontWeight: '700', letterSpacing: '0.01em' },
|
||||
medium: { fontSize: '12px', lineHeight: '150%', fontWeight: '500', letterSpacing: '0.01em' },
|
||||
regular: { fontSize: '12px', lineHeight: '150%', fontWeight: '400', letterSpacing: '0.01em' },
|
||||
},
|
||||
minuscule: {
|
||||
bold: { fontSize: '10px', lineHeight: '150%', fontWeight: '700', letterSpacing: '0.02em' },
|
||||
medium: { fontSize: '10px', lineHeight: '150%', fontWeight: '500', letterSpacing: '0.02em' },
|
||||
regular: { fontSize: '10px', lineHeight: '150%', fontWeight: '400', letterSpacing: '0.02em' },
|
||||
},
|
||||
} as const;
|
||||
|
||||
/**
|
||||
* Mono Numeric 系列 (JetBrains Mono)
|
||||
* 用于数字、统计数据展示
|
||||
*/
|
||||
export const monoNumeric = {
|
||||
giant: {
|
||||
extraBold: { fontSize: '48px', lineHeight: '110%', fontWeight: '800', letterSpacing: '-0.01em' },
|
||||
bold: { fontSize: '48px', lineHeight: '110%', fontWeight: '700', letterSpacing: '-0.01em' },
|
||||
medium: { fontSize: '48px', lineHeight: '110%', fontWeight: '500', letterSpacing: '-0.01em' },
|
||||
regular: { fontSize: '48px', lineHeight: '110%', fontWeight: '400', letterSpacing: '-0.01em' },
|
||||
},
|
||||
huge: {
|
||||
extraBold: { fontSize: '32px', lineHeight: '120%', fontWeight: '800', letterSpacing: '-0.005em' },
|
||||
bold: { fontSize: '32px', lineHeight: '120%', fontWeight: '700', letterSpacing: '-0.005em' },
|
||||
medium: { fontSize: '32px', lineHeight: '120%', fontWeight: '500', letterSpacing: '-0.005em' },
|
||||
regular: { fontSize: '32px', lineHeight: '120%', fontWeight: '400', letterSpacing: '-0.005em' },
|
||||
},
|
||||
large: {
|
||||
extraBold: { fontSize: '24px', lineHeight: '130%', fontWeight: '800' },
|
||||
bold: { fontSize: '24px', lineHeight: '130%', fontWeight: '700' },
|
||||
medium: { fontSize: '24px', lineHeight: '130%', fontWeight: '500' },
|
||||
regular: { fontSize: '24px', lineHeight: '130%', fontWeight: '400' },
|
||||
},
|
||||
default: {
|
||||
extraBold: { fontSize: '16px', lineHeight: '140%', fontWeight: '800' },
|
||||
bold: { fontSize: '16px', lineHeight: '140%', fontWeight: '700' },
|
||||
medium: { fontSize: '16px', lineHeight: '140%', fontWeight: '500' },
|
||||
regular: { fontSize: '16px', lineHeight: '140%', fontWeight: '400' },
|
||||
},
|
||||
} as const;
|
||||
|
||||
/**
|
||||
* Mono Code 系列
|
||||
* 用于代码、技术文本
|
||||
*/
|
||||
export const monoCode = {
|
||||
small: {
|
||||
extraBold: { fontSize: '14px', lineHeight: '150%', fontWeight: '800' },
|
||||
bold: { fontSize: '14px', lineHeight: '150%', fontWeight: '700' },
|
||||
medium: { fontSize: '14px', lineHeight: '150%', fontWeight: '500' },
|
||||
regular: { fontSize: '14px', lineHeight: '150%', fontWeight: '400' },
|
||||
},
|
||||
tiny: {
|
||||
extraBold: { fontSize: '12px', lineHeight: '150%', fontWeight: '800' },
|
||||
bold: { fontSize: '12px', lineHeight: '150%', fontWeight: '700' },
|
||||
medium: { fontSize: '12px', lineHeight: '150%', fontWeight: '500' },
|
||||
regular: { fontSize: '12px', lineHeight: '150%', fontWeight: '400' },
|
||||
},
|
||||
minuscule: {
|
||||
extraBold: { fontSize: '10px', lineHeight: '150%', fontWeight: '800' },
|
||||
bold: { fontSize: '10px', lineHeight: '150%', fontWeight: '700' },
|
||||
medium: { fontSize: '10px', lineHeight: '150%', fontWeight: '500' },
|
||||
regular: { fontSize: '10px', lineHeight: '150%', fontWeight: '400' },
|
||||
},
|
||||
} as const;
|
||||
|
||||
/**
|
||||
* 统一导出
|
||||
*/
|
||||
export const typography = {
|
||||
serif: {
|
||||
display: serifDisplay,
|
||||
},
|
||||
sans: {
|
||||
heading: sansHeading,
|
||||
body: sansBody,
|
||||
caption: sansCaption,
|
||||
},
|
||||
mono: {
|
||||
numeric: monoNumeric,
|
||||
code: monoCode,
|
||||
},
|
||||
} as const;
|
||||
|
||||
export type Typography = typeof typography;
|
||||
Reference in New Issue
Block a user