Skip to content

Commit 4c41b6b

Browse files
committed
fix: globalAppearance usage
1 parent 59578f6 commit 4c41b6b

3 files changed

Lines changed: 45 additions & 0 deletions

File tree

packages/ui/src/composed/OrganizationProfile/OrganizationProfileProvider.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,13 @@ export const OrganizationProfileProvider = (props: OrganizationProfileProviderPr
5050
customPages: [],
5151
};
5252

53+
const globalAppearance = clerk.__internal_getOption('appearance');
54+
5355
return (
5456
<StyleCacheProvider>
5557
<AppearanceProvider
5658
appearanceKey='organizationProfile'
59+
globalAppearance={globalAppearance}
5760
appearance={appearance}
5861
>
5962
<FlowMetadataProvider flow='organizationProfile'>

packages/ui/src/composed/UserProfile/UserProfileProvider.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,13 @@ export const UserProfileProvider = (props: UserProfileProviderProps): ReactNode
4949
customPages: [],
5050
};
5151

52+
const globalAppearance = clerk.__internal_getOption('appearance');
53+
5254
return (
5355
<StyleCacheProvider>
5456
<AppearanceProvider
5557
appearanceKey='userProfile'
58+
globalAppearance={globalAppearance}
5659
appearance={appearance}
5760
>
5861
<FlowMetadataProvider flow='userProfile'>

packages/ui/src/composed/__tests__/composed-provider-wiring.test.tsx

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
22

33
import { useModuleManager } from '@/ui/contexts';
4+
import { useAppearance } from '@/ui/customizables/AppearanceContext';
45
import { useRouter } from '@/ui/router';
56
import { bindCreateFixtures } from '@/test/create-fixtures';
67
import { render, screen } from '@/test/utils';
@@ -119,6 +120,44 @@ describe('UserProfileProvider wiring', () => {
119120
expect(screen.queryByTestId('should-not-render')).not.toBeInTheDocument();
120121
});
121122

123+
it('cascades globalAppearance from ClerkProvider into composed theme', async () => {
124+
setModuleManager({ import: vi.fn(() => Promise.resolve(undefined)) });
125+
126+
const { wrapper, fixtures } = await createFixtures(f => {
127+
f.withUser({ email_addresses: ['test@clerk.com'], first_name: 'Test', last_name: 'User' });
128+
});
129+
patchEnvironment(fixtures.clerk, fixtures.environment);
130+
131+
// Simulate ClerkProvider setting appearance with colorPrimary
132+
fixtures.clerk.__internal_getOption = vi.fn((key: string) => {
133+
if (key === 'appearance') {
134+
return { variables: { colorPrimary: '#ff0000' } };
135+
}
136+
return undefined;
137+
});
138+
139+
function AppearanceProbe() {
140+
const { parsedInternalTheme } = useAppearance();
141+
return (
142+
<div
143+
data-testid='appearance-probe'
144+
data-color-primary={parsedInternalTheme.colors.$primary500}
145+
/>
146+
);
147+
}
148+
149+
render(
150+
<UserProfileProvider>
151+
<AppearanceProbe />
152+
</UserProfileProvider>,
153+
{ wrapper },
154+
);
155+
156+
const probe = screen.getByTestId('appearance-probe');
157+
// #ff0000 = hsla(0, 100%, 50%, 1) — the global appearance should cascade
158+
expect(probe.dataset.colorPrimary).toBe('hsla(0, 100%, 50%, 1)');
159+
});
160+
122161
it('returns null when environment is missing', async () => {
123162
setModuleManager({ import: vi.fn(() => Promise.resolve(undefined)) });
124163

0 commit comments

Comments
 (0)