// LifeOSmax — light Apple-style landing with sales copy
const { useState, useEffect } = React;
// =========== APPLE CAMPAIGN TOKENS ===========
// App Store Connect → App Analytics → Sources mostra atribuição por campanha.
// IDs reais ficam em window.LIFEOS (preenchidos após publish na App Store).
function appStore(campaign) {
const cfg = window.LIFEOS || {};
const id = cfg.appStoreId || '0000000000';
const pt = cfg.applePt || 'TEAM_ID';
const ct = encodeURIComponent(campaign || 'unknown');
return `https://apps.apple.com/br/app/lifeosmax/id${id}?pt=${pt}&ct=${ct}&mt=8`;
}
function webLogin(email) {
const cfg = window.LIFEOS || {};
const base = cfg.webLoginUrl || 'http://localhost:8080/login';
const value = (email || '').trim();
if (!value) return base;
const url = new URL(base, window.location.origin);
url.searchParams.set('email', value);
return url.toString();
}
function webSignup(email) {
const cfg = window.LIFEOS || {};
const base = cfg.webSignupUrl || 'http://localhost:8080/login?mode=signup';
const value = (email || '').trim();
const url = new URL(base, window.location.origin);
if (value) url.searchParams.set('email', value);
return url.toString();
}
function normalizeEmail(value) {
return (value || '').trim().toLowerCase();
}
function isValidEmail(value) {
return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value) && value.length <= 254;
}
async function checkSignupEmailExists(rawEmail) {
const cfg = window.LIFEOS || {};
const normalizedEmail = normalizeEmail(rawEmail);
const supabaseUrl = cfg.supabaseUrl;
const supabaseAnonKey = cfg.supabaseAnonKey;
if (!supabaseUrl || !supabaseAnonKey) {
throw new Error('Variáveis do Supabase não encontradas.');
}
const response = await fetch(`${supabaseUrl}/functions/v1/check-signup-email`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${supabaseAnonKey}`,
apikey: supabaseAnonKey,
},
body: JSON.stringify({ email: normalizedEmail }),
});
const payload = await response.json().catch(() => null);
if (!response.ok || !payload?.success) {
throw new Error(payload?.error || 'Não foi possível verificar este e-mail.');
}
return Boolean(payload.exists);
}
// =========== TELEMETRY (CTR + page_view) ===========
// Edge Function pública — sem credencial no client.
// Fire-and-forget via fetch keepalive (sobrevive a navegação do link).
function track(eventType, props) {
const cfg = window.LIFEOS || {};
const endpoint = cfg.trackingEndpoint;
if (!endpoint) return;
try {
const qs = new URLSearchParams(window.location.search);
const payload = {
event_type: eventType,
cta_location: (props && props.location) || null,
cta_campaign: (props && props.campaign) || null,
page_url: window.location.href.slice(0, 500),
referrer: document.referrer ? document.referrer.slice(0, 500) : null,
utm_source: qs.get('utm_source'),
utm_medium: qs.get('utm_medium'),
utm_campaign: qs.get('utm_campaign'),
utm_term: qs.get('utm_term'),
utm_content: qs.get('utm_content'),
user_agent: (navigator.userAgent || '').slice(0, 400),
screen_w: window.innerWidth || null,
screen_h: window.innerHeight || null,
};
fetch(endpoint, {
method: 'POST',
keepalive: true,
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload),
}).catch(() => {});
} catch (e) {}
}
// Handler genérico pra CTA — dispara track sem bloquear navegação
function ctaClick(location, campaign) {
return () => track('cta_click', { location, campaign });
}
// Page view automático no mount (uma vez por sessão)
let pageViewSent = false;
function usePageView() {
useEffect(() => {
if (pageViewSent) return;
pageViewSent = true;
track('page_view');
}, []);
}
const I = ({ n, size = 18, color, sw = 1.75, style }) => (
);
// Compass logo (from DS) — used in nav + footer
function CompassLogo({ size = 40 }) {
return (
);
}
// =============== NAV ===============
function Nav() {
const [scrolled, setScrolled] = useState(false);
useEffect(() => {
const on = () => setScrolled(window.scrollY > 20);
on();
window.addEventListener('scroll', on, { passive: true });
return () => window.removeEventListener('scroll', on);
}, []);
return (
);
}
// =============== HERO ===============
function Hero() {
const [webAccessValue, setWebAccessValue] = useState('');
const [webAccessStatus, setWebAccessStatus] = useState('idle');
const [webAccessError, setWebAccessError] = useState('');
useEffect(() => {
const resetWebAccessState = () => setWebAccessStatus('idle');
const resetOnVisible = () => {
if (document.visibilityState === 'visible') resetWebAccessState();
};
window.addEventListener('pageshow', resetWebAccessState);
window.addEventListener('focus', resetWebAccessState);
document.addEventListener('visibilitychange', resetOnVisible);
return () => {
window.removeEventListener('pageshow', resetWebAccessState);
window.removeEventListener('focus', resetWebAccessState);
document.removeEventListener('visibilitychange', resetOnVisible);
};
}, []);
const submitWebAccess = async (event) => {
event.preventDefault();
const email = normalizeEmail(webAccessValue);
if (!isValidEmail(email)) {
setWebAccessError('Digite um e-mail válido.');
return;
}
setWebAccessStatus('checking');
setWebAccessError('');
track('cta_click', { location: 'hero_web_access', campaign: 'web_access' });
try {
const exists = await checkSignupEmailExists(email);
window.location.href = exists ? webLogin(email) : webSignup(email);
} catch (error) {
setWebAccessStatus('idle');
setWebAccessError(error?.message || 'Não foi possível verificar este e-mail.');
}
};
return (
Finanças, viagens — num só app
Sua vida em
equilíbrio.
Você planeja a viagem, define um orçamento, e o LifeOSmax separa esses gastos do seu mês. Quando volta, sabe exatamente quanto custou — sem confundir com o supermercado e a conta de luz.
{item.s}
Aponta a câmera pro recibo de papel, pra fatura no PDF, pro print do cartão. O LifeOSmax lê, classifica e lança nas suas finanças em três segundos, com 98% de confiança média.
Powered by GPT-4o VisionFunciona com qualquer formato — recibo amassado, NF-e, fatura PDF, captura do app do banco.
Reconhece o estabelecimento, identifica a categoria, separa impostos, detecta parcelamento.
Você revisa só o que a IA marcou como incerto. O resto entra direto nas suas finanças.
Não é um site embrulhado. É um app nativo, com integração real ao iOS — Face ID, widgets, notificações e atalhos via Siri.
Autenticação biométrica e armazenamento seguro nativo do iOS. Seus dados ficam criptografados no enclave do iPhone.
iOS 16+Widgets na tela inicial mostram saldo e próxima viagem. Atalhos via Siri pra registrar gastos com a voz.
Home ScreenLance transações sem internet. Quando voltar a conectar, tudo sincroniza em segundos — sem perda de dados.
Sync automáticoTratamos privacidade financeira como direito fundamental — não como argumento de venda. Sem revenda, sem "anonimizado", sem letrinha miúda.
Seus dados saem do dispositivo já criptografados (AES-256, TLS 1.3). Nem nossos engenheiros conseguem ler suas transações.
Exportação completa em JSON ou CSV, com um toque. Apagamento total em até 24h. Você pede, a gente cumpre — sem retenção, sem ligação.
Face ID e Keychain nativo do iOS. Sem senha pra esquecer, sem senha pra vazar em data breach.
Use a IA integrada nos planos pagos ou cadastre sua própria chave de IA no plano Business. Seus tokens, seu jogo, seus prompts.
Sem letrinha miúda. Sem trial countdown. Cancele com 1 toque, no app, sem precisar ligar pra ninguém.
{t.blurb}
Se tiver dúvida que não está aqui, escreve pra gente por email. A gente responde em até 24 horas em dias úteis.
atendimento@lifeosmax.comGrátis pra começar. 30 segundos pra criar conta. Zero burocracia, zero cartão de crédito exigido.