Communitygithub.com

浮动UI技能

实现或审查浮动桌面UI,如下拉菜单、弹出框、工具提示、菜单、组合框以及嵌套覆盖层,位于 apps/desktop 目录下。

浮动UI技能 是什么?

该技能专注于在桌面应用程序中使用 `@floating-ui/dom` 实现浮动UI元素,如下拉菜单、弹出框、工具提示、菜单和组合框。它强调通过 `createPortal` 将覆盖层渲染到 `document.body`,以避免布局和堆叠上下文的剪切问题,并使用 `computePosition` 和 `autoUpdate` 进行动态定位。技能要求从已有的 UI 组件库中复制中点配置,并将计算出的坐标存储在 React 状态中,而不是直接修改样式。交互规则详细说明了保持触发器的焦点边框、正确处理外部点击(包括嵌套覆盖层)、键盘退出以及焦点返回,同时确保符合 ARIA 无障碍标准。该技能适用于使用 React 和 TypeScript 的桌面应用开发环境,特别是在 `apps/desktop/src/components/ui` 路径下,目的是确保所有浮动 UI 组件行为一致、可访问且视觉上健壮。

兼容平台~Claude Code~Codex CLI✓Cursor
npx skills add https://github.com/Professor-Chen/cursor-byok/tree/HEAD/.agents/skills/floating-ui

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

浮动 UI

对所有相对于触发器定位的交互元素使用 @floating-ui/dom。不要手动计算坐标或依赖 CSS 绝对偏移来实现下拉菜单、弹出框、菜单、组合框列表或工具提示。

必需结构

  • 通过 createPortal(..., document.body) 渲染覆盖层,以避免布局和堆叠上下文将其裁剪。
  • 在 autoUpdate 内部使用 computePosition 进行定位;当覆盖层关闭或卸载时,清理 autoUpdate 返回的函数。
  • 从 apps/desktop/src/components/ui 中最接近的现有控件开始。匹配其 placement、offset、flip、shift 和 size 中间件,除非交互要求有意识的不同。
  • 将计算出的 left、top、width 和可用高度存储在 React 状态中。将状态应用于门户根元素;不要直接修改元素样式。
  • 当参考元素宽度或视口高度限制了覆盖层时,使用 size。可能增长的列表必须使用 components/virtual/VirtualList.tsx;将固定的页眉和页脚保持在虚拟视口之外。

交互不变规则

  • 当焦点位于门户覆盖层内部时,保持触发器的打开/焦点边框可见。
  • 在外部指针交互和 Escape 键时关闭,然后将焦点返回到触发器。
  • 外部点击检查必须同时包含触发器和覆盖层。嵌套的门户覆盖层必须阻止其指针事件到达父级的外部点击监听器,这样与子菜单交互永远不会关闭其父菜单。
  • 使用 aria-expanded、aria-controls 和适当的 aria-haspopup 暴露触发器状态;为覆盖层赋予匹配的菜单、列表框、对话框或工具提示语义。
  • 验证在所有视口边缘的放置、嵌套覆盖层点击、键盘关闭、虚拟滚动和固定页脚行为。

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

相关技能