Layout 布局框架

组合具名区域和受控可调面板,同时把尺寸状态与业务结构留给宿主。

Beta

示例

直接操作示例,查看组件在具体任务中的状态与反馈。

宿主持有 35%–75% 的面板尺寸;BaseLayoutSplit 负责拖拽、键盘约束和变更回调。
工作台内容审核
主面板55%
详情面板45%
本地受控工作台布局
主面板宽度:

聚焦分隔手柄后使用 ArrowLeft 或 ArrowRight 调整;Home 跳到 35%,End 跳到 75%。

本地内容工作台

内容列表

  • 季度报告
  • 发布清单
  • 组件验收记录

详情面板

当前选择:季度报告

所有尺寸变化只保存在此示例的本地状态中。

主面板宽度:55%;详情面板宽度:45%。
header、sidebar、main、aside 和 footer 组成稳定的页面壳层。
应用壳层
页头
主要内容
页脚
fullHeight 让布局填满已知高度容器,滚动仍交给指定面板。
全高工作区
固定页头

可滚动内容 1

可滚动内容 2

可滚动内容 3

可滚动内容 4

可滚动内容 5

可滚动内容 6

可滚动内容 7

可滚动内容 8

可滚动内容 9

可滚动内容 10

可滚动内容 11

可滚动内容 12

聚焦分隔手柄后可用方向键、Home 和 End 调整受控面板尺寸。
可调工作区

使用左右方向键调整面板宽度。

列表
详情
主面板 50%

使用建议

先建立明确的尺寸边界

可调分割需要可计算的宽度或高度;在页面或面板容器中提供明确尺寸,并让内部区域保持 min-height 与 min-width 可收缩。

由宿主持有受控尺寸

把 size 与 onSizeChange 连接到宿主状态,并设置 minSize、maxSize 和 keyboardStep;持久化、响应式策略与恢复默认值不属于组件内部职责。

使用 Split 提供完整调整行为

BaseLayoutSplit 会组合面板、交互手柄和 Arrow、Home、End 键盘行为;独立 BaseLayoutResizeHandle 只提供 separator 展示与语义,不会自动修改尺寸。

引入方式

从已验证的公开子路径导入组件;全局样式接入方式见安装指南。

import {
  BaseLayout,
  BaseLayoutPane,
  BaseLayoutResizeHandle,
  BaseLayoutSplit,
} from '@inf-monkeys-tech/monkeys-design/components/base';

当前限制

  • Layout 不负责应用路由、导航数据、权限、断点编排或尺寸持久化;独立 ResizeHandle 也不拥有拖拽和键盘状态。
  • T17 尚缺 deterministic desktop/mobile visual、manual usability 与最终 packed React 18/19 证据。
  • Deterministic desktop/mobile visual evidence, manual usability review, and final packed React 18/19 checks are pending T17/T23.

API

export interface BaseLayoutProps
  extends Omit<
    HTMLAttributes<HTMLDivElement>,
    'children' | 'className' | 'style'
  > {
  header?: ReactNode;
  sidebar?: ReactNode;
  aside?: ReactNode;
  sidebarLabel?: string;
  asideLabel?: string;
  footer?: ReactNode;
  children?: ReactNode;
  sidebarSize?: number | string;
  asideSize?: number | string;
  gap?: BaseLayoutGap;
  fullHeight?: boolean;
  appearance?: BaseAppearance;
  className?: string;
  classNames?: BaseLayoutClassNames;
  style?: CSSProperties;
}
属性说明类型默认值
header组件顶部区域呈现的内容。ReactNode
sidebar布局侧边栏区域呈现的内容。ReactNode
aside布局辅助区域呈现的内容。ReactNode
sidebarLabel侧边栏区域的可访问名称。string
asideLabel辅助区域的可访问名称。string
footer组件底部区域呈现的内容。ReactNode
children在 BaseLayout 内渲染的子内容;支持渲染函数时以对应的 Props 类型为准。ReactNode
sidebarSize侧边栏区域使用的宽度或尺寸。number | string
asideSize辅助区域使用的宽度或尺寸。number | string
gap子项之间的间距。BaseLayoutGap
fullHeight布局是否占满父容器可用高度。booleanfalse
appearance覆盖组件使用的外观令牌或局部样式配置。BaseAppearance
className追加到组件根元素的 CSS 类名。string
classNames按组件公开的结构插槽分别追加 CSS 类名。BaseLayoutClassNames
style追加到组件根元素的内联样式。CSSProperties

BaseLayoutPane

