From 11dc19ac9301cd65358ea3f4a646a27bf998f941 Mon Sep 17 00:00:00 2001 From: AI Studio Date: Fri, 15 May 2026 18:41:59 +0000 Subject: [PATCH] feat/fix: improve responsive constraints & add live ThemeListener --- Template-01/src/App.tsx | 2 + .../src/components/layout/ThemeListener.tsx | 50 +++++++++++++++++++ Template-01/src/index.css | 11 ++++ Template-02/src/App.tsx | 2 + .../src/components/layout/ThemeListener.tsx | 50 +++++++++++++++++++ Template-02/src/index.css | 11 ++++ 6 files changed, 126 insertions(+) create mode 100644 Template-01/src/components/layout/ThemeListener.tsx create mode 100644 Template-02/src/components/layout/ThemeListener.tsx diff --git a/Template-01/src/App.tsx b/Template-01/src/App.tsx index 0966220..80f4da4 100644 --- a/Template-01/src/App.tsx +++ b/Template-01/src/App.tsx @@ -1,3 +1,4 @@ +import { ThemeListener } from './components/layout/ThemeListener'; import { useState, useEffect } from "react"; import { motion, AnimatePresence } from "motion/react"; import { @@ -59,6 +60,7 @@ export default function App() { return (
+ Rafael Fontes | Corretor de Imóveis Premium diff --git a/Template-01/src/components/layout/ThemeListener.tsx b/Template-01/src/components/layout/ThemeListener.tsx new file mode 100644 index 0000000..55dfcbb --- /dev/null +++ b/Template-01/src/components/layout/ThemeListener.tsx @@ -0,0 +1,50 @@ +import { useEffect } from 'react'; + +export function ThemeListener() { + useEffect(() => { + const handleMessage = (event: MessageEvent) => { + // Allow messages from any origin since preview is generic + if (event.data?.type === 'UPDATE_APPEARANCE') { + const settings = event.data.settings; + if (!settings) return; + + const root = document.documentElement; + + // Update Primary Color + 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); + } + + // Update Background Color + if (settings.backgroundColor) { + root.style.setProperty('--color-brand-bg', settings.backgroundColor); + document.body.style.backgroundColor = settings.backgroundColor; + } + + // Update Font Family + if (settings.fontFamily) { + const fontLink = document.getElementById('dynamic-font') as HTMLLinkElement; + const fontName = settings.fontFamily.replace(/ /g, '+'); + if (fontLink) { + fontLink.href = `https://fonts.googleapis.com/css2?family=${fontName}:wght@300;400;500;600;700&display=swap`; + } 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`; + document.head.appendChild(link); + } + root.style.setProperty('--font-sans', `"${settings.fontFamily}", sans-serif`); + document.body.style.fontFamily = `"${settings.fontFamily}", sans-serif`; + } + } + }; + + window.addEventListener('message', handleMessage); + return () => window.removeEventListener('message', handleMessage); + }, []); + + return null; +} \ No newline at end of file diff --git a/Template-01/src/index.css b/Template-01/src/index.css index e680690..7718f5b 100644 --- a/Template-01/src/index.css +++ b/Template-01/src/index.css @@ -18,3 +18,14 @@ body { h1, h2, h3, h4, h5, h6 { @apply font-serif; } + + +html, body { + overflow-x: hidden; + width: 100%; + max-width: 100vw; +} + +img { + max-width: 100%; +} diff --git a/Template-02/src/App.tsx b/Template-02/src/App.tsx index d24d5f5..9ae3ead 100644 --- a/Template-02/src/App.tsx +++ b/Template-02/src/App.tsx @@ -1,3 +1,4 @@ +import { ThemeListener } from './components/layout/ThemeListener'; import { useState, useEffect } from "react"; import { motion, AnimatePresence } from "motion/react"; import { @@ -60,6 +61,7 @@ export default function App() { return (
+ Helena Fontes | Corretora de Imóveis Premium diff --git a/Template-02/src/components/layout/ThemeListener.tsx b/Template-02/src/components/layout/ThemeListener.tsx new file mode 100644 index 0000000..55dfcbb --- /dev/null +++ b/Template-02/src/components/layout/ThemeListener.tsx @@ -0,0 +1,50 @@ +import { useEffect } from 'react'; + +export function ThemeListener() { + useEffect(() => { + const handleMessage = (event: MessageEvent) => { + // Allow messages from any origin since preview is generic + if (event.data?.type === 'UPDATE_APPEARANCE') { + const settings = event.data.settings; + if (!settings) return; + + const root = document.documentElement; + + // Update Primary Color + 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); + } + + // Update Background Color + if (settings.backgroundColor) { + root.style.setProperty('--color-brand-bg', settings.backgroundColor); + document.body.style.backgroundColor = settings.backgroundColor; + } + + // Update Font Family + if (settings.fontFamily) { + const fontLink = document.getElementById('dynamic-font') as HTMLLinkElement; + const fontName = settings.fontFamily.replace(/ /g, '+'); + if (fontLink) { + fontLink.href = `https://fonts.googleapis.com/css2?family=${fontName}:wght@300;400;500;600;700&display=swap`; + } 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`; + document.head.appendChild(link); + } + root.style.setProperty('--font-sans', `"${settings.fontFamily}", sans-serif`); + document.body.style.fontFamily = `"${settings.fontFamily}", sans-serif`; + } + } + }; + + window.addEventListener('message', handleMessage); + return () => window.removeEventListener('message', handleMessage); + }, []); + + return null; +} \ No newline at end of file diff --git a/Template-02/src/index.css b/Template-02/src/index.css index 3834f93..ba4b320 100644 --- a/Template-02/src/index.css +++ b/Template-02/src/index.css @@ -18,3 +18,14 @@ body { h1, h2, h3, h4, h5, h6 { @apply font-serif; } + + +html, body { + overflow-x: hidden; + width: 100%; + max-width: 100vw; +} + +img { + max-width: 100%; +}