|
| 1 | +# Presentation Design System |
| 2 | + |
| 3 | +所有 JR Academy Presentation 项目统一遵循此设计规范。新建 presentation 时直接复制 `company-intro/src/styles/theme.ts` 和 `company-intro/src/components/ui.tsx` 作为起点。 |
| 4 | + |
| 5 | +--- |
| 6 | + |
| 7 | +## Tech Stack |
| 8 | + |
| 9 | +``` |
| 10 | +React 19 + TypeScript + Vite 8 |
| 11 | +framer-motion (动画) |
| 12 | +styled inline (不用 CSS 文件,全部 inline style) |
| 13 | +``` |
| 14 | + |
| 15 | +**不要用**:styled-components、Tailwind、CSS Modules、任何 UI 库。Presentation 追求零依赖、纯 inline style。 |
| 16 | + |
| 17 | +--- |
| 18 | + |
| 19 | +## 视觉风格:Neo-Brutalism |
| 20 | + |
| 21 | +JR Academy 的品牌风格是 **Neo-Brutalism(新野蛮主义)**,核心特征: |
| 22 | + |
| 23 | +| 特征 | 规则 | |
| 24 | +|------|------| |
| 25 | +| **黑色粗边框** | 所有卡片/按钮: `border: 3px solid #000` | |
| 26 | +| **偏移阴影** | `box-shadow: 6px 6px 0px #000`(大)或 `4px 4px 0px #000`(小)| |
| 27 | +| **Hover 效果** | hover 时阴影消失 + 位移 `transform: translate(4px, 4px)` | |
| 28 | +| **大号粗体标题** | `font-weight: 900`,`clamp()` 响应式字号 | |
| 29 | +| **色块强调** | 重要文字用纯色背景 highlight,如 `<span style={{ background: '#FFDE59', padding: '4px 16px' }}>` | |
| 30 | +| **倾斜元素** | 装饰性色块 `transform: rotate(±3~15deg)` | |
| 31 | +| **无圆角** | 默认不用 `border-radius`(极少数例外) | |
| 32 | + |
| 33 | +--- |
| 34 | + |
| 35 | +## 色板 |
| 36 | + |
| 37 | +```typescript |
| 38 | +export const colors = { |
| 39 | + red: '#ff5757', // JR 品牌主色 |
| 40 | + dark: '#10162f', // 深色背景、按钮 |
| 41 | + yellow: '#FFDE59', // 强调、高亮 |
| 42 | + green: '#7ED957', // 成功、数据 |
| 43 | + blue: '#38B6FF', // 信息、链接 |
| 44 | + purple: '#CB6CE6', // 装饰 |
| 45 | + orange: '#FF914D', // 警告、次要强调 |
| 46 | + warmBg: '#fff1e7', // 默认浅色背景 ← JR 品牌背景色 |
| 47 | + darkBg: '#1a1a2e', // 深色 slide 背景 |
| 48 | + white: '#ffffff', |
| 49 | + black: '#000000', |
| 50 | + indigo: '#6366f1', // AI/Tech 主题(AI Adoption 用) |
| 51 | + teal: '#10b981', // AI/Tech 辅助色 |
| 52 | +} as const; |
| 53 | +``` |
| 54 | + |
| 55 | +**用法原则**: |
| 56 | +- 每个 presentation 可以有自己的主题色(如 AI Adoption 用 indigo/teal),但 `red`、`warmBg`、`dark` 是 JR 品牌色必须保留 |
| 57 | +- Cover slide 通常用 `dark` 或 `black` 背景 |
| 58 | +- 内容 slide 用 `warmBg` 或 `white` |
| 59 | +- 交替使用不同背景色避免视觉疲劳 |
| 60 | + |
| 61 | +--- |
| 62 | + |
| 63 | +## 字体 |
| 64 | + |
| 65 | +```typescript |
| 66 | +export const fonts = { |
| 67 | + heading: '"Bricolage Grotesque", "Noto Sans SC", sans-serif', // 标题 |
| 68 | + body: '"DM Sans", "Noto Sans SC", sans-serif', // 正文 |
| 69 | + mono: '"Space Mono", monospace', // 数据/标签/代码 |
| 70 | +} as const; |
| 71 | +``` |
| 72 | + |
| 73 | +在 `index.html` 中引入: |
| 74 | +```html |
| 75 | +<link href="https://fonts.googleapis.com/css2?family=Bricolage+Grotesque:wght@400;600;700;800&family=DM+Sans:wght@400;500;600;700&family=Space+Mono:wght@400;700&family=Noto+Sans+SC:wght@400;500;700;900&display=swap" rel="stylesheet" /> |
| 76 | +``` |
| 77 | + |
| 78 | +**字号规则**: |
| 79 | +- 标题:`clamp(36px, 5vw, 64px)` — 响应式,16:9 ratio 下自适应 |
| 80 | +- 副标题:`clamp(16px, 2vw, 22px)` |
| 81 | +- 正文:14-16px |
| 82 | +- 标签/badge:12-14px, `font-family: fonts.mono` |
| 83 | +- 数据大字:36-56px, `font-weight: 900` |
| 84 | + |
| 85 | +--- |
| 86 | + |
| 87 | +## 核心 UI 组件 |
| 88 | + |
| 89 | +从 `ui.tsx` 导入使用,不要重新造: |
| 90 | + |
| 91 | +### 布局 |
| 92 | + |
| 93 | +| 组件 | 用途 | 示例 | |
| 94 | +|------|------|------| |
| 95 | +| `<Slide bg={color}>` | Slide 容器,全屏 | `<Slide bg={colors.warmBg}>` | |
| 96 | +| `<Inner center>` | 内容居中容器 | 用于统计/标题页 | |
| 97 | +| `<Inner split>` | 左右分栏 | 配合 `<Half>` 使用 | |
| 98 | +| `<Half>` | 半栏 | 在 `<Inner split>` 内 | |
| 99 | +| `<Grid cols={3}>` | 网格布局 | 卡片列表 | |
| 100 | + |
| 101 | +### 文字 |
| 102 | + |
| 103 | +| 组件 | 用途 | |
| 104 | +|------|------| |
| 105 | +| `<Title>` | 大标题,`font-weight: 900` | |
| 106 | +| `<Title white>` | 白色标题(深色背景用) | |
| 107 | +| `<Subtitle>` | 副标题,灰色 | |
| 108 | +| `<Highlight color={bg}>` | 纯色背景高亮文字 | |
| 109 | +| `<BulletList items={[...]}>` | 带 `→` 前缀的列表 | |
| 110 | +| `<Tag bg={color}>` | 小标签 badge | |
| 111 | + |
| 112 | +### 卡片 |
| 113 | + |
| 114 | +| 组件 | 用途 | |
| 115 | +|------|------| |
| 116 | +| `<Card>` | 大卡片,3px 边框 + 6px 阴影 + hover 动画 | |
| 117 | +| `<CardSm>` | 小卡片,2px 边框 + 4px 阴影 | |
| 118 | + |
| 119 | +### 动画 |
| 120 | + |
| 121 | +| 组件 | 用途 | |
| 122 | +|------|------| |
| 123 | +| `<Stagger>` | 子元素依次出现 (stagger 0.08s) | |
| 124 | +| `<StaggerItem>` | Stagger 的子项 | |
| 125 | +| `<Divider center>` | 标题下的装饰横线 | |
| 126 | + |
| 127 | +--- |
| 128 | + |
| 129 | +## Slide 设计模式 |
| 130 | + |
| 131 | +### 1. Cover Slide(封面) |
| 132 | + |
| 133 | +``` |
| 134 | +背景: colors.black 或 colors.dark |
| 135 | +元素: |
| 136 | +├── 倾斜色块装饰 (absolute positioned, rotate) |
| 137 | +├── JR Logo badge (白色卡片 + 黑边 + 阴影) |
| 138 | +├── 大号标题 (clamp 响应式, text-shadow) |
| 139 | +├── 高亮关键词 (黄色背景 + 黑边) |
| 140 | +├── 副标题 (borderLeft 强调) |
| 141 | +└── 底部 tag 行 (monospace 标签) |
| 142 | +``` |
| 143 | + |
| 144 | +### 2. 数据统计 Slide |
| 145 | + |
| 146 | +``` |
| 147 | +背景: colors.warmBg |
| 148 | +布局: <Inner center> |
| 149 | +元素: |
| 150 | +├── <Title> + <Divider center> |
| 151 | +├── <Stagger> 3-4 列 <Card> |
| 152 | +│ ├── 大号数字 (56px, font-weight 900) |
| 153 | +│ ├── 标题文字 |
| 154 | +│ └── 说明文字 (灰色) |
| 155 | +└── 底部补充说明 |
| 156 | +``` |
| 157 | + |
| 158 | +### 3. 左右对比 Slide |
| 159 | + |
| 160 | +``` |
| 161 | +背景: colors.white |
| 162 | +布局: <Inner split> + <Half> × 2 |
| 163 | +左半: |
| 164 | +├── <Title> |
| 165 | +├── <Divider> |
| 166 | +├── 说明文字 |
| 167 | +└── <Tag> 标签 |
| 168 | +右半: |
| 169 | +├── 多个 <Card> 堆叠 |
| 170 | +└── 或 <BulletList> |
| 171 | +``` |
| 172 | + |
| 173 | +### 4. 网格卡片 Slide |
| 174 | + |
| 175 | +``` |
| 176 | +背景: colors.white 或浅色 |
| 177 | +布局: <Inner center> |
| 178 | +元素: |
| 179 | +├── <Title> + <Divider center> |
| 180 | +└── <Stagger> + grid (3-4 列) |
| 181 | + └── <CardSm> × N |
| 182 | + ├── emoji 图标 |
| 183 | + ├── 标题 |
| 184 | + └── 内容 |
| 185 | +``` |
| 186 | + |
| 187 | +### 5. CTA 结尾 Slide |
| 188 | + |
| 189 | +``` |
| 190 | +背景: colors.dark |
| 191 | +元素: |
| 192 | +├── 旋转圆圈装饰 (animate rotate 无限循环) |
| 193 | +├── 大号标题 + 高亮关键词 |
| 194 | +├── 副标题 (半透明白色) |
| 195 | +├── 按钮组 (黄色主按钮 + 白色边框次按钮) |
| 196 | +└── 底部数据指标行 |
| 197 | +``` |
| 198 | + |
| 199 | +--- |
| 200 | + |
| 201 | +## SlideEngine 交互 |
| 202 | + |
| 203 | +所有 presentation 共用同一个 `SlideEngine.tsx`: |
| 204 | + |
| 205 | +| 功能 | 操作 | |
| 206 | +|------|------| |
| 207 | +| 下一页 | `→` / `↓` / `Space` / 鼠标滚轮 / 触摸左滑 | |
| 208 | +| 上一页 | `←` / `↑` / 触摸右滑 | |
| 209 | +| 全屏 | 按 `F` | |
| 210 | +| 跳转 | 点击底部导航点 | |
| 211 | + |
| 212 | +Progress bar 颜色可以自定义(company-intro 用 `colors.red`,ai-adoption 用 `colors.indigo`)。 |
| 213 | + |
| 214 | +--- |
| 215 | + |
| 216 | +## 文件结构 |
| 217 | + |
| 218 | +新建 presentation 时按此结构: |
| 219 | + |
| 220 | +``` |
| 221 | +presentations/ |
| 222 | +└── your-presentation/ |
| 223 | + ├── package.json |
| 224 | + ├── index.html # 引入 Google Fonts |
| 225 | + ├── vite.config.ts # base: '/presentation/your-presentation/' |
| 226 | + ├── tsconfig.json |
| 227 | + ├── tsconfig.app.json |
| 228 | + ├── public/ |
| 229 | + │ └── images/ # 图片资源 |
| 230 | + ├── src/ |
| 231 | + │ ├── main.tsx |
| 232 | + │ ├── App.tsx # SlideEngine + Slides 组装 |
| 233 | + │ ├── styles/ |
| 234 | + │ │ └── theme.ts # 复制 company-intro 的,按需加主题色 |
| 235 | + │ └── components/ |
| 236 | + │ ├── SlideEngine.tsx # 复制 company-intro 的 |
| 237 | + │ ├── ui.tsx # 复制 company-intro 的,按需加组件 |
| 238 | + │ └── slides/ |
| 239 | + │ ├── S01_Cover.tsx |
| 240 | + │ ├── S02_xxx.tsx |
| 241 | + │ └── ... |
| 242 | + └── bun.lock |
| 243 | +``` |
| 244 | + |
| 245 | +**命名规则**:Slide 文件用 `S01_Cover.tsx`、`S02_Problem.tsx` 格式,序号两位数 + 下划线 + 描述性名称。 |
| 246 | + |
| 247 | +--- |
| 248 | + |
| 249 | +## 部署 |
| 250 | + |
| 251 | +1. 在 `.github/workflows/deploy.yml` 的 build steps 中添加你的 presentation |
| 252 | +2. 在 Assemble output 中 `cp -r your-presentation/dist/* _site/your-presentation/` |
| 253 | +3. 在首页索引 `_site/index.html` 中添加链接 |
| 254 | +4. Push 到 main 分支自动部署到 GitHub Pages |
| 255 | + |
| 256 | +--- |
| 257 | + |
| 258 | +## Checklist:新建 Presentation 前检查 |
| 259 | + |
| 260 | +- [ ] 复制 `theme.ts` 和 `ui.tsx` 作为基础 |
| 261 | +- [ ] `vite.config.ts` 设置正确的 `base` 路径 |
| 262 | +- [ ] `index.html` 引入 Google Fonts |
| 263 | +- [ ] 第一张 slide 是 Cover(深色背景 + JR Logo) |
| 264 | +- [ ] 最后一张 slide 是 CTA |
| 265 | +- [ ] 所有卡片有 `border: 3px solid #000` + `box-shadow` |
| 266 | +- [ ] Hover 效果:阴影消失 + 位移 |
| 267 | +- [ ] 标题用 `clamp()` 响应式字号 |
| 268 | +- [ ] 数据/标签用 `Space Mono` 字体 |
| 269 | +- [ ] 配色不超过 3-4 个主色(品牌色 + 1-2 个主题色) |
| 270 | +- [ ] 更新 `deploy.yml` 和首页索引 |
0 commit comments