Skip to content

Commit 0b24a0e

Browse files
fix(core): pick mode keeps its highlight on the hovered element and offers it on click (#4538)
1 parent cb8e799 commit 0b24a0e

2 files changed

Lines changed: 35 additions & 1 deletion

File tree

‎packages/core/src/runtime/picker.test.ts‎

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ describe("createPickerModule", () => {
9292
picker.enablePickMode();
9393
picker.enablePickMode();
9494
expect(document.body.classList.contains("__hf-pick-active")).toBe(true);
95+
picker.disablePickMode();
9596
});
9697

9798
it("disabling when not active is safe", () => {
@@ -353,6 +354,39 @@ describe("createPickerModule", () => {
353354
});
354355
});
355356

357+
describe("pick mode under a resting pointer", () => {
358+
const at = (id: string) => document.getElementById(id)!;
359+
const move = () =>
360+
document.dispatchEvent(
361+
new MouseEvent("mousemove", { clientX: 10, clientY: 10, bubbles: true }),
362+
);
363+
364+
it("keeps the highlight on what the pointer is over, and offers it on click", () => {
365+
const postMessage = createMockPostMessage();
366+
const picker = createPickerModule({ postMessage });
367+
picker.installPickerApi();
368+
document.body.innerHTML = `<div id="bg" style="background: rgb(245, 238, 220)"><h1 id="title">Hi</h1></div>`;
369+
const restore = emulateHitTest(() => [at("title"), at("bg")]);
370+
try {
371+
picker.enablePickMode();
372+
move();
373+
move();
374+
expect(at("title").classList.contains("__hf-pick-highlight")).toBe(true);
375+
expect(at("bg").classList.contains("__hf-pick-highlight")).toBe(false);
376+
document.dispatchEvent(
377+
new MouseEvent("click", { clientX: 10, clientY: 10, bubbles: true }),
378+
);
379+
const picked = postMessage.mock.calls
380+
.map(([message]) => message)
381+
.find((message) => message.type === "element-pick-candidates");
382+
expect(picked.candidates.map((c: any) => c.selector)).toEqual(["#title", "#bg"]);
383+
} finally {
384+
picker.disablePickMode();
385+
restore();
386+
}
387+
});
388+
});
389+
356390
describe("escape key handler", () => {
357391
it("disables pick mode and posts cancel message on Escape", () => {
358392
const postMessage = createMockPostMessage();
@@ -377,6 +411,7 @@ describe("createPickerModule", () => {
377411

378412
document.dispatchEvent(new KeyboardEvent("keydown", { key: "Enter", bubbles: true }));
379413
expect(document.body.classList.contains("__hf-pick-active")).toBe(true);
414+
picker.disablePickMode();
380415
});
381416
});
382417

‎packages/core/src/runtime/picker.ts‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,6 @@ export function createPickerModule(deps: PickerModuleDeps): PickerModule {
150150
if (!el || el === document.body || el === document.documentElement) return false;
151151
const tag = el.tagName.toLowerCase();
152152
if (tag === "script" || tag === "style" || tag === "link" || tag === "meta") return false;
153-
if (el.classList.contains("__hf-pick-highlight")) return false;
154153
if (passThroughRoots.has(el)) return false;
155154
if (el.closest(PICKER_IGNORE_SELECTOR)) return false;
156155
if (isEffectivelyHidden(el as HTMLElement)) return false;

0 commit comments

Comments
 (0)