REAL SHOWCASE SOURCEoverlay-feedback

1 个文件 · 77 行 · TypeScript

// ===== showcase/src/examples/components/overlay_feedback.ts ===== import {  NotificationManager,  RenderBorder,  RenderButton,  RenderDrawer,  RenderLoadingHost,  RenderModal,  RenderPageHeader,  RenderStackPanel,  RenderText,  RenderTextBox,  RenderWrapPanel,} from 'ds-ui'import type { ShowcaseExample } from '../../showcase_example' export function createOverlayFeedbackExample(): ShowcaseExample {  const notifications = new NotificationManager()  const status = new RenderText('选择一种反馈方式,观察阻断范围与交互语义。', { role: 'secondary' })   const modal = new RenderModal({    title: '确认提交',    content: '提交后将进入审核流程,是否继续?',    buttons: [      { key: 'cancel', label: '取消' },      { key: 'submit', label: '提交', primary: true },    ],    onClose: key => {      status.text = key === 'submit' ? '已确认提交。' : '已取消提交。'    },  })   const drawerContent = new RenderStackPanel({ orientation: 'vertical', spacing: 12, crossAxisAlignment: 'stretch' })  drawerContent.addChild(new RenderText('患者详情', { role: 'title', weight: 'semibold' }))  drawerContent.addChild(new RenderTextBox({ value: '李安然', label: '姓名', readonly: true }))  drawerContent.addChild(new RenderTextBox({ value: '呼吸内科', label: '科室', readonly: true }))  drawerContent.addChild(new RenderText('Drawer 可以承载真实组件树,并保留底层页面上下文。', { role: 'secondary' }))  const drawer = new RenderDrawer({ title: '患者详情', side: 'right', width: 420, child: drawerContent })   const loadingPanel = new RenderStackPanel({ orientation: 'vertical', spacing: 8 })  loadingPanel.addChild(new RenderText('局部查询结果', { role: 'title', weight: 'semibold' }))  loadingPanel.addChild(new RenderText('生命体征、检验结果和处置建议仍保留原有布局。', { role: 'secondary' }))  const loadingContent = new RenderBorder({ background: 'muted', padding: 18, child: loadingPanel })  const loadingHost = new RenderLoadingHost({ child: loadingContent, text: '正在刷新患者数据…' })  let loading = false  let loadingButton!: RenderButton  loadingButton = new RenderButton({    label: '开启局部 Loading',    onClick: () => {      loading = !loading      loadingHost.setLoading(loading, loading ? '正在刷新患者数据…' : undefined)      loadingButton.label = loading ? '关闭局部 Loading' : '开启局部 Loading'      loadingButton.markNeedsLayout()      status.text = loading ? '当前只阻断查询结果区域。' : '局部查询已恢复交互。'    },  })   const actions = new RenderWrapPanel({ spacing: 10, runSpacing: 10 })  actions.addChild(new RenderButton({ label: '打开 Modal', variant: 'primary', onClick: () => modal.show() }))  actions.addChild(new RenderButton({ label: '打开 Drawer', onClick: () => drawer.show() }))  actions.addChild(new RenderButton({ label: '成功通知', onClick: () => notifications.show('success', '保存成功', '病历内容已经保存。') }))  actions.addChild(new RenderButton({ label: '警告通知', onClick: () => notifications.show('warning', '网络较慢', '后台正在自动重试。', 5000) }))  actions.addChild(loadingButton)   const panel = new RenderStackPanel({ orientation: 'vertical', spacing: 18, crossAxisAlignment: 'stretch' })  panel.addChild(new RenderPageHeader({ title: 'Overlay 与反馈语义', description: '同一页面中对比确认、侧栏、非阻断通知和局部加载。' }))  panel.addChild(actions)  loadingHost.height = 150  panel.addChild(loadingHost)  panel.addChild(status)  panel.padding = 24  return {    content: panel,    afterMount: () => drawer.show(),  }}