/* ============================================================ AppShowcase.jsx — "Apps web e mobile com IA" Showcase interativo: web app + tablet + celular, com abas por módulo (Gestão, Atendimento, Financeiro, Estoque, Vendas, RH). Escala responsiva via ScaleBox. ============================================================ */ /* ---- ScaleBox: encaixa um palco de tamanho fixo na largura do pai ---- Usa medição no mount + resize da janela (ResizeObserver não é confiável neste runtime). ---- */ const ScaleBox = ({ designW, designH, maxScale = 1, children }) => { const wrapRef = React.useRef(null); const [scale, setScale] = React.useState(maxScale); React.useLayoutEffect(() => { const measure = () => { const el = wrapRef.current; if (!el) return; const w = el.clientWidth; if (w > 0) setScale(Math.min(maxScale, w / designW)); }; measure(); const t1 = setTimeout(measure, 60); const t2 = setTimeout(measure, 400); window.addEventListener('resize', measure); return () => { clearTimeout(t1); clearTimeout(t2); window.removeEventListener('resize', measure); }; }, [designW, maxScale]); return (
{children}
); }; /* ---- molduras de dispositivos ---- */ const BrowserFrame = ({ children, style }) => (
{['#FF5F57', '#FEBC2E', '#28C840'].map(c => )}
app.suaempresa.com.br
{children}
); const PhoneFrame = ({ children, style }) => (
{children}
); /* ---- badges de loja (sem logos de terceiros) ---- */ const StoreBadge = ({ kind }) => { const apple = kind === 'apple'; return (
{ e.currentTarget.style.borderColor = 'rgba(0,94,255,0.45)'; e.currentTarget.style.background = 'rgba(0,94,255,0.08)'; }} onMouseLeave={e => { e.currentTarget.style.borderColor = 'rgba(255,255,255,0.14)'; e.currentTarget.style.background = 'rgba(255,255,255,0.03)'; }}> {apple ? ( ) : ( )}
{apple ? 'Disponível na' : 'Disponível no'}
{apple ? 'App Store' : 'Google Play'}
); }; /* ---- rótulo de dispositivo (ponto de acento + nome + papel) ---- */ const DeviceLabel = ({ name, role, accent = 'var(--ar-cyan)', style }) => (
{name} {role && } {role && {role}}
); /* ---- a seção ---- */ const AppShowcase = () => { const [active, setActive] = React.useState(0); const [paused, setPaused] = React.useState(false); const [narrow, setNarrow] = React.useState(false); const m = AR_MODULES[active]; React.useEffect(() => { const mq = window.matchMedia('(max-width: 860px)'); const on = () => setNarrow(mq.matches); on(); mq.addEventListener('change', on); return () => mq.removeEventListener('change', on); }, []); // recriar ícones lucide a cada troca de módulo / layout React.useEffect(() => { window.lucide && window.lucide.createIcons(); }); // auto-rotação apenas no desktop (desabilitada em touch/mobile para não interromper leitura) React.useEffect(() => { if (paused) return; const reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches; if (reduce || narrow) return; const t = setInterval(() => { if (!document.hidden) setActive(a => (a + 1) % AR_MODULES.length); }, 4600); return () => clearInterval(t); }, [paused, narrow]); const pick = (i) => { setActive(i); setPaused(true); }; return (
{/* glow de fundo */}
Sistemas web e mobile com IA integrada, sob medida para a sua operação} sub="Web app, tablet e mobile — um sistema completo para a sua empresa, com inteligência artificial integrada em cada módulo e personalizado para a sua realidade." subMobile="Web, tablet e mobile com IA integrada em cada módulo." /> {/* abas de módulo */}
{AR_MODULES.map((mod, i) => { const on = i === active; return ( ); })}
{/* palco dos dispositivos */}
setPaused(true)} style={{ marginTop: 30, position: 'relative' }} > {narrow ? ( /* ---------- mobile: pilha web app → mobile ---------- Cada dispositivo é centrado por um wrapper maxWidth e escalado pelo ScaleBox, evitando overflow em telas muito estreitas. */
) : ( /* ---------- desktop: dueto web app (protagonista) + celular ---------- Frames com box-sizing border-box → bases alinhadas em y=470; cluster simétrico (margens 180px) e rótulos centrados 22px abaixo. */
{/* brilho de chão sob os aparelhos (centrado no cluster) */}
{/* web app — protagonista (base 30+440=470) */} {/* celular — apoio direito, à frente (base 40+430=470) */}
)}
{/* legenda + badges de loja + CTA (blocos centrados e separados) */}
Interfaces ilustrativas — personalizadas para o seu negócio.
); }; window.AppShowcase = AppShowcase;