From 8286ff545cb7e06455df09061b6999a79a5f90c6 Mon Sep 17 00:00:00 2001 From: Alfajer Alrasheed Date: Tue, 1 Sep 2026 18:30:51 +0000 Subject: [PATCH] Refactor TooltipV2 drop logic --- .../ui/src/v2/components/tooltip-v2-utils.ts | 3 +++ .../ui/src/v2/components/tooltip-v2.test.ts | 19 +++++++++++++++++++ packages/ui/src/v2/components/tooltip-v2.tsx | 11 +++++++---- 3 files changed, 29 insertions(+), 4 deletions(-) create mode 100644 packages/ui/src/v2/components/tooltip-v2-utils.ts create mode 100644 packages/ui/src/v2/components/tooltip-v2.test.ts diff --git a/packages/ui/src/v2/components/tooltip-v2-utils.ts b/packages/ui/src/v2/components/tooltip-v2-utils.ts new file mode 100644 index 00000000..e387e3a7 --- /dev/null +++ b/packages/ui/src/v2/components/tooltip-v2-utils.ts @@ -0,0 +1,3 @@ +export function shouldDropBlock(expand: boolean, hovered: boolean, inside: boolean) { + return !expand && !hovered && !inside +} diff --git a/packages/ui/src/v2/components/tooltip-v2.test.ts b/packages/ui/src/v2/components/tooltip-v2.test.ts new file mode 100644 index 00000000..c36350ba --- /dev/null +++ b/packages/ui/src/v2/components/tooltip-v2.test.ts @@ -0,0 +1,19 @@ +import { describe, expect, test } from "bun:test" +import { shouldDropBlock } from "./tooltip-v2-utils" +describe("shouldDropBlock", () => { + test("drops the block when tooltip is not expanded, hovered, or focused", () => { + expect(shouldDropBlock(false, false, false)).toBe(true) + }) + + test("keeps the block while expanded", () => { + expect(shouldDropBlock(true, false, false)).toBe(false) + }) + + test("keeps the block while hovered", () => { + expect(shouldDropBlock(false, true, false)).toBe(false) + }) + + test("keeps the block while focus is inside", () => { + expect(shouldDropBlock(false, false, true)).toBe(false) + }) +}) \ No newline at end of file diff --git a/packages/ui/src/v2/components/tooltip-v2.tsx b/packages/ui/src/v2/components/tooltip-v2.tsx index 911307b6..9a57c48b 100644 --- a/packages/ui/src/v2/components/tooltip-v2.tsx +++ b/packages/ui/src/v2/components/tooltip-v2.tsx @@ -3,6 +3,7 @@ import { createEffect, Match, onCleanup, splitProps, Switch, type JSX } from "so import type { ComponentProps } from "solid-js" import { createStore } from "solid-js/store" import "./tooltip-v2.css" +import { shouldDropBlock } from "./tooltip-v2-utils" export interface TooltipV2Props extends ComponentProps { value: JSX.Element @@ -13,6 +14,8 @@ export interface TooltipV2Props extends ComponentProps { forceOpen?: boolean } + + export function TooltipV2(props: TooltipV2Props) { let ref: HTMLDivElement | undefined const [state, setState] = createStore({ @@ -40,10 +43,10 @@ export function TooltipV2(props: TooltipV2Props) { } const drop = (expand = state.expand) => { - if (expand) return - if (ref?.matches(":hover")) return - if (inside()) return - setState("block", false) + const hovered = ref?.matches(":hover") ?? false + if (shouldDropBlock(expand, hovered, inside())) { + setState("block", false) + } } const sync = () => {