From d04f03b6b1c5800321f9fa641edd42588897186d Mon Sep 17 00:00:00 2001 From: null Date: Thu, 4 Jun 2026 01:50:40 -0500 Subject: [PATCH] fix: replace Portal with inline block to avoid Radix pointer-event capture --- client/components/BillMerchantRules.jsx | 64 ++++++++++--------------- 1 file changed, 26 insertions(+), 38 deletions(-) diff --git a/client/components/BillMerchantRules.jsx b/client/components/BillMerchantRules.jsx index 3561cb5..e299196 100644 --- a/client/components/BillMerchantRules.jsx +++ b/client/components/BillMerchantRules.jsx @@ -8,7 +8,6 @@ import { import { api } from '@/api'; import { cn } from '@/lib/utils'; import { Button } from '@/components/ui/button'; -import * as Portal from '@radix-ui/react-portal'; import { Input } from '@/components/ui/input'; // Debounce helper @@ -256,44 +255,33 @@ export default function BillMerchantRules({ billId, onRulesChanged }) { - {/* Suggestions — rendered in a Portal so the list escapes the BillModal's - overflow-y-auto container and is fully clickable regardless of scroll */} - {showSuggestions && filteredSuggestions.length > 0 && inputRef.current && ( - -
-

- Recent unmatched transactions -

-
- {filteredSuggestions.map(s => { - const amountVal = Math.abs(Number(s.amount || 0)) / 100; - return ( - - ); - })} -
+ {/* Suggestions — inline block, no absolute positioning. + Avoids overflow-y-auto clipping AND Radix Dialog pointer-event capture. */} + {showSuggestions && filteredSuggestions.length > 0 && ( +
+

+ Recent unmatched transactions +

+
+ {filteredSuggestions.map(s => { + const amountVal = Math.abs(Number(s.amount || 0)) / 100; + return ( + + ); + })}
- +
)} {/* Conflict warning */}