查看组件源码
export interface BaseLayoutPaneProps
  extends Omit<
    HTMLAttributes<HTMLElement>,
    'children' | 'className' | 'style'
  > {
  as?: 'div' | 'main' | 'aside' | 'section' | 'header' | 'footer' | 'nav';
  scrollable?: boolean;
  bordered?: boolean;
  surface?: BaseLayoutPaneSurface;
  children?: ReactNode;
  appearance?: BaseAppearance;
  className?: string;
  classNames?: BaseLayoutPaneClassNames;
  style?: CSSProperties;
}
属性说明类型默认值
as用于渲染组件根节点的 HTML 元素类型。'div' | 'main' | 'aside' | 'section' | 'header' | 'footer' | 'nav''div'
scrollable内容超出面板时是否允许面板内部滚动。booleanfalse
bordered是否显示区域边框。booleantrue
surface面板使用的背景层级或表面样式。BaseLayoutPaneSurface'default'
children在 BaseLayoutPane 内渲染的子内容;支持渲染函数时以对应的 Props 类型为准。ReactNode
appearance覆盖组件使用的外观令牌或局部样式配置。BaseAppearance
className追加到组件根元素的 CSS 类名。string
classNames按组件公开的结构插槽分别追加 CSS 类名。BaseLayoutPaneClassNames
style追加到组件根元素的内联样式。CSSProperties

BaseLayoutResizeHandle

查看组件源码
export interface BaseLayoutResizeHandleProps
  extends Omit<
    HTMLAttributes<HTMLDivElement>,
    'children' | 'className' | 'style'
  > {
  orientation?: BaseLayoutOrientation;
  resizable?: boolean;
  disabled?: boolean;
  size?: BaseLayoutSize;
  minSize?: BaseLayoutSize;
  maxSize?: BaseLayoutSize;
  label?: string;
  appearance?: BaseAppearance;
  className?: string;
  classNames?: BaseLayoutResizeHandleClassNames;
  style?: CSSProperties;
}
属性说明类型默认值
orientation内容或交互项的排列方向。BaseLayoutOrientation'horizontal'
resizable是否允许用户调整对应区域的尺寸。booleanfalse
disabled是否禁用该组件及其可交互行为。booleanfalse
size组件使用的预设尺寸。BaseLayoutSize
minSize用户调整尺寸时允许达到的最小值。BaseLayoutSize
maxSize用户调整尺寸时允许达到的最大值。BaseLayoutSize
label尺寸调整手柄提供给辅助技术的操作名称。string
appearance覆盖组件使用的外观令牌或局部样式配置。BaseAppearance
className追加到组件根元素的 CSS 类名。string
classNames按组件公开的结构插槽分别追加 CSS 类名。BaseLayoutResizeHandleClassNames
style追加到组件根元素的内联样式。CSSProperties

BaseLayoutSplit

查看组件源码
export interface BaseLayoutSplitProps
  extends Omit<
    HTMLAttributes<HTMLDivElement>,
    'children' | 'className' | 'defaultValue' | 'onChange' | 'style'
  > {
  orientation?: BaseLayoutOrientation;
  primary?: ReactNode;
  secondary?: ReactNode;
  children?: ReactNode;
  resizable?: boolean;
  disabled?: boolean;
  size?: BaseLayoutSize;
  defaultSize?: BaseLayoutSize;
  minSize?: BaseLayoutSize;
  maxSize?: BaseLayoutSize;
  gap?: BaseLayoutGap;
  keyboardStep?: number;
  resizeLabel?: string;
  appearance?: BaseAppearance;
  className?: string;
  classNames?: BaseLayoutSplitClassNames;
  style?: CSSProperties;
  onSizeChange?: (size: BaseLayoutSize) => void;
}
属性说明类型默认值
orientation内容或交互项的排列方向。BaseLayoutOrientation'horizontal'
primary分栏布局主要区域呈现的内容。ReactNode
secondary分栏布局次要区域呈现的内容。ReactNode
children在 BaseLayoutSplit 内渲染的子内容;支持渲染函数时以对应的 Props 类型为准。ReactNode
resizable是否允许用户调整对应区域的尺寸。booleanfalse
disabled是否禁用该组件及其可交互行为。booleanfalse
size组件使用的预设尺寸。BaseLayoutSize
defaultSize非受控分栏布局的初始尺寸。BaseLayoutSize
minSize用户调整尺寸时允许达到的最小值。BaseLayoutSize
maxSize用户调整尺寸时允许达到的最大值。BaseLayoutSize
gap子项之间的间距。BaseLayoutGap
keyboardStep通过键盘调整分栏时每次变化的尺寸步长。number
resizeLabel提供给尺寸调整控件的可访问名称。string
appearance覆盖组件使用的外观令牌或局部样式配置。BaseAppearance
className追加到组件根元素的 CSS 类名。string
classNames按组件公开的结构插槽分别追加 CSS 类名。BaseLayoutSplitClassNames
style追加到组件根元素的内联样式。CSSProperties
onSizeChange分栏尺寸变化时调用的回调。(size: BaseLayoutSize) => void