// data.jsx — Conteúdo do app Calistenia "Zenith" // Programa de 30 dias, objetivos, níveis do avatar, badges, treino do dia. const LEVELS = [ { id: 'iniciante', label: 'Iniciante', desc: 'Construir base e consistência', meta: '30 min/dia' }, { id: 'intermediario', label: 'Intermediário', desc: 'Ganhar força e volume', meta: '40 min/dia' }, { id: 'avancado', label: 'Avançado', desc: 'Movimentos e skills', meta: '50 min/dia' }, ]; // glyph = nome de uma forma simples desenhada em components (sem emoji) const GOALS = [ { id: 'flexao', label: 'Flexão', desc: 'Peito, ombro, tríceps', glyph: 'push' }, { id: 'barra', label: 'Barra', desc: 'Costas e pegada', glyph: 'bar' }, { id: 'core', label: 'Core', desc: 'Abdômen e estabilidade', glyph: 'core' }, { id: 'emagrecer', label: 'Emagrecer', desc: 'Queima e condicionamento', glyph: 'burn' }, { id: 'forca', label: 'Força', desc: 'Potência de corpo inteiro', glyph: 'power' }, ]; // Objetivos (anamnese) — perder / ganhar / manter const OBJECTIVES = [ { id: 'perder', label: 'Perder Peso', desc: 'Queimar gordura e definir', glyph: 'burn' }, { id: 'ganhar', label: 'Aumentar Músculos', desc: 'Hipertrofia e força', glyph: 'power' }, { id: 'manter', label: 'Manter a Forma', desc: 'Condicionamento e saúde', glyph: 'balance' }, ]; const SEXES = [ { id: 'masc', label: 'Masculino' }, { id: 'fem', label: 'Feminino' }, { id: 'na', label: 'Prefiro não dizer' }, ]; // Tipos de corpo — placeholders marcados (silhuetas viriam depois) const BODY_NOW = [ { id: 'magro', label: 'Magro' }, { id: 'normal', label: 'Normal' }, { id: 'sobrepeso',label: 'Sobrepeso' }, { id: 'musculoso',label: 'Musculoso' }, ]; const BODY_TARGET = [ { id: 'forma', label: 'Em Forma' }, { id: 'atletico', label: 'Atlético' }, { id: 'definido', label: 'Definido' }, { id: 'musculoso', label: 'Musculoso' }, ]; // IMC function computeIMC(weightKg, heightCm) { const m = heightCm / 100; return weightKg / (m * m); } function imcCategory(imc) { if (imc < 18.5) return { label: 'Abaixo do peso', pos: imc / 18.5 * 0.18 }; if (imc < 25) return { label: 'Peso normal', pos: 0.18 + (imc - 18.5) / 6.5 * 0.22 }; if (imc < 30) return { label: 'Sobrepeso', pos: 0.40 + (imc - 25) / 5 * 0.22 }; if (imc < 35) return { label: 'Obesidade I', pos: 0.62 + (imc - 30) / 5 * 0.18 }; if (imc < 40) return { label: 'Obesidade II', pos: 0.80 + (imc - 35) / 5 * 0.12 }; return { label: 'Obesidade III', pos: 0.96 }; } // Estimativa de tempo para alcançar o objetivo function estimatePlan({ objective, weight, targetWeight, days }) { const diff = Math.abs(weight - targetWeight); let weeks; if (objective === 'manter' || diff < 0.5) { weeks = Math.max(6, Math.round(days * 3)); } else if (objective === 'ganhar') { const perWeek = 0.12 + days * 0.035; // kg/semana weeks = Math.ceil(diff / perWeek); } else { // perder const perWeek = 0.35 + days * 0.07; weeks = Math.ceil(diff / perWeek); } weeks = Math.max(4, Math.min(weeks, 104)); let text; if (weeks < 9) text = `${weeks} semanas`; else { const months = Math.round(weeks / 4.345); text = `~${months} ${months === 1 ? 'mês' : 'meses'}`; } return { weeks, text }; } // Avatar Zenith — 5 níveis de evolução const ZENITH_LEVELS = [ { lvl: 1, range: 'Dias 1–5', name: 'Desperta', ability: 'Lembretes básicos', phrase: 'Vamos começar?', ring: 0.18 }, { lvl: 2, range: 'Dias 6–10', name: 'Ascende', ability: 'Contagem de reps em tempo real', phrase: 'Você está no caminho certo!', ring: 0.40 }, { lvl: 3, range: 'Dias 11–15', name: 'Irradia', ability: 'Análise de performance', phrase: 'Seu progresso é real!', ring: 0.62 }, { lvl: 4, range: 'Dias 16–20', name: 'Domina', ability: 'Sugestões de desafios', phrase: 'Você está transformado!', ring: 0.82 }, { lvl: 5, range: 'Dias 21–30', name: 'O Pico', ability: 'Acesso a treinos avançados', phrase: 'Você é o pico da evolução!', ring: 1.0 }, ]; function zenithForDay(day) { if (day <= 5) return ZENITH_LEVELS[0]; if (day <= 10) return ZENITH_LEVELS[1]; if (day <= 15) return ZENITH_LEVELS[2]; if (day <= 20) return ZENITH_LEVELS[3]; return ZENITH_LEVELS[4]; } // Badges / conquistas const BADGES = [ { id: 'fogo', name: 'Fogo Sagrado', desc: '7 dias consecutivos', glyph: 'flame', req: 7 }, { id: 'diamante', name: 'Diamante', desc: '14 dias consecutivos', glyph: 'diamond', req: 14 }, { id: 'coroa', name: 'Coroa', desc: '30 dias consecutivos', glyph: 'crown', req: 30 }, { id: 'pico', name: 'Pico', desc: 'Nível máximo do avatar', glyph: 'peak', req: 21 }, { id: 'equilibrio',name: 'Equilíbrio', desc: '5 treinos de mindfulness', glyph: 'balance', req: 5 }, { id: 'forca', name: 'Força Bruta', desc: '10 flexões no chão', glyph: 'fist', req: 10 }, { id: 'precisao', name: 'Precisão', desc: '95%+ de acurácia', glyph: 'target', req: 95 }, ]; // Programa de 30 dias (Iniciante, 30 min/dia) const PROGRAM_30 = [ { day: 1, foco: 'Aquecimento e Mobilidade', ex: 'Rotação de articulações, caminhada no lugar, alongamento dinâmico', frase: 'Hoje você planta a semente. Cada movimento é um passo em direção ao seu melhor eu. Comece agora.' }, { day: 2, foco: 'Flexões (Modificadas)', ex: '3×8 flexões na parede, 2×10 flexões inclinadas, alongamento', frase: 'A consistência é a ponte entre o desejo e a realidade. Seu corpo agradece cada repetição.' }, { day: 3, foco: 'Mobilidade de Quadril', ex: 'Agachamentos assistidos, lunges estáticos, ponte glútea', frase: 'Você não compete com ninguém. Compete com quem era ontem. Hoje é seu dia de evoluir.' }, { day: 4, foco: 'Força de Core', ex: 'Prancha na parede (3×15s), dead bug, bird dog', frase: 'O core é seu centro. Fortaleça-o e encontrará equilíbrio em tudo. Respire, resista, persista.' }, { day: 5, foco: 'Flexões Progressivas', ex: '3×10 flexões inclinadas, 2×5 flexões no chão, alongamento', frase: 'Cada flexão é uma vitória. Não importa quantas você faz, importa que você começou.' }, { day: 6, foco: 'Força de Pernas', ex: 'Agachamentos corporais, step-ups, glute bridge', frase: 'Suas pernas carregam seus sonhos. Fortaleça-as com intenção e gratidão pelo movimento.' }, { day: 7, foco: 'Descanso Ativo', ex: 'Caminhada leve, alongamento profundo, respiração consciente', frase: 'O descanso também é treino. Honre seu corpo permitindo que ele se recupere com sabedoria.' }, { day: 8, foco: 'Flexões + Core', ex: '4×8 flexões inclinadas, 3×20s prancha, dead bug', frase: 'Você já é mais forte que era. Reconheça seu progresso e use-o como combustível.' }, { day: 9, foco: 'Mobilidade + Força', ex: 'Agachamentos, lunges dinâmicos, ponte glútea, alongamento', frase: 'A flexibilidade é força. Quanto mais você se adapta, mais resiliente se torna.' }, { day: 10, foco: 'Flexões no Chão', ex: '3×5 flexões no chão, 4×10 flexões inclinadas, alongamento', frase: 'Seu limite é apenas uma ilusão. Ultrapasse-o com calma, respiração e determinação.' }, { day: 11, foco: 'Core Avançado', ex: '3×25s prancha, 2×10 mountain climbers, bird dog', frase: 'O centro do seu ser é forte. Cultive essa força interior e ela se refletirá no corpo.' }, { day: 12, foco: 'Treino Completo', ex: '3×8 flexões, 3×15 agachamentos, 2×20s prancha, alongamento', frase: 'Você está construindo mais que músculos. Está construindo disciplina, confiança e caráter.' }, { day: 13, foco: 'Força de Pernas', ex: '4×12 agachamentos, 3×10 lunges, 2×15 glute bridge', frase: 'Cada movimento é meditação. Sinta seu corpo, honre seu esforço, celebre sua presença.' }, { day: 14, foco: 'Descanso Ativo', ex: 'Yoga leve, respiração profunda, reflexão sobre a semana', frase: 'Duas semanas. Você já mudou. Veja como seu corpo responde. Isso é apenas o começo.' }, { day: 15, foco: 'Flexões Intensas', ex: '4×10 flexões inclinadas, 3×6 flexões no chão, alongamento', frase: 'O desafio é o caminho para a transformação. Abrace-o com coragem e respiração consciente.' }, { day: 16, foco: 'Mobilidade Total', ex: 'Agachamentos profundos, lunges alternados, ponte glútea, alongamento', frase: 'Seu corpo é sábio. Ouça-o, respeite-o, trabalhe com ele, não contra ele.' }, { day: 17, foco: 'Core + Flexões', ex: '3×30s prancha, 3×8 flexões, 2×12 mountain climbers', frase: 'A paciência é a virtude do guerreiro. Cada dia você fica mais próximo de seus objetivos.' }, { day: 18, foco: 'Força Funcional', ex: '4×12 agachamentos, 3×10 lunges, 3×15 glute bridge, alongamento', frase: 'Você não está apenas treinando. Está aprendendo a conhecer seu corpo e seus limites.' }, { day: 19, foco: 'Flexões + Mobilidade', ex: '4×8 flexões, 3×15 agachamentos, 2×25s prancha, alongamento', frase: 'Cada dia é uma nova oportunidade. Não desperdice. Seu futuro agradece seu esforço hoje.' }, { day: 20, foco: 'Treino Completo', ex: '4×10 flexões inclinadas, 4×15 agachamentos, 3×30s prancha, alongamento', frase: 'Você está em harmonia com seu corpo. Sinta a força crescendo. Isso é real, isso é seu.' }, { day: 21, foco: 'Descanso Ativo', ex: 'Caminhada consciente, alongamento profundo, meditação', frase: 'Três semanas. Você é uma pessoa diferente. Mais forte, mais consciente, mais você.' }, { day: 22, foco: 'Flexões Progressivas', ex: '4×10 flexões no chão, 3×8 flexões profundas, alongamento', frase: 'Você superou seus medos. Agora colha os frutos da sua coragem e consistência.' }, { day: 23, foco: 'Força Total', ex: '4×15 agachamentos, 4×12 lunges, 3×35s prancha, alongamento', frase: 'A transformação não é mágica. É disciplina, é presença, é você escolhendo evoluir todos os dias.' }, { day: 24, foco: 'Core Avançado', ex: '3×35s prancha, 3×15 mountain climbers, 2×12 bird dog, alongamento', frase: 'Seu core é seu alicerce. Quanto mais forte, mais estável você fica em todas as áreas da vida.' }, { day: 25, foco: 'Treino Completo', ex: '4×10 flexões, 4×15 agachamentos, 3×35s prancha, alongamento', frase: 'Você não é o mesmo de 25 dias atrás. Reconheça essa evolução. Você merece essa vitória.' }, { day: 26, foco: 'Mobilidade + Força', ex: '4×12 agachamentos profundos, 4×10 lunges, 3×15 glute bridge', frase: 'O corpo e a mente são um. Quando você treina com intenção, ambos se fortalecem.' }, { day: 27, foco: 'Flexões Intensas', ex: '4×12 flexões inclinadas, 4×8 flexões no chão, 2×30s prancha', frase: 'Você está pronto para o próximo nível. Mas antes, celebre onde você chegou. Você é forte.' }, { day: 28, foco: 'Treino Completo', ex: '4×12 flexões, 4×15 agachamentos, 3×40s prancha, alongamento', frase: 'Quatro semanas. Você plantou, regou, cuidou. Agora colha os frutos de sua dedicação.' }, { day: 29, foco: 'Força Máxima', ex: '5×10 flexões, 5×15 agachamentos, 4×40s prancha, alongamento', frase: 'Você é capaz de muito mais do que imagina. Cada dia prova isso. Continue acreditando.' }, { day: 30, foco: 'Celebração + Reflexão', ex: 'Treino favorito da semana, alongamento profundo, meditação de gratidão', frase: 'Você completou 30 dias. Você é disciplinado. Você é consistente. Você é transformado. Agora, continue.' }, ]; // Treino do dia detalhado (estrutura para a tela de treino ativo) // type: 'reps' (contador) | 'time' (cronômetro) | 'rest' const TODAY_WORKOUT = { day: 12, title: 'Treino Completo', blocks: [ { id: 'w1', phase: 'Aquecimento', name: 'Mobilidade articular', type: 'time', target: 40, sets: 1, cue: 'Solte ombros, quadril e tornozelos.' }, { id: 'w2', phase: 'Aquecimento', name: 'Polichinelo', type: 'reps', target: 20, sets: 1, cue: 'Ritmo leve, suba a frequência cardíaca.' }, { id: 'm1', phase: 'Principal', name: 'Flexão', type: 'reps', target: 8, sets: 3, rest: 40, cue: 'Cotovelos a 45°, corpo em linha reta.' }, { id: 'm2', phase: 'Principal', name: 'Agachamento livre', type: 'reps', target: 15, sets: 3, rest: 40, cue: 'Peito aberto, joelhos na direção dos pés.' }, { id: 'm3', phase: 'Principal', name: 'Prancha', type: 'time', target: 20, sets: 2, rest: 30, cue: 'Abdômen firme, glúteo ativado.' }, { id: 'c1', phase: 'Alongamento', name: 'Alongamento guiado', type: 'time', target: 60, sets: 1, cue: 'Respire fundo. Honre o esforço de hoje.' }, ], }; // Estado simulado do usuário (protótipo) const USER_STATE = { name: 'Você', level: 'iniciante', // ritmo do timer de execução sex: 'masc', // define a voz (homem → voz feminina; mulher → voz masculina) currentDay: 12, streak: 9, totalWorkouts: 11, totalMinutes: 247, totalReps: 1480, plankSeconds: 920, accuracy: 92, // histórico de 30 dias: 'done' | 'rest' | 'today' | 'future' | 'missed' history: [ 'done','done','done','done','done','rest','done','done','missed','done', 'done','today','future','future','future','future','future','future','future','future', 'future','future','future','future','future','future','future','future','future','future', ], earnedBadges: ['fogo','forca'], }; // Ritmo médio de execução por repetição (segundos), conforme o nível do usuário const REP_PACE = { iniciante: 2.8, intermediario: 2.2, avancado: 1.8 }; function blockDuration(block, level) { if (block.type === 'time') return block.target; const pace = REP_PACE[level] || 2.4; return Math.max(12, Math.round(block.target * pace)); } Object.assign(window, { LEVELS, GOALS, OBJECTIVES, SEXES, BODY_NOW, BODY_TARGET, computeIMC, imcCategory, estimatePlan, REP_PACE, blockDuration, ZENITH_LEVELS, zenithForDay, BADGES, PROGRAM_30, TODAY_WORKOUT, USER_STATE, });