diff --git a/src/components/Post/Embed/StandardSiteEmbed/StandardSiteThemeProvider.tsx b/src/components/Post/Embed/StandardSiteEmbed/StandardSiteThemeProvider.tsx
index 0b787eddcf..00c15c4401 100644
--- a/src/components/Post/Embed/StandardSiteEmbed/StandardSiteThemeProvider.tsx
+++ b/src/components/Post/Embed/StandardSiteEmbed/StandardSiteThemeProvider.tsx
@@ -1,10 +1,12 @@
-import {useMemo} from 'react'
import {type AppBskyEmbedExternal} from '@atproto/api'
-import {ThemeProvider, useAlf, utils} from '#/alf'
+import {Context, useAlf, utils} from '#/alf'
/**
* Overrides only the values needed for `secondary_inverted` buttons atm.
+ *
+ * Renders the alf Context directly (rather than nesting a ThemeProvider) so
+ * that font-scale and other parent state stay live in the subtree.
*/
export function StandardSiteThemeProvider({
view,
@@ -14,77 +16,52 @@ export function StandardSiteThemeProvider({
children: React.ReactNode
}) {
const alf = useAlf()
- const themesOverride = useMemo(() => {
- const {accentRGB, accentForegroundRGB} = view.source?.theme || {}
- if (!accentRGB || !accentForegroundRGB) return alf.themes
+ const {accentRGB, accentForegroundRGB} = view.source?.theme || {}
+ if (!accentRGB || !accentForegroundRGB) return children
- const accent = utils.rgbToHex(accentRGB.r, accentRGB.g, accentRGB.b)
- const accentForeground = utils.rgbToHex(
- accentForegroundRGB.r,
- accentForegroundRGB.g,
- accentForegroundRGB.b,
- )
- const atoms = {
- text_inverted: {color: accentForeground},
- }
- const palette = {
- contrast_975: utils.darken(accent, 5), // hover
- contrast_900: accent, // bg
- contrast_600: utils.lighten(accent, 5), // disabled bg
- contrast_300: accentForeground, // disabled text
- }
- return {
- lightPalette: {
- ...alf.themes.lightPalette,
- ...palette,
- },
- darkPalette: {
- ...alf.themes.darkPalette,
- ...palette,
- },
- dimPalette: {
- ...alf.themes.dimPalette,
- ...palette,
- },
- light: {
- ...alf.themes.light,
- atoms: {
- ...alf.themes.light.atoms,
- ...atoms,
- },
- palette: {
- ...alf.themes.light.palette,
- ...palette,
- },
- },
- dark: {
- ...alf.themes.dark,
- atoms: {
- ...alf.themes.dark.atoms,
- ...atoms,
- },
- palette: {
- ...alf.themes.dark.palette,
- ...palette,
- },
- },
- dim: {
- ...alf.themes.dim,
- atoms: {
- ...alf.themes.dim.atoms,
- ...atoms,
- },
- palette: {
- ...alf.themes.dim.palette,
- ...palette,
- },
- },
- }
- }, [alf, view])
-
- return (
-
- {children}
-
+ const accent = utils.rgbToHex(accentRGB.r, accentRGB.g, accentRGB.b)
+ const accentForeground = utils.rgbToHex(
+ accentForegroundRGB.r,
+ accentForegroundRGB.g,
+ accentForegroundRGB.b,
)
+ const atomsOverride = {
+ text_inverted: {color: accentForeground},
+ }
+ const paletteOverride = {
+ contrast_975: utils.darken(accent, 5), // hover
+ contrast_900: accent, // bg
+ contrast_600: utils.lighten(accent, 5), // disabled bg
+ contrast_300: accentForeground, // disabled text
+ }
+
+ const themes = {
+ ...alf.themes,
+ lightPalette: {...alf.themes.lightPalette, ...paletteOverride},
+ darkPalette: {...alf.themes.darkPalette, ...paletteOverride},
+ dimPalette: {...alf.themes.dimPalette, ...paletteOverride},
+ light: {
+ ...alf.themes.light,
+ atoms: {...alf.themes.light.atoms, ...atomsOverride},
+ palette: {...alf.themes.light.palette, ...paletteOverride},
+ },
+ dark: {
+ ...alf.themes.dark,
+ atoms: {...alf.themes.dark.atoms, ...atomsOverride},
+ palette: {...alf.themes.dark.palette, ...paletteOverride},
+ },
+ dim: {
+ ...alf.themes.dim,
+ atoms: {...alf.themes.dim.atoms, ...atomsOverride},
+ palette: {...alf.themes.dim.palette, ...paletteOverride},
+ },
+ }
+
+ const value = {
+ ...alf,
+ themes,
+ theme: themes[alf.themeName],
+ }
+
+ return {children}
}