diff --git a/.changeset/nullable-text-small-switch.md b/.changeset/nullable-text-small-switch.md new file mode 100644 index 0000000..abb78de --- /dev/null +++ b/.changeset/nullable-text-small-switch.md @@ -0,0 +1,5 @@ +--- +"@inkcre/ui-web": patch +--- + +AutoForm 的普通 nullable 文本直接显示输入,未编辑时保留 null;清空值使用字段旁次级动作。Boolean 字段改用现有小号开关。 diff --git a/packages/web/MIGRATION.md b/packages/web/MIGRATION.md index b75f765..1e30733 100644 --- a/packages/web/MIGRATION.md +++ b/packages/web/MIGRATION.md @@ -1,3 +1,7 @@ +# 待发布:AutoForm 字段交互 + +普通 nullable 文本现在直接显示输入,不需要先点击“设置值”。未编辑的 null、未设置字段与空字符串仍各自保留;“清空值”显式置 null。Boolean 字段使用已有 sm 开关。公开模型与事件不变,重新构建即可采用;nullable object、array、Boolean、enum 与日期的状态选择沿用原语义。 + # 未发布:场景化加载、Dialog 动作与相对间距 InkLoading 默认仍为三个方块,用于内容区、图谱和预览等待。新增 `variant="spinner"` 与可见 `label`;没有可见标签时继续支持 aria-label。新增 InkSkeleton 单块骨架,用 class/style 定义具体宽高,整个区域由宿主提供一次加载说明。Loading、Skeleton 与 Button 等待图形响应 prefers-reduced-motion。 diff --git a/packages/web/skill.seed.json b/packages/web/skill.seed.json index d63075d..5968c7b 100644 --- a/packages/web/skill.seed.json +++ b/packages/web/skill.seed.json @@ -49,7 +49,7 @@ ], "composeWith": ["InkForm", "InkInput", "InkSwitch"], "apiCaveats": [ - "支持明确的对象、数组、nullable、本地 $defs/$ref 子集;不支持的 schema 使用 JSON 编辑。v-model:formData 保留已有值及额外属性,只为缺失值补默认值。", + "支持明确的对象、数组、nullable、本地 $defs/$ref 子集;不支持的 schema 使用 JSON 编辑。v-model:formData 保留已有值及额外属性,只为缺失值补默认值。普通 nullable 文本直接输入,未编辑保留 null,清空值显式置 null;Boolean 使用 sm 开关。", "embedded 允许字段嵌入现有 InkForm 而不嵌套 form;format: password 只遮蔽输入,不改变读写语义。", "数字为 number,空数字删除字段;日期保留 JSON 字符串,Picker 确认才序列化。", "validation(FormValidation) 的 valid/status/errors/rootErrors 控制保存,pending/invalid/error 均不可保存。实例隔离,过期结果不应用。" diff --git a/packages/web/skills/ui-web/references/components/InkAutoForm.md b/packages/web/skills/ui-web/references/components/InkAutoForm.md index 8d0d3cd..8971e99 100644 --- a/packages/web/skills/ui-web/references/components/InkAutoForm.md +++ b/packages/web/skills/ui-web/references/components/InkAutoForm.md @@ -103,7 +103,7 @@ export interface FormValidation { ## API Caveats -- 支持明确的对象、数组、nullable、本地 $defs/$ref 子集;不支持的 schema 使用 JSON 编辑。v-model:formData 保留已有值及额外属性,只为缺失值补默认值。 +- 支持明确的对象、数组、nullable、本地 $defs/$ref 子集;不支持的 schema 使用 JSON 编辑。v-model:formData 保留已有值及额外属性,只为缺失值补默认值。普通 nullable 文本直接输入,未编辑保留 null,清空值显式置 null;Boolean 使用 sm 开关。 - embedded 允许字段嵌入现有 InkForm 而不嵌套 form;format: password 只遮蔽输入,不改变读写语义。 - 数字为 number,空数字删除字段;日期保留 JSON 字符串,Picker 确认才序列化。 - validation(FormValidation) 的 valid/status/errors/rootErrors 控制保存,pending/invalid/error 均不可保存。实例隔离,过期结果不应用。 diff --git a/packages/web/src/components/inkAutoForm/inkAutoForm.scss b/packages/web/src/components/inkAutoForm/inkAutoForm.scss index 35fb0e2..0c429d4 100644 --- a/packages/web/src/components/inkAutoForm/inkAutoForm.scss +++ b/packages/web/src/components/inkAutoForm/inkAutoForm.scss @@ -62,6 +62,10 @@ gap: sys-var(space, sm); } + &__clear { + margin-top: sys-var(space, xs); + } + &__field-errors { display: flex; flex-direction: column; diff --git a/packages/web/src/components/inkAutoForm/inkAutoFormField.vue b/packages/web/src/components/inkAutoForm/inkAutoFormField.vue index 0d37825..f182843 100644 --- a/packages/web/src/components/inkAutoForm/inkAutoFormField.vue +++ b/packages/web/src/components/inkAutoForm/inkAutoFormField.vue @@ -37,6 +37,11 @@ const resolved = computed(() => resolveFormSchema(props.schema, props.root)); const mapping = computed(() => resolved.value ? mapSchemaPropertyToComponent(resolved.value) : null, ); +const directText = computed( + () => + resolved.value?.type === "string" && + (mapping.value?.component === "inkInput" || mapping.value?.component === "inkTextarea"), +); const entries = computed(() => Object.entries(resolved.value?.properties ?? {})); const items = computed(() => (Array.isArray(props.value) ? props.value : [])); function updateChild(key: string, value: unknown) { @@ -70,7 +75,7 @@ function updateScalar(value: unknown) {