diff --git a/Template-01/src/components/layout/ThemeListener.tsx b/Template-01/src/components/layout/ThemeListener.tsx index 55dfcbb..138b795 100644 --- a/Template-01/src/components/layout/ThemeListener.tsx +++ b/Template-01/src/components/layout/ThemeListener.tsx @@ -2,43 +2,65 @@ import { useEffect } from 'react'; export function ThemeListener() { useEffect(() => { - const handleMessage = (event: MessageEvent) => { - // Allow messages from any origin since preview is generic + const handleMessage = (event: any) => { if (event.data?.type === 'UPDATE_APPEARANCE') { const settings = event.data.settings; if (!settings) return; - const root = document.documentElement; - - // Update Primary Color + let css = ''; + if (settings.primaryColor) { - root.style.setProperty('--color-brand-primary', settings.primaryColor); - root.style.setProperty('--color-brand-blue', settings.primaryColor); - root.style.setProperty('--color-brand-gold', settings.primaryColor); + css += "\n:root { " + + "--color-brand-primary: " + settings.primaryColor + " !important; " + + "--color-brand-blue: " + settings.primaryColor + " !important; " + + "--color-brand-gold: " + settings.primaryColor + " !important; " + + "--color-blue-500: " + settings.primaryColor + " !important; " + + "--color-blue-600: " + settings.primaryColor + " !important; " + + "--color-emerald-500: " + settings.primaryColor + " !important; " + + "--color-emerald-600: " + settings.primaryColor + " !important; " + + "} " + + ".text-brand-blue, .text-blue-600, .group-hover\\:text-blue-600:hover, .text-brand-gold, .text-emerald-600, .text-blue-500, .text-emerald-500 { color: " + settings.primaryColor + " !important; } " + + ".bg-brand-blue, .bg-blue-600, .hover\\:bg-blue-500:hover, .bg-brand-gold, .bg-emerald-600, .bg-blue-500, .bg-emerald-500 { background-color: " + settings.primaryColor + " !important; } " + + ".border-brand-blue, .border-blue-600, .focus\\:border-blue-600:focus, .border-brand-gold, .border-emerald-600, .border-blue-500, .border-emerald-500 { border-color: " + settings.primaryColor + " !important; } " + + ".fill-blue-600, .fill-emerald-600 { fill: " + settings.primaryColor + " !important; }"; } - // Update Background Color if (settings.backgroundColor) { - root.style.setProperty('--color-brand-bg', settings.backgroundColor); - document.body.style.backgroundColor = settings.backgroundColor; + css += "\n:root { --color-brand-bg: " + settings.backgroundColor + " !important; } " + + "body { background-color: " + settings.backgroundColor + " !important; }"; } - // Update Font Family if (settings.fontFamily) { - const fontLink = document.getElementById('dynamic-font') as HTMLLinkElement; + const fontLink = document.getElementById('dynamic-font'); const fontName = settings.fontFamily.replace(/ /g, '+'); + const fontUrl = 'https://fonts.googleapis.com/css2?family=' + fontName + ':wght@300;400;500;600;700&display=swap'; if (fontLink) { - fontLink.href = `https://fonts.googleapis.com/css2?family=${fontName}:wght@300;400;500;600;700&display=swap`; + (fontLink as HTMLLinkElement).href = fontUrl; } else { const link = document.createElement('link'); link.id = 'dynamic-font'; link.rel = 'stylesheet'; - link.href = `https://fonts.googleapis.com/css2?family=${fontName}:wght@300;400;500;600;700&display=swap`; + link.href = fontUrl; document.head.appendChild(link); } - root.style.setProperty('--font-sans', `"${settings.fontFamily}", sans-serif`); - document.body.style.fontFamily = `"${settings.fontFamily}", sans-serif`; + + css += "\n:root { " + + "--font-sans: \"" + settings.fontFamily + "\", sans-serif !important; " + + "--font-serif: \"" + settings.fontFamily + "\", serif !important; " + + "--font-mono: \"" + settings.fontFamily + "\", monospace !important; " + + "} " + + "body, h1, h2, h3, h4, h5, h6, .font-serif, .font-sans, .font-mono, p, span, a, button { " + + "font-family: \"" + settings.fontFamily + "\", sans-serif !important; " + + "}"; } + + let styleNode = document.getElementById('dynamic-theme-style'); + if (!styleNode) { + styleNode = document.createElement('style'); + styleNode.id = 'dynamic-theme-style'; + document.head.appendChild(styleNode); + } + styleNode.innerHTML = css; } }; diff --git a/Template-02/src/components/layout/ThemeListener.tsx b/Template-02/src/components/layout/ThemeListener.tsx index 55dfcbb..138b795 100644 --- a/Template-02/src/components/layout/ThemeListener.tsx +++ b/Template-02/src/components/layout/ThemeListener.tsx @@ -2,43 +2,65 @@ import { useEffect } from 'react'; export function ThemeListener() { useEffect(() => { - const handleMessage = (event: MessageEvent) => { - // Allow messages from any origin since preview is generic + const handleMessage = (event: any) => { if (event.data?.type === 'UPDATE_APPEARANCE') { const settings = event.data.settings; if (!settings) return; - const root = document.documentElement; - - // Update Primary Color + let css = ''; + if (settings.primaryColor) { - root.style.setProperty('--color-brand-primary', settings.primaryColor); - root.style.setProperty('--color-brand-blue', settings.primaryColor); - root.style.setProperty('--color-brand-gold', settings.primaryColor); + css += "\n:root { " + + "--color-brand-primary: " + settings.primaryColor + " !important; " + + "--color-brand-blue: " + settings.primaryColor + " !important; " + + "--color-brand-gold: " + settings.primaryColor + " !important; " + + "--color-blue-500: " + settings.primaryColor + " !important; " + + "--color-blue-600: " + settings.primaryColor + " !important; " + + "--color-emerald-500: " + settings.primaryColor + " !important; " + + "--color-emerald-600: " + settings.primaryColor + " !important; " + + "} " + + ".text-brand-blue, .text-blue-600, .group-hover\\:text-blue-600:hover, .text-brand-gold, .text-emerald-600, .text-blue-500, .text-emerald-500 { color: " + settings.primaryColor + " !important; } " + + ".bg-brand-blue, .bg-blue-600, .hover\\:bg-blue-500:hover, .bg-brand-gold, .bg-emerald-600, .bg-blue-500, .bg-emerald-500 { background-color: " + settings.primaryColor + " !important; } " + + ".border-brand-blue, .border-blue-600, .focus\\:border-blue-600:focus, .border-brand-gold, .border-emerald-600, .border-blue-500, .border-emerald-500 { border-color: " + settings.primaryColor + " !important; } " + + ".fill-blue-600, .fill-emerald-600 { fill: " + settings.primaryColor + " !important; }"; } - // Update Background Color if (settings.backgroundColor) { - root.style.setProperty('--color-brand-bg', settings.backgroundColor); - document.body.style.backgroundColor = settings.backgroundColor; + css += "\n:root { --color-brand-bg: " + settings.backgroundColor + " !important; } " + + "body { background-color: " + settings.backgroundColor + " !important; }"; } - // Update Font Family if (settings.fontFamily) { - const fontLink = document.getElementById('dynamic-font') as HTMLLinkElement; + const fontLink = document.getElementById('dynamic-font'); const fontName = settings.fontFamily.replace(/ /g, '+'); + const fontUrl = 'https://fonts.googleapis.com/css2?family=' + fontName + ':wght@300;400;500;600;700&display=swap'; if (fontLink) { - fontLink.href = `https://fonts.googleapis.com/css2?family=${fontName}:wght@300;400;500;600;700&display=swap`; + (fontLink as HTMLLinkElement).href = fontUrl; } else { const link = document.createElement('link'); link.id = 'dynamic-font'; link.rel = 'stylesheet'; - link.href = `https://fonts.googleapis.com/css2?family=${fontName}:wght@300;400;500;600;700&display=swap`; + link.href = fontUrl; document.head.appendChild(link); } - root.style.setProperty('--font-sans', `"${settings.fontFamily}", sans-serif`); - document.body.style.fontFamily = `"${settings.fontFamily}", sans-serif`; + + css += "\n:root { " + + "--font-sans: \"" + settings.fontFamily + "\", sans-serif !important; " + + "--font-serif: \"" + settings.fontFamily + "\", serif !important; " + + "--font-mono: \"" + settings.fontFamily + "\", monospace !important; " + + "} " + + "body, h1, h2, h3, h4, h5, h6, .font-serif, .font-sans, .font-mono, p, span, a, button { " + + "font-family: \"" + settings.fontFamily + "\", sans-serif !important; " + + "}"; } + + let styleNode = document.getElementById('dynamic-theme-style'); + if (!styleNode) { + styleNode = document.createElement('style'); + styleNode.id = 'dynamic-theme-style'; + document.head.appendChild(styleNode); + } + styleNode.innerHTML = css; } };