# Pika 布局组件规划
> 基于 Pika 设计规范的布局组件设计
> 设计原则:以 Apple HIG 为准,AI-First,三级别尺寸体系
---
## 一、核心理念
### 1.1 设计价值观(与根规范一致)
Pika 布局组件基于 Apple Human Interface Guidelines 的三大核心原则构建:
| 原则 | 说明 |
|-----|------|
| **层级** | 建立清晰的视觉层级,区分内容和控件 |
| **和谐** | 与硬件和软件设计保持一致 |
| **一致性** | 采用平台约定,跨组件保持统一 |
### 1.2 AI-First 设计原则
所有布局组件遵循 Pika 的 AI-First 设计原则:
| 原则 | 说明 |
|-----|------|
| **零歧义** | Props 名称自解释,无简称、无隐式行为 |
| **零默认假设** | 所有视觉行为显式声明 |
| **一致性** | 相同概念用相同 prop 名 |
| **扁平化** | 最多一层嵌套 |
| **确定性** | 相同输入始终产生相同输出 |
---
## 二、统一尺寸体系(三级别)
所有布局组件使用统一的三级别尺寸体系:
| 级别 | 间距 | 圆角 | 字体大小 |
|-----|------|------|---------|
| **small** | 8px | 4px | 12px |
| **middle** | 16px | 8px | 14px |
| **large** | 24px | 12px | 16px |
### 2.1 Design Token(与根规范一致)
```css
--nv-spacing-small: 8px;
--nv-spacing-middle: 16px;
--nv-spacing-large: 24px;
--nv-radius-small: 4px;
--nv-radius-middle: 8px;
--nv-radius-large: 12px;
--nv-radius-full: 9999px;
--nv-font-size-small: 12px;
--nv-font-size-middle: 14px;
--nv-font-size-large: 16px;
```
---
## 三、组件体系
### 3.1 组件清单
| 组件 | 说明 | 优先级 |
|-----|------|-------|
| **Layout** | 页面布局容器 | P0 |
| **Header** | 顶部导航栏 | P0 |
| **Footer** | 底部区域 | P0 |
| **Content** | 内容区域 | P0 |
| **Sider** | 侧边栏 | P0 |
| **Row** | 栅格行 | P1 |
| **Col** | 栅格列 | P1 |
| **Space** | 间距组件 | P2 |
| **HStack** | 水平排列 | P2 |
| **VStack** | 垂直排列 | P2 |
| **Divider** | 分隔线 | P2 |
---
## 四、组件详细设计
### 4.1 Layout 布局容器
#### Props 定义(AI-First)
```tsx
export interface LayoutProps {
/** 是否有侧边栏(用于 SSR 避免样式闪烁) */
hasSider?: boolean
/** 子元素 */
children?: React.ReactNode
className?: string
style?: React.CSSProperties
}
export interface HeaderProps {
/** 高度 */
height?: number | string
/** 是否固定在顶部 */
fixed?: boolean
/** 子元素 */
children?: React.ReactNode
className?: string
style?: React.CSSProperties
}
export interface FooterProps {
/** 内边距 */
padding?: number | string
/** 子元素 */
children?: React.ReactNode
className?: string
style?: React.CSSProperties
}
export interface ContentProps {
/** 内边距 */
padding?: number | string
/** 子元素 */
children?: React.ReactNode
className?: string
style?: React.CSSProperties
}
export interface SiderProps {
/** 宽度 */
width?: number | string
/** 折叠后的宽度 */
collapsedWidth?: number
/** 是否可折叠 */
collapsible?: boolean
/** 当前折叠状态 */
collapsed?: boolean
/** 默认折叠状态 */
defaultCollapsed?: boolean
/** 折叠状态变化回调 */
onCollapse?: (collapsed: boolean) => void
/** 响应式断点 */
breakpoint?: 'small' | 'middle' | 'large'
/** 断点变化回调 */
onBreakpoint?: (broken: boolean) => void
/** 是否反转箭头方向 */
reverseArrow?: boolean
/** 自定义触发器 */
trigger?: React.ReactNode
/** 子元素 */
children?: React.ReactNode
className?: string
style?: React.CSSProperties
}
```
#### 使用示例
```tsx
// 基础布局
Header
Content
Footer
// 经典后台布局
Header
Content
```
#### Design Token
```css
--nv-layout-header-height: 64px;
--nv-layout-footer-padding: var(--nv-spacing-middle);
--nv-layout-sider-width: 200px;
--nv-layout-sider-collapsed-width: 80px;
--nv-layout-trigger-height: 48px;
--nv-layout-content-padding: var(--nv-spacing-middle);
```
---
### 4.2 Grid 栅格系统
#### Props 定义(AI-First)
```tsx
export interface RowProps {
/** 栅格间隔 */
gutter?: number | [number, number]
/** 主轴对齐方式 */
justify?: 'start' | 'end' | 'center' | 'space-around' | 'space-between'
/** 交叉轴对齐方式 */
align?: 'start' | 'end' | 'center' | 'baseline' | 'stretch'
/** 子元素 */
children?: React.ReactNode
className?: string
style?: React.CSSProperties
}
export interface ColProps {
/** 栅格格数 (0-24) */
span?: number
/** 左侧偏移格数 */
offset?: number
/** 栅格顺序 */
order?: number
/** 响应式栅格 */
small?: number | { span?: number; offset?: number; order?: number }
middle?: number | { span?: number; offset?: number; order?: number }
large?: number | { span?: number; offset?: number; order?: number }
/** 子元素 */
children?: React.ReactNode
className?: string
style?: React.CSSProperties
}
```
#### 使用示例
```tsx
// 基础栅格
// 响应式布局
响应式列
// 间距和对齐
```
#### Design Token
```css
--nv-grid-gutter: var(--nv-spacing-middle);
--nv-grid-columns: 24;
```
---
### 4.3 Space 间距组件
#### Props 定义(AI-First)
```tsx
export interface SpaceProps {
/** 间距方向 */
direction?: 'horizontal' | 'vertical'
/** 间距大小 */
size?: 'small' | 'middle' | 'large'
/** 对齐方式 */
align?: 'start' | 'end' | 'center' | 'baseline'
/** 是否换行(仅水平方向有效) */
wrap?: boolean
/** 分隔符 */
split?: React.ReactNode
/** 子元素 */
children?: React.ReactNode
className?: string
style?: React.CSSProperties
}
```
#### 使用示例
```tsx
// 基础使用
// 垂直排列
// 带分隔符
}>
Link 1
Link 2
// 自动换行
{tags.map(tag => {tag})}
```
#### Design Token
```css
--nv-space-gap-small: var(--nv-spacing-small);
--nv-space-gap-middle: var(--nv-spacing-middle);
--nv-space-gap-large: var(--nv-spacing-large);
```
---
### 4.4 Stack 弹性盒布局
#### Props 定义(AI-First)
```tsx
export interface StackProps {
/** 排列方向 */
direction?: 'horizontal' | 'vertical'
/** 间距 */
gap?: 'small' | 'middle' | 'large' | number | string
/** 主轴对齐方式 */
justify?: 'start' | 'end' | 'center' | 'space-around' | 'space-between' | 'space-evenly'
/** 交叉轴对齐方式 */
align?: 'start' | 'end' | 'center' | 'baseline' | 'stretch'
/** 是否换行 */
wrap?: boolean
/** 子元素 */
children?: React.ReactNode
className?: string
style?: React.CSSProperties
}
// 便捷组件
export interface HStackProps extends Omit {}
export interface VStackProps extends Omit {}
```
#### 使用示例
```tsx
// 使用 Stack
// 使用 HStack
// 使用 VStack
```
---
### 4.5 Divider 分隔线
#### Props 定义(AI-First)
```tsx
export interface DividerProps {
/** 方向 */
type?: 'horizontal' | 'vertical'
/** 是否虚线 */
dashed?: boolean
/** 子元素(居中文字) */
children?: React.ReactNode
className?: string
style?: React.CSSProperties
}
```
#### 使用示例
```tsx
// 水平分隔
// 带文字
内容
// 垂直分隔
}>
Link 1
Link 2
// 虚线
```
#### Design Token
```css
--nv-divider-color: var(--nv-color-border);
--nv-divider-padding: var(--nv-spacing-middle);
```
---
## 五、AI-First 设计规范
### 5.1 Props 命名规范
| 规则 | 说明 |
|-----|------|
| **布尔属性** | 动词/形容词 + 肯定形式:`disabled`, `collapsible`, `fixed`, `wrap`, `dashed` |
| **事件回调** | `on + 动词 + 名词`:`onCollapse`, `onBreakpoint` |
| **尺寸** | 统一使用 `small`, `middle`, `large` |
| **响应式断点** | 统一使用 `small`, `middle`, `large` |
### 5.2 样式绑定规范
使用 `data-*` 属性进行样式绑定:
```tsx
```
### 5.3 组件导入规范
每个组件独立导入,路径即名字:
```tsx
import { Layout } from '@Pika/ui/layout'
import { Header, Footer, Sider, Content } from '@Pika/ui/layout'
import { Row, Col } from '@Pika/ui/grid'
import { Space } from '@Pika/ui/space'
import { Stack, HStack, VStack } from '@Pika/ui/stack'
import { Divider } from '@Pika/ui/divider'
```
---
## 六、完整使用示例
### 6.1 经典后台布局
```tsx
import { Layout, Row, Col, Space, HStack, VStack, Divider } from '@Pika/ui'
const App = () => {
const [collapsed, setCollapsed] = useState(false)
return (
© 2024 Pika UI
)
}
```
---
## 七、文件结构
```
src/components/
├── layout/
│ ├── index.ts
│ ├── Layout.tsx
│ ├── Header.tsx
│ ├── Footer.tsx
│ ├── Sider.tsx
│ ├── Content.tsx
│ ├── Layout.module.css
│ └── Layout.test.tsx
├── grid/
│ ├── index.ts
│ ├── Row.tsx
│ ├── Col.tsx
│ ├── Grid.module.css
│ └── Grid.test.tsx
├── space/
│ ├── index.ts
│ ├── Space.tsx
│ ├── Space.module.css
│ └── Space.test.tsx
├── stack/
│ ├── index.ts
│ ├── Stack.tsx
│ ├── HStack.tsx
│ ├── VStack.tsx
│ ├── Stack.module.css
│ └── Stack.test.tsx
└── divider/
├── index.ts
├── Divider.tsx
├── Divider.module.css
└── Divider.test.tsx
```
---
## 八、优先级规划
### Phase 1: 核心布局 (P0)
| 组件 | 说明 | 预估工时 |
|-----|------|---------|
| Layout | 布局容器 | 1h |
| Header | 顶部导航栏 | 0.5h |
| Footer | 底部区域 | 0.5h |
| Content | 内容区域 | 0.5h |
| Sider | 侧边栏 | 2h |
### Phase 2: 栅格系统 (P1)
| 组件 | 说明 | 预估工时 |
|-----|------|---------|
| Row | 行容器 | 1h |
| Col | 列组件 | 1.5h |
### Phase 3: 间距和弹性盒 (P2)
| 组件 | 说明 | 预估工时 |
|-----|------|---------|
| Space | 间距组件 | 1h |
| Stack | 弹性盒容器 | 1h |
| HStack | 水平排列 | 0.25h |
| VStack | 垂直排列 | 0.25h |
| Divider | 分隔线 | 0.5h |
---
## 九、与根设计规范的对照
| 根规范 | 实现方式 |
|------|---------|
| **三级别尺寸** | `small`, `middle`, `large` 统一应用于所有组件 |
| **AI-First** | 所有 Props 使用联合类型字面量,无魔法字符串 |
| **Apple HIG** | 圆角、间距、动效遵循 Apple 规范 |
| **data-* 样式绑定** | 使用 `data-*` 属性而非 className 拼接 |
| **自包含组件** | 每个组件独立导入,路径即名字 |
| **统一事件命名** | `on + 动词 + 名词` 规则 |
---
## 十、设计总结
### Pika 布局组件的特点
1. **简洁统一** - 三级别尺寸体系,无过度设计
2. **AI 友好** - Props 自解释,类型安全,确定导入路径
3. **Apple HIG 优先** - 遵循 Apple 人机交互指南
4. **语义化** - Space, HStack, VStack 提供清晰的布局语义
5. **可扩展** - 支持响应式、折叠等高级功能
### AI 提示工程
```
1. 导入路径 = @Pika/ui/组件名 (layout/grid/space/stack/divider)
2. 尺寸 prop 始终叫 size,值从 small/middle/large 选
3. 响应式断点统一:small/middle/large
4. 布尔 prop 用动词开头 (collapsible, fixed, wrap, dashed)
5. 回调命名 = on + 动词 + 名词 (onCollapse, onBreakpoint)
6. 所有 prop 类型用联合类型字面量定义
7. 使用 Space 代替手动计算间距
8. 使用 HStack/VStack 进行弹性盒布局
```
> **Pika 布局组件:简洁、统一、AI-First**