用途:在 Remix 仓库的 packages/ui 中新建或修订无样式(headless)UI 原语 API。公共 @remix-run/ui/* 入口来自 packages/ui/src/*,不通过 remix 包提供。
主要能力与结构:每个公共原语对应顶层 src/<name>.ts(x) 入口,并配 README、测试与 demos。低层行为模块如 anchor、popover、listbox;组合模块如 combobox、menu、select;独立控件如 accordion、tabs、toggle。新增或移动公共入口时需同步更新 packages/ui/package.json 的 exports 与 publishConfig.exports,公共入口使用扁平 ./<name> 路径。分层上,无样式原语负责行为、ARIA、注册、键盘、refs 与公开事件,导出具名 Provider 与 mixin;共享工具仅在多个原语已需要时放入 src/lib。组合关系向下流动,如 select 组合 popover 与 listbox,combobox 再接管输入、过滤与弹层时序。
使用方式:模块导出具名绑定,调用方用命名空间导入,例如 import * as select from '@remix-run/ui/select'。Provider 使用 Context、ItemContext、GroupContext,mixin 使用 trigger、popover、list、option 等短角色名。不要仅为分组导出而新增命名空间对象。组件采用两阶段形态:从 handle.props 读取 props,setup 作用域保存生命周期状态,用 handle.update() 调度渲染,DOM 相关工作用 handle.queueTask(),异步续接前检查信号。Provider 用带 getter 与方法的普通对象,不用 controller 类或事件发射器做内部协调。mixin 只负责一个角色与宿主元素,从 context 派生 ARIA 等属性,用 ref 注册并在 abort 信号中清理。公开事件采用常量名、事件类与 on... mixin 模式,并支持受控状态的回调 props。样式仅保留定位、可见性、滚动或交互所需的结构样式,视觉样式归使用方。行为变更需直接测试原语,并更新测试、demos、README 与变更文件。
限制:资料未提供安装命令、收费、平台或效果信息。