mirror of
https://github.com/anotherhadi/ilovetui.git
synced 2026-10-05 10:58:26 +02:00
Vendored
+25
@@ -0,0 +1,25 @@
|
||||
// @bun
|
||||
// src/context/focus.ts
|
||||
import { CliRenderEvents } from "@opentui/core";
|
||||
import { useRenderer } from "@opentui/solid";
|
||||
import { createEffect, createSignal, onCleanup } from "solid-js";
|
||||
function isInside2(node, root) {
|
||||
if (!root)
|
||||
return false;
|
||||
for (let current = node;current; current = current.parent) {
|
||||
if (current === root)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
function useFocusWithin2(target) {
|
||||
const renderer = useRenderer();
|
||||
const [focused, setFocused] = createSignal(false);
|
||||
const sync = () => setFocused(isInside2(renderer.currentFocusedRenderable, target() ?? null));
|
||||
renderer.on(CliRenderEvents.FOCUSED_RENDERABLE, sync);
|
||||
onCleanup(() => renderer.off(CliRenderEvents.FOCUSED_RENDERABLE, sync));
|
||||
createEffect(sync);
|
||||
return focused;
|
||||
}
|
||||
|
||||
export { isInside2, useFocusWithin2 };
|
||||
Reference in New Issue
Block a user