diff --git a/.changeset/tricky-rings-divide.md b/.changeset/tricky-rings-divide.md
new file mode 100644
index 00000000000..54d59a565ba
--- /dev/null
+++ b/.changeset/tricky-rings-divide.md
@@ -0,0 +1,5 @@
+---
+"@clerk/clerk-js": minor
+---
+
+If a nonce is provided, it is now made available to Clerk's internal components. This allows the nonce to be passed in to style-src in CSPs and work correctly.
diff --git a/packages/clerk-js/src/ui/lazyModules/providers.tsx b/packages/clerk-js/src/ui/lazyModules/providers.tsx
index 5ffad3d9f06..8156534a846 100644
--- a/packages/clerk-js/src/ui/lazyModules/providers.tsx
+++ b/packages/clerk-js/src/ui/lazyModules/providers.tsx
@@ -12,6 +12,9 @@ const OptionsProvider = lazy(() => import('../contexts').then(m => ({ default: m
const AppearanceProvider = lazy(() => import('../customizables').then(m => ({ default: m.AppearanceProvider })));
const VirtualRouter = lazy(() => import('../router').then(m => ({ default: m.VirtualRouter })));
const InternalThemeProvider = lazy(() => import('../styledSystem').then(m => ({ default: m.InternalThemeProvider })));
+const StyleCacheProvider = lazy(() =>
+ import('../styledSystem/StyleCacheProvider').then(m => ({ default: m.StyleCacheProvider })),
+);
const Portal = lazy(() => import('./../portal').then(m => ({ default: m.Portal })));
const VirtualBodyRootPortal = lazy(() => import('./../portal').then(m => ({ default: m.VirtualBodyRootPortal })));
const FlowMetadataProvider = lazy(() => import('./../elements').then(m => ({ default: m.FlowMetadataProvider })));
@@ -26,11 +29,13 @@ type LazyProvidersProps = React.PropsWithChildren<{ clerk: any; environment: any
export const LazyProviders = (props: LazyProvidersProps) => {
return (
-
-
- {props.children}
-
-
+
+
+
+ {props.children}
+
+
+
);
};
diff --git a/packages/clerk-js/src/ui/styledSystem/InternalThemeProvider.tsx b/packages/clerk-js/src/ui/styledSystem/InternalThemeProvider.tsx
index 240869dc968..09677ad733d 100644
--- a/packages/clerk-js/src/ui/styledSystem/InternalThemeProvider.tsx
+++ b/packages/clerk-js/src/ui/styledSystem/InternalThemeProvider.tsx
@@ -1,19 +1,9 @@
// eslint-disable-next-line no-restricted-imports
-import createCache from '@emotion/cache';
-// eslint-disable-next-line no-restricted-imports
-import { CacheProvider, ThemeProvider } from '@emotion/react';
+import { ThemeProvider } from '@emotion/react';
import React from 'react';
import { useAppearance } from '../customizables';
-import type { InternalTheme } from './index';
-
-const el = document.querySelector('style#cl-style-insertion-point');
-
-const cache = createCache({
- key: 'cl-internal',
- prepend: !el,
- insertionPoint: el ? (el as HTMLElement) : undefined,
-});
+import type { InternalTheme } from './types';
type InternalThemeProviderProps = React.PropsWithChildren<{
theme?: InternalTheme;
@@ -22,9 +12,5 @@ type InternalThemeProviderProps = React.PropsWithChildren<{
export const InternalThemeProvider = (props: InternalThemeProviderProps) => {
const { parsedInternalTheme } = useAppearance();
- return (
-
- {props.children}
-
- );
+ return {props.children};
};
diff --git a/packages/clerk-js/src/ui/styledSystem/StyleCacheProvider.tsx b/packages/clerk-js/src/ui/styledSystem/StyleCacheProvider.tsx
new file mode 100644
index 00000000000..37564095c9f
--- /dev/null
+++ b/packages/clerk-js/src/ui/styledSystem/StyleCacheProvider.tsx
@@ -0,0 +1,26 @@
+// eslint-disable-next-line no-restricted-imports
+import createCache from '@emotion/cache';
+// eslint-disable-next-line no-restricted-imports
+import { CacheProvider } from '@emotion/react';
+import React, { useMemo } from 'react';
+
+const el = document.querySelector('style#cl-style-insertion-point');
+
+type StyleCacheProviderProps = React.PropsWithChildren<{
+ nonce?: string;
+}>;
+
+export const StyleCacheProvider = (props: StyleCacheProviderProps) => {
+ const cache = useMemo(
+ () =>
+ createCache({
+ key: 'cl-internal',
+ prepend: !el,
+ insertionPoint: el ? (el as HTMLElement) : undefined,
+ nonce: props.nonce,
+ }),
+ [props.nonce],
+ );
+
+ return {props.children};
+};