REAL SHOWCASE SOURCEmasonry-panel-clinical-cards

1 个文件 · 35 行 · TypeScript

// ===== showcase/src/examples/components/masonry_panel.ts ===== import { RenderBorder, RenderButton, RenderMasonryPanel, RenderPageHeader, RenderParagraph, RenderStackPanel, RenderText, RenderWrapPanel } from 'ds-ui' const notes = [  ['术前评估', '完成麻醉分级、凝血功能和术前谈话。'],  ['检验预警', '钾离子 3.1 mmol/L,建议复查并结合心电图评估。'],  ['护理观察', '夜间睡眠一般,疼痛评分 3 分。继续观察切口渗出情况。'],  ['用药核对', '长期用药 5 项,存在 1 项相互作用提醒。'],  ['随访计划', '出院后第 7、30 天完成电话随访。'],  ['影像摘要', '胸部 CT 未见新增实变影,建议结合临床随诊。'],] export function createMasonryPanelExample(): RenderStackPanel {  const status = new RenderText('卡片总是放入当前最短列,避免规则网格留下大块空白。', { role: 'secondary' })  const masonry = new RenderMasonryPanel({ columnCount: 3, columnGap: 10, rowGap: 10 })  for (const [title, detail] of notes) {    const content = new RenderStackPanel({ orientation: 'vertical', spacing: 8 })    content.addChild(new RenderText(title!, { role: 'title', weight: 'semibold' }))    content.addChild(new RenderParagraph(detail!))    masonry.addChild(new RenderBorder({ background: 'panel', padding: 14, child: content }))  }  const actions = new RenderWrapPanel({ spacing: 8 })  for (const count of [2, 3, 4]) actions.addChild(new RenderButton({ label: `${count} 列`, variant: count === 3 ? 'primary' : 'default', onClick: () => {    masonry.columnCount = count    status.text = `已使用 ${count} 列重新执行最短列排布。`  } }))  const panel = new RenderStackPanel({ orientation: 'vertical', spacing: 14, crossAxisAlignment: 'stretch' })  panel.addChild(new RenderPageHeader({ title: 'MasonryPanel 临床信息瀑布流', description: '不同高度的摘要卡片按最短列策略紧凑排列。' }))  panel.addChild(actions)  panel.addChild(masonry)  panel.addChild(status)  panel.padding = 24  return panel}