From 42dbe90e52753f16880280bab5a2f24a93ba44a3 Mon Sep 17 00:00:00 2001 From: Kamil Emeleev Date: Tue, 28 Jul 2026 19:39:56 +0300 Subject: [PATCH 1/4] fix(components): correct Tooltip and Popover arrow alignment --- .../src/components/Popover/Popover.test.tsx | 96 ++++++- .../src/components/Popover/PopoverInner.tsx | 25 +- .../src/components/Popover/types.ts | 2 +- .../src/components/Tooltip/Tooltip.test.tsx | 80 +++++- .../src/components/Tooltip/Tooltip.tsx | 17 +- .../src/hooks/useOverlayArrowStyle/index.ts | 1 + .../useOverlayArrowStyle.test.ts | 253 ++++++++++++++++++ .../useOverlayArrowStyle.ts | 164 ++++++++++++ 8 files changed, 631 insertions(+), 7 deletions(-) create mode 100644 packages/components/src/hooks/useOverlayArrowStyle/index.ts create mode 100644 packages/components/src/hooks/useOverlayArrowStyle/useOverlayArrowStyle.test.ts create mode 100644 packages/components/src/hooks/useOverlayArrowStyle/useOverlayArrowStyle.ts diff --git a/packages/components/src/components/Popover/Popover.test.tsx b/packages/components/src/components/Popover/Popover.test.tsx index 3da2c874e..cef3d9c7d 100644 --- a/packages/components/src/components/Popover/Popover.test.tsx +++ b/packages/components/src/components/Popover/Popover.test.tsx @@ -1,6 +1,6 @@ import { createRef } from 'react'; -import { render, screen } from '@testing-library/react'; +import { render, screen, waitFor } from '@testing-library/react'; import { userEvent } from '@testing-library/user-event'; import { describe, expect, it, vi, beforeEach } from 'vitest'; @@ -64,6 +64,100 @@ describe('Popover', () => { expect(getRoot()).not.toHaveAttribute('data-arrow'); }); + it('should align the arrow for a compound placement', async () => { + const getBoundingClientRect = vi + .spyOn(HTMLElement.prototype, 'getBoundingClientRect') + .mockImplementation(function (this: HTMLElement) { + if (this.dataset.testid === 'root') { + return { + bottom: 64, + height: 64, + left: 0, + right: 200, + top: 0, + width: 200, + x: 0, + y: 0, + } as DOMRect; + } + + if (this.tagName === 'BUTTON') { + return { + bottom: 32, + height: 32, + left: 0, + right: 100, + top: 0, + width: 100, + x: 0, + y: 0, + } as DOMRect; + } + + return { + bottom: 0, + height: 0, + left: 0, + right: 0, + top: 0, + width: 0, + x: 0, + y: 0, + } as DOMRect; + }); + + const { rerender } = render( +