0%
Salvo
Matemática Extraordinária • Lett&Co

Sua vida também
entra na conta.

Em poucos minutos, você vai enxergar onde sua rotina está apertando, o que merece proteção e qual movimento faz sentido para os próximos 90 dias.

✨ Você não precisa preencher tudo 8–12 min • avance com o que souber • detalhes ficam opcionais
◷ tempoR$ dinheiro◎ apoio↗ estrutura✦ futuro
01 • COMO ESTOU HOJE

Vamos começar pelo que você sente na prática.

Sem pensar demais: dê notas para como essas áreas estão funcionando nas últimas semanas. Você não precisa responder tudo para continuar.

🌡️
Faça só isso agora1–2 min

Dê nota para pelo menos 5 áreas. 1 = está difícil • 5 = está funcionando bem.

Você pode seguir no seu ritmo.
Referência temporalúltimas 2–4 semanasescala 1–5
👆 COMECE AQUI

Roda da Vida Extraordinária

Escolha de 1 a 5 somente quando fizer sentido responder. Nada começa preenchido. A roda muda junto com você.

EU
🌡️ Quero aprofundar como minha rotina está cabendo opcional

Termômetro da realidade

Adicionar uma frase que costuma aparecer nos dias difíceis opcional
02 • TEMPO + DINHEIRO

Agora vamos colocar tempo e dinheiro na mesma conta.

Aqui a regra é simples: tempo = horas por dia. Dinheiro = média por mês. Se souber, responda. Se não souber, deixe vazio.

Pense em um dia comum2 min

Preencha as horas que você consegue estimar. Depois, se quiser, inclua sua média mensal de dinheiro.

Você pode seguir no seu ritmo.
Unidadestempo = horas/diadinheiro = R$/mês
1 • TEMPO DO DIA
Bloco do dia
média h/dia
observação opcional
Sono e cuidados básicos
Trabalho / operação
Deslocamento
Cuidado direto
Casa / tarefas
Estudo / compromissos
Administrativo / carga mental
Horas comprometidas0h
Horas ainda livres24h
Pressão do relógioleve
Déficit matemático
“Tecnicamente, todo mundo tem 24 horas. Operacionalmente… temos algumas dúvidas.”
2 • DINHEIRO DO MÊS

Quanto entra e quanto custa manter a vida hoje?

Caixa
R$/mês
O que entra
Renda líquida
salário, pró-labore, renda variável, benefícios
Moradia e básico
moradia, contas e alimentação
Custo de trabalhar
transporte, internet, ferramentas, alimentação fora
Custo de cuidar
escola, perua, cuidadora, terapia, apoio
Saúde e proteção
saúde, medicamentos, seguros
Imprevistos / manutenção
cancelamentos, urgências, manutenção
RendaR$ 0
CustosR$ 0
Saldo / déficitR$ 0
Preencha a renda e os custos que fizerem sentido. Campo vazio não será tratado como zero.
Custos invisíveis aprofundar • opcional

Abra se quiser mapear tempo, energia e oportunidades que pesam sem virar boleto. Isso deixa o índice de carga mais completo.

Marque o que não vira boleto, mas pesa

03 • APOIO + LOGÍSTICA

Quem ajuda a vida a funcionar — e onde ela emperra?

Pense em pessoas, serviços, combinados e dificuldades reais. Uma resposta concreta já ajuda a enxergar melhor sua rede.

🤝
Pense em apoio concreto1 min

Quem soma? Onde existe fricção? Qual ajuda específica você poderia pedir?

Você pode seguir no seu ritmo.
👥 UMA RESPOSTA CONCRETA JÁ AJUDA
Horários, deslocamento, burocracia e acessibilidade aprofundar

Preencha somente o que realmente pesa hoje.

Horário

Escola, terapia, serviço público e trabalho nem sempre conversam.

Ver mapa visual da rede opcional
MAPA DA REDE

Quem está perto, quem pode entrar e onde existe fricção?

A visualização usa apenas o que você escreveu. Ela não classifica pessoas automaticamente.

Rede a construir
Apoio possível
Apoio próximo
EU
Quem somaAinda não preenchido
FricçõesAinda não preenchido
Próximo pedidoAinda não preenchido
Refletir sobre um cuidado/profissional opcional

Esse cuidado / profissional está ajudando de verdade?

04 • TRABALHO + ESTRUTURA

Escolha uma coisa que está ocupando espaço demais.

Não mapeie seu trabalho inteiro. Comece com uma tarefa que se repete ou depende demais de você.

⚙️
Comece com UMA tarefa1–2 min

Escolha algo repetitivo ou que rouba energia. Só uma tarefa já é suficiente para esta etapa.

Você pode seguir no seu ritmo.
Tempo das tarefasfrequência = vezes/mêsduração = min/vez
⚙️ ESCOLHA SÓ 1 TAREFA PARA COMEÇAR
ANALISADOR DE TAREFAS

Liste só o que pesa ou se repete

A sugestão é uma leitura prática. Você continua decidindo com contexto.

Precisa continuar humano0
Pede estrutura0
Tempo potencialmente recuperável0h/mês
Adicione uma tarefa para começar a enxergar.
Tenho negócio ou trabalho autônomo • calcular sustentabilidade opcional

Horas = por semana. Custos e meta = R$/mês. Abra apenas se esta conta fizer sentido para você.

Horas realmente vendáveis

Horas vendáveis / semana0h
Horas vendáveis / mês0h
Capacidade usada0%

Minha matemática do negócio

Categoria
R$ / mês
Observação
Custo do negócio
ferramentas, equipe, impostos operacionais, estrutura
Vida pessoal / pró-labore
quanto a operação precisa sustentar para você
Impostos / taxas
valor mensal estimado
Reserva / proteção
imprevistos, baixa sazonal, segurança
Meta mínima mensalR$ 0
Referência média / horaR$ 0
Saldo vida atualR$ 0
A referência por hora é pedagógica. Não define sozinha o preço final, posicionamento ou proposta comercial.
Entender este cálculo
Meta mínima mensal = custo do negócio + vida pessoal/pró-labore + impostos/taxas + reserva.
Referência média por hora = meta mínima ÷ horas realmente vendáveis no mês.
É uma referência de sustentabilidade, não uma recomendação automática de preço.

Custos invisíveis que deveriam entrar na precificação

05 • PROTEÇÃO + FUTURO

O que você precisa proteger para continuar avançando?

Escolha um limite, uma ajuda ou um futuro que não pode continuar ficando para depois. O restante pode ser preenchido quando fizer sentido.

🛡️
Escolha o que merece proteção1–2 min

Um limite, uma ajuda ou um sonho já bastam. Reservas e conversas são aprofundamentos.

Você pode seguir no seu ritmo.
Posso rever meus limites
Posso pedir ajuda
Posso rever o que estou subsidiando
Posso construir no meu ritmo
💰 Quero planejar uma reserva opcional

Reservas-alvo • valor total desejado

Informe valores-alvo totais, não valores mensais. Ex.: “quero construir R$ 2.000 de Reserva da Paz”.

Reserva da Paz
Futuro
Estudos
Casa
Imprevistos
🌱 UM SONHO JÁ É SUFICIENTE
FUTURO TAMBÉM ENTRA NA CONTA

Um sonho é suficiente para começar

Comece pelo que mais importa agora. Se quiser, adicione outros depois.

Uma conversa que pode reorganizar a vida opcional

Conversas que organizam a vida

Família:
“Hoje, o que eu mais preciso é...”
Profissional:
“Preciso de um cuidado que respeite meu contexto e organize a rotina...”
Cliente:
“Meu prazo precisa considerar a qualidade do trabalho e a logística real...”
Rede de apoio:
“Você pode me ajudar especificamente com...”
06 • PRÓXIMOS 90 DIAS

Feche o mapa com um foco para os próximos 90 dias.

Você só precisa sair daqui com 1 prioridade, 1 número para acompanhar e uma data para voltar. O plano detalhado é opcional.

🎯
Só três decisões1 min

1 prioridade • 1 indicador • 1 data de revisão. Isso já fecha seu ciclo trimestral.

Você pode seguir no seu ritmo.
Ciclo trimestral0–30 dias • proteger31–60 • estruturar61–90 • consolidar
1 • ESCOLHA O FOCO
FOCO DO TRIMESTRE

Escolha até três prioridades

Se você preencher apenas uma, já é suficiente.

2 • DEFINA COMO VOCÊ VAI PERCEBER MUDANÇA

Um número + uma data

Não precisa ser financeiro. Pode ser horas livres, energia, cancelamentos, saldo, sono ou outro indicador simples.

Sugerimos 3 meses depois da data desta fotografia. Você pode alterar.
🗓️ Quero detalhar meu plano de 90 dias opcional

Plano de 90 dias

Se preferir, deixe para o relatório transformar seus dados em sugestões de ciclo.

0–30 dias • Proteger

31–60 dias • Estruturar

61–90 dias • Consolidar

