REAL SHOWCASE SOURCEpassword-field-security

1 个文件 · 98 行 · TypeScript

// ===== showcase/src/examples/components/password_field.ts ===== import {  RenderButton,  RenderFieldPresenter,  RenderPageHeader,  RenderPasswordField,  RenderStackPanel,  RenderText,  RenderWrapPanel,} from 'ds-ui' export function createPasswordFieldExample(): RenderStackPanel {  const status = new RenderText('密码默认以圆点隐藏;尾部眼睛按钮只改变显示方式,不改变真实值。', { role: 'secondary' })  const currentPassword = new RenderPasswordField({    value: 'Clinic@2026',    placeholder: '输入当前密码',    prefixText: '当前',    onRevealChange: revealed => {      status.text = revealed ? '当前密码已临时显示为明文。' : '当前密码已重新隐藏。'    },  })  const newPassword = new RenderPasswordField({    value: 'Medical#2026',    placeholder: '至少 10 位,包含数字和符号',    maxLength: 32,    status: 'success',    helperText: '强度良好:包含大小写字母、数字和符号。',    onChange: value => {      const strong = value.length >= 10 && /\d/.test(value) && /[^a-z0-9]/i.test(value)      newPassword.status = strong ? 'success' : 'warning'      newPassword.helperText = strong        ? '强度良好:包含数字和符号。'        : '建议至少 10 位,并包含数字和符号。'      status.text = `新密码已输入 ${value.length} 个字符。`    },  })  const confirmPassword = new RenderPasswordField({    value: 'Medical#2026',    placeholder: '再次输入新密码',    status: 'success',    helperText: '两次输入一致。',  })   const fields = new RenderStackPanel({ orientation: 'vertical', spacing: 12, crossAxisAlignment: 'stretch' })  fields.addChild(new RenderFieldPresenter({ label: '当前密码', required: true, child: currentPassword }))  fields.addChild(new RenderFieldPresenter({ label: '新密码', required: true, child: newPassword }))  fields.addChild(new RenderFieldPresenter({ label: '确认密码', required: true, child: confirmPassword }))  fields.addChild(new RenderFieldPresenter({    label: '只读凭据',    child: new RenderPasswordField({ value: 'ReadonlyToken', readonly: true, helperText: '只读字段仍可聚焦和复制。' }),  }))  fields.addChild(new RenderFieldPresenter({    label: '停用账号',    child: new RenderPasswordField({ value: 'DisabledSecret', disabled: true, helperText: '停用后不可聚焦或编辑。' }),  }))   const actions = new RenderWrapPanel({ spacing: 8, runSpacing: 8 })  actions.addChild(new RenderButton({    label: '显示全部',    onClick: () => {      currentPassword.showPassword()      newPassword.showPassword()      confirmPassword.showPassword()      status.text = '三个可编辑密码字段已显示为明文。'    },  }))  actions.addChild(new RenderButton({    label: '全部隐藏',    onClick: () => {      currentPassword.hidePassword()      newPassword.hidePassword()      confirmPassword.hidePassword()      status.text = '三个可编辑密码字段已隐藏。'    },  }))  actions.addChild(new RenderButton({    label: '更新访问密码',    variant: 'primary',    onClick: () => {      const matches = newPassword.value === confirmPassword.value      confirmPassword.status = matches ? 'success' : 'error'      confirmPassword.helperText = matches ? '密码已通过一致性校验。' : '两次输入的密码不一致。'      status.text = matches ? '访问密码已更新。' : '更新失败:请确认两次输入一致。'    },  }))   const panel = new RenderStackPanel({ orientation: 'vertical', spacing: 16, crossAxisAlignment: 'stretch' })  panel.addChild(new RenderPageHeader({    title: 'PasswordField 医疗门户凭据',    description: '演示密码掩码、眼睛按钮、强度反馈、一致性校验、只读和禁用状态。',  }))  panel.addChild(fields)  panel.addChild(actions)  panel.addChild(status)  panel.padding = 24  return panel}