import { type Component, createEffect, createSignal, type JSX, splitProps } from "solid-js"; import { focusStyle } from "./focus.css"; import { createEventListenerMap } from "@solid-primitives/event-listener"; import { type MaybeAccessor, access } from "@solid-primitives/utils"; import clsx from "clsx/lite"; export namespace Focus { export type Props = & Omit< JSX.HTMLAttributes, | keyof JSX.CustomEventHandlersLowerCase | keyof JSX.CustomEventHandlersCamelCase | "children" > & { for: MaybeAccessor; onFocusChanged?: (value: boolean) => void; visible?: boolean; }; } export const Focus: Component = (props) => { const [local, others] = splitProps( props, ["ref", "for", "onFocusChanged", "visible", "class"], ); const [visible, setVisible] = createSignal(false); createEventListenerMap( local.for, { focusin: () => { setVisible(access(local.for).matches(":focus-visible")); }, focusout: () => void setVisible(false), pointerdown: () => void setVisible(false), } ); return (
) }