Quero observar 7 dias antes de decidir opcional

Use este diário curto apenas se você ainda não consegue identificar onde a rotina aperta.

Experimento de 7 dias

DiaO que ocupou o diaEnergia 1–5ApoioCusto invisível
Plano B para imprevistos opcional

Quando o plano sair do plano

MEU RESULTADO • REVISÃO TRIMESTRAL

Seu mapa está pronto. Comece pelo que importa agora.

Você não precisa ler tudo de uma vez. Primeiro veja os focos do trimestre. Depois abra os gráficos e detalhes somente se quiser aprofundar.

Leia primeiro estes blocosresultado

1. Sua fotografia • 2. Seus 3 focos • 3. Próxima revisão. O diagnóstico completo fica logo abaixo.

Você pode seguir no seu ritmo.
Índice pedagógico de carga estrutural

O objetivo não é medir o seu valor. É revelar quanta estrutura a sua realidade pede.

Leitura rápida

Faixa de carga
Horas livres / diaAinda não calculado
Saldo da vida / mêsAinda não calculado
Meta mínima do negócioAinda não calculado
Referência média / horaAinda não calculado
Custos invisíveisAinda não revisado
Reserva planejadaAinda não calculado
EstruturaAinda não analisado
🧭 Como ler seu resultado
1Veja sua fotografiao que os números mostram hoje
2Escolha seus focosaté 3 movimentos para o trimestre
3Volte em 90 diascompare mudança, não perfeição
PRÓXIMOS 90 DIAS

O que este mapa sugere acompanhar agora

Próxima revisão
Indicador do trimestreAinda não definido
0–30 diasAinda não definido
31–60 diasAinda não definido
61–90 diasAinda não definido
🤝 Quero acompanhamento no Hub

No Hub, este mapa pode virar acompanhamento: revisar prioridades, testar estrutura, medir mudanças e ajustar o próximo ciclo sem recomeçar do zero.

Ver diagnóstico completo e gráficos dashboard
MEU MAPA • DASHBOARD

Sua matemática em uma única visão

Os gráficos abaixo usam somente o que você preencheu. Campos sem resposta aparecem como lacunas, não como zero.

Da realidade para o próximo movimento

O que pesa hoje

Ainda não preenchido.

O que precisa de estrutura

Ainda não preenchido.

Meu próximo ciclo

Ainda não preenchido.

Levar meu resultado comigo relatório + arquivos

Salvar, levar e comparar medições

Usar o diagnóstico completo com IA avançado

Seu prompt completo para continuar a conversa com IA

Este prompt reúne o diagnóstico inteiro: respostas, cálculos, lacunas, 7 dias, prioridades, rede, negócio, estrutura, sonhos e plano. O app não envia nada automaticamente.

Depois da análise, transforme o resultado

Use estes mini-prompts na mesma conversa em que você rodou o diagnóstico completo.

Manifesto da Matemática Extraordinária

Não precisamos de mulheres capazes de suportar qualquer coisa. Precisamos de vidas, negócios, famílias e estruturas em que elas não precisem suportar tudo sozinhas.

O cuidado também é trabalho. Apoio também é infraestrutura. Inclusão não é favor. Flexibilidade não é falta de compromisso. E pedir ajuda não diminui a força de ninguém.

É difícil calcular. Imagine viver. E imagine o que muda quando a gente começa a enxergar.

Letticia • Lett&Co

Salvo
`} function svgMap(){buildFinal();const d=collect(),load=loadScore(),time=calcTime(),money=calcMoney(),biz=calcBiz();return `LETT&CO • MATEMÁTICA EXTRAORDINÁRIA${xml(d.mapName||'Meu mapa')}Carga estrutural${load.score}${xml(load.available?load.label:'Dados incompletos')}Horas livres / dia${fmt(time.free)}hSaldo da vida${xml(money.complete?brl(money.balance):'—')}Meta mínima negócio${xml(biz.targetAnswered?brl(biz.target):'—')}Referência média / hora${xml(biz.hourly!==null&&biz.hoursComplete&&biz.targetAnswered?brl(biz.hourly):'—')}É difícil calcular. Imagine viver.Letticia • Lett&Co`} function download(text,type,name){const a=document.createElement('a');a.href=URL.createObjectURL(new Blob([text],{type}));a.download=name;document.body.appendChild(a);a.click();setTimeout(()=>{URL.revokeObjectURL(a.href);a.remove()},1000)} function safeName(){return (collect().mapName||'matematica-extraordinaria').toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g,'').replace(/[^a-z0-9]+/g,'-').replace(/^-|-$/g,'')} function escapeHtml(s){return String(s??'').replace(/[&<>"]/g,c=>({'&':'&','<':'<','>':'>','"':'"'}[c]))} function xml(s){return escapeHtml(s).replace(/'/g,''')} function notify(t){toast.textContent=t;toast.classList.add('show');setTimeout(()=>toast.classList.remove('show'),1600)} function hasValue(v){return v!==undefined&&v!==null&&String(v).trim()!==''} function setSaveState(state){const e=$('#saveState');if(!e)return;e.classList.toggle('saving',state==='saving');e.innerHTML=state==='saving'?' Salvando…':' Salvo'} function initScales(){$$('.scale-choice button').forEach(btn=>btn.addEventListener('click',()=>{const wrap=btn.closest('.scale-choice'),input=wrap.querySelector('input'),v=btn.dataset.value;input.value=v;wrap.querySelectorAll('button').forEach(b=>b.classList.toggle('selected',b===btn));form.dispatchEvent(new Event('input',{bubbles:true}))}))} function syncScaleButtons(){$$('.scale-choice').forEach(wrap=>{const input=wrap.querySelector('input'),v=input?.value||'';wrap.querySelectorAll('button').forEach(b=>b.classList.toggle('selected',b.dataset.value===v))})} function renderRadar(){const svg=$('#lifeRadar');if(!svg)return;const vals=lifeNames.map((_,i)=>hasValue(form.elements['life'+i]?.value)?num(form.elements['life'+i].value):0),cx=160,cy=160,maxR=118;let grid='';[1,2,3,4,5].forEach(level=>{const r=maxR*level/5,pts=lifeNames.map((_,i)=>{const a=-Math.PI/2+i*2*Math.PI/lifeNames.length;return`${cx+Math.cos(a)*r},${cy+Math.sin(a)*r}`}).join(' ');grid+=``});lifeNames.forEach((name,i)=>{const a=-Math.PI/2+i*2*Math.PI/lifeNames.length,x=cx+Math.cos(a)*maxR,y=cy+Math.sin(a)*maxR,lx=cx+Math.cos(a)*(maxR+24),ly=cy+Math.sin(a)*(maxR+24);grid+=`${name.replace('Rede de apoio','Rede')}`});$('#radarGrid').innerHTML=grid;const points=vals.map((v,i)=>{const a=-Math.PI/2+i*2*Math.PI/lifeNames.length,r=maxR*v/5;return`${cx+Math.cos(a)*r},${cy+Math.sin(a)*r}`}).join(' ');$('#radarArea').setAttribute('points',points);$('#radarDots').innerHTML=vals.map((v,i)=>{if(!v)return'';const a=-Math.PI/2+i*2*Math.PI/lifeNames.length,r=maxR*v/5,x=cx+Math.cos(a)*r,y=cy+Math.sin(a)*r;return``}).join('')} function renderNetwork(){if(!$('#networkVisual'))return;const d=collect();$('#netSupport').textContent=d.supportPeople||'Ainda não preenchido';$('#netFriction').textContent=d.unsupportedPeople||'Ainda não preenchido';$('#netAsk').textContent=d.supportAsk||d.supportBuild||'Ainda não preenchido'} function stepCompletion(){const d=collect(),time=calcTime(),money=calcMoney(),biz=calcBiz(),tasks=parseTasks();return[ hasValue(d.personName)&&hasValue(d.mapName), ['life0','life1','life2','life3','life4','life5','life6','life7'].filter(k=>hasValue(d[k])).length>=5 || [d.thermoTime,d.thermoIncome,d.thermoSupport,d.thermoRest,d.thermoBusiness].filter(hasValue).length>=3, time.answered>=4 || money.hasIncome, hasValue(d.supportPeople)||hasValue(d.supportAsk)||hasValue(d.unsupportedPeople)||hasValue(d.inclTime)||hasValue(d.inclCommute)||hasValue(d.inclBureau)||hasValue(d.inclAccess), tasks.length>0 || biz.targetAnswered || biz.hoursComplete, hasValue(d.permissionPhrase)||hasValue(d.permLimits)||hasValue(d.permHelp)||hasValue(d.dream1Text)||hasValue(d.dream1Step), hasValue(d.priority1)||hasValue(d.plan30)||hasValue(d.plan60)||hasValue(d.plan90)||hasValue(d.quarterMetric), false]} function updateProgress(){const flags=stepCompletion(),done=flags.slice(0,7).filter(Boolean).length,pct=Math.round(done/7*100);$('#progress').style.width=pct+'%';$('#progressText').textContent=pct+'% da jornada essencial';steps.forEach(b=>{const n=+b.dataset.go;b.classList.toggle('complete',n<7&&!!flags[n])})} function parseTasks(){try{const raw=form.elements.taskStructureJson?.value||'[]',arr=JSON.parse(raw);return Array.isArray(arr)?arr:[]}catch{return[]}} function saveTasks(arr){const f=form.elements.taskStructureJson;if(f){f.value=JSON.stringify(arr);form.dispatchEvent(new Event('input',{bubbles:true}))}} function taskAction(t){if(!t||(!t.name&&!t.human&&!t.repeat&&!t.delegate&&!t.sense))return'Preencha';if(t.sense==='Não')return'Eliminar / rever';if(t.human==='Não'&&t.repeat==='Sim')return'Automatizar';if(t.delegate==='Sim')return'Delegar / dividir';if(t.repeat==='Sim')return'Criar processo';if(t.human==='Sim')return'Manter humano';return'Simplificar'} function taskHours(t){return num(t.minutes)*num(t.freq)/60} function renderTasks(){const box=$('#taskList');if(!box)return;const arr=parseTasks();if(!arr.length){box.innerHTML='
Nenhuma tarefa ainda. Comece pelo que se repete, rouba energia ou depende demais da sua memória.
';return}box.innerHTML=arr.map((t,i)=>`
${['human|Precisa ser humano?','repeat|É repetitivo?','delegate|Outra pessoa pode?','sense|Ainda faz sentido?'].map(x=>{const [k,l]=x.split('|');return`
`}).join('')}
${taskAction(t)}
`).join('');box.querySelectorAll('input,select').forEach(el=>el.addEventListener('change',e=>{const row=e.target.closest('[data-task]'),i=+row.dataset.task,arr=parseTasks();arr[i][e.target.dataset.k]=e.target.value;saveTasks(arr);renderTasks();updateAll()}));box.querySelectorAll('[data-remove]').forEach(btn=>btn.addEventListener('click',()=>{const arr=parseTasks();arr.splice(+btn.dataset.remove,1);saveTasks(arr);renderTasks();updateAll()}))} function loadTasksFromField(){renderTasks()} function updateTasks(){const arr=parseTasks();const normalized=arr.map(t=>({...t,action:taskAction(t),hours:taskHours(t)})),human=normalized.filter(t=>t.action==='Manter humano').length,structure=normalized.filter(t=>['Criar processo','Delegar / dividir','Automatizar','Simplificar','Eliminar / rever'].includes(t.action)).length,time=normalized.filter(t=>['Delegar / dividir','Automatizar','Simplificar','Eliminar / rever'].includes(t.action)).reduce((s,t)=>s+t.hours,0);if($('#taskHuman'))$('#taskHuman').textContent=human;if($('#taskStructure'))$('#taskStructure').textContent=structure;if($('#taskTime'))$('#taskTime').textContent=fmt(time)+'h/mês';if($('#taskInsight'))$('#taskInsight').textContent=!normalized.length?'Adicione uma tarefa para começar a enxergar.':time>0?`Existem aproximadamente ${fmt(time)}h/mês em tarefas que podem ser repensadas. Não é promessa de ganho: é uma estimativa para orientar a próxima decisão.`:'Até agora, o mapa está protegendo presença humana ou pedindo processo, sem estimar tempo recuperável.'} function taskSummaryText(raw){let arr=[];try{arr=JSON.parse(raw||'[]')}catch{}if(!Array.isArray(arr)||!arr.length)return'não analisado';return arr.map(t=>`${t.name||'Tarefa'} → ${taskAction(t)}`).join('; ')} function pureMetrics(d){const timeNames=['timeSleep','timeWork','timeCommute','timeCare','timeHouse','timeStudy','timeAdmin'],timeAnswered=timeNames.filter(n=>hasValue(d[n])).length,timeTotal=timeNames.reduce((a,n)=>a+num(d[n]),0),free=Math.max(0,24-timeTotal),deficit=Math.max(0,timeTotal-24);const costNames=['moneyHousing','moneyWork','moneyCare','moneyHealth','moneyUnexpected'],hasIncome=hasValue(d.moneyIncome),costAnswered=costNames.filter(n=>hasValue(d[n])).length,income=num(d.moneyIncome),costs=costNames.reduce((a,n)=>a+num(d[n]),0),balance=income-costs;const total=num(d.bizWeeklyTotal),care=num(d.bizWeeklyCare),comm=num(d.bizWeeklyCommute),admin=num(d.bizWeeklyAdmin),weekly=Math.max(0,total-care-comm-admin),monthly=weekly*4.33,target=['bizCost','bizPersonal','bizTaxes','bizReserve'].reduce((a,n)=>a+num(d[n]),0),hourly=monthly>0?target/monthly:null;const reserves=['reservePeace','reserveFuture','reserveStudy','reserveHouse','reserveUnexpected'].reduce((a,n)=>a+num(d[n]),0);return{time:{total:timeTotal,free,deficit,complete:timeAnswered===timeNames.length},money:{balance,complete:hasIncome&&costAnswered>0},biz:{monthly,target,hourly,hoursComplete:['bizWeeklyTotal','bizWeeklyCare','bizWeeklyCommute','bizWeeklyAdmin'].every(n=>hasValue(d[n])),targetAnswered:['bizCost','bizPersonal','bizTaxes','bizReserve'].some(n=>hasValue(d[n]))},reserve:reserves,invis:(d.invisibleChecks||[]).length,tasks:(()=>{try{return JSON.parse(d.taskStructureJson||'[]')}catch{return[]}})()}} function openCompare(){const a=maps(),cur=current();if(!cur)return;$('#compareCurrent').textContent=cur.data?.mapName||'Mapa atual';const sel=$('#compareSelect'),others=a.filter(m=>m.id!==cur.id);sel.innerHTML=others.length?others.map(m=>``).join(''):'';$('#compareOverlay').classList.add('open');$('#compareOverlay').setAttribute('aria-hidden','false');renderCompare()} function renderCompare(){const cur=current(),other=maps().find(m=>m.id===$('#compareSelect').value),box=$('#compareResults');if(!cur||!other){box.innerHTML='
Você precisa de pelo menos dois mapas para comparar medições. Use “Duplicar” para testar uma mudança sem apagar o original.
';return}const A=pureMetrics(cur.data||{}),B=pureMetrics(other.data||{}),rows=[['Horas comprometidas',A.time.complete?A.time.total:null,B.time.complete?B.time.total:null,'h'],['Margem / déficit',A.time.complete?(A.time.deficit>0?-A.time.deficit:A.time.free):null,B.time.complete?(B.time.deficit>0?-B.time.deficit:B.time.free):null,'h'],['Saldo mensal',A.money.complete?A.money.balance:null,B.money.complete?B.money.balance:null,'R$'],['Horas vendáveis/mês',A.biz.hoursComplete?A.biz.monthly:null,B.biz.hoursComplete?B.biz.monthly:null,'h'],['Meta mínima',A.biz.targetAnswered?A.biz.target:null,B.biz.targetAnswered?B.biz.target:null,'R$'],['Referência/hora',A.biz.hourly!==null&&A.biz.hoursComplete&&A.biz.targetAnswered?A.biz.hourly:null,B.biz.hourly!==null&&B.biz.hoursComplete&&B.biz.targetAnswered?B.biz.hourly:null,'R$'],['Custos invisíveis',A.invis,B.invis,''],['Reservas planejadas',A.reserve||null,B.reserve||null,'R$']];box.innerHTML=rows.map(([label,a,b,u])=>{const f=v=>v===null?'—':u==='R$'?brl(v):fmt(v)+(u?u:'');const delta=a!==null&&b!==null?b-a:null;return`
${label}${f(a)}${f(b)}${delta===null?'—':(delta>0?'+':'')+(u==='R$'?brl(delta):fmt(delta)+(u?u:''))}
`}).join('')} function radarSvgForDashboard(d){ const vals=lifeNames.map((_,i)=>hasValue(d['life'+i])?num(d['life'+i]):0); const answered=vals.filter(v=>v>0).length; if(!answered)return '
Preencha a Roda da Vida para visualizar este gráfico.
'; const cx=160,cy=160,maxR=108; let grid=''; [1,2,3,4,5].forEach(level=>{ const r=maxR*level/5; const pts=lifeNames.map((_,i)=>{const a=-Math.PI/2+i*2*Math.PI/lifeNames.length;return `${cx+Math.cos(a)*r},${cy+Math.sin(a)*r}`}).join(' '); grid+=``; }); lifeNames.forEach((name,i)=>{ const a=-Math.PI/2+i*2*Math.PI/lifeNames.length; const x=cx+Math.cos(a)*maxR,y=cy+Math.sin(a)*maxR; const lx=cx+Math.cos(a)*(maxR+22),ly=cy+Math.sin(a)*(maxR+22); grid+=`${escapeHtml(name.replace('Rede de apoio','Rede'))}`; }); const points=vals.map((v,i)=>{const a=-Math.PI/2+i*2*Math.PI/lifeNames.length,r=maxR*v/5;return `${cx+Math.cos(a)*r},${cy+Math.sin(a)*r}`}).join(' '); const dots=vals.map((v,i)=>{if(!v)return'';const a=-Math.PI/2+i*2*Math.PI/lifeNames.length,r=maxR*v/5,x=cx+Math.cos(a)*r,y=cy+Math.sin(a)*r;return ``}).join(''); return `
${grid}${dots}EU
`; } function energyChartSvg(d){ const values=[1,2,3,4,5,6,7].map(i=>hasValue(d['day'+i+'Energy'])?num(d['day'+i+'Energy']):null); const points=values.map((v,i)=>v===null?null:[35+i*52,145-(v-1)*27.5]); const valid=points.filter(Boolean); if(!valid.length)return '
Registre a energia no experimento de 7 dias para visualizar a curva.
'; const poly=valid.map(p=>p.join(',')).join(' '); const dots=points.map((p,i)=>p?`D${i+1}`:'').join(''); return `
51${valid.length>1?``:''}${dots}
`; } function renderDashboard(d,calc){ const box=$('#finalDashboard');if(!box)return; const tasks=parseTasks().map(t=>({...t,action:taskAction(t),hours:taskHours(t)})); const recover=tasks.filter(t=>['Delegar / dividir','Automatizar','Simplificar','Eliminar / rever'].includes(t.action)).reduce((s,t)=>s+t.hours,0); const timeLabels=[['Sono','timeSleep','#0d2c50'],['Trabalho','timeWork','#e76555'],['Desloc.','timeCommute','#c9963b'],['Cuidado','timeCare','#8b5cf6'],['Casa','timeHouse','#5b8fb9'],['Estudo','timeStudy','#4f8b68'],['Admin.','timeAdmin','#f58a77']]; const timeValues=timeLabels.map(([label,n,color])=>({label,value:num(d[n]),answered:hasValue(d[n]),color})); const timeTotal=timeValues.reduce((s,x)=>s+x.value,0); let acc=0;const segments=timeValues.filter(x=>x.answered&&x.value>0).map(x=>{const start=timeTotal?acc/timeTotal*100:0;acc+=x.value;const end=timeTotal?acc/timeTotal*100:0;return `${x.color} ${start}% ${end}%`}); const donutBg=segments.length?`conic-gradient(${segments.join(',')})`:'conic-gradient(#e9edf0 0 100%)'; const legend=timeValues.filter(x=>x.answered).map(x=>`
${x.label}${fmt(x.value)}h
`).join('')||'
Ainda sem dados.
'; const thermo=[ ['Tempo cabe',d.thermoTime],['Renda previsível',d.thermoIncome],['Rede suficiente',d.thermoSupport],['Descanso',d.thermoRest],['Trabalho cabe',d.thermoBusiness] ]; const thermoBars=thermo.map(([label,v])=>`
${label}
${hasValue(v)?v+'/5':'—'}
`).join(''); const maxMoney=Math.max(calc.money.income||0,calc.money.costs||0,1); const moneyBars=[ ['Renda',calc.money.hasIncome?calc.money.income:null,'#4f8b68'], ['Custos',calc.money.answeredCosts?calc.money.costs:null,'#e76555'] ].map(([label,v,color])=>`
${label}
${v===null?'—':brl(v)}
`).join(''); const capacity=calc.biz.capacity!==null&&calc.biz.hoursComplete?Math.max(0,Math.min(100,calc.biz.capacity)):null; const gaugeBg=capacity===null?'conic-gradient(#e9edf0 0 100%)':`conic-gradient(#ff6400 0 ${capacity}%,#e9edf0 ${capacity}% 100%)`; const actions=['Manter humano','Simplificar','Criar processo','Delegar / dividir','Automatizar','Eliminar / rever']; const actionCounts=actions.map(a=>[a,tasks.filter(t=>t.action===a).length]); const maxAction=Math.max(1,...actionCounts.map(x=>x[1])); const taskBars=actionCounts.map(([label,v])=>`
${label}
${v}
`).join(''); const invis=(d.invisibleChecks||[]); const reserveEntries=[['Paz','reservePeace'],['Futuro','reserveFuture'],['Estudos','reserveStudy'],['Casa','reserveHouse'],['Imprevistos','reserveUnexpected']].map(([label,n])=>[label,hasValue(d[n])?num(d[n]):null]); const maxReserve=Math.max(1,...reserveEntries.map(x=>x[1]||0)); const reserveBars=reserveEntries.map(([label,v])=>`
${label}
${v===null?'—':brl(v)}
`).join(''); const dreamCount=[1,2,3].filter(i=>hasValue(d['dream'+i+'Text'])||hasValue(d['dream'+i+'Step'])).length; box.innerHTML=`
Carga estrutural${calc.load.available?calc.load.score+'/100':'—'}
Horas comprometidas${calc.time.answered?fmt(calc.time.total)+'h':'—'}
Margem / déficit${calc.time.complete?(calc.time.deficit>0?'-'+fmt(calc.time.deficit)+'h':fmt(calc.time.free)+'h'):'—'}
Saldo mensal${calc.money.complete?brl(calc.money.balance):'—'}
Horas vendáveis/mês${calc.biz.hoursComplete?fmt(calc.biz.monthly)+'h':'—'}
Tempo a repensar${tasks.length?fmt(recover)+'h/mês':'—'}

Roda da Vida Extraordinária

Uma fotografia das oito áreas que você avaliou.
${radarSvgForDashboard(d)}

Como suas 24 horas estão distribuídas

Composição dos blocos de tempo informados.
${calc.time.answered?fmt(calc.time.total):'—'}hcomprometidas
${legend}

Termômetro da realidade

Quanto cada dimensão parece caber hoje, de 1 a 5.
${thermoBars}

Dinheiro

Renda, custos e saldo a partir do que foi informado.
${moneyBars}
Saldo atual: ${calc.money.complete?brl(calc.money.balance):'ainda não calculado'}.

Capacidade do negócio

Quanto das horas totais de trabalho permanece realmente vendável.
${capacity===null?'—':fmt(capacity)+'%'}capacidade vendável
Horas vendáveis/mês: ${calc.biz.hoursComplete?fmt(calc.biz.monthly)+'h':'—'}
Meta mínima: ${calc.biz.targetAnswered?brl(calc.biz.target):'—'}
Referência/hora: ${calc.biz.hourly!==null&&calc.biz.hoursComplete&&calc.biz.targetAnswered?brl(calc.biz.hourly):'—'}

Humano, processo ou automação?

Distribuição das tarefas analisadas.
${tasks.length?taskBars:'
Analise algumas tarefas para visualizar esta parte.
'}

Energia ao longo de 7 dias

A curva aparece conforme você registra energia no experimento.
${energyChartSvg(d)}

Custos invisíveis + rede

O que pesa sem necessariamente aparecer no extrato.
${invis.length?invis.map(x=>`${escapeHtml(x)}`).join(''):'Nenhum custo invisível marcado ou etapa ainda não revisada.'}
Rede que soma: ${escapeHtml(d.supportPeople||'não preenchida')}
Fricção: ${escapeHtml(d.unsupportedPeople||'não preenchida')}
Próximo pedido: ${escapeHtml(d.supportAsk||d.supportBuild||'não preenchido')}

Reservas + sonhos possíveis

Planejamento financeiro de proteção e futuro.
${reserveBars}
Reservas planejadas: ${calc.reserve>0?brl(calc.reserve):'—'} • Sonhos mapeados: ${dreamCount}
`; } function buildMiniPrompt(kind){ const common=`Use exclusivamente o diagnóstico e a análise já gerados nesta conversa a partir da Matemática Extraordinária. Não invente dados, não complete lacunas e mantenha separados fatos, cálculos e interpretações. Preserve a identidade Lett&Co: humana, adulta, editorial, premium, clara, com base creme/off-white e azul-marinho ou versão escura com preto profundo, glassmorphism e acentos laranja → roxo → azul.`; if(kind==='image16')return `${common} TRANSFORME O RESULTADO EM UMA IMAGEM-RESUMO 16:9. Crie um infográfico editorial com: - nome do mapa; - score/faixa de carga, se disponível; - horas comprometidas e margem/déficit; - saldo mensal; - horas vendáveis; - 3 tensões principais; - 3 prioridades; - um bloco “proteger / estruturar / tirar da conta”; - no máximo 2 gráficos simples; - assinatura “É difícil calcular. Imagine viver.” e “Letticia • Lett&Co”. Pouco texto. Hierarquia forte. Fácil leitura em tela.`; if(kind==='story')return `${common} TRANSFORME O RESULTADO EM UM STORY 9:16 COMPARTILHÁVEL. Organize em uma única peça vertical ou sequência curta: 1. onde estou; 2. o que mais pesa; 3. onde falta estrutura; 4. os 3 números que mais importam; 5. minhas 3 prioridades; 6. fechamento “Mais vida para o que realmente importa.” Use gráficos simples e textos curtos.`; if(kind==='pdf')return `${common} TRANSFORME O RESULTADO EM UM RELATÓRIO PDF EDITORIAL DE 8 A 12 PÁGINAS. Estrutura: 1. capa; 2. resumo executivo; 3. dashboard geral; 4. roda da vida + carga; 5. mapa das 24 horas; 6. dinheiro + custos invisíveis; 7. rede + inclusão; 8. negócio + horas vendáveis; 9. humano/processo/delegação/automação; 10. reservas + sonhos; 11. cenários; 12. plano de 90 dias. Inclua gráficos legíveis, tabelas curtas, explicação das fórmulas e lacunas. Não transformar resultado em diagnóstico ou recomendação profissional.`; return `${common} TRANSFORME O RESULTADO EM UM DASHBOARD HTML RESPONSIVO E INTERATIVO. Preciso visualizar em poucos segundos: - KPIs principais; - roda da vida; - composição das 24 horas; - termômetros; - renda x custos; - capacidade vendável; - distribuição humano/processo/delegação/automação; - energia dos 7 dias; - reservas; - prioridades e próximos passos. Mobile-first, acessível, com poucos números por tela e explicação ao tocar em cada indicador.`; } async function copyMiniPrompt(kind,btn){ const p=buildMiniPrompt(kind),preview=$('#miniPromptPreview'); if(preview){preview.textContent=p;preview.classList.add('open')} $$('.mini-prompt-btn').forEach(b=>b.classList.toggle('active',b===btn)); try{await navigator.clipboard.writeText(p);notify('Mini-prompt copiado')}catch{notify('Mini-prompt aberto abaixo para copiar')} } const HELP_BY_NAME={ personName:'Digite como você quer ser identificada no relatório. Pode ser só o primeiro nome ou um apelido.', mapName:'Dê um nome que ajude a reconhecer este momento. Ex.: “Setembro — realidade atual” ou “Cenário com apoio 2 dias”.', businessName:'Se quiser, informe sua atividade principal, empresa ou projeto. Ex.: “Designer autônoma”, “Clínica”, “Loja online”.', referenceDate:'Escolha a data que representa esta fotografia da sua rotina. Ela ajuda a comparar mapas depois.', beforeWeight:'Escreva o que hoje mais consome tempo, energia ou preocupação. Ex.: “conciliar escola, atendimentos e casa”.', beforePhrase:'Registre a frase que costuma aparecer nos dias difíceis. Ex.: “não vai caber tudo hoje”.', timeSleep:'Inclua sono e cuidados básicos pessoais. Use uma média por dia. Se realmente não houver tempo nesta categoria, coloque 0.', timeWork:'Horas de trabalho, atendimento, produção ou operação do negócio por dia.', timeCommute:'Tempo médio gasto indo e voltando de trabalho, escola, terapia, consultas ou compromissos.', timeCare:'Tempo de presença direta cuidando de filhos, familiares ou outra pessoa que dependa de você.', timeHouse:'Tempo com cozinha, limpeza, roupa, compras e outras tarefas da casa.', timeStudy:'Tempo com estudo, aulas, cursos e compromissos educacionais próprios ou acompanhados.', timeAdmin:'Tempo gasto organizando, lembrando, respondendo, marcando, cobrando e coordenando a vida ou o negócio.', moneyIncome:'Informe sua renda líquida mensal aproximada. Pode incluir salário, pró-labore, renda variável e benefícios.', moneyHousing:'Some moradia, contas básicas, alimentação e manutenção essencial do mês.', moneyWork:'Custos para conseguir trabalhar: transporte, internet, ferramentas, plataformas, alimentação fora etc.', moneyCare:'Custos ligados ao cuidado: escola, transporte escolar, cuidadora, terapia, apoio, acompanhante etc.', moneyHealth:'Medicamentos, plano, consultas, seguros e outros custos de saúde/proteção.', moneyUnexpected:'Uma média mensal para reparos, cancelamentos, urgências e manutenção que costuma aparecer.', invisible1:'Escreva um custo que pesa, mas não aparece bem na planilha. Ex.: 2h de espera numa consulta.', invisible2:'Outro custo invisível relevante. Pode ser tempo, energia, oportunidade perdida, retrabalho ou logística.', invisible3:'Use se houver um terceiro custo invisível que merece entrar na conta.', supportPeople:'Liste pessoas, serviços ou estruturas que realmente assumem algo e reduzem sua carga. Ex.: parceiro, avó, escola, assistente.', unsupportedPeople:'Registre relações ou situações que parecem apoio, mas geram cobrança, retrabalho, conflito ou mais coordenação.', supportAsk:'Escreva um pedido concreto. Ex.: “buscar as crianças terça e quinta” é mais útil que “preciso de ajuda”.', supportBuild:'Quem ou o que ainda falta construir na sua rede? Pode ser pessoa, serviço, escola, processo ou comunidade.', careProfessionalNotes:'Registre sinais concretos que percebeu nesse cuidado ou relação profissional. Ex.: “saio com mais clareza, mas a logística ficou pesada”.', inclTime:'Liste horários externos que comandam sua rotina: escola, terapia, expediente, serviço público, transporte etc.', inclCommute:'Descreva o deslocamento que mais drena tempo, dinheiro ou energia.', inclBureau:'Ex.: autorizações, laudos, formulários, filas, remarcações, documentos ou processos repetidos.', inclAccess:'Registre barreiras de acesso físico, sensorial, comunicação, tecnologia, horário ou adaptação.', bizWeeklyTotal:'Quantas horas por semana você realmente consegue reservar para o trabalho, antes de descontar tarefas não vendáveis.', bizWeeklyCare:'Dentro desse período de trabalho, quantas horas acabam sendo atravessadas por cuidado direto.', bizWeeklyCommute:'Horas semanais de deslocamento relacionadas ao trabalho.', bizWeeklyAdmin:'Horas semanais em financeiro, mensagens, agenda, emissão, organização, suporte e tarefas não faturadas.', bizCost:'Custos mensais para o negócio existir: ferramentas, equipe, plataformas, espaço, fornecedores etc.', bizPersonal:'Quanto a operação precisa gerar para sustentar sua vida pessoal / pró-labore.', bizTaxes:'Informe impostos, taxas ou uma referência mensal que você já utiliza. Se ainda não souber, deixe em branco.', bizReserve:'Valor mensal que gostaria de proteger como reserva do negócio.', permLimits:'O que precisa deixar de ser negociável? Ex.: horário de atendimento, folga, limite de clientes ou tempo com a família.', permHelp:'Que ajuda você pode pedir sem transformar o pedido em culpa? Seja específica.', permPrice:'Onde você está bancando custo, suporte ou tempo com a própria exaustão? O que precisaria ser revisto?', permRhythm:'Descreva um ritmo que você conseguiria sustentar por meses, e não apenas por uma semana.', reservePeace:'Valor que você gostaria de construir para reduzir urgência e dar margem de escolha.', reserveFuture:'Valor planejado para objetivos de médio/longo prazo.', reserveStudy:'Valor para cursos, formação, livros, eventos ou desenvolvimento.', reserveHouse:'Valor para casa, manutenção ou objetivos domésticos.', reserveUnexpected:'Reserva específica para imprevistos.', permissionPhrase:'Complete como uma autorização prática. Ex.: “Posso dizer não para um prazo que quebra minha semana.”', conversationNeeded:'Qual conversa, se acontecer, pode reorganizar parte importante da sua rotina? Diga com quem e o que precisa ser combinado.', expNumber:'Escolha um indicador simples para acompanhar por 30 dias. Ex.: horas livres, faturamento, cancelamentos, sono ou tempo de deslocamento.', expReviewDate:'Escolha quando você vai rever este mapa e comparar o que mudou.', priority1:'A primeira mudança que merece energia agora. Precisa ser específica e possível.', priority2:'Uma segunda prioridade, apenas se ela realmente couber no mesmo ciclo.', priority3:'Uma terceira prioridade opcional. Melhor três movimentos possíveis do que uma lista infinita.', checkImproved:'O que ficou mais leve, previsível ou organizado depois das mudanças?', checkHeavy:'O que continuou consumindo muita energia, tempo ou dinheiro?', checkKeep:'O que funcionou e merece virar parte da sua estrutura?', checkChange:'O que precisa ser revisto no próximo ciclo?', planB:'Resuma sua alternativa para quando a rotina sair do previsto. Ex.: “se a escola ligar, X busca e eu remarco Y”.' }; const HELP_BY_TEXT={ 'eu':'Avalie quanto espaço você sente que existe hoje para você mesma: escolhas, identidade, interesses e necessidades pessoais.', 'família':'Avalie como está a convivência e a distribuição de demandas familiares na sua percepção atual.', 'trabalho':'Avalie sua relação com trabalho, carga, satisfação e possibilidade de execução.', 'dinheiro':'Avalie previsibilidade, tranquilidade e capacidade de sustentar o básico e os próximos passos.', 'saúde':'Avalie como saúde e energia estão sustentando — ou pressionando — a rotina.', 'rede de apoio':'Avalie se você tem pessoas e estruturas que realmente assumem parte da carga quando necessário.', 'descanso':'Avalie se existe descanso real, recuperação e espaço sem obrigação.', 'sonhos':'Avalie quanto espaço seus desejos e projetos de futuro têm na vida de hoje.', 'meu tempo cabe na minha rotina.':'1 significa “quase nunca cabe”; 5 significa “cabe com boa margem na maior parte do tempo”.', 'minha renda cobre o básico com previsibilidade.':'1 significa muita instabilidade; 5 significa cobertura previsível do básico na maior parte dos meses.', 'tenho rede de apoio suficiente.':'Pense em apoio que realmente executa algo, não só boa intenção. 1 = muito insuficiente; 5 = suficiente para a realidade atual.', 'consigo descansar sem sentir culpa.':'Considere descanso físico e mental. 1 = quase nunca; 5 = consigo descansar e recuperar com regularidade.', 'meu negócio / trabalho cabe na minha capacidade real.':'Compare demanda de trabalho com tempo, energia e cuidado disponíveis. 1 = não cabe; 5 = cabe de forma sustentável.', 'tarefa / responsabilidade':'Escolha algo recorrente ou que rouba energia. Ex.: responder as mesmas dúvidas, copiar dados, montar agenda, conferir pagamentos.', 'vezes/mês':'Quantas vezes esta tarefa costuma acontecer em um mês. Use uma média.', 'min/vez':'Quanto tempo, em média, uma ocorrência consome.', 'precisa ser humano?':'Marque “Sim” quando vínculo, julgamento, criação, negociação ou cuidado humano forem parte essencial da qualidade.', 'é repetitivo?':'Marque “Sim” quando a tarefa acontece de forma semelhante muitas vezes.', 'outra pessoa pode?':'Pergunte se outra pessoa, com orientação adequada, poderia executar sem perder o valor principal.', 'ainda faz sentido?':'Antes de organizar ou automatizar, pergunte se essa tarefa ainda precisa existir.', 'leitura':'A classificação é uma sugestão de estrutura. Você continua decidindo com contexto.', 'o que quero viver?':'Descreva a experiência, não só o objeto. Ex.: “ter uma semana de férias em família sem trabalhar”.', 'prazo':'Quando você gostaria de tornar isso possível? Pode ser mês, ano ou período aproximado.', 'investimento estimado':'Se houver custo financeiro, coloque uma estimativa. Se ainda não souber, deixe em branco.', 'primeiro passo':'A menor ação concreta que aproxima o sonho da realidade.', 'tempo':'No experimento de 7 dias, registre o que realmente ocupou o dia ou a principal combinação de demandas.', 'energia (1–5)':'1 = energia muito baixa; 5 = energia alta. Use sua percepção, sem procurar uma resposta perfeita.', 'apoio':'Registre qualquer apoio que mudou o dia: pessoa, serviço, flexibilidade ou ausência de apoio.', 'custo invisível':'Anote algo que custou tempo, energia ou oportunidade e que normalmente ficaria fora da conta.', 'semana 1 • observar':'Registre o que você vai observar ou medir antes de tentar mudar tudo.', 'semana 2 • organizar':'Defina quais pequenas estruturas, combinados ou prioridades serão organizados.', 'semana 3 • ajustar':'Escolha o que será testado, simplificado, delegado ou corrigido.', 'semana 4 • consolidar':'Defina o que vale manter e o que entra no próximo ciclo.', 'reserva da paz':'Uma reserva com função de dar margem de escolha e reduzir decisões feitas na urgência.', 'futuro':'Recursos destinados a objetivos futuros.', 'estudos':'Formação, cursos e desenvolvimento.', 'casa':'Manutenção, melhorias ou objetivos ligados à casa.', 'imprevistos':'Uma proteção específica para acontecimentos fora do plano.', 'renda líquida':'O valor que efetivamente fica disponível para sustentar a vida no mês.', 'moradia e básico':'Inclua despesas essenciais recorrentes da casa e alimentação.', 'custo de trabalhar':'Tudo que existe porque você trabalha ou mantém o negócio funcionando.', 'custo de cuidar':'Custos financeiros diretamente ligados a cuidado e apoio.', 'saúde e proteção':'Custos de saúde, medicamentos, seguros e proteção.', 'imprevistos / manutenção':'Use uma média realista de reparos, urgências e despesas inesperadas.', 'custo do negócio':'Quanto custa manter a operação aberta antes de pagar você.', 'vida pessoal / pró-labore':'Quanto a operação precisa gerar para sua vida pessoal ou retirada.', 'impostos / taxas':'Impostos, taxas de plataforma e outros encargos.', 'reserva / proteção':'Valor que você quer incorporar à estrutura mensal do negócio para criar margem.', 'roda da vida extraordinária':'Dê uma nota de 1 a 5 para cada área pensando em como ela está HOJE. Não é prova nem diagnóstico; é uma fotografia.', 'termômetro da realidade':'Use a escala de 1 a 5 para avaliar quanto cada dimensão parece sustentável hoje.', 'matemática do dinheiro':'Preencha valores mensais aproximados. O objetivo é enxergar a estrutura, não fazer contabilidade formal.', 'marque o que não vira boleto, mas pesa':'Marque apenas o que realmente aparece na sua rotina. Se nada se aplicar, marque que revisou a lista.', 'esse cuidado / profissional está ajudando de verdade?':'Use os itens como reflexão sobre sustentação, clareza e impacto na rotina. Não é uma avaliação clínica ou ranking profissional.', 'quem está perto, quem pode entrar e onde existe fricção?':'Use o mapa para distinguir apoio real, apoio possível e pontos que aumentam sua carga.', 'horas realmente vendáveis':'Nem toda hora disponível para trabalhar é hora que pode ser vendida. Desconte cuidado, deslocamento e administrativo.', 'minha matemática do negócio':'Calcule quanto a operação precisa gerar para sustentar custos, retirada, impostos e proteção.', 'custos invisíveis que deveriam entrar na precificação':'Marque custos que afetam a entrega, mesmo quando não aparecem como linha direta do orçamento.', 'liste só o que pesa ou se repete':'Não cadastre tudo. Comece por tarefas recorrentes, manuais ou que dependem demais da sua memória.', 'reservas que compram paz':'São envelopes de proteção e futuro. Não são recomendação de investimento.', 'conversas que organizam a vida':'Use os exemplos como ponto de partida para transformar necessidade vaga em pedido específico.', 'experimento de 7 dias':'Observe uma semana real para comparar o que você imaginava com o que realmente aconteceu.', 'plano prático de 30 dias':'Transforme a leitura em poucas ações testáveis. O plano deve caber na vida que você acabou de mapear.', 'escolha no máximo três prioridades':'Prioridade é o que ganha energia agora. Se tudo for prioridade, nada é.', 'kit de bolso para imprevistos':'Marque recursos que ajudam a reduzir caos quando alguma coisa foge do previsto.' }; function normalizeHelpText(t){return String(t||'').replace(/\s+/g,' ').trim().toLowerCase()} function helpControlName(el){ const direct=el.closest?.('label')?.querySelector?.('input,textarea,select'); if(direct?.name)return direct.name; const parent=el.parentElement; const inside=parent?.querySelector?.('input,textarea,select'); if(inside?.name)return inside.name; if(el.classList?.contains('label')){ const amount=el.nextElementSibling?.querySelector?.('input,textarea,select'); if(amount?.name)return amount.name; } return ''; } function helpForElement(el){ const txt=normalizeHelpText(el.textContent); if(el.matches?.('h2,h3,h4')&&HELP_BY_TEXT[txt])return HELP_BY_TEXT[txt]; const name=helpControlName(el); if(name&&HELP_BY_NAME[name])return HELP_BY_NAME[name]; if(HELP_BY_TEXT[txt])return HELP_BY_TEXT[txt]; if(/^sonho \d+$/.test(txt))return 'Use este bloco para transformar um desejo em algo mais concreto: experiência desejada, prazo, investimento e primeiro passo.'; if(txt==='dia')return 'Cada linha representa um dia do experimento. O objetivo é observar padrões, não preencher de forma perfeita.'; return ''; } let helpLocked=false,helpBtn=null; function showQuestionHelp(btn,lock=false){ const pop=$('#questionHelpPopover');if(!pop)return; const msg=btn.dataset.help;if(!msg)return; helpLocked=lock;helpBtn=btn; $$('.qhelp').forEach(b=>b.classList.toggle('active',b===btn)); pop.innerHTML=`Dica para preencher${escapeHtml(msg)}`; pop.classList.add('open'); const r=btn.getBoundingClientRect(); if(innerWidth>680){ const w=Math.min(330,innerWidth-24); let left=Math.max(12,Math.min(innerWidth-w-12,r.left-18)); let top=r.bottom+10; if(top+170>innerHeight)top=Math.max(12,r.top-180); pop.style.left=left+'px';pop.style.top=top+'px';pop.style.right='auto';pop.style.bottom='auto'; } } function hideQuestionHelp(force=false){ if(helpLocked&&!force)return; const pop=$('#questionHelpPopover');if(pop)pop.classList.remove('open'); $$('.qhelp').forEach(b=>b.classList.remove('active')); helpBtn=null;if(force)helpLocked=false; } function enhanceQuestionHelp(root=document){ const candidates=[...root.querySelectorAll('label:not(.check), .calc .label, .perm>b, .env>b, .week h4, .seven th, h3')]; candidates.forEach(el=>{ if(el.dataset.helpReady)return; const msg=helpForElement(el); if(!msg)return; el.dataset.helpReady='1'; const btn=document.createElement('button'); btn.type='button';btn.className='qhelp';btn.textContent='?';btn.setAttribute('aria-label','Ver dica de preenchimento');btn.dataset.help=msg; btn.addEventListener('click',e=>{e.preventDefault();e.stopPropagation();const same=helpBtn===btn&&helpLocked;if(same)hideQuestionHelp(true);else showQuestionHelp(btn,true)}); btn.addEventListener('mouseenter',()=>{if(!helpLocked)showQuestionHelp(btn,false)}); btn.addEventListener('mouseleave',()=>{if(!helpLocked)hideQuestionHelp(false)}); btn.addEventListener('focus',()=>{if(!helpLocked)showQuestionHelp(btn,false)}); btn.addEventListener('blur',()=>{if(!helpLocked)hideQuestionHelp(false)}); el.appendChild(btn); }); } function initQuestionHelp(){ enhanceQuestionHelp(document); const obs=new MutationObserver(muts=>muts.forEach(m=>m.addedNodes.forEach(n=>{if(n.nodeType===1)enhanceQuestionHelp(n)}))); obs.observe(document.body,{childList:true,subtree:true}); document.addEventListener('click',e=>{if(!e.target.closest('.qhelp')&&!e.target.closest('#questionHelpPopover'))hideQuestionHelp(true)}); window.addEventListener('resize',()=>{if(helpBtn&&$('#questionHelpPopover')?.classList.contains('open'))showQuestionHelp(helpBtn,helpLocked)}); } function renderScoreExplain(load,time,d){const box=$('#scoreExplain');if(!box)return;if(!load.available){box.innerHTML='
Ainda faltam dados para gerar o índice. Complete Saúde, Rede de apoio, todas as categorias das 24 horas e revise custos invisíveis.
';return}box.innerHTML=load.factors.map(([name,val,weight])=>`
${name}${fmt(val)}/5 • peso ${weight}%

${name==='Relógio'?`Baseado em ${fmt(time.total)}h comprometidas por dia.`:name==='Custos invisíveis'?`Baseado em ${(d.invisibleChecks||[]).length} item(ns) explicitamente marcado(s).`:'Fator convertido para pressão estrutural, não para valor pessoal.'}

`).join('')+`
Índice = combinação ponderada de Saúde/energia (18%) + Apoio (22%) + Cuidado (22%) + Relógio (20%) + Custos invisíveis (18%). Resultado atual: ${load.score}/100. É uma leitura pedagógica, não diagnóstico.
`} function applySimplifiedRuntime(){ ensureQuarterDefaults(); const ref=form.elements.referenceDate,review=form.elements.quarterReviewDate; if(ref&&review)ref.addEventListener('change',()=>{if(ref.value){review.value=addMonthsISO(ref.value,3);autosave()}}); const toggle=$('#toggleDreams'),card=document.querySelector('.dreams-essential'); if(toggle&&card)toggle.addEventListener('click',()=>{card.classList.toggle('show-all-dreams');toggle.textContent=card.classList.contains('show-all-dreams')?'Mostrar só o sonho principal':'+ Adicionar outros sonhos'}); [1,2,3].forEach(i=>{ const deadline=form.elements['dream'+i+'Deadline'],cost=form.elements['dream'+i+'Cost']; if(deadline){const lab=deadline.closest('.field')?.querySelector('label');if(lab)lab.textContent='Prazo (mês/ano ou período)';deadline.placeholder='Ex.: 09/2027 ou em 12 meses'} if(cost){const lab=cost.closest('.field')?.querySelector('label');if(lab)lab.textContent='Investimento total estimado';cost.placeholder='R$ total'} }); } function initMobileExperienceV5(){ const side=document.querySelector('.side'); const toggle=document.getElementById('mobileJourneyToggle'); const stepTitle=document.getElementById('mobileStepTitle'); const stepKicker=document.getElementById('mobileStepKicker'); const topbar=document.querySelector('.top'); const mobile=()=>window.matchMedia('(max-width:900px)').matches; function setHeights(){ if(!mobile()){ document.documentElement.style.setProperty('--mobile-side-h','0px'); document.documentElement.style.setProperty('--mobile-top-h','0px'); return; } const sh=side?side.getBoundingClientRect().height:0; const th=topbar?topbar.getBoundingClientRect().height:0; document.documentElement.style.setProperty('--mobile-side-h',Math.round(sh)+'px'); document.documentElement.style.setProperty('--mobile-top-h',Math.round(th)+'px'); } function updateStepHeader(){ const active=document.querySelector('#steps .step.active'); if(!active)return; const title=active.querySelector('.st b')?.textContent?.trim()||'Etapa'; const num=active.querySelector('.sn')?.textContent?.trim()||''; if(stepTitle)stepTitle.textContent=title; if(stepKicker)stepKicker.textContent=num==='✓'?'RESULTADO':`ETAPA ${num}`; } function closeDrawer(){ if(!side)return; side.classList.remove('mobile-open'); toggle?.setAttribute('aria-expanded','false'); requestAnimationFrame(setHeights); } function openDrawer(){ if(!side)return; side.classList.add('mobile-open'); toggle?.setAttribute('aria-expanded','true'); requestAnimationFrame(()=>{ setHeights(); document.querySelector('#steps .step.active')?.scrollIntoView({block:'nearest',inline:'nearest'}); }); } toggle?.addEventListener('click',e=>{ e.stopPropagation(); side?.classList.contains('mobile-open')?closeDrawer():openDrawer(); }); document.querySelectorAll('#steps .step').forEach(btn=>{ btn.addEventListener('click',()=>{ updateStepHeader(); if(mobile())closeDrawer(); }); }); document.addEventListener('click',e=>{ if(mobile() && side?.classList.contains('mobile-open') && !side.contains(e.target))closeDrawer(); }); document.addEventListener('keydown',e=>{ if(e.key==='Escape' && side?.classList.contains('mobile-open'))closeDrawer(); }); if(window.visualViewport){ const onViewport=()=>{ const keyboardOpen=window.innerHeight-window.visualViewport.height>150; document.body.classList.toggle('keyboard-open',keyboardOpen); }; visualViewport.addEventListener('resize',onViewport); visualViewport.addEventListener('scroll',onViewport); onViewport(); } let touchX=0,touchY=0,touchTime=0; const content=document.querySelector('.content'); if(content){ content.addEventListener('touchstart',e=>{ if(!mobile()||e.touches.length!==1)return; if(e.target.closest('input,textarea,select,button,a,summary,.scale-choice,.wheel,.dash-panel,pre'))return; touchX=e.touches[0].clientX; touchY=e.touches[0].clientY; touchTime=Date.now(); },{passive:true}); content.addEventListener('touchend',e=>{ if(!mobile()||!touchTime||!e.changedTouches.length)return; const dx=e.changedTouches[0].clientX-touchX; const dy=e.changedTouches[0].clientY-touchY; const dt=Date.now()-touchTime; touchTime=0; if(dt>700||Math.abs(dx)<90||Math.abs(dx)0 && n>0){go(n-1);updateStepHeader();navigator.vibrate?.(8)} },{passive:true}); } document.addEventListener('focusin',e=>{ if(!mobile()||!e.target.matches('input,textarea,select'))return; setTimeout(()=>{ const r=e.target.getBoundingClientRect(); const topLimit=(side?.getBoundingClientRect().bottom||0)+(topbar?.getBoundingClientRect().height||0)+12; if(r.topwindow.innerHeight-20){ e.target.scrollIntoView({block:'center',behavior:'smooth'}); } },260); }); if('ResizeObserver' in window){ const ro=new ResizeObserver(()=>setHeights()); if(side)ro.observe(side); if(topbar)ro.observe(topbar); } window.addEventListener('resize',()=>{setHeights();updateStepHeader()}); const observer=new MutationObserver(updateStepHeader); document.querySelectorAll('#steps .step').forEach(x=>observer.observe(x,{attributes:true,attributeFilter:['class']})); updateStepHeader(); setHeights(); } function initConductiveExperienceV6(){ const formEl=document.querySelector('#form'); if(!formEl)return; const hv=v=>!(v===undefined||v===null||v===''); function readyFor(step,d){ const time=typeof calcTime==='function'?calcTime():null; const money=typeof calcMoney==='function'?calcMoney():null; const tasks=typeof parseTasks==='function'?parseTasks():[]; if(step===1){ const life=['life0','life1','life2','life3','life4','life5','life6','life7'] .filter(k=>hv(d[k])).length; return {ready:life>=5, text:life>=5 ? `Você já respondeu ${life}/8 áreas. Já dá para seguir.` : `${life}/8 áreas respondidas • com 5 você já pode avançar.`}; } if(step===2){ const timeCount=time?.answered||0; const hasMoney=!!money?.hasIncome; const ok=timeCount>=4 || hasMoney; return {ready:ok, text:ok ? `Boa. Você já tem informação suficiente para continuar.` : `${timeCount}/7 blocos de tempo preenchidos • responda o que souber.`}; } if(step===3){ const count=['supportPeople','unsupportedPeople','supportAsk','supportBuild'] .filter(k=>hv(d[k])).length; return {ready:count>=1, text:count>=1 ? `Pronto. Uma informação concreta sobre sua rede já ajuda o mapa.` : `Comece por uma pergunta: quem realmente soma hoje?`}; } if(step===4){ const count=tasks.length; return {ready:count>=1, text:count>=1 ? `${count} tarefa${count>1?'s':''} mapeada${count>1?'s':''}. Você já pode seguir.` : `Adicione só 1 tarefa que se repete ou pesa.`}; } if(step===5){ const count=['permLimits','permHelp','permPrice','permRhythm','permissionPhrase','dream1Text','dream1Step'] .filter(k=>hv(d[k])).length; return {ready:count>=1, text:count>=1 ? `Você já registrou algo que merece proteção ou futuro. Pode seguir.` : `Escolha apenas 1: limite, ajuda ou sonho.`}; } if(step===6){ const focus=hv(d.priority1); const metric=hv(d.quarterMetric); const date=hv(d.quarterReviewDate); const count=[focus,metric,date].filter(Boolean).length; return {ready:count>=2, text:count>=2 ? `Quase lá ✨ Seu trimestre já tem direção.` : `${count}/3 decisões essenciais • prioridade, indicador e revisão.`}; } return {ready:false,text:'Você pode seguir no seu ritmo.'}; } function updateCoach(){ const d=typeof collect==='function'?collect():{}; document.querySelectorAll('.coach-card[data-coach-step]').forEach(card=>{ const step=Number(card.dataset.coachStep); if(step===7)return; const result=readyFor(step,d); const status=card.querySelector('.coach-status'); if(!status)return; status.classList.toggle('ready',!!result.ready); const span=status.querySelector('span'); if(span)span.textContent=result.text; const sec=document.querySelector(`section.screen[data-step="${step}"]`); const next=sec?.querySelector('.navbottom .btn.primary, .navbottom #buildMap'); if(next){ next.classList.toggle('guided-ready',!!result.ready); if(result.ready)next.setAttribute('data-ready','true'); else next.removeAttribute('data-ready'); } }); } formEl.addEventListener('input',()=>requestAnimationFrame(updateCoach)); formEl.addEventListener('change',()=>requestAnimationFrame(updateCoach)); document.addEventListener('click',e=>{ if(e.target.closest('.scale-choice,.task-row,#addTask,.permission,.envelopes,#toggleDreams')){ setTimeout(updateCoach,60); } }); updateCoach(); } function closeOverlay(id){const el=$(id);if(el){el.classList.remove('open');el.setAttribute('aria-hidden','true')}} form.addEventListener('input',()=>{updateAll();autosave()});form.addEventListener('change',()=>{updateAll();autosave()}); steps.forEach(b=>b.addEventListener('click',()=>go(+b.dataset.go)));$$('.next').forEach(b=>b.addEventListener('click',()=>{save(false);go(currentStep+1)}));$$('.prev').forEach(b=>b.addEventListener('click',()=>go(currentStep-1))); $('#saveBtn').addEventListener('click',()=>save(true));$('#mapSelect').addEventListener('change',e=>{save(false);setActive(e.target.value);load(current()?.data||{});go(0)}); $('#newMap').addEventListener('click',()=>{save(false);const a=maps(),m=blank();m.data.mapName='Novo mapa';a.push(m);setMaps(a);setActive(m.id);renderSelect();load(m.data);go(0);notify('Novo mapa criado')}); $('#dupMap').addEventListener('click',()=>{save(false);const a=maps(),src=current();if(!src)return;const m=blank();m.data=JSON.parse(JSON.stringify(src.data||{}));m.data.mapName=(m.data.mapName||'Mapa')+' • cenário';a.push(m);setMaps(a);setActive(m.id);renderSelect();load(m.data);go(currentStep);notify('Cenário duplicado')}); $('#newFinal').addEventListener('click',()=>$('#newMap').click());$('#buildMap').addEventListener('click',()=>{save(false);go(7)}); $('#importBtn').addEventListener('click',()=>$('#importFile').click());$('#importFile').addEventListener('change',e=>{const f=e.target.files[0];if(!f)return;const r=new FileReader();r.onload=()=>{try{const p=JSON.parse(r.result);const d=p.data||p;if(!d||typeof d!=='object')throw Error();const a=maps(),m=blank();m.data={...d,mapName:(d.mapName||'Mapa importado')+' • importado'};a.push(m);setMaps(a);setActive(m.id);renderSelect();load(m.data);go(0);notify('Mapa importado')}catch{alert('Não foi possível importar. Use um JSON exportado por este aplicativo.')}};r.readAsText(f);e.target.value=''}); $('#exportJson').addEventListener('click',()=>{save(false);download(JSON.stringify(current(),null,2),'application/json;charset=utf-8',safeName()+'.json')});$('#downloadReport').addEventListener('click',()=>download(reportHtml(),'text/html;charset=utf-8',safeName()+'-relatorio.html'));$('#downloadSvg').addEventListener('click',()=>download(svgMap(),'image/svg+xml;charset=utf-8',safeName()+'-mapa.svg'));$('#printBtn').addEventListener('click',()=>window.print()); $('#copyPrompt').addEventListener('click',async()=>{buildFinal();try{await navigator.clipboard.writeText($('#promptOutput').textContent);notify('Prompt copiado')}catch{alert('Selecione o texto do prompt e copie manualmente.')}});$('#downloadPrompt').addEventListener('click',()=>{buildFinal();download($('#promptOutput').textContent,'text/plain;charset=utf-8',safeName()+'-prompt.txt')}); $$('.mini-prompt-btn').forEach(btn=>btn.addEventListener('click',()=>copyMiniPrompt(btn.dataset.mini,btn))); $('#helpFab').addEventListener('click',()=>{$('#helpOverlay').classList.add('open');$('#helpOverlay').setAttribute('aria-hidden','false')});$('#helpClose').addEventListener('click',()=>{$('#helpOverlay').classList.remove('open');$('#helpOverlay').setAttribute('aria-hidden','true')});$('#helpOverlay').addEventListener('click',e=>{if(e.target===$('#helpOverlay'))$('#helpClose').click()});document.addEventListener('keydown',e=>{if(e.key==='Escape')$('#helpClose').click()}); initScales();renderTasks();initQuestionHelp();applySimplifiedRuntime();initMobileExperienceV5();initConductiveExperienceV6(); $('#addTask')?.addEventListener('click',()=>{const arr=parseTasks();arr.push({name:'',freq:'',minutes:'',human:'',repeat:'',delegate:'',sense:''});saveTasks(arr);renderTasks();updateAll()}); $('#compareBtn')?.addEventListener('click',openCompare);$('#compareFinal')?.addEventListener('click',openCompare);$('#compareClose')?.addEventListener('click',()=>closeOverlay('#compareOverlay'));$('#compareSelect')?.addEventListener('change',renderCompare);$('#compareOverlay')?.addEventListener('click',e=>{if(e.target===$('#compareOverlay'))closeOverlay('#compareOverlay')}); $('#scoreHow')?.addEventListener('click',()=>{buildFinal();$('#scoreOverlay').classList.add('open');$('#scoreOverlay').setAttribute('aria-hidden','false')});$('#scoreClose')?.addEventListener('click',()=>closeOverlay('#scoreOverlay'));$('#scoreOverlay')?.addEventListener('click',e=>{if(e.target===$('#scoreOverlay'))closeOverlay('#scoreOverlay')}); document.addEventListener('keydown',e=>{if(e.key==='Escape'){closeOverlay('#compareOverlay');closeOverlay('#scoreOverlay');hideQuestionHelp(true)}}); ensure();updateAll();go(0); })();