REAL SHOWCASE SOURCElayout-lab
1 个文件 · 80 行 · TypeScript
// ===== showcase/src/examples/components/layout_lab.ts ===== import { RenderBorder, RenderButton, RenderDockPanel, RenderGridPanel, RenderPageHeader, RenderParagraph, RenderSplitter, RenderStackPanel, RenderText, gridAuto, gridFr,} from 'ds-ui' const region = (title: string, detail: string, background: 'muted' | 'panel' | 'selected' = 'muted') => { const panel = new RenderStackPanel({ orientation: 'vertical', spacing: 6 }) panel.addChild(new RenderText(title, { role: 'title', weight: 'semibold' })) panel.addChild(new RenderParagraph(detail)) return new RenderBorder({ background, padding: 14, child: panel })} export function createLayoutLabExample(): RenderStackPanel { const status = new RenderText('拖动中间分割条,观察长期工作区的比例调整。', { role: 'secondary' }) const detailGrid = new RenderGridPanel({ columns: [gridFr(), gridFr()], rows: [gridAuto(), gridFr()], columnGap: 10, rowGap: 10, }) detailGrid.addChild(region('基础信息', '姓名、性别、年龄'), { row: 0, column: 0 }) detailGrid.addChild(region('诊断信息', '主诊断与并发症', 'selected'), { row: 0, column: 1 }) detailGrid.addChild(region('就诊记录', '10:20 完成门诊接诊\n10:35 补充既往病史\n10:48 提交检验申请'), { row: 1, column: 0, columnSpan: 2 }) const splitter = new RenderSplitter({ first: region('患者列表', '王小明\n李安然\n周文静'), second: detailGrid, direction: 'horizontal', ratio: 0.28, minRatio: 0.2, maxRatio: 0.55, splitterSize: 7, onChange: ratio => { status.text = `Splitter:左侧占比 ${Math.round(ratio * 100)}%` }, }) const toolbar = new RenderStackPanel({ orientation: 'horizontal', spacing: 8, crossAxisAlignment: 'center' }) toolbar.addChild(new RenderText('门诊工作台', { role: 'title', weight: 'semibold' }), 1) toolbar.addChild(new RenderButton({ label: '刷新', onClick: () => { status.text = 'DockPanel 顶部工具栏:已刷新。' } })) toolbar.addChild(new RenderButton({ label: '保存', variant: 'primary', onClick: () => { status.text = 'DockPanel 顶部工具栏:已保存。' } })) const dock = new RenderDockPanel() const toolbarRegion = new RenderBorder({ background: 'panel', padding: 10, child: toolbar, height: 52 }) const navigation = new RenderStackPanel({ orientation: 'vertical', spacing: 10 }) navigation.addChild(new RenderText('模块导航', { role: 'title', weight: 'semibold' })) for (const label of ['首页', '患者管理', '检验查询', '系统设置']) { navigation.addChild(new RenderText(label, { role: label === '患者管理' ? 'accent' : 'secondary', overflow: 'ellipsis', })) } const navigationRegion = new RenderBorder({ background: 'muted', padding: 14, child: navigation }) navigationRegion.width = 170 const statusBar = new RenderStackPanel({ orientation: 'horizontal', spacing: 12, crossAxisAlignment: 'center' }) statusBar.addChild(new RenderText('状态栏', { role: 'title', weight: 'semibold' })) statusBar.addChild(new RenderText('就绪 · 18 个组件示例已加载', { role: 'secondary', overflow: 'ellipsis' }), 1) const statusRegion = new RenderBorder({ background: 'panel', padding: 10, child: statusBar, height: 46 }) dock.addChild(toolbarRegion, { dock: 'top' }) dock.addChild(statusRegion, { dock: 'bottom' }) dock.addChild(navigationRegion, { dock: 'left' }) dock.setFill(splitter) const panel = new RenderStackPanel({ orientation: 'vertical', spacing: 16, crossAxisAlignment: 'stretch' }) panel.addChild(new RenderPageHeader({ title: '布局原语实验室', description: 'StackPanel 组织页面流,GridPanel 精确对齐,DockPanel 划分区域,Splitter 提供可调分栏。' })) dock.height = 360 panel.addChild(dock) panel.addChild(status) panel.padding = 20 return panel}