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); })();