REAL SHOWCASE SOURCEimage-preview-clinical

1 个文件 · 57 行 · TypeScript

// ===== showcase/src/examples/components/image_preview.ts ===== import {  RenderButton,  RenderImagePreview,  RenderPageHeader,  RenderStackPanel,  RenderText,  RenderWrapPanel,} from 'ds-ui' function createPreviewSource(primary: string, secondary: string, label: string): HTMLCanvasElement {  const canvas = document.createElement('canvas')  canvas.width = 320  canvas.height = 190  const context = canvas.getContext('2d')!  const gradient = context.createLinearGradient(0, 0, 320, 190)  gradient.addColorStop(0, primary)  gradient.addColorStop(1, secondary)  context.fillStyle = gradient  context.fillRect(0, 0, 320, 190)  context.fillStyle = 'rgba(255,255,255,0.92)'  context.font = 'bold 28px sans-serif'  context.fillText(label, 24, 48)  context.fillStyle = 'rgba(255,255,255,0.72)'  context.fillRect(24, 78, 220, 12)  context.fillRect(24, 106, 168, 12)  context.fillRect(24, 134, 250, 12)  return canvas} export function createImagePreviewExample(): RenderStackPanel {  const report = createPreviewSource('#1677ff', '#00a6a6', '检验报告')  const imaging = createPreviewSource('#7c3aed', '#db2777', '影像摘要')  const dynamic = new RenderImagePreview({ source: report, width: 300, height: 178, fit: 'cover', shape: 'rounded', borderWidth: 1 })  const state = new RenderText('当前:检验报告 · cover · rounded', { role: 'secondary' })   const samples = new RenderWrapPanel({ spacing: 16, runSpacing: 16, crossAxisAlignment: 'center' })  samples.addChild(dynamic)  samples.addChild(new RenderImagePreview({ source: imaging, width: 150, height: 178, fit: 'contain', shape: 'rectangle', borderWidth: 1 }))  samples.addChild(new RenderImagePreview({ size: 88, shape: 'circle', placeholderText: 'LA', borderWidth: 1 }))  samples.addChild(new RenderImagePreview({ size: 88, shape: 'rounded', placeholderIcon: 'image', borderWidth: 1 }))   const actions = new RenderWrapPanel({ spacing: 8, runSpacing: 8 })  actions.addChild(new RenderButton({ label: '检验报告', variant: 'primary', onClick: () => { dynamic.setSource(report); state.text = '当前:检验报告 · cover · rounded' } }))  actions.addChild(new RenderButton({ label: '影像摘要', onClick: () => { dynamic.setSource(imaging); state.text = '当前:影像摘要 · cover · rounded' } }))  actions.addChild(new RenderButton({ label: '清空图片', onClick: () => { dynamic.setSource(null); state.text = '当前:空状态占位' } }))  actions.addChild(new RenderButton({ label: '模拟加载失败', onClick: () => { dynamic.setSource('/missing-clinical-preview.png'); state.text = '当前:URL 加载失败占位' } }))   const panel = new RenderStackPanel({ orientation: 'vertical', spacing: 14, crossAxisAlignment: 'stretch' })  panel.addChild(new RenderPageHeader({ title: 'ImagePreview 临床图片缩略图', description: '对比 cover、contain、矩形、圆角、圆形以及空状态和加载错误占位。' }))  panel.addChild(actions)  panel.addChild(samples, 1)  panel.addChild(state)  panel.padding = 18  return panel}