REAL SHOWCASE SOURCEstack-natural-flex
1 个文件 · 56 行 · TypeScript
// ===== showcase/src/examples/components/stack_natural_flex.ts ===== import { RenderBorder, RenderGridPanel, RenderPageHeader, RenderParagraph, RenderStackPanel, RenderText, gridFr,} from 'ds-ui' const fixedBar = (label: string, height: number): RenderBorder => { const text = new RenderText(label, { role: 'title', weight: 'semibold' }) text.verticalAlignment = 'center' return new RenderBorder({ background: 'panel', padding: { left: 10, right: 10 }, height, child: text, })} const naturalSummary = (): RenderBorder => { const content = new RenderStackPanel({ orientation: 'vertical', spacing: 4, crossAxisAlignment: 'stretch' }) content.addChild(new RenderText('自然尺寸摘要', { role: 'title', weight: 'semibold' })) content.addChild(new RenderParagraph('即使使用 fr 行,作为非 flex 子项时也先按内容得到自然高度。')) return new RenderBorder({ background: 'muted', padding: 10, child: content })} export function createStackNaturalFlexExample(): RenderStackPanel { const summaryGrid = new RenderGridPanel({ columns: [gridFr()], rows: [gridFr()] }) summaryGrid.addChild(naturalSummary()) const body = new RenderBorder({ background: 'selected', padding: 14, child: new RenderParagraph('flex = 1 的工作区只接收标题、摘要、底栏和间距之外的剩余高度。拖入更复杂的 Grid 或 Dock 也不会让它提前失去空间。'), }) const workspace = new RenderStackPanel({ orientation: 'vertical', spacing: 8, padding: 12, crossAxisAlignment: 'stretch', height: 360, }) workspace.addChild(fixedBar('固定标题区 · flex = 0 · 高度 44', 44)) workspace.addChild(summaryGrid) workspace.addChild(body, 1) workspace.addChild(fixedBar('固定状态栏 · flex = 0 · 高度 38', 38)) const panel = new RenderStackPanel({ orientation: 'vertical', spacing: 16, padding: 24, crossAxisAlignment: 'stretch' }) panel.addChild(new RenderPageHeader({ title: 'StackPanel 自然尺寸与 flex', description: '非 flex 先自然测量,剩余空间再分配。' })) panel.addChild(new RenderBorder({ background: 'muted', child: workspace })) return panel}