label for = _r_7_-form-item -> owner tag = DIV
label class="…" for="_r_7_-form-item">Empty</label>
div class="text-sm text-muted-foreground" id="_r_7_-form-item"
aria-describedby="_r_7_-form-item-description" aria-invalid="false">No options available</div>
实施 #3976(内建 select 分支的 host id 落到真实 trigger)时顺手测到的相邻状态,与 #3976 的修法不相交,单独记录。
实测(probe,未提交;#3976 的修改对这一条无影响)
一个
{ name: 'empty', label: 'Empty', type: 'select', options: [] }:DOM:
即:选项为空(或 #2284 的依赖门态,
emptyHint分支)时,内建 select 渲染的是BuiltinSelectEmptyState那个div,FormControl(Radix Slot)下发的 id 就落在这个 div 上,而
FormLabel的for指向它。for只能指向可 label 元素(button / input / meter /output / progress / select / textarea),指向
div是惰性 HTML。与既有工作的关系
select分支把 host id 展开到 Radix Select.Root —— 手写 form schema 里type: 'select'的 labelfor全部悬空(#3306 的内建侧同形) #3976 修的是「有选项时 id 落到 Radix Root 被丢弃」;这一条是「无选项时 id 落到一个不可 label 的 div」,原因不同。for悬空,checkboxes / radio / rating / file 的for落在不可 label 的 div 上 #3961 / PR fix(fields,components): 复合/分组 field widget 的组标签改用 IDREF 关联(#3961) #3978 为不可 label 的复合控件引入了aria-labelledby的 IDREF 通道;但这里的空状态根本没有控件,所以「改成 IDREF」并不显然正确 —— 也可能应当在分支不渲染控件时干脆不发for(渲染器目前无从得知),或者给空状态一个语义角色。方向属于裁决,不在这里预设。影响面(诚实说:很小,所以按 observation 记)
getByLabelText('Empty')会抛"found a label … however no form control was found associated to that label",
读起来像渲染器坏了,而实际是空状态。
@object-ui/fields的OptionsEmptyState(注册 widget 路径的空状态),如果这一条要修,两条路径应一起看。严重度交 PM 分诊;这里只按 #4949 的纪律把事实与证据落到纸面。
参考
select分支把 host id 展开到 Radix Select.Root —— 手写 form schema 里type: 'select'的 labelfor全部悬空(#3306 的内建侧同形) #3976(内建 select 的 host id;本单在其 probe 中被测到)field:select从不向辅助技术播报校验状态 —— aria-invalid / aria-describedby / aria-required 被 Radix Select.Root 静默丢弃 #3306(widget 侧同机制)for悬空,checkboxes / radio / rating / file 的for落在不可 label 的 div 上 #3961 / PR fix(fields,components): 复合/分组 field widget 的组标签改用 IDREF 关联(#3961) #3978(不可 label 控件的 IDREF 命名通道)emptyHint)