# 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