Widgets:无样式引擎构件

@dopejs/pingo-widgets 是引擎之上的第一层组合:它把 可编辑原语与焦点、原生事件装配成可用构件,附带最小 装饰(边框、错误态),不假设任何设计系统。业务不直接依赖这个内部包——全部导出都经 @dopejs/pingo 再导出。下方预览实时渲染、可直接输入。

导出与命名

导出 说明
TextField 单行输入:边框 + 错误态装饰,内部只组合 editableText 原语
TextArea 多行变体;Enter 换行,submit 留给宿主表单
Pressable 可聚焦的激活表面:View + 焦点 + 原生 click/tap
Button Pressable + Text 的文本按钮便捷组合

命名注意:@dopejs/pingo 里的 TextArea 指这个带装饰的 widget;多行原语UnstyledTextArea 导出(TextAreaProps 同理有别名 UnstyledTextAreaProps)。

TextField 与 TextArea

默认装饰是 1px 边框、8px 内边距;传入 error 字符串时切换为错误色边框,并在字段下方 渲染一条 alert 角色的错误说明。受控契约(value + revision + onTransaction)与 可编辑元素完全相同——widget 不引入新的输入路径。

import { createElement, TextField } from "@dopejs/pingo";

createElement(TextField, {
  value,
  revision,
  semanticLabel: "收件人",
  width: 320,
  error: value === "" ? "收件人不能为空" : undefined,
  onTransaction: (t) => apply(t),
});

Props(TextField)

Prop 类型 默认值 说明
value string "" 受控文本
revision number | bigint 0n 受控值的权威 revision
controller TextEditingController 本地 controller;与 value/revision 互斥
readOnly boolean 只读
password boolean 密码模式(明文不进 DisplayList 与无障碍值)
maxGraphemes number grapheme 上限
inputMode EditableInputMode 软键盘布局提示
width number 240 含边框的整体宽度
height number lineHeight × rows + 16 含边框的整体高度
fontSize number 14 字号
lineHeight number round(fontSize × 1.5) 行高
color Color #1f2329ff 文本颜色
backgroundColor Color #ffffffff 字段底色
borderColor Color #c0c4ccff 边框颜色
errorColor Color #d03050ff 错误态边框与说明颜色
error string 非空即错误态:错误色边框 + 下方错误说明
onTransaction (t: EditTransaction) => void Core 编辑事务回调
onSubmit () => void 单行 Enter 提交
semanticLabel string 无障碍名称(角色恒为 textbox

TextArea 在此基础上多一个 rows(默认 3),用于计算默认高度。

Pressable 与 Button

Pressable 不引入新的 Scene 节点种类:它就是一个带 button 语义、按下时自动取焦点、 把原生 click/tap 映射成 onPressView。样式完全由 stylechildren 决定, disabled 时降透明度并摘除事件。

Prop 类型 默认值 说明
children PingoNode 内容(Button 为 string | number,必填)
disabled boolean false 禁用态
onPress () => void 激活回调
className string 类名(接样式表)
style PingoStyle 内联样式
width / height number 尺寸
semanticLabel string Buttonchildren 无障碍名称

Button 额外接受 colorfontSize(传给内部文本)。

与 @dopejs/pingo-ui 的边界

两层回答不同的问题:

  • widgets —— 行为正确性:编辑事务、焦点、语义角色、最小装饰。不含任何设计意见, 颜色字号全部可覆写。
  • @dopejs/pingo-ui —— 设计系统:shadcn 心智的完整组件(变体、尺寸、主题、样式表), 内部组合 widgets、@dopejs/pingo-editing 与运行时 hooks,对引擎零改动。

选型建议:要现成的设计系统,直接用 pingo-ui 组件;自带设计语言但不想 碰编辑事务细节,用 widgets 做地基;完全自定义(如游戏 HUD),直接用 基础元素原语。

无障碍

TextField / TextArea 自带 textbox 角色,error 说明为 alert 角色; Pressable / Buttonbutton 角色,disabled 通过 semanticValue 暴露。 名称都靠 semanticLabel——没有可见 label 时不要省略。详见无障碍

最后更新: