1

Funciona, e não é o DOM que resolve.

O arquivo:linha é um atributo carimbado na tag em build, então ele viaja junto com o nó. Se o JSX dentro do Dialog.Content é seu, o botão chega no fim do <body> já com o carimbo.

A cadeia de componentes sobe por fiber.return, que é a árvore de render, não a do DOM. O React mantém esse ponteiro através do portal, então Dialog > Card > Page sai certo mesmo com o nó fora de lugar.

Tem até uma detecção pra headless: se o nó clicado não tem carimbo próprio, comparo a cadeia dele com a do ancestral carimbado, e o que sobra é a biblioteca. O agente recebe avisado de que o arquivo é onde você usa o Radix, e pra não editar node_modules.

Agora, você me pegou num furo.

A busca pelo ancestral carimbado era closest(), ou seja, DOM. Se você clicasse num nó que o próprio Radix renderiza (o overlay, o popper wrapper), não tem carimbo — e a subida escapava do portal direto pro <body>. No Vite não achava nada. No Next era pior: o <body> do layout é carimbado, então responderia o layout, calado.

Já troquei essa subida por fiber.return também, e escrevi um teste com React e portal de verdade que confirma os dois lados: a cadeia atravessa, o closest() não. Saiu na 0.3.2.

Carregando publicação patrocinada...