diff --git a/packages/react-dom-bindings/src/client/ReactFiberConfigDOM.js b/packages/react-dom-bindings/src/client/ReactFiberConfigDOM.js index bbecbb663566..e4c45ccc4c3f 100644 --- a/packages/react-dom-bindings/src/client/ReactFiberConfigDOM.js +++ b/packages/react-dom-bindings/src/client/ReactFiberConfigDOM.js @@ -1435,8 +1435,13 @@ export function applyViewTransitionName( className: ?string, ): void { instance = ((instance: any): HTMLElement); + // If the name isn't valid CSS identifier, base64 encode the name instead. + // This doesn't let you select it in custom CSS selectors but it does work in current + // browsers. + const escapedName = + CSS.escape(name) !== name ? 'r-' + btoa(name).replace(/=/g, '') : name; // $FlowFixMe[prop-missing] - instance.style.viewTransitionName = name; + instance.style.viewTransitionName = escapedName; if (className != null) { // $FlowFixMe[prop-missing] instance.style.viewTransitionClass = className; diff --git a/packages/react-dom-bindings/src/server/fizz-instruction-set/ReactDOMFizzInstructionSetInlineCodeStrings.js b/packages/react-dom-bindings/src/server/fizz-instruction-set/ReactDOMFizzInstructionSetInlineCodeStrings.js index 4e7fb4b73f6f..cac2283236f2 100644 --- a/packages/react-dom-bindings/src/server/fizz-instruction-set/ReactDOMFizzInstructionSetInlineCodeStrings.js +++ b/packages/react-dom-bindings/src/server/fizz-instruction-set/ReactDOMFizzInstructionSetInlineCodeStrings.js @@ -8,7 +8,7 @@ export const clientRenderBoundary = export const completeBoundary = '$RB=[];$RV=function(a){$RT=performance.now();for(var b=0;ba&&2E3q&&2E3q&&2E3; } } + +declare class CSS { + static escape(str: string): string; +}