From c988f940fb613370dac988baefe1c1c21bfc6d8e Mon Sep 17 00:00:00 2001 From: Josh Black Date: Thu, 15 Oct 2026 15:42:00 -0500 Subject: [PATCH 1/5] perf(react-compiler): enable useSafeTimeout Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Copilot-Session: e632d4e3-54d2-4423-9888-8e37b00494a3 --- .changeset/react-compiler-safe-timeout.md | 5 +++++ packages/react/script/react-compiler.mjs | 1 - packages/react/src/hooks/useSafeTimeout.ts | 4 ++-- 3 files changed, 7 insertions(+), 3 deletions(-) create mode 100644 .changeset/react-compiler-safe-timeout.md diff --git a/.changeset/react-compiler-safe-timeout.md b/.changeset/react-compiler-safe-timeout.md new file mode 100644 index 00000000000..f03fcec132b --- /dev/null +++ b/.changeset/react-compiler-safe-timeout.md @@ -0,0 +1,5 @@ +--- +'@primer/react': minor +--- + +useSafeTimeout: Support automatic memoization with React Compiler. diff --git a/packages/react/script/react-compiler.mjs b/packages/react/script/react-compiler.mjs index dab247978a0..1999567b8a1 100644 --- a/packages/react/script/react-compiler.mjs +++ b/packages/react/script/react-compiler.mjs @@ -39,7 +39,6 @@ const unsupportedPatterns = [ 'src/hooks/useOnEscapePress.ts', 'src/hooks/useOnOutsideClick.tsx', 'src/hooks/useResizeObserver.ts', - 'src/hooks/useSafeTimeout.ts', 'src/internal/hooks/__tests__/useFocus.test.tsx', 'src/internal/hooks/useDevOnlyEffect.ts', 'src/utils/StressTest.tsx', diff --git a/packages/react/src/hooks/useSafeTimeout.ts b/packages/react/src/hooks/useSafeTimeout.ts index 2ee793c24d8..96922e6c813 100644 --- a/packages/react/src/hooks/useSafeTimeout.ts +++ b/packages/react/src/hooks/useSafeTimeout.ts @@ -26,9 +26,9 @@ export default function useSafeTimeout(): {safeSetTimeout: SetTimeout; safeClear }, []) useEffect(() => { + const timerSet = timers.current return () => { - // eslint-disable-next-line react-hooks/exhaustive-deps - for (const id of timers.current) { + for (const id of timerSet) { clearTimeout(id) } } From adfb9be19345cf07ab645715fe0d8eb917c7bd04 Mon Sep 17 00:00:00 2001 From: Josh Black Date: Thu, 15 Oct 2026 15:43:54 -0500 Subject: [PATCH 2/5] perf(react-compiler): enable token remove buttons Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>\nCopilot-Session: e632d4e3-54d2-4423-9888-8e37b00494a3 --- .changeset/react-compiler-token-remove-button.md | 5 +++++ packages/react/script/react-compiler.mjs | 1 - packages/react/src/Token/_RemoveTokenButton.tsx | 6 +++--- 3 files changed, 8 insertions(+), 4 deletions(-) create mode 100644 .changeset/react-compiler-token-remove-button.md diff --git a/.changeset/react-compiler-token-remove-button.md b/.changeset/react-compiler-token-remove-button.md new file mode 100644 index 00000000000..9e40058af25 --- /dev/null +++ b/.changeset/react-compiler-token-remove-button.md @@ -0,0 +1,5 @@ +--- +'@primer/react': minor +--- + +Token, IssueLabelToken: Improve rendering performance with React Compiler support. diff --git a/packages/react/script/react-compiler.mjs b/packages/react/script/react-compiler.mjs index 1999567b8a1..ba04a363905 100644 --- a/packages/react/script/react-compiler.mjs +++ b/packages/react/script/react-compiler.mjs @@ -25,7 +25,6 @@ const unsupportedPatterns = [ 'src/SelectPanel/SelectPanel.test.tsx', 'src/SelectPanel/SelectPanel.tsx', 'src/Skeleton/SkeletonBox.figma.tsx', - 'src/Token/_RemoveTokenButton.tsx', 'src/TreeView/TreeView.features.stories.tsx', 'src/TreeView/TreeView.tsx', 'src/deprecated/utils/create-slots.tsx', diff --git a/packages/react/src/Token/_RemoveTokenButton.tsx b/packages/react/src/Token/_RemoveTokenButton.tsx index 4ac007ca5cc..c02402d79b8 100644 --- a/packages/react/src/Token/_RemoveTokenButton.tsx +++ b/packages/react/src/Token/_RemoveTokenButton.tsx @@ -22,12 +22,14 @@ const RemoveTokenButton = ({ borderOffset = 0, as: _as, children: _children, + ref, ...rest }: React.PropsWithChildren) => { if (isParentInteractive) { return ( } tabIndex={-1} aria-label={ariaLabel} data-size={size} @@ -43,7 +45,6 @@ const RemoveTokenButton = ({ return (