From 67ef7aea737ecde4d9eceb777d5a42194733bee4 Mon Sep 17 00:00:00 2001 From: claude-code-best Date: Sun, 14 Jun 2026 14:50:02 +0800 Subject: [PATCH] =?UTF-8?q?feat(effort):=20useRippleFrame=20hook=20?= =?UTF-8?q?=E5=8C=85=E8=A3=85=20useAnimationFrame=EF=BC=8C=E6=8C=89?= =?UTF-8?q?=E9=9C=80=E8=AE=A2=E9=98=85=E6=97=B6=E9=92=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: glm-5.2 --- src/components/EffortPanel/useRippleFrame.ts | 22 ++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 src/components/EffortPanel/useRippleFrame.ts diff --git a/src/components/EffortPanel/useRippleFrame.ts b/src/components/EffortPanel/useRippleFrame.ts new file mode 100644 index 000000000..c3019b105 --- /dev/null +++ b/src/components/EffortPanel/useRippleFrame.ts @@ -0,0 +1,22 @@ +import { type DOMElement, useAnimationFrame } from '@anthropic/ink' + +const RIPPLE_INTERVAL_MS = 60 + +/** + * ultracode 波纹动画 hook。 + * + * 设计: + * - 仅当 enabled=true(cursor === 'ultracode')时订阅时钟,pass null 时 + * useAnimationFrame 内部不订阅 ClockContext,setInterval 不触发。 + * - 返回 [ref, time]:ref 附到波纹容器(驱动 viewport-pause),time + * 用于 computeRippleLine 计算各行的波纹相位。 + * + * enabled=false 时返回 time=0(下游基于 enabled 直接不渲染波纹层, + * 但 0 仍是合法值,避免意外的 phase 输出 NaN)。 + */ +export function useRippleFrame( + enabled: boolean, +): [ref: (element: DOMElement | null) => void, time: number] { + const [ref, time] = useAnimationFrame(enabled ? RIPPLE_INTERVAL_MS : null) + return [ref, enabled ? time : 0] +}