From 4a151470c5045bae261c5904a0c68eca2d09495f Mon Sep 17 00:00:00 2001 From: Eugene Olonov Date: Wed, 21 Oct 2026 19:32:27 -0700 Subject: [PATCH 01/16] Render the copy button of code blocks through a portal instead of a separate React root React 19 removed ReactDOM.render() and unmountComponentAtNode(). The copy button is now rendered by createPortal() in the React tree of Web Chat, by the innermost scope (focus trap of the activity, or the composer) containing the element, so keyboard and focus events still reach the activity. --- .../behavior.escapeKey.html | 52 ++++++++ .../behavior.escapeKey.html.snap-1.png | Bin 0 -> 10680 bytes .../behavior.escapeKey.html.snap-2.png | Bin 0 -> 12753 bytes .../component/src/Transcript/FocusTrap.tsx | 3 + .../src/hooks/internal/useAutoResetState.ts | 2 - .../CustomElementPortalScope.tsx | 48 +++++++ .../CustomElements/CustomElementsComposer.tsx | 17 ++- .../customElements/CodeBlock.ts | 21 +--- .../customElements/CodeBlockCopyButton.tsx | 58 +++------ .../customElements/wrapAsCustomElement.ts | 90 ++++--------- .../private/CustomElementPortalRegistry.ts | 119 ++++++++++++++++++ .../private/CustomElementsContext.ts | 8 +- 12 files changed, 291 insertions(+), 127 deletions(-) create mode 100644 __tests__/html2/markdown/codeBlockCopyButton/behavior.escapeKey.html create mode 100644 __tests__/html2/markdown/codeBlockCopyButton/behavior.escapeKey.html.snap-1.png create mode 100644 __tests__/html2/markdown/codeBlockCopyButton/behavior.escapeKey.html.snap-2.png create mode 100644 packages/component/src/providers/CustomElements/CustomElementPortalScope.tsx create mode 100644 packages/component/src/providers/CustomElements/private/CustomElementPortalRegistry.ts diff --git a/__tests__/html2/markdown/codeBlockCopyButton/behavior.escapeKey.html b/__tests__/html2/markdown/codeBlockCopyButton/behavior.escapeKey.html new file mode 100644 index 0000000000..fd6b77204a --- /dev/null +++ b/__tests__/html2/markdown/codeBlockCopyButton/behavior.escapeKey.html @@ -0,0 +1,52 @@ + + + + Code block copy button: ESCAPE key leaves the activity + + + + + + +
+ + + diff --git a/__tests__/html2/markdown/codeBlockCopyButton/behavior.escapeKey.html.snap-1.png b/__tests__/html2/markdown/codeBlockCopyButton/behavior.escapeKey.html.snap-1.png new file mode 100644 index 0000000000000000000000000000000000000000..181fae46f0ccb33c1b9625821e5407d75dbc176e GIT binary patch literal 10680 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 {children} + {/* Keyboard and focus events of custom elements in the body, such as the copy button of code blocks, propagate to this focus trap. */} +