REAL SHOWCASE SOURCEvisibility-clip-states
1 个文件 · 27 行 · TypeScript
// ===== showcase/src/examples/components/visibility_clip.ts ===== import { RenderBorder, RenderButton, RenderClip, RenderPageHeader, RenderStackPanel, RenderText, RenderVisibility, RenderWrapPanel, type VisibilityMode } from 'ds-ui' export function createVisibilityClipExample(): RenderStackPanel { const status = new RenderText('visible 正常绘制;hidden 保留布局空间;collapsed 同时移除布局空间。', { role: 'secondary' }) const visibleContent = new RenderBorder({ background: 'selected', padding: 18, child: new RenderText('可见性目标:药物过敏提醒', { role: 'title', weight: 'semibold' }) }) const visibility = new RenderVisibility({ mode: 'visible', child: visibleContent }) const oversized = new RenderBorder({ background: 'panel', padding: 20, width: 560, height: 130, child: new RenderText('这段内容宽于裁剪视口,RenderClip 会限制绘制和命中区域。') }) const clip = new RenderClip({ child: oversized, cornerRadius: 16 }) clip.width = 380 clip.height = 110 const actions = new RenderWrapPanel({ spacing: 8 }) for (const mode of ['visible', 'hidden', 'collapsed'] as VisibilityMode[]) actions.addChild(new RenderButton({ label: mode, variant: mode === 'visible' ? 'primary' : 'default', onClick: () => { visibility.mode = mode status.text = `RenderVisibility.mode = '${mode}'` } })) actions.addChild(new RenderButton({ label: '切换圆角', onClick: () => { clip.cornerRadius = clip.cornerRadius > 0 ? 0 : 16; clip.markNeedsPaint(); status.text = `RenderClip.cornerRadius = ${clip.cornerRadius}` } })) const panel = new RenderStackPanel({ orientation: 'vertical', spacing: 14, crossAxisAlignment: 'stretch' }) panel.addChild(new RenderPageHeader({ title: 'Visibility / Clip 状态与裁剪', description: '对比布局参与语义,并限制子内容的绘制与命中范围。' })) panel.addChild(actions) panel.addChild(new RenderBorder({ background: 'muted', padding: 14, child: visibility })) panel.addChild(clip) panel.addChild(status) panel.padding = 24 return panel}