新增 AutoRDO 需求清洗工作台与消息中枢,迭代 OneOS V2 设计规范及租赁合同/工作台/车辆等原型,同步云效技能与导航注册;并归档一批 legacy 原型快照。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
王冕
2026-07-28 15:50:35 +08:00
parent b14425da5a
commit 5d51a6bf7a
1393 changed files with 488042 additions and 10046 deletions

View File

@@ -0,0 +1,45 @@
import { useEffect, type RefObject } from 'react';
function isInsideContainers(
target: EventTarget | null,
containers: Array<RefObject<HTMLElement | null>>,
): boolean {
const node = target as Node | null;
if (!node) return false;
return containers.some((ref) => ref.current?.contains(node));
}
export function useDismissOnFocusOutside(
open: boolean,
containerRef: RefObject<HTMLElement | null> | Array<RefObject<HTMLElement | null>>,
onDismiss: () => void,
) {
useEffect(() => {
if (!open) return;
const containers = Array.isArray(containerRef) ? containerRef : [containerRef];
const closeIfOutside = (target: EventTarget | null) => {
if (!isInsideContainers(target, containers)) {
onDismiss();
}
};
const handlePointerDown = (event: MouseEvent) => {
closeIfOutside(event.target);
};
const handleFocusIn = () => {
window.requestAnimationFrame(() => {
closeIfOutside(document.activeElement);
});
};
document.addEventListener('mousedown', handlePointerDown);
document.addEventListener('focusin', handleFocusIn);
return () => {
document.removeEventListener('mousedown', handlePointerDown);
document.removeEventListener('focusin', handleFocusIn);
};
}, [open, onDismiss, containerRef]);